[
  {
    "path": ".gitattributes",
    "content": "*.js linguist-language=Java\n*.css linguist-language=Java\n*.html linguist-language=Java\n*.* linguist-language=Java\n* linguist-language=Java\n"
  },
  {
    "path": ".gitignore",
    "content": "# Created by .ignore support plugin (hsz.mobi)\n### JetBrains template\n# Covers JetBrains IDEs: IntelliJ, RubyMine, PhpStorm, AppCode, PyCharm, CLion, Android Studio and Webstorm\n# Reference: https://intellij-support.jetbrains.com/hc/en-us/articles/206544839\n\n# User-specific stuff:\n.idea/\n.idea/**/workspace.xml\n.idea/**/tasks.xml\n.idea/dictionaries\n\n# Sensitive or high-churn files:\n.idea/**/dataSources/\n.idea/**/dataSources.ids\n.idea/**/dataSources.xml\n.idea/**/dataSources.local.xml\n.idea/**/sqlDataSources.xml\n.idea/**/dynamic.xml\n.idea/**/uiDesigner.xml\n\n# Gradle:\n.idea/**/gradle.xml\n.idea/**/libraries\n\n# CMake\ncmake-build-debug/\ncmake-build-release/\n\n# Mongo Explorer plugin:\n.idea/**/mongoSettings.xml\n\n## File-based project format:\n*.iws\n\n## Plugin-specific files:\n\n# IntelliJ\nout/\n\n# mpeltonen/sbt-idea plugin\n.idea_modules/\n\n# JIRA plugin\natlassian-ide-plugin.xml\n\n# Cursive Clojure plugin\n.idea/replstate.xml\n\n# Crashlytics plugin (for Android Studio and IntelliJ)\ncom_crashlytics_export_strings.xml\ncrashlytics.properties\ncrashlytics-build.properties\nfabric.properties\n\ntarget/\n"
  },
  {
    "path": ".gitlab-ci.yml",
    "content": "stages:\n    - build\n    - push\n    - deploy\njob1:\n    stage: build\n    only:\n        - dev\n    tags:\n        - dev-shell\n    script:\n        - echo \"build===============\"\n        - mvn -Dmaven.test.skip=true clean package\n\njob2:\n    stage: push\n    only:\n        - dev\n    tags:\n        - dev-shell\n    script:\n        - echo \"push===============\"\n        - mvn docker:push\njob3:\n    stage: deploy\n    only:\n        - dev\n    tags:\n        - dev-shell\n    script:\n        - echo \"deploy================\"\n        - cd /docker-swarm\n        - docker stack deploy -c sdb.yml sdb\n\n#job3:\n#    stage: deploy\n#    tags:\n#        - demo\n#    script:\n#        - echo \"I am job3\"\n#        - echo \"I am in deploy stage\""
  },
  {
    "path": "LICENSE",
    "content": "Apache License\nVersion 2.0, January 2004\nhttp://www.apache.org/licenses/\n\nTERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION\n\n1. Definitions.\n\n\"License\" shall mean the terms and conditions for use, reproduction, and\ndistribution as defined by Sections 1 through 9 of this document.\n\n\"Licensor\" shall mean the copyright owner or entity authorized by the copyright\nowner that is granting the License.\n\n\"Legal Entity\" shall mean the union of the acting entity and all other entities\nthat control, are controlled by, or are under common control with that entity.\nFor the purposes of this definition, \"control\" means (i) the power, direct or\nindirect, to cause the direction or management of such entity, whether by\ncontract or otherwise, or (ii) ownership of fifty percent (50%) or more of the\noutstanding shares, or (iii) beneficial ownership of such entity.\n\n\"You\" (or \"Your\") shall mean an individual or Legal Entity exercising\npermissions granted by this License.\n\n\"Source\" form shall mean the preferred form for making modifications, including\nbut not limited to software source code, documentation source, and configuration\nfiles.\n\n\"Object\" form shall mean any form resulting from mechanical transformation or\ntranslation of a Source form, including but not limited to compiled object code,\ngenerated documentation, and conversions to other media types.\n\n\"Work\" shall mean the work of authorship, whether in Source or Object form, made\navailable under the License, as indicated by a copyright notice that is included\nin or attached to the work (an example is provided in the Appendix below).\n\n\"Derivative Works\" shall mean any work, whether in Source or Object form, that\nis based on (or derived from) the Work and for which the editorial revisions,\nannotations, elaborations, or other modifications represent, as a whole, an\noriginal work of authorship. For the purposes of this License, Derivative Works\nshall not include works that remain separable from, or merely link (or bind by\nname) to the interfaces of, the Work and Derivative Works thereof.\n\n\"Contribution\" shall mean any work of authorship, including the original version\nof the Work and any modifications or additions to that Work or Derivative Works\nthereof, that is intentionally submitted to Licensor for inclusion in the Work\nby the copyright owner or by an individual or Legal Entity authorized to submit\non behalf of the copyright owner. For the purposes of this definition,\n\"submitted\" means any form of electronic, verbal, or written communication sent\nto the Licensor or its representatives, including but not limited to\ncommunication on electronic mailing lists, source code control systems, and\nissue tracking systems that are managed by, or on behalf of, the Licensor for\nthe purpose of discussing and improving the Work, but excluding communication\nthat is conspicuously marked or otherwise designated in writing by the copyright\nowner as \"Not a Contribution.\"\n\n\"Contributor\" shall mean Licensor and any individual or Legal Entity on behalf\nof whom a Contribution has been received by Licensor and subsequently\nincorporated within the Work.\n\n2. Grant of Copyright License.\n\nSubject to the terms and conditions of this License, each Contributor hereby\ngrants to You a perpetual, worldwide, non-exclusive, no-charge, royalty-free,\nirrevocable copyright license to reproduce, prepare Derivative Works of,\npublicly display, publicly perform, sublicense, and distribute the Work and such\nDerivative Works in Source or Object form.\n\n3. Grant of Patent License.\n\nSubject to the terms and conditions of this License, each Contributor hereby\ngrants to You a perpetual, worldwide, non-exclusive, no-charge, royalty-free,\nirrevocable (except as stated in this section) patent license to make, have\nmade, use, offer to sell, sell, import, and otherwise transfer the Work, where\nsuch license applies only to those patent claims licensable by such Contributor\nthat are necessarily infringed by their Contribution(s) alone or by combination\nof their Contribution(s) with the Work to which such Contribution(s) was\nsubmitted. If You institute patent litigation against any entity (including a\ncross-claim or counterclaim in a lawsuit) alleging that the Work or a\nContribution incorporated within the Work constitutes direct or contributory\npatent infringement, then any patent licenses granted to You under this License\nfor that Work shall terminate as of the date such litigation is filed.\n\n4. Redistribution.\n\nYou may reproduce and distribute copies of the Work or Derivative Works thereof\nin any medium, with or without modifications, and in Source or Object form,\nprovided that You meet the following conditions:\n\nYou must give any other recipients of the Work or Derivative Works a copy of\nthis License; and\nYou must cause any modified files to carry prominent notices stating that You\nchanged the files; and\nYou must retain, in the Source form of any Derivative Works that You distribute,\nall copyright, patent, trademark, and attribution notices from the Source form\nof the Work, excluding those notices that do not pertain to any part of the\nDerivative Works; and\nIf the Work includes a \"NOTICE\" text file as part of its distribution, then any\nDerivative Works that You distribute must include a readable copy of the\nattribution notices contained within such NOTICE file, excluding those notices\nthat do not pertain to any part of the Derivative Works, in at least one of the\nfollowing places: within a NOTICE text file distributed as part of the\nDerivative Works; within the Source form or documentation, if provided along\nwith the Derivative Works; or, within a display generated by the Derivative\nWorks, if and wherever such third-party notices normally appear. The contents of\nthe NOTICE file are for informational purposes only and do not modify the\nLicense. You may add Your own attribution notices within Derivative Works that\nYou distribute, alongside or as an addendum to the NOTICE text from the Work,\nprovided that such additional attribution notices cannot be construed as\nmodifying the License.\nYou may add Your own copyright statement to Your modifications and may provide\nadditional or different license terms and conditions for use, reproduction, or\ndistribution of Your modifications, or for any such Derivative Works as a whole,\nprovided Your use, reproduction, and distribution of the Work otherwise complies\nwith the conditions stated in this License.\n\n5. Submission of Contributions.\n\nUnless You explicitly state otherwise, any Contribution intentionally submitted\nfor inclusion in the Work by You to the Licensor shall be under the terms and\nconditions of this License, without any additional terms or conditions.\nNotwithstanding the above, nothing herein shall supersede or modify the terms of\nany separate license agreement you may have executed with Licensor regarding\nsuch Contributions.\n\n6. Trademarks.\n\nThis License does not grant permission to use the trade names, trademarks,\nservice marks, or product names of the Licensor, except as required for\nreasonable and customary use in describing the origin of the Work and\nreproducing the content of the NOTICE file.\n\n7. Disclaimer of Warranty.\n\nUnless required by applicable law or agreed to in writing, Licensor provides the\nWork (and each Contributor provides its Contributions) on an \"AS IS\" BASIS,\nWITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied,\nincluding, without limitation, any warranties or conditions of TITLE,\nNON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A PARTICULAR PURPOSE. You are\nsolely responsible for determining the appropriateness of using or\nredistributing the Work and assume any risks associated with Your exercise of\npermissions under this License.\n\n8. Limitation of Liability.\n\nIn no event and under no legal theory, whether in tort (including negligence),\ncontract, or otherwise, unless required by applicable law (such as deliberate\nand grossly negligent acts) or agreed to in writing, shall any Contributor be\nliable to You for damages, including any direct, indirect, special, incidental,\nor consequential damages of any character arising as a result of this License or\nout of the use or inability to use the Work (including but not limited to\ndamages for loss of goodwill, work stoppage, computer failure or malfunction, or\nany and all other commercial damages or losses), even if such Contributor has\nbeen advised of the possibility of such damages.\n\n9. Accepting Warranty or Additional Liability.\n\nWhile redistributing the Work or Derivative Works thereof, You may choose to\noffer, and charge a fee for, acceptance of support, warranty, indemnity, or\nother liability obligations and/or rights consistent with this License. However,\nin accepting such obligations, You may act only on Your own behalf and on Your\nsole responsibility, not on behalf of any other Contributor, and only if You\nagree to indemnify, defend, and hold each Contributor harmless for any liability\nincurred by, or claims asserted against, such Contributor by reason of your\naccepting any such warranty or additional liability.\n\nEND OF TERMS AND CONDITIONS\n\nAPPENDIX: How to apply the Apache License to your work\n\nTo apply the Apache License to your work, attach the following boilerplate\nnotice, with the fields enclosed by brackets \"{}\" replaced with your own\nidentifying information. (Don't include the brackets!) The text should be\nenclosed in the appropriate comment syntax for the file format. We also\nrecommend that a file or class name and description of purpose be included on\nthe same \"printed page\" as the copyright notice for easier identification within\nthird-party archives.\n\n   Copyright 2018 森多邦开源\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."
  },
  {
    "path": "README.md",
    "content": "# sdb mall\n\n**项目说明** \n- sdb是一个轻量级的在renren-fast基础上利用jfinal架构二次开发的一个极速二次开发直播，拼团商城框架，前后端分离的Java快速开发平台，C端采用微信小程序，能快速开发项目并交付【接私活利器】\n- 支持MySQL、Oracle、SQL Server、PostgreSQL等主流数据库\n- 重点说明：此项目并不是提供下载运行后直接就能上生产的情况，在我多年的经验里告诉我，所有的项目即使是商业模式非常相似但是在业务需求细节上也是有各种各种不同的变化，特别是在C端和campaign这块，举几个例子，在C端方面，你可能和别人使用完全色调，页面布局一模一样的页面吗？在后端同样一个优惠券的功能你能保证你不做一些定制化的实现吗？所以sdb mall这个架构是用来让你可以快速开发成自己独有的，个性化的商城项目，并非是提供大而全的功能，当然我也会在其中添加一些比较通用的功能，比如商城的完整流程和之后会开发一些营销模块等\n- 后端开源\n<br>\n\n**具有如下特点** \n- 友好的代码结构及注释，便于阅读及二次开发\n- 实现前后端分离，通过token进行数据交互，前端再也不用关注后端技术\n- 灵活的权限控制，可控制到页面或按钮，满足绝大部分的权限需求\n- 页面交互使用Vue2.x，极大的提高了开发效率\n- 完善的代码生成机制，可在线生成entity、xml、dao、service、vue、sql代码，减少70%以上的开发任务\n- 引入quartz定时任务，可动态完成任务的添加、修改、删除、暂停、恢复及日志查看等功能\n- 引入API模板，根据token作为登录令牌，极大的方便了APP接口开发\n- 引入Hibernate Validator校验框架，轻松实现后端校验\n- 引入云存储服务，已支持：七牛云、阿里云、腾讯云等\n- 引入swagger文档支持，方便编写API接口文档\n<br>\n<br>\n\n**项目结构** \n```\nsdb\n├─db  项目SQL语句\n│\n├─common 公共模块\n│  ├─aspect 系统日志\n│  ├─exception 异常处理\n│  ├─validator 后台校验\n│  ├─entity 自定义实体对象\n│  └─xss XSS过滤\n│ \n├─config 配置信息\n│ \n├─job 定时任务\n│ \n├─controller 路由（代码生成器自动生成）\n│ \n├─service 服务类（代码生成器自动生成）\n│ \n├─dao 数据库模型高一级的抽象配合service（代码生成器自动生成）\n│ \n├─model 数据库模型（代码生成器自动生成）\n│ \n├─form 前端自定义请求类\n│ \n├─sdbApplication 项目启动类\n│  \n├──resources \n│  ├─sql 复杂表级联sql模板\n│  └─static 静态资源\n\n```\n<br>\n\n**如何交流、反馈、参与贡献？** \n- 开发文档：正在设计中\n- Github仓库：https://github.com/yjjdick/sdb-mall  \n- Gitee仓库：https://gitee.com/yjjdick/sdb-mall\n- 技术讨论、二次开发等咨询、问题和建议，请移步到交流群！\n- 如需关注项目最新动态，请Watch、Star项目，同时也是对项目最好的支持\n<br>\n\n**技术选型：** \n- 核心框架：Spring Boot 2.0\n- 安全框架：Apache Shiro 1.4\n- 视图框架：Jfinal Enjoy\n- 持久层框架：Jfinal ORM\n- 定时器：Quartz 2.3\n- 数据库连接池：Druid 1.0\n- 日志管理：logback\n- 页面交互：Vue2.x \n<br>\n\n **后端部署**\n- 通过git下载源码\n- 创建数据库sdb，数据库编码为UTF8mb4\n- 执行db/init.sql文件，初始化数据\n- 修改application-dev.yml，更新MySQL账号和密码\n- Eclipse、IDEA运行sdbApplication.java，则可启动项目\n<br>\n\n **前端部署**\n - 本项目是前后端分离的，还需要部署前端，才能运行起来\n - 前端下载地址：请到交流群询问\n - 前端页面可用项目自带的代码生成器自动生成减少90%以上开发工作量\n <br>\n \n **商城业务**\n- 系统管理（一切后端需要的功能基本都能满足，鉴权机制，定时任务，系统日志，代码生成器等）\n- 商品管理\n- 订单管理\n- 商品分类\n- 规格管理\n- 微信支付\n- 微信退款\n- 微信租户接口\n- 客服系统\n- 物流系统（快递100）\n- 邮件接口\n- 拼团模块\n- 各种campaign（正在开发）\n<br>\n\n **介绍和使用视频**\n- 视频地址：\n- idea下代码启动：https://v.qq.com/x/page/y0795k72ak8.html\n- backend安装启动：https://v.qq.com/x/page/o0795qs3drx.html\n- 小程序wepy框架介绍：https://v.qq.com/x/page/t0795vugxc2.html\n- eclipse下代码启动：https://v.qq.com/x/page/a0795t266c8.html\n- 小程序业务介绍：https://v.qq.com/x/page/f07958veoua.html\n- 管理端业务流程介绍：https://v.qq.com/x/page/a079561268d.html\n- 二次开发简单介绍：http://v.qq.com/x/page/i0795wutn2o.html\n- 公众号森多邦工作室提供互联网软件开发，美术设计等服务![输入图片说明](\nhttps://senduobang.oss-cn-shanghai.aliyuncs.com/%E5%B7%A5%E4%BD%9C%E5%AE%A4%E5%85%AC%E4%BC%97%E5%8F%B7.jpg?x-oss-process=image/resize,p_30 \"工作室公众号\")\n\n<br>\n\n **介绍和使用视频**\n - 后端演示地址：https://qa.senduobang.com/backend/\n - 小程序演示地址：![输入图片说明](\nhttps://senduobang.oss-cn-shanghai.aliyuncs.com/%E5%B0%8F%E7%A8%8B%E5%BA%8F%E5%95%86%E5%9F%8E%E4%BA%8C%E7%BB%B4%E7%A0%81.jpg?x-oss-process=image/resize,p_50 \"工作室公众号\")\n\n <br>\n\n**后端管理系统：**\n<br> \n- 首页直播\n<br> \n\n![输入图片说明](\nhttps://senduobang.oss-cn-shanghai.aliyuncs.com/ezgif-1-1cb294e07bec.gif \"物流详情\")\n<br> \n<br> \n\n- 首页dash\n<br> \n\n![输入图片说明](\nhttps://senduobang.oss-cn-shanghai.aliyuncs.com/admin-%E9%A6%96%E9%A1%B5.png \"首页dash\")\n<br> \n<br> \n- 商品管理列表\n<br> \n\n![输入图片说明](https://senduobang.oss-cn-shanghai.aliyuncs.com/admin-%E5%95%86%E5%93%81%E7%AE%A1%E7%90%86.png \"商品管理列表\")\n<br> \n<br> \n- 多规格添加商品\n<br> \n\n![输入图片说明](\nhttps://senduobang.oss-cn-shanghai.aliyuncs.com/admin-%E5%A4%9A%E8%A7%84%E6%A0%BC%E5%95%86%E5%93%81%E6%B7%BB%E5%8A%A0.png \"多规格添加商品\")\n<br> \n<br> \n- 订单管理列表\n<br> \n\n![输入图片说明](\nhttps://senduobang.oss-cn-shanghai.aliyuncs.com/admin-%E8%AE%A2%E5%8D%95%E7%AE%A1%1C%E7%90%86.png \"订单管理列表\")\n<br> \n<br> \n- 订单详情\n<br> \n\n![输入图片说明](\nhttps://senduobang.oss-cn-shanghai.aliyuncs.com/admin-%E8%AE%A2%E5%8D%95%E8%AF%A6%E6%83%85.png \"订单详情\")\n<br>\n<br>\n\n**小程序商城:**\n<br> \n<br> \n- 首页\n<br> \n\n![输入图片说明](\nhttps://senduobang.oss-cn-shanghai.aliyuncs.com/%E5%B0%8F%E7%A8%8B%E5%BA%8F-%E9%A6%96%E9%A1%B5.PNG?x-oss-process=image/resize,p_30&t1 \"首页\")\n<br> \n<br> \n- 商品详情\n<br> \n\n![输入图片说明](\nhttps://senduobang.oss-cn-shanghai.aliyuncs.com/%E5%B0%8F%E7%A8%8B%E5%BA%8F-%E5%95%86%E5%93%81%E8%AF%A6%E6%83%85.PNG?x-oss-process=image/resize,p_30&t=1 \"商品详情\")\n<br> \n<br> \n- 商品详情2\n<br> \n\n![输入图片说明](\nhttps://senduobang.oss-cn-shanghai.aliyuncs.com/%E5%B0%8F%E7%A8%8B%E5%BA%8F-%E5%95%86%E5%93%81%E8%AF%A6%E6%83%852.PNG?x-oss-process=image/resize,p_30&t=1 \"商品详情\")\n<br> \n<br> \n- 客服\n<br> \n\n![输入图片说明](\nhttps://senduobang.oss-cn-shanghai.aliyuncs.com/%E5%B0%8F%E7%A8%8B%E5%BA%8F-%E5%AE%A2%E6%9C%8D.PNG?x-oss-process=image/resize,p_30 \"客服\")\n<br> \n<br> \n- 购物车\n<br> \n\n![输入图片说明](\nhttps://senduobang.oss-cn-shanghai.aliyuncs.com/%E5%B0%8F%E7%A8%8B%E5%BA%8F-%E8%B4%AD%E7%89%A9%E8%BD%A6.PNG?x-oss-process=image/resize,p_30 \"购物车\")\n<br> \n<br> \n- checkout\n<br> \n\n![输入图片说明](\nhttps://senduobang.oss-cn-shanghai.aliyuncs.com/%E5%B0%8F%E7%A8%8B%E5%BA%8F-checkout.PNG?x-oss-process=image/resize,p_30 \"checkout\")\n<br> \n<br> \n- 微信支付\n<br> \n\n![输入图片说明](\nhttps://senduobang.oss-cn-shanghai.aliyuncs.com/%E5%B0%8F%E7%A8%8B%E5%BA%8F-%E5%BE%AE%E4%BF%A1%E6%94%AF%E4%BB%98.PNG?x-oss-process=image/resize,p_30 \"微信支付\")\n<br> \n<br> \n- 订单详情\n<br> \n\n![输入图片说明](\nhttps://senduobang.oss-cn-shanghai.aliyuncs.com/%E5%B0%8F%E7%A8%8B%E5%BA%8F-%E8%AE%A2%E5%8D%95%E8%AF%A6%E6%83%85.PNG?x-oss-process=image/resize,p_30 \"订单详情\")\n<br> \n<br> \n\n- 订单列表\n<br> \n\n![输入图片说明](\nhttps://senduobang.oss-cn-shanghai.aliyuncs.com/%E5%B0%8F%E7%A8%8B%E5%BA%8F-%E8%AE%A2%E5%8D%95%E5%88%97%E8%A1%A8.PNG?x-oss-process=image/resize,p_30 \"订单列表\")\n<br> \n<br> \n- 订单详情2\n<br> \n\n![输入图片说明](\nhttps://senduobang.oss-cn-shanghai.aliyuncs.com/%E5%B0%8F%E7%A8%8B%E5%BA%8F-%E8%AE%A2%E5%8D%95%E8%AF%A6%E6%83%852.PNG?x-oss-process=image/resize,p_30 \"订单详情2\")\n<br> \n<br> \n- 物流详情\n<br> \n\n![输入图片说明](\nhttps://senduobang.oss-cn-shanghai.aliyuncs.com/%E5%B0%8F%E7%A8%8B%E5%BA%8F-%E7%89%A9%E6%B5%81%E8%AF%A6%E6%83%85.PNG?x-oss-process=image/resize,p_30 \"物流详情\")\n<br> \n<br> \n- 拼团1\n<br> \n\n![输入图片说明](\nhttps://senduobang.oss-cn-shanghai.aliyuncs.com/%E5%B0%8F%E7%A8%8B%E5%BA%8F-%E6%8B%BC%E5%9B%A2.PNG?x-oss-process=image/resize,p_30 \"物流详情\")\n<br> \n<br> \n- 拼团2\n<br> \n"
  },
  {
    "path": "db/init.sql",
    "content": "/*\n Navicat Premium Data Transfer\n\n Source Server         : localhost\n Source Server Type    : MySQL\n Source Server Version : 50639\n Source Host           : 127.0.0.1:3306\n Source Schema         : sdb\n\n Target Server Type    : MySQL\n Target Server Version : 50639\n File Encoding         : 65001\n\n Date: 06/11/2018 17:15:56\n*/\n\nSET NAMES utf8mb4;\nSET FOREIGN_KEY_CHECKS = 0;\n\n-- ----------------------------\n-- Table structure for QRTZ_BLOB_TRIGGERS\n-- ----------------------------\nDROP TABLE IF EXISTS `QRTZ_BLOB_TRIGGERS`;\nCREATE TABLE `QRTZ_BLOB_TRIGGERS` (\n  `SCHED_NAME` varchar(120) NOT NULL,\n  `TRIGGER_NAME` varchar(200) NOT NULL,\n  `TRIGGER_GROUP` varchar(200) NOT NULL,\n  `BLOB_DATA` blob,\n  PRIMARY KEY (`SCHED_NAME`,`TRIGGER_NAME`,`TRIGGER_GROUP`),\n  KEY `SCHED_NAME` (`SCHED_NAME`,`TRIGGER_NAME`,`TRIGGER_GROUP`),\n  CONSTRAINT `qrtz_blob_triggers_ibfk_1` FOREIGN KEY (`SCHED_NAME`, `TRIGGER_NAME`, `TRIGGER_GROUP`) REFERENCES `QRTZ_TRIGGERS` (`SCHED_NAME`, `TRIGGER_NAME`, `TRIGGER_GROUP`)\n) ENGINE=InnoDB DEFAULT CHARSET=utf8;\n\n-- ----------------------------\n-- Table structure for QRTZ_CALENDARS\n-- ----------------------------\nDROP TABLE IF EXISTS `QRTZ_CALENDARS`;\nCREATE TABLE `QRTZ_CALENDARS` (\n  `SCHED_NAME` varchar(120) NOT NULL,\n  `CALENDAR_NAME` varchar(200) NOT NULL,\n  `CALENDAR` blob NOT NULL,\n  PRIMARY KEY (`SCHED_NAME`,`CALENDAR_NAME`)\n) ENGINE=InnoDB DEFAULT CHARSET=utf8;\n\n-- ----------------------------\n-- Table structure for QRTZ_CRON_TRIGGERS\n-- ----------------------------\nDROP TABLE IF EXISTS `QRTZ_CRON_TRIGGERS`;\nCREATE TABLE `QRTZ_CRON_TRIGGERS` (\n  `SCHED_NAME` varchar(120) NOT NULL,\n  `TRIGGER_NAME` varchar(200) NOT NULL,\n  `TRIGGER_GROUP` varchar(200) NOT NULL,\n  `CRON_EXPRESSION` varchar(120) NOT NULL,\n  `TIME_ZONE_ID` varchar(80) DEFAULT NULL,\n  PRIMARY KEY (`SCHED_NAME`,`TRIGGER_NAME`,`TRIGGER_GROUP`),\n  CONSTRAINT `qrtz_cron_triggers_ibfk_1` FOREIGN KEY (`SCHED_NAME`, `TRIGGER_NAME`, `TRIGGER_GROUP`) REFERENCES `QRTZ_TRIGGERS` (`SCHED_NAME`, `TRIGGER_NAME`, `TRIGGER_GROUP`)\n) ENGINE=InnoDB DEFAULT CHARSET=utf8;\n\n-- ----------------------------\n-- Table structure for QRTZ_FIRED_TRIGGERS\n-- ----------------------------\nDROP TABLE IF EXISTS `QRTZ_FIRED_TRIGGERS`;\nCREATE TABLE `QRTZ_FIRED_TRIGGERS` (\n  `SCHED_NAME` varchar(120) NOT NULL,\n  `ENTRY_ID` varchar(95) NOT NULL,\n  `TRIGGER_NAME` varchar(200) NOT NULL,\n  `TRIGGER_GROUP` varchar(200) NOT NULL,\n  `INSTANCE_NAME` varchar(200) NOT NULL,\n  `FIRED_TIME` bigint(13) NOT NULL,\n  `SCHED_TIME` bigint(13) NOT NULL,\n  `PRIORITY` int(11) NOT NULL,\n  `STATE` varchar(16) NOT NULL,\n  `JOB_NAME` varchar(200) DEFAULT NULL,\n  `JOB_GROUP` varchar(200) DEFAULT NULL,\n  `IS_NONCONCURRENT` varchar(1) DEFAULT NULL,\n  `REQUESTS_RECOVERY` varchar(1) DEFAULT NULL,\n  PRIMARY KEY (`SCHED_NAME`,`ENTRY_ID`),\n  KEY `IDX_QRTZ_FT_TRIG_INST_NAME` (`SCHED_NAME`,`INSTANCE_NAME`),\n  KEY `IDX_QRTZ_FT_INST_JOB_REQ_RCVRY` (`SCHED_NAME`,`INSTANCE_NAME`,`REQUESTS_RECOVERY`),\n  KEY `IDX_QRTZ_FT_J_G` (`SCHED_NAME`,`JOB_NAME`,`JOB_GROUP`),\n  KEY `IDX_QRTZ_FT_JG` (`SCHED_NAME`,`JOB_GROUP`),\n  KEY `IDX_QRTZ_FT_T_G` (`SCHED_NAME`,`TRIGGER_NAME`,`TRIGGER_GROUP`),\n  KEY `IDX_QRTZ_FT_TG` (`SCHED_NAME`,`TRIGGER_GROUP`)\n) ENGINE=InnoDB DEFAULT CHARSET=utf8;\n\n-- ----------------------------\n-- Table structure for QRTZ_JOB_DETAILS\n-- ----------------------------\nDROP TABLE IF EXISTS `QRTZ_JOB_DETAILS`;\nCREATE TABLE `QRTZ_JOB_DETAILS` (\n  `SCHED_NAME` varchar(120) NOT NULL,\n  `JOB_NAME` varchar(200) NOT NULL,\n  `JOB_GROUP` varchar(200) NOT NULL,\n  `DESCRIPTION` varchar(250) DEFAULT NULL,\n  `JOB_CLASS_NAME` varchar(250) NOT NULL,\n  `IS_DURABLE` varchar(1) NOT NULL,\n  `IS_NONCONCURRENT` varchar(1) NOT NULL,\n  `IS_UPDATE_DATA` varchar(1) NOT NULL,\n  `REQUESTS_RECOVERY` varchar(1) NOT NULL,\n  `JOB_DATA` blob,\n  PRIMARY KEY (`SCHED_NAME`,`JOB_NAME`,`JOB_GROUP`),\n  KEY `IDX_QRTZ_J_REQ_RECOVERY` (`SCHED_NAME`,`REQUESTS_RECOVERY`),\n  KEY `IDX_QRTZ_J_GRP` (`SCHED_NAME`,`JOB_GROUP`)\n) ENGINE=InnoDB DEFAULT CHARSET=utf8;\n\n-- ----------------------------\n-- Table structure for QRTZ_LOCKS\n-- ----------------------------\nDROP TABLE IF EXISTS `QRTZ_LOCKS`;\nCREATE TABLE `QRTZ_LOCKS` (\n  `SCHED_NAME` varchar(120) NOT NULL,\n  `LOCK_NAME` varchar(40) NOT NULL,\n  PRIMARY KEY (`SCHED_NAME`,`LOCK_NAME`)\n) ENGINE=InnoDB DEFAULT CHARSET=utf8;\n\n-- ----------------------------\n-- Table structure for QRTZ_PAUSED_TRIGGER_GRPS\n-- ----------------------------\nDROP TABLE IF EXISTS `QRTZ_PAUSED_TRIGGER_GRPS`;\nCREATE TABLE `QRTZ_PAUSED_TRIGGER_GRPS` (\n  `SCHED_NAME` varchar(120) NOT NULL,\n  `TRIGGER_GROUP` varchar(200) NOT NULL,\n  PRIMARY KEY (`SCHED_NAME`,`TRIGGER_GROUP`)\n) ENGINE=InnoDB DEFAULT CHARSET=utf8;\n\n-- ----------------------------\n-- Table structure for QRTZ_SCHEDULER_STATE\n-- ----------------------------\nDROP TABLE IF EXISTS `QRTZ_SCHEDULER_STATE`;\nCREATE TABLE `QRTZ_SCHEDULER_STATE` (\n  `SCHED_NAME` varchar(120) NOT NULL,\n  `INSTANCE_NAME` varchar(200) NOT NULL,\n  `LAST_CHECKIN_TIME` bigint(13) NOT NULL,\n  `CHECKIN_INTERVAL` bigint(13) NOT NULL,\n  PRIMARY KEY (`SCHED_NAME`,`INSTANCE_NAME`)\n) ENGINE=InnoDB DEFAULT CHARSET=utf8;\n\n-- ----------------------------\n-- Table structure for QRTZ_SIMPLE_TRIGGERS\n-- ----------------------------\nDROP TABLE IF EXISTS `QRTZ_SIMPLE_TRIGGERS`;\nCREATE TABLE `QRTZ_SIMPLE_TRIGGERS` (\n  `SCHED_NAME` varchar(120) NOT NULL,\n  `TRIGGER_NAME` varchar(200) NOT NULL,\n  `TRIGGER_GROUP` varchar(200) NOT NULL,\n  `REPEAT_COUNT` bigint(7) NOT NULL,\n  `REPEAT_INTERVAL` bigint(12) NOT NULL,\n  `TIMES_TRIGGERED` bigint(10) NOT NULL,\n  PRIMARY KEY (`SCHED_NAME`,`TRIGGER_NAME`,`TRIGGER_GROUP`),\n  CONSTRAINT `qrtz_simple_triggers_ibfk_1` FOREIGN KEY (`SCHED_NAME`, `TRIGGER_NAME`, `TRIGGER_GROUP`) REFERENCES `QRTZ_TRIGGERS` (`SCHED_NAME`, `TRIGGER_NAME`, `TRIGGER_GROUP`)\n) ENGINE=InnoDB DEFAULT CHARSET=utf8;\n\n-- ----------------------------\n-- Table structure for QRTZ_SIMPROP_TRIGGERS\n-- ----------------------------\nDROP TABLE IF EXISTS `QRTZ_SIMPROP_TRIGGERS`;\nCREATE TABLE `QRTZ_SIMPROP_TRIGGERS` (\n  `SCHED_NAME` varchar(120) NOT NULL,\n  `TRIGGER_NAME` varchar(200) NOT NULL,\n  `TRIGGER_GROUP` varchar(200) NOT NULL,\n  `STR_PROP_1` varchar(512) DEFAULT NULL,\n  `STR_PROP_2` varchar(512) DEFAULT NULL,\n  `STR_PROP_3` varchar(512) DEFAULT NULL,\n  `INT_PROP_1` int(11) DEFAULT NULL,\n  `INT_PROP_2` int(11) DEFAULT NULL,\n  `LONG_PROP_1` bigint(20) DEFAULT NULL,\n  `LONG_PROP_2` bigint(20) DEFAULT NULL,\n  `DEC_PROP_1` decimal(13,4) DEFAULT NULL,\n  `DEC_PROP_2` decimal(13,4) DEFAULT NULL,\n  `BOOL_PROP_1` varchar(1) DEFAULT NULL,\n  `BOOL_PROP_2` varchar(1) DEFAULT NULL,\n  PRIMARY KEY (`SCHED_NAME`,`TRIGGER_NAME`,`TRIGGER_GROUP`),\n  CONSTRAINT `qrtz_simprop_triggers_ibfk_1` FOREIGN KEY (`SCHED_NAME`, `TRIGGER_NAME`, `TRIGGER_GROUP`) REFERENCES `QRTZ_TRIGGERS` (`SCHED_NAME`, `TRIGGER_NAME`, `TRIGGER_GROUP`)\n) ENGINE=InnoDB DEFAULT CHARSET=utf8;\n\n-- ----------------------------\n-- Table structure for QRTZ_TRIGGERS\n-- ----------------------------\nDROP TABLE IF EXISTS `QRTZ_TRIGGERS`;\nCREATE TABLE `QRTZ_TRIGGERS` (\n  `SCHED_NAME` varchar(120) NOT NULL,\n  `TRIGGER_NAME` varchar(200) NOT NULL,\n  `TRIGGER_GROUP` varchar(200) NOT NULL,\n  `JOB_NAME` varchar(200) NOT NULL,\n  `JOB_GROUP` varchar(200) NOT NULL,\n  `DESCRIPTION` varchar(250) DEFAULT NULL,\n  `NEXT_FIRE_TIME` bigint(13) DEFAULT NULL,\n  `PREV_FIRE_TIME` bigint(13) DEFAULT NULL,\n  `PRIORITY` int(11) DEFAULT NULL,\n  `TRIGGER_STATE` varchar(16) NOT NULL,\n  `TRIGGER_TYPE` varchar(8) NOT NULL,\n  `START_TIME` bigint(13) NOT NULL,\n  `END_TIME` bigint(13) DEFAULT NULL,\n  `CALENDAR_NAME` varchar(200) DEFAULT NULL,\n  `MISFIRE_INSTR` smallint(2) DEFAULT NULL,\n  `JOB_DATA` blob,\n  PRIMARY KEY (`SCHED_NAME`,`TRIGGER_NAME`,`TRIGGER_GROUP`),\n  KEY `IDX_QRTZ_T_J` (`SCHED_NAME`,`JOB_NAME`,`JOB_GROUP`),\n  KEY `IDX_QRTZ_T_JG` (`SCHED_NAME`,`JOB_GROUP`),\n  KEY `IDX_QRTZ_T_C` (`SCHED_NAME`,`CALENDAR_NAME`),\n  KEY `IDX_QRTZ_T_G` (`SCHED_NAME`,`TRIGGER_GROUP`),\n  KEY `IDX_QRTZ_T_STATE` (`SCHED_NAME`,`TRIGGER_STATE`),\n  KEY `IDX_QRTZ_T_N_STATE` (`SCHED_NAME`,`TRIGGER_NAME`,`TRIGGER_GROUP`,`TRIGGER_STATE`),\n  KEY `IDX_QRTZ_T_N_G_STATE` (`SCHED_NAME`,`TRIGGER_GROUP`,`TRIGGER_STATE`),\n  KEY `IDX_QRTZ_T_NEXT_FIRE_TIME` (`SCHED_NAME`,`NEXT_FIRE_TIME`),\n  KEY `IDX_QRTZ_T_NFT_ST` (`SCHED_NAME`,`TRIGGER_STATE`,`NEXT_FIRE_TIME`),\n  KEY `IDX_QRTZ_T_NFT_MISFIRE` (`SCHED_NAME`,`MISFIRE_INSTR`,`NEXT_FIRE_TIME`),\n  KEY `IDX_QRTZ_T_NFT_ST_MISFIRE` (`SCHED_NAME`,`MISFIRE_INSTR`,`NEXT_FIRE_TIME`,`TRIGGER_STATE`),\n  KEY `IDX_QRTZ_T_NFT_ST_MISFIRE_GRP` (`SCHED_NAME`,`MISFIRE_INSTR`,`NEXT_FIRE_TIME`,`TRIGGER_GROUP`,`TRIGGER_STATE`),\n  CONSTRAINT `qrtz_triggers_ibfk_1` FOREIGN KEY (`SCHED_NAME`, `JOB_NAME`, `JOB_GROUP`) REFERENCES `QRTZ_JOB_DETAILS` (`SCHED_NAME`, `JOB_NAME`, `JOB_GROUP`)\n) ENGINE=InnoDB DEFAULT CHARSET=utf8;\n\n-- ----------------------------\n-- Table structure for area\n-- ----------------------------\nDROP TABLE IF EXISTS `area`;\nCREATE TABLE `area` (\n  `id` bigint(20) NOT NULL AUTO_INCREMENT,\n  `create_date` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '创建日期',\n  `modify_date` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '更新日期',\n  `version` bigint(20) NOT NULL DEFAULT '0',\n  `orders` int(11) DEFAULT NULL,\n  `full_name` longtext NOT NULL,\n  `grade` int(11) NOT NULL,\n  `name` varchar(255) NOT NULL,\n  `tree_path` varchar(255) NOT NULL,\n  `parent_id` bigint(20) DEFAULT NULL,\n  PRIMARY KEY (`id`),\n  KEY `ind_area_parent` (`parent_id`)\n) ENGINE=InnoDB DEFAULT CHARSET=utf8 COMMENT='地区';\n\n-- ----------------------------\n-- Table structure for campaign\n-- ----------------------------\nDROP TABLE IF EXISTS `campaign`;\nCREATE TABLE `campaign` (\n  `id` bigint(20) NOT NULL AUTO_INCREMENT COMMENT 'id',\n  `type` smallint(2) DEFAULT NULL COMMENT '类型 1-主页banner',\n  `param_name1` varchar(255) DEFAULT NULL,\n  `param_value1` varchar(255) DEFAULT NULL,\n  `param_name2` varchar(255) DEFAULT NULL,\n  `param_value2` varchar(255) DEFAULT NULL,\n  `param_name3` varchar(255) DEFAULT NULL,\n  `param_value3` varchar(255) DEFAULT NULL,\n  `start_time` datetime DEFAULT NULL,\n  `end_time` datetime DEFAULT NULL,\n  `create_date` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP,\n  `update_date` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP,\n  PRIMARY KEY (`id`)\n) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4;\n\n-- ----------------------------\n-- Table structure for cart\n-- ----------------------------\nDROP TABLE IF EXISTS `cart`;\nCREATE TABLE `cart` (\n  `id` bigint(20) NOT NULL AUTO_INCREMENT,\n  `user_id` varchar(50) NOT NULL,\n  `product_id` varchar(50) NOT NULL COMMENT '商品id',\n  `quantity` int(11) NOT NULL COMMENT '数量',\n  `create_date` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间',\n  `update_date` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '更新时间',\n  PRIMARY KEY (`id`),\n  KEY `user_id_index` (`user_id`) USING BTREE\n) ENGINE=InnoDB DEFAULT CHARSET=utf8;\n\n-- ----------------------------\n-- Table structure for delivery_corp\n-- ----------------------------\nDROP TABLE IF EXISTS `delivery_corp`;\nCREATE TABLE `delivery_corp` (\n  `code` varchar(255) NOT NULL,\n  `name` varchar(255) NOT NULL,\n  `url` varchar(255) NOT NULL,\n  PRIMARY KEY (`code`)\n) ENGINE=InnoDB DEFAULT CHARSET=utf8;\n\n-- ----------------------------\n-- Table structure for favorite_goods\n-- ----------------------------\nDROP TABLE IF EXISTS `favorite_goods`;\nCREATE TABLE `favorite_goods` (\n  `favorite_user` varchar(50) NOT NULL COMMENT '[用户ID]',\n  `favorite_goods` varchar(255) NOT NULL COMMENT '[商品ID]',\n  PRIMARY KEY (`favorite_user`,`favorite_goods`),\n  KEY `idx_user_favorite_goods` (`favorite_goods`)\n) ENGINE=InnoDB DEFAULT CHARSET=utf8;\n\n-- ----------------------------\n-- Table structure for goods\n-- ----------------------------\nDROP TABLE IF EXISTS `goods`;\nCREATE TABLE `goods` (\n  `sn` varchar(50) NOT NULL COMMENT '编号',\n  `name` varchar(255) NOT NULL COMMENT '名称',\n  `model` varchar(50) DEFAULT NULL COMMENT '型号',\n  `caption` varchar(255) NOT NULL COMMENT '副标题',\n  `image` varchar(255) NOT NULL COMMENT '展示图片',\n  `price` decimal(21,2) NOT NULL DEFAULT '0.00' COMMENT '销售价',\n  `is_delivery` tinyint(1) NOT NULL DEFAULT '0' COMMENT '是否需要物流',\n  `is_marketable` tinyint(1) NOT NULL DEFAULT '0' COMMENT '是否上架',\n  `parameter_values` longtext NOT NULL COMMENT '参数值',\n  `specification_items` longtext COMMENT '规格项',\n  `introduction` longtext NOT NULL COMMENT '介绍',\n  `product_images` longtext NOT NULL COMMENT '商品图片',\n  `campaign` int(11) DEFAULT NULL COMMENT '活动,位运算，1-拼团',\n  `groupon_count` int(11) DEFAULT NULL COMMENT '拼团人数',\n  `weight` float(11,0) NOT NULL COMMENT '重量',\n  `unit` varchar(255) NOT NULL COMMENT '单位',\n  `product_category_id` bigint(20) NOT NULL COMMENT '货品分类',\n  `create_date` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '创建日期',\n  `update_date` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '更新日期',\n  PRIMARY KEY (`sn`),\n  KEY `idx_name` (`name`),\n  KEY `idx_is_marketable` (`is_marketable`)\n) ENGINE=InnoDB DEFAULT CHARSET=utf8;\n\n-- ----------------------------\n-- Table structure for logistics\n-- ----------------------------\nDROP TABLE IF EXISTS `logistics`;\nCREATE TABLE `logistics` (\n  `tracking_no` varchar(255) NOT NULL,\n  `check_state` smallint(4) NOT NULL DEFAULT '0' COMMENT '订阅状态-0未订阅 1已订阅 2订阅失败',\n  `order_state` smallint(4) DEFAULT NULL COMMENT '物流状态包括0在途中、1已揽收、2疑难、3已签收、4退签、5同城派送中、6退回、7转单等7个状态',\n  `data` longtext COMMENT '物流跟踪数据',\n  `create_date` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间',\n  `update_date` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '更新时间',\n  PRIMARY KEY (`tracking_no`)\n) ENGINE=InnoDB DEFAULT CHARSET=utf8;\n\n-- ----------------------------\n-- Table structure for order_detail\n-- ----------------------------\nDROP TABLE IF EXISTS `order_detail`;\nCREATE TABLE `order_detail` (\n  `detail_id` varchar(32) NOT NULL,\n  `order_id` varchar(32) NOT NULL,\n  `product_id` varchar(32) NOT NULL,\n  `product_name` varchar(64) NOT NULL COMMENT '商品名称',\n  `product_model` varchar(50) DEFAULT NULL COMMENT '型号',\n  `product_spec` varchar(50) DEFAULT NULL COMMENT '规格',\n  `group_price` decimal(21,2) DEFAULT NULL COMMENT '团购价',\n  `product_price` decimal(21,2) NOT NULL COMMENT '当前价格,单位分',\n  `product_quantity` int(11) NOT NULL COMMENT '数量',\n  `product_icon` varchar(512) DEFAULT NULL COMMENT '小图',\n  `create_date` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间',\n  `update_date` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT '修改时间',\n  PRIMARY KEY (`detail_id`),\n  KEY `idx_order_id` (`order_id`)\n) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4;\n\n-- ----------------------------\n-- Table structure for order_master\n-- ----------------------------\nDROP TABLE IF EXISTS `order_master`;\nCREATE TABLE `order_master` (\n  `order_id` varchar(32) NOT NULL,\n  `buyer_name` varchar(32) NOT NULL COMMENT '买家名字',\n  `buyer_phone` varchar(32) NOT NULL COMMENT '买家电话',\n  `buyer_address` varchar(128) NOT NULL COMMENT '买家地址',\n  `buyer_id` varchar(64) NOT NULL COMMENT '买家id',\n  `need_invoice` smallint(1) DEFAULT NULL COMMENT '是否需要开票 0-不需要 1-需要',\n  `invoice_type` smallint(1) DEFAULT NULL COMMENT '发票类型 0-单位 1-个人',\n  `groupon` smallint(1) DEFAULT NULL COMMENT '拼团',\n  `groupon_id` varchar(50) DEFAULT NULL COMMENT '拼团id',\n  `groupon_count` int(11) DEFAULT NULL COMMENT '拼团人数',\n  `title` varchar(255) DEFAULT NULL COMMENT '发票抬头',\n  `tax_number` varchar(255) DEFAULT NULL COMMENT '抬头税号',\n  `company_address` varchar(255) DEFAULT NULL COMMENT '单位地址',\n  `telephone` varchar(255) DEFAULT NULL COMMENT '开票手机号码',\n  `bank_name` varchar(255) DEFAULT NULL COMMENT '银行名称',\n  `bank_account` varchar(255) DEFAULT NULL COMMENT '银行账号',\n  `order_amount` decimal(21,2) NOT NULL COMMENT '订单总金额',\n  `order_status` tinyint(3) NOT NULL DEFAULT '0' COMMENT '订单状态, 默认为新下单',\n  `tracking_number` varchar(255) DEFAULT NULL COMMENT '快递单号',\n  `delivery_code` varchar(255) DEFAULT NULL COMMENT '快递公司代码',\n  `refund_trade_no` varchar(255) DEFAULT NULL COMMENT '退款交易流水号',\n  `pay_trade_no` varchar(255) DEFAULT NULL COMMENT '支付交易流水号',\n  `pay_status` tinyint(3) NOT NULL DEFAULT '0' COMMENT '支付状态, 默认未支付',\n  `remark` varchar(255) DEFAULT NULL COMMENT ' 买家备注',\n  `contract` varchar(255) DEFAULT NULL COMMENT '合同',\n  `create_date` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间',\n  `update_date` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT '修改时间',\n  PRIMARY KEY (`order_id`),\n  KEY `idx_buyer_id` (`buyer_id`)\n) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4;\n\n-- ----------------------------\n-- Table structure for product\n-- ----------------------------\nDROP TABLE IF EXISTS `product`;\nCREATE TABLE `product` (\n  `sn` varchar(255) NOT NULL COMMENT '商品编号',\n  `price` decimal(21,2) NOT NULL DEFAULT '0.00' COMMENT '销售价',\n  `group_price` decimal(21,2) NOT NULL DEFAULT '0.00' COMMENT '拼团价',\n  `cost` decimal(21,2) NOT NULL DEFAULT '0.00' COMMENT '成本价',\n  `is_default` tinyint(1) NOT NULL DEFAULT '0' COMMENT '是否默认',\n  `specification_values` longtext COMMENT '规格值',\n  `stock` int(11) NOT NULL DEFAULT '0' COMMENT '库存',\n  `goods_sn` varchar(255) NOT NULL COMMENT '货品编号',\n  `enable` tinyint(1) NOT NULL DEFAULT '0' COMMENT '是否启用',\n  `create_date` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '创建日期',\n  `update_date` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '修改日期',\n  PRIMARY KEY (`sn`),\n  KEY `ind_product_goods` (`goods_sn`),\n  KEY `ind_product_is_default` (`is_default`) USING BTREE\n) ENGINE=InnoDB DEFAULT CHARSET=utf8;\n\n-- ----------------------------\n-- Table structure for product_category\n-- ----------------------------\nDROP TABLE IF EXISTS `product_category`;\nCREATE TABLE `product_category` (\n  `id` bigint(20) NOT NULL COMMENT 'ID',\n  `name` varchar(255) NOT NULL COMMENT '名称',\n  `parent_id` bigint(20) DEFAULT NULL COMMENT '父节点',\n  `tree_path` varchar(255) DEFAULT NULL COMMENT '全路径',\n  `order` int(11) NOT NULL DEFAULT '99' COMMENT '优先级 值小在前面 值大的在后面',\n  `create_date` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '创建日期',\n  `update_date` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '更新日期',\n  PRIMARY KEY (`id`),\n  KEY `ind_product_category_parent` (`parent_id`),\n  KEY `idx_order` (`order`)\n) ENGINE=InnoDB DEFAULT CHARSET=utf8;\n\n-- ----------------------------\n-- Table structure for receiver\n-- ----------------------------\nDROP TABLE IF EXISTS `receiver`;\nCREATE TABLE `receiver` (\n  `id` bigint(20) NOT NULL AUTO_INCREMENT,\n  `address` varchar(255) NOT NULL,\n  `area_name` varchar(255) NOT NULL,\n  `consignee` varchar(255) NOT NULL,\n  `is_default` tinyint(1) NOT NULL,\n  `phone` varchar(255) NOT NULL,\n  `zip_code` varchar(255) DEFAULT NULL,\n  `area_id` bigint(20) NOT NULL,\n  `member_id` varchar(50) NOT NULL,\n  `create_date` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '创建日期',\n  `update_date` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '更新日期',\n  PRIMARY KEY (`id`),\n  KEY `ind_receiver_area` (`area_id`),\n  KEY `ind_receiver_member` (`member_id`)\n) ENGINE=InnoDB DEFAULT CHARSET=utf8;\n\n-- ----------------------------\n-- Table structure for schedule_job\n-- ----------------------------\nDROP TABLE IF EXISTS `schedule_job`;\nCREATE TABLE `schedule_job` (\n  `job_id` bigint(20) NOT NULL AUTO_INCREMENT COMMENT '任务id',\n  `bean_name` varchar(200) DEFAULT NULL COMMENT 'spring bean名称',\n  `method_name` varchar(100) DEFAULT NULL COMMENT '方法名',\n  `params` varchar(2000) DEFAULT NULL COMMENT '参数',\n  `cron_expression` varchar(100) DEFAULT NULL COMMENT 'cron表达式',\n  `status` tinyint(4) DEFAULT NULL COMMENT '任务状态  0：正常  1：暂停',\n  `remark` varchar(255) DEFAULT NULL COMMENT '备注',\n  `create_time` datetime DEFAULT NULL COMMENT '创建时间',\n  PRIMARY KEY (`job_id`)\n) ENGINE=InnoDB DEFAULT CHARSET=utf8 COMMENT='定时任务';\n\n-- ----------------------------\n-- Table structure for schedule_job_log\n-- ----------------------------\nDROP TABLE IF EXISTS `schedule_job_log`;\nCREATE TABLE `schedule_job_log` (\n  `log_id` bigint(20) NOT NULL AUTO_INCREMENT COMMENT '任务日志id',\n  `job_id` bigint(20) NOT NULL COMMENT '任务id',\n  `bean_name` varchar(200) DEFAULT NULL COMMENT 'spring bean名称',\n  `method_name` varchar(100) DEFAULT NULL COMMENT '方法名',\n  `params` varchar(2000) DEFAULT NULL COMMENT '参数',\n  `status` tinyint(4) NOT NULL COMMENT '任务状态    0：成功    1：失败',\n  `error` varchar(2000) DEFAULT NULL COMMENT '失败信息',\n  `times` int(11) NOT NULL COMMENT '耗时(单位：毫秒)',\n  `create_time` datetime DEFAULT NULL COMMENT '创建时间',\n  PRIMARY KEY (`log_id`),\n  KEY `job_id` (`job_id`)\n) ENGINE=InnoDB DEFAULT CHARSET=utf8 COMMENT='定时任务日志';\n\n-- ----------------------------\n-- Table structure for sn\n-- ----------------------------\nDROP TABLE IF EXISTS `sn`;\nCREATE TABLE `sn` (\n  `type` int(11) NOT NULL COMMENT '类型',\n  `last_value` bigint(20) NOT NULL COMMENT '末值',\n  `create_date` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '创建日期',\n  `modify_date` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '修改日期',\n  PRIMARY KEY (`type`)\n) ENGINE=InnoDB DEFAULT CHARSET=utf8 COMMENT='序列号';\n\n-- ----------------------------\n-- Table structure for specification\n-- ----------------------------\nDROP TABLE IF EXISTS `specification`;\nCREATE TABLE `specification` (\n  `id` bigint(20) NOT NULL COMMENT 'id',\n  `parent_id` bigint(20) DEFAULT NULL COMMENT '父节点',\n  `type` int(11) NOT NULL COMMENT '0-规格组 1-规格参数',\n  `order` int(11) NOT NULL DEFAULT '0' COMMENT '排序',\n  `name` varchar(50) NOT NULL COMMENT '名称',\n  `category_id` bigint(20) DEFAULT NULL COMMENT '分类id',\n  PRIMARY KEY (`id`)\n) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4;\n\n-- ----------------------------\n-- Table structure for sys_captcha\n-- ----------------------------\nDROP TABLE IF EXISTS `sys_captcha`;\nCREATE TABLE `sys_captcha` (\n  `uuid` char(36) NOT NULL COMMENT 'uuid',\n  `code` varchar(6) NOT NULL COMMENT '验证码',\n  `expire_time` datetime DEFAULT NULL COMMENT '过期时间',\n  PRIMARY KEY (`uuid`)\n) ENGINE=InnoDB DEFAULT CHARSET=utf8 COMMENT='系统验证码';\n\n-- ----------------------------\n-- Table structure for sys_config\n-- ----------------------------\nDROP TABLE IF EXISTS `sys_config`;\nCREATE TABLE `sys_config` (\n  `id` bigint(20) NOT NULL AUTO_INCREMENT,\n  `param_key` varchar(50) DEFAULT NULL COMMENT 'key',\n  `param_value` varchar(2000) DEFAULT NULL COMMENT 'value',\n  `status` tinyint(4) DEFAULT '1' COMMENT '状态   0：隐藏   1：显示',\n  `remark` varchar(500) DEFAULT NULL COMMENT '备注',\n  PRIMARY KEY (`id`),\n  UNIQUE KEY `param_key` (`param_key`)\n) ENGINE=InnoDB DEFAULT CHARSET=utf8 COMMENT='系统配置信息表';\n\n-- ----------------------------\n-- Table structure for sys_log\n-- ----------------------------\nDROP TABLE IF EXISTS `sys_log`;\nCREATE TABLE `sys_log` (\n  `id` bigint(20) NOT NULL AUTO_INCREMENT,\n  `username` varchar(50) DEFAULT NULL COMMENT '用户名',\n  `operation` varchar(50) DEFAULT NULL COMMENT '用户操作',\n  `method` varchar(200) DEFAULT NULL COMMENT '请求方法',\n  `params` varchar(5000) DEFAULT NULL COMMENT '请求参数',\n  `time` bigint(20) NOT NULL COMMENT '执行时长(毫秒)',\n  `ip` varchar(64) DEFAULT NULL COMMENT 'IP地址',\n  `create_date` datetime DEFAULT NULL COMMENT '创建时间',\n  PRIMARY KEY (`id`)\n) ENGINE=InnoDB DEFAULT CHARSET=utf8 COMMENT='系统日志';\n\n-- ----------------------------\n-- Table structure for sys_menu\n-- ----------------------------\nDROP TABLE IF EXISTS `sys_menu`;\nCREATE TABLE `sys_menu` (\n  `menu_id` bigint(20) NOT NULL AUTO_INCREMENT,\n  `parent_id` bigint(20) DEFAULT NULL COMMENT '父菜单ID，一级菜单为0',\n  `name` varchar(50) DEFAULT NULL COMMENT '菜单名称',\n  `url` varchar(200) DEFAULT NULL COMMENT '菜单URL',\n  `perms` varchar(500) DEFAULT NULL COMMENT '授权(多个用逗号分隔，如：user:list,user:create)',\n  `type` int(11) DEFAULT NULL COMMENT '类型   0：目录   1：菜单   2：按钮',\n  `icon` varchar(50) DEFAULT NULL COMMENT '菜单图标',\n  `order_num` int(11) DEFAULT NULL COMMENT '排序',\n  PRIMARY KEY (`menu_id`)\n) ENGINE=InnoDB DEFAULT CHARSET=utf8 COMMENT='菜单管理';\n\n-- ----------------------------\n-- Table structure for sys_oss\n-- ----------------------------\nDROP TABLE IF EXISTS `sys_oss`;\nCREATE TABLE `sys_oss` (\n  `id` bigint(20) NOT NULL AUTO_INCREMENT,\n  `url` varchar(200) DEFAULT NULL COMMENT 'URL地址',\n  `create_date` datetime DEFAULT NULL COMMENT '创建时间',\n  PRIMARY KEY (`id`)\n) ENGINE=InnoDB DEFAULT CHARSET=utf8 COMMENT='文件上传';\n\n-- ----------------------------\n-- Table structure for sys_role\n-- ----------------------------\nDROP TABLE IF EXISTS `sys_role`;\nCREATE TABLE `sys_role` (\n  `role_id` bigint(20) NOT NULL AUTO_INCREMENT,\n  `role_name` varchar(100) DEFAULT NULL COMMENT '角色名称',\n  `remark` varchar(100) DEFAULT NULL COMMENT '备注',\n  `create_user_id` bigint(20) DEFAULT NULL COMMENT '创建者ID',\n  `create_time` datetime DEFAULT NULL COMMENT '创建时间',\n  PRIMARY KEY (`role_id`)\n) ENGINE=InnoDB DEFAULT CHARSET=utf8 COMMENT='角色';\n\n-- ----------------------------\n-- Table structure for sys_role_menu\n-- ----------------------------\nDROP TABLE IF EXISTS `sys_role_menu`;\nCREATE TABLE `sys_role_menu` (\n  `id` bigint(20) NOT NULL AUTO_INCREMENT,\n  `role_id` bigint(20) DEFAULT NULL COMMENT '角色ID',\n  `menu_id` bigint(20) DEFAULT NULL COMMENT '菜单ID',\n  PRIMARY KEY (`id`)\n) ENGINE=InnoDB DEFAULT CHARSET=utf8 COMMENT='角色与菜单对应关系';\n\n-- ----------------------------\n-- Table structure for sys_user\n-- ----------------------------\nDROP TABLE IF EXISTS `sys_user`;\nCREATE TABLE `sys_user` (\n  `user_id` bigint(20) NOT NULL AUTO_INCREMENT,\n  `username` varchar(50) NOT NULL COMMENT '用户名',\n  `password` varchar(100) DEFAULT NULL COMMENT '密码',\n  `salt` varchar(20) DEFAULT NULL COMMENT '盐',\n  `email` varchar(100) DEFAULT NULL COMMENT '邮箱',\n  `mobile` varchar(100) DEFAULT NULL COMMENT '手机号',\n  `status` tinyint(4) DEFAULT NULL COMMENT '状态  0：禁用   1：正常',\n  `create_user_id` bigint(20) DEFAULT NULL COMMENT '创建者ID',\n  `create_time` datetime DEFAULT NULL COMMENT '创建时间',\n  PRIMARY KEY (`user_id`),\n  UNIQUE KEY `username` (`username`)\n) ENGINE=InnoDB DEFAULT CHARSET=utf8 COMMENT='系统用户';\n\n-- ----------------------------\n-- Table structure for sys_user_role\n-- ----------------------------\nDROP TABLE IF EXISTS `sys_user_role`;\nCREATE TABLE `sys_user_role` (\n  `id` bigint(20) NOT NULL AUTO_INCREMENT,\n  `user_id` bigint(20) DEFAULT NULL COMMENT '用户ID',\n  `role_id` bigint(20) DEFAULT NULL COMMENT '角色ID',\n  PRIMARY KEY (`id`)\n) ENGINE=InnoDB DEFAULT CHARSET=utf8 COMMENT='用户与角色对应关系';\n\n-- ----------------------------\n-- Table structure for sys_user_token\n-- ----------------------------\nDROP TABLE IF EXISTS `sys_user_token`;\nCREATE TABLE `sys_user_token` (\n  `user_id` bigint(20) NOT NULL,\n  `token` varchar(100) NOT NULL COMMENT 'token',\n  `expire_time` datetime DEFAULT NULL COMMENT '过期时间',\n  `update_time` datetime DEFAULT NULL COMMENT '更新时间',\n  PRIMARY KEY (`user_id`),\n  UNIQUE KEY `token` (`token`)\n) ENGINE=InnoDB DEFAULT CHARSET=utf8 COMMENT='系统用户Token';\n\n-- ----------------------------\n-- Table structure for test_table\n-- ----------------------------\nDROP TABLE IF EXISTS `test_table`;\nCREATE TABLE `test_table` (\n  `id` int(11) NOT NULL AUTO_INCREMENT COMMENT '[ID]',\n  `name` varchar(255) DEFAULT NULL COMMENT '[姓名]',\n  `sex` smallint(2) DEFAULT NULL COMMENT '[性别] 1-男 2-女',\n  `create_date` datetime DEFAULT CURRENT_TIMESTAMP COMMENT '[创建时间]',\n  `update_date` datetime DEFAULT CURRENT_TIMESTAMP COMMENT '[更新时间]',\n  PRIMARY KEY (`id`)\n) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4;\n\n-- ----------------------------\n-- Table structure for user\n-- ----------------------------\nDROP TABLE IF EXISTS `user`;\nCREATE TABLE `user` (\n  `user_id` varchar(50) NOT NULL COMMENT 'ID',\n  `username` varchar(50) DEFAULT NULL COMMENT '用户名',\n  `ma_open_id` varchar(100) DEFAULT NULL COMMENT '小程序openid',\n  `union_id` varchar(100) DEFAULT NULL COMMENT '开放平台id',\n  `nickname` varchar(50) DEFAULT NULL COMMENT '昵称',\n  `name` varchar(50) DEFAULT NULL COMMENT '真实姓名',\n  `email` varchar(50) DEFAULT NULL COMMENT '邮箱',\n  `gender` smallint(1) DEFAULT NULL COMMENT '性别 1-男 2-女',\n  `area_id` smallint(10) DEFAULT NULL COMMENT '地区id',\n  `language` smallint(1) DEFAULT NULL COMMENT '语言 1-中文 2-英文',\n  `volunteer` smallint(4) DEFAULT NULL COMMENT '是否志愿者',\n  `avatar` varchar(255) DEFAULT NULL COMMENT '头像',\n  `mobile` varchar(20) DEFAULT NULL COMMENT '手机号',\n  `password` varchar(64) DEFAULT NULL COMMENT '密码',\n  `update_date` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '更新时间',\n  `create_date` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间',\n  PRIMARY KEY (`user_id`),\n  UNIQUE KEY `idx_username` (`username`) USING BTREE,\n  KEY `idx_maopenid` (`ma_open_id`),\n  KEY `idx_unionid` (`union_id`),\n  KEY `idx_createdate` (`create_date`),\n  KEY `idx_nickname` (`nickname`),\n  KEY `idx_name` (`name`),\n  KEY `idex_mobile` (`mobile`)\n) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COMMENT='用户';\n\n-- ----------------------------\n-- 拼团\n-- ----------------------------\nDROP TABLE IF EXISTS `groupon`;\nCREATE TABLE `groupon` (\n  `id` varchar(50) NOT NULL,\n  `goods_id` varchar(50) NOT NULL,\n  `count` int(11) NOT NULL,\n  `status` smallint(1) NOT NULL DEFAULT '0' COMMENT '0-等待开团 1-已开团 2-取消',\n  `expire_date` datetime NOT NULL,\n  `create_date` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP,\n  `update_date` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP,\n  PRIMARY KEY (`id`)\n) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4;\n\n-- ----------------------------\n-- 拼团队伍\n-- ----------------------------\nDROP TABLE IF EXISTS `groupon_team`;\nCREATE TABLE `groupon_team` (\n  `groupon_id` varchar(50) NOT NULL,\n  `user_id` varchar(50) NOT NULL,\n  `captain` smallint(1) NOT NULL DEFAULT '0',\n  `create_date` datetime DEFAULT CURRENT_TIMESTAMP,\n  `update_date` datetime DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP,\n  PRIMARY KEY (`groupon_id`,`user_id`) USING BTREE\n) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4;\n\n\n-- 初始数据\nINSERT INTO `sys_user` (`user_id`, `username`, `password`, `salt`, `email`, `mobile`, `status`, `create_user_id`, `create_time`) VALUES ('1', 'admin', '9ec9750e709431dad22365cabc5c625482e574c74adaebba7dd02f1129e4ce1d', 'YzcmCZNvbXocrsz9dm8e', 'root@sdb.io', '13612345678', '1', '1', '2016-11-11 11:11:11');\n\nINSERT INTO `sys_menu`(`menu_id`, `parent_id`, `name`, `url`, `perms`, `type`, `icon`, `order_num`) VALUES (1, 0, '系统管理', NULL, NULL, 0, 'system', 0);\nINSERT INTO `sys_menu`(`menu_id`, `parent_id`, `name`, `url`, `perms`, `type`, `icon`, `order_num`) VALUES (2, 1, '管理员列表', 'sys/user', NULL, 1, 'admin', 1);\nINSERT INTO `sys_menu`(`menu_id`, `parent_id`, `name`, `url`, `perms`, `type`, `icon`, `order_num`) VALUES (3, 1, '角色管理', 'sys/role', NULL, 1, 'role', 2);\nINSERT INTO `sys_menu`(`menu_id`, `parent_id`, `name`, `url`, `perms`, `type`, `icon`, `order_num`) VALUES (4, 1, '菜单管理', 'sys/menu', NULL, 1, 'menu', 3);\nINSERT INTO `sys_menu`(`menu_id`, `parent_id`, `name`, `url`, `perms`, `type`, `icon`, `order_num`) VALUES (5, 1, 'SQL监控', 'http://localhost:8080/sdb/druid/sql.html', NULL, 1, 'sql', 4);\nINSERT INTO `sys_menu`(`menu_id`, `parent_id`, `name`, `url`, `perms`, `type`, `icon`, `order_num`) VALUES (6, 1, '定时任务', 'job/schedule', NULL, 1, 'job', 5);\nINSERT INTO `sys_menu`(`menu_id`, `parent_id`, `name`, `url`, `perms`, `type`, `icon`, `order_num`) VALUES (7, 6, '查看', NULL, 'sys:schedule:list,sys:schedule:info', 2, NULL, 0);\nINSERT INTO `sys_menu`(`menu_id`, `parent_id`, `name`, `url`, `perms`, `type`, `icon`, `order_num`) VALUES (8, 6, '新增', NULL, 'sys:schedule:save', 2, NULL, 0);\nINSERT INTO `sys_menu`(`menu_id`, `parent_id`, `name`, `url`, `perms`, `type`, `icon`, `order_num`) VALUES (9, 6, '修改', NULL, 'sys:schedule:update', 2, NULL, 0);\nINSERT INTO `sys_menu`(`menu_id`, `parent_id`, `name`, `url`, `perms`, `type`, `icon`, `order_num`) VALUES (10, 6, '删除', NULL, 'sys:schedule:delete', 2, NULL, 0);\nINSERT INTO `sys_menu`(`menu_id`, `parent_id`, `name`, `url`, `perms`, `type`, `icon`, `order_num`) VALUES (11, 6, '暂停', NULL, 'sys:schedule:pause', 2, NULL, 0);\nINSERT INTO `sys_menu`(`menu_id`, `parent_id`, `name`, `url`, `perms`, `type`, `icon`, `order_num`) VALUES (12, 6, '恢复', NULL, 'sys:schedule:resume', 2, NULL, 0);\nINSERT INTO `sys_menu`(`menu_id`, `parent_id`, `name`, `url`, `perms`, `type`, `icon`, `order_num`) VALUES (13, 6, '立即执行', NULL, 'sys:schedule:run', 2, NULL, 0);\nINSERT INTO `sys_menu`(`menu_id`, `parent_id`, `name`, `url`, `perms`, `type`, `icon`, `order_num`) VALUES (14, 6, '日志列表', NULL, 'sys:schedule:log', 2, NULL, 0);\nINSERT INTO `sys_menu`(`menu_id`, `parent_id`, `name`, `url`, `perms`, `type`, `icon`, `order_num`) VALUES (15, 2, '查看', NULL, 'sys:user:list,sys:user:info', 2, NULL, 0);\nINSERT INTO `sys_menu`(`menu_id`, `parent_id`, `name`, `url`, `perms`, `type`, `icon`, `order_num`) VALUES (16, 2, '新增', NULL, 'sys:user:save,sys:role:select', 2, NULL, 0);\nINSERT INTO `sys_menu`(`menu_id`, `parent_id`, `name`, `url`, `perms`, `type`, `icon`, `order_num`) VALUES (17, 2, '修改', NULL, 'sys:user:update,sys:role:select', 2, NULL, 0);\nINSERT INTO `sys_menu`(`menu_id`, `parent_id`, `name`, `url`, `perms`, `type`, `icon`, `order_num`) VALUES (18, 2, '删除', NULL, 'sys:user:delete', 2, NULL, 0);\nINSERT INTO `sys_menu`(`menu_id`, `parent_id`, `name`, `url`, `perms`, `type`, `icon`, `order_num`) VALUES (19, 3, '查看', NULL, 'sys:role:list,sys:role:info', 2, NULL, 0);\nINSERT INTO `sys_menu`(`menu_id`, `parent_id`, `name`, `url`, `perms`, `type`, `icon`, `order_num`) VALUES (20, 3, '新增', NULL, 'sys:role:save,sys:menu:list', 2, NULL, 0);\nINSERT INTO `sys_menu`(`menu_id`, `parent_id`, `name`, `url`, `perms`, `type`, `icon`, `order_num`) VALUES (21, 3, '修改', NULL, 'sys:role:update,sys:menu:list', 2, NULL, 0);\nINSERT INTO `sys_menu`(`menu_id`, `parent_id`, `name`, `url`, `perms`, `type`, `icon`, `order_num`) VALUES (22, 3, '删除', NULL, 'sys:role:delete', 2, NULL, 0);\nINSERT INTO `sys_menu`(`menu_id`, `parent_id`, `name`, `url`, `perms`, `type`, `icon`, `order_num`) VALUES (23, 4, '查看', NULL, 'sys:menu:list,sys:menu:info', 2, NULL, 0);\nINSERT INTO `sys_menu`(`menu_id`, `parent_id`, `name`, `url`, `perms`, `type`, `icon`, `order_num`) VALUES (24, 4, '新增', NULL, 'sys:menu:save,sys:menu:select', 2, NULL, 0);\nINSERT INTO `sys_menu`(`menu_id`, `parent_id`, `name`, `url`, `perms`, `type`, `icon`, `order_num`) VALUES (25, 4, '修改', NULL, 'sys:menu:update,sys:menu:select', 2, NULL, 0);\nINSERT INTO `sys_menu`(`menu_id`, `parent_id`, `name`, `url`, `perms`, `type`, `icon`, `order_num`) VALUES (26, 4, '删除', NULL, 'sys:menu:delete', 2, NULL, 0);\nINSERT INTO `sys_menu`(`menu_id`, `parent_id`, `name`, `url`, `perms`, `type`, `icon`, `order_num`) VALUES (27, 1, '参数管理', 'sys/config', 'sys:config:list,sys:config:info,sys:config:save,sys:config:update,sys:config:delete', 1, 'config', 6);\nINSERT INTO `sys_menu`(`menu_id`, `parent_id`, `name`, `url`, `perms`, `type`, `icon`, `order_num`) VALUES (29, 1, '系统日志', 'sys/log', 'sys:log:list', 1, 'log', 7);\nINSERT INTO `sys_menu`(`menu_id`, `parent_id`, `name`, `url`, `perms`, `type`, `icon`, `order_num`) VALUES (30, 1, '文件上传', 'oss/oss', 'sys:oss:all', 1, 'oss', 6);\nINSERT INTO `sys_menu`(`menu_id`, `parent_id`, `name`, `url`, `perms`, `type`, `icon`, `order_num`) VALUES (31, 0, '业务管理', '', '', 0, 'config', 0);\nINSERT INTO `sys_menu`(`menu_id`, `parent_id`, `name`, `url`, `perms`, `type`, `icon`, `order_num`) VALUES (42, 31, '商品管理', 'sys/goods', '', 1, 'editor', 0);\nINSERT INTO `sys_menu`(`menu_id`, `parent_id`, `name`, `url`, `perms`, `type`, `icon`, `order_num`) VALUES (43, 31, '订单管理', 'sys/order', '', 1, 'bianji', 0);\nINSERT INTO `sys_menu`(`menu_id`, `parent_id`, `name`, `url`, `perms`, `type`, `icon`, `order_num`) VALUES (45, 31, '商品分类', 'sys/productCategory', '', 1, 'log', 0);\nINSERT INTO `sys_menu`(`menu_id`, `parent_id`, `name`, `url`, `perms`, `type`, `icon`, `order_num`) VALUES (46, 31, '规格管理', 'sys/specification', '', 1, 'menu', 0);\n\nINSERT INTO `sys_config` (`param_key`, `param_value`, `status`, `remark`) VALUES ('CLOUD_STORAGE_CONFIG_KEY', '{\\\"aliyunAccessKeyId\\\":\\\"\\\",\\\"aliyunAccessKeySecret\\\":\\\"\\\",\\\"aliyunBucketName\\\":\\\"\\\",\\\"aliyunDomain\\\":\\\"\\\",\\\"aliyunEndPoint\\\":\\\"\\\",\\\"aliyunPrefix\\\":\\\"\\\",\\\"qcloudBucketName\\\":\\\"\\\",\\\"qcloudDomain\\\":\\\"\\\",\\\"qcloudPrefix\\\":\\\"\\\",\\\"qcloudSecretId\\\":\\\"\\\",\\\"qcloudSecretKey\\\":\\\"\\\",\\\"qiniuAccessKey\\\":\\\"NrgMfABZxWLo5B-YYSjoE8-AZ1EISdi1Z3ubLOeZ\\\",\\\"qiniuBucketName\\\":\\\"ios-app\\\",\\\"qiniuDomain\\\":\\\"http://7xqbwh.dl1.z0.glb.clouddn.com\\\",\\\"qiniuPrefix\\\":\\\"upload\\\",\\\"qiniuSecretKey\\\":\\\"uIwJHevMRWU0VLxFvgy0tAcOdGqasdtVlJkdy6vV\\\",\\\"type\\\":1}', '0', '云存储配置信息');\nINSERT INTO `schedule_job` (`bean_name`, `method_name`, `params`, `cron_expression`, `status`, `remark`, `create_time`) VALUES ('testTask', 'test', 'sdb', '0 0/30 * * * ?', '0', '有参数测试', '2016-12-01 23:16:46');\nINSERT INTO `schedule_job` (`bean_name`, `method_name`, `params`, `cron_expression`, `status`, `remark`, `create_time`) VALUES ('testTask', 'test2', NULL, '0 0/30 * * * ?', '1', '无参数测试', '2016-12-03 14:55:56');\n\n\nINSERT INTO `sn`(`type`, `last_value`, `create_date`, `modify_date`) VALUES (1, 100, '2018-05-23 14:52:55', '2018-05-23 14:52:55');\nINSERT INTO `sn`(`type`, `last_value`, `create_date`, `modify_date`) VALUES (2, 100, '2018-05-23 14:52:55', '2018-05-23 14:52:55');\nINSERT INTO `sn`(`type`, `last_value`, `create_date`, `modify_date`) VALUES (3, 100, '2018-05-23 14:52:55', '2018-05-23 14:52:55');\nINSERT INTO `sn`(`type`, `last_value`, `create_date`, `modify_date`) VALUES (4, 100, '2018-05-23 14:52:55', '2018-05-23 14:52:55');\nINSERT INTO `sn`(`type`, `last_value`, `create_date`, `modify_date`) VALUES (5, 100, '2018-05-23 14:52:55', '2018-05-23 14:52:55');\nINSERT INTO `sn`(`type`, `last_value`, `create_date`, `modify_date`) VALUES (6, 100, '2018-05-23 14:52:55', '2018-05-23 14:52:55');"
  },
  {
    "path": "db/sdb_带测试数据.sql",
    "content": "/*\n Navicat Premium Data Transfer\n\n Source Server         : localhost\n Source Server Type    : MySQL\n Source Server Version : 50639\n Source Host           : 127.0.0.1:3306\n Source Schema         : sdb\n\n Target Server Type    : MySQL\n Target Server Version : 50639\n File Encoding         : 65001\n\n Date: 18/11/2018 14:28:13\n*/\n\nSET NAMES utf8mb4;\nSET FOREIGN_KEY_CHECKS = 0;\n\n-- ----------------------------\n-- Table structure for QRTZ_BLOB_TRIGGERS\n-- ----------------------------\nDROP TABLE IF EXISTS `QRTZ_BLOB_TRIGGERS`;\nCREATE TABLE `QRTZ_BLOB_TRIGGERS` (\n  `SCHED_NAME` varchar(120) NOT NULL,\n  `TRIGGER_NAME` varchar(200) NOT NULL,\n  `TRIGGER_GROUP` varchar(200) NOT NULL,\n  `BLOB_DATA` blob,\n  PRIMARY KEY (`SCHED_NAME`,`TRIGGER_NAME`,`TRIGGER_GROUP`),\n  KEY `SCHED_NAME` (`SCHED_NAME`,`TRIGGER_NAME`,`TRIGGER_GROUP`),\n  CONSTRAINT `qrtz_blob_triggers_ibfk_1` FOREIGN KEY (`SCHED_NAME`, `TRIGGER_NAME`, `TRIGGER_GROUP`) REFERENCES `QRTZ_TRIGGERS` (`SCHED_NAME`, `TRIGGER_NAME`, `TRIGGER_GROUP`)\n) ENGINE=InnoDB DEFAULT CHARSET=utf8;\n\n-- ----------------------------\n-- Table structure for QRTZ_CALENDARS\n-- ----------------------------\nDROP TABLE IF EXISTS `QRTZ_CALENDARS`;\nCREATE TABLE `QRTZ_CALENDARS` (\n  `SCHED_NAME` varchar(120) NOT NULL,\n  `CALENDAR_NAME` varchar(200) NOT NULL,\n  `CALENDAR` blob NOT NULL,\n  PRIMARY KEY (`SCHED_NAME`,`CALENDAR_NAME`)\n) ENGINE=InnoDB DEFAULT CHARSET=utf8;\n\n-- ----------------------------\n-- Table structure for QRTZ_CRON_TRIGGERS\n-- ----------------------------\nDROP TABLE IF EXISTS `QRTZ_CRON_TRIGGERS`;\nCREATE TABLE `QRTZ_CRON_TRIGGERS` (\n  `SCHED_NAME` varchar(120) NOT NULL,\n  `TRIGGER_NAME` varchar(200) NOT NULL,\n  `TRIGGER_GROUP` varchar(200) NOT NULL,\n  `CRON_EXPRESSION` varchar(120) NOT NULL,\n  `TIME_ZONE_ID` varchar(80) DEFAULT NULL,\n  PRIMARY KEY (`SCHED_NAME`,`TRIGGER_NAME`,`TRIGGER_GROUP`),\n  CONSTRAINT `qrtz_cron_triggers_ibfk_1` FOREIGN KEY (`SCHED_NAME`, `TRIGGER_NAME`, `TRIGGER_GROUP`) REFERENCES `QRTZ_TRIGGERS` (`SCHED_NAME`, `TRIGGER_NAME`, `TRIGGER_GROUP`)\n) ENGINE=InnoDB DEFAULT CHARSET=utf8;\n\n-- ----------------------------\n-- Records of QRTZ_CRON_TRIGGERS\n-- ----------------------------\nBEGIN;\nINSERT INTO `QRTZ_CRON_TRIGGERS` VALUES ('RenrenScheduler', 'TASK_1', 'DEFAULT', '0 0/30 * * * ?', 'Asia/Shanghai');\nINSERT INTO `QRTZ_CRON_TRIGGERS` VALUES ('RenrenScheduler', 'TASK_2', 'DEFAULT', '0 0/30 * * * ?', 'Asia/Shanghai');\nINSERT INTO `QRTZ_CRON_TRIGGERS` VALUES ('SdbScheduler', 'TASK_1', 'DEFAULT', '0 0/30 * * * ?', 'Asia/Shanghai');\nINSERT INTO `QRTZ_CRON_TRIGGERS` VALUES ('SdbScheduler', 'TASK_2', 'DEFAULT', '0 0/30 * * * ?', 'Asia/Shanghai');\nCOMMIT;\n\n-- ----------------------------\n-- Table structure for QRTZ_FIRED_TRIGGERS\n-- ----------------------------\nDROP TABLE IF EXISTS `QRTZ_FIRED_TRIGGERS`;\nCREATE TABLE `QRTZ_FIRED_TRIGGERS` (\n  `SCHED_NAME` varchar(120) NOT NULL,\n  `ENTRY_ID` varchar(95) NOT NULL,\n  `TRIGGER_NAME` varchar(200) NOT NULL,\n  `TRIGGER_GROUP` varchar(200) NOT NULL,\n  `INSTANCE_NAME` varchar(200) NOT NULL,\n  `FIRED_TIME` bigint(13) NOT NULL,\n  `SCHED_TIME` bigint(13) NOT NULL,\n  `PRIORITY` int(11) NOT NULL,\n  `STATE` varchar(16) NOT NULL,\n  `JOB_NAME` varchar(200) DEFAULT NULL,\n  `JOB_GROUP` varchar(200) DEFAULT NULL,\n  `IS_NONCONCURRENT` varchar(1) DEFAULT NULL,\n  `REQUESTS_RECOVERY` varchar(1) DEFAULT NULL,\n  PRIMARY KEY (`SCHED_NAME`,`ENTRY_ID`),\n  KEY `IDX_QRTZ_FT_TRIG_INST_NAME` (`SCHED_NAME`,`INSTANCE_NAME`),\n  KEY `IDX_QRTZ_FT_INST_JOB_REQ_RCVRY` (`SCHED_NAME`,`INSTANCE_NAME`,`REQUESTS_RECOVERY`),\n  KEY `IDX_QRTZ_FT_J_G` (`SCHED_NAME`,`JOB_NAME`,`JOB_GROUP`),\n  KEY `IDX_QRTZ_FT_JG` (`SCHED_NAME`,`JOB_GROUP`),\n  KEY `IDX_QRTZ_FT_T_G` (`SCHED_NAME`,`TRIGGER_NAME`,`TRIGGER_GROUP`),\n  KEY `IDX_QRTZ_FT_TG` (`SCHED_NAME`,`TRIGGER_GROUP`)\n) ENGINE=InnoDB DEFAULT CHARSET=utf8;\n\n-- ----------------------------\n-- Table structure for QRTZ_JOB_DETAILS\n-- ----------------------------\nDROP TABLE IF EXISTS `QRTZ_JOB_DETAILS`;\nCREATE TABLE `QRTZ_JOB_DETAILS` (\n  `SCHED_NAME` varchar(120) NOT NULL,\n  `JOB_NAME` varchar(200) NOT NULL,\n  `JOB_GROUP` varchar(200) NOT NULL,\n  `DESCRIPTION` varchar(250) DEFAULT NULL,\n  `JOB_CLASS_NAME` varchar(250) NOT NULL,\n  `IS_DURABLE` varchar(1) NOT NULL,\n  `IS_NONCONCURRENT` varchar(1) NOT NULL,\n  `IS_UPDATE_DATA` varchar(1) NOT NULL,\n  `REQUESTS_RECOVERY` varchar(1) NOT NULL,\n  `JOB_DATA` blob,\n  PRIMARY KEY (`SCHED_NAME`,`JOB_NAME`,`JOB_GROUP`),\n  KEY `IDX_QRTZ_J_REQ_RECOVERY` (`SCHED_NAME`,`REQUESTS_RECOVERY`),\n  KEY `IDX_QRTZ_J_GRP` (`SCHED_NAME`,`JOB_GROUP`)\n) ENGINE=InnoDB DEFAULT CHARSET=utf8;\n\n-- ----------------------------\n-- Records of QRTZ_JOB_DETAILS\n-- ----------------------------\nBEGIN;\nINSERT INTO `QRTZ_JOB_DETAILS` VALUES ('RenrenScheduler', 'TASK_1', 'DEFAULT', NULL, 'io.sdb.job.utils.ScheduleJob', '0', '0', '0', '0', 0xACED0005737200156F72672E71756172747A2E4A6F62446174614D61709FB083E8BFA9B0CB020000787200266F72672E71756172747A2E7574696C732E537472696E674B65794469727479466C61674D61708208E8C3FBC55D280200015A0013616C6C6F77735472616E7369656E74446174617872001D6F72672E71756172747A2E7574696C732E4469727479466C61674D617013E62EAD28760ACE0200025A000564697274794C00036D617074000F4C6A6176612F7574696C2F4D61703B787001737200116A6176612E7574696C2E486173684D61700507DAC1C31660D103000246000A6C6F6164466163746F724900097468726573686F6C6478703F4000000000000C7708000000100000000174000D4A4F425F504152414D5F4B455973720018696F2E7364622E6D6F64656C2E5363686564756C654A6F62B511FC0B16515A6A02000078720021696F2E7364622E6D6F64656C2E626173652E426173655363686564756C654A6F628688DB292DD3709202000078720024636F6D2E6A66696E616C2E706C7567696E2E6163746976657265636F72642E4D6F64656CF241A000649E44110200034C0005617474727371007E00034C000A636F6E6669674E616D657400124C6A6176612F6C616E672F537472696E673B4C000A6D6F64696679466C616774000F4C6A6176612F7574696C2F5365743B78707371007E00053F4000000000000C770800000010000000087400096265616E5F6E616D65740008746573745461736B74000B6372656174655F74696D65737200126A6176612E73716C2E54696D657374616D702618D5C80153BF650200014900056E616E6F737872000E6A6176612E7574696C2E44617465686A81014B5974190300007870770800000158BAF59330780000000074000B6D6574686F645F6E616D657400047465737474000F63726F6E5F65787072657373696F6E74000E3020302F3330202A202A202A203F7400066A6F625F69647372000E6A6176612E6C616E672E4C6F6E673B8BE490CC8F23DF0200014A000576616C7565787200106A6176612E6C616E672E4E756D62657286AC951D0B94E08B0200007870000000000000000174000672656D61726B74000FE69C89E58F82E695B0E6B58BE8AF95740006706172616D73740009766F6C756E74656572740006737461747573737200116A6176612E6C616E672E496E746567657212E2A0A4F781873802000149000576616C75657871007E001B000000007870707800);\nINSERT INTO `QRTZ_JOB_DETAILS` VALUES ('RenrenScheduler', 'TASK_2', 'DEFAULT', NULL, 'io.sdb.job.utils.ScheduleJob', '0', '0', '0', '0', 0xACED0005737200156F72672E71756172747A2E4A6F62446174614D61709FB083E8BFA9B0CB020000787200266F72672E71756172747A2E7574696C732E537472696E674B65794469727479466C61674D61708208E8C3FBC55D280200015A0013616C6C6F77735472616E7369656E74446174617872001D6F72672E71756172747A2E7574696C732E4469727479466C61674D617013E62EAD28760ACE0200025A000564697274794C00036D617074000F4C6A6176612F7574696C2F4D61703B787001737200116A6176612E7574696C2E486173684D61700507DAC1C31660D103000246000A6C6F6164466163746F724900097468726573686F6C6478703F4000000000000C7708000000100000000174000D4A4F425F504152414D5F4B455973720018696F2E7364622E6D6F64656C2E5363686564756C654A6F62B511FC0B16515A6A02000078720021696F2E7364622E6D6F64656C2E626173652E426173655363686564756C654A6F628688DB292DD3709202000078720024636F6D2E6A66696E616C2E706C7567696E2E6163746976657265636F72642E4D6F64656CF241A000649E44110200034C0005617474727371007E00034C000A636F6E6669674E616D657400124C6A6176612F6C616E672F537472696E673B4C000A6D6F64696679466C616774000F4C6A6176612F7574696C2F5365743B78707371007E00053F4000000000000C770800000010000000087400096265616E5F6E616D65740008746573745461736B74000B6372656174655F74696D65737200126A6176612E73716C2E54696D657374616D702618D5C80153BF650200014900056E616E6F737872000E6A6176612E7574696C2E44617465686A81014B5974190300007870770800000158C377C460780000000074000B6D6574686F645F6E616D65740005746573743274000F63726F6E5F65787072657373696F6E74000E3020302F3330202A202A202A203F7400066A6F625F69647372000E6A6176612E6C616E672E4C6F6E673B8BE490CC8F23DF0200014A000576616C7565787200106A6176612E6C616E672E4E756D62657286AC951D0B94E08B0200007870000000000000000274000672656D61726B74000FE697A0E58F82E695B0E6B58BE8AF95740006706172616D7370740006737461747573737200116A6176612E6C616E672E496E746567657212E2A0A4F781873802000149000576616C75657871007E001B000000017870707800);\nINSERT INTO `QRTZ_JOB_DETAILS` VALUES ('SdbScheduler', 'TASK_1', 'DEFAULT', NULL, 'io.sdb.job.utils.ScheduleJob', '0', '0', '0', '0', 0xACED0005737200156F72672E71756172747A2E4A6F62446174614D61709FB083E8BFA9B0CB020000787200266F72672E71756172747A2E7574696C732E537472696E674B65794469727479466C61674D61708208E8C3FBC55D280200015A0013616C6C6F77735472616E7369656E74446174617872001D6F72672E71756172747A2E7574696C732E4469727479466C61674D617013E62EAD28760ACE0200025A000564697274794C00036D617074000F4C6A6176612F7574696C2F4D61703B787001737200116A6176612E7574696C2E486173684D61700507DAC1C31660D103000246000A6C6F6164466163746F724900097468726573686F6C6478703F4000000000000C7708000000100000000174000D4A4F425F504152414D5F4B455973720018696F2E7364622E6D6F64656C2E5363686564756C654A6F62B511FC0B16515A6A02000078720021696F2E7364622E6D6F64656C2E626173652E426173655363686564756C654A6F628688DB292DD3709202000078720024636F6D2E6A66696E616C2E706C7567696E2E6163746976657265636F72642E4D6F64656CF241A000649E44110200034C0005617474727371007E00034C000A636F6E6669674E616D657400124C6A6176612F6C616E672F537472696E673B4C000A6D6F64696679466C616774000F4C6A6176612F7574696C2F5365743B78707371007E00053F4000000000000C770800000010000000087400096265616E5F6E616D65740008746573745461736B74000B6372656174655F74696D65737200126A6176612E73716C2E54696D657374616D702618D5C80153BF650200014900056E616E6F737872000E6A6176612E7574696C2E44617465686A81014B5974190300007870770800000158BAF59330780000000074000B6D6574686F645F6E616D657400047465737474000F63726F6E5F65787072657373696F6E74000E3020302F3330202A202A202A203F7400066A6F625F69647372000E6A6176612E6C616E672E4C6F6E673B8BE490CC8F23DF0200014A000576616C7565787200106A6176612E6C616E672E4E756D62657286AC951D0B94E08B0200007870000000000000000174000672656D61726B74000FE69C89E58F82E695B0E6B58BE8AF95740006706172616D73740009766F6C756E74656572740006737461747573737200116A6176612E6C616E672E496E746567657212E2A0A4F781873802000149000576616C75657871007E001B000000007870707800);\nINSERT INTO `QRTZ_JOB_DETAILS` VALUES ('SdbScheduler', 'TASK_2', 'DEFAULT', NULL, 'io.sdb.job.utils.ScheduleJob', '0', '0', '0', '0', 0xACED0005737200156F72672E71756172747A2E4A6F62446174614D61709FB083E8BFA9B0CB020000787200266F72672E71756172747A2E7574696C732E537472696E674B65794469727479466C61674D61708208E8C3FBC55D280200015A0013616C6C6F77735472616E7369656E74446174617872001D6F72672E71756172747A2E7574696C732E4469727479466C61674D617013E62EAD28760ACE0200025A000564697274794C00036D617074000F4C6A6176612F7574696C2F4D61703B787001737200116A6176612E7574696C2E486173684D61700507DAC1C31660D103000246000A6C6F6164466163746F724900097468726573686F6C6478703F4000000000000C7708000000100000000174000D4A4F425F504152414D5F4B455973720018696F2E7364622E6D6F64656C2E5363686564756C654A6F62B511FC0B16515A6A02000078720021696F2E7364622E6D6F64656C2E626173652E426173655363686564756C654A6F628688DB292DD3709202000078720024636F6D2E6A66696E616C2E706C7567696E2E6163746976657265636F72642E4D6F64656CF241A000649E44110200034C0005617474727371007E00034C000A636F6E6669674E616D657400124C6A6176612F6C616E672F537472696E673B4C000A6D6F64696679466C616774000F4C6A6176612F7574696C2F5365743B78707371007E00053F4000000000000C770800000010000000087400096265616E5F6E616D65740008746573745461736B74000B6372656174655F74696D65737200126A6176612E73716C2E54696D657374616D702618D5C80153BF650200014900056E616E6F737872000E6A6176612E7574696C2E44617465686A81014B5974190300007870770800000158C377C460780000000074000B6D6574686F645F6E616D65740005746573743274000F63726F6E5F65787072657373696F6E74000E3020302F3330202A202A202A203F7400066A6F625F69647372000E6A6176612E6C616E672E4C6F6E673B8BE490CC8F23DF0200014A000576616C7565787200106A6176612E6C616E672E4E756D62657286AC951D0B94E08B0200007870000000000000000274000672656D61726B74000FE697A0E58F82E695B0E6B58BE8AF95740006706172616D7370740006737461747573737200116A6176612E6C616E672E496E746567657212E2A0A4F781873802000149000576616C75657871007E001B000000017870707800);\nCOMMIT;\n\n-- ----------------------------\n-- Table structure for QRTZ_LOCKS\n-- ----------------------------\nDROP TABLE IF EXISTS `QRTZ_LOCKS`;\nCREATE TABLE `QRTZ_LOCKS` (\n  `SCHED_NAME` varchar(120) NOT NULL,\n  `LOCK_NAME` varchar(40) NOT NULL,\n  PRIMARY KEY (`SCHED_NAME`,`LOCK_NAME`)\n) ENGINE=InnoDB DEFAULT CHARSET=utf8;\n\n-- ----------------------------\n-- Records of QRTZ_LOCKS\n-- ----------------------------\nBEGIN;\nINSERT INTO `QRTZ_LOCKS` VALUES ('RenrenScheduler', 'STATE_ACCESS');\nINSERT INTO `QRTZ_LOCKS` VALUES ('RenrenScheduler', 'TRIGGER_ACCESS');\nCOMMIT;\n\n-- ----------------------------\n-- Table structure for QRTZ_PAUSED_TRIGGER_GRPS\n-- ----------------------------\nDROP TABLE IF EXISTS `QRTZ_PAUSED_TRIGGER_GRPS`;\nCREATE TABLE `QRTZ_PAUSED_TRIGGER_GRPS` (\n  `SCHED_NAME` varchar(120) NOT NULL,\n  `TRIGGER_GROUP` varchar(200) NOT NULL,\n  PRIMARY KEY (`SCHED_NAME`,`TRIGGER_GROUP`)\n) ENGINE=InnoDB DEFAULT CHARSET=utf8;\n\n-- ----------------------------\n-- Table structure for QRTZ_SCHEDULER_STATE\n-- ----------------------------\nDROP TABLE IF EXISTS `QRTZ_SCHEDULER_STATE`;\nCREATE TABLE `QRTZ_SCHEDULER_STATE` (\n  `SCHED_NAME` varchar(120) NOT NULL,\n  `INSTANCE_NAME` varchar(200) NOT NULL,\n  `LAST_CHECKIN_TIME` bigint(13) NOT NULL,\n  `CHECKIN_INTERVAL` bigint(13) NOT NULL,\n  PRIMARY KEY (`SCHED_NAME`,`INSTANCE_NAME`)\n) ENGINE=InnoDB DEFAULT CHARSET=utf8;\n\n-- ----------------------------\n-- Records of QRTZ_SCHEDULER_STATE\n-- ----------------------------\nBEGIN;\nINSERT INTO `QRTZ_SCHEDULER_STATE` VALUES ('RenrenScheduler', 'yjjdick.local1539833998504', 1539834505666, 15000);\nINSERT INTO `QRTZ_SCHEDULER_STATE` VALUES ('SdbScheduler', '801920efd2ee1541730145340', 1541730279149, 15000);\nINSERT INTO `QRTZ_SCHEDULER_STATE` VALUES ('SdbScheduler', 'ef296fde8d1b1541730144235', 1541730278904, 15000);\nCOMMIT;\n\n-- ----------------------------\n-- Table structure for QRTZ_SIMPLE_TRIGGERS\n-- ----------------------------\nDROP TABLE IF EXISTS `QRTZ_SIMPLE_TRIGGERS`;\nCREATE TABLE `QRTZ_SIMPLE_TRIGGERS` (\n  `SCHED_NAME` varchar(120) NOT NULL,\n  `TRIGGER_NAME` varchar(200) NOT NULL,\n  `TRIGGER_GROUP` varchar(200) NOT NULL,\n  `REPEAT_COUNT` bigint(7) NOT NULL,\n  `REPEAT_INTERVAL` bigint(12) NOT NULL,\n  `TIMES_TRIGGERED` bigint(10) NOT NULL,\n  PRIMARY KEY (`SCHED_NAME`,`TRIGGER_NAME`,`TRIGGER_GROUP`),\n  CONSTRAINT `qrtz_simple_triggers_ibfk_1` FOREIGN KEY (`SCHED_NAME`, `TRIGGER_NAME`, `TRIGGER_GROUP`) REFERENCES `QRTZ_TRIGGERS` (`SCHED_NAME`, `TRIGGER_NAME`, `TRIGGER_GROUP`)\n) ENGINE=InnoDB DEFAULT CHARSET=utf8;\n\n-- ----------------------------\n-- Table structure for QRTZ_SIMPROP_TRIGGERS\n-- ----------------------------\nDROP TABLE IF EXISTS `QRTZ_SIMPROP_TRIGGERS`;\nCREATE TABLE `QRTZ_SIMPROP_TRIGGERS` (\n  `SCHED_NAME` varchar(120) NOT NULL,\n  `TRIGGER_NAME` varchar(200) NOT NULL,\n  `TRIGGER_GROUP` varchar(200) NOT NULL,\n  `STR_PROP_1` varchar(512) DEFAULT NULL,\n  `STR_PROP_2` varchar(512) DEFAULT NULL,\n  `STR_PROP_3` varchar(512) DEFAULT NULL,\n  `INT_PROP_1` int(11) DEFAULT NULL,\n  `INT_PROP_2` int(11) DEFAULT NULL,\n  `LONG_PROP_1` bigint(20) DEFAULT NULL,\n  `LONG_PROP_2` bigint(20) DEFAULT NULL,\n  `DEC_PROP_1` decimal(13,4) DEFAULT NULL,\n  `DEC_PROP_2` decimal(13,4) DEFAULT NULL,\n  `BOOL_PROP_1` varchar(1) DEFAULT NULL,\n  `BOOL_PROP_2` varchar(1) DEFAULT NULL,\n  PRIMARY KEY (`SCHED_NAME`,`TRIGGER_NAME`,`TRIGGER_GROUP`),\n  CONSTRAINT `qrtz_simprop_triggers_ibfk_1` FOREIGN KEY (`SCHED_NAME`, `TRIGGER_NAME`, `TRIGGER_GROUP`) REFERENCES `QRTZ_TRIGGERS` (`SCHED_NAME`, `TRIGGER_NAME`, `TRIGGER_GROUP`)\n) ENGINE=InnoDB DEFAULT CHARSET=utf8;\n\n-- ----------------------------\n-- Table structure for QRTZ_TRIGGERS\n-- ----------------------------\nDROP TABLE IF EXISTS `QRTZ_TRIGGERS`;\nCREATE TABLE `QRTZ_TRIGGERS` (\n  `SCHED_NAME` varchar(120) NOT NULL,\n  `TRIGGER_NAME` varchar(200) NOT NULL,\n  `TRIGGER_GROUP` varchar(200) NOT NULL,\n  `JOB_NAME` varchar(200) NOT NULL,\n  `JOB_GROUP` varchar(200) NOT NULL,\n  `DESCRIPTION` varchar(250) DEFAULT NULL,\n  `NEXT_FIRE_TIME` bigint(13) DEFAULT NULL,\n  `PREV_FIRE_TIME` bigint(13) DEFAULT NULL,\n  `PRIORITY` int(11) DEFAULT NULL,\n  `TRIGGER_STATE` varchar(16) NOT NULL,\n  `TRIGGER_TYPE` varchar(8) NOT NULL,\n  `START_TIME` bigint(13) NOT NULL,\n  `END_TIME` bigint(13) DEFAULT NULL,\n  `CALENDAR_NAME` varchar(200) DEFAULT NULL,\n  `MISFIRE_INSTR` smallint(2) DEFAULT NULL,\n  `JOB_DATA` blob,\n  PRIMARY KEY (`SCHED_NAME`,`TRIGGER_NAME`,`TRIGGER_GROUP`),\n  KEY `IDX_QRTZ_T_J` (`SCHED_NAME`,`JOB_NAME`,`JOB_GROUP`),\n  KEY `IDX_QRTZ_T_JG` (`SCHED_NAME`,`JOB_GROUP`),\n  KEY `IDX_QRTZ_T_C` (`SCHED_NAME`,`CALENDAR_NAME`),\n  KEY `IDX_QRTZ_T_G` (`SCHED_NAME`,`TRIGGER_GROUP`),\n  KEY `IDX_QRTZ_T_STATE` (`SCHED_NAME`,`TRIGGER_STATE`),\n  KEY `IDX_QRTZ_T_N_STATE` (`SCHED_NAME`,`TRIGGER_NAME`,`TRIGGER_GROUP`,`TRIGGER_STATE`),\n  KEY `IDX_QRTZ_T_N_G_STATE` (`SCHED_NAME`,`TRIGGER_GROUP`,`TRIGGER_STATE`),\n  KEY `IDX_QRTZ_T_NEXT_FIRE_TIME` (`SCHED_NAME`,`NEXT_FIRE_TIME`),\n  KEY `IDX_QRTZ_T_NFT_ST` (`SCHED_NAME`,`TRIGGER_STATE`,`NEXT_FIRE_TIME`),\n  KEY `IDX_QRTZ_T_NFT_MISFIRE` (`SCHED_NAME`,`MISFIRE_INSTR`,`NEXT_FIRE_TIME`),\n  KEY `IDX_QRTZ_T_NFT_ST_MISFIRE` (`SCHED_NAME`,`MISFIRE_INSTR`,`NEXT_FIRE_TIME`,`TRIGGER_STATE`),\n  KEY `IDX_QRTZ_T_NFT_ST_MISFIRE_GRP` (`SCHED_NAME`,`MISFIRE_INSTR`,`NEXT_FIRE_TIME`,`TRIGGER_GROUP`,`TRIGGER_STATE`),\n  CONSTRAINT `qrtz_triggers_ibfk_1` FOREIGN KEY (`SCHED_NAME`, `JOB_NAME`, `JOB_GROUP`) REFERENCES `QRTZ_JOB_DETAILS` (`SCHED_NAME`, `JOB_NAME`, `JOB_GROUP`)\n) ENGINE=InnoDB DEFAULT CHARSET=utf8;\n\n-- ----------------------------\n-- Records of QRTZ_TRIGGERS\n-- ----------------------------\nBEGIN;\nINSERT INTO `QRTZ_TRIGGERS` VALUES ('RenrenScheduler', 'TASK_1', 'DEFAULT', 'TASK_1', 'DEFAULT', NULL, 1541086200000, -1, 5, 'WAITING', 'CRON', 1541085179000, 0, NULL, 2, 0xACED0005737200156F72672E71756172747A2E4A6F62446174614D61709FB083E8BFA9B0CB020000787200266F72672E71756172747A2E7574696C732E537472696E674B65794469727479466C61674D61708208E8C3FBC55D280200015A0013616C6C6F77735472616E7369656E74446174617872001D6F72672E71756172747A2E7574696C732E4469727479466C61674D617013E62EAD28760ACE0200025A000564697274794C00036D617074000F4C6A6176612F7574696C2F4D61703B787001737200116A6176612E7574696C2E486173684D61700507DAC1C31660D103000246000A6C6F6164466163746F724900097468726573686F6C6478703F4000000000000C7708000000100000000174000D4A4F425F504152414D5F4B455973720018696F2E7364622E6D6F64656C2E5363686564756C654A6F62B511FC0B16515A6A02000078720021696F2E7364622E6D6F64656C2E626173652E426173655363686564756C654A6F628688DB292DD3709202000078720024636F6D2E6A66696E616C2E706C7567696E2E6163746976657265636F72642E4D6F64656CF241A000649E44110200034C0005617474727371007E00034C000A636F6E6669674E616D657400124C6A6176612F6C616E672F537472696E673B4C000A6D6F64696679466C616774000F4C6A6176612F7574696C2F5365743B78707371007E00053F4000000000000C770800000010000000087400096265616E5F6E616D65740008746573745461736B74000B6372656174655F74696D65737200126A6176612E73716C2E54696D657374616D702618D5C80153BF650200014900056E616E6F737872000E6A6176612E7574696C2E44617465686A81014B5974190300007870770800000158BAF59330780000000074000B6D6574686F645F6E616D657400047465737474000F63726F6E5F65787072657373696F6E74000E3020302F3330202A202A202A203F7400066A6F625F69647372000E6A6176612E6C616E672E4C6F6E673B8BE490CC8F23DF0200014A000576616C7565787200106A6176612E6C616E672E4E756D62657286AC951D0B94E08B0200007870000000000000000174000672656D61726B74000FE69C89E58F82E695B0E6B58BE8AF95740006706172616D73740009766F6C756E74656572740006737461747573737200116A6176612E6C616E672E496E746567657212E2A0A4F781873802000149000576616C75657871007E001B000000007870707800);\nINSERT INTO `QRTZ_TRIGGERS` VALUES ('RenrenScheduler', 'TASK_2', 'DEFAULT', 'TASK_2', 'DEFAULT', NULL, 1541086200000, -1, 5, 'PAUSED', 'CRON', 1541085179000, 0, NULL, 2, 0xACED0005737200156F72672E71756172747A2E4A6F62446174614D61709FB083E8BFA9B0CB020000787200266F72672E71756172747A2E7574696C732E537472696E674B65794469727479466C61674D61708208E8C3FBC55D280200015A0013616C6C6F77735472616E7369656E74446174617872001D6F72672E71756172747A2E7574696C732E4469727479466C61674D617013E62EAD28760ACE0200025A000564697274794C00036D617074000F4C6A6176612F7574696C2F4D61703B787001737200116A6176612E7574696C2E486173684D61700507DAC1C31660D103000246000A6C6F6164466163746F724900097468726573686F6C6478703F4000000000000C7708000000100000000174000D4A4F425F504152414D5F4B455973720018696F2E7364622E6D6F64656C2E5363686564756C654A6F62B511FC0B16515A6A02000078720021696F2E7364622E6D6F64656C2E626173652E426173655363686564756C654A6F628688DB292DD3709202000078720024636F6D2E6A66696E616C2E706C7567696E2E6163746976657265636F72642E4D6F64656CF241A000649E44110200034C0005617474727371007E00034C000A636F6E6669674E616D657400124C6A6176612F6C616E672F537472696E673B4C000A6D6F64696679466C616774000F4C6A6176612F7574696C2F5365743B78707371007E00053F4000000000000C770800000010000000087400096265616E5F6E616D65740008746573745461736B74000B6372656174655F74696D65737200126A6176612E73716C2E54696D657374616D702618D5C80153BF650200014900056E616E6F737872000E6A6176612E7574696C2E44617465686A81014B5974190300007870770800000158C377C460780000000074000B6D6574686F645F6E616D65740005746573743274000F63726F6E5F65787072657373696F6E74000E3020302F3330202A202A202A203F7400066A6F625F69647372000E6A6176612E6C616E672E4C6F6E673B8BE490CC8F23DF0200014A000576616C7565787200106A6176612E6C616E672E4E756D62657286AC951D0B94E08B0200007870000000000000000274000672656D61726B74000FE697A0E58F82E695B0E6B58BE8AF95740006706172616D7370740006737461747573737200116A6176612E6C616E672E496E746567657212E2A0A4F781873802000149000576616C75657871007E001B000000017870707800);\nINSERT INTO `QRTZ_TRIGGERS` VALUES ('SdbScheduler', 'TASK_1', 'DEFAULT', 'TASK_1', 'DEFAULT', NULL, 1541089800000, -1, 5, 'WAITING', 'CRON', 1541088959000, 0, NULL, 2, 0xACED0005737200156F72672E71756172747A2E4A6F62446174614D61709FB083E8BFA9B0CB020000787200266F72672E71756172747A2E7574696C732E537472696E674B65794469727479466C61674D61708208E8C3FBC55D280200015A0013616C6C6F77735472616E7369656E74446174617872001D6F72672E71756172747A2E7574696C732E4469727479466C61674D617013E62EAD28760ACE0200025A000564697274794C00036D617074000F4C6A6176612F7574696C2F4D61703B787001737200116A6176612E7574696C2E486173684D61700507DAC1C31660D103000246000A6C6F6164466163746F724900097468726573686F6C6478703F4000000000000C7708000000100000000174000D4A4F425F504152414D5F4B455973720018696F2E7364622E6D6F64656C2E5363686564756C654A6F62B511FC0B16515A6A02000078720021696F2E7364622E6D6F64656C2E626173652E426173655363686564756C654A6F628688DB292DD3709202000078720024636F6D2E6A66696E616C2E706C7567696E2E6163746976657265636F72642E4D6F64656CF241A000649E44110200034C0005617474727371007E00034C000A636F6E6669674E616D657400124C6A6176612F6C616E672F537472696E673B4C000A6D6F64696679466C616774000F4C6A6176612F7574696C2F5365743B78707371007E00053F4000000000000C770800000010000000087400096265616E5F6E616D65740008746573745461736B74000B6372656174655F74696D65737200126A6176612E73716C2E54696D657374616D702618D5C80153BF650200014900056E616E6F737872000E6A6176612E7574696C2E44617465686A81014B5974190300007870770800000158BAF59330780000000074000B6D6574686F645F6E616D657400047465737474000F63726F6E5F65787072657373696F6E74000E3020302F3330202A202A202A203F7400066A6F625F69647372000E6A6176612E6C616E672E4C6F6E673B8BE490CC8F23DF0200014A000576616C7565787200106A6176612E6C616E672E4E756D62657286AC951D0B94E08B0200007870000000000000000174000672656D61726B74000FE69C89E58F82E695B0E6B58BE8AF95740006706172616D73740003736462740006737461747573737200116A6176612E6C616E672E496E746567657212E2A0A4F781873802000149000576616C75657871007E001B000000007870707800);\nINSERT INTO `QRTZ_TRIGGERS` VALUES ('SdbScheduler', 'TASK_2', 'DEFAULT', 'TASK_2', 'DEFAULT', NULL, 1541089800000, -1, 5, 'PAUSED', 'CRON', 1541088959000, 0, NULL, 2, 0xACED0005737200156F72672E71756172747A2E4A6F62446174614D61709FB083E8BFA9B0CB020000787200266F72672E71756172747A2E7574696C732E537472696E674B65794469727479466C61674D61708208E8C3FBC55D280200015A0013616C6C6F77735472616E7369656E74446174617872001D6F72672E71756172747A2E7574696C732E4469727479466C61674D617013E62EAD28760ACE0200025A000564697274794C00036D617074000F4C6A6176612F7574696C2F4D61703B787001737200116A6176612E7574696C2E486173684D61700507DAC1C31660D103000246000A6C6F6164466163746F724900097468726573686F6C6478703F4000000000000C7708000000100000000174000D4A4F425F504152414D5F4B455973720018696F2E7364622E6D6F64656C2E5363686564756C654A6F62B511FC0B16515A6A02000078720021696F2E7364622E6D6F64656C2E626173652E426173655363686564756C654A6F628688DB292DD3709202000078720024636F6D2E6A66696E616C2E706C7567696E2E6163746976657265636F72642E4D6F64656CF241A000649E44110200034C0005617474727371007E00034C000A636F6E6669674E616D657400124C6A6176612F6C616E672F537472696E673B4C000A6D6F64696679466C616774000F4C6A6176612F7574696C2F5365743B78707371007E00053F4000000000000C770800000010000000087400096265616E5F6E616D65740008746573745461736B74000B6372656174655F74696D65737200126A6176612E73716C2E54696D657374616D702618D5C80153BF650200014900056E616E6F737872000E6A6176612E7574696C2E44617465686A81014B5974190300007870770800000158C377C460780000000074000B6D6574686F645F6E616D65740005746573743274000F63726F6E5F65787072657373696F6E74000E3020302F3330202A202A202A203F7400066A6F625F69647372000E6A6176612E6C616E672E4C6F6E673B8BE490CC8F23DF0200014A000576616C7565787200106A6176612E6C616E672E4E756D62657286AC951D0B94E08B0200007870000000000000000274000672656D61726B74000FE697A0E58F82E695B0E6B58BE8AF95740006706172616D7370740006737461747573737200116A6176612E6C616E672E496E746567657212E2A0A4F781873802000149000576616C75657871007E001B000000017870707800);\nCOMMIT;\n\n-- ----------------------------\n-- Table structure for area\n-- ----------------------------\nDROP TABLE IF EXISTS `area`;\nCREATE TABLE `area` (\n  `id` bigint(20) NOT NULL AUTO_INCREMENT,\n  `create_date` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '创建日期',\n  `modify_date` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '更新日期',\n  `version` bigint(20) NOT NULL DEFAULT '0',\n  `orders` int(11) DEFAULT NULL,\n  `full_name` longtext NOT NULL,\n  `grade` int(11) NOT NULL,\n  `name` varchar(255) NOT NULL,\n  `tree_path` varchar(255) NOT NULL,\n  `parent_id` bigint(20) DEFAULT NULL,\n  PRIMARY KEY (`id`),\n  KEY `ind_area_parent` (`parent_id`)\n) ENGINE=InnoDB AUTO_INCREMENT=3223 DEFAULT CHARSET=utf8 COMMENT='地区';\n\n-- ----------------------------\n-- Records of area\n-- ----------------------------\nBEGIN;\nINSERT INTO `area` VALUES (1, '2015-10-19 00:03:53', '2017-01-11 14:43:59', 2, 1, '北京市', 0, '北京市', ',', NULL);\nINSERT INTO `area` VALUES (2, '2015-10-19 00:03:54', '2015-10-19 00:03:54', 0, 1, '北京市东城区', 1, '东城区', ',1,', 1);\nINSERT INTO `area` VALUES (3, '2015-10-19 00:03:55', '2015-10-19 00:03:55', 0, 2, '北京市西城区', 1, '西城区', ',1,', 1);\nINSERT INTO `area` VALUES (4, '2015-10-19 00:03:56', '2015-10-19 00:03:56', 0, 3, '北京市朝阳区', 1, '朝阳区', ',1,', 1);\nINSERT INTO `area` VALUES (5, '2015-10-19 00:03:57', '2015-10-19 00:03:57', 0, 4, '北京市丰台区', 1, '丰台区', ',1,', 1);\nINSERT INTO `area` VALUES (6, '2015-10-19 00:03:58', '2015-10-19 00:03:58', 0, 5, '北京市石景山区', 1, '石景山区', ',1,', 1);\nINSERT INTO `area` VALUES (7, '2015-10-19 00:03:59', '2015-10-19 00:03:59', 0, 6, '北京市海淀区', 1, '海淀区', ',1,', 1);\nINSERT INTO `area` VALUES (8, '2015-10-19 00:04:00', '2015-10-19 00:04:00', 0, 7, '北京市门头沟区', 1, '门头沟区', ',1,', 1);\nINSERT INTO `area` VALUES (9, '2015-10-19 00:04:01', '2015-10-19 00:04:01', 0, 8, '北京市房山区', 1, '房山区', ',1,', 1);\nINSERT INTO `area` VALUES (10, '2015-10-19 00:04:02', '2015-10-19 00:04:02', 0, 9, '北京市通州区', 1, '通州区', ',1,', 1);\nINSERT INTO `area` VALUES (11, '2015-10-19 00:04:03', '2015-10-19 00:04:03', 0, 10, '北京市顺义区', 1, '顺义区', ',1,', 1);\nINSERT INTO `area` VALUES (12, '2015-10-19 00:04:04', '2015-10-19 00:04:04', 0, 11, '北京市昌平区', 1, '昌平区', ',1,', 1);\nINSERT INTO `area` VALUES (13, '2015-10-19 00:04:05', '2015-10-19 00:04:05', 0, 12, '北京市大兴区', 1, '大兴区', ',1,', 1);\nINSERT INTO `area` VALUES (14, '2015-10-19 00:04:06', '2015-10-19 00:04:06', 0, 13, '北京市怀柔区', 1, '怀柔区', ',1,', 1);\nINSERT INTO `area` VALUES (15, '2015-10-19 00:04:07', '2015-10-19 00:04:07', 0, 14, '北京市平谷区', 1, '平谷区', ',1,', 1);\nINSERT INTO `area` VALUES (16, '2015-10-19 00:04:08', '2015-10-19 00:04:08', 0, 15, '北京市密云县', 1, '密云县', ',1,', 1);\nINSERT INTO `area` VALUES (17, '2015-10-19 00:04:09', '2015-10-19 00:04:09', 0, 16, '北京市延庆县', 1, '延庆县', ',1,', 1);\nINSERT INTO `area` VALUES (18, '2015-10-19 00:04:10', '2015-10-19 00:04:10', 0, 2, '天津市', 0, '天津市', ',', NULL);\nINSERT INTO `area` VALUES (19, '2015-10-19 00:04:11', '2015-10-19 00:04:11', 0, 1, '天津市和平区', 1, '和平区', ',18,', 18);\nINSERT INTO `area` VALUES (20, '2015-10-19 00:04:12', '2015-10-19 00:04:12', 0, 2, '天津市河东区', 1, '河东区', ',18,', 18);\nINSERT INTO `area` VALUES (21, '2015-10-19 00:04:13', '2015-10-19 00:04:13', 0, 3, '天津市河西区', 1, '河西区', ',18,', 18);\nINSERT INTO `area` VALUES (22, '2015-10-19 00:04:14', '2015-10-19 00:04:14', 0, 4, '天津市南开区', 1, '南开区', ',18,', 18);\nINSERT INTO `area` VALUES (23, '2015-10-19 00:04:15', '2015-10-19 00:04:15', 0, 5, '天津市河北区', 1, '河北区', ',18,', 18);\nINSERT INTO `area` VALUES (24, '2015-10-19 00:04:16', '2015-10-19 00:04:16', 0, 6, '天津市红桥区', 1, '红桥区', ',18,', 18);\nINSERT INTO `area` VALUES (25, '2015-10-19 00:04:17', '2015-10-19 00:04:17', 0, 7, '天津市东丽区', 1, '东丽区', ',18,', 18);\nINSERT INTO `area` VALUES (26, '2015-10-19 00:04:18', '2015-10-19 00:04:18', 0, 8, '天津市西青区', 1, '西青区', ',18,', 18);\nINSERT INTO `area` VALUES (27, '2015-10-19 00:04:19', '2015-10-19 00:04:19', 0, 9, '天津市津南区', 1, '津南区', ',18,', 18);\nINSERT INTO `area` VALUES (28, '2015-10-19 00:04:20', '2015-10-19 00:04:20', 0, 10, '天津市北辰区', 1, '北辰区', ',18,', 18);\nINSERT INTO `area` VALUES (29, '2015-10-19 00:04:21', '2015-10-19 00:04:21', 0, 11, '天津市武清区', 1, '武清区', ',18,', 18);\nINSERT INTO `area` VALUES (30, '2015-10-19 00:04:22', '2015-10-19 00:04:22', 0, 12, '天津市宝坻区', 1, '宝坻区', ',18,', 18);\nINSERT INTO `area` VALUES (31, '2015-10-19 00:04:23', '2015-10-19 00:04:23', 0, 13, '天津市滨海新区', 1, '滨海新区', ',18,', 18);\nINSERT INTO `area` VALUES (32, '2015-10-19 00:04:24', '2015-10-19 00:04:24', 0, 14, '天津市宁河县', 1, '宁河县', ',18,', 18);\nINSERT INTO `area` VALUES (33, '2015-10-19 00:04:25', '2015-10-19 00:04:25', 0, 15, '天津市静海县', 1, '静海县', ',18,', 18);\nINSERT INTO `area` VALUES (34, '2015-10-19 00:04:26', '2015-10-19 00:04:26', 0, 16, '天津市蓟县', 1, '蓟县', ',18,', 18);\nINSERT INTO `area` VALUES (35, '2015-10-19 00:04:27', '2015-10-19 00:04:27', 0, 3, '河北省', 0, '河北省', ',', NULL);\nINSERT INTO `area` VALUES (36, '2015-10-19 00:04:28', '2015-10-19 00:04:28', 0, 1, '河北省石家庄市', 1, '石家庄市', ',35,', 35);\nINSERT INTO `area` VALUES (37, '2015-10-19 00:04:29', '2015-10-19 00:04:29', 0, 1, '河北省石家庄市长安区', 2, '长安区', ',35,36,', 36);\nINSERT INTO `area` VALUES (38, '2015-10-19 00:04:30', '2015-10-19 00:04:30', 0, 2, '河北省石家庄市桥东区', 2, '桥东区', ',35,36,', 36);\nINSERT INTO `area` VALUES (39, '2015-10-19 00:04:31', '2015-10-19 00:04:31', 0, 3, '河北省石家庄市桥西区', 2, '桥西区', ',35,36,', 36);\nINSERT INTO `area` VALUES (40, '2015-10-19 00:04:32', '2015-10-19 00:04:32', 0, 4, '河北省石家庄市新华区', 2, '新华区', ',35,36,', 36);\nINSERT INTO `area` VALUES (41, '2015-10-19 00:04:33', '2015-10-19 00:04:33', 0, 5, '河北省石家庄市井陉矿区', 2, '井陉矿区', ',35,36,', 36);\nINSERT INTO `area` VALUES (42, '2015-10-19 00:04:34', '2015-10-19 00:04:34', 0, 6, '河北省石家庄市裕华区', 2, '裕华区', ',35,36,', 36);\nINSERT INTO `area` VALUES (43, '2015-10-19 00:04:35', '2015-10-19 00:04:35', 0, 7, '河北省石家庄市井陉县', 2, '井陉县', ',35,36,', 36);\nINSERT INTO `area` VALUES (44, '2015-10-19 00:04:36', '2015-10-19 00:04:36', 0, 8, '河北省石家庄市正定县', 2, '正定县', ',35,36,', 36);\nINSERT INTO `area` VALUES (45, '2015-10-19 00:04:37', '2015-10-19 00:04:37', 0, 9, '河北省石家庄市栾城县', 2, '栾城县', ',35,36,', 36);\nINSERT INTO `area` VALUES (46, '2015-10-19 00:04:38', '2015-10-19 00:04:38', 0, 10, '河北省石家庄市行唐县', 2, '行唐县', ',35,36,', 36);\nINSERT INTO `area` VALUES (47, '2015-10-19 00:04:39', '2015-10-19 00:04:39', 0, 11, '河北省石家庄市灵寿县', 2, '灵寿县', ',35,36,', 36);\nINSERT INTO `area` VALUES (48, '2015-10-19 00:04:40', '2015-10-19 00:04:40', 0, 12, '河北省石家庄市高邑县', 2, '高邑县', ',35,36,', 36);\nINSERT INTO `area` VALUES (49, '2015-10-19 00:04:41', '2015-10-19 00:04:41', 0, 13, '河北省石家庄市深泽县', 2, '深泽县', ',35,36,', 36);\nINSERT INTO `area` VALUES (50, '2015-10-19 00:04:42', '2015-10-19 00:04:42', 0, 14, '河北省石家庄市赞皇县', 2, '赞皇县', ',35,36,', 36);\nINSERT INTO `area` VALUES (51, '2015-10-19 00:04:43', '2015-10-19 00:04:43', 0, 15, '河北省石家庄市无极县', 2, '无极县', ',35,36,', 36);\nINSERT INTO `area` VALUES (52, '2015-10-19 00:04:44', '2015-10-19 00:04:44', 0, 16, '河北省石家庄市平山县', 2, '平山县', ',35,36,', 36);\nINSERT INTO `area` VALUES (53, '2015-10-19 00:04:45', '2015-10-19 00:04:45', 0, 17, '河北省石家庄市元氏县', 2, '元氏县', ',35,36,', 36);\nINSERT INTO `area` VALUES (54, '2015-10-19 00:04:46', '2015-10-19 00:04:46', 0, 18, '河北省石家庄市赵县', 2, '赵县', ',35,36,', 36);\nINSERT INTO `area` VALUES (55, '2015-10-19 00:04:47', '2015-10-19 00:04:47', 0, 19, '河北省石家庄市辛集市', 2, '辛集市', ',35,36,', 36);\nINSERT INTO `area` VALUES (56, '2015-10-19 00:04:48', '2015-10-19 00:04:48', 0, 20, '河北省石家庄市藁城市', 2, '藁城市', ',35,36,', 36);\nINSERT INTO `area` VALUES (57, '2015-10-19 00:04:49', '2015-10-19 00:04:49', 0, 21, '河北省石家庄市晋州市', 2, '晋州市', ',35,36,', 36);\nINSERT INTO `area` VALUES (58, '2015-10-19 00:04:50', '2015-10-19 00:04:50', 0, 22, '河北省石家庄市新乐市', 2, '新乐市', ',35,36,', 36);\nINSERT INTO `area` VALUES (59, '2015-10-19 00:04:51', '2015-10-19 00:04:51', 0, 23, '河北省石家庄市鹿泉市', 2, '鹿泉市', ',35,36,', 36);\nINSERT INTO `area` VALUES (60, '2015-10-19 00:04:52', '2015-10-19 00:04:52', 0, 2, '河北省唐山市', 1, '唐山市', ',35,', 35);\nINSERT INTO `area` VALUES (61, '2015-10-19 00:04:53', '2015-10-19 00:04:53', 0, 1, '河北省唐山市路南区', 2, '路南区', ',35,60,', 60);\nINSERT INTO `area` VALUES (62, '2015-10-19 00:04:54', '2015-10-19 00:04:54', 0, 2, '河北省唐山市路北区', 2, '路北区', ',35,60,', 60);\nINSERT INTO `area` VALUES (63, '2015-10-19 00:04:55', '2015-10-19 00:04:55', 0, 3, '河北省唐山市古冶区', 2, '古冶区', ',35,60,', 60);\nINSERT INTO `area` VALUES (64, '2015-10-19 00:04:56', '2015-10-19 00:04:56', 0, 4, '河北省唐山市开平区', 2, '开平区', ',35,60,', 60);\nINSERT INTO `area` VALUES (65, '2015-10-19 00:04:57', '2015-10-19 00:04:57', 0, 5, '河北省唐山市丰南区', 2, '丰南区', ',35,60,', 60);\nINSERT INTO `area` VALUES (66, '2015-10-19 00:04:58', '2015-10-19 00:04:58', 0, 6, '河北省唐山市丰润区', 2, '丰润区', ',35,60,', 60);\nINSERT INTO `area` VALUES (67, '2015-10-19 00:04:59', '2015-10-19 00:04:59', 0, 7, '河北省唐山市曹妃甸区', 2, '曹妃甸区', ',35,60,', 60);\nINSERT INTO `area` VALUES (68, '2015-10-19 00:05:00', '2015-10-19 00:05:00', 0, 8, '河北省唐山市滦县', 2, '滦县', ',35,60,', 60);\nINSERT INTO `area` VALUES (69, '2015-10-19 00:05:01', '2015-10-19 00:05:01', 0, 9, '河北省唐山市滦南县', 2, '滦南县', ',35,60,', 60);\nINSERT INTO `area` VALUES (70, '2015-10-19 00:05:02', '2015-10-19 00:05:02', 0, 10, '河北省唐山市乐亭县', 2, '乐亭县', ',35,60,', 60);\nINSERT INTO `area` VALUES (71, '2015-10-19 00:05:03', '2015-10-19 00:05:03', 0, 11, '河北省唐山市迁西县', 2, '迁西县', ',35,60,', 60);\nINSERT INTO `area` VALUES (72, '2015-10-19 00:05:04', '2015-10-19 00:05:04', 0, 12, '河北省唐山市玉田县', 2, '玉田县', ',35,60,', 60);\nINSERT INTO `area` VALUES (73, '2015-10-19 00:05:05', '2015-10-19 00:05:05', 0, 13, '河北省唐山市遵化市', 2, '遵化市', ',35,60,', 60);\nINSERT INTO `area` VALUES (74, '2015-10-19 00:05:06', '2015-10-19 00:05:06', 0, 14, '河北省唐山市迁安市', 2, '迁安市', ',35,60,', 60);\nINSERT INTO `area` VALUES (75, '2015-10-19 00:05:07', '2015-10-19 00:05:07', 0, 3, '河北省秦皇岛市', 1, '秦皇岛市', ',35,', 35);\nINSERT INTO `area` VALUES (76, '2015-10-19 00:05:08', '2015-10-19 00:05:08', 0, 1, '河北省秦皇岛市海港区', 2, '海港区', ',35,75,', 75);\nINSERT INTO `area` VALUES (77, '2015-10-19 00:05:09', '2015-10-19 00:05:09', 0, 2, '河北省秦皇岛市山海关区', 2, '山海关区', ',35,75,', 75);\nINSERT INTO `area` VALUES (78, '2015-10-19 00:05:10', '2015-10-19 00:05:10', 0, 3, '河北省秦皇岛市北戴河区', 2, '北戴河区', ',35,75,', 75);\nINSERT INTO `area` VALUES (79, '2015-10-19 00:05:11', '2015-10-19 00:05:11', 0, 4, '河北省秦皇岛市青龙满族自治县', 2, '青龙满族自治县', ',35,75,', 75);\nINSERT INTO `area` VALUES (80, '2015-10-19 00:05:12', '2015-10-19 00:05:12', 0, 5, '河北省秦皇岛市昌黎县', 2, '昌黎县', ',35,75,', 75);\nINSERT INTO `area` VALUES (81, '2015-10-19 00:05:13', '2015-10-19 00:05:13', 0, 6, '河北省秦皇岛市抚宁县', 2, '抚宁县', ',35,75,', 75);\nINSERT INTO `area` VALUES (82, '2015-10-19 00:05:14', '2015-10-19 00:05:14', 0, 7, '河北省秦皇岛市卢龙县', 2, '卢龙县', ',35,75,', 75);\nINSERT INTO `area` VALUES (83, '2015-10-19 00:05:15', '2015-10-19 00:05:15', 0, 4, '河北省邯郸市', 1, '邯郸市', ',35,', 35);\nINSERT INTO `area` VALUES (84, '2015-10-19 00:05:16', '2015-10-19 00:05:16', 0, 1, '河北省邯郸市邯山区', 2, '邯山区', ',35,83,', 83);\nINSERT INTO `area` VALUES (85, '2015-10-19 00:05:17', '2015-10-19 00:05:17', 0, 2, '河北省邯郸市丛台区', 2, '丛台区', ',35,83,', 83);\nINSERT INTO `area` VALUES (86, '2015-10-19 00:05:18', '2015-10-19 00:05:18', 0, 3, '河北省邯郸市复兴区', 2, '复兴区', ',35,83,', 83);\nINSERT INTO `area` VALUES (87, '2015-10-19 00:05:19', '2015-10-19 00:05:19', 0, 4, '河北省邯郸市峰峰矿区', 2, '峰峰矿区', ',35,83,', 83);\nINSERT INTO `area` VALUES (88, '2015-10-19 00:05:20', '2015-10-19 00:05:20', 0, 5, '河北省邯郸市邯郸县', 2, '邯郸县', ',35,83,', 83);\nINSERT INTO `area` VALUES (89, '2015-10-19 00:05:21', '2015-10-19 00:05:21', 0, 6, '河北省邯郸市临漳县', 2, '临漳县', ',35,83,', 83);\nINSERT INTO `area` VALUES (90, '2015-10-19 00:05:22', '2015-10-19 00:05:22', 0, 7, '河北省邯郸市成安县', 2, '成安县', ',35,83,', 83);\nINSERT INTO `area` VALUES (91, '2015-10-19 00:05:23', '2015-10-19 00:05:23', 0, 8, '河北省邯郸市大名县', 2, '大名县', ',35,83,', 83);\nINSERT INTO `area` VALUES (92, '2015-10-19 00:05:24', '2015-10-19 00:05:24', 0, 9, '河北省邯郸市涉县', 2, '涉县', ',35,83,', 83);\nINSERT INTO `area` VALUES (93, '2015-10-19 00:05:25', '2015-10-19 00:05:25', 0, 10, '河北省邯郸市磁县', 2, '磁县', ',35,83,', 83);\nINSERT INTO `area` VALUES (94, '2015-10-19 00:05:26', '2015-10-19 00:05:26', 0, 11, '河北省邯郸市肥乡县', 2, '肥乡县', ',35,83,', 83);\nINSERT INTO `area` VALUES (95, '2015-10-19 00:05:27', '2015-10-19 00:05:27', 0, 12, '河北省邯郸市永年县', 2, '永年县', ',35,83,', 83);\nINSERT INTO `area` VALUES (96, '2015-10-19 00:05:28', '2015-10-19 00:05:28', 0, 13, '河北省邯郸市邱县', 2, '邱县', ',35,83,', 83);\nINSERT INTO `area` VALUES (97, '2015-10-19 00:05:29', '2015-10-19 00:05:29', 0, 14, '河北省邯郸市鸡泽县', 2, '鸡泽县', ',35,83,', 83);\nINSERT INTO `area` VALUES (98, '2015-10-19 00:05:30', '2015-10-19 00:05:30', 0, 15, '河北省邯郸市广平县', 2, '广平县', ',35,83,', 83);\nINSERT INTO `area` VALUES (99, '2015-10-19 00:05:31', '2015-10-19 00:05:31', 0, 16, '河北省邯郸市馆陶县', 2, '馆陶县', ',35,83,', 83);\nINSERT INTO `area` VALUES (100, '2015-10-19 00:05:32', '2015-10-19 00:05:32', 0, 17, '河北省邯郸市魏县', 2, '魏县', ',35,83,', 83);\nINSERT INTO `area` VALUES (101, '2015-10-19 00:05:33', '2015-10-19 00:05:33', 0, 18, '河北省邯郸市曲周县', 2, '曲周县', ',35,83,', 83);\nINSERT INTO `area` VALUES (102, '2015-10-19 00:05:34', '2015-10-19 00:05:34', 0, 19, '河北省邯郸市武安市', 2, '武安市', ',35,83,', 83);\nINSERT INTO `area` VALUES (103, '2015-10-19 00:05:35', '2015-10-19 00:05:35', 0, 5, '河北省邢台市', 1, '邢台市', ',35,', 35);\nINSERT INTO `area` VALUES (104, '2015-10-19 00:05:36', '2015-10-19 00:05:36', 0, 1, '河北省邢台市桥东区', 2, '桥东区', ',35,103,', 103);\nINSERT INTO `area` VALUES (105, '2015-10-19 00:05:37', '2015-10-19 00:05:37', 0, 2, '河北省邢台市桥西区', 2, '桥西区', ',35,103,', 103);\nINSERT INTO `area` VALUES (106, '2015-10-19 00:05:38', '2015-10-19 00:05:38', 0, 3, '河北省邢台市邢台县', 2, '邢台县', ',35,103,', 103);\nINSERT INTO `area` VALUES (107, '2015-10-19 00:05:39', '2015-10-19 00:05:39', 0, 4, '河北省邢台市临城县', 2, '临城县', ',35,103,', 103);\nINSERT INTO `area` VALUES (108, '2015-10-19 00:05:40', '2015-10-19 00:05:40', 0, 5, '河北省邢台市内丘县', 2, '内丘县', ',35,103,', 103);\nINSERT INTO `area` VALUES (109, '2015-10-19 00:05:41', '2015-10-19 00:05:41', 0, 6, '河北省邢台市柏乡县', 2, '柏乡县', ',35,103,', 103);\nINSERT INTO `area` VALUES (110, '2015-10-19 00:05:42', '2015-10-19 00:05:42', 0, 7, '河北省邢台市隆尧县', 2, '隆尧县', ',35,103,', 103);\nINSERT INTO `area` VALUES (111, '2015-10-19 00:05:43', '2015-10-19 00:05:43', 0, 8, '河北省邢台市任县', 2, '任县', ',35,103,', 103);\nINSERT INTO `area` VALUES (112, '2015-10-19 00:05:44', '2015-10-19 00:05:44', 0, 9, '河北省邢台市南和县', 2, '南和县', ',35,103,', 103);\nINSERT INTO `area` VALUES (113, '2015-10-19 00:05:45', '2015-10-19 00:05:45', 0, 10, '河北省邢台市宁晋县', 2, '宁晋县', ',35,103,', 103);\nINSERT INTO `area` VALUES (114, '2015-10-19 00:05:46', '2015-10-19 00:05:46', 0, 11, '河北省邢台市巨鹿县', 2, '巨鹿县', ',35,103,', 103);\nINSERT INTO `area` VALUES (115, '2015-10-19 00:05:47', '2015-10-19 00:05:47', 0, 12, '河北省邢台市新河县', 2, '新河县', ',35,103,', 103);\nINSERT INTO `area` VALUES (116, '2015-10-19 00:05:48', '2015-10-19 00:05:48', 0, 13, '河北省邢台市广宗县', 2, '广宗县', ',35,103,', 103);\nINSERT INTO `area` VALUES (117, '2015-10-19 00:05:49', '2015-10-19 00:05:49', 0, 14, '河北省邢台市平乡县', 2, '平乡县', ',35,103,', 103);\nINSERT INTO `area` VALUES (118, '2015-10-19 00:05:50', '2015-10-19 00:05:50', 0, 15, '河北省邢台市威县', 2, '威县', ',35,103,', 103);\nINSERT INTO `area` VALUES (119, '2015-10-19 00:05:51', '2015-10-19 00:05:51', 0, 16, '河北省邢台市清河县', 2, '清河县', ',35,103,', 103);\nINSERT INTO `area` VALUES (120, '2015-10-19 00:05:52', '2015-10-19 00:05:52', 0, 17, '河北省邢台市临西县', 2, '临西县', ',35,103,', 103);\nINSERT INTO `area` VALUES (121, '2015-10-19 00:05:53', '2015-10-19 00:05:53', 0, 18, '河北省邢台市南宫市', 2, '南宫市', ',35,103,', 103);\nINSERT INTO `area` VALUES (122, '2015-10-19 00:05:54', '2015-10-19 00:05:54', 0, 19, '河北省邢台市沙河市', 2, '沙河市', ',35,103,', 103);\nINSERT INTO `area` VALUES (123, '2015-10-19 00:05:55', '2015-10-19 00:05:55', 0, 6, '河北省保定市', 1, '保定市', ',35,', 35);\nINSERT INTO `area` VALUES (124, '2015-10-19 00:05:56', '2015-10-19 00:05:56', 0, 1, '河北省保定市新市区', 2, '新市区', ',35,123,', 123);\nINSERT INTO `area` VALUES (125, '2015-10-19 00:05:57', '2015-10-19 00:05:57', 0, 2, '河北省保定市北市区', 2, '北市区', ',35,123,', 123);\nINSERT INTO `area` VALUES (126, '2015-10-19 00:05:58', '2015-10-19 00:05:58', 0, 3, '河北省保定市南市区', 2, '南市区', ',35,123,', 123);\nINSERT INTO `area` VALUES (127, '2015-10-19 00:05:59', '2015-10-19 00:05:59', 0, 4, '河北省保定市满城县', 2, '满城县', ',35,123,', 123);\nINSERT INTO `area` VALUES (128, '2015-10-19 00:06:00', '2015-10-19 00:06:00', 0, 5, '河北省保定市清苑县', 2, '清苑县', ',35,123,', 123);\nINSERT INTO `area` VALUES (129, '2015-10-19 00:06:01', '2015-10-19 00:06:01', 0, 6, '河北省保定市涞水县', 2, '涞水县', ',35,123,', 123);\nINSERT INTO `area` VALUES (130, '2015-10-19 00:06:02', '2015-10-19 00:06:02', 0, 7, '河北省保定市阜平县', 2, '阜平县', ',35,123,', 123);\nINSERT INTO `area` VALUES (131, '2015-10-19 00:06:03', '2015-10-19 00:06:03', 0, 8, '河北省保定市徐水县', 2, '徐水县', ',35,123,', 123);\nINSERT INTO `area` VALUES (132, '2015-10-19 00:06:04', '2015-10-19 00:06:04', 0, 9, '河北省保定市定兴县', 2, '定兴县', ',35,123,', 123);\nINSERT INTO `area` VALUES (133, '2015-10-19 00:06:05', '2015-10-19 00:06:05', 0, 10, '河北省保定市唐县', 2, '唐县', ',35,123,', 123);\nINSERT INTO `area` VALUES (134, '2015-10-19 00:06:06', '2015-10-19 00:06:06', 0, 11, '河北省保定市高阳县', 2, '高阳县', ',35,123,', 123);\nINSERT INTO `area` VALUES (135, '2015-10-19 00:06:07', '2015-10-19 00:06:07', 0, 12, '河北省保定市容城县', 2, '容城县', ',35,123,', 123);\nINSERT INTO `area` VALUES (136, '2015-10-19 00:06:08', '2015-10-19 00:06:08', 0, 13, '河北省保定市涞源县', 2, '涞源县', ',35,123,', 123);\nINSERT INTO `area` VALUES (137, '2015-10-19 00:06:09', '2015-10-19 00:06:09', 0, 14, '河北省保定市望都县', 2, '望都县', ',35,123,', 123);\nINSERT INTO `area` VALUES (138, '2015-10-19 00:06:10', '2015-10-19 00:06:10', 0, 15, '河北省保定市安新县', 2, '安新县', ',35,123,', 123);\nINSERT INTO `area` VALUES (139, '2015-10-19 00:06:11', '2015-10-19 00:06:11', 0, 16, '河北省保定市易县', 2, '易县', ',35,123,', 123);\nINSERT INTO `area` VALUES (140, '2015-10-19 00:06:12', '2015-10-19 00:06:12', 0, 17, '河北省保定市曲阳县', 2, '曲阳县', ',35,123,', 123);\nINSERT INTO `area` VALUES (141, '2015-10-19 00:06:13', '2015-10-19 00:06:13', 0, 18, '河北省保定市蠡县', 2, '蠡县', ',35,123,', 123);\nINSERT INTO `area` VALUES (142, '2015-10-19 00:06:14', '2015-10-19 00:06:14', 0, 19, '河北省保定市顺平县', 2, '顺平县', ',35,123,', 123);\nINSERT INTO `area` VALUES (143, '2015-10-19 00:06:15', '2015-10-19 00:06:15', 0, 20, '河北省保定市博野县', 2, '博野县', ',35,123,', 123);\nINSERT INTO `area` VALUES (144, '2015-10-19 00:06:16', '2015-10-19 00:06:16', 0, 21, '河北省保定市雄县', 2, '雄县', ',35,123,', 123);\nINSERT INTO `area` VALUES (145, '2015-10-19 00:06:17', '2015-10-19 00:06:17', 0, 22, '河北省保定市涿州市', 2, '涿州市', ',35,123,', 123);\nINSERT INTO `area` VALUES (146, '2015-10-19 00:06:18', '2015-10-19 00:06:18', 0, 23, '河北省保定市定州市', 2, '定州市', ',35,123,', 123);\nINSERT INTO `area` VALUES (147, '2015-10-19 00:06:19', '2015-10-19 00:06:19', 0, 24, '河北省保定市安国市', 2, '安国市', ',35,123,', 123);\nINSERT INTO `area` VALUES (148, '2015-10-19 00:06:20', '2015-10-19 00:06:20', 0, 25, '河北省保定市高碑店市', 2, '高碑店市', ',35,123,', 123);\nINSERT INTO `area` VALUES (149, '2015-10-19 00:06:21', '2015-10-19 00:06:21', 0, 7, '河北省张家口市', 1, '张家口市', ',35,', 35);\nINSERT INTO `area` VALUES (150, '2015-10-19 00:06:22', '2015-10-19 00:06:22', 0, 1, '河北省张家口市桥东区', 2, '桥东区', ',35,149,', 149);\nINSERT INTO `area` VALUES (151, '2015-10-19 00:06:23', '2015-10-19 00:06:23', 0, 2, '河北省张家口市桥西区', 2, '桥西区', ',35,149,', 149);\nINSERT INTO `area` VALUES (152, '2015-10-19 00:06:24', '2015-10-19 00:06:24', 0, 3, '河北省张家口市宣化区', 2, '宣化区', ',35,149,', 149);\nINSERT INTO `area` VALUES (153, '2015-10-19 00:06:25', '2015-10-19 00:06:25', 0, 4, '河北省张家口市下花园区', 2, '下花园区', ',35,149,', 149);\nINSERT INTO `area` VALUES (154, '2015-10-19 00:06:26', '2015-10-19 00:06:26', 0, 5, '河北省张家口市宣化县', 2, '宣化县', ',35,149,', 149);\nINSERT INTO `area` VALUES (155, '2015-10-19 00:06:27', '2015-10-19 00:06:27', 0, 6, '河北省张家口市张北县', 2, '张北县', ',35,149,', 149);\nINSERT INTO `area` VALUES (156, '2015-10-19 00:06:28', '2015-10-19 00:06:28', 0, 7, '河北省张家口市康保县', 2, '康保县', ',35,149,', 149);\nINSERT INTO `area` VALUES (157, '2015-10-19 00:06:29', '2015-10-19 00:06:29', 0, 8, '河北省张家口市沽源县', 2, '沽源县', ',35,149,', 149);\nINSERT INTO `area` VALUES (158, '2015-10-19 00:06:30', '2015-10-19 00:06:30', 0, 9, '河北省张家口市尚义县', 2, '尚义县', ',35,149,', 149);\nINSERT INTO `area` VALUES (159, '2015-10-19 00:06:31', '2015-10-19 00:06:31', 0, 10, '河北省张家口市蔚县', 2, '蔚县', ',35,149,', 149);\nINSERT INTO `area` VALUES (160, '2015-10-19 00:06:32', '2015-10-19 00:06:32', 0, 11, '河北省张家口市阳原县', 2, '阳原县', ',35,149,', 149);\nINSERT INTO `area` VALUES (161, '2015-10-19 00:06:33', '2015-10-19 00:06:33', 0, 12, '河北省张家口市怀安县', 2, '怀安县', ',35,149,', 149);\nINSERT INTO `area` VALUES (162, '2015-10-19 00:06:34', '2015-10-19 00:06:34', 0, 13, '河北省张家口市万全县', 2, '万全县', ',35,149,', 149);\nINSERT INTO `area` VALUES (163, '2015-10-19 00:06:35', '2015-10-19 00:06:35', 0, 14, '河北省张家口市怀来县', 2, '怀来县', ',35,149,', 149);\nINSERT INTO `area` VALUES (164, '2015-10-19 00:06:36', '2015-10-19 00:06:36', 0, 15, '河北省张家口市涿鹿县', 2, '涿鹿县', ',35,149,', 149);\nINSERT INTO `area` VALUES (165, '2015-10-19 00:06:37', '2015-10-19 00:06:37', 0, 16, '河北省张家口市赤城县', 2, '赤城县', ',35,149,', 149);\nINSERT INTO `area` VALUES (166, '2015-10-19 00:06:38', '2015-10-19 00:06:38', 0, 17, '河北省张家口市崇礼县', 2, '崇礼县', ',35,149,', 149);\nINSERT INTO `area` VALUES (167, '2015-10-19 00:06:39', '2015-10-19 00:06:39', 0, 8, '河北省承德市', 1, '承德市', ',35,', 35);\nINSERT INTO `area` VALUES (168, '2015-10-19 00:06:40', '2015-10-19 00:06:40', 0, 1, '河北省承德市双桥区', 2, '双桥区', ',35,167,', 167);\nINSERT INTO `area` VALUES (169, '2015-10-19 00:06:41', '2015-10-19 00:06:41', 0, 2, '河北省承德市双滦区', 2, '双滦区', ',35,167,', 167);\nINSERT INTO `area` VALUES (170, '2015-10-19 00:06:42', '2015-10-19 00:06:42', 0, 3, '河北省承德市鹰手营子矿区', 2, '鹰手营子矿区', ',35,167,', 167);\nINSERT INTO `area` VALUES (171, '2015-10-19 00:06:43', '2015-10-19 00:06:43', 0, 4, '河北省承德市承德县', 2, '承德县', ',35,167,', 167);\nINSERT INTO `area` VALUES (172, '2015-10-19 00:06:44', '2015-10-19 00:06:44', 0, 5, '河北省承德市兴隆县', 2, '兴隆县', ',35,167,', 167);\nINSERT INTO `area` VALUES (173, '2015-10-19 00:06:45', '2015-10-19 00:06:45', 0, 6, '河北省承德市平泉县', 2, '平泉县', ',35,167,', 167);\nINSERT INTO `area` VALUES (174, '2015-10-19 00:06:46', '2015-10-19 00:06:46', 0, 7, '河北省承德市滦平县', 2, '滦平县', ',35,167,', 167);\nINSERT INTO `area` VALUES (175, '2015-10-19 00:06:47', '2015-10-19 00:06:47', 0, 8, '河北省承德市隆化县', 2, '隆化县', ',35,167,', 167);\nINSERT INTO `area` VALUES (176, '2015-10-19 00:06:48', '2015-10-19 00:06:48', 0, 9, '河北省承德市丰宁满族自治县', 2, '丰宁满族自治县', ',35,167,', 167);\nINSERT INTO `area` VALUES (177, '2015-10-19 00:06:49', '2015-10-19 00:06:49', 0, 10, '河北省承德市宽城满族自治县', 2, '宽城满族自治县', ',35,167,', 167);\nINSERT INTO `area` VALUES (178, '2015-10-19 00:06:50', '2015-10-19 00:06:50', 0, 11, '河北省承德市围场满族蒙古族自治县', 2, '围场满族蒙古族自治县', ',35,167,', 167);\nINSERT INTO `area` VALUES (179, '2015-10-19 00:06:51', '2015-10-19 00:06:51', 0, 9, '河北省沧州市', 1, '沧州市', ',35,', 35);\nINSERT INTO `area` VALUES (180, '2015-10-19 00:06:52', '2015-10-19 00:06:52', 0, 1, '河北省沧州市新华区', 2, '新华区', ',35,179,', 179);\nINSERT INTO `area` VALUES (181, '2015-10-19 00:06:53', '2015-10-19 00:06:53', 0, 2, '河北省沧州市运河区', 2, '运河区', ',35,179,', 179);\nINSERT INTO `area` VALUES (182, '2015-10-19 00:06:54', '2015-10-19 00:06:54', 0, 3, '河北省沧州市沧县', 2, '沧县', ',35,179,', 179);\nINSERT INTO `area` VALUES (183, '2015-10-19 00:06:55', '2015-10-19 00:06:55', 0, 4, '河北省沧州市青县', 2, '青县', ',35,179,', 179);\nINSERT INTO `area` VALUES (184, '2015-10-19 00:06:56', '2015-10-19 00:06:56', 0, 5, '河北省沧州市东光县', 2, '东光县', ',35,179,', 179);\nINSERT INTO `area` VALUES (185, '2015-10-19 00:06:57', '2015-10-19 00:06:57', 0, 6, '河北省沧州市海兴县', 2, '海兴县', ',35,179,', 179);\nINSERT INTO `area` VALUES (186, '2015-10-19 00:06:58', '2015-10-19 00:06:58', 0, 7, '河北省沧州市盐山县', 2, '盐山县', ',35,179,', 179);\nINSERT INTO `area` VALUES (187, '2015-10-19 00:06:59', '2015-10-19 00:06:59', 0, 8, '河北省沧州市肃宁县', 2, '肃宁县', ',35,179,', 179);\nINSERT INTO `area` VALUES (188, '2015-10-19 00:07:00', '2015-10-19 00:07:00', 0, 9, '河北省沧州市南皮县', 2, '南皮县', ',35,179,', 179);\nINSERT INTO `area` VALUES (189, '2015-10-19 00:07:01', '2015-10-19 00:07:01', 0, 10, '河北省沧州市吴桥县', 2, '吴桥县', ',35,179,', 179);\nINSERT INTO `area` VALUES (190, '2015-10-19 00:07:02', '2015-10-19 00:07:02', 0, 11, '河北省沧州市献县', 2, '献县', ',35,179,', 179);\nINSERT INTO `area` VALUES (191, '2015-10-19 00:07:03', '2015-10-19 00:07:03', 0, 12, '河北省沧州市孟村回族自治县', 2, '孟村回族自治县', ',35,179,', 179);\nINSERT INTO `area` VALUES (192, '2015-10-19 00:07:04', '2015-10-19 00:07:04', 0, 13, '河北省沧州市泊头市', 2, '泊头市', ',35,179,', 179);\nINSERT INTO `area` VALUES (193, '2015-10-19 00:07:05', '2015-10-19 00:07:05', 0, 14, '河北省沧州市任丘市', 2, '任丘市', ',35,179,', 179);\nINSERT INTO `area` VALUES (194, '2015-10-19 00:07:06', '2015-10-19 00:07:06', 0, 15, '河北省沧州市黄骅市', 2, '黄骅市', ',35,179,', 179);\nINSERT INTO `area` VALUES (195, '2015-10-19 00:07:07', '2015-10-19 00:07:07', 0, 16, '河北省沧州市河间市', 2, '河间市', ',35,179,', 179);\nINSERT INTO `area` VALUES (196, '2015-10-19 00:07:08', '2015-10-19 00:07:08', 0, 10, '河北省廊坊市', 1, '廊坊市', ',35,', 35);\nINSERT INTO `area` VALUES (197, '2015-10-19 00:07:09', '2015-10-19 00:07:09', 0, 1, '河北省廊坊市安次区', 2, '安次区', ',35,196,', 196);\nINSERT INTO `area` VALUES (198, '2015-10-19 00:07:10', '2015-10-19 00:07:10', 0, 2, '河北省廊坊市广阳区', 2, '广阳区', ',35,196,', 196);\nINSERT INTO `area` VALUES (199, '2015-10-19 00:07:11', '2015-10-19 00:07:11', 0, 3, '河北省廊坊市固安县', 2, '固安县', ',35,196,', 196);\nINSERT INTO `area` VALUES (200, '2015-10-19 00:07:12', '2015-10-19 00:07:12', 0, 4, '河北省廊坊市永清县', 2, '永清县', ',35,196,', 196);\nINSERT INTO `area` VALUES (201, '2015-10-19 00:07:13', '2015-10-19 00:07:13', 0, 5, '河北省廊坊市香河县', 2, '香河县', ',35,196,', 196);\nINSERT INTO `area` VALUES (202, '2015-10-19 00:07:14', '2015-10-19 00:07:14', 0, 6, '河北省廊坊市大城县', 2, '大城县', ',35,196,', 196);\nINSERT INTO `area` VALUES (203, '2015-10-19 00:07:15', '2015-10-19 00:07:15', 0, 7, '河北省廊坊市文安县', 2, '文安县', ',35,196,', 196);\nINSERT INTO `area` VALUES (204, '2015-10-19 00:07:16', '2015-10-19 00:07:16', 0, 8, '河北省廊坊市大厂回族自治县', 2, '大厂回族自治县', ',35,196,', 196);\nINSERT INTO `area` VALUES (205, '2015-10-19 00:07:17', '2015-10-19 00:07:17', 0, 9, '河北省廊坊市霸州市', 2, '霸州市', ',35,196,', 196);\nINSERT INTO `area` VALUES (206, '2015-10-19 00:07:18', '2015-10-19 00:07:18', 0, 10, '河北省廊坊市三河市', 2, '三河市', ',35,196,', 196);\nINSERT INTO `area` VALUES (207, '2015-10-19 00:07:19', '2015-10-19 00:07:19', 0, 11, '河北省衡水市', 1, '衡水市', ',35,', 35);\nINSERT INTO `area` VALUES (208, '2015-10-19 00:07:20', '2015-10-19 00:07:20', 0, 1, '河北省衡水市桃城区', 2, '桃城区', ',35,207,', 207);\nINSERT INTO `area` VALUES (209, '2015-10-19 00:07:21', '2015-10-19 00:07:21', 0, 2, '河北省衡水市枣强县', 2, '枣强县', ',35,207,', 207);\nINSERT INTO `area` VALUES (210, '2015-10-19 00:07:22', '2015-10-19 00:07:22', 0, 3, '河北省衡水市武邑县', 2, '武邑县', ',35,207,', 207);\nINSERT INTO `area` VALUES (211, '2015-10-19 00:07:23', '2015-10-19 00:07:23', 0, 4, '河北省衡水市武强县', 2, '武强县', ',35,207,', 207);\nINSERT INTO `area` VALUES (212, '2015-10-19 00:07:24', '2015-10-19 00:07:24', 0, 5, '河北省衡水市饶阳县', 2, '饶阳县', ',35,207,', 207);\nINSERT INTO `area` VALUES (213, '2015-10-19 00:07:25', '2015-10-19 00:07:25', 0, 6, '河北省衡水市安平县', 2, '安平县', ',35,207,', 207);\nINSERT INTO `area` VALUES (214, '2015-10-19 00:07:26', '2015-10-19 00:07:26', 0, 7, '河北省衡水市故城县', 2, '故城县', ',35,207,', 207);\nINSERT INTO `area` VALUES (215, '2015-10-19 00:07:27', '2015-10-19 00:07:27', 0, 8, '河北省衡水市景县', 2, '景县', ',35,207,', 207);\nINSERT INTO `area` VALUES (216, '2015-10-19 00:07:28', '2015-10-19 00:07:28', 0, 9, '河北省衡水市阜城县', 2, '阜城县', ',35,207,', 207);\nINSERT INTO `area` VALUES (217, '2015-10-19 00:07:29', '2015-10-19 00:07:29', 0, 10, '河北省衡水市冀州市', 2, '冀州市', ',35,207,', 207);\nINSERT INTO `area` VALUES (218, '2015-10-19 00:07:30', '2015-10-19 00:07:30', 0, 11, '河北省衡水市深州市', 2, '深州市', ',35,207,', 207);\nINSERT INTO `area` VALUES (219, '2015-10-19 00:07:31', '2015-10-19 00:07:31', 0, 4, '山西省', 0, '山西省', ',', NULL);\nINSERT INTO `area` VALUES (220, '2015-10-19 00:07:32', '2015-10-19 00:07:32', 0, 1, '山西省太原市', 1, '太原市', ',219,', 219);\nINSERT INTO `area` VALUES (221, '2015-10-19 00:07:33', '2015-10-19 00:07:33', 0, 1, '山西省太原市小店区', 2, '小店区', ',219,220,', 220);\nINSERT INTO `area` VALUES (222, '2015-10-19 00:07:34', '2015-10-19 00:07:34', 0, 2, '山西省太原市迎泽区', 2, '迎泽区', ',219,220,', 220);\nINSERT INTO `area` VALUES (223, '2015-10-19 00:07:35', '2015-10-19 00:07:35', 0, 3, '山西省太原市杏花岭区', 2, '杏花岭区', ',219,220,', 220);\nINSERT INTO `area` VALUES (224, '2015-10-19 00:07:36', '2015-10-19 00:07:36', 0, 4, '山西省太原市尖草坪区', 2, '尖草坪区', ',219,220,', 220);\nINSERT INTO `area` VALUES (225, '2015-10-19 00:07:37', '2015-10-19 00:07:37', 0, 5, '山西省太原市万柏林区', 2, '万柏林区', ',219,220,', 220);\nINSERT INTO `area` VALUES (226, '2015-10-19 00:07:38', '2015-10-19 00:07:38', 0, 6, '山西省太原市晋源区', 2, '晋源区', ',219,220,', 220);\nINSERT INTO `area` VALUES (227, '2015-10-19 00:07:39', '2015-10-19 00:07:39', 0, 7, '山西省太原市清徐县', 2, '清徐县', ',219,220,', 220);\nINSERT INTO `area` VALUES (228, '2015-10-19 00:07:40', '2015-10-19 00:07:40', 0, 8, '山西省太原市阳曲县', 2, '阳曲县', ',219,220,', 220);\nINSERT INTO `area` VALUES (229, '2015-10-19 00:07:41', '2015-10-19 00:07:41', 0, 9, '山西省太原市娄烦县', 2, '娄烦县', ',219,220,', 220);\nINSERT INTO `area` VALUES (230, '2015-10-19 00:07:42', '2015-10-19 00:07:42', 0, 10, '山西省太原市古交市', 2, '古交市', ',219,220,', 220);\nINSERT INTO `area` VALUES (231, '2015-10-19 00:07:43', '2015-10-19 00:07:43', 0, 2, '山西省大同市', 1, '大同市', ',219,', 219);\nINSERT INTO `area` VALUES (232, '2015-10-19 00:07:44', '2015-10-19 00:07:44', 0, 1, '山西省大同市城区', 2, '城区', ',219,231,', 231);\nINSERT INTO `area` VALUES (233, '2015-10-19 00:07:45', '2015-10-19 00:07:45', 0, 2, '山西省大同市矿区', 2, '矿区', ',219,231,', 231);\nINSERT INTO `area` VALUES (234, '2015-10-19 00:07:46', '2015-10-19 00:07:46', 0, 3, '山西省大同市南郊区', 2, '南郊区', ',219,231,', 231);\nINSERT INTO `area` VALUES (235, '2015-10-19 00:07:47', '2015-10-19 00:07:47', 0, 4, '山西省大同市新荣区', 2, '新荣区', ',219,231,', 231);\nINSERT INTO `area` VALUES (236, '2015-10-19 00:07:48', '2015-10-19 00:07:48', 0, 5, '山西省大同市阳高县', 2, '阳高县', ',219,231,', 231);\nINSERT INTO `area` VALUES (237, '2015-10-19 00:07:49', '2015-10-19 00:07:49', 0, 6, '山西省大同市天镇县', 2, '天镇县', ',219,231,', 231);\nINSERT INTO `area` VALUES (238, '2015-10-19 00:07:50', '2015-10-19 00:07:50', 0, 7, '山西省大同市广灵县', 2, '广灵县', ',219,231,', 231);\nINSERT INTO `area` VALUES (239, '2015-10-19 00:07:51', '2015-10-19 00:07:51', 0, 8, '山西省大同市灵丘县', 2, '灵丘县', ',219,231,', 231);\nINSERT INTO `area` VALUES (240, '2015-10-19 00:07:52', '2015-10-19 00:07:52', 0, 9, '山西省大同市浑源县', 2, '浑源县', ',219,231,', 231);\nINSERT INTO `area` VALUES (241, '2015-10-19 00:07:53', '2015-10-19 00:07:53', 0, 10, '山西省大同市左云县', 2, '左云县', ',219,231,', 231);\nINSERT INTO `area` VALUES (242, '2015-10-19 00:07:54', '2015-10-19 00:07:54', 0, 11, '山西省大同市大同县', 2, '大同县', ',219,231,', 231);\nINSERT INTO `area` VALUES (243, '2015-10-19 00:07:55', '2015-10-19 00:07:55', 0, 3, '山西省阳泉市', 1, '阳泉市', ',219,', 219);\nINSERT INTO `area` VALUES (244, '2015-10-19 00:07:56', '2015-10-19 00:07:56', 0, 1, '山西省阳泉市城区', 2, '城区', ',219,243,', 243);\nINSERT INTO `area` VALUES (245, '2015-10-19 00:07:57', '2015-10-19 00:07:57', 0, 2, '山西省阳泉市矿区', 2, '矿区', ',219,243,', 243);\nINSERT INTO `area` VALUES (246, '2015-10-19 00:07:58', '2015-10-19 00:07:58', 0, 3, '山西省阳泉市郊区', 2, '郊区', ',219,243,', 243);\nINSERT INTO `area` VALUES (247, '2015-10-19 00:07:59', '2015-10-19 00:07:59', 0, 4, '山西省阳泉市平定县', 2, '平定县', ',219,243,', 243);\nINSERT INTO `area` VALUES (248, '2015-10-19 00:08:00', '2015-10-19 00:08:00', 0, 5, '山西省阳泉市盂县', 2, '盂县', ',219,243,', 243);\nINSERT INTO `area` VALUES (249, '2015-10-19 00:08:01', '2015-10-19 00:08:01', 0, 4, '山西省长治市', 1, '长治市', ',219,', 219);\nINSERT INTO `area` VALUES (250, '2015-10-19 00:08:02', '2015-10-19 00:08:02', 0, 1, '山西省长治市城区', 2, '城区', ',219,249,', 249);\nINSERT INTO `area` VALUES (251, '2015-10-19 00:08:03', '2015-10-19 00:08:03', 0, 2, '山西省长治市郊区', 2, '郊区', ',219,249,', 249);\nINSERT INTO `area` VALUES (252, '2015-10-19 00:08:04', '2015-10-19 00:08:04', 0, 3, '山西省长治市长治县', 2, '长治县', ',219,249,', 249);\nINSERT INTO `area` VALUES (253, '2015-10-19 00:08:05', '2015-10-19 00:08:05', 0, 4, '山西省长治市襄垣县', 2, '襄垣县', ',219,249,', 249);\nINSERT INTO `area` VALUES (254, '2015-10-19 00:08:06', '2015-10-19 00:08:06', 0, 5, '山西省长治市屯留县', 2, '屯留县', ',219,249,', 249);\nINSERT INTO `area` VALUES (255, '2015-10-19 00:08:07', '2015-10-19 00:08:07', 0, 6, '山西省长治市平顺县', 2, '平顺县', ',219,249,', 249);\nINSERT INTO `area` VALUES (256, '2015-10-19 00:08:08', '2015-10-19 00:08:08', 0, 7, '山西省长治市黎城县', 2, '黎城县', ',219,249,', 249);\nINSERT INTO `area` VALUES (257, '2015-10-19 00:08:09', '2015-10-19 00:08:09', 0, 8, '山西省长治市壶关县', 2, '壶关县', ',219,249,', 249);\nINSERT INTO `area` VALUES (258, '2015-10-19 00:08:10', '2015-10-19 00:08:10', 0, 9, '山西省长治市长子县', 2, '长子县', ',219,249,', 249);\nINSERT INTO `area` VALUES (259, '2015-10-19 00:08:11', '2015-10-19 00:08:11', 0, 10, '山西省长治市武乡县', 2, '武乡县', ',219,249,', 249);\nINSERT INTO `area` VALUES (260, '2015-10-19 00:08:12', '2015-10-19 00:08:12', 0, 11, '山西省长治市沁县', 2, '沁县', ',219,249,', 249);\nINSERT INTO `area` VALUES (261, '2015-10-19 00:08:13', '2015-10-19 00:08:13', 0, 12, '山西省长治市沁源县', 2, '沁源县', ',219,249,', 249);\nINSERT INTO `area` VALUES (262, '2015-10-19 00:08:14', '2015-10-19 00:08:14', 0, 13, '山西省长治市潞城市', 2, '潞城市', ',219,249,', 249);\nINSERT INTO `area` VALUES (263, '2015-10-19 00:08:15', '2015-10-19 00:08:15', 0, 5, '山西省晋城市', 1, '晋城市', ',219,', 219);\nINSERT INTO `area` VALUES (264, '2015-10-19 00:08:16', '2015-10-19 00:08:16', 0, 1, '山西省晋城市城区', 2, '城区', ',219,263,', 263);\nINSERT INTO `area` VALUES (265, '2015-10-19 00:08:17', '2015-10-19 00:08:17', 0, 2, '山西省晋城市沁水县', 2, '沁水县', ',219,263,', 263);\nINSERT INTO `area` VALUES (266, '2015-10-19 00:08:18', '2015-10-19 00:08:18', 0, 3, '山西省晋城市阳城县', 2, '阳城县', ',219,263,', 263);\nINSERT INTO `area` VALUES (267, '2015-10-19 00:08:19', '2015-10-19 00:08:19', 0, 4, '山西省晋城市陵川县', 2, '陵川县', ',219,263,', 263);\nINSERT INTO `area` VALUES (268, '2015-10-19 00:08:20', '2015-10-19 00:08:20', 0, 5, '山西省晋城市泽州县', 2, '泽州县', ',219,263,', 263);\nINSERT INTO `area` VALUES (269, '2015-10-19 00:08:21', '2015-10-19 00:08:21', 0, 6, '山西省晋城市高平市', 2, '高平市', ',219,263,', 263);\nINSERT INTO `area` VALUES (270, '2015-10-19 00:08:22', '2015-10-19 00:08:22', 0, 6, '山西省朔州市', 1, '朔州市', ',219,', 219);\nINSERT INTO `area` VALUES (271, '2015-10-19 00:08:23', '2015-10-19 00:08:23', 0, 1, '山西省朔州市朔城区', 2, '朔城区', ',219,270,', 270);\nINSERT INTO `area` VALUES (272, '2015-10-19 00:08:24', '2015-10-19 00:08:24', 0, 2, '山西省朔州市平鲁区', 2, '平鲁区', ',219,270,', 270);\nINSERT INTO `area` VALUES (273, '2015-10-19 00:08:25', '2015-10-19 00:08:25', 0, 3, '山西省朔州市山阴县', 2, '山阴县', ',219,270,', 270);\nINSERT INTO `area` VALUES (274, '2015-10-19 00:08:26', '2015-10-19 00:08:26', 0, 4, '山西省朔州市应县', 2, '应县', ',219,270,', 270);\nINSERT INTO `area` VALUES (275, '2015-10-19 00:08:27', '2015-10-19 00:08:27', 0, 5, '山西省朔州市右玉县', 2, '右玉县', ',219,270,', 270);\nINSERT INTO `area` VALUES (276, '2015-10-19 00:08:28', '2015-10-19 00:08:28', 0, 6, '山西省朔州市怀仁县', 2, '怀仁县', ',219,270,', 270);\nINSERT INTO `area` VALUES (277, '2015-10-19 00:08:29', '2015-10-19 00:08:29', 0, 7, '山西省晋中市', 1, '晋中市', ',219,', 219);\nINSERT INTO `area` VALUES (278, '2015-10-19 00:08:30', '2015-10-19 00:08:30', 0, 1, '山西省晋中市榆次区', 2, '榆次区', ',219,277,', 277);\nINSERT INTO `area` VALUES (279, '2015-10-19 00:08:31', '2015-10-19 00:08:31', 0, 2, '山西省晋中市榆社县', 2, '榆社县', ',219,277,', 277);\nINSERT INTO `area` VALUES (280, '2015-10-19 00:08:32', '2015-10-19 00:08:32', 0, 3, '山西省晋中市左权县', 2, '左权县', ',219,277,', 277);\nINSERT INTO `area` VALUES (281, '2015-10-19 00:08:33', '2015-10-19 00:08:33', 0, 4, '山西省晋中市和顺县', 2, '和顺县', ',219,277,', 277);\nINSERT INTO `area` VALUES (282, '2015-10-19 00:08:34', '2015-10-19 00:08:34', 0, 5, '山西省晋中市昔阳县', 2, '昔阳县', ',219,277,', 277);\nINSERT INTO `area` VALUES (283, '2015-10-19 00:08:35', '2015-10-19 00:08:35', 0, 6, '山西省晋中市寿阳县', 2, '寿阳县', ',219,277,', 277);\nINSERT INTO `area` VALUES (284, '2015-10-19 00:08:36', '2015-10-19 00:08:36', 0, 7, '山西省晋中市太谷县', 2, '太谷县', ',219,277,', 277);\nINSERT INTO `area` VALUES (285, '2015-10-19 00:08:37', '2015-10-19 00:08:37', 0, 8, '山西省晋中市祁县', 2, '祁县', ',219,277,', 277);\nINSERT INTO `area` VALUES (286, '2015-10-19 00:08:38', '2015-10-19 00:08:38', 0, 9, '山西省晋中市平遥县', 2, '平遥县', ',219,277,', 277);\nINSERT INTO `area` VALUES (287, '2015-10-19 00:08:39', '2015-10-19 00:08:39', 0, 10, '山西省晋中市灵石县', 2, '灵石县', ',219,277,', 277);\nINSERT INTO `area` VALUES (288, '2015-10-19 00:08:40', '2015-10-19 00:08:40', 0, 11, '山西省晋中市介休市', 2, '介休市', ',219,277,', 277);\nINSERT INTO `area` VALUES (289, '2015-10-19 00:08:41', '2015-10-19 00:08:41', 0, 8, '山西省运城市', 1, '运城市', ',219,', 219);\nINSERT INTO `area` VALUES (290, '2015-10-19 00:08:42', '2015-10-19 00:08:42', 0, 1, '山西省运城市盐湖区', 2, '盐湖区', ',219,289,', 289);\nINSERT INTO `area` VALUES (291, '2015-10-19 00:08:43', '2015-10-19 00:08:43', 0, 2, '山西省运城市临猗县', 2, '临猗县', ',219,289,', 289);\nINSERT INTO `area` VALUES (292, '2015-10-19 00:08:44', '2015-10-19 00:08:44', 0, 3, '山西省运城市万荣县', 2, '万荣县', ',219,289,', 289);\nINSERT INTO `area` VALUES (293, '2015-10-19 00:08:45', '2015-10-19 00:08:45', 0, 4, '山西省运城市闻喜县', 2, '闻喜县', ',219,289,', 289);\nINSERT INTO `area` VALUES (294, '2015-10-19 00:08:46', '2015-10-19 00:08:46', 0, 5, '山西省运城市稷山县', 2, '稷山县', ',219,289,', 289);\nINSERT INTO `area` VALUES (295, '2015-10-19 00:08:47', '2015-10-19 00:08:47', 0, 6, '山西省运城市新绛县', 2, '新绛县', ',219,289,', 289);\nINSERT INTO `area` VALUES (296, '2015-10-19 00:08:48', '2015-10-19 00:08:48', 0, 7, '山西省运城市绛县', 2, '绛县', ',219,289,', 289);\nINSERT INTO `area` VALUES (297, '2015-10-19 00:08:49', '2015-10-19 00:08:49', 0, 8, '山西省运城市垣曲县', 2, '垣曲县', ',219,289,', 289);\nINSERT INTO `area` VALUES (298, '2015-10-19 00:08:50', '2015-10-19 00:08:50', 0, 9, '山西省运城市夏县', 2, '夏县', ',219,289,', 289);\nINSERT INTO `area` VALUES (299, '2015-10-19 00:08:51', '2015-10-19 00:08:51', 0, 10, '山西省运城市平陆县', 2, '平陆县', ',219,289,', 289);\nINSERT INTO `area` VALUES (300, '2015-10-19 00:08:52', '2015-10-19 00:08:52', 0, 11, '山西省运城市芮城县', 2, '芮城县', ',219,289,', 289);\nINSERT INTO `area` VALUES (301, '2015-10-19 00:08:53', '2015-10-19 00:08:53', 0, 12, '山西省运城市永济市', 2, '永济市', ',219,289,', 289);\nINSERT INTO `area` VALUES (302, '2015-10-19 00:08:54', '2015-10-19 00:08:54', 0, 13, '山西省运城市河津市', 2, '河津市', ',219,289,', 289);\nINSERT INTO `area` VALUES (303, '2015-10-19 00:08:55', '2015-10-19 00:08:55', 0, 9, '山西省忻州市', 1, '忻州市', ',219,', 219);\nINSERT INTO `area` VALUES (304, '2015-10-19 00:08:56', '2015-10-19 00:08:56', 0, 1, '山西省忻州市忻府区', 2, '忻府区', ',219,303,', 303);\nINSERT INTO `area` VALUES (305, '2015-10-19 00:08:57', '2015-10-19 00:08:57', 0, 2, '山西省忻州市定襄县', 2, '定襄县', ',219,303,', 303);\nINSERT INTO `area` VALUES (306, '2015-10-19 00:08:58', '2015-10-19 00:08:58', 0, 3, '山西省忻州市五台县', 2, '五台县', ',219,303,', 303);\nINSERT INTO `area` VALUES (307, '2015-10-19 00:08:59', '2015-10-19 00:08:59', 0, 4, '山西省忻州市代县', 2, '代县', ',219,303,', 303);\nINSERT INTO `area` VALUES (308, '2015-10-19 00:09:00', '2015-10-19 00:09:00', 0, 5, '山西省忻州市繁峙县', 2, '繁峙县', ',219,303,', 303);\nINSERT INTO `area` VALUES (309, '2015-10-19 00:09:01', '2015-10-19 00:09:01', 0, 6, '山西省忻州市宁武县', 2, '宁武县', ',219,303,', 303);\nINSERT INTO `area` VALUES (310, '2015-10-19 00:09:02', '2015-10-19 00:09:02', 0, 7, '山西省忻州市静乐县', 2, '静乐县', ',219,303,', 303);\nINSERT INTO `area` VALUES (311, '2015-10-19 00:09:03', '2015-10-19 00:09:03', 0, 8, '山西省忻州市神池县', 2, '神池县', ',219,303,', 303);\nINSERT INTO `area` VALUES (312, '2015-10-19 00:09:04', '2015-10-19 00:09:04', 0, 9, '山西省忻州市五寨县', 2, '五寨县', ',219,303,', 303);\nINSERT INTO `area` VALUES (313, '2015-10-19 00:09:05', '2015-10-19 00:09:05', 0, 10, '山西省忻州市岢岚县', 2, '岢岚县', ',219,303,', 303);\nINSERT INTO `area` VALUES (314, '2015-10-19 00:09:06', '2015-10-19 00:09:06', 0, 11, '山西省忻州市河曲县', 2, '河曲县', ',219,303,', 303);\nINSERT INTO `area` VALUES (315, '2015-10-19 00:09:07', '2015-10-19 00:09:07', 0, 12, '山西省忻州市保德县', 2, '保德县', ',219,303,', 303);\nINSERT INTO `area` VALUES (316, '2015-10-19 00:09:08', '2015-10-19 00:09:08', 0, 13, '山西省忻州市偏关县', 2, '偏关县', ',219,303,', 303);\nINSERT INTO `area` VALUES (317, '2015-10-19 00:09:09', '2015-10-19 00:09:09', 0, 14, '山西省忻州市原平市', 2, '原平市', ',219,303,', 303);\nINSERT INTO `area` VALUES (318, '2015-10-19 00:09:10', '2015-10-19 00:09:10', 0, 10, '山西省临汾市', 1, '临汾市', ',219,', 219);\nINSERT INTO `area` VALUES (319, '2015-10-19 00:09:11', '2015-10-19 00:09:11', 0, 1, '山西省临汾市尧都区', 2, '尧都区', ',219,318,', 318);\nINSERT INTO `area` VALUES (320, '2015-10-19 00:09:12', '2015-10-19 00:09:12', 0, 2, '山西省临汾市曲沃县', 2, '曲沃县', ',219,318,', 318);\nINSERT INTO `area` VALUES (321, '2015-10-19 00:09:13', '2015-10-19 00:09:13', 0, 3, '山西省临汾市翼城县', 2, '翼城县', ',219,318,', 318);\nINSERT INTO `area` VALUES (322, '2015-10-19 00:09:14', '2015-10-19 00:09:14', 0, 4, '山西省临汾市襄汾县', 2, '襄汾县', ',219,318,', 318);\nINSERT INTO `area` VALUES (323, '2015-10-19 00:09:15', '2015-10-19 00:09:15', 0, 5, '山西省临汾市洪洞县', 2, '洪洞县', ',219,318,', 318);\nINSERT INTO `area` VALUES (324, '2015-10-19 00:09:16', '2015-10-19 00:09:16', 0, 6, '山西省临汾市古县', 2, '古县', ',219,318,', 318);\nINSERT INTO `area` VALUES (325, '2015-10-19 00:09:17', '2015-10-19 00:09:17', 0, 7, '山西省临汾市安泽县', 2, '安泽县', ',219,318,', 318);\nINSERT INTO `area` VALUES (326, '2015-10-19 00:09:18', '2015-10-19 00:09:18', 0, 8, '山西省临汾市浮山县', 2, '浮山县', ',219,318,', 318);\nINSERT INTO `area` VALUES (327, '2015-10-19 00:09:19', '2015-10-19 00:09:19', 0, 9, '山西省临汾市吉县', 2, '吉县', ',219,318,', 318);\nINSERT INTO `area` VALUES (328, '2015-10-19 00:09:20', '2015-10-19 00:09:20', 0, 10, '山西省临汾市乡宁县', 2, '乡宁县', ',219,318,', 318);\nINSERT INTO `area` VALUES (329, '2015-10-19 00:09:21', '2015-10-19 00:09:21', 0, 11, '山西省临汾市大宁县', 2, '大宁县', ',219,318,', 318);\nINSERT INTO `area` VALUES (330, '2015-10-19 00:09:22', '2015-10-19 00:09:22', 0, 12, '山西省临汾市隰县', 2, '隰县', ',219,318,', 318);\nINSERT INTO `area` VALUES (331, '2015-10-19 00:09:23', '2015-10-19 00:09:23', 0, 13, '山西省临汾市永和县', 2, '永和县', ',219,318,', 318);\nINSERT INTO `area` VALUES (332, '2015-10-19 00:09:24', '2015-10-19 00:09:24', 0, 14, '山西省临汾市蒲县', 2, '蒲县', ',219,318,', 318);\nINSERT INTO `area` VALUES (333, '2015-10-19 00:09:25', '2015-10-19 00:09:25', 0, 15, '山西省临汾市汾西县', 2, '汾西县', ',219,318,', 318);\nINSERT INTO `area` VALUES (334, '2015-10-19 00:09:26', '2015-10-19 00:09:26', 0, 16, '山西省临汾市侯马市', 2, '侯马市', ',219,318,', 318);\nINSERT INTO `area` VALUES (335, '2015-10-19 00:09:27', '2015-10-19 00:09:27', 0, 17, '山西省临汾市霍州市', 2, '霍州市', ',219,318,', 318);\nINSERT INTO `area` VALUES (336, '2015-10-19 00:09:28', '2015-10-19 00:09:28', 0, 11, '山西省吕梁市', 1, '吕梁市', ',219,', 219);\nINSERT INTO `area` VALUES (337, '2015-10-19 00:09:29', '2015-10-19 00:09:29', 0, 1, '山西省吕梁市离石区', 2, '离石区', ',219,336,', 336);\nINSERT INTO `area` VALUES (338, '2015-10-19 00:09:30', '2015-10-19 00:09:30', 0, 2, '山西省吕梁市文水县', 2, '文水县', ',219,336,', 336);\nINSERT INTO `area` VALUES (339, '2015-10-19 00:09:31', '2015-10-19 00:09:31', 0, 3, '山西省吕梁市交城县', 2, '交城县', ',219,336,', 336);\nINSERT INTO `area` VALUES (340, '2015-10-19 00:09:32', '2015-10-19 00:09:32', 0, 4, '山西省吕梁市兴县', 2, '兴县', ',219,336,', 336);\nINSERT INTO `area` VALUES (341, '2015-10-19 00:09:33', '2015-10-19 00:09:33', 0, 5, '山西省吕梁市临县', 2, '临县', ',219,336,', 336);\nINSERT INTO `area` VALUES (342, '2015-10-19 00:09:34', '2015-10-19 00:09:34', 0, 6, '山西省吕梁市柳林县', 2, '柳林县', ',219,336,', 336);\nINSERT INTO `area` VALUES (343, '2015-10-19 00:09:35', '2015-10-19 00:09:35', 0, 7, '山西省吕梁市石楼县', 2, '石楼县', ',219,336,', 336);\nINSERT INTO `area` VALUES (344, '2015-10-19 00:09:36', '2015-10-19 00:09:36', 0, 8, '山西省吕梁市岚县', 2, '岚县', ',219,336,', 336);\nINSERT INTO `area` VALUES (345, '2015-10-19 00:09:37', '2015-10-19 00:09:37', 0, 9, '山西省吕梁市方山县', 2, '方山县', ',219,336,', 336);\nINSERT INTO `area` VALUES (346, '2015-10-19 00:09:38', '2015-10-19 00:09:38', 0, 10, '山西省吕梁市中阳县', 2, '中阳县', ',219,336,', 336);\nINSERT INTO `area` VALUES (347, '2015-10-19 00:09:39', '2015-10-19 00:09:39', 0, 11, '山西省吕梁市交口县', 2, '交口县', ',219,336,', 336);\nINSERT INTO `area` VALUES (348, '2015-10-19 00:09:40', '2015-10-19 00:09:40', 0, 12, '山西省吕梁市孝义市', 2, '孝义市', ',219,336,', 336);\nINSERT INTO `area` VALUES (349, '2015-10-19 00:09:41', '2015-10-19 00:09:41', 0, 13, '山西省吕梁市汾阳市', 2, '汾阳市', ',219,336,', 336);\nINSERT INTO `area` VALUES (350, '2015-10-19 00:09:42', '2015-10-19 00:09:42', 0, 5, '内蒙古自治区', 0, '内蒙古自治区', ',', NULL);\nINSERT INTO `area` VALUES (351, '2015-10-19 00:09:43', '2015-10-19 00:09:43', 0, 1, '内蒙古自治区呼和浩特市', 1, '呼和浩特市', ',350,', 350);\nINSERT INTO `area` VALUES (352, '2015-10-19 00:09:44', '2015-10-19 00:09:44', 0, 1, '内蒙古自治区呼和浩特市新城区', 2, '新城区', ',350,351,', 351);\nINSERT INTO `area` VALUES (353, '2015-10-19 00:09:45', '2015-10-19 00:09:45', 0, 2, '内蒙古自治区呼和浩特市回民区', 2, '回民区', ',350,351,', 351);\nINSERT INTO `area` VALUES (354, '2015-10-19 00:09:46', '2015-10-19 00:09:46', 0, 3, '内蒙古自治区呼和浩特市玉泉区', 2, '玉泉区', ',350,351,', 351);\nINSERT INTO `area` VALUES (355, '2015-10-19 00:09:47', '2015-10-19 00:09:47', 0, 4, '内蒙古自治区呼和浩特市赛罕区', 2, '赛罕区', ',350,351,', 351);\nINSERT INTO `area` VALUES (356, '2015-10-19 00:09:48', '2015-10-19 00:09:48', 0, 5, '内蒙古自治区呼和浩特市土默特左旗', 2, '土默特左旗', ',350,351,', 351);\nINSERT INTO `area` VALUES (357, '2015-10-19 00:09:49', '2015-10-19 00:09:49', 0, 6, '内蒙古自治区呼和浩特市托克托县', 2, '托克托县', ',350,351,', 351);\nINSERT INTO `area` VALUES (358, '2015-10-19 00:09:50', '2015-10-19 00:09:50', 0, 7, '内蒙古自治区呼和浩特市和林格尔县', 2, '和林格尔县', ',350,351,', 351);\nINSERT INTO `area` VALUES (359, '2015-10-19 00:09:51', '2015-10-19 00:09:51', 0, 8, '内蒙古自治区呼和浩特市清水河县', 2, '清水河县', ',350,351,', 351);\nINSERT INTO `area` VALUES (360, '2015-10-19 00:09:52', '2015-10-19 00:09:52', 0, 9, '内蒙古自治区呼和浩特市武川县', 2, '武川县', ',350,351,', 351);\nINSERT INTO `area` VALUES (361, '2015-10-19 00:09:53', '2015-10-19 00:09:53', 0, 2, '内蒙古自治区包头市', 1, '包头市', ',350,', 350);\nINSERT INTO `area` VALUES (362, '2015-10-19 00:09:54', '2015-10-19 00:09:54', 0, 1, '内蒙古自治区包头市东河区', 2, '东河区', ',350,361,', 361);\nINSERT INTO `area` VALUES (363, '2015-10-19 00:09:55', '2015-10-19 00:09:55', 0, 2, '内蒙古自治区包头市昆都仑区', 2, '昆都仑区', ',350,361,', 361);\nINSERT INTO `area` VALUES (364, '2015-10-19 00:09:56', '2015-10-19 00:09:56', 0, 3, '内蒙古自治区包头市青山区', 2, '青山区', ',350,361,', 361);\nINSERT INTO `area` VALUES (365, '2015-10-19 00:09:57', '2015-10-19 00:09:57', 0, 4, '内蒙古自治区包头市石拐区', 2, '石拐区', ',350,361,', 361);\nINSERT INTO `area` VALUES (366, '2015-10-19 00:09:58', '2015-10-19 00:09:58', 0, 5, '内蒙古自治区包头市白云鄂博矿区', 2, '白云鄂博矿区', ',350,361,', 361);\nINSERT INTO `area` VALUES (367, '2015-10-19 00:09:59', '2015-10-19 00:09:59', 0, 6, '内蒙古自治区包头市九原区', 2, '九原区', ',350,361,', 361);\nINSERT INTO `area` VALUES (368, '2015-10-19 00:10:00', '2015-10-19 00:10:00', 0, 7, '内蒙古自治区包头市土默特右旗', 2, '土默特右旗', ',350,361,', 361);\nINSERT INTO `area` VALUES (369, '2015-10-19 00:10:01', '2015-10-19 00:10:01', 0, 8, '内蒙古自治区包头市固阳县', 2, '固阳县', ',350,361,', 361);\nINSERT INTO `area` VALUES (370, '2015-10-19 00:10:02', '2015-10-19 00:10:02', 0, 9, '内蒙古自治区包头市达尔罕茂明安联合旗', 2, '达尔罕茂明安联合旗', ',350,361,', 361);\nINSERT INTO `area` VALUES (371, '2015-10-19 00:10:03', '2015-10-19 00:10:03', 0, 3, '内蒙古自治区乌海市', 1, '乌海市', ',350,', 350);\nINSERT INTO `area` VALUES (372, '2015-10-19 00:10:04', '2015-10-19 00:10:04', 0, 1, '内蒙古自治区乌海市海勃湾区', 2, '海勃湾区', ',350,371,', 371);\nINSERT INTO `area` VALUES (373, '2015-10-19 00:10:05', '2015-10-19 00:10:05', 0, 2, '内蒙古自治区乌海市海南区', 2, '海南区', ',350,371,', 371);\nINSERT INTO `area` VALUES (374, '2015-10-19 00:10:06', '2015-10-19 00:10:06', 0, 3, '内蒙古自治区乌海市乌达区', 2, '乌达区', ',350,371,', 371);\nINSERT INTO `area` VALUES (375, '2015-10-19 00:10:07', '2015-10-19 00:10:07', 0, 4, '内蒙古自治区赤峰市', 1, '赤峰市', ',350,', 350);\nINSERT INTO `area` VALUES (376, '2015-10-19 00:10:08', '2015-10-19 00:10:08', 0, 1, '内蒙古自治区赤峰市红山区', 2, '红山区', ',350,375,', 375);\nINSERT INTO `area` VALUES (377, '2015-10-19 00:10:09', '2015-10-19 00:10:09', 0, 2, '内蒙古自治区赤峰市元宝山区', 2, '元宝山区', ',350,375,', 375);\nINSERT INTO `area` VALUES (378, '2015-10-19 00:10:10', '2015-10-19 00:10:10', 0, 3, '内蒙古自治区赤峰市松山区', 2, '松山区', ',350,375,', 375);\nINSERT INTO `area` VALUES (379, '2015-10-19 00:10:11', '2015-10-19 00:10:11', 0, 4, '内蒙古自治区赤峰市阿鲁科尔沁旗', 2, '阿鲁科尔沁旗', ',350,375,', 375);\nINSERT INTO `area` VALUES (380, '2015-10-19 00:10:12', '2015-10-19 00:10:12', 0, 5, '内蒙古自治区赤峰市巴林左旗', 2, '巴林左旗', ',350,375,', 375);\nINSERT INTO `area` VALUES (381, '2015-10-19 00:10:13', '2015-10-19 00:10:13', 0, 6, '内蒙古自治区赤峰市巴林右旗', 2, '巴林右旗', ',350,375,', 375);\nINSERT INTO `area` VALUES (382, '2015-10-19 00:10:14', '2015-10-19 00:10:14', 0, 7, '内蒙古自治区赤峰市林西县', 2, '林西县', ',350,375,', 375);\nINSERT INTO `area` VALUES (383, '2015-10-19 00:10:15', '2015-10-19 00:10:15', 0, 8, '内蒙古自治区赤峰市克什克腾旗', 2, '克什克腾旗', ',350,375,', 375);\nINSERT INTO `area` VALUES (384, '2015-10-19 00:10:16', '2015-10-19 00:10:16', 0, 9, '内蒙古自治区赤峰市翁牛特旗', 2, '翁牛特旗', ',350,375,', 375);\nINSERT INTO `area` VALUES (385, '2015-10-19 00:10:17', '2015-10-19 00:10:17', 0, 10, '内蒙古自治区赤峰市喀喇沁旗', 2, '喀喇沁旗', ',350,375,', 375);\nINSERT INTO `area` VALUES (386, '2015-10-19 00:10:18', '2015-10-19 00:10:18', 0, 11, '内蒙古自治区赤峰市宁城县', 2, '宁城县', ',350,375,', 375);\nINSERT INTO `area` VALUES (387, '2015-10-19 00:10:19', '2015-10-19 00:10:19', 0, 12, '内蒙古自治区赤峰市敖汉旗', 2, '敖汉旗', ',350,375,', 375);\nINSERT INTO `area` VALUES (388, '2015-10-19 00:10:20', '2015-10-19 00:10:20', 0, 5, '内蒙古自治区通辽市', 1, '通辽市', ',350,', 350);\nINSERT INTO `area` VALUES (389, '2015-10-19 00:10:21', '2015-10-19 00:10:21', 0, 1, '内蒙古自治区通辽市科尔沁区', 2, '科尔沁区', ',350,388,', 388);\nINSERT INTO `area` VALUES (390, '2015-10-19 00:10:22', '2015-10-19 00:10:22', 0, 2, '内蒙古自治区通辽市科尔沁左翼中旗', 2, '科尔沁左翼中旗', ',350,388,', 388);\nINSERT INTO `area` VALUES (391, '2015-10-19 00:10:23', '2015-10-19 00:10:23', 0, 3, '内蒙古自治区通辽市科尔沁左翼后旗', 2, '科尔沁左翼后旗', ',350,388,', 388);\nINSERT INTO `area` VALUES (392, '2015-10-19 00:10:24', '2015-10-19 00:10:24', 0, 4, '内蒙古自治区通辽市开鲁县', 2, '开鲁县', ',350,388,', 388);\nINSERT INTO `area` VALUES (393, '2015-10-19 00:10:25', '2015-10-19 00:10:25', 0, 5, '内蒙古自治区通辽市库伦旗', 2, '库伦旗', ',350,388,', 388);\nINSERT INTO `area` VALUES (394, '2015-10-19 00:10:26', '2015-10-19 00:10:26', 0, 6, '内蒙古自治区通辽市奈曼旗', 2, '奈曼旗', ',350,388,', 388);\nINSERT INTO `area` VALUES (395, '2015-10-19 00:10:27', '2015-10-19 00:10:27', 0, 7, '内蒙古自治区通辽市扎鲁特旗', 2, '扎鲁特旗', ',350,388,', 388);\nINSERT INTO `area` VALUES (396, '2015-10-19 00:10:28', '2015-10-19 00:10:28', 0, 8, '内蒙古自治区通辽市霍林郭勒市', 2, '霍林郭勒市', ',350,388,', 388);\nINSERT INTO `area` VALUES (397, '2015-10-19 00:10:29', '2015-10-19 00:10:29', 0, 6, '内蒙古自治区鄂尔多斯市', 1, '鄂尔多斯市', ',350,', 350);\nINSERT INTO `area` VALUES (398, '2015-10-19 00:10:30', '2015-10-19 00:10:30', 0, 1, '内蒙古自治区鄂尔多斯市东胜区', 2, '东胜区', ',350,397,', 397);\nINSERT INTO `area` VALUES (399, '2015-10-19 00:10:31', '2015-10-19 00:10:31', 0, 2, '内蒙古自治区鄂尔多斯市达拉特旗', 2, '达拉特旗', ',350,397,', 397);\nINSERT INTO `area` VALUES (400, '2015-10-19 00:10:32', '2015-10-19 00:10:32', 0, 3, '内蒙古自治区鄂尔多斯市准格尔旗', 2, '准格尔旗', ',350,397,', 397);\nINSERT INTO `area` VALUES (401, '2015-10-19 00:10:33', '2015-10-19 00:10:33', 0, 4, '内蒙古自治区鄂尔多斯市鄂托克前旗', 2, '鄂托克前旗', ',350,397,', 397);\nINSERT INTO `area` VALUES (402, '2015-10-19 00:10:34', '2015-10-19 00:10:34', 0, 5, '内蒙古自治区鄂尔多斯市鄂托克旗', 2, '鄂托克旗', ',350,397,', 397);\nINSERT INTO `area` VALUES (403, '2015-10-19 00:10:35', '2015-10-19 00:10:35', 0, 6, '内蒙古自治区鄂尔多斯市杭锦旗', 2, '杭锦旗', ',350,397,', 397);\nINSERT INTO `area` VALUES (404, '2015-10-19 00:10:36', '2015-10-19 00:10:36', 0, 7, '内蒙古自治区鄂尔多斯市乌审旗', 2, '乌审旗', ',350,397,', 397);\nINSERT INTO `area` VALUES (405, '2015-10-19 00:10:37', '2015-10-19 00:10:37', 0, 8, '内蒙古自治区鄂尔多斯市伊金霍洛旗', 2, '伊金霍洛旗', ',350,397,', 397);\nINSERT INTO `area` VALUES (406, '2015-10-19 00:10:38', '2015-10-19 00:10:38', 0, 7, '内蒙古自治区呼伦贝尔市', 1, '呼伦贝尔市', ',350,', 350);\nINSERT INTO `area` VALUES (407, '2015-10-19 00:10:39', '2015-10-19 00:10:39', 0, 1, '内蒙古自治区呼伦贝尔市海拉尔区', 2, '海拉尔区', ',350,406,', 406);\nINSERT INTO `area` VALUES (408, '2015-10-19 00:10:40', '2015-10-19 00:10:40', 0, 2, '内蒙古自治区呼伦贝尔市扎赉诺尔区', 2, '扎赉诺尔区', ',350,406,', 406);\nINSERT INTO `area` VALUES (409, '2015-10-19 00:10:41', '2015-10-19 00:10:41', 0, 3, '内蒙古自治区呼伦贝尔市阿荣旗', 2, '阿荣旗', ',350,406,', 406);\nINSERT INTO `area` VALUES (410, '2015-10-19 00:10:42', '2015-10-19 00:10:42', 0, 4, '内蒙古自治区呼伦贝尔市莫力达瓦达斡尔族自治旗', 2, '莫力达瓦达斡尔族自治旗', ',350,406,', 406);\nINSERT INTO `area` VALUES (411, '2015-10-19 00:10:43', '2015-10-19 00:10:43', 0, 5, '内蒙古自治区呼伦贝尔市鄂伦春自治旗', 2, '鄂伦春自治旗', ',350,406,', 406);\nINSERT INTO `area` VALUES (412, '2015-10-19 00:10:44', '2015-10-19 00:10:44', 0, 6, '内蒙古自治区呼伦贝尔市鄂温克族自治旗', 2, '鄂温克族自治旗', ',350,406,', 406);\nINSERT INTO `area` VALUES (413, '2015-10-19 00:10:45', '2015-10-19 00:10:45', 0, 7, '内蒙古自治区呼伦贝尔市陈巴尔虎旗', 2, '陈巴尔虎旗', ',350,406,', 406);\nINSERT INTO `area` VALUES (414, '2015-10-19 00:10:46', '2015-10-19 00:10:46', 0, 8, '内蒙古自治区呼伦贝尔市新巴尔虎左旗', 2, '新巴尔虎左旗', ',350,406,', 406);\nINSERT INTO `area` VALUES (415, '2015-10-19 00:10:47', '2015-10-19 00:10:47', 0, 9, '内蒙古自治区呼伦贝尔市新巴尔虎右旗', 2, '新巴尔虎右旗', ',350,406,', 406);\nINSERT INTO `area` VALUES (416, '2015-10-19 00:10:48', '2015-10-19 00:10:48', 0, 10, '内蒙古自治区呼伦贝尔市满洲里市', 2, '满洲里市', ',350,406,', 406);\nINSERT INTO `area` VALUES (417, '2015-10-19 00:10:49', '2015-10-19 00:10:49', 0, 11, '内蒙古自治区呼伦贝尔市牙克石市', 2, '牙克石市', ',350,406,', 406);\nINSERT INTO `area` VALUES (418, '2015-10-19 00:10:50', '2015-10-19 00:10:50', 0, 12, '内蒙古自治区呼伦贝尔市扎兰屯市', 2, '扎兰屯市', ',350,406,', 406);\nINSERT INTO `area` VALUES (419, '2015-10-19 00:10:51', '2015-10-19 00:10:51', 0, 13, '内蒙古自治区呼伦贝尔市额尔古纳市', 2, '额尔古纳市', ',350,406,', 406);\nINSERT INTO `area` VALUES (420, '2015-10-19 00:10:52', '2015-10-19 00:10:52', 0, 14, '内蒙古自治区呼伦贝尔市根河市', 2, '根河市', ',350,406,', 406);\nINSERT INTO `area` VALUES (421, '2015-10-19 00:10:53', '2015-10-19 00:10:53', 0, 8, '内蒙古自治区巴彦淖尔市', 1, '巴彦淖尔市', ',350,', 350);\nINSERT INTO `area` VALUES (422, '2015-10-19 00:10:54', '2015-10-19 00:10:54', 0, 1, '内蒙古自治区巴彦淖尔市临河区', 2, '临河区', ',350,421,', 421);\nINSERT INTO `area` VALUES (423, '2015-10-19 00:10:55', '2015-10-19 00:10:55', 0, 2, '内蒙古自治区巴彦淖尔市五原县', 2, '五原县', ',350,421,', 421);\nINSERT INTO `area` VALUES (424, '2015-10-19 00:10:56', '2015-10-19 00:10:56', 0, 3, '内蒙古自治区巴彦淖尔市磴口县', 2, '磴口县', ',350,421,', 421);\nINSERT INTO `area` VALUES (425, '2015-10-19 00:10:57', '2015-10-19 00:10:57', 0, 4, '内蒙古自治区巴彦淖尔市乌拉特前旗', 2, '乌拉特前旗', ',350,421,', 421);\nINSERT INTO `area` VALUES (426, '2015-10-19 00:10:58', '2015-10-19 00:10:58', 0, 5, '内蒙古自治区巴彦淖尔市乌拉特中旗', 2, '乌拉特中旗', ',350,421,', 421);\nINSERT INTO `area` VALUES (427, '2015-10-19 00:10:59', '2015-10-19 00:10:59', 0, 6, '内蒙古自治区巴彦淖尔市乌拉特后旗', 2, '乌拉特后旗', ',350,421,', 421);\nINSERT INTO `area` VALUES (428, '2015-10-19 00:11:00', '2015-10-19 00:11:00', 0, 7, '内蒙古自治区巴彦淖尔市杭锦后旗', 2, '杭锦后旗', ',350,421,', 421);\nINSERT INTO `area` VALUES (429, '2015-10-19 00:11:01', '2015-10-19 00:11:01', 0, 9, '内蒙古自治区乌兰察布市', 1, '乌兰察布市', ',350,', 350);\nINSERT INTO `area` VALUES (430, '2015-10-19 00:11:02', '2015-10-19 00:11:02', 0, 1, '内蒙古自治区乌兰察布市集宁区', 2, '集宁区', ',350,429,', 429);\nINSERT INTO `area` VALUES (431, '2015-10-19 00:11:03', '2015-10-19 00:11:03', 0, 2, '内蒙古自治区乌兰察布市卓资县', 2, '卓资县', ',350,429,', 429);\nINSERT INTO `area` VALUES (432, '2015-10-19 00:11:04', '2015-10-19 00:11:04', 0, 3, '内蒙古自治区乌兰察布市化德县', 2, '化德县', ',350,429,', 429);\nINSERT INTO `area` VALUES (433, '2015-10-19 00:11:05', '2015-10-19 00:11:05', 0, 4, '内蒙古自治区乌兰察布市商都县', 2, '商都县', ',350,429,', 429);\nINSERT INTO `area` VALUES (434, '2015-10-19 00:11:06', '2015-10-19 00:11:06', 0, 5, '内蒙古自治区乌兰察布市兴和县', 2, '兴和县', ',350,429,', 429);\nINSERT INTO `area` VALUES (435, '2015-10-19 00:11:07', '2015-10-19 00:11:07', 0, 6, '内蒙古自治区乌兰察布市凉城县', 2, '凉城县', ',350,429,', 429);\nINSERT INTO `area` VALUES (436, '2015-10-19 00:11:08', '2015-10-19 00:11:08', 0, 7, '内蒙古自治区乌兰察布市察哈尔右翼前旗', 2, '察哈尔右翼前旗', ',350,429,', 429);\nINSERT INTO `area` VALUES (437, '2015-10-19 00:11:09', '2015-10-19 00:11:09', 0, 8, '内蒙古自治区乌兰察布市察哈尔右翼中旗', 2, '察哈尔右翼中旗', ',350,429,', 429);\nINSERT INTO `area` VALUES (438, '2015-10-19 00:11:10', '2015-10-19 00:11:10', 0, 9, '内蒙古自治区乌兰察布市察哈尔右翼后旗', 2, '察哈尔右翼后旗', ',350,429,', 429);\nINSERT INTO `area` VALUES (439, '2015-10-19 00:11:11', '2015-10-19 00:11:11', 0, 10, '内蒙古自治区乌兰察布市四子王旗', 2, '四子王旗', ',350,429,', 429);\nINSERT INTO `area` VALUES (440, '2015-10-19 00:11:12', '2015-10-19 00:11:12', 0, 11, '内蒙古自治区乌兰察布市丰镇市', 2, '丰镇市', ',350,429,', 429);\nINSERT INTO `area` VALUES (441, '2015-10-19 00:11:13', '2015-10-19 00:11:13', 0, 10, '内蒙古自治区兴安盟', 1, '兴安盟', ',350,', 350);\nINSERT INTO `area` VALUES (442, '2015-10-19 00:11:14', '2015-10-19 00:11:14', 0, 1, '内蒙古自治区兴安盟乌兰浩特市', 2, '乌兰浩特市', ',350,441,', 441);\nINSERT INTO `area` VALUES (443, '2015-10-19 00:11:15', '2015-10-19 00:11:15', 0, 2, '内蒙古自治区兴安盟阿尔山市', 2, '阿尔山市', ',350,441,', 441);\nINSERT INTO `area` VALUES (444, '2015-10-19 00:11:16', '2015-10-19 00:11:16', 0, 3, '内蒙古自治区兴安盟科尔沁右翼前旗', 2, '科尔沁右翼前旗', ',350,441,', 441);\nINSERT INTO `area` VALUES (445, '2015-10-19 00:11:17', '2015-10-19 00:11:17', 0, 4, '内蒙古自治区兴安盟科尔沁右翼中旗', 2, '科尔沁右翼中旗', ',350,441,', 441);\nINSERT INTO `area` VALUES (446, '2015-10-19 00:11:18', '2015-10-19 00:11:18', 0, 5, '内蒙古自治区兴安盟扎赉特旗', 2, '扎赉特旗', ',350,441,', 441);\nINSERT INTO `area` VALUES (447, '2015-10-19 00:11:19', '2015-10-19 00:11:19', 0, 6, '内蒙古自治区兴安盟突泉县', 2, '突泉县', ',350,441,', 441);\nINSERT INTO `area` VALUES (448, '2015-10-19 00:11:20', '2015-10-19 00:11:20', 0, 11, '内蒙古自治区锡林郭勒盟', 1, '锡林郭勒盟', ',350,', 350);\nINSERT INTO `area` VALUES (449, '2015-10-19 00:11:21', '2015-10-19 00:11:21', 0, 1, '内蒙古自治区锡林郭勒盟二连浩特市', 2, '二连浩特市', ',350,448,', 448);\nINSERT INTO `area` VALUES (450, '2015-10-19 00:11:22', '2015-10-19 00:11:22', 0, 2, '内蒙古自治区锡林郭勒盟锡林浩特市', 2, '锡林浩特市', ',350,448,', 448);\nINSERT INTO `area` VALUES (451, '2015-10-19 00:11:23', '2015-10-19 00:11:23', 0, 3, '内蒙古自治区锡林郭勒盟阿巴嘎旗', 2, '阿巴嘎旗', ',350,448,', 448);\nINSERT INTO `area` VALUES (452, '2015-10-19 00:11:24', '2015-10-19 00:11:24', 0, 4, '内蒙古自治区锡林郭勒盟苏尼特左旗', 2, '苏尼特左旗', ',350,448,', 448);\nINSERT INTO `area` VALUES (453, '2015-10-19 00:11:25', '2015-10-19 00:11:25', 0, 5, '内蒙古自治区锡林郭勒盟苏尼特右旗', 2, '苏尼特右旗', ',350,448,', 448);\nINSERT INTO `area` VALUES (454, '2015-10-19 00:11:26', '2015-10-19 00:11:26', 0, 6, '内蒙古自治区锡林郭勒盟东乌珠穆沁旗', 2, '东乌珠穆沁旗', ',350,448,', 448);\nINSERT INTO `area` VALUES (455, '2015-10-19 00:11:27', '2015-10-19 00:11:27', 0, 7, '内蒙古自治区锡林郭勒盟西乌珠穆沁旗', 2, '西乌珠穆沁旗', ',350,448,', 448);\nINSERT INTO `area` VALUES (456, '2015-10-19 00:11:28', '2015-10-19 00:11:28', 0, 8, '内蒙古自治区锡林郭勒盟太仆寺旗', 2, '太仆寺旗', ',350,448,', 448);\nINSERT INTO `area` VALUES (457, '2015-10-19 00:11:29', '2015-10-19 00:11:29', 0, 9, '内蒙古自治区锡林郭勒盟镶黄旗', 2, '镶黄旗', ',350,448,', 448);\nINSERT INTO `area` VALUES (458, '2015-10-19 00:11:30', '2015-10-19 00:11:30', 0, 10, '内蒙古自治区锡林郭勒盟正镶白旗', 2, '正镶白旗', ',350,448,', 448);\nINSERT INTO `area` VALUES (459, '2015-10-19 00:11:31', '2015-10-19 00:11:31', 0, 11, '内蒙古自治区锡林郭勒盟正蓝旗', 2, '正蓝旗', ',350,448,', 448);\nINSERT INTO `area` VALUES (460, '2015-10-19 00:11:32', '2015-10-19 00:11:32', 0, 12, '内蒙古自治区锡林郭勒盟多伦县', 2, '多伦县', ',350,448,', 448);\nINSERT INTO `area` VALUES (461, '2015-10-19 00:11:33', '2015-10-19 00:11:33', 0, 12, '内蒙古自治区阿拉善盟', 1, '阿拉善盟', ',350,', 350);\nINSERT INTO `area` VALUES (462, '2015-10-19 00:11:34', '2015-10-19 00:11:34', 0, 1, '内蒙古自治区阿拉善盟阿拉善左旗', 2, '阿拉善左旗', ',350,461,', 461);\nINSERT INTO `area` VALUES (463, '2015-10-19 00:11:35', '2015-10-19 00:11:35', 0, 2, '内蒙古自治区阿拉善盟阿拉善右旗', 2, '阿拉善右旗', ',350,461,', 461);\nINSERT INTO `area` VALUES (464, '2015-10-19 00:11:36', '2015-10-19 00:11:36', 0, 3, '内蒙古自治区阿拉善盟额济纳旗', 2, '额济纳旗', ',350,461,', 461);\nINSERT INTO `area` VALUES (465, '2015-10-19 00:11:37', '2015-10-19 00:11:37', 0, 6, '辽宁省', 0, '辽宁省', ',', NULL);\nINSERT INTO `area` VALUES (466, '2015-10-19 00:11:38', '2015-10-19 00:11:38', 0, 1, '辽宁省沈阳市', 1, '沈阳市', ',465,', 465);\nINSERT INTO `area` VALUES (467, '2015-10-19 00:11:39', '2015-10-19 00:11:39', 0, 1, '辽宁省沈阳市和平区', 2, '和平区', ',465,466,', 466);\nINSERT INTO `area` VALUES (468, '2015-10-19 00:11:40', '2015-10-19 00:11:40', 0, 2, '辽宁省沈阳市沈河区', 2, '沈河区', ',465,466,', 466);\nINSERT INTO `area` VALUES (469, '2015-10-19 00:11:41', '2015-10-19 00:11:41', 0, 3, '辽宁省沈阳市大东区', 2, '大东区', ',465,466,', 466);\nINSERT INTO `area` VALUES (470, '2015-10-19 00:11:42', '2015-10-19 00:11:42', 0, 4, '辽宁省沈阳市皇姑区', 2, '皇姑区', ',465,466,', 466);\nINSERT INTO `area` VALUES (471, '2015-10-19 00:11:43', '2015-10-19 00:11:43', 0, 5, '辽宁省沈阳市铁西区', 2, '铁西区', ',465,466,', 466);\nINSERT INTO `area` VALUES (472, '2015-10-19 00:11:44', '2015-10-19 00:11:44', 0, 6, '辽宁省沈阳市苏家屯区', 2, '苏家屯区', ',465,466,', 466);\nINSERT INTO `area` VALUES (473, '2015-10-19 00:11:45', '2015-10-19 00:11:45', 0, 7, '辽宁省沈阳市东陵区', 2, '东陵区', ',465,466,', 466);\nINSERT INTO `area` VALUES (474, '2015-10-19 00:11:46', '2015-10-19 00:11:46', 0, 8, '辽宁省沈阳市沈北新区', 2, '沈北新区', ',465,466,', 466);\nINSERT INTO `area` VALUES (475, '2015-10-19 00:11:47', '2015-10-19 00:11:47', 0, 9, '辽宁省沈阳市于洪区', 2, '于洪区', ',465,466,', 466);\nINSERT INTO `area` VALUES (476, '2015-10-19 00:11:48', '2015-10-19 00:11:48', 0, 10, '辽宁省沈阳市辽中县', 2, '辽中县', ',465,466,', 466);\nINSERT INTO `area` VALUES (477, '2015-10-19 00:11:49', '2015-10-19 00:11:49', 0, 11, '辽宁省沈阳市康平县', 2, '康平县', ',465,466,', 466);\nINSERT INTO `area` VALUES (478, '2015-10-19 00:11:50', '2015-10-19 00:11:50', 0, 12, '辽宁省沈阳市法库县', 2, '法库县', ',465,466,', 466);\nINSERT INTO `area` VALUES (479, '2015-10-19 00:11:51', '2015-10-19 00:11:51', 0, 13, '辽宁省沈阳市新民市', 2, '新民市', ',465,466,', 466);\nINSERT INTO `area` VALUES (480, '2015-10-19 00:11:52', '2015-10-19 00:11:52', 0, 2, '辽宁省大连市', 1, '大连市', ',465,', 465);\nINSERT INTO `area` VALUES (481, '2015-10-19 00:11:53', '2015-10-19 00:11:53', 0, 1, '辽宁省大连市中山区', 2, '中山区', ',465,480,', 480);\nINSERT INTO `area` VALUES (482, '2015-10-19 00:11:54', '2015-10-19 00:11:54', 0, 2, '辽宁省大连市西岗区', 2, '西岗区', ',465,480,', 480);\nINSERT INTO `area` VALUES (483, '2015-10-19 00:11:55', '2015-10-19 00:11:55', 0, 3, '辽宁省大连市沙河口区', 2, '沙河口区', ',465,480,', 480);\nINSERT INTO `area` VALUES (484, '2015-10-19 00:11:56', '2015-10-19 00:11:56', 0, 4, '辽宁省大连市甘井子区', 2, '甘井子区', ',465,480,', 480);\nINSERT INTO `area` VALUES (485, '2015-10-19 00:11:57', '2015-10-19 00:11:57', 0, 5, '辽宁省大连市旅顺口区', 2, '旅顺口区', ',465,480,', 480);\nINSERT INTO `area` VALUES (486, '2015-10-19 00:11:58', '2015-10-19 00:11:58', 0, 6, '辽宁省大连市金州区', 2, '金州区', ',465,480,', 480);\nINSERT INTO `area` VALUES (487, '2015-10-19 00:11:59', '2015-10-19 00:11:59', 0, 7, '辽宁省大连市长海县', 2, '长海县', ',465,480,', 480);\nINSERT INTO `area` VALUES (488, '2015-10-19 00:12:00', '2015-10-19 00:12:00', 0, 8, '辽宁省大连市瓦房店市', 2, '瓦房店市', ',465,480,', 480);\nINSERT INTO `area` VALUES (489, '2015-10-19 00:12:01', '2015-10-19 00:12:01', 0, 9, '辽宁省大连市普兰店市', 2, '普兰店市', ',465,480,', 480);\nINSERT INTO `area` VALUES (490, '2015-10-19 00:12:02', '2015-10-19 00:12:02', 0, 10, '辽宁省大连市庄河市', 2, '庄河市', ',465,480,', 480);\nINSERT INTO `area` VALUES (491, '2015-10-19 00:12:03', '2015-10-19 00:12:03', 0, 3, '辽宁省鞍山市', 1, '鞍山市', ',465,', 465);\nINSERT INTO `area` VALUES (492, '2015-10-19 00:12:04', '2015-10-19 00:12:04', 0, 1, '辽宁省鞍山市铁东区', 2, '铁东区', ',465,491,', 491);\nINSERT INTO `area` VALUES (493, '2015-10-19 00:12:05', '2015-10-19 00:12:05', 0, 2, '辽宁省鞍山市铁西区', 2, '铁西区', ',465,491,', 491);\nINSERT INTO `area` VALUES (494, '2015-10-19 00:12:06', '2015-10-19 00:12:06', 0, 3, '辽宁省鞍山市立山区', 2, '立山区', ',465,491,', 491);\nINSERT INTO `area` VALUES (495, '2015-10-19 00:12:07', '2015-10-19 00:12:07', 0, 4, '辽宁省鞍山市千山区', 2, '千山区', ',465,491,', 491);\nINSERT INTO `area` VALUES (496, '2015-10-19 00:12:08', '2015-10-19 00:12:08', 0, 5, '辽宁省鞍山市台安县', 2, '台安县', ',465,491,', 491);\nINSERT INTO `area` VALUES (497, '2015-10-19 00:12:09', '2015-10-19 00:12:09', 0, 6, '辽宁省鞍山市岫岩满族自治县', 2, '岫岩满族自治县', ',465,491,', 491);\nINSERT INTO `area` VALUES (498, '2015-10-19 00:12:10', '2015-10-19 00:12:10', 0, 7, '辽宁省鞍山市海城市', 2, '海城市', ',465,491,', 491);\nINSERT INTO `area` VALUES (499, '2015-10-19 00:12:11', '2015-10-19 00:12:11', 0, 4, '辽宁省抚顺市', 1, '抚顺市', ',465,', 465);\nINSERT INTO `area` VALUES (500, '2015-10-19 00:12:12', '2015-10-19 00:12:12', 0, 1, '辽宁省抚顺市新抚区', 2, '新抚区', ',465,499,', 499);\nINSERT INTO `area` VALUES (501, '2015-10-19 00:12:13', '2015-10-19 00:12:13', 0, 2, '辽宁省抚顺市东洲区', 2, '东洲区', ',465,499,', 499);\nINSERT INTO `area` VALUES (502, '2015-10-19 00:12:14', '2015-10-19 00:12:14', 0, 3, '辽宁省抚顺市望花区', 2, '望花区', ',465,499,', 499);\nINSERT INTO `area` VALUES (503, '2015-10-19 00:12:15', '2015-10-19 00:12:15', 0, 4, '辽宁省抚顺市顺城区', 2, '顺城区', ',465,499,', 499);\nINSERT INTO `area` VALUES (504, '2015-10-19 00:12:16', '2015-10-19 00:12:16', 0, 5, '辽宁省抚顺市抚顺县', 2, '抚顺县', ',465,499,', 499);\nINSERT INTO `area` VALUES (505, '2015-10-19 00:12:17', '2015-10-19 00:12:17', 0, 6, '辽宁省抚顺市新宾满族自治县', 2, '新宾满族自治县', ',465,499,', 499);\nINSERT INTO `area` VALUES (506, '2015-10-19 00:12:18', '2015-10-19 00:12:18', 0, 7, '辽宁省抚顺市清原满族自治县', 2, '清原满族自治县', ',465,499,', 499);\nINSERT INTO `area` VALUES (507, '2015-10-19 00:12:19', '2015-10-19 00:12:19', 0, 5, '辽宁省本溪市', 1, '本溪市', ',465,', 465);\nINSERT INTO `area` VALUES (508, '2015-10-19 00:12:20', '2015-10-19 00:12:20', 0, 1, '辽宁省本溪市平山区', 2, '平山区', ',465,507,', 507);\nINSERT INTO `area` VALUES (509, '2015-10-19 00:12:21', '2015-10-19 00:12:21', 0, 2, '辽宁省本溪市溪湖区', 2, '溪湖区', ',465,507,', 507);\nINSERT INTO `area` VALUES (510, '2015-10-19 00:12:22', '2015-10-19 00:12:22', 0, 3, '辽宁省本溪市明山区', 2, '明山区', ',465,507,', 507);\nINSERT INTO `area` VALUES (511, '2015-10-19 00:12:23', '2015-10-19 00:12:23', 0, 4, '辽宁省本溪市南芬区', 2, '南芬区', ',465,507,', 507);\nINSERT INTO `area` VALUES (512, '2015-10-19 00:12:24', '2015-10-19 00:12:24', 0, 5, '辽宁省本溪市本溪满族自治县', 2, '本溪满族自治县', ',465,507,', 507);\nINSERT INTO `area` VALUES (513, '2015-10-19 00:12:25', '2015-10-19 00:12:25', 0, 6, '辽宁省本溪市桓仁满族自治县', 2, '桓仁满族自治县', ',465,507,', 507);\nINSERT INTO `area` VALUES (514, '2015-10-19 00:12:26', '2015-10-19 00:12:26', 0, 6, '辽宁省丹东市', 1, '丹东市', ',465,', 465);\nINSERT INTO `area` VALUES (515, '2015-10-19 00:12:27', '2015-10-19 00:12:27', 0, 1, '辽宁省丹东市元宝区', 2, '元宝区', ',465,514,', 514);\nINSERT INTO `area` VALUES (516, '2015-10-19 00:12:28', '2015-10-19 00:12:28', 0, 2, '辽宁省丹东市振兴区', 2, '振兴区', ',465,514,', 514);\nINSERT INTO `area` VALUES (517, '2015-10-19 00:12:29', '2015-10-19 00:12:29', 0, 3, '辽宁省丹东市振安区', 2, '振安区', ',465,514,', 514);\nINSERT INTO `area` VALUES (518, '2015-10-19 00:12:30', '2015-10-19 00:12:30', 0, 4, '辽宁省丹东市宽甸满族自治县', 2, '宽甸满族自治县', ',465,514,', 514);\nINSERT INTO `area` VALUES (519, '2015-10-19 00:12:31', '2015-10-19 00:12:31', 0, 5, '辽宁省丹东市东港市', 2, '东港市', ',465,514,', 514);\nINSERT INTO `area` VALUES (520, '2015-10-19 00:12:32', '2015-10-19 00:12:32', 0, 6, '辽宁省丹东市凤城市', 2, '凤城市', ',465,514,', 514);\nINSERT INTO `area` VALUES (521, '2015-10-19 00:12:33', '2015-10-19 00:12:33', 0, 7, '辽宁省锦州市', 1, '锦州市', ',465,', 465);\nINSERT INTO `area` VALUES (522, '2015-10-19 00:12:34', '2015-10-19 00:12:34', 0, 1, '辽宁省锦州市古塔区', 2, '古塔区', ',465,521,', 521);\nINSERT INTO `area` VALUES (523, '2015-10-19 00:12:35', '2015-10-19 00:12:35', 0, 2, '辽宁省锦州市凌河区', 2, '凌河区', ',465,521,', 521);\nINSERT INTO `area` VALUES (524, '2015-10-19 00:12:36', '2015-10-19 00:12:36', 0, 3, '辽宁省锦州市太和区', 2, '太和区', ',465,521,', 521);\nINSERT INTO `area` VALUES (525, '2015-10-19 00:12:37', '2015-10-19 00:12:37', 0, 4, '辽宁省锦州市黑山县', 2, '黑山县', ',465,521,', 521);\nINSERT INTO `area` VALUES (526, '2015-10-19 00:12:38', '2015-10-19 00:12:38', 0, 5, '辽宁省锦州市义县', 2, '义县', ',465,521,', 521);\nINSERT INTO `area` VALUES (527, '2015-10-19 00:12:39', '2015-10-19 00:12:39', 0, 6, '辽宁省锦州市凌海市', 2, '凌海市', ',465,521,', 521);\nINSERT INTO `area` VALUES (528, '2015-10-19 00:12:40', '2015-10-19 00:12:40', 0, 7, '辽宁省锦州市北镇市', 2, '北镇市', ',465,521,', 521);\nINSERT INTO `area` VALUES (529, '2015-10-19 00:12:41', '2015-10-19 00:12:41', 0, 8, '辽宁省营口市', 1, '营口市', ',465,', 465);\nINSERT INTO `area` VALUES (530, '2015-10-19 00:12:42', '2015-10-19 00:12:42', 0, 1, '辽宁省营口市站前区', 2, '站前区', ',465,529,', 529);\nINSERT INTO `area` VALUES (531, '2015-10-19 00:12:43', '2015-10-19 00:12:43', 0, 2, '辽宁省营口市西市区', 2, '西市区', ',465,529,', 529);\nINSERT INTO `area` VALUES (532, '2015-10-19 00:12:44', '2015-10-19 00:12:44', 0, 3, '辽宁省营口市鲅鱼圈区', 2, '鲅鱼圈区', ',465,529,', 529);\nINSERT INTO `area` VALUES (533, '2015-10-19 00:12:45', '2015-10-19 00:12:45', 0, 4, '辽宁省营口市老边区', 2, '老边区', ',465,529,', 529);\nINSERT INTO `area` VALUES (534, '2015-10-19 00:12:46', '2015-10-19 00:12:46', 0, 5, '辽宁省营口市盖州市', 2, '盖州市', ',465,529,', 529);\nINSERT INTO `area` VALUES (535, '2015-10-19 00:12:47', '2015-10-19 00:12:47', 0, 6, '辽宁省营口市大石桥市', 2, '大石桥市', ',465,529,', 529);\nINSERT INTO `area` VALUES (536, '2015-10-19 00:12:48', '2015-10-19 00:12:48', 0, 9, '辽宁省阜新市', 1, '阜新市', ',465,', 465);\nINSERT INTO `area` VALUES (537, '2015-10-19 00:12:49', '2015-10-19 00:12:49', 0, 1, '辽宁省阜新市海州区', 2, '海州区', ',465,536,', 536);\nINSERT INTO `area` VALUES (538, '2015-10-19 00:12:50', '2015-10-19 00:12:50', 0, 2, '辽宁省阜新市新邱区', 2, '新邱区', ',465,536,', 536);\nINSERT INTO `area` VALUES (539, '2015-10-19 00:12:51', '2015-10-19 00:12:51', 0, 3, '辽宁省阜新市太平区', 2, '太平区', ',465,536,', 536);\nINSERT INTO `area` VALUES (540, '2015-10-19 00:12:52', '2015-10-19 00:12:52', 0, 4, '辽宁省阜新市清河门区', 2, '清河门区', ',465,536,', 536);\nINSERT INTO `area` VALUES (541, '2015-10-19 00:12:53', '2015-10-19 00:12:53', 0, 5, '辽宁省阜新市细河区', 2, '细河区', ',465,536,', 536);\nINSERT INTO `area` VALUES (542, '2015-10-19 00:12:54', '2015-10-19 00:12:54', 0, 6, '辽宁省阜新市阜新蒙古族自治县', 2, '阜新蒙古族自治县', ',465,536,', 536);\nINSERT INTO `area` VALUES (543, '2015-10-19 00:12:55', '2015-10-19 00:12:55', 0, 7, '辽宁省阜新市彰武县', 2, '彰武县', ',465,536,', 536);\nINSERT INTO `area` VALUES (544, '2015-10-19 00:12:56', '2015-10-19 00:12:56', 0, 10, '辽宁省辽阳市', 1, '辽阳市', ',465,', 465);\nINSERT INTO `area` VALUES (545, '2015-10-19 00:12:57', '2015-10-19 00:12:57', 0, 1, '辽宁省辽阳市白塔区', 2, '白塔区', ',465,544,', 544);\nINSERT INTO `area` VALUES (546, '2015-10-19 00:12:58', '2015-10-19 00:12:58', 0, 2, '辽宁省辽阳市文圣区', 2, '文圣区', ',465,544,', 544);\nINSERT INTO `area` VALUES (547, '2015-10-19 00:12:59', '2015-10-19 00:12:59', 0, 3, '辽宁省辽阳市宏伟区', 2, '宏伟区', ',465,544,', 544);\nINSERT INTO `area` VALUES (548, '2015-10-19 00:13:00', '2015-10-19 00:13:00', 0, 4, '辽宁省辽阳市弓长岭区', 2, '弓长岭区', ',465,544,', 544);\nINSERT INTO `area` VALUES (549, '2015-10-19 00:13:01', '2015-10-19 00:13:01', 0, 5, '辽宁省辽阳市太子河区', 2, '太子河区', ',465,544,', 544);\nINSERT INTO `area` VALUES (550, '2015-10-19 00:13:02', '2015-10-19 00:13:02', 0, 6, '辽宁省辽阳市辽阳县', 2, '辽阳县', ',465,544,', 544);\nINSERT INTO `area` VALUES (551, '2015-10-19 00:13:03', '2015-10-19 00:13:03', 0, 7, '辽宁省辽阳市灯塔市', 2, '灯塔市', ',465,544,', 544);\nINSERT INTO `area` VALUES (552, '2015-10-19 00:13:04', '2015-10-19 00:13:04', 0, 11, '辽宁省盘锦市', 1, '盘锦市', ',465,', 465);\nINSERT INTO `area` VALUES (553, '2015-10-19 00:13:05', '2015-10-19 00:13:05', 0, 1, '辽宁省盘锦市双台子区', 2, '双台子区', ',465,552,', 552);\nINSERT INTO `area` VALUES (554, '2015-10-19 00:13:06', '2015-10-19 00:13:06', 0, 2, '辽宁省盘锦市兴隆台区', 2, '兴隆台区', ',465,552,', 552);\nINSERT INTO `area` VALUES (555, '2015-10-19 00:13:07', '2015-10-19 00:13:07', 0, 3, '辽宁省盘锦市大洼县', 2, '大洼县', ',465,552,', 552);\nINSERT INTO `area` VALUES (556, '2015-10-19 00:13:08', '2015-10-19 00:13:08', 0, 4, '辽宁省盘锦市盘山县', 2, '盘山县', ',465,552,', 552);\nINSERT INTO `area` VALUES (557, '2015-10-19 00:13:09', '2015-10-19 00:13:09', 0, 12, '辽宁省铁岭市', 1, '铁岭市', ',465,', 465);\nINSERT INTO `area` VALUES (558, '2015-10-19 00:13:10', '2015-10-19 00:13:10', 0, 1, '辽宁省铁岭市银州区', 2, '银州区', ',465,557,', 557);\nINSERT INTO `area` VALUES (559, '2015-10-19 00:13:11', '2015-10-19 00:13:11', 0, 2, '辽宁省铁岭市清河区', 2, '清河区', ',465,557,', 557);\nINSERT INTO `area` VALUES (560, '2015-10-19 00:13:12', '2015-10-19 00:13:12', 0, 3, '辽宁省铁岭市铁岭县', 2, '铁岭县', ',465,557,', 557);\nINSERT INTO `area` VALUES (561, '2015-10-19 00:13:13', '2015-10-19 00:13:13', 0, 4, '辽宁省铁岭市西丰县', 2, '西丰县', ',465,557,', 557);\nINSERT INTO `area` VALUES (562, '2015-10-19 00:13:14', '2015-10-19 00:13:14', 0, 5, '辽宁省铁岭市昌图县', 2, '昌图县', ',465,557,', 557);\nINSERT INTO `area` VALUES (563, '2015-10-19 00:13:15', '2015-10-19 00:13:15', 0, 6, '辽宁省铁岭市调兵山市', 2, '调兵山市', ',465,557,', 557);\nINSERT INTO `area` VALUES (564, '2015-10-19 00:13:16', '2015-10-19 00:13:16', 0, 7, '辽宁省铁岭市开原市', 2, '开原市', ',465,557,', 557);\nINSERT INTO `area` VALUES (565, '2015-10-19 00:13:17', '2015-10-19 00:13:17', 0, 13, '辽宁省朝阳市', 1, '朝阳市', ',465,', 465);\nINSERT INTO `area` VALUES (566, '2015-10-19 00:13:18', '2015-10-19 00:13:18', 0, 1, '辽宁省朝阳市双塔区', 2, '双塔区', ',465,565,', 565);\nINSERT INTO `area` VALUES (567, '2015-10-19 00:13:19', '2015-10-19 00:13:19', 0, 2, '辽宁省朝阳市龙城区', 2, '龙城区', ',465,565,', 565);\nINSERT INTO `area` VALUES (568, '2015-10-19 00:13:20', '2015-10-19 00:13:20', 0, 3, '辽宁省朝阳市朝阳县', 2, '朝阳县', ',465,565,', 565);\nINSERT INTO `area` VALUES (569, '2015-10-19 00:13:21', '2015-10-19 00:13:21', 0, 4, '辽宁省朝阳市建平县', 2, '建平县', ',465,565,', 565);\nINSERT INTO `area` VALUES (570, '2015-10-19 00:13:22', '2015-10-19 00:13:22', 0, 5, '辽宁省朝阳市喀喇沁左翼蒙古族自治县', 2, '喀喇沁左翼蒙古族自治县', ',465,565,', 565);\nINSERT INTO `area` VALUES (571, '2015-10-19 00:13:23', '2015-10-19 00:13:23', 0, 6, '辽宁省朝阳市北票市', 2, '北票市', ',465,565,', 565);\nINSERT INTO `area` VALUES (572, '2015-10-19 00:13:24', '2015-10-19 00:13:24', 0, 7, '辽宁省朝阳市凌源市', 2, '凌源市', ',465,565,', 565);\nINSERT INTO `area` VALUES (573, '2015-10-19 00:13:25', '2015-10-19 00:13:25', 0, 14, '辽宁省葫芦岛市', 1, '葫芦岛市', ',465,', 465);\nINSERT INTO `area` VALUES (574, '2015-10-19 00:13:26', '2015-10-19 00:13:26', 0, 1, '辽宁省葫芦岛市连山区', 2, '连山区', ',465,573,', 573);\nINSERT INTO `area` VALUES (575, '2015-10-19 00:13:27', '2015-10-19 00:13:27', 0, 2, '辽宁省葫芦岛市龙港区', 2, '龙港区', ',465,573,', 573);\nINSERT INTO `area` VALUES (576, '2015-10-19 00:13:28', '2015-10-19 00:13:28', 0, 3, '辽宁省葫芦岛市南票区', 2, '南票区', ',465,573,', 573);\nINSERT INTO `area` VALUES (577, '2015-10-19 00:13:29', '2015-10-19 00:13:29', 0, 4, '辽宁省葫芦岛市绥中县', 2, '绥中县', ',465,573,', 573);\nINSERT INTO `area` VALUES (578, '2015-10-19 00:13:30', '2015-10-19 00:13:30', 0, 5, '辽宁省葫芦岛市建昌县', 2, '建昌县', ',465,573,', 573);\nINSERT INTO `area` VALUES (579, '2015-10-19 00:13:31', '2015-10-19 00:13:31', 0, 6, '辽宁省葫芦岛市兴城市', 2, '兴城市', ',465,573,', 573);\nINSERT INTO `area` VALUES (580, '2015-10-19 00:13:32', '2015-10-19 00:13:32', 0, 7, '吉林省', 0, '吉林省', ',', NULL);\nINSERT INTO `area` VALUES (581, '2015-10-19 00:13:33', '2015-10-19 00:13:33', 0, 1, '吉林省长春市', 1, '长春市', ',580,', 580);\nINSERT INTO `area` VALUES (582, '2015-10-19 00:13:34', '2015-10-19 00:13:34', 0, 1, '吉林省长春市南关区', 2, '南关区', ',580,581,', 581);\nINSERT INTO `area` VALUES (583, '2015-10-19 00:13:35', '2015-10-19 00:13:35', 0, 2, '吉林省长春市宽城区', 2, '宽城区', ',580,581,', 581);\nINSERT INTO `area` VALUES (584, '2015-10-19 00:13:36', '2015-10-19 00:13:36', 0, 3, '吉林省长春市朝阳区', 2, '朝阳区', ',580,581,', 581);\nINSERT INTO `area` VALUES (585, '2015-10-19 00:13:37', '2015-10-19 00:13:37', 0, 4, '吉林省长春市二道区', 2, '二道区', ',580,581,', 581);\nINSERT INTO `area` VALUES (586, '2015-10-19 00:13:38', '2015-10-19 00:13:38', 0, 5, '吉林省长春市绿园区', 2, '绿园区', ',580,581,', 581);\nINSERT INTO `area` VALUES (587, '2015-10-19 00:13:39', '2015-10-19 00:13:39', 0, 6, '吉林省长春市双阳区', 2, '双阳区', ',580,581,', 581);\nINSERT INTO `area` VALUES (588, '2015-10-19 00:13:40', '2015-10-19 00:13:40', 0, 7, '吉林省长春市农安县', 2, '农安县', ',580,581,', 581);\nINSERT INTO `area` VALUES (589, '2015-10-19 00:13:41', '2015-10-19 00:13:41', 0, 8, '吉林省长春市九台市', 2, '九台市', ',580,581,', 581);\nINSERT INTO `area` VALUES (590, '2015-10-19 00:13:42', '2015-10-19 00:13:42', 0, 9, '吉林省长春市榆树市', 2, '榆树市', ',580,581,', 581);\nINSERT INTO `area` VALUES (591, '2015-10-19 00:13:43', '2015-10-19 00:13:43', 0, 10, '吉林省长春市德惠市', 2, '德惠市', ',580,581,', 581);\nINSERT INTO `area` VALUES (592, '2015-10-19 00:13:44', '2015-10-19 00:13:44', 0, 2, '吉林省吉林市', 1, '吉林市', ',580,', 580);\nINSERT INTO `area` VALUES (593, '2015-10-19 00:13:45', '2015-10-19 00:13:45', 0, 1, '吉林省吉林市昌邑区', 2, '昌邑区', ',580,592,', 592);\nINSERT INTO `area` VALUES (594, '2015-10-19 00:13:46', '2015-10-19 00:13:46', 0, 2, '吉林省吉林市龙潭区', 2, '龙潭区', ',580,592,', 592);\nINSERT INTO `area` VALUES (595, '2015-10-19 00:13:47', '2015-10-19 00:13:47', 0, 3, '吉林省吉林市船营区', 2, '船营区', ',580,592,', 592);\nINSERT INTO `area` VALUES (596, '2015-10-19 00:13:48', '2015-10-19 00:13:48', 0, 4, '吉林省吉林市丰满区', 2, '丰满区', ',580,592,', 592);\nINSERT INTO `area` VALUES (597, '2015-10-19 00:13:49', '2015-10-19 00:13:49', 0, 5, '吉林省吉林市永吉县', 2, '永吉县', ',580,592,', 592);\nINSERT INTO `area` VALUES (598, '2015-10-19 00:13:50', '2015-10-19 00:13:50', 0, 6, '吉林省吉林市蛟河市', 2, '蛟河市', ',580,592,', 592);\nINSERT INTO `area` VALUES (599, '2015-10-19 00:13:51', '2015-10-19 00:13:51', 0, 7, '吉林省吉林市桦甸市', 2, '桦甸市', ',580,592,', 592);\nINSERT INTO `area` VALUES (600, '2015-10-19 00:13:52', '2015-10-19 00:13:52', 0, 8, '吉林省吉林市舒兰市', 2, '舒兰市', ',580,592,', 592);\nINSERT INTO `area` VALUES (601, '2015-10-19 00:13:53', '2015-10-19 00:13:53', 0, 9, '吉林省吉林市磐石市', 2, '磐石市', ',580,592,', 592);\nINSERT INTO `area` VALUES (602, '2015-10-19 00:13:54', '2015-10-19 00:13:54', 0, 3, '吉林省四平市', 1, '四平市', ',580,', 580);\nINSERT INTO `area` VALUES (603, '2015-10-19 00:13:55', '2015-10-19 00:13:55', 0, 1, '吉林省四平市铁西区', 2, '铁西区', ',580,602,', 602);\nINSERT INTO `area` VALUES (604, '2015-10-19 00:13:56', '2015-10-19 00:13:56', 0, 2, '吉林省四平市铁东区', 2, '铁东区', ',580,602,', 602);\nINSERT INTO `area` VALUES (605, '2015-10-19 00:13:57', '2015-10-19 00:13:57', 0, 3, '吉林省四平市梨树县', 2, '梨树县', ',580,602,', 602);\nINSERT INTO `area` VALUES (606, '2015-10-19 00:13:58', '2015-10-19 00:13:58', 0, 4, '吉林省四平市伊通满族自治县', 2, '伊通满族自治县', ',580,602,', 602);\nINSERT INTO `area` VALUES (607, '2015-10-19 00:13:59', '2015-10-19 00:13:59', 0, 5, '吉林省四平市公主岭市', 2, '公主岭市', ',580,602,', 602);\nINSERT INTO `area` VALUES (608, '2015-10-19 00:14:00', '2015-10-19 00:14:00', 0, 6, '吉林省四平市双辽市', 2, '双辽市', ',580,602,', 602);\nINSERT INTO `area` VALUES (609, '2015-10-19 00:14:01', '2015-10-19 00:14:01', 0, 4, '吉林省辽源市', 1, '辽源市', ',580,', 580);\nINSERT INTO `area` VALUES (610, '2015-10-19 00:14:02', '2015-10-19 00:14:02', 0, 1, '吉林省辽源市龙山区', 2, '龙山区', ',580,609,', 609);\nINSERT INTO `area` VALUES (611, '2015-10-19 00:14:03', '2015-10-19 00:14:03', 0, 2, '吉林省辽源市西安区', 2, '西安区', ',580,609,', 609);\nINSERT INTO `area` VALUES (612, '2015-10-19 00:14:04', '2015-10-19 00:14:04', 0, 3, '吉林省辽源市东丰县', 2, '东丰县', ',580,609,', 609);\nINSERT INTO `area` VALUES (613, '2015-10-19 00:14:05', '2015-10-19 00:14:05', 0, 4, '吉林省辽源市东辽县', 2, '东辽县', ',580,609,', 609);\nINSERT INTO `area` VALUES (614, '2015-10-19 00:14:06', '2015-10-19 00:14:06', 0, 5, '吉林省通化市', 1, '通化市', ',580,', 580);\nINSERT INTO `area` VALUES (615, '2015-10-19 00:14:07', '2015-10-19 00:14:07', 0, 1, '吉林省通化市东昌区', 2, '东昌区', ',580,614,', 614);\nINSERT INTO `area` VALUES (616, '2015-10-19 00:14:08', '2015-10-19 00:14:08', 0, 2, '吉林省通化市二道江区', 2, '二道江区', ',580,614,', 614);\nINSERT INTO `area` VALUES (617, '2015-10-19 00:14:09', '2015-10-19 00:14:09', 0, 3, '吉林省通化市通化县', 2, '通化县', ',580,614,', 614);\nINSERT INTO `area` VALUES (618, '2015-10-19 00:14:10', '2015-10-19 00:14:10', 0, 4, '吉林省通化市辉南县', 2, '辉南县', ',580,614,', 614);\nINSERT INTO `area` VALUES (619, '2015-10-19 00:14:11', '2015-10-19 00:14:11', 0, 5, '吉林省通化市柳河县', 2, '柳河县', ',580,614,', 614);\nINSERT INTO `area` VALUES (620, '2015-10-19 00:14:12', '2015-10-19 00:14:12', 0, 6, '吉林省通化市梅河口市', 2, '梅河口市', ',580,614,', 614);\nINSERT INTO `area` VALUES (621, '2015-10-19 00:14:13', '2015-10-19 00:14:13', 0, 7, '吉林省通化市集安市', 2, '集安市', ',580,614,', 614);\nINSERT INTO `area` VALUES (622, '2015-10-19 00:14:14', '2015-10-19 00:14:14', 0, 6, '吉林省白山市', 1, '白山市', ',580,', 580);\nINSERT INTO `area` VALUES (623, '2015-10-19 00:14:15', '2015-10-19 00:14:15', 0, 1, '吉林省白山市浑江区', 2, '浑江区', ',580,622,', 622);\nINSERT INTO `area` VALUES (624, '2015-10-19 00:14:16', '2015-10-19 00:14:16', 0, 2, '吉林省白山市江源区', 2, '江源区', ',580,622,', 622);\nINSERT INTO `area` VALUES (625, '2015-10-19 00:14:17', '2015-10-19 00:14:17', 0, 3, '吉林省白山市抚松县', 2, '抚松县', ',580,622,', 622);\nINSERT INTO `area` VALUES (626, '2015-10-19 00:14:18', '2015-10-19 00:14:18', 0, 4, '吉林省白山市靖宇县', 2, '靖宇县', ',580,622,', 622);\nINSERT INTO `area` VALUES (627, '2015-10-19 00:14:19', '2015-10-19 00:14:19', 0, 5, '吉林省白山市长白朝鲜族自治县', 2, '长白朝鲜族自治县', ',580,622,', 622);\nINSERT INTO `area` VALUES (628, '2015-10-19 00:14:20', '2015-10-19 00:14:20', 0, 6, '吉林省白山市临江市', 2, '临江市', ',580,622,', 622);\nINSERT INTO `area` VALUES (629, '2015-10-19 00:14:21', '2015-10-19 00:14:21', 0, 7, '吉林省松原市', 1, '松原市', ',580,', 580);\nINSERT INTO `area` VALUES (630, '2015-10-19 00:14:22', '2015-10-19 00:14:22', 0, 1, '吉林省松原市宁江区', 2, '宁江区', ',580,629,', 629);\nINSERT INTO `area` VALUES (631, '2015-10-19 00:14:23', '2015-10-19 00:14:23', 0, 2, '吉林省松原市前郭尔罗斯蒙古族自治县', 2, '前郭尔罗斯蒙古族自治县', ',580,629,', 629);\nINSERT INTO `area` VALUES (632, '2015-10-19 00:14:24', '2015-10-19 00:14:24', 0, 3, '吉林省松原市长岭县', 2, '长岭县', ',580,629,', 629);\nINSERT INTO `area` VALUES (633, '2015-10-19 00:14:25', '2015-10-19 00:14:25', 0, 4, '吉林省松原市乾安县', 2, '乾安县', ',580,629,', 629);\nINSERT INTO `area` VALUES (634, '2015-10-19 00:14:26', '2015-10-19 00:14:26', 0, 5, '吉林省松原市扶余市', 2, '扶余市', ',580,629,', 629);\nINSERT INTO `area` VALUES (635, '2015-10-19 00:14:27', '2015-10-19 00:14:27', 0, 8, '吉林省白城市', 1, '白城市', ',580,', 580);\nINSERT INTO `area` VALUES (636, '2015-10-19 00:14:28', '2015-10-19 00:14:28', 0, 1, '吉林省白城市洮北区', 2, '洮北区', ',580,635,', 635);\nINSERT INTO `area` VALUES (637, '2015-10-19 00:14:29', '2015-10-19 00:14:29', 0, 2, '吉林省白城市镇赉县', 2, '镇赉县', ',580,635,', 635);\nINSERT INTO `area` VALUES (638, '2015-10-19 00:14:30', '2015-10-19 00:14:30', 0, 3, '吉林省白城市通榆县', 2, '通榆县', ',580,635,', 635);\nINSERT INTO `area` VALUES (639, '2015-10-19 00:14:31', '2015-10-19 00:14:31', 0, 4, '吉林省白城市洮南市', 2, '洮南市', ',580,635,', 635);\nINSERT INTO `area` VALUES (640, '2015-10-19 00:14:32', '2015-10-19 00:14:32', 0, 5, '吉林省白城市大安市', 2, '大安市', ',580,635,', 635);\nINSERT INTO `area` VALUES (641, '2015-10-19 00:14:33', '2015-10-19 00:14:33', 0, 9, '吉林省延边朝鲜族自治州', 1, '延边朝鲜族自治州', ',580,', 580);\nINSERT INTO `area` VALUES (642, '2015-10-19 00:14:34', '2015-10-19 00:14:34', 0, 1, '吉林省延边朝鲜族自治州延吉市', 2, '延吉市', ',580,641,', 641);\nINSERT INTO `area` VALUES (643, '2015-10-19 00:14:35', '2015-10-19 00:14:35', 0, 2, '吉林省延边朝鲜族自治州图们市', 2, '图们市', ',580,641,', 641);\nINSERT INTO `area` VALUES (644, '2015-10-19 00:14:36', '2015-10-19 00:14:36', 0, 3, '吉林省延边朝鲜族自治州敦化市', 2, '敦化市', ',580,641,', 641);\nINSERT INTO `area` VALUES (645, '2015-10-19 00:14:37', '2015-10-19 00:14:37', 0, 4, '吉林省延边朝鲜族自治州珲春市', 2, '珲春市', ',580,641,', 641);\nINSERT INTO `area` VALUES (646, '2015-10-19 00:14:38', '2015-10-19 00:14:38', 0, 5, '吉林省延边朝鲜族自治州龙井市', 2, '龙井市', ',580,641,', 641);\nINSERT INTO `area` VALUES (647, '2015-10-19 00:14:39', '2015-10-19 00:14:39', 0, 6, '吉林省延边朝鲜族自治州和龙市', 2, '和龙市', ',580,641,', 641);\nINSERT INTO `area` VALUES (648, '2015-10-19 00:14:40', '2015-10-19 00:14:40', 0, 7, '吉林省延边朝鲜族自治州汪清县', 2, '汪清县', ',580,641,', 641);\nINSERT INTO `area` VALUES (649, '2015-10-19 00:14:41', '2015-10-19 00:14:41', 0, 8, '吉林省延边朝鲜族自治州安图县', 2, '安图县', ',580,641,', 641);\nINSERT INTO `area` VALUES (650, '2015-10-19 00:14:42', '2015-10-19 00:14:42', 0, 8, '黑龙江省', 0, '黑龙江省', ',', NULL);\nINSERT INTO `area` VALUES (651, '2015-10-19 00:14:43', '2015-10-19 00:14:43', 0, 1, '黑龙江省哈尔滨市', 1, '哈尔滨市', ',650,', 650);\nINSERT INTO `area` VALUES (652, '2015-10-19 00:14:44', '2015-10-19 00:14:44', 0, 1, '黑龙江省哈尔滨市道里区', 2, '道里区', ',650,651,', 651);\nINSERT INTO `area` VALUES (653, '2015-10-19 00:14:45', '2015-10-19 00:14:45', 0, 2, '黑龙江省哈尔滨市南岗区', 2, '南岗区', ',650,651,', 651);\nINSERT INTO `area` VALUES (654, '2015-10-19 00:14:46', '2015-10-19 00:14:46', 0, 3, '黑龙江省哈尔滨市道外区', 2, '道外区', ',650,651,', 651);\nINSERT INTO `area` VALUES (655, '2015-10-19 00:14:47', '2015-10-19 00:14:47', 0, 4, '黑龙江省哈尔滨市平房区', 2, '平房区', ',650,651,', 651);\nINSERT INTO `area` VALUES (656, '2015-10-19 00:14:48', '2015-10-19 00:14:48', 0, 5, '黑龙江省哈尔滨市松北区', 2, '松北区', ',650,651,', 651);\nINSERT INTO `area` VALUES (657, '2015-10-19 00:14:49', '2015-10-19 00:14:49', 0, 6, '黑龙江省哈尔滨市香坊区', 2, '香坊区', ',650,651,', 651);\nINSERT INTO `area` VALUES (658, '2015-10-19 00:14:50', '2015-10-19 00:14:50', 0, 7, '黑龙江省哈尔滨市呼兰区', 2, '呼兰区', ',650,651,', 651);\nINSERT INTO `area` VALUES (659, '2015-10-19 00:14:51', '2015-10-19 00:14:51', 0, 8, '黑龙江省哈尔滨市阿城区', 2, '阿城区', ',650,651,', 651);\nINSERT INTO `area` VALUES (660, '2015-10-19 00:14:52', '2015-10-19 00:14:52', 0, 9, '黑龙江省哈尔滨市依兰县', 2, '依兰县', ',650,651,', 651);\nINSERT INTO `area` VALUES (661, '2015-10-19 00:14:53', '2015-10-19 00:14:53', 0, 10, '黑龙江省哈尔滨市方正县', 2, '方正县', ',650,651,', 651);\nINSERT INTO `area` VALUES (662, '2015-10-19 00:14:54', '2015-10-19 00:14:54', 0, 11, '黑龙江省哈尔滨市宾县', 2, '宾县', ',650,651,', 651);\nINSERT INTO `area` VALUES (663, '2015-10-19 00:14:55', '2015-10-19 00:14:55', 0, 12, '黑龙江省哈尔滨市巴彦县', 2, '巴彦县', ',650,651,', 651);\nINSERT INTO `area` VALUES (664, '2015-10-19 00:14:56', '2015-10-19 00:14:56', 0, 13, '黑龙江省哈尔滨市木兰县', 2, '木兰县', ',650,651,', 651);\nINSERT INTO `area` VALUES (665, '2015-10-19 00:14:57', '2015-10-19 00:14:57', 0, 14, '黑龙江省哈尔滨市通河县', 2, '通河县', ',650,651,', 651);\nINSERT INTO `area` VALUES (666, '2015-10-19 00:14:58', '2015-10-19 00:14:58', 0, 15, '黑龙江省哈尔滨市延寿县', 2, '延寿县', ',650,651,', 651);\nINSERT INTO `area` VALUES (667, '2015-10-19 00:14:59', '2015-10-19 00:14:59', 0, 16, '黑龙江省哈尔滨市双城市', 2, '双城市', ',650,651,', 651);\nINSERT INTO `area` VALUES (668, '2015-10-19 00:15:00', '2015-10-19 00:15:00', 0, 17, '黑龙江省哈尔滨市尚志市', 2, '尚志市', ',650,651,', 651);\nINSERT INTO `area` VALUES (669, '2015-10-19 00:15:01', '2015-10-19 00:15:01', 0, 18, '黑龙江省哈尔滨市五常市', 2, '五常市', ',650,651,', 651);\nINSERT INTO `area` VALUES (670, '2015-10-19 00:15:02', '2015-10-19 00:15:02', 0, 2, '黑龙江省齐齐哈尔市', 1, '齐齐哈尔市', ',650,', 650);\nINSERT INTO `area` VALUES (671, '2015-10-19 00:15:03', '2015-10-19 00:15:03', 0, 1, '黑龙江省齐齐哈尔市龙沙区', 2, '龙沙区', ',650,670,', 670);\nINSERT INTO `area` VALUES (672, '2015-10-19 00:15:04', '2015-10-19 00:15:04', 0, 2, '黑龙江省齐齐哈尔市建华区', 2, '建华区', ',650,670,', 670);\nINSERT INTO `area` VALUES (673, '2015-10-19 00:15:05', '2015-10-19 00:15:05', 0, 3, '黑龙江省齐齐哈尔市铁锋区', 2, '铁锋区', ',650,670,', 670);\nINSERT INTO `area` VALUES (674, '2015-10-19 00:15:06', '2015-10-19 00:15:06', 0, 4, '黑龙江省齐齐哈尔市昂昂溪区', 2, '昂昂溪区', ',650,670,', 670);\nINSERT INTO `area` VALUES (675, '2015-10-19 00:15:07', '2015-10-19 00:15:07', 0, 5, '黑龙江省齐齐哈尔市富拉尔基区', 2, '富拉尔基区', ',650,670,', 670);\nINSERT INTO `area` VALUES (676, '2015-10-19 00:15:08', '2015-10-19 00:15:08', 0, 6, '黑龙江省齐齐哈尔市碾子山区', 2, '碾子山区', ',650,670,', 670);\nINSERT INTO `area` VALUES (677, '2015-10-19 00:15:09', '2015-10-19 00:15:09', 0, 7, '黑龙江省齐齐哈尔市梅里斯达斡尔族区', 2, '梅里斯达斡尔族区', ',650,670,', 670);\nINSERT INTO `area` VALUES (678, '2015-10-19 00:15:10', '2015-10-19 00:15:10', 0, 8, '黑龙江省齐齐哈尔市龙江县', 2, '龙江县', ',650,670,', 670);\nINSERT INTO `area` VALUES (679, '2015-10-19 00:15:11', '2015-10-19 00:15:11', 0, 9, '黑龙江省齐齐哈尔市依安县', 2, '依安县', ',650,670,', 670);\nINSERT INTO `area` VALUES (680, '2015-10-19 00:15:12', '2015-10-19 00:15:12', 0, 10, '黑龙江省齐齐哈尔市泰来县', 2, '泰来县', ',650,670,', 670);\nINSERT INTO `area` VALUES (681, '2015-10-19 00:15:13', '2015-10-19 00:15:13', 0, 11, '黑龙江省齐齐哈尔市甘南县', 2, '甘南县', ',650,670,', 670);\nINSERT INTO `area` VALUES (682, '2015-10-19 00:15:14', '2015-10-19 00:15:14', 0, 12, '黑龙江省齐齐哈尔市富裕县', 2, '富裕县', ',650,670,', 670);\nINSERT INTO `area` VALUES (683, '2015-10-19 00:15:15', '2015-10-19 00:15:15', 0, 13, '黑龙江省齐齐哈尔市克山县', 2, '克山县', ',650,670,', 670);\nINSERT INTO `area` VALUES (684, '2015-10-19 00:15:16', '2015-10-19 00:15:16', 0, 14, '黑龙江省齐齐哈尔市克东县', 2, '克东县', ',650,670,', 670);\nINSERT INTO `area` VALUES (685, '2015-10-19 00:15:17', '2015-10-19 00:15:17', 0, 15, '黑龙江省齐齐哈尔市拜泉县', 2, '拜泉县', ',650,670,', 670);\nINSERT INTO `area` VALUES (686, '2015-10-19 00:15:18', '2015-10-19 00:15:18', 0, 16, '黑龙江省齐齐哈尔市讷河市', 2, '讷河市', ',650,670,', 670);\nINSERT INTO `area` VALUES (687, '2015-10-19 00:15:19', '2015-10-19 00:15:19', 0, 3, '黑龙江省鸡西市', 1, '鸡西市', ',650,', 650);\nINSERT INTO `area` VALUES (688, '2015-10-19 00:15:20', '2015-10-19 00:15:20', 0, 1, '黑龙江省鸡西市鸡冠区', 2, '鸡冠区', ',650,687,', 687);\nINSERT INTO `area` VALUES (689, '2015-10-19 00:15:21', '2015-10-19 00:15:21', 0, 2, '黑龙江省鸡西市恒山区', 2, '恒山区', ',650,687,', 687);\nINSERT INTO `area` VALUES (690, '2015-10-19 00:15:22', '2015-10-19 00:15:22', 0, 3, '黑龙江省鸡西市滴道区', 2, '滴道区', ',650,687,', 687);\nINSERT INTO `area` VALUES (691, '2015-10-19 00:15:23', '2015-10-19 00:15:23', 0, 4, '黑龙江省鸡西市梨树区', 2, '梨树区', ',650,687,', 687);\nINSERT INTO `area` VALUES (692, '2015-10-19 00:15:24', '2015-10-19 00:15:24', 0, 5, '黑龙江省鸡西市城子河区', 2, '城子河区', ',650,687,', 687);\nINSERT INTO `area` VALUES (693, '2015-10-19 00:15:25', '2015-10-19 00:15:25', 0, 6, '黑龙江省鸡西市麻山区', 2, '麻山区', ',650,687,', 687);\nINSERT INTO `area` VALUES (694, '2015-10-19 00:15:26', '2015-10-19 00:15:26', 0, 7, '黑龙江省鸡西市鸡东县', 2, '鸡东县', ',650,687,', 687);\nINSERT INTO `area` VALUES (695, '2015-10-19 00:15:27', '2015-10-19 00:15:27', 0, 8, '黑龙江省鸡西市虎林市', 2, '虎林市', ',650,687,', 687);\nINSERT INTO `area` VALUES (696, '2015-10-19 00:15:28', '2015-10-19 00:15:28', 0, 9, '黑龙江省鸡西市密山市', 2, '密山市', ',650,687,', 687);\nINSERT INTO `area` VALUES (697, '2015-10-19 00:15:29', '2015-10-19 00:15:29', 0, 4, '黑龙江省鹤岗市', 1, '鹤岗市', ',650,', 650);\nINSERT INTO `area` VALUES (698, '2015-10-19 00:15:30', '2015-10-19 00:15:30', 0, 1, '黑龙江省鹤岗市向阳区', 2, '向阳区', ',650,697,', 697);\nINSERT INTO `area` VALUES (699, '2015-10-19 00:15:31', '2015-10-19 00:15:31', 0, 2, '黑龙江省鹤岗市工农区', 2, '工农区', ',650,697,', 697);\nINSERT INTO `area` VALUES (700, '2015-10-19 00:15:32', '2015-10-19 00:15:32', 0, 3, '黑龙江省鹤岗市南山区', 2, '南山区', ',650,697,', 697);\nINSERT INTO `area` VALUES (701, '2015-10-19 00:15:33', '2015-10-19 00:15:33', 0, 4, '黑龙江省鹤岗市兴安区', 2, '兴安区', ',650,697,', 697);\nINSERT INTO `area` VALUES (702, '2015-10-19 00:15:34', '2015-10-19 00:15:34', 0, 5, '黑龙江省鹤岗市东山区', 2, '东山区', ',650,697,', 697);\nINSERT INTO `area` VALUES (703, '2015-10-19 00:15:35', '2015-10-19 00:15:35', 0, 6, '黑龙江省鹤岗市兴山区', 2, '兴山区', ',650,697,', 697);\nINSERT INTO `area` VALUES (704, '2015-10-19 00:15:36', '2015-10-19 00:15:36', 0, 7, '黑龙江省鹤岗市萝北县', 2, '萝北县', ',650,697,', 697);\nINSERT INTO `area` VALUES (705, '2015-10-19 00:15:37', '2015-10-19 00:15:37', 0, 8, '黑龙江省鹤岗市绥滨县', 2, '绥滨县', ',650,697,', 697);\nINSERT INTO `area` VALUES (706, '2015-10-19 00:15:38', '2015-10-19 00:15:38', 0, 5, '黑龙江省双鸭山市', 1, '双鸭山市', ',650,', 650);\nINSERT INTO `area` VALUES (707, '2015-10-19 00:15:39', '2015-10-19 00:15:39', 0, 1, '黑龙江省双鸭山市尖山区', 2, '尖山区', ',650,706,', 706);\nINSERT INTO `area` VALUES (708, '2015-10-19 00:15:40', '2015-10-19 00:15:40', 0, 2, '黑龙江省双鸭山市岭东区', 2, '岭东区', ',650,706,', 706);\nINSERT INTO `area` VALUES (709, '2015-10-19 00:15:41', '2015-10-19 00:15:41', 0, 3, '黑龙江省双鸭山市四方台区', 2, '四方台区', ',650,706,', 706);\nINSERT INTO `area` VALUES (710, '2015-10-19 00:15:42', '2015-10-19 00:15:42', 0, 4, '黑龙江省双鸭山市宝山区', 2, '宝山区', ',650,706,', 706);\nINSERT INTO `area` VALUES (711, '2015-10-19 00:15:43', '2015-10-19 00:15:43', 0, 5, '黑龙江省双鸭山市集贤县', 2, '集贤县', ',650,706,', 706);\nINSERT INTO `area` VALUES (712, '2015-10-19 00:15:44', '2015-10-19 00:15:44', 0, 6, '黑龙江省双鸭山市友谊县', 2, '友谊县', ',650,706,', 706);\nINSERT INTO `area` VALUES (713, '2015-10-19 00:15:45', '2015-10-19 00:15:45', 0, 7, '黑龙江省双鸭山市宝清县', 2, '宝清县', ',650,706,', 706);\nINSERT INTO `area` VALUES (714, '2015-10-19 00:15:46', '2015-10-19 00:15:46', 0, 8, '黑龙江省双鸭山市饶河县', 2, '饶河县', ',650,706,', 706);\nINSERT INTO `area` VALUES (715, '2015-10-19 00:15:47', '2015-10-19 00:15:47', 0, 6, '黑龙江省大庆市', 1, '大庆市', ',650,', 650);\nINSERT INTO `area` VALUES (716, '2015-10-19 00:15:48', '2015-10-19 00:15:48', 0, 1, '黑龙江省大庆市萨尔图区', 2, '萨尔图区', ',650,715,', 715);\nINSERT INTO `area` VALUES (717, '2015-10-19 00:15:49', '2015-10-19 00:15:49', 0, 2, '黑龙江省大庆市龙凤区', 2, '龙凤区', ',650,715,', 715);\nINSERT INTO `area` VALUES (718, '2015-10-19 00:15:50', '2015-10-19 00:15:50', 0, 3, '黑龙江省大庆市让胡路区', 2, '让胡路区', ',650,715,', 715);\nINSERT INTO `area` VALUES (719, '2015-10-19 00:15:51', '2015-10-19 00:15:51', 0, 4, '黑龙江省大庆市红岗区', 2, '红岗区', ',650,715,', 715);\nINSERT INTO `area` VALUES (720, '2015-10-19 00:15:52', '2015-10-19 00:15:52', 0, 5, '黑龙江省大庆市大同区', 2, '大同区', ',650,715,', 715);\nINSERT INTO `area` VALUES (721, '2015-10-19 00:15:53', '2015-10-19 00:15:53', 0, 6, '黑龙江省大庆市肇州县', 2, '肇州县', ',650,715,', 715);\nINSERT INTO `area` VALUES (722, '2015-10-19 00:15:54', '2015-10-19 00:15:54', 0, 7, '黑龙江省大庆市肇源县', 2, '肇源县', ',650,715,', 715);\nINSERT INTO `area` VALUES (723, '2015-10-19 00:15:55', '2015-10-19 00:15:55', 0, 8, '黑龙江省大庆市林甸县', 2, '林甸县', ',650,715,', 715);\nINSERT INTO `area` VALUES (724, '2015-10-19 00:15:56', '2015-10-19 00:15:56', 0, 9, '黑龙江省大庆市杜尔伯特蒙古族自治县', 2, '杜尔伯特蒙古族自治县', ',650,715,', 715);\nINSERT INTO `area` VALUES (725, '2015-10-19 00:15:57', '2015-10-19 00:15:57', 0, 7, '黑龙江省伊春市', 1, '伊春市', ',650,', 650);\nINSERT INTO `area` VALUES (726, '2015-10-19 00:15:58', '2015-10-19 00:15:58', 0, 1, '黑龙江省伊春市伊春区', 2, '伊春区', ',650,725,', 725);\nINSERT INTO `area` VALUES (727, '2015-10-19 00:15:59', '2015-10-19 00:15:59', 0, 2, '黑龙江省伊春市南岔区', 2, '南岔区', ',650,725,', 725);\nINSERT INTO `area` VALUES (728, '2015-10-19 00:16:00', '2015-10-19 00:16:00', 0, 3, '黑龙江省伊春市友好区', 2, '友好区', ',650,725,', 725);\nINSERT INTO `area` VALUES (729, '2015-10-19 00:16:01', '2015-10-19 00:16:01', 0, 4, '黑龙江省伊春市西林区', 2, '西林区', ',650,725,', 725);\nINSERT INTO `area` VALUES (730, '2015-10-19 00:16:02', '2015-10-19 00:16:02', 0, 5, '黑龙江省伊春市翠峦区', 2, '翠峦区', ',650,725,', 725);\nINSERT INTO `area` VALUES (731, '2015-10-19 00:16:03', '2015-10-19 00:16:03', 0, 6, '黑龙江省伊春市新青区', 2, '新青区', ',650,725,', 725);\nINSERT INTO `area` VALUES (732, '2015-10-19 00:16:04', '2015-10-19 00:16:04', 0, 7, '黑龙江省伊春市美溪区', 2, '美溪区', ',650,725,', 725);\nINSERT INTO `area` VALUES (733, '2015-10-19 00:16:05', '2015-10-19 00:16:05', 0, 8, '黑龙江省伊春市金山屯区', 2, '金山屯区', ',650,725,', 725);\nINSERT INTO `area` VALUES (734, '2015-10-19 00:16:06', '2015-10-19 00:16:06', 0, 9, '黑龙江省伊春市五营区', 2, '五营区', ',650,725,', 725);\nINSERT INTO `area` VALUES (735, '2015-10-19 00:16:07', '2015-10-19 00:16:07', 0, 10, '黑龙江省伊春市乌马河区', 2, '乌马河区', ',650,725,', 725);\nINSERT INTO `area` VALUES (736, '2015-10-19 00:16:08', '2015-10-19 00:16:08', 0, 11, '黑龙江省伊春市汤旺河区', 2, '汤旺河区', ',650,725,', 725);\nINSERT INTO `area` VALUES (737, '2015-10-19 00:16:09', '2015-10-19 00:16:09', 0, 12, '黑龙江省伊春市带岭区', 2, '带岭区', ',650,725,', 725);\nINSERT INTO `area` VALUES (738, '2015-10-19 00:16:10', '2015-10-19 00:16:10', 0, 13, '黑龙江省伊春市乌伊岭区', 2, '乌伊岭区', ',650,725,', 725);\nINSERT INTO `area` VALUES (739, '2015-10-19 00:16:11', '2015-10-19 00:16:11', 0, 14, '黑龙江省伊春市红星区', 2, '红星区', ',650,725,', 725);\nINSERT INTO `area` VALUES (740, '2015-10-19 00:16:12', '2015-10-19 00:16:12', 0, 15, '黑龙江省伊春市上甘岭区', 2, '上甘岭区', ',650,725,', 725);\nINSERT INTO `area` VALUES (741, '2015-10-19 00:16:13', '2015-10-19 00:16:13', 0, 16, '黑龙江省伊春市嘉荫县', 2, '嘉荫县', ',650,725,', 725);\nINSERT INTO `area` VALUES (742, '2015-10-19 00:16:14', '2015-10-19 00:16:14', 0, 17, '黑龙江省伊春市铁力市', 2, '铁力市', ',650,725,', 725);\nINSERT INTO `area` VALUES (743, '2015-10-19 00:16:15', '2015-10-19 00:16:15', 0, 8, '黑龙江省佳木斯市', 1, '佳木斯市', ',650,', 650);\nINSERT INTO `area` VALUES (744, '2015-10-19 00:16:16', '2015-10-19 00:16:16', 0, 1, '黑龙江省佳木斯市向阳区', 2, '向阳区', ',650,743,', 743);\nINSERT INTO `area` VALUES (745, '2015-10-19 00:16:17', '2015-10-19 00:16:17', 0, 2, '黑龙江省佳木斯市前进区', 2, '前进区', ',650,743,', 743);\nINSERT INTO `area` VALUES (746, '2015-10-19 00:16:18', '2015-10-19 00:16:18', 0, 3, '黑龙江省佳木斯市东风区', 2, '东风区', ',650,743,', 743);\nINSERT INTO `area` VALUES (747, '2015-10-19 00:16:19', '2015-10-19 00:16:19', 0, 4, '黑龙江省佳木斯市郊区', 2, '郊区', ',650,743,', 743);\nINSERT INTO `area` VALUES (748, '2015-10-19 00:16:20', '2015-10-19 00:16:20', 0, 5, '黑龙江省佳木斯市桦南县', 2, '桦南县', ',650,743,', 743);\nINSERT INTO `area` VALUES (749, '2015-10-19 00:16:21', '2015-10-19 00:16:21', 0, 6, '黑龙江省佳木斯市桦川县', 2, '桦川县', ',650,743,', 743);\nINSERT INTO `area` VALUES (750, '2015-10-19 00:16:22', '2015-10-19 00:16:22', 0, 7, '黑龙江省佳木斯市汤原县', 2, '汤原县', ',650,743,', 743);\nINSERT INTO `area` VALUES (751, '2015-10-19 00:16:23', '2015-10-19 00:16:23', 0, 8, '黑龙江省佳木斯市抚远县', 2, '抚远县', ',650,743,', 743);\nINSERT INTO `area` VALUES (752, '2015-10-19 00:16:24', '2015-10-19 00:16:24', 0, 9, '黑龙江省佳木斯市同江市', 2, '同江市', ',650,743,', 743);\nINSERT INTO `area` VALUES (753, '2015-10-19 00:16:25', '2015-10-19 00:16:25', 0, 10, '黑龙江省佳木斯市富锦市', 2, '富锦市', ',650,743,', 743);\nINSERT INTO `area` VALUES (754, '2015-10-19 00:16:26', '2015-10-19 00:16:26', 0, 9, '黑龙江省七台河市', 1, '七台河市', ',650,', 650);\nINSERT INTO `area` VALUES (755, '2015-10-19 00:16:27', '2015-10-19 00:16:27', 0, 1, '黑龙江省七台河市新兴区', 2, '新兴区', ',650,754,', 754);\nINSERT INTO `area` VALUES (756, '2015-10-19 00:16:28', '2015-10-19 00:16:28', 0, 2, '黑龙江省七台河市桃山区', 2, '桃山区', ',650,754,', 754);\nINSERT INTO `area` VALUES (757, '2015-10-19 00:16:29', '2015-10-19 00:16:29', 0, 3, '黑龙江省七台河市茄子河区', 2, '茄子河区', ',650,754,', 754);\nINSERT INTO `area` VALUES (758, '2015-10-19 00:16:30', '2015-10-19 00:16:30', 0, 4, '黑龙江省七台河市勃利县', 2, '勃利县', ',650,754,', 754);\nINSERT INTO `area` VALUES (759, '2015-10-19 00:16:31', '2015-10-19 00:16:31', 0, 10, '黑龙江省牡丹江市', 1, '牡丹江市', ',650,', 650);\nINSERT INTO `area` VALUES (760, '2015-10-19 00:16:32', '2015-10-19 00:16:32', 0, 1, '黑龙江省牡丹江市东安区', 2, '东安区', ',650,759,', 759);\nINSERT INTO `area` VALUES (761, '2015-10-19 00:16:33', '2015-10-19 00:16:33', 0, 2, '黑龙江省牡丹江市阳明区', 2, '阳明区', ',650,759,', 759);\nINSERT INTO `area` VALUES (762, '2015-10-19 00:16:34', '2015-10-19 00:16:34', 0, 3, '黑龙江省牡丹江市爱民区', 2, '爱民区', ',650,759,', 759);\nINSERT INTO `area` VALUES (763, '2015-10-19 00:16:35', '2015-10-19 00:16:35', 0, 4, '黑龙江省牡丹江市西安区', 2, '西安区', ',650,759,', 759);\nINSERT INTO `area` VALUES (764, '2015-10-19 00:16:36', '2015-10-19 00:16:36', 0, 5, '黑龙江省牡丹江市东宁县', 2, '东宁县', ',650,759,', 759);\nINSERT INTO `area` VALUES (765, '2015-10-19 00:16:37', '2015-10-19 00:16:37', 0, 6, '黑龙江省牡丹江市林口县', 2, '林口县', ',650,759,', 759);\nINSERT INTO `area` VALUES (766, '2015-10-19 00:16:38', '2015-10-19 00:16:38', 0, 7, '黑龙江省牡丹江市绥芬河市', 2, '绥芬河市', ',650,759,', 759);\nINSERT INTO `area` VALUES (767, '2015-10-19 00:16:39', '2015-10-19 00:16:39', 0, 8, '黑龙江省牡丹江市海林市', 2, '海林市', ',650,759,', 759);\nINSERT INTO `area` VALUES (768, '2015-10-19 00:16:40', '2015-10-19 00:16:40', 0, 9, '黑龙江省牡丹江市宁安市', 2, '宁安市', ',650,759,', 759);\nINSERT INTO `area` VALUES (769, '2015-10-19 00:16:41', '2015-10-19 00:16:41', 0, 10, '黑龙江省牡丹江市穆棱市', 2, '穆棱市', ',650,759,', 759);\nINSERT INTO `area` VALUES (770, '2015-10-19 00:16:42', '2015-10-19 00:16:42', 0, 11, '黑龙江省黑河市', 1, '黑河市', ',650,', 650);\nINSERT INTO `area` VALUES (771, '2015-10-19 00:16:43', '2015-10-19 00:16:43', 0, 1, '黑龙江省黑河市爱辉区', 2, '爱辉区', ',650,770,', 770);\nINSERT INTO `area` VALUES (772, '2015-10-19 00:16:44', '2015-10-19 00:16:44', 0, 2, '黑龙江省黑河市嫩江县', 2, '嫩江县', ',650,770,', 770);\nINSERT INTO `area` VALUES (773, '2015-10-19 00:16:45', '2015-10-19 00:16:45', 0, 3, '黑龙江省黑河市逊克县', 2, '逊克县', ',650,770,', 770);\nINSERT INTO `area` VALUES (774, '2015-10-19 00:16:46', '2015-10-19 00:16:46', 0, 4, '黑龙江省黑河市孙吴县', 2, '孙吴县', ',650,770,', 770);\nINSERT INTO `area` VALUES (775, '2015-10-19 00:16:47', '2015-10-19 00:16:47', 0, 5, '黑龙江省黑河市北安市', 2, '北安市', ',650,770,', 770);\nINSERT INTO `area` VALUES (776, '2015-10-19 00:16:48', '2015-10-19 00:16:48', 0, 6, '黑龙江省黑河市五大连池市', 2, '五大连池市', ',650,770,', 770);\nINSERT INTO `area` VALUES (777, '2015-10-19 00:16:49', '2015-10-19 00:16:49', 0, 12, '黑龙江省绥化市', 1, '绥化市', ',650,', 650);\nINSERT INTO `area` VALUES (778, '2015-10-19 00:16:50', '2015-10-19 00:16:50', 0, 1, '黑龙江省绥化市北林区', 2, '北林区', ',650,777,', 777);\nINSERT INTO `area` VALUES (779, '2015-10-19 00:16:51', '2015-10-19 00:16:51', 0, 2, '黑龙江省绥化市望奎县', 2, '望奎县', ',650,777,', 777);\nINSERT INTO `area` VALUES (780, '2015-10-19 00:16:52', '2015-10-19 00:16:52', 0, 3, '黑龙江省绥化市兰西县', 2, '兰西县', ',650,777,', 777);\nINSERT INTO `area` VALUES (781, '2015-10-19 00:16:53', '2015-10-19 00:16:53', 0, 4, '黑龙江省绥化市青冈县', 2, '青冈县', ',650,777,', 777);\nINSERT INTO `area` VALUES (782, '2015-10-19 00:16:54', '2015-10-19 00:16:54', 0, 5, '黑龙江省绥化市庆安县', 2, '庆安县', ',650,777,', 777);\nINSERT INTO `area` VALUES (783, '2015-10-19 00:16:55', '2015-10-19 00:16:55', 0, 6, '黑龙江省绥化市明水县', 2, '明水县', ',650,777,', 777);\nINSERT INTO `area` VALUES (784, '2015-10-19 00:16:56', '2015-10-19 00:16:56', 0, 7, '黑龙江省绥化市绥棱县', 2, '绥棱县', ',650,777,', 777);\nINSERT INTO `area` VALUES (785, '2015-10-19 00:16:57', '2015-10-19 00:16:57', 0, 8, '黑龙江省绥化市安达市', 2, '安达市', ',650,777,', 777);\nINSERT INTO `area` VALUES (786, '2015-10-19 00:16:58', '2015-10-19 00:16:58', 0, 9, '黑龙江省绥化市肇东市', 2, '肇东市', ',650,777,', 777);\nINSERT INTO `area` VALUES (787, '2015-10-19 00:16:59', '2015-10-19 00:16:59', 0, 10, '黑龙江省绥化市海伦市', 2, '海伦市', ',650,777,', 777);\nINSERT INTO `area` VALUES (788, '2015-10-19 00:17:00', '2015-10-19 00:17:00', 0, 13, '黑龙江省大兴安岭地区', 1, '大兴安岭地区', ',650,', 650);\nINSERT INTO `area` VALUES (789, '2015-10-19 00:17:01', '2015-10-19 00:17:01', 0, 1, '黑龙江省大兴安岭地区呼玛县', 2, '呼玛县', ',650,788,', 788);\nINSERT INTO `area` VALUES (790, '2015-10-19 00:17:02', '2015-10-19 00:17:02', 0, 2, '黑龙江省大兴安岭地区塔河县', 2, '塔河县', ',650,788,', 788);\nINSERT INTO `area` VALUES (791, '2015-10-19 00:17:03', '2015-10-19 00:17:03', 0, 3, '黑龙江省大兴安岭地区漠河县', 2, '漠河县', ',650,788,', 788);\nINSERT INTO `area` VALUES (792, '2015-10-19 00:17:04', '2015-10-19 00:17:04', 0, 9, '上海市', 0, '上海市', ',', NULL);\nINSERT INTO `area` VALUES (793, '2015-10-19 00:17:05', '2015-10-19 00:17:05', 0, 1, '上海市黄浦区', 1, '黄浦区', ',792,', 792);\nINSERT INTO `area` VALUES (794, '2015-10-19 00:17:06', '2015-10-19 00:17:06', 0, 2, '上海市徐汇区', 1, '徐汇区', ',792,', 792);\nINSERT INTO `area` VALUES (795, '2015-10-19 00:17:07', '2015-10-19 00:17:07', 0, 3, '上海市长宁区', 1, '长宁区', ',792,', 792);\nINSERT INTO `area` VALUES (796, '2015-10-19 00:17:08', '2015-10-19 00:17:08', 0, 4, '上海市静安区', 1, '静安区', ',792,', 792);\nINSERT INTO `area` VALUES (797, '2015-10-19 00:17:09', '2015-10-19 00:17:09', 0, 5, '上海市普陀区', 1, '普陀区', ',792,', 792);\nINSERT INTO `area` VALUES (798, '2015-10-19 00:17:10', '2015-10-19 00:17:10', 0, 6, '上海市闸北区', 1, '闸北区', ',792,', 792);\nINSERT INTO `area` VALUES (799, '2015-10-19 00:17:11', '2015-10-19 00:17:11', 0, 7, '上海市虹口区', 1, '虹口区', ',792,', 792);\nINSERT INTO `area` VALUES (800, '2015-10-19 00:17:12', '2015-10-19 00:17:12', 0, 8, '上海市杨浦区', 1, '杨浦区', ',792,', 792);\nINSERT INTO `area` VALUES (801, '2015-10-19 00:17:13', '2015-10-19 00:17:13', 0, 9, '上海市闵行区', 1, '闵行区', ',792,', 792);\nINSERT INTO `area` VALUES (802, '2015-10-19 00:17:14', '2015-10-19 00:17:14', 0, 10, '上海市宝山区', 1, '宝山区', ',792,', 792);\nINSERT INTO `area` VALUES (803, '2015-10-19 00:17:15', '2015-10-19 00:17:15', 0, 11, '上海市嘉定区', 1, '嘉定区', ',792,', 792);\nINSERT INTO `area` VALUES (804, '2015-10-19 00:17:16', '2015-10-19 00:17:16', 0, 12, '上海市浦东新区', 1, '浦东新区', ',792,', 792);\nINSERT INTO `area` VALUES (805, '2015-10-19 00:17:17', '2015-10-19 00:17:17', 0, 13, '上海市金山区', 1, '金山区', ',792,', 792);\nINSERT INTO `area` VALUES (806, '2015-10-19 00:17:18', '2015-10-19 00:17:18', 0, 14, '上海市松江区', 1, '松江区', ',792,', 792);\nINSERT INTO `area` VALUES (807, '2015-10-19 00:17:19', '2015-10-19 00:17:19', 0, 15, '上海市青浦区', 1, '青浦区', ',792,', 792);\nINSERT INTO `area` VALUES (808, '2015-10-19 00:17:20', '2015-10-19 00:17:20', 0, 16, '上海市奉贤区', 1, '奉贤区', ',792,', 792);\nINSERT INTO `area` VALUES (809, '2015-10-19 00:17:21', '2015-10-19 00:17:21', 0, 17, '上海市崇明县', 1, '崇明县', ',792,', 792);\nINSERT INTO `area` VALUES (810, '2015-10-19 00:17:22', '2015-10-19 00:17:22', 0, 10, '江苏省', 0, '江苏省', ',', NULL);\nINSERT INTO `area` VALUES (811, '2015-10-19 00:17:23', '2015-10-19 00:17:23', 0, 1, '江苏省南京市', 1, '南京市', ',810,', 810);\nINSERT INTO `area` VALUES (812, '2015-10-19 00:17:24', '2015-10-19 00:17:24', 0, 1, '江苏省南京市玄武区', 2, '玄武区', ',810,811,', 811);\nINSERT INTO `area` VALUES (813, '2015-10-19 00:17:25', '2015-10-19 00:17:25', 0, 2, '江苏省南京市秦淮区', 2, '秦淮区', ',810,811,', 811);\nINSERT INTO `area` VALUES (814, '2015-10-19 00:17:26', '2015-10-19 00:17:26', 0, 3, '江苏省南京市建邺区', 2, '建邺区', ',810,811,', 811);\nINSERT INTO `area` VALUES (815, '2015-10-19 00:17:27', '2015-10-19 00:17:27', 0, 4, '江苏省南京市鼓楼区', 2, '鼓楼区', ',810,811,', 811);\nINSERT INTO `area` VALUES (816, '2015-10-19 00:17:28', '2015-10-19 00:17:28', 0, 5, '江苏省南京市浦口区', 2, '浦口区', ',810,811,', 811);\nINSERT INTO `area` VALUES (817, '2015-10-19 00:17:29', '2015-10-19 00:17:29', 0, 6, '江苏省南京市栖霞区', 2, '栖霞区', ',810,811,', 811);\nINSERT INTO `area` VALUES (818, '2015-10-19 00:17:30', '2015-10-19 00:17:30', 0, 7, '江苏省南京市雨花台区', 2, '雨花台区', ',810,811,', 811);\nINSERT INTO `area` VALUES (819, '2015-10-19 00:17:31', '2015-10-19 00:17:31', 0, 8, '江苏省南京市江宁区', 2, '江宁区', ',810,811,', 811);\nINSERT INTO `area` VALUES (820, '2015-10-19 00:17:32', '2015-10-19 00:17:32', 0, 9, '江苏省南京市六合区', 2, '六合区', ',810,811,', 811);\nINSERT INTO `area` VALUES (821, '2015-10-19 00:17:33', '2015-10-19 00:17:33', 0, 10, '江苏省南京市溧水区', 2, '溧水区', ',810,811,', 811);\nINSERT INTO `area` VALUES (822, '2015-10-19 00:17:34', '2015-10-19 00:17:34', 0, 11, '江苏省南京市高淳区', 2, '高淳区', ',810,811,', 811);\nINSERT INTO `area` VALUES (823, '2015-10-19 00:17:35', '2015-10-19 00:17:35', 0, 2, '江苏省无锡市', 1, '无锡市', ',810,', 810);\nINSERT INTO `area` VALUES (824, '2015-10-19 00:17:36', '2015-10-19 00:17:36', 0, 1, '江苏省无锡市崇安区', 2, '崇安区', ',810,823,', 823);\nINSERT INTO `area` VALUES (825, '2015-10-19 00:17:37', '2015-10-19 00:17:37', 0, 2, '江苏省无锡市南长区', 2, '南长区', ',810,823,', 823);\nINSERT INTO `area` VALUES (826, '2015-10-19 00:17:38', '2015-10-19 00:17:38', 0, 3, '江苏省无锡市北塘区', 2, '北塘区', ',810,823,', 823);\nINSERT INTO `area` VALUES (827, '2015-10-19 00:17:39', '2015-10-19 00:17:39', 0, 4, '江苏省无锡市锡山区', 2, '锡山区', ',810,823,', 823);\nINSERT INTO `area` VALUES (828, '2015-10-19 00:17:40', '2015-10-19 00:17:40', 0, 5, '江苏省无锡市惠山区', 2, '惠山区', ',810,823,', 823);\nINSERT INTO `area` VALUES (829, '2015-10-19 00:17:41', '2015-10-19 00:17:41', 0, 6, '江苏省无锡市滨湖区', 2, '滨湖区', ',810,823,', 823);\nINSERT INTO `area` VALUES (830, '2015-10-19 00:17:42', '2015-10-19 00:17:42', 0, 7, '江苏省无锡市江阴市', 2, '江阴市', ',810,823,', 823);\nINSERT INTO `area` VALUES (831, '2015-10-19 00:17:43', '2015-10-19 00:17:43', 0, 8, '江苏省无锡市宜兴市', 2, '宜兴市', ',810,823,', 823);\nINSERT INTO `area` VALUES (832, '2015-10-19 00:17:44', '2015-10-19 00:17:44', 0, 3, '江苏省徐州市', 1, '徐州市', ',810,', 810);\nINSERT INTO `area` VALUES (833, '2015-10-19 00:17:45', '2015-10-19 00:17:45', 0, 1, '江苏省徐州市鼓楼区', 2, '鼓楼区', ',810,832,', 832);\nINSERT INTO `area` VALUES (834, '2015-10-19 00:17:46', '2015-10-19 00:17:46', 0, 2, '江苏省徐州市云龙区', 2, '云龙区', ',810,832,', 832);\nINSERT INTO `area` VALUES (835, '2015-10-19 00:17:47', '2015-10-19 00:17:47', 0, 3, '江苏省徐州市贾汪区', 2, '贾汪区', ',810,832,', 832);\nINSERT INTO `area` VALUES (836, '2015-10-19 00:17:48', '2015-10-19 00:17:48', 0, 4, '江苏省徐州市泉山区', 2, '泉山区', ',810,832,', 832);\nINSERT INTO `area` VALUES (837, '2015-10-19 00:17:49', '2015-10-19 00:17:49', 0, 5, '江苏省徐州市铜山区', 2, '铜山区', ',810,832,', 832);\nINSERT INTO `area` VALUES (838, '2015-10-19 00:17:50', '2015-10-19 00:17:50', 0, 6, '江苏省徐州市丰县', 2, '丰县', ',810,832,', 832);\nINSERT INTO `area` VALUES (839, '2015-10-19 00:17:51', '2015-10-19 00:17:51', 0, 7, '江苏省徐州市沛县', 2, '沛县', ',810,832,', 832);\nINSERT INTO `area` VALUES (840, '2015-10-19 00:17:52', '2015-10-19 00:17:52', 0, 8, '江苏省徐州市睢宁县', 2, '睢宁县', ',810,832,', 832);\nINSERT INTO `area` VALUES (841, '2015-10-19 00:17:53', '2015-10-19 00:17:53', 0, 9, '江苏省徐州市新沂市', 2, '新沂市', ',810,832,', 832);\nINSERT INTO `area` VALUES (842, '2015-10-19 00:17:54', '2015-10-19 00:17:54', 0, 10, '江苏省徐州市邳州市', 2, '邳州市', ',810,832,', 832);\nINSERT INTO `area` VALUES (843, '2015-10-19 00:17:55', '2015-10-19 00:17:55', 0, 4, '江苏省常州市', 1, '常州市', ',810,', 810);\nINSERT INTO `area` VALUES (844, '2015-10-19 00:17:56', '2015-10-19 00:17:56', 0, 1, '江苏省常州市天宁区', 2, '天宁区', ',810,843,', 843);\nINSERT INTO `area` VALUES (845, '2015-10-19 00:17:57', '2015-10-19 00:17:57', 0, 2, '江苏省常州市钟楼区', 2, '钟楼区', ',810,843,', 843);\nINSERT INTO `area` VALUES (846, '2015-10-19 00:17:58', '2015-10-19 00:17:58', 0, 3, '江苏省常州市戚墅堰区', 2, '戚墅堰区', ',810,843,', 843);\nINSERT INTO `area` VALUES (847, '2015-10-19 00:17:59', '2015-10-19 00:17:59', 0, 4, '江苏省常州市新北区', 2, '新北区', ',810,843,', 843);\nINSERT INTO `area` VALUES (848, '2015-10-19 00:18:00', '2015-10-19 00:18:00', 0, 5, '江苏省常州市武进区', 2, '武进区', ',810,843,', 843);\nINSERT INTO `area` VALUES (849, '2015-10-19 00:18:01', '2015-10-19 00:18:01', 0, 6, '江苏省常州市溧阳市', 2, '溧阳市', ',810,843,', 843);\nINSERT INTO `area` VALUES (850, '2015-10-19 00:18:02', '2015-10-19 00:18:02', 0, 7, '江苏省常州市金坛市', 2, '金坛市', ',810,843,', 843);\nINSERT INTO `area` VALUES (851, '2015-10-19 00:18:03', '2015-10-19 00:18:03', 0, 5, '江苏省苏州市', 1, '苏州市', ',810,', 810);\nINSERT INTO `area` VALUES (852, '2015-10-19 00:18:04', '2015-10-19 00:18:04', 0, 1, '江苏省苏州市虎丘区', 2, '虎丘区', ',810,851,', 851);\nINSERT INTO `area` VALUES (853, '2015-10-19 00:18:05', '2015-10-19 00:18:05', 0, 2, '江苏省苏州市吴中区', 2, '吴中区', ',810,851,', 851);\nINSERT INTO `area` VALUES (854, '2015-10-19 00:18:06', '2015-10-19 00:18:06', 0, 3, '江苏省苏州市相城区', 2, '相城区', ',810,851,', 851);\nINSERT INTO `area` VALUES (855, '2015-10-19 00:18:07', '2015-10-19 00:18:07', 0, 4, '江苏省苏州市姑苏区', 2, '姑苏区', ',810,851,', 851);\nINSERT INTO `area` VALUES (856, '2015-10-19 00:18:08', '2015-10-19 00:18:08', 0, 5, '江苏省苏州市吴江区', 2, '吴江区', ',810,851,', 851);\nINSERT INTO `area` VALUES (857, '2015-10-19 00:18:09', '2015-10-19 00:18:09', 0, 6, '江苏省苏州市常熟市', 2, '常熟市', ',810,851,', 851);\nINSERT INTO `area` VALUES (858, '2015-10-19 00:18:10', '2015-10-19 00:18:10', 0, 7, '江苏省苏州市张家港市', 2, '张家港市', ',810,851,', 851);\nINSERT INTO `area` VALUES (859, '2015-10-19 00:18:11', '2015-10-19 00:18:11', 0, 8, '江苏省苏州市昆山市', 2, '昆山市', ',810,851,', 851);\nINSERT INTO `area` VALUES (860, '2015-10-19 00:18:12', '2015-10-19 00:18:12', 0, 9, '江苏省苏州市太仓市', 2, '太仓市', ',810,851,', 851);\nINSERT INTO `area` VALUES (861, '2015-10-19 00:18:13', '2015-10-19 00:18:13', 0, 6, '江苏省南通市', 1, '南通市', ',810,', 810);\nINSERT INTO `area` VALUES (862, '2015-10-19 00:18:14', '2015-10-19 00:18:14', 0, 1, '江苏省南通市崇川区', 2, '崇川区', ',810,861,', 861);\nINSERT INTO `area` VALUES (863, '2015-10-19 00:18:15', '2015-10-19 00:18:15', 0, 2, '江苏省南通市港闸区', 2, '港闸区', ',810,861,', 861);\nINSERT INTO `area` VALUES (864, '2015-10-19 00:18:16', '2015-10-19 00:18:16', 0, 3, '江苏省南通市通州区', 2, '通州区', ',810,861,', 861);\nINSERT INTO `area` VALUES (865, '2015-10-19 00:18:17', '2015-10-19 00:18:17', 0, 4, '江苏省南通市海安县', 2, '海安县', ',810,861,', 861);\nINSERT INTO `area` VALUES (866, '2015-10-19 00:18:18', '2015-10-19 00:18:18', 0, 5, '江苏省南通市如东县', 2, '如东县', ',810,861,', 861);\nINSERT INTO `area` VALUES (867, '2015-10-19 00:18:19', '2015-10-19 00:18:19', 0, 6, '江苏省南通市启东市', 2, '启东市', ',810,861,', 861);\nINSERT INTO `area` VALUES (868, '2015-10-19 00:18:20', '2015-10-19 00:18:20', 0, 7, '江苏省南通市如皋市', 2, '如皋市', ',810,861,', 861);\nINSERT INTO `area` VALUES (869, '2015-10-19 00:18:21', '2015-10-19 00:18:21', 0, 8, '江苏省南通市海门市', 2, '海门市', ',810,861,', 861);\nINSERT INTO `area` VALUES (870, '2015-10-19 00:18:22', '2015-10-19 00:18:22', 0, 7, '江苏省连云港市', 1, '连云港市', ',810,', 810);\nINSERT INTO `area` VALUES (871, '2015-10-19 00:18:23', '2015-10-19 00:18:23', 0, 1, '江苏省连云港市连云区', 2, '连云区', ',810,870,', 870);\nINSERT INTO `area` VALUES (872, '2015-10-19 00:18:24', '2015-10-19 00:18:24', 0, 2, '江苏省连云港市新浦区', 2, '新浦区', ',810,870,', 870);\nINSERT INTO `area` VALUES (873, '2015-10-19 00:18:25', '2015-10-19 00:18:25', 0, 3, '江苏省连云港市海州区', 2, '海州区', ',810,870,', 870);\nINSERT INTO `area` VALUES (874, '2015-10-19 00:18:26', '2015-10-19 00:18:26', 0, 4, '江苏省连云港市赣榆县', 2, '赣榆县', ',810,870,', 870);\nINSERT INTO `area` VALUES (875, '2015-10-19 00:18:27', '2015-10-19 00:18:27', 0, 5, '江苏省连云港市东海县', 2, '东海县', ',810,870,', 870);\nINSERT INTO `area` VALUES (876, '2015-10-19 00:18:28', '2015-10-19 00:18:28', 0, 6, '江苏省连云港市灌云县', 2, '灌云县', ',810,870,', 870);\nINSERT INTO `area` VALUES (877, '2015-10-19 00:18:29', '2015-10-19 00:18:29', 0, 7, '江苏省连云港市灌南县', 2, '灌南县', ',810,870,', 870);\nINSERT INTO `area` VALUES (878, '2015-10-19 00:18:30', '2015-10-19 00:18:30', 0, 8, '江苏省淮安市', 1, '淮安市', ',810,', 810);\nINSERT INTO `area` VALUES (879, '2015-10-19 00:18:31', '2015-10-19 00:18:31', 0, 1, '江苏省淮安市清河区', 2, '清河区', ',810,878,', 878);\nINSERT INTO `area` VALUES (880, '2015-10-19 00:18:32', '2015-10-19 00:18:32', 0, 2, '江苏省淮安市淮安区', 2, '淮安区', ',810,878,', 878);\nINSERT INTO `area` VALUES (881, '2015-10-19 00:18:33', '2015-10-19 00:18:33', 0, 3, '江苏省淮安市淮阴区', 2, '淮阴区', ',810,878,', 878);\nINSERT INTO `area` VALUES (882, '2015-10-19 00:18:34', '2015-10-19 00:18:34', 0, 4, '江苏省淮安市清浦区', 2, '清浦区', ',810,878,', 878);\nINSERT INTO `area` VALUES (883, '2015-10-19 00:18:35', '2015-10-19 00:18:35', 0, 5, '江苏省淮安市涟水县', 2, '涟水县', ',810,878,', 878);\nINSERT INTO `area` VALUES (884, '2015-10-19 00:18:36', '2015-10-19 00:18:36', 0, 6, '江苏省淮安市洪泽县', 2, '洪泽县', ',810,878,', 878);\nINSERT INTO `area` VALUES (885, '2015-10-19 00:18:37', '2015-10-19 00:18:37', 0, 7, '江苏省淮安市盱眙县', 2, '盱眙县', ',810,878,', 878);\nINSERT INTO `area` VALUES (886, '2015-10-19 00:18:38', '2015-10-19 00:18:38', 0, 8, '江苏省淮安市金湖县', 2, '金湖县', ',810,878,', 878);\nINSERT INTO `area` VALUES (887, '2015-10-19 00:18:39', '2015-10-19 00:18:39', 0, 9, '江苏省盐城市', 1, '盐城市', ',810,', 810);\nINSERT INTO `area` VALUES (888, '2015-10-19 00:18:40', '2015-10-19 00:18:40', 0, 1, '江苏省盐城市亭湖区', 2, '亭湖区', ',810,887,', 887);\nINSERT INTO `area` VALUES (889, '2015-10-19 00:18:41', '2015-10-19 00:18:41', 0, 2, '江苏省盐城市盐都区', 2, '盐都区', ',810,887,', 887);\nINSERT INTO `area` VALUES (890, '2015-10-19 00:18:42', '2015-10-19 00:18:42', 0, 3, '江苏省盐城市响水县', 2, '响水县', ',810,887,', 887);\nINSERT INTO `area` VALUES (891, '2015-10-19 00:18:43', '2015-10-19 00:18:43', 0, 4, '江苏省盐城市滨海县', 2, '滨海县', ',810,887,', 887);\nINSERT INTO `area` VALUES (892, '2015-10-19 00:18:44', '2015-10-19 00:18:44', 0, 5, '江苏省盐城市阜宁县', 2, '阜宁县', ',810,887,', 887);\nINSERT INTO `area` VALUES (893, '2015-10-19 00:18:45', '2015-10-19 00:18:45', 0, 6, '江苏省盐城市射阳县', 2, '射阳县', ',810,887,', 887);\nINSERT INTO `area` VALUES (894, '2015-10-19 00:18:46', '2015-10-19 00:18:46', 0, 7, '江苏省盐城市建湖县', 2, '建湖县', ',810,887,', 887);\nINSERT INTO `area` VALUES (895, '2015-10-19 00:18:47', '2015-10-19 00:18:47', 0, 8, '江苏省盐城市东台市', 2, '东台市', ',810,887,', 887);\nINSERT INTO `area` VALUES (896, '2015-10-19 00:18:48', '2015-10-19 00:18:48', 0, 9, '江苏省盐城市大丰市', 2, '大丰市', ',810,887,', 887);\nINSERT INTO `area` VALUES (897, '2015-10-19 00:18:49', '2015-10-19 00:18:49', 0, 10, '江苏省扬州市', 1, '扬州市', ',810,', 810);\nINSERT INTO `area` VALUES (898, '2015-10-19 00:18:50', '2015-10-19 00:18:50', 0, 1, '江苏省扬州市广陵区', 2, '广陵区', ',810,897,', 897);\nINSERT INTO `area` VALUES (899, '2015-10-19 00:18:51', '2015-10-19 00:18:51', 0, 2, '江苏省扬州市邗江区', 2, '邗江区', ',810,897,', 897);\nINSERT INTO `area` VALUES (900, '2015-10-19 00:18:52', '2015-10-19 00:18:52', 0, 3, '江苏省扬州市江都区', 2, '江都区', ',810,897,', 897);\nINSERT INTO `area` VALUES (901, '2015-10-19 00:18:53', '2015-10-19 00:18:53', 0, 4, '江苏省扬州市宝应县', 2, '宝应县', ',810,897,', 897);\nINSERT INTO `area` VALUES (902, '2015-10-19 00:18:54', '2015-10-19 00:18:54', 0, 5, '江苏省扬州市仪征市', 2, '仪征市', ',810,897,', 897);\nINSERT INTO `area` VALUES (903, '2015-10-19 00:18:55', '2015-10-19 00:18:55', 0, 6, '江苏省扬州市高邮市', 2, '高邮市', ',810,897,', 897);\nINSERT INTO `area` VALUES (904, '2015-10-19 00:18:56', '2015-10-19 00:18:56', 0, 11, '江苏省镇江市', 1, '镇江市', ',810,', 810);\nINSERT INTO `area` VALUES (905, '2015-10-19 00:18:57', '2015-10-19 00:18:57', 0, 1, '江苏省镇江市京口区', 2, '京口区', ',810,904,', 904);\nINSERT INTO `area` VALUES (906, '2015-10-19 00:18:58', '2015-10-19 00:18:58', 0, 2, '江苏省镇江市润州区', 2, '润州区', ',810,904,', 904);\nINSERT INTO `area` VALUES (907, '2015-10-19 00:18:59', '2015-10-19 00:18:59', 0, 3, '江苏省镇江市丹徒区', 2, '丹徒区', ',810,904,', 904);\nINSERT INTO `area` VALUES (908, '2015-10-19 00:19:00', '2015-10-19 00:19:00', 0, 4, '江苏省镇江市丹阳市', 2, '丹阳市', ',810,904,', 904);\nINSERT INTO `area` VALUES (909, '2015-10-19 00:19:01', '2015-10-19 00:19:01', 0, 5, '江苏省镇江市扬中市', 2, '扬中市', ',810,904,', 904);\nINSERT INTO `area` VALUES (910, '2015-10-19 00:19:02', '2015-10-19 00:19:02', 0, 6, '江苏省镇江市句容市', 2, '句容市', ',810,904,', 904);\nINSERT INTO `area` VALUES (911, '2015-10-19 00:19:03', '2015-10-19 00:19:03', 0, 12, '江苏省泰州市', 1, '泰州市', ',810,', 810);\nINSERT INTO `area` VALUES (912, '2015-10-19 00:19:04', '2015-10-19 00:19:04', 0, 1, '江苏省泰州市海陵区', 2, '海陵区', ',810,911,', 911);\nINSERT INTO `area` VALUES (913, '2015-10-19 00:19:05', '2015-10-19 00:19:05', 0, 2, '江苏省泰州市高港区', 2, '高港区', ',810,911,', 911);\nINSERT INTO `area` VALUES (914, '2015-10-19 00:19:06', '2015-10-19 00:19:06', 0, 3, '江苏省泰州市姜堰区', 2, '姜堰区', ',810,911,', 911);\nINSERT INTO `area` VALUES (915, '2015-10-19 00:19:07', '2015-10-19 00:19:07', 0, 4, '江苏省泰州市兴化市', 2, '兴化市', ',810,911,', 911);\nINSERT INTO `area` VALUES (916, '2015-10-19 00:19:08', '2015-10-19 00:19:08', 0, 5, '江苏省泰州市靖江市', 2, '靖江市', ',810,911,', 911);\nINSERT INTO `area` VALUES (917, '2015-10-19 00:19:09', '2015-10-19 00:19:09', 0, 6, '江苏省泰州市泰兴市', 2, '泰兴市', ',810,911,', 911);\nINSERT INTO `area` VALUES (918, '2015-10-19 00:19:10', '2015-10-19 00:19:10', 0, 13, '江苏省宿迁市', 1, '宿迁市', ',810,', 810);\nINSERT INTO `area` VALUES (919, '2015-10-19 00:19:11', '2015-10-19 00:19:11', 0, 1, '江苏省宿迁市宿城区', 2, '宿城区', ',810,918,', 918);\nINSERT INTO `area` VALUES (920, '2015-10-19 00:19:12', '2015-10-19 00:19:12', 0, 2, '江苏省宿迁市宿豫区', 2, '宿豫区', ',810,918,', 918);\nINSERT INTO `area` VALUES (921, '2015-10-19 00:19:13', '2015-10-19 00:19:13', 0, 3, '江苏省宿迁市沭阳县', 2, '沭阳县', ',810,918,', 918);\nINSERT INTO `area` VALUES (922, '2015-10-19 00:19:14', '2015-10-19 00:19:14', 0, 4, '江苏省宿迁市泗阳县', 2, '泗阳县', ',810,918,', 918);\nINSERT INTO `area` VALUES (923, '2015-10-19 00:19:15', '2015-10-19 00:19:15', 0, 5, '江苏省宿迁市泗洪县', 2, '泗洪县', ',810,918,', 918);\nINSERT INTO `area` VALUES (924, '2015-10-19 00:19:16', '2015-10-19 00:19:16', 0, 11, '浙江省', 0, '浙江省', ',', NULL);\nINSERT INTO `area` VALUES (925, '2015-10-19 00:19:17', '2015-10-19 00:19:17', 0, 1, '浙江省杭州市', 1, '杭州市', ',924,', 924);\nINSERT INTO `area` VALUES (926, '2015-10-19 00:19:18', '2015-10-19 00:19:18', 0, 1, '浙江省杭州市上城区', 2, '上城区', ',924,925,', 925);\nINSERT INTO `area` VALUES (927, '2015-10-19 00:19:19', '2015-10-19 00:19:19', 0, 2, '浙江省杭州市下城区', 2, '下城区', ',924,925,', 925);\nINSERT INTO `area` VALUES (928, '2015-10-19 00:19:20', '2015-10-19 00:19:20', 0, 3, '浙江省杭州市江干区', 2, '江干区', ',924,925,', 925);\nINSERT INTO `area` VALUES (929, '2015-10-19 00:19:21', '2015-10-19 00:19:21', 0, 4, '浙江省杭州市拱墅区', 2, '拱墅区', ',924,925,', 925);\nINSERT INTO `area` VALUES (930, '2015-10-19 00:19:22', '2015-10-19 00:19:22', 0, 5, '浙江省杭州市西湖区', 2, '西湖区', ',924,925,', 925);\nINSERT INTO `area` VALUES (931, '2015-10-19 00:19:23', '2015-10-19 00:19:23', 0, 6, '浙江省杭州市滨江区', 2, '滨江区', ',924,925,', 925);\nINSERT INTO `area` VALUES (932, '2015-10-19 00:19:24', '2015-10-19 00:19:24', 0, 7, '浙江省杭州市萧山区', 2, '萧山区', ',924,925,', 925);\nINSERT INTO `area` VALUES (933, '2015-10-19 00:19:25', '2015-10-19 00:19:25', 0, 8, '浙江省杭州市余杭区', 2, '余杭区', ',924,925,', 925);\nINSERT INTO `area` VALUES (934, '2015-10-19 00:19:26', '2015-10-19 00:19:26', 0, 9, '浙江省杭州市桐庐县', 2, '桐庐县', ',924,925,', 925);\nINSERT INTO `area` VALUES (935, '2015-10-19 00:19:27', '2015-10-19 00:19:27', 0, 10, '浙江省杭州市淳安县', 2, '淳安县', ',924,925,', 925);\nINSERT INTO `area` VALUES (936, '2015-10-19 00:19:28', '2015-10-19 00:19:28', 0, 11, '浙江省杭州市建德市', 2, '建德市', ',924,925,', 925);\nINSERT INTO `area` VALUES (937, '2015-10-19 00:19:29', '2015-10-19 00:19:29', 0, 12, '浙江省杭州市富阳市', 2, '富阳市', ',924,925,', 925);\nINSERT INTO `area` VALUES (938, '2015-10-19 00:19:30', '2015-10-19 00:19:30', 0, 13, '浙江省杭州市临安市', 2, '临安市', ',924,925,', 925);\nINSERT INTO `area` VALUES (939, '2015-10-19 00:19:31', '2015-10-19 00:19:31', 0, 2, '浙江省宁波市', 1, '宁波市', ',924,', 924);\nINSERT INTO `area` VALUES (940, '2015-10-19 00:19:32', '2015-10-19 00:19:32', 0, 1, '浙江省宁波市海曙区', 2, '海曙区', ',924,939,', 939);\nINSERT INTO `area` VALUES (941, '2015-10-19 00:19:33', '2015-10-19 00:19:33', 0, 2, '浙江省宁波市江东区', 2, '江东区', ',924,939,', 939);\nINSERT INTO `area` VALUES (942, '2015-10-19 00:19:34', '2015-10-19 00:19:34', 0, 3, '浙江省宁波市江北区', 2, '江北区', ',924,939,', 939);\nINSERT INTO `area` VALUES (943, '2015-10-19 00:19:35', '2015-10-19 00:19:35', 0, 4, '浙江省宁波市北仑区', 2, '北仑区', ',924,939,', 939);\nINSERT INTO `area` VALUES (944, '2015-10-19 00:19:36', '2015-10-19 00:19:36', 0, 5, '浙江省宁波市镇海区', 2, '镇海区', ',924,939,', 939);\nINSERT INTO `area` VALUES (945, '2015-10-19 00:19:37', '2015-10-19 00:19:37', 0, 6, '浙江省宁波市鄞州区', 2, '鄞州区', ',924,939,', 939);\nINSERT INTO `area` VALUES (946, '2015-10-19 00:19:38', '2015-10-19 00:19:38', 0, 7, '浙江省宁波市象山县', 2, '象山县', ',924,939,', 939);\nINSERT INTO `area` VALUES (947, '2015-10-19 00:19:39', '2015-10-19 00:19:39', 0, 8, '浙江省宁波市宁海县', 2, '宁海县', ',924,939,', 939);\nINSERT INTO `area` VALUES (948, '2015-10-19 00:19:40', '2015-10-19 00:19:40', 0, 9, '浙江省宁波市余姚市', 2, '余姚市', ',924,939,', 939);\nINSERT INTO `area` VALUES (949, '2015-10-19 00:19:41', '2015-10-19 00:19:41', 0, 10, '浙江省宁波市慈溪市', 2, '慈溪市', ',924,939,', 939);\nINSERT INTO `area` VALUES (950, '2015-10-19 00:19:42', '2015-10-19 00:19:42', 0, 11, '浙江省宁波市奉化市', 2, '奉化市', ',924,939,', 939);\nINSERT INTO `area` VALUES (951, '2015-10-19 00:19:43', '2015-10-19 00:19:43', 0, 3, '浙江省温州市', 1, '温州市', ',924,', 924);\nINSERT INTO `area` VALUES (952, '2015-10-19 00:19:44', '2015-10-19 00:19:44', 0, 1, '浙江省温州市鹿城区', 2, '鹿城区', ',924,951,', 951);\nINSERT INTO `area` VALUES (953, '2015-10-19 00:19:45', '2015-10-19 00:19:45', 0, 2, '浙江省温州市龙湾区', 2, '龙湾区', ',924,951,', 951);\nINSERT INTO `area` VALUES (954, '2015-10-19 00:19:46', '2015-10-19 00:19:46', 0, 3, '浙江省温州市瓯海区', 2, '瓯海区', ',924,951,', 951);\nINSERT INTO `area` VALUES (955, '2015-10-19 00:19:47', '2015-10-19 00:19:47', 0, 4, '浙江省温州市洞头县', 2, '洞头县', ',924,951,', 951);\nINSERT INTO `area` VALUES (956, '2015-10-19 00:19:48', '2015-10-19 00:19:48', 0, 5, '浙江省温州市永嘉县', 2, '永嘉县', ',924,951,', 951);\nINSERT INTO `area` VALUES (957, '2015-10-19 00:19:49', '2015-10-19 00:19:49', 0, 6, '浙江省温州市平阳县', 2, '平阳县', ',924,951,', 951);\nINSERT INTO `area` VALUES (958, '2015-10-19 00:19:50', '2015-10-19 00:19:50', 0, 7, '浙江省温州市苍南县', 2, '苍南县', ',924,951,', 951);\nINSERT INTO `area` VALUES (959, '2015-10-19 00:19:51', '2015-10-19 00:19:51', 0, 8, '浙江省温州市文成县', 2, '文成县', ',924,951,', 951);\nINSERT INTO `area` VALUES (960, '2015-10-19 00:19:52', '2015-10-19 00:19:52', 0, 9, '浙江省温州市泰顺县', 2, '泰顺县', ',924,951,', 951);\nINSERT INTO `area` VALUES (961, '2015-10-19 00:19:53', '2015-10-19 00:19:53', 0, 10, '浙江省温州市瑞安市', 2, '瑞安市', ',924,951,', 951);\nINSERT INTO `area` VALUES (962, '2015-10-19 00:19:54', '2015-10-19 00:19:54', 0, 11, '浙江省温州市乐清市', 2, '乐清市', ',924,951,', 951);\nINSERT INTO `area` VALUES (963, '2015-10-19 00:19:55', '2015-10-19 00:19:55', 0, 4, '浙江省嘉兴市', 1, '嘉兴市', ',924,', 924);\nINSERT INTO `area` VALUES (964, '2015-10-19 00:19:56', '2015-10-19 00:19:56', 0, 1, '浙江省嘉兴市南湖区', 2, '南湖区', ',924,963,', 963);\nINSERT INTO `area` VALUES (965, '2015-10-19 00:19:57', '2015-10-19 00:19:57', 0, 2, '浙江省嘉兴市秀洲区', 2, '秀洲区', ',924,963,', 963);\nINSERT INTO `area` VALUES (966, '2015-10-19 00:19:58', '2015-10-19 00:19:58', 0, 3, '浙江省嘉兴市嘉善县', 2, '嘉善县', ',924,963,', 963);\nINSERT INTO `area` VALUES (967, '2015-10-19 00:19:59', '2015-10-19 00:19:59', 0, 4, '浙江省嘉兴市海盐县', 2, '海盐县', ',924,963,', 963);\nINSERT INTO `area` VALUES (968, '2015-10-19 00:20:00', '2015-10-19 00:20:00', 0, 5, '浙江省嘉兴市海宁市', 2, '海宁市', ',924,963,', 963);\nINSERT INTO `area` VALUES (969, '2015-10-19 00:20:01', '2015-10-19 00:20:01', 0, 6, '浙江省嘉兴市平湖市', 2, '平湖市', ',924,963,', 963);\nINSERT INTO `area` VALUES (970, '2015-10-19 00:20:02', '2015-10-19 00:20:02', 0, 7, '浙江省嘉兴市桐乡市', 2, '桐乡市', ',924,963,', 963);\nINSERT INTO `area` VALUES (971, '2015-10-19 00:20:03', '2015-10-19 00:20:03', 0, 5, '浙江省湖州市', 1, '湖州市', ',924,', 924);\nINSERT INTO `area` VALUES (972, '2015-10-19 00:20:04', '2015-10-19 00:20:04', 0, 1, '浙江省湖州市吴兴区', 2, '吴兴区', ',924,971,', 971);\nINSERT INTO `area` VALUES (973, '2015-10-19 00:20:05', '2015-10-19 00:20:05', 0, 2, '浙江省湖州市南浔区', 2, '南浔区', ',924,971,', 971);\nINSERT INTO `area` VALUES (974, '2015-10-19 00:20:06', '2015-10-19 00:20:06', 0, 3, '浙江省湖州市德清县', 2, '德清县', ',924,971,', 971);\nINSERT INTO `area` VALUES (975, '2015-10-19 00:20:07', '2015-10-19 00:20:07', 0, 4, '浙江省湖州市长兴县', 2, '长兴县', ',924,971,', 971);\nINSERT INTO `area` VALUES (976, '2015-10-19 00:20:08', '2015-10-19 00:20:08', 0, 5, '浙江省湖州市安吉县', 2, '安吉县', ',924,971,', 971);\nINSERT INTO `area` VALUES (977, '2015-10-19 00:20:09', '2015-10-19 00:20:09', 0, 6, '浙江省绍兴市', 1, '绍兴市', ',924,', 924);\nINSERT INTO `area` VALUES (978, '2015-10-19 00:20:10', '2015-10-19 00:20:10', 0, 1, '浙江省绍兴市越城区', 2, '越城区', ',924,977,', 977);\nINSERT INTO `area` VALUES (979, '2015-10-19 00:20:11', '2015-10-19 00:20:11', 0, 2, '浙江省绍兴市绍兴县', 2, '绍兴县', ',924,977,', 977);\nINSERT INTO `area` VALUES (980, '2015-10-19 00:20:12', '2015-10-19 00:20:12', 0, 3, '浙江省绍兴市新昌县', 2, '新昌县', ',924,977,', 977);\nINSERT INTO `area` VALUES (981, '2015-10-19 00:20:13', '2015-10-19 00:20:13', 0, 4, '浙江省绍兴市诸暨市', 2, '诸暨市', ',924,977,', 977);\nINSERT INTO `area` VALUES (982, '2015-10-19 00:20:14', '2015-10-19 00:20:14', 0, 5, '浙江省绍兴市上虞市', 2, '上虞市', ',924,977,', 977);\nINSERT INTO `area` VALUES (983, '2015-10-19 00:20:15', '2015-10-19 00:20:15', 0, 6, '浙江省绍兴市嵊州市', 2, '嵊州市', ',924,977,', 977);\nINSERT INTO `area` VALUES (984, '2015-10-19 00:20:16', '2015-10-19 00:20:16', 0, 7, '浙江省金华市', 1, '金华市', ',924,', 924);\nINSERT INTO `area` VALUES (985, '2015-10-19 00:20:17', '2015-10-19 00:20:17', 0, 1, '浙江省金华市婺城区', 2, '婺城区', ',924,984,', 984);\nINSERT INTO `area` VALUES (986, '2015-10-19 00:20:18', '2015-10-19 00:20:18', 0, 2, '浙江省金华市金东区', 2, '金东区', ',924,984,', 984);\nINSERT INTO `area` VALUES (987, '2015-10-19 00:20:19', '2015-10-19 00:20:19', 0, 3, '浙江省金华市武义县', 2, '武义县', ',924,984,', 984);\nINSERT INTO `area` VALUES (988, '2015-10-19 00:20:20', '2015-10-19 00:20:20', 0, 4, '浙江省金华市浦江县', 2, '浦江县', ',924,984,', 984);\nINSERT INTO `area` VALUES (989, '2015-10-19 00:20:21', '2015-10-19 00:20:21', 0, 5, '浙江省金华市磐安县', 2, '磐安县', ',924,984,', 984);\nINSERT INTO `area` VALUES (990, '2015-10-19 00:20:22', '2015-10-19 00:20:22', 0, 6, '浙江省金华市兰溪市', 2, '兰溪市', ',924,984,', 984);\nINSERT INTO `area` VALUES (991, '2015-10-19 00:20:23', '2015-10-19 00:20:23', 0, 7, '浙江省金华市义乌市', 2, '义乌市', ',924,984,', 984);\nINSERT INTO `area` VALUES (992, '2015-10-19 00:20:24', '2015-10-19 00:20:24', 0, 8, '浙江省金华市东阳市', 2, '东阳市', ',924,984,', 984);\nINSERT INTO `area` VALUES (993, '2015-10-19 00:20:25', '2015-10-19 00:20:25', 0, 9, '浙江省金华市永康市', 2, '永康市', ',924,984,', 984);\nINSERT INTO `area` VALUES (994, '2015-10-19 00:20:26', '2015-10-19 00:20:26', 0, 8, '浙江省衢州市', 1, '衢州市', ',924,', 924);\nINSERT INTO `area` VALUES (995, '2015-10-19 00:20:27', '2015-10-19 00:20:27', 0, 1, '浙江省衢州市柯城区', 2, '柯城区', ',924,994,', 994);\nINSERT INTO `area` VALUES (996, '2015-10-19 00:20:28', '2015-10-19 00:20:28', 0, 2, '浙江省衢州市衢江区', 2, '衢江区', ',924,994,', 994);\nINSERT INTO `area` VALUES (997, '2015-10-19 00:20:29', '2015-10-19 00:20:29', 0, 3, '浙江省衢州市常山县', 2, '常山县', ',924,994,', 994);\nINSERT INTO `area` VALUES (998, '2015-10-19 00:20:30', '2015-10-19 00:20:30', 0, 4, '浙江省衢州市开化县', 2, '开化县', ',924,994,', 994);\nINSERT INTO `area` VALUES (999, '2015-10-19 00:20:31', '2015-10-19 00:20:31', 0, 5, '浙江省衢州市龙游县', 2, '龙游县', ',924,994,', 994);\nINSERT INTO `area` VALUES (1000, '2015-10-19 00:20:32', '2015-10-19 00:20:32', 0, 6, '浙江省衢州市江山市', 2, '江山市', ',924,994,', 994);\nINSERT INTO `area` VALUES (1001, '2015-10-19 00:20:33', '2015-10-19 00:20:33', 0, 9, '浙江省舟山市', 1, '舟山市', ',924,', 924);\nINSERT INTO `area` VALUES (1002, '2015-10-19 00:20:34', '2015-10-19 00:20:34', 0, 1, '浙江省舟山市定海区', 2, '定海区', ',924,1001,', 1001);\nINSERT INTO `area` VALUES (1003, '2015-10-19 00:20:35', '2015-10-19 00:20:35', 0, 2, '浙江省舟山市普陀区', 2, '普陀区', ',924,1001,', 1001);\nINSERT INTO `area` VALUES (1004, '2015-10-19 00:20:36', '2015-10-19 00:20:36', 0, 3, '浙江省舟山市岱山县', 2, '岱山县', ',924,1001,', 1001);\nINSERT INTO `area` VALUES (1005, '2015-10-19 00:20:37', '2015-10-19 00:20:37', 0, 4, '浙江省舟山市嵊泗县', 2, '嵊泗县', ',924,1001,', 1001);\nINSERT INTO `area` VALUES (1006, '2015-10-19 00:20:38', '2015-10-19 00:20:38', 0, 10, '浙江省台州市', 1, '台州市', ',924,', 924);\nINSERT INTO `area` VALUES (1007, '2015-10-19 00:20:39', '2015-10-19 00:20:39', 0, 1, '浙江省台州市椒江区', 2, '椒江区', ',924,1006,', 1006);\nINSERT INTO `area` VALUES (1008, '2015-10-19 00:20:40', '2015-10-19 00:20:40', 0, 2, '浙江省台州市黄岩区', 2, '黄岩区', ',924,1006,', 1006);\nINSERT INTO `area` VALUES (1009, '2015-10-19 00:20:41', '2015-10-19 00:20:41', 0, 3, '浙江省台州市路桥区', 2, '路桥区', ',924,1006,', 1006);\nINSERT INTO `area` VALUES (1010, '2015-10-19 00:20:42', '2015-10-19 00:20:42', 0, 4, '浙江省台州市玉环县', 2, '玉环县', ',924,1006,', 1006);\nINSERT INTO `area` VALUES (1011, '2015-10-19 00:20:43', '2015-10-19 00:20:43', 0, 5, '浙江省台州市三门县', 2, '三门县', ',924,1006,', 1006);\nINSERT INTO `area` VALUES (1012, '2015-10-19 00:20:44', '2015-10-19 00:20:44', 0, 6, '浙江省台州市天台县', 2, '天台县', ',924,1006,', 1006);\nINSERT INTO `area` VALUES (1013, '2015-10-19 00:20:45', '2015-10-19 00:20:45', 0, 7, '浙江省台州市仙居县', 2, '仙居县', ',924,1006,', 1006);\nINSERT INTO `area` VALUES (1014, '2015-10-19 00:20:46', '2015-10-19 00:20:46', 0, 8, '浙江省台州市温岭市', 2, '温岭市', ',924,1006,', 1006);\nINSERT INTO `area` VALUES (1015, '2015-10-19 00:20:47', '2015-10-19 00:20:47', 0, 9, '浙江省台州市临海市', 2, '临海市', ',924,1006,', 1006);\nINSERT INTO `area` VALUES (1016, '2015-10-19 00:20:48', '2015-10-19 00:20:48', 0, 11, '浙江省丽水市', 1, '丽水市', ',924,', 924);\nINSERT INTO `area` VALUES (1017, '2015-10-19 00:20:49', '2015-10-19 00:20:49', 0, 1, '浙江省丽水市莲都区', 2, '莲都区', ',924,1016,', 1016);\nINSERT INTO `area` VALUES (1018, '2015-10-19 00:20:50', '2015-10-19 00:20:50', 0, 2, '浙江省丽水市青田县', 2, '青田县', ',924,1016,', 1016);\nINSERT INTO `area` VALUES (1019, '2015-10-19 00:20:51', '2015-10-19 00:20:51', 0, 3, '浙江省丽水市缙云县', 2, '缙云县', ',924,1016,', 1016);\nINSERT INTO `area` VALUES (1020, '2015-10-19 00:20:52', '2015-10-19 00:20:52', 0, 4, '浙江省丽水市遂昌县', 2, '遂昌县', ',924,1016,', 1016);\nINSERT INTO `area` VALUES (1021, '2015-10-19 00:20:53', '2015-10-19 00:20:53', 0, 5, '浙江省丽水市松阳县', 2, '松阳县', ',924,1016,', 1016);\nINSERT INTO `area` VALUES (1022, '2015-10-19 00:20:54', '2015-10-19 00:20:54', 0, 6, '浙江省丽水市云和县', 2, '云和县', ',924,1016,', 1016);\nINSERT INTO `area` VALUES (1023, '2015-10-19 00:20:55', '2015-10-19 00:20:55', 0, 7, '浙江省丽水市庆元县', 2, '庆元县', ',924,1016,', 1016);\nINSERT INTO `area` VALUES (1024, '2015-10-19 00:20:56', '2015-10-19 00:20:56', 0, 8, '浙江省丽水市景宁畲族自治县', 2, '景宁畲族自治县', ',924,1016,', 1016);\nINSERT INTO `area` VALUES (1025, '2015-10-19 00:20:57', '2015-10-19 00:20:57', 0, 9, '浙江省丽水市龙泉市', 2, '龙泉市', ',924,1016,', 1016);\nINSERT INTO `area` VALUES (1026, '2015-10-19 00:20:58', '2015-10-19 00:20:58', 0, 12, '安徽省', 0, '安徽省', ',', NULL);\nINSERT INTO `area` VALUES (1027, '2015-10-19 00:20:59', '2015-10-19 00:20:59', 0, 1, '安徽省合肥市', 1, '合肥市', ',1026,', 1026);\nINSERT INTO `area` VALUES (1028, '2015-10-19 00:21:00', '2015-10-19 00:21:00', 0, 1, '安徽省合肥市瑶海区', 2, '瑶海区', ',1026,1027,', 1027);\nINSERT INTO `area` VALUES (1029, '2015-10-19 00:21:01', '2015-10-19 00:21:01', 0, 2, '安徽省合肥市庐阳区', 2, '庐阳区', ',1026,1027,', 1027);\nINSERT INTO `area` VALUES (1030, '2015-10-19 00:21:02', '2015-10-19 00:21:02', 0, 3, '安徽省合肥市蜀山区', 2, '蜀山区', ',1026,1027,', 1027);\nINSERT INTO `area` VALUES (1031, '2015-10-19 00:21:03', '2015-10-19 00:21:03', 0, 4, '安徽省合肥市包河区', 2, '包河区', ',1026,1027,', 1027);\nINSERT INTO `area` VALUES (1032, '2015-10-19 00:21:04', '2015-10-19 00:21:04', 0, 5, '安徽省合肥市长丰县', 2, '长丰县', ',1026,1027,', 1027);\nINSERT INTO `area` VALUES (1033, '2015-10-19 00:21:05', '2015-10-19 00:21:05', 0, 6, '安徽省合肥市肥东县', 2, '肥东县', ',1026,1027,', 1027);\nINSERT INTO `area` VALUES (1034, '2015-10-19 00:21:06', '2015-10-19 00:21:06', 0, 7, '安徽省合肥市肥西县', 2, '肥西县', ',1026,1027,', 1027);\nINSERT INTO `area` VALUES (1035, '2015-10-19 00:21:07', '2015-10-19 00:21:07', 0, 8, '安徽省合肥市庐江县', 2, '庐江县', ',1026,1027,', 1027);\nINSERT INTO `area` VALUES (1036, '2015-10-19 00:21:08', '2015-10-19 00:21:08', 0, 9, '安徽省合肥市巢湖市', 2, '巢湖市', ',1026,1027,', 1027);\nINSERT INTO `area` VALUES (1037, '2015-10-19 00:21:09', '2015-10-19 00:21:09', 0, 2, '安徽省芜湖市', 1, '芜湖市', ',1026,', 1026);\nINSERT INTO `area` VALUES (1038, '2015-10-19 00:21:10', '2015-10-19 00:21:10', 0, 1, '安徽省芜湖市镜湖区', 2, '镜湖区', ',1026,1037,', 1037);\nINSERT INTO `area` VALUES (1039, '2015-10-19 00:21:11', '2015-10-19 00:21:11', 0, 2, '安徽省芜湖市弋江区', 2, '弋江区', ',1026,1037,', 1037);\nINSERT INTO `area` VALUES (1040, '2015-10-19 00:21:12', '2015-10-19 00:21:12', 0, 3, '安徽省芜湖市鸠江区', 2, '鸠江区', ',1026,1037,', 1037);\nINSERT INTO `area` VALUES (1041, '2015-10-19 00:21:13', '2015-10-19 00:21:13', 0, 4, '安徽省芜湖市三山区', 2, '三山区', ',1026,1037,', 1037);\nINSERT INTO `area` VALUES (1042, '2015-10-19 00:21:14', '2015-10-19 00:21:14', 0, 5, '安徽省芜湖市芜湖县', 2, '芜湖县', ',1026,1037,', 1037);\nINSERT INTO `area` VALUES (1043, '2015-10-19 00:21:15', '2015-10-19 00:21:15', 0, 6, '安徽省芜湖市繁昌县', 2, '繁昌县', ',1026,1037,', 1037);\nINSERT INTO `area` VALUES (1044, '2015-10-19 00:21:16', '2015-10-19 00:21:16', 0, 7, '安徽省芜湖市南陵县', 2, '南陵县', ',1026,1037,', 1037);\nINSERT INTO `area` VALUES (1045, '2015-10-19 00:21:17', '2015-10-19 00:21:17', 0, 8, '安徽省芜湖市无为县', 2, '无为县', ',1026,1037,', 1037);\nINSERT INTO `area` VALUES (1046, '2015-10-19 00:21:18', '2015-10-19 00:21:18', 0, 3, '安徽省蚌埠市', 1, '蚌埠市', ',1026,', 1026);\nINSERT INTO `area` VALUES (1047, '2015-10-19 00:21:19', '2015-10-19 00:21:19', 0, 1, '安徽省蚌埠市龙子湖区', 2, '龙子湖区', ',1026,1046,', 1046);\nINSERT INTO `area` VALUES (1048, '2015-10-19 00:21:20', '2015-10-19 00:21:20', 0, 2, '安徽省蚌埠市蚌山区', 2, '蚌山区', ',1026,1046,', 1046);\nINSERT INTO `area` VALUES (1049, '2015-10-19 00:21:21', '2015-10-19 00:21:21', 0, 3, '安徽省蚌埠市禹会区', 2, '禹会区', ',1026,1046,', 1046);\nINSERT INTO `area` VALUES (1050, '2015-10-19 00:21:22', '2015-10-19 00:21:22', 0, 4, '安徽省蚌埠市淮上区', 2, '淮上区', ',1026,1046,', 1046);\nINSERT INTO `area` VALUES (1051, '2015-10-19 00:21:23', '2015-10-19 00:21:23', 0, 5, '安徽省蚌埠市怀远县', 2, '怀远县', ',1026,1046,', 1046);\nINSERT INTO `area` VALUES (1052, '2015-10-19 00:21:24', '2015-10-19 00:21:24', 0, 6, '安徽省蚌埠市五河县', 2, '五河县', ',1026,1046,', 1046);\nINSERT INTO `area` VALUES (1053, '2015-10-19 00:21:25', '2015-10-19 00:21:25', 0, 7, '安徽省蚌埠市固镇县', 2, '固镇县', ',1026,1046,', 1046);\nINSERT INTO `area` VALUES (1054, '2015-10-19 00:21:26', '2015-10-19 00:21:26', 0, 4, '安徽省淮南市', 1, '淮南市', ',1026,', 1026);\nINSERT INTO `area` VALUES (1055, '2015-10-19 00:21:27', '2015-10-19 00:21:27', 0, 1, '安徽省淮南市大通区', 2, '大通区', ',1026,1054,', 1054);\nINSERT INTO `area` VALUES (1056, '2015-10-19 00:21:28', '2015-10-19 00:21:28', 0, 2, '安徽省淮南市田家庵区', 2, '田家庵区', ',1026,1054,', 1054);\nINSERT INTO `area` VALUES (1057, '2015-10-19 00:21:29', '2015-10-19 00:21:29', 0, 3, '安徽省淮南市谢家集区', 2, '谢家集区', ',1026,1054,', 1054);\nINSERT INTO `area` VALUES (1058, '2015-10-19 00:21:30', '2015-10-19 00:21:30', 0, 4, '安徽省淮南市八公山区', 2, '八公山区', ',1026,1054,', 1054);\nINSERT INTO `area` VALUES (1059, '2015-10-19 00:21:31', '2015-10-19 00:21:31', 0, 5, '安徽省淮南市潘集区', 2, '潘集区', ',1026,1054,', 1054);\nINSERT INTO `area` VALUES (1060, '2015-10-19 00:21:32', '2015-10-19 00:21:32', 0, 6, '安徽省淮南市凤台县', 2, '凤台县', ',1026,1054,', 1054);\nINSERT INTO `area` VALUES (1061, '2015-10-19 00:21:33', '2015-10-19 00:21:33', 0, 5, '安徽省马鞍山市', 1, '马鞍山市', ',1026,', 1026);\nINSERT INTO `area` VALUES (1062, '2015-10-19 00:21:34', '2015-10-19 00:21:34', 0, 1, '安徽省马鞍山市花山区', 2, '花山区', ',1026,1061,', 1061);\nINSERT INTO `area` VALUES (1063, '2015-10-19 00:21:35', '2015-10-19 00:21:35', 0, 2, '安徽省马鞍山市雨山区', 2, '雨山区', ',1026,1061,', 1061);\nINSERT INTO `area` VALUES (1064, '2015-10-19 00:21:36', '2015-10-19 00:21:36', 0, 3, '安徽省马鞍山市博望区', 2, '博望区', ',1026,1061,', 1061);\nINSERT INTO `area` VALUES (1065, '2015-10-19 00:21:37', '2015-10-19 00:21:37', 0, 4, '安徽省马鞍山市当涂县', 2, '当涂县', ',1026,1061,', 1061);\nINSERT INTO `area` VALUES (1066, '2015-10-19 00:21:38', '2015-10-19 00:21:38', 0, 5, '安徽省马鞍山市含山县', 2, '含山县', ',1026,1061,', 1061);\nINSERT INTO `area` VALUES (1067, '2015-10-19 00:21:39', '2015-10-19 00:21:39', 0, 6, '安徽省马鞍山市和县', 2, '和县', ',1026,1061,', 1061);\nINSERT INTO `area` VALUES (1068, '2015-10-19 00:21:40', '2015-10-19 00:21:40', 0, 6, '安徽省淮北市', 1, '淮北市', ',1026,', 1026);\nINSERT INTO `area` VALUES (1069, '2015-10-19 00:21:41', '2015-10-19 00:21:41', 0, 1, '安徽省淮北市杜集区', 2, '杜集区', ',1026,1068,', 1068);\nINSERT INTO `area` VALUES (1070, '2015-10-19 00:21:42', '2015-10-19 00:21:42', 0, 2, '安徽省淮北市相山区', 2, '相山区', ',1026,1068,', 1068);\nINSERT INTO `area` VALUES (1071, '2015-10-19 00:21:43', '2015-10-19 00:21:43', 0, 3, '安徽省淮北市烈山区', 2, '烈山区', ',1026,1068,', 1068);\nINSERT INTO `area` VALUES (1072, '2015-10-19 00:21:44', '2015-10-19 00:21:44', 0, 4, '安徽省淮北市濉溪县', 2, '濉溪县', ',1026,1068,', 1068);\nINSERT INTO `area` VALUES (1073, '2015-10-19 00:21:45', '2015-10-19 00:21:45', 0, 7, '安徽省铜陵市', 1, '铜陵市', ',1026,', 1026);\nINSERT INTO `area` VALUES (1074, '2015-10-19 00:21:46', '2015-10-19 00:21:46', 0, 1, '安徽省铜陵市铜官山区', 2, '铜官山区', ',1026,1073,', 1073);\nINSERT INTO `area` VALUES (1075, '2015-10-19 00:21:47', '2015-10-19 00:21:47', 0, 2, '安徽省铜陵市狮子山区', 2, '狮子山区', ',1026,1073,', 1073);\nINSERT INTO `area` VALUES (1076, '2015-10-19 00:21:48', '2015-10-19 00:21:48', 0, 3, '安徽省铜陵市郊区', 2, '郊区', ',1026,1073,', 1073);\nINSERT INTO `area` VALUES (1077, '2015-10-19 00:21:49', '2015-10-19 00:21:49', 0, 4, '安徽省铜陵市铜陵县', 2, '铜陵县', ',1026,1073,', 1073);\nINSERT INTO `area` VALUES (1078, '2015-10-19 00:21:50', '2015-10-19 00:21:50', 0, 8, '安徽省安庆市', 1, '安庆市', ',1026,', 1026);\nINSERT INTO `area` VALUES (1079, '2015-10-19 00:21:51', '2015-10-19 00:21:51', 0, 1, '安徽省安庆市迎江区', 2, '迎江区', ',1026,1078,', 1078);\nINSERT INTO `area` VALUES (1080, '2015-10-19 00:21:52', '2015-10-19 00:21:52', 0, 2, '安徽省安庆市大观区', 2, '大观区', ',1026,1078,', 1078);\nINSERT INTO `area` VALUES (1081, '2015-10-19 00:21:53', '2015-10-19 00:21:53', 0, 3, '安徽省安庆市宜秀区', 2, '宜秀区', ',1026,1078,', 1078);\nINSERT INTO `area` VALUES (1082, '2015-10-19 00:21:54', '2015-10-19 00:21:54', 0, 4, '安徽省安庆市怀宁县', 2, '怀宁县', ',1026,1078,', 1078);\nINSERT INTO `area` VALUES (1083, '2015-10-19 00:21:55', '2015-10-19 00:21:55', 0, 5, '安徽省安庆市枞阳县', 2, '枞阳县', ',1026,1078,', 1078);\nINSERT INTO `area` VALUES (1084, '2015-10-19 00:21:56', '2015-10-19 00:21:56', 0, 6, '安徽省安庆市潜山县', 2, '潜山县', ',1026,1078,', 1078);\nINSERT INTO `area` VALUES (1085, '2015-10-19 00:21:57', '2015-10-19 00:21:57', 0, 7, '安徽省安庆市太湖县', 2, '太湖县', ',1026,1078,', 1078);\nINSERT INTO `area` VALUES (1086, '2015-10-19 00:21:58', '2015-10-19 00:21:58', 0, 8, '安徽省安庆市宿松县', 2, '宿松县', ',1026,1078,', 1078);\nINSERT INTO `area` VALUES (1087, '2015-10-19 00:21:59', '2015-10-19 00:21:59', 0, 9, '安徽省安庆市望江县', 2, '望江县', ',1026,1078,', 1078);\nINSERT INTO `area` VALUES (1088, '2015-10-19 00:22:00', '2015-10-19 00:22:00', 0, 10, '安徽省安庆市岳西县', 2, '岳西县', ',1026,1078,', 1078);\nINSERT INTO `area` VALUES (1089, '2015-10-19 00:22:01', '2015-10-19 00:22:01', 0, 11, '安徽省安庆市桐城市', 2, '桐城市', ',1026,1078,', 1078);\nINSERT INTO `area` VALUES (1090, '2015-10-19 00:22:02', '2015-10-19 00:22:02', 0, 9, '安徽省黄山市', 1, '黄山市', ',1026,', 1026);\nINSERT INTO `area` VALUES (1091, '2015-10-19 00:22:03', '2015-10-19 00:22:03', 0, 1, '安徽省黄山市屯溪区', 2, '屯溪区', ',1026,1090,', 1090);\nINSERT INTO `area` VALUES (1092, '2015-10-19 00:22:04', '2015-10-19 00:22:04', 0, 2, '安徽省黄山市黄山区', 2, '黄山区', ',1026,1090,', 1090);\nINSERT INTO `area` VALUES (1093, '2015-10-19 00:22:05', '2015-10-19 00:22:05', 0, 3, '安徽省黄山市徽州区', 2, '徽州区', ',1026,1090,', 1090);\nINSERT INTO `area` VALUES (1094, '2015-10-19 00:22:06', '2015-10-19 00:22:06', 0, 4, '安徽省黄山市歙县', 2, '歙县', ',1026,1090,', 1090);\nINSERT INTO `area` VALUES (1095, '2015-10-19 00:22:07', '2015-10-19 00:22:07', 0, 5, '安徽省黄山市休宁县', 2, '休宁县', ',1026,1090,', 1090);\nINSERT INTO `area` VALUES (1096, '2015-10-19 00:22:08', '2015-10-19 00:22:08', 0, 6, '安徽省黄山市黟县', 2, '黟县', ',1026,1090,', 1090);\nINSERT INTO `area` VALUES (1097, '2015-10-19 00:22:09', '2015-10-19 00:22:09', 0, 7, '安徽省黄山市祁门县', 2, '祁门县', ',1026,1090,', 1090);\nINSERT INTO `area` VALUES (1098, '2015-10-19 00:22:10', '2015-10-19 00:22:10', 0, 10, '安徽省滁州市', 1, '滁州市', ',1026,', 1026);\nINSERT INTO `area` VALUES (1099, '2015-10-19 00:22:11', '2015-10-19 00:22:11', 0, 1, '安徽省滁州市琅琊区', 2, '琅琊区', ',1026,1098,', 1098);\nINSERT INTO `area` VALUES (1100, '2015-10-19 00:22:12', '2015-10-19 00:22:12', 0, 2, '安徽省滁州市南谯区', 2, '南谯区', ',1026,1098,', 1098);\nINSERT INTO `area` VALUES (1101, '2015-10-19 00:22:13', '2015-10-19 00:22:13', 0, 3, '安徽省滁州市来安县', 2, '来安县', ',1026,1098,', 1098);\nINSERT INTO `area` VALUES (1102, '2015-10-19 00:22:14', '2015-10-19 00:22:14', 0, 4, '安徽省滁州市全椒县', 2, '全椒县', ',1026,1098,', 1098);\nINSERT INTO `area` VALUES (1103, '2015-10-19 00:22:15', '2015-10-19 00:22:15', 0, 5, '安徽省滁州市定远县', 2, '定远县', ',1026,1098,', 1098);\nINSERT INTO `area` VALUES (1104, '2015-10-19 00:22:16', '2015-10-19 00:22:16', 0, 6, '安徽省滁州市凤阳县', 2, '凤阳县', ',1026,1098,', 1098);\nINSERT INTO `area` VALUES (1105, '2015-10-19 00:22:17', '2015-10-19 00:22:17', 0, 7, '安徽省滁州市天长市', 2, '天长市', ',1026,1098,', 1098);\nINSERT INTO `area` VALUES (1106, '2015-10-19 00:22:18', '2015-10-19 00:22:18', 0, 8, '安徽省滁州市明光市', 2, '明光市', ',1026,1098,', 1098);\nINSERT INTO `area` VALUES (1107, '2015-10-19 00:22:19', '2015-10-19 00:22:19', 0, 11, '安徽省阜阳市', 1, '阜阳市', ',1026,', 1026);\nINSERT INTO `area` VALUES (1108, '2015-10-19 00:22:20', '2015-10-19 00:22:20', 0, 1, '安徽省阜阳市颍州区', 2, '颍州区', ',1026,1107,', 1107);\nINSERT INTO `area` VALUES (1109, '2015-10-19 00:22:21', '2015-10-19 00:22:21', 0, 2, '安徽省阜阳市颍东区', 2, '颍东区', ',1026,1107,', 1107);\nINSERT INTO `area` VALUES (1110, '2015-10-19 00:22:22', '2015-10-19 00:22:22', 0, 3, '安徽省阜阳市颍泉区', 2, '颍泉区', ',1026,1107,', 1107);\nINSERT INTO `area` VALUES (1111, '2015-10-19 00:22:23', '2015-10-19 00:22:23', 0, 4, '安徽省阜阳市临泉县', 2, '临泉县', ',1026,1107,', 1107);\nINSERT INTO `area` VALUES (1112, '2015-10-19 00:22:24', '2015-10-19 00:22:24', 0, 5, '安徽省阜阳市太和县', 2, '太和县', ',1026,1107,', 1107);\nINSERT INTO `area` VALUES (1113, '2015-10-19 00:22:25', '2015-10-19 00:22:25', 0, 6, '安徽省阜阳市阜南县', 2, '阜南县', ',1026,1107,', 1107);\nINSERT INTO `area` VALUES (1114, '2015-10-19 00:22:26', '2015-10-19 00:22:26', 0, 7, '安徽省阜阳市颍上县', 2, '颍上县', ',1026,1107,', 1107);\nINSERT INTO `area` VALUES (1115, '2015-10-19 00:22:27', '2015-10-19 00:22:27', 0, 8, '安徽省阜阳市界首市', 2, '界首市', ',1026,1107,', 1107);\nINSERT INTO `area` VALUES (1116, '2015-10-19 00:22:28', '2015-10-19 00:22:28', 0, 12, '安徽省宿州市', 1, '宿州市', ',1026,', 1026);\nINSERT INTO `area` VALUES (1117, '2015-10-19 00:22:29', '2015-10-19 00:22:29', 0, 1, '安徽省宿州市埇桥区', 2, '埇桥区', ',1026,1116,', 1116);\nINSERT INTO `area` VALUES (1118, '2015-10-19 00:22:30', '2015-10-19 00:22:30', 0, 2, '安徽省宿州市砀山县', 2, '砀山县', ',1026,1116,', 1116);\nINSERT INTO `area` VALUES (1119, '2015-10-19 00:22:31', '2015-10-19 00:22:31', 0, 3, '安徽省宿州市萧县', 2, '萧县', ',1026,1116,', 1116);\nINSERT INTO `area` VALUES (1120, '2015-10-19 00:22:32', '2015-10-19 00:22:32', 0, 4, '安徽省宿州市灵璧县', 2, '灵璧县', ',1026,1116,', 1116);\nINSERT INTO `area` VALUES (1121, '2015-10-19 00:22:33', '2015-10-19 00:22:33', 0, 5, '安徽省宿州市泗县', 2, '泗县', ',1026,1116,', 1116);\nINSERT INTO `area` VALUES (1122, '2015-10-19 00:22:34', '2015-10-19 00:22:34', 0, 13, '安徽省六安市', 1, '六安市', ',1026,', 1026);\nINSERT INTO `area` VALUES (1123, '2015-10-19 00:22:35', '2015-10-19 00:22:35', 0, 1, '安徽省六安市金安区', 2, '金安区', ',1026,1122,', 1122);\nINSERT INTO `area` VALUES (1124, '2015-10-19 00:22:36', '2015-10-19 00:22:36', 0, 2, '安徽省六安市裕安区', 2, '裕安区', ',1026,1122,', 1122);\nINSERT INTO `area` VALUES (1125, '2015-10-19 00:22:37', '2015-10-19 00:22:37', 0, 3, '安徽省六安市寿县', 2, '寿县', ',1026,1122,', 1122);\nINSERT INTO `area` VALUES (1126, '2015-10-19 00:22:38', '2015-10-19 00:22:38', 0, 4, '安徽省六安市霍邱县', 2, '霍邱县', ',1026,1122,', 1122);\nINSERT INTO `area` VALUES (1127, '2015-10-19 00:22:39', '2015-10-19 00:22:39', 0, 5, '安徽省六安市舒城县', 2, '舒城县', ',1026,1122,', 1122);\nINSERT INTO `area` VALUES (1128, '2015-10-19 00:22:40', '2015-10-19 00:22:40', 0, 6, '安徽省六安市金寨县', 2, '金寨县', ',1026,1122,', 1122);\nINSERT INTO `area` VALUES (1129, '2015-10-19 00:22:41', '2015-10-19 00:22:41', 0, 7, '安徽省六安市霍山县', 2, '霍山县', ',1026,1122,', 1122);\nINSERT INTO `area` VALUES (1130, '2015-10-19 00:22:42', '2015-10-19 00:22:42', 0, 14, '安徽省亳州市', 1, '亳州市', ',1026,', 1026);\nINSERT INTO `area` VALUES (1131, '2015-10-19 00:22:43', '2015-10-19 00:22:43', 0, 1, '安徽省亳州市谯城区', 2, '谯城区', ',1026,1130,', 1130);\nINSERT INTO `area` VALUES (1132, '2015-10-19 00:22:44', '2015-10-19 00:22:44', 0, 2, '安徽省亳州市涡阳县', 2, '涡阳县', ',1026,1130,', 1130);\nINSERT INTO `area` VALUES (1133, '2015-10-19 00:22:45', '2015-10-19 00:22:45', 0, 3, '安徽省亳州市蒙城县', 2, '蒙城县', ',1026,1130,', 1130);\nINSERT INTO `area` VALUES (1134, '2015-10-19 00:22:46', '2015-10-19 00:22:46', 0, 4, '安徽省亳州市利辛县', 2, '利辛县', ',1026,1130,', 1130);\nINSERT INTO `area` VALUES (1135, '2015-10-19 00:22:47', '2015-10-19 00:22:47', 0, 15, '安徽省池州市', 1, '池州市', ',1026,', 1026);\nINSERT INTO `area` VALUES (1136, '2015-10-19 00:22:48', '2015-10-19 00:22:48', 0, 1, '安徽省池州市贵池区', 2, '贵池区', ',1026,1135,', 1135);\nINSERT INTO `area` VALUES (1137, '2015-10-19 00:22:49', '2015-10-19 00:22:49', 0, 2, '安徽省池州市东至县', 2, '东至县', ',1026,1135,', 1135);\nINSERT INTO `area` VALUES (1138, '2015-10-19 00:22:50', '2015-10-19 00:22:50', 0, 3, '安徽省池州市石台县', 2, '石台县', ',1026,1135,', 1135);\nINSERT INTO `area` VALUES (1139, '2015-10-19 00:22:51', '2015-10-19 00:22:51', 0, 4, '安徽省池州市青阳县', 2, '青阳县', ',1026,1135,', 1135);\nINSERT INTO `area` VALUES (1140, '2015-10-19 00:22:52', '2015-10-19 00:22:52', 0, 16, '安徽省宣城市', 1, '宣城市', ',1026,', 1026);\nINSERT INTO `area` VALUES (1141, '2015-10-19 00:22:53', '2015-10-19 00:22:53', 0, 1, '安徽省宣城市宣州区', 2, '宣州区', ',1026,1140,', 1140);\nINSERT INTO `area` VALUES (1142, '2015-10-19 00:22:54', '2015-10-19 00:22:54', 0, 2, '安徽省宣城市郎溪县', 2, '郎溪县', ',1026,1140,', 1140);\nINSERT INTO `area` VALUES (1143, '2015-10-19 00:22:55', '2015-10-19 00:22:55', 0, 3, '安徽省宣城市广德县', 2, '广德县', ',1026,1140,', 1140);\nINSERT INTO `area` VALUES (1144, '2015-10-19 00:22:56', '2015-10-19 00:22:56', 0, 4, '安徽省宣城市泾县', 2, '泾县', ',1026,1140,', 1140);\nINSERT INTO `area` VALUES (1145, '2015-10-19 00:22:57', '2015-10-19 00:22:57', 0, 5, '安徽省宣城市绩溪县', 2, '绩溪县', ',1026,1140,', 1140);\nINSERT INTO `area` VALUES (1146, '2015-10-19 00:22:58', '2015-10-19 00:22:58', 0, 6, '安徽省宣城市旌德县', 2, '旌德县', ',1026,1140,', 1140);\nINSERT INTO `area` VALUES (1147, '2015-10-19 00:22:59', '2015-10-19 00:22:59', 0, 7, '安徽省宣城市宁国市', 2, '宁国市', ',1026,1140,', 1140);\nINSERT INTO `area` VALUES (1148, '2015-10-19 00:23:00', '2015-10-19 00:23:00', 0, 13, '福建省', 0, '福建省', ',', NULL);\nINSERT INTO `area` VALUES (1149, '2015-10-19 00:23:01', '2015-10-19 00:23:01', 0, 1, '福建省福州市', 1, '福州市', ',1148,', 1148);\nINSERT INTO `area` VALUES (1150, '2015-10-19 00:23:02', '2015-10-19 00:23:02', 0, 1, '福建省福州市鼓楼区', 2, '鼓楼区', ',1148,1149,', 1149);\nINSERT INTO `area` VALUES (1151, '2015-10-19 00:23:03', '2015-10-19 00:23:03', 0, 2, '福建省福州市台江区', 2, '台江区', ',1148,1149,', 1149);\nINSERT INTO `area` VALUES (1152, '2015-10-19 00:23:04', '2015-10-19 00:23:04', 0, 3, '福建省福州市仓山区', 2, '仓山区', ',1148,1149,', 1149);\nINSERT INTO `area` VALUES (1153, '2015-10-19 00:23:05', '2015-10-19 00:23:05', 0, 4, '福建省福州市马尾区', 2, '马尾区', ',1148,1149,', 1149);\nINSERT INTO `area` VALUES (1154, '2015-10-19 00:23:06', '2015-10-19 00:23:06', 0, 5, '福建省福州市晋安区', 2, '晋安区', ',1148,1149,', 1149);\nINSERT INTO `area` VALUES (1155, '2015-10-19 00:23:07', '2015-10-19 00:23:07', 0, 6, '福建省福州市闽侯县', 2, '闽侯县', ',1148,1149,', 1149);\nINSERT INTO `area` VALUES (1156, '2015-10-19 00:23:08', '2015-10-19 00:23:08', 0, 7, '福建省福州市连江县', 2, '连江县', ',1148,1149,', 1149);\nINSERT INTO `area` VALUES (1157, '2015-10-19 00:23:09', '2015-10-19 00:23:09', 0, 8, '福建省福州市罗源县', 2, '罗源县', ',1148,1149,', 1149);\nINSERT INTO `area` VALUES (1158, '2015-10-19 00:23:10', '2015-10-19 00:23:10', 0, 9, '福建省福州市闽清县', 2, '闽清县', ',1148,1149,', 1149);\nINSERT INTO `area` VALUES (1159, '2015-10-19 00:23:11', '2015-10-19 00:23:11', 0, 10, '福建省福州市永泰县', 2, '永泰县', ',1148,1149,', 1149);\nINSERT INTO `area` VALUES (1160, '2015-10-19 00:23:12', '2015-10-19 00:23:12', 0, 11, '福建省福州市平潭县', 2, '平潭县', ',1148,1149,', 1149);\nINSERT INTO `area` VALUES (1161, '2015-10-19 00:23:13', '2015-10-19 00:23:13', 0, 12, '福建省福州市福清市', 2, '福清市', ',1148,1149,', 1149);\nINSERT INTO `area` VALUES (1162, '2015-10-19 00:23:14', '2015-10-19 00:23:14', 0, 13, '福建省福州市长乐市', 2, '长乐市', ',1148,1149,', 1149);\nINSERT INTO `area` VALUES (1163, '2015-10-19 00:23:15', '2015-10-19 00:23:15', 0, 2, '福建省厦门市', 1, '厦门市', ',1148,', 1148);\nINSERT INTO `area` VALUES (1164, '2015-10-19 00:23:16', '2015-10-19 00:23:16', 0, 1, '福建省厦门市思明区', 2, '思明区', ',1148,1163,', 1163);\nINSERT INTO `area` VALUES (1165, '2015-10-19 00:23:17', '2015-10-19 00:23:17', 0, 2, '福建省厦门市海沧区', 2, '海沧区', ',1148,1163,', 1163);\nINSERT INTO `area` VALUES (1166, '2015-10-19 00:23:18', '2015-10-19 00:23:18', 0, 3, '福建省厦门市湖里区', 2, '湖里区', ',1148,1163,', 1163);\nINSERT INTO `area` VALUES (1167, '2015-10-19 00:23:19', '2015-10-19 00:23:19', 0, 4, '福建省厦门市集美区', 2, '集美区', ',1148,1163,', 1163);\nINSERT INTO `area` VALUES (1168, '2015-10-19 00:23:20', '2015-10-19 00:23:20', 0, 5, '福建省厦门市同安区', 2, '同安区', ',1148,1163,', 1163);\nINSERT INTO `area` VALUES (1169, '2015-10-19 00:23:21', '2015-10-19 00:23:21', 0, 6, '福建省厦门市翔安区', 2, '翔安区', ',1148,1163,', 1163);\nINSERT INTO `area` VALUES (1170, '2015-10-19 00:23:22', '2015-10-19 00:23:22', 0, 3, '福建省莆田市', 1, '莆田市', ',1148,', 1148);\nINSERT INTO `area` VALUES (1171, '2015-10-19 00:23:23', '2015-10-19 00:23:23', 0, 1, '福建省莆田市城厢区', 2, '城厢区', ',1148,1170,', 1170);\nINSERT INTO `area` VALUES (1172, '2015-10-19 00:23:24', '2015-10-19 00:23:24', 0, 2, '福建省莆田市涵江区', 2, '涵江区', ',1148,1170,', 1170);\nINSERT INTO `area` VALUES (1173, '2015-10-19 00:23:25', '2015-10-19 00:23:25', 0, 3, '福建省莆田市荔城区', 2, '荔城区', ',1148,1170,', 1170);\nINSERT INTO `area` VALUES (1174, '2015-10-19 00:23:26', '2015-10-19 00:23:26', 0, 4, '福建省莆田市秀屿区', 2, '秀屿区', ',1148,1170,', 1170);\nINSERT INTO `area` VALUES (1175, '2015-10-19 00:23:27', '2015-10-19 00:23:27', 0, 5, '福建省莆田市仙游县', 2, '仙游县', ',1148,1170,', 1170);\nINSERT INTO `area` VALUES (1176, '2015-10-19 00:23:28', '2015-10-19 00:23:28', 0, 4, '福建省三明市', 1, '三明市', ',1148,', 1148);\nINSERT INTO `area` VALUES (1177, '2015-10-19 00:23:29', '2015-10-19 00:23:29', 0, 1, '福建省三明市梅列区', 2, '梅列区', ',1148,1176,', 1176);\nINSERT INTO `area` VALUES (1178, '2015-10-19 00:23:30', '2015-10-19 00:23:30', 0, 2, '福建省三明市三元区', 2, '三元区', ',1148,1176,', 1176);\nINSERT INTO `area` VALUES (1179, '2015-10-19 00:23:31', '2015-10-19 00:23:31', 0, 3, '福建省三明市明溪县', 2, '明溪县', ',1148,1176,', 1176);\nINSERT INTO `area` VALUES (1180, '2015-10-19 00:23:32', '2015-10-19 00:23:32', 0, 4, '福建省三明市清流县', 2, '清流县', ',1148,1176,', 1176);\nINSERT INTO `area` VALUES (1181, '2015-10-19 00:23:33', '2015-10-19 00:23:33', 0, 5, '福建省三明市宁化县', 2, '宁化县', ',1148,1176,', 1176);\nINSERT INTO `area` VALUES (1182, '2015-10-19 00:23:34', '2015-10-19 00:23:34', 0, 6, '福建省三明市大田县', 2, '大田县', ',1148,1176,', 1176);\nINSERT INTO `area` VALUES (1183, '2015-10-19 00:23:35', '2015-10-19 00:23:35', 0, 7, '福建省三明市尤溪县', 2, '尤溪县', ',1148,1176,', 1176);\nINSERT INTO `area` VALUES (1184, '2015-10-19 00:23:36', '2015-10-19 00:23:36', 0, 8, '福建省三明市沙县', 2, '沙县', ',1148,1176,', 1176);\nINSERT INTO `area` VALUES (1185, '2015-10-19 00:23:37', '2015-10-19 00:23:37', 0, 9, '福建省三明市将乐县', 2, '将乐县', ',1148,1176,', 1176);\nINSERT INTO `area` VALUES (1186, '2015-10-19 00:23:38', '2015-10-19 00:23:38', 0, 10, '福建省三明市泰宁县', 2, '泰宁县', ',1148,1176,', 1176);\nINSERT INTO `area` VALUES (1187, '2015-10-19 00:23:39', '2015-10-19 00:23:39', 0, 11, '福建省三明市建宁县', 2, '建宁县', ',1148,1176,', 1176);\nINSERT INTO `area` VALUES (1188, '2015-10-19 00:23:40', '2015-10-19 00:23:40', 0, 12, '福建省三明市永安市', 2, '永安市', ',1148,1176,', 1176);\nINSERT INTO `area` VALUES (1189, '2015-10-19 00:23:41', '2015-10-19 00:23:41', 0, 5, '福建省泉州市', 1, '泉州市', ',1148,', 1148);\nINSERT INTO `area` VALUES (1190, '2015-10-19 00:23:42', '2015-10-19 00:23:42', 0, 1, '福建省泉州市鲤城区', 2, '鲤城区', ',1148,1189,', 1189);\nINSERT INTO `area` VALUES (1191, '2015-10-19 00:23:43', '2015-10-19 00:23:43', 0, 2, '福建省泉州市丰泽区', 2, '丰泽区', ',1148,1189,', 1189);\nINSERT INTO `area` VALUES (1192, '2015-10-19 00:23:44', '2015-10-19 00:23:44', 0, 3, '福建省泉州市洛江区', 2, '洛江区', ',1148,1189,', 1189);\nINSERT INTO `area` VALUES (1193, '2015-10-19 00:23:45', '2015-10-19 00:23:45', 0, 4, '福建省泉州市泉港区', 2, '泉港区', ',1148,1189,', 1189);\nINSERT INTO `area` VALUES (1194, '2015-10-19 00:23:46', '2015-10-19 00:23:46', 0, 5, '福建省泉州市惠安县', 2, '惠安县', ',1148,1189,', 1189);\nINSERT INTO `area` VALUES (1195, '2015-10-19 00:23:47', '2015-10-19 00:23:47', 0, 6, '福建省泉州市安溪县', 2, '安溪县', ',1148,1189,', 1189);\nINSERT INTO `area` VALUES (1196, '2015-10-19 00:23:48', '2015-10-19 00:23:48', 0, 7, '福建省泉州市永春县', 2, '永春县', ',1148,1189,', 1189);\nINSERT INTO `area` VALUES (1197, '2015-10-19 00:23:49', '2015-10-19 00:23:49', 0, 8, '福建省泉州市德化县', 2, '德化县', ',1148,1189,', 1189);\nINSERT INTO `area` VALUES (1198, '2015-10-19 00:23:50', '2015-10-19 00:23:50', 0, 9, '福建省泉州市金门县', 2, '金门县', ',1148,1189,', 1189);\nINSERT INTO `area` VALUES (1199, '2015-10-19 00:23:51', '2015-10-19 00:23:51', 0, 10, '福建省泉州市石狮市', 2, '石狮市', ',1148,1189,', 1189);\nINSERT INTO `area` VALUES (1200, '2015-10-19 00:23:52', '2015-10-19 00:23:52', 0, 11, '福建省泉州市晋江市', 2, '晋江市', ',1148,1189,', 1189);\nINSERT INTO `area` VALUES (1201, '2015-10-19 00:23:53', '2015-10-19 00:23:53', 0, 12, '福建省泉州市南安市', 2, '南安市', ',1148,1189,', 1189);\nINSERT INTO `area` VALUES (1202, '2015-10-19 00:23:54', '2015-10-19 00:23:54', 0, 6, '福建省漳州市', 1, '漳州市', ',1148,', 1148);\nINSERT INTO `area` VALUES (1203, '2015-10-19 00:23:55', '2015-10-19 00:23:55', 0, 1, '福建省漳州市芗城区', 2, '芗城区', ',1148,1202,', 1202);\nINSERT INTO `area` VALUES (1204, '2015-10-19 00:23:56', '2015-10-19 00:23:56', 0, 2, '福建省漳州市龙文区', 2, '龙文区', ',1148,1202,', 1202);\nINSERT INTO `area` VALUES (1205, '2015-10-19 00:23:57', '2015-10-19 00:23:57', 0, 3, '福建省漳州市云霄县', 2, '云霄县', ',1148,1202,', 1202);\nINSERT INTO `area` VALUES (1206, '2015-10-19 00:23:58', '2015-10-19 00:23:58', 0, 4, '福建省漳州市漳浦县', 2, '漳浦县', ',1148,1202,', 1202);\nINSERT INTO `area` VALUES (1207, '2015-10-19 00:23:59', '2015-10-19 00:23:59', 0, 5, '福建省漳州市诏安县', 2, '诏安县', ',1148,1202,', 1202);\nINSERT INTO `area` VALUES (1208, '2015-10-19 00:24:00', '2015-10-19 00:24:00', 0, 6, '福建省漳州市长泰县', 2, '长泰县', ',1148,1202,', 1202);\nINSERT INTO `area` VALUES (1209, '2015-10-19 00:24:01', '2015-10-19 00:24:01', 0, 7, '福建省漳州市东山县', 2, '东山县', ',1148,1202,', 1202);\nINSERT INTO `area` VALUES (1210, '2015-10-19 00:24:02', '2015-10-19 00:24:02', 0, 8, '福建省漳州市南靖县', 2, '南靖县', ',1148,1202,', 1202);\nINSERT INTO `area` VALUES (1211, '2015-10-19 00:24:03', '2015-10-19 00:24:03', 0, 9, '福建省漳州市平和县', 2, '平和县', ',1148,1202,', 1202);\nINSERT INTO `area` VALUES (1212, '2015-10-19 00:24:04', '2015-10-19 00:24:04', 0, 10, '福建省漳州市华安县', 2, '华安县', ',1148,1202,', 1202);\nINSERT INTO `area` VALUES (1213, '2015-10-19 00:24:05', '2015-10-19 00:24:05', 0, 11, '福建省漳州市龙海市', 2, '龙海市', ',1148,1202,', 1202);\nINSERT INTO `area` VALUES (1214, '2015-10-19 00:24:06', '2015-10-19 00:24:06', 0, 7, '福建省南平市', 1, '南平市', ',1148,', 1148);\nINSERT INTO `area` VALUES (1215, '2015-10-19 00:24:07', '2015-10-19 00:24:07', 0, 1, '福建省南平市延平区', 2, '延平区', ',1148,1214,', 1214);\nINSERT INTO `area` VALUES (1216, '2015-10-19 00:24:08', '2015-10-19 00:24:08', 0, 2, '福建省南平市顺昌县', 2, '顺昌县', ',1148,1214,', 1214);\nINSERT INTO `area` VALUES (1217, '2015-10-19 00:24:09', '2015-10-19 00:24:09', 0, 3, '福建省南平市浦城县', 2, '浦城县', ',1148,1214,', 1214);\nINSERT INTO `area` VALUES (1218, '2015-10-19 00:24:10', '2015-10-19 00:24:10', 0, 4, '福建省南平市光泽县', 2, '光泽县', ',1148,1214,', 1214);\nINSERT INTO `area` VALUES (1219, '2015-10-19 00:24:11', '2015-10-19 00:24:11', 0, 5, '福建省南平市松溪县', 2, '松溪县', ',1148,1214,', 1214);\nINSERT INTO `area` VALUES (1220, '2015-10-19 00:24:12', '2015-10-19 00:24:12', 0, 6, '福建省南平市政和县', 2, '政和县', ',1148,1214,', 1214);\nINSERT INTO `area` VALUES (1221, '2015-10-19 00:24:13', '2015-10-19 00:24:13', 0, 7, '福建省南平市邵武市', 2, '邵武市', ',1148,1214,', 1214);\nINSERT INTO `area` VALUES (1222, '2015-10-19 00:24:14', '2015-10-19 00:24:14', 0, 8, '福建省南平市武夷山市', 2, '武夷山市', ',1148,1214,', 1214);\nINSERT INTO `area` VALUES (1223, '2015-10-19 00:24:15', '2015-10-19 00:24:15', 0, 9, '福建省南平市建瓯市', 2, '建瓯市', ',1148,1214,', 1214);\nINSERT INTO `area` VALUES (1224, '2015-10-19 00:24:16', '2015-10-19 00:24:16', 0, 10, '福建省南平市建阳市', 2, '建阳市', ',1148,1214,', 1214);\nINSERT INTO `area` VALUES (1225, '2015-10-19 00:24:17', '2015-10-19 00:24:17', 0, 8, '福建省龙岩市', 1, '龙岩市', ',1148,', 1148);\nINSERT INTO `area` VALUES (1226, '2015-10-19 00:24:18', '2015-10-19 00:24:18', 0, 1, '福建省龙岩市新罗区', 2, '新罗区', ',1148,1225,', 1225);\nINSERT INTO `area` VALUES (1227, '2015-10-19 00:24:19', '2015-10-19 00:24:19', 0, 2, '福建省龙岩市长汀县', 2, '长汀县', ',1148,1225,', 1225);\nINSERT INTO `area` VALUES (1228, '2015-10-19 00:24:20', '2015-10-19 00:24:20', 0, 3, '福建省龙岩市永定县', 2, '永定县', ',1148,1225,', 1225);\nINSERT INTO `area` VALUES (1229, '2015-10-19 00:24:21', '2015-10-19 00:24:21', 0, 4, '福建省龙岩市上杭县', 2, '上杭县', ',1148,1225,', 1225);\nINSERT INTO `area` VALUES (1230, '2015-10-19 00:24:22', '2015-10-19 00:24:22', 0, 5, '福建省龙岩市武平县', 2, '武平县', ',1148,1225,', 1225);\nINSERT INTO `area` VALUES (1231, '2015-10-19 00:24:23', '2015-10-19 00:24:23', 0, 6, '福建省龙岩市连城县', 2, '连城县', ',1148,1225,', 1225);\nINSERT INTO `area` VALUES (1232, '2015-10-19 00:24:24', '2015-10-19 00:24:24', 0, 7, '福建省龙岩市漳平市', 2, '漳平市', ',1148,1225,', 1225);\nINSERT INTO `area` VALUES (1233, '2015-10-19 00:24:25', '2015-10-19 00:24:25', 0, 9, '福建省宁德市', 1, '宁德市', ',1148,', 1148);\nINSERT INTO `area` VALUES (1234, '2015-10-19 00:24:26', '2015-10-19 00:24:26', 0, 1, '福建省宁德市蕉城区', 2, '蕉城区', ',1148,1233,', 1233);\nINSERT INTO `area` VALUES (1235, '2015-10-19 00:24:27', '2015-10-19 00:24:27', 0, 2, '福建省宁德市霞浦县', 2, '霞浦县', ',1148,1233,', 1233);\nINSERT INTO `area` VALUES (1236, '2015-10-19 00:24:28', '2015-10-19 00:24:28', 0, 3, '福建省宁德市古田县', 2, '古田县', ',1148,1233,', 1233);\nINSERT INTO `area` VALUES (1237, '2015-10-19 00:24:29', '2015-10-19 00:24:29', 0, 4, '福建省宁德市屏南县', 2, '屏南县', ',1148,1233,', 1233);\nINSERT INTO `area` VALUES (1238, '2015-10-19 00:24:30', '2015-10-19 00:24:30', 0, 5, '福建省宁德市寿宁县', 2, '寿宁县', ',1148,1233,', 1233);\nINSERT INTO `area` VALUES (1239, '2015-10-19 00:24:31', '2015-10-19 00:24:31', 0, 6, '福建省宁德市周宁县', 2, '周宁县', ',1148,1233,', 1233);\nINSERT INTO `area` VALUES (1240, '2015-10-19 00:24:32', '2015-10-19 00:24:32', 0, 7, '福建省宁德市柘荣县', 2, '柘荣县', ',1148,1233,', 1233);\nINSERT INTO `area` VALUES (1241, '2015-10-19 00:24:33', '2015-10-19 00:24:33', 0, 8, '福建省宁德市福安市', 2, '福安市', ',1148,1233,', 1233);\nINSERT INTO `area` VALUES (1242, '2015-10-19 00:24:34', '2015-10-19 00:24:34', 0, 9, '福建省宁德市福鼎市', 2, '福鼎市', ',1148,1233,', 1233);\nINSERT INTO `area` VALUES (1243, '2015-10-19 00:24:35', '2015-10-19 00:24:35', 0, 14, '江西省', 0, '江西省', ',', NULL);\nINSERT INTO `area` VALUES (1244, '2015-10-19 00:24:36', '2015-10-19 00:24:36', 0, 1, '江西省南昌市', 1, '南昌市', ',1243,', 1243);\nINSERT INTO `area` VALUES (1245, '2015-10-19 00:24:37', '2015-10-19 00:24:37', 0, 1, '江西省南昌市东湖区', 2, '东湖区', ',1243,1244,', 1244);\nINSERT INTO `area` VALUES (1246, '2015-10-19 00:24:38', '2015-10-19 00:24:38', 0, 2, '江西省南昌市西湖区', 2, '西湖区', ',1243,1244,', 1244);\nINSERT INTO `area` VALUES (1247, '2015-10-19 00:24:39', '2015-10-19 00:24:39', 0, 3, '江西省南昌市青云谱区', 2, '青云谱区', ',1243,1244,', 1244);\nINSERT INTO `area` VALUES (1248, '2015-10-19 00:24:40', '2015-10-19 00:24:40', 0, 4, '江西省南昌市湾里区', 2, '湾里区', ',1243,1244,', 1244);\nINSERT INTO `area` VALUES (1249, '2015-10-19 00:24:41', '2015-10-19 00:24:41', 0, 5, '江西省南昌市青山湖区', 2, '青山湖区', ',1243,1244,', 1244);\nINSERT INTO `area` VALUES (1250, '2015-10-19 00:24:42', '2015-10-19 00:24:42', 0, 6, '江西省南昌市南昌县', 2, '南昌县', ',1243,1244,', 1244);\nINSERT INTO `area` VALUES (1251, '2015-10-19 00:24:43', '2015-10-19 00:24:43', 0, 7, '江西省南昌市新建县', 2, '新建县', ',1243,1244,', 1244);\nINSERT INTO `area` VALUES (1252, '2015-10-19 00:24:44', '2015-10-19 00:24:44', 0, 8, '江西省南昌市安义县', 2, '安义县', ',1243,1244,', 1244);\nINSERT INTO `area` VALUES (1253, '2015-10-19 00:24:45', '2015-10-19 00:24:45', 0, 9, '江西省南昌市进贤县', 2, '进贤县', ',1243,1244,', 1244);\nINSERT INTO `area` VALUES (1254, '2015-10-19 00:24:46', '2015-10-19 00:24:46', 0, 2, '江西省景德镇市', 1, '景德镇市', ',1243,', 1243);\nINSERT INTO `area` VALUES (1255, '2015-10-19 00:24:47', '2015-10-19 00:24:47', 0, 1, '江西省景德镇市昌江区', 2, '昌江区', ',1243,1254,', 1254);\nINSERT INTO `area` VALUES (1256, '2015-10-19 00:24:48', '2015-10-19 00:24:48', 0, 2, '江西省景德镇市珠山区', 2, '珠山区', ',1243,1254,', 1254);\nINSERT INTO `area` VALUES (1257, '2015-10-19 00:24:49', '2015-10-19 00:24:49', 0, 3, '江西省景德镇市浮梁县', 2, '浮梁县', ',1243,1254,', 1254);\nINSERT INTO `area` VALUES (1258, '2015-10-19 00:24:50', '2015-10-19 00:24:50', 0, 4, '江西省景德镇市乐平市', 2, '乐平市', ',1243,1254,', 1254);\nINSERT INTO `area` VALUES (1259, '2015-10-19 00:24:51', '2015-10-19 00:24:51', 0, 3, '江西省萍乡市', 1, '萍乡市', ',1243,', 1243);\nINSERT INTO `area` VALUES (1260, '2015-10-19 00:24:52', '2015-10-19 00:24:52', 0, 1, '江西省萍乡市安源区', 2, '安源区', ',1243,1259,', 1259);\nINSERT INTO `area` VALUES (1261, '2015-10-19 00:24:53', '2015-10-19 00:24:53', 0, 2, '江西省萍乡市湘东区', 2, '湘东区', ',1243,1259,', 1259);\nINSERT INTO `area` VALUES (1262, '2015-10-19 00:24:54', '2015-10-19 00:24:54', 0, 3, '江西省萍乡市莲花县', 2, '莲花县', ',1243,1259,', 1259);\nINSERT INTO `area` VALUES (1263, '2015-10-19 00:24:55', '2015-10-19 00:24:55', 0, 4, '江西省萍乡市上栗县', 2, '上栗县', ',1243,1259,', 1259);\nINSERT INTO `area` VALUES (1264, '2015-10-19 00:24:56', '2015-10-19 00:24:56', 0, 5, '江西省萍乡市芦溪县', 2, '芦溪县', ',1243,1259,', 1259);\nINSERT INTO `area` VALUES (1265, '2015-10-19 00:24:57', '2015-10-19 00:24:57', 0, 4, '江西省九江市', 1, '九江市', ',1243,', 1243);\nINSERT INTO `area` VALUES (1266, '2015-10-19 00:24:58', '2015-10-19 00:24:58', 0, 1, '江西省九江市庐山区', 2, '庐山区', ',1243,1265,', 1265);\nINSERT INTO `area` VALUES (1267, '2015-10-19 00:24:59', '2015-10-19 00:24:59', 0, 2, '江西省九江市浔阳区', 2, '浔阳区', ',1243,1265,', 1265);\nINSERT INTO `area` VALUES (1268, '2015-10-19 00:25:00', '2015-10-19 00:25:00', 0, 3, '江西省九江市九江县', 2, '九江县', ',1243,1265,', 1265);\nINSERT INTO `area` VALUES (1269, '2015-10-19 00:25:01', '2015-10-19 00:25:01', 0, 4, '江西省九江市武宁县', 2, '武宁县', ',1243,1265,', 1265);\nINSERT INTO `area` VALUES (1270, '2015-10-19 00:25:02', '2015-10-19 00:25:02', 0, 5, '江西省九江市修水县', 2, '修水县', ',1243,1265,', 1265);\nINSERT INTO `area` VALUES (1271, '2015-10-19 00:25:03', '2015-10-19 00:25:03', 0, 6, '江西省九江市永修县', 2, '永修县', ',1243,1265,', 1265);\nINSERT INTO `area` VALUES (1272, '2015-10-19 00:25:04', '2015-10-19 00:25:04', 0, 7, '江西省九江市德安县', 2, '德安县', ',1243,1265,', 1265);\nINSERT INTO `area` VALUES (1273, '2015-10-19 00:25:05', '2015-10-19 00:25:05', 0, 8, '江西省九江市星子县', 2, '星子县', ',1243,1265,', 1265);\nINSERT INTO `area` VALUES (1274, '2015-10-19 00:25:06', '2015-10-19 00:25:06', 0, 9, '江西省九江市都昌县', 2, '都昌县', ',1243,1265,', 1265);\nINSERT INTO `area` VALUES (1275, '2015-10-19 00:25:07', '2015-10-19 00:25:07', 0, 10, '江西省九江市湖口县', 2, '湖口县', ',1243,1265,', 1265);\nINSERT INTO `area` VALUES (1276, '2015-10-19 00:25:08', '2015-10-19 00:25:08', 0, 11, '江西省九江市彭泽县', 2, '彭泽县', ',1243,1265,', 1265);\nINSERT INTO `area` VALUES (1277, '2015-10-19 00:25:09', '2015-10-19 00:25:09', 0, 12, '江西省九江市瑞昌市', 2, '瑞昌市', ',1243,1265,', 1265);\nINSERT INTO `area` VALUES (1278, '2015-10-19 00:25:10', '2015-10-19 00:25:10', 0, 13, '江西省九江市共青城市', 2, '共青城市', ',1243,1265,', 1265);\nINSERT INTO `area` VALUES (1279, '2015-10-19 00:25:11', '2015-10-19 00:25:11', 0, 5, '江西省新余市', 1, '新余市', ',1243,', 1243);\nINSERT INTO `area` VALUES (1280, '2015-10-19 00:25:12', '2015-10-19 00:25:12', 0, 1, '江西省新余市渝水区', 2, '渝水区', ',1243,1279,', 1279);\nINSERT INTO `area` VALUES (1281, '2015-10-19 00:25:13', '2015-10-19 00:25:13', 0, 2, '江西省新余市分宜县', 2, '分宜县', ',1243,1279,', 1279);\nINSERT INTO `area` VALUES (1282, '2015-10-19 00:25:14', '2015-10-19 00:25:14', 0, 6, '江西省鹰潭市', 1, '鹰潭市', ',1243,', 1243);\nINSERT INTO `area` VALUES (1283, '2015-10-19 00:25:15', '2015-10-19 00:25:15', 0, 1, '江西省鹰潭市月湖区', 2, '月湖区', ',1243,1282,', 1282);\nINSERT INTO `area` VALUES (1284, '2015-10-19 00:25:16', '2015-10-19 00:25:16', 0, 2, '江西省鹰潭市余江县', 2, '余江县', ',1243,1282,', 1282);\nINSERT INTO `area` VALUES (1285, '2015-10-19 00:25:17', '2015-10-19 00:25:17', 0, 3, '江西省鹰潭市贵溪市', 2, '贵溪市', ',1243,1282,', 1282);\nINSERT INTO `area` VALUES (1286, '2015-10-19 00:25:18', '2015-10-19 00:25:18', 0, 7, '江西省赣州市', 1, '赣州市', ',1243,', 1243);\nINSERT INTO `area` VALUES (1287, '2015-10-19 00:25:19', '2015-10-19 00:25:19', 0, 1, '江西省赣州市章贡区', 2, '章贡区', ',1243,1286,', 1286);\nINSERT INTO `area` VALUES (1288, '2015-10-19 00:25:20', '2015-10-19 00:25:20', 0, 2, '江西省赣州市赣县', 2, '赣县', ',1243,1286,', 1286);\nINSERT INTO `area` VALUES (1289, '2015-10-19 00:25:21', '2015-10-19 00:25:21', 0, 3, '江西省赣州市信丰县', 2, '信丰县', ',1243,1286,', 1286);\nINSERT INTO `area` VALUES (1290, '2015-10-19 00:25:22', '2015-10-19 00:25:22', 0, 4, '江西省赣州市大余县', 2, '大余县', ',1243,1286,', 1286);\nINSERT INTO `area` VALUES (1291, '2015-10-19 00:25:23', '2015-10-19 00:25:23', 0, 5, '江西省赣州市上犹县', 2, '上犹县', ',1243,1286,', 1286);\nINSERT INTO `area` VALUES (1292, '2015-10-19 00:25:24', '2015-10-19 00:25:24', 0, 6, '江西省赣州市崇义县', 2, '崇义县', ',1243,1286,', 1286);\nINSERT INTO `area` VALUES (1293, '2015-10-19 00:25:25', '2015-10-19 00:25:25', 0, 7, '江西省赣州市安远县', 2, '安远县', ',1243,1286,', 1286);\nINSERT INTO `area` VALUES (1294, '2015-10-19 00:25:26', '2015-10-19 00:25:26', 0, 8, '江西省赣州市龙南县', 2, '龙南县', ',1243,1286,', 1286);\nINSERT INTO `area` VALUES (1295, '2015-10-19 00:25:27', '2015-10-19 00:25:27', 0, 9, '江西省赣州市定南县', 2, '定南县', ',1243,1286,', 1286);\nINSERT INTO `area` VALUES (1296, '2015-10-19 00:25:28', '2015-10-19 00:25:28', 0, 10, '江西省赣州市全南县', 2, '全南县', ',1243,1286,', 1286);\nINSERT INTO `area` VALUES (1297, '2015-10-19 00:25:29', '2015-10-19 00:25:29', 0, 11, '江西省赣州市宁都县', 2, '宁都县', ',1243,1286,', 1286);\nINSERT INTO `area` VALUES (1298, '2015-10-19 00:25:30', '2015-10-19 00:25:30', 0, 12, '江西省赣州市于都县', 2, '于都县', ',1243,1286,', 1286);\nINSERT INTO `area` VALUES (1299, '2015-10-19 00:25:31', '2015-10-19 00:25:31', 0, 13, '江西省赣州市兴国县', 2, '兴国县', ',1243,1286,', 1286);\nINSERT INTO `area` VALUES (1300, '2015-10-19 00:25:32', '2015-10-19 00:25:32', 0, 14, '江西省赣州市会昌县', 2, '会昌县', ',1243,1286,', 1286);\nINSERT INTO `area` VALUES (1301, '2015-10-19 00:25:33', '2015-10-19 00:25:33', 0, 15, '江西省赣州市寻乌县', 2, '寻乌县', ',1243,1286,', 1286);\nINSERT INTO `area` VALUES (1302, '2015-10-19 00:25:34', '2015-10-19 00:25:34', 0, 16, '江西省赣州市石城县', 2, '石城县', ',1243,1286,', 1286);\nINSERT INTO `area` VALUES (1303, '2015-10-19 00:25:35', '2015-10-19 00:25:35', 0, 17, '江西省赣州市瑞金市', 2, '瑞金市', ',1243,1286,', 1286);\nINSERT INTO `area` VALUES (1304, '2015-10-19 00:25:36', '2015-10-19 00:25:36', 0, 18, '江西省赣州市南康市', 2, '南康市', ',1243,1286,', 1286);\nINSERT INTO `area` VALUES (1305, '2015-10-19 00:25:37', '2015-10-19 00:25:37', 0, 8, '江西省吉安市', 1, '吉安市', ',1243,', 1243);\nINSERT INTO `area` VALUES (1306, '2015-10-19 00:25:38', '2015-10-19 00:25:38', 0, 1, '江西省吉安市吉州区', 2, '吉州区', ',1243,1305,', 1305);\nINSERT INTO `area` VALUES (1307, '2015-10-19 00:25:39', '2015-10-19 00:25:39', 0, 2, '江西省吉安市青原区', 2, '青原区', ',1243,1305,', 1305);\nINSERT INTO `area` VALUES (1308, '2015-10-19 00:25:40', '2015-10-19 00:25:40', 0, 3, '江西省吉安市吉安县', 2, '吉安县', ',1243,1305,', 1305);\nINSERT INTO `area` VALUES (1309, '2015-10-19 00:25:41', '2015-10-19 00:25:41', 0, 4, '江西省吉安市吉水县', 2, '吉水县', ',1243,1305,', 1305);\nINSERT INTO `area` VALUES (1310, '2015-10-19 00:25:42', '2015-10-19 00:25:42', 0, 5, '江西省吉安市峡江县', 2, '峡江县', ',1243,1305,', 1305);\nINSERT INTO `area` VALUES (1311, '2015-10-19 00:25:43', '2015-10-19 00:25:43', 0, 6, '江西省吉安市新干县', 2, '新干县', ',1243,1305,', 1305);\nINSERT INTO `area` VALUES (1312, '2015-10-19 00:25:44', '2015-10-19 00:25:44', 0, 7, '江西省吉安市永丰县', 2, '永丰县', ',1243,1305,', 1305);\nINSERT INTO `area` VALUES (1313, '2015-10-19 00:25:45', '2015-10-19 00:25:45', 0, 8, '江西省吉安市泰和县', 2, '泰和县', ',1243,1305,', 1305);\nINSERT INTO `area` VALUES (1314, '2015-10-19 00:25:46', '2015-10-19 00:25:46', 0, 9, '江西省吉安市遂川县', 2, '遂川县', ',1243,1305,', 1305);\nINSERT INTO `area` VALUES (1315, '2015-10-19 00:25:47', '2015-10-19 00:25:47', 0, 10, '江西省吉安市万安县', 2, '万安县', ',1243,1305,', 1305);\nINSERT INTO `area` VALUES (1316, '2015-10-19 00:25:48', '2015-10-19 00:25:48', 0, 11, '江西省吉安市安福县', 2, '安福县', ',1243,1305,', 1305);\nINSERT INTO `area` VALUES (1317, '2015-10-19 00:25:49', '2015-10-19 00:25:49', 0, 12, '江西省吉安市永新县', 2, '永新县', ',1243,1305,', 1305);\nINSERT INTO `area` VALUES (1318, '2015-10-19 00:25:50', '2015-10-19 00:25:50', 0, 13, '江西省吉安市井冈山市', 2, '井冈山市', ',1243,1305,', 1305);\nINSERT INTO `area` VALUES (1319, '2015-10-19 00:25:51', '2015-10-19 00:25:51', 0, 9, '江西省宜春市', 1, '宜春市', ',1243,', 1243);\nINSERT INTO `area` VALUES (1320, '2015-10-19 00:25:52', '2015-10-19 00:25:52', 0, 1, '江西省宜春市袁州区', 2, '袁州区', ',1243,1319,', 1319);\nINSERT INTO `area` VALUES (1321, '2015-10-19 00:25:53', '2015-10-19 00:25:53', 0, 2, '江西省宜春市奉新县', 2, '奉新县', ',1243,1319,', 1319);\nINSERT INTO `area` VALUES (1322, '2015-10-19 00:25:54', '2015-10-19 00:25:54', 0, 3, '江西省宜春市万载县', 2, '万载县', ',1243,1319,', 1319);\nINSERT INTO `area` VALUES (1323, '2015-10-19 00:25:55', '2015-10-19 00:25:55', 0, 4, '江西省宜春市上高县', 2, '上高县', ',1243,1319,', 1319);\nINSERT INTO `area` VALUES (1324, '2015-10-19 00:25:56', '2015-10-19 00:25:56', 0, 5, '江西省宜春市宜丰县', 2, '宜丰县', ',1243,1319,', 1319);\nINSERT INTO `area` VALUES (1325, '2015-10-19 00:25:57', '2015-10-19 00:25:57', 0, 6, '江西省宜春市靖安县', 2, '靖安县', ',1243,1319,', 1319);\nINSERT INTO `area` VALUES (1326, '2015-10-19 00:25:58', '2015-10-19 00:25:58', 0, 7, '江西省宜春市铜鼓县', 2, '铜鼓县', ',1243,1319,', 1319);\nINSERT INTO `area` VALUES (1327, '2015-10-19 00:25:59', '2015-10-19 00:25:59', 0, 8, '江西省宜春市丰城市', 2, '丰城市', ',1243,1319,', 1319);\nINSERT INTO `area` VALUES (1328, '2015-10-19 00:26:00', '2015-10-19 00:26:00', 0, 9, '江西省宜春市樟树市', 2, '樟树市', ',1243,1319,', 1319);\nINSERT INTO `area` VALUES (1329, '2015-10-19 00:26:01', '2015-10-19 00:26:01', 0, 10, '江西省宜春市高安市', 2, '高安市', ',1243,1319,', 1319);\nINSERT INTO `area` VALUES (1330, '2015-10-19 00:26:02', '2015-10-19 00:26:02', 0, 10, '江西省抚州市', 1, '抚州市', ',1243,', 1243);\nINSERT INTO `area` VALUES (1331, '2015-10-19 00:26:03', '2015-10-19 00:26:03', 0, 1, '江西省抚州市临川区', 2, '临川区', ',1243,1330,', 1330);\nINSERT INTO `area` VALUES (1332, '2015-10-19 00:26:04', '2015-10-19 00:26:04', 0, 2, '江西省抚州市南城县', 2, '南城县', ',1243,1330,', 1330);\nINSERT INTO `area` VALUES (1333, '2015-10-19 00:26:05', '2015-10-19 00:26:05', 0, 3, '江西省抚州市黎川县', 2, '黎川县', ',1243,1330,', 1330);\nINSERT INTO `area` VALUES (1334, '2015-10-19 00:26:06', '2015-10-19 00:26:06', 0, 4, '江西省抚州市南丰县', 2, '南丰县', ',1243,1330,', 1330);\nINSERT INTO `area` VALUES (1335, '2015-10-19 00:26:07', '2015-10-19 00:26:07', 0, 5, '江西省抚州市崇仁县', 2, '崇仁县', ',1243,1330,', 1330);\nINSERT INTO `area` VALUES (1336, '2015-10-19 00:26:08', '2015-10-19 00:26:08', 0, 6, '江西省抚州市乐安县', 2, '乐安县', ',1243,1330,', 1330);\nINSERT INTO `area` VALUES (1337, '2015-10-19 00:26:09', '2015-10-19 00:26:09', 0, 7, '江西省抚州市宜黄县', 2, '宜黄县', ',1243,1330,', 1330);\nINSERT INTO `area` VALUES (1338, '2015-10-19 00:26:10', '2015-10-19 00:26:10', 0, 8, '江西省抚州市金溪县', 2, '金溪县', ',1243,1330,', 1330);\nINSERT INTO `area` VALUES (1339, '2015-10-19 00:26:11', '2015-10-19 00:26:11', 0, 9, '江西省抚州市资溪县', 2, '资溪县', ',1243,1330,', 1330);\nINSERT INTO `area` VALUES (1340, '2015-10-19 00:26:12', '2015-10-19 00:26:12', 0, 10, '江西省抚州市东乡县', 2, '东乡县', ',1243,1330,', 1330);\nINSERT INTO `area` VALUES (1341, '2015-10-19 00:26:13', '2015-10-19 00:26:13', 0, 11, '江西省抚州市广昌县', 2, '广昌县', ',1243,1330,', 1330);\nINSERT INTO `area` VALUES (1342, '2015-10-19 00:26:14', '2015-10-19 00:26:14', 0, 11, '江西省上饶市', 1, '上饶市', ',1243,', 1243);\nINSERT INTO `area` VALUES (1343, '2015-10-19 00:26:15', '2015-10-19 00:26:15', 0, 1, '江西省上饶市信州区', 2, '信州区', ',1243,1342,', 1342);\nINSERT INTO `area` VALUES (1344, '2015-10-19 00:26:16', '2015-10-19 00:26:16', 0, 2, '江西省上饶市上饶县', 2, '上饶县', ',1243,1342,', 1342);\nINSERT INTO `area` VALUES (1345, '2015-10-19 00:26:17', '2015-10-19 00:26:17', 0, 3, '江西省上饶市广丰县', 2, '广丰县', ',1243,1342,', 1342);\nINSERT INTO `area` VALUES (1346, '2015-10-19 00:26:18', '2015-10-19 00:26:18', 0, 4, '江西省上饶市玉山县', 2, '玉山县', ',1243,1342,', 1342);\nINSERT INTO `area` VALUES (1347, '2015-10-19 00:26:19', '2015-10-19 00:26:19', 0, 5, '江西省上饶市铅山县', 2, '铅山县', ',1243,1342,', 1342);\nINSERT INTO `area` VALUES (1348, '2015-10-19 00:26:20', '2015-10-19 00:26:20', 0, 6, '江西省上饶市横峰县', 2, '横峰县', ',1243,1342,', 1342);\nINSERT INTO `area` VALUES (1349, '2015-10-19 00:26:21', '2015-10-19 00:26:21', 0, 7, '江西省上饶市弋阳县', 2, '弋阳县', ',1243,1342,', 1342);\nINSERT INTO `area` VALUES (1350, '2015-10-19 00:26:22', '2015-10-19 00:26:22', 0, 8, '江西省上饶市余干县', 2, '余干县', ',1243,1342,', 1342);\nINSERT INTO `area` VALUES (1351, '2015-10-19 00:26:23', '2015-10-19 00:26:23', 0, 9, '江西省上饶市鄱阳县', 2, '鄱阳县', ',1243,1342,', 1342);\nINSERT INTO `area` VALUES (1352, '2015-10-19 00:26:24', '2015-10-19 00:26:24', 0, 10, '江西省上饶市万年县', 2, '万年县', ',1243,1342,', 1342);\nINSERT INTO `area` VALUES (1353, '2015-10-19 00:26:25', '2015-10-19 00:26:25', 0, 11, '江西省上饶市婺源县', 2, '婺源县', ',1243,1342,', 1342);\nINSERT INTO `area` VALUES (1354, '2015-10-19 00:26:26', '2015-10-19 00:26:26', 0, 12, '江西省上饶市德兴市', 2, '德兴市', ',1243,1342,', 1342);\nINSERT INTO `area` VALUES (1355, '2015-10-19 00:26:27', '2015-10-19 00:26:27', 0, 15, '山东省', 0, '山东省', ',', NULL);\nINSERT INTO `area` VALUES (1356, '2015-10-19 00:26:28', '2015-10-19 00:26:28', 0, 1, '山东省济南市', 1, '济南市', ',1355,', 1355);\nINSERT INTO `area` VALUES (1357, '2015-10-19 00:26:29', '2015-10-19 00:26:29', 0, 1, '山东省济南市历下区', 2, '历下区', ',1355,1356,', 1356);\nINSERT INTO `area` VALUES (1358, '2015-10-19 00:26:30', '2015-10-19 00:26:30', 0, 2, '山东省济南市市中区', 2, '市中区', ',1355,1356,', 1356);\nINSERT INTO `area` VALUES (1359, '2015-10-19 00:26:31', '2015-10-19 00:26:31', 0, 3, '山东省济南市槐荫区', 2, '槐荫区', ',1355,1356,', 1356);\nINSERT INTO `area` VALUES (1360, '2015-10-19 00:26:32', '2015-10-19 00:26:32', 0, 4, '山东省济南市天桥区', 2, '天桥区', ',1355,1356,', 1356);\nINSERT INTO `area` VALUES (1361, '2015-10-19 00:26:33', '2015-10-19 00:26:33', 0, 5, '山东省济南市历城区', 2, '历城区', ',1355,1356,', 1356);\nINSERT INTO `area` VALUES (1362, '2015-10-19 00:26:34', '2015-10-19 00:26:34', 0, 6, '山东省济南市长清区', 2, '长清区', ',1355,1356,', 1356);\nINSERT INTO `area` VALUES (1363, '2015-10-19 00:26:35', '2015-10-19 00:26:35', 0, 7, '山东省济南市平阴县', 2, '平阴县', ',1355,1356,', 1356);\nINSERT INTO `area` VALUES (1364, '2015-10-19 00:26:36', '2015-10-19 00:26:36', 0, 8, '山东省济南市济阳县', 2, '济阳县', ',1355,1356,', 1356);\nINSERT INTO `area` VALUES (1365, '2015-10-19 00:26:37', '2015-10-19 00:26:37', 0, 9, '山东省济南市商河县', 2, '商河县', ',1355,1356,', 1356);\nINSERT INTO `area` VALUES (1366, '2015-10-19 00:26:38', '2015-10-19 00:26:38', 0, 10, '山东省济南市章丘市', 2, '章丘市', ',1355,1356,', 1356);\nINSERT INTO `area` VALUES (1367, '2015-10-19 00:26:39', '2015-10-19 00:26:39', 0, 2, '山东省青岛市', 1, '青岛市', ',1355,', 1355);\nINSERT INTO `area` VALUES (1368, '2015-10-19 00:26:40', '2015-10-19 00:26:40', 0, 1, '山东省青岛市市南区', 2, '市南区', ',1355,1367,', 1367);\nINSERT INTO `area` VALUES (1369, '2015-10-19 00:26:41', '2015-10-19 00:26:41', 0, 2, '山东省青岛市市北区', 2, '市北区', ',1355,1367,', 1367);\nINSERT INTO `area` VALUES (1370, '2015-10-19 00:26:42', '2015-10-19 00:26:42', 0, 3, '山东省青岛市黄岛区', 2, '黄岛区', ',1355,1367,', 1367);\nINSERT INTO `area` VALUES (1371, '2015-10-19 00:26:43', '2015-10-19 00:26:43', 0, 4, '山东省青岛市崂山区', 2, '崂山区', ',1355,1367,', 1367);\nINSERT INTO `area` VALUES (1372, '2015-10-19 00:26:44', '2015-10-19 00:26:44', 0, 5, '山东省青岛市李沧区', 2, '李沧区', ',1355,1367,', 1367);\nINSERT INTO `area` VALUES (1373, '2015-10-19 00:26:45', '2015-10-19 00:26:45', 0, 6, '山东省青岛市城阳区', 2, '城阳区', ',1355,1367,', 1367);\nINSERT INTO `area` VALUES (1374, '2015-10-19 00:26:46', '2015-10-19 00:26:46', 0, 7, '山东省青岛市胶州市', 2, '胶州市', ',1355,1367,', 1367);\nINSERT INTO `area` VALUES (1375, '2015-10-19 00:26:47', '2015-10-19 00:26:47', 0, 8, '山东省青岛市即墨市', 2, '即墨市', ',1355,1367,', 1367);\nINSERT INTO `area` VALUES (1376, '2015-10-19 00:26:48', '2015-10-19 00:26:48', 0, 9, '山东省青岛市平度市', 2, '平度市', ',1355,1367,', 1367);\nINSERT INTO `area` VALUES (1377, '2015-10-19 00:26:49', '2015-10-19 00:26:49', 0, 10, '山东省青岛市莱西市', 2, '莱西市', ',1355,1367,', 1367);\nINSERT INTO `area` VALUES (1378, '2015-10-19 00:26:50', '2015-10-19 00:26:50', 0, 3, '山东省淄博市', 1, '淄博市', ',1355,', 1355);\nINSERT INTO `area` VALUES (1379, '2015-10-19 00:26:51', '2015-10-19 00:26:51', 0, 1, '山东省淄博市淄川区', 2, '淄川区', ',1355,1378,', 1378);\nINSERT INTO `area` VALUES (1380, '2015-10-19 00:26:52', '2015-10-19 00:26:52', 0, 2, '山东省淄博市张店区', 2, '张店区', ',1355,1378,', 1378);\nINSERT INTO `area` VALUES (1381, '2015-10-19 00:26:53', '2015-10-19 00:26:53', 0, 3, '山东省淄博市博山区', 2, '博山区', ',1355,1378,', 1378);\nINSERT INTO `area` VALUES (1382, '2015-10-19 00:26:54', '2015-10-19 00:26:54', 0, 4, '山东省淄博市临淄区', 2, '临淄区', ',1355,1378,', 1378);\nINSERT INTO `area` VALUES (1383, '2015-10-19 00:26:55', '2015-10-19 00:26:55', 0, 5, '山东省淄博市周村区', 2, '周村区', ',1355,1378,', 1378);\nINSERT INTO `area` VALUES (1384, '2015-10-19 00:26:56', '2015-10-19 00:26:56', 0, 6, '山东省淄博市桓台县', 2, '桓台县', ',1355,1378,', 1378);\nINSERT INTO `area` VALUES (1385, '2015-10-19 00:26:57', '2015-10-19 00:26:57', 0, 7, '山东省淄博市高青县', 2, '高青县', ',1355,1378,', 1378);\nINSERT INTO `area` VALUES (1386, '2015-10-19 00:26:58', '2015-10-19 00:26:58', 0, 8, '山东省淄博市沂源县', 2, '沂源县', ',1355,1378,', 1378);\nINSERT INTO `area` VALUES (1387, '2015-10-19 00:26:59', '2015-10-19 00:26:59', 0, 4, '山东省枣庄市', 1, '枣庄市', ',1355,', 1355);\nINSERT INTO `area` VALUES (1388, '2015-10-19 00:27:00', '2015-10-19 00:27:00', 0, 1, '山东省枣庄市市中区', 2, '市中区', ',1355,1387,', 1387);\nINSERT INTO `area` VALUES (1389, '2015-10-19 00:27:01', '2015-10-19 00:27:01', 0, 2, '山东省枣庄市薛城区', 2, '薛城区', ',1355,1387,', 1387);\nINSERT INTO `area` VALUES (1390, '2015-10-19 00:27:02', '2015-10-19 00:27:02', 0, 3, '山东省枣庄市峄城区', 2, '峄城区', ',1355,1387,', 1387);\nINSERT INTO `area` VALUES (1391, '2015-10-19 00:27:03', '2015-10-19 00:27:03', 0, 4, '山东省枣庄市台儿庄区', 2, '台儿庄区', ',1355,1387,', 1387);\nINSERT INTO `area` VALUES (1392, '2015-10-19 00:27:04', '2015-10-19 00:27:04', 0, 5, '山东省枣庄市山亭区', 2, '山亭区', ',1355,1387,', 1387);\nINSERT INTO `area` VALUES (1393, '2015-10-19 00:27:05', '2015-10-19 00:27:05', 0, 6, '山东省枣庄市滕州市', 2, '滕州市', ',1355,1387,', 1387);\nINSERT INTO `area` VALUES (1394, '2015-10-19 00:27:06', '2015-10-19 00:27:06', 0, 5, '山东省东营市', 1, '东营市', ',1355,', 1355);\nINSERT INTO `area` VALUES (1395, '2015-10-19 00:27:07', '2015-10-19 00:27:07', 0, 1, '山东省东营市东营区', 2, '东营区', ',1355,1394,', 1394);\nINSERT INTO `area` VALUES (1396, '2015-10-19 00:27:08', '2015-10-19 00:27:08', 0, 2, '山东省东营市河口区', 2, '河口区', ',1355,1394,', 1394);\nINSERT INTO `area` VALUES (1397, '2015-10-19 00:27:09', '2015-10-19 00:27:09', 0, 3, '山东省东营市垦利县', 2, '垦利县', ',1355,1394,', 1394);\nINSERT INTO `area` VALUES (1398, '2015-10-19 00:27:10', '2015-10-19 00:27:10', 0, 4, '山东省东营市利津县', 2, '利津县', ',1355,1394,', 1394);\nINSERT INTO `area` VALUES (1399, '2015-10-19 00:27:11', '2015-10-19 00:27:11', 0, 5, '山东省东营市广饶县', 2, '广饶县', ',1355,1394,', 1394);\nINSERT INTO `area` VALUES (1400, '2015-10-19 00:27:12', '2015-10-19 00:27:12', 0, 6, '山东省烟台市', 1, '烟台市', ',1355,', 1355);\nINSERT INTO `area` VALUES (1401, '2015-10-19 00:27:13', '2015-10-19 00:27:13', 0, 1, '山东省烟台市芝罘区', 2, '芝罘区', ',1355,1400,', 1400);\nINSERT INTO `area` VALUES (1402, '2015-10-19 00:27:14', '2015-10-19 00:27:14', 0, 2, '山东省烟台市福山区', 2, '福山区', ',1355,1400,', 1400);\nINSERT INTO `area` VALUES (1403, '2015-10-19 00:27:15', '2015-10-19 00:27:15', 0, 3, '山东省烟台市牟平区', 2, '牟平区', ',1355,1400,', 1400);\nINSERT INTO `area` VALUES (1404, '2015-10-19 00:27:16', '2015-10-19 00:27:16', 0, 4, '山东省烟台市莱山区', 2, '莱山区', ',1355,1400,', 1400);\nINSERT INTO `area` VALUES (1405, '2015-10-19 00:27:17', '2015-10-19 00:27:17', 0, 5, '山东省烟台市长岛县', 2, '长岛县', ',1355,1400,', 1400);\nINSERT INTO `area` VALUES (1406, '2015-10-19 00:27:18', '2015-10-19 00:27:18', 0, 6, '山东省烟台市龙口市', 2, '龙口市', ',1355,1400,', 1400);\nINSERT INTO `area` VALUES (1407, '2015-10-19 00:27:19', '2015-10-19 00:27:19', 0, 7, '山东省烟台市莱阳市', 2, '莱阳市', ',1355,1400,', 1400);\nINSERT INTO `area` VALUES (1408, '2015-10-19 00:27:20', '2015-10-19 00:27:20', 0, 8, '山东省烟台市莱州市', 2, '莱州市', ',1355,1400,', 1400);\nINSERT INTO `area` VALUES (1409, '2015-10-19 00:27:21', '2015-10-19 00:27:21', 0, 9, '山东省烟台市蓬莱市', 2, '蓬莱市', ',1355,1400,', 1400);\nINSERT INTO `area` VALUES (1410, '2015-10-19 00:27:22', '2015-10-19 00:27:22', 0, 10, '山东省烟台市招远市', 2, '招远市', ',1355,1400,', 1400);\nINSERT INTO `area` VALUES (1411, '2015-10-19 00:27:23', '2015-10-19 00:27:23', 0, 11, '山东省烟台市栖霞市', 2, '栖霞市', ',1355,1400,', 1400);\nINSERT INTO `area` VALUES (1412, '2015-10-19 00:27:24', '2015-10-19 00:27:24', 0, 12, '山东省烟台市海阳市', 2, '海阳市', ',1355,1400,', 1400);\nINSERT INTO `area` VALUES (1413, '2015-10-19 00:27:25', '2015-10-19 00:27:25', 0, 7, '山东省潍坊市', 1, '潍坊市', ',1355,', 1355);\nINSERT INTO `area` VALUES (1414, '2015-10-19 00:27:26', '2015-10-19 00:27:26', 0, 1, '山东省潍坊市潍城区', 2, '潍城区', ',1355,1413,', 1413);\nINSERT INTO `area` VALUES (1415, '2015-10-19 00:27:27', '2015-10-19 00:27:27', 0, 2, '山东省潍坊市寒亭区', 2, '寒亭区', ',1355,1413,', 1413);\nINSERT INTO `area` VALUES (1416, '2015-10-19 00:27:28', '2015-10-19 00:27:28', 0, 3, '山东省潍坊市坊子区', 2, '坊子区', ',1355,1413,', 1413);\nINSERT INTO `area` VALUES (1417, '2015-10-19 00:27:29', '2015-10-19 00:27:29', 0, 4, '山东省潍坊市奎文区', 2, '奎文区', ',1355,1413,', 1413);\nINSERT INTO `area` VALUES (1418, '2015-10-19 00:27:30', '2015-10-19 00:27:30', 0, 5, '山东省潍坊市临朐县', 2, '临朐县', ',1355,1413,', 1413);\nINSERT INTO `area` VALUES (1419, '2015-10-19 00:27:31', '2015-10-19 00:27:31', 0, 6, '山东省潍坊市昌乐县', 2, '昌乐县', ',1355,1413,', 1413);\nINSERT INTO `area` VALUES (1420, '2015-10-19 00:27:32', '2015-10-19 00:27:32', 0, 7, '山东省潍坊市青州市', 2, '青州市', ',1355,1413,', 1413);\nINSERT INTO `area` VALUES (1421, '2015-10-19 00:27:33', '2015-10-19 00:27:33', 0, 8, '山东省潍坊市诸城市', 2, '诸城市', ',1355,1413,', 1413);\nINSERT INTO `area` VALUES (1422, '2015-10-19 00:27:34', '2015-10-19 00:27:34', 0, 9, '山东省潍坊市寿光市', 2, '寿光市', ',1355,1413,', 1413);\nINSERT INTO `area` VALUES (1423, '2015-10-19 00:27:35', '2015-10-19 00:27:35', 0, 10, '山东省潍坊市安丘市', 2, '安丘市', ',1355,1413,', 1413);\nINSERT INTO `area` VALUES (1424, '2015-10-19 00:27:36', '2015-10-19 00:27:36', 0, 11, '山东省潍坊市高密市', 2, '高密市', ',1355,1413,', 1413);\nINSERT INTO `area` VALUES (1425, '2015-10-19 00:27:37', '2015-10-19 00:27:37', 0, 12, '山东省潍坊市昌邑市', 2, '昌邑市', ',1355,1413,', 1413);\nINSERT INTO `area` VALUES (1426, '2015-10-19 00:27:38', '2015-10-19 00:27:38', 0, 8, '山东省济宁市', 1, '济宁市', ',1355,', 1355);\nINSERT INTO `area` VALUES (1427, '2015-10-19 00:27:39', '2015-10-19 00:27:39', 0, 1, '山东省济宁市市中区', 2, '市中区', ',1355,1426,', 1426);\nINSERT INTO `area` VALUES (1428, '2015-10-19 00:27:40', '2015-10-19 00:27:40', 0, 2, '山东省济宁市任城区', 2, '任城区', ',1355,1426,', 1426);\nINSERT INTO `area` VALUES (1429, '2015-10-19 00:27:41', '2015-10-19 00:27:41', 0, 3, '山东省济宁市微山县', 2, '微山县', ',1355,1426,', 1426);\nINSERT INTO `area` VALUES (1430, '2015-10-19 00:27:42', '2015-10-19 00:27:42', 0, 4, '山东省济宁市鱼台县', 2, '鱼台县', ',1355,1426,', 1426);\nINSERT INTO `area` VALUES (1431, '2015-10-19 00:27:43', '2015-10-19 00:27:43', 0, 5, '山东省济宁市金乡县', 2, '金乡县', ',1355,1426,', 1426);\nINSERT INTO `area` VALUES (1432, '2015-10-19 00:27:44', '2015-10-19 00:27:44', 0, 6, '山东省济宁市嘉祥县', 2, '嘉祥县', ',1355,1426,', 1426);\nINSERT INTO `area` VALUES (1433, '2015-10-19 00:27:45', '2015-10-19 00:27:45', 0, 7, '山东省济宁市汶上县', 2, '汶上县', ',1355,1426,', 1426);\nINSERT INTO `area` VALUES (1434, '2015-10-19 00:27:46', '2015-10-19 00:27:46', 0, 8, '山东省济宁市泗水县', 2, '泗水县', ',1355,1426,', 1426);\nINSERT INTO `area` VALUES (1435, '2015-10-19 00:27:47', '2015-10-19 00:27:47', 0, 9, '山东省济宁市梁山县', 2, '梁山县', ',1355,1426,', 1426);\nINSERT INTO `area` VALUES (1436, '2015-10-19 00:27:48', '2015-10-19 00:27:48', 0, 10, '山东省济宁市曲阜市', 2, '曲阜市', ',1355,1426,', 1426);\nINSERT INTO `area` VALUES (1437, '2015-10-19 00:27:49', '2015-10-19 00:27:49', 0, 11, '山东省济宁市兖州市', 2, '兖州市', ',1355,1426,', 1426);\nINSERT INTO `area` VALUES (1438, '2015-10-19 00:27:50', '2015-10-19 00:27:50', 0, 12, '山东省济宁市邹城市', 2, '邹城市', ',1355,1426,', 1426);\nINSERT INTO `area` VALUES (1439, '2015-10-19 00:27:51', '2015-10-19 00:27:51', 0, 9, '山东省泰安市', 1, '泰安市', ',1355,', 1355);\nINSERT INTO `area` VALUES (1440, '2015-10-19 00:27:52', '2015-10-19 00:27:52', 0, 1, '山东省泰安市泰山区', 2, '泰山区', ',1355,1439,', 1439);\nINSERT INTO `area` VALUES (1441, '2015-10-19 00:27:53', '2015-10-19 00:27:53', 0, 2, '山东省泰安市岱岳区', 2, '岱岳区', ',1355,1439,', 1439);\nINSERT INTO `area` VALUES (1442, '2015-10-19 00:27:54', '2015-10-19 00:27:54', 0, 3, '山东省泰安市宁阳县', 2, '宁阳县', ',1355,1439,', 1439);\nINSERT INTO `area` VALUES (1443, '2015-10-19 00:27:55', '2015-10-19 00:27:55', 0, 4, '山东省泰安市东平县', 2, '东平县', ',1355,1439,', 1439);\nINSERT INTO `area` VALUES (1444, '2015-10-19 00:27:56', '2015-10-19 00:27:56', 0, 5, '山东省泰安市新泰市', 2, '新泰市', ',1355,1439,', 1439);\nINSERT INTO `area` VALUES (1445, '2015-10-19 00:27:57', '2015-10-19 00:27:57', 0, 6, '山东省泰安市肥城市', 2, '肥城市', ',1355,1439,', 1439);\nINSERT INTO `area` VALUES (1446, '2015-10-19 00:27:58', '2015-10-19 00:27:58', 0, 10, '山东省威海市', 1, '威海市', ',1355,', 1355);\nINSERT INTO `area` VALUES (1447, '2015-10-19 00:27:59', '2015-10-19 00:27:59', 0, 1, '山东省威海市环翠区', 2, '环翠区', ',1355,1446,', 1446);\nINSERT INTO `area` VALUES (1448, '2015-10-19 00:28:00', '2015-10-19 00:28:00', 0, 2, '山东省威海市文登市', 2, '文登市', ',1355,1446,', 1446);\nINSERT INTO `area` VALUES (1449, '2015-10-19 00:28:01', '2015-10-19 00:28:01', 0, 3, '山东省威海市荣成市', 2, '荣成市', ',1355,1446,', 1446);\nINSERT INTO `area` VALUES (1450, '2015-10-19 00:28:02', '2015-10-19 00:28:02', 0, 4, '山东省威海市乳山市', 2, '乳山市', ',1355,1446,', 1446);\nINSERT INTO `area` VALUES (1451, '2015-10-19 00:28:03', '2015-10-19 00:28:03', 0, 11, '山东省日照市', 1, '日照市', ',1355,', 1355);\nINSERT INTO `area` VALUES (1452, '2015-10-19 00:28:04', '2015-10-19 00:28:04', 0, 1, '山东省日照市东港区', 2, '东港区', ',1355,1451,', 1451);\nINSERT INTO `area` VALUES (1453, '2015-10-19 00:28:05', '2015-10-19 00:28:05', 0, 2, '山东省日照市岚山区', 2, '岚山区', ',1355,1451,', 1451);\nINSERT INTO `area` VALUES (1454, '2015-10-19 00:28:06', '2015-10-19 00:28:06', 0, 3, '山东省日照市五莲县', 2, '五莲县', ',1355,1451,', 1451);\nINSERT INTO `area` VALUES (1455, '2015-10-19 00:28:07', '2015-10-19 00:28:07', 0, 4, '山东省日照市莒县', 2, '莒县', ',1355,1451,', 1451);\nINSERT INTO `area` VALUES (1456, '2015-10-19 00:28:08', '2015-10-19 00:28:08', 0, 12, '山东省莱芜市', 1, '莱芜市', ',1355,', 1355);\nINSERT INTO `area` VALUES (1457, '2015-10-19 00:28:09', '2015-10-19 00:28:09', 0, 1, '山东省莱芜市莱城区', 2, '莱城区', ',1355,1456,', 1456);\nINSERT INTO `area` VALUES (1458, '2015-10-19 00:28:10', '2015-10-19 00:28:10', 0, 2, '山东省莱芜市钢城区', 2, '钢城区', ',1355,1456,', 1456);\nINSERT INTO `area` VALUES (1459, '2015-10-19 00:28:11', '2015-10-19 00:28:11', 0, 13, '山东省临沂市', 1, '临沂市', ',1355,', 1355);\nINSERT INTO `area` VALUES (1460, '2015-10-19 00:28:12', '2015-10-19 00:28:12', 0, 1, '山东省临沂市兰山区', 2, '兰山区', ',1355,1459,', 1459);\nINSERT INTO `area` VALUES (1461, '2015-10-19 00:28:13', '2015-10-19 00:28:13', 0, 2, '山东省临沂市罗庄区', 2, '罗庄区', ',1355,1459,', 1459);\nINSERT INTO `area` VALUES (1462, '2015-10-19 00:28:14', '2015-10-19 00:28:14', 0, 3, '山东省临沂市河东区', 2, '河东区', ',1355,1459,', 1459);\nINSERT INTO `area` VALUES (1463, '2015-10-19 00:28:15', '2015-10-19 00:28:15', 0, 4, '山东省临沂市沂南县', 2, '沂南县', ',1355,1459,', 1459);\nINSERT INTO `area` VALUES (1464, '2015-10-19 00:28:16', '2015-10-19 00:28:16', 0, 5, '山东省临沂市郯城县', 2, '郯城县', ',1355,1459,', 1459);\nINSERT INTO `area` VALUES (1465, '2015-10-19 00:28:17', '2015-10-19 00:28:17', 0, 6, '山东省临沂市沂水县', 2, '沂水县', ',1355,1459,', 1459);\nINSERT INTO `area` VALUES (1466, '2015-10-19 00:28:18', '2015-10-19 00:28:18', 0, 7, '山东省临沂市苍山县', 2, '苍山县', ',1355,1459,', 1459);\nINSERT INTO `area` VALUES (1467, '2015-10-19 00:28:19', '2015-10-19 00:28:19', 0, 8, '山东省临沂市费县', 2, '费县', ',1355,1459,', 1459);\nINSERT INTO `area` VALUES (1468, '2015-10-19 00:28:20', '2015-10-19 00:28:20', 0, 9, '山东省临沂市平邑县', 2, '平邑县', ',1355,1459,', 1459);\nINSERT INTO `area` VALUES (1469, '2015-10-19 00:28:21', '2015-10-19 00:28:21', 0, 10, '山东省临沂市莒南县', 2, '莒南县', ',1355,1459,', 1459);\nINSERT INTO `area` VALUES (1470, '2015-10-19 00:28:22', '2015-10-19 00:28:22', 0, 11, '山东省临沂市蒙阴县', 2, '蒙阴县', ',1355,1459,', 1459);\nINSERT INTO `area` VALUES (1471, '2015-10-19 00:28:23', '2015-10-19 00:28:23', 0, 12, '山东省临沂市临沭县', 2, '临沭县', ',1355,1459,', 1459);\nINSERT INTO `area` VALUES (1472, '2015-10-19 00:28:24', '2015-10-19 00:28:24', 0, 14, '山东省德州市', 1, '德州市', ',1355,', 1355);\nINSERT INTO `area` VALUES (1473, '2015-10-19 00:28:25', '2015-10-19 00:28:25', 0, 1, '山东省德州市德城区', 2, '德城区', ',1355,1472,', 1472);\nINSERT INTO `area` VALUES (1474, '2015-10-19 00:28:26', '2015-10-19 00:28:26', 0, 2, '山东省德州市陵县', 2, '陵县', ',1355,1472,', 1472);\nINSERT INTO `area` VALUES (1475, '2015-10-19 00:28:27', '2015-10-19 00:28:27', 0, 3, '山东省德州市宁津县', 2, '宁津县', ',1355,1472,', 1472);\nINSERT INTO `area` VALUES (1476, '2015-10-19 00:28:28', '2015-10-19 00:28:28', 0, 4, '山东省德州市庆云县', 2, '庆云县', ',1355,1472,', 1472);\nINSERT INTO `area` VALUES (1477, '2015-10-19 00:28:29', '2015-10-19 00:28:29', 0, 5, '山东省德州市临邑县', 2, '临邑县', ',1355,1472,', 1472);\nINSERT INTO `area` VALUES (1478, '2015-10-19 00:28:30', '2015-10-19 00:28:30', 0, 6, '山东省德州市齐河县', 2, '齐河县', ',1355,1472,', 1472);\nINSERT INTO `area` VALUES (1479, '2015-10-19 00:28:31', '2015-10-19 00:28:31', 0, 7, '山东省德州市平原县', 2, '平原县', ',1355,1472,', 1472);\nINSERT INTO `area` VALUES (1480, '2015-10-19 00:28:32', '2015-10-19 00:28:32', 0, 8, '山东省德州市夏津县', 2, '夏津县', ',1355,1472,', 1472);\nINSERT INTO `area` VALUES (1481, '2015-10-19 00:28:33', '2015-10-19 00:28:33', 0, 9, '山东省德州市武城县', 2, '武城县', ',1355,1472,', 1472);\nINSERT INTO `area` VALUES (1482, '2015-10-19 00:28:34', '2015-10-19 00:28:34', 0, 10, '山东省德州市乐陵市', 2, '乐陵市', ',1355,1472,', 1472);\nINSERT INTO `area` VALUES (1483, '2015-10-19 00:28:35', '2015-10-19 00:28:35', 0, 11, '山东省德州市禹城市', 2, '禹城市', ',1355,1472,', 1472);\nINSERT INTO `area` VALUES (1484, '2015-10-19 00:28:36', '2015-10-19 00:28:36', 0, 15, '山东省聊城市', 1, '聊城市', ',1355,', 1355);\nINSERT INTO `area` VALUES (1485, '2015-10-19 00:28:37', '2015-10-19 00:28:37', 0, 1, '山东省聊城市东昌府区', 2, '东昌府区', ',1355,1484,', 1484);\nINSERT INTO `area` VALUES (1486, '2015-10-19 00:28:38', '2015-10-19 00:28:38', 0, 2, '山东省聊城市阳谷县', 2, '阳谷县', ',1355,1484,', 1484);\nINSERT INTO `area` VALUES (1487, '2015-10-19 00:28:39', '2015-10-19 00:28:39', 0, 3, '山东省聊城市莘县', 2, '莘县', ',1355,1484,', 1484);\nINSERT INTO `area` VALUES (1488, '2015-10-19 00:28:40', '2015-10-19 00:28:40', 0, 4, '山东省聊城市茌平县', 2, '茌平县', ',1355,1484,', 1484);\nINSERT INTO `area` VALUES (1489, '2015-10-19 00:28:41', '2015-10-19 00:28:41', 0, 5, '山东省聊城市东阿县', 2, '东阿县', ',1355,1484,', 1484);\nINSERT INTO `area` VALUES (1490, '2015-10-19 00:28:42', '2015-10-19 00:28:42', 0, 6, '山东省聊城市冠县', 2, '冠县', ',1355,1484,', 1484);\nINSERT INTO `area` VALUES (1491, '2015-10-19 00:28:43', '2015-10-19 00:28:43', 0, 7, '山东省聊城市高唐县', 2, '高唐县', ',1355,1484,', 1484);\nINSERT INTO `area` VALUES (1492, '2015-10-19 00:28:44', '2015-10-19 00:28:44', 0, 8, '山东省聊城市临清市', 2, '临清市', ',1355,1484,', 1484);\nINSERT INTO `area` VALUES (1493, '2015-10-19 00:28:45', '2015-10-19 00:28:45', 0, 16, '山东省滨州市', 1, '滨州市', ',1355,', 1355);\nINSERT INTO `area` VALUES (1494, '2015-10-19 00:28:46', '2015-10-19 00:28:46', 0, 1, '山东省滨州市滨城区', 2, '滨城区', ',1355,1493,', 1493);\nINSERT INTO `area` VALUES (1495, '2015-10-19 00:28:47', '2015-10-19 00:28:47', 0, 2, '山东省滨州市惠民县', 2, '惠民县', ',1355,1493,', 1493);\nINSERT INTO `area` VALUES (1496, '2015-10-19 00:28:48', '2015-10-19 00:28:48', 0, 3, '山东省滨州市阳信县', 2, '阳信县', ',1355,1493,', 1493);\nINSERT INTO `area` VALUES (1497, '2015-10-19 00:28:49', '2015-10-19 00:28:49', 0, 4, '山东省滨州市无棣县', 2, '无棣县', ',1355,1493,', 1493);\nINSERT INTO `area` VALUES (1498, '2015-10-19 00:28:50', '2015-10-19 00:28:50', 0, 5, '山东省滨州市沾化县', 2, '沾化县', ',1355,1493,', 1493);\nINSERT INTO `area` VALUES (1499, '2015-10-19 00:28:51', '2015-10-19 00:28:51', 0, 6, '山东省滨州市博兴县', 2, '博兴县', ',1355,1493,', 1493);\nINSERT INTO `area` VALUES (1500, '2015-10-19 00:28:52', '2015-10-19 00:28:52', 0, 7, '山东省滨州市邹平县', 2, '邹平县', ',1355,1493,', 1493);\nINSERT INTO `area` VALUES (1501, '2015-10-19 00:28:53', '2015-10-19 00:28:53', 0, 17, '山东省菏泽市', 1, '菏泽市', ',1355,', 1355);\nINSERT INTO `area` VALUES (1502, '2015-10-19 00:28:54', '2015-10-19 00:28:54', 0, 1, '山东省菏泽市牡丹区', 2, '牡丹区', ',1355,1501,', 1501);\nINSERT INTO `area` VALUES (1503, '2015-10-19 00:28:55', '2015-10-19 00:28:55', 0, 2, '山东省菏泽市曹县', 2, '曹县', ',1355,1501,', 1501);\nINSERT INTO `area` VALUES (1504, '2015-10-19 00:28:56', '2015-10-19 00:28:56', 0, 3, '山东省菏泽市单县', 2, '单县', ',1355,1501,', 1501);\nINSERT INTO `area` VALUES (1505, '2015-10-19 00:28:57', '2015-10-19 00:28:57', 0, 4, '山东省菏泽市成武县', 2, '成武县', ',1355,1501,', 1501);\nINSERT INTO `area` VALUES (1506, '2015-10-19 00:28:58', '2015-10-19 00:28:58', 0, 5, '山东省菏泽市巨野县', 2, '巨野县', ',1355,1501,', 1501);\nINSERT INTO `area` VALUES (1507, '2015-10-19 00:28:59', '2015-10-19 00:28:59', 0, 6, '山东省菏泽市郓城县', 2, '郓城县', ',1355,1501,', 1501);\nINSERT INTO `area` VALUES (1508, '2015-10-19 00:29:00', '2015-10-19 00:29:00', 0, 7, '山东省菏泽市鄄城县', 2, '鄄城县', ',1355,1501,', 1501);\nINSERT INTO `area` VALUES (1509, '2015-10-19 00:29:01', '2015-10-19 00:29:01', 0, 8, '山东省菏泽市定陶县', 2, '定陶县', ',1355,1501,', 1501);\nINSERT INTO `area` VALUES (1510, '2015-10-19 00:29:02', '2015-10-19 00:29:02', 0, 9, '山东省菏泽市东明县', 2, '东明县', ',1355,1501,', 1501);\nINSERT INTO `area` VALUES (1511, '2015-10-19 00:29:03', '2015-10-19 00:29:03', 0, 16, '河南省', 0, '河南省', ',', NULL);\nINSERT INTO `area` VALUES (1512, '2015-10-19 00:29:04', '2015-10-19 00:29:04', 0, 1, '河南省郑州市', 1, '郑州市', ',1511,', 1511);\nINSERT INTO `area` VALUES (1513, '2015-10-19 00:29:05', '2015-10-19 00:29:05', 0, 1, '河南省郑州市中原区', 2, '中原区', ',1511,1512,', 1512);\nINSERT INTO `area` VALUES (1514, '2015-10-19 00:29:06', '2015-10-19 00:29:06', 0, 2, '河南省郑州市二七区', 2, '二七区', ',1511,1512,', 1512);\nINSERT INTO `area` VALUES (1515, '2015-10-19 00:29:07', '2015-10-19 00:29:07', 0, 3, '河南省郑州市管城回族区', 2, '管城回族区', ',1511,1512,', 1512);\nINSERT INTO `area` VALUES (1516, '2015-10-19 00:29:08', '2015-10-19 00:29:08', 0, 4, '河南省郑州市金水区', 2, '金水区', ',1511,1512,', 1512);\nINSERT INTO `area` VALUES (1517, '2015-10-19 00:29:09', '2015-10-19 00:29:09', 0, 5, '河南省郑州市上街区', 2, '上街区', ',1511,1512,', 1512);\nINSERT INTO `area` VALUES (1518, '2015-10-19 00:29:10', '2015-10-19 00:29:10', 0, 6, '河南省郑州市惠济区', 2, '惠济区', ',1511,1512,', 1512);\nINSERT INTO `area` VALUES (1519, '2015-10-19 00:29:11', '2015-10-19 00:29:11', 0, 7, '河南省郑州市中牟县', 2, '中牟县', ',1511,1512,', 1512);\nINSERT INTO `area` VALUES (1520, '2015-10-19 00:29:12', '2015-10-19 00:29:12', 0, 8, '河南省郑州市巩义市', 2, '巩义市', ',1511,1512,', 1512);\nINSERT INTO `area` VALUES (1521, '2015-10-19 00:29:13', '2015-10-19 00:29:13', 0, 9, '河南省郑州市荥阳市', 2, '荥阳市', ',1511,1512,', 1512);\nINSERT INTO `area` VALUES (1522, '2015-10-19 00:29:14', '2015-10-19 00:29:14', 0, 10, '河南省郑州市新密市', 2, '新密市', ',1511,1512,', 1512);\nINSERT INTO `area` VALUES (1523, '2015-10-19 00:29:15', '2015-10-19 00:29:15', 0, 11, '河南省郑州市新郑市', 2, '新郑市', ',1511,1512,', 1512);\nINSERT INTO `area` VALUES (1524, '2015-10-19 00:29:16', '2015-10-19 00:29:16', 0, 12, '河南省郑州市登封市', 2, '登封市', ',1511,1512,', 1512);\nINSERT INTO `area` VALUES (1525, '2015-10-19 00:29:17', '2015-10-19 00:29:17', 0, 2, '河南省开封市', 1, '开封市', ',1511,', 1511);\nINSERT INTO `area` VALUES (1526, '2015-10-19 00:29:18', '2015-10-19 00:29:18', 0, 1, '河南省开封市龙亭区', 2, '龙亭区', ',1511,1525,', 1525);\nINSERT INTO `area` VALUES (1527, '2015-10-19 00:29:19', '2015-10-19 00:29:19', 0, 2, '河南省开封市顺河回族区', 2, '顺河回族区', ',1511,1525,', 1525);\nINSERT INTO `area` VALUES (1528, '2015-10-19 00:29:20', '2015-10-19 00:29:20', 0, 3, '河南省开封市鼓楼区', 2, '鼓楼区', ',1511,1525,', 1525);\nINSERT INTO `area` VALUES (1529, '2015-10-19 00:29:21', '2015-10-19 00:29:21', 0, 4, '河南省开封市禹王台区', 2, '禹王台区', ',1511,1525,', 1525);\nINSERT INTO `area` VALUES (1530, '2015-10-19 00:29:22', '2015-10-19 00:29:22', 0, 5, '河南省开封市金明区', 2, '金明区', ',1511,1525,', 1525);\nINSERT INTO `area` VALUES (1531, '2015-10-19 00:29:23', '2015-10-19 00:29:23', 0, 6, '河南省开封市杞县', 2, '杞县', ',1511,1525,', 1525);\nINSERT INTO `area` VALUES (1532, '2015-10-19 00:29:24', '2015-10-19 00:29:24', 0, 7, '河南省开封市通许县', 2, '通许县', ',1511,1525,', 1525);\nINSERT INTO `area` VALUES (1533, '2015-10-19 00:29:25', '2015-10-19 00:29:25', 0, 8, '河南省开封市尉氏县', 2, '尉氏县', ',1511,1525,', 1525);\nINSERT INTO `area` VALUES (1534, '2015-10-19 00:29:26', '2015-10-19 00:29:26', 0, 9, '河南省开封市开封县', 2, '开封县', ',1511,1525,', 1525);\nINSERT INTO `area` VALUES (1535, '2015-10-19 00:29:27', '2015-10-19 00:29:27', 0, 10, '河南省开封市兰考县', 2, '兰考县', ',1511,1525,', 1525);\nINSERT INTO `area` VALUES (1536, '2015-10-19 00:29:28', '2015-10-19 00:29:28', 0, 3, '河南省洛阳市', 1, '洛阳市', ',1511,', 1511);\nINSERT INTO `area` VALUES (1537, '2015-10-19 00:29:29', '2015-10-19 00:29:29', 0, 1, '河南省洛阳市老城区', 2, '老城区', ',1511,1536,', 1536);\nINSERT INTO `area` VALUES (1538, '2015-10-19 00:29:30', '2015-10-19 00:29:30', 0, 2, '河南省洛阳市西工区', 2, '西工区', ',1511,1536,', 1536);\nINSERT INTO `area` VALUES (1539, '2015-10-19 00:29:31', '2015-10-19 00:29:31', 0, 3, '河南省洛阳市瀍河回族区', 2, '瀍河回族区', ',1511,1536,', 1536);\nINSERT INTO `area` VALUES (1540, '2015-10-19 00:29:32', '2015-10-19 00:29:32', 0, 4, '河南省洛阳市涧西区', 2, '涧西区', ',1511,1536,', 1536);\nINSERT INTO `area` VALUES (1541, '2015-10-19 00:29:33', '2015-10-19 00:29:33', 0, 5, '河南省洛阳市吉利区', 2, '吉利区', ',1511,1536,', 1536);\nINSERT INTO `area` VALUES (1542, '2015-10-19 00:29:34', '2015-10-19 00:29:34', 0, 6, '河南省洛阳市洛龙区', 2, '洛龙区', ',1511,1536,', 1536);\nINSERT INTO `area` VALUES (1543, '2015-10-19 00:29:35', '2015-10-19 00:29:35', 0, 7, '河南省洛阳市孟津县', 2, '孟津县', ',1511,1536,', 1536);\nINSERT INTO `area` VALUES (1544, '2015-10-19 00:29:36', '2015-10-19 00:29:36', 0, 8, '河南省洛阳市新安县', 2, '新安县', ',1511,1536,', 1536);\nINSERT INTO `area` VALUES (1545, '2015-10-19 00:29:37', '2015-10-19 00:29:37', 0, 9, '河南省洛阳市栾川县', 2, '栾川县', ',1511,1536,', 1536);\nINSERT INTO `area` VALUES (1546, '2015-10-19 00:29:38', '2015-10-19 00:29:38', 0, 10, '河南省洛阳市嵩县', 2, '嵩县', ',1511,1536,', 1536);\nINSERT INTO `area` VALUES (1547, '2015-10-19 00:29:39', '2015-10-19 00:29:39', 0, 11, '河南省洛阳市汝阳县', 2, '汝阳县', ',1511,1536,', 1536);\nINSERT INTO `area` VALUES (1548, '2015-10-19 00:29:40', '2015-10-19 00:29:40', 0, 12, '河南省洛阳市宜阳县', 2, '宜阳县', ',1511,1536,', 1536);\nINSERT INTO `area` VALUES (1549, '2015-10-19 00:29:41', '2015-10-19 00:29:41', 0, 13, '河南省洛阳市洛宁县', 2, '洛宁县', ',1511,1536,', 1536);\nINSERT INTO `area` VALUES (1550, '2015-10-19 00:29:42', '2015-10-19 00:29:42', 0, 14, '河南省洛阳市伊川县', 2, '伊川县', ',1511,1536,', 1536);\nINSERT INTO `area` VALUES (1551, '2015-10-19 00:29:43', '2015-10-19 00:29:43', 0, 15, '河南省洛阳市偃师市', 2, '偃师市', ',1511,1536,', 1536);\nINSERT INTO `area` VALUES (1552, '2015-10-19 00:29:44', '2015-10-19 00:29:44', 0, 4, '河南省平顶山市', 1, '平顶山市', ',1511,', 1511);\nINSERT INTO `area` VALUES (1553, '2015-10-19 00:29:45', '2015-10-19 00:29:45', 0, 1, '河南省平顶山市新华区', 2, '新华区', ',1511,1552,', 1552);\nINSERT INTO `area` VALUES (1554, '2015-10-19 00:29:46', '2015-10-19 00:29:46', 0, 2, '河南省平顶山市卫东区', 2, '卫东区', ',1511,1552,', 1552);\nINSERT INTO `area` VALUES (1555, '2015-10-19 00:29:47', '2015-10-19 00:29:47', 0, 3, '河南省平顶山市石龙区', 2, '石龙区', ',1511,1552,', 1552);\nINSERT INTO `area` VALUES (1556, '2015-10-19 00:29:48', '2015-10-19 00:29:48', 0, 4, '河南省平顶山市湛河区', 2, '湛河区', ',1511,1552,', 1552);\nINSERT INTO `area` VALUES (1557, '2015-10-19 00:29:49', '2015-10-19 00:29:49', 0, 5, '河南省平顶山市宝丰县', 2, '宝丰县', ',1511,1552,', 1552);\nINSERT INTO `area` VALUES (1558, '2015-10-19 00:29:50', '2015-10-19 00:29:50', 0, 6, '河南省平顶山市叶县', 2, '叶县', ',1511,1552,', 1552);\nINSERT INTO `area` VALUES (1559, '2015-10-19 00:29:51', '2015-10-19 00:29:51', 0, 7, '河南省平顶山市鲁山县', 2, '鲁山县', ',1511,1552,', 1552);\nINSERT INTO `area` VALUES (1560, '2015-10-19 00:29:52', '2015-10-19 00:29:52', 0, 8, '河南省平顶山市郏县', 2, '郏县', ',1511,1552,', 1552);\nINSERT INTO `area` VALUES (1561, '2015-10-19 00:29:53', '2015-10-19 00:29:53', 0, 9, '河南省平顶山市舞钢市', 2, '舞钢市', ',1511,1552,', 1552);\nINSERT INTO `area` VALUES (1562, '2015-10-19 00:29:54', '2015-10-19 00:29:54', 0, 10, '河南省平顶山市汝州市', 2, '汝州市', ',1511,1552,', 1552);\nINSERT INTO `area` VALUES (1563, '2015-10-19 00:29:55', '2015-10-19 00:29:55', 0, 5, '河南省安阳市', 1, '安阳市', ',1511,', 1511);\nINSERT INTO `area` VALUES (1564, '2015-10-19 00:29:56', '2015-10-19 00:29:56', 0, 1, '河南省安阳市文峰区', 2, '文峰区', ',1511,1563,', 1563);\nINSERT INTO `area` VALUES (1565, '2015-10-19 00:29:57', '2015-10-19 00:29:57', 0, 2, '河南省安阳市北关区', 2, '北关区', ',1511,1563,', 1563);\nINSERT INTO `area` VALUES (1566, '2015-10-19 00:29:58', '2015-10-19 00:29:58', 0, 3, '河南省安阳市殷都区', 2, '殷都区', ',1511,1563,', 1563);\nINSERT INTO `area` VALUES (1567, '2015-10-19 00:29:59', '2015-10-19 00:29:59', 0, 4, '河南省安阳市龙安区', 2, '龙安区', ',1511,1563,', 1563);\nINSERT INTO `area` VALUES (1568, '2015-10-19 00:30:00', '2015-10-19 00:30:00', 0, 5, '河南省安阳市安阳县', 2, '安阳县', ',1511,1563,', 1563);\nINSERT INTO `area` VALUES (1569, '2015-10-19 00:30:01', '2015-10-19 00:30:01', 0, 6, '河南省安阳市汤阴县', 2, '汤阴县', ',1511,1563,', 1563);\nINSERT INTO `area` VALUES (1570, '2015-10-19 00:30:02', '2015-10-19 00:30:02', 0, 7, '河南省安阳市滑县', 2, '滑县', ',1511,1563,', 1563);\nINSERT INTO `area` VALUES (1571, '2015-10-19 00:30:03', '2015-10-19 00:30:03', 0, 8, '河南省安阳市内黄县', 2, '内黄县', ',1511,1563,', 1563);\nINSERT INTO `area` VALUES (1572, '2015-10-19 00:30:04', '2015-10-19 00:30:04', 0, 9, '河南省安阳市林州市', 2, '林州市', ',1511,1563,', 1563);\nINSERT INTO `area` VALUES (1573, '2015-10-19 00:30:05', '2015-10-19 00:30:05', 0, 6, '河南省鹤壁市', 1, '鹤壁市', ',1511,', 1511);\nINSERT INTO `area` VALUES (1574, '2015-10-19 00:30:06', '2015-10-19 00:30:06', 0, 1, '河南省鹤壁市鹤山区', 2, '鹤山区', ',1511,1573,', 1573);\nINSERT INTO `area` VALUES (1575, '2015-10-19 00:30:07', '2015-10-19 00:30:07', 0, 2, '河南省鹤壁市山城区', 2, '山城区', ',1511,1573,', 1573);\nINSERT INTO `area` VALUES (1576, '2015-10-19 00:30:08', '2015-10-19 00:30:08', 0, 3, '河南省鹤壁市淇滨区', 2, '淇滨区', ',1511,1573,', 1573);\nINSERT INTO `area` VALUES (1577, '2015-10-19 00:30:09', '2015-10-19 00:30:09', 0, 4, '河南省鹤壁市浚县', 2, '浚县', ',1511,1573,', 1573);\nINSERT INTO `area` VALUES (1578, '2015-10-19 00:30:10', '2015-10-19 00:30:10', 0, 5, '河南省鹤壁市淇县', 2, '淇县', ',1511,1573,', 1573);\nINSERT INTO `area` VALUES (1579, '2015-10-19 00:30:11', '2015-10-19 00:30:11', 0, 7, '河南省新乡市', 1, '新乡市', ',1511,', 1511);\nINSERT INTO `area` VALUES (1580, '2015-10-19 00:30:12', '2015-10-19 00:30:12', 0, 1, '河南省新乡市红旗区', 2, '红旗区', ',1511,1579,', 1579);\nINSERT INTO `area` VALUES (1581, '2015-10-19 00:30:13', '2015-10-19 00:30:13', 0, 2, '河南省新乡市卫滨区', 2, '卫滨区', ',1511,1579,', 1579);\nINSERT INTO `area` VALUES (1582, '2015-10-19 00:30:14', '2015-10-19 00:30:14', 0, 3, '河南省新乡市凤泉区', 2, '凤泉区', ',1511,1579,', 1579);\nINSERT INTO `area` VALUES (1583, '2015-10-19 00:30:15', '2015-10-19 00:30:15', 0, 4, '河南省新乡市牧野区', 2, '牧野区', ',1511,1579,', 1579);\nINSERT INTO `area` VALUES (1584, '2015-10-19 00:30:16', '2015-10-19 00:30:16', 0, 5, '河南省新乡市新乡县', 2, '新乡县', ',1511,1579,', 1579);\nINSERT INTO `area` VALUES (1585, '2015-10-19 00:30:17', '2015-10-19 00:30:17', 0, 6, '河南省新乡市获嘉县', 2, '获嘉县', ',1511,1579,', 1579);\nINSERT INTO `area` VALUES (1586, '2015-10-19 00:30:18', '2015-10-19 00:30:18', 0, 7, '河南省新乡市原阳县', 2, '原阳县', ',1511,1579,', 1579);\nINSERT INTO `area` VALUES (1587, '2015-10-19 00:30:19', '2015-10-19 00:30:19', 0, 8, '河南省新乡市延津县', 2, '延津县', ',1511,1579,', 1579);\nINSERT INTO `area` VALUES (1588, '2015-10-19 00:30:20', '2015-10-19 00:30:20', 0, 9, '河南省新乡市封丘县', 2, '封丘县', ',1511,1579,', 1579);\nINSERT INTO `area` VALUES (1589, '2015-10-19 00:30:21', '2015-10-19 00:30:21', 0, 10, '河南省新乡市长垣县', 2, '长垣县', ',1511,1579,', 1579);\nINSERT INTO `area` VALUES (1590, '2015-10-19 00:30:22', '2015-10-19 00:30:22', 0, 11, '河南省新乡市卫辉市', 2, '卫辉市', ',1511,1579,', 1579);\nINSERT INTO `area` VALUES (1591, '2015-10-19 00:30:23', '2015-10-19 00:30:23', 0, 12, '河南省新乡市辉县市', 2, '辉县市', ',1511,1579,', 1579);\nINSERT INTO `area` VALUES (1592, '2015-10-19 00:30:24', '2015-10-19 00:30:24', 0, 8, '河南省焦作市', 1, '焦作市', ',1511,', 1511);\nINSERT INTO `area` VALUES (1593, '2015-10-19 00:30:25', '2015-10-19 00:30:25', 0, 1, '河南省焦作市解放区', 2, '解放区', ',1511,1592,', 1592);\nINSERT INTO `area` VALUES (1594, '2015-10-19 00:30:26', '2015-10-19 00:30:26', 0, 2, '河南省焦作市中站区', 2, '中站区', ',1511,1592,', 1592);\nINSERT INTO `area` VALUES (1595, '2015-10-19 00:30:27', '2015-10-19 00:30:27', 0, 3, '河南省焦作市马村区', 2, '马村区', ',1511,1592,', 1592);\nINSERT INTO `area` VALUES (1596, '2015-10-19 00:30:28', '2015-10-19 00:30:28', 0, 4, '河南省焦作市山阳区', 2, '山阳区', ',1511,1592,', 1592);\nINSERT INTO `area` VALUES (1597, '2015-10-19 00:30:29', '2015-10-19 00:30:29', 0, 5, '河南省焦作市修武县', 2, '修武县', ',1511,1592,', 1592);\nINSERT INTO `area` VALUES (1598, '2015-10-19 00:30:30', '2015-10-19 00:30:30', 0, 6, '河南省焦作市博爱县', 2, '博爱县', ',1511,1592,', 1592);\nINSERT INTO `area` VALUES (1599, '2015-10-19 00:30:31', '2015-10-19 00:30:31', 0, 7, '河南省焦作市武陟县', 2, '武陟县', ',1511,1592,', 1592);\nINSERT INTO `area` VALUES (1600, '2015-10-19 00:30:32', '2015-10-19 00:30:32', 0, 8, '河南省焦作市温县', 2, '温县', ',1511,1592,', 1592);\nINSERT INTO `area` VALUES (1601, '2015-10-19 00:30:33', '2015-10-19 00:30:33', 0, 9, '河南省焦作市沁阳市', 2, '沁阳市', ',1511,1592,', 1592);\nINSERT INTO `area` VALUES (1602, '2015-10-19 00:30:34', '2015-10-19 00:30:34', 0, 10, '河南省焦作市孟州市', 2, '孟州市', ',1511,1592,', 1592);\nINSERT INTO `area` VALUES (1603, '2015-10-19 00:30:35', '2015-10-19 00:30:35', 0, 9, '河南省濮阳市', 1, '濮阳市', ',1511,', 1511);\nINSERT INTO `area` VALUES (1604, '2015-10-19 00:30:36', '2015-10-19 00:30:36', 0, 1, '河南省濮阳市华龙区', 2, '华龙区', ',1511,1603,', 1603);\nINSERT INTO `area` VALUES (1605, '2015-10-19 00:30:37', '2015-10-19 00:30:37', 0, 2, '河南省濮阳市清丰县', 2, '清丰县', ',1511,1603,', 1603);\nINSERT INTO `area` VALUES (1606, '2015-10-19 00:30:38', '2015-10-19 00:30:38', 0, 3, '河南省濮阳市南乐县', 2, '南乐县', ',1511,1603,', 1603);\nINSERT INTO `area` VALUES (1607, '2015-10-19 00:30:39', '2015-10-19 00:30:39', 0, 4, '河南省濮阳市范县', 2, '范县', ',1511,1603,', 1603);\nINSERT INTO `area` VALUES (1608, '2015-10-19 00:30:40', '2015-10-19 00:30:40', 0, 5, '河南省濮阳市台前县', 2, '台前县', ',1511,1603,', 1603);\nINSERT INTO `area` VALUES (1609, '2015-10-19 00:30:41', '2015-10-19 00:30:41', 0, 6, '河南省濮阳市濮阳县', 2, '濮阳县', ',1511,1603,', 1603);\nINSERT INTO `area` VALUES (1610, '2015-10-19 00:30:42', '2015-10-19 00:30:42', 0, 10, '河南省许昌市', 1, '许昌市', ',1511,', 1511);\nINSERT INTO `area` VALUES (1611, '2015-10-19 00:30:43', '2015-10-19 00:30:43', 0, 1, '河南省许昌市魏都区', 2, '魏都区', ',1511,1610,', 1610);\nINSERT INTO `area` VALUES (1612, '2015-10-19 00:30:44', '2015-10-19 00:30:44', 0, 2, '河南省许昌市许昌县', 2, '许昌县', ',1511,1610,', 1610);\nINSERT INTO `area` VALUES (1613, '2015-10-19 00:30:45', '2015-10-19 00:30:45', 0, 3, '河南省许昌市鄢陵县', 2, '鄢陵县', ',1511,1610,', 1610);\nINSERT INTO `area` VALUES (1614, '2015-10-19 00:30:46', '2015-10-19 00:30:46', 0, 4, '河南省许昌市襄城县', 2, '襄城县', ',1511,1610,', 1610);\nINSERT INTO `area` VALUES (1615, '2015-10-19 00:30:47', '2015-10-19 00:30:47', 0, 5, '河南省许昌市禹州市', 2, '禹州市', ',1511,1610,', 1610);\nINSERT INTO `area` VALUES (1616, '2015-10-19 00:30:48', '2015-10-19 00:30:48', 0, 6, '河南省许昌市长葛市', 2, '长葛市', ',1511,1610,', 1610);\nINSERT INTO `area` VALUES (1617, '2015-10-19 00:30:49', '2015-10-19 00:30:49', 0, 11, '河南省漯河市', 1, '漯河市', ',1511,', 1511);\nINSERT INTO `area` VALUES (1618, '2015-10-19 00:30:50', '2015-10-19 00:30:50', 0, 1, '河南省漯河市源汇区', 2, '源汇区', ',1511,1617,', 1617);\nINSERT INTO `area` VALUES (1619, '2015-10-19 00:30:51', '2015-10-19 00:30:51', 0, 2, '河南省漯河市郾城区', 2, '郾城区', ',1511,1617,', 1617);\nINSERT INTO `area` VALUES (1620, '2015-10-19 00:30:52', '2015-10-19 00:30:52', 0, 3, '河南省漯河市召陵区', 2, '召陵区', ',1511,1617,', 1617);\nINSERT INTO `area` VALUES (1621, '2015-10-19 00:30:53', '2015-10-19 00:30:53', 0, 4, '河南省漯河市舞阳县', 2, '舞阳县', ',1511,1617,', 1617);\nINSERT INTO `area` VALUES (1622, '2015-10-19 00:30:54', '2015-10-19 00:30:54', 0, 5, '河南省漯河市临颍县', 2, '临颍县', ',1511,1617,', 1617);\nINSERT INTO `area` VALUES (1623, '2015-10-19 00:30:55', '2015-10-19 00:30:55', 0, 12, '河南省三门峡市', 1, '三门峡市', ',1511,', 1511);\nINSERT INTO `area` VALUES (1624, '2015-10-19 00:30:56', '2015-10-19 00:30:56', 0, 1, '河南省三门峡市湖滨区', 2, '湖滨区', ',1511,1623,', 1623);\nINSERT INTO `area` VALUES (1625, '2015-10-19 00:30:57', '2015-10-19 00:30:57', 0, 2, '河南省三门峡市渑池县', 2, '渑池县', ',1511,1623,', 1623);\nINSERT INTO `area` VALUES (1626, '2015-10-19 00:30:58', '2015-10-19 00:30:58', 0, 3, '河南省三门峡市陕县', 2, '陕县', ',1511,1623,', 1623);\nINSERT INTO `area` VALUES (1627, '2015-10-19 00:30:59', '2015-10-19 00:30:59', 0, 4, '河南省三门峡市卢氏县', 2, '卢氏县', ',1511,1623,', 1623);\nINSERT INTO `area` VALUES (1628, '2015-10-19 00:31:00', '2015-10-19 00:31:00', 0, 5, '河南省三门峡市义马市', 2, '义马市', ',1511,1623,', 1623);\nINSERT INTO `area` VALUES (1629, '2015-10-19 00:31:01', '2015-10-19 00:31:01', 0, 6, '河南省三门峡市灵宝市', 2, '灵宝市', ',1511,1623,', 1623);\nINSERT INTO `area` VALUES (1630, '2015-10-19 00:31:02', '2015-10-19 00:31:02', 0, 13, '河南省南阳市', 1, '南阳市', ',1511,', 1511);\nINSERT INTO `area` VALUES (1631, '2015-10-19 00:31:03', '2015-10-19 00:31:03', 0, 1, '河南省南阳市宛城区', 2, '宛城区', ',1511,1630,', 1630);\nINSERT INTO `area` VALUES (1632, '2015-10-19 00:31:04', '2015-10-19 00:31:04', 0, 2, '河南省南阳市卧龙区', 2, '卧龙区', ',1511,1630,', 1630);\nINSERT INTO `area` VALUES (1633, '2015-10-19 00:31:05', '2015-10-19 00:31:05', 0, 3, '河南省南阳市南召县', 2, '南召县', ',1511,1630,', 1630);\nINSERT INTO `area` VALUES (1634, '2015-10-19 00:31:06', '2015-10-19 00:31:06', 0, 4, '河南省南阳市方城县', 2, '方城县', ',1511,1630,', 1630);\nINSERT INTO `area` VALUES (1635, '2015-10-19 00:31:07', '2015-10-19 00:31:07', 0, 5, '河南省南阳市西峡县', 2, '西峡县', ',1511,1630,', 1630);\nINSERT INTO `area` VALUES (1636, '2015-10-19 00:31:08', '2015-10-19 00:31:08', 0, 6, '河南省南阳市镇平县', 2, '镇平县', ',1511,1630,', 1630);\nINSERT INTO `area` VALUES (1637, '2015-10-19 00:31:09', '2015-10-19 00:31:09', 0, 7, '河南省南阳市内乡县', 2, '内乡县', ',1511,1630,', 1630);\nINSERT INTO `area` VALUES (1638, '2015-10-19 00:31:10', '2015-10-19 00:31:10', 0, 8, '河南省南阳市淅川县', 2, '淅川县', ',1511,1630,', 1630);\nINSERT INTO `area` VALUES (1639, '2015-10-19 00:31:11', '2015-10-19 00:31:11', 0, 9, '河南省南阳市社旗县', 2, '社旗县', ',1511,1630,', 1630);\nINSERT INTO `area` VALUES (1640, '2015-10-19 00:31:12', '2015-10-19 00:31:12', 0, 10, '河南省南阳市唐河县', 2, '唐河县', ',1511,1630,', 1630);\nINSERT INTO `area` VALUES (1641, '2015-10-19 00:31:13', '2015-10-19 00:31:13', 0, 11, '河南省南阳市新野县', 2, '新野县', ',1511,1630,', 1630);\nINSERT INTO `area` VALUES (1642, '2015-10-19 00:31:14', '2015-10-19 00:31:14', 0, 12, '河南省南阳市桐柏县', 2, '桐柏县', ',1511,1630,', 1630);\nINSERT INTO `area` VALUES (1643, '2015-10-19 00:31:15', '2015-10-19 00:31:15', 0, 13, '河南省南阳市邓州市', 2, '邓州市', ',1511,1630,', 1630);\nINSERT INTO `area` VALUES (1644, '2015-10-19 00:31:16', '2015-10-19 00:31:16', 0, 14, '河南省商丘市', 1, '商丘市', ',1511,', 1511);\nINSERT INTO `area` VALUES (1645, '2015-10-19 00:31:17', '2015-10-19 00:31:17', 0, 1, '河南省商丘市梁园区', 2, '梁园区', ',1511,1644,', 1644);\nINSERT INTO `area` VALUES (1646, '2015-10-19 00:31:18', '2015-10-19 00:31:18', 0, 2, '河南省商丘市睢阳区', 2, '睢阳区', ',1511,1644,', 1644);\nINSERT INTO `area` VALUES (1647, '2015-10-19 00:31:19', '2015-10-19 00:31:19', 0, 3, '河南省商丘市民权县', 2, '民权县', ',1511,1644,', 1644);\nINSERT INTO `area` VALUES (1648, '2015-10-19 00:31:20', '2015-10-19 00:31:20', 0, 4, '河南省商丘市睢县', 2, '睢县', ',1511,1644,', 1644);\nINSERT INTO `area` VALUES (1649, '2015-10-19 00:31:21', '2015-10-19 00:31:21', 0, 5, '河南省商丘市宁陵县', 2, '宁陵县', ',1511,1644,', 1644);\nINSERT INTO `area` VALUES (1650, '2015-10-19 00:31:22', '2015-10-19 00:31:22', 0, 6, '河南省商丘市柘城县', 2, '柘城县', ',1511,1644,', 1644);\nINSERT INTO `area` VALUES (1651, '2015-10-19 00:31:23', '2015-10-19 00:31:23', 0, 7, '河南省商丘市虞城县', 2, '虞城县', ',1511,1644,', 1644);\nINSERT INTO `area` VALUES (1652, '2015-10-19 00:31:24', '2015-10-19 00:31:24', 0, 8, '河南省商丘市夏邑县', 2, '夏邑县', ',1511,1644,', 1644);\nINSERT INTO `area` VALUES (1653, '2015-10-19 00:31:25', '2015-10-19 00:31:25', 0, 9, '河南省商丘市永城市', 2, '永城市', ',1511,1644,', 1644);\nINSERT INTO `area` VALUES (1654, '2015-10-19 00:31:26', '2015-10-19 00:31:26', 0, 15, '河南省信阳市', 1, '信阳市', ',1511,', 1511);\nINSERT INTO `area` VALUES (1655, '2015-10-19 00:31:27', '2015-10-19 00:31:27', 0, 1, '河南省信阳市浉河区', 2, '浉河区', ',1511,1654,', 1654);\nINSERT INTO `area` VALUES (1656, '2015-10-19 00:31:28', '2015-10-19 00:31:28', 0, 2, '河南省信阳市平桥区', 2, '平桥区', ',1511,1654,', 1654);\nINSERT INTO `area` VALUES (1657, '2015-10-19 00:31:29', '2015-10-19 00:31:29', 0, 3, '河南省信阳市罗山县', 2, '罗山县', ',1511,1654,', 1654);\nINSERT INTO `area` VALUES (1658, '2015-10-19 00:31:30', '2015-10-19 00:31:30', 0, 4, '河南省信阳市光山县', 2, '光山县', ',1511,1654,', 1654);\nINSERT INTO `area` VALUES (1659, '2015-10-19 00:31:31', '2015-10-19 00:31:31', 0, 5, '河南省信阳市新县', 2, '新县', ',1511,1654,', 1654);\nINSERT INTO `area` VALUES (1660, '2015-10-19 00:31:32', '2015-10-19 00:31:32', 0, 6, '河南省信阳市商城县', 2, '商城县', ',1511,1654,', 1654);\nINSERT INTO `area` VALUES (1661, '2015-10-19 00:31:33', '2015-10-19 00:31:33', 0, 7, '河南省信阳市固始县', 2, '固始县', ',1511,1654,', 1654);\nINSERT INTO `area` VALUES (1662, '2015-10-19 00:31:34', '2015-10-19 00:31:34', 0, 8, '河南省信阳市潢川县', 2, '潢川县', ',1511,1654,', 1654);\nINSERT INTO `area` VALUES (1663, '2015-10-19 00:31:35', '2015-10-19 00:31:35', 0, 9, '河南省信阳市淮滨县', 2, '淮滨县', ',1511,1654,', 1654);\nINSERT INTO `area` VALUES (1664, '2015-10-19 00:31:36', '2015-10-19 00:31:36', 0, 10, '河南省信阳市息县', 2, '息县', ',1511,1654,', 1654);\nINSERT INTO `area` VALUES (1665, '2015-10-19 00:31:37', '2015-10-19 00:31:37', 0, 16, '河南省周口市', 1, '周口市', ',1511,', 1511);\nINSERT INTO `area` VALUES (1666, '2015-10-19 00:31:38', '2015-10-19 00:31:38', 0, 1, '河南省周口市川汇区', 2, '川汇区', ',1511,1665,', 1665);\nINSERT INTO `area` VALUES (1667, '2015-10-19 00:31:39', '2015-10-19 00:31:39', 0, 2, '河南省周口市扶沟县', 2, '扶沟县', ',1511,1665,', 1665);\nINSERT INTO `area` VALUES (1668, '2015-10-19 00:31:40', '2015-10-19 00:31:40', 0, 3, '河南省周口市西华县', 2, '西华县', ',1511,1665,', 1665);\nINSERT INTO `area` VALUES (1669, '2015-10-19 00:31:41', '2015-10-19 00:31:41', 0, 4, '河南省周口市商水县', 2, '商水县', ',1511,1665,', 1665);\nINSERT INTO `area` VALUES (1670, '2015-10-19 00:31:42', '2015-10-19 00:31:42', 0, 5, '河南省周口市沈丘县', 2, '沈丘县', ',1511,1665,', 1665);\nINSERT INTO `area` VALUES (1671, '2015-10-19 00:31:43', '2015-10-19 00:31:43', 0, 6, '河南省周口市郸城县', 2, '郸城县', ',1511,1665,', 1665);\nINSERT INTO `area` VALUES (1672, '2015-10-19 00:31:44', '2015-10-19 00:31:44', 0, 7, '河南省周口市淮阳县', 2, '淮阳县', ',1511,1665,', 1665);\nINSERT INTO `area` VALUES (1673, '2015-10-19 00:31:45', '2015-10-19 00:31:45', 0, 8, '河南省周口市太康县', 2, '太康县', ',1511,1665,', 1665);\nINSERT INTO `area` VALUES (1674, '2015-10-19 00:31:46', '2015-10-19 00:31:46', 0, 9, '河南省周口市鹿邑县', 2, '鹿邑县', ',1511,1665,', 1665);\nINSERT INTO `area` VALUES (1675, '2015-10-19 00:31:47', '2015-10-19 00:31:47', 0, 10, '河南省周口市项城市', 2, '项城市', ',1511,1665,', 1665);\nINSERT INTO `area` VALUES (1676, '2015-10-19 00:31:48', '2015-10-19 00:31:48', 0, 17, '河南省驻马店市', 1, '驻马店市', ',1511,', 1511);\nINSERT INTO `area` VALUES (1677, '2015-10-19 00:31:49', '2015-10-19 00:31:49', 0, 1, '河南省驻马店市驿城区', 2, '驿城区', ',1511,1676,', 1676);\nINSERT INTO `area` VALUES (1678, '2015-10-19 00:31:50', '2015-10-19 00:31:50', 0, 2, '河南省驻马店市西平县', 2, '西平县', ',1511,1676,', 1676);\nINSERT INTO `area` VALUES (1679, '2015-10-19 00:31:51', '2015-10-19 00:31:51', 0, 3, '河南省驻马店市上蔡县', 2, '上蔡县', ',1511,1676,', 1676);\nINSERT INTO `area` VALUES (1680, '2015-10-19 00:31:52', '2015-10-19 00:31:52', 0, 4, '河南省驻马店市平舆县', 2, '平舆县', ',1511,1676,', 1676);\nINSERT INTO `area` VALUES (1681, '2015-10-19 00:31:53', '2015-10-19 00:31:53', 0, 5, '河南省驻马店市正阳县', 2, '正阳县', ',1511,1676,', 1676);\nINSERT INTO `area` VALUES (1682, '2015-10-19 00:31:54', '2015-10-19 00:31:54', 0, 6, '河南省驻马店市确山县', 2, '确山县', ',1511,1676,', 1676);\nINSERT INTO `area` VALUES (1683, '2015-10-19 00:31:55', '2015-10-19 00:31:55', 0, 7, '河南省驻马店市泌阳县', 2, '泌阳县', ',1511,1676,', 1676);\nINSERT INTO `area` VALUES (1684, '2015-10-19 00:31:56', '2015-10-19 00:31:56', 0, 8, '河南省驻马店市汝南县', 2, '汝南县', ',1511,1676,', 1676);\nINSERT INTO `area` VALUES (1685, '2015-10-19 00:31:57', '2015-10-19 00:31:57', 0, 9, '河南省驻马店市遂平县', 2, '遂平县', ',1511,1676,', 1676);\nINSERT INTO `area` VALUES (1686, '2015-10-19 00:31:58', '2015-10-19 00:31:58', 0, 10, '河南省驻马店市新蔡县', 2, '新蔡县', ',1511,1676,', 1676);\nINSERT INTO `area` VALUES (1687, '2015-10-19 00:31:59', '2015-10-19 00:31:59', 0, 18, '河南省济源市', 1, '济源市', ',1511,', 1511);\nINSERT INTO `area` VALUES (1688, '2015-10-19 00:32:00', '2015-10-19 00:32:00', 0, 17, '湖北省', 0, '湖北省', ',', NULL);\nINSERT INTO `area` VALUES (1689, '2015-10-19 00:32:01', '2015-10-19 00:32:01', 0, 1, '湖北省武汉市', 1, '武汉市', ',1688,', 1688);\nINSERT INTO `area` VALUES (1690, '2015-10-19 00:32:02', '2015-10-19 00:32:02', 0, 1, '湖北省武汉市江岸区', 2, '江岸区', ',1688,1689,', 1689);\nINSERT INTO `area` VALUES (1691, '2015-10-19 00:32:03', '2015-10-19 00:32:03', 0, 2, '湖北省武汉市江汉区', 2, '江汉区', ',1688,1689,', 1689);\nINSERT INTO `area` VALUES (1692, '2015-10-19 00:32:04', '2015-10-19 00:32:04', 0, 3, '湖北省武汉市硚口区', 2, '硚口区', ',1688,1689,', 1689);\nINSERT INTO `area` VALUES (1693, '2015-10-19 00:32:05', '2015-10-19 00:32:05', 0, 4, '湖北省武汉市汉阳区', 2, '汉阳区', ',1688,1689,', 1689);\nINSERT INTO `area` VALUES (1694, '2015-10-19 00:32:06', '2015-10-19 00:32:06', 0, 5, '湖北省武汉市武昌区', 2, '武昌区', ',1688,1689,', 1689);\nINSERT INTO `area` VALUES (1695, '2015-10-19 00:32:07', '2015-10-19 00:32:07', 0, 6, '湖北省武汉市青山区', 2, '青山区', ',1688,1689,', 1689);\nINSERT INTO `area` VALUES (1696, '2015-10-19 00:32:08', '2015-10-19 00:32:08', 0, 7, '湖北省武汉市洪山区', 2, '洪山区', ',1688,1689,', 1689);\nINSERT INTO `area` VALUES (1697, '2015-10-19 00:32:09', '2015-10-19 00:32:09', 0, 8, '湖北省武汉市东西湖区', 2, '东西湖区', ',1688,1689,', 1689);\nINSERT INTO `area` VALUES (1698, '2015-10-19 00:32:10', '2015-10-19 00:32:10', 0, 9, '湖北省武汉市汉南区', 2, '汉南区', ',1688,1689,', 1689);\nINSERT INTO `area` VALUES (1699, '2015-10-19 00:32:11', '2015-10-19 00:32:11', 0, 10, '湖北省武汉市蔡甸区', 2, '蔡甸区', ',1688,1689,', 1689);\nINSERT INTO `area` VALUES (1700, '2015-10-19 00:32:12', '2015-10-19 00:32:12', 0, 11, '湖北省武汉市江夏区', 2, '江夏区', ',1688,1689,', 1689);\nINSERT INTO `area` VALUES (1701, '2015-10-19 00:32:13', '2015-10-19 00:32:13', 0, 12, '湖北省武汉市黄陂区', 2, '黄陂区', ',1688,1689,', 1689);\nINSERT INTO `area` VALUES (1702, '2015-10-19 00:32:14', '2015-10-19 00:32:14', 0, 13, '湖北省武汉市新洲区', 2, '新洲区', ',1688,1689,', 1689);\nINSERT INTO `area` VALUES (1703, '2015-10-19 00:32:15', '2015-10-19 00:32:15', 0, 2, '湖北省黄石市', 1, '黄石市', ',1688,', 1688);\nINSERT INTO `area` VALUES (1704, '2015-10-19 00:32:16', '2015-10-19 00:32:16', 0, 1, '湖北省黄石市黄石港区', 2, '黄石港区', ',1688,1703,', 1703);\nINSERT INTO `area` VALUES (1705, '2015-10-19 00:32:17', '2015-10-19 00:32:17', 0, 2, '湖北省黄石市西塞山区', 2, '西塞山区', ',1688,1703,', 1703);\nINSERT INTO `area` VALUES (1706, '2015-10-19 00:32:18', '2015-10-19 00:32:18', 0, 3, '湖北省黄石市下陆区', 2, '下陆区', ',1688,1703,', 1703);\nINSERT INTO `area` VALUES (1707, '2015-10-19 00:32:19', '2015-10-19 00:32:19', 0, 4, '湖北省黄石市铁山区', 2, '铁山区', ',1688,1703,', 1703);\nINSERT INTO `area` VALUES (1708, '2015-10-19 00:32:20', '2015-10-19 00:32:20', 0, 5, '湖北省黄石市阳新县', 2, '阳新县', ',1688,1703,', 1703);\nINSERT INTO `area` VALUES (1709, '2015-10-19 00:32:21', '2015-10-19 00:32:21', 0, 6, '湖北省黄石市大冶市', 2, '大冶市', ',1688,1703,', 1703);\nINSERT INTO `area` VALUES (1710, '2015-10-19 00:32:22', '2015-10-19 00:32:22', 0, 3, '湖北省十堰市', 1, '十堰市', ',1688,', 1688);\nINSERT INTO `area` VALUES (1711, '2015-10-19 00:32:23', '2015-10-19 00:32:23', 0, 1, '湖北省十堰市茅箭区', 2, '茅箭区', ',1688,1710,', 1710);\nINSERT INTO `area` VALUES (1712, '2015-10-19 00:32:24', '2015-10-19 00:32:24', 0, 2, '湖北省十堰市张湾区', 2, '张湾区', ',1688,1710,', 1710);\nINSERT INTO `area` VALUES (1713, '2015-10-19 00:32:25', '2015-10-19 00:32:25', 0, 3, '湖北省十堰市郧县', 2, '郧县', ',1688,1710,', 1710);\nINSERT INTO `area` VALUES (1714, '2015-10-19 00:32:26', '2015-10-19 00:32:26', 0, 4, '湖北省十堰市郧西县', 2, '郧西县', ',1688,1710,', 1710);\nINSERT INTO `area` VALUES (1715, '2015-10-19 00:32:27', '2015-10-19 00:32:27', 0, 5, '湖北省十堰市竹山县', 2, '竹山县', ',1688,1710,', 1710);\nINSERT INTO `area` VALUES (1716, '2015-10-19 00:32:28', '2015-10-19 00:32:28', 0, 6, '湖北省十堰市竹溪县', 2, '竹溪县', ',1688,1710,', 1710);\nINSERT INTO `area` VALUES (1717, '2015-10-19 00:32:29', '2015-10-19 00:32:29', 0, 7, '湖北省十堰市房县', 2, '房县', ',1688,1710,', 1710);\nINSERT INTO `area` VALUES (1718, '2015-10-19 00:32:30', '2015-10-19 00:32:30', 0, 8, '湖北省十堰市丹江口市', 2, '丹江口市', ',1688,1710,', 1710);\nINSERT INTO `area` VALUES (1719, '2015-10-19 00:32:31', '2015-10-19 00:32:31', 0, 4, '湖北省宜昌市', 1, '宜昌市', ',1688,', 1688);\nINSERT INTO `area` VALUES (1720, '2015-10-19 00:32:32', '2015-10-19 00:32:32', 0, 1, '湖北省宜昌市西陵区', 2, '西陵区', ',1688,1719,', 1719);\nINSERT INTO `area` VALUES (1721, '2015-10-19 00:32:33', '2015-10-19 00:32:33', 0, 2, '湖北省宜昌市伍家岗区', 2, '伍家岗区', ',1688,1719,', 1719);\nINSERT INTO `area` VALUES (1722, '2015-10-19 00:32:34', '2015-10-19 00:32:34', 0, 3, '湖北省宜昌市点军区', 2, '点军区', ',1688,1719,', 1719);\nINSERT INTO `area` VALUES (1723, '2015-10-19 00:32:35', '2015-10-19 00:32:35', 0, 4, '湖北省宜昌市猇亭区', 2, '猇亭区', ',1688,1719,', 1719);\nINSERT INTO `area` VALUES (1724, '2015-10-19 00:32:36', '2015-10-19 00:32:36', 0, 5, '湖北省宜昌市夷陵区', 2, '夷陵区', ',1688,1719,', 1719);\nINSERT INTO `area` VALUES (1725, '2015-10-19 00:32:37', '2015-10-19 00:32:37', 0, 6, '湖北省宜昌市远安县', 2, '远安县', ',1688,1719,', 1719);\nINSERT INTO `area` VALUES (1726, '2015-10-19 00:32:38', '2015-10-19 00:32:38', 0, 7, '湖北省宜昌市兴山县', 2, '兴山县', ',1688,1719,', 1719);\nINSERT INTO `area` VALUES (1727, '2015-10-19 00:32:39', '2015-10-19 00:32:39', 0, 8, '湖北省宜昌市秭归县', 2, '秭归县', ',1688,1719,', 1719);\nINSERT INTO `area` VALUES (1728, '2015-10-19 00:32:40', '2015-10-19 00:32:40', 0, 9, '湖北省宜昌市长阳土家族自治县', 2, '长阳土家族自治县', ',1688,1719,', 1719);\nINSERT INTO `area` VALUES (1729, '2015-10-19 00:32:41', '2015-10-19 00:32:41', 0, 10, '湖北省宜昌市五峰土家族自治县', 2, '五峰土家族自治县', ',1688,1719,', 1719);\nINSERT INTO `area` VALUES (1730, '2015-10-19 00:32:42', '2015-10-19 00:32:42', 0, 11, '湖北省宜昌市宜都市', 2, '宜都市', ',1688,1719,', 1719);\nINSERT INTO `area` VALUES (1731, '2015-10-19 00:32:43', '2015-10-19 00:32:43', 0, 12, '湖北省宜昌市当阳市', 2, '当阳市', ',1688,1719,', 1719);\nINSERT INTO `area` VALUES (1732, '2015-10-19 00:32:44', '2015-10-19 00:32:44', 0, 13, '湖北省宜昌市枝江市', 2, '枝江市', ',1688,1719,', 1719);\nINSERT INTO `area` VALUES (1733, '2015-10-19 00:32:45', '2015-10-19 00:32:45', 0, 5, '湖北省襄阳市', 1, '襄阳市', ',1688,', 1688);\nINSERT INTO `area` VALUES (1734, '2015-10-19 00:32:46', '2015-10-19 00:32:46', 0, 1, '湖北省襄阳市襄城区', 2, '襄城区', ',1688,1733,', 1733);\nINSERT INTO `area` VALUES (1735, '2015-10-19 00:32:47', '2015-10-19 00:32:47', 0, 2, '湖北省襄阳市樊城区', 2, '樊城区', ',1688,1733,', 1733);\nINSERT INTO `area` VALUES (1736, '2015-10-19 00:32:48', '2015-10-19 00:32:48', 0, 3, '湖北省襄阳市襄州区', 2, '襄州区', ',1688,1733,', 1733);\nINSERT INTO `area` VALUES (1737, '2015-10-19 00:32:49', '2015-10-19 00:32:49', 0, 4, '湖北省襄阳市南漳县', 2, '南漳县', ',1688,1733,', 1733);\nINSERT INTO `area` VALUES (1738, '2015-10-19 00:32:50', '2015-10-19 00:32:50', 0, 5, '湖北省襄阳市谷城县', 2, '谷城县', ',1688,1733,', 1733);\nINSERT INTO `area` VALUES (1739, '2015-10-19 00:32:51', '2015-10-19 00:32:51', 0, 6, '湖北省襄阳市保康县', 2, '保康县', ',1688,1733,', 1733);\nINSERT INTO `area` VALUES (1740, '2015-10-19 00:32:52', '2015-10-19 00:32:52', 0, 7, '湖北省襄阳市老河口市', 2, '老河口市', ',1688,1733,', 1733);\nINSERT INTO `area` VALUES (1741, '2015-10-19 00:32:53', '2015-10-19 00:32:53', 0, 8, '湖北省襄阳市枣阳市', 2, '枣阳市', ',1688,1733,', 1733);\nINSERT INTO `area` VALUES (1742, '2015-10-19 00:32:54', '2015-10-19 00:32:54', 0, 9, '湖北省襄阳市宜城市', 2, '宜城市', ',1688,1733,', 1733);\nINSERT INTO `area` VALUES (1743, '2015-10-19 00:32:55', '2015-10-19 00:32:55', 0, 6, '湖北省鄂州市', 1, '鄂州市', ',1688,', 1688);\nINSERT INTO `area` VALUES (1744, '2015-10-19 00:32:56', '2015-10-19 00:32:56', 0, 1, '湖北省鄂州市梁子湖区', 2, '梁子湖区', ',1688,1743,', 1743);\nINSERT INTO `area` VALUES (1745, '2015-10-19 00:32:57', '2015-10-19 00:32:57', 0, 2, '湖北省鄂州市华容区', 2, '华容区', ',1688,1743,', 1743);\nINSERT INTO `area` VALUES (1746, '2015-10-19 00:32:58', '2015-10-19 00:32:58', 0, 3, '湖北省鄂州市鄂城区', 2, '鄂城区', ',1688,1743,', 1743);\nINSERT INTO `area` VALUES (1747, '2015-10-19 00:32:59', '2015-10-19 00:32:59', 0, 7, '湖北省荆门市', 1, '荆门市', ',1688,', 1688);\nINSERT INTO `area` VALUES (1748, '2015-10-19 00:33:00', '2015-10-19 00:33:00', 0, 1, '湖北省荆门市东宝区', 2, '东宝区', ',1688,1747,', 1747);\nINSERT INTO `area` VALUES (1749, '2015-10-19 00:33:01', '2015-10-19 00:33:01', 0, 2, '湖北省荆门市掇刀区', 2, '掇刀区', ',1688,1747,', 1747);\nINSERT INTO `area` VALUES (1750, '2015-10-19 00:33:02', '2015-10-19 00:33:02', 0, 3, '湖北省荆门市京山县', 2, '京山县', ',1688,1747,', 1747);\nINSERT INTO `area` VALUES (1751, '2015-10-19 00:33:03', '2015-10-19 00:33:03', 0, 4, '湖北省荆门市沙洋县', 2, '沙洋县', ',1688,1747,', 1747);\nINSERT INTO `area` VALUES (1752, '2015-10-19 00:33:04', '2015-10-19 00:33:04', 0, 5, '湖北省荆门市钟祥市', 2, '钟祥市', ',1688,1747,', 1747);\nINSERT INTO `area` VALUES (1753, '2015-10-19 00:33:05', '2015-10-19 00:33:05', 0, 8, '湖北省孝感市', 1, '孝感市', ',1688,', 1688);\nINSERT INTO `area` VALUES (1754, '2015-10-19 00:33:06', '2015-10-19 00:33:06', 0, 1, '湖北省孝感市孝南区', 2, '孝南区', ',1688,1753,', 1753);\nINSERT INTO `area` VALUES (1755, '2015-10-19 00:33:07', '2015-10-19 00:33:07', 0, 2, '湖北省孝感市孝昌县', 2, '孝昌县', ',1688,1753,', 1753);\nINSERT INTO `area` VALUES (1756, '2015-10-19 00:33:08', '2015-10-19 00:33:08', 0, 3, '湖北省孝感市大悟县', 2, '大悟县', ',1688,1753,', 1753);\nINSERT INTO `area` VALUES (1757, '2015-10-19 00:33:09', '2015-10-19 00:33:09', 0, 4, '湖北省孝感市云梦县', 2, '云梦县', ',1688,1753,', 1753);\nINSERT INTO `area` VALUES (1758, '2015-10-19 00:33:10', '2015-10-19 00:33:10', 0, 5, '湖北省孝感市应城市', 2, '应城市', ',1688,1753,', 1753);\nINSERT INTO `area` VALUES (1759, '2015-10-19 00:33:11', '2015-10-19 00:33:11', 0, 6, '湖北省孝感市安陆市', 2, '安陆市', ',1688,1753,', 1753);\nINSERT INTO `area` VALUES (1760, '2015-10-19 00:33:12', '2015-10-19 00:33:12', 0, 7, '湖北省孝感市汉川市', 2, '汉川市', ',1688,1753,', 1753);\nINSERT INTO `area` VALUES (1761, '2015-10-19 00:33:13', '2015-10-19 00:33:13', 0, 9, '湖北省荆州市', 1, '荆州市', ',1688,', 1688);\nINSERT INTO `area` VALUES (1762, '2015-10-19 00:33:14', '2015-10-19 00:33:14', 0, 1, '湖北省荆州市沙市区', 2, '沙市区', ',1688,1761,', 1761);\nINSERT INTO `area` VALUES (1763, '2015-10-19 00:33:15', '2015-10-19 00:33:15', 0, 2, '湖北省荆州市荆州区', 2, '荆州区', ',1688,1761,', 1761);\nINSERT INTO `area` VALUES (1764, '2015-10-19 00:33:16', '2015-10-19 00:33:16', 0, 3, '湖北省荆州市公安县', 2, '公安县', ',1688,1761,', 1761);\nINSERT INTO `area` VALUES (1765, '2015-10-19 00:33:17', '2015-10-19 00:33:17', 0, 4, '湖北省荆州市监利县', 2, '监利县', ',1688,1761,', 1761);\nINSERT INTO `area` VALUES (1766, '2015-10-19 00:33:18', '2015-10-19 00:33:18', 0, 5, '湖北省荆州市江陵县', 2, '江陵县', ',1688,1761,', 1761);\nINSERT INTO `area` VALUES (1767, '2015-10-19 00:33:19', '2015-10-19 00:33:19', 0, 6, '湖北省荆州市石首市', 2, '石首市', ',1688,1761,', 1761);\nINSERT INTO `area` VALUES (1768, '2015-10-19 00:33:20', '2015-10-19 00:33:20', 0, 7, '湖北省荆州市洪湖市', 2, '洪湖市', ',1688,1761,', 1761);\nINSERT INTO `area` VALUES (1769, '2015-10-19 00:33:21', '2015-10-19 00:33:21', 0, 8, '湖北省荆州市松滋市', 2, '松滋市', ',1688,1761,', 1761);\nINSERT INTO `area` VALUES (1770, '2015-10-19 00:33:22', '2015-10-19 00:33:22', 0, 10, '湖北省黄冈市', 1, '黄冈市', ',1688,', 1688);\nINSERT INTO `area` VALUES (1771, '2015-10-19 00:33:23', '2015-10-19 00:33:23', 0, 1, '湖北省黄冈市黄州区', 2, '黄州区', ',1688,1770,', 1770);\nINSERT INTO `area` VALUES (1772, '2015-10-19 00:33:24', '2015-10-19 00:33:24', 0, 2, '湖北省黄冈市团风县', 2, '团风县', ',1688,1770,', 1770);\nINSERT INTO `area` VALUES (1773, '2015-10-19 00:33:25', '2015-10-19 00:33:25', 0, 3, '湖北省黄冈市红安县', 2, '红安县', ',1688,1770,', 1770);\nINSERT INTO `area` VALUES (1774, '2015-10-19 00:33:26', '2015-10-19 00:33:26', 0, 4, '湖北省黄冈市罗田县', 2, '罗田县', ',1688,1770,', 1770);\nINSERT INTO `area` VALUES (1775, '2015-10-19 00:33:27', '2015-10-19 00:33:27', 0, 5, '湖北省黄冈市英山县', 2, '英山县', ',1688,1770,', 1770);\nINSERT INTO `area` VALUES (1776, '2015-10-19 00:33:28', '2015-10-19 00:33:28', 0, 6, '湖北省黄冈市浠水县', 2, '浠水县', ',1688,1770,', 1770);\nINSERT INTO `area` VALUES (1777, '2015-10-19 00:33:29', '2015-10-19 00:33:29', 0, 7, '湖北省黄冈市蕲春县', 2, '蕲春县', ',1688,1770,', 1770);\nINSERT INTO `area` VALUES (1778, '2015-10-19 00:33:30', '2015-10-19 00:33:30', 0, 8, '湖北省黄冈市黄梅县', 2, '黄梅县', ',1688,1770,', 1770);\nINSERT INTO `area` VALUES (1779, '2015-10-19 00:33:31', '2015-10-19 00:33:31', 0, 9, '湖北省黄冈市麻城市', 2, '麻城市', ',1688,1770,', 1770);\nINSERT INTO `area` VALUES (1780, '2015-10-19 00:33:32', '2015-10-19 00:33:32', 0, 10, '湖北省黄冈市武穴市', 2, '武穴市', ',1688,1770,', 1770);\nINSERT INTO `area` VALUES (1781, '2015-10-19 00:33:33', '2015-10-19 00:33:33', 0, 11, '湖北省咸宁市', 1, '咸宁市', ',1688,', 1688);\nINSERT INTO `area` VALUES (1782, '2015-10-19 00:33:34', '2015-10-19 00:33:34', 0, 1, '湖北省咸宁市咸安区', 2, '咸安区', ',1688,1781,', 1781);\nINSERT INTO `area` VALUES (1783, '2015-10-19 00:33:35', '2015-10-19 00:33:35', 0, 2, '湖北省咸宁市嘉鱼县', 2, '嘉鱼县', ',1688,1781,', 1781);\nINSERT INTO `area` VALUES (1784, '2015-10-19 00:33:36', '2015-10-19 00:33:36', 0, 3, '湖北省咸宁市通城县', 2, '通城县', ',1688,1781,', 1781);\nINSERT INTO `area` VALUES (1785, '2015-10-19 00:33:37', '2015-10-19 00:33:37', 0, 4, '湖北省咸宁市崇阳县', 2, '崇阳县', ',1688,1781,', 1781);\nINSERT INTO `area` VALUES (1786, '2015-10-19 00:33:38', '2015-10-19 00:33:38', 0, 5, '湖北省咸宁市通山县', 2, '通山县', ',1688,1781,', 1781);\nINSERT INTO `area` VALUES (1787, '2015-10-19 00:33:39', '2015-10-19 00:33:39', 0, 6, '湖北省咸宁市赤壁市', 2, '赤壁市', ',1688,1781,', 1781);\nINSERT INTO `area` VALUES (1788, '2015-10-19 00:33:40', '2015-10-19 00:33:40', 0, 12, '湖北省随州市', 1, '随州市', ',1688,', 1688);\nINSERT INTO `area` VALUES (1789, '2015-10-19 00:33:41', '2015-10-19 00:33:41', 0, 1, '湖北省随州市曾都区', 2, '曾都区', ',1688,1788,', 1788);\nINSERT INTO `area` VALUES (1790, '2015-10-19 00:33:42', '2015-10-19 00:33:42', 0, 2, '湖北省随州市随县', 2, '随县', ',1688,1788,', 1788);\nINSERT INTO `area` VALUES (1791, '2015-10-19 00:33:43', '2015-10-19 00:33:43', 0, 3, '湖北省随州市广水市', 2, '广水市', ',1688,1788,', 1788);\nINSERT INTO `area` VALUES (1792, '2015-10-19 00:33:44', '2015-10-19 00:33:44', 0, 13, '湖北省恩施土家族苗族自治州', 1, '恩施土家族苗族自治州', ',1688,', 1688);\nINSERT INTO `area` VALUES (1793, '2015-10-19 00:33:45', '2015-10-19 00:33:45', 0, 1, '湖北省恩施土家族苗族自治州恩施市', 2, '恩施市', ',1688,1792,', 1792);\nINSERT INTO `area` VALUES (1794, '2015-10-19 00:33:46', '2015-10-19 00:33:46', 0, 2, '湖北省恩施土家族苗族自治州利川市', 2, '利川市', ',1688,1792,', 1792);\nINSERT INTO `area` VALUES (1795, '2015-10-19 00:33:47', '2015-10-19 00:33:47', 0, 3, '湖北省恩施土家族苗族自治州建始县', 2, '建始县', ',1688,1792,', 1792);\nINSERT INTO `area` VALUES (1796, '2015-10-19 00:33:48', '2015-10-19 00:33:48', 0, 4, '湖北省恩施土家族苗族自治州巴东县', 2, '巴东县', ',1688,1792,', 1792);\nINSERT INTO `area` VALUES (1797, '2015-10-19 00:33:49', '2015-10-19 00:33:49', 0, 5, '湖北省恩施土家族苗族自治州宣恩县', 2, '宣恩县', ',1688,1792,', 1792);\nINSERT INTO `area` VALUES (1798, '2015-10-19 00:33:50', '2015-10-19 00:33:50', 0, 6, '湖北省恩施土家族苗族自治州咸丰县', 2, '咸丰县', ',1688,1792,', 1792);\nINSERT INTO `area` VALUES (1799, '2015-10-19 00:33:51', '2015-10-19 00:33:51', 0, 7, '湖北省恩施土家族苗族自治州来凤县', 2, '来凤县', ',1688,1792,', 1792);\nINSERT INTO `area` VALUES (1800, '2015-10-19 00:33:52', '2015-10-19 00:33:52', 0, 8, '湖北省恩施土家族苗族自治州鹤峰县', 2, '鹤峰县', ',1688,1792,', 1792);\nINSERT INTO `area` VALUES (1801, '2015-10-19 00:33:53', '2015-10-19 00:33:53', 0, 14, '湖北省仙桃市', 1, '仙桃市', ',1688,', 1688);\nINSERT INTO `area` VALUES (1802, '2015-10-19 00:33:54', '2015-10-19 00:33:54', 0, 15, '湖北省潜江市', 1, '潜江市', ',1688,', 1688);\nINSERT INTO `area` VALUES (1803, '2015-10-19 00:33:55', '2015-10-19 00:33:55', 0, 16, '湖北省天门市', 1, '天门市', ',1688,', 1688);\nINSERT INTO `area` VALUES (1804, '2015-10-19 00:33:56', '2015-10-19 00:33:56', 0, 17, '湖北省神农架林区', 1, '神农架林区', ',1688,', 1688);\nINSERT INTO `area` VALUES (1805, '2015-10-19 00:33:57', '2015-10-19 00:33:57', 0, 18, '湖南省', 0, '湖南省', ',', NULL);\nINSERT INTO `area` VALUES (1806, '2015-10-19 00:33:58', '2015-10-19 00:33:58', 0, 1, '湖南省长沙市', 1, '长沙市', ',1805,', 1805);\nINSERT INTO `area` VALUES (1807, '2015-10-19 00:33:59', '2015-10-19 00:33:59', 0, 1, '湖南省长沙市芙蓉区', 2, '芙蓉区', ',1805,1806,', 1806);\nINSERT INTO `area` VALUES (1808, '2015-10-19 00:34:00', '2015-10-19 00:34:00', 0, 2, '湖南省长沙市天心区', 2, '天心区', ',1805,1806,', 1806);\nINSERT INTO `area` VALUES (1809, '2015-10-19 00:34:01', '2015-10-19 00:34:01', 0, 3, '湖南省长沙市岳麓区', 2, '岳麓区', ',1805,1806,', 1806);\nINSERT INTO `area` VALUES (1810, '2015-10-19 00:34:02', '2015-10-19 00:34:02', 0, 4, '湖南省长沙市开福区', 2, '开福区', ',1805,1806,', 1806);\nINSERT INTO `area` VALUES (1811, '2015-10-19 00:34:03', '2015-10-19 00:34:03', 0, 5, '湖南省长沙市雨花区', 2, '雨花区', ',1805,1806,', 1806);\nINSERT INTO `area` VALUES (1812, '2015-10-19 00:34:04', '2015-10-19 00:34:04', 0, 6, '湖南省长沙市望城区', 2, '望城区', ',1805,1806,', 1806);\nINSERT INTO `area` VALUES (1813, '2015-10-19 00:34:05', '2015-10-19 00:34:05', 0, 7, '湖南省长沙市长沙县', 2, '长沙县', ',1805,1806,', 1806);\nINSERT INTO `area` VALUES (1814, '2015-10-19 00:34:06', '2015-10-19 00:34:06', 0, 8, '湖南省长沙市宁乡县', 2, '宁乡县', ',1805,1806,', 1806);\nINSERT INTO `area` VALUES (1815, '2015-10-19 00:34:07', '2015-10-19 00:34:07', 0, 9, '湖南省长沙市浏阳市', 2, '浏阳市', ',1805,1806,', 1806);\nINSERT INTO `area` VALUES (1816, '2015-10-19 00:34:08', '2015-10-19 00:34:08', 0, 2, '湖南省株洲市', 1, '株洲市', ',1805,', 1805);\nINSERT INTO `area` VALUES (1817, '2015-10-19 00:34:09', '2015-10-19 00:34:09', 0, 1, '湖南省株洲市荷塘区', 2, '荷塘区', ',1805,1816,', 1816);\nINSERT INTO `area` VALUES (1818, '2015-10-19 00:34:10', '2015-10-19 00:34:10', 0, 2, '湖南省株洲市芦淞区', 2, '芦淞区', ',1805,1816,', 1816);\nINSERT INTO `area` VALUES (1819, '2015-10-19 00:34:11', '2015-10-19 00:34:11', 0, 3, '湖南省株洲市石峰区', 2, '石峰区', ',1805,1816,', 1816);\nINSERT INTO `area` VALUES (1820, '2015-10-19 00:34:12', '2015-10-19 00:34:12', 0, 4, '湖南省株洲市天元区', 2, '天元区', ',1805,1816,', 1816);\nINSERT INTO `area` VALUES (1821, '2015-10-19 00:34:13', '2015-10-19 00:34:13', 0, 5, '湖南省株洲市株洲县', 2, '株洲县', ',1805,1816,', 1816);\nINSERT INTO `area` VALUES (1822, '2015-10-19 00:34:14', '2015-10-19 00:34:14', 0, 6, '湖南省株洲市攸县', 2, '攸县', ',1805,1816,', 1816);\nINSERT INTO `area` VALUES (1823, '2015-10-19 00:34:15', '2015-10-19 00:34:15', 0, 7, '湖南省株洲市茶陵县', 2, '茶陵县', ',1805,1816,', 1816);\nINSERT INTO `area` VALUES (1824, '2015-10-19 00:34:16', '2015-10-19 00:34:16', 0, 8, '湖南省株洲市炎陵县', 2, '炎陵县', ',1805,1816,', 1816);\nINSERT INTO `area` VALUES (1825, '2015-10-19 00:34:17', '2015-10-19 00:34:17', 0, 9, '湖南省株洲市醴陵市', 2, '醴陵市', ',1805,1816,', 1816);\nINSERT INTO `area` VALUES (1826, '2015-10-19 00:34:18', '2015-10-19 00:34:18', 0, 3, '湖南省湘潭市', 1, '湘潭市', ',1805,', 1805);\nINSERT INTO `area` VALUES (1827, '2015-10-19 00:34:19', '2015-10-19 00:34:19', 0, 1, '湖南省湘潭市雨湖区', 2, '雨湖区', ',1805,1826,', 1826);\nINSERT INTO `area` VALUES (1828, '2015-10-19 00:34:20', '2015-10-19 00:34:20', 0, 2, '湖南省湘潭市岳塘区', 2, '岳塘区', ',1805,1826,', 1826);\nINSERT INTO `area` VALUES (1829, '2015-10-19 00:34:21', '2015-10-19 00:34:21', 0, 3, '湖南省湘潭市湘潭县', 2, '湘潭县', ',1805,1826,', 1826);\nINSERT INTO `area` VALUES (1830, '2015-10-19 00:34:22', '2015-10-19 00:34:22', 0, 4, '湖南省湘潭市湘乡市', 2, '湘乡市', ',1805,1826,', 1826);\nINSERT INTO `area` VALUES (1831, '2015-10-19 00:34:23', '2015-10-19 00:34:23', 0, 5, '湖南省湘潭市韶山市', 2, '韶山市', ',1805,1826,', 1826);\nINSERT INTO `area` VALUES (1832, '2015-10-19 00:34:24', '2015-10-19 00:34:24', 0, 4, '湖南省衡阳市', 1, '衡阳市', ',1805,', 1805);\nINSERT INTO `area` VALUES (1833, '2015-10-19 00:34:25', '2015-10-19 00:34:25', 0, 1, '湖南省衡阳市珠晖区', 2, '珠晖区', ',1805,1832,', 1832);\nINSERT INTO `area` VALUES (1834, '2015-10-19 00:34:26', '2015-10-19 00:34:26', 0, 2, '湖南省衡阳市雁峰区', 2, '雁峰区', ',1805,1832,', 1832);\nINSERT INTO `area` VALUES (1835, '2015-10-19 00:34:27', '2015-10-19 00:34:27', 0, 3, '湖南省衡阳市石鼓区', 2, '石鼓区', ',1805,1832,', 1832);\nINSERT INTO `area` VALUES (1836, '2015-10-19 00:34:28', '2015-10-19 00:34:28', 0, 4, '湖南省衡阳市蒸湘区', 2, '蒸湘区', ',1805,1832,', 1832);\nINSERT INTO `area` VALUES (1837, '2015-10-19 00:34:29', '2015-10-19 00:34:29', 0, 5, '湖南省衡阳市南岳区', 2, '南岳区', ',1805,1832,', 1832);\nINSERT INTO `area` VALUES (1838, '2015-10-19 00:34:30', '2015-10-19 00:34:30', 0, 6, '湖南省衡阳市衡阳县', 2, '衡阳县', ',1805,1832,', 1832);\nINSERT INTO `area` VALUES (1839, '2015-10-19 00:34:31', '2015-10-19 00:34:31', 0, 7, '湖南省衡阳市衡南县', 2, '衡南县', ',1805,1832,', 1832);\nINSERT INTO `area` VALUES (1840, '2015-10-19 00:34:32', '2015-10-19 00:34:32', 0, 8, '湖南省衡阳市衡山县', 2, '衡山县', ',1805,1832,', 1832);\nINSERT INTO `area` VALUES (1841, '2015-10-19 00:34:33', '2015-10-19 00:34:33', 0, 9, '湖南省衡阳市衡东县', 2, '衡东县', ',1805,1832,', 1832);\nINSERT INTO `area` VALUES (1842, '2015-10-19 00:34:34', '2015-10-19 00:34:34', 0, 10, '湖南省衡阳市祁东县', 2, '祁东县', ',1805,1832,', 1832);\nINSERT INTO `area` VALUES (1843, '2015-10-19 00:34:35', '2015-10-19 00:34:35', 0, 11, '湖南省衡阳市耒阳市', 2, '耒阳市', ',1805,1832,', 1832);\nINSERT INTO `area` VALUES (1844, '2015-10-19 00:34:36', '2015-10-19 00:34:36', 0, 12, '湖南省衡阳市常宁市', 2, '常宁市', ',1805,1832,', 1832);\nINSERT INTO `area` VALUES (1845, '2015-10-19 00:34:37', '2015-10-19 00:34:37', 0, 5, '湖南省邵阳市', 1, '邵阳市', ',1805,', 1805);\nINSERT INTO `area` VALUES (1846, '2015-10-19 00:34:38', '2015-10-19 00:34:38', 0, 1, '湖南省邵阳市双清区', 2, '双清区', ',1805,1845,', 1845);\nINSERT INTO `area` VALUES (1847, '2015-10-19 00:34:39', '2015-10-19 00:34:39', 0, 2, '湖南省邵阳市大祥区', 2, '大祥区', ',1805,1845,', 1845);\nINSERT INTO `area` VALUES (1848, '2015-10-19 00:34:40', '2015-10-19 00:34:40', 0, 3, '湖南省邵阳市北塔区', 2, '北塔区', ',1805,1845,', 1845);\nINSERT INTO `area` VALUES (1849, '2015-10-19 00:34:41', '2015-10-19 00:34:41', 0, 4, '湖南省邵阳市邵东县', 2, '邵东县', ',1805,1845,', 1845);\nINSERT INTO `area` VALUES (1850, '2015-10-19 00:34:42', '2015-10-19 00:34:42', 0, 5, '湖南省邵阳市新邵县', 2, '新邵县', ',1805,1845,', 1845);\nINSERT INTO `area` VALUES (1851, '2015-10-19 00:34:43', '2015-10-19 00:34:43', 0, 6, '湖南省邵阳市邵阳县', 2, '邵阳县', ',1805,1845,', 1845);\nINSERT INTO `area` VALUES (1852, '2015-10-19 00:34:44', '2015-10-19 00:34:44', 0, 7, '湖南省邵阳市隆回县', 2, '隆回县', ',1805,1845,', 1845);\nINSERT INTO `area` VALUES (1853, '2015-10-19 00:34:45', '2015-10-19 00:34:45', 0, 8, '湖南省邵阳市洞口县', 2, '洞口县', ',1805,1845,', 1845);\nINSERT INTO `area` VALUES (1854, '2015-10-19 00:34:46', '2015-10-19 00:34:46', 0, 9, '湖南省邵阳市绥宁县', 2, '绥宁县', ',1805,1845,', 1845);\nINSERT INTO `area` VALUES (1855, '2015-10-19 00:34:47', '2015-10-19 00:34:47', 0, 10, '湖南省邵阳市新宁县', 2, '新宁县', ',1805,1845,', 1845);\nINSERT INTO `area` VALUES (1856, '2015-10-19 00:34:48', '2015-10-19 00:34:48', 0, 11, '湖南省邵阳市城步苗族自治县', 2, '城步苗族自治县', ',1805,1845,', 1845);\nINSERT INTO `area` VALUES (1857, '2015-10-19 00:34:49', '2015-10-19 00:34:49', 0, 12, '湖南省邵阳市武冈市', 2, '武冈市', ',1805,1845,', 1845);\nINSERT INTO `area` VALUES (1858, '2015-10-19 00:34:50', '2015-10-19 00:34:50', 0, 6, '湖南省岳阳市', 1, '岳阳市', ',1805,', 1805);\nINSERT INTO `area` VALUES (1859, '2015-10-19 00:34:51', '2015-10-19 00:34:51', 0, 1, '湖南省岳阳市岳阳楼区', 2, '岳阳楼区', ',1805,1858,', 1858);\nINSERT INTO `area` VALUES (1860, '2015-10-19 00:34:52', '2015-10-19 00:34:52', 0, 2, '湖南省岳阳市云溪区', 2, '云溪区', ',1805,1858,', 1858);\nINSERT INTO `area` VALUES (1861, '2015-10-19 00:34:53', '2015-10-19 00:34:53', 0, 3, '湖南省岳阳市君山区', 2, '君山区', ',1805,1858,', 1858);\nINSERT INTO `area` VALUES (1862, '2015-10-19 00:34:54', '2015-10-19 00:34:54', 0, 4, '湖南省岳阳市岳阳县', 2, '岳阳县', ',1805,1858,', 1858);\nINSERT INTO `area` VALUES (1863, '2015-10-19 00:34:55', '2015-10-19 00:34:55', 0, 5, '湖南省岳阳市华容县', 2, '华容县', ',1805,1858,', 1858);\nINSERT INTO `area` VALUES (1864, '2015-10-19 00:34:56', '2015-10-19 00:34:56', 0, 6, '湖南省岳阳市湘阴县', 2, '湘阴县', ',1805,1858,', 1858);\nINSERT INTO `area` VALUES (1865, '2015-10-19 00:34:57', '2015-10-19 00:34:57', 0, 7, '湖南省岳阳市平江县', 2, '平江县', ',1805,1858,', 1858);\nINSERT INTO `area` VALUES (1866, '2015-10-19 00:34:58', '2015-10-19 00:34:58', 0, 8, '湖南省岳阳市汨罗市', 2, '汨罗市', ',1805,1858,', 1858);\nINSERT INTO `area` VALUES (1867, '2015-10-19 00:34:59', '2015-10-19 00:34:59', 0, 9, '湖南省岳阳市临湘市', 2, '临湘市', ',1805,1858,', 1858);\nINSERT INTO `area` VALUES (1868, '2015-10-19 00:35:00', '2015-10-19 00:35:00', 0, 7, '湖南省常德市', 1, '常德市', ',1805,', 1805);\nINSERT INTO `area` VALUES (1869, '2015-10-19 00:35:01', '2015-10-19 00:35:01', 0, 1, '湖南省常德市武陵区', 2, '武陵区', ',1805,1868,', 1868);\nINSERT INTO `area` VALUES (1870, '2015-10-19 00:35:02', '2015-10-19 00:35:02', 0, 2, '湖南省常德市鼎城区', 2, '鼎城区', ',1805,1868,', 1868);\nINSERT INTO `area` VALUES (1871, '2015-10-19 00:35:03', '2015-10-19 00:35:03', 0, 3, '湖南省常德市安乡县', 2, '安乡县', ',1805,1868,', 1868);\nINSERT INTO `area` VALUES (1872, '2015-10-19 00:35:04', '2015-10-19 00:35:04', 0, 4, '湖南省常德市汉寿县', 2, '汉寿县', ',1805,1868,', 1868);\nINSERT INTO `area` VALUES (1873, '2015-10-19 00:35:05', '2015-10-19 00:35:05', 0, 5, '湖南省常德市澧县', 2, '澧县', ',1805,1868,', 1868);\nINSERT INTO `area` VALUES (1874, '2015-10-19 00:35:06', '2015-10-19 00:35:06', 0, 6, '湖南省常德市临澧县', 2, '临澧县', ',1805,1868,', 1868);\nINSERT INTO `area` VALUES (1875, '2015-10-19 00:35:07', '2015-10-19 00:35:07', 0, 7, '湖南省常德市桃源县', 2, '桃源县', ',1805,1868,', 1868);\nINSERT INTO `area` VALUES (1876, '2015-10-19 00:35:08', '2015-10-19 00:35:08', 0, 8, '湖南省常德市石门县', 2, '石门县', ',1805,1868,', 1868);\nINSERT INTO `area` VALUES (1877, '2015-10-19 00:35:09', '2015-10-19 00:35:09', 0, 9, '湖南省常德市津市市', 2, '津市市', ',1805,1868,', 1868);\nINSERT INTO `area` VALUES (1878, '2015-10-19 00:35:10', '2015-10-19 00:35:10', 0, 8, '湖南省张家界市', 1, '张家界市', ',1805,', 1805);\nINSERT INTO `area` VALUES (1879, '2015-10-19 00:35:11', '2015-10-19 00:35:11', 0, 1, '湖南省张家界市永定区', 2, '永定区', ',1805,1878,', 1878);\nINSERT INTO `area` VALUES (1880, '2015-10-19 00:35:12', '2015-10-19 00:35:12', 0, 2, '湖南省张家界市武陵源区', 2, '武陵源区', ',1805,1878,', 1878);\nINSERT INTO `area` VALUES (1881, '2015-10-19 00:35:13', '2015-10-19 00:35:13', 0, 3, '湖南省张家界市慈利县', 2, '慈利县', ',1805,1878,', 1878);\nINSERT INTO `area` VALUES (1882, '2015-10-19 00:35:14', '2015-10-19 00:35:14', 0, 4, '湖南省张家界市桑植县', 2, '桑植县', ',1805,1878,', 1878);\nINSERT INTO `area` VALUES (1883, '2015-10-19 00:35:15', '2015-10-19 00:35:15', 0, 9, '湖南省益阳市', 1, '益阳市', ',1805,', 1805);\nINSERT INTO `area` VALUES (1884, '2015-10-19 00:35:16', '2015-10-19 00:35:16', 0, 1, '湖南省益阳市资阳区', 2, '资阳区', ',1805,1883,', 1883);\nINSERT INTO `area` VALUES (1885, '2015-10-19 00:35:17', '2015-10-19 00:35:17', 0, 2, '湖南省益阳市赫山区', 2, '赫山区', ',1805,1883,', 1883);\nINSERT INTO `area` VALUES (1886, '2015-10-19 00:35:18', '2015-10-19 00:35:18', 0, 3, '湖南省益阳市南县', 2, '南县', ',1805,1883,', 1883);\nINSERT INTO `area` VALUES (1887, '2015-10-19 00:35:19', '2015-10-19 00:35:19', 0, 4, '湖南省益阳市桃江县', 2, '桃江县', ',1805,1883,', 1883);\nINSERT INTO `area` VALUES (1888, '2015-10-19 00:35:20', '2015-10-19 00:35:20', 0, 5, '湖南省益阳市安化县', 2, '安化县', ',1805,1883,', 1883);\nINSERT INTO `area` VALUES (1889, '2015-10-19 00:35:21', '2015-10-19 00:35:21', 0, 6, '湖南省益阳市沅江市', 2, '沅江市', ',1805,1883,', 1883);\nINSERT INTO `area` VALUES (1890, '2015-10-19 00:35:22', '2015-10-19 00:35:22', 0, 10, '湖南省郴州市', 1, '郴州市', ',1805,', 1805);\nINSERT INTO `area` VALUES (1891, '2015-10-19 00:35:23', '2015-10-19 00:35:23', 0, 1, '湖南省郴州市北湖区', 2, '北湖区', ',1805,1890,', 1890);\nINSERT INTO `area` VALUES (1892, '2015-10-19 00:35:24', '2015-10-19 00:35:24', 0, 2, '湖南省郴州市苏仙区', 2, '苏仙区', ',1805,1890,', 1890);\nINSERT INTO `area` VALUES (1893, '2015-10-19 00:35:25', '2015-10-19 00:35:25', 0, 3, '湖南省郴州市桂阳县', 2, '桂阳县', ',1805,1890,', 1890);\nINSERT INTO `area` VALUES (1894, '2015-10-19 00:35:26', '2015-10-19 00:35:26', 0, 4, '湖南省郴州市宜章县', 2, '宜章县', ',1805,1890,', 1890);\nINSERT INTO `area` VALUES (1895, '2015-10-19 00:35:27', '2015-10-19 00:35:27', 0, 5, '湖南省郴州市永兴县', 2, '永兴县', ',1805,1890,', 1890);\nINSERT INTO `area` VALUES (1896, '2015-10-19 00:35:28', '2015-10-19 00:35:28', 0, 6, '湖南省郴州市嘉禾县', 2, '嘉禾县', ',1805,1890,', 1890);\nINSERT INTO `area` VALUES (1897, '2015-10-19 00:35:29', '2015-10-19 00:35:29', 0, 7, '湖南省郴州市临武县', 2, '临武县', ',1805,1890,', 1890);\nINSERT INTO `area` VALUES (1898, '2015-10-19 00:35:30', '2015-10-19 00:35:30', 0, 8, '湖南省郴州市汝城县', 2, '汝城县', ',1805,1890,', 1890);\nINSERT INTO `area` VALUES (1899, '2015-10-19 00:35:31', '2015-10-19 00:35:31', 0, 9, '湖南省郴州市桂东县', 2, '桂东县', ',1805,1890,', 1890);\nINSERT INTO `area` VALUES (1900, '2015-10-19 00:35:32', '2015-10-19 00:35:32', 0, 10, '湖南省郴州市安仁县', 2, '安仁县', ',1805,1890,', 1890);\nINSERT INTO `area` VALUES (1901, '2015-10-19 00:35:33', '2015-10-19 00:35:33', 0, 11, '湖南省郴州市资兴市', 2, '资兴市', ',1805,1890,', 1890);\nINSERT INTO `area` VALUES (1902, '2015-10-19 00:35:34', '2015-10-19 00:35:34', 0, 11, '湖南省永州市', 1, '永州市', ',1805,', 1805);\nINSERT INTO `area` VALUES (1903, '2015-10-19 00:35:35', '2015-10-19 00:35:35', 0, 1, '湖南省永州市零陵区', 2, '零陵区', ',1805,1902,', 1902);\nINSERT INTO `area` VALUES (1904, '2015-10-19 00:35:36', '2015-10-19 00:35:36', 0, 2, '湖南省永州市冷水滩区', 2, '冷水滩区', ',1805,1902,', 1902);\nINSERT INTO `area` VALUES (1905, '2015-10-19 00:35:37', '2015-10-19 00:35:37', 0, 3, '湖南省永州市祁阳县', 2, '祁阳县', ',1805,1902,', 1902);\nINSERT INTO `area` VALUES (1906, '2015-10-19 00:35:38', '2015-10-19 00:35:38', 0, 4, '湖南省永州市东安县', 2, '东安县', ',1805,1902,', 1902);\nINSERT INTO `area` VALUES (1907, '2015-10-19 00:35:39', '2015-10-19 00:35:39', 0, 5, '湖南省永州市双牌县', 2, '双牌县', ',1805,1902,', 1902);\nINSERT INTO `area` VALUES (1908, '2015-10-19 00:35:40', '2015-10-19 00:35:40', 0, 6, '湖南省永州市道县', 2, '道县', ',1805,1902,', 1902);\nINSERT INTO `area` VALUES (1909, '2015-10-19 00:35:41', '2015-10-19 00:35:41', 0, 7, '湖南省永州市江永县', 2, '江永县', ',1805,1902,', 1902);\nINSERT INTO `area` VALUES (1910, '2015-10-19 00:35:42', '2015-10-19 00:35:42', 0, 8, '湖南省永州市宁远县', 2, '宁远县', ',1805,1902,', 1902);\nINSERT INTO `area` VALUES (1911, '2015-10-19 00:35:43', '2015-10-19 00:35:43', 0, 9, '湖南省永州市蓝山县', 2, '蓝山县', ',1805,1902,', 1902);\nINSERT INTO `area` VALUES (1912, '2015-10-19 00:35:44', '2015-10-19 00:35:44', 0, 10, '湖南省永州市新田县', 2, '新田县', ',1805,1902,', 1902);\nINSERT INTO `area` VALUES (1913, '2015-10-19 00:35:45', '2015-10-19 00:35:45', 0, 11, '湖南省永州市江华瑶族自治县', 2, '江华瑶族自治县', ',1805,1902,', 1902);\nINSERT INTO `area` VALUES (1914, '2015-10-19 00:35:46', '2015-10-19 00:35:46', 0, 12, '湖南省怀化市', 1, '怀化市', ',1805,', 1805);\nINSERT INTO `area` VALUES (1915, '2015-10-19 00:35:47', '2015-10-19 00:35:47', 0, 1, '湖南省怀化市鹤城区', 2, '鹤城区', ',1805,1914,', 1914);\nINSERT INTO `area` VALUES (1916, '2015-10-19 00:35:48', '2015-10-19 00:35:48', 0, 2, '湖南省怀化市中方县', 2, '中方县', ',1805,1914,', 1914);\nINSERT INTO `area` VALUES (1917, '2015-10-19 00:35:49', '2015-10-19 00:35:49', 0, 3, '湖南省怀化市沅陵县', 2, '沅陵县', ',1805,1914,', 1914);\nINSERT INTO `area` VALUES (1918, '2015-10-19 00:35:50', '2015-10-19 00:35:50', 0, 4, '湖南省怀化市辰溪县', 2, '辰溪县', ',1805,1914,', 1914);\nINSERT INTO `area` VALUES (1919, '2015-10-19 00:35:51', '2015-10-19 00:35:51', 0, 5, '湖南省怀化市溆浦县', 2, '溆浦县', ',1805,1914,', 1914);\nINSERT INTO `area` VALUES (1920, '2015-10-19 00:35:52', '2015-10-19 00:35:52', 0, 6, '湖南省怀化市会同县', 2, '会同县', ',1805,1914,', 1914);\nINSERT INTO `area` VALUES (1921, '2015-10-19 00:35:53', '2015-10-19 00:35:53', 0, 7, '湖南省怀化市麻阳苗族自治县', 2, '麻阳苗族自治县', ',1805,1914,', 1914);\nINSERT INTO `area` VALUES (1922, '2015-10-19 00:35:54', '2015-10-19 00:35:54', 0, 8, '湖南省怀化市新晃侗族自治县', 2, '新晃侗族自治县', ',1805,1914,', 1914);\nINSERT INTO `area` VALUES (1923, '2015-10-19 00:35:55', '2015-10-19 00:35:55', 0, 9, '湖南省怀化市芷江侗族自治县', 2, '芷江侗族自治县', ',1805,1914,', 1914);\nINSERT INTO `area` VALUES (1924, '2015-10-19 00:35:56', '2015-10-19 00:35:56', 0, 10, '湖南省怀化市靖州苗族侗族自治县', 2, '靖州苗族侗族自治县', ',1805,1914,', 1914);\nINSERT INTO `area` VALUES (1925, '2015-10-19 00:35:57', '2015-10-19 00:35:57', 0, 11, '湖南省怀化市通道侗族自治县', 2, '通道侗族自治县', ',1805,1914,', 1914);\nINSERT INTO `area` VALUES (1926, '2015-10-19 00:35:58', '2015-10-19 00:35:58', 0, 12, '湖南省怀化市洪江市', 2, '洪江市', ',1805,1914,', 1914);\nINSERT INTO `area` VALUES (1927, '2015-10-19 00:35:59', '2015-10-19 00:35:59', 0, 13, '湖南省娄底市', 1, '娄底市', ',1805,', 1805);\nINSERT INTO `area` VALUES (1928, '2015-10-19 00:36:00', '2015-10-19 00:36:00', 0, 1, '湖南省娄底市娄星区', 2, '娄星区', ',1805,1927,', 1927);\nINSERT INTO `area` VALUES (1929, '2015-10-19 00:36:01', '2015-10-19 00:36:01', 0, 2, '湖南省娄底市双峰县', 2, '双峰县', ',1805,1927,', 1927);\nINSERT INTO `area` VALUES (1930, '2015-10-19 00:36:02', '2015-10-19 00:36:02', 0, 3, '湖南省娄底市新化县', 2, '新化县', ',1805,1927,', 1927);\nINSERT INTO `area` VALUES (1931, '2015-10-19 00:36:03', '2015-10-19 00:36:03', 0, 4, '湖南省娄底市冷水江市', 2, '冷水江市', ',1805,1927,', 1927);\nINSERT INTO `area` VALUES (1932, '2015-10-19 00:36:04', '2015-10-19 00:36:04', 0, 5, '湖南省娄底市涟源市', 2, '涟源市', ',1805,1927,', 1927);\nINSERT INTO `area` VALUES (1933, '2015-10-19 00:36:05', '2015-10-19 00:36:05', 0, 14, '湖南省湘西土家族苗族自治州', 1, '湘西土家族苗族自治州', ',1805,', 1805);\nINSERT INTO `area` VALUES (1934, '2015-10-19 00:36:06', '2015-10-19 00:36:06', 0, 1, '湖南省湘西土家族苗族自治州吉首市', 2, '吉首市', ',1805,1933,', 1933);\nINSERT INTO `area` VALUES (1935, '2015-10-19 00:36:07', '2015-10-19 00:36:07', 0, 2, '湖南省湘西土家族苗族自治州泸溪县', 2, '泸溪县', ',1805,1933,', 1933);\nINSERT INTO `area` VALUES (1936, '2015-10-19 00:36:08', '2015-10-19 00:36:08', 0, 3, '湖南省湘西土家族苗族自治州凤凰县', 2, '凤凰县', ',1805,1933,', 1933);\nINSERT INTO `area` VALUES (1937, '2015-10-19 00:36:09', '2015-10-19 00:36:09', 0, 4, '湖南省湘西土家族苗族自治州花垣县', 2, '花垣县', ',1805,1933,', 1933);\nINSERT INTO `area` VALUES (1938, '2015-10-19 00:36:10', '2015-10-19 00:36:10', 0, 5, '湖南省湘西土家族苗族自治州保靖县', 2, '保靖县', ',1805,1933,', 1933);\nINSERT INTO `area` VALUES (1939, '2015-10-19 00:36:11', '2015-10-19 00:36:11', 0, 6, '湖南省湘西土家族苗族自治州古丈县', 2, '古丈县', ',1805,1933,', 1933);\nINSERT INTO `area` VALUES (1940, '2015-10-19 00:36:12', '2015-10-19 00:36:12', 0, 7, '湖南省湘西土家族苗族自治州永顺县', 2, '永顺县', ',1805,1933,', 1933);\nINSERT INTO `area` VALUES (1941, '2015-10-19 00:36:13', '2015-10-19 00:36:13', 0, 8, '湖南省湘西土家族苗族自治州龙山县', 2, '龙山县', ',1805,1933,', 1933);\nINSERT INTO `area` VALUES (1942, '2015-10-19 00:36:14', '2015-10-19 00:36:14', 0, 19, '广东省', 0, '广东省', ',', NULL);\nINSERT INTO `area` VALUES (1943, '2015-10-19 00:36:15', '2015-10-19 00:36:15', 0, 1, '广东省广州市', 1, '广州市', ',1942,', 1942);\nINSERT INTO `area` VALUES (1944, '2015-10-19 00:36:16', '2015-10-19 00:36:16', 0, 1, '广东省广州市荔湾区', 2, '荔湾区', ',1942,1943,', 1943);\nINSERT INTO `area` VALUES (1945, '2015-10-19 00:36:17', '2015-10-19 00:36:17', 0, 2, '广东省广州市越秀区', 2, '越秀区', ',1942,1943,', 1943);\nINSERT INTO `area` VALUES (1946, '2015-10-19 00:36:18', '2015-10-19 00:36:18', 0, 3, '广东省广州市海珠区', 2, '海珠区', ',1942,1943,', 1943);\nINSERT INTO `area` VALUES (1947, '2015-10-19 00:36:19', '2015-10-19 00:36:19', 0, 4, '广东省广州市天河区', 2, '天河区', ',1942,1943,', 1943);\nINSERT INTO `area` VALUES (1948, '2015-10-19 00:36:20', '2015-10-19 00:36:20', 0, 5, '广东省广州市白云区', 2, '白云区', ',1942,1943,', 1943);\nINSERT INTO `area` VALUES (1949, '2015-10-19 00:36:21', '2015-10-19 00:36:21', 0, 6, '广东省广州市黄埔区', 2, '黄埔区', ',1942,1943,', 1943);\nINSERT INTO `area` VALUES (1950, '2015-10-19 00:36:22', '2015-10-19 00:36:22', 0, 7, '广东省广州市番禺区', 2, '番禺区', ',1942,1943,', 1943);\nINSERT INTO `area` VALUES (1951, '2015-10-19 00:36:23', '2015-10-19 00:36:23', 0, 8, '广东省广州市花都区', 2, '花都区', ',1942,1943,', 1943);\nINSERT INTO `area` VALUES (1952, '2015-10-19 00:36:24', '2015-10-19 00:36:24', 0, 9, '广东省广州市南沙区', 2, '南沙区', ',1942,1943,', 1943);\nINSERT INTO `area` VALUES (1953, '2015-10-19 00:36:25', '2015-10-19 00:36:25', 0, 10, '广东省广州市萝岗区', 2, '萝岗区', ',1942,1943,', 1943);\nINSERT INTO `area` VALUES (1954, '2015-10-19 00:36:26', '2015-10-19 00:36:26', 0, 11, '广东省广州市增城市', 2, '增城市', ',1942,1943,', 1943);\nINSERT INTO `area` VALUES (1955, '2015-10-19 00:36:27', '2015-10-19 00:36:27', 0, 12, '广东省广州市从化市', 2, '从化市', ',1942,1943,', 1943);\nINSERT INTO `area` VALUES (1956, '2015-10-19 00:36:28', '2015-10-19 00:36:28', 0, 2, '广东省韶关市', 1, '韶关市', ',1942,', 1942);\nINSERT INTO `area` VALUES (1957, '2015-10-19 00:36:29', '2015-10-19 00:36:29', 0, 1, '广东省韶关市武江区', 2, '武江区', ',1942,1956,', 1956);\nINSERT INTO `area` VALUES (1958, '2015-10-19 00:36:30', '2015-10-19 00:36:30', 0, 2, '广东省韶关市浈江区', 2, '浈江区', ',1942,1956,', 1956);\nINSERT INTO `area` VALUES (1959, '2015-10-19 00:36:31', '2015-10-19 00:36:31', 0, 3, '广东省韶关市曲江区', 2, '曲江区', ',1942,1956,', 1956);\nINSERT INTO `area` VALUES (1960, '2015-10-19 00:36:32', '2015-10-19 00:36:32', 0, 4, '广东省韶关市始兴县', 2, '始兴县', ',1942,1956,', 1956);\nINSERT INTO `area` VALUES (1961, '2015-10-19 00:36:33', '2015-10-19 00:36:33', 0, 5, '广东省韶关市仁化县', 2, '仁化县', ',1942,1956,', 1956);\nINSERT INTO `area` VALUES (1962, '2015-10-19 00:36:34', '2015-10-19 00:36:34', 0, 6, '广东省韶关市翁源县', 2, '翁源县', ',1942,1956,', 1956);\nINSERT INTO `area` VALUES (1963, '2015-10-19 00:36:35', '2015-10-19 00:36:35', 0, 7, '广东省韶关市乳源瑶族自治县', 2, '乳源瑶族自治县', ',1942,1956,', 1956);\nINSERT INTO `area` VALUES (1964, '2015-10-19 00:36:36', '2015-10-19 00:36:36', 0, 8, '广东省韶关市新丰县', 2, '新丰县', ',1942,1956,', 1956);\nINSERT INTO `area` VALUES (1965, '2015-10-19 00:36:37', '2015-10-19 00:36:37', 0, 9, '广东省韶关市乐昌市', 2, '乐昌市', ',1942,1956,', 1956);\nINSERT INTO `area` VALUES (1966, '2015-10-19 00:36:38', '2015-10-19 00:36:38', 0, 10, '广东省韶关市南雄市', 2, '南雄市', ',1942,1956,', 1956);\nINSERT INTO `area` VALUES (1967, '2015-10-19 00:36:39', '2015-10-19 00:36:39', 0, 3, '广东省深圳市', 1, '深圳市', ',1942,', 1942);\nINSERT INTO `area` VALUES (1968, '2015-10-19 00:36:40', '2015-10-19 00:36:40', 0, 1, '广东省深圳市罗湖区', 2, '罗湖区', ',1942,1967,', 1967);\nINSERT INTO `area` VALUES (1969, '2015-10-19 00:36:41', '2015-10-19 00:36:41', 0, 2, '广东省深圳市福田区', 2, '福田区', ',1942,1967,', 1967);\nINSERT INTO `area` VALUES (1970, '2015-10-19 00:36:42', '2015-10-19 00:36:42', 0, 3, '广东省深圳市南山区', 2, '南山区', ',1942,1967,', 1967);\nINSERT INTO `area` VALUES (1971, '2015-10-19 00:36:43', '2015-10-19 00:36:43', 0, 4, '广东省深圳市宝安区', 2, '宝安区', ',1942,1967,', 1967);\nINSERT INTO `area` VALUES (1972, '2015-10-19 00:36:44', '2015-10-19 00:36:44', 0, 5, '广东省深圳市龙岗区', 2, '龙岗区', ',1942,1967,', 1967);\nINSERT INTO `area` VALUES (1973, '2015-10-19 00:36:45', '2015-10-19 00:36:45', 0, 6, '广东省深圳市盐田区', 2, '盐田区', ',1942,1967,', 1967);\nINSERT INTO `area` VALUES (1974, '2015-10-19 00:36:46', '2015-10-19 00:36:46', 0, 4, '广东省珠海市', 1, '珠海市', ',1942,', 1942);\nINSERT INTO `area` VALUES (1975, '2015-10-19 00:36:47', '2015-10-19 00:36:47', 0, 1, '广东省珠海市香洲区', 2, '香洲区', ',1942,1974,', 1974);\nINSERT INTO `area` VALUES (1976, '2015-10-19 00:36:48', '2015-10-19 00:36:48', 0, 2, '广东省珠海市斗门区', 2, '斗门区', ',1942,1974,', 1974);\nINSERT INTO `area` VALUES (1977, '2015-10-19 00:36:49', '2015-10-19 00:36:49', 0, 3, '广东省珠海市金湾区', 2, '金湾区', ',1942,1974,', 1974);\nINSERT INTO `area` VALUES (1978, '2015-10-19 00:36:50', '2015-10-19 00:36:50', 0, 5, '广东省汕头市', 1, '汕头市', ',1942,', 1942);\nINSERT INTO `area` VALUES (1979, '2015-10-19 00:36:51', '2015-10-19 00:36:51', 0, 1, '广东省汕头市龙湖区', 2, '龙湖区', ',1942,1978,', 1978);\nINSERT INTO `area` VALUES (1980, '2015-10-19 00:36:52', '2015-10-19 00:36:52', 0, 2, '广东省汕头市金平区', 2, '金平区', ',1942,1978,', 1978);\nINSERT INTO `area` VALUES (1981, '2015-10-19 00:36:53', '2015-10-19 00:36:53', 0, 3, '广东省汕头市濠江区', 2, '濠江区', ',1942,1978,', 1978);\nINSERT INTO `area` VALUES (1982, '2015-10-19 00:36:54', '2015-10-19 00:36:54', 0, 4, '广东省汕头市潮阳区', 2, '潮阳区', ',1942,1978,', 1978);\nINSERT INTO `area` VALUES (1983, '2015-10-19 00:36:55', '2015-10-19 00:36:55', 0, 5, '广东省汕头市潮南区', 2, '潮南区', ',1942,1978,', 1978);\nINSERT INTO `area` VALUES (1984, '2015-10-19 00:36:56', '2015-10-19 00:36:56', 0, 6, '广东省汕头市澄海区', 2, '澄海区', ',1942,1978,', 1978);\nINSERT INTO `area` VALUES (1985, '2015-10-19 00:36:57', '2015-10-19 00:36:57', 0, 7, '广东省汕头市南澳县', 2, '南澳县', ',1942,1978,', 1978);\nINSERT INTO `area` VALUES (1986, '2015-10-19 00:36:58', '2015-10-19 00:36:58', 0, 6, '广东省佛山市', 1, '佛山市', ',1942,', 1942);\nINSERT INTO `area` VALUES (1987, '2015-10-19 00:36:59', '2015-10-19 00:36:59', 0, 1, '广东省佛山市禅城区', 2, '禅城区', ',1942,1986,', 1986);\nINSERT INTO `area` VALUES (1988, '2015-10-19 00:37:00', '2015-10-19 00:37:00', 0, 2, '广东省佛山市南海区', 2, '南海区', ',1942,1986,', 1986);\nINSERT INTO `area` VALUES (1989, '2015-10-19 00:37:01', '2015-10-19 00:37:01', 0, 3, '广东省佛山市顺德区', 2, '顺德区', ',1942,1986,', 1986);\nINSERT INTO `area` VALUES (1990, '2015-10-19 00:37:02', '2015-10-19 00:37:02', 0, 4, '广东省佛山市三水区', 2, '三水区', ',1942,1986,', 1986);\nINSERT INTO `area` VALUES (1991, '2015-10-19 00:37:03', '2015-10-19 00:37:03', 0, 5, '广东省佛山市高明区', 2, '高明区', ',1942,1986,', 1986);\nINSERT INTO `area` VALUES (1992, '2015-10-19 00:37:04', '2015-10-19 00:37:04', 0, 7, '广东省江门市', 1, '江门市', ',1942,', 1942);\nINSERT INTO `area` VALUES (1993, '2015-10-19 00:37:05', '2015-10-19 00:37:05', 0, 1, '广东省江门市蓬江区', 2, '蓬江区', ',1942,1992,', 1992);\nINSERT INTO `area` VALUES (1994, '2015-10-19 00:37:06', '2015-10-19 00:37:06', 0, 2, '广东省江门市江海区', 2, '江海区', ',1942,1992,', 1992);\nINSERT INTO `area` VALUES (1995, '2015-10-19 00:37:07', '2015-10-19 00:37:07', 0, 3, '广东省江门市新会区', 2, '新会区', ',1942,1992,', 1992);\nINSERT INTO `area` VALUES (1996, '2015-10-19 00:37:08', '2015-10-19 00:37:08', 0, 4, '广东省江门市台山市', 2, '台山市', ',1942,1992,', 1992);\nINSERT INTO `area` VALUES (1997, '2015-10-19 00:37:09', '2015-10-19 00:37:09', 0, 5, '广东省江门市开平市', 2, '开平市', ',1942,1992,', 1992);\nINSERT INTO `area` VALUES (1998, '2015-10-19 00:37:10', '2015-10-19 00:37:10', 0, 6, '广东省江门市鹤山市', 2, '鹤山市', ',1942,1992,', 1992);\nINSERT INTO `area` VALUES (1999, '2015-10-19 00:37:11', '2015-10-19 00:37:11', 0, 7, '广东省江门市恩平市', 2, '恩平市', ',1942,1992,', 1992);\nINSERT INTO `area` VALUES (2000, '2015-10-19 00:37:12', '2015-10-19 00:37:12', 0, 8, '广东省湛江市', 1, '湛江市', ',1942,', 1942);\nINSERT INTO `area` VALUES (2001, '2015-10-19 00:37:13', '2015-10-19 00:37:13', 0, 1, '广东省湛江市赤坎区', 2, '赤坎区', ',1942,2000,', 2000);\nINSERT INTO `area` VALUES (2002, '2015-10-19 00:37:14', '2015-10-19 00:37:14', 0, 2, '广东省湛江市霞山区', 2, '霞山区', ',1942,2000,', 2000);\nINSERT INTO `area` VALUES (2003, '2015-10-19 00:37:15', '2015-10-19 00:37:15', 0, 3, '广东省湛江市坡头区', 2, '坡头区', ',1942,2000,', 2000);\nINSERT INTO `area` VALUES (2004, '2015-10-19 00:37:16', '2015-10-19 00:37:16', 0, 4, '广东省湛江市麻章区', 2, '麻章区', ',1942,2000,', 2000);\nINSERT INTO `area` VALUES (2005, '2015-10-19 00:37:17', '2015-10-19 00:37:17', 0, 5, '广东省湛江市遂溪县', 2, '遂溪县', ',1942,2000,', 2000);\nINSERT INTO `area` VALUES (2006, '2015-10-19 00:37:18', '2015-10-19 00:37:18', 0, 6, '广东省湛江市徐闻县', 2, '徐闻县', ',1942,2000,', 2000);\nINSERT INTO `area` VALUES (2007, '2015-10-19 00:37:19', '2015-10-19 00:37:19', 0, 7, '广东省湛江市廉江市', 2, '廉江市', ',1942,2000,', 2000);\nINSERT INTO `area` VALUES (2008, '2015-10-19 00:37:20', '2015-10-19 00:37:20', 0, 8, '广东省湛江市雷州市', 2, '雷州市', ',1942,2000,', 2000);\nINSERT INTO `area` VALUES (2009, '2015-10-19 00:37:21', '2015-10-19 00:37:21', 0, 9, '广东省湛江市吴川市', 2, '吴川市', ',1942,2000,', 2000);\nINSERT INTO `area` VALUES (2010, '2015-10-19 00:37:22', '2015-10-19 00:37:22', 0, 9, '广东省茂名市', 1, '茂名市', ',1942,', 1942);\nINSERT INTO `area` VALUES (2011, '2015-10-19 00:37:23', '2015-10-19 00:37:23', 0, 1, '广东省茂名市茂南区', 2, '茂南区', ',1942,2010,', 2010);\nINSERT INTO `area` VALUES (2012, '2015-10-19 00:37:24', '2015-10-19 00:37:24', 0, 2, '广东省茂名市茂港区', 2, '茂港区', ',1942,2010,', 2010);\nINSERT INTO `area` VALUES (2013, '2015-10-19 00:37:25', '2015-10-19 00:37:25', 0, 3, '广东省茂名市电白县', 2, '电白县', ',1942,2010,', 2010);\nINSERT INTO `area` VALUES (2014, '2015-10-19 00:37:26', '2015-10-19 00:37:26', 0, 4, '广东省茂名市高州市', 2, '高州市', ',1942,2010,', 2010);\nINSERT INTO `area` VALUES (2015, '2015-10-19 00:37:27', '2015-10-19 00:37:27', 0, 5, '广东省茂名市化州市', 2, '化州市', ',1942,2010,', 2010);\nINSERT INTO `area` VALUES (2016, '2015-10-19 00:37:28', '2015-10-19 00:37:28', 0, 6, '广东省茂名市信宜市', 2, '信宜市', ',1942,2010,', 2010);\nINSERT INTO `area` VALUES (2017, '2015-10-19 00:37:29', '2015-10-19 00:37:29', 0, 10, '广东省肇庆市', 1, '肇庆市', ',1942,', 1942);\nINSERT INTO `area` VALUES (2018, '2015-10-19 00:37:30', '2015-10-19 00:37:30', 0, 1, '广东省肇庆市端州区', 2, '端州区', ',1942,2017,', 2017);\nINSERT INTO `area` VALUES (2019, '2015-10-19 00:37:31', '2015-10-19 00:37:31', 0, 2, '广东省肇庆市鼎湖区', 2, '鼎湖区', ',1942,2017,', 2017);\nINSERT INTO `area` VALUES (2020, '2015-10-19 00:37:32', '2015-10-19 00:37:32', 0, 3, '广东省肇庆市广宁县', 2, '广宁县', ',1942,2017,', 2017);\nINSERT INTO `area` VALUES (2021, '2015-10-19 00:37:33', '2015-10-19 00:37:33', 0, 4, '广东省肇庆市怀集县', 2, '怀集县', ',1942,2017,', 2017);\nINSERT INTO `area` VALUES (2022, '2015-10-19 00:37:34', '2015-10-19 00:37:34', 0, 5, '广东省肇庆市封开县', 2, '封开县', ',1942,2017,', 2017);\nINSERT INTO `area` VALUES (2023, '2015-10-19 00:37:35', '2015-10-19 00:37:35', 0, 6, '广东省肇庆市德庆县', 2, '德庆县', ',1942,2017,', 2017);\nINSERT INTO `area` VALUES (2024, '2015-10-19 00:37:36', '2015-10-19 00:37:36', 0, 7, '广东省肇庆市高要市', 2, '高要市', ',1942,2017,', 2017);\nINSERT INTO `area` VALUES (2025, '2015-10-19 00:37:37', '2015-10-19 00:37:37', 0, 8, '广东省肇庆市四会市', 2, '四会市', ',1942,2017,', 2017);\nINSERT INTO `area` VALUES (2026, '2015-10-19 00:37:38', '2015-10-19 00:37:38', 0, 11, '广东省惠州市', 1, '惠州市', ',1942,', 1942);\nINSERT INTO `area` VALUES (2027, '2015-10-19 00:37:39', '2015-10-19 00:37:39', 0, 1, '广东省惠州市惠城区', 2, '惠城区', ',1942,2026,', 2026);\nINSERT INTO `area` VALUES (2028, '2015-10-19 00:37:40', '2015-10-19 00:37:40', 0, 2, '广东省惠州市惠阳区', 2, '惠阳区', ',1942,2026,', 2026);\nINSERT INTO `area` VALUES (2029, '2015-10-19 00:37:41', '2015-10-19 00:37:41', 0, 3, '广东省惠州市博罗县', 2, '博罗县', ',1942,2026,', 2026);\nINSERT INTO `area` VALUES (2030, '2015-10-19 00:37:42', '2015-10-19 00:37:42', 0, 4, '广东省惠州市惠东县', 2, '惠东县', ',1942,2026,', 2026);\nINSERT INTO `area` VALUES (2031, '2015-10-19 00:37:43', '2015-10-19 00:37:43', 0, 5, '广东省惠州市龙门县', 2, '龙门县', ',1942,2026,', 2026);\nINSERT INTO `area` VALUES (2032, '2015-10-19 00:37:44', '2015-10-19 00:37:44', 0, 12, '广东省梅州市', 1, '梅州市', ',1942,', 1942);\nINSERT INTO `area` VALUES (2033, '2015-10-19 00:37:45', '2015-10-19 00:37:45', 0, 1, '广东省梅州市梅江区', 2, '梅江区', ',1942,2032,', 2032);\nINSERT INTO `area` VALUES (2034, '2015-10-19 00:37:46', '2015-10-19 00:37:46', 0, 2, '广东省梅州市梅县', 2, '梅县', ',1942,2032,', 2032);\nINSERT INTO `area` VALUES (2035, '2015-10-19 00:37:47', '2015-10-19 00:37:47', 0, 3, '广东省梅州市大埔县', 2, '大埔县', ',1942,2032,', 2032);\nINSERT INTO `area` VALUES (2036, '2015-10-19 00:37:48', '2015-10-19 00:37:48', 0, 4, '广东省梅州市丰顺县', 2, '丰顺县', ',1942,2032,', 2032);\nINSERT INTO `area` VALUES (2037, '2015-10-19 00:37:49', '2015-10-19 00:37:49', 0, 5, '广东省梅州市五华县', 2, '五华县', ',1942,2032,', 2032);\nINSERT INTO `area` VALUES (2038, '2015-10-19 00:37:50', '2015-10-19 00:37:50', 0, 6, '广东省梅州市平远县', 2, '平远县', ',1942,2032,', 2032);\nINSERT INTO `area` VALUES (2039, '2015-10-19 00:37:51', '2015-10-19 00:37:51', 0, 7, '广东省梅州市蕉岭县', 2, '蕉岭县', ',1942,2032,', 2032);\nINSERT INTO `area` VALUES (2040, '2015-10-19 00:37:52', '2015-10-19 00:37:52', 0, 8, '广东省梅州市兴宁市', 2, '兴宁市', ',1942,2032,', 2032);\nINSERT INTO `area` VALUES (2041, '2015-10-19 00:37:53', '2015-10-19 00:37:53', 0, 13, '广东省汕尾市', 1, '汕尾市', ',1942,', 1942);\nINSERT INTO `area` VALUES (2042, '2015-10-19 00:37:54', '2015-10-19 00:37:54', 0, 1, '广东省汕尾市城区', 2, '城区', ',1942,2041,', 2041);\nINSERT INTO `area` VALUES (2043, '2015-10-19 00:37:55', '2015-10-19 00:37:55', 0, 2, '广东省汕尾市海丰县', 2, '海丰县', ',1942,2041,', 2041);\nINSERT INTO `area` VALUES (2044, '2015-10-19 00:37:56', '2015-10-19 00:37:56', 0, 3, '广东省汕尾市陆河县', 2, '陆河县', ',1942,2041,', 2041);\nINSERT INTO `area` VALUES (2045, '2015-10-19 00:37:57', '2015-10-19 00:37:57', 0, 4, '广东省汕尾市陆丰市', 2, '陆丰市', ',1942,2041,', 2041);\nINSERT INTO `area` VALUES (2046, '2015-10-19 00:37:58', '2015-10-19 00:37:58', 0, 14, '广东省河源市', 1, '河源市', ',1942,', 1942);\nINSERT INTO `area` VALUES (2047, '2015-10-19 00:37:59', '2015-10-19 00:37:59', 0, 1, '广东省河源市源城区', 2, '源城区', ',1942,2046,', 2046);\nINSERT INTO `area` VALUES (2048, '2015-10-19 00:38:00', '2015-10-19 00:38:00', 0, 2, '广东省河源市紫金县', 2, '紫金县', ',1942,2046,', 2046);\nINSERT INTO `area` VALUES (2049, '2015-10-19 00:38:01', '2015-10-19 00:38:01', 0, 3, '广东省河源市龙川县', 2, '龙川县', ',1942,2046,', 2046);\nINSERT INTO `area` VALUES (2050, '2015-10-19 00:38:02', '2015-10-19 00:38:02', 0, 4, '广东省河源市连平县', 2, '连平县', ',1942,2046,', 2046);\nINSERT INTO `area` VALUES (2051, '2015-10-19 00:38:03', '2015-10-19 00:38:03', 0, 5, '广东省河源市和平县', 2, '和平县', ',1942,2046,', 2046);\nINSERT INTO `area` VALUES (2052, '2015-10-19 00:38:04', '2015-10-19 00:38:04', 0, 6, '广东省河源市东源县', 2, '东源县', ',1942,2046,', 2046);\nINSERT INTO `area` VALUES (2053, '2015-10-19 00:38:05', '2015-10-19 00:38:05', 0, 15, '广东省阳江市', 1, '阳江市', ',1942,', 1942);\nINSERT INTO `area` VALUES (2054, '2015-10-19 00:38:06', '2015-10-19 00:38:06', 0, 1, '广东省阳江市江城区', 2, '江城区', ',1942,2053,', 2053);\nINSERT INTO `area` VALUES (2055, '2015-10-19 00:38:07', '2015-10-19 00:38:07', 0, 2, '广东省阳江市阳西县', 2, '阳西县', ',1942,2053,', 2053);\nINSERT INTO `area` VALUES (2056, '2015-10-19 00:38:08', '2015-10-19 00:38:08', 0, 3, '广东省阳江市阳东县', 2, '阳东县', ',1942,2053,', 2053);\nINSERT INTO `area` VALUES (2057, '2015-10-19 00:38:09', '2015-10-19 00:38:09', 0, 4, '广东省阳江市阳春市', 2, '阳春市', ',1942,2053,', 2053);\nINSERT INTO `area` VALUES (2058, '2015-10-19 00:38:10', '2015-10-19 00:38:10', 0, 16, '广东省清远市', 1, '清远市', ',1942,', 1942);\nINSERT INTO `area` VALUES (2059, '2015-10-19 00:38:11', '2015-10-19 00:38:11', 0, 1, '广东省清远市清城区', 2, '清城区', ',1942,2058,', 2058);\nINSERT INTO `area` VALUES (2060, '2015-10-19 00:38:12', '2015-10-19 00:38:12', 0, 2, '广东省清远市清新区', 2, '清新区', ',1942,2058,', 2058);\nINSERT INTO `area` VALUES (2061, '2015-10-19 00:38:13', '2015-10-19 00:38:13', 0, 3, '广东省清远市佛冈县', 2, '佛冈县', ',1942,2058,', 2058);\nINSERT INTO `area` VALUES (2062, '2015-10-19 00:38:14', '2015-10-19 00:38:14', 0, 4, '广东省清远市阳山县', 2, '阳山县', ',1942,2058,', 2058);\nINSERT INTO `area` VALUES (2063, '2015-10-19 00:38:15', '2015-10-19 00:38:15', 0, 5, '广东省清远市连山壮族瑶族自治县', 2, '连山壮族瑶族自治县', ',1942,2058,', 2058);\nINSERT INTO `area` VALUES (2064, '2015-10-19 00:38:16', '2015-10-19 00:38:16', 0, 6, '广东省清远市连南瑶族自治县', 2, '连南瑶族自治县', ',1942,2058,', 2058);\nINSERT INTO `area` VALUES (2065, '2015-10-19 00:38:17', '2015-10-19 00:38:17', 0, 7, '广东省清远市英德市', 2, '英德市', ',1942,2058,', 2058);\nINSERT INTO `area` VALUES (2066, '2015-10-19 00:38:18', '2015-10-19 00:38:18', 0, 8, '广东省清远市连州市', 2, '连州市', ',1942,2058,', 2058);\nINSERT INTO `area` VALUES (2067, '2015-10-19 00:38:19', '2015-10-19 00:38:19', 0, 17, '广东省东莞市', 1, '东莞市', ',1942,', 1942);\nINSERT INTO `area` VALUES (2068, '2015-10-19 00:38:20', '2015-10-19 00:38:20', 0, 18, '广东省中山市', 1, '中山市', ',1942,', 1942);\nINSERT INTO `area` VALUES (2069, '2015-10-19 00:38:21', '2015-10-19 00:38:21', 0, 19, '广东省潮州市', 1, '潮州市', ',1942,', 1942);\nINSERT INTO `area` VALUES (2070, '2015-10-19 00:38:22', '2015-10-19 00:38:22', 0, 1, '广东省潮州市湘桥区', 2, '湘桥区', ',1942,2069,', 2069);\nINSERT INTO `area` VALUES (2071, '2015-10-19 00:38:23', '2015-10-19 00:38:23', 0, 2, '广东省潮州市潮安区', 2, '潮安区', ',1942,2069,', 2069);\nINSERT INTO `area` VALUES (2072, '2015-10-19 00:38:24', '2015-10-19 00:38:24', 0, 3, '广东省潮州市饶平县', 2, '饶平县', ',1942,2069,', 2069);\nINSERT INTO `area` VALUES (2073, '2015-10-19 00:38:25', '2015-10-19 00:38:25', 0, 20, '广东省揭阳市', 1, '揭阳市', ',1942,', 1942);\nINSERT INTO `area` VALUES (2074, '2015-10-19 00:38:26', '2015-10-19 00:38:26', 0, 1, '广东省揭阳市榕城区', 2, '榕城区', ',1942,2073,', 2073);\nINSERT INTO `area` VALUES (2075, '2015-10-19 00:38:27', '2015-10-19 00:38:27', 0, 2, '广东省揭阳市揭东区', 2, '揭东区', ',1942,2073,', 2073);\nINSERT INTO `area` VALUES (2076, '2015-10-19 00:38:28', '2015-10-19 00:38:28', 0, 3, '广东省揭阳市揭西县', 2, '揭西县', ',1942,2073,', 2073);\nINSERT INTO `area` VALUES (2077, '2015-10-19 00:38:29', '2015-10-19 00:38:29', 0, 4, '广东省揭阳市惠来县', 2, '惠来县', ',1942,2073,', 2073);\nINSERT INTO `area` VALUES (2078, '2015-10-19 00:38:30', '2015-10-19 00:38:30', 0, 5, '广东省揭阳市普宁市', 2, '普宁市', ',1942,2073,', 2073);\nINSERT INTO `area` VALUES (2079, '2015-10-19 00:38:31', '2015-10-19 00:38:31', 0, 21, '广东省云浮市', 1, '云浮市', ',1942,', 1942);\nINSERT INTO `area` VALUES (2080, '2015-10-19 00:38:32', '2015-10-19 00:38:32', 0, 1, '广东省云浮市云城区', 2, '云城区', ',1942,2079,', 2079);\nINSERT INTO `area` VALUES (2081, '2015-10-19 00:38:33', '2015-10-19 00:38:33', 0, 2, '广东省云浮市新兴县', 2, '新兴县', ',1942,2079,', 2079);\nINSERT INTO `area` VALUES (2082, '2015-10-19 00:38:34', '2015-10-19 00:38:34', 0, 3, '广东省云浮市郁南县', 2, '郁南县', ',1942,2079,', 2079);\nINSERT INTO `area` VALUES (2083, '2015-10-19 00:38:35', '2015-10-19 00:38:35', 0, 4, '广东省云浮市云安县', 2, '云安县', ',1942,2079,', 2079);\nINSERT INTO `area` VALUES (2084, '2015-10-19 00:38:36', '2015-10-19 00:38:36', 0, 5, '广东省云浮市罗定市', 2, '罗定市', ',1942,2079,', 2079);\nINSERT INTO `area` VALUES (2085, '2015-10-19 00:38:37', '2015-10-19 00:38:37', 0, 20, '广西壮族自治区', 0, '广西壮族自治区', ',', NULL);\nINSERT INTO `area` VALUES (2086, '2015-10-19 00:38:38', '2015-10-19 00:38:38', 0, 1, '广西壮族自治区南宁市', 1, '南宁市', ',2085,', 2085);\nINSERT INTO `area` VALUES (2087, '2015-10-19 00:38:39', '2015-10-19 00:38:39', 0, 1, '广西壮族自治区南宁市兴宁区', 2, '兴宁区', ',2085,2086,', 2086);\nINSERT INTO `area` VALUES (2088, '2015-10-19 00:38:40', '2015-10-19 00:38:40', 0, 2, '广西壮族自治区南宁市青秀区', 2, '青秀区', ',2085,2086,', 2086);\nINSERT INTO `area` VALUES (2089, '2015-10-19 00:38:41', '2015-10-19 00:38:41', 0, 3, '广西壮族自治区南宁市江南区', 2, '江南区', ',2085,2086,', 2086);\nINSERT INTO `area` VALUES (2090, '2015-10-19 00:38:42', '2015-10-19 00:38:42', 0, 4, '广西壮族自治区南宁市西乡塘区', 2, '西乡塘区', ',2085,2086,', 2086);\nINSERT INTO `area` VALUES (2091, '2015-10-19 00:38:43', '2015-10-19 00:38:43', 0, 5, '广西壮族自治区南宁市良庆区', 2, '良庆区', ',2085,2086,', 2086);\nINSERT INTO `area` VALUES (2092, '2015-10-19 00:38:44', '2015-10-19 00:38:44', 0, 6, '广西壮族自治区南宁市邕宁区', 2, '邕宁区', ',2085,2086,', 2086);\nINSERT INTO `area` VALUES (2093, '2015-10-19 00:38:45', '2015-10-19 00:38:45', 0, 7, '广西壮族自治区南宁市武鸣县', 2, '武鸣县', ',2085,2086,', 2086);\nINSERT INTO `area` VALUES (2094, '2015-10-19 00:38:46', '2015-10-19 00:38:46', 0, 8, '广西壮族自治区南宁市隆安县', 2, '隆安县', ',2085,2086,', 2086);\nINSERT INTO `area` VALUES (2095, '2015-10-19 00:38:47', '2015-10-19 00:38:47', 0, 9, '广西壮族自治区南宁市马山县', 2, '马山县', ',2085,2086,', 2086);\nINSERT INTO `area` VALUES (2096, '2015-10-19 00:38:48', '2015-10-19 00:38:48', 0, 10, '广西壮族自治区南宁市上林县', 2, '上林县', ',2085,2086,', 2086);\nINSERT INTO `area` VALUES (2097, '2015-10-19 00:38:49', '2015-10-19 00:38:49', 0, 11, '广西壮族自治区南宁市宾阳县', 2, '宾阳县', ',2085,2086,', 2086);\nINSERT INTO `area` VALUES (2098, '2015-10-19 00:38:50', '2015-10-19 00:38:50', 0, 12, '广西壮族自治区南宁市横县', 2, '横县', ',2085,2086,', 2086);\nINSERT INTO `area` VALUES (2099, '2015-10-19 00:38:51', '2015-10-19 00:38:51', 0, 2, '广西壮族自治区柳州市', 1, '柳州市', ',2085,', 2085);\nINSERT INTO `area` VALUES (2100, '2015-10-19 00:38:52', '2015-10-19 00:38:52', 0, 1, '广西壮族自治区柳州市城中区', 2, '城中区', ',2085,2099,', 2099);\nINSERT INTO `area` VALUES (2101, '2015-10-19 00:38:53', '2015-10-19 00:38:53', 0, 2, '广西壮族自治区柳州市鱼峰区', 2, '鱼峰区', ',2085,2099,', 2099);\nINSERT INTO `area` VALUES (2102, '2015-10-19 00:38:54', '2015-10-19 00:38:54', 0, 3, '广西壮族自治区柳州市柳南区', 2, '柳南区', ',2085,2099,', 2099);\nINSERT INTO `area` VALUES (2103, '2015-10-19 00:38:55', '2015-10-19 00:38:55', 0, 4, '广西壮族自治区柳州市柳北区', 2, '柳北区', ',2085,2099,', 2099);\nINSERT INTO `area` VALUES (2104, '2015-10-19 00:38:56', '2015-10-19 00:38:56', 0, 5, '广西壮族自治区柳州市柳江县', 2, '柳江县', ',2085,2099,', 2099);\nINSERT INTO `area` VALUES (2105, '2015-10-19 00:38:57', '2015-10-19 00:38:57', 0, 6, '广西壮族自治区柳州市柳城县', 2, '柳城县', ',2085,2099,', 2099);\nINSERT INTO `area` VALUES (2106, '2015-10-19 00:38:58', '2015-10-19 00:38:58', 0, 7, '广西壮族自治区柳州市鹿寨县', 2, '鹿寨县', ',2085,2099,', 2099);\nINSERT INTO `area` VALUES (2107, '2015-10-19 00:38:59', '2015-10-19 00:38:59', 0, 8, '广西壮族自治区柳州市融安县', 2, '融安县', ',2085,2099,', 2099);\nINSERT INTO `area` VALUES (2108, '2015-10-19 00:39:00', '2015-10-19 00:39:00', 0, 9, '广西壮族自治区柳州市融水苗族自治县', 2, '融水苗族自治县', ',2085,2099,', 2099);\nINSERT INTO `area` VALUES (2109, '2015-10-19 00:39:01', '2015-10-19 00:39:01', 0, 10, '广西壮族自治区柳州市三江侗族自治县', 2, '三江侗族自治县', ',2085,2099,', 2099);\nINSERT INTO `area` VALUES (2110, '2015-10-19 00:39:02', '2015-10-19 00:39:02', 0, 3, '广西壮族自治区桂林市', 1, '桂林市', ',2085,', 2085);\nINSERT INTO `area` VALUES (2111, '2015-10-19 00:39:03', '2015-10-19 00:39:03', 0, 1, '广西壮族自治区桂林市秀峰区', 2, '秀峰区', ',2085,2110,', 2110);\nINSERT INTO `area` VALUES (2112, '2015-10-19 00:39:04', '2015-10-19 00:39:04', 0, 2, '广西壮族自治区桂林市叠彩区', 2, '叠彩区', ',2085,2110,', 2110);\nINSERT INTO `area` VALUES (2113, '2015-10-19 00:39:05', '2015-10-19 00:39:05', 0, 3, '广西壮族自治区桂林市象山区', 2, '象山区', ',2085,2110,', 2110);\nINSERT INTO `area` VALUES (2114, '2015-10-19 00:39:06', '2015-10-19 00:39:06', 0, 4, '广西壮族自治区桂林市七星区', 2, '七星区', ',2085,2110,', 2110);\nINSERT INTO `area` VALUES (2115, '2015-10-19 00:39:07', '2015-10-19 00:39:07', 0, 5, '广西壮族自治区桂林市雁山区', 2, '雁山区', ',2085,2110,', 2110);\nINSERT INTO `area` VALUES (2116, '2015-10-19 00:39:08', '2015-10-19 00:39:08', 0, 6, '广西壮族自治区桂林市临桂区', 2, '临桂区', ',2085,2110,', 2110);\nINSERT INTO `area` VALUES (2117, '2015-10-19 00:39:09', '2015-10-19 00:39:09', 0, 7, '广西壮族自治区桂林市阳朔县', 2, '阳朔县', ',2085,2110,', 2110);\nINSERT INTO `area` VALUES (2118, '2015-10-19 00:39:10', '2015-10-19 00:39:10', 0, 8, '广西壮族自治区桂林市灵川县', 2, '灵川县', ',2085,2110,', 2110);\nINSERT INTO `area` VALUES (2119, '2015-10-19 00:39:11', '2015-10-19 00:39:11', 0, 9, '广西壮族自治区桂林市全州县', 2, '全州县', ',2085,2110,', 2110);\nINSERT INTO `area` VALUES (2120, '2015-10-19 00:39:12', '2015-10-19 00:39:12', 0, 10, '广西壮族自治区桂林市兴安县', 2, '兴安县', ',2085,2110,', 2110);\nINSERT INTO `area` VALUES (2121, '2015-10-19 00:39:13', '2015-10-19 00:39:13', 0, 11, '广西壮族自治区桂林市永福县', 2, '永福县', ',2085,2110,', 2110);\nINSERT INTO `area` VALUES (2122, '2015-10-19 00:39:14', '2015-10-19 00:39:14', 0, 12, '广西壮族自治区桂林市灌阳县', 2, '灌阳县', ',2085,2110,', 2110);\nINSERT INTO `area` VALUES (2123, '2015-10-19 00:39:15', '2015-10-19 00:39:15', 0, 13, '广西壮族自治区桂林市龙胜各族自治县', 2, '龙胜各族自治县', ',2085,2110,', 2110);\nINSERT INTO `area` VALUES (2124, '2015-10-19 00:39:16', '2015-10-19 00:39:16', 0, 14, '广西壮族自治区桂林市资源县', 2, '资源县', ',2085,2110,', 2110);\nINSERT INTO `area` VALUES (2125, '2015-10-19 00:39:17', '2015-10-19 00:39:17', 0, 15, '广西壮族自治区桂林市平乐县', 2, '平乐县', ',2085,2110,', 2110);\nINSERT INTO `area` VALUES (2126, '2015-10-19 00:39:18', '2015-10-19 00:39:18', 0, 16, '广西壮族自治区桂林市荔浦县', 2, '荔浦县', ',2085,2110,', 2110);\nINSERT INTO `area` VALUES (2127, '2015-10-19 00:39:19', '2015-10-19 00:39:19', 0, 17, '广西壮族自治区桂林市恭城瑶族自治县', 2, '恭城瑶族自治县', ',2085,2110,', 2110);\nINSERT INTO `area` VALUES (2128, '2015-10-19 00:39:20', '2015-10-19 00:39:20', 0, 4, '广西壮族自治区梧州市', 1, '梧州市', ',2085,', 2085);\nINSERT INTO `area` VALUES (2129, '2015-10-19 00:39:21', '2015-10-19 00:39:21', 0, 1, '广西壮族自治区梧州市万秀区', 2, '万秀区', ',2085,2128,', 2128);\nINSERT INTO `area` VALUES (2130, '2015-10-19 00:39:22', '2015-10-19 00:39:22', 0, 2, '广西壮族自治区梧州市长洲区', 2, '长洲区', ',2085,2128,', 2128);\nINSERT INTO `area` VALUES (2131, '2015-10-19 00:39:23', '2015-10-19 00:39:23', 0, 3, '广西壮族自治区梧州市龙圩区', 2, '龙圩区', ',2085,2128,', 2128);\nINSERT INTO `area` VALUES (2132, '2015-10-19 00:39:24', '2015-10-19 00:39:24', 0, 4, '广西壮族自治区梧州市苍梧县', 2, '苍梧县', ',2085,2128,', 2128);\nINSERT INTO `area` VALUES (2133, '2015-10-19 00:39:25', '2015-10-19 00:39:25', 0, 5, '广西壮族自治区梧州市藤县', 2, '藤县', ',2085,2128,', 2128);\nINSERT INTO `area` VALUES (2134, '2015-10-19 00:39:26', '2015-10-19 00:39:26', 0, 6, '广西壮族自治区梧州市蒙山县', 2, '蒙山县', ',2085,2128,', 2128);\nINSERT INTO `area` VALUES (2135, '2015-10-19 00:39:27', '2015-10-19 00:39:27', 0, 7, '广西壮族自治区梧州市岑溪市', 2, '岑溪市', ',2085,2128,', 2128);\nINSERT INTO `area` VALUES (2136, '2015-10-19 00:39:28', '2015-10-19 00:39:28', 0, 5, '广西壮族自治区北海市', 1, '北海市', ',2085,', 2085);\nINSERT INTO `area` VALUES (2137, '2015-10-19 00:39:29', '2015-10-19 00:39:29', 0, 1, '广西壮族自治区北海市海城区', 2, '海城区', ',2085,2136,', 2136);\nINSERT INTO `area` VALUES (2138, '2015-10-19 00:39:30', '2015-10-19 00:39:30', 0, 2, '广西壮族自治区北海市银海区', 2, '银海区', ',2085,2136,', 2136);\nINSERT INTO `area` VALUES (2139, '2015-10-19 00:39:31', '2015-10-19 00:39:31', 0, 3, '广西壮族自治区北海市铁山港区', 2, '铁山港区', ',2085,2136,', 2136);\nINSERT INTO `area` VALUES (2140, '2015-10-19 00:39:32', '2015-10-19 00:39:32', 0, 4, '广西壮族自治区北海市合浦县', 2, '合浦县', ',2085,2136,', 2136);\nINSERT INTO `area` VALUES (2141, '2015-10-19 00:39:33', '2015-10-19 00:39:33', 0, 6, '广西壮族自治区防城港市', 1, '防城港市', ',2085,', 2085);\nINSERT INTO `area` VALUES (2142, '2015-10-19 00:39:34', '2015-10-19 00:39:34', 0, 1, '广西壮族自治区防城港市港口区', 2, '港口区', ',2085,2141,', 2141);\nINSERT INTO `area` VALUES (2143, '2015-10-19 00:39:35', '2015-10-19 00:39:35', 0, 2, '广西壮族自治区防城港市防城区', 2, '防城区', ',2085,2141,', 2141);\nINSERT INTO `area` VALUES (2144, '2015-10-19 00:39:36', '2015-10-19 00:39:36', 0, 3, '广西壮族自治区防城港市上思县', 2, '上思县', ',2085,2141,', 2141);\nINSERT INTO `area` VALUES (2145, '2015-10-19 00:39:37', '2015-10-19 00:39:37', 0, 4, '广西壮族自治区防城港市东兴市', 2, '东兴市', ',2085,2141,', 2141);\nINSERT INTO `area` VALUES (2146, '2015-10-19 00:39:38', '2015-10-19 00:39:38', 0, 7, '广西壮族自治区钦州市', 1, '钦州市', ',2085,', 2085);\nINSERT INTO `area` VALUES (2147, '2015-10-19 00:39:39', '2015-10-19 00:39:39', 0, 1, '广西壮族自治区钦州市钦南区', 2, '钦南区', ',2085,2146,', 2146);\nINSERT INTO `area` VALUES (2148, '2015-10-19 00:39:40', '2015-10-19 00:39:40', 0, 2, '广西壮族自治区钦州市钦北区', 2, '钦北区', ',2085,2146,', 2146);\nINSERT INTO `area` VALUES (2149, '2015-10-19 00:39:41', '2015-10-19 00:39:41', 0, 3, '广西壮族自治区钦州市灵山县', 2, '灵山县', ',2085,2146,', 2146);\nINSERT INTO `area` VALUES (2150, '2015-10-19 00:39:42', '2015-10-19 00:39:42', 0, 4, '广西壮族自治区钦州市浦北县', 2, '浦北县', ',2085,2146,', 2146);\nINSERT INTO `area` VALUES (2151, '2015-10-19 00:39:43', '2015-10-19 00:39:43', 0, 8, '广西壮族自治区贵港市', 1, '贵港市', ',2085,', 2085);\nINSERT INTO `area` VALUES (2152, '2015-10-19 00:39:44', '2015-10-19 00:39:44', 0, 1, '广西壮族自治区贵港市港北区', 2, '港北区', ',2085,2151,', 2151);\nINSERT INTO `area` VALUES (2153, '2015-10-19 00:39:45', '2015-10-19 00:39:45', 0, 2, '广西壮族自治区贵港市港南区', 2, '港南区', ',2085,2151,', 2151);\nINSERT INTO `area` VALUES (2154, '2015-10-19 00:39:46', '2015-10-19 00:39:46', 0, 3, '广西壮族自治区贵港市覃塘区', 2, '覃塘区', ',2085,2151,', 2151);\nINSERT INTO `area` VALUES (2155, '2015-10-19 00:39:47', '2015-10-19 00:39:47', 0, 4, '广西壮族自治区贵港市平南县', 2, '平南县', ',2085,2151,', 2151);\nINSERT INTO `area` VALUES (2156, '2015-10-19 00:39:48', '2015-10-19 00:39:48', 0, 5, '广西壮族自治区贵港市桂平市', 2, '桂平市', ',2085,2151,', 2151);\nINSERT INTO `area` VALUES (2157, '2015-10-19 00:39:49', '2015-10-19 00:39:49', 0, 9, '广西壮族自治区玉林市', 1, '玉林市', ',2085,', 2085);\nINSERT INTO `area` VALUES (2158, '2015-10-19 00:39:50', '2015-10-19 00:39:50', 0, 1, '广西壮族自治区玉林市玉州区', 2, '玉州区', ',2085,2157,', 2157);\nINSERT INTO `area` VALUES (2159, '2015-10-19 00:39:51', '2015-10-19 00:39:51', 0, 2, '广西壮族自治区玉林市福绵区', 2, '福绵区', ',2085,2157,', 2157);\nINSERT INTO `area` VALUES (2160, '2015-10-19 00:39:52', '2015-10-19 00:39:52', 0, 3, '广西壮族自治区玉林市容县', 2, '容县', ',2085,2157,', 2157);\nINSERT INTO `area` VALUES (2161, '2015-10-19 00:39:53', '2015-10-19 00:39:53', 0, 4, '广西壮族自治区玉林市陆川县', 2, '陆川县', ',2085,2157,', 2157);\nINSERT INTO `area` VALUES (2162, '2015-10-19 00:39:54', '2015-10-19 00:39:54', 0, 5, '广西壮族自治区玉林市博白县', 2, '博白县', ',2085,2157,', 2157);\nINSERT INTO `area` VALUES (2163, '2015-10-19 00:39:55', '2015-10-19 00:39:55', 0, 6, '广西壮族自治区玉林市兴业县', 2, '兴业县', ',2085,2157,', 2157);\nINSERT INTO `area` VALUES (2164, '2015-10-19 00:39:56', '2015-10-19 00:39:56', 0, 7, '广西壮族自治区玉林市北流市', 2, '北流市', ',2085,2157,', 2157);\nINSERT INTO `area` VALUES (2165, '2015-10-19 00:39:57', '2015-10-19 00:39:57', 0, 10, '广西壮族自治区百色市', 1, '百色市', ',2085,', 2085);\nINSERT INTO `area` VALUES (2166, '2015-10-19 00:39:58', '2015-10-19 00:39:58', 0, 1, '广西壮族自治区百色市右江区', 2, '右江区', ',2085,2165,', 2165);\nINSERT INTO `area` VALUES (2167, '2015-10-19 00:39:59', '2015-10-19 00:39:59', 0, 2, '广西壮族自治区百色市田阳县', 2, '田阳县', ',2085,2165,', 2165);\nINSERT INTO `area` VALUES (2168, '2015-10-19 00:40:00', '2015-10-19 00:40:00', 0, 3, '广西壮族自治区百色市田东县', 2, '田东县', ',2085,2165,', 2165);\nINSERT INTO `area` VALUES (2169, '2015-10-19 00:40:01', '2015-10-19 00:40:01', 0, 4, '广西壮族自治区百色市平果县', 2, '平果县', ',2085,2165,', 2165);\nINSERT INTO `area` VALUES (2170, '2015-10-19 00:40:02', '2015-10-19 00:40:02', 0, 5, '广西壮族自治区百色市德保县', 2, '德保县', ',2085,2165,', 2165);\nINSERT INTO `area` VALUES (2171, '2015-10-19 00:40:03', '2015-10-19 00:40:03', 0, 6, '广西壮族自治区百色市靖西县', 2, '靖西县', ',2085,2165,', 2165);\nINSERT INTO `area` VALUES (2172, '2015-10-19 00:40:04', '2015-10-19 00:40:04', 0, 7, '广西壮族自治区百色市那坡县', 2, '那坡县', ',2085,2165,', 2165);\nINSERT INTO `area` VALUES (2173, '2015-10-19 00:40:05', '2015-10-19 00:40:05', 0, 8, '广西壮族自治区百色市凌云县', 2, '凌云县', ',2085,2165,', 2165);\nINSERT INTO `area` VALUES (2174, '2015-10-19 00:40:06', '2015-10-19 00:40:06', 0, 9, '广西壮族自治区百色市乐业县', 2, '乐业县', ',2085,2165,', 2165);\nINSERT INTO `area` VALUES (2175, '2015-10-19 00:40:07', '2015-10-19 00:40:07', 0, 10, '广西壮族自治区百色市田林县', 2, '田林县', ',2085,2165,', 2165);\nINSERT INTO `area` VALUES (2176, '2015-10-19 00:40:08', '2015-10-19 00:40:08', 0, 11, '广西壮族自治区百色市西林县', 2, '西林县', ',2085,2165,', 2165);\nINSERT INTO `area` VALUES (2177, '2015-10-19 00:40:09', '2015-10-19 00:40:09', 0, 12, '广西壮族自治区百色市隆林各族自治县', 2, '隆林各族自治县', ',2085,2165,', 2165);\nINSERT INTO `area` VALUES (2178, '2015-10-19 00:40:10', '2015-10-19 00:40:10', 0, 11, '广西壮族自治区贺州市', 1, '贺州市', ',2085,', 2085);\nINSERT INTO `area` VALUES (2179, '2015-10-19 00:40:11', '2015-10-19 00:40:11', 0, 1, '广西壮族自治区贺州市八步区', 2, '八步区', ',2085,2178,', 2178);\nINSERT INTO `area` VALUES (2180, '2015-10-19 00:40:12', '2015-10-19 00:40:12', 0, 2, '广西壮族自治区贺州市昭平县', 2, '昭平县', ',2085,2178,', 2178);\nINSERT INTO `area` VALUES (2181, '2015-10-19 00:40:13', '2015-10-19 00:40:13', 0, 3, '广西壮族自治区贺州市钟山县', 2, '钟山县', ',2085,2178,', 2178);\nINSERT INTO `area` VALUES (2182, '2015-10-19 00:40:14', '2015-10-19 00:40:14', 0, 4, '广西壮族自治区贺州市富川瑶族自治县', 2, '富川瑶族自治县', ',2085,2178,', 2178);\nINSERT INTO `area` VALUES (2183, '2015-10-19 00:40:15', '2015-10-19 00:40:15', 0, 12, '广西壮族自治区河池市', 1, '河池市', ',2085,', 2085);\nINSERT INTO `area` VALUES (2184, '2015-10-19 00:40:16', '2015-10-19 00:40:16', 0, 1, '广西壮族自治区河池市金城江区', 2, '金城江区', ',2085,2183,', 2183);\nINSERT INTO `area` VALUES (2185, '2015-10-19 00:40:17', '2015-10-19 00:40:17', 0, 2, '广西壮族自治区河池市南丹县', 2, '南丹县', ',2085,2183,', 2183);\nINSERT INTO `area` VALUES (2186, '2015-10-19 00:40:18', '2015-10-19 00:40:18', 0, 3, '广西壮族自治区河池市天峨县', 2, '天峨县', ',2085,2183,', 2183);\nINSERT INTO `area` VALUES (2187, '2015-10-19 00:40:19', '2015-10-19 00:40:19', 0, 4, '广西壮族自治区河池市凤山县', 2, '凤山县', ',2085,2183,', 2183);\nINSERT INTO `area` VALUES (2188, '2015-10-19 00:40:20', '2015-10-19 00:40:20', 0, 5, '广西壮族自治区河池市东兰县', 2, '东兰县', ',2085,2183,', 2183);\nINSERT INTO `area` VALUES (2189, '2015-10-19 00:40:21', '2015-10-19 00:40:21', 0, 6, '广西壮族自治区河池市罗城仫佬族自治县', 2, '罗城仫佬族自治县', ',2085,2183,', 2183);\nINSERT INTO `area` VALUES (2190, '2015-10-19 00:40:22', '2015-10-19 00:40:22', 0, 7, '广西壮族自治区河池市环江毛南族自治县', 2, '环江毛南族自治县', ',2085,2183,', 2183);\nINSERT INTO `area` VALUES (2191, '2015-10-19 00:40:23', '2015-10-19 00:40:23', 0, 8, '广西壮族自治区河池市巴马瑶族自治县', 2, '巴马瑶族自治县', ',2085,2183,', 2183);\nINSERT INTO `area` VALUES (2192, '2015-10-19 00:40:24', '2015-10-19 00:40:24', 0, 9, '广西壮族自治区河池市都安瑶族自治县', 2, '都安瑶族自治县', ',2085,2183,', 2183);\nINSERT INTO `area` VALUES (2193, '2015-10-19 00:40:25', '2015-10-19 00:40:25', 0, 10, '广西壮族自治区河池市大化瑶族自治县', 2, '大化瑶族自治县', ',2085,2183,', 2183);\nINSERT INTO `area` VALUES (2194, '2015-10-19 00:40:26', '2015-10-19 00:40:26', 0, 11, '广西壮族自治区河池市宜州市', 2, '宜州市', ',2085,2183,', 2183);\nINSERT INTO `area` VALUES (2195, '2015-10-19 00:40:27', '2015-10-19 00:40:27', 0, 13, '广西壮族自治区来宾市', 1, '来宾市', ',2085,', 2085);\nINSERT INTO `area` VALUES (2196, '2015-10-19 00:40:28', '2015-10-19 00:40:28', 0, 1, '广西壮族自治区来宾市兴宾区', 2, '兴宾区', ',2085,2195,', 2195);\nINSERT INTO `area` VALUES (2197, '2015-10-19 00:40:29', '2015-10-19 00:40:29', 0, 2, '广西壮族自治区来宾市忻城县', 2, '忻城县', ',2085,2195,', 2195);\nINSERT INTO `area` VALUES (2198, '2015-10-19 00:40:30', '2015-10-19 00:40:30', 0, 3, '广西壮族自治区来宾市象州县', 2, '象州县', ',2085,2195,', 2195);\nINSERT INTO `area` VALUES (2199, '2015-10-19 00:40:31', '2015-10-19 00:40:31', 0, 4, '广西壮族自治区来宾市武宣县', 2, '武宣县', ',2085,2195,', 2195);\nINSERT INTO `area` VALUES (2200, '2015-10-19 00:40:32', '2015-10-19 00:40:32', 0, 5, '广西壮族自治区来宾市金秀瑶族自治县', 2, '金秀瑶族自治县', ',2085,2195,', 2195);\nINSERT INTO `area` VALUES (2201, '2015-10-19 00:40:33', '2015-10-19 00:40:33', 0, 6, '广西壮族自治区来宾市合山市', 2, '合山市', ',2085,2195,', 2195);\nINSERT INTO `area` VALUES (2202, '2015-10-19 00:40:34', '2015-10-19 00:40:34', 0, 14, '广西壮族自治区崇左市', 1, '崇左市', ',2085,', 2085);\nINSERT INTO `area` VALUES (2203, '2015-10-19 00:40:35', '2015-10-19 00:40:35', 0, 1, '广西壮族自治区崇左市江州区', 2, '江州区', ',2085,2202,', 2202);\nINSERT INTO `area` VALUES (2204, '2015-10-19 00:40:36', '2015-10-19 00:40:36', 0, 2, '广西壮族自治区崇左市扶绥县', 2, '扶绥县', ',2085,2202,', 2202);\nINSERT INTO `area` VALUES (2205, '2015-10-19 00:40:37', '2015-10-19 00:40:37', 0, 3, '广西壮族自治区崇左市宁明县', 2, '宁明县', ',2085,2202,', 2202);\nINSERT INTO `area` VALUES (2206, '2015-10-19 00:40:38', '2015-10-19 00:40:38', 0, 4, '广西壮族自治区崇左市龙州县', 2, '龙州县', ',2085,2202,', 2202);\nINSERT INTO `area` VALUES (2207, '2015-10-19 00:40:39', '2015-10-19 00:40:39', 0, 5, '广西壮族自治区崇左市大新县', 2, '大新县', ',2085,2202,', 2202);\nINSERT INTO `area` VALUES (2208, '2015-10-19 00:40:40', '2015-10-19 00:40:40', 0, 6, '广西壮族自治区崇左市天等县', 2, '天等县', ',2085,2202,', 2202);\nINSERT INTO `area` VALUES (2209, '2015-10-19 00:40:41', '2015-10-19 00:40:41', 0, 7, '广西壮族自治区崇左市凭祥市', 2, '凭祥市', ',2085,2202,', 2202);\nINSERT INTO `area` VALUES (2210, '2015-10-19 00:40:42', '2015-10-19 00:40:42', 0, 21, '海南省', 0, '海南省', ',', NULL);\nINSERT INTO `area` VALUES (2211, '2015-10-19 00:40:43', '2015-10-19 00:40:43', 0, 1, '海南省海口市', 1, '海口市', ',2210,', 2210);\nINSERT INTO `area` VALUES (2212, '2015-10-19 00:40:44', '2015-10-19 00:40:44', 0, 1, '海南省海口市秀英区', 2, '秀英区', ',2210,2211,', 2211);\nINSERT INTO `area` VALUES (2213, '2015-10-19 00:40:45', '2015-10-19 00:40:45', 0, 2, '海南省海口市龙华区', 2, '龙华区', ',2210,2211,', 2211);\nINSERT INTO `area` VALUES (2214, '2015-10-19 00:40:46', '2015-10-19 00:40:46', 0, 3, '海南省海口市琼山区', 2, '琼山区', ',2210,2211,', 2211);\nINSERT INTO `area` VALUES (2215, '2015-10-19 00:40:47', '2015-10-19 00:40:47', 0, 4, '海南省海口市美兰区', 2, '美兰区', ',2210,2211,', 2211);\nINSERT INTO `area` VALUES (2216, '2015-10-19 00:40:48', '2015-10-19 00:40:48', 0, 2, '海南省三亚市', 1, '三亚市', ',2210,', 2210);\nINSERT INTO `area` VALUES (2217, '2015-10-19 00:40:49', '2015-10-19 00:40:49', 0, 3, '海南省三沙市', 1, '三沙市', ',2210,', 2210);\nINSERT INTO `area` VALUES (2218, '2015-10-19 00:40:50', '2015-10-19 00:40:50', 0, 1, '海南省三沙市西沙群岛', 2, '西沙群岛', ',2210,2217,', 2217);\nINSERT INTO `area` VALUES (2219, '2015-10-19 00:40:51', '2015-10-19 00:40:51', 0, 2, '海南省三沙市南沙群岛', 2, '南沙群岛', ',2210,2217,', 2217);\nINSERT INTO `area` VALUES (2220, '2015-10-19 00:40:52', '2015-10-19 00:40:52', 0, 3, '海南省三沙市中沙群岛的岛礁及其海域', 2, '中沙群岛的岛礁及其海域', ',2210,2217,', 2217);\nINSERT INTO `area` VALUES (2221, '2015-10-19 00:40:53', '2015-10-19 00:40:53', 0, 4, '海南省五指山市', 1, '五指山市', ',2210,', 2210);\nINSERT INTO `area` VALUES (2222, '2015-10-19 00:40:54', '2015-10-19 00:40:54', 0, 5, '海南省琼海市', 1, '琼海市', ',2210,', 2210);\nINSERT INTO `area` VALUES (2223, '2015-10-19 00:40:55', '2015-10-19 00:40:55', 0, 6, '海南省儋州市', 1, '儋州市', ',2210,', 2210);\nINSERT INTO `area` VALUES (2224, '2015-10-19 00:40:56', '2015-10-19 00:40:56', 0, 7, '海南省文昌市', 1, '文昌市', ',2210,', 2210);\nINSERT INTO `area` VALUES (2225, '2015-10-19 00:40:57', '2015-10-19 00:40:57', 0, 8, '海南省万宁市', 1, '万宁市', ',2210,', 2210);\nINSERT INTO `area` VALUES (2226, '2015-10-19 00:40:58', '2015-10-19 00:40:58', 0, 9, '海南省东方市', 1, '东方市', ',2210,', 2210);\nINSERT INTO `area` VALUES (2227, '2015-10-19 00:40:59', '2015-10-19 00:40:59', 0, 10, '海南省定安县', 1, '定安县', ',2210,', 2210);\nINSERT INTO `area` VALUES (2228, '2015-10-19 00:41:00', '2015-10-19 00:41:00', 0, 11, '海南省屯昌县', 1, '屯昌县', ',2210,', 2210);\nINSERT INTO `area` VALUES (2229, '2015-10-19 00:41:01', '2015-10-19 00:41:01', 0, 12, '海南省澄迈县', 1, '澄迈县', ',2210,', 2210);\nINSERT INTO `area` VALUES (2230, '2015-10-19 00:41:02', '2015-10-19 00:41:02', 0, 13, '海南省临高县', 1, '临高县', ',2210,', 2210);\nINSERT INTO `area` VALUES (2231, '2015-10-19 00:41:03', '2015-10-19 00:41:03', 0, 14, '海南省白沙黎族自治县', 1, '白沙黎族自治县', ',2210,', 2210);\nINSERT INTO `area` VALUES (2232, '2015-10-19 00:41:04', '2015-10-19 00:41:04', 0, 15, '海南省昌江黎族自治县', 1, '昌江黎族自治县', ',2210,', 2210);\nINSERT INTO `area` VALUES (2233, '2015-10-19 00:41:05', '2015-10-19 00:41:05', 0, 16, '海南省乐东黎族自治县', 1, '乐东黎族自治县', ',2210,', 2210);\nINSERT INTO `area` VALUES (2234, '2015-10-19 00:41:06', '2015-10-19 00:41:06', 0, 17, '海南省陵水黎族自治县', 1, '陵水黎族自治县', ',2210,', 2210);\nINSERT INTO `area` VALUES (2235, '2015-10-19 00:41:07', '2015-10-19 00:41:07', 0, 18, '海南省保亭黎族苗族自治县', 1, '保亭黎族苗族自治县', ',2210,', 2210);\nINSERT INTO `area` VALUES (2236, '2015-10-19 00:41:08', '2015-10-19 00:41:08', 0, 19, '海南省琼中黎族苗族自治县', 1, '琼中黎族苗族自治县', ',2210,', 2210);\nINSERT INTO `area` VALUES (2237, '2015-10-19 00:41:09', '2015-10-19 00:41:09', 0, 22, '重庆市', 0, '重庆市', ',', NULL);\nINSERT INTO `area` VALUES (2238, '2015-10-19 00:41:10', '2015-10-19 00:41:10', 0, 1, '重庆市万州区', 1, '万州区', ',2237,', 2237);\nINSERT INTO `area` VALUES (2239, '2015-10-19 00:41:11', '2015-10-19 00:41:11', 0, 2, '重庆市涪陵区', 1, '涪陵区', ',2237,', 2237);\nINSERT INTO `area` VALUES (2240, '2015-10-19 00:41:12', '2015-10-19 00:41:12', 0, 3, '重庆市渝中区', 1, '渝中区', ',2237,', 2237);\nINSERT INTO `area` VALUES (2241, '2015-10-19 00:41:13', '2015-10-19 00:41:13', 0, 4, '重庆市大渡口区', 1, '大渡口区', ',2237,', 2237);\nINSERT INTO `area` VALUES (2242, '2015-10-19 00:41:14', '2015-10-19 00:41:14', 0, 5, '重庆市江北区', 1, '江北区', ',2237,', 2237);\nINSERT INTO `area` VALUES (2243, '2015-10-19 00:41:15', '2015-10-19 00:41:15', 0, 6, '重庆市沙坪坝区', 1, '沙坪坝区', ',2237,', 2237);\nINSERT INTO `area` VALUES (2244, '2015-10-19 00:41:16', '2015-10-19 00:41:16', 0, 7, '重庆市九龙坡区', 1, '九龙坡区', ',2237,', 2237);\nINSERT INTO `area` VALUES (2245, '2015-10-19 00:41:17', '2015-10-19 00:41:17', 0, 8, '重庆市南岸区', 1, '南岸区', ',2237,', 2237);\nINSERT INTO `area` VALUES (2246, '2015-10-19 00:41:18', '2015-10-19 00:41:18', 0, 9, '重庆市北碚区', 1, '北碚区', ',2237,', 2237);\nINSERT INTO `area` VALUES (2247, '2015-10-19 00:41:19', '2015-10-19 00:41:19', 0, 10, '重庆市綦江区', 1, '綦江区', ',2237,', 2237);\nINSERT INTO `area` VALUES (2248, '2015-10-19 00:41:20', '2015-10-19 00:41:20', 0, 11, '重庆市大足区', 1, '大足区', ',2237,', 2237);\nINSERT INTO `area` VALUES (2249, '2015-10-19 00:41:21', '2015-10-19 00:41:21', 0, 12, '重庆市渝北区', 1, '渝北区', ',2237,', 2237);\nINSERT INTO `area` VALUES (2250, '2015-10-19 00:41:22', '2015-10-19 00:41:22', 0, 13, '重庆市巴南区', 1, '巴南区', ',2237,', 2237);\nINSERT INTO `area` VALUES (2251, '2015-10-19 00:41:23', '2015-10-19 00:41:23', 0, 14, '重庆市黔江区', 1, '黔江区', ',2237,', 2237);\nINSERT INTO `area` VALUES (2252, '2015-10-19 00:41:24', '2015-10-19 00:41:24', 0, 15, '重庆市长寿区', 1, '长寿区', ',2237,', 2237);\nINSERT INTO `area` VALUES (2253, '2015-10-19 00:41:25', '2015-10-19 00:41:25', 0, 16, '重庆市江津区', 1, '江津区', ',2237,', 2237);\nINSERT INTO `area` VALUES (2254, '2015-10-19 00:41:26', '2015-10-19 00:41:26', 0, 17, '重庆市合川区', 1, '合川区', ',2237,', 2237);\nINSERT INTO `area` VALUES (2255, '2015-10-19 00:41:27', '2015-10-19 00:41:27', 0, 18, '重庆市永川区', 1, '永川区', ',2237,', 2237);\nINSERT INTO `area` VALUES (2256, '2015-10-19 00:41:28', '2015-10-19 00:41:28', 0, 19, '重庆市南川区', 1, '南川区', ',2237,', 2237);\nINSERT INTO `area` VALUES (2257, '2015-10-19 00:41:29', '2015-10-19 00:41:29', 0, 20, '重庆市潼南县', 1, '潼南县', ',2237,', 2237);\nINSERT INTO `area` VALUES (2258, '2015-10-19 00:41:30', '2015-10-19 00:41:30', 0, 21, '重庆市铜梁县', 1, '铜梁县', ',2237,', 2237);\nINSERT INTO `area` VALUES (2259, '2015-10-19 00:41:31', '2015-10-19 00:41:31', 0, 22, '重庆市荣昌县', 1, '荣昌县', ',2237,', 2237);\nINSERT INTO `area` VALUES (2260, '2015-10-19 00:41:32', '2015-10-19 00:41:32', 0, 23, '重庆市璧山县', 1, '璧山县', ',2237,', 2237);\nINSERT INTO `area` VALUES (2261, '2015-10-19 00:41:33', '2015-10-19 00:41:33', 0, 24, '重庆市梁平县', 1, '梁平县', ',2237,', 2237);\nINSERT INTO `area` VALUES (2262, '2015-10-19 00:41:34', '2015-10-19 00:41:34', 0, 25, '重庆市城口县', 1, '城口县', ',2237,', 2237);\nINSERT INTO `area` VALUES (2263, '2015-10-19 00:41:35', '2015-10-19 00:41:35', 0, 26, '重庆市丰都县', 1, '丰都县', ',2237,', 2237);\nINSERT INTO `area` VALUES (2264, '2015-10-19 00:41:36', '2015-10-19 00:41:36', 0, 27, '重庆市垫江县', 1, '垫江县', ',2237,', 2237);\nINSERT INTO `area` VALUES (2265, '2015-10-19 00:41:37', '2015-10-19 00:41:37', 0, 28, '重庆市武隆县', 1, '武隆县', ',2237,', 2237);\nINSERT INTO `area` VALUES (2266, '2015-10-19 00:41:38', '2015-10-19 00:41:38', 0, 29, '重庆市忠县', 1, '忠县', ',2237,', 2237);\nINSERT INTO `area` VALUES (2267, '2015-10-19 00:41:39', '2015-10-19 00:41:39', 0, 30, '重庆市开县', 1, '开县', ',2237,', 2237);\nINSERT INTO `area` VALUES (2268, '2015-10-19 00:41:40', '2015-10-19 00:41:40', 0, 31, '重庆市云阳县', 1, '云阳县', ',2237,', 2237);\nINSERT INTO `area` VALUES (2269, '2015-10-19 00:41:41', '2015-10-19 00:41:41', 0, 32, '重庆市奉节县', 1, '奉节县', ',2237,', 2237);\nINSERT INTO `area` VALUES (2270, '2015-10-19 00:41:42', '2015-10-19 00:41:42', 0, 33, '重庆市巫山县', 1, '巫山县', ',2237,', 2237);\nINSERT INTO `area` VALUES (2271, '2015-10-19 00:41:43', '2015-10-19 00:41:43', 0, 34, '重庆市巫溪县', 1, '巫溪县', ',2237,', 2237);\nINSERT INTO `area` VALUES (2272, '2015-10-19 00:41:44', '2015-10-19 00:41:44', 0, 35, '重庆市石柱土家族自治县', 1, '石柱土家族自治县', ',2237,', 2237);\nINSERT INTO `area` VALUES (2273, '2015-10-19 00:41:45', '2015-10-19 00:41:45', 0, 36, '重庆市秀山土家族苗族自治县', 1, '秀山土家族苗族自治县', ',2237,', 2237);\nINSERT INTO `area` VALUES (2274, '2015-10-19 00:41:46', '2015-10-19 00:41:46', 0, 37, '重庆市酉阳土家族苗族自治县', 1, '酉阳土家族苗族自治县', ',2237,', 2237);\nINSERT INTO `area` VALUES (2275, '2015-10-19 00:41:47', '2015-10-19 00:41:47', 0, 38, '重庆市彭水苗族土家族自治县', 1, '彭水苗族土家族自治县', ',2237,', 2237);\nINSERT INTO `area` VALUES (2276, '2015-10-19 00:41:48', '2015-10-19 00:41:48', 0, 23, '四川省', 0, '四川省', ',', NULL);\nINSERT INTO `area` VALUES (2277, '2015-10-19 00:41:49', '2015-10-19 00:41:49', 0, 1, '四川省成都市', 1, '成都市', ',2276,', 2276);\nINSERT INTO `area` VALUES (2278, '2015-10-19 00:41:50', '2015-10-19 00:41:50', 0, 1, '四川省成都市锦江区', 2, '锦江区', ',2276,2277,', 2277);\nINSERT INTO `area` VALUES (2279, '2015-10-19 00:41:51', '2015-10-19 00:41:51', 0, 2, '四川省成都市青羊区', 2, '青羊区', ',2276,2277,', 2277);\nINSERT INTO `area` VALUES (2280, '2015-10-19 00:41:52', '2015-10-19 00:41:52', 0, 3, '四川省成都市金牛区', 2, '金牛区', ',2276,2277,', 2277);\nINSERT INTO `area` VALUES (2281, '2015-10-19 00:41:53', '2015-10-19 00:41:53', 0, 4, '四川省成都市武侯区', 2, '武侯区', ',2276,2277,', 2277);\nINSERT INTO `area` VALUES (2282, '2015-10-19 00:41:54', '2015-10-19 00:41:54', 0, 5, '四川省成都市成华区', 2, '成华区', ',2276,2277,', 2277);\nINSERT INTO `area` VALUES (2283, '2015-10-19 00:41:55', '2015-10-19 00:41:55', 0, 6, '四川省成都市龙泉驿区', 2, '龙泉驿区', ',2276,2277,', 2277);\nINSERT INTO `area` VALUES (2284, '2015-10-19 00:41:56', '2015-10-19 00:41:56', 0, 7, '四川省成都市青白江区', 2, '青白江区', ',2276,2277,', 2277);\nINSERT INTO `area` VALUES (2285, '2015-10-19 00:41:57', '2015-10-19 00:41:57', 0, 8, '四川省成都市新都区', 2, '新都区', ',2276,2277,', 2277);\nINSERT INTO `area` VALUES (2286, '2015-10-19 00:41:58', '2015-10-19 00:41:58', 0, 9, '四川省成都市温江区', 2, '温江区', ',2276,2277,', 2277);\nINSERT INTO `area` VALUES (2287, '2015-10-19 00:41:59', '2015-10-19 00:41:59', 0, 10, '四川省成都市金堂县', 2, '金堂县', ',2276,2277,', 2277);\nINSERT INTO `area` VALUES (2288, '2015-10-19 00:42:00', '2015-10-19 00:42:00', 0, 11, '四川省成都市双流县', 2, '双流县', ',2276,2277,', 2277);\nINSERT INTO `area` VALUES (2289, '2015-10-19 00:42:01', '2015-10-19 00:42:01', 0, 12, '四川省成都市郫县', 2, '郫县', ',2276,2277,', 2277);\nINSERT INTO `area` VALUES (2290, '2015-10-19 00:42:02', '2015-10-19 00:42:02', 0, 13, '四川省成都市大邑县', 2, '大邑县', ',2276,2277,', 2277);\nINSERT INTO `area` VALUES (2291, '2015-10-19 00:42:03', '2015-10-19 00:42:03', 0, 14, '四川省成都市蒲江县', 2, '蒲江县', ',2276,2277,', 2277);\nINSERT INTO `area` VALUES (2292, '2015-10-19 00:42:04', '2015-10-19 00:42:04', 0, 15, '四川省成都市新津县', 2, '新津县', ',2276,2277,', 2277);\nINSERT INTO `area` VALUES (2293, '2015-10-19 00:42:05', '2015-10-19 00:42:05', 0, 16, '四川省成都市都江堰市', 2, '都江堰市', ',2276,2277,', 2277);\nINSERT INTO `area` VALUES (2294, '2015-10-19 00:42:06', '2015-10-19 00:42:06', 0, 17, '四川省成都市彭州市', 2, '彭州市', ',2276,2277,', 2277);\nINSERT INTO `area` VALUES (2295, '2015-10-19 00:42:07', '2015-10-19 00:42:07', 0, 18, '四川省成都市邛崃市', 2, '邛崃市', ',2276,2277,', 2277);\nINSERT INTO `area` VALUES (2296, '2015-10-19 00:42:08', '2015-10-19 00:42:08', 0, 19, '四川省成都市崇州市', 2, '崇州市', ',2276,2277,', 2277);\nINSERT INTO `area` VALUES (2297, '2015-10-19 00:42:09', '2015-10-19 00:42:09', 0, 2, '四川省自贡市', 1, '自贡市', ',2276,', 2276);\nINSERT INTO `area` VALUES (2298, '2015-10-19 00:42:10', '2015-10-19 00:42:10', 0, 1, '四川省自贡市自流井区', 2, '自流井区', ',2276,2297,', 2297);\nINSERT INTO `area` VALUES (2299, '2015-10-19 00:42:11', '2015-10-19 00:42:11', 0, 2, '四川省自贡市贡井区', 2, '贡井区', ',2276,2297,', 2297);\nINSERT INTO `area` VALUES (2300, '2015-10-19 00:42:12', '2015-10-19 00:42:12', 0, 3, '四川省自贡市大安区', 2, '大安区', ',2276,2297,', 2297);\nINSERT INTO `area` VALUES (2301, '2015-10-19 00:42:13', '2015-10-19 00:42:13', 0, 4, '四川省自贡市沿滩区', 2, '沿滩区', ',2276,2297,', 2297);\nINSERT INTO `area` VALUES (2302, '2015-10-19 00:42:14', '2015-10-19 00:42:14', 0, 5, '四川省自贡市荣县', 2, '荣县', ',2276,2297,', 2297);\nINSERT INTO `area` VALUES (2303, '2015-10-19 00:42:15', '2015-10-19 00:42:15', 0, 6, '四川省自贡市富顺县', 2, '富顺县', ',2276,2297,', 2297);\nINSERT INTO `area` VALUES (2304, '2015-10-19 00:42:16', '2015-10-19 00:42:16', 0, 3, '四川省攀枝花市', 1, '攀枝花市', ',2276,', 2276);\nINSERT INTO `area` VALUES (2305, '2015-10-19 00:42:17', '2015-10-19 00:42:17', 0, 1, '四川省攀枝花市东区', 2, '东区', ',2276,2304,', 2304);\nINSERT INTO `area` VALUES (2306, '2015-10-19 00:42:18', '2015-10-19 00:42:18', 0, 2, '四川省攀枝花市西区', 2, '西区', ',2276,2304,', 2304);\nINSERT INTO `area` VALUES (2307, '2015-10-19 00:42:19', '2015-10-19 00:42:19', 0, 3, '四川省攀枝花市仁和区', 2, '仁和区', ',2276,2304,', 2304);\nINSERT INTO `area` VALUES (2308, '2015-10-19 00:42:20', '2015-10-19 00:42:20', 0, 4, '四川省攀枝花市米易县', 2, '米易县', ',2276,2304,', 2304);\nINSERT INTO `area` VALUES (2309, '2015-10-19 00:42:21', '2015-10-19 00:42:21', 0, 5, '四川省攀枝花市盐边县', 2, '盐边县', ',2276,2304,', 2304);\nINSERT INTO `area` VALUES (2310, '2015-10-19 00:42:22', '2015-10-19 00:42:22', 0, 4, '四川省泸州市', 1, '泸州市', ',2276,', 2276);\nINSERT INTO `area` VALUES (2311, '2015-10-19 00:42:23', '2015-10-19 00:42:23', 0, 1, '四川省泸州市江阳区', 2, '江阳区', ',2276,2310,', 2310);\nINSERT INTO `area` VALUES (2312, '2015-10-19 00:42:24', '2015-10-19 00:42:24', 0, 2, '四川省泸州市纳溪区', 2, '纳溪区', ',2276,2310,', 2310);\nINSERT INTO `area` VALUES (2313, '2015-10-19 00:42:25', '2015-10-19 00:42:25', 0, 3, '四川省泸州市龙马潭区', 2, '龙马潭区', ',2276,2310,', 2310);\nINSERT INTO `area` VALUES (2314, '2015-10-19 00:42:26', '2015-10-19 00:42:26', 0, 4, '四川省泸州市泸县', 2, '泸县', ',2276,2310,', 2310);\nINSERT INTO `area` VALUES (2315, '2015-10-19 00:42:27', '2015-10-19 00:42:27', 0, 5, '四川省泸州市合江县', 2, '合江县', ',2276,2310,', 2310);\nINSERT INTO `area` VALUES (2316, '2015-10-19 00:42:28', '2015-10-19 00:42:28', 0, 6, '四川省泸州市叙永县', 2, '叙永县', ',2276,2310,', 2310);\nINSERT INTO `area` VALUES (2317, '2015-10-19 00:42:29', '2015-10-19 00:42:29', 0, 7, '四川省泸州市古蔺县', 2, '古蔺县', ',2276,2310,', 2310);\nINSERT INTO `area` VALUES (2318, '2015-10-19 00:42:30', '2015-10-19 00:42:30', 0, 5, '四川省德阳市', 1, '德阳市', ',2276,', 2276);\nINSERT INTO `area` VALUES (2319, '2015-10-19 00:42:31', '2015-10-19 00:42:31', 0, 1, '四川省德阳市旌阳区', 2, '旌阳区', ',2276,2318,', 2318);\nINSERT INTO `area` VALUES (2320, '2015-10-19 00:42:32', '2015-10-19 00:42:32', 0, 2, '四川省德阳市中江县', 2, '中江县', ',2276,2318,', 2318);\nINSERT INTO `area` VALUES (2321, '2015-10-19 00:42:33', '2015-10-19 00:42:33', 0, 3, '四川省德阳市罗江县', 2, '罗江县', ',2276,2318,', 2318);\nINSERT INTO `area` VALUES (2322, '2015-10-19 00:42:34', '2015-10-19 00:42:34', 0, 4, '四川省德阳市广汉市', 2, '广汉市', ',2276,2318,', 2318);\nINSERT INTO `area` VALUES (2323, '2015-10-19 00:42:35', '2015-10-19 00:42:35', 0, 5, '四川省德阳市什邡市', 2, '什邡市', ',2276,2318,', 2318);\nINSERT INTO `area` VALUES (2324, '2015-10-19 00:42:36', '2015-10-19 00:42:36', 0, 6, '四川省德阳市绵竹市', 2, '绵竹市', ',2276,2318,', 2318);\nINSERT INTO `area` VALUES (2325, '2015-10-19 00:42:37', '2015-10-19 00:42:37', 0, 6, '四川省绵阳市', 1, '绵阳市', ',2276,', 2276);\nINSERT INTO `area` VALUES (2326, '2015-10-19 00:42:38', '2015-10-19 00:42:38', 0, 1, '四川省绵阳市涪城区', 2, '涪城区', ',2276,2325,', 2325);\nINSERT INTO `area` VALUES (2327, '2015-10-19 00:42:39', '2015-10-19 00:42:39', 0, 2, '四川省绵阳市游仙区', 2, '游仙区', ',2276,2325,', 2325);\nINSERT INTO `area` VALUES (2328, '2015-10-19 00:42:40', '2015-10-19 00:42:40', 0, 3, '四川省绵阳市三台县', 2, '三台县', ',2276,2325,', 2325);\nINSERT INTO `area` VALUES (2329, '2015-10-19 00:42:41', '2015-10-19 00:42:41', 0, 4, '四川省绵阳市盐亭县', 2, '盐亭县', ',2276,2325,', 2325);\nINSERT INTO `area` VALUES (2330, '2015-10-19 00:42:42', '2015-10-19 00:42:42', 0, 5, '四川省绵阳市安县', 2, '安县', ',2276,2325,', 2325);\nINSERT INTO `area` VALUES (2331, '2015-10-19 00:42:43', '2015-10-19 00:42:43', 0, 6, '四川省绵阳市梓潼县', 2, '梓潼县', ',2276,2325,', 2325);\nINSERT INTO `area` VALUES (2332, '2015-10-19 00:42:44', '2015-10-19 00:42:44', 0, 7, '四川省绵阳市北川羌族自治县', 2, '北川羌族自治县', ',2276,2325,', 2325);\nINSERT INTO `area` VALUES (2333, '2015-10-19 00:42:45', '2015-10-19 00:42:45', 0, 8, '四川省绵阳市平武县', 2, '平武县', ',2276,2325,', 2325);\nINSERT INTO `area` VALUES (2334, '2015-10-19 00:42:46', '2015-10-19 00:42:46', 0, 9, '四川省绵阳市江油市', 2, '江油市', ',2276,2325,', 2325);\nINSERT INTO `area` VALUES (2335, '2015-10-19 00:42:47', '2015-10-19 00:42:47', 0, 7, '四川省广元市', 1, '广元市', ',2276,', 2276);\nINSERT INTO `area` VALUES (2336, '2015-10-19 00:42:48', '2015-10-19 00:42:48', 0, 1, '四川省广元市利州区', 2, '利州区', ',2276,2335,', 2335);\nINSERT INTO `area` VALUES (2337, '2015-10-19 00:42:49', '2015-10-19 00:42:49', 0, 2, '四川省广元市元坝区', 2, '元坝区', ',2276,2335,', 2335);\nINSERT INTO `area` VALUES (2338, '2015-10-19 00:42:50', '2015-10-19 00:42:50', 0, 3, '四川省广元市朝天区', 2, '朝天区', ',2276,2335,', 2335);\nINSERT INTO `area` VALUES (2339, '2015-10-19 00:42:51', '2015-10-19 00:42:51', 0, 4, '四川省广元市旺苍县', 2, '旺苍县', ',2276,2335,', 2335);\nINSERT INTO `area` VALUES (2340, '2015-10-19 00:42:52', '2015-10-19 00:42:52', 0, 5, '四川省广元市青川县', 2, '青川县', ',2276,2335,', 2335);\nINSERT INTO `area` VALUES (2341, '2015-10-19 00:42:53', '2015-10-19 00:42:53', 0, 6, '四川省广元市剑阁县', 2, '剑阁县', ',2276,2335,', 2335);\nINSERT INTO `area` VALUES (2342, '2015-10-19 00:42:54', '2015-10-19 00:42:54', 0, 7, '四川省广元市苍溪县', 2, '苍溪县', ',2276,2335,', 2335);\nINSERT INTO `area` VALUES (2343, '2015-10-19 00:42:55', '2015-10-19 00:42:55', 0, 8, '四川省遂宁市', 1, '遂宁市', ',2276,', 2276);\nINSERT INTO `area` VALUES (2344, '2015-10-19 00:42:56', '2015-10-19 00:42:56', 0, 1, '四川省遂宁市船山区', 2, '船山区', ',2276,2343,', 2343);\nINSERT INTO `area` VALUES (2345, '2015-10-19 00:42:57', '2015-10-19 00:42:57', 0, 2, '四川省遂宁市安居区', 2, '安居区', ',2276,2343,', 2343);\nINSERT INTO `area` VALUES (2346, '2015-10-19 00:42:58', '2015-10-19 00:42:58', 0, 3, '四川省遂宁市蓬溪县', 2, '蓬溪县', ',2276,2343,', 2343);\nINSERT INTO `area` VALUES (2347, '2015-10-19 00:42:59', '2015-10-19 00:42:59', 0, 4, '四川省遂宁市射洪县', 2, '射洪县', ',2276,2343,', 2343);\nINSERT INTO `area` VALUES (2348, '2015-10-19 00:43:00', '2015-10-19 00:43:00', 0, 5, '四川省遂宁市大英县', 2, '大英县', ',2276,2343,', 2343);\nINSERT INTO `area` VALUES (2349, '2015-10-19 00:43:01', '2015-10-19 00:43:01', 0, 9, '四川省内江市', 1, '内江市', ',2276,', 2276);\nINSERT INTO `area` VALUES (2350, '2015-10-19 00:43:02', '2015-10-19 00:43:02', 0, 1, '四川省内江市市中区', 2, '市中区', ',2276,2349,', 2349);\nINSERT INTO `area` VALUES (2351, '2015-10-19 00:43:03', '2015-10-19 00:43:03', 0, 2, '四川省内江市东兴区', 2, '东兴区', ',2276,2349,', 2349);\nINSERT INTO `area` VALUES (2352, '2015-10-19 00:43:04', '2015-10-19 00:43:04', 0, 3, '四川省内江市威远县', 2, '威远县', ',2276,2349,', 2349);\nINSERT INTO `area` VALUES (2353, '2015-10-19 00:43:05', '2015-10-19 00:43:05', 0, 4, '四川省内江市资中县', 2, '资中县', ',2276,2349,', 2349);\nINSERT INTO `area` VALUES (2354, '2015-10-19 00:43:06', '2015-10-19 00:43:06', 0, 5, '四川省内江市隆昌县', 2, '隆昌县', ',2276,2349,', 2349);\nINSERT INTO `area` VALUES (2355, '2015-10-19 00:43:07', '2015-10-19 00:43:07', 0, 10, '四川省乐山市', 1, '乐山市', ',2276,', 2276);\nINSERT INTO `area` VALUES (2356, '2015-10-19 00:43:08', '2015-10-19 00:43:08', 0, 1, '四川省乐山市市中区', 2, '市中区', ',2276,2355,', 2355);\nINSERT INTO `area` VALUES (2357, '2015-10-19 00:43:09', '2015-10-19 00:43:09', 0, 2, '四川省乐山市沙湾区', 2, '沙湾区', ',2276,2355,', 2355);\nINSERT INTO `area` VALUES (2358, '2015-10-19 00:43:10', '2015-10-19 00:43:10', 0, 3, '四川省乐山市五通桥区', 2, '五通桥区', ',2276,2355,', 2355);\nINSERT INTO `area` VALUES (2359, '2015-10-19 00:43:11', '2015-10-19 00:43:11', 0, 4, '四川省乐山市金口河区', 2, '金口河区', ',2276,2355,', 2355);\nINSERT INTO `area` VALUES (2360, '2015-10-19 00:43:12', '2015-10-19 00:43:12', 0, 5, '四川省乐山市犍为县', 2, '犍为县', ',2276,2355,', 2355);\nINSERT INTO `area` VALUES (2361, '2015-10-19 00:43:13', '2015-10-19 00:43:13', 0, 6, '四川省乐山市井研县', 2, '井研县', ',2276,2355,', 2355);\nINSERT INTO `area` VALUES (2362, '2015-10-19 00:43:14', '2015-10-19 00:43:14', 0, 7, '四川省乐山市夹江县', 2, '夹江县', ',2276,2355,', 2355);\nINSERT INTO `area` VALUES (2363, '2015-10-19 00:43:15', '2015-10-19 00:43:15', 0, 8, '四川省乐山市沐川县', 2, '沐川县', ',2276,2355,', 2355);\nINSERT INTO `area` VALUES (2364, '2015-10-19 00:43:16', '2015-10-19 00:43:16', 0, 9, '四川省乐山市峨边彝族自治县', 2, '峨边彝族自治县', ',2276,2355,', 2355);\nINSERT INTO `area` VALUES (2365, '2015-10-19 00:43:17', '2015-10-19 00:43:17', 0, 10, '四川省乐山市马边彝族自治县', 2, '马边彝族自治县', ',2276,2355,', 2355);\nINSERT INTO `area` VALUES (2366, '2015-10-19 00:43:18', '2015-10-19 00:43:18', 0, 11, '四川省乐山市峨眉山市', 2, '峨眉山市', ',2276,2355,', 2355);\nINSERT INTO `area` VALUES (2367, '2015-10-19 00:43:19', '2015-10-19 00:43:19', 0, 11, '四川省南充市', 1, '南充市', ',2276,', 2276);\nINSERT INTO `area` VALUES (2368, '2015-10-19 00:43:20', '2015-10-19 00:43:20', 0, 1, '四川省南充市顺庆区', 2, '顺庆区', ',2276,2367,', 2367);\nINSERT INTO `area` VALUES (2369, '2015-10-19 00:43:21', '2015-10-19 00:43:21', 0, 2, '四川省南充市高坪区', 2, '高坪区', ',2276,2367,', 2367);\nINSERT INTO `area` VALUES (2370, '2015-10-19 00:43:22', '2015-10-19 00:43:22', 0, 3, '四川省南充市嘉陵区', 2, '嘉陵区', ',2276,2367,', 2367);\nINSERT INTO `area` VALUES (2371, '2015-10-19 00:43:23', '2015-10-19 00:43:23', 0, 4, '四川省南充市南部县', 2, '南部县', ',2276,2367,', 2367);\nINSERT INTO `area` VALUES (2372, '2015-10-19 00:43:24', '2015-10-19 00:43:24', 0, 5, '四川省南充市营山县', 2, '营山县', ',2276,2367,', 2367);\nINSERT INTO `area` VALUES (2373, '2015-10-19 00:43:25', '2015-10-19 00:43:25', 0, 6, '四川省南充市蓬安县', 2, '蓬安县', ',2276,2367,', 2367);\nINSERT INTO `area` VALUES (2374, '2015-10-19 00:43:26', '2015-10-19 00:43:26', 0, 7, '四川省南充市仪陇县', 2, '仪陇县', ',2276,2367,', 2367);\nINSERT INTO `area` VALUES (2375, '2015-10-19 00:43:27', '2015-10-19 00:43:27', 0, 8, '四川省南充市西充县', 2, '西充县', ',2276,2367,', 2367);\nINSERT INTO `area` VALUES (2376, '2015-10-19 00:43:28', '2015-10-19 00:43:28', 0, 9, '四川省南充市阆中市', 2, '阆中市', ',2276,2367,', 2367);\nINSERT INTO `area` VALUES (2377, '2015-10-19 00:43:29', '2015-10-19 00:43:29', 0, 12, '四川省眉山市', 1, '眉山市', ',2276,', 2276);\nINSERT INTO `area` VALUES (2378, '2015-10-19 00:43:30', '2015-10-19 00:43:30', 0, 1, '四川省眉山市东坡区', 2, '东坡区', ',2276,2377,', 2377);\nINSERT INTO `area` VALUES (2379, '2015-10-19 00:43:31', '2015-10-19 00:43:31', 0, 2, '四川省眉山市仁寿县', 2, '仁寿县', ',2276,2377,', 2377);\nINSERT INTO `area` VALUES (2380, '2015-10-19 00:43:32', '2015-10-19 00:43:32', 0, 3, '四川省眉山市彭山县', 2, '彭山县', ',2276,2377,', 2377);\nINSERT INTO `area` VALUES (2381, '2015-10-19 00:43:33', '2015-10-19 00:43:33', 0, 4, '四川省眉山市洪雅县', 2, '洪雅县', ',2276,2377,', 2377);\nINSERT INTO `area` VALUES (2382, '2015-10-19 00:43:34', '2015-10-19 00:43:34', 0, 5, '四川省眉山市丹棱县', 2, '丹棱县', ',2276,2377,', 2377);\nINSERT INTO `area` VALUES (2383, '2015-10-19 00:43:35', '2015-10-19 00:43:35', 0, 6, '四川省眉山市青神县', 2, '青神县', ',2276,2377,', 2377);\nINSERT INTO `area` VALUES (2384, '2015-10-19 00:43:36', '2015-10-19 00:43:36', 0, 13, '四川省宜宾市', 1, '宜宾市', ',2276,', 2276);\nINSERT INTO `area` VALUES (2385, '2015-10-19 00:43:37', '2015-10-19 00:43:37', 0, 1, '四川省宜宾市翠屏区', 2, '翠屏区', ',2276,2384,', 2384);\nINSERT INTO `area` VALUES (2386, '2015-10-19 00:43:38', '2015-10-19 00:43:38', 0, 2, '四川省宜宾市南溪区', 2, '南溪区', ',2276,2384,', 2384);\nINSERT INTO `area` VALUES (2387, '2015-10-19 00:43:39', '2015-10-19 00:43:39', 0, 3, '四川省宜宾市宜宾县', 2, '宜宾县', ',2276,2384,', 2384);\nINSERT INTO `area` VALUES (2388, '2015-10-19 00:43:40', '2015-10-19 00:43:40', 0, 4, '四川省宜宾市江安县', 2, '江安县', ',2276,2384,', 2384);\nINSERT INTO `area` VALUES (2389, '2015-10-19 00:43:41', '2015-10-19 00:43:41', 0, 5, '四川省宜宾市长宁县', 2, '长宁县', ',2276,2384,', 2384);\nINSERT INTO `area` VALUES (2390, '2015-10-19 00:43:42', '2015-10-19 00:43:42', 0, 6, '四川省宜宾市高县', 2, '高县', ',2276,2384,', 2384);\nINSERT INTO `area` VALUES (2391, '2015-10-19 00:43:43', '2015-10-19 00:43:43', 0, 7, '四川省宜宾市珙县', 2, '珙县', ',2276,2384,', 2384);\nINSERT INTO `area` VALUES (2392, '2015-10-19 00:43:44', '2015-10-19 00:43:44', 0, 8, '四川省宜宾市筠连县', 2, '筠连县', ',2276,2384,', 2384);\nINSERT INTO `area` VALUES (2393, '2015-10-19 00:43:45', '2015-10-19 00:43:45', 0, 9, '四川省宜宾市兴文县', 2, '兴文县', ',2276,2384,', 2384);\nINSERT INTO `area` VALUES (2394, '2015-10-19 00:43:46', '2015-10-19 00:43:46', 0, 10, '四川省宜宾市屏山县', 2, '屏山县', ',2276,2384,', 2384);\nINSERT INTO `area` VALUES (2395, '2015-10-19 00:43:47', '2015-10-19 00:43:47', 0, 14, '四川省广安市', 1, '广安市', ',2276,', 2276);\nINSERT INTO `area` VALUES (2396, '2015-10-19 00:43:48', '2015-10-19 00:43:48', 0, 1, '四川省广安市广安区', 2, '广安区', ',2276,2395,', 2395);\nINSERT INTO `area` VALUES (2397, '2015-10-19 00:43:49', '2015-10-19 00:43:49', 0, 2, '四川省广安市前锋区', 2, '前锋区', ',2276,2395,', 2395);\nINSERT INTO `area` VALUES (2398, '2015-10-19 00:43:50', '2015-10-19 00:43:50', 0, 3, '四川省广安市岳池县', 2, '岳池县', ',2276,2395,', 2395);\nINSERT INTO `area` VALUES (2399, '2015-10-19 00:43:51', '2015-10-19 00:43:51', 0, 4, '四川省广安市武胜县', 2, '武胜县', ',2276,2395,', 2395);\nINSERT INTO `area` VALUES (2400, '2015-10-19 00:43:52', '2015-10-19 00:43:52', 0, 5, '四川省广安市邻水县', 2, '邻水县', ',2276,2395,', 2395);\nINSERT INTO `area` VALUES (2401, '2015-10-19 00:43:53', '2015-10-19 00:43:53', 0, 6, '四川省广安市华蓥市', 2, '华蓥市', ',2276,2395,', 2395);\nINSERT INTO `area` VALUES (2402, '2015-10-19 00:43:54', '2015-10-19 00:43:54', 0, 15, '四川省达州市', 1, '达州市', ',2276,', 2276);\nINSERT INTO `area` VALUES (2403, '2015-10-19 00:43:55', '2015-10-19 00:43:55', 0, 1, '四川省达州市通川区', 2, '通川区', ',2276,2402,', 2402);\nINSERT INTO `area` VALUES (2404, '2015-10-19 00:43:56', '2015-10-19 00:43:56', 0, 2, '四川省达州市达川区', 2, '达川区', ',2276,2402,', 2402);\nINSERT INTO `area` VALUES (2405, '2015-10-19 00:43:57', '2015-10-19 00:43:57', 0, 3, '四川省达州市宣汉县', 2, '宣汉县', ',2276,2402,', 2402);\nINSERT INTO `area` VALUES (2406, '2015-10-19 00:43:58', '2015-10-19 00:43:58', 0, 4, '四川省达州市开江县', 2, '开江县', ',2276,2402,', 2402);\nINSERT INTO `area` VALUES (2407, '2015-10-19 00:43:59', '2015-10-19 00:43:59', 0, 5, '四川省达州市大竹县', 2, '大竹县', ',2276,2402,', 2402);\nINSERT INTO `area` VALUES (2408, '2015-10-19 00:44:00', '2015-10-19 00:44:00', 0, 6, '四川省达州市渠县', 2, '渠县', ',2276,2402,', 2402);\nINSERT INTO `area` VALUES (2409, '2015-10-19 00:44:01', '2015-10-19 00:44:01', 0, 7, '四川省达州市万源市', 2, '万源市', ',2276,2402,', 2402);\nINSERT INTO `area` VALUES (2410, '2015-10-19 00:44:02', '2015-10-19 00:44:02', 0, 16, '四川省雅安市', 1, '雅安市', ',2276,', 2276);\nINSERT INTO `area` VALUES (2411, '2015-10-19 00:44:03', '2015-10-19 00:44:03', 0, 1, '四川省雅安市雨城区', 2, '雨城区', ',2276,2410,', 2410);\nINSERT INTO `area` VALUES (2412, '2015-10-19 00:44:04', '2015-10-19 00:44:04', 0, 2, '四川省雅安市名山区', 2, '名山区', ',2276,2410,', 2410);\nINSERT INTO `area` VALUES (2413, '2015-10-19 00:44:05', '2015-10-19 00:44:05', 0, 3, '四川省雅安市荥经县', 2, '荥经县', ',2276,2410,', 2410);\nINSERT INTO `area` VALUES (2414, '2015-10-19 00:44:06', '2015-10-19 00:44:06', 0, 4, '四川省雅安市汉源县', 2, '汉源县', ',2276,2410,', 2410);\nINSERT INTO `area` VALUES (2415, '2015-10-19 00:44:07', '2015-10-19 00:44:07', 0, 5, '四川省雅安市石棉县', 2, '石棉县', ',2276,2410,', 2410);\nINSERT INTO `area` VALUES (2416, '2015-10-19 00:44:08', '2015-10-19 00:44:08', 0, 6, '四川省雅安市天全县', 2, '天全县', ',2276,2410,', 2410);\nINSERT INTO `area` VALUES (2417, '2015-10-19 00:44:09', '2015-10-19 00:44:09', 0, 7, '四川省雅安市芦山县', 2, '芦山县', ',2276,2410,', 2410);\nINSERT INTO `area` VALUES (2418, '2015-10-19 00:44:10', '2015-10-19 00:44:10', 0, 8, '四川省雅安市宝兴县', 2, '宝兴县', ',2276,2410,', 2410);\nINSERT INTO `area` VALUES (2419, '2015-10-19 00:44:11', '2015-10-19 00:44:11', 0, 17, '四川省巴中市', 1, '巴中市', ',2276,', 2276);\nINSERT INTO `area` VALUES (2420, '2015-10-19 00:44:12', '2015-10-19 00:44:12', 0, 1, '四川省巴中市巴州区', 2, '巴州区', ',2276,2419,', 2419);\nINSERT INTO `area` VALUES (2421, '2015-10-19 00:44:13', '2015-10-19 00:44:13', 0, 2, '四川省巴中市恩阳区', 2, '恩阳区', ',2276,2419,', 2419);\nINSERT INTO `area` VALUES (2422, '2015-10-19 00:44:14', '2015-10-19 00:44:14', 0, 3, '四川省巴中市通江县', 2, '通江县', ',2276,2419,', 2419);\nINSERT INTO `area` VALUES (2423, '2015-10-19 00:44:15', '2015-10-19 00:44:15', 0, 4, '四川省巴中市南江县', 2, '南江县', ',2276,2419,', 2419);\nINSERT INTO `area` VALUES (2424, '2015-10-19 00:44:16', '2015-10-19 00:44:16', 0, 5, '四川省巴中市平昌县', 2, '平昌县', ',2276,2419,', 2419);\nINSERT INTO `area` VALUES (2425, '2015-10-19 00:44:17', '2015-10-19 00:44:17', 0, 18, '四川省资阳市', 1, '资阳市', ',2276,', 2276);\nINSERT INTO `area` VALUES (2426, '2015-10-19 00:44:18', '2015-10-19 00:44:18', 0, 1, '四川省资阳市雁江区', 2, '雁江区', ',2276,2425,', 2425);\nINSERT INTO `area` VALUES (2427, '2015-10-19 00:44:19', '2015-10-19 00:44:19', 0, 2, '四川省资阳市安岳县', 2, '安岳县', ',2276,2425,', 2425);\nINSERT INTO `area` VALUES (2428, '2015-10-19 00:44:20', '2015-10-19 00:44:20', 0, 3, '四川省资阳市乐至县', 2, '乐至县', ',2276,2425,', 2425);\nINSERT INTO `area` VALUES (2429, '2015-10-19 00:44:21', '2015-10-19 00:44:21', 0, 4, '四川省资阳市简阳市', 2, '简阳市', ',2276,2425,', 2425);\nINSERT INTO `area` VALUES (2430, '2015-10-19 00:44:22', '2015-10-19 00:44:22', 0, 19, '四川省阿坝藏族羌族自治州', 1, '阿坝藏族羌族自治州', ',2276,', 2276);\nINSERT INTO `area` VALUES (2431, '2015-10-19 00:44:23', '2015-10-19 00:44:23', 0, 1, '四川省阿坝藏族羌族自治州汶川县', 2, '汶川县', ',2276,2430,', 2430);\nINSERT INTO `area` VALUES (2432, '2015-10-19 00:44:24', '2015-10-19 00:44:24', 0, 2, '四川省阿坝藏族羌族自治州理县', 2, '理县', ',2276,2430,', 2430);\nINSERT INTO `area` VALUES (2433, '2015-10-19 00:44:25', '2015-10-19 00:44:25', 0, 3, '四川省阿坝藏族羌族自治州茂县', 2, '茂县', ',2276,2430,', 2430);\nINSERT INTO `area` VALUES (2434, '2015-10-19 00:44:26', '2015-10-19 00:44:26', 0, 4, '四川省阿坝藏族羌族自治州松潘县', 2, '松潘县', ',2276,2430,', 2430);\nINSERT INTO `area` VALUES (2435, '2015-10-19 00:44:27', '2015-10-19 00:44:27', 0, 5, '四川省阿坝藏族羌族自治州九寨沟县', 2, '九寨沟县', ',2276,2430,', 2430);\nINSERT INTO `area` VALUES (2436, '2015-10-19 00:44:28', '2015-10-19 00:44:28', 0, 6, '四川省阿坝藏族羌族自治州金川县', 2, '金川县', ',2276,2430,', 2430);\nINSERT INTO `area` VALUES (2437, '2015-10-19 00:44:29', '2015-10-19 00:44:29', 0, 7, '四川省阿坝藏族羌族自治州小金县', 2, '小金县', ',2276,2430,', 2430);\nINSERT INTO `area` VALUES (2438, '2015-10-19 00:44:30', '2015-10-19 00:44:30', 0, 8, '四川省阿坝藏族羌族自治州黑水县', 2, '黑水县', ',2276,2430,', 2430);\nINSERT INTO `area` VALUES (2439, '2015-10-19 00:44:31', '2015-10-19 00:44:31', 0, 9, '四川省阿坝藏族羌族自治州马尔康县', 2, '马尔康县', ',2276,2430,', 2430);\nINSERT INTO `area` VALUES (2440, '2015-10-19 00:44:32', '2015-10-19 00:44:32', 0, 10, '四川省阿坝藏族羌族自治州壤塘县', 2, '壤塘县', ',2276,2430,', 2430);\nINSERT INTO `area` VALUES (2441, '2015-10-19 00:44:33', '2015-10-19 00:44:33', 0, 11, '四川省阿坝藏族羌族自治州阿坝县', 2, '阿坝县', ',2276,2430,', 2430);\nINSERT INTO `area` VALUES (2442, '2015-10-19 00:44:34', '2015-10-19 00:44:34', 0, 12, '四川省阿坝藏族羌族自治州若尔盖县', 2, '若尔盖县', ',2276,2430,', 2430);\nINSERT INTO `area` VALUES (2443, '2015-10-19 00:44:35', '2015-10-19 00:44:35', 0, 13, '四川省阿坝藏族羌族自治州红原县', 2, '红原县', ',2276,2430,', 2430);\nINSERT INTO `area` VALUES (2444, '2015-10-19 00:44:36', '2015-10-19 00:44:36', 0, 20, '四川省甘孜藏族自治州', 1, '甘孜藏族自治州', ',2276,', 2276);\nINSERT INTO `area` VALUES (2445, '2015-10-19 00:44:37', '2015-10-19 00:44:37', 0, 1, '四川省甘孜藏族自治州康定县', 2, '康定县', ',2276,2444,', 2444);\nINSERT INTO `area` VALUES (2446, '2015-10-19 00:44:38', '2015-10-19 00:44:38', 0, 2, '四川省甘孜藏族自治州泸定县', 2, '泸定县', ',2276,2444,', 2444);\nINSERT INTO `area` VALUES (2447, '2015-10-19 00:44:39', '2015-10-19 00:44:39', 0, 3, '四川省甘孜藏族自治州丹巴县', 2, '丹巴县', ',2276,2444,', 2444);\nINSERT INTO `area` VALUES (2448, '2015-10-19 00:44:40', '2015-10-19 00:44:40', 0, 4, '四川省甘孜藏族自治州九龙县', 2, '九龙县', ',2276,2444,', 2444);\nINSERT INTO `area` VALUES (2449, '2015-10-19 00:44:41', '2015-10-19 00:44:41', 0, 5, '四川省甘孜藏族自治州雅江县', 2, '雅江县', ',2276,2444,', 2444);\nINSERT INTO `area` VALUES (2450, '2015-10-19 00:44:42', '2015-10-19 00:44:42', 0, 6, '四川省甘孜藏族自治州道孚县', 2, '道孚县', ',2276,2444,', 2444);\nINSERT INTO `area` VALUES (2451, '2015-10-19 00:44:43', '2015-10-19 00:44:43', 0, 7, '四川省甘孜藏族自治州炉霍县', 2, '炉霍县', ',2276,2444,', 2444);\nINSERT INTO `area` VALUES (2452, '2015-10-19 00:44:44', '2015-10-19 00:44:44', 0, 8, '四川省甘孜藏族自治州甘孜县', 2, '甘孜县', ',2276,2444,', 2444);\nINSERT INTO `area` VALUES (2453, '2015-10-19 00:44:45', '2015-10-19 00:44:45', 0, 9, '四川省甘孜藏族自治州新龙县', 2, '新龙县', ',2276,2444,', 2444);\nINSERT INTO `area` VALUES (2454, '2015-10-19 00:44:46', '2015-10-19 00:44:46', 0, 10, '四川省甘孜藏族自治州德格县', 2, '德格县', ',2276,2444,', 2444);\nINSERT INTO `area` VALUES (2455, '2015-10-19 00:44:47', '2015-10-19 00:44:47', 0, 11, '四川省甘孜藏族自治州白玉县', 2, '白玉县', ',2276,2444,', 2444);\nINSERT INTO `area` VALUES (2456, '2015-10-19 00:44:48', '2015-10-19 00:44:48', 0, 12, '四川省甘孜藏族自治州石渠县', 2, '石渠县', ',2276,2444,', 2444);\nINSERT INTO `area` VALUES (2457, '2015-10-19 00:44:49', '2015-10-19 00:44:49', 0, 13, '四川省甘孜藏族自治州色达县', 2, '色达县', ',2276,2444,', 2444);\nINSERT INTO `area` VALUES (2458, '2015-10-19 00:44:50', '2015-10-19 00:44:50', 0, 14, '四川省甘孜藏族自治州理塘县', 2, '理塘县', ',2276,2444,', 2444);\nINSERT INTO `area` VALUES (2459, '2015-10-19 00:44:51', '2015-10-19 00:44:51', 0, 15, '四川省甘孜藏族自治州巴塘县', 2, '巴塘县', ',2276,2444,', 2444);\nINSERT INTO `area` VALUES (2460, '2015-10-19 00:44:52', '2015-10-19 00:44:52', 0, 16, '四川省甘孜藏族自治州乡城县', 2, '乡城县', ',2276,2444,', 2444);\nINSERT INTO `area` VALUES (2461, '2015-10-19 00:44:53', '2015-10-19 00:44:53', 0, 17, '四川省甘孜藏族自治州稻城县', 2, '稻城县', ',2276,2444,', 2444);\nINSERT INTO `area` VALUES (2462, '2015-10-19 00:44:54', '2015-10-19 00:44:54', 0, 18, '四川省甘孜藏族自治州得荣县', 2, '得荣县', ',2276,2444,', 2444);\nINSERT INTO `area` VALUES (2463, '2015-10-19 00:44:55', '2015-10-19 00:44:55', 0, 21, '四川省凉山彝族自治州', 1, '凉山彝族自治州', ',2276,', 2276);\nINSERT INTO `area` VALUES (2464, '2015-10-19 00:44:56', '2015-10-19 00:44:56', 0, 1, '四川省凉山彝族自治州西昌市', 2, '西昌市', ',2276,2463,', 2463);\nINSERT INTO `area` VALUES (2465, '2015-10-19 00:44:57', '2015-10-19 00:44:57', 0, 2, '四川省凉山彝族自治州木里藏族自治县', 2, '木里藏族自治县', ',2276,2463,', 2463);\nINSERT INTO `area` VALUES (2466, '2015-10-19 00:44:58', '2015-10-19 00:44:58', 0, 3, '四川省凉山彝族自治州盐源县', 2, '盐源县', ',2276,2463,', 2463);\nINSERT INTO `area` VALUES (2467, '2015-10-19 00:44:59', '2015-10-19 00:44:59', 0, 4, '四川省凉山彝族自治州德昌县', 2, '德昌县', ',2276,2463,', 2463);\nINSERT INTO `area` VALUES (2468, '2015-10-19 00:45:00', '2015-10-19 00:45:00', 0, 5, '四川省凉山彝族自治州会理县', 2, '会理县', ',2276,2463,', 2463);\nINSERT INTO `area` VALUES (2469, '2015-10-19 00:45:01', '2015-10-19 00:45:01', 0, 6, '四川省凉山彝族自治州会东县', 2, '会东县', ',2276,2463,', 2463);\nINSERT INTO `area` VALUES (2470, '2015-10-19 00:45:02', '2015-10-19 00:45:02', 0, 7, '四川省凉山彝族自治州宁南县', 2, '宁南县', ',2276,2463,', 2463);\nINSERT INTO `area` VALUES (2471, '2015-10-19 00:45:03', '2015-10-19 00:45:03', 0, 8, '四川省凉山彝族自治州普格县', 2, '普格县', ',2276,2463,', 2463);\nINSERT INTO `area` VALUES (2472, '2015-10-19 00:45:04', '2015-10-19 00:45:04', 0, 9, '四川省凉山彝族自治州布拖县', 2, '布拖县', ',2276,2463,', 2463);\nINSERT INTO `area` VALUES (2473, '2015-10-19 00:45:05', '2015-10-19 00:45:05', 0, 10, '四川省凉山彝族自治州金阳县', 2, '金阳县', ',2276,2463,', 2463);\nINSERT INTO `area` VALUES (2474, '2015-10-19 00:45:06', '2015-10-19 00:45:06', 0, 11, '四川省凉山彝族自治州昭觉县', 2, '昭觉县', ',2276,2463,', 2463);\nINSERT INTO `area` VALUES (2475, '2015-10-19 00:45:07', '2015-10-19 00:45:07', 0, 12, '四川省凉山彝族自治州喜德县', 2, '喜德县', ',2276,2463,', 2463);\nINSERT INTO `area` VALUES (2476, '2015-10-19 00:45:08', '2015-10-19 00:45:08', 0, 13, '四川省凉山彝族自治州冕宁县', 2, '冕宁县', ',2276,2463,', 2463);\nINSERT INTO `area` VALUES (2477, '2015-10-19 00:45:09', '2015-10-19 00:45:09', 0, 14, '四川省凉山彝族自治州越西县', 2, '越西县', ',2276,2463,', 2463);\nINSERT INTO `area` VALUES (2478, '2015-10-19 00:45:10', '2015-10-19 00:45:10', 0, 15, '四川省凉山彝族自治州甘洛县', 2, '甘洛县', ',2276,2463,', 2463);\nINSERT INTO `area` VALUES (2479, '2015-10-19 00:45:11', '2015-10-19 00:45:11', 0, 16, '四川省凉山彝族自治州美姑县', 2, '美姑县', ',2276,2463,', 2463);\nINSERT INTO `area` VALUES (2480, '2015-10-19 00:45:12', '2015-10-19 00:45:12', 0, 17, '四川省凉山彝族自治州雷波县', 2, '雷波县', ',2276,2463,', 2463);\nINSERT INTO `area` VALUES (2481, '2015-10-19 00:45:13', '2015-10-19 00:45:13', 0, 24, '贵州省', 0, '贵州省', ',', NULL);\nINSERT INTO `area` VALUES (2482, '2015-10-19 00:45:14', '2015-10-19 00:45:14', 0, 1, '贵州省贵阳市', 1, '贵阳市', ',2481,', 2481);\nINSERT INTO `area` VALUES (2483, '2015-10-19 00:45:15', '2015-10-19 00:45:15', 0, 1, '贵州省贵阳市南明区', 2, '南明区', ',2481,2482,', 2482);\nINSERT INTO `area` VALUES (2484, '2015-10-19 00:45:16', '2015-10-19 00:45:16', 0, 2, '贵州省贵阳市云岩区', 2, '云岩区', ',2481,2482,', 2482);\nINSERT INTO `area` VALUES (2485, '2015-10-19 00:45:17', '2015-10-19 00:45:17', 0, 3, '贵州省贵阳市花溪区', 2, '花溪区', ',2481,2482,', 2482);\nINSERT INTO `area` VALUES (2486, '2015-10-19 00:45:18', '2015-10-19 00:45:18', 0, 4, '贵州省贵阳市乌当区', 2, '乌当区', ',2481,2482,', 2482);\nINSERT INTO `area` VALUES (2487, '2015-10-19 00:45:19', '2015-10-19 00:45:19', 0, 5, '贵州省贵阳市白云区', 2, '白云区', ',2481,2482,', 2482);\nINSERT INTO `area` VALUES (2488, '2015-10-19 00:45:20', '2015-10-19 00:45:20', 0, 6, '贵州省贵阳市观山湖区', 2, '观山湖区', ',2481,2482,', 2482);\nINSERT INTO `area` VALUES (2489, '2015-10-19 00:45:21', '2015-10-19 00:45:21', 0, 7, '贵州省贵阳市开阳县', 2, '开阳县', ',2481,2482,', 2482);\nINSERT INTO `area` VALUES (2490, '2015-10-19 00:45:22', '2015-10-19 00:45:22', 0, 8, '贵州省贵阳市息烽县', 2, '息烽县', ',2481,2482,', 2482);\nINSERT INTO `area` VALUES (2491, '2015-10-19 00:45:23', '2015-10-19 00:45:23', 0, 9, '贵州省贵阳市修文县', 2, '修文县', ',2481,2482,', 2482);\nINSERT INTO `area` VALUES (2492, '2015-10-19 00:45:24', '2015-10-19 00:45:24', 0, 10, '贵州省贵阳市清镇市', 2, '清镇市', ',2481,2482,', 2482);\nINSERT INTO `area` VALUES (2493, '2015-10-19 00:45:25', '2015-10-19 00:45:25', 0, 2, '贵州省六盘水市', 1, '六盘水市', ',2481,', 2481);\nINSERT INTO `area` VALUES (2494, '2015-10-19 00:45:26', '2015-10-19 00:45:26', 0, 1, '贵州省六盘水市钟山区', 2, '钟山区', ',2481,2493,', 2493);\nINSERT INTO `area` VALUES (2495, '2015-10-19 00:45:27', '2015-10-19 00:45:27', 0, 2, '贵州省六盘水市六枝特区', 2, '六枝特区', ',2481,2493,', 2493);\nINSERT INTO `area` VALUES (2496, '2015-10-19 00:45:28', '2015-10-19 00:45:28', 0, 3, '贵州省六盘水市水城县', 2, '水城县', ',2481,2493,', 2493);\nINSERT INTO `area` VALUES (2497, '2015-10-19 00:45:29', '2015-10-19 00:45:29', 0, 4, '贵州省六盘水市盘县', 2, '盘县', ',2481,2493,', 2493);\nINSERT INTO `area` VALUES (2498, '2015-10-19 00:45:30', '2015-10-19 00:45:30', 0, 3, '贵州省遵义市', 1, '遵义市', ',2481,', 2481);\nINSERT INTO `area` VALUES (2499, '2015-10-19 00:45:31', '2015-10-19 00:45:31', 0, 1, '贵州省遵义市红花岗区', 2, '红花岗区', ',2481,2498,', 2498);\nINSERT INTO `area` VALUES (2500, '2015-10-19 00:45:32', '2015-10-19 00:45:32', 0, 2, '贵州省遵义市汇川区', 2, '汇川区', ',2481,2498,', 2498);\nINSERT INTO `area` VALUES (2501, '2015-10-19 00:45:33', '2015-10-19 00:45:33', 0, 3, '贵州省遵义市遵义县', 2, '遵义县', ',2481,2498,', 2498);\nINSERT INTO `area` VALUES (2502, '2015-10-19 00:45:34', '2015-10-19 00:45:34', 0, 4, '贵州省遵义市桐梓县', 2, '桐梓县', ',2481,2498,', 2498);\nINSERT INTO `area` VALUES (2503, '2015-10-19 00:45:35', '2015-10-19 00:45:35', 0, 5, '贵州省遵义市绥阳县', 2, '绥阳县', ',2481,2498,', 2498);\nINSERT INTO `area` VALUES (2504, '2015-10-19 00:45:36', '2015-10-19 00:45:36', 0, 6, '贵州省遵义市正安县', 2, '正安县', ',2481,2498,', 2498);\nINSERT INTO `area` VALUES (2505, '2015-10-19 00:45:37', '2015-10-19 00:45:37', 0, 7, '贵州省遵义市道真仡佬族苗族自治县', 2, '道真仡佬族苗族自治县', ',2481,2498,', 2498);\nINSERT INTO `area` VALUES (2506, '2015-10-19 00:45:38', '2015-10-19 00:45:38', 0, 8, '贵州省遵义市务川仡佬族苗族自治县', 2, '务川仡佬族苗族自治县', ',2481,2498,', 2498);\nINSERT INTO `area` VALUES (2507, '2015-10-19 00:45:39', '2015-10-19 00:45:39', 0, 9, '贵州省遵义市凤冈县', 2, '凤冈县', ',2481,2498,', 2498);\nINSERT INTO `area` VALUES (2508, '2015-10-19 00:45:40', '2015-10-19 00:45:40', 0, 10, '贵州省遵义市湄潭县', 2, '湄潭县', ',2481,2498,', 2498);\nINSERT INTO `area` VALUES (2509, '2015-10-19 00:45:41', '2015-10-19 00:45:41', 0, 11, '贵州省遵义市余庆县', 2, '余庆县', ',2481,2498,', 2498);\nINSERT INTO `area` VALUES (2510, '2015-10-19 00:45:42', '2015-10-19 00:45:42', 0, 12, '贵州省遵义市习水县', 2, '习水县', ',2481,2498,', 2498);\nINSERT INTO `area` VALUES (2511, '2015-10-19 00:45:43', '2015-10-19 00:45:43', 0, 13, '贵州省遵义市赤水市', 2, '赤水市', ',2481,2498,', 2498);\nINSERT INTO `area` VALUES (2512, '2015-10-19 00:45:44', '2015-10-19 00:45:44', 0, 14, '贵州省遵义市仁怀市', 2, '仁怀市', ',2481,2498,', 2498);\nINSERT INTO `area` VALUES (2513, '2015-10-19 00:45:45', '2015-10-19 00:45:45', 0, 4, '贵州省安顺市', 1, '安顺市', ',2481,', 2481);\nINSERT INTO `area` VALUES (2514, '2015-10-19 00:45:46', '2015-10-19 00:45:46', 0, 1, '贵州省安顺市西秀区', 2, '西秀区', ',2481,2513,', 2513);\nINSERT INTO `area` VALUES (2515, '2015-10-19 00:45:47', '2015-10-19 00:45:47', 0, 2, '贵州省安顺市平坝县', 2, '平坝县', ',2481,2513,', 2513);\nINSERT INTO `area` VALUES (2516, '2015-10-19 00:45:48', '2015-10-19 00:45:48', 0, 3, '贵州省安顺市普定县', 2, '普定县', ',2481,2513,', 2513);\nINSERT INTO `area` VALUES (2517, '2015-10-19 00:45:49', '2015-10-19 00:45:49', 0, 4, '贵州省安顺市镇宁布依族苗族自治县', 2, '镇宁布依族苗族自治县', ',2481,2513,', 2513);\nINSERT INTO `area` VALUES (2518, '2015-10-19 00:45:50', '2015-10-19 00:45:50', 0, 5, '贵州省安顺市关岭布依族苗族自治县', 2, '关岭布依族苗族自治县', ',2481,2513,', 2513);\nINSERT INTO `area` VALUES (2519, '2015-10-19 00:45:51', '2015-10-19 00:45:51', 0, 6, '贵州省安顺市紫云苗族布依族自治县', 2, '紫云苗族布依族自治县', ',2481,2513,', 2513);\nINSERT INTO `area` VALUES (2520, '2015-10-19 00:45:52', '2015-10-19 00:45:52', 0, 5, '贵州省毕节市', 1, '毕节市', ',2481,', 2481);\nINSERT INTO `area` VALUES (2521, '2015-10-19 00:45:53', '2015-10-19 00:45:53', 0, 1, '贵州省毕节市七星关区', 2, '七星关区', ',2481,2520,', 2520);\nINSERT INTO `area` VALUES (2522, '2015-10-19 00:45:54', '2015-10-19 00:45:54', 0, 2, '贵州省毕节市大方县', 2, '大方县', ',2481,2520,', 2520);\nINSERT INTO `area` VALUES (2523, '2015-10-19 00:45:55', '2015-10-19 00:45:55', 0, 3, '贵州省毕节市黔西县', 2, '黔西县', ',2481,2520,', 2520);\nINSERT INTO `area` VALUES (2524, '2015-10-19 00:45:56', '2015-10-19 00:45:56', 0, 4, '贵州省毕节市金沙县', 2, '金沙县', ',2481,2520,', 2520);\nINSERT INTO `area` VALUES (2525, '2015-10-19 00:45:57', '2015-10-19 00:45:57', 0, 5, '贵州省毕节市织金县', 2, '织金县', ',2481,2520,', 2520);\nINSERT INTO `area` VALUES (2526, '2015-10-19 00:45:58', '2015-10-19 00:45:58', 0, 6, '贵州省毕节市纳雍县', 2, '纳雍县', ',2481,2520,', 2520);\nINSERT INTO `area` VALUES (2527, '2015-10-19 00:45:59', '2015-10-19 00:45:59', 0, 7, '贵州省毕节市威宁彝族回族苗族自治县', 2, '威宁彝族回族苗族自治县', ',2481,2520,', 2520);\nINSERT INTO `area` VALUES (2528, '2015-10-19 00:46:00', '2015-10-19 00:46:00', 0, 8, '贵州省毕节市赫章县', 2, '赫章县', ',2481,2520,', 2520);\nINSERT INTO `area` VALUES (2529, '2015-10-19 00:46:01', '2015-10-19 00:46:01', 0, 6, '贵州省铜仁市', 1, '铜仁市', ',2481,', 2481);\nINSERT INTO `area` VALUES (2530, '2015-10-19 00:46:02', '2015-10-19 00:46:02', 0, 1, '贵州省铜仁市碧江区', 2, '碧江区', ',2481,2529,', 2529);\nINSERT INTO `area` VALUES (2531, '2015-10-19 00:46:03', '2015-10-19 00:46:03', 0, 2, '贵州省铜仁市万山区', 2, '万山区', ',2481,2529,', 2529);\nINSERT INTO `area` VALUES (2532, '2015-10-19 00:46:04', '2015-10-19 00:46:04', 0, 3, '贵州省铜仁市江口县', 2, '江口县', ',2481,2529,', 2529);\nINSERT INTO `area` VALUES (2533, '2015-10-19 00:46:05', '2015-10-19 00:46:05', 0, 4, '贵州省铜仁市玉屏侗族自治县', 2, '玉屏侗族自治县', ',2481,2529,', 2529);\nINSERT INTO `area` VALUES (2534, '2015-10-19 00:46:06', '2015-10-19 00:46:06', 0, 5, '贵州省铜仁市石阡县', 2, '石阡县', ',2481,2529,', 2529);\nINSERT INTO `area` VALUES (2535, '2015-10-19 00:46:07', '2015-10-19 00:46:07', 0, 6, '贵州省铜仁市思南县', 2, '思南县', ',2481,2529,', 2529);\nINSERT INTO `area` VALUES (2536, '2015-10-19 00:46:08', '2015-10-19 00:46:08', 0, 7, '贵州省铜仁市印江土家族苗族自治县', 2, '印江土家族苗族自治县', ',2481,2529,', 2529);\nINSERT INTO `area` VALUES (2537, '2015-10-19 00:46:09', '2015-10-19 00:46:09', 0, 8, '贵州省铜仁市德江县', 2, '德江县', ',2481,2529,', 2529);\nINSERT INTO `area` VALUES (2538, '2015-10-19 00:46:10', '2015-10-19 00:46:10', 0, 9, '贵州省铜仁市沿河土家族自治县', 2, '沿河土家族自治县', ',2481,2529,', 2529);\nINSERT INTO `area` VALUES (2539, '2015-10-19 00:46:11', '2015-10-19 00:46:11', 0, 10, '贵州省铜仁市松桃苗族自治县', 2, '松桃苗族自治县', ',2481,2529,', 2529);\nINSERT INTO `area` VALUES (2540, '2015-10-19 00:46:12', '2015-10-19 00:46:12', 0, 7, '贵州省黔西南布依族苗族自治州', 1, '黔西南布依族苗族自治州', ',2481,', 2481);\nINSERT INTO `area` VALUES (2541, '2015-10-19 00:46:13', '2015-10-19 00:46:13', 0, 1, '贵州省黔西南布依族苗族自治州兴义市', 2, '兴义市', ',2481,2540,', 2540);\nINSERT INTO `area` VALUES (2542, '2015-10-19 00:46:14', '2015-10-19 00:46:14', 0, 2, '贵州省黔西南布依族苗族自治州兴仁县', 2, '兴仁县', ',2481,2540,', 2540);\nINSERT INTO `area` VALUES (2543, '2015-10-19 00:46:15', '2015-10-19 00:46:15', 0, 3, '贵州省黔西南布依族苗族自治州普安县', 2, '普安县', ',2481,2540,', 2540);\nINSERT INTO `area` VALUES (2544, '2015-10-19 00:46:16', '2015-10-19 00:46:16', 0, 4, '贵州省黔西南布依族苗族自治州晴隆县', 2, '晴隆县', ',2481,2540,', 2540);\nINSERT INTO `area` VALUES (2545, '2015-10-19 00:46:17', '2015-10-19 00:46:17', 0, 5, '贵州省黔西南布依族苗族自治州贞丰县', 2, '贞丰县', ',2481,2540,', 2540);\nINSERT INTO `area` VALUES (2546, '2015-10-19 00:46:18', '2015-10-19 00:46:18', 0, 6, '贵州省黔西南布依族苗族自治州望谟县', 2, '望谟县', ',2481,2540,', 2540);\nINSERT INTO `area` VALUES (2547, '2015-10-19 00:46:19', '2015-10-19 00:46:19', 0, 7, '贵州省黔西南布依族苗族自治州册亨县', 2, '册亨县', ',2481,2540,', 2540);\nINSERT INTO `area` VALUES (2548, '2015-10-19 00:46:20', '2015-10-19 00:46:20', 0, 8, '贵州省黔西南布依族苗族自治州安龙县', 2, '安龙县', ',2481,2540,', 2540);\nINSERT INTO `area` VALUES (2549, '2015-10-19 00:46:21', '2015-10-19 00:46:21', 0, 8, '贵州省黔东南苗族侗族自治州', 1, '黔东南苗族侗族自治州', ',2481,', 2481);\nINSERT INTO `area` VALUES (2550, '2015-10-19 00:46:22', '2015-10-19 00:46:22', 0, 1, '贵州省黔东南苗族侗族自治州凯里市', 2, '凯里市', ',2481,2549,', 2549);\nINSERT INTO `area` VALUES (2551, '2015-10-19 00:46:23', '2015-10-19 00:46:23', 0, 2, '贵州省黔东南苗族侗族自治州黄平县', 2, '黄平县', ',2481,2549,', 2549);\nINSERT INTO `area` VALUES (2552, '2015-10-19 00:46:24', '2015-10-19 00:46:24', 0, 3, '贵州省黔东南苗族侗族自治州施秉县', 2, '施秉县', ',2481,2549,', 2549);\nINSERT INTO `area` VALUES (2553, '2015-10-19 00:46:25', '2015-10-19 00:46:25', 0, 4, '贵州省黔东南苗族侗族自治州三穗县', 2, '三穗县', ',2481,2549,', 2549);\nINSERT INTO `area` VALUES (2554, '2015-10-19 00:46:26', '2015-10-19 00:46:26', 0, 5, '贵州省黔东南苗族侗族自治州镇远县', 2, '镇远县', ',2481,2549,', 2549);\nINSERT INTO `area` VALUES (2555, '2015-10-19 00:46:27', '2015-10-19 00:46:27', 0, 6, '贵州省黔东南苗族侗族自治州岑巩县', 2, '岑巩县', ',2481,2549,', 2549);\nINSERT INTO `area` VALUES (2556, '2015-10-19 00:46:28', '2015-10-19 00:46:28', 0, 7, '贵州省黔东南苗族侗族自治州天柱县', 2, '天柱县', ',2481,2549,', 2549);\nINSERT INTO `area` VALUES (2557, '2015-10-19 00:46:29', '2015-10-19 00:46:29', 0, 8, '贵州省黔东南苗族侗族自治州锦屏县', 2, '锦屏县', ',2481,2549,', 2549);\nINSERT INTO `area` VALUES (2558, '2015-10-19 00:46:30', '2015-10-19 00:46:30', 0, 9, '贵州省黔东南苗族侗族自治州剑河县', 2, '剑河县', ',2481,2549,', 2549);\nINSERT INTO `area` VALUES (2559, '2015-10-19 00:46:31', '2015-10-19 00:46:31', 0, 10, '贵州省黔东南苗族侗族自治州台江县', 2, '台江县', ',2481,2549,', 2549);\nINSERT INTO `area` VALUES (2560, '2015-10-19 00:46:32', '2015-10-19 00:46:32', 0, 11, '贵州省黔东南苗族侗族自治州黎平县', 2, '黎平县', ',2481,2549,', 2549);\nINSERT INTO `area` VALUES (2561, '2015-10-19 00:46:33', '2015-10-19 00:46:33', 0, 12, '贵州省黔东南苗族侗族自治州榕江县', 2, '榕江县', ',2481,2549,', 2549);\nINSERT INTO `area` VALUES (2562, '2015-10-19 00:46:34', '2015-10-19 00:46:34', 0, 13, '贵州省黔东南苗族侗族自治州从江县', 2, '从江县', ',2481,2549,', 2549);\nINSERT INTO `area` VALUES (2563, '2015-10-19 00:46:35', '2015-10-19 00:46:35', 0, 14, '贵州省黔东南苗族侗族自治州雷山县', 2, '雷山县', ',2481,2549,', 2549);\nINSERT INTO `area` VALUES (2564, '2015-10-19 00:46:36', '2015-10-19 00:46:36', 0, 15, '贵州省黔东南苗族侗族自治州麻江县', 2, '麻江县', ',2481,2549,', 2549);\nINSERT INTO `area` VALUES (2565, '2015-10-19 00:46:37', '2015-10-19 00:46:37', 0, 16, '贵州省黔东南苗族侗族自治州丹寨县', 2, '丹寨县', ',2481,2549,', 2549);\nINSERT INTO `area` VALUES (2566, '2015-10-19 00:46:38', '2015-10-19 00:46:38', 0, 9, '贵州省黔南布依族苗族自治州', 1, '黔南布依族苗族自治州', ',2481,', 2481);\nINSERT INTO `area` VALUES (2567, '2015-10-19 00:46:39', '2015-10-19 00:46:39', 0, 1, '贵州省黔南布依族苗族自治州都匀市', 2, '都匀市', ',2481,2566,', 2566);\nINSERT INTO `area` VALUES (2568, '2015-10-19 00:46:40', '2015-10-19 00:46:40', 0, 2, '贵州省黔南布依族苗族自治州福泉市', 2, '福泉市', ',2481,2566,', 2566);\nINSERT INTO `area` VALUES (2569, '2015-10-19 00:46:41', '2015-10-19 00:46:41', 0, 3, '贵州省黔南布依族苗族自治州荔波县', 2, '荔波县', ',2481,2566,', 2566);\nINSERT INTO `area` VALUES (2570, '2015-10-19 00:46:42', '2015-10-19 00:46:42', 0, 4, '贵州省黔南布依族苗族自治州贵定县', 2, '贵定县', ',2481,2566,', 2566);\nINSERT INTO `area` VALUES (2571, '2015-10-19 00:46:43', '2015-10-19 00:46:43', 0, 5, '贵州省黔南布依族苗族自治州瓮安县', 2, '瓮安县', ',2481,2566,', 2566);\nINSERT INTO `area` VALUES (2572, '2015-10-19 00:46:44', '2015-10-19 00:46:44', 0, 6, '贵州省黔南布依族苗族自治州独山县', 2, '独山县', ',2481,2566,', 2566);\nINSERT INTO `area` VALUES (2573, '2015-10-19 00:46:45', '2015-10-19 00:46:45', 0, 7, '贵州省黔南布依族苗族自治州平塘县', 2, '平塘县', ',2481,2566,', 2566);\nINSERT INTO `area` VALUES (2574, '2015-10-19 00:46:46', '2015-10-19 00:46:46', 0, 8, '贵州省黔南布依族苗族自治州罗甸县', 2, '罗甸县', ',2481,2566,', 2566);\nINSERT INTO `area` VALUES (2575, '2015-10-19 00:46:47', '2015-10-19 00:46:47', 0, 9, '贵州省黔南布依族苗族自治州长顺县', 2, '长顺县', ',2481,2566,', 2566);\nINSERT INTO `area` VALUES (2576, '2015-10-19 00:46:48', '2015-10-19 00:46:48', 0, 10, '贵州省黔南布依族苗族自治州龙里县', 2, '龙里县', ',2481,2566,', 2566);\nINSERT INTO `area` VALUES (2577, '2015-10-19 00:46:49', '2015-10-19 00:46:49', 0, 11, '贵州省黔南布依族苗族自治州惠水县', 2, '惠水县', ',2481,2566,', 2566);\nINSERT INTO `area` VALUES (2578, '2015-10-19 00:46:50', '2015-10-19 00:46:50', 0, 12, '贵州省黔南布依族苗族自治州三都水族自治县', 2, '三都水族自治县', ',2481,2566,', 2566);\nINSERT INTO `area` VALUES (2579, '2015-10-19 00:46:51', '2015-10-19 00:46:51', 0, 25, '云南省', 0, '云南省', ',', NULL);\nINSERT INTO `area` VALUES (2580, '2015-10-19 00:46:52', '2015-10-19 00:46:52', 0, 1, '云南省昆明市', 1, '昆明市', ',2579,', 2579);\nINSERT INTO `area` VALUES (2581, '2015-10-19 00:46:53', '2015-10-19 00:46:53', 0, 1, '云南省昆明市五华区', 2, '五华区', ',2579,2580,', 2580);\nINSERT INTO `area` VALUES (2582, '2015-10-19 00:46:54', '2015-10-19 00:46:54', 0, 2, '云南省昆明市盘龙区', 2, '盘龙区', ',2579,2580,', 2580);\nINSERT INTO `area` VALUES (2583, '2015-10-19 00:46:55', '2015-10-19 00:46:55', 0, 3, '云南省昆明市官渡区', 2, '官渡区', ',2579,2580,', 2580);\nINSERT INTO `area` VALUES (2584, '2015-10-19 00:46:56', '2015-10-19 00:46:56', 0, 4, '云南省昆明市西山区', 2, '西山区', ',2579,2580,', 2580);\nINSERT INTO `area` VALUES (2585, '2015-10-19 00:46:57', '2015-10-19 00:46:57', 0, 5, '云南省昆明市东川区', 2, '东川区', ',2579,2580,', 2580);\nINSERT INTO `area` VALUES (2586, '2015-10-19 00:46:58', '2015-10-19 00:46:58', 0, 6, '云南省昆明市呈贡区', 2, '呈贡区', ',2579,2580,', 2580);\nINSERT INTO `area` VALUES (2587, '2015-10-19 00:46:59', '2015-10-19 00:46:59', 0, 7, '云南省昆明市晋宁县', 2, '晋宁县', ',2579,2580,', 2580);\nINSERT INTO `area` VALUES (2588, '2015-10-19 00:47:00', '2015-10-19 00:47:00', 0, 8, '云南省昆明市富民县', 2, '富民县', ',2579,2580,', 2580);\nINSERT INTO `area` VALUES (2589, '2015-10-19 00:47:01', '2015-10-19 00:47:01', 0, 9, '云南省昆明市宜良县', 2, '宜良县', ',2579,2580,', 2580);\nINSERT INTO `area` VALUES (2590, '2015-10-19 00:47:02', '2015-10-19 00:47:02', 0, 10, '云南省昆明市石林彝族自治县', 2, '石林彝族自治县', ',2579,2580,', 2580);\nINSERT INTO `area` VALUES (2591, '2015-10-19 00:47:03', '2015-10-19 00:47:03', 0, 11, '云南省昆明市嵩明县', 2, '嵩明县', ',2579,2580,', 2580);\nINSERT INTO `area` VALUES (2592, '2015-10-19 00:47:04', '2015-10-19 00:47:04', 0, 12, '云南省昆明市禄劝彝族苗族自治县', 2, '禄劝彝族苗族自治县', ',2579,2580,', 2580);\nINSERT INTO `area` VALUES (2593, '2015-10-19 00:47:05', '2015-10-19 00:47:05', 0, 13, '云南省昆明市寻甸回族彝族自治县', 2, '寻甸回族彝族自治县', ',2579,2580,', 2580);\nINSERT INTO `area` VALUES (2594, '2015-10-19 00:47:06', '2015-10-19 00:47:06', 0, 14, '云南省昆明市安宁市', 2, '安宁市', ',2579,2580,', 2580);\nINSERT INTO `area` VALUES (2595, '2015-10-19 00:47:07', '2015-10-19 00:47:07', 0, 2, '云南省曲靖市', 1, '曲靖市', ',2579,', 2579);\nINSERT INTO `area` VALUES (2596, '2015-10-19 00:47:08', '2015-10-19 00:47:08', 0, 1, '云南省曲靖市麒麟区', 2, '麒麟区', ',2579,2595,', 2595);\nINSERT INTO `area` VALUES (2597, '2015-10-19 00:47:09', '2015-10-19 00:47:09', 0, 2, '云南省曲靖市马龙县', 2, '马龙县', ',2579,2595,', 2595);\nINSERT INTO `area` VALUES (2598, '2015-10-19 00:47:10', '2015-10-19 00:47:10', 0, 3, '云南省曲靖市陆良县', 2, '陆良县', ',2579,2595,', 2595);\nINSERT INTO `area` VALUES (2599, '2015-10-19 00:47:11', '2015-10-19 00:47:11', 0, 4, '云南省曲靖市师宗县', 2, '师宗县', ',2579,2595,', 2595);\nINSERT INTO `area` VALUES (2600, '2015-10-19 00:47:12', '2015-10-19 00:47:12', 0, 5, '云南省曲靖市罗平县', 2, '罗平县', ',2579,2595,', 2595);\nINSERT INTO `area` VALUES (2601, '2015-10-19 00:47:13', '2015-10-19 00:47:13', 0, 6, '云南省曲靖市富源县', 2, '富源县', ',2579,2595,', 2595);\nINSERT INTO `area` VALUES (2602, '2015-10-19 00:47:14', '2015-10-19 00:47:14', 0, 7, '云南省曲靖市会泽县', 2, '会泽县', ',2579,2595,', 2595);\nINSERT INTO `area` VALUES (2603, '2015-10-19 00:47:15', '2015-10-19 00:47:15', 0, 8, '云南省曲靖市沾益县', 2, '沾益县', ',2579,2595,', 2595);\nINSERT INTO `area` VALUES (2604, '2015-10-19 00:47:16', '2015-10-19 00:47:16', 0, 9, '云南省曲靖市宣威市', 2, '宣威市', ',2579,2595,', 2595);\nINSERT INTO `area` VALUES (2605, '2015-10-19 00:47:17', '2015-10-19 00:47:17', 0, 3, '云南省玉溪市', 1, '玉溪市', ',2579,', 2579);\nINSERT INTO `area` VALUES (2606, '2015-10-19 00:47:18', '2015-10-19 00:47:18', 0, 1, '云南省玉溪市红塔区', 2, '红塔区', ',2579,2605,', 2605);\nINSERT INTO `area` VALUES (2607, '2015-10-19 00:47:19', '2015-10-19 00:47:19', 0, 2, '云南省玉溪市江川县', 2, '江川县', ',2579,2605,', 2605);\nINSERT INTO `area` VALUES (2608, '2015-10-19 00:47:20', '2015-10-19 00:47:20', 0, 3, '云南省玉溪市澄江县', 2, '澄江县', ',2579,2605,', 2605);\nINSERT INTO `area` VALUES (2609, '2015-10-19 00:47:21', '2015-10-19 00:47:21', 0, 4, '云南省玉溪市通海县', 2, '通海县', ',2579,2605,', 2605);\nINSERT INTO `area` VALUES (2610, '2015-10-19 00:47:22', '2015-10-19 00:47:22', 0, 5, '云南省玉溪市华宁县', 2, '华宁县', ',2579,2605,', 2605);\nINSERT INTO `area` VALUES (2611, '2015-10-19 00:47:23', '2015-10-19 00:47:23', 0, 6, '云南省玉溪市易门县', 2, '易门县', ',2579,2605,', 2605);\nINSERT INTO `area` VALUES (2612, '2015-10-19 00:47:24', '2015-10-19 00:47:24', 0, 7, '云南省玉溪市峨山彝族自治县', 2, '峨山彝族自治县', ',2579,2605,', 2605);\nINSERT INTO `area` VALUES (2613, '2015-10-19 00:47:25', '2015-10-19 00:47:25', 0, 8, '云南省玉溪市新平彝族傣族自治县', 2, '新平彝族傣族自治县', ',2579,2605,', 2605);\nINSERT INTO `area` VALUES (2614, '2015-10-19 00:47:26', '2015-10-19 00:47:26', 0, 9, '云南省玉溪市元江哈尼族彝族傣族自治县', 2, '元江哈尼族彝族傣族自治县', ',2579,2605,', 2605);\nINSERT INTO `area` VALUES (2615, '2015-10-19 00:47:27', '2015-10-19 00:47:27', 0, 4, '云南省保山市', 1, '保山市', ',2579,', 2579);\nINSERT INTO `area` VALUES (2616, '2015-10-19 00:47:28', '2015-10-19 00:47:28', 0, 1, '云南省保山市隆阳区', 2, '隆阳区', ',2579,2615,', 2615);\nINSERT INTO `area` VALUES (2617, '2015-10-19 00:47:29', '2015-10-19 00:47:29', 0, 2, '云南省保山市施甸县', 2, '施甸县', ',2579,2615,', 2615);\nINSERT INTO `area` VALUES (2618, '2015-10-19 00:47:30', '2015-10-19 00:47:30', 0, 3, '云南省保山市腾冲县', 2, '腾冲县', ',2579,2615,', 2615);\nINSERT INTO `area` VALUES (2619, '2015-10-19 00:47:31', '2015-10-19 00:47:31', 0, 4, '云南省保山市龙陵县', 2, '龙陵县', ',2579,2615,', 2615);\nINSERT INTO `area` VALUES (2620, '2015-10-19 00:47:32', '2015-10-19 00:47:32', 0, 5, '云南省保山市昌宁县', 2, '昌宁县', ',2579,2615,', 2615);\nINSERT INTO `area` VALUES (2621, '2015-10-19 00:47:33', '2015-10-19 00:47:33', 0, 5, '云南省昭通市', 1, '昭通市', ',2579,', 2579);\nINSERT INTO `area` VALUES (2622, '2015-10-19 00:47:34', '2015-10-19 00:47:34', 0, 1, '云南省昭通市昭阳区', 2, '昭阳区', ',2579,2621,', 2621);\nINSERT INTO `area` VALUES (2623, '2015-10-19 00:47:35', '2015-10-19 00:47:35', 0, 2, '云南省昭通市鲁甸县', 2, '鲁甸县', ',2579,2621,', 2621);\nINSERT INTO `area` VALUES (2624, '2015-10-19 00:47:36', '2015-10-19 00:47:36', 0, 3, '云南省昭通市巧家县', 2, '巧家县', ',2579,2621,', 2621);\nINSERT INTO `area` VALUES (2625, '2015-10-19 00:47:37', '2015-10-19 00:47:37', 0, 4, '云南省昭通市盐津县', 2, '盐津县', ',2579,2621,', 2621);\nINSERT INTO `area` VALUES (2626, '2015-10-19 00:47:38', '2015-10-19 00:47:38', 0, 5, '云南省昭通市大关县', 2, '大关县', ',2579,2621,', 2621);\nINSERT INTO `area` VALUES (2627, '2015-10-19 00:47:39', '2015-10-19 00:47:39', 0, 6, '云南省昭通市永善县', 2, '永善县', ',2579,2621,', 2621);\nINSERT INTO `area` VALUES (2628, '2015-10-19 00:47:40', '2015-10-19 00:47:40', 0, 7, '云南省昭通市绥江县', 2, '绥江县', ',2579,2621,', 2621);\nINSERT INTO `area` VALUES (2629, '2015-10-19 00:47:41', '2015-10-19 00:47:41', 0, 8, '云南省昭通市镇雄县', 2, '镇雄县', ',2579,2621,', 2621);\nINSERT INTO `area` VALUES (2630, '2015-10-19 00:47:42', '2015-10-19 00:47:42', 0, 9, '云南省昭通市彝良县', 2, '彝良县', ',2579,2621,', 2621);\nINSERT INTO `area` VALUES (2631, '2015-10-19 00:47:43', '2015-10-19 00:47:43', 0, 10, '云南省昭通市威信县', 2, '威信县', ',2579,2621,', 2621);\nINSERT INTO `area` VALUES (2632, '2015-10-19 00:47:44', '2015-10-19 00:47:44', 0, 11, '云南省昭通市水富县', 2, '水富县', ',2579,2621,', 2621);\nINSERT INTO `area` VALUES (2633, '2015-10-19 00:47:45', '2015-10-19 00:47:45', 0, 6, '云南省丽江市', 1, '丽江市', ',2579,', 2579);\nINSERT INTO `area` VALUES (2634, '2015-10-19 00:47:46', '2015-10-19 00:47:46', 0, 1, '云南省丽江市古城区', 2, '古城区', ',2579,2633,', 2633);\nINSERT INTO `area` VALUES (2635, '2015-10-19 00:47:47', '2015-10-19 00:47:47', 0, 2, '云南省丽江市玉龙纳西族自治县', 2, '玉龙纳西族自治县', ',2579,2633,', 2633);\nINSERT INTO `area` VALUES (2636, '2015-10-19 00:47:48', '2015-10-19 00:47:48', 0, 3, '云南省丽江市永胜县', 2, '永胜县', ',2579,2633,', 2633);\nINSERT INTO `area` VALUES (2637, '2015-10-19 00:47:49', '2015-10-19 00:47:49', 0, 4, '云南省丽江市华坪县', 2, '华坪县', ',2579,2633,', 2633);\nINSERT INTO `area` VALUES (2638, '2015-10-19 00:47:50', '2015-10-19 00:47:50', 0, 5, '云南省丽江市宁蒗彝族自治县', 2, '宁蒗彝族自治县', ',2579,2633,', 2633);\nINSERT INTO `area` VALUES (2639, '2015-10-19 00:47:51', '2015-10-19 00:47:51', 0, 7, '云南省普洱市', 1, '普洱市', ',2579,', 2579);\nINSERT INTO `area` VALUES (2640, '2015-10-19 00:47:52', '2015-10-19 00:47:52', 0, 1, '云南省普洱市思茅区', 2, '思茅区', ',2579,2639,', 2639);\nINSERT INTO `area` VALUES (2641, '2015-10-19 00:47:53', '2015-10-19 00:47:53', 0, 2, '云南省普洱市宁洱哈尼族彝族自治县', 2, '宁洱哈尼族彝族自治县', ',2579,2639,', 2639);\nINSERT INTO `area` VALUES (2642, '2015-10-19 00:47:54', '2015-10-19 00:47:54', 0, 3, '云南省普洱市墨江哈尼族自治县', 2, '墨江哈尼族自治县', ',2579,2639,', 2639);\nINSERT INTO `area` VALUES (2643, '2015-10-19 00:47:55', '2015-10-19 00:47:55', 0, 4, '云南省普洱市景东彝族自治县', 2, '景东彝族自治县', ',2579,2639,', 2639);\nINSERT INTO `area` VALUES (2644, '2015-10-19 00:47:56', '2015-10-19 00:47:56', 0, 5, '云南省普洱市景谷傣族彝族自治县', 2, '景谷傣族彝族自治县', ',2579,2639,', 2639);\nINSERT INTO `area` VALUES (2645, '2015-10-19 00:47:57', '2015-10-19 00:47:57', 0, 6, '云南省普洱市镇沅彝族哈尼族拉祜族自治县', 2, '镇沅彝族哈尼族拉祜族自治县', ',2579,2639,', 2639);\nINSERT INTO `area` VALUES (2646, '2015-10-19 00:47:58', '2015-10-19 00:47:58', 0, 7, '云南省普洱市江城哈尼族彝族自治县', 2, '江城哈尼族彝族自治县', ',2579,2639,', 2639);\nINSERT INTO `area` VALUES (2647, '2015-10-19 00:47:59', '2015-10-19 00:47:59', 0, 8, '云南省普洱市孟连傣族拉祜族佤族自治县', 2, '孟连傣族拉祜族佤族自治县', ',2579,2639,', 2639);\nINSERT INTO `area` VALUES (2648, '2015-10-19 00:48:00', '2015-10-19 00:48:00', 0, 9, '云南省普洱市澜沧拉祜族自治县', 2, '澜沧拉祜族自治县', ',2579,2639,', 2639);\nINSERT INTO `area` VALUES (2649, '2015-10-19 00:48:01', '2015-10-19 00:48:01', 0, 10, '云南省普洱市西盟佤族自治县', 2, '西盟佤族自治县', ',2579,2639,', 2639);\nINSERT INTO `area` VALUES (2650, '2015-10-19 00:48:02', '2015-10-19 00:48:02', 0, 8, '云南省临沧市', 1, '临沧市', ',2579,', 2579);\nINSERT INTO `area` VALUES (2651, '2015-10-19 00:48:03', '2015-10-19 00:48:03', 0, 1, '云南省临沧市临翔区', 2, '临翔区', ',2579,2650,', 2650);\nINSERT INTO `area` VALUES (2652, '2015-10-19 00:48:04', '2015-10-19 00:48:04', 0, 2, '云南省临沧市凤庆县', 2, '凤庆县', ',2579,2650,', 2650);\nINSERT INTO `area` VALUES (2653, '2015-10-19 00:48:05', '2015-10-19 00:48:05', 0, 3, '云南省临沧市云县', 2, '云县', ',2579,2650,', 2650);\nINSERT INTO `area` VALUES (2654, '2015-10-19 00:48:06', '2015-10-19 00:48:06', 0, 4, '云南省临沧市永德县', 2, '永德县', ',2579,2650,', 2650);\nINSERT INTO `area` VALUES (2655, '2015-10-19 00:48:07', '2015-10-19 00:48:07', 0, 5, '云南省临沧市镇康县', 2, '镇康县', ',2579,2650,', 2650);\nINSERT INTO `area` VALUES (2656, '2015-10-19 00:48:08', '2015-10-19 00:48:08', 0, 6, '云南省临沧市双江拉祜族佤族布朗族傣族自治县', 2, '双江拉祜族佤族布朗族傣族自治县', ',2579,2650,', 2650);\nINSERT INTO `area` VALUES (2657, '2015-10-19 00:48:09', '2015-10-19 00:48:09', 0, 7, '云南省临沧市耿马傣族佤族自治县', 2, '耿马傣族佤族自治县', ',2579,2650,', 2650);\nINSERT INTO `area` VALUES (2658, '2015-10-19 00:48:10', '2015-10-19 00:48:10', 0, 8, '云南省临沧市沧源佤族自治县', 2, '沧源佤族自治县', ',2579,2650,', 2650);\nINSERT INTO `area` VALUES (2659, '2015-10-19 00:48:11', '2015-10-19 00:48:11', 0, 9, '云南省楚雄彝族自治州', 1, '楚雄彝族自治州', ',2579,', 2579);\nINSERT INTO `area` VALUES (2660, '2015-10-19 00:48:12', '2015-10-19 00:48:12', 0, 1, '云南省楚雄彝族自治州楚雄市', 2, '楚雄市', ',2579,2659,', 2659);\nINSERT INTO `area` VALUES (2661, '2015-10-19 00:48:13', '2015-10-19 00:48:13', 0, 2, '云南省楚雄彝族自治州双柏县', 2, '双柏县', ',2579,2659,', 2659);\nINSERT INTO `area` VALUES (2662, '2015-10-19 00:48:14', '2015-10-19 00:48:14', 0, 3, '云南省楚雄彝族自治州牟定县', 2, '牟定县', ',2579,2659,', 2659);\nINSERT INTO `area` VALUES (2663, '2015-10-19 00:48:15', '2015-10-19 00:48:15', 0, 4, '云南省楚雄彝族自治州南华县', 2, '南华县', ',2579,2659,', 2659);\nINSERT INTO `area` VALUES (2664, '2015-10-19 00:48:16', '2015-10-19 00:48:16', 0, 5, '云南省楚雄彝族自治州姚安县', 2, '姚安县', ',2579,2659,', 2659);\nINSERT INTO `area` VALUES (2665, '2015-10-19 00:48:17', '2015-10-19 00:48:17', 0, 6, '云南省楚雄彝族自治州大姚县', 2, '大姚县', ',2579,2659,', 2659);\nINSERT INTO `area` VALUES (2666, '2015-10-19 00:48:18', '2015-10-19 00:48:18', 0, 7, '云南省楚雄彝族自治州永仁县', 2, '永仁县', ',2579,2659,', 2659);\nINSERT INTO `area` VALUES (2667, '2015-10-19 00:48:19', '2015-10-19 00:48:19', 0, 8, '云南省楚雄彝族自治州元谋县', 2, '元谋县', ',2579,2659,', 2659);\nINSERT INTO `area` VALUES (2668, '2015-10-19 00:48:20', '2015-10-19 00:48:20', 0, 9, '云南省楚雄彝族自治州武定县', 2, '武定县', ',2579,2659,', 2659);\nINSERT INTO `area` VALUES (2669, '2015-10-19 00:48:21', '2015-10-19 00:48:21', 0, 10, '云南省楚雄彝族自治州禄丰县', 2, '禄丰县', ',2579,2659,', 2659);\nINSERT INTO `area` VALUES (2670, '2015-10-19 00:48:22', '2015-10-19 00:48:22', 0, 10, '云南省红河哈尼族彝族自治州', 1, '红河哈尼族彝族自治州', ',2579,', 2579);\nINSERT INTO `area` VALUES (2671, '2015-10-19 00:48:23', '2015-10-19 00:48:23', 0, 1, '云南省红河哈尼族彝族自治州个旧市', 2, '个旧市', ',2579,2670,', 2670);\nINSERT INTO `area` VALUES (2672, '2015-10-19 00:48:24', '2015-10-19 00:48:24', 0, 2, '云南省红河哈尼族彝族自治州开远市', 2, '开远市', ',2579,2670,', 2670);\nINSERT INTO `area` VALUES (2673, '2015-10-19 00:48:25', '2015-10-19 00:48:25', 0, 3, '云南省红河哈尼族彝族自治州蒙自市', 2, '蒙自市', ',2579,2670,', 2670);\nINSERT INTO `area` VALUES (2674, '2015-10-19 00:48:26', '2015-10-19 00:48:26', 0, 4, '云南省红河哈尼族彝族自治州弥勒市', 2, '弥勒市', ',2579,2670,', 2670);\nINSERT INTO `area` VALUES (2675, '2015-10-19 00:48:27', '2015-10-19 00:48:27', 0, 5, '云南省红河哈尼族彝族自治州屏边苗族自治县', 2, '屏边苗族自治县', ',2579,2670,', 2670);\nINSERT INTO `area` VALUES (2676, '2015-10-19 00:48:28', '2015-10-19 00:48:28', 0, 6, '云南省红河哈尼族彝族自治州建水县', 2, '建水县', ',2579,2670,', 2670);\nINSERT INTO `area` VALUES (2677, '2015-10-19 00:48:29', '2015-10-19 00:48:29', 0, 7, '云南省红河哈尼族彝族自治州石屏县', 2, '石屏县', ',2579,2670,', 2670);\nINSERT INTO `area` VALUES (2678, '2015-10-19 00:48:30', '2015-10-19 00:48:30', 0, 8, '云南省红河哈尼族彝族自治州泸西县', 2, '泸西县', ',2579,2670,', 2670);\nINSERT INTO `area` VALUES (2679, '2015-10-19 00:48:31', '2015-10-19 00:48:31', 0, 9, '云南省红河哈尼族彝族自治州元阳县', 2, '元阳县', ',2579,2670,', 2670);\nINSERT INTO `area` VALUES (2680, '2015-10-19 00:48:32', '2015-10-19 00:48:32', 0, 10, '云南省红河哈尼族彝族自治州红河县', 2, '红河县', ',2579,2670,', 2670);\nINSERT INTO `area` VALUES (2681, '2015-10-19 00:48:33', '2015-10-19 00:48:33', 0, 11, '云南省红河哈尼族彝族自治州金平苗族瑶族傣族自治县', 2, '金平苗族瑶族傣族自治县', ',2579,2670,', 2670);\nINSERT INTO `area` VALUES (2682, '2015-10-19 00:48:34', '2015-10-19 00:48:34', 0, 12, '云南省红河哈尼族彝族自治州绿春县', 2, '绿春县', ',2579,2670,', 2670);\nINSERT INTO `area` VALUES (2683, '2015-10-19 00:48:35', '2015-10-19 00:48:35', 0, 13, '云南省红河哈尼族彝族自治州河口瑶族自治县', 2, '河口瑶族自治县', ',2579,2670,', 2670);\nINSERT INTO `area` VALUES (2684, '2015-10-19 00:48:36', '2015-10-19 00:48:36', 0, 11, '云南省文山壮族苗族自治州', 1, '文山壮族苗族自治州', ',2579,', 2579);\nINSERT INTO `area` VALUES (2685, '2015-10-19 00:48:37', '2015-10-19 00:48:37', 0, 1, '云南省文山壮族苗族自治州文山市', 2, '文山市', ',2579,2684,', 2684);\nINSERT INTO `area` VALUES (2686, '2015-10-19 00:48:38', '2015-10-19 00:48:38', 0, 2, '云南省文山壮族苗族自治州砚山县', 2, '砚山县', ',2579,2684,', 2684);\nINSERT INTO `area` VALUES (2687, '2015-10-19 00:48:39', '2015-10-19 00:48:39', 0, 3, '云南省文山壮族苗族自治州西畴县', 2, '西畴县', ',2579,2684,', 2684);\nINSERT INTO `area` VALUES (2688, '2015-10-19 00:48:40', '2015-10-19 00:48:40', 0, 4, '云南省文山壮族苗族自治州麻栗坡县', 2, '麻栗坡县', ',2579,2684,', 2684);\nINSERT INTO `area` VALUES (2689, '2015-10-19 00:48:41', '2015-10-19 00:48:41', 0, 5, '云南省文山壮族苗族自治州马关县', 2, '马关县', ',2579,2684,', 2684);\nINSERT INTO `area` VALUES (2690, '2015-10-19 00:48:42', '2015-10-19 00:48:42', 0, 6, '云南省文山壮族苗族自治州丘北县', 2, '丘北县', ',2579,2684,', 2684);\nINSERT INTO `area` VALUES (2691, '2015-10-19 00:48:43', '2015-10-19 00:48:43', 0, 7, '云南省文山壮族苗族自治州广南县', 2, '广南县', ',2579,2684,', 2684);\nINSERT INTO `area` VALUES (2692, '2015-10-19 00:48:44', '2015-10-19 00:48:44', 0, 8, '云南省文山壮族苗族自治州富宁县', 2, '富宁县', ',2579,2684,', 2684);\nINSERT INTO `area` VALUES (2693, '2015-10-19 00:48:45', '2015-10-19 00:48:45', 0, 12, '云南省西双版纳傣族自治州', 1, '西双版纳傣族自治州', ',2579,', 2579);\nINSERT INTO `area` VALUES (2694, '2015-10-19 00:48:46', '2015-10-19 00:48:46', 0, 1, '云南省西双版纳傣族自治州景洪市', 2, '景洪市', ',2579,2693,', 2693);\nINSERT INTO `area` VALUES (2695, '2015-10-19 00:48:47', '2015-10-19 00:48:47', 0, 2, '云南省西双版纳傣族自治州勐海县', 2, '勐海县', ',2579,2693,', 2693);\nINSERT INTO `area` VALUES (2696, '2015-10-19 00:48:48', '2015-10-19 00:48:48', 0, 3, '云南省西双版纳傣族自治州勐腊县', 2, '勐腊县', ',2579,2693,', 2693);\nINSERT INTO `area` VALUES (2697, '2015-10-19 00:48:49', '2015-10-19 00:48:49', 0, 13, '云南省大理白族自治州', 1, '大理白族自治州', ',2579,', 2579);\nINSERT INTO `area` VALUES (2698, '2015-10-19 00:48:50', '2015-10-19 00:48:50', 0, 1, '云南省大理白族自治州大理市', 2, '大理市', ',2579,2697,', 2697);\nINSERT INTO `area` VALUES (2699, '2015-10-19 00:48:51', '2015-10-19 00:48:51', 0, 2, '云南省大理白族自治州漾濞彝族自治县', 2, '漾濞彝族自治县', ',2579,2697,', 2697);\nINSERT INTO `area` VALUES (2700, '2015-10-19 00:48:52', '2015-10-19 00:48:52', 0, 3, '云南省大理白族自治州祥云县', 2, '祥云县', ',2579,2697,', 2697);\nINSERT INTO `area` VALUES (2701, '2015-10-19 00:48:53', '2015-10-19 00:48:53', 0, 4, '云南省大理白族自治州宾川县', 2, '宾川县', ',2579,2697,', 2697);\nINSERT INTO `area` VALUES (2702, '2015-10-19 00:48:54', '2015-10-19 00:48:54', 0, 5, '云南省大理白族自治州弥渡县', 2, '弥渡县', ',2579,2697,', 2697);\nINSERT INTO `area` VALUES (2703, '2015-10-19 00:48:55', '2015-10-19 00:48:55', 0, 6, '云南省大理白族自治州南涧彝族自治县', 2, '南涧彝族自治县', ',2579,2697,', 2697);\nINSERT INTO `area` VALUES (2704, '2015-10-19 00:48:56', '2015-10-19 00:48:56', 0, 7, '云南省大理白族自治州巍山彝族回族自治县', 2, '巍山彝族回族自治县', ',2579,2697,', 2697);\nINSERT INTO `area` VALUES (2705, '2015-10-19 00:48:57', '2015-10-19 00:48:57', 0, 8, '云南省大理白族自治州永平县', 2, '永平县', ',2579,2697,', 2697);\nINSERT INTO `area` VALUES (2706, '2015-10-19 00:48:58', '2015-10-19 00:48:58', 0, 9, '云南省大理白族自治州云龙县', 2, '云龙县', ',2579,2697,', 2697);\nINSERT INTO `area` VALUES (2707, '2015-10-19 00:48:59', '2015-10-19 00:48:59', 0, 10, '云南省大理白族自治州洱源县', 2, '洱源县', ',2579,2697,', 2697);\nINSERT INTO `area` VALUES (2708, '2015-10-19 00:49:00', '2015-10-19 00:49:00', 0, 11, '云南省大理白族自治州剑川县', 2, '剑川县', ',2579,2697,', 2697);\nINSERT INTO `area` VALUES (2709, '2015-10-19 00:49:01', '2015-10-19 00:49:01', 0, 12, '云南省大理白族自治州鹤庆县', 2, '鹤庆县', ',2579,2697,', 2697);\nINSERT INTO `area` VALUES (2710, '2015-10-19 00:49:02', '2015-10-19 00:49:02', 0, 14, '云南省德宏傣族景颇族自治州', 1, '德宏傣族景颇族自治州', ',2579,', 2579);\nINSERT INTO `area` VALUES (2711, '2015-10-19 00:49:03', '2015-10-19 00:49:03', 0, 1, '云南省德宏傣族景颇族自治州瑞丽市', 2, '瑞丽市', ',2579,2710,', 2710);\nINSERT INTO `area` VALUES (2712, '2015-10-19 00:49:04', '2015-10-19 00:49:04', 0, 2, '云南省德宏傣族景颇族自治州芒市', 2, '芒市', ',2579,2710,', 2710);\nINSERT INTO `area` VALUES (2713, '2015-10-19 00:49:05', '2015-10-19 00:49:05', 0, 3, '云南省德宏傣族景颇族自治州梁河县', 2, '梁河县', ',2579,2710,', 2710);\nINSERT INTO `area` VALUES (2714, '2015-10-19 00:49:06', '2015-10-19 00:49:06', 0, 4, '云南省德宏傣族景颇族自治州盈江县', 2, '盈江县', ',2579,2710,', 2710);\nINSERT INTO `area` VALUES (2715, '2015-10-19 00:49:07', '2015-10-19 00:49:07', 0, 5, '云南省德宏傣族景颇族自治州陇川县', 2, '陇川县', ',2579,2710,', 2710);\nINSERT INTO `area` VALUES (2716, '2015-10-19 00:49:08', '2015-10-19 00:49:08', 0, 15, '云南省怒江傈僳族自治州', 1, '怒江傈僳族自治州', ',2579,', 2579);\nINSERT INTO `area` VALUES (2717, '2015-10-19 00:49:09', '2015-10-19 00:49:09', 0, 1, '云南省怒江傈僳族自治州泸水县', 2, '泸水县', ',2579,2716,', 2716);\nINSERT INTO `area` VALUES (2718, '2015-10-19 00:49:10', '2015-10-19 00:49:10', 0, 2, '云南省怒江傈僳族自治州福贡县', 2, '福贡县', ',2579,2716,', 2716);\nINSERT INTO `area` VALUES (2719, '2015-10-19 00:49:11', '2015-10-19 00:49:11', 0, 3, '云南省怒江傈僳族自治州贡山独龙族怒族自治县', 2, '贡山独龙族怒族自治县', ',2579,2716,', 2716);\nINSERT INTO `area` VALUES (2720, '2015-10-19 00:49:12', '2015-10-19 00:49:12', 0, 4, '云南省怒江傈僳族自治州兰坪白族普米族自治县', 2, '兰坪白族普米族自治县', ',2579,2716,', 2716);\nINSERT INTO `area` VALUES (2721, '2015-10-19 00:49:13', '2015-10-19 00:49:13', 0, 16, '云南省迪庆藏族自治州', 1, '迪庆藏族自治州', ',2579,', 2579);\nINSERT INTO `area` VALUES (2722, '2015-10-19 00:49:14', '2015-10-19 00:49:14', 0, 1, '云南省迪庆藏族自治州香格里拉县', 2, '香格里拉县', ',2579,2721,', 2721);\nINSERT INTO `area` VALUES (2723, '2015-10-19 00:49:15', '2015-10-19 00:49:15', 0, 2, '云南省迪庆藏族自治州德钦县', 2, '德钦县', ',2579,2721,', 2721);\nINSERT INTO `area` VALUES (2724, '2015-10-19 00:49:16', '2015-10-19 00:49:16', 0, 3, '云南省迪庆藏族自治州维西傈僳族自治县', 2, '维西傈僳族自治县', ',2579,2721,', 2721);\nINSERT INTO `area` VALUES (2725, '2015-10-19 00:49:17', '2015-10-19 00:49:17', 0, 26, '西藏自治区', 0, '西藏自治区', ',', NULL);\nINSERT INTO `area` VALUES (2726, '2015-10-19 00:49:18', '2015-10-19 00:49:18', 0, 1, '西藏自治区拉萨市', 1, '拉萨市', ',2725,', 2725);\nINSERT INTO `area` VALUES (2727, '2015-10-19 00:49:19', '2015-10-19 00:49:19', 0, 1, '西藏自治区拉萨市城关区', 2, '城关区', ',2725,2726,', 2726);\nINSERT INTO `area` VALUES (2728, '2015-10-19 00:49:20', '2015-10-19 00:49:20', 0, 2, '西藏自治区拉萨市林周县', 2, '林周县', ',2725,2726,', 2726);\nINSERT INTO `area` VALUES (2729, '2015-10-19 00:49:21', '2015-10-19 00:49:21', 0, 3, '西藏自治区拉萨市当雄县', 2, '当雄县', ',2725,2726,', 2726);\nINSERT INTO `area` VALUES (2730, '2015-10-19 00:49:22', '2015-10-19 00:49:22', 0, 4, '西藏自治区拉萨市尼木县', 2, '尼木县', ',2725,2726,', 2726);\nINSERT INTO `area` VALUES (2731, '2015-10-19 00:49:23', '2015-10-19 00:49:23', 0, 5, '西藏自治区拉萨市曲水县', 2, '曲水县', ',2725,2726,', 2726);\nINSERT INTO `area` VALUES (2732, '2015-10-19 00:49:24', '2015-10-19 00:49:24', 0, 6, '西藏自治区拉萨市堆龙德庆县', 2, '堆龙德庆县', ',2725,2726,', 2726);\nINSERT INTO `area` VALUES (2733, '2015-10-19 00:49:25', '2015-10-19 00:49:25', 0, 7, '西藏自治区拉萨市达孜县', 2, '达孜县', ',2725,2726,', 2726);\nINSERT INTO `area` VALUES (2734, '2015-10-19 00:49:26', '2015-10-19 00:49:26', 0, 8, '西藏自治区拉萨市墨竹工卡县', 2, '墨竹工卡县', ',2725,2726,', 2726);\nINSERT INTO `area` VALUES (2735, '2015-10-19 00:49:27', '2015-10-19 00:49:27', 0, 2, '西藏自治区昌都地区', 1, '昌都地区', ',2725,', 2725);\nINSERT INTO `area` VALUES (2736, '2015-10-19 00:49:28', '2015-10-19 00:49:28', 0, 1, '西藏自治区昌都地区昌都县', 2, '昌都县', ',2725,2735,', 2735);\nINSERT INTO `area` VALUES (2737, '2015-10-19 00:49:29', '2015-10-19 00:49:29', 0, 2, '西藏自治区昌都地区江达县', 2, '江达县', ',2725,2735,', 2735);\nINSERT INTO `area` VALUES (2738, '2015-10-19 00:49:30', '2015-10-19 00:49:30', 0, 3, '西藏自治区昌都地区贡觉县', 2, '贡觉县', ',2725,2735,', 2735);\nINSERT INTO `area` VALUES (2739, '2015-10-19 00:49:31', '2015-10-19 00:49:31', 0, 4, '西藏自治区昌都地区类乌齐县', 2, '类乌齐县', ',2725,2735,', 2735);\nINSERT INTO `area` VALUES (2740, '2015-10-19 00:49:32', '2015-10-19 00:49:32', 0, 5, '西藏自治区昌都地区丁青县', 2, '丁青县', ',2725,2735,', 2735);\nINSERT INTO `area` VALUES (2741, '2015-10-19 00:49:33', '2015-10-19 00:49:33', 0, 6, '西藏自治区昌都地区察雅县', 2, '察雅县', ',2725,2735,', 2735);\nINSERT INTO `area` VALUES (2742, '2015-10-19 00:49:34', '2015-10-19 00:49:34', 0, 7, '西藏自治区昌都地区八宿县', 2, '八宿县', ',2725,2735,', 2735);\nINSERT INTO `area` VALUES (2743, '2015-10-19 00:49:35', '2015-10-19 00:49:35', 0, 8, '西藏自治区昌都地区左贡县', 2, '左贡县', ',2725,2735,', 2735);\nINSERT INTO `area` VALUES (2744, '2015-10-19 00:49:36', '2015-10-19 00:49:36', 0, 9, '西藏自治区昌都地区芒康县', 2, '芒康县', ',2725,2735,', 2735);\nINSERT INTO `area` VALUES (2745, '2015-10-19 00:49:37', '2015-10-19 00:49:37', 0, 10, '西藏自治区昌都地区洛隆县', 2, '洛隆县', ',2725,2735,', 2735);\nINSERT INTO `area` VALUES (2746, '2015-10-19 00:49:38', '2015-10-19 00:49:38', 0, 11, '西藏自治区昌都地区边坝县', 2, '边坝县', ',2725,2735,', 2735);\nINSERT INTO `area` VALUES (2747, '2015-10-19 00:49:39', '2015-10-19 00:49:39', 0, 3, '西藏自治区山南地区', 1, '山南地区', ',2725,', 2725);\nINSERT INTO `area` VALUES (2748, '2015-10-19 00:49:40', '2015-10-19 00:49:40', 0, 1, '西藏自治区山南地区乃东县', 2, '乃东县', ',2725,2747,', 2747);\nINSERT INTO `area` VALUES (2749, '2015-10-19 00:49:41', '2015-10-19 00:49:41', 0, 2, '西藏自治区山南地区扎囊县', 2, '扎囊县', ',2725,2747,', 2747);\nINSERT INTO `area` VALUES (2750, '2015-10-19 00:49:42', '2015-10-19 00:49:42', 0, 3, '西藏自治区山南地区贡嘎县', 2, '贡嘎县', ',2725,2747,', 2747);\nINSERT INTO `area` VALUES (2751, '2015-10-19 00:49:43', '2015-10-19 00:49:43', 0, 4, '西藏自治区山南地区桑日县', 2, '桑日县', ',2725,2747,', 2747);\nINSERT INTO `area` VALUES (2752, '2015-10-19 00:49:44', '2015-10-19 00:49:44', 0, 5, '西藏自治区山南地区琼结县', 2, '琼结县', ',2725,2747,', 2747);\nINSERT INTO `area` VALUES (2753, '2015-10-19 00:49:45', '2015-10-19 00:49:45', 0, 6, '西藏自治区山南地区曲松县', 2, '曲松县', ',2725,2747,', 2747);\nINSERT INTO `area` VALUES (2754, '2015-10-19 00:49:46', '2015-10-19 00:49:46', 0, 7, '西藏自治区山南地区措美县', 2, '措美县', ',2725,2747,', 2747);\nINSERT INTO `area` VALUES (2755, '2015-10-19 00:49:47', '2015-10-19 00:49:47', 0, 8, '西藏自治区山南地区洛扎县', 2, '洛扎县', ',2725,2747,', 2747);\nINSERT INTO `area` VALUES (2756, '2015-10-19 00:49:48', '2015-10-19 00:49:48', 0, 9, '西藏自治区山南地区加查县', 2, '加查县', ',2725,2747,', 2747);\nINSERT INTO `area` VALUES (2757, '2015-10-19 00:49:49', '2015-10-19 00:49:49', 0, 10, '西藏自治区山南地区隆子县', 2, '隆子县', ',2725,2747,', 2747);\nINSERT INTO `area` VALUES (2758, '2015-10-19 00:49:50', '2015-10-19 00:49:50', 0, 11, '西藏自治区山南地区错那县', 2, '错那县', ',2725,2747,', 2747);\nINSERT INTO `area` VALUES (2759, '2015-10-19 00:49:51', '2015-10-19 00:49:51', 0, 12, '西藏自治区山南地区浪卡子县', 2, '浪卡子县', ',2725,2747,', 2747);\nINSERT INTO `area` VALUES (2760, '2015-10-19 00:49:52', '2015-10-19 00:49:52', 0, 4, '西藏自治区日喀则地区', 1, '日喀则地区', ',2725,', 2725);\nINSERT INTO `area` VALUES (2761, '2015-10-19 00:49:53', '2015-10-19 00:49:53', 0, 1, '西藏自治区日喀则地区日喀则市', 2, '日喀则市', ',2725,2760,', 2760);\nINSERT INTO `area` VALUES (2762, '2015-10-19 00:49:54', '2015-10-19 00:49:54', 0, 2, '西藏自治区日喀则地区南木林县', 2, '南木林县', ',2725,2760,', 2760);\nINSERT INTO `area` VALUES (2763, '2015-10-19 00:49:55', '2015-10-19 00:49:55', 0, 3, '西藏自治区日喀则地区江孜县', 2, '江孜县', ',2725,2760,', 2760);\nINSERT INTO `area` VALUES (2764, '2015-10-19 00:49:56', '2015-10-19 00:49:56', 0, 4, '西藏自治区日喀则地区定日县', 2, '定日县', ',2725,2760,', 2760);\nINSERT INTO `area` VALUES (2765, '2015-10-19 00:49:57', '2015-10-19 00:49:57', 0, 5, '西藏自治区日喀则地区萨迦县', 2, '萨迦县', ',2725,2760,', 2760);\nINSERT INTO `area` VALUES (2766, '2015-10-19 00:49:58', '2015-10-19 00:49:58', 0, 6, '西藏自治区日喀则地区拉孜县', 2, '拉孜县', ',2725,2760,', 2760);\nINSERT INTO `area` VALUES (2767, '2015-10-19 00:49:59', '2015-10-19 00:49:59', 0, 7, '西藏自治区日喀则地区昂仁县', 2, '昂仁县', ',2725,2760,', 2760);\nINSERT INTO `area` VALUES (2768, '2015-10-19 00:50:00', '2015-10-19 00:50:00', 0, 8, '西藏自治区日喀则地区谢通门县', 2, '谢通门县', ',2725,2760,', 2760);\nINSERT INTO `area` VALUES (2769, '2015-10-19 00:50:01', '2015-10-19 00:50:01', 0, 9, '西藏自治区日喀则地区白朗县', 2, '白朗县', ',2725,2760,', 2760);\nINSERT INTO `area` VALUES (2770, '2015-10-19 00:50:02', '2015-10-19 00:50:02', 0, 10, '西藏自治区日喀则地区仁布县', 2, '仁布县', ',2725,2760,', 2760);\nINSERT INTO `area` VALUES (2771, '2015-10-19 00:50:03', '2015-10-19 00:50:03', 0, 11, '西藏自治区日喀则地区康马县', 2, '康马县', ',2725,2760,', 2760);\nINSERT INTO `area` VALUES (2772, '2015-10-19 00:50:04', '2015-10-19 00:50:04', 0, 12, '西藏自治区日喀则地区定结县', 2, '定结县', ',2725,2760,', 2760);\nINSERT INTO `area` VALUES (2773, '2015-10-19 00:50:05', '2015-10-19 00:50:05', 0, 13, '西藏自治区日喀则地区仲巴县', 2, '仲巴县', ',2725,2760,', 2760);\nINSERT INTO `area` VALUES (2774, '2015-10-19 00:50:06', '2015-10-19 00:50:06', 0, 14, '西藏自治区日喀则地区亚东县', 2, '亚东县', ',2725,2760,', 2760);\nINSERT INTO `area` VALUES (2775, '2015-10-19 00:50:07', '2015-10-19 00:50:07', 0, 15, '西藏自治区日喀则地区吉隆县', 2, '吉隆县', ',2725,2760,', 2760);\nINSERT INTO `area` VALUES (2776, '2015-10-19 00:50:08', '2015-10-19 00:50:08', 0, 16, '西藏自治区日喀则地区聂拉木县', 2, '聂拉木县', ',2725,2760,', 2760);\nINSERT INTO `area` VALUES (2777, '2015-10-19 00:50:09', '2015-10-19 00:50:09', 0, 17, '西藏自治区日喀则地区萨嘎县', 2, '萨嘎县', ',2725,2760,', 2760);\nINSERT INTO `area` VALUES (2778, '2015-10-19 00:50:10', '2015-10-19 00:50:10', 0, 18, '西藏自治区日喀则地区岗巴县', 2, '岗巴县', ',2725,2760,', 2760);\nINSERT INTO `area` VALUES (2779, '2015-10-19 00:50:11', '2015-10-19 00:50:11', 0, 5, '西藏自治区那曲地区', 1, '那曲地区', ',2725,', 2725);\nINSERT INTO `area` VALUES (2780, '2015-10-19 00:50:12', '2015-10-19 00:50:12', 0, 1, '西藏自治区那曲地区那曲县', 2, '那曲县', ',2725,2779,', 2779);\nINSERT INTO `area` VALUES (2781, '2015-10-19 00:50:13', '2015-10-19 00:50:13', 0, 2, '西藏自治区那曲地区嘉黎县', 2, '嘉黎县', ',2725,2779,', 2779);\nINSERT INTO `area` VALUES (2782, '2015-10-19 00:50:14', '2015-10-19 00:50:14', 0, 3, '西藏自治区那曲地区比如县', 2, '比如县', ',2725,2779,', 2779);\nINSERT INTO `area` VALUES (2783, '2015-10-19 00:50:15', '2015-10-19 00:50:15', 0, 4, '西藏自治区那曲地区聂荣县', 2, '聂荣县', ',2725,2779,', 2779);\nINSERT INTO `area` VALUES (2784, '2015-10-19 00:50:16', '2015-10-19 00:50:16', 0, 5, '西藏自治区那曲地区安多县', 2, '安多县', ',2725,2779,', 2779);\nINSERT INTO `area` VALUES (2785, '2015-10-19 00:50:17', '2015-10-19 00:50:17', 0, 6, '西藏自治区那曲地区申扎县', 2, '申扎县', ',2725,2779,', 2779);\nINSERT INTO `area` VALUES (2786, '2015-10-19 00:50:18', '2015-10-19 00:50:18', 0, 7, '西藏自治区那曲地区索县', 2, '索县', ',2725,2779,', 2779);\nINSERT INTO `area` VALUES (2787, '2015-10-19 00:50:19', '2015-10-19 00:50:19', 0, 8, '西藏自治区那曲地区班戈县', 2, '班戈县', ',2725,2779,', 2779);\nINSERT INTO `area` VALUES (2788, '2015-10-19 00:50:20', '2015-10-19 00:50:20', 0, 9, '西藏自治区那曲地区巴青县', 2, '巴青县', ',2725,2779,', 2779);\nINSERT INTO `area` VALUES (2789, '2015-10-19 00:50:21', '2015-10-19 00:50:21', 0, 10, '西藏自治区那曲地区尼玛县', 2, '尼玛县', ',2725,2779,', 2779);\nINSERT INTO `area` VALUES (2790, '2015-10-19 00:50:22', '2015-10-19 00:50:22', 0, 11, '西藏自治区那曲地区双湖县', 2, '双湖县', ',2725,2779,', 2779);\nINSERT INTO `area` VALUES (2791, '2015-10-19 00:50:23', '2015-10-19 00:50:23', 0, 6, '西藏自治区阿里地区', 1, '阿里地区', ',2725,', 2725);\nINSERT INTO `area` VALUES (2792, '2015-10-19 00:50:24', '2015-10-19 00:50:24', 0, 1, '西藏自治区阿里地区普兰县', 2, '普兰县', ',2725,2791,', 2791);\nINSERT INTO `area` VALUES (2793, '2015-10-19 00:50:25', '2015-10-19 00:50:25', 0, 2, '西藏自治区阿里地区札达县', 2, '札达县', ',2725,2791,', 2791);\nINSERT INTO `area` VALUES (2794, '2015-10-19 00:50:26', '2015-10-19 00:50:26', 0, 3, '西藏自治区阿里地区噶尔县', 2, '噶尔县', ',2725,2791,', 2791);\nINSERT INTO `area` VALUES (2795, '2015-10-19 00:50:27', '2015-10-19 00:50:27', 0, 4, '西藏自治区阿里地区日土县', 2, '日土县', ',2725,2791,', 2791);\nINSERT INTO `area` VALUES (2796, '2015-10-19 00:50:28', '2015-10-19 00:50:28', 0, 5, '西藏自治区阿里地区革吉县', 2, '革吉县', ',2725,2791,', 2791);\nINSERT INTO `area` VALUES (2797, '2015-10-19 00:50:29', '2015-10-19 00:50:29', 0, 6, '西藏自治区阿里地区改则县', 2, '改则县', ',2725,2791,', 2791);\nINSERT INTO `area` VALUES (2798, '2015-10-19 00:50:30', '2015-10-19 00:50:30', 0, 7, '西藏自治区阿里地区措勤县', 2, '措勤县', ',2725,2791,', 2791);\nINSERT INTO `area` VALUES (2799, '2015-10-19 00:50:31', '2015-10-19 00:50:31', 0, 7, '西藏自治区林芝地区', 1, '林芝地区', ',2725,', 2725);\nINSERT INTO `area` VALUES (2800, '2015-10-19 00:50:32', '2015-10-19 00:50:32', 0, 1, '西藏自治区林芝地区林芝县', 2, '林芝县', ',2725,2799,', 2799);\nINSERT INTO `area` VALUES (2801, '2015-10-19 00:50:33', '2015-10-19 00:50:33', 0, 2, '西藏自治区林芝地区工布江达县', 2, '工布江达县', ',2725,2799,', 2799);\nINSERT INTO `area` VALUES (2802, '2015-10-19 00:50:34', '2015-10-19 00:50:34', 0, 3, '西藏自治区林芝地区米林县', 2, '米林县', ',2725,2799,', 2799);\nINSERT INTO `area` VALUES (2803, '2015-10-19 00:50:35', '2015-10-19 00:50:35', 0, 4, '西藏自治区林芝地区墨脱县', 2, '墨脱县', ',2725,2799,', 2799);\nINSERT INTO `area` VALUES (2804, '2015-10-19 00:50:36', '2015-10-19 00:50:36', 0, 5, '西藏自治区林芝地区波密县', 2, '波密县', ',2725,2799,', 2799);\nINSERT INTO `area` VALUES (2805, '2015-10-19 00:50:37', '2015-10-19 00:50:37', 0, 6, '西藏自治区林芝地区察隅县', 2, '察隅县', ',2725,2799,', 2799);\nINSERT INTO `area` VALUES (2806, '2015-10-19 00:50:38', '2015-10-19 00:50:38', 0, 7, '西藏自治区林芝地区朗县', 2, '朗县', ',2725,2799,', 2799);\nINSERT INTO `area` VALUES (2807, '2015-10-19 00:50:39', '2015-10-19 00:50:39', 0, 27, '陕西省', 0, '陕西省', ',', NULL);\nINSERT INTO `area` VALUES (2808, '2015-10-19 00:50:40', '2015-10-19 00:50:40', 0, 1, '陕西省西安市', 1, '西安市', ',2807,', 2807);\nINSERT INTO `area` VALUES (2809, '2015-10-19 00:50:41', '2015-10-19 00:50:41', 0, 1, '陕西省西安市新城区', 2, '新城区', ',2807,2808,', 2808);\nINSERT INTO `area` VALUES (2810, '2015-10-19 00:50:42', '2015-10-19 00:50:42', 0, 2, '陕西省西安市碑林区', 2, '碑林区', ',2807,2808,', 2808);\nINSERT INTO `area` VALUES (2811, '2015-10-19 00:50:43', '2015-10-19 00:50:43', 0, 3, '陕西省西安市莲湖区', 2, '莲湖区', ',2807,2808,', 2808);\nINSERT INTO `area` VALUES (2812, '2015-10-19 00:50:44', '2015-10-19 00:50:44', 0, 4, '陕西省西安市灞桥区', 2, '灞桥区', ',2807,2808,', 2808);\nINSERT INTO `area` VALUES (2813, '2015-10-19 00:50:45', '2015-10-19 00:50:45', 0, 5, '陕西省西安市未央区', 2, '未央区', ',2807,2808,', 2808);\nINSERT INTO `area` VALUES (2814, '2015-10-19 00:50:46', '2015-10-19 00:50:46', 0, 6, '陕西省西安市雁塔区', 2, '雁塔区', ',2807,2808,', 2808);\nINSERT INTO `area` VALUES (2815, '2015-10-19 00:50:47', '2015-10-19 00:50:47', 0, 7, '陕西省西安市阎良区', 2, '阎良区', ',2807,2808,', 2808);\nINSERT INTO `area` VALUES (2816, '2015-10-19 00:50:48', '2015-10-19 00:50:48', 0, 8, '陕西省西安市临潼区', 2, '临潼区', ',2807,2808,', 2808);\nINSERT INTO `area` VALUES (2817, '2015-10-19 00:50:49', '2015-10-19 00:50:49', 0, 9, '陕西省西安市长安区', 2, '长安区', ',2807,2808,', 2808);\nINSERT INTO `area` VALUES (2818, '2015-10-19 00:50:50', '2015-10-19 00:50:50', 0, 10, '陕西省西安市蓝田县', 2, '蓝田县', ',2807,2808,', 2808);\nINSERT INTO `area` VALUES (2819, '2015-10-19 00:50:51', '2015-10-19 00:50:51', 0, 11, '陕西省西安市周至县', 2, '周至县', ',2807,2808,', 2808);\nINSERT INTO `area` VALUES (2820, '2015-10-19 00:50:52', '2015-10-19 00:50:52', 0, 12, '陕西省西安市户县', 2, '户县', ',2807,2808,', 2808);\nINSERT INTO `area` VALUES (2821, '2015-10-19 00:50:53', '2015-10-19 00:50:53', 0, 13, '陕西省西安市高陵县', 2, '高陵县', ',2807,2808,', 2808);\nINSERT INTO `area` VALUES (2822, '2015-10-19 00:50:54', '2015-10-19 00:50:54', 0, 2, '陕西省铜川市', 1, '铜川市', ',2807,', 2807);\nINSERT INTO `area` VALUES (2823, '2015-10-19 00:50:55', '2015-10-19 00:50:55', 0, 1, '陕西省铜川市王益区', 2, '王益区', ',2807,2822,', 2822);\nINSERT INTO `area` VALUES (2824, '2015-10-19 00:50:56', '2015-10-19 00:50:56', 0, 2, '陕西省铜川市印台区', 2, '印台区', ',2807,2822,', 2822);\nINSERT INTO `area` VALUES (2825, '2015-10-19 00:50:57', '2015-10-19 00:50:57', 0, 3, '陕西省铜川市耀州区', 2, '耀州区', ',2807,2822,', 2822);\nINSERT INTO `area` VALUES (2826, '2015-10-19 00:50:58', '2015-10-19 00:50:58', 0, 4, '陕西省铜川市宜君县', 2, '宜君县', ',2807,2822,', 2822);\nINSERT INTO `area` VALUES (2827, '2015-10-19 00:50:59', '2015-10-19 00:50:59', 0, 3, '陕西省宝鸡市', 1, '宝鸡市', ',2807,', 2807);\nINSERT INTO `area` VALUES (2828, '2015-10-19 00:51:00', '2015-10-19 00:51:00', 0, 1, '陕西省宝鸡市渭滨区', 2, '渭滨区', ',2807,2827,', 2827);\nINSERT INTO `area` VALUES (2829, '2015-10-19 00:51:01', '2015-10-19 00:51:01', 0, 2, '陕西省宝鸡市金台区', 2, '金台区', ',2807,2827,', 2827);\nINSERT INTO `area` VALUES (2830, '2015-10-19 00:51:02', '2015-10-19 00:51:02', 0, 3, '陕西省宝鸡市陈仓区', 2, '陈仓区', ',2807,2827,', 2827);\nINSERT INTO `area` VALUES (2831, '2015-10-19 00:51:03', '2015-10-19 00:51:03', 0, 4, '陕西省宝鸡市凤翔县', 2, '凤翔县', ',2807,2827,', 2827);\nINSERT INTO `area` VALUES (2832, '2015-10-19 00:51:04', '2015-10-19 00:51:04', 0, 5, '陕西省宝鸡市岐山县', 2, '岐山县', ',2807,2827,', 2827);\nINSERT INTO `area` VALUES (2833, '2015-10-19 00:51:05', '2015-10-19 00:51:05', 0, 6, '陕西省宝鸡市扶风县', 2, '扶风县', ',2807,2827,', 2827);\nINSERT INTO `area` VALUES (2834, '2015-10-19 00:51:06', '2015-10-19 00:51:06', 0, 7, '陕西省宝鸡市眉县', 2, '眉县', ',2807,2827,', 2827);\nINSERT INTO `area` VALUES (2835, '2015-10-19 00:51:07', '2015-10-19 00:51:07', 0, 8, '陕西省宝鸡市陇县', 2, '陇县', ',2807,2827,', 2827);\nINSERT INTO `area` VALUES (2836, '2015-10-19 00:51:08', '2015-10-19 00:51:08', 0, 9, '陕西省宝鸡市千阳县', 2, '千阳县', ',2807,2827,', 2827);\nINSERT INTO `area` VALUES (2837, '2015-10-19 00:51:09', '2015-10-19 00:51:09', 0, 10, '陕西省宝鸡市麟游县', 2, '麟游县', ',2807,2827,', 2827);\nINSERT INTO `area` VALUES (2838, '2015-10-19 00:51:10', '2015-10-19 00:51:10', 0, 11, '陕西省宝鸡市凤县', 2, '凤县', ',2807,2827,', 2827);\nINSERT INTO `area` VALUES (2839, '2015-10-19 00:51:11', '2015-10-19 00:51:11', 0, 12, '陕西省宝鸡市太白县', 2, '太白县', ',2807,2827,', 2827);\nINSERT INTO `area` VALUES (2840, '2015-10-19 00:51:12', '2015-10-19 00:51:12', 0, 4, '陕西省咸阳市', 1, '咸阳市', ',2807,', 2807);\nINSERT INTO `area` VALUES (2841, '2015-10-19 00:51:13', '2015-10-19 00:51:13', 0, 1, '陕西省咸阳市秦都区', 2, '秦都区', ',2807,2840,', 2840);\nINSERT INTO `area` VALUES (2842, '2015-10-19 00:51:14', '2015-10-19 00:51:14', 0, 2, '陕西省咸阳市杨陵区', 2, '杨陵区', ',2807,2840,', 2840);\nINSERT INTO `area` VALUES (2843, '2015-10-19 00:51:15', '2015-10-19 00:51:15', 0, 3, '陕西省咸阳市渭城区', 2, '渭城区', ',2807,2840,', 2840);\nINSERT INTO `area` VALUES (2844, '2015-10-19 00:51:16', '2015-10-19 00:51:16', 0, 4, '陕西省咸阳市三原县', 2, '三原县', ',2807,2840,', 2840);\nINSERT INTO `area` VALUES (2845, '2015-10-19 00:51:17', '2015-10-19 00:51:17', 0, 5, '陕西省咸阳市泾阳县', 2, '泾阳县', ',2807,2840,', 2840);\nINSERT INTO `area` VALUES (2846, '2015-10-19 00:51:18', '2015-10-19 00:51:18', 0, 6, '陕西省咸阳市乾县', 2, '乾县', ',2807,2840,', 2840);\nINSERT INTO `area` VALUES (2847, '2015-10-19 00:51:19', '2015-10-19 00:51:19', 0, 7, '陕西省咸阳市礼泉县', 2, '礼泉县', ',2807,2840,', 2840);\nINSERT INTO `area` VALUES (2848, '2015-10-19 00:51:20', '2015-10-19 00:51:20', 0, 8, '陕西省咸阳市永寿县', 2, '永寿县', ',2807,2840,', 2840);\nINSERT INTO `area` VALUES (2849, '2015-10-19 00:51:21', '2015-10-19 00:51:21', 0, 9, '陕西省咸阳市彬县', 2, '彬县', ',2807,2840,', 2840);\nINSERT INTO `area` VALUES (2850, '2015-10-19 00:51:22', '2015-10-19 00:51:22', 0, 10, '陕西省咸阳市长武县', 2, '长武县', ',2807,2840,', 2840);\nINSERT INTO `area` VALUES (2851, '2015-10-19 00:51:23', '2015-10-19 00:51:23', 0, 11, '陕西省咸阳市旬邑县', 2, '旬邑县', ',2807,2840,', 2840);\nINSERT INTO `area` VALUES (2852, '2015-10-19 00:51:24', '2015-10-19 00:51:24', 0, 12, '陕西省咸阳市淳化县', 2, '淳化县', ',2807,2840,', 2840);\nINSERT INTO `area` VALUES (2853, '2015-10-19 00:51:25', '2015-10-19 00:51:25', 0, 13, '陕西省咸阳市武功县', 2, '武功县', ',2807,2840,', 2840);\nINSERT INTO `area` VALUES (2854, '2015-10-19 00:51:26', '2015-10-19 00:51:26', 0, 14, '陕西省咸阳市兴平市', 2, '兴平市', ',2807,2840,', 2840);\nINSERT INTO `area` VALUES (2855, '2015-10-19 00:51:27', '2015-10-19 00:51:27', 0, 5, '陕西省渭南市', 1, '渭南市', ',2807,', 2807);\nINSERT INTO `area` VALUES (2856, '2015-10-19 00:51:28', '2015-10-19 00:51:28', 0, 1, '陕西省渭南市临渭区', 2, '临渭区', ',2807,2855,', 2855);\nINSERT INTO `area` VALUES (2857, '2015-10-19 00:51:29', '2015-10-19 00:51:29', 0, 2, '陕西省渭南市华县', 2, '华县', ',2807,2855,', 2855);\nINSERT INTO `area` VALUES (2858, '2015-10-19 00:51:30', '2015-10-19 00:51:30', 0, 3, '陕西省渭南市潼关县', 2, '潼关县', ',2807,2855,', 2855);\nINSERT INTO `area` VALUES (2859, '2015-10-19 00:51:31', '2015-10-19 00:51:31', 0, 4, '陕西省渭南市大荔县', 2, '大荔县', ',2807,2855,', 2855);\nINSERT INTO `area` VALUES (2860, '2015-10-19 00:51:32', '2015-10-19 00:51:32', 0, 5, '陕西省渭南市合阳县', 2, '合阳县', ',2807,2855,', 2855);\nINSERT INTO `area` VALUES (2861, '2015-10-19 00:51:33', '2015-10-19 00:51:33', 0, 6, '陕西省渭南市澄城县', 2, '澄城县', ',2807,2855,', 2855);\nINSERT INTO `area` VALUES (2862, '2015-10-19 00:51:34', '2015-10-19 00:51:34', 0, 7, '陕西省渭南市蒲城县', 2, '蒲城县', ',2807,2855,', 2855);\nINSERT INTO `area` VALUES (2863, '2015-10-19 00:51:35', '2015-10-19 00:51:35', 0, 8, '陕西省渭南市白水县', 2, '白水县', ',2807,2855,', 2855);\nINSERT INTO `area` VALUES (2864, '2015-10-19 00:51:36', '2015-10-19 00:51:36', 0, 9, '陕西省渭南市富平县', 2, '富平县', ',2807,2855,', 2855);\nINSERT INTO `area` VALUES (2865, '2015-10-19 00:51:37', '2015-10-19 00:51:37', 0, 10, '陕西省渭南市韩城市', 2, '韩城市', ',2807,2855,', 2855);\nINSERT INTO `area` VALUES (2866, '2015-10-19 00:51:38', '2015-10-19 00:51:38', 0, 11, '陕西省渭南市华阴市', 2, '华阴市', ',2807,2855,', 2855);\nINSERT INTO `area` VALUES (2867, '2015-10-19 00:51:39', '2015-10-19 00:51:39', 0, 6, '陕西省延安市', 1, '延安市', ',2807,', 2807);\nINSERT INTO `area` VALUES (2868, '2015-10-19 00:51:40', '2015-10-19 00:51:40', 0, 1, '陕西省延安市宝塔区', 2, '宝塔区', ',2807,2867,', 2867);\nINSERT INTO `area` VALUES (2869, '2015-10-19 00:51:41', '2015-10-19 00:51:41', 0, 2, '陕西省延安市延长县', 2, '延长县', ',2807,2867,', 2867);\nINSERT INTO `area` VALUES (2870, '2015-10-19 00:51:42', '2015-10-19 00:51:42', 0, 3, '陕西省延安市延川县', 2, '延川县', ',2807,2867,', 2867);\nINSERT INTO `area` VALUES (2871, '2015-10-19 00:51:43', '2015-10-19 00:51:43', 0, 4, '陕西省延安市子长县', 2, '子长县', ',2807,2867,', 2867);\nINSERT INTO `area` VALUES (2872, '2015-10-19 00:51:44', '2015-10-19 00:51:44', 0, 5, '陕西省延安市安塞县', 2, '安塞县', ',2807,2867,', 2867);\nINSERT INTO `area` VALUES (2873, '2015-10-19 00:51:45', '2015-10-19 00:51:45', 0, 6, '陕西省延安市志丹县', 2, '志丹县', ',2807,2867,', 2867);\nINSERT INTO `area` VALUES (2874, '2015-10-19 00:51:46', '2015-10-19 00:51:46', 0, 7, '陕西省延安市吴起县', 2, '吴起县', ',2807,2867,', 2867);\nINSERT INTO `area` VALUES (2875, '2015-10-19 00:51:47', '2015-10-19 00:51:47', 0, 8, '陕西省延安市甘泉县', 2, '甘泉县', ',2807,2867,', 2867);\nINSERT INTO `area` VALUES (2876, '2015-10-19 00:51:48', '2015-10-19 00:51:48', 0, 9, '陕西省延安市富县', 2, '富县', ',2807,2867,', 2867);\nINSERT INTO `area` VALUES (2877, '2015-10-19 00:51:49', '2015-10-19 00:51:49', 0, 10, '陕西省延安市洛川县', 2, '洛川县', ',2807,2867,', 2867);\nINSERT INTO `area` VALUES (2878, '2015-10-19 00:51:50', '2015-10-19 00:51:50', 0, 11, '陕西省延安市宜川县', 2, '宜川县', ',2807,2867,', 2867);\nINSERT INTO `area` VALUES (2879, '2015-10-19 00:51:51', '2015-10-19 00:51:51', 0, 12, '陕西省延安市黄龙县', 2, '黄龙县', ',2807,2867,', 2867);\nINSERT INTO `area` VALUES (2880, '2015-10-19 00:51:52', '2015-10-19 00:51:52', 0, 13, '陕西省延安市黄陵县', 2, '黄陵县', ',2807,2867,', 2867);\nINSERT INTO `area` VALUES (2881, '2015-10-19 00:51:53', '2015-10-19 00:51:53', 0, 7, '陕西省汉中市', 1, '汉中市', ',2807,', 2807);\nINSERT INTO `area` VALUES (2882, '2015-10-19 00:51:54', '2015-10-19 00:51:54', 0, 1, '陕西省汉中市汉台区', 2, '汉台区', ',2807,2881,', 2881);\nINSERT INTO `area` VALUES (2883, '2015-10-19 00:51:55', '2015-10-19 00:51:55', 0, 2, '陕西省汉中市南郑县', 2, '南郑县', ',2807,2881,', 2881);\nINSERT INTO `area` VALUES (2884, '2015-10-19 00:51:56', '2015-10-19 00:51:56', 0, 3, '陕西省汉中市城固县', 2, '城固县', ',2807,2881,', 2881);\nINSERT INTO `area` VALUES (2885, '2015-10-19 00:51:57', '2015-10-19 00:51:57', 0, 4, '陕西省汉中市洋县', 2, '洋县', ',2807,2881,', 2881);\nINSERT INTO `area` VALUES (2886, '2015-10-19 00:51:58', '2015-10-19 00:51:58', 0, 5, '陕西省汉中市西乡县', 2, '西乡县', ',2807,2881,', 2881);\nINSERT INTO `area` VALUES (2887, '2015-10-19 00:51:59', '2015-10-19 00:51:59', 0, 6, '陕西省汉中市勉县', 2, '勉县', ',2807,2881,', 2881);\nINSERT INTO `area` VALUES (2888, '2015-10-19 00:52:00', '2015-10-19 00:52:00', 0, 7, '陕西省汉中市宁强县', 2, '宁强县', ',2807,2881,', 2881);\nINSERT INTO `area` VALUES (2889, '2015-10-19 00:52:01', '2015-10-19 00:52:01', 0, 8, '陕西省汉中市略阳县', 2, '略阳县', ',2807,2881,', 2881);\nINSERT INTO `area` VALUES (2890, '2015-10-19 00:52:02', '2015-10-19 00:52:02', 0, 9, '陕西省汉中市镇巴县', 2, '镇巴县', ',2807,2881,', 2881);\nINSERT INTO `area` VALUES (2891, '2015-10-19 00:52:03', '2015-10-19 00:52:03', 0, 10, '陕西省汉中市留坝县', 2, '留坝县', ',2807,2881,', 2881);\nINSERT INTO `area` VALUES (2892, '2015-10-19 00:52:04', '2015-10-19 00:52:04', 0, 11, '陕西省汉中市佛坪县', 2, '佛坪县', ',2807,2881,', 2881);\nINSERT INTO `area` VALUES (2893, '2015-10-19 00:52:05', '2015-10-19 00:52:05', 0, 8, '陕西省榆林市', 1, '榆林市', ',2807,', 2807);\nINSERT INTO `area` VALUES (2894, '2015-10-19 00:52:06', '2015-10-19 00:52:06', 0, 1, '陕西省榆林市榆阳区', 2, '榆阳区', ',2807,2893,', 2893);\nINSERT INTO `area` VALUES (2895, '2015-10-19 00:52:07', '2015-10-19 00:52:07', 0, 2, '陕西省榆林市神木县', 2, '神木县', ',2807,2893,', 2893);\nINSERT INTO `area` VALUES (2896, '2015-10-19 00:52:08', '2015-10-19 00:52:08', 0, 3, '陕西省榆林市府谷县', 2, '府谷县', ',2807,2893,', 2893);\nINSERT INTO `area` VALUES (2897, '2015-10-19 00:52:09', '2015-10-19 00:52:09', 0, 4, '陕西省榆林市横山县', 2, '横山县', ',2807,2893,', 2893);\nINSERT INTO `area` VALUES (2898, '2015-10-19 00:52:10', '2015-10-19 00:52:10', 0, 5, '陕西省榆林市靖边县', 2, '靖边县', ',2807,2893,', 2893);\nINSERT INTO `area` VALUES (2899, '2015-10-19 00:52:11', '2015-10-19 00:52:11', 0, 6, '陕西省榆林市定边县', 2, '定边县', ',2807,2893,', 2893);\nINSERT INTO `area` VALUES (2900, '2015-10-19 00:52:12', '2015-10-19 00:52:12', 0, 7, '陕西省榆林市绥德县', 2, '绥德县', ',2807,2893,', 2893);\nINSERT INTO `area` VALUES (2901, '2015-10-19 00:52:13', '2015-10-19 00:52:13', 0, 8, '陕西省榆林市米脂县', 2, '米脂县', ',2807,2893,', 2893);\nINSERT INTO `area` VALUES (2902, '2015-10-19 00:52:14', '2015-10-19 00:52:14', 0, 9, '陕西省榆林市佳县', 2, '佳县', ',2807,2893,', 2893);\nINSERT INTO `area` VALUES (2903, '2015-10-19 00:52:15', '2015-10-19 00:52:15', 0, 10, '陕西省榆林市吴堡县', 2, '吴堡县', ',2807,2893,', 2893);\nINSERT INTO `area` VALUES (2904, '2015-10-19 00:52:16', '2015-10-19 00:52:16', 0, 11, '陕西省榆林市清涧县', 2, '清涧县', ',2807,2893,', 2893);\nINSERT INTO `area` VALUES (2905, '2015-10-19 00:52:17', '2015-10-19 00:52:17', 0, 12, '陕西省榆林市子洲县', 2, '子洲县', ',2807,2893,', 2893);\nINSERT INTO `area` VALUES (2906, '2015-10-19 00:52:18', '2015-10-19 00:52:18', 0, 9, '陕西省安康市', 1, '安康市', ',2807,', 2807);\nINSERT INTO `area` VALUES (2907, '2015-10-19 00:52:19', '2015-10-19 00:52:19', 0, 1, '陕西省安康市汉滨区', 2, '汉滨区', ',2807,2906,', 2906);\nINSERT INTO `area` VALUES (2908, '2015-10-19 00:52:20', '2015-10-19 00:52:20', 0, 2, '陕西省安康市汉阴县', 2, '汉阴县', ',2807,2906,', 2906);\nINSERT INTO `area` VALUES (2909, '2015-10-19 00:52:21', '2015-10-19 00:52:21', 0, 3, '陕西省安康市石泉县', 2, '石泉县', ',2807,2906,', 2906);\nINSERT INTO `area` VALUES (2910, '2015-10-19 00:52:22', '2015-10-19 00:52:22', 0, 4, '陕西省安康市宁陕县', 2, '宁陕县', ',2807,2906,', 2906);\nINSERT INTO `area` VALUES (2911, '2015-10-19 00:52:23', '2015-10-19 00:52:23', 0, 5, '陕西省安康市紫阳县', 2, '紫阳县', ',2807,2906,', 2906);\nINSERT INTO `area` VALUES (2912, '2015-10-19 00:52:24', '2015-10-19 00:52:24', 0, 6, '陕西省安康市岚皋县', 2, '岚皋县', ',2807,2906,', 2906);\nINSERT INTO `area` VALUES (2913, '2015-10-19 00:52:25', '2015-10-19 00:52:25', 0, 7, '陕西省安康市平利县', 2, '平利县', ',2807,2906,', 2906);\nINSERT INTO `area` VALUES (2914, '2015-10-19 00:52:26', '2015-10-19 00:52:26', 0, 8, '陕西省安康市镇坪县', 2, '镇坪县', ',2807,2906,', 2906);\nINSERT INTO `area` VALUES (2915, '2015-10-19 00:52:27', '2015-10-19 00:52:27', 0, 9, '陕西省安康市旬阳县', 2, '旬阳县', ',2807,2906,', 2906);\nINSERT INTO `area` VALUES (2916, '2015-10-19 00:52:28', '2015-10-19 00:52:28', 0, 10, '陕西省安康市白河县', 2, '白河县', ',2807,2906,', 2906);\nINSERT INTO `area` VALUES (2917, '2015-10-19 00:52:29', '2015-10-19 00:52:29', 0, 10, '陕西省商洛市', 1, '商洛市', ',2807,', 2807);\nINSERT INTO `area` VALUES (2918, '2015-10-19 00:52:30', '2015-10-19 00:52:30', 0, 1, '陕西省商洛市商州区', 2, '商州区', ',2807,2917,', 2917);\nINSERT INTO `area` VALUES (2919, '2015-10-19 00:52:31', '2015-10-19 00:52:31', 0, 2, '陕西省商洛市洛南县', 2, '洛南县', ',2807,2917,', 2917);\nINSERT INTO `area` VALUES (2920, '2015-10-19 00:52:32', '2015-10-19 00:52:32', 0, 3, '陕西省商洛市丹凤县', 2, '丹凤县', ',2807,2917,', 2917);\nINSERT INTO `area` VALUES (2921, '2015-10-19 00:52:33', '2015-10-19 00:52:33', 0, 4, '陕西省商洛市商南县', 2, '商南县', ',2807,2917,', 2917);\nINSERT INTO `area` VALUES (2922, '2015-10-19 00:52:34', '2015-10-19 00:52:34', 0, 5, '陕西省商洛市山阳县', 2, '山阳县', ',2807,2917,', 2917);\nINSERT INTO `area` VALUES (2923, '2015-10-19 00:52:35', '2015-10-19 00:52:35', 0, 6, '陕西省商洛市镇安县', 2, '镇安县', ',2807,2917,', 2917);\nINSERT INTO `area` VALUES (2924, '2015-10-19 00:52:36', '2015-10-19 00:52:36', 0, 7, '陕西省商洛市柞水县', 2, '柞水县', ',2807,2917,', 2917);\nINSERT INTO `area` VALUES (2925, '2015-10-19 00:52:37', '2015-10-19 00:52:37', 0, 28, '甘肃省', 0, '甘肃省', ',', NULL);\nINSERT INTO `area` VALUES (2926, '2015-10-19 00:52:38', '2015-10-19 00:52:38', 0, 1, '甘肃省兰州市', 1, '兰州市', ',2925,', 2925);\nINSERT INTO `area` VALUES (2927, '2015-10-19 00:52:39', '2015-10-19 00:52:39', 0, 1, '甘肃省兰州市城关区', 2, '城关区', ',2925,2926,', 2926);\nINSERT INTO `area` VALUES (2928, '2015-10-19 00:52:40', '2015-10-19 00:52:40', 0, 2, '甘肃省兰州市七里河区', 2, '七里河区', ',2925,2926,', 2926);\nINSERT INTO `area` VALUES (2929, '2015-10-19 00:52:41', '2015-10-19 00:52:41', 0, 3, '甘肃省兰州市西固区', 2, '西固区', ',2925,2926,', 2926);\nINSERT INTO `area` VALUES (2930, '2015-10-19 00:52:42', '2015-10-19 00:52:42', 0, 4, '甘肃省兰州市安宁区', 2, '安宁区', ',2925,2926,', 2926);\nINSERT INTO `area` VALUES (2931, '2015-10-19 00:52:43', '2015-10-19 00:52:43', 0, 5, '甘肃省兰州市红古区', 2, '红古区', ',2925,2926,', 2926);\nINSERT INTO `area` VALUES (2932, '2015-10-19 00:52:44', '2015-10-19 00:52:44', 0, 6, '甘肃省兰州市永登县', 2, '永登县', ',2925,2926,', 2926);\nINSERT INTO `area` VALUES (2933, '2015-10-19 00:52:45', '2015-10-19 00:52:45', 0, 7, '甘肃省兰州市皋兰县', 2, '皋兰县', ',2925,2926,', 2926);\nINSERT INTO `area` VALUES (2934, '2015-10-19 00:52:46', '2015-10-19 00:52:46', 0, 8, '甘肃省兰州市榆中县', 2, '榆中县', ',2925,2926,', 2926);\nINSERT INTO `area` VALUES (2935, '2015-10-19 00:52:47', '2015-10-19 00:52:47', 0, 2, '甘肃省嘉峪关市', 1, '嘉峪关市', ',2925,', 2925);\nINSERT INTO `area` VALUES (2936, '2015-10-19 00:52:48', '2015-10-19 00:52:48', 0, 3, '甘肃省金昌市', 1, '金昌市', ',2925,', 2925);\nINSERT INTO `area` VALUES (2937, '2015-10-19 00:52:49', '2015-10-19 00:52:49', 0, 1, '甘肃省金昌市金川区', 2, '金川区', ',2925,2936,', 2936);\nINSERT INTO `area` VALUES (2938, '2015-10-19 00:52:50', '2015-10-19 00:52:50', 0, 2, '甘肃省金昌市永昌县', 2, '永昌县', ',2925,2936,', 2936);\nINSERT INTO `area` VALUES (2939, '2015-10-19 00:52:51', '2015-10-19 00:52:51', 0, 4, '甘肃省白银市', 1, '白银市', ',2925,', 2925);\nINSERT INTO `area` VALUES (2940, '2015-10-19 00:52:52', '2015-10-19 00:52:52', 0, 1, '甘肃省白银市白银区', 2, '白银区', ',2925,2939,', 2939);\nINSERT INTO `area` VALUES (2941, '2015-10-19 00:52:53', '2015-10-19 00:52:53', 0, 2, '甘肃省白银市平川区', 2, '平川区', ',2925,2939,', 2939);\nINSERT INTO `area` VALUES (2942, '2015-10-19 00:52:54', '2015-10-19 00:52:54', 0, 3, '甘肃省白银市靖远县', 2, '靖远县', ',2925,2939,', 2939);\nINSERT INTO `area` VALUES (2943, '2015-10-19 00:52:55', '2015-10-19 00:52:55', 0, 4, '甘肃省白银市会宁县', 2, '会宁县', ',2925,2939,', 2939);\nINSERT INTO `area` VALUES (2944, '2015-10-19 00:52:56', '2015-10-19 00:52:56', 0, 5, '甘肃省白银市景泰县', 2, '景泰县', ',2925,2939,', 2939);\nINSERT INTO `area` VALUES (2945, '2015-10-19 00:52:57', '2015-10-19 00:52:57', 0, 5, '甘肃省天水市', 1, '天水市', ',2925,', 2925);\nINSERT INTO `area` VALUES (2946, '2015-10-19 00:52:58', '2015-10-19 00:52:58', 0, 1, '甘肃省天水市秦州区', 2, '秦州区', ',2925,2945,', 2945);\nINSERT INTO `area` VALUES (2947, '2015-10-19 00:52:59', '2015-10-19 00:52:59', 0, 2, '甘肃省天水市麦积区', 2, '麦积区', ',2925,2945,', 2945);\nINSERT INTO `area` VALUES (2948, '2015-10-19 00:53:00', '2015-10-19 00:53:00', 0, 3, '甘肃省天水市清水县', 2, '清水县', ',2925,2945,', 2945);\nINSERT INTO `area` VALUES (2949, '2015-10-19 00:53:01', '2015-10-19 00:53:01', 0, 4, '甘肃省天水市秦安县', 2, '秦安县', ',2925,2945,', 2945);\nINSERT INTO `area` VALUES (2950, '2015-10-19 00:53:02', '2015-10-19 00:53:02', 0, 5, '甘肃省天水市甘谷县', 2, '甘谷县', ',2925,2945,', 2945);\nINSERT INTO `area` VALUES (2951, '2015-10-19 00:53:03', '2015-10-19 00:53:03', 0, 6, '甘肃省天水市武山县', 2, '武山县', ',2925,2945,', 2945);\nINSERT INTO `area` VALUES (2952, '2015-10-19 00:53:04', '2015-10-19 00:53:04', 0, 7, '甘肃省天水市张家川回族自治县', 2, '张家川回族自治县', ',2925,2945,', 2945);\nINSERT INTO `area` VALUES (2953, '2015-10-19 00:53:05', '2015-10-19 00:53:05', 0, 6, '甘肃省武威市', 1, '武威市', ',2925,', 2925);\nINSERT INTO `area` VALUES (2954, '2015-10-19 00:53:06', '2015-10-19 00:53:06', 0, 1, '甘肃省武威市凉州区', 2, '凉州区', ',2925,2953,', 2953);\nINSERT INTO `area` VALUES (2955, '2015-10-19 00:53:07', '2015-10-19 00:53:07', 0, 2, '甘肃省武威市民勤县', 2, '民勤县', ',2925,2953,', 2953);\nINSERT INTO `area` VALUES (2956, '2015-10-19 00:53:08', '2015-10-19 00:53:08', 0, 3, '甘肃省武威市古浪县', 2, '古浪县', ',2925,2953,', 2953);\nINSERT INTO `area` VALUES (2957, '2015-10-19 00:53:09', '2015-10-19 00:53:09', 0, 4, '甘肃省武威市天祝藏族自治县', 2, '天祝藏族自治县', ',2925,2953,', 2953);\nINSERT INTO `area` VALUES (2958, '2015-10-19 00:53:10', '2015-10-19 00:53:10', 0, 7, '甘肃省张掖市', 1, '张掖市', ',2925,', 2925);\nINSERT INTO `area` VALUES (2959, '2015-10-19 00:53:11', '2015-10-19 00:53:11', 0, 1, '甘肃省张掖市甘州区', 2, '甘州区', ',2925,2958,', 2958);\nINSERT INTO `area` VALUES (2960, '2015-10-19 00:53:12', '2015-10-19 00:53:12', 0, 2, '甘肃省张掖市肃南裕固族自治县', 2, '肃南裕固族自治县', ',2925,2958,', 2958);\nINSERT INTO `area` VALUES (2961, '2015-10-19 00:53:13', '2015-10-19 00:53:13', 0, 3, '甘肃省张掖市民乐县', 2, '民乐县', ',2925,2958,', 2958);\nINSERT INTO `area` VALUES (2962, '2015-10-19 00:53:14', '2015-10-19 00:53:14', 0, 4, '甘肃省张掖市临泽县', 2, '临泽县', ',2925,2958,', 2958);\nINSERT INTO `area` VALUES (2963, '2015-10-19 00:53:15', '2015-10-19 00:53:15', 0, 5, '甘肃省张掖市高台县', 2, '高台县', ',2925,2958,', 2958);\nINSERT INTO `area` VALUES (2964, '2015-10-19 00:53:16', '2015-10-19 00:53:16', 0, 6, '甘肃省张掖市山丹县', 2, '山丹县', ',2925,2958,', 2958);\nINSERT INTO `area` VALUES (2965, '2015-10-19 00:53:17', '2015-10-19 00:53:17', 0, 8, '甘肃省平凉市', 1, '平凉市', ',2925,', 2925);\nINSERT INTO `area` VALUES (2966, '2015-10-19 00:53:18', '2015-10-19 00:53:18', 0, 1, '甘肃省平凉市崆峒区', 2, '崆峒区', ',2925,2965,', 2965);\nINSERT INTO `area` VALUES (2967, '2015-10-19 00:53:19', '2015-10-19 00:53:19', 0, 2, '甘肃省平凉市泾川县', 2, '泾川县', ',2925,2965,', 2965);\nINSERT INTO `area` VALUES (2968, '2015-10-19 00:53:20', '2015-10-19 00:53:20', 0, 3, '甘肃省平凉市灵台县', 2, '灵台县', ',2925,2965,', 2965);\nINSERT INTO `area` VALUES (2969, '2015-10-19 00:53:21', '2015-10-19 00:53:21', 0, 4, '甘肃省平凉市崇信县', 2, '崇信县', ',2925,2965,', 2965);\nINSERT INTO `area` VALUES (2970, '2015-10-19 00:53:22', '2015-10-19 00:53:22', 0, 5, '甘肃省平凉市华亭县', 2, '华亭县', ',2925,2965,', 2965);\nINSERT INTO `area` VALUES (2971, '2015-10-19 00:53:23', '2015-10-19 00:53:23', 0, 6, '甘肃省平凉市庄浪县', 2, '庄浪县', ',2925,2965,', 2965);\nINSERT INTO `area` VALUES (2972, '2015-10-19 00:53:24', '2015-10-19 00:53:24', 0, 7, '甘肃省平凉市静宁县', 2, '静宁县', ',2925,2965,', 2965);\nINSERT INTO `area` VALUES (2973, '2015-10-19 00:53:25', '2015-10-19 00:53:25', 0, 9, '甘肃省酒泉市', 1, '酒泉市', ',2925,', 2925);\nINSERT INTO `area` VALUES (2974, '2015-10-19 00:53:26', '2015-10-19 00:53:26', 0, 1, '甘肃省酒泉市肃州区', 2, '肃州区', ',2925,2973,', 2973);\nINSERT INTO `area` VALUES (2975, '2015-10-19 00:53:27', '2015-10-19 00:53:27', 0, 2, '甘肃省酒泉市金塔县', 2, '金塔县', ',2925,2973,', 2973);\nINSERT INTO `area` VALUES (2976, '2015-10-19 00:53:28', '2015-10-19 00:53:28', 0, 3, '甘肃省酒泉市瓜州县', 2, '瓜州县', ',2925,2973,', 2973);\nINSERT INTO `area` VALUES (2977, '2015-10-19 00:53:29', '2015-10-19 00:53:29', 0, 4, '甘肃省酒泉市肃北蒙古族自治县', 2, '肃北蒙古族自治县', ',2925,2973,', 2973);\nINSERT INTO `area` VALUES (2978, '2015-10-19 00:53:30', '2015-10-19 00:53:30', 0, 5, '甘肃省酒泉市阿克塞哈萨克族自治县', 2, '阿克塞哈萨克族自治县', ',2925,2973,', 2973);\nINSERT INTO `area` VALUES (2979, '2015-10-19 00:53:31', '2015-10-19 00:53:31', 0, 6, '甘肃省酒泉市玉门市', 2, '玉门市', ',2925,2973,', 2973);\nINSERT INTO `area` VALUES (2980, '2015-10-19 00:53:32', '2015-10-19 00:53:32', 0, 7, '甘肃省酒泉市敦煌市', 2, '敦煌市', ',2925,2973,', 2973);\nINSERT INTO `area` VALUES (2981, '2015-10-19 00:53:33', '2015-10-19 00:53:33', 0, 10, '甘肃省庆阳市', 1, '庆阳市', ',2925,', 2925);\nINSERT INTO `area` VALUES (2982, '2015-10-19 00:53:34', '2015-10-19 00:53:34', 0, 1, '甘肃省庆阳市西峰区', 2, '西峰区', ',2925,2981,', 2981);\nINSERT INTO `area` VALUES (2983, '2015-10-19 00:53:35', '2015-10-19 00:53:35', 0, 2, '甘肃省庆阳市庆城县', 2, '庆城县', ',2925,2981,', 2981);\nINSERT INTO `area` VALUES (2984, '2015-10-19 00:53:36', '2015-10-19 00:53:36', 0, 3, '甘肃省庆阳市环县', 2, '环县', ',2925,2981,', 2981);\nINSERT INTO `area` VALUES (2985, '2015-10-19 00:53:37', '2015-10-19 00:53:37', 0, 4, '甘肃省庆阳市华池县', 2, '华池县', ',2925,2981,', 2981);\nINSERT INTO `area` VALUES (2986, '2015-10-19 00:53:38', '2015-10-19 00:53:38', 0, 5, '甘肃省庆阳市合水县', 2, '合水县', ',2925,2981,', 2981);\nINSERT INTO `area` VALUES (2987, '2015-10-19 00:53:39', '2015-10-19 00:53:39', 0, 6, '甘肃省庆阳市正宁县', 2, '正宁县', ',2925,2981,', 2981);\nINSERT INTO `area` VALUES (2988, '2015-10-19 00:53:40', '2015-10-19 00:53:40', 0, 7, '甘肃省庆阳市宁县', 2, '宁县', ',2925,2981,', 2981);\nINSERT INTO `area` VALUES (2989, '2015-10-19 00:53:41', '2015-10-19 00:53:41', 0, 8, '甘肃省庆阳市镇原县', 2, '镇原县', ',2925,2981,', 2981);\nINSERT INTO `area` VALUES (2990, '2015-10-19 00:53:42', '2015-10-19 00:53:42', 0, 11, '甘肃省定西市', 1, '定西市', ',2925,', 2925);\nINSERT INTO `area` VALUES (2991, '2015-10-19 00:53:43', '2015-10-19 00:53:43', 0, 1, '甘肃省定西市安定区', 2, '安定区', ',2925,2990,', 2990);\nINSERT INTO `area` VALUES (2992, '2015-10-19 00:53:44', '2015-10-19 00:53:44', 0, 2, '甘肃省定西市通渭县', 2, '通渭县', ',2925,2990,', 2990);\nINSERT INTO `area` VALUES (2993, '2015-10-19 00:53:45', '2015-10-19 00:53:45', 0, 3, '甘肃省定西市陇西县', 2, '陇西县', ',2925,2990,', 2990);\nINSERT INTO `area` VALUES (2994, '2015-10-19 00:53:46', '2015-10-19 00:53:46', 0, 4, '甘肃省定西市渭源县', 2, '渭源县', ',2925,2990,', 2990);\nINSERT INTO `area` VALUES (2995, '2015-10-19 00:53:47', '2015-10-19 00:53:47', 0, 5, '甘肃省定西市临洮县', 2, '临洮县', ',2925,2990,', 2990);\nINSERT INTO `area` VALUES (2996, '2015-10-19 00:53:48', '2015-10-19 00:53:48', 0, 6, '甘肃省定西市漳县', 2, '漳县', ',2925,2990,', 2990);\nINSERT INTO `area` VALUES (2997, '2015-10-19 00:53:49', '2015-10-19 00:53:49', 0, 7, '甘肃省定西市岷县', 2, '岷县', ',2925,2990,', 2990);\nINSERT INTO `area` VALUES (2998, '2015-10-19 00:53:50', '2015-10-19 00:53:50', 0, 12, '甘肃省陇南市', 1, '陇南市', ',2925,', 2925);\nINSERT INTO `area` VALUES (2999, '2015-10-19 00:53:51', '2015-10-19 00:53:51', 0, 1, '甘肃省陇南市武都区', 2, '武都区', ',2925,2998,', 2998);\nINSERT INTO `area` VALUES (3000, '2015-10-19 00:53:52', '2015-10-19 00:53:52', 0, 2, '甘肃省陇南市成县', 2, '成县', ',2925,2998,', 2998);\nINSERT INTO `area` VALUES (3001, '2015-10-19 00:53:53', '2015-10-19 00:53:53', 0, 3, '甘肃省陇南市文县', 2, '文县', ',2925,2998,', 2998);\nINSERT INTO `area` VALUES (3002, '2015-10-19 00:53:54', '2015-10-19 00:53:54', 0, 4, '甘肃省陇南市宕昌县', 2, '宕昌县', ',2925,2998,', 2998);\nINSERT INTO `area` VALUES (3003, '2015-10-19 00:53:55', '2015-10-19 00:53:55', 0, 5, '甘肃省陇南市康县', 2, '康县', ',2925,2998,', 2998);\nINSERT INTO `area` VALUES (3004, '2015-10-19 00:53:56', '2015-10-19 00:53:56', 0, 6, '甘肃省陇南市西和县', 2, '西和县', ',2925,2998,', 2998);\nINSERT INTO `area` VALUES (3005, '2015-10-19 00:53:57', '2015-10-19 00:53:57', 0, 7, '甘肃省陇南市礼县', 2, '礼县', ',2925,2998,', 2998);\nINSERT INTO `area` VALUES (3006, '2015-10-19 00:53:58', '2015-10-19 00:53:58', 0, 8, '甘肃省陇南市徽县', 2, '徽县', ',2925,2998,', 2998);\nINSERT INTO `area` VALUES (3007, '2015-10-19 00:53:59', '2015-10-19 00:53:59', 0, 9, '甘肃省陇南市两当县', 2, '两当县', ',2925,2998,', 2998);\nINSERT INTO `area` VALUES (3008, '2015-10-19 00:54:00', '2015-10-19 00:54:00', 0, 13, '甘肃省临夏回族自治州', 1, '临夏回族自治州', ',2925,', 2925);\nINSERT INTO `area` VALUES (3009, '2015-10-19 00:54:01', '2015-10-19 00:54:01', 0, 1, '甘肃省临夏回族自治州临夏市', 2, '临夏市', ',2925,3008,', 3008);\nINSERT INTO `area` VALUES (3010, '2015-10-19 00:54:02', '2015-10-19 00:54:02', 0, 2, '甘肃省临夏回族自治州临夏县', 2, '临夏县', ',2925,3008,', 3008);\nINSERT INTO `area` VALUES (3011, '2015-10-19 00:54:03', '2015-10-19 00:54:03', 0, 3, '甘肃省临夏回族自治州康乐县', 2, '康乐县', ',2925,3008,', 3008);\nINSERT INTO `area` VALUES (3012, '2015-10-19 00:54:04', '2015-10-19 00:54:04', 0, 4, '甘肃省临夏回族自治州永靖县', 2, '永靖县', ',2925,3008,', 3008);\nINSERT INTO `area` VALUES (3013, '2015-10-19 00:54:05', '2015-10-19 00:54:05', 0, 5, '甘肃省临夏回族自治州广河县', 2, '广河县', ',2925,3008,', 3008);\nINSERT INTO `area` VALUES (3014, '2015-10-19 00:54:06', '2015-10-19 00:54:06', 0, 6, '甘肃省临夏回族自治州和政县', 2, '和政县', ',2925,3008,', 3008);\nINSERT INTO `area` VALUES (3015, '2015-10-19 00:54:07', '2015-10-19 00:54:07', 0, 7, '甘肃省临夏回族自治州东乡族自治县', 2, '东乡族自治县', ',2925,3008,', 3008);\nINSERT INTO `area` VALUES (3016, '2015-10-19 00:54:08', '2015-10-19 00:54:08', 0, 8, '甘肃省临夏回族自治州积石山保安族东乡族撒拉族自治县', 2, '积石山保安族东乡族撒拉族自治县', ',2925,3008,', 3008);\nINSERT INTO `area` VALUES (3017, '2015-10-19 00:54:09', '2015-10-19 00:54:09', 0, 14, '甘肃省甘南藏族自治州', 1, '甘南藏族自治州', ',2925,', 2925);\nINSERT INTO `area` VALUES (3018, '2015-10-19 00:54:10', '2015-10-19 00:54:10', 0, 1, '甘肃省甘南藏族自治州合作市', 2, '合作市', ',2925,3017,', 3017);\nINSERT INTO `area` VALUES (3019, '2015-10-19 00:54:11', '2015-10-19 00:54:11', 0, 2, '甘肃省甘南藏族自治州临潭县', 2, '临潭县', ',2925,3017,', 3017);\nINSERT INTO `area` VALUES (3020, '2015-10-19 00:54:12', '2015-10-19 00:54:12', 0, 3, '甘肃省甘南藏族自治州卓尼县', 2, '卓尼县', ',2925,3017,', 3017);\nINSERT INTO `area` VALUES (3021, '2015-10-19 00:54:13', '2015-10-19 00:54:13', 0, 4, '甘肃省甘南藏族自治州舟曲县', 2, '舟曲县', ',2925,3017,', 3017);\nINSERT INTO `area` VALUES (3022, '2015-10-19 00:54:14', '2015-10-19 00:54:14', 0, 5, '甘肃省甘南藏族自治州迭部县', 2, '迭部县', ',2925,3017,', 3017);\nINSERT INTO `area` VALUES (3023, '2015-10-19 00:54:15', '2015-10-19 00:54:15', 0, 6, '甘肃省甘南藏族自治州玛曲县', 2, '玛曲县', ',2925,3017,', 3017);\nINSERT INTO `area` VALUES (3024, '2015-10-19 00:54:16', '2015-10-19 00:54:16', 0, 7, '甘肃省甘南藏族自治州碌曲县', 2, '碌曲县', ',2925,3017,', 3017);\nINSERT INTO `area` VALUES (3025, '2015-10-19 00:54:17', '2015-10-19 00:54:17', 0, 8, '甘肃省甘南藏族自治州夏河县', 2, '夏河县', ',2925,3017,', 3017);\nINSERT INTO `area` VALUES (3026, '2015-10-19 00:54:18', '2015-10-19 00:54:18', 0, 29, '青海省', 0, '青海省', ',', NULL);\nINSERT INTO `area` VALUES (3027, '2015-10-19 00:54:19', '2015-10-19 00:54:19', 0, 1, '青海省西宁市', 1, '西宁市', ',3026,', 3026);\nINSERT INTO `area` VALUES (3028, '2015-10-19 00:54:20', '2015-10-19 00:54:20', 0, 1, '青海省西宁市城东区', 2, '城东区', ',3026,3027,', 3027);\nINSERT INTO `area` VALUES (3029, '2015-10-19 00:54:21', '2015-10-19 00:54:21', 0, 2, '青海省西宁市城中区', 2, '城中区', ',3026,3027,', 3027);\nINSERT INTO `area` VALUES (3030, '2015-10-19 00:54:22', '2015-10-19 00:54:22', 0, 3, '青海省西宁市城西区', 2, '城西区', ',3026,3027,', 3027);\nINSERT INTO `area` VALUES (3031, '2015-10-19 00:54:23', '2015-10-19 00:54:23', 0, 4, '青海省西宁市城北区', 2, '城北区', ',3026,3027,', 3027);\nINSERT INTO `area` VALUES (3032, '2015-10-19 00:54:24', '2015-10-19 00:54:24', 0, 5, '青海省西宁市大通回族土族自治县', 2, '大通回族土族自治县', ',3026,3027,', 3027);\nINSERT INTO `area` VALUES (3033, '2015-10-19 00:54:25', '2015-10-19 00:54:25', 0, 6, '青海省西宁市湟中县', 2, '湟中县', ',3026,3027,', 3027);\nINSERT INTO `area` VALUES (3034, '2015-10-19 00:54:26', '2015-10-19 00:54:26', 0, 7, '青海省西宁市湟源县', 2, '湟源县', ',3026,3027,', 3027);\nINSERT INTO `area` VALUES (3035, '2015-10-19 00:54:27', '2015-10-19 00:54:27', 0, 2, '青海省海东市', 1, '海东市', ',3026,', 3026);\nINSERT INTO `area` VALUES (3036, '2015-10-19 00:54:28', '2015-10-19 00:54:28', 0, 1, '青海省海东市乐都区', 2, '乐都区', ',3026,3035,', 3035);\nINSERT INTO `area` VALUES (3037, '2015-10-19 00:54:29', '2015-10-19 00:54:29', 0, 2, '青海省海东市平安县', 2, '平安县', ',3026,3035,', 3035);\nINSERT INTO `area` VALUES (3038, '2015-10-19 00:54:30', '2015-10-19 00:54:30', 0, 3, '青海省海东市民和回族土族自治县', 2, '民和回族土族自治县', ',3026,3035,', 3035);\nINSERT INTO `area` VALUES (3039, '2015-10-19 00:54:31', '2015-10-19 00:54:31', 0, 4, '青海省海东市互助土族自治县', 2, '互助土族自治县', ',3026,3035,', 3035);\nINSERT INTO `area` VALUES (3040, '2015-10-19 00:54:32', '2015-10-19 00:54:32', 0, 5, '青海省海东市化隆回族自治县', 2, '化隆回族自治县', ',3026,3035,', 3035);\nINSERT INTO `area` VALUES (3041, '2015-10-19 00:54:33', '2015-10-19 00:54:33', 0, 6, '青海省海东市循化撒拉族自治县', 2, '循化撒拉族自治县', ',3026,3035,', 3035);\nINSERT INTO `area` VALUES (3042, '2015-10-19 00:54:34', '2015-10-19 00:54:34', 0, 3, '青海省海北藏族自治州', 1, '海北藏族自治州', ',3026,', 3026);\nINSERT INTO `area` VALUES (3043, '2015-10-19 00:54:35', '2015-10-19 00:54:35', 0, 1, '青海省海北藏族自治州门源回族自治县', 2, '门源回族自治县', ',3026,3042,', 3042);\nINSERT INTO `area` VALUES (3044, '2015-10-19 00:54:36', '2015-10-19 00:54:36', 0, 2, '青海省海北藏族自治州祁连县', 2, '祁连县', ',3026,3042,', 3042);\nINSERT INTO `area` VALUES (3045, '2015-10-19 00:54:37', '2015-10-19 00:54:37', 0, 3, '青海省海北藏族自治州海晏县', 2, '海晏县', ',3026,3042,', 3042);\nINSERT INTO `area` VALUES (3046, '2015-10-19 00:54:38', '2015-10-19 00:54:38', 0, 4, '青海省海北藏族自治州刚察县', 2, '刚察县', ',3026,3042,', 3042);\nINSERT INTO `area` VALUES (3047, '2015-10-19 00:54:39', '2015-10-19 00:54:39', 0, 4, '青海省黄南藏族自治州', 1, '黄南藏族自治州', ',3026,', 3026);\nINSERT INTO `area` VALUES (3048, '2015-10-19 00:54:40', '2015-10-19 00:54:40', 0, 1, '青海省黄南藏族自治州同仁县', 2, '同仁县', ',3026,3047,', 3047);\nINSERT INTO `area` VALUES (3049, '2015-10-19 00:54:41', '2015-10-19 00:54:41', 0, 2, '青海省黄南藏族自治州尖扎县', 2, '尖扎县', ',3026,3047,', 3047);\nINSERT INTO `area` VALUES (3050, '2015-10-19 00:54:42', '2015-10-19 00:54:42', 0, 3, '青海省黄南藏族自治州泽库县', 2, '泽库县', ',3026,3047,', 3047);\nINSERT INTO `area` VALUES (3051, '2015-10-19 00:54:43', '2015-10-19 00:54:43', 0, 4, '青海省黄南藏族自治州河南蒙古族自治县', 2, '河南蒙古族自治县', ',3026,3047,', 3047);\nINSERT INTO `area` VALUES (3052, '2015-10-19 00:54:44', '2015-10-19 00:54:44', 0, 5, '青海省海南藏族自治州', 1, '海南藏族自治州', ',3026,', 3026);\nINSERT INTO `area` VALUES (3053, '2015-10-19 00:54:45', '2015-10-19 00:54:45', 0, 1, '青海省海南藏族自治州共和县', 2, '共和县', ',3026,3052,', 3052);\nINSERT INTO `area` VALUES (3054, '2015-10-19 00:54:46', '2015-10-19 00:54:46', 0, 2, '青海省海南藏族自治州同德县', 2, '同德县', ',3026,3052,', 3052);\nINSERT INTO `area` VALUES (3055, '2015-10-19 00:54:47', '2015-10-19 00:54:47', 0, 3, '青海省海南藏族自治州贵德县', 2, '贵德县', ',3026,3052,', 3052);\nINSERT INTO `area` VALUES (3056, '2015-10-19 00:54:48', '2015-10-19 00:54:48', 0, 4, '青海省海南藏族自治州兴海县', 2, '兴海县', ',3026,3052,', 3052);\nINSERT INTO `area` VALUES (3057, '2015-10-19 00:54:49', '2015-10-19 00:54:49', 0, 5, '青海省海南藏族自治州贵南县', 2, '贵南县', ',3026,3052,', 3052);\nINSERT INTO `area` VALUES (3058, '2015-10-19 00:54:50', '2015-10-19 00:54:50', 0, 6, '青海省果洛藏族自治州', 1, '果洛藏族自治州', ',3026,', 3026);\nINSERT INTO `area` VALUES (3059, '2015-10-19 00:54:51', '2015-10-19 00:54:51', 0, 1, '青海省果洛藏族自治州玛沁县', 2, '玛沁县', ',3026,3058,', 3058);\nINSERT INTO `area` VALUES (3060, '2015-10-19 00:54:52', '2015-10-19 00:54:52', 0, 2, '青海省果洛藏族自治州班玛县', 2, '班玛县', ',3026,3058,', 3058);\nINSERT INTO `area` VALUES (3061, '2015-10-19 00:54:53', '2015-10-19 00:54:53', 0, 3, '青海省果洛藏族自治州甘德县', 2, '甘德县', ',3026,3058,', 3058);\nINSERT INTO `area` VALUES (3062, '2015-10-19 00:54:54', '2015-10-19 00:54:54', 0, 4, '青海省果洛藏族自治州达日县', 2, '达日县', ',3026,3058,', 3058);\nINSERT INTO `area` VALUES (3063, '2015-10-19 00:54:55', '2015-10-19 00:54:55', 0, 5, '青海省果洛藏族自治州久治县', 2, '久治县', ',3026,3058,', 3058);\nINSERT INTO `area` VALUES (3064, '2015-10-19 00:54:56', '2015-10-19 00:54:56', 0, 6, '青海省果洛藏族自治州玛多县', 2, '玛多县', ',3026,3058,', 3058);\nINSERT INTO `area` VALUES (3065, '2015-10-19 00:54:57', '2015-10-19 00:54:57', 0, 7, '青海省玉树藏族自治州', 1, '玉树藏族自治州', ',3026,', 3026);\nINSERT INTO `area` VALUES (3066, '2015-10-19 00:54:58', '2015-10-19 00:54:58', 0, 1, '青海省玉树藏族自治州玉树市', 2, '玉树市', ',3026,3065,', 3065);\nINSERT INTO `area` VALUES (3067, '2015-10-19 00:54:59', '2015-10-19 00:54:59', 0, 2, '青海省玉树藏族自治州杂多县', 2, '杂多县', ',3026,3065,', 3065);\nINSERT INTO `area` VALUES (3068, '2015-10-19 00:55:00', '2015-10-19 00:55:00', 0, 3, '青海省玉树藏族自治州称多县', 2, '称多县', ',3026,3065,', 3065);\nINSERT INTO `area` VALUES (3069, '2015-10-19 00:55:01', '2015-10-19 00:55:01', 0, 4, '青海省玉树藏族自治州治多县', 2, '治多县', ',3026,3065,', 3065);\nINSERT INTO `area` VALUES (3070, '2015-10-19 00:55:02', '2015-10-19 00:55:02', 0, 5, '青海省玉树藏族自治州囊谦县', 2, '囊谦县', ',3026,3065,', 3065);\nINSERT INTO `area` VALUES (3071, '2015-10-19 00:55:03', '2015-10-19 00:55:03', 0, 6, '青海省玉树藏族自治州曲麻莱县', 2, '曲麻莱县', ',3026,3065,', 3065);\nINSERT INTO `area` VALUES (3072, '2015-10-19 00:55:04', '2015-10-19 00:55:04', 0, 8, '青海省海西蒙古族藏族自治州', 1, '海西蒙古族藏族自治州', ',3026,', 3026);\nINSERT INTO `area` VALUES (3073, '2015-10-19 00:55:05', '2015-10-19 00:55:05', 0, 1, '青海省海西蒙古族藏族自治州格尔木市', 2, '格尔木市', ',3026,3072,', 3072);\nINSERT INTO `area` VALUES (3074, '2015-10-19 00:55:06', '2015-10-19 00:55:06', 0, 2, '青海省海西蒙古族藏族自治州德令哈市', 2, '德令哈市', ',3026,3072,', 3072);\nINSERT INTO `area` VALUES (3075, '2015-10-19 00:55:07', '2015-10-19 00:55:07', 0, 3, '青海省海西蒙古族藏族自治州乌兰县', 2, '乌兰县', ',3026,3072,', 3072);\nINSERT INTO `area` VALUES (3076, '2015-10-19 00:55:08', '2015-10-19 00:55:08', 0, 4, '青海省海西蒙古族藏族自治州都兰县', 2, '都兰县', ',3026,3072,', 3072);\nINSERT INTO `area` VALUES (3077, '2015-10-19 00:55:09', '2015-10-19 00:55:09', 0, 5, '青海省海西蒙古族藏族自治州天峻县', 2, '天峻县', ',3026,3072,', 3072);\nINSERT INTO `area` VALUES (3078, '2015-10-19 00:55:10', '2015-10-19 00:55:10', 0, 30, '宁夏回族自治区', 0, '宁夏回族自治区', ',', NULL);\nINSERT INTO `area` VALUES (3079, '2015-10-19 00:55:11', '2015-10-19 00:55:11', 0, 1, '宁夏回族自治区银川市', 1, '银川市', ',3078,', 3078);\nINSERT INTO `area` VALUES (3080, '2015-10-19 00:55:12', '2015-10-19 00:55:12', 0, 1, '宁夏回族自治区银川市兴庆区', 2, '兴庆区', ',3078,3079,', 3079);\nINSERT INTO `area` VALUES (3081, '2015-10-19 00:55:13', '2015-10-19 00:55:13', 0, 2, '宁夏回族自治区银川市西夏区', 2, '西夏区', ',3078,3079,', 3079);\nINSERT INTO `area` VALUES (3082, '2015-10-19 00:55:14', '2015-10-19 00:55:14', 0, 3, '宁夏回族自治区银川市金凤区', 2, '金凤区', ',3078,3079,', 3079);\nINSERT INTO `area` VALUES (3083, '2015-10-19 00:55:15', '2015-10-19 00:55:15', 0, 4, '宁夏回族自治区银川市永宁县', 2, '永宁县', ',3078,3079,', 3079);\nINSERT INTO `area` VALUES (3084, '2015-10-19 00:55:16', '2015-10-19 00:55:16', 0, 5, '宁夏回族自治区银川市贺兰县', 2, '贺兰县', ',3078,3079,', 3079);\nINSERT INTO `area` VALUES (3085, '2015-10-19 00:55:17', '2015-10-19 00:55:17', 0, 6, '宁夏回族自治区银川市灵武市', 2, '灵武市', ',3078,3079,', 3079);\nINSERT INTO `area` VALUES (3086, '2015-10-19 00:55:18', '2015-10-19 00:55:18', 0, 2, '宁夏回族自治区石嘴山市', 1, '石嘴山市', ',3078,', 3078);\nINSERT INTO `area` VALUES (3087, '2015-10-19 00:55:19', '2015-10-19 00:55:19', 0, 1, '宁夏回族自治区石嘴山市大武口区', 2, '大武口区', ',3078,3086,', 3086);\nINSERT INTO `area` VALUES (3088, '2015-10-19 00:55:20', '2015-10-19 00:55:20', 0, 2, '宁夏回族自治区石嘴山市惠农区', 2, '惠农区', ',3078,3086,', 3086);\nINSERT INTO `area` VALUES (3089, '2015-10-19 00:55:21', '2015-10-19 00:55:21', 0, 3, '宁夏回族自治区石嘴山市平罗县', 2, '平罗县', ',3078,3086,', 3086);\nINSERT INTO `area` VALUES (3090, '2015-10-19 00:55:22', '2015-10-19 00:55:22', 0, 3, '宁夏回族自治区吴忠市', 1, '吴忠市', ',3078,', 3078);\nINSERT INTO `area` VALUES (3091, '2015-10-19 00:55:23', '2015-10-19 00:55:23', 0, 1, '宁夏回族自治区吴忠市利通区', 2, '利通区', ',3078,3090,', 3090);\nINSERT INTO `area` VALUES (3092, '2015-10-19 00:55:24', '2015-10-19 00:55:24', 0, 2, '宁夏回族自治区吴忠市红寺堡区', 2, '红寺堡区', ',3078,3090,', 3090);\nINSERT INTO `area` VALUES (3093, '2015-10-19 00:55:25', '2015-10-19 00:55:25', 0, 3, '宁夏回族自治区吴忠市盐池县', 2, '盐池县', ',3078,3090,', 3090);\nINSERT INTO `area` VALUES (3094, '2015-10-19 00:55:26', '2015-10-19 00:55:26', 0, 4, '宁夏回族自治区吴忠市同心县', 2, '同心县', ',3078,3090,', 3090);\nINSERT INTO `area` VALUES (3095, '2015-10-19 00:55:27', '2015-10-19 00:55:27', 0, 5, '宁夏回族自治区吴忠市青铜峡市', 2, '青铜峡市', ',3078,3090,', 3090);\nINSERT INTO `area` VALUES (3096, '2015-10-19 00:55:28', '2015-10-19 00:55:28', 0, 4, '宁夏回族自治区固原市', 1, '固原市', ',3078,', 3078);\nINSERT INTO `area` VALUES (3097, '2015-10-19 00:55:29', '2015-10-19 00:55:29', 0, 1, '宁夏回族自治区固原市原州区', 2, '原州区', ',3078,3096,', 3096);\nINSERT INTO `area` VALUES (3098, '2015-10-19 00:55:30', '2015-10-19 00:55:30', 0, 2, '宁夏回族自治区固原市西吉县', 2, '西吉县', ',3078,3096,', 3096);\nINSERT INTO `area` VALUES (3099, '2015-10-19 00:55:31', '2015-10-19 00:55:31', 0, 3, '宁夏回族自治区固原市隆德县', 2, '隆德县', ',3078,3096,', 3096);\nINSERT INTO `area` VALUES (3100, '2015-10-19 00:55:32', '2015-10-19 00:55:32', 0, 4, '宁夏回族自治区固原市泾源县', 2, '泾源县', ',3078,3096,', 3096);\nINSERT INTO `area` VALUES (3101, '2015-10-19 00:55:33', '2015-10-19 00:55:33', 0, 5, '宁夏回族自治区固原市彭阳县', 2, '彭阳县', ',3078,3096,', 3096);\nINSERT INTO `area` VALUES (3102, '2015-10-19 00:55:34', '2015-10-19 00:55:34', 0, 5, '宁夏回族自治区中卫市', 1, '中卫市', ',3078,', 3078);\nINSERT INTO `area` VALUES (3103, '2015-10-19 00:55:35', '2015-10-19 00:55:35', 0, 1, '宁夏回族自治区中卫市沙坡头区', 2, '沙坡头区', ',3078,3102,', 3102);\nINSERT INTO `area` VALUES (3104, '2015-10-19 00:55:36', '2015-10-19 00:55:36', 0, 2, '宁夏回族自治区中卫市中宁县', 2, '中宁县', ',3078,3102,', 3102);\nINSERT INTO `area` VALUES (3105, '2015-10-19 00:55:37', '2015-10-19 00:55:37', 0, 3, '宁夏回族自治区中卫市海原县', 2, '海原县', ',3078,3102,', 3102);\nINSERT INTO `area` VALUES (3106, '2015-10-19 00:55:38', '2015-10-19 00:55:38', 0, 31, '新疆维吾尔自治区', 0, '新疆维吾尔自治区', ',', NULL);\nINSERT INTO `area` VALUES (3107, '2015-10-19 00:55:39', '2015-10-19 00:55:39', 0, 1, '新疆维吾尔自治区乌鲁木齐市', 1, '乌鲁木齐市', ',3106,', 3106);\nINSERT INTO `area` VALUES (3108, '2015-10-19 00:55:40', '2015-10-19 00:55:40', 0, 1, '新疆维吾尔自治区乌鲁木齐市天山区', 2, '天山区', ',3106,3107,', 3107);\nINSERT INTO `area` VALUES (3109, '2015-10-19 00:55:41', '2015-10-19 00:55:41', 0, 2, '新疆维吾尔自治区乌鲁木齐市沙依巴克区', 2, '沙依巴克区', ',3106,3107,', 3107);\nINSERT INTO `area` VALUES (3110, '2015-10-19 00:55:42', '2015-10-19 00:55:42', 0, 3, '新疆维吾尔自治区乌鲁木齐市新市区', 2, '新市区', ',3106,3107,', 3107);\nINSERT INTO `area` VALUES (3111, '2015-10-19 00:55:43', '2015-10-19 00:55:43', 0, 4, '新疆维吾尔自治区乌鲁木齐市水磨沟区', 2, '水磨沟区', ',3106,3107,', 3107);\nINSERT INTO `area` VALUES (3112, '2015-10-19 00:55:44', '2015-10-19 00:55:44', 0, 5, '新疆维吾尔自治区乌鲁木齐市头屯河区', 2, '头屯河区', ',3106,3107,', 3107);\nINSERT INTO `area` VALUES (3113, '2015-10-19 00:55:45', '2015-10-19 00:55:45', 0, 6, '新疆维吾尔自治区乌鲁木齐市达坂城区', 2, '达坂城区', ',3106,3107,', 3107);\nINSERT INTO `area` VALUES (3114, '2015-10-19 00:55:46', '2015-10-19 00:55:46', 0, 7, '新疆维吾尔自治区乌鲁木齐市米东区', 2, '米东区', ',3106,3107,', 3107);\nINSERT INTO `area` VALUES (3115, '2015-10-19 00:55:47', '2015-10-19 00:55:47', 0, 8, '新疆维吾尔自治区乌鲁木齐市乌鲁木齐县', 2, '乌鲁木齐县', ',3106,3107,', 3107);\nINSERT INTO `area` VALUES (3116, '2015-10-19 00:55:48', '2015-10-19 00:55:48', 0, 2, '新疆维吾尔自治区克拉玛依市', 1, '克拉玛依市', ',3106,', 3106);\nINSERT INTO `area` VALUES (3117, '2015-10-19 00:55:49', '2015-10-19 00:55:49', 0, 1, '新疆维吾尔自治区克拉玛依市独山子区', 2, '独山子区', ',3106,3116,', 3116);\nINSERT INTO `area` VALUES (3118, '2015-10-19 00:55:50', '2015-10-19 00:55:50', 0, 2, '新疆维吾尔自治区克拉玛依市克拉玛依区', 2, '克拉玛依区', ',3106,3116,', 3116);\nINSERT INTO `area` VALUES (3119, '2015-10-19 00:55:51', '2015-10-19 00:55:51', 0, 3, '新疆维吾尔自治区克拉玛依市白碱滩区', 2, '白碱滩区', ',3106,3116,', 3116);\nINSERT INTO `area` VALUES (3120, '2015-10-19 00:55:52', '2015-10-19 00:55:52', 0, 4, '新疆维吾尔自治区克拉玛依市乌尔禾区', 2, '乌尔禾区', ',3106,3116,', 3116);\nINSERT INTO `area` VALUES (3121, '2015-10-19 00:55:53', '2015-10-19 00:55:53', 0, 3, '新疆维吾尔自治区吐鲁番地区', 1, '吐鲁番地区', ',3106,', 3106);\nINSERT INTO `area` VALUES (3122, '2015-10-19 00:55:54', '2015-10-19 00:55:54', 0, 1, '新疆维吾尔自治区吐鲁番地区吐鲁番市', 2, '吐鲁番市', ',3106,3121,', 3121);\nINSERT INTO `area` VALUES (3123, '2015-10-19 00:55:55', '2015-10-19 00:55:55', 0, 2, '新疆维吾尔自治区吐鲁番地区鄯善县', 2, '鄯善县', ',3106,3121,', 3121);\nINSERT INTO `area` VALUES (3124, '2015-10-19 00:55:56', '2015-10-19 00:55:56', 0, 3, '新疆维吾尔自治区吐鲁番地区托克逊县', 2, '托克逊县', ',3106,3121,', 3121);\nINSERT INTO `area` VALUES (3125, '2015-10-19 00:55:57', '2015-10-19 00:55:57', 0, 4, '新疆维吾尔自治区哈密地区', 1, '哈密地区', ',3106,', 3106);\nINSERT INTO `area` VALUES (3126, '2015-10-19 00:55:58', '2015-10-19 00:55:58', 0, 1, '新疆维吾尔自治区哈密地区哈密市', 2, '哈密市', ',3106,3125,', 3125);\nINSERT INTO `area` VALUES (3127, '2015-10-19 00:55:59', '2015-10-19 00:55:59', 0, 2, '新疆维吾尔自治区哈密地区巴里坤哈萨克自治县', 2, '巴里坤哈萨克自治县', ',3106,3125,', 3125);\nINSERT INTO `area` VALUES (3128, '2015-10-19 00:56:00', '2015-10-19 00:56:00', 0, 3, '新疆维吾尔自治区哈密地区伊吾县', 2, '伊吾县', ',3106,3125,', 3125);\nINSERT INTO `area` VALUES (3129, '2015-10-19 00:56:01', '2015-10-19 00:56:01', 0, 5, '新疆维吾尔自治区昌吉回族自治州', 1, '昌吉回族自治州', ',3106,', 3106);\nINSERT INTO `area` VALUES (3130, '2015-10-19 00:56:02', '2015-10-19 00:56:02', 0, 1, '新疆维吾尔自治区昌吉回族自治州昌吉市', 2, '昌吉市', ',3106,3129,', 3129);\nINSERT INTO `area` VALUES (3131, '2015-10-19 00:56:03', '2015-10-19 00:56:03', 0, 2, '新疆维吾尔自治区昌吉回族自治州阜康市', 2, '阜康市', ',3106,3129,', 3129);\nINSERT INTO `area` VALUES (3132, '2015-10-19 00:56:04', '2015-10-19 00:56:04', 0, 3, '新疆维吾尔自治区昌吉回族自治州呼图壁县', 2, '呼图壁县', ',3106,3129,', 3129);\nINSERT INTO `area` VALUES (3133, '2015-10-19 00:56:05', '2015-10-19 00:56:05', 0, 4, '新疆维吾尔自治区昌吉回族自治州玛纳斯县', 2, '玛纳斯县', ',3106,3129,', 3129);\nINSERT INTO `area` VALUES (3134, '2015-10-19 00:56:06', '2015-10-19 00:56:06', 0, 5, '新疆维吾尔自治区昌吉回族自治州奇台县', 2, '奇台县', ',3106,3129,', 3129);\nINSERT INTO `area` VALUES (3135, '2015-10-19 00:56:07', '2015-10-19 00:56:07', 0, 6, '新疆维吾尔自治区昌吉回族自治州吉木萨尔县', 2, '吉木萨尔县', ',3106,3129,', 3129);\nINSERT INTO `area` VALUES (3136, '2015-10-19 00:56:08', '2015-10-19 00:56:08', 0, 7, '新疆维吾尔自治区昌吉回族自治州木垒哈萨克自治县', 2, '木垒哈萨克自治县', ',3106,3129,', 3129);\nINSERT INTO `area` VALUES (3137, '2015-10-19 00:56:09', '2015-10-19 00:56:09', 0, 6, '新疆维吾尔自治区博尔塔拉蒙古自治州', 1, '博尔塔拉蒙古自治州', ',3106,', 3106);\nINSERT INTO `area` VALUES (3138, '2015-10-19 00:56:10', '2015-10-19 00:56:10', 0, 1, '新疆维吾尔自治区博尔塔拉蒙古自治州博乐市', 2, '博乐市', ',3106,3137,', 3137);\nINSERT INTO `area` VALUES (3139, '2015-10-19 00:56:11', '2015-10-19 00:56:11', 0, 2, '新疆维吾尔自治区博尔塔拉蒙古自治州阿拉山口市', 2, '阿拉山口市', ',3106,3137,', 3137);\nINSERT INTO `area` VALUES (3140, '2015-10-19 00:56:12', '2015-10-19 00:56:12', 0, 3, '新疆维吾尔自治区博尔塔拉蒙古自治州精河县', 2, '精河县', ',3106,3137,', 3137);\nINSERT INTO `area` VALUES (3141, '2015-10-19 00:56:13', '2015-10-19 00:56:13', 0, 4, '新疆维吾尔自治区博尔塔拉蒙古自治州温泉县', 2, '温泉县', ',3106,3137,', 3137);\nINSERT INTO `area` VALUES (3142, '2015-10-19 00:56:14', '2015-10-19 00:56:14', 0, 7, '新疆维吾尔自治区巴音郭楞蒙古自治州', 1, '巴音郭楞蒙古自治州', ',3106,', 3106);\nINSERT INTO `area` VALUES (3143, '2015-10-19 00:56:15', '2015-10-19 00:56:15', 0, 1, '新疆维吾尔自治区巴音郭楞蒙古自治州库尔勒市', 2, '库尔勒市', ',3106,3142,', 3142);\nINSERT INTO `area` VALUES (3144, '2015-10-19 00:56:16', '2015-10-19 00:56:16', 0, 2, '新疆维吾尔自治区巴音郭楞蒙古自治州轮台县', 2, '轮台县', ',3106,3142,', 3142);\nINSERT INTO `area` VALUES (3145, '2015-10-19 00:56:17', '2015-10-19 00:56:17', 0, 3, '新疆维吾尔自治区巴音郭楞蒙古自治州尉犁县', 2, '尉犁县', ',3106,3142,', 3142);\nINSERT INTO `area` VALUES (3146, '2015-10-19 00:56:18', '2015-10-19 00:56:18', 0, 4, '新疆维吾尔自治区巴音郭楞蒙古自治州若羌县', 2, '若羌县', ',3106,3142,', 3142);\nINSERT INTO `area` VALUES (3147, '2015-10-19 00:56:19', '2015-10-19 00:56:19', 0, 5, '新疆维吾尔自治区巴音郭楞蒙古自治州且末县', 2, '且末县', ',3106,3142,', 3142);\nINSERT INTO `area` VALUES (3148, '2015-10-19 00:56:20', '2015-10-19 00:56:20', 0, 6, '新疆维吾尔自治区巴音郭楞蒙古自治州焉耆回族自治县', 2, '焉耆回族自治县', ',3106,3142,', 3142);\nINSERT INTO `area` VALUES (3149, '2015-10-19 00:56:21', '2015-10-19 00:56:21', 0, 7, '新疆维吾尔自治区巴音郭楞蒙古自治州和静县', 2, '和静县', ',3106,3142,', 3142);\nINSERT INTO `area` VALUES (3150, '2015-10-19 00:56:22', '2015-10-19 00:56:22', 0, 8, '新疆维吾尔自治区巴音郭楞蒙古自治州和硕县', 2, '和硕县', ',3106,3142,', 3142);\nINSERT INTO `area` VALUES (3151, '2015-10-19 00:56:23', '2015-10-19 00:56:23', 0, 9, '新疆维吾尔自治区巴音郭楞蒙古自治州博湖县', 2, '博湖县', ',3106,3142,', 3142);\nINSERT INTO `area` VALUES (3152, '2015-10-19 00:56:24', '2015-10-19 00:56:24', 0, 8, '新疆维吾尔自治区阿克苏地区', 1, '阿克苏地区', ',3106,', 3106);\nINSERT INTO `area` VALUES (3153, '2015-10-19 00:56:25', '2015-10-19 00:56:25', 0, 1, '新疆维吾尔自治区阿克苏地区阿克苏市', 2, '阿克苏市', ',3106,3152,', 3152);\nINSERT INTO `area` VALUES (3154, '2015-10-19 00:56:26', '2015-10-19 00:56:26', 0, 2, '新疆维吾尔自治区阿克苏地区温宿县', 2, '温宿县', ',3106,3152,', 3152);\nINSERT INTO `area` VALUES (3155, '2015-10-19 00:56:27', '2015-10-19 00:56:27', 0, 3, '新疆维吾尔自治区阿克苏地区库车县', 2, '库车县', ',3106,3152,', 3152);\nINSERT INTO `area` VALUES (3156, '2015-10-19 00:56:28', '2015-10-19 00:56:28', 0, 4, '新疆维吾尔自治区阿克苏地区沙雅县', 2, '沙雅县', ',3106,3152,', 3152);\nINSERT INTO `area` VALUES (3157, '2015-10-19 00:56:29', '2015-10-19 00:56:29', 0, 5, '新疆维吾尔自治区阿克苏地区新和县', 2, '新和县', ',3106,3152,', 3152);\nINSERT INTO `area` VALUES (3158, '2015-10-19 00:56:30', '2015-10-19 00:56:30', 0, 6, '新疆维吾尔自治区阿克苏地区拜城县', 2, '拜城县', ',3106,3152,', 3152);\nINSERT INTO `area` VALUES (3159, '2015-10-19 00:56:31', '2015-10-19 00:56:31', 0, 7, '新疆维吾尔自治区阿克苏地区乌什县', 2, '乌什县', ',3106,3152,', 3152);\nINSERT INTO `area` VALUES (3160, '2015-10-19 00:56:32', '2015-10-19 00:56:32', 0, 8, '新疆维吾尔自治区阿克苏地区阿瓦提县', 2, '阿瓦提县', ',3106,3152,', 3152);\nINSERT INTO `area` VALUES (3161, '2015-10-19 00:56:33', '2015-10-19 00:56:33', 0, 9, '新疆维吾尔自治区阿克苏地区柯坪县', 2, '柯坪县', ',3106,3152,', 3152);\nINSERT INTO `area` VALUES (3162, '2015-10-19 00:56:34', '2015-10-19 00:56:34', 0, 9, '新疆维吾尔自治区克孜勒苏柯尔克孜自治州', 1, '克孜勒苏柯尔克孜自治州', ',3106,', 3106);\nINSERT INTO `area` VALUES (3163, '2015-10-19 00:56:35', '2015-10-19 00:56:35', 0, 1, '新疆维吾尔自治区克孜勒苏柯尔克孜自治州阿图什市', 2, '阿图什市', ',3106,3162,', 3162);\nINSERT INTO `area` VALUES (3164, '2015-10-19 00:56:36', '2015-10-19 00:56:36', 0, 2, '新疆维吾尔自治区克孜勒苏柯尔克孜自治州阿克陶县', 2, '阿克陶县', ',3106,3162,', 3162);\nINSERT INTO `area` VALUES (3165, '2015-10-19 00:56:37', '2015-10-19 00:56:37', 0, 3, '新疆维吾尔自治区克孜勒苏柯尔克孜自治州阿合奇县', 2, '阿合奇县', ',3106,3162,', 3162);\nINSERT INTO `area` VALUES (3166, '2015-10-19 00:56:38', '2015-10-19 00:56:38', 0, 4, '新疆维吾尔自治区克孜勒苏柯尔克孜自治州乌恰县', 2, '乌恰县', ',3106,3162,', 3162);\nINSERT INTO `area` VALUES (3167, '2015-10-19 00:56:39', '2015-10-19 00:56:39', 0, 10, '新疆维吾尔自治区喀什地区', 1, '喀什地区', ',3106,', 3106);\nINSERT INTO `area` VALUES (3168, '2015-10-19 00:56:40', '2015-10-19 00:56:40', 0, 1, '新疆维吾尔自治区喀什地区喀什市', 2, '喀什市', ',3106,3167,', 3167);\nINSERT INTO `area` VALUES (3169, '2015-10-19 00:56:41', '2015-10-19 00:56:41', 0, 2, '新疆维吾尔自治区喀什地区疏附县', 2, '疏附县', ',3106,3167,', 3167);\nINSERT INTO `area` VALUES (3170, '2015-10-19 00:56:42', '2015-10-19 00:56:42', 0, 3, '新疆维吾尔自治区喀什地区疏勒县', 2, '疏勒县', ',3106,3167,', 3167);\nINSERT INTO `area` VALUES (3171, '2015-10-19 00:56:43', '2015-10-19 00:56:43', 0, 4, '新疆维吾尔自治区喀什地区英吉沙县', 2, '英吉沙县', ',3106,3167,', 3167);\nINSERT INTO `area` VALUES (3172, '2015-10-19 00:56:44', '2015-10-19 00:56:44', 0, 5, '新疆维吾尔自治区喀什地区泽普县', 2, '泽普县', ',3106,3167,', 3167);\nINSERT INTO `area` VALUES (3173, '2015-10-19 00:56:45', '2015-10-19 00:56:45', 0, 6, '新疆维吾尔自治区喀什地区莎车县', 2, '莎车县', ',3106,3167,', 3167);\nINSERT INTO `area` VALUES (3174, '2015-10-19 00:56:46', '2015-10-19 00:56:46', 0, 7, '新疆维吾尔自治区喀什地区叶城县', 2, '叶城县', ',3106,3167,', 3167);\nINSERT INTO `area` VALUES (3175, '2015-10-19 00:56:47', '2015-10-19 00:56:47', 0, 8, '新疆维吾尔自治区喀什地区麦盖提县', 2, '麦盖提县', ',3106,3167,', 3167);\nINSERT INTO `area` VALUES (3176, '2015-10-19 00:56:48', '2015-10-19 00:56:48', 0, 9, '新疆维吾尔自治区喀什地区岳普湖县', 2, '岳普湖县', ',3106,3167,', 3167);\nINSERT INTO `area` VALUES (3177, '2015-10-19 00:56:49', '2015-10-19 00:56:49', 0, 10, '新疆维吾尔自治区喀什地区伽师县', 2, '伽师县', ',3106,3167,', 3167);\nINSERT INTO `area` VALUES (3178, '2015-10-19 00:56:50', '2015-10-19 00:56:50', 0, 11, '新疆维吾尔自治区喀什地区巴楚县', 2, '巴楚县', ',3106,3167,', 3167);\nINSERT INTO `area` VALUES (3179, '2015-10-19 00:56:51', '2015-10-19 00:56:51', 0, 12, '新疆维吾尔自治区喀什地区塔什库尔干塔吉克自治县', 2, '塔什库尔干塔吉克自治县', ',3106,3167,', 3167);\nINSERT INTO `area` VALUES (3180, '2015-10-19 00:56:52', '2015-10-19 00:56:52', 0, 11, '新疆维吾尔自治区和田地区', 1, '和田地区', ',3106,', 3106);\nINSERT INTO `area` VALUES (3181, '2015-10-19 00:56:53', '2015-10-19 00:56:53', 0, 1, '新疆维吾尔自治区和田地区和田市', 2, '和田市', ',3106,3180,', 3180);\nINSERT INTO `area` VALUES (3182, '2015-10-19 00:56:54', '2015-10-19 00:56:54', 0, 2, '新疆维吾尔自治区和田地区和田县', 2, '和田县', ',3106,3180,', 3180);\nINSERT INTO `area` VALUES (3183, '2015-10-19 00:56:55', '2015-10-19 00:56:55', 0, 3, '新疆维吾尔自治区和田地区墨玉县', 2, '墨玉县', ',3106,3180,', 3180);\nINSERT INTO `area` VALUES (3184, '2015-10-19 00:56:56', '2015-10-19 00:56:56', 0, 4, '新疆维吾尔自治区和田地区皮山县', 2, '皮山县', ',3106,3180,', 3180);\nINSERT INTO `area` VALUES (3185, '2015-10-19 00:56:57', '2015-10-19 00:56:57', 0, 5, '新疆维吾尔自治区和田地区洛浦县', 2, '洛浦县', ',3106,3180,', 3180);\nINSERT INTO `area` VALUES (3186, '2015-10-19 00:56:58', '2015-10-19 00:56:58', 0, 6, '新疆维吾尔自治区和田地区策勒县', 2, '策勒县', ',3106,3180,', 3180);\nINSERT INTO `area` VALUES (3187, '2015-10-19 00:56:59', '2015-10-19 00:56:59', 0, 7, '新疆维吾尔自治区和田地区于田县', 2, '于田县', ',3106,3180,', 3180);\nINSERT INTO `area` VALUES (3188, '2015-10-19 00:57:00', '2015-10-19 00:57:00', 0, 8, '新疆维吾尔自治区和田地区民丰县', 2, '民丰县', ',3106,3180,', 3180);\nINSERT INTO `area` VALUES (3189, '2015-10-19 00:57:01', '2015-10-19 00:57:01', 0, 12, '新疆维吾尔自治区伊犁哈萨克自治州', 1, '伊犁哈萨克自治州', ',3106,', 3106);\nINSERT INTO `area` VALUES (3190, '2015-10-19 00:57:02', '2015-10-19 00:57:02', 0, 1, '新疆维吾尔自治区伊犁哈萨克自治州伊宁市', 2, '伊宁市', ',3106,3189,', 3189);\nINSERT INTO `area` VALUES (3191, '2015-10-19 00:57:03', '2015-10-19 00:57:03', 0, 2, '新疆维吾尔自治区伊犁哈萨克自治州奎屯市', 2, '奎屯市', ',3106,3189,', 3189);\nINSERT INTO `area` VALUES (3192, '2015-10-19 00:57:04', '2015-10-19 00:57:04', 0, 3, '新疆维吾尔自治区伊犁哈萨克自治州伊宁县', 2, '伊宁县', ',3106,3189,', 3189);\nINSERT INTO `area` VALUES (3193, '2015-10-19 00:57:05', '2015-10-19 00:57:05', 0, 4, '新疆维吾尔自治区伊犁哈萨克自治州察布查尔锡伯自治县', 2, '察布查尔锡伯自治县', ',3106,3189,', 3189);\nINSERT INTO `area` VALUES (3194, '2015-10-19 00:57:06', '2015-10-19 00:57:06', 0, 5, '新疆维吾尔自治区伊犁哈萨克自治州霍城县', 2, '霍城县', ',3106,3189,', 3189);\nINSERT INTO `area` VALUES (3195, '2015-10-19 00:57:07', '2015-10-19 00:57:07', 0, 6, '新疆维吾尔自治区伊犁哈萨克自治州巩留县', 2, '巩留县', ',3106,3189,', 3189);\nINSERT INTO `area` VALUES (3196, '2015-10-19 00:57:08', '2015-10-19 00:57:08', 0, 7, '新疆维吾尔自治区伊犁哈萨克自治州新源县', 2, '新源县', ',3106,3189,', 3189);\nINSERT INTO `area` VALUES (3197, '2015-10-19 00:57:09', '2015-10-19 00:57:09', 0, 8, '新疆维吾尔自治区伊犁哈萨克自治州昭苏县', 2, '昭苏县', ',3106,3189,', 3189);\nINSERT INTO `area` VALUES (3198, '2015-10-19 00:57:10', '2015-10-19 00:57:10', 0, 9, '新疆维吾尔自治区伊犁哈萨克自治州特克斯县', 2, '特克斯县', ',3106,3189,', 3189);\nINSERT INTO `area` VALUES (3199, '2015-10-19 00:57:11', '2015-10-19 00:57:11', 0, 10, '新疆维吾尔自治区伊犁哈萨克自治州尼勒克县', 2, '尼勒克县', ',3106,3189,', 3189);\nINSERT INTO `area` VALUES (3200, '2015-10-19 00:57:12', '2015-10-19 00:57:12', 0, 13, '新疆维吾尔自治区塔城地区', 1, '塔城地区', ',3106,', 3106);\nINSERT INTO `area` VALUES (3201, '2015-10-19 00:57:13', '2015-10-19 00:57:13', 0, 1, '新疆维吾尔自治区塔城地区塔城市', 2, '塔城市', ',3106,3200,', 3200);\nINSERT INTO `area` VALUES (3202, '2015-10-19 00:57:14', '2015-10-19 00:57:14', 0, 2, '新疆维吾尔自治区塔城地区乌苏市', 2, '乌苏市', ',3106,3200,', 3200);\nINSERT INTO `area` VALUES (3203, '2015-10-19 00:57:15', '2015-10-19 00:57:15', 0, 3, '新疆维吾尔自治区塔城地区额敏县', 2, '额敏县', ',3106,3200,', 3200);\nINSERT INTO `area` VALUES (3204, '2015-10-19 00:57:16', '2015-10-19 00:57:16', 0, 4, '新疆维吾尔自治区塔城地区沙湾县', 2, '沙湾县', ',3106,3200,', 3200);\nINSERT INTO `area` VALUES (3205, '2015-10-19 00:57:17', '2015-10-19 00:57:17', 0, 5, '新疆维吾尔自治区塔城地区托里县', 2, '托里县', ',3106,3200,', 3200);\nINSERT INTO `area` VALUES (3206, '2015-10-19 00:57:18', '2015-10-19 00:57:18', 0, 6, '新疆维吾尔自治区塔城地区裕民县', 2, '裕民县', ',3106,3200,', 3200);\nINSERT INTO `area` VALUES (3207, '2015-10-19 00:57:19', '2015-10-19 00:57:19', 0, 7, '新疆维吾尔自治区塔城地区和布克赛尔蒙古自治县', 2, '和布克赛尔蒙古自治县', ',3106,3200,', 3200);\nINSERT INTO `area` VALUES (3208, '2015-10-19 00:57:20', '2015-10-19 00:57:20', 0, 14, '新疆维吾尔自治区阿勒泰地区', 1, '阿勒泰地区', ',3106,', 3106);\nINSERT INTO `area` VALUES (3209, '2015-10-19 00:57:21', '2015-10-19 00:57:21', 0, 1, '新疆维吾尔自治区阿勒泰地区阿勒泰市', 2, '阿勒泰市', ',3106,3208,', 3208);\nINSERT INTO `area` VALUES (3210, '2015-10-19 00:57:22', '2015-10-19 00:57:22', 0, 2, '新疆维吾尔自治区阿勒泰地区布尔津县', 2, '布尔津县', ',3106,3208,', 3208);\nINSERT INTO `area` VALUES (3211, '2015-10-19 00:57:23', '2015-10-19 00:57:23', 0, 3, '新疆维吾尔自治区阿勒泰地区富蕴县', 2, '富蕴县', ',3106,3208,', 3208);\nINSERT INTO `area` VALUES (3212, '2015-10-19 00:57:24', '2015-10-19 00:57:24', 0, 4, '新疆维吾尔自治区阿勒泰地区福海县', 2, '福海县', ',3106,3208,', 3208);\nINSERT INTO `area` VALUES (3213, '2015-10-19 00:57:25', '2015-10-19 00:57:25', 0, 5, '新疆维吾尔自治区阿勒泰地区哈巴河县', 2, '哈巴河县', ',3106,3208,', 3208);\nINSERT INTO `area` VALUES (3214, '2015-10-19 00:57:26', '2015-10-19 00:57:26', 0, 6, '新疆维吾尔自治区阿勒泰地区青河县', 2, '青河县', ',3106,3208,', 3208);\nINSERT INTO `area` VALUES (3215, '2015-10-19 00:57:27', '2015-10-19 00:57:27', 0, 7, '新疆维吾尔自治区阿勒泰地区吉木乃县', 2, '吉木乃县', ',3106,3208,', 3208);\nINSERT INTO `area` VALUES (3216, '2015-10-19 00:57:28', '2015-10-19 00:57:28', 0, 15, '新疆维吾尔自治区石河子市', 1, '石河子市', ',3106,', 3106);\nINSERT INTO `area` VALUES (3217, '2015-10-19 00:57:29', '2015-10-19 00:57:29', 0, 16, '新疆维吾尔自治区阿拉尔市', 1, '阿拉尔市', ',3106,', 3106);\nINSERT INTO `area` VALUES (3218, '2015-10-19 00:57:30', '2015-10-19 00:57:30', 0, 17, '新疆维吾尔自治区图木舒克市', 1, '图木舒克市', ',3106,', 3106);\nINSERT INTO `area` VALUES (3219, '2015-10-19 00:57:31', '2015-10-19 00:57:31', 0, 18, '新疆维吾尔自治区五家渠市', 1, '五家渠市', ',3106,', 3106);\nINSERT INTO `area` VALUES (3220, '2015-10-19 00:57:32', '2015-10-19 00:57:32', 0, 32, '台湾省', 0, '台湾省', ',', NULL);\nINSERT INTO `area` VALUES (3221, '2015-10-19 00:57:33', '2015-10-19 00:57:33', 0, 33, '香港特别行政区', 0, '香港特别行政区', ',', NULL);\nINSERT INTO `area` VALUES (3222, '2015-10-19 00:57:34', '2015-10-19 00:57:34', 0, 34, '澳门特别行政区', 0, '澳门特别行政区', ',', NULL);\nCOMMIT;\n\n-- ----------------------------\n-- Table structure for campaign\n-- ----------------------------\nDROP TABLE IF EXISTS `campaign`;\nCREATE TABLE `campaign` (\n  `id` bigint(20) NOT NULL AUTO_INCREMENT COMMENT 'id',\n  `type` smallint(2) DEFAULT NULL COMMENT '类型 1-主页banner',\n  `param_name1` varchar(255) DEFAULT NULL,\n  `param_value1` varchar(255) DEFAULT NULL,\n  `param_name2` varchar(255) DEFAULT NULL,\n  `param_value2` varchar(255) DEFAULT NULL,\n  `param_name3` varchar(255) DEFAULT NULL,\n  `param_value3` varchar(255) DEFAULT NULL,\n  `start_time` datetime DEFAULT NULL,\n  `end_time` datetime DEFAULT NULL,\n  `create_date` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP,\n  `update_date` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP,\n  PRIMARY KEY (`id`)\n) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4;\n\n-- ----------------------------\n-- Table structure for cart\n-- ----------------------------\nDROP TABLE IF EXISTS `cart`;\nCREATE TABLE `cart` (\n  `id` bigint(20) NOT NULL AUTO_INCREMENT,\n  `user_id` varchar(50) NOT NULL,\n  `product_id` varchar(50) NOT NULL COMMENT '商品id',\n  `quantity` int(11) NOT NULL COMMENT '数量',\n  `create_date` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间',\n  `update_date` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '更新时间',\n  PRIMARY KEY (`id`),\n  KEY `user_id_index` (`user_id`) USING BTREE\n) ENGINE=InnoDB AUTO_INCREMENT=161 DEFAULT CHARSET=utf8;\n\n-- ----------------------------\n-- Records of cart\n-- ----------------------------\nBEGIN;\nINSERT INTO `cart` VALUES (157, '20180720510302', '20180715210707', 1, '2018-07-22 14:39:21', '2018-07-22 14:39:21');\nINSERT INTO `cart` VALUES (158, '20180720510302', '20180723210908', 1, '2018-07-23 17:33:51', '2018-07-23 17:33:51');\nINSERT INTO `cart` VALUES (159, '20181106510403', '20181106211112', 1, '2018-11-06 18:07:03', '2018-11-06 18:07:03');\nINSERT INTO `cart` VALUES (160, '20181106510403', '20181110211414', 1, '2018-11-11 00:48:45', '2018-11-11 00:48:45');\nCOMMIT;\n\n-- ----------------------------\n-- Table structure for delivery_corp\n-- ----------------------------\nDROP TABLE IF EXISTS `delivery_corp`;\nCREATE TABLE `delivery_corp` (\n  `code` varchar(255) NOT NULL,\n  `name` varchar(255) NOT NULL,\n  `url` varchar(255) NOT NULL,\n  PRIMARY KEY (`code`)\n) ENGINE=InnoDB DEFAULT CHARSET=utf8;\n\n-- ----------------------------\n-- Records of delivery_corp\n-- ----------------------------\nBEGIN;\nINSERT INTO `delivery_corp` VALUES ('shentong', '申通快递', 'http://www.sto.cn');\nINSERT INTO `delivery_corp` VALUES ('shunfeng', '顺丰速运', 'http://www.sf-express.com');\nINSERT INTO `delivery_corp` VALUES ('yuantong', '圆通速递', 'http://www.yto.net.cn');\nINSERT INTO `delivery_corp` VALUES ('yunda', '韵达快递', 'http://www.yundaex.com');\nCOMMIT;\n\n-- ----------------------------\n-- Table structure for favorite_goods\n-- ----------------------------\nDROP TABLE IF EXISTS `favorite_goods`;\nCREATE TABLE `favorite_goods` (\n  `favorite_user` varchar(50) NOT NULL COMMENT '[用户ID]',\n  `favorite_goods` varchar(50) NOT NULL COMMENT '[商品ID]',\n  PRIMARY KEY (`favorite_user`,`favorite_goods`),\n  KEY `idx_user_favorite_goods` (`favorite_goods`)\n) ENGINE=InnoDB DEFAULT CHARSET=utf8;\n\n-- ----------------------------\n-- Table structure for goods\n-- ----------------------------\nDROP TABLE IF EXISTS `goods`;\nCREATE TABLE `goods` (\n  `sn` varchar(50) NOT NULL COMMENT '编号',\n  `name` varchar(255) NOT NULL COMMENT '名称',\n  `model` varchar(50) DEFAULT NULL COMMENT '型号',\n  `caption` varchar(255) NOT NULL COMMENT '副标题',\n  `image` varchar(255) NOT NULL COMMENT '展示图片',\n  `price` decimal(21,2) NOT NULL DEFAULT '0.00' COMMENT '销售价',\n  `is_delivery` tinyint(1) NOT NULL DEFAULT '0' COMMENT '是否需要物流',\n  `is_marketable` tinyint(1) NOT NULL DEFAULT '0' COMMENT '是否上架',\n  `parameter_values` longtext NOT NULL COMMENT '参数值',\n  `specification_items` longtext COMMENT '规格项',\n  `introduction` longtext NOT NULL COMMENT '介绍',\n  `product_images` longtext NOT NULL COMMENT '商品图片',\n  `campaign` int(11) DEFAULT NULL COMMENT '活动,位运算，1-拼团',\n  `groupon_count` int(11) DEFAULT NULL COMMENT '拼团人数',\n  `weight` float(11,0) NOT NULL COMMENT '重量',\n  `unit` varchar(255) NOT NULL COMMENT '单位',\n  `product_category_id` bigint(20) NOT NULL COMMENT '货品分类',\n  `create_date` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '创建日期',\n  `update_date` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '更新日期',\n  PRIMARY KEY (`sn`),\n  KEY `idx_name` (`name`),\n  KEY `idx_is_marketable` (`is_marketable`)\n) ENGINE=InnoDB DEFAULT CHARSET=utf8;\n\n-- ----------------------------\n-- Records of goods\n-- ----------------------------\nBEGIN;\nINSERT INTO `goods` VALUES ('20180702110605', 'aaa', NULL, 'bbb', 'http://yjjtest.oss-cn-shanghai.aliyuncs.com/volunteer/20180702/333fdf232c084feca7c6ba2e3bea3ff2.png', 0.01, 0, 0, '[{\\\"entries\\\":[{\\\"name\\\":\\\"a1\\\",\\\"value\\\":\\\"a11\\\"},{\\\"name\\\":\\\"a2\\\",\\\"value\\\":\\\"a22\\\"}],\\\"name\\\":\\\"a\\\"}]', NULL, 'http://yjjtest.oss-cn-shanghai.aliyuncs.com/volunteer/20180702/1da89288b5bb4d6f84f8715b51f8d8f3.png', 'http://yjjtest.oss-cn-shanghai.aliyuncs.com/volunteer/20180702/333fdf232c084feca7c6ba2e3bea3ff2.png', NULL, NULL, 3, 'dan', 10000, '2018-07-02 13:01:24', '2018-07-02 13:01:24');\nINSERT INTO `goods` VALUES ('20180715110706', 'abc', 'bac', 'ffdafa', 'http://yjjtest.oss-cn-shanghai.aliyuncs.com/volunteer/20180715/bed5372b8c8b4ae2be33bc8f44119be8.png', 0.01, 0, 1, '[{\\\"entries\\\":[{\\\"name\\\":\\\"c\\\",\\\"value\\\":\\\"bb\\\"},{\\\"name\\\":\\\"b\\\",\\\"value\\\":\\\"cc\\\"}],\\\"name\\\":\\\"a\\\"}]', '[{\\\"specificationEntries\\\":[1001,1002],\\\"specificationName\\\":1000},{\\\"specificationEntries\\\":[3001,3002],\\\"specificationName\\\":3000}]', 'http://yjjtest.oss-cn-shanghai.aliyuncs.com/volunteer/20180715/6c15e0540a9f44c886ba1d84f72e5518.png', 'http://yjjtest.oss-cn-shanghai.aliyuncs.com/volunteer/20180715/bed5372b8c8b4ae2be33bc8f44119be8.png', NULL, NULL, 3, 'a', 10202, '2018-07-15 13:30:36', '2018-07-15 13:30:36');\nINSERT INTO `goods` VALUES ('20180722110807', 'ccc', '123', 'bbb', 'http://yjjtest.oss-cn-shanghai.aliyuncs.com/volunteer/20180722/e6d031c8512444b7a1dd34109fadf2db.png', 0.01, 0, 0, '[{\\\"entries\\\":[{\\\"name\\\":\\\"b\\\",\\\"value\\\":\\\"b\\\"}],\\\"name\\\":\\\"a\\\"}]', NULL, 'http://yjjtest.oss-cn-shanghai.aliyuncs.com/volunteer/20180722/fe90c1ad741e4a279d5af0b7cb827718.png', 'http://yjjtest.oss-cn-shanghai.aliyuncs.com/volunteer/20180722/e6d031c8512444b7a1dd34109fadf2db.png', NULL, NULL, 123, 'd', 10100, '2018-07-22 22:48:19', '2018-07-22 22:48:19');\nINSERT INTO `goods` VALUES ('20180723110908', 'test1', '111', 'bbb', 'http://yjjtest.oss-cn-shanghai.aliyuncs.com/volunteer/20180723/a7df4e9e907844e3bfa3acced140beef.png', 0.01, 0, 0, '[{\\\"entries\\\":[{\\\"name\\\":\\\"b\\\",\\\"value\\\":\\\"b1\\\"},{\\\"name\\\":\\\"bb\\\",\\\"value\\\":\\\"bb1\\\"}],\\\"name\\\":\\\"a\\\"}]', NULL, 'http://yjjtest.oss-cn-shanghai.aliyuncs.com/volunteer/20180723/28415cbb9402424b9434fd1dd11110d1.png', 'http://yjjtest.oss-cn-shanghai.aliyuncs.com/volunteer/20180723/a7df4e9e907844e3bfa3acced140beef.png,http://yjjtest.oss-cn-shanghai.aliyuncs.com/volunteer/20180723/eecdfc1408884b94b52d724367b8be85.png', NULL, NULL, 1, 'd', 20000, '2018-07-23 17:27:33', '2018-07-23 17:27:33');\nINSERT INTO `goods` VALUES ('20180723110909', 'test2', 'aa', 'bbb', 'http://yjjtest.oss-cn-shanghai.aliyuncs.com/volunteer/20180723/14805ee1c1654e9ca036d2dedf0508f4.png', 0.01, 0, 0, '[{\\\"entries\\\":[{\\\"name\\\":\\\"b\\\",\\\"value\\\":\\\"b1\\\"}],\\\"name\\\":\\\"a\\\"}]', NULL, 'http://yjjtest.oss-cn-shanghai.aliyuncs.com/volunteer/20180723/84f2c3f4b1f64596a6d9dfd36e491453.png', 'http://yjjtest.oss-cn-shanghai.aliyuncs.com/volunteer/20180723/14805ee1c1654e9ca036d2dedf0508f4.png', NULL, NULL, 3, 'da', 20000, '2018-07-23 19:56:48', '2018-07-23 19:56:48');\nINSERT INTO `goods` VALUES ('20180723110910', 'test2', 'aa', 'bbb', 'http://yjjtest.oss-cn-shanghai.aliyuncs.com/volunteer/20180723/14805ee1c1654e9ca036d2dedf0508f4.png', 0.01, 0, 0, '[{\\\"entries\\\":[{\\\"name\\\":\\\"b\\\",\\\"value\\\":\\\"b1\\\"}],\\\"name\\\":\\\"a\\\"}]', NULL, 'http://yjjtest.oss-cn-shanghai.aliyuncs.com/volunteer/20180723/84f2c3f4b1f64596a6d9dfd36e491453.png', 'http://yjjtest.oss-cn-shanghai.aliyuncs.com/volunteer/20180723/14805ee1c1654e9ca036d2dedf0508f4.png', NULL, NULL, 3, 'da', 20000, '2018-07-23 19:58:17', '2018-07-23 19:58:17');\nINSERT INTO `goods` VALUES ('20180723110911', 'test2', 'aa', 'bbb', 'http://yjjtest.oss-cn-shanghai.aliyuncs.com/volunteer/20180723/14805ee1c1654e9ca036d2dedf0508f4.png', 0.01, 0, 0, '[{\\\"entries\\\":[{\\\"name\\\":\\\"b\\\",\\\"value\\\":\\\"b1\\\"}],\\\"name\\\":\\\"a\\\"}]', NULL, 'http://yjjtest.oss-cn-shanghai.aliyuncs.com/volunteer/20180723/84f2c3f4b1f64596a6d9dfd36e491453.png', 'http://yjjtest.oss-cn-shanghai.aliyuncs.com/volunteer/20180723/14805ee1c1654e9ca036d2dedf0508f4.png', NULL, NULL, 3, 'da', 20000, '2018-07-23 19:59:10', '2018-07-23 19:59:10');\nINSERT INTO `goods` VALUES ('20180723111009', 'test4', 'abc', 'bbb', 'http://yjjtest.oss-cn-shanghai.aliyuncs.com/volunteer/20180723/26e3e08da3c846fd8bd94304e1ff7ce3.png', 0.01, 1, 1, '[{\\\"entries\\\":[{\\\"name\\\":\\\"b\\\",\\\"value\\\":\\\"b1\\\"}],\\\"name\\\":\\\"a\\\"}]', NULL, 'http://yjjtest.oss-cn-shanghai.aliyuncs.com/volunteer/20180723/455846e60ba647679b1c828294ac3a64.png', 'http://yjjtest.oss-cn-shanghai.aliyuncs.com/volunteer/20180723/26e3e08da3c846fd8bd94304e1ff7ce3.png', NULL, NULL, 3, '', 10000, '2018-07-23 21:01:51', '2018-07-23 21:01:51');\nINSERT INTO `goods` VALUES ('20181106111110', 'test1', 'test1', 'aaa', 'http://yjjtest.oss-cn-shanghai.aliyuncs.com/volunteer/20181106/ff3519dbee58439b990191232ddad9b3.jpg', 0.01, 1, 1, '[{\\\"entries\\\":[{\\\"name\\\":\\\"a1\\\",\\\"value\\\":\\\"aaa\\\"}],\\\"name\\\":\\\"test\\\"}]', '[{\\\"specificationEntries\\\":[5001,5002],\\\"specificationName\\\":5000},{\\\"specificationEntries\\\":[6001,6002],\\\"specificationName\\\":6000}]', 'http://yjjtest.oss-cn-shanghai.aliyuncs.com/volunteer/20181106/938d5ecaddb64f3d9814dc12661944de.jpg', 'http://yjjtest.oss-cn-shanghai.aliyuncs.com/volunteer/20181106/ff3519dbee58439b990191232ddad9b3.jpg', NULL, NULL, 1, 'g', 30100, '2018-11-06 11:56:20', '2018-11-06 11:56:20');\nINSERT INTO `goods` VALUES ('20181106111211', '测试数据2', '测试数据2', '测试数据2测试数据2', 'http://yjjtest.oss-cn-shanghai.aliyuncs.com/volunteer/20181106/86c441b3c0b14d92b6c70e5667709e6f.jpg', 1.00, 1, 1, '[{\\\"entries\\\":[{\\\"name\\\":\\\"型号\\\",\\\"value\\\":\\\"I5\\\"},{\\\"name\\\":\\\"型号\\\",\\\"value\\\":\\\"I6\\\"}],\\\"name\\\":\\\"CPU\\\"},{\\\"entries\\\":[{\\\"name\\\":\\\"4G\\\",\\\"value\\\":\\\"4G\\\"},{\\\"name\\\":\\\"8G\\\",\\\"value\\\":\\\"8G\\\"}],\\\"name\\\":\\\"内存\\\"}]', '[{\\\"specificationEntries\\\":[5001,5002],\\\"specificationName\\\":5000},{\\\"specificationEntries\\\":[6001,6002],\\\"specificationName\\\":6000}]', 'http://yjjtest.oss-cn-shanghai.aliyuncs.com/volunteer/20181106/30b78a66048f4d3d9424fe93c314d17c.jpg', 'http://yjjtest.oss-cn-shanghai.aliyuncs.com/volunteer/20181106/86c441b3c0b14d92b6c70e5667709e6f.jpg', NULL, NULL, 1, 'g', 30100, '2018-11-06 23:47:44', '2018-11-06 23:47:44');\nINSERT INTO `goods` VALUES ('20181110111312', 'test111', 'test111', 'test111', 'http://yjjtest.oss-cn-shanghai.aliyuncs.com/volunteer/20181110/1b33ee88ab1e4ca2b03b3d13bc8e18d2.jpg', 1.00, 1, 1, '[{\\\"entries\\\":[{\\\"name\\\":\\\"a1\\\",\\\"value\\\":\\\"a11\\\"}],\\\"name\\\":\\\"a\\\"}]', '[{\\\"specificationEntries\\\":[1001,1002],\\\"specificationName\\\":1000}]', 'http://yjjtest.oss-cn-shanghai.aliyuncs.com/volunteer/20181110/6e6d0b3e3b1a49599dfdcf77db948ce5.jpg', 'http://yjjtest.oss-cn-shanghai.aliyuncs.com/volunteer/20181110/1b33ee88ab1e4ca2b03b3d13bc8e18d2.jpg', 1, NULL, 1, 'g', 30100, '2018-11-10 17:45:34', '2018-11-10 17:45:34');\nINSERT INTO `goods` VALUES ('20181110111413', '拼团测试1', '拼团测试1', '拼团测试1', 'http://yjjtest.oss-cn-shanghai.aliyuncs.com/volunteer/20181110/d4d7635cefae4837904a23a4ccbc3cf6.jpg', 1.00, 1, 1, '[{\\\"entries\\\":[{\\\"name\\\":\\\"a\\\",\\\"value\\\":\\\"2\\\"}],\\\"name\\\":\\\"a\\\"}]', '[{\\\"specificationEntries\\\":[5001,5002],\\\"specificationName\\\":5000}]', 'http://yjjtest.oss-cn-shanghai.aliyuncs.com/volunteer/20181110/4721027eea524385ae6c5905d616e740.jpg', 'http://yjjtest.oss-cn-shanghai.aliyuncs.com/volunteer/20181110/d4d7635cefae4837904a23a4ccbc3cf6.jpg', 1, 2, 1, 'g', 30200, '2018-11-10 22:03:39', '2018-11-10 22:03:39');\nINSERT INTO `goods` VALUES ('20181116111514', 'test', 'test', '', 'http://yjjtest.oss-cn-shanghai.aliyuncs.com/volunteer/20181116/f59644753ad549bfaf1a07339d17156b.jpg', 1.00, 1, 1, '[{\\\"entries\\\":[{\\\"name\\\":\\\"a\\\",\\\"value\\\":\\\"a\\\"}],\\\"name\\\":\\\"a\\\"}]', '', 'http://yjjtest.oss-cn-shanghai.aliyuncs.com/volunteer/20181116/bfa71726e2274fa4b1713eff65da8aa3.jpg', 'http://yjjtest.oss-cn-shanghai.aliyuncs.com/volunteer/20181116/f59644753ad549bfaf1a07339d17156b.jpg', NULL, NULL, 1, 'g', 40001, '2018-11-16 11:24:57', '2018-11-16 11:24:57');\nINSERT INTO `goods` VALUES ('20181117111615', 'tests', 'tests', 'tests', 'http://yjjtest.oss-cn-shanghai.aliyuncs.com/volunteer/20181117/d95067c299aa4dd6b984f28bc440719e.jpg', 1.00, 1, 1, '[{\\\"entries\\\":[{\\\"name\\\":\\\"a\\\",\\\"value\\\":\\\"a\\\"}],\\\"name\\\":\\\"a\\\"}]', '[{\\\"specificationEntries\\\":[5001,5002],\\\"specificationName\\\":5000},{\\\"specificationEntries\\\":[6002,60001],\\\"specificationName\\\":6000}]', 'http://yjjtest.oss-cn-shanghai.aliyuncs.com/volunteer/20181117/d3e7037d76024e6e93dec1e8610a902f.jpg', 'http://yjjtest.oss-cn-shanghai.aliyuncs.com/volunteer/20181117/d95067c299aa4dd6b984f28bc440719e.jpg', 1, 2, 1, 'g', 30200, '2018-11-17 11:28:14', '2018-11-17 11:28:14');\nCOMMIT;\n\n-- ----------------------------\n-- Table structure for groupon\n-- ----------------------------\nDROP TABLE IF EXISTS `groupon`;\nCREATE TABLE `groupon` (\n  `id` varchar(50) NOT NULL,\n  `goods_id` varchar(50) NOT NULL,\n  `count` int(11) NOT NULL,\n  `status` smallint(1) NOT NULL DEFAULT '0' COMMENT '0-等待开团 1-已开团 2-取消',\n  `expire_date` datetime NOT NULL,\n  `create_date` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP,\n  `update_date` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP,\n  PRIMARY KEY (`id`)\n) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4;\n\n-- ----------------------------\n-- Records of groupon\n-- ----------------------------\nBEGIN;\nINSERT INTO `groupon` VALUES ('20181111610605', '20181110111413', 2, 1, '2018-11-15 00:32:39', '2018-11-11 00:32:39', '2018-11-14 23:17:22');\nINSERT INTO `groupon` VALUES ('20181111610606', '20181110111413', 2, 1, '2018-11-15 00:34:48', '2018-11-11 00:34:48', '2018-11-14 22:51:02');\nINSERT INTO `groupon` VALUES ('20181111610607', '20181110111413', 2, 1, '2018-11-15 00:37:07', '2018-11-11 00:37:07', '2018-11-14 22:30:59');\nINSERT INTO `groupon` VALUES ('20181111610608', '20181110111413', 2, 1, '2018-11-15 00:40:54', '2018-11-11 00:40:54', '2018-11-14 22:24:28');\nINSERT INTO `groupon` VALUES ('20181111610609', '20181110111413', 2, 1, '2018-11-15 00:43:45', '2018-11-11 00:43:45', '2018-11-14 22:56:45');\nCOMMIT;\n\n-- ----------------------------\n-- Table structure for groupon_team\n-- ----------------------------\nDROP TABLE IF EXISTS `groupon_team`;\nCREATE TABLE `groupon_team` (\n  `groupon_id` varchar(50) NOT NULL,\n  `user_id` varchar(50) NOT NULL,\n  `captain` smallint(1) NOT NULL DEFAULT '0',\n  `create_date` datetime DEFAULT CURRENT_TIMESTAMP,\n  `update_date` datetime DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP,\n  PRIMARY KEY (`groupon_id`,`user_id`) USING BTREE\n) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4;\n\n-- ----------------------------\n-- Records of groupon_team\n-- ----------------------------\nBEGIN;\nINSERT INTO `groupon_team` VALUES ('20181111610605', '20181106510403', 1, '2018-11-11 00:32:39', '2018-11-11 00:32:39');\nINSERT INTO `groupon_team` VALUES ('20181111610605', '20181114510605', 0, '2018-11-14 23:17:22', '2018-11-14 23:17:22');\nINSERT INTO `groupon_team` VALUES ('20181111610606', '20181106510403', 1, '2018-11-11 00:34:48', '2018-11-11 00:34:48');\nINSERT INTO `groupon_team` VALUES ('20181111610607', '20181106510403', 1, '2018-11-11 00:37:07', '2018-11-11 00:37:07');\nINSERT INTO `groupon_team` VALUES ('20181111610608', '20181106510403', 1, '2018-11-11 00:40:54', '2018-11-11 00:40:54');\nINSERT INTO `groupon_team` VALUES ('20181111610609', '20181106510403', 1, '2018-11-11 00:43:45', '2018-11-11 00:43:45');\nCOMMIT;\n\n-- ----------------------------\n-- Table structure for logistics\n-- ----------------------------\nDROP TABLE IF EXISTS `logistics`;\nCREATE TABLE `logistics` (\n  `tracking_no` varchar(255) NOT NULL,\n  `check_state` smallint(4) NOT NULL DEFAULT '0' COMMENT '订阅状态-0未订阅 1已订阅 2订阅失败',\n  `order_state` smallint(4) DEFAULT NULL COMMENT '物流状态包括0在途中、1已揽收、2疑难、3已签收、4退签、5同城派送中、6退回、7转单等7个状态',\n  `data` longtext COMMENT '物流跟踪数据',\n  `create_date` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间',\n  `update_date` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '更新时间',\n  PRIMARY KEY (`tracking_no`)\n) ENGINE=InnoDB DEFAULT CHARSET=utf8;\n\n-- ----------------------------\n-- Records of logistics\n-- ----------------------------\nBEGIN;\nINSERT INTO `logistics` VALUES ('123', 2, NULL, NULL, '2018-11-06 23:42:10', '2018-11-06 23:42:10');\nINSERT INTO `logistics` VALUES ('800325920738721358', 1, 3, '[{\\\"context\\\":\\\"快件已签收 签收人: 快递柜 感谢使用圆通速递，期待再次为您服务\\\",\\\"ftime\\\":\\\"2018-06-26 12:31:19\\\",\\\"time\\\":\\\"2018-06-26 12:31:19\\\"},{\\\"context\\\":\\\"上海市嘉定区外岗公司李**（17740833420） 正在派件&amp;nbsp\\\",\\\"ftime\\\":\\\"2018-06-26 08:50:04\\\",\\\"time\\\":\\\"2018-06-26 08:50:04\\\"},{\\\"context\\\":\\\"快件已到达 上海市嘉定区外岗公司\\\",\\\"ftime\\\":\\\"2018-06-26 07:10:24\\\",\\\"time\\\":\\\"2018-06-26 07:10:24\\\"},{\\\"context\\\":\\\"快件已发往 上海市嘉定区外岗公司\\\",\\\"ftime\\\":\\\"2018-06-26 01:49:40\\\",\\\"time\\\":\\\"2018-06-26 01:49:40\\\"},{\\\"context\\\":\\\"快件已到达 上海转运中心\\\",\\\"ftime\\\":\\\"2018-06-26 01:30:04\\\",\\\"time\\\":\\\"2018-06-26 01:30:04\\\"},{\\\"context\\\":\\\"快件已发往 上海转运中心\\\",\\\"ftime\\\":\\\"2018-06-25 21:28:32\\\",\\\"time\\\":\\\"2018-06-25 21:28:32\\\"},{\\\"context\\\":\\\"江苏省常州市公司取件人: 武进（13861054741）已收件\\\",\\\"ftime\\\":\\\"2018-06-25 21:18:35\\\",\\\"time\\\":\\\"2018-06-25 21:18:35\\\"}]', '2018-07-28 09:55:57', '2018-07-28 13:51:00');\nCOMMIT;\n\n-- ----------------------------\n-- Table structure for order_detail\n-- ----------------------------\nDROP TABLE IF EXISTS `order_detail`;\nCREATE TABLE `order_detail` (\n  `detail_id` varchar(32) NOT NULL,\n  `order_id` varchar(32) NOT NULL,\n  `product_id` varchar(32) NOT NULL,\n  `product_name` varchar(64) NOT NULL COMMENT '商品名称',\n  `product_model` varchar(50) DEFAULT NULL COMMENT '型号',\n  `product_spec` varchar(50) DEFAULT NULL COMMENT '规格',\n  `group_price` decimal(21,2) DEFAULT NULL COMMENT '团购价',\n  `product_price` decimal(21,2) NOT NULL COMMENT '当前价格,单位分',\n  `product_quantity` int(11) NOT NULL COMMENT '数量',\n  `product_icon` varchar(512) DEFAULT NULL COMMENT '小图',\n  `create_date` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间',\n  `update_date` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT '修改时间',\n  PRIMARY KEY (`detail_id`),\n  KEY `idx_order_id` (`order_id`)\n) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4;\n\n-- ----------------------------\n-- Records of order_detail\n-- ----------------------------\nBEGIN;\nINSERT INTO `order_detail` VALUES ('20180720411716', '20180720312122', '20180715210707', 'abc', 'bac', ',1001,3002,', NULL, 0.01, 1, 'http://yjjtest.oss-cn-shanghai.aliyuncs.com/volunteer/20180715/bed5372b8c8b4ae2be33bc8f44119be8.png', '2018-07-20 23:09:10', '2018-07-20 23:09:10');\nINSERT INTO `order_detail` VALUES ('20180720411717', '20180720312122', '20180715210708', 'abc', 'bac', ',1002,3001,', NULL, 0.01, 2, 'http://yjjtest.oss-cn-shanghai.aliyuncs.com/volunteer/20180715/bed5372b8c8b4ae2be33bc8f44119be8.png', '2018-07-20 23:09:10', '2018-07-20 23:09:10');\nINSERT INTO `order_detail` VALUES ('20180721411817', '20180721312223', '20180715210707', 'abc', 'bac', ',1001,3002,', NULL, 0.01, 1, 'http://yjjtest.oss-cn-shanghai.aliyuncs.com/volunteer/20180715/bed5372b8c8b4ae2be33bc8f44119be8.png', '2018-07-21 12:49:47', '2018-07-21 12:49:47');\nINSERT INTO `order_detail` VALUES ('20180721411818', '20180721312223', '20180715210708', 'abc', 'bac', ',1002,3001,', NULL, 0.01, 2, 'http://yjjtest.oss-cn-shanghai.aliyuncs.com/volunteer/20180715/bed5372b8c8b4ae2be33bc8f44119be8.png', '2018-07-21 12:49:47', '2018-07-21 12:49:47');\nINSERT INTO `order_detail` VALUES ('20180721411819', '20180721312226', '20180715210707', 'abc', 'bac', ',1001,3002,', NULL, 0.01, 1, 'http://yjjtest.oss-cn-shanghai.aliyuncs.com/volunteer/20180715/bed5372b8c8b4ae2be33bc8f44119be8.png', '2018-07-21 12:54:10', '2018-07-21 12:54:10');\nINSERT INTO `order_detail` VALUES ('20180721411820', '20180721312226', '20180715210708', 'abc', 'bac', ',1002,3001,', NULL, 0.01, 2, 'http://yjjtest.oss-cn-shanghai.aliyuncs.com/volunteer/20180715/bed5372b8c8b4ae2be33bc8f44119be8.png', '2018-07-21 12:54:10', '2018-07-21 12:54:10');\nINSERT INTO `order_detail` VALUES ('20180721411821', '20180721312229', '20180715210707', 'abc', 'bac', ',1001,3002,', NULL, 0.01, 1, 'http://yjjtest.oss-cn-shanghai.aliyuncs.com/volunteer/20180715/bed5372b8c8b4ae2be33bc8f44119be8.png', '2018-07-21 13:11:46', '2018-07-21 13:11:46');\nINSERT INTO `order_detail` VALUES ('20180721411822', '20180721312229', '20180715210708', 'abc', 'bac', ',1002,3001,', NULL, 0.01, 2, 'http://yjjtest.oss-cn-shanghai.aliyuncs.com/volunteer/20180715/bed5372b8c8b4ae2be33bc8f44119be8.png', '2018-07-21 13:11:46', '2018-07-21 13:11:46');\nINSERT INTO `order_detail` VALUES ('20180721411823', '20180721312232', '20180715210707', 'abc', 'bac', ',1001,3002,', NULL, 0.01, 1, 'http://yjjtest.oss-cn-shanghai.aliyuncs.com/volunteer/20180715/bed5372b8c8b4ae2be33bc8f44119be8.png', '2018-07-21 13:14:11', '2018-07-21 13:14:11');\nINSERT INTO `order_detail` VALUES ('20180721411824', '20180721312232', '20180715210708', 'abc', 'bac', ',1002,3001,', NULL, 0.01, 2, 'http://yjjtest.oss-cn-shanghai.aliyuncs.com/volunteer/20180715/bed5372b8c8b4ae2be33bc8f44119be8.png', '2018-07-21 13:14:11', '2018-07-21 13:14:11');\nINSERT INTO `order_detail` VALUES ('20180721411825', '20180721312235', '20180715210707', 'abc', 'bac', ',1001,3002,', NULL, 0.01, 1, 'http://yjjtest.oss-cn-shanghai.aliyuncs.com/volunteer/20180715/bed5372b8c8b4ae2be33bc8f44119be8.png', '2018-07-21 13:14:46', '2018-07-21 13:14:46');\nINSERT INTO `order_detail` VALUES ('20180721411826', '20180721312235', '20180715210708', 'abc', 'bac', ',1002,3001,', NULL, 0.01, 2, 'http://yjjtest.oss-cn-shanghai.aliyuncs.com/volunteer/20180715/bed5372b8c8b4ae2be33bc8f44119be8.png', '2018-07-21 13:14:46', '2018-07-21 13:14:46');\nINSERT INTO `order_detail` VALUES ('20180721411827', '20180721312238', '20180715210707', 'abc', 'bac', ',1001,3002,', NULL, 0.01, 1, 'http://yjjtest.oss-cn-shanghai.aliyuncs.com/volunteer/20180715/bed5372b8c8b4ae2be33bc8f44119be8.png', '2018-07-21 13:17:29', '2018-07-21 13:17:29');\nINSERT INTO `order_detail` VALUES ('20180721411828', '20180721312238', '20180715210708', 'abc', 'bac', ',1002,3001,', NULL, 0.01, 2, 'http://yjjtest.oss-cn-shanghai.aliyuncs.com/volunteer/20180715/bed5372b8c8b4ae2be33bc8f44119be8.png', '2018-07-21 13:17:29', '2018-07-21 13:17:29');\nINSERT INTO `order_detail` VALUES ('20180721411829', '20180721312241', '20180715210707', 'abc', 'bac', ',1001,3002,', NULL, 0.01, 1, 'http://yjjtest.oss-cn-shanghai.aliyuncs.com/volunteer/20180715/bed5372b8c8b4ae2be33bc8f44119be8.png', '2018-07-21 13:18:17', '2018-07-21 13:18:17');\nINSERT INTO `order_detail` VALUES ('20180721411830', '20180721312241', '20180715210708', 'abc', 'bac', ',1002,3001,', NULL, 0.01, 2, 'http://yjjtest.oss-cn-shanghai.aliyuncs.com/volunteer/20180715/bed5372b8c8b4ae2be33bc8f44119be8.png', '2018-07-21 13:18:17', '2018-07-21 13:18:17');\nINSERT INTO `order_detail` VALUES ('20180721411831', '20180721312244', '20180715210707', 'abc', 'bac', ',1001,3002,', NULL, 0.01, 1, 'http://yjjtest.oss-cn-shanghai.aliyuncs.com/volunteer/20180715/bed5372b8c8b4ae2be33bc8f44119be8.png', '2018-07-21 13:29:22', '2018-07-21 13:29:22');\nINSERT INTO `order_detail` VALUES ('20180721411832', '20180721312244', '20180715210708', 'abc', 'bac', ',1002,3001,', NULL, 0.01, 2, 'http://yjjtest.oss-cn-shanghai.aliyuncs.com/volunteer/20180715/bed5372b8c8b4ae2be33bc8f44119be8.png', '2018-07-21 13:29:22', '2018-07-21 13:29:22');\nINSERT INTO `order_detail` VALUES ('20180721411833', '20180721312247', '20180715210707', 'abc', 'bac', ',1001,3002,', NULL, 0.01, 1, 'http://yjjtest.oss-cn-shanghai.aliyuncs.com/volunteer/20180715/bed5372b8c8b4ae2be33bc8f44119be8.png', '2018-07-21 13:31:52', '2018-07-21 13:31:52');\nINSERT INTO `order_detail` VALUES ('20180721411834', '20180721312247', '20180715210708', 'abc', 'bac', ',1002,3001,', NULL, 0.01, 2, 'http://yjjtest.oss-cn-shanghai.aliyuncs.com/volunteer/20180715/bed5372b8c8b4ae2be33bc8f44119be8.png', '2018-07-21 13:31:52', '2018-07-21 13:31:52');\nINSERT INTO `order_detail` VALUES ('20180721411835', '20180721312250', '20180715210707', 'abc', 'bac', ',1001,3002,', NULL, 0.01, 1, 'http://yjjtest.oss-cn-shanghai.aliyuncs.com/volunteer/20180715/bed5372b8c8b4ae2be33bc8f44119be8.png', '2018-07-21 13:32:25', '2018-07-21 13:32:25');\nINSERT INTO `order_detail` VALUES ('20180721411836', '20180721312250', '20180715210708', 'abc', 'bac', ',1002,3001,', NULL, 0.01, 2, 'http://yjjtest.oss-cn-shanghai.aliyuncs.com/volunteer/20180715/bed5372b8c8b4ae2be33bc8f44119be8.png', '2018-07-21 13:32:25', '2018-07-21 13:32:25');\nINSERT INTO `order_detail` VALUES ('20180721411837', '20180721312253', '20180715210707', 'abc', 'bac', ',1001,3002,', NULL, 0.01, 1, 'http://yjjtest.oss-cn-shanghai.aliyuncs.com/volunteer/20180715/bed5372b8c8b4ae2be33bc8f44119be8.png', '2018-07-21 13:32:54', '2018-07-21 13:32:54');\nINSERT INTO `order_detail` VALUES ('20180721411838', '20180721312253', '20180715210708', 'abc', 'bac', ',1002,3001,', NULL, 0.01, 2, 'http://yjjtest.oss-cn-shanghai.aliyuncs.com/volunteer/20180715/bed5372b8c8b4ae2be33bc8f44119be8.png', '2018-07-21 13:32:54', '2018-07-21 13:32:54');\nINSERT INTO `order_detail` VALUES ('20180721411839', '20180721312256', '20180715210707', 'abc', 'bac', ',1001,3002,', NULL, 0.01, 1, 'http://yjjtest.oss-cn-shanghai.aliyuncs.com/volunteer/20180715/bed5372b8c8b4ae2be33bc8f44119be8.png', '2018-07-21 13:37:01', '2018-07-21 13:37:01');\nINSERT INTO `order_detail` VALUES ('20180721411840', '20180721312256', '20180715210708', 'abc', 'bac', ',1002,3001,', NULL, 0.01, 2, 'http://yjjtest.oss-cn-shanghai.aliyuncs.com/volunteer/20180715/bed5372b8c8b4ae2be33bc8f44119be8.png', '2018-07-21 13:37:01', '2018-07-21 13:37:01');\nINSERT INTO `order_detail` VALUES ('20180721411841', '20180721312259', '20180715210707', 'abc', 'bac', ',1001,3002,', NULL, 0.01, 1, 'http://yjjtest.oss-cn-shanghai.aliyuncs.com/volunteer/20180715/bed5372b8c8b4ae2be33bc8f44119be8.png', '2018-07-21 13:37:38', '2018-07-21 13:37:38');\nINSERT INTO `order_detail` VALUES ('20180721411842', '20180721312259', '20180715210708', 'abc', 'bac', ',1002,3001,', NULL, 0.01, 2, 'http://yjjtest.oss-cn-shanghai.aliyuncs.com/volunteer/20180715/bed5372b8c8b4ae2be33bc8f44119be8.png', '2018-07-21 13:37:38', '2018-07-21 13:37:38');\nINSERT INTO `order_detail` VALUES ('20180721411843', '20180721312262', '20180715210707', 'abc', 'bac', ',1001,3002,', NULL, 0.01, 1, 'http://yjjtest.oss-cn-shanghai.aliyuncs.com/volunteer/20180715/bed5372b8c8b4ae2be33bc8f44119be8.png', '2018-07-21 13:38:15', '2018-07-21 13:38:15');\nINSERT INTO `order_detail` VALUES ('20180721411844', '20180721312262', '20180715210708', 'abc', 'bac', ',1002,3001,', NULL, 0.01, 2, 'http://yjjtest.oss-cn-shanghai.aliyuncs.com/volunteer/20180715/bed5372b8c8b4ae2be33bc8f44119be8.png', '2018-07-21 13:38:15', '2018-07-21 13:38:15');\nINSERT INTO `order_detail` VALUES ('20180721411845', '20180721312265', '20180715210707', 'abc', 'bac', ',1001,3002,', NULL, 0.01, 1, 'http://yjjtest.oss-cn-shanghai.aliyuncs.com/volunteer/20180715/bed5372b8c8b4ae2be33bc8f44119be8.png', '2018-07-21 13:40:05', '2018-07-21 13:40:05');\nINSERT INTO `order_detail` VALUES ('20180721411846', '20180721312265', '20180715210708', 'abc', 'bac', ',1002,3001,', NULL, 0.01, 2, 'http://yjjtest.oss-cn-shanghai.aliyuncs.com/volunteer/20180715/bed5372b8c8b4ae2be33bc8f44119be8.png', '2018-07-21 13:40:05', '2018-07-21 13:40:05');\nINSERT INTO `order_detail` VALUES ('20180721411847', '20180721312268', '20180715210707', 'abc', 'bac', ',1001,3002,', NULL, 0.01, 1, 'http://yjjtest.oss-cn-shanghai.aliyuncs.com/volunteer/20180715/bed5372b8c8b4ae2be33bc8f44119be8.png', '2018-07-21 13:40:49', '2018-07-21 13:40:49');\nINSERT INTO `order_detail` VALUES ('20180721411848', '20180721312268', '20180715210708', 'abc', 'bac', ',1002,3001,', NULL, 0.01, 2, 'http://yjjtest.oss-cn-shanghai.aliyuncs.com/volunteer/20180715/bed5372b8c8b4ae2be33bc8f44119be8.png', '2018-07-21 13:40:49', '2018-07-21 13:40:49');\nINSERT INTO `order_detail` VALUES ('20180721411849', '20180721312271', '20180715210707', 'abc', 'bac', ',1001,3002,', NULL, 0.01, 1, 'http://yjjtest.oss-cn-shanghai.aliyuncs.com/volunteer/20180715/bed5372b8c8b4ae2be33bc8f44119be8.png', '2018-07-21 13:41:25', '2018-07-21 13:41:25');\nINSERT INTO `order_detail` VALUES ('20180721411850', '20180721312271', '20180715210708', 'abc', 'bac', ',1002,3001,', NULL, 0.01, 2, 'http://yjjtest.oss-cn-shanghai.aliyuncs.com/volunteer/20180715/bed5372b8c8b4ae2be33bc8f44119be8.png', '2018-07-21 13:41:25', '2018-07-21 13:41:25');\nINSERT INTO `order_detail` VALUES ('20180721411851', '20180721312274', '20180715210707', 'abc', 'bac', ',1001,3002,', NULL, 0.01, 1, 'http://yjjtest.oss-cn-shanghai.aliyuncs.com/volunteer/20180715/bed5372b8c8b4ae2be33bc8f44119be8.png', '2018-07-21 13:43:34', '2018-07-21 13:43:34');\nINSERT INTO `order_detail` VALUES ('20180721411852', '20180721312274', '20180715210708', 'abc', 'bac', ',1002,3001,', NULL, 0.01, 2, 'http://yjjtest.oss-cn-shanghai.aliyuncs.com/volunteer/20180715/bed5372b8c8b4ae2be33bc8f44119be8.png', '2018-07-21 13:43:34', '2018-07-21 13:43:34');\nINSERT INTO `order_detail` VALUES ('20180721411853', '20180721312277', '20180715210707', 'abc', 'bac', ',1001,3002,', NULL, 0.01, 1, 'http://yjjtest.oss-cn-shanghai.aliyuncs.com/volunteer/20180715/bed5372b8c8b4ae2be33bc8f44119be8.png', '2018-07-21 13:44:59', '2018-07-21 13:44:59');\nINSERT INTO `order_detail` VALUES ('20180721411854', '20180721312277', '20180715210708', 'abc', 'bac', ',1002,3001,', NULL, 0.01, 2, 'http://yjjtest.oss-cn-shanghai.aliyuncs.com/volunteer/20180715/bed5372b8c8b4ae2be33bc8f44119be8.png', '2018-07-21 13:44:59', '2018-07-21 13:44:59');\nINSERT INTO `order_detail` VALUES ('20180721411855', '20180721312280', '20180715210707', 'abc', 'bac', ',1001,3002,', NULL, 0.01, 1, 'http://yjjtest.oss-cn-shanghai.aliyuncs.com/volunteer/20180715/bed5372b8c8b4ae2be33bc8f44119be8.png', '2018-07-21 13:45:59', '2018-07-21 13:45:59');\nINSERT INTO `order_detail` VALUES ('20180721411856', '20180721312280', '20180715210708', 'abc', 'bac', ',1002,3001,', NULL, 0.01, 2, 'http://yjjtest.oss-cn-shanghai.aliyuncs.com/volunteer/20180715/bed5372b8c8b4ae2be33bc8f44119be8.png', '2018-07-21 13:45:59', '2018-07-21 13:45:59');\nINSERT INTO `order_detail` VALUES ('20180721411857', '20180721312283', '20180715210707', 'abc', 'bac', ',1001,3002,', NULL, 0.01, 1, 'http://yjjtest.oss-cn-shanghai.aliyuncs.com/volunteer/20180715/bed5372b8c8b4ae2be33bc8f44119be8.png', '2018-07-21 13:46:32', '2018-07-21 13:46:32');\nINSERT INTO `order_detail` VALUES ('20180721411858', '20180721312283', '20180715210708', 'abc', 'bac', ',1002,3001,', NULL, 0.01, 2, 'http://yjjtest.oss-cn-shanghai.aliyuncs.com/volunteer/20180715/bed5372b8c8b4ae2be33bc8f44119be8.png', '2018-07-21 13:46:32', '2018-07-21 13:46:32');\nINSERT INTO `order_detail` VALUES ('20180721411859', '20180721312286', '20180715210707', 'abc', 'bac', ',1001,3002,', NULL, 0.01, 1, 'http://yjjtest.oss-cn-shanghai.aliyuncs.com/volunteer/20180715/bed5372b8c8b4ae2be33bc8f44119be8.png', '2018-07-21 13:48:07', '2018-07-21 13:48:07');\nINSERT INTO `order_detail` VALUES ('20180721411860', '20180721312286', '20180715210708', 'abc', 'bac', ',1002,3001,', NULL, 0.01, 2, 'http://yjjtest.oss-cn-shanghai.aliyuncs.com/volunteer/20180715/bed5372b8c8b4ae2be33bc8f44119be8.png', '2018-07-21 13:48:07', '2018-07-21 13:48:07');\nINSERT INTO `order_detail` VALUES ('20180721411861', '20180721312289', '20180715210707', 'abc', 'bac', ',1001,3002,', NULL, 0.01, 1, 'http://yjjtest.oss-cn-shanghai.aliyuncs.com/volunteer/20180715/bed5372b8c8b4ae2be33bc8f44119be8.png', '2018-07-21 13:50:59', '2018-07-21 13:50:59');\nINSERT INTO `order_detail` VALUES ('20180721411862', '20180721312289', '20180715210708', 'abc', 'bac', ',1002,3001,', NULL, 0.01, 2, 'http://yjjtest.oss-cn-shanghai.aliyuncs.com/volunteer/20180715/bed5372b8c8b4ae2be33bc8f44119be8.png', '2018-07-21 13:50:59', '2018-07-21 13:50:59');\nINSERT INTO `order_detail` VALUES ('20180721411863', '20180721312292', '20180715210707', 'abc', 'bac', ',1001,3002,', NULL, 0.01, 1, 'http://yjjtest.oss-cn-shanghai.aliyuncs.com/volunteer/20180715/bed5372b8c8b4ae2be33bc8f44119be8.png', '2018-07-21 13:51:32', '2018-07-21 13:51:32');\nINSERT INTO `order_detail` VALUES ('20180721411864', '20180721312292', '20180715210708', 'abc', 'bac', ',1002,3001,', NULL, 0.01, 2, 'http://yjjtest.oss-cn-shanghai.aliyuncs.com/volunteer/20180715/bed5372b8c8b4ae2be33bc8f44119be8.png', '2018-07-21 13:51:32', '2018-07-21 13:51:32');\nINSERT INTO `order_detail` VALUES ('20180721411865', '20180721312295', '20180715210707', 'abc', 'bac', ',1001,3002,', NULL, 0.01, 1, 'http://yjjtest.oss-cn-shanghai.aliyuncs.com/volunteer/20180715/bed5372b8c8b4ae2be33bc8f44119be8.png', '2018-07-21 13:51:48', '2018-07-21 13:51:48');\nINSERT INTO `order_detail` VALUES ('20180721411866', '20180721312295', '20180715210708', 'abc', 'bac', ',1002,3001,', NULL, 0.01, 2, 'http://yjjtest.oss-cn-shanghai.aliyuncs.com/volunteer/20180715/bed5372b8c8b4ae2be33bc8f44119be8.png', '2018-07-21 13:51:48', '2018-07-21 13:51:48');\nINSERT INTO `order_detail` VALUES ('20180721411867', '20180721312298', '20180715210707', 'abc', 'bac', ',1001,3002,', NULL, 0.01, 1, 'http://yjjtest.oss-cn-shanghai.aliyuncs.com/volunteer/20180715/bed5372b8c8b4ae2be33bc8f44119be8.png', '2018-07-21 13:52:49', '2018-07-21 13:52:49');\nINSERT INTO `order_detail` VALUES ('20180721411868', '20180721312298', '20180715210708', 'abc', 'bac', ',1002,3001,', NULL, 0.01, 2, 'http://yjjtest.oss-cn-shanghai.aliyuncs.com/volunteer/20180715/bed5372b8c8b4ae2be33bc8f44119be8.png', '2018-07-21 13:52:49', '2018-07-21 13:52:49');\nINSERT INTO `order_detail` VALUES ('20180721411869', '20180721312301', '20180715210707', 'abc', 'bac', ',1001,3002,', NULL, 0.01, 1, 'http://yjjtest.oss-cn-shanghai.aliyuncs.com/volunteer/20180715/bed5372b8c8b4ae2be33bc8f44119be8.png', '2018-07-21 13:53:42', '2018-07-21 13:53:42');\nINSERT INTO `order_detail` VALUES ('20180721411870', '20180721312301', '20180715210708', 'abc', 'bac', ',1002,3001,', NULL, 0.01, 2, 'http://yjjtest.oss-cn-shanghai.aliyuncs.com/volunteer/20180715/bed5372b8c8b4ae2be33bc8f44119be8.png', '2018-07-21 13:53:42', '2018-07-21 13:53:42');\nINSERT INTO `order_detail` VALUES ('20180721411918', '20180721312323', '20180715210708', 'abc', 'bac', ',1002,3001,', NULL, 0.01, 1, 'http://yjjtest.oss-cn-shanghai.aliyuncs.com/volunteer/20180715/bed5372b8c8b4ae2be33bc8f44119be8.png', '2018-07-21 16:57:15', '2018-07-21 16:57:15');\nINSERT INTO `order_detail` VALUES ('20180721411919', '20180721312325', '20180715210708', 'abc', 'bac', ',1002,3001,', NULL, 0.01, 2, 'http://yjjtest.oss-cn-shanghai.aliyuncs.com/volunteer/20180715/bed5372b8c8b4ae2be33bc8f44119be8.png', '2018-07-21 17:00:26', '2018-07-21 17:00:26');\nINSERT INTO `order_detail` VALUES ('20180721411920', '20180721312327', '20180715210708', 'abc', 'bac', ',1002,3001,', NULL, 0.01, 1, 'http://yjjtest.oss-cn-shanghai.aliyuncs.com/volunteer/20180715/bed5372b8c8b4ae2be33bc8f44119be8.png', '2018-07-21 17:02:02', '2018-07-21 17:02:02');\nINSERT INTO `order_detail` VALUES ('20180721411921', '20180721312329', '20180715210708', 'abc', 'bac', ',1002,3001,', NULL, 0.01, 1, 'http://yjjtest.oss-cn-shanghai.aliyuncs.com/volunteer/20180715/bed5372b8c8b4ae2be33bc8f44119be8.png', '2018-07-21 17:03:09', '2018-07-21 17:03:09');\nINSERT INTO `order_detail` VALUES ('20180721411922', '20180721312331', '20180715210708', 'abc', 'bac', ',1002,3001,', NULL, 0.01, 1, 'http://yjjtest.oss-cn-shanghai.aliyuncs.com/volunteer/20180715/bed5372b8c8b4ae2be33bc8f44119be8.png', '2018-07-21 17:05:06', '2018-07-21 17:05:06');\nINSERT INTO `order_detail` VALUES ('20180722412019', '20180722312425', '20180715210707', 'abc', 'bac', ',1001,3002,', NULL, 0.01, 3, 'http://yjjtest.oss-cn-shanghai.aliyuncs.com/volunteer/20180715/bed5372b8c8b4ae2be33bc8f44119be8.png', '2018-07-22 11:35:27', '2018-07-22 11:35:27');\nINSERT INTO `order_detail` VALUES ('20180722412020', '20180722312425', '20180715210708', 'abc', 'bac', ',1002,3001,', NULL, 0.01, 3, 'http://yjjtest.oss-cn-shanghai.aliyuncs.com/volunteer/20180715/bed5372b8c8b4ae2be33bc8f44119be8.png', '2018-07-22 11:35:27', '2018-07-22 11:35:27');\nINSERT INTO `order_detail` VALUES ('20180722412021', '20180722312427', '20180715210708', 'abc', 'bac', ',1002,3001,', NULL, 0.01, 1, 'http://yjjtest.oss-cn-shanghai.aliyuncs.com/volunteer/20180715/bed5372b8c8b4ae2be33bc8f44119be8.png', '2018-07-22 11:40:02', '2018-07-22 11:40:02');\nINSERT INTO `order_detail` VALUES ('20180722412022', '20180722312429', '20180715210708', 'abc', 'bac', ',1002,3001,', NULL, 0.01, 1, 'http://yjjtest.oss-cn-shanghai.aliyuncs.com/volunteer/20180715/bed5372b8c8b4ae2be33bc8f44119be8.png', '2018-07-22 14:08:06', '2018-07-22 14:08:06');\nINSERT INTO `order_detail` VALUES ('20180722412120', '20180722312525', '20180722210807', 'ccc', '123', NULL, NULL, 123.00, 1, 'http://yjjtest.oss-cn-shanghai.aliyuncs.com/volunteer/20180722/e6d031c8512444b7a1dd34109fadf2db.png', '2018-07-22 22:53:14', '2018-07-22 22:53:14');\nINSERT INTO `order_detail` VALUES ('20181106412322', '20181106312727', '20180723211009', 'test4', 'abc', NULL, NULL, 0.02, 1, 'http://yjjtest.oss-cn-shanghai.aliyuncs.com/volunteer/20180723/26e3e08da3c846fd8bd94304e1ff7ce3.png', '2018-11-06 11:15:10', '2018-11-06 11:15:10');\nINSERT INTO `order_detail` VALUES ('20181106412423', '20181106312828', '20180723211009', 'test4', 'abc', NULL, NULL, 0.02, 1, 'http://yjjtest.oss-cn-shanghai.aliyuncs.com/volunteer/20180723/26e3e08da3c846fd8bd94304e1ff7ce3.png', '2018-11-06 11:19:05', '2018-11-06 11:19:05');\nINSERT INTO `order_detail` VALUES ('20181106412524', '20181106312929', '20181106211112', 'test1', 'test1', ',5002,6001,', NULL, 0.03, 1, 'http://yjjtest.oss-cn-shanghai.aliyuncs.com/volunteer/20181106/ff3519dbee58439b990191232ddad9b3.jpg', '2018-11-06 11:56:59', '2018-11-06 11:56:59');\nINSERT INTO `order_detail` VALUES ('20181106412625', '20181106313030', '20181106211112', 'test1', 'test1', ',5002,6001,', NULL, 0.03, 1, 'http://yjjtest.oss-cn-shanghai.aliyuncs.com/volunteer/20181106/ff3519dbee58439b990191232ddad9b3.jpg', '2018-11-06 18:08:49', '2018-11-06 18:08:49');\nINSERT INTO `order_detail` VALUES ('20181106412726', '20181106313131', '20181106211111', 'test1', 'test1', ',5001,6002,', NULL, 0.01, 1, 'http://yjjtest.oss-cn-shanghai.aliyuncs.com/volunteer/20181106/ff3519dbee58439b990191232ddad9b3.jpg', '2018-11-06 23:21:28', '2018-11-06 23:21:28');\nINSERT INTO `order_detail` VALUES ('20181106412727', '20181106313133', '20181106211112', 'test1', 'test1', ',5002,6001,', NULL, 0.03, 1, 'http://yjjtest.oss-cn-shanghai.aliyuncs.com/volunteer/20181106/ff3519dbee58439b990191232ddad9b3.jpg', '2018-11-06 23:30:23', '2018-11-06 23:30:23');\nINSERT INTO `order_detail` VALUES ('20181110412827', '20181110313333', '20181110211414', '拼团测试1', '拼团测试1', ',5002,', 0.02, 3.00, 1, 'http://yjjtest.oss-cn-shanghai.aliyuncs.com/volunteer/20181110/d4d7635cefae4837904a23a4ccbc3cf6.jpg', '2018-11-10 22:46:01', '2018-11-10 22:46:01');\nINSERT INTO `order_detail` VALUES ('20181110412828', '20181110313335', '20181110211414', '拼团测试1', '拼团测试1', ',5002,', 0.02, 3.00, 1, 'http://yjjtest.oss-cn-shanghai.aliyuncs.com/volunteer/20181110/d4d7635cefae4837904a23a4ccbc3cf6.jpg', '2018-11-10 22:48:46', '2018-11-10 22:48:46');\nINSERT INTO `order_detail` VALUES ('20181110412928', '20181110313434', '20181110211414', '拼团测试1', '拼团测试1', ',5002,', 0.02, 3.00, 1, 'http://yjjtest.oss-cn-shanghai.aliyuncs.com/volunteer/20181110/d4d7635cefae4837904a23a4ccbc3cf6.jpg', '2018-11-10 23:18:25', '2018-11-10 23:18:25');\nINSERT INTO `order_detail` VALUES ('20181110413029', '20181110313535', '20181110211414', '拼团测试1', '拼团测试1', ',5002,', 0.02, 3.00, 1, 'http://yjjtest.oss-cn-shanghai.aliyuncs.com/volunteer/20181110/d4d7635cefae4837904a23a4ccbc3cf6.jpg', '2018-11-10 23:26:32', '2018-11-10 23:26:32');\nINSERT INTO `order_detail` VALUES ('20181110413130', '20181110313636', '20181110211414', '拼团测试1', '拼团测试1', ',5002,', 0.02, 3.00, 2, 'http://yjjtest.oss-cn-shanghai.aliyuncs.com/volunteer/20181110/d4d7635cefae4837904a23a4ccbc3cf6.jpg', '2018-11-10 23:32:32', '2018-11-10 23:32:32');\nINSERT INTO `order_detail` VALUES ('20181110413231', '20181110313737', '20181110211414', '拼团测试1', '拼团测试1', ',5002,', 0.02, 3.00, 1, 'http://yjjtest.oss-cn-shanghai.aliyuncs.com/volunteer/20181110/d4d7635cefae4837904a23a4ccbc3cf6.jpg', '2018-11-10 23:49:22', '2018-11-10 23:49:22');\nINSERT INTO `order_detail` VALUES ('20181110413232', '20181110313739', '20181110211414', '拼团测试1', '拼团测试1', ',5002,', 0.02, 3.00, 1, 'http://yjjtest.oss-cn-shanghai.aliyuncs.com/volunteer/20181110/d4d7635cefae4837904a23a4ccbc3cf6.jpg', '2018-11-10 23:51:46', '2018-11-10 23:51:46');\nINSERT INTO `order_detail` VALUES ('20181110413233', '20181110313741', '20181110211414', '拼团测试1', '拼团测试1', ',5002,', 0.02, 3.00, 1, 'http://yjjtest.oss-cn-shanghai.aliyuncs.com/volunteer/20181110/d4d7635cefae4837904a23a4ccbc3cf6.jpg', '2018-11-10 23:57:09', '2018-11-10 23:57:09');\nINSERT INTO `order_detail` VALUES ('20181111413234', '20181111313743', '20181110211414', '拼团测试1', '拼团测试1', ',5002,', 0.02, 3.00, 1, 'http://yjjtest.oss-cn-shanghai.aliyuncs.com/volunteer/20181110/d4d7635cefae4837904a23a4ccbc3cf6.jpg', '2018-11-11 00:00:35', '2018-11-11 00:00:35');\nINSERT INTO `order_detail` VALUES ('20181111413235', '20181111313745', '20181110211414', '拼团测试1', '拼团测试1', ',5002,', 0.02, 3.00, 1, 'http://yjjtest.oss-cn-shanghai.aliyuncs.com/volunteer/20181110/d4d7635cefae4837904a23a4ccbc3cf6.jpg', '2018-11-11 00:04:28', '2018-11-11 00:04:28');\nINSERT INTO `order_detail` VALUES ('20181111413236', '20181111313747', '20181110211414', '拼团测试1', '拼团测试1', ',5002,', 0.02, 3.00, 1, 'http://yjjtest.oss-cn-shanghai.aliyuncs.com/volunteer/20181110/d4d7635cefae4837904a23a4ccbc3cf6.jpg', '2018-11-11 00:05:57', '2018-11-11 00:05:57');\nINSERT INTO `order_detail` VALUES ('20181111413332', '20181111313838', '20181110211414', '拼团测试1', '拼团测试1', ',5002,', 0.02, 3.00, 1, 'http://yjjtest.oss-cn-shanghai.aliyuncs.com/volunteer/20181110/d4d7635cefae4837904a23a4ccbc3cf6.jpg', '2018-11-11 00:07:32', '2018-11-11 00:07:32');\nINSERT INTO `order_detail` VALUES ('20181111413433', '20181111313939', '20181110211414', '拼团测试1', '拼团测试1', ',5002,', 0.02, 3.00, 1, 'http://yjjtest.oss-cn-shanghai.aliyuncs.com/volunteer/20181110/d4d7635cefae4837904a23a4ccbc3cf6.jpg', '2018-11-11 00:14:28', '2018-11-11 00:14:28');\nINSERT INTO `order_detail` VALUES ('20181111413434', '20181111313941', '20181110211414', '拼团测试1', '拼团测试1', ',5002,', 0.02, 3.00, 1, 'http://yjjtest.oss-cn-shanghai.aliyuncs.com/volunteer/20181110/d4d7635cefae4837904a23a4ccbc3cf6.jpg', '2018-11-11 00:16:03', '2018-11-11 00:16:03');\nINSERT INTO `order_detail` VALUES ('20181111413435', '20181111313943', '20181110211414', '拼团测试1', '拼团测试1', ',5002,', 0.02, 3.00, 1, 'http://yjjtest.oss-cn-shanghai.aliyuncs.com/volunteer/20181110/d4d7635cefae4837904a23a4ccbc3cf6.jpg', '2018-11-11 00:17:26', '2018-11-11 00:17:26');\nINSERT INTO `order_detail` VALUES ('20181111413534', '20181111314040', '20181110211414', '拼团测试1', '拼团测试1', ',5002,', 0.02, 3.00, 1, 'http://yjjtest.oss-cn-shanghai.aliyuncs.com/volunteer/20181110/d4d7635cefae4837904a23a4ccbc3cf6.jpg', '2018-11-11 00:32:33', '2018-11-11 00:32:33');\nINSERT INTO `order_detail` VALUES ('20181111413535', '20181111314042', '20181110211414', '拼团测试1', '拼团测试1', ',5002,', 0.02, 3.00, 1, 'http://yjjtest.oss-cn-shanghai.aliyuncs.com/volunteer/20181110/d4d7635cefae4837904a23a4ccbc3cf6.jpg', '2018-11-11 00:34:42', '2018-11-11 00:34:42');\nINSERT INTO `order_detail` VALUES ('20181111413536', '20181111314044', '20181110211414', '拼团测试1', '拼团测试1', ',5002,', 0.02, 3.00, 1, 'http://yjjtest.oss-cn-shanghai.aliyuncs.com/volunteer/20181110/d4d7635cefae4837904a23a4ccbc3cf6.jpg', '2018-11-11 00:37:01', '2018-11-11 00:37:01');\nINSERT INTO `order_detail` VALUES ('20181111413537', '20181111314046', '20181110211414', '拼团测试1', '拼团测试1', ',5002,', 0.02, 3.00, 1, 'http://yjjtest.oss-cn-shanghai.aliyuncs.com/volunteer/20181110/d4d7635cefae4837904a23a4ccbc3cf6.jpg', '2018-11-11 00:40:49', '2018-11-11 00:40:49');\nINSERT INTO `order_detail` VALUES ('20181111413538', '20181111314048', '20181110211414', '拼团测试1', '拼团测试1', ',5002,', 0.02, 3.00, 1, 'http://yjjtest.oss-cn-shanghai.aliyuncs.com/volunteer/20181110/d4d7635cefae4837904a23a4ccbc3cf6.jpg', '2018-11-11 00:42:38', '2018-11-11 00:42:38');\nINSERT INTO `order_detail` VALUES ('20181111413539', '20181111314050', '20181110211414', '拼团测试1', '拼团测试1', ',5002,', 0.02, 3.00, 1, 'http://yjjtest.oss-cn-shanghai.aliyuncs.com/volunteer/20181110/d4d7635cefae4837904a23a4ccbc3cf6.jpg', '2018-11-11 00:43:39', '2018-11-11 00:43:39');\nINSERT INTO `order_detail` VALUES ('20181111413540', '20181111314052', '20180715210707', 'abc', 'bac', ',1001,3002,', 0.00, 0.01, 1, 'http://yjjtest.oss-cn-shanghai.aliyuncs.com/volunteer/20180715/bed5372b8c8b4ae2be33bc8f44119be8.png', '2018-11-11 00:51:56', '2018-11-11 00:51:56');\nINSERT INTO `order_detail` VALUES ('20181114413635', '20181114314141', '20181110211413', '拼团测试1', '拼团测试1', ',5001,', 0.01, 2.00, 1, 'http://yjjtest.oss-cn-shanghai.aliyuncs.com/volunteer/20181110/d4d7635cefae4837904a23a4ccbc3cf6.jpg', '2018-11-14 20:57:24', '2018-11-14 20:57:24');\nINSERT INTO `order_detail` VALUES ('20181114413636', '20181114314143', '20181110211413', '拼团测试1', '拼团测试1', ',5001,', 0.01, 2.00, 1, 'http://yjjtest.oss-cn-shanghai.aliyuncs.com/volunteer/20181110/d4d7635cefae4837904a23a4ccbc3cf6.jpg', '2018-11-14 20:58:41', '2018-11-14 20:58:41');\nINSERT INTO `order_detail` VALUES ('20181114413736', '20181114314242', '20181110211414', '拼团测试1', '拼团测试1', ',5002,', 0.02, 3.00, 1, 'http://yjjtest.oss-cn-shanghai.aliyuncs.com/volunteer/20181110/d4d7635cefae4837904a23a4ccbc3cf6.jpg', '2018-11-14 21:22:28', '2018-11-14 21:22:28');\nINSERT INTO `order_detail` VALUES ('20181114413837', '20181114314343', '20181110211414', '拼团测试1', '拼团测试1', ',5002,', 0.02, 3.00, 1, 'http://yjjtest.oss-cn-shanghai.aliyuncs.com/volunteer/20181110/d4d7635cefae4837904a23a4ccbc3cf6.jpg', '2018-11-14 22:15:19', '2018-11-14 22:15:19');\nINSERT INTO `order_detail` VALUES ('20181114413838', '20181114314345', '20181110211414', '拼团测试1', '拼团测试1', ',5002,', 0.02, 3.00, 1, 'http://yjjtest.oss-cn-shanghai.aliyuncs.com/volunteer/20181110/d4d7635cefae4837904a23a4ccbc3cf6.jpg', '2018-11-14 22:16:26', '2018-11-14 22:16:26');\nINSERT INTO `order_detail` VALUES ('20181114413938', '20181114314444', '20181110211413', '拼团测试1', '拼团测试1', ',5001,', 0.01, 2.00, 1, 'http://yjjtest.oss-cn-shanghai.aliyuncs.com/volunteer/20181110/d4d7635cefae4837904a23a4ccbc3cf6.jpg', '2018-11-14 22:24:22', '2018-11-14 22:24:22');\nINSERT INTO `order_detail` VALUES ('20181114413939', '20181114314446', '20181110211413', '拼团测试1', '拼团测试1', ',5001,', 0.01, 2.00, 1, 'http://yjjtest.oss-cn-shanghai.aliyuncs.com/volunteer/20181110/d4d7635cefae4837904a23a4ccbc3cf6.jpg', '2018-11-14 22:30:54', '2018-11-14 22:30:54');\nINSERT INTO `order_detail` VALUES ('20181114413940', '20181114314448', '20181110211414', '拼团测试1', '拼团测试1', ',5002,', 0.02, 3.00, 1, 'http://yjjtest.oss-cn-shanghai.aliyuncs.com/volunteer/20181110/d4d7635cefae4837904a23a4ccbc3cf6.jpg', '2018-11-14 22:36:39', '2018-11-14 22:36:39');\nINSERT INTO `order_detail` VALUES ('20181114413941', '20181114314450', '20181110211414', '拼团测试1', '拼团测试1', ',5002,', 0.02, 3.00, 1, 'http://yjjtest.oss-cn-shanghai.aliyuncs.com/volunteer/20181110/d4d7635cefae4837904a23a4ccbc3cf6.jpg', '2018-11-14 22:43:23', '2018-11-14 22:43:23');\nINSERT INTO `order_detail` VALUES ('20181114413942', '20181114314452', '20181110211414', '拼团测试1', '拼团测试1', ',5002,', 0.02, 3.00, 1, 'http://yjjtest.oss-cn-shanghai.aliyuncs.com/volunteer/20181110/d4d7635cefae4837904a23a4ccbc3cf6.jpg', '2018-11-14 22:48:51', '2018-11-14 22:48:51');\nINSERT INTO `order_detail` VALUES ('20181114413943', '20181114314454', '20181110211414', '拼团测试1', '拼团测试1', ',5002,', 0.02, 3.00, 1, 'http://yjjtest.oss-cn-shanghai.aliyuncs.com/volunteer/20181110/d4d7635cefae4837904a23a4ccbc3cf6.jpg', '2018-11-14 22:50:50', '2018-11-14 22:50:50');\nINSERT INTO `order_detail` VALUES ('20181114413944', '20181114314456', '20181110211414', '拼团测试1', '拼团测试1', ',5002,', 0.02, 3.00, 1, 'http://yjjtest.oss-cn-shanghai.aliyuncs.com/volunteer/20181110/d4d7635cefae4837904a23a4ccbc3cf6.jpg', '2018-11-14 22:54:00', '2018-11-14 22:54:00');\nINSERT INTO `order_detail` VALUES ('20181114414039', '20181114314545', '20181110211414', '拼团测试1', '拼团测试1', ',5002,', 0.02, 3.00, 1, 'http://yjjtest.oss-cn-shanghai.aliyuncs.com/volunteer/20181110/d4d7635cefae4837904a23a4ccbc3cf6.jpg', '2018-11-14 22:58:26', '2018-11-14 22:58:26');\nINSERT INTO `order_detail` VALUES ('20181114414140', '20181114314646', '20181110211414', '拼团测试1', '拼团测试1', ',5002,', 0.02, 3.00, 1, 'http://yjjtest.oss-cn-shanghai.aliyuncs.com/volunteer/20181110/d4d7635cefae4837904a23a4ccbc3cf6.jpg', '2018-11-14 23:12:14', '2018-11-14 23:12:14');\nINSERT INTO `order_detail` VALUES ('20181114414241', '20181114314747', '20181110211414', '拼团测试1', '拼团测试1', ',5002,', 0.02, 3.00, 1, 'http://yjjtest.oss-cn-shanghai.aliyuncs.com/volunteer/20181110/d4d7635cefae4837904a23a4ccbc3cf6.jpg', '2018-11-14 23:14:39', '2018-11-14 23:14:39');\nINSERT INTO `order_detail` VALUES ('20181114414342', '20181114314848', '20181110211414', '拼团测试1', '拼团测试1', ',5002,', 0.02, 3.00, 1, 'http://yjjtest.oss-cn-shanghai.aliyuncs.com/volunteer/20181110/d4d7635cefae4837904a23a4ccbc3cf6.jpg', '2018-11-14 23:17:17', '2018-11-14 23:17:17');\nCOMMIT;\n\n-- ----------------------------\n-- Table structure for order_master\n-- ----------------------------\nDROP TABLE IF EXISTS `order_master`;\nCREATE TABLE `order_master` (\n  `order_id` varchar(32) NOT NULL,\n  `buyer_name` varchar(32) NOT NULL COMMENT '买家名字',\n  `buyer_phone` varchar(32) NOT NULL COMMENT '买家电话',\n  `buyer_address` varchar(128) NOT NULL COMMENT '买家地址',\n  `buyer_id` varchar(64) NOT NULL COMMENT '买家id',\n  `need_invoice` smallint(1) DEFAULT NULL COMMENT '是否需要开票 0-不需要 1-需要',\n  `invoice_type` smallint(1) DEFAULT NULL COMMENT '发票类型 0-单位 1-个人',\n  `groupon` smallint(1) DEFAULT NULL COMMENT '拼团',\n  `groupon_id` varchar(50) DEFAULT NULL COMMENT '拼团id',\n  `groupon_count` int(11) DEFAULT NULL COMMENT '拼团人数',\n  `title` varchar(255) DEFAULT NULL COMMENT '发票抬头',\n  `tax_number` varchar(255) DEFAULT NULL COMMENT '抬头税号',\n  `company_address` varchar(255) DEFAULT NULL COMMENT '单位地址',\n  `telephone` varchar(255) DEFAULT NULL COMMENT '开票手机号码',\n  `bank_name` varchar(255) DEFAULT NULL COMMENT '银行名称',\n  `bank_account` varchar(255) DEFAULT NULL COMMENT '银行账号',\n  `order_amount` decimal(21,2) NOT NULL COMMENT '订单总金额',\n  `order_status` tinyint(3) NOT NULL DEFAULT '0' COMMENT '订单状态, 默认为新下单',\n  `tracking_number` varchar(255) DEFAULT NULL COMMENT '快递单号',\n  `delivery_code` varchar(255) DEFAULT NULL COMMENT '快递公司代码',\n  `refund_trade_no` varchar(255) DEFAULT NULL COMMENT '退款交易流水号',\n  `pay_trade_no` varchar(255) DEFAULT NULL COMMENT '支付交易流水号',\n  `pay_status` tinyint(3) NOT NULL DEFAULT '0' COMMENT '支付状态, 默认未支付',\n  `remark` varchar(255) DEFAULT NULL COMMENT ' 买家备注',\n  `contract` varchar(255) DEFAULT NULL COMMENT '合同',\n  `create_date` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间',\n  `update_date` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT '修改时间',\n  PRIMARY KEY (`order_id`),\n  KEY `idx_buyer_id` (`buyer_id`)\n) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4;\n\n-- ----------------------------\n-- Records of order_master\n-- ----------------------------\nBEGIN;\nINSERT INTO `order_master` VALUES ('20180720312122', '张三', '020-81167888', '广东省广州市海珠区新港中路397号', '20180720510302', 0, 0, NULL, NULL, NULL, '', '', '', '', '', '', 0.03, 0, NULL, NULL, NULL, '4200000121201807209208490953', 1, '', NULL, '2018-07-20 23:09:10', '2018-07-20 23:09:21');\nINSERT INTO `order_master` VALUES ('20180721312223', '张三', '020-81167888', '广东省广州市海珠区新港中路397号', '20180720510302', 1, 0, NULL, NULL, NULL, '广州腾讯科技有限公司', '91440101327598294H', '广州市海珠区新港中路397号自编72号(商业街F5-1)', '020-81167888', '招商银行股份有限公司广州市体育东路支行', '1209 0928 2210 301', 0.03, 0, NULL, NULL, NULL, '4200000129201807213462045407', 1, 'abc', NULL, '2018-07-21 12:49:47', '2018-07-21 12:50:03');\nINSERT INTO `order_master` VALUES ('20180721312226', '张三', '020-81167888', '广东省广州市海珠区新港中路397号', '20180720510302', 0, 0, NULL, NULL, NULL, '', '', '', '', '', '', 0.03, 0, NULL, NULL, NULL, '4200000122201807218909578978', 1, '', NULL, '2018-07-21 12:54:10', '2018-07-21 12:54:25');\nINSERT INTO `order_master` VALUES ('20180721312229', '张三', '020-81167888', '广东省广州市海珠区新港中路397号', '20180720510302', 0, 0, NULL, NULL, NULL, '', '', '', '', '', '', 0.03, 0, NULL, NULL, NULL, '4200000113201807216815669483', 1, '', NULL, '2018-07-21 13:11:46', '2018-07-21 13:12:01');\nINSERT INTO `order_master` VALUES ('20180721312232', '张三', '020-81167888', '广东省广州市海珠区新港中路397号', '20180720510302', 0, 0, NULL, NULL, NULL, '', '', '', '', '', '', 0.03, 0, NULL, NULL, NULL, '4200000127201807219192875726', 1, '', NULL, '2018-07-21 13:14:11', '2018-07-21 13:14:25');\nINSERT INTO `order_master` VALUES ('20180721312235', '张三', '020-81167888', '广东省广州市海珠区新港中路397号', '20180720510302', 0, 0, NULL, NULL, NULL, '', '', '', '', '', '', 0.03, 0, NULL, NULL, NULL, '4200000111201807216762420059', 1, '', NULL, '2018-07-21 13:14:46', '2018-07-21 13:15:01');\nINSERT INTO `order_master` VALUES ('20180721312238', '张三', '020-81167888', '广东省广州市海珠区新港中路397号', '20180720510302', 0, 0, NULL, NULL, NULL, '', '', '', '', '', '', 0.03, 0, NULL, NULL, NULL, '4200000112201807218027845057', 1, '', NULL, '2018-07-21 13:17:29', '2018-07-21 13:17:37');\nINSERT INTO `order_master` VALUES ('20180721312241', '张三', '020-81167888', '广东省广州市海珠区新港中路397号', '20180720510302', 0, 0, NULL, NULL, NULL, '', '', '', '', '', '', 0.03, 0, NULL, NULL, NULL, '4200000128201807210557757479', 1, '', NULL, '2018-07-21 13:18:17', '2018-07-21 13:18:25');\nINSERT INTO `order_master` VALUES ('20180721312244', '张三', '020-81167888', '广东省广州市海珠区新港中路397号', '20180720510302', 0, 0, NULL, NULL, NULL, '', '', '', '', '', '', 0.03, 3, NULL, NULL, '50000507382018072105613222179', '4200000127201807216333285149', 1, '', NULL, '2018-07-21 13:29:22', '2018-07-21 16:20:33');\nINSERT INTO `order_master` VALUES ('20180721312247', '张三', '020-81167888', '广东省广州市海珠区新港中路397号', '20180720510302', 0, 0, NULL, NULL, NULL, '', '', '', '', '', '', 0.03, 3, NULL, NULL, '50000507612018072105613194948', '4200000123201807212325403773', 1, '', NULL, '2018-07-21 13:31:52', '2018-07-21 16:11:24');\nINSERT INTO `order_master` VALUES ('20180721312250', '张三', '020-81167888', '广东省广州市海珠区新港中路397号', '20180720510302', 0, 0, NULL, NULL, NULL, '', '', '', '', '', '', 0.03, 0, NULL, NULL, '50000207502018072105518326730', '4200000117201807212667812626', 1, '', NULL, '2018-07-21 13:32:25', '2018-07-21 16:09:24');\nINSERT INTO `order_master` VALUES ('20180721312253', '张三', '020-81167888', '广东省广州市海珠区新港中路397号', '20180720510302', 0, 0, NULL, NULL, NULL, '', '', '', '', '', '', 0.03, 0, NULL, NULL, '50000007642018072105613178260', '4200000138201807216902615968', 1, '', NULL, '2018-07-21 13:32:54', '2018-07-21 16:06:11');\nINSERT INTO `order_master` VALUES ('20180721312256', '张三', '020-81167888', '广东省广州市海珠区新港中路397号', '20180720510302', 0, 0, NULL, NULL, NULL, '', '', '', '', '', '', 0.03, 0, NULL, NULL, '50000407442018072105613175461', '4200000129201807213479624404', 1, '', NULL, '2018-07-21 13:37:01', '2018-07-21 16:05:13');\nINSERT INTO `order_master` VALUES ('20180721312259', '张三', '020-81167888', '广东省广州市海珠区新港中路397号', '20180720510302', 0, 0, NULL, NULL, NULL, '', '', '', '', '', '', 0.03, 0, NULL, NULL, '50000407402018072105655125905', '4200000121201807212188802284', 1, '', NULL, '2018-07-21 13:37:38', '2018-07-21 16:03:12');\nINSERT INTO `order_master` VALUES ('20180721312262', '张三', '020-81167888', '广东省广州市海珠区新港中路397号', '20180720510302', 0, 0, NULL, NULL, NULL, '', '', '', '', '', '', 0.03, 0, NULL, NULL, '50000007362018072105518303785', '4200000133201807218665512328', 1, '', NULL, '2018-07-21 13:38:15', '2018-07-21 16:01:14');\nINSERT INTO `order_master` VALUES ('20180721312265', '张三', '020-81167888', '广东省广州市海珠区新港中路397号', '20180720510302', 0, 0, NULL, NULL, NULL, '', '', '', '', '', '', 0.03, 0, NULL, NULL, NULL, NULL, 0, '', NULL, '2018-07-21 13:40:05', '2018-07-21 13:40:05');\nINSERT INTO `order_master` VALUES ('20180721312268', '张三', '020-81167888', '广东省广州市海珠区新港中路397号', '20180720510302', 0, 0, NULL, NULL, NULL, '', '', '', '', '', '', 0.03, 0, NULL, NULL, NULL, NULL, 0, '', NULL, '2018-07-21 13:40:49', '2018-07-21 13:40:49');\nINSERT INTO `order_master` VALUES ('20180721312271', '张三', '020-81167888', '广东省广州市海珠区新港中路397号', '20180720510302', 0, 0, NULL, NULL, NULL, '', '', '', '', '', '', 0.03, 0, NULL, NULL, '50000507652018072105593186288', '4200000138201807219134009253', 1, '', NULL, '2018-07-21 13:41:25', '2018-07-21 15:40:37');\nINSERT INTO `order_master` VALUES ('20180721312274', '张三', '020-81167888', '广东省广州市海珠区新港中路397号', '20180720510302', 0, 0, NULL, NULL, NULL, '', '', '', '', '', '', 0.03, 0, NULL, NULL, '50000507422018072105613126909', '4200000122201807212862845509', 1, '', NULL, '2018-07-21 13:43:34', '2018-07-21 15:47:42');\nINSERT INTO `order_master` VALUES ('20180721312277', '张三', '020-81167888', '广东省广州市海珠区新港中路397号', '20180720510302', 0, 0, NULL, NULL, NULL, '', '', '', '', '', '', 0.03, 0, NULL, NULL, NULL, NULL, 0, '', NULL, '2018-07-21 13:44:59', '2018-07-21 13:44:59');\nINSERT INTO `order_master` VALUES ('20180721312280', '张三', '020-81167888', '广东省广州市海珠区新港中路397号', '20180720510302', 0, 0, NULL, NULL, NULL, '', '', '', '', '', '', 0.03, 0, NULL, NULL, NULL, NULL, 0, '', NULL, '2018-07-21 13:45:59', '2018-07-21 13:45:59');\nINSERT INTO `order_master` VALUES ('20180721312283', '张三', '020-81167888', '广东省广州市海珠区新港中路397号', '20180720510302', 0, 0, NULL, NULL, NULL, '', '', '', '', '', '', 0.03, 0, NULL, NULL, NULL, '4200000119201807218253259804', 1, '', NULL, '2018-07-21 13:46:32', '2018-07-21 13:46:40');\nINSERT INTO `order_master` VALUES ('20180721312286', '张三', '020-81167888', '广东省广州市海珠区新港中路397号', '20180720510302', 0, 0, NULL, NULL, NULL, '', '', '', '', '', '', 0.03, 0, NULL, NULL, NULL, '4200000111201807210672576245', 1, '', NULL, '2018-07-21 13:48:07', '2018-07-21 13:48:14');\nINSERT INTO `order_master` VALUES ('20180721312289', '张三', '020-81167888', '广东省广州市海珠区新港中路397号', '20180720510302', 0, 0, NULL, NULL, NULL, '', '', '', '', '', '', 0.03, 0, NULL, NULL, NULL, NULL, 0, '', NULL, '2018-07-21 13:50:59', '2018-07-21 13:50:59');\nINSERT INTO `order_master` VALUES ('20180721312292', '张三', '020-81167888', '广东省广州市海珠区新港中路397号', '20180720510302', 0, 0, NULL, NULL, NULL, '', '', '', '', '', '', 0.03, 0, NULL, NULL, NULL, NULL, 0, '', NULL, '2018-07-21 13:51:32', '2018-07-21 13:51:32');\nINSERT INTO `order_master` VALUES ('20180721312295', '张三', '020-81167888', '广东省广州市海珠区新港中路397号', '20180720510302', 0, 0, NULL, NULL, NULL, '', '', '', '', '', '', 0.03, 0, NULL, NULL, NULL, NULL, 0, '', NULL, '2018-07-21 13:51:48', '2018-07-21 13:51:48');\nINSERT INTO `order_master` VALUES ('20180721312298', '张三', '020-81167888', '广东省广州市海珠区新港中路397号', '20180720510302', 0, 0, NULL, NULL, NULL, '', '', '', '', '', '', 0.03, 0, NULL, NULL, NULL, '4200000118201807222081372427', 1, '', NULL, '2018-07-21 13:52:49', '2018-07-22 22:36:43');\nINSERT INTO `order_master` VALUES ('20180721312301', '张三', '020-81167888', '广东省广州市海珠区新港中路397号', '20180720510302', 0, 0, NULL, NULL, NULL, '', '', '', '', '', '', 0.03, 0, NULL, NULL, NULL, '4200000125201807221217777988', 1, '', NULL, '2018-07-21 13:53:42', '2018-07-22 22:35:43');\nINSERT INTO `order_master` VALUES ('20180721312323', '张三', '020-81167888', '广东省广州市海珠区新港中路397号', '20180720510302', 1, 0, NULL, NULL, NULL, '广州腾讯科技有限公司', '91440101327598294H', '广州市海珠区新港中路397号自编72号(商业街F5-1)', '020-81167888', '招商银行股份有限公司广州市体育东路支行', '1209 0928 2210 301', 0.01, 3, NULL, NULL, '50000707572018072105658170524', '4200000131201807216253253655', 1, 'abc', NULL, '2018-07-21 16:57:15', '2018-07-21 16:57:39');\nINSERT INTO `order_master` VALUES ('20180721312325', '姚嘉钧', '13127989632', '上海市上海市徐汇区乐山路30弄11号303', '20180720510302', 1, 1, NULL, NULL, NULL, '姚嘉钧', '', '', '', '', '', 0.02, 0, NULL, NULL, NULL, '4200000124201807215081033265', 1, 'abc', NULL, '2018-07-21 17:00:26', '2018-07-21 17:00:32');\nINSERT INTO `order_master` VALUES ('20180721312327', '张三', '020-81167888', '广东省广州市海珠区新港中路397号', '20180720510302', 1, 0, NULL, NULL, NULL, '广州腾讯科技有限公司', '91440101327598294H', '广州市海珠区新港中路397号自编72号(商业街F5-1)', '020-81167888', '招商银行股份有限公司广州市体育东路支行', '1209 0928 2210 301', 0.01, 0, NULL, NULL, NULL, '4200000115201807217457335264', 1, 'aaa', NULL, '2018-07-21 17:02:02', '2018-07-21 17:02:10');\nINSERT INTO `order_master` VALUES ('20180721312329', '姚嘉钧', '13127989632', '上海市上海市徐汇区乐山路30弄11号303', '20180720510302', 0, 0, NULL, NULL, NULL, '', '', '', '', '', '', 0.01, 0, NULL, NULL, NULL, '4200000130201807210955187565', 1, 'abc', NULL, '2018-07-21 17:03:09', '2018-07-21 17:03:15');\nINSERT INTO `order_master` VALUES ('20180721312331', '姚嘉钧', '13127989632', '上海市上海市徐汇区乐山路30弄11号303', '20180720510302', 0, 0, NULL, NULL, NULL, '', '', '', '', '', '', 0.01, 3, NULL, NULL, '50000007552018072105655296211', '4200000111201807217556559872', 1, 'ggg', NULL, '2018-07-21 17:05:06', '2018-07-21 17:05:24');\nINSERT INTO `order_master` VALUES ('20180722312425', '张三', '020-81167888', '广东省广州市海珠区新港中路397号', '20180720510302', 0, 0, NULL, NULL, NULL, '', '', '', '', '', '', 0.01, 1, '321', 'shunfeng', NULL, '4200000135201807224489805353', 1, '', NULL, '2018-07-22 11:35:27', '2018-07-23 22:39:36');\nINSERT INTO `order_master` VALUES ('20180722312427', '姚嘉钧', '13127989632', '上海市上海市徐汇区乐山路30弄11号303', '20180720510302', 0, 0, NULL, NULL, NULL, '', '', '', '', '', '', 0.01, 1, '123', 'shentong', NULL, '4200000124201807229666014976', 1, '', NULL, '2018-07-22 11:40:02', '2018-07-22 22:46:28');\nINSERT INTO `order_master` VALUES ('20180722312429', '张三', '020-81167888', '广东省广州市海珠区新港中路397号', '20180720510302', 0, 0, NULL, NULL, NULL, '', '', '', '', '', '', 0.01, 3, NULL, NULL, '50000307582018072205674040596', '4200000138201807229913048227', 1, '', NULL, '2018-07-22 14:08:06', '2018-07-22 22:37:50');\nINSERT INTO `order_master` VALUES ('20180722312525', '张三', '020-81167888', '广东省广州市海珠区新港中路397号', '20180720510302', 0, 0, NULL, NULL, NULL, '', '', '', '', '', '', 123.00, 0, NULL, NULL, NULL, NULL, 0, '', NULL, '2018-07-22 22:53:15', '2018-07-22 22:53:15');\nINSERT INTO `order_master` VALUES ('20181106312727', '张三', '020-81167888', '广东省广州市海珠区新港中路397号', '20181106510403', 0, 0, NULL, NULL, NULL, '', '', '', '', '', '', 0.02, 0, NULL, NULL, NULL, NULL, 0, '', NULL, '2018-11-06 11:15:10', '2018-11-06 11:15:10');\nINSERT INTO `order_master` VALUES ('20181106312828', '张三', '020-81167888', '广东省广州市海珠区新港中路397号', '20181106510403', 0, 0, NULL, NULL, NULL, '', '', '', '', '', '', 0.02, 1, '800325920738721358', '3', '50000708792018110606956491503', '4200000214201811064505240791', 1, '', NULL, '2018-11-06 11:19:05', '2018-11-06 18:10:06');\nINSERT INTO `order_master` VALUES ('20181106312929', '张三123', '020-81167888', '广东省广州市海珠区新港中路397号', '20181106510403', 0, 0, NULL, NULL, NULL, '', '', '', '', '', '', 0.03, 0, NULL, NULL, NULL, NULL, 0, '', NULL, '2018-11-06 11:56:59', '2018-11-06 16:11:33');\nINSERT INTO `order_master` VALUES ('20181106313030', '姚嘉钧', '13127989632', '上海市上海市徐汇区乐山路30弄11号303', '20181106510403', 1, 1, NULL, NULL, NULL, '姚嘉钧', '', '', '', '', '', 0.03, 0, NULL, NULL, NULL, '4200000219201811067213949313', 1, '你好', NULL, '2018-11-06 18:08:49', '2018-11-06 18:09:02');\nINSERT INTO `order_master` VALUES ('20181106313131', '张三', '020-81167888', '广东省广州市海珠区新港中路397号', '20181106510403', 1, 0, NULL, NULL, NULL, '广州腾讯科技有限公司', '91440101327598294H', '广州市海珠区新港中路397号自编72号(商业街F5-1)', '020-81167888', '招商银行股份有限公司广州市体育东路支行', '1209 0928 2210 301', 0.01, 1, '123', 'shentong', NULL, '4200000215201811060708620334', 1, '', NULL, '2018-11-06 23:21:28', '2018-11-06 23:42:10');\nINSERT INTO `order_master` VALUES ('20181106313133', '张三', '020-81167888', '广东省广州市海珠区新港中路397号', '20181106510403', 1, 0, NULL, NULL, NULL, '广州腾讯科技有限公司', '91440101327598294H', '广州市海珠区新港中路397号自编72号(商业街F5-1)', '020-81167888', '招商银行股份有限公司广州市体育东路支行', '1209 0928 2210 301', 0.03, 1, '123', 'shentong', NULL, '4200000215201811060944018997', 1, '你好', NULL, '2018-11-06 23:30:23', '2018-11-06 23:51:00');\nINSERT INTO `order_master` VALUES ('20181110313333', '张三', '020-81167888', '广东省广州市海珠区新港中路397号', '20181106510403', 0, 0, 1, '', NULL, '', '', '', '', '', '', 0.02, 0, NULL, NULL, NULL, NULL, 0, '', NULL, '2018-11-10 22:46:01', '2018-11-10 22:46:01');\nINSERT INTO `order_master` VALUES ('20181110313335', '张三', '020-81167888', '广东省广州市海珠区新港中路397号', '20181106510403', 0, 0, 1, '', NULL, '', '', '', '', '', '', 0.02, 0, NULL, NULL, NULL, NULL, 0, '', NULL, '2018-11-10 22:48:46', '2018-11-10 22:48:46');\nINSERT INTO `order_master` VALUES ('20181110313434', '张三', '020-81167888', '广东省广州市海珠区新港中路397号', '20181106510403', 0, 0, 1, '', NULL, '', '', '', '', '', '', 0.02, 0, NULL, NULL, NULL, NULL, 0, '', NULL, '2018-11-10 23:18:25', '2018-11-10 23:18:25');\nINSERT INTO `order_master` VALUES ('20181110313535', '张三', '020-81167888', '广东省广州市海珠区新港中路397号', '20181106510403', 0, 0, 1, '', 2, '', '', '', '', '', '', 0.02, 4, NULL, NULL, NULL, '4200000214201811103588953108', 1, '', NULL, '2018-11-10 23:26:33', '2018-11-10 23:26:43');\nINSERT INTO `order_master` VALUES ('20181110313636', '张三', '020-81167888', '广东省广州市海珠区新港中路397号', '20181106510403', 0, 0, 1, '', 2, '', '', '', '', '', '', 0.04, 4, NULL, NULL, NULL, '4200000231201811103522519451', 1, '', NULL, '2018-11-10 23:32:32', '2018-11-10 23:32:38');\nINSERT INTO `order_master` VALUES ('20181110313737', '张三', '020-81167888', '广东省广州市海珠区新港中路397号', '20181106510403', 0, 0, 1, '', 2, '', '', '', '', '', '', 0.02, 4, NULL, NULL, NULL, '4200000227201811101079054765', 1, '', NULL, '2018-11-10 23:49:22', '2018-11-10 23:49:37');\nINSERT INTO `order_master` VALUES ('20181110313739', '张三', '020-81167888', '广东省广州市海珠区新港中路397号', '20181106510403', 0, 0, 1, '', 2, '', '', '', '', '', '', 0.02, 4, NULL, NULL, NULL, '4200000229201811108530713867', 1, '', NULL, '2018-11-10 23:51:46', '2018-11-10 23:51:52');\nINSERT INTO `order_master` VALUES ('20181110313741', '张三', '020-81167888', '广东省广州市海珠区新港中路397号', '20181106510403', 0, 0, 1, '', 2, '', '', '', '', '', '', 0.02, 4, NULL, NULL, NULL, '4200000226201811103403866016', 1, '', NULL, '2018-11-10 23:57:09', '2018-11-10 23:57:16');\nINSERT INTO `order_master` VALUES ('20181111313743', '张三', '020-81167888', '广东省广州市海珠区新港中路397号', '20181106510403', 0, 0, 1, '', 2, '', '', '', '', '', '', 0.02, 4, NULL, NULL, NULL, '4200000236201811119472603318', 1, '', NULL, '2018-11-11 00:00:35', '2018-11-11 00:00:46');\nINSERT INTO `order_master` VALUES ('20181111313745', '张三', '020-81167888', '广东省广州市海珠区新港中路397号', '20181106510403', 0, 0, 1, '', 2, '', '', '', '', '', '', 0.02, 4, NULL, NULL, NULL, '4200000216201811117179263255', 1, '', NULL, '2018-11-11 00:04:28', '2018-11-11 00:04:33');\nINSERT INTO `order_master` VALUES ('20181111313747', '张三', '020-81167888', '广东省广州市海珠区新港中路397号', '20181106510403', 0, 0, 1, '', 2, '', '', '', '', '', '', 0.02, 4, NULL, NULL, NULL, '4200000216201811113023522110', 1, '', NULL, '2018-11-11 00:05:57', '2018-11-11 00:06:04');\nINSERT INTO `order_master` VALUES ('20181111313838', '张三', '020-81167888', '广东省广州市海珠区新港中路397号', '20181106510403', 0, 0, 1, '', 2, '', '', '', '', '', '', 0.02, 4, NULL, NULL, NULL, '4200000218201811110156535814', 1, '', NULL, '2018-11-11 00:07:32', '2018-11-11 00:07:38');\nINSERT INTO `order_master` VALUES ('20181111313939', '张三', '020-81167888', '广东省广州市海珠区新港中路397号', '20181106510403', 0, 0, 1, '20181111610504', 2, '', '', '', '', '', '', 0.02, 4, NULL, NULL, NULL, '4200000224201811115429788733', 1, '', NULL, '2018-11-11 00:14:28', '2018-11-11 00:14:35');\nINSERT INTO `order_master` VALUES ('20181111313941', '张三', '020-81167888', '广东省广州市海珠区新港中路397号', '20181106510403', 0, 0, 1, '20181111610505', 2, '', '', '', '', '', '', 0.02, 4, NULL, NULL, NULL, '4200000210201811110070943629', 1, '', NULL, '2018-11-11 00:16:03', '2018-11-11 00:16:09');\nINSERT INTO `order_master` VALUES ('20181111313943', '张三', '020-81167888', '广东省广州市海珠区新港中路397号', '20181106510403', 0, 0, 1, '20181111610506', 2, '', '', '', '', '', '', 0.02, 4, NULL, NULL, NULL, '4200000231201811114237509074', 1, '', NULL, '2018-11-11 00:17:26', '2018-11-11 00:17:31');\nINSERT INTO `order_master` VALUES ('20181111314040', '姚嘉钧', '13127989632', '上海市上海市徐汇区乐山路30弄11号303', '20181106510403', 0, 0, 1, '20181111610605', 2, '', '', '', '', '', '', 0.02, 5, NULL, NULL, NULL, '4200000211201811113503224550', 1, '', NULL, '2018-11-11 00:32:33', '2018-11-14 23:16:27');\nINSERT INTO `order_master` VALUES ('20181111314042', '姚嘉钧', '13127989632', '上海市上海市徐汇区乐山路30弄11号303', '20181106510403', 0, 0, 1, '20181111610606', 2, '', '', '', '', '', '', 0.02, 4, NULL, NULL, NULL, '4200000233201811116738637154', 1, '', NULL, '2018-11-11 00:34:42', '2018-11-11 00:34:48');\nINSERT INTO `order_master` VALUES ('20181111314044', '姚嘉钧', '13127989632', '上海市上海市徐汇区乐山路30弄11号303', '20181106510403', 0, 0, 1, '20181111610607', 2, '', '', '', '', '', '', 0.02, 4, NULL, NULL, NULL, '4200000213201811117515278057', 1, '', NULL, '2018-11-11 00:37:01', '2018-11-11 00:37:07');\nINSERT INTO `order_master` VALUES ('20181111314046', '姚嘉钧', '13127989632', '上海市上海市徐汇区乐山路30弄11号303', '20181106510403', 0, 0, 1, '20181111610608', 2, '', '', '', '', '', '', 0.02, 4, NULL, NULL, NULL, '4200000232201811111849060965', 1, '', NULL, '2018-11-11 00:40:49', '2018-11-11 00:40:54');\nINSERT INTO `order_master` VALUES ('20181111314048', '张三', '020-81167888', '广东省广州市海珠区新港中路397号', '20181106510403', 0, 0, 1, '', 2, '', '', '', '', '', '', 0.02, 0, NULL, NULL, NULL, NULL, 0, '', NULL, '2018-11-11 00:42:38', '2018-11-11 00:42:38');\nINSERT INTO `order_master` VALUES ('20181111314050', '姚嘉钧', '13127989632', '上海市上海市徐汇区乐山路30弄11号303', '20181106510403', 0, 0, 1, '20181111610609', 2, '', '', '', '', '', '', 0.02, 4, NULL, NULL, NULL, '4200000216201811119173292396', 1, '', NULL, '2018-11-11 00:43:39', '2018-11-11 00:43:45');\nINSERT INTO `order_master` VALUES ('20181111314052', '张三', '020-81167888', '广东省广州市海珠区新港中路397号', '20181106510403', 0, 0, 0, NULL, NULL, '', '', '', '', '', '', 0.01, 0, NULL, NULL, NULL, '4200000238201811110085951697', 1, '', NULL, '2018-11-11 00:51:56', '2018-11-11 00:52:07');\nINSERT INTO `order_master` VALUES ('20181114314141', '杨先生', '18562946494', '北京市北京市门头沟区自信how', '20181114510504', 0, 0, 1, '20181111610609', 2, '', '', '', '', '', '', 0.01, 0, NULL, NULL, NULL, NULL, 0, '', NULL, '2018-11-14 20:57:24', '2018-11-14 20:57:24');\nINSERT INTO `order_master` VALUES ('20181114314143', '杨先生', '18562946494', '北京市北京市门头沟区自信how', '20181114510504', 0, 0, 1, '20181111610609', 2, '', '', '', '', '', '', 0.01, 0, NULL, NULL, NULL, NULL, 0, '', NULL, '2018-11-14 20:58:41', '2018-11-14 20:58:41');\nINSERT INTO `order_master` VALUES ('20181114314345', '杨先生', '18562946494', '北京市北京市门头沟区自信how', '20181114510504', 0, 0, 0, NULL, NULL, '', '', '', '', '', '', 3.00, 0, NULL, NULL, NULL, NULL, 0, '', NULL, '2018-11-14 22:16:26', '2018-11-14 22:16:26');\nINSERT INTO `order_master` VALUES ('20181114314545', '钱瑜', '18918901701', '上海市上海市黄浦区柳林路158号', '20181114510605', 0, 0, 1, '20181111610605', 2, '', '', '', '', '', '', 0.02, 5, NULL, NULL, NULL, NULL, 0, '', NULL, '2018-11-14 22:58:26', '2018-11-14 23:16:27');\nINSERT INTO `order_master` VALUES ('20181114314646', '钱瑜', '18918901701', '上海市上海市黄浦区柳林路158号', '20181114510605', 0, 0, 1, '20181111610605', 2, '', '', '', '', '', '', 0.02, 5, NULL, NULL, NULL, '4200000209201811147156498868', 1, '', NULL, '2018-11-14 23:12:14', '2018-11-14 23:16:27');\nINSERT INTO `order_master` VALUES ('20181114314747', '钱瑜', '18918901701', '上海市上海市黄浦区柳林路158号', '20181114510605', 0, 0, 1, '20181111610605', 2, '', '', '', '', '', '', 0.02, 5, NULL, NULL, NULL, NULL, 0, '', NULL, '2018-11-14 23:14:39', '2018-11-14 23:16:27');\nINSERT INTO `order_master` VALUES ('20181114314848', '钱瑜', '18918901701', '上海市上海市黄浦区柳林路158号', '20181114510605', 0, 0, 1, '20181111610605', 2, '', '', '', '', '', '', 0.02, 5, NULL, NULL, NULL, '4200000211201811146041093820', 1, '', NULL, '2018-11-14 23:17:17', '2018-11-14 23:17:22');\nCOMMIT;\n\n-- ----------------------------\n-- Table structure for product\n-- ----------------------------\nDROP TABLE IF EXISTS `product`;\nCREATE TABLE `product` (\n  `sn` varchar(255) NOT NULL COMMENT '商品编号',\n  `price` decimal(21,2) NOT NULL DEFAULT '0.00' COMMENT '销售价',\n  `group_price` decimal(21,2) NOT NULL DEFAULT '0.00' COMMENT '拼团价',\n  `cost` decimal(21,2) NOT NULL DEFAULT '0.00' COMMENT '成本价',\n  `is_default` tinyint(1) NOT NULL DEFAULT '0' COMMENT '是否默认',\n  `specification_values` longtext COMMENT '规格值',\n  `stock` int(11) NOT NULL DEFAULT '0' COMMENT '库存',\n  `goods_sn` varchar(255) NOT NULL COMMENT '货品编号',\n  `enable` tinyint(1) NOT NULL DEFAULT '0' COMMENT '是否启用',\n  `create_date` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '创建日期',\n  `update_date` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '修改日期',\n  PRIMARY KEY (`sn`),\n  KEY `ind_product_goods` (`goods_sn`),\n  KEY `ind_product_is_default` (`is_default`) USING BTREE\n) ENGINE=InnoDB DEFAULT CHARSET=utf8;\n\n-- ----------------------------\n-- Records of product\n-- ----------------------------\nBEGIN;\nINSERT INTO `product` VALUES ('20180702210605', 0.01, 0.00, 1.00, 1, '1000,1002', 99, '20180702110605', 1, '2018-07-02 13:01:24', '2018-07-02 13:01:24');\nINSERT INTO `product` VALUES ('20180702210606', 0.01, 0.00, 1.00, 0, '3001,4001', 99, '20180702110605', 0, '2018-07-03 12:39:23', '2018-07-03 12:39:23');\nINSERT INTO `product` VALUES ('20180715210706', 0.01, 0.00, 0.00, 0, ',1001,3001,', 99, '20180715110706', 0, '2018-07-15 13:30:36', '2018-07-15 13:30:36');\nINSERT INTO `product` VALUES ('20180715210707', 0.01, 0.00, 1.00, 1, ',1001,3002,', 54, '20180715110706', 1, '2018-07-15 13:30:36', '2018-07-15 13:30:36');\nINSERT INTO `product` VALUES ('20180715210708', 0.01, 0.00, 6.00, 0, ',1002,3001,', 11, '20180715110706', 1, '2018-07-15 13:30:36', '2018-07-15 13:30:36');\nINSERT INTO `product` VALUES ('20180715210709', 0.01, 0.00, 0.00, 0, ',1002,3002,', 99, '20180715110706', 0, '2018-07-15 13:30:36', '2018-07-15 13:30:36');\nINSERT INTO `product` VALUES ('20180722210807', 0.01, 0.00, 123.00, 1, NULL, 98, '20180722110807', 1, '2018-07-22 22:48:19', '2018-07-22 22:48:19');\nINSERT INTO `product` VALUES ('20180723210908', 0.01, 0.00, 1.00, 1, NULL, 99, '20180723110908', 1, '2018-07-23 17:27:33', '2018-07-23 17:27:33');\nINSERT INTO `product` VALUES ('20180723210909', 0.01, 0.00, 1.00, 1, NULL, 21, '20180723110909', 1, '2018-07-23 19:56:48', '2018-07-23 19:56:48');\nINSERT INTO `product` VALUES ('20180723210910', 0.01, 0.00, 1.00, 1, NULL, 21, '20180723110910', 1, '2018-07-23 19:58:17', '2018-07-23 19:58:17');\nINSERT INTO `product` VALUES ('20180723210911', 0.01, 0.00, 1.00, 1, NULL, 21, '20180723110911', 1, '2018-07-23 19:59:10', '2018-07-23 19:59:10');\nINSERT INTO `product` VALUES ('20180723211009', 0.02, 0.00, 1.00, 1, NULL, 97, '20180723111009', 1, '2018-07-23 21:01:51', '2018-07-23 21:01:51');\nINSERT INTO `product` VALUES ('20181106211110', 0.02, 0.00, 0.01, 1, ',5001,6001,', 99, '20181106111110', 1, '2018-11-06 11:56:20', '2018-11-06 11:56:20');\nINSERT INTO `product` VALUES ('20181106211111', 0.01, 0.00, 0.01, 0, ',5001,6002,', 98, '20181106111110', 1, '2018-11-06 11:56:20', '2018-11-06 11:56:20');\nINSERT INTO `product` VALUES ('20181106211112', 0.03, 0.00, 0.01, 0, ',5002,6001,', 97, '20181106111110', 1, '2018-11-06 11:56:20', '2018-11-06 11:56:20');\nINSERT INTO `product` VALUES ('20181106211113', 0.06, 0.00, 0.01, 0, ',5002,6002,', 99, '20181106111110', 1, '2018-11-06 11:56:20', '2018-11-06 11:56:20');\nINSERT INTO `product` VALUES ('20181106211211', 11.00, 0.00, 10.00, 1, ',5001,6001,', 99, '20181106111211', 1, '2018-11-06 23:47:44', '2018-11-06 23:47:44');\nINSERT INTO `product` VALUES ('20181106211212', 12.00, 0.00, 10.00, 0, ',5001,6002,', 99, '20181106111211', 1, '2018-11-06 23:47:44', '2018-11-06 23:47:44');\nINSERT INTO `product` VALUES ('20181106211213', 13.00, 0.00, 10.00, 0, ',5002,6001,', 99, '20181106111211', 1, '2018-11-06 23:47:44', '2018-11-06 23:47:44');\nINSERT INTO `product` VALUES ('20181106211214', 16.00, 0.00, 10.00, 0, ',5002,6002,', 99, '20181106111211', 1, '2018-11-06 23:47:44', '2018-11-06 23:47:44');\nINSERT INTO `product` VALUES ('20181110211312', 3.00, 0.00, 1.00, 1, ',1001,', 9, '20181110111312', 1, '2018-11-10 17:45:34', '2018-11-10 17:45:34');\nINSERT INTO `product` VALUES ('20181110211313', 3.00, 0.00, 1.00, 0, ',1002,', 9, '20181110111312', 1, '2018-11-10 17:45:34', '2018-11-10 17:45:34');\nINSERT INTO `product` VALUES ('20181110211413', 2.00, 0.01, 1.00, 1, ',5001,', 95, '20181110111413', 1, '2018-11-10 22:03:39', '2018-11-10 22:03:39');\nINSERT INTO `product` VALUES ('20181110211414', 3.00, 0.02, 1.00, 0, ',5002,', 65, '20181110111413', 1, '2018-11-10 22:03:39', '2018-11-10 22:03:39');\nINSERT INTO `product` VALUES ('20181117211514', 0.01, 0.01, 1.00, 1, ',5001,6002,', 99, '20181117111615', 1, '2018-11-17 11:28:14', '2018-11-17 11:28:14');\nINSERT INTO `product` VALUES ('20181117211515', 0.01, 0.01, 1.00, 0, ',5001,60001,', 99, '20181117111615', 0, '2018-11-17 11:28:14', '2018-11-17 11:28:14');\nINSERT INTO `product` VALUES ('20181117211516', 0.01, 0.01, 1.00, 0, ',5002,6002,', 99, '20181117111615', 1, '2018-11-17 11:28:14', '2018-11-17 11:28:14');\nINSERT INTO `product` VALUES ('20181117211517', 0.01, 0.01, 1.00, 0, ',5002,60001,', 99, '20181117111615', 1, '2018-11-17 11:28:14', '2018-11-17 11:28:14');\nCOMMIT;\n\n-- ----------------------------\n-- Table structure for product_category\n-- ----------------------------\nDROP TABLE IF EXISTS `product_category`;\nCREATE TABLE `product_category` (\n  `id` bigint(20) NOT NULL COMMENT 'ID',\n  `name` varchar(255) NOT NULL COMMENT '名称',\n  `parent_id` bigint(20) DEFAULT NULL COMMENT '父节点',\n  `tree_path` varchar(255) DEFAULT NULL COMMENT '全路径',\n  `order` int(11) NOT NULL DEFAULT '99' COMMENT '优先级 值小在前面 值大的在后面',\n  `create_date` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '创建日期',\n  `update_date` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '更新日期',\n  PRIMARY KEY (`id`),\n  KEY `ind_product_category_parent` (`parent_id`),\n  KEY `idx_order` (`order`)\n) ENGINE=InnoDB DEFAULT CHARSET=utf8;\n\n-- ----------------------------\n-- Records of product_category\n-- ----------------------------\nBEGIN;\nINSERT INTO `product_category` VALUES (10000, '振荡器', NULL, ',10000,', 99, '2018-07-01 16:10:55', '2018-07-01 16:10:55');\nINSERT INTO `product_category` VALUES (10100, '恒温振荡器', 10000, ',10000,10100,', 99, '2018-07-01 16:11:39', '2018-07-01 16:11:39');\nINSERT INTO `product_category` VALUES (10200, '微型振荡器', 10000, ',10000,10200,', 99, '2018-07-01 16:12:07', '2018-07-01 16:12:07');\nINSERT INTO `product_category` VALUES (10201, '脱色摇床', 10200, ',10000,10200,10201,', 99, '2018-07-01 16:12:47', '2018-07-01 16:12:47');\nINSERT INTO `product_category` VALUES (10202, '漩涡混合器', 10200, ',10000,10200,10202,', 99, '2018-07-01 16:13:03', '2018-07-01 16:13:03');\nINSERT INTO `product_category` VALUES (10203, '迷你离心机', 10200, ',10000,10200,10203,', 99, '2018-07-01 16:13:10', '2018-07-01 16:13:10');\nINSERT INTO `product_category` VALUES (20000, '易耗品', NULL, ',20000,', 99, '2018-07-23 16:13:01', '2018-07-23 16:13:01');\nINSERT INTO `product_category` VALUES (30000, '衣服', NULL, ',30000,', 99, '2018-11-06 11:46:12', '2018-11-06 11:46:12');\nINSERT INTO `product_category` VALUES (30100, '男装', 30000, ',30000,30100,', 99, '2018-11-06 11:46:57', '2018-11-06 11:46:57');\nINSERT INTO `product_category` VALUES (30200, '女装', 30000, ',30000,30200,', 99, '2018-11-06 11:47:24', '2018-11-06 11:47:24');\nINSERT INTO `product_category` VALUES (40000, 'test', NULL, ',40000,', 0, '2018-11-14 23:29:33', '2018-11-14 23:29:33');\nINSERT INTO `product_category` VALUES (40001, 'twst1', 40000, ',40000,40001,', 0, '2018-11-14 23:32:22', '2018-11-14 23:32:22');\nINSERT INTO `product_category` VALUES (400001, 'testest', 40001, ',40000,40001,400001,', 0, '2018-11-14 23:33:13', '2018-11-14 23:33:13');\nCOMMIT;\n\n-- ----------------------------\n-- Table structure for receiver\n-- ----------------------------\nDROP TABLE IF EXISTS `receiver`;\nCREATE TABLE `receiver` (\n  `id` bigint(20) NOT NULL AUTO_INCREMENT,\n  `address` varchar(255) NOT NULL,\n  `area_name` varchar(255) NOT NULL,\n  `consignee` varchar(255) NOT NULL,\n  `is_default` tinyint(1) NOT NULL,\n  `phone` varchar(255) NOT NULL,\n  `zip_code` varchar(255) DEFAULT NULL,\n  `area_id` bigint(20) NOT NULL,\n  `member_id` varchar(50) NOT NULL,\n  `create_date` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '创建日期',\n  `update_date` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '更新日期',\n  PRIMARY KEY (`id`),\n  KEY `ind_receiver_area` (`area_id`),\n  KEY `ind_receiver_member` (`member_id`)\n) ENGINE=InnoDB AUTO_INCREMENT=2 DEFAULT CHARSET=utf8;\n\n-- ----------------------------\n-- Records of receiver\n-- ----------------------------\nBEGIN;\nINSERT INTO `receiver` VALUES (1, 'ggg', 'bbb', 'hh', 0, '123', '321', 5, '1', '2018-07-03 12:37:50', '2018-07-03 12:37:50');\nCOMMIT;\n\n-- ----------------------------\n-- Table structure for schedule_job\n-- ----------------------------\nDROP TABLE IF EXISTS `schedule_job`;\nCREATE TABLE `schedule_job` (\n  `job_id` bigint(20) NOT NULL AUTO_INCREMENT COMMENT '任务id',\n  `bean_name` varchar(200) DEFAULT NULL COMMENT 'spring bean名称',\n  `method_name` varchar(100) DEFAULT NULL COMMENT '方法名',\n  `params` varchar(2000) DEFAULT NULL COMMENT '参数',\n  `cron_expression` varchar(100) DEFAULT NULL COMMENT 'cron表达式',\n  `status` tinyint(4) DEFAULT NULL COMMENT '任务状态  0：正常  1：暂停',\n  `remark` varchar(255) DEFAULT NULL COMMENT '备注',\n  `create_time` datetime DEFAULT NULL COMMENT '创建时间',\n  PRIMARY KEY (`job_id`)\n) ENGINE=InnoDB AUTO_INCREMENT=3 DEFAULT CHARSET=utf8 COMMENT='定时任务';\n\n-- ----------------------------\n-- Records of schedule_job\n-- ----------------------------\nBEGIN;\nINSERT INTO `schedule_job` VALUES (1, 'testTask', 'test', 'sdb', '0 0/30 * * * ?', 0, '有参数测试', '2016-12-01 23:16:46');\nINSERT INTO `schedule_job` VALUES (2, 'testTask', 'test2', NULL, '0 0/30 * * * ?', 1, '无参数测试', '2016-12-03 14:55:56');\nCOMMIT;\n\n-- ----------------------------\n-- Table structure for schedule_job_log\n-- ----------------------------\nDROP TABLE IF EXISTS `schedule_job_log`;\nCREATE TABLE `schedule_job_log` (\n  `log_id` bigint(20) NOT NULL AUTO_INCREMENT COMMENT '任务日志id',\n  `job_id` bigint(20) NOT NULL COMMENT '任务id',\n  `bean_name` varchar(200) DEFAULT NULL COMMENT 'spring bean名称',\n  `method_name` varchar(100) DEFAULT NULL COMMENT '方法名',\n  `params` varchar(2000) DEFAULT NULL COMMENT '参数',\n  `status` tinyint(4) NOT NULL COMMENT '任务状态    0：成功    1：失败',\n  `error` varchar(2000) DEFAULT NULL COMMENT '失败信息',\n  `times` int(11) NOT NULL COMMENT '耗时(单位：毫秒)',\n  `create_time` datetime DEFAULT NULL COMMENT '创建时间',\n  PRIMARY KEY (`log_id`),\n  KEY `job_id` (`job_id`)\n) ENGINE=InnoDB AUTO_INCREMENT=311 DEFAULT CHARSET=utf8 COMMENT='定时任务日志';\n\n-- ----------------------------\n-- Records of schedule_job_log\n-- ----------------------------\nBEGIN;\nINSERT INTO `schedule_job_log` VALUES (1, 1, 'testTask', 'test', 'volunteer', 0, NULL, 1066, '2018-06-28 20:30:00');\nINSERT INTO `schedule_job_log` VALUES (2, 1, 'testTask', 'test', 'volunteer', 0, NULL, 1012, '2018-06-28 21:00:00');\nINSERT INTO `schedule_job_log` VALUES (3, 1, 'testTask', 'test', 'volunteer', 0, NULL, 1022, '2018-06-28 21:30:00');\nINSERT INTO `schedule_job_log` VALUES (4, 1, 'testTask', 'test', 'volunteer', 0, NULL, 1017, '2018-06-28 22:00:00');\nINSERT INTO `schedule_job_log` VALUES (5, 1, 'testTask', 'test', 'volunteer', 0, NULL, 1017, '2018-06-28 22:30:00');\nINSERT INTO `schedule_job_log` VALUES (6, 1, 'testTask', 'test', 'volunteer', 0, NULL, 1025, '2018-06-28 23:00:00');\nINSERT INTO `schedule_job_log` VALUES (7, 1, 'testTask', 'test', 'volunteer', 0, NULL, 1014, '2018-06-28 23:30:00');\nINSERT INTO `schedule_job_log` VALUES (8, 1, 'testTask', 'test', 'volunteer', 0, NULL, 1013, '2018-06-29 09:30:00');\nINSERT INTO `schedule_job_log` VALUES (9, 1, 'testTask', 'test', 'volunteer', 0, NULL, 1027, '2018-06-29 11:30:00');\nINSERT INTO `schedule_job_log` VALUES (10, 1, 'testTask', 'test', 'volunteer', 0, NULL, 1039, '2018-06-29 12:00:00');\nINSERT INTO `schedule_job_log` VALUES (11, 1, 'testTask', 'test', 'volunteer', 0, NULL, 1019, '2018-06-29 12:30:00');\nINSERT INTO `schedule_job_log` VALUES (12, 1, 'testTask', 'test', 'volunteer', 0, NULL, 1014, '2018-06-29 13:00:00');\nINSERT INTO `schedule_job_log` VALUES (13, 1, 'testTask', 'test', 'volunteer', 0, NULL, 1024, '2018-06-29 13:30:00');\nINSERT INTO `schedule_job_log` VALUES (14, 1, 'testTask', 'test', 'volunteer', 0, NULL, 1036, '2018-06-29 15:00:00');\nINSERT INTO `schedule_job_log` VALUES (15, 1, 'testTask', 'test', 'volunteer', 0, NULL, 1132, '2018-06-29 15:30:00');\nINSERT INTO `schedule_job_log` VALUES (16, 1, 'testTask', 'test', 'volunteer', 0, NULL, 1021, '2018-06-29 16:00:00');\nINSERT INTO `schedule_job_log` VALUES (17, 1, 'testTask', 'test', 'volunteer', 0, NULL, 1033, '2018-06-29 19:00:00');\nINSERT INTO `schedule_job_log` VALUES (18, 1, 'testTask', 'test', 'volunteer', 0, NULL, 1011, '2018-06-29 19:30:00');\nINSERT INTO `schedule_job_log` VALUES (19, 1, 'testTask', 'test', 'volunteer', 0, NULL, 1029, '2018-06-29 20:00:00');\nINSERT INTO `schedule_job_log` VALUES (20, 1, 'testTask', 'test', 'volunteer', 0, NULL, 1009, '2018-06-29 20:30:00');\nINSERT INTO `schedule_job_log` VALUES (21, 1, 'testTask', 'test', 'volunteer', 0, NULL, 1011, '2018-06-29 21:00:00');\nINSERT INTO `schedule_job_log` VALUES (22, 1, 'testTask', 'test', 'volunteer', 0, NULL, 1018, '2018-06-29 21:30:00');\nINSERT INTO `schedule_job_log` VALUES (23, 1, 'testTask', 'test', 'volunteer', 0, NULL, 1010, '2018-06-29 22:00:00');\nINSERT INTO `schedule_job_log` VALUES (24, 1, 'testTask', 'test', 'volunteer', 0, NULL, 1017, '2018-06-29 22:30:00');\nINSERT INTO `schedule_job_log` VALUES (25, 1, 'testTask', 'test', 'volunteer', 0, NULL, 1021, '2018-06-29 23:00:00');\nINSERT INTO `schedule_job_log` VALUES (26, 1, 'testTask', 'test', 'volunteer', 0, NULL, 1011, '2018-06-29 23:30:00');\nINSERT INTO `schedule_job_log` VALUES (27, 1, 'testTask', 'test', 'volunteer', 0, NULL, 1030, '2018-06-30 00:00:00');\nINSERT INTO `schedule_job_log` VALUES (28, 1, 'testTask', 'test', 'volunteer', 0, NULL, 1027, '2018-06-30 00:30:00');\nINSERT INTO `schedule_job_log` VALUES (29, 1, 'testTask', 'test', 'volunteer', 0, NULL, 1028, '2018-06-30 23:30:00');\nINSERT INTO `schedule_job_log` VALUES (30, 1, 'testTask', 'test', 'volunteer', 0, NULL, 1032, '2018-07-01 14:00:00');\nINSERT INTO `schedule_job_log` VALUES (31, 1, 'testTask', 'test', 'volunteer', 0, NULL, 1013, '2018-07-01 14:30:00');\nINSERT INTO `schedule_job_log` VALUES (32, 1, 'testTask', 'test', 'volunteer', 0, NULL, 1019, '2018-07-01 15:00:00');\nINSERT INTO `schedule_job_log` VALUES (33, 1, 'testTask', 'test', 'volunteer', 0, NULL, 1031, '2018-07-01 15:30:00');\nINSERT INTO `schedule_job_log` VALUES (34, 1, 'testTask', 'test', 'volunteer', 0, NULL, 1014, '2018-07-01 16:00:00');\nINSERT INTO `schedule_job_log` VALUES (35, 1, 'testTask', 'test', 'volunteer', 0, NULL, 1015, '2018-07-01 16:30:00');\nINSERT INTO `schedule_job_log` VALUES (36, 1, 'testTask', 'test', 'volunteer', 0, NULL, 1017, '2018-07-01 17:00:00');\nINSERT INTO `schedule_job_log` VALUES (37, 1, 'testTask', 'test', 'volunteer', 0, NULL, 1022, '2018-07-01 17:30:00');\nINSERT INTO `schedule_job_log` VALUES (38, 1, 'testTask', 'test', 'volunteer', 0, NULL, 1020, '2018-07-01 18:00:00');\nINSERT INTO `schedule_job_log` VALUES (39, 1, 'testTask', 'test', 'volunteer', 0, NULL, 1022, '2018-07-01 18:30:31');\nINSERT INTO `schedule_job_log` VALUES (40, 1, 'testTask', 'test', 'volunteer', 0, NULL, 1023, '2018-07-01 19:30:00');\nINSERT INTO `schedule_job_log` VALUES (41, 1, 'testTask', 'test', 'volunteer', 0, NULL, 1007, '2018-07-01 20:00:00');\nINSERT INTO `schedule_job_log` VALUES (42, 1, 'testTask', 'test', 'volunteer', 0, NULL, 1021, '2018-07-01 20:30:00');\nINSERT INTO `schedule_job_log` VALUES (43, 1, 'testTask', 'test', 'volunteer', 0, NULL, 1007, '2018-07-01 21:00:00');\nINSERT INTO `schedule_job_log` VALUES (44, 1, 'testTask', 'test', 'volunteer', 0, NULL, 1017, '2018-07-01 21:30:00');\nINSERT INTO `schedule_job_log` VALUES (45, 1, 'testTask', 'test', 'volunteer', 0, NULL, 1016, '2018-07-01 22:00:00');\nINSERT INTO `schedule_job_log` VALUES (46, 1, 'testTask', 'test', 'volunteer', 0, NULL, 1016, '2018-07-01 22:30:00');\nINSERT INTO `schedule_job_log` VALUES (47, 1, 'testTask', 'test', 'volunteer', 0, NULL, 1018, '2018-07-01 23:00:00');\nINSERT INTO `schedule_job_log` VALUES (48, 1, 'testTask', 'test', 'volunteer', 0, NULL, 1011, '2018-07-02 09:30:00');\nINSERT INTO `schedule_job_log` VALUES (49, 1, 'testTask', 'test', 'volunteer', 0, NULL, 1019, '2018-07-02 10:00:00');\nINSERT INTO `schedule_job_log` VALUES (50, 1, 'testTask', 'test', 'volunteer', 0, NULL, 1016, '2018-07-02 10:30:00');\nINSERT INTO `schedule_job_log` VALUES (51, 1, 'testTask', 'test', 'volunteer', 0, NULL, 1026, '2018-07-02 11:00:00');\nINSERT INTO `schedule_job_log` VALUES (52, 1, 'testTask', 'test', 'volunteer', 0, NULL, 1027, '2018-07-02 11:30:00');\nINSERT INTO `schedule_job_log` VALUES (53, 1, 'testTask', 'test', 'volunteer', 0, NULL, 1013, '2018-07-02 12:00:00');\nINSERT INTO `schedule_job_log` VALUES (54, 1, 'testTask', 'test', 'volunteer', 0, NULL, 1020, '2018-07-02 13:00:00');\nINSERT INTO `schedule_job_log` VALUES (55, 1, 'testTask', 'test', 'volunteer', 0, NULL, 1040, '2018-07-02 21:30:00');\nINSERT INTO `schedule_job_log` VALUES (56, 1, 'testTask', 'test', 'volunteer', 0, NULL, 1011, '2018-07-02 22:00:00');\nINSERT INTO `schedule_job_log` VALUES (57, 1, 'testTask', 'test', 'volunteer', 0, NULL, 1018, '2018-07-02 22:30:00');\nINSERT INTO `schedule_job_log` VALUES (58, 1, 'testTask', 'test', 'volunteer', 0, NULL, 1019, '2018-07-02 23:00:00');\nINSERT INTO `schedule_job_log` VALUES (59, 1, 'testTask', 'test', 'volunteer', 0, NULL, 1025, '2018-07-02 23:30:00');\nINSERT INTO `schedule_job_log` VALUES (60, 1, 'testTask', 'test', 'volunteer', 0, NULL, 1037, '2018-07-03 00:00:00');\nINSERT INTO `schedule_job_log` VALUES (61, 1, 'testTask', 'test', 'volunteer', 0, NULL, 1014, '2018-07-03 01:30:00');\nINSERT INTO `schedule_job_log` VALUES (62, 1, 'testTask', 'test', 'volunteer', 0, NULL, 1018, '2018-07-03 08:30:00');\nINSERT INTO `schedule_job_log` VALUES (63, 1, 'testTask', 'test', 'volunteer', 0, NULL, 1025, '2018-07-03 09:00:00');\nINSERT INTO `schedule_job_log` VALUES (64, 1, 'testTask', 'test', 'volunteer', 0, NULL, 1023, '2018-07-03 13:00:06');\nINSERT INTO `schedule_job_log` VALUES (65, 1, 'testTask', 'test', 'volunteer', 0, NULL, 1014, '2018-07-03 13:30:00');\nINSERT INTO `schedule_job_log` VALUES (66, 1, 'testTask', 'test', 'volunteer', 0, NULL, 1402, '2018-07-03 18:30:00');\nINSERT INTO `schedule_job_log` VALUES (67, 1, 'testTask', 'test', 'volunteer', 0, NULL, 1024, '2018-07-03 19:00:00');\nINSERT INTO `schedule_job_log` VALUES (68, 1, 'testTask', 'test', 'volunteer', 0, NULL, 1015, '2018-07-03 19:30:00');\nINSERT INTO `schedule_job_log` VALUES (69, 1, 'testTask', 'test', 'volunteer', 0, NULL, 1020, '2018-07-03 20:00:00');\nINSERT INTO `schedule_job_log` VALUES (70, 1, 'testTask', 'test', 'volunteer', 0, NULL, 1016, '2018-07-03 20:30:00');\nINSERT INTO `schedule_job_log` VALUES (71, 1, 'testTask', 'test', 'volunteer', 0, NULL, 1023, '2018-07-03 21:00:00');\nINSERT INTO `schedule_job_log` VALUES (72, 1, 'testTask', 'test', 'volunteer', 0, NULL, 1020, '2018-07-03 21:30:00');\nINSERT INTO `schedule_job_log` VALUES (73, 1, 'testTask', 'test', 'volunteer', 0, NULL, 1021, '2018-07-03 22:00:00');\nINSERT INTO `schedule_job_log` VALUES (74, 1, 'testTask', 'test', 'volunteer', 0, NULL, 1024, '2018-07-03 22:30:00');\nINSERT INTO `schedule_job_log` VALUES (75, 1, 'testTask', 'test', 'volunteer', 0, NULL, 1015, '2018-07-03 23:00:00');\nINSERT INTO `schedule_job_log` VALUES (76, 1, 'testTask', 'test', 'volunteer', 0, NULL, 1045, '2018-07-03 23:30:00');\nINSERT INTO `schedule_job_log` VALUES (77, 1, 'testTask', 'test', 'volunteer', 0, NULL, 1016, '2018-07-04 00:30:00');\nINSERT INTO `schedule_job_log` VALUES (78, 1, 'testTask', 'test', 'volunteer', 0, NULL, 1012, '2018-07-04 04:30:00');\nINSERT INTO `schedule_job_log` VALUES (79, 1, 'testTask', 'test', 'volunteer', 0, NULL, 1016, '2018-07-04 10:00:00');\nINSERT INTO `schedule_job_log` VALUES (80, 1, 'testTask', 'test', 'volunteer', 0, NULL, 1038, '2018-07-04 10:30:00');\nINSERT INTO `schedule_job_log` VALUES (81, 1, 'testTask', 'test', 'volunteer', 0, NULL, 1021, '2018-07-05 13:00:00');\nINSERT INTO `schedule_job_log` VALUES (82, 1, 'testTask', 'test', 'volunteer', 0, NULL, 1054, '2018-07-05 13:30:00');\nINSERT INTO `schedule_job_log` VALUES (83, 1, 'testTask', 'test', 'volunteer', 0, NULL, 1015, '2018-07-05 14:00:00');\nINSERT INTO `schedule_job_log` VALUES (84, 1, 'testTask', 'test', 'volunteer', 0, NULL, 1033, '2018-07-05 14:30:00');\nINSERT INTO `schedule_job_log` VALUES (85, 1, 'testTask', 'test', 'volunteer', 0, NULL, 1031, '2018-07-06 23:00:00');\nINSERT INTO `schedule_job_log` VALUES (86, 1, 'testTask', 'test', 'volunteer', 0, NULL, 1014, '2018-07-06 23:30:00');\nINSERT INTO `schedule_job_log` VALUES (87, 1, 'testTask', 'test', 'volunteer', 0, NULL, 1038, '2018-07-07 00:00:00');\nINSERT INTO `schedule_job_log` VALUES (88, 1, 'testTask', 'test', 'volunteer', 0, NULL, 1049, '2018-07-07 00:30:00');\nINSERT INTO `schedule_job_log` VALUES (89, 1, 'testTask', 'test', 'volunteer', 0, NULL, 1022, '2018-07-07 04:00:00');\nINSERT INTO `schedule_job_log` VALUES (90, 1, 'testTask', 'test', 'volunteer', 0, NULL, 1031, '2018-07-07 11:00:00');\nINSERT INTO `schedule_job_log` VALUES (91, 1, 'testTask', 'test', 'volunteer', 0, NULL, 1023, '2018-07-07 11:30:00');\nINSERT INTO `schedule_job_log` VALUES (92, 1, 'testTask', 'test', 'volunteer', 0, NULL, 1031, '2018-07-07 17:00:00');\nINSERT INTO `schedule_job_log` VALUES (93, 1, 'testTask', 'test', 'volunteer', 0, NULL, 1019, '2018-07-07 18:30:11');\nINSERT INTO `schedule_job_log` VALUES (94, 1, 'testTask', 'test', 'volunteer', 0, NULL, 1015, '2018-07-07 20:00:00');\nINSERT INTO `schedule_job_log` VALUES (95, 1, 'testTask', 'test', 'volunteer', 0, NULL, 1029, '2018-07-07 20:30:00');\nINSERT INTO `schedule_job_log` VALUES (96, 1, 'testTask', 'test', 'volunteer', 0, NULL, 1022, '2018-07-07 21:00:00');\nINSERT INTO `schedule_job_log` VALUES (97, 1, 'testTask', 'test', 'volunteer', 0, NULL, 1037, '2018-07-07 21:30:00');\nINSERT INTO `schedule_job_log` VALUES (98, 1, 'testTask', 'test', 'volunteer', 0, NULL, 1020, '2018-07-07 22:00:00');\nINSERT INTO `schedule_job_log` VALUES (99, 1, 'testTask', 'test', 'volunteer', 0, NULL, 1029, '2018-07-07 22:30:00');\nINSERT INTO `schedule_job_log` VALUES (100, 1, 'testTask', 'test', 'volunteer', 0, NULL, 1048, '2018-07-07 23:00:00');\nINSERT INTO `schedule_job_log` VALUES (101, 1, 'testTask', 'test', 'volunteer', 0, NULL, 1024, '2018-07-07 23:30:00');\nINSERT INTO `schedule_job_log` VALUES (102, 1, 'testTask', 'test', 'volunteer', 0, NULL, 1084, '2018-07-08 00:00:00');\nINSERT INTO `schedule_job_log` VALUES (103, 1, 'testTask', 'test', 'volunteer', 0, NULL, 1012, '2018-07-08 06:00:07');\nINSERT INTO `schedule_job_log` VALUES (104, 1, 'testTask', 'test', 'volunteer', 0, NULL, 1032, '2018-07-08 16:30:00');\nINSERT INTO `schedule_job_log` VALUES (105, 1, 'testTask', 'test', 'volunteer', 0, NULL, 1054, '2018-07-08 17:00:00');\nINSERT INTO `schedule_job_log` VALUES (106, 1, 'testTask', 'test', 'volunteer', 0, NULL, 1160, '2018-07-08 17:30:00');\nINSERT INTO `schedule_job_log` VALUES (107, 1, 'testTask', 'test', 'volunteer', 0, NULL, 1065, '2018-07-14 17:30:00');\nINSERT INTO `schedule_job_log` VALUES (108, 1, 'testTask', 'test', 'volunteer', 0, NULL, 1014, '2018-07-14 18:00:00');\nINSERT INTO `schedule_job_log` VALUES (109, 1, 'testTask', 'test', 'volunteer', 0, NULL, 1010, '2018-07-14 18:30:00');\nINSERT INTO `schedule_job_log` VALUES (110, 1, 'testTask', 'test', 'volunteer', 0, NULL, 1023, '2018-07-14 19:30:00');\nINSERT INTO `schedule_job_log` VALUES (111, 1, 'testTask', 'test', 'volunteer', 0, NULL, 1021, '2018-07-14 20:30:00');\nINSERT INTO `schedule_job_log` VALUES (112, 1, 'testTask', 'test', 'volunteer', 0, NULL, 1011, '2018-07-14 21:00:00');\nINSERT INTO `schedule_job_log` VALUES (113, 1, 'testTask', 'test', 'volunteer', 0, NULL, 2073, '2018-07-14 21:30:00');\nINSERT INTO `schedule_job_log` VALUES (114, 1, 'testTask', 'test', 'volunteer', 0, NULL, 1114, '2018-07-14 22:00:00');\nINSERT INTO `schedule_job_log` VALUES (115, 1, 'testTask', 'test', 'volunteer', 0, NULL, 1023, '2018-07-14 22:30:00');\nINSERT INTO `schedule_job_log` VALUES (116, 1, 'testTask', 'test', 'volunteer', 0, NULL, 1034, '2018-07-14 23:00:00');\nINSERT INTO `schedule_job_log` VALUES (117, 1, 'testTask', 'test', 'volunteer', 0, NULL, 1015, '2018-07-14 23:30:00');\nINSERT INTO `schedule_job_log` VALUES (118, 1, 'testTask', 'test', 'volunteer', 0, NULL, 1010, '2018-07-15 01:30:00');\nINSERT INTO `schedule_job_log` VALUES (119, 1, 'testTask', 'test', 'volunteer', 0, NULL, 1012, '2018-07-15 06:30:00');\nINSERT INTO `schedule_job_log` VALUES (120, 1, 'testTask', 'test', 'volunteer', 0, NULL, 1043, '2018-07-15 08:30:00');\nINSERT INTO `schedule_job_log` VALUES (121, 1, 'testTask', 'test', 'volunteer', 0, NULL, 1015, '2018-07-15 09:00:00');\nINSERT INTO `schedule_job_log` VALUES (122, 1, 'testTask', 'test', 'volunteer', 0, NULL, 1014, '2018-07-15 09:30:00');\nINSERT INTO `schedule_job_log` VALUES (123, 1, 'testTask', 'test', 'volunteer', 0, NULL, 1022, '2018-07-15 10:00:00');\nINSERT INTO `schedule_job_log` VALUES (124, 1, 'testTask', 'test', 'volunteer', 0, NULL, 1026, '2018-07-15 10:30:00');\nINSERT INTO `schedule_job_log` VALUES (125, 1, 'testTask', 'test', 'volunteer', 0, NULL, 1013, '2018-07-15 11:00:00');\nINSERT INTO `schedule_job_log` VALUES (126, 1, 'testTask', 'test', 'volunteer', 0, NULL, 1012, '2018-07-15 11:30:00');\nINSERT INTO `schedule_job_log` VALUES (127, 1, 'testTask', 'test', 'volunteer', 0, NULL, 1013, '2018-07-15 12:00:00');\nINSERT INTO `schedule_job_log` VALUES (128, 1, 'testTask', 'test', 'volunteer', 0, NULL, 1032, '2018-07-15 12:30:00');\nINSERT INTO `schedule_job_log` VALUES (129, 1, 'testTask', 'test', 'volunteer', 0, NULL, 1012, '2018-07-15 13:00:00');\nINSERT INTO `schedule_job_log` VALUES (130, 1, 'testTask', 'test', 'volunteer', 0, NULL, 1081, '2018-07-15 13:30:00');\nINSERT INTO `schedule_job_log` VALUES (131, 1, 'testTask', 'test', 'volunteer', 0, NULL, 1015, '2018-07-15 14:00:00');\nINSERT INTO `schedule_job_log` VALUES (132, 1, 'testTask', 'test', 'volunteer', 0, NULL, 1048, '2018-07-15 14:30:00');\nINSERT INTO `schedule_job_log` VALUES (133, 1, 'testTask', 'test', 'volunteer', 0, NULL, 1156, '2018-07-15 17:00:01');\nINSERT INTO `schedule_job_log` VALUES (134, 1, 'testTask', 'test', 'volunteer', 0, NULL, 1029, '2018-07-15 18:00:00');\nINSERT INTO `schedule_job_log` VALUES (135, 1, 'testTask', 'test', 'volunteer', 0, NULL, 1028, '2018-07-15 18:30:00');\nINSERT INTO `schedule_job_log` VALUES (136, 1, 'testTask', 'test', 'volunteer', 0, NULL, 1038, '2018-07-16 09:30:00');\nINSERT INTO `schedule_job_log` VALUES (137, 1, 'testTask', 'test', 'volunteer', 0, NULL, 1035, '2018-07-17 11:30:00');\nINSERT INTO `schedule_job_log` VALUES (138, 1, 'testTask', 'test', 'volunteer', 0, NULL, 1124, '2018-07-17 12:00:00');\nINSERT INTO `schedule_job_log` VALUES (139, 1, 'testTask', 'test', 'volunteer', 0, NULL, 1101, '2018-07-17 12:30:00');\nINSERT INTO `schedule_job_log` VALUES (140, 1, 'testTask', 'test', 'volunteer', 0, NULL, 1189, '2018-07-17 18:30:01');\nINSERT INTO `schedule_job_log` VALUES (141, 1, 'testTask', 'test', 'volunteer', 0, NULL, 1071, '2018-07-17 19:00:00');\nINSERT INTO `schedule_job_log` VALUES (142, 1, 'testTask', 'test', 'volunteer', 0, NULL, 1037, '2018-07-17 19:30:00');\nINSERT INTO `schedule_job_log` VALUES (143, 1, 'testTask', 'test', 'volunteer', 0, NULL, 1045, '2018-07-17 20:00:00');\nINSERT INTO `schedule_job_log` VALUES (144, 1, 'testTask', 'test', 'volunteer', 0, NULL, 1062, '2018-07-17 20:30:00');\nINSERT INTO `schedule_job_log` VALUES (145, 1, 'testTask', 'test', 'volunteer', 0, NULL, 1085, '2018-07-17 21:00:00');\nINSERT INTO `schedule_job_log` VALUES (146, 1, 'testTask', 'test', 'volunteer', 0, NULL, 1111, '2018-07-17 21:30:00');\nINSERT INTO `schedule_job_log` VALUES (147, 1, 'testTask', 'test', 'volunteer', 0, NULL, 1066, '2018-07-17 22:00:00');\nINSERT INTO `schedule_job_log` VALUES (148, 1, 'testTask', 'test', 'volunteer', 0, NULL, 1090, '2018-07-17 22:30:00');\nINSERT INTO `schedule_job_log` VALUES (149, 1, 'testTask', 'test', 'volunteer', 0, NULL, 1063, '2018-07-17 23:00:00');\nINSERT INTO `schedule_job_log` VALUES (150, 1, 'testTask', 'test', 'volunteer', 0, NULL, 1103, '2018-07-18 09:30:00');\nINSERT INTO `schedule_job_log` VALUES (151, 1, 'testTask', 'test', 'volunteer', 0, NULL, 1068, '2018-07-18 10:00:00');\nINSERT INTO `schedule_job_log` VALUES (152, 1, 'testTask', 'test', 'volunteer', 0, NULL, 1036, '2018-07-18 10:30:00');\nINSERT INTO `schedule_job_log` VALUES (153, 1, 'testTask', 'test', 'volunteer', 0, NULL, 1061, '2018-07-18 11:00:00');\nINSERT INTO `schedule_job_log` VALUES (154, 1, 'testTask', 'test', 'volunteer', 0, NULL, 1027, '2018-07-18 11:30:00');\nINSERT INTO `schedule_job_log` VALUES (155, 1, 'testTask', 'test', 'volunteer', 0, NULL, 1052, '2018-07-18 12:00:00');\nINSERT INTO `schedule_job_log` VALUES (156, 1, 'testTask', 'test', 'volunteer', 0, NULL, 1019, '2018-07-18 12:30:00');\nINSERT INTO `schedule_job_log` VALUES (157, 1, 'testTask', 'test', 'volunteer', 0, NULL, 1089, '2018-07-18 13:30:00');\nINSERT INTO `schedule_job_log` VALUES (158, 1, 'testTask', 'test', 'volunteer', 0, NULL, 1108, '2018-07-18 14:30:00');\nINSERT INTO `schedule_job_log` VALUES (159, 1, 'testTask', 'test', 'volunteer', 0, NULL, 1060, '2018-07-18 15:00:00');\nINSERT INTO `schedule_job_log` VALUES (160, 1, 'testTask', 'test', 'volunteer', 0, NULL, 1046, '2018-07-18 15:30:00');\nINSERT INTO `schedule_job_log` VALUES (161, 1, 'testTask', 'test', 'volunteer', 0, NULL, 1039, '2018-07-18 16:00:00');\nINSERT INTO `schedule_job_log` VALUES (162, 1, 'testTask', 'test', 'volunteer', 0, NULL, 1075, '2018-07-18 16:30:00');\nINSERT INTO `schedule_job_log` VALUES (163, 1, 'testTask', 'test', 'volunteer', 0, NULL, 1049, '2018-07-18 17:00:00');\nINSERT INTO `schedule_job_log` VALUES (164, 1, 'testTask', 'test', 'volunteer', 0, NULL, 1066, '2018-07-18 17:30:00');\nINSERT INTO `schedule_job_log` VALUES (165, 1, 'testTask', 'test', 'volunteer', 0, NULL, 1068, '2018-07-18 18:00:00');\nINSERT INTO `schedule_job_log` VALUES (166, 1, 'testTask', 'test', 'volunteer', 0, NULL, 1060, '2018-07-18 18:30:00');\nINSERT INTO `schedule_job_log` VALUES (167, 1, 'testTask', 'test', 'volunteer', 0, NULL, 1030, '2018-07-18 19:00:00');\nINSERT INTO `schedule_job_log` VALUES (168, 1, 'testTask', 'test', 'volunteer', 0, NULL, 1165, '2018-07-18 19:30:00');\nINSERT INTO `schedule_job_log` VALUES (169, 1, 'testTask', 'test', 'volunteer', 0, NULL, 1092, '2018-07-18 20:00:00');\nINSERT INTO `schedule_job_log` VALUES (170, 1, 'testTask', 'test', 'volunteer', 0, NULL, 1025, '2018-07-18 20:30:00');\nINSERT INTO `schedule_job_log` VALUES (171, 1, 'testTask', 'test', 'volunteer', 0, NULL, 1053, '2018-07-18 21:00:00');\nINSERT INTO `schedule_job_log` VALUES (172, 1, 'testTask', 'test', 'volunteer', 0, NULL, 1041, '2018-07-18 21:30:00');\nINSERT INTO `schedule_job_log` VALUES (173, 1, 'testTask', 'test', 'volunteer', 0, NULL, 1153, '2018-07-18 22:00:00');\nINSERT INTO `schedule_job_log` VALUES (174, 1, 'testTask', 'test', 'volunteer', 0, NULL, 1080, '2018-07-18 22:30:00');\nINSERT INTO `schedule_job_log` VALUES (175, 1, 'testTask', 'test', 'volunteer', 0, NULL, 1024, '2018-07-18 23:00:00');\nINSERT INTO `schedule_job_log` VALUES (176, 1, 'testTask', 'test', 'volunteer', 0, NULL, 1060, '2018-07-18 23:30:00');\nINSERT INTO `schedule_job_log` VALUES (177, 1, 'testTask', 'test', 'volunteer', 0, NULL, 1066, '2018-07-19 00:00:00');\nINSERT INTO `schedule_job_log` VALUES (178, 1, 'testTask', 'test', 'volunteer', 0, NULL, 1103, '2018-07-19 09:30:00');\nINSERT INTO `schedule_job_log` VALUES (179, 1, 'testTask', 'test', 'volunteer', 0, NULL, 1049, '2018-07-19 10:00:00');\nINSERT INTO `schedule_job_log` VALUES (180, 1, 'testTask', 'test', 'volunteer', 0, NULL, 1050, '2018-07-19 10:30:00');\nINSERT INTO `schedule_job_log` VALUES (181, 1, 'testTask', 'test', 'volunteer', 0, NULL, 1055, '2018-07-19 11:00:00');\nINSERT INTO `schedule_job_log` VALUES (182, 1, 'testTask', 'test', 'volunteer', 0, NULL, 1071, '2018-07-19 11:30:00');\nINSERT INTO `schedule_job_log` VALUES (183, 1, 'testTask', 'test', 'volunteer', 0, NULL, 1046, '2018-07-19 12:00:00');\nINSERT INTO `schedule_job_log` VALUES (184, 1, 'testTask', 'test', 'volunteer', 0, NULL, 1093, '2018-07-19 12:30:00');\nINSERT INTO `schedule_job_log` VALUES (185, 1, 'testTask', 'test', 'volunteer', 0, NULL, 1045, '2018-07-19 13:00:00');\nINSERT INTO `schedule_job_log` VALUES (186, 1, 'testTask', 'test', 'volunteer', 0, NULL, 1033, '2018-07-19 13:30:00');\nINSERT INTO `schedule_job_log` VALUES (187, 1, 'testTask', 'test', 'volunteer', 0, NULL, 1074, '2018-07-19 14:00:00');\nINSERT INTO `schedule_job_log` VALUES (188, 1, 'testTask', 'test', 'volunteer', 0, NULL, 1028, '2018-07-19 14:30:00');\nINSERT INTO `schedule_job_log` VALUES (189, 1, 'testTask', 'test', 'volunteer', 0, NULL, 1034, '2018-07-19 15:00:00');\nINSERT INTO `schedule_job_log` VALUES (190, 1, 'testTask', 'test', 'volunteer', 0, NULL, 1018, '2018-07-19 15:30:00');\nINSERT INTO `schedule_job_log` VALUES (191, 1, 'testTask', 'test', 'volunteer', 0, NULL, 1047, '2018-07-19 16:00:00');\nINSERT INTO `schedule_job_log` VALUES (192, 1, 'testTask', 'test', 'volunteer', 0, NULL, 1057, '2018-07-19 16:30:00');\nINSERT INTO `schedule_job_log` VALUES (193, 1, 'testTask', 'test', 'volunteer', 0, NULL, 1039, '2018-07-19 17:00:00');\nINSERT INTO `schedule_job_log` VALUES (194, 1, 'testTask', 'test', 'volunteer', 0, NULL, 1034, '2018-07-19 17:30:00');\nINSERT INTO `schedule_job_log` VALUES (195, 1, 'testTask', 'test', 'volunteer', 0, NULL, 1072, '2018-07-20 11:00:00');\nINSERT INTO `schedule_job_log` VALUES (196, 1, 'testTask', 'test', 'volunteer', 0, NULL, 1200, '2018-07-20 11:30:01');\nINSERT INTO `schedule_job_log` VALUES (197, 1, 'testTask', 'test', 'volunteer', 0, NULL, 1099, '2018-07-20 13:00:00');\nINSERT INTO `schedule_job_log` VALUES (198, 1, 'testTask', 'test', 'volunteer', 0, NULL, 1245, '2018-07-20 13:30:01');\nINSERT INTO `schedule_job_log` VALUES (199, 1, 'testTask', 'test', 'volunteer', 0, NULL, 1022, '2018-07-20 14:00:00');\nINSERT INTO `schedule_job_log` VALUES (200, 1, 'testTask', 'test', 'volunteer', 0, NULL, 1091, '2018-07-20 14:30:00');\nINSERT INTO `schedule_job_log` VALUES (201, 1, 'testTask', 'test', 'volunteer', 0, NULL, 1075, '2018-07-20 20:30:00');\nINSERT INTO `schedule_job_log` VALUES (202, 1, 'testTask', 'test', 'volunteer', 0, NULL, 1039, '2018-07-20 21:00:00');\nINSERT INTO `schedule_job_log` VALUES (203, 1, 'testTask', 'test', 'volunteer', 0, NULL, 1106, '2018-07-20 21:30:00');\nINSERT INTO `schedule_job_log` VALUES (204, 1, 'testTask', 'test', 'volunteer', 0, NULL, 1037, '2018-07-20 22:30:00');\nINSERT INTO `schedule_job_log` VALUES (205, 1, 'testTask', 'test', 'volunteer', 0, NULL, 1073, '2018-07-20 23:00:29');\nINSERT INTO `schedule_job_log` VALUES (206, 1, 'testTask', 'test', 'volunteer', 0, NULL, 1170, '2018-07-20 23:30:01');\nINSERT INTO `schedule_job_log` VALUES (207, 1, 'testTask', 'test', 'volunteer', 0, NULL, 1048, '2018-07-21 05:30:00');\nINSERT INTO `schedule_job_log` VALUES (208, 1, 'testTask', 'test', 'volunteer', 0, NULL, 1046, '2018-07-21 09:00:00');\nINSERT INTO `schedule_job_log` VALUES (209, 1, 'testTask', 'test', 'volunteer', 0, NULL, 1037, '2018-07-21 09:30:00');\nINSERT INTO `schedule_job_log` VALUES (210, 1, 'testTask', 'test', 'volunteer', 0, NULL, 1065, '2018-07-21 10:00:00');\nINSERT INTO `schedule_job_log` VALUES (211, 1, 'testTask', 'test', 'volunteer', 0, NULL, 1083, '2018-07-21 10:30:00');\nINSERT INTO `schedule_job_log` VALUES (212, 1, 'testTask', 'test', 'volunteer', 0, NULL, 1025, '2018-07-21 11:00:00');\nINSERT INTO `schedule_job_log` VALUES (213, 1, 'testTask', 'test', 'volunteer', 0, NULL, 1037, '2018-07-21 11:30:00');\nINSERT INTO `schedule_job_log` VALUES (214, 1, 'testTask', 'test', 'volunteer', 0, NULL, 1044, '2018-07-21 12:00:00');\nINSERT INTO `schedule_job_log` VALUES (215, 1, 'testTask', 'test', 'volunteer', 0, NULL, 1018, '2018-07-21 12:30:00');\nINSERT INTO `schedule_job_log` VALUES (216, 1, 'testTask', 'test', 'volunteer', 0, NULL, 1033, '2018-07-21 13:00:00');\nINSERT INTO `schedule_job_log` VALUES (217, 1, 'testTask', 'test', 'volunteer', 0, NULL, 1022, '2018-07-21 13:30:00');\nINSERT INTO `schedule_job_log` VALUES (218, 1, 'testTask', 'test', 'volunteer', 0, NULL, 1032, '2018-07-21 14:00:00');\nINSERT INTO `schedule_job_log` VALUES (219, 1, 'testTask', 'test', 'volunteer', 0, NULL, 1022, '2018-07-21 14:30:00');\nINSERT INTO `schedule_job_log` VALUES (220, 1, 'testTask', 'test', 'volunteer', 0, NULL, 1114, '2018-07-21 15:00:00');\nINSERT INTO `schedule_job_log` VALUES (221, 1, 'testTask', 'test', 'volunteer', 0, NULL, 1031, '2018-07-21 16:00:00');\nINSERT INTO `schedule_job_log` VALUES (222, 1, 'testTask', 'test', 'volunteer', 0, NULL, 1116, '2018-07-21 16:30:00');\nINSERT INTO `schedule_job_log` VALUES (223, 1, 'testTask', 'test', 'volunteer', 0, NULL, 1025, '2018-07-21 17:00:00');\nINSERT INTO `schedule_job_log` VALUES (224, 1, 'testTask', 'test', 'volunteer', 0, NULL, 1116, '2018-07-21 17:30:00');\nINSERT INTO `schedule_job_log` VALUES (225, 1, 'testTask', 'test', 'volunteer', 0, NULL, 1073, '2018-07-21 18:00:00');\nINSERT INTO `schedule_job_log` VALUES (226, 1, 'testTask', 'test', 'volunteer', 0, NULL, 1062, '2018-07-21 18:30:00');\nINSERT INTO `schedule_job_log` VALUES (227, 1, 'testTask', 'test', 'volunteer', 0, NULL, 1049, '2018-07-21 19:00:00');\nINSERT INTO `schedule_job_log` VALUES (228, 1, 'testTask', 'test', 'volunteer', 0, NULL, 1038, '2018-07-21 19:30:00');\nINSERT INTO `schedule_job_log` VALUES (229, 1, 'testTask', 'test', 'volunteer', 0, NULL, 1029, '2018-07-21 20:00:00');\nINSERT INTO `schedule_job_log` VALUES (230, 1, 'testTask', 'test', 'volunteer', 0, NULL, 1027, '2018-07-21 20:30:00');\nINSERT INTO `schedule_job_log` VALUES (231, 1, 'testTask', 'test', 'volunteer', 0, NULL, 1069, '2018-07-21 21:00:00');\nINSERT INTO `schedule_job_log` VALUES (232, 1, 'testTask', 'test', 'volunteer', 0, NULL, 1110, '2018-07-21 21:30:00');\nINSERT INTO `schedule_job_log` VALUES (233, 1, 'testTask', 'test', 'volunteer', 0, NULL, 1025, '2018-07-21 22:00:00');\nINSERT INTO `schedule_job_log` VALUES (234, 1, 'testTask', 'test', 'volunteer', 0, NULL, 1114, '2018-07-21 22:30:00');\nINSERT INTO `schedule_job_log` VALUES (235, 1, 'testTask', 'test', 'volunteer', 0, NULL, 1108, '2018-07-22 09:30:00');\nINSERT INTO `schedule_job_log` VALUES (236, 1, 'testTask', 'test', 'volunteer', 0, NULL, 1050, '2018-07-22 10:00:00');\nINSERT INTO `schedule_job_log` VALUES (237, 1, 'testTask', 'test', 'volunteer', 0, NULL, 1042, '2018-07-22 10:30:00');\nINSERT INTO `schedule_job_log` VALUES (238, 1, 'testTask', 'test', 'volunteer', 0, NULL, 1055, '2018-07-22 11:00:00');\nINSERT INTO `schedule_job_log` VALUES (239, 1, 'testTask', 'test', 'volunteer', 0, NULL, 1054, '2018-07-22 11:30:00');\nINSERT INTO `schedule_job_log` VALUES (240, 1, 'testTask', 'test', 'volunteer', 0, NULL, 1040, '2018-07-22 12:00:00');\nINSERT INTO `schedule_job_log` VALUES (241, 1, 'testTask', 'test', 'volunteer', 0, NULL, 1053, '2018-07-22 12:30:00');\nINSERT INTO `schedule_job_log` VALUES (242, 1, 'testTask', 'test', 'volunteer', 0, NULL, 1035, '2018-07-22 13:00:00');\nINSERT INTO `schedule_job_log` VALUES (243, 1, 'testTask', 'test', 'volunteer', 0, NULL, 1031, '2018-07-22 13:30:00');\nINSERT INTO `schedule_job_log` VALUES (244, 1, 'testTask', 'test', 'volunteer', 0, NULL, 1054, '2018-07-22 14:00:00');\nINSERT INTO `schedule_job_log` VALUES (245, 1, 'testTask', 'test', 'volunteer', 0, NULL, 1063, '2018-07-22 14:30:00');\nINSERT INTO `schedule_job_log` VALUES (246, 1, 'testTask', 'test', 'volunteer', 0, NULL, 1038, '2018-07-22 15:00:00');\nINSERT INTO `schedule_job_log` VALUES (247, 1, 'testTask', 'test', 'volunteer', 0, NULL, 1061, '2018-07-22 15:30:00');\nINSERT INTO `schedule_job_log` VALUES (248, 1, 'testTask', 'test', 'volunteer', 0, NULL, 1060, '2018-07-22 16:00:00');\nINSERT INTO `schedule_job_log` VALUES (249, 1, 'testTask', 'test', 'volunteer', 0, NULL, 1040, '2018-07-22 16:30:00');\nINSERT INTO `schedule_job_log` VALUES (250, 1, 'testTask', 'test', 'volunteer', 0, NULL, 1047, '2018-07-22 17:00:00');\nINSERT INTO `schedule_job_log` VALUES (251, 1, 'testTask', 'test', 'volunteer', 0, NULL, 1037, '2018-07-22 17:30:00');\nINSERT INTO `schedule_job_log` VALUES (252, 1, 'testTask', 'test', 'volunteer', 0, NULL, 1028, '2018-07-22 18:00:00');\nINSERT INTO `schedule_job_log` VALUES (253, 1, 'testTask', 'test', 'volunteer', 0, NULL, 1052, '2018-07-22 18:30:00');\nINSERT INTO `schedule_job_log` VALUES (254, 1, 'testTask', 'test', 'volunteer', 0, NULL, 1124, '2018-07-22 19:30:01');\nINSERT INTO `schedule_job_log` VALUES (255, 1, 'testTask', 'test', 'volunteer', 0, NULL, 1049, '2018-07-22 20:00:00');\nINSERT INTO `schedule_job_log` VALUES (256, 1, 'testTask', 'test', 'volunteer', 0, NULL, 1041, '2018-07-22 20:30:00');\nINSERT INTO `schedule_job_log` VALUES (257, 1, 'testTask', 'test', 'volunteer', 0, NULL, 1106, '2018-07-22 21:30:00');\nINSERT INTO `schedule_job_log` VALUES (258, 1, 'testTask', 'test', 'volunteer', 0, NULL, 1047, '2018-07-22 22:00:00');\nINSERT INTO `schedule_job_log` VALUES (259, 1, 'testTask', 'test', 'volunteer', 0, NULL, 1025, '2018-07-22 22:30:00');\nINSERT INTO `schedule_job_log` VALUES (260, 1, 'testTask', 'test', 'volunteer', 0, NULL, 1103, '2018-07-22 23:00:00');\nINSERT INTO `schedule_job_log` VALUES (261, 1, 'testTask', 'test', 'volunteer', 0, NULL, 1077, '2018-07-23 00:30:00');\nINSERT INTO `schedule_job_log` VALUES (262, 1, 'testTask', 'test', 'volunteer', 0, NULL, 1098, '2018-07-23 07:30:00');\nINSERT INTO `schedule_job_log` VALUES (263, 1, 'testTask', 'test', 'volunteer', 0, NULL, 1032, '2018-07-23 11:00:00');\nINSERT INTO `schedule_job_log` VALUES (264, 1, 'testTask', 'test', 'volunteer', 0, NULL, 1012, '2018-07-23 11:30:00');\nINSERT INTO `schedule_job_log` VALUES (265, 1, 'testTask', 'test', 'volunteer', 0, NULL, 1011, '2018-07-23 12:00:00');\nINSERT INTO `schedule_job_log` VALUES (266, 1, 'testTask', 'test', 'volunteer', 0, NULL, 1015, '2018-07-23 12:30:00');\nINSERT INTO `schedule_job_log` VALUES (267, 1, 'testTask', 'test', 'volunteer', 0, NULL, 1013, '2018-07-23 13:00:00');\nINSERT INTO `schedule_job_log` VALUES (268, 1, 'testTask', 'test', 'volunteer', 0, NULL, 1011, '2018-07-23 13:30:00');\nINSERT INTO `schedule_job_log` VALUES (269, 1, 'testTask', 'test', 'volunteer', 0, NULL, 1011, '2018-07-23 14:00:00');\nINSERT INTO `schedule_job_log` VALUES (270, 1, 'testTask', 'test', 'volunteer', 0, NULL, 1008, '2018-07-23 14:30:00');\nINSERT INTO `schedule_job_log` VALUES (271, 1, 'testTask', 'test', 'volunteer', 0, NULL, 1010, '2018-07-23 15:00:00');\nINSERT INTO `schedule_job_log` VALUES (272, 1, 'testTask', 'test', 'volunteer', 0, NULL, 1009, '2018-07-23 15:30:00');\nINSERT INTO `schedule_job_log` VALUES (273, 1, 'testTask', 'test', 'volunteer', 0, NULL, 1025, '2018-07-23 16:00:00');\nINSERT INTO `schedule_job_log` VALUES (274, 1, 'testTask', 'test', 'volunteer', 0, NULL, 1035, '2018-07-23 16:30:00');\nINSERT INTO `schedule_job_log` VALUES (275, 1, 'testTask', 'test', 'volunteer', 0, NULL, 1028, '2018-07-23 17:00:00');\nINSERT INTO `schedule_job_log` VALUES (276, 1, 'testTask', 'test', 'volunteer', 0, NULL, 1008, '2018-07-23 17:30:00');\nINSERT INTO `schedule_job_log` VALUES (277, 1, 'testTask', 'test', 'volunteer', 0, NULL, 1016, '2018-07-23 18:00:00');\nINSERT INTO `schedule_job_log` VALUES (278, 1, 'testTask', 'test', 'volunteer', 0, NULL, 1012, '2018-07-23 18:30:00');\nINSERT INTO `schedule_job_log` VALUES (279, 1, 'testTask', 'test', 'volunteer', 0, NULL, 1018, '2018-07-23 19:00:00');\nINSERT INTO `schedule_job_log` VALUES (280, 1, 'testTask', 'test', 'volunteer', 0, NULL, 1014, '2018-07-23 19:30:00');\nINSERT INTO `schedule_job_log` VALUES (281, 1, 'testTask', 'test', 'volunteer', 0, NULL, 1011, '2018-07-23 20:00:00');\nINSERT INTO `schedule_job_log` VALUES (282, 1, 'testTask', 'test', 'volunteer', 0, NULL, 1039, '2018-07-23 21:30:00');\nINSERT INTO `schedule_job_log` VALUES (283, 1, 'testTask', 'test', 'volunteer', 0, NULL, 1015, '2018-07-23 22:00:00');\nINSERT INTO `schedule_job_log` VALUES (284, 1, 'testTask', 'test', 'volunteer', 0, NULL, 1016, '2018-07-23 22:30:00');\nINSERT INTO `schedule_job_log` VALUES (285, 1, 'testTask', 'test', 'volunteer', 0, NULL, 1071, '2018-07-23 23:00:00');\nINSERT INTO `schedule_job_log` VALUES (286, 1, 'testTask', 'test', 'volunteer', 0, NULL, 1015, '2018-07-23 23:30:00');\nINSERT INTO `schedule_job_log` VALUES (287, 1, 'testTask', 'test', 'volunteer', 0, NULL, 1011, '2018-07-24 09:30:00');\nINSERT INTO `schedule_job_log` VALUES (288, 1, 'testTask', 'test', 'volunteer', 0, NULL, 1014, '2018-07-24 10:00:00');\nINSERT INTO `schedule_job_log` VALUES (289, 1, 'testTask', 'test', 'volunteer', 0, NULL, 1017, '2018-07-24 10:30:00');\nINSERT INTO `schedule_job_log` VALUES (290, 1, 'testTask', 'test', 'volunteer', 0, NULL, 1014, '2018-07-24 11:00:00');\nINSERT INTO `schedule_job_log` VALUES (291, 1, 'testTask', 'test', 'volunteer', 0, NULL, 1017, '2018-07-24 11:30:00');\nINSERT INTO `schedule_job_log` VALUES (292, 1, 'testTask', 'test', 'volunteer', 0, NULL, 1011, '2018-07-24 12:00:00');\nINSERT INTO `schedule_job_log` VALUES (293, 1, 'testTask', 'test', 'volunteer', 0, NULL, 1018, '2018-07-24 12:30:00');\nINSERT INTO `schedule_job_log` VALUES (294, 1, 'testTask', 'test', 'volunteer', 0, NULL, 1017, '2018-07-24 13:00:00');\nINSERT INTO `schedule_job_log` VALUES (295, 1, 'testTask', 'test', 'volunteer', 0, NULL, 1023, '2018-07-24 13:30:00');\nINSERT INTO `schedule_job_log` VALUES (296, 1, 'testTask', 'test', 'volunteer', 0, NULL, 1023, '2018-07-24 14:00:00');\nINSERT INTO `schedule_job_log` VALUES (297, 1, 'testTask', 'test', 'volunteer', 0, NULL, 1022, '2018-07-24 14:30:00');\nINSERT INTO `schedule_job_log` VALUES (298, 1, 'testTask', 'test', 'volunteer', 0, NULL, 1018, '2018-07-24 15:00:00');\nINSERT INTO `schedule_job_log` VALUES (299, 1, 'testTask', 'test', 'volunteer', 0, NULL, 1024, '2018-07-24 15:30:00');\nINSERT INTO `schedule_job_log` VALUES (300, 1, 'testTask', 'test', 'volunteer', 0, NULL, 1019, '2018-10-16 16:00:00');\nINSERT INTO `schedule_job_log` VALUES (301, 1, 'testTask', 'test', 'volunteer', 0, NULL, 1006, '2018-10-16 16:30:00');\nINSERT INTO `schedule_job_log` VALUES (302, 1, 'testTask', 'test', 'volunteer', 0, NULL, 1013, '2018-10-16 17:00:00');\nINSERT INTO `schedule_job_log` VALUES (303, 1, 'testTask', 'test', 'volunteer', 0, NULL, 1015, '2018-10-16 17:30:00');\nINSERT INTO `schedule_job_log` VALUES (304, 1, 'testTask', 'test', 'volunteer', 0, NULL, 1014, '2018-10-16 18:00:00');\nINSERT INTO `schedule_job_log` VALUES (305, 1, 'testTask', 'test', 'volunteer', 0, NULL, 1062, '2018-11-07 14:15:58');\nINSERT INTO `schedule_job_log` VALUES (306, 1, 'testTask', 'test', 'sdb', 0, NULL, 1039, '2018-11-07 14:30:00');\nINSERT INTO `schedule_job_log` VALUES (307, 1, 'testTask', 'test', 'sdb', 0, NULL, 1050, '2018-11-07 15:00:00');\nINSERT INTO `schedule_job_log` VALUES (308, 1, 'testTask', 'test', 'sdb', 0, NULL, 1211, '2018-11-07 15:30:00');\nINSERT INTO `schedule_job_log` VALUES (309, 1, 'testTask', 'test', 'sdb', 0, NULL, 1016, '2018-11-07 16:00:00');\nINSERT INTO `schedule_job_log` VALUES (310, 1, 'testTask', 'test', 'sdb', 0, NULL, 1034, '2018-11-07 16:30:00');\nCOMMIT;\n\n-- ----------------------------\n-- Table structure for sn\n-- ----------------------------\nDROP TABLE IF EXISTS `sn`;\nCREATE TABLE `sn` (\n  `type` int(11) NOT NULL COMMENT '类型',\n  `last_value` bigint(20) NOT NULL COMMENT '末值',\n  `create_date` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '创建日期',\n  `modify_date` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '修改日期',\n  PRIMARY KEY (`type`)\n) ENGINE=InnoDB DEFAULT CHARSET=utf8 COMMENT='序列号';\n\n-- ----------------------------\n-- Records of sn\n-- ----------------------------\nBEGIN;\nINSERT INTO `sn` VALUES (1, 116, '2018-05-23 14:52:55', '2018-05-23 14:52:55');\nINSERT INTO `sn` VALUES (2, 115, '2018-05-23 14:52:55', '2018-05-23 14:52:55');\nINSERT INTO `sn` VALUES (3, 148, '2018-05-23 14:52:55', '2018-05-23 14:52:55');\nINSERT INTO `sn` VALUES (4, 143, '2018-05-23 14:52:55', '2018-05-23 14:52:55');\nINSERT INTO `sn` VALUES (5, 106, '2018-05-23 14:52:55', '2018-05-23 14:52:55');\nINSERT INTO `sn` VALUES (6, 106, '2018-05-23 14:52:55', '2018-05-23 14:52:55');\nCOMMIT;\n\n-- ----------------------------\n-- Table structure for specification\n-- ----------------------------\nDROP TABLE IF EXISTS `specification`;\nCREATE TABLE `specification` (\n  `id` bigint(20) NOT NULL COMMENT 'id',\n  `parent_id` bigint(20) DEFAULT NULL COMMENT '父节点',\n  `type` int(11) NOT NULL COMMENT '0-规格组 1-规格参数',\n  `order` int(11) NOT NULL DEFAULT '0' COMMENT '排序',\n  `name` varchar(50) NOT NULL COMMENT '名称',\n  `category_id` bigint(20) DEFAULT NULL COMMENT '分类id',\n  PRIMARY KEY (`id`)\n) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4;\n\n-- ----------------------------\n-- Records of specification\n-- ----------------------------\nBEGIN;\nINSERT INTO `specification` VALUES (1000, NULL, 0, 0, '可放置最大规格数量', 1);\nINSERT INTO `specification` VALUES (1001, 1000, 1, 0, '1000ml*16', 1);\nINSERT INTO `specification` VALUES (1002, 1000, 1, 0, '1000ml*20', 1);\nINSERT INTO `specification` VALUES (2000, NULL, 0, 0, '可放置最大容量', 1);\nINSERT INTO `specification` VALUES (2001, 2000, 1, 0, '250ml * 20', 1);\nINSERT INTO `specification` VALUES (2002, 2000, 1, 0, '250ml * 60', 1);\nINSERT INTO `specification` VALUES (3000, NULL, 0, 0, '温度', 1);\nINSERT INTO `specification` VALUES (3001, 3000, 1, 0, '常温', 1);\nINSERT INTO `specification` VALUES (3002, 3000, 1, 0, '制冷', 1);\nINSERT INTO `specification` VALUES (4000, NULL, 0, 0, '层数', 1);\nINSERT INTO `specification` VALUES (4001, 4000, 1, 0, '单层', 1);\nINSERT INTO `specification` VALUES (4002, 4000, 1, 0, '双层', 1);\nINSERT INTO `specification` VALUES (5000, NULL, 0, 0, '颜色', 1);\nINSERT INTO `specification` VALUES (5001, 5000, 1, 0, '黑色', 1);\nINSERT INTO `specification` VALUES (5002, 5000, 1, 0, '白色', 1);\nINSERT INTO `specification` VALUES (6000, NULL, 0, 0, '尺码', 1);\nINSERT INTO `specification` VALUES (6002, 6000, 1, 0, 'XL', 1);\nINSERT INTO `specification` VALUES (60001, 6000, 1, 0, 'L', NULL);\nCOMMIT;\n\n-- ----------------------------\n-- Table structure for sys_captcha\n-- ----------------------------\nDROP TABLE IF EXISTS `sys_captcha`;\nCREATE TABLE `sys_captcha` (\n  `uuid` char(36) NOT NULL COMMENT 'uuid',\n  `code` varchar(6) NOT NULL COMMENT '验证码',\n  `expire_time` datetime DEFAULT NULL COMMENT '过期时间',\n  PRIMARY KEY (`uuid`)\n) ENGINE=InnoDB DEFAULT CHARSET=utf8 COMMENT='系统验证码';\n\n-- ----------------------------\n-- Records of sys_captcha\n-- ----------------------------\nBEGIN;\nINSERT INTO `sys_captcha` VALUES ('0237f28a-ec34-4fee-8977-006ebbf95ac5', 'ced6f', '2018-11-05 18:46:48');\nINSERT INTO `sys_captcha` VALUES ('02cf924f-8e21-487e-850a-a7a0ef750c99', 'xbdap', '2018-07-22 22:50:20');\nINSERT INTO `sys_captcha` VALUES ('074d3c82-0933-447d-89de-a6b161825b1a', '2ywbg', '2018-07-15 09:42:25');\nINSERT INTO `sys_captcha` VALUES ('09277fa4-f968-4f1a-86c0-74e58a6e61a0', '53ea6', '2018-11-05 19:01:34');\nINSERT INTO `sys_captcha` VALUES ('0c4b3a17-0165-422d-81a1-1c4059b464fe', 'f2n74', '2018-06-28 20:24:12');\nINSERT INTO `sys_captcha` VALUES ('0d31f5c3-4e26-4b61-8591-06e36adfa333', 'fxdae', '2018-10-16 16:04:00');\nINSERT INTO `sys_captcha` VALUES ('0f0a62d9-42bb-4c34-8a86-7dddb33d83ae', 'xa6e5', '2018-11-07 14:31:51');\nINSERT INTO `sys_captcha` VALUES ('10bf963d-8181-4363-8811-1dad41dbdd90', '65b75', '2018-11-06 11:58:01');\nINSERT INTO `sys_captcha` VALUES ('11ffc9c8-3d21-4964-858f-a5e659ddb690', '4fp6m', '2018-11-07 14:29:09');\nINSERT INTO `sys_captcha` VALUES ('1473dcb4-b628-442c-8163-6524446d6247', '87n4e', '2018-11-05 18:30:10');\nINSERT INTO `sys_captcha` VALUES ('19e2562f-3435-4232-84a3-f8fc64798012', 'abn4m', '2018-07-14 18:49:04');\nINSERT INTO `sys_captcha` VALUES ('1a674b0d-de68-4f0f-8e90-ecad5d593767', 'ggfmx', '2018-11-05 23:34:19');\nINSERT INTO `sys_captcha` VALUES ('1e04937f-72cf-4dde-8a4f-7dd29c17fdb8', 'gngm2', '2018-07-06 22:53:35');\nINSERT INTO `sys_captcha` VALUES ('1ef84e8b-d7ba-4c9b-82fd-b21bd81e2264', '32we4', '2018-11-05 18:35:58');\nINSERT INTO `sys_captcha` VALUES ('214eca86-3e4f-4cac-8f61-2c87c6f9bbf0', 'nm7fw', '2018-11-18 11:27:37');\nINSERT INTO `sys_captcha` VALUES ('22061a0c-8a0b-4106-8e54-81cc048e8dbb', 'pyeym', '2018-11-06 16:54:37');\nINSERT INTO `sys_captcha` VALUES ('2ac13e73-9a1a-4147-809c-e2642242a5e3', 'gnd3w', '2018-11-05 18:38:24');\nINSERT INTO `sys_captcha` VALUES ('2af60121-2a01-4adc-8975-2637b9172c66', '67d78', '2018-07-23 17:30:45');\nINSERT INTO `sys_captcha` VALUES ('2ee265d8-748f-479f-88d1-1d2fad3a1f15', 'ypnxg', '2018-11-06 17:09:06');\nINSERT INTO `sys_captcha` VALUES ('2f744fcb-434b-4923-8272-155ab062134f', 'yd27f', '2018-11-02 15:47:27');\nINSERT INTO `sys_captcha` VALUES ('33d87873-b6c6-4207-842c-dc378fe83aff', '8f7nm', '2018-07-03 18:21:04');\nINSERT INTO `sys_captcha` VALUES ('363064e6-d125-4fee-8634-216e806543f0', '3p2me', '2018-11-05 18:26:58');\nINSERT INTO `sys_captcha` VALUES ('371039d9-141e-4a6c-820a-e4bc977edff2', 'xecy6', '2018-07-14 18:49:01');\nINSERT INTO `sys_captcha` VALUES ('382fc137-2e1d-4533-8eeb-88604044e893', 'x2fp6', '2018-11-07 14:48:11');\nINSERT INTO `sys_captcha` VALUES ('3920cebe-620c-4d58-848d-e55c9df478a9', '5eany', '2018-11-02 15:52:52');\nINSERT INTO `sys_captcha` VALUES ('39bfd506-ba47-4946-8bab-000946373d73', '23pa7', '2018-06-30 23:31:13');\nINSERT INTO `sys_captcha` VALUES ('3ae28abe-d7c3-43dc-8c32-ef19cc1d9b86', 'pd26e', '2018-07-01 14:38:19');\nINSERT INTO `sys_captcha` VALUES ('44b207dc-3b70-45d9-80c2-27c62fb3d173', 'y8366', '2018-07-24 10:09:51');\nINSERT INTO `sys_captcha` VALUES ('469aa441-6654-410f-8ab5-88f7396421b2', 'bm7bp', '2018-11-05 18:56:30');\nINSERT INTO `sys_captcha` VALUES ('4bd264b6-8ec9-457c-8c18-e36850368387', 'xggy6', '2018-11-05 18:54:53');\nINSERT INTO `sys_captcha` VALUES ('527c5f31-99fb-430b-809b-140f0cc8a63b', 'dw2bp', '2018-11-05 19:05:00');\nINSERT INTO `sys_captcha` VALUES ('54a6bc1d-265b-47fd-82da-01810da1985a', 'p2m5n', '2018-07-02 10:39:35');\nINSERT INTO `sys_captcha` VALUES ('5ba02b9b-975e-4f41-8b36-155e12f4906d', '7yn3x', '2018-07-24 10:08:20');\nINSERT INTO `sys_captcha` VALUES ('609b0518-6d96-45e3-8489-004aa35c716b', 'gand2', '2018-11-06 12:58:51');\nINSERT INTO `sys_captcha` VALUES ('66bbbdfd-f6e0-4804-88e2-52e65958cf3e', 'n8gfw', '2018-11-07 11:39:23');\nINSERT INTO `sys_captcha` VALUES ('6b0bdb20-35dc-4490-8855-59445e95a669', 'gxncf', '2018-11-16 11:24:31');\nINSERT INTO `sys_captcha` VALUES ('6df46aa4-222b-4ea6-8b1e-f7bd23d630e2', '3d445', '2018-06-28 20:23:14');\nINSERT INTO `sys_captcha` VALUES ('76dc8535-eaf6-43e0-8bb6-4ed74f50c5f8', 'dn8mw', '2018-11-05 18:27:11');\nINSERT INTO `sys_captcha` VALUES ('78e43d48-0036-4ba8-87da-112a1be5373a', '6dmp6', '2018-06-28 20:23:12');\nINSERT INTO `sys_captcha` VALUES ('7a54f5e1-ce32-4624-8e14-bb73625645c2', '78f74', '2018-11-05 18:27:08');\nINSERT INTO `sys_captcha` VALUES ('7e1aacee-b00f-45d7-8d52-5d50cb913da2', '8g8ad', '2018-11-10 17:22:35');\nINSERT INTO `sys_captcha` VALUES ('7ee352eb-5229-43d4-819f-9daf09e3103c', 'gacgp', '2018-11-05 18:43:44');\nINSERT INTO `sys_captcha` VALUES ('7f86e22b-573c-488a-8a79-8124ca70a727', 'd8dwg', '2018-06-29 11:11:14');\nINSERT INTO `sys_captcha` VALUES ('8086f304-0d77-4c36-899a-ae8d2db0d97d', 'wexcw', '2018-07-24 10:10:18');\nINSERT INTO `sys_captcha` VALUES ('82e54ce6-133f-4e6e-85d7-48ff70761326', '7ce67', '2018-11-07 15:13:17');\nINSERT INTO `sys_captcha` VALUES ('87f048db-e1af-4196-8fcd-d71713be2e16', '67d6b', '2018-11-05 18:56:49');\nINSERT INTO `sys_captcha` VALUES ('88322263-b562-4b6e-88ae-5c5126fca95b', '2yxmf', '2018-11-05 18:33:26');\nINSERT INTO `sys_captcha` VALUES ('89949020-7480-41e7-8d3f-41d19dac764c', 'w88d3', '2018-11-05 18:27:00');\nINSERT INTO `sys_captcha` VALUES ('89fb395e-7452-4e15-850a-7ee474da528e', '3b8bp', '2018-11-05 17:51:44');\nINSERT INTO `sys_captcha` VALUES ('8e941b77-bed3-4d53-83be-5870d055bd06', '6dd8n', '2018-11-12 22:35:01');\nINSERT INTO `sys_captcha` VALUES ('9392f616-5e89-49c0-87e0-69b15c09c261', '6xyy8', '2018-11-05 18:06:21');\nINSERT INTO `sys_captcha` VALUES ('9806d06e-ed31-4bf4-8401-c4d477b48e95', 'cep4x', '2018-11-05 18:49:46');\nINSERT INTO `sys_captcha` VALUES ('99052770-e469-42ae-8ce3-48221a129aa6', '5pp45', '2018-11-17 11:31:18');\nINSERT INTO `sys_captcha` VALUES ('99848792-9786-4710-8dde-d1426cb37f5b', 'gex76', '2018-11-05 23:16:45');\nINSERT INTO `sys_captcha` VALUES ('ac8bd699-c375-4aed-88fb-3da971499e8e', 'ef44c', '2018-11-05 19:01:28');\nINSERT INTO `sys_captcha` VALUES ('adb0e3b5-25f0-4409-8970-847135a9c60e', 'ewn2g', '2018-11-07 11:39:23');\nINSERT INTO `sys_captcha` VALUES ('b285f163-5e5e-4c0f-8a08-f0c7a057f026', '8edn2', '2018-11-05 19:05:13');\nINSERT INTO `sys_captcha` VALUES ('b61873d7-7d6d-4b3e-8074-c51e939439fb', 'efm52', '2018-11-05 18:45:11');\nINSERT INTO `sys_captcha` VALUES ('b685ca58-4f23-4b5b-823e-370b70b6e7b2', 'mwepa', '2018-07-24 10:10:13');\nINSERT INTO `sys_captcha` VALUES ('be675f04-9038-406a-8762-e0ef0d6ac75a', 'gpgce', '2018-07-23 17:51:53');\nINSERT INTO `sys_captcha` VALUES ('c3be4ce5-fe1f-4a36-8961-afc3a6dca1b8', 'nmpw7', '2018-11-06 16:15:56');\nINSERT INTO `sys_captcha` VALUES ('c3dcad0b-f787-474f-85eb-70c93cbbef14', '33ymb', '2018-11-05 22:47:15');\nINSERT INTO `sys_captcha` VALUES ('c8ffeda1-cccd-4e2f-88eb-3026236787d8', 'fybgw', '2018-11-15 16:57:17');\nINSERT INTO `sys_captcha` VALUES ('d124d0a1-8bc5-4abb-8412-7c2b45833e7e', 'w647n', '2018-11-07 11:36:48');\nINSERT INTO `sys_captcha` VALUES ('d8da489a-4d20-43a0-8011-06c3cb03e5a7', 'bfad6', '2018-07-24 10:08:19');\nINSERT INTO `sys_captcha` VALUES ('da57ce2f-31bf-40fe-82cb-7c641db0e3b6', '4ccmn', '2018-11-05 18:58:43');\nINSERT INTO `sys_captcha` VALUES ('dabcd8a6-5396-4f47-8d93-b706680945f9', '5dxy3', '2018-07-24 10:10:14');\nINSERT INTO `sys_captcha` VALUES ('debd7673-0133-446c-89ef-1162e3ce592f', '24bpd', '2018-11-05 19:05:05');\nINSERT INTO `sys_captcha` VALUES ('e12702b7-4674-4ad6-8647-b093d1658dfa', 'nd3g6', '2018-11-05 23:16:43');\nINSERT INTO `sys_captcha` VALUES ('e4efdd94-ba8f-4913-8079-593724cb128f', '6dfgm', '2018-11-05 18:41:22');\nINSERT INTO `sys_captcha` VALUES ('e58ab63f-eba0-47d6-8a28-e18cce6a78c1', 'nynp5', '2018-07-06 22:53:23');\nINSERT INTO `sys_captcha` VALUES ('ea1bd6a6-b0fc-47db-8b65-8e53a5ce8bac', '8gnyy', '2018-11-05 19:04:59');\nINSERT INTO `sys_captcha` VALUES ('ebd9f294-da9b-45e4-840d-4c3940394e32', '7pnb8', '2018-11-07 14:48:14');\nINSERT INTO `sys_captcha` VALUES ('ec57530f-0a86-43cd-8b5e-a94d9605003c', '427c3', '2018-11-02 15:53:20');\nINSERT INTO `sys_captcha` VALUES ('ed77116b-154d-4a3a-8518-cd2a043f6a88', '6xbpe', '2018-11-05 23:34:00');\nINSERT INTO `sys_captcha` VALUES ('efd64084-7c1f-47c0-8720-070ecd300e24', 'd4nn4', '2018-07-24 10:10:24');\nINSERT INTO `sys_captcha` VALUES ('f0c02e56-a885-43f0-8685-ea2aa6d0154f', 'am8xc', '2018-11-07 14:31:52');\nINSERT INTO `sys_captcha` VALUES ('f3824bc4-bfb6-49e6-85aa-51df50f4812b', 'dd84w', '2018-07-06 22:53:24');\nINSERT INTO `sys_captcha` VALUES ('fd0504bc-148a-40a2-8217-3cef39fa5ee5', 'c2bae', '2018-11-05 18:06:23');\nINSERT INTO `sys_captcha` VALUES ('fe6f15b8-fe12-4ff5-84eb-88ece23778d3', 'xn5cw', '2018-11-05 19:01:27');\nINSERT INTO `sys_captcha` VALUES ('ffb2493a-6e33-4085-80fc-c396518594c8', '444n8', '2018-11-17 11:10:07');\nCOMMIT;\n\n-- ----------------------------\n-- Table structure for sys_config\n-- ----------------------------\nDROP TABLE IF EXISTS `sys_config`;\nCREATE TABLE `sys_config` (\n  `id` bigint(20) NOT NULL AUTO_INCREMENT,\n  `param_key` varchar(50) DEFAULT NULL COMMENT 'key',\n  `param_value` varchar(2000) DEFAULT NULL COMMENT 'value',\n  `status` tinyint(4) DEFAULT '1' COMMENT '状态   0：隐藏   1：显示',\n  `remark` varchar(500) DEFAULT NULL COMMENT '备注',\n  PRIMARY KEY (`id`),\n  UNIQUE KEY `param_key` (`param_key`)\n) ENGINE=InnoDB AUTO_INCREMENT=2 DEFAULT CHARSET=utf8 COMMENT='系统配置信息表';\n\n-- ----------------------------\n-- Records of sys_config\n-- ----------------------------\nBEGIN;\nINSERT INTO `sys_config` (`param_key`, `param_value`, `status`, `remark`) VALUES ('CLOUD_STORAGE_CONFIG_KEY', '{\\\"aliyunAccessKeyId\\\":\\\"\\\",\\\"aliyunAccessKeySecret\\\":\\\"\\\",\\\"aliyunBucketName\\\":\\\"\\\",\\\"aliyunDomain\\\":\\\"\\\",\\\"aliyunEndPoint\\\":\\\"\\\",\\\"aliyunPrefix\\\":\\\"\\\",\\\"qcloudBucketName\\\":\\\"\\\",\\\"qcloudDomain\\\":\\\"\\\",\\\"qcloudPrefix\\\":\\\"\\\",\\\"qcloudSecretId\\\":\\\"\\\",\\\"qcloudSecretKey\\\":\\\"\\\",\\\"qiniuAccessKey\\\":\\\"NrgMfABZxWLo5B-YYSjoE8-AZ1EISdi1Z3ubLOeZ\\\",\\\"qiniuBucketName\\\":\\\"ios-app\\\",\\\"qiniuDomain\\\":\\\"http://7xqbwh.dl1.z0.glb.clouddn.com\\\",\\\"qiniuPrefix\\\":\\\"upload\\\",\\\"qiniuSecretKey\\\":\\\"uIwJHevMRWU0VLxFvgy0tAcOdGqasdtVlJkdy6vV\\\",\\\"type\\\":1}', '0', '云存储配置信息');\nCOMMIT;\n\n-- ----------------------------\n-- Table structure for sys_log\n-- ----------------------------\nDROP TABLE IF EXISTS `sys_log`;\nCREATE TABLE `sys_log` (\n  `id` bigint(20) NOT NULL AUTO_INCREMENT,\n  `username` varchar(50) DEFAULT NULL COMMENT '用户名',\n  `operation` varchar(50) DEFAULT NULL COMMENT '用户操作',\n  `method` varchar(200) DEFAULT NULL COMMENT '请求方法',\n  `params` varchar(5000) DEFAULT NULL COMMENT '请求参数',\n  `time` bigint(20) NOT NULL COMMENT '执行时长(毫秒)',\n  `ip` varchar(64) DEFAULT NULL COMMENT 'IP地址',\n  `create_date` datetime DEFAULT NULL COMMENT '创建时间',\n  PRIMARY KEY (`id`)\n) ENGINE=InnoDB AUTO_INCREMENT=30 DEFAULT CHARSET=utf8 COMMENT='系统日志';\n\n-- ----------------------------\n-- Records of sys_log\n-- ----------------------------\nBEGIN;\nINSERT INTO `sys_log` VALUES (1, 'admin', '保存菜单', 'io.sdb.modules.sys.controller.SysMenuController.save()', '{\\\"open\\\":false,\\\"attrs\\\":{\\\"parent_id\\\":31,\\\"name\\\":\\\"商品管理\\\",\\\"icon\\\":\\\"editor\\\",\\\"perms\\\":\\\"\\\",\\\"order_num\\\":0,\\\"type\\\":1,\\\"url\\\":\\\"sys/goods\\\",\\\"menu_id\\\":42},\\\"modifyFlag\\\":[]}', 11, '0:0:0:0:0:0:0:1', '2018-06-29 21:38:42');\nINSERT INTO `sys_log` VALUES (2, 'admin', '保存菜单', 'io.sdb.modules.sys.controller.SysMenuController.save()', '{\\\"open\\\":false,\\\"attrs\\\":{\\\"parent_id\\\":31,\\\"name\\\":\\\"订单管理\\\",\\\"icon\\\":\\\"log\\\",\\\"perms\\\":\\\"\\\",\\\"order_num\\\":0,\\\"type\\\":1,\\\"url\\\":\\\"sys/order\\\",\\\"menu_id\\\":43},\\\"modifyFlag\\\":[]}', 11, '0:0:0:0:0:0:0:1', '2018-07-03 18:17:24');\nINSERT INTO `sys_log` VALUES (3, 'admin', '删除菜单', 'io.sdb.modules.sys.controller.SysMenuController.delete()', '32', 6, '0:0:0:0:0:0:0:1', '2018-07-24 15:08:22');\nINSERT INTO `sys_log` VALUES (4, 'admin', '保存用户', 'io.sdb.controller.SysUserController.save()', '{\\\"roleIdList\\\":[],\\\"attrs\\\":{\\\"create_user_id\\\":1,\\\"password\\\":\\\"efb1ab90b4289b76937593c8cf42f06a76610d52abf92fb46e9dd1356fce0b99\\\",\\\"salt\\\":\\\"C9P3NwRXy89GqM5aMOsf\\\",\\\"create_time\\\":\\\"Nov 2, 2018 3:46:29 PM\\\",\\\"user_id\\\":2,\\\"mobile\\\":\\\"13112345678\\\",\\\"email\\\":\\\"123@123.com\\\",\\\"username\\\":\\\"user1\\\",\\\"status\\\":1},\\\"modifyFlag\\\":[]}', 132, '0:0:0:0:0:0:0:1', '2018-11-02 15:46:30');\nINSERT INTO `sys_log` VALUES (5, 'admin', '保存角色', 'io.sdb.controller.SysRoleController.save()', '{\\\"menuIdList\\\":[19,-666666,1,3],\\\"attrs\\\":{\\\"role_name\\\":\\\"roleTest1\\\",\\\"create_user_id\\\":1,\\\"create_time\\\":\\\"Nov 2, 2018 3:47:36 PM\\\",\\\"role_id\\\":1,\\\"remark\\\":\\\"test\\\"},\\\"modifyFlag\\\":[]}', 44, '0:0:0:0:0:0:0:1', '2018-11-02 15:47:37');\nINSERT INTO `sys_log` VALUES (6, 'admin', '修改用户', 'io.sdb.controller.SysUserController.update()', '{\\\"roleIdList\\\":[1],\\\"attrs\\\":{\\\"create_user_id\\\":1,\\\"salt\\\":\\\"C9P3NwRXy89GqM5aMOsf\\\",\\\"user_id\\\":2,\\\"mobile\\\":\\\"13112345678\\\",\\\"email\\\":\\\"123@123.com\\\",\\\"username\\\":\\\"user1\\\",\\\"status\\\":1},\\\"modifyFlag\\\":[]}', 15, '0:0:0:0:0:0:0:1', '2018-11-02 15:47:47');\nINSERT INTO `sys_log` VALUES (7, 'admin', '保存菜单', 'io.sdb.controller.SysMenuController.save()', '{\\\"open\\\":false,\\\"modifyFlag\\\":[],\\\"attrs\\\":{\\\"parent_id\\\":31,\\\"name\\\":\\\"测试\\\",\\\"icon\\\":\\\"admin\\\",\\\"perms\\\":\\\"\\\",\\\"order_num\\\":0,\\\"type\\\":1,\\\"url\\\":\\\"/sys/testTable\\\",\\\"menu_id\\\":44}}', 8, '0:0:0:0:0:0:0:1', '2018-11-05 22:34:52');\nINSERT INTO `sys_log` VALUES (8, 'admin', '修改菜单', 'io.sdb.controller.SysMenuController.update()', '{\\\"open\\\":false,\\\"modifyFlag\\\":[],\\\"attrs\\\":{\\\"parent_id\\\":31,\\\"name\\\":\\\"测试\\\",\\\"icon\\\":\\\"admin\\\",\\\"perms\\\":\\\"\\\",\\\"order_num\\\":0,\\\"type\\\":1,\\\"menu_id\\\":44,\\\"url\\\":\\\"sys/testTable\\\"}}', 7, '0:0:0:0:0:0:0:1', '2018-11-05 22:35:02');\nINSERT INTO `sys_log` VALUES (9, 'admin', '保存菜单', 'io.sdb.controller.SysMenuController.save()', '{\\\"open\\\":false,\\\"modifyFlag\\\":[],\\\"attrs\\\":{\\\"parent_id\\\":31,\\\"name\\\":\\\"商品分类\\\",\\\"icon\\\":\\\"admin\\\",\\\"perms\\\":\\\"\\\",\\\"order_num\\\":0,\\\"type\\\":1,\\\"url\\\":\\\"sys/productCategory\\\",\\\"menu_id\\\":45}}', 6, '0:0:0:0:0:0:0:1', '2018-11-06 12:55:00');\nINSERT INTO `sys_log` VALUES (10, 'admin', '保存菜单', 'io.sdb.controller.SysMenuController.save()', '{\\\"open\\\":false,\\\"modifyFlag\\\":[],\\\"attrs\\\":{\\\"parent_id\\\":31,\\\"name\\\":\\\"规格管理\\\",\\\"icon\\\":\\\"admin\\\",\\\"perms\\\":\\\"\\\",\\\"order_num\\\":0,\\\"type\\\":1,\\\"url\\\":\\\"sys/specification\\\",\\\"menu_id\\\":46}}', 3, '0:0:0:0:0:0:0:1', '2018-11-06 12:55:36');\nINSERT INTO `sys_log` VALUES (11, 'admin', '删除菜单', 'io.sdb.controller.SysMenuController.delete()', '44', 27, '0:0:0:0:0:0:0:1', '2018-11-06 15:07:05');\nINSERT INTO `sys_log` VALUES (12, 'admin', '修改菜单', 'io.sdb.controller.SysMenuController.update()', '{\\\"open\\\":false,\\\"modifyFlag\\\":[],\\\"attrs\\\":{\\\"parent_id\\\":31,\\\"name\\\":\\\"商品分类\\\",\\\"icon\\\":\\\"log\\\",\\\"perms\\\":\\\"\\\",\\\"order_num\\\":0,\\\"type\\\":1,\\\"menu_id\\\":45,\\\"url\\\":\\\"sys/productCategory\\\"}}', 13, '0:0:0:0:0:0:0:1', '2018-11-06 15:07:26');\nINSERT INTO `sys_log` VALUES (13, 'admin', '修改菜单', 'io.sdb.controller.SysMenuController.update()', '{\\\"open\\\":false,\\\"modifyFlag\\\":[],\\\"attrs\\\":{\\\"parent_id\\\":31,\\\"name\\\":\\\"订单管理\\\",\\\"icon\\\":\\\"bianji\\\",\\\"perms\\\":\\\"\\\",\\\"order_num\\\":0,\\\"type\\\":1,\\\"menu_id\\\":43,\\\"url\\\":\\\"sys/order\\\"}}', 4, '0:0:0:0:0:0:0:1', '2018-11-06 15:07:51');\nINSERT INTO `sys_log` VALUES (14, 'admin', '修改菜单', 'io.sdb.controller.SysMenuController.update()', '{\\\"open\\\":false,\\\"modifyFlag\\\":[],\\\"attrs\\\":{\\\"parent_id\\\":31,\\\"name\\\":\\\"规格管理\\\",\\\"icon\\\":\\\"menu\\\",\\\"perms\\\":\\\"\\\",\\\"order_num\\\":0,\\\"type\\\":1,\\\"menu_id\\\":46,\\\"url\\\":\\\"sys/specification\\\"}}', 6, '0:0:0:0:0:0:0:1', '2018-11-06 15:08:02');\nINSERT INTO `sys_log` VALUES (15, 'admin', '立即执行任务', 'io.sdb.controller.ScheduleJobController.run()', '[1]', 174, '0:0:0:0:0:0:0:1', '2018-11-06 15:11:02');\nINSERT INTO `sys_log` VALUES (16, 'admin', '修改定时任务', 'io.sdb.controller.ScheduleJobController.update()', '{\\\"modifyFlag\\\":[],\\\"attrs\\\":{\\\"bean_name\\\":\\\"testTask\\\",\\\"method_name\\\":\\\"test\\\",\\\"cron_expression\\\":\\\"0 0/30 * * * ?\\\",\\\"job_id\\\":1,\\\"remark\\\":\\\"有参数测试\\\",\\\"params\\\":\\\"sdb\\\",\\\"status\\\":0}}', 343, '0:0:0:0:0:0:0:1', '2018-11-06 15:11:14');\nINSERT INTO `sys_log` VALUES (17, 'admin', '删除角色', 'io.sdb.controller.SysRoleController.delete()', '[1]', 68, '0:0:0:0:0:0:0:1', '2018-11-06 16:49:06');\nINSERT INTO `sys_log` VALUES (18, 'admin', '删除用户', 'io.sdb.controller.SysUserController.delete()', '[2]', 11, '0:0:0:0:0:0:0:1', '2018-11-06 16:49:14');\nINSERT INTO `sys_log` VALUES (19, 'admin', '修改用户', 'io.sdb.controller.SysUserController.update()', '{\\\"roleIdList\\\":[],\\\"modifyFlag\\\":[],\\\"attrs\\\":{\\\"create_user_id\\\":1,\\\"salt\\\":\\\"YzcmCZNvbXocrsz9dm8e\\\",\\\"user_id\\\":1,\\\"mobile\\\":\\\"13612345678\\\",\\\"email\\\":\\\"root@sdb.io\\\",\\\"username\\\":\\\"admin\\\",\\\"status\\\":1}}', 182, '0:0:0:0:0:0:0:1', '2018-11-06 16:49:22');\nINSERT INTO `sys_log` VALUES (20, 'admin', '保存菜单', 'io.sdb.controller.SysMenuController.save()', '{\\\"open\\\":false,\\\"modifyFlag\\\":[],\\\"attrs\\\":{\\\"parent_id\\\":31,\\\"name\\\":\\\"测试模块\\\",\\\"icon\\\":\\\"admin\\\",\\\"perms\\\":\\\"\\\",\\\"order_num\\\":0,\\\"type\\\":1,\\\"url\\\":\\\"sys/testTable\\\",\\\"menu_id\\\":47}}', 21, '0:0:0:0:0:0:0:1', '2018-11-07 00:15:43');\nINSERT INTO `sys_log` VALUES (21, 'admin', '保存规格', 'io.sdb.controller.SysSpecificationController.save()', '{\\\"open\\\":false,\\\"modifyFlag\\\":[],\\\"attrs\\\":{\\\"name\\\":\\\"test\\\",\\\"id\\\":7000,\\\"type\\\":1,\\\"order\\\":0}}', 9, '0:0:0:0:0:0:0:1', '2018-11-14 23:28:55');\nINSERT INTO `sys_log` VALUES (22, 'admin', '保存商品类目', 'io.sdb.controller.SysProductCategoryController.save()', '{\\\"open\\\":false,\\\"modifyFlag\\\":[],\\\"attrs\\\":{\\\"tree_path\\\":\\\",40000,\\\",\\\"name\\\":\\\"test\\\",\\\"id\\\":40000,\\\"order\\\":0}}', 7, '0:0:0:0:0:0:0:1', '2018-11-14 23:29:34');\nINSERT INTO `sys_log` VALUES (23, 'admin', '保存商品类目', 'io.sdb.controller.SysProductCategoryController.save()', '{\\\"open\\\":false,\\\"modifyFlag\\\":[],\\\"attrs\\\":{\\\"tree_path\\\":\\\",40000,40001,\\\",\\\"parent_id\\\":40000,\\\"name\\\":\\\"twst1\\\",\\\"id\\\":40001,\\\"order\\\":0}}', 2952, '0:0:0:0:0:0:0:1', '2018-11-14 23:32:23');\nINSERT INTO `sys_log` VALUES (24, 'admin', '保存商品类目', 'io.sdb.controller.SysProductCategoryController.save()', '{\\\"open\\\":false,\\\"modifyFlag\\\":[],\\\"attrs\\\":{\\\"tree_path\\\":\\\",40000,40001,400001,\\\",\\\"parent_id\\\":40001,\\\"name\\\":\\\"testest\\\",\\\"id\\\":400001,\\\"order\\\":0}}', 9, '0:0:0:0:0:0:0:1', '2018-11-14 23:33:13');\nINSERT INTO `sys_log` VALUES (25, 'admin', '保存规格', 'io.sdb.controller.SysSpecificationController.save()', '{\\\"open\\\":false,\\\"modifyFlag\\\":[],\\\"attrs\\\":{\\\"name\\\":\\\"test\\\",\\\"id\\\":90000,\\\"type\\\":1,\\\"order\\\":0}}', 5, '0:0:0:0:0:0:0:1', '2018-11-16 11:20:23');\nINSERT INTO `sys_log` VALUES (26, 'admin', '删除规格', 'io.sdb.controller.SysSpecificationController.delete()', '90000', 27, '0:0:0:0:0:0:0:1', '2018-11-16 11:20:29');\nINSERT INTO `sys_log` VALUES (27, 'admin', '删除规格', 'io.sdb.controller.SysSpecificationController.delete()', '7000', 7, '0:0:0:0:0:0:0:1', '2018-11-16 11:25:16');\nINSERT INTO `sys_log` VALUES (28, 'admin', '删除规格', 'io.sdb.controller.SysSpecificationController.delete()', '6001', 27, '0:0:0:0:0:0:0:1', '2018-11-16 11:50:45');\nINSERT INTO `sys_log` VALUES (29, 'admin', '保存规格', 'io.sdb.controller.SysSpecificationController.save()', '{\\\"open\\\":false,\\\"modifyFlag\\\":[],\\\"attrs\\\":{\\\"parent_id\\\":6000,\\\"name\\\":\\\"L\\\",\\\"id\\\":60001,\\\"type\\\":1,\\\"order\\\":0}}', 5, '0:0:0:0:0:0:0:1', '2018-11-16 11:50:54');\nCOMMIT;\n\n-- ----------------------------\n-- Table structure for sys_menu\n-- ----------------------------\nDROP TABLE IF EXISTS `sys_menu`;\nCREATE TABLE `sys_menu` (\n  `menu_id` bigint(20) NOT NULL AUTO_INCREMENT,\n  `parent_id` bigint(20) DEFAULT NULL COMMENT '父菜单ID，一级菜单为0',\n  `name` varchar(50) DEFAULT NULL COMMENT '菜单名称',\n  `url` varchar(200) DEFAULT NULL COMMENT '菜单URL',\n  `perms` varchar(500) DEFAULT NULL COMMENT '授权(多个用逗号分隔，如：user:list,user:create)',\n  `type` int(11) DEFAULT NULL COMMENT '类型   0：目录   1：菜单   2：按钮',\n  `icon` varchar(50) DEFAULT NULL COMMENT '菜单图标',\n  `order_num` int(11) DEFAULT NULL COMMENT '排序',\n  PRIMARY KEY (`menu_id`)\n) ENGINE=InnoDB AUTO_INCREMENT=47 DEFAULT CHARSET=utf8 COMMENT='菜单管理';\n\n-- ----------------------------\n-- Records of sys_menu\n-- ----------------------------\nBEGIN;\nINSERT INTO `sys_menu` VALUES (1, 0, '系统管理', NULL, NULL, 0, 'system', 0);\nINSERT INTO `sys_menu` VALUES (2, 1, '管理员列表', 'sys/user', NULL, 1, 'admin', 1);\nINSERT INTO `sys_menu` VALUES (3, 1, '角色管理', 'sys/role', NULL, 1, 'role', 2);\nINSERT INTO `sys_menu` VALUES (4, 1, '菜单管理', 'sys/menu', NULL, 1, 'menu', 3);\nINSERT INTO `sys_menu` VALUES (5, 1, 'SQL监控', 'http://localhost:8080/sdb/druid/sql.html', NULL, 1, 'sql', 4);\nINSERT INTO `sys_menu` VALUES (6, 1, '定时任务', 'job/schedule', NULL, 1, 'job', 5);\nINSERT INTO `sys_menu` VALUES (7, 6, '查看', NULL, 'sys:schedule:list,sys:schedule:info', 2, NULL, 0);\nINSERT INTO `sys_menu` VALUES (8, 6, '新增', NULL, 'sys:schedule:save', 2, NULL, 0);\nINSERT INTO `sys_menu` VALUES (9, 6, '修改', NULL, 'sys:schedule:update', 2, NULL, 0);\nINSERT INTO `sys_menu` VALUES (10, 6, '删除', NULL, 'sys:schedule:delete', 2, NULL, 0);\nINSERT INTO `sys_menu` VALUES (11, 6, '暂停', NULL, 'sys:schedule:pause', 2, NULL, 0);\nINSERT INTO `sys_menu` VALUES (12, 6, '恢复', NULL, 'sys:schedule:resume', 2, NULL, 0);\nINSERT INTO `sys_menu` VALUES (13, 6, '立即执行', NULL, 'sys:schedule:run', 2, NULL, 0);\nINSERT INTO `sys_menu` VALUES (14, 6, '日志列表', NULL, 'sys:schedule:log', 2, NULL, 0);\nINSERT INTO `sys_menu` VALUES (15, 2, '查看', NULL, 'sys:user:list,sys:user:info', 2, NULL, 0);\nINSERT INTO `sys_menu` VALUES (16, 2, '新增', NULL, 'sys:user:save,sys:role:select', 2, NULL, 0);\nINSERT INTO `sys_menu` VALUES (17, 2, '修改', NULL, 'sys:user:update,sys:role:select', 2, NULL, 0);\nINSERT INTO `sys_menu` VALUES (18, 2, '删除', NULL, 'sys:user:delete', 2, NULL, 0);\nINSERT INTO `sys_menu` VALUES (19, 3, '查看', NULL, 'sys:role:list,sys:role:info', 2, NULL, 0);\nINSERT INTO `sys_menu` VALUES (20, 3, '新增', NULL, 'sys:role:save,sys:menu:list', 2, NULL, 0);\nINSERT INTO `sys_menu` VALUES (21, 3, '修改', NULL, 'sys:role:update,sys:menu:list', 2, NULL, 0);\nINSERT INTO `sys_menu` VALUES (22, 3, '删除', NULL, 'sys:role:delete', 2, NULL, 0);\nINSERT INTO `sys_menu` VALUES (23, 4, '查看', NULL, 'sys:menu:list,sys:menu:info', 2, NULL, 0);\nINSERT INTO `sys_menu` VALUES (24, 4, '新增', NULL, 'sys:menu:save,sys:menu:select', 2, NULL, 0);\nINSERT INTO `sys_menu` VALUES (25, 4, '修改', NULL, 'sys:menu:update,sys:menu:select', 2, NULL, 0);\nINSERT INTO `sys_menu` VALUES (26, 4, '删除', NULL, 'sys:menu:delete', 2, NULL, 0);\nINSERT INTO `sys_menu` VALUES (27, 1, '参数管理', 'sys/config', 'sys:config:list,sys:config:info,sys:config:save,sys:config:update,sys:config:delete', 1, 'config', 6);\nINSERT INTO `sys_menu` VALUES (29, 1, '系统日志', 'sys/log', 'sys:log:list', 1, 'log', 7);\nINSERT INTO `sys_menu` VALUES (30, 1, '文件上传', 'oss/oss', 'sys:oss:all', 1, 'oss', 6);\nINSERT INTO `sys_menu` VALUES (31, 0, '业务管理', '', '', 0, 'config', 0);\nINSERT INTO `sys_menu` VALUES (42, 31, '商品管理', 'sys/goods', '', 1, 'editor', 0);\nINSERT INTO `sys_menu` VALUES (43, 31, '订单管理', 'sys/order', '', 1, 'bianji', 0);\nINSERT INTO `sys_menu` VALUES (45, 31, '商品分类', 'sys/productCategory', '', 1, 'log', 0);\nINSERT INTO `sys_menu` VALUES (46, 31, '规格管理', 'sys/specification', '', 1, 'menu', 0);\nCOMMIT;\n\n-- ----------------------------\n-- Table structure for sys_oss\n-- ----------------------------\nDROP TABLE IF EXISTS `sys_oss`;\nCREATE TABLE `sys_oss` (\n  `id` bigint(20) NOT NULL AUTO_INCREMENT,\n  `url` varchar(200) DEFAULT NULL COMMENT 'URL地址',\n  `create_date` datetime DEFAULT NULL COMMENT '创建时间',\n  PRIMARY KEY (`id`)\n) ENGINE=InnoDB AUTO_INCREMENT=63 DEFAULT CHARSET=utf8 COMMENT='文件上传';\n\n-- ----------------------------\n-- Records of sys_oss\n-- ----------------------------\nBEGIN;\nINSERT INTO `sys_oss` VALUES (1, 'http://yjjtest.oss-cn-shanghai.aliyuncs.com/volunteer/20180629/3c2f7aab969a4135959cc0b677d54261.png', '2018-06-29 19:42:22');\nINSERT INTO `sys_oss` VALUES (2, 'http://yjjtest.oss-cn-shanghai.aliyuncs.com/volunteer/20180629/38f5410762dd4a5da920719aa615833a.png', '2018-06-29 19:58:07');\nINSERT INTO `sys_oss` VALUES (3, 'http://yjjtest.oss-cn-shanghai.aliyuncs.com/volunteer/20180629/87e37afded2c46c09903e6e58b668966.png', '2018-06-29 19:58:16');\nINSERT INTO `sys_oss` VALUES (4, 'http://yjjtest.oss-cn-shanghai.aliyuncs.com/volunteer/20180629/012c4416268f42978ec19bd3e3f1c43c.html', '2018-06-29 19:58:20');\nINSERT INTO `sys_oss` VALUES (5, 'http://yjjtest.oss-cn-shanghai.aliyuncs.com/volunteer/20180629/83851558fc864691bfd7326fc03f3052.png', '2018-06-29 19:58:26');\nINSERT INTO `sys_oss` VALUES (6, 'http://yjjtest.oss-cn-shanghai.aliyuncs.com/volunteer/20180629/9a9ffdbbed3d42de9a9ab4a34c391ad7.png', '2018-06-29 20:05:14');\nINSERT INTO `sys_oss` VALUES (7, 'http://yjjtest.oss-cn-shanghai.aliyuncs.com/volunteer/20180629/b3e2e9af44b148b2bf3fbaa9455c6205.png', '2018-06-29 20:05:17');\nINSERT INTO `sys_oss` VALUES (8, 'http://yjjtest.oss-cn-shanghai.aliyuncs.com/volunteer/20180630/49ba93bfaedb4dfd832376d51525bb7b.png', '2018-06-30 23:26:05');\nINSERT INTO `sys_oss` VALUES (9, 'http://yjjtest.oss-cn-shanghai.aliyuncs.com/volunteer/20180630/82336d624e114c4c9a3fdff24022f840.png', '2018-06-30 23:26:07');\nINSERT INTO `sys_oss` VALUES (10, 'http://yjjtest.oss-cn-shanghai.aliyuncs.com/volunteer/20180630/906f19033e42485690928c34115a3975.png', '2018-06-30 23:26:11');\nINSERT INTO `sys_oss` VALUES (11, 'http://yjjtest.oss-cn-shanghai.aliyuncs.com/volunteer/20180630/7c6985859c8a456b8d261908a3c4165c.png', '2018-06-30 23:28:19');\nINSERT INTO `sys_oss` VALUES (12, 'http://yjjtest.oss-cn-shanghai.aliyuncs.com/volunteer/20180630/f03418037b9b4cdf811b9e1577a9dfdf.png', '2018-06-30 23:28:21');\nINSERT INTO `sys_oss` VALUES (13, 'http://yjjtest.oss-cn-shanghai.aliyuncs.com/volunteer/20180630/48963192c57c476c8a3fbdea0bfdb2c7.png', '2018-06-30 23:28:24');\nINSERT INTO `sys_oss` VALUES (14, 'http://yjjtest.oss-cn-shanghai.aliyuncs.com/volunteer/20180630/dc024ffbc33c481eb1d0dabcdf48d744.png', '2018-06-30 23:55:46');\nINSERT INTO `sys_oss` VALUES (15, 'http://yjjtest.oss-cn-shanghai.aliyuncs.com/volunteer/20180630/d9edde508a614fbfb6f90bc312fed5bf.png', '2018-06-30 23:55:48');\nINSERT INTO `sys_oss` VALUES (16, 'http://yjjtest.oss-cn-shanghai.aliyuncs.com/volunteer/20180630/023a4b18af054a689ec3009c0fd0115a.png', '2018-06-30 23:55:50');\nINSERT INTO `sys_oss` VALUES (17, 'http://yjjtest.oss-cn-shanghai.aliyuncs.com/volunteer/20180701/f9f1aed895f04194b4608aa4a95a4a71.png', '2018-07-01 14:31:54');\nINSERT INTO `sys_oss` VALUES (18, 'http://yjjtest.oss-cn-shanghai.aliyuncs.com/volunteer/20180701/81e53bbce48c4474ae2fdfc0634617de.png', '2018-07-01 14:31:55');\nINSERT INTO `sys_oss` VALUES (19, 'http://yjjtest.oss-cn-shanghai.aliyuncs.com/volunteer/20180701/517d4f86a3094b5599bf7c7f0642eef9.png', '2018-07-01 14:31:58');\nINSERT INTO `sys_oss` VALUES (20, 'http://yjjtest.oss-cn-shanghai.aliyuncs.com/volunteer/20180701/67bd032afec44abbb618ccad836b0d18.png', '2018-07-01 14:33:14');\nINSERT INTO `sys_oss` VALUES (21, 'http://yjjtest.oss-cn-shanghai.aliyuncs.com/volunteer/20180701/ac0ee9b363074010a7c87266783325fd.png', '2018-07-01 14:33:17');\nINSERT INTO `sys_oss` VALUES (22, 'http://yjjtest.oss-cn-shanghai.aliyuncs.com/volunteer/20180701/ba75d9e09e654adebaed7a30e5a5427b.png', '2018-07-01 14:33:58');\nINSERT INTO `sys_oss` VALUES (23, 'http://yjjtest.oss-cn-shanghai.aliyuncs.com/volunteer/20180701/45acdff15d4240e290f37ddb4f2fc6cb.png', '2018-07-01 14:34:01');\nINSERT INTO `sys_oss` VALUES (24, 'http://yjjtest.oss-cn-shanghai.aliyuncs.com/volunteer/20180701/016a92bb143f43a19d530015e0a79787.png', '2018-07-01 14:34:05');\nINSERT INTO `sys_oss` VALUES (25, 'http://yjjtest.oss-cn-shanghai.aliyuncs.com/volunteer/20180701/f8444e8ebf7948f399849995604d83cf.png', '2018-07-01 14:57:10');\nINSERT INTO `sys_oss` VALUES (26, 'http://yjjtest.oss-cn-shanghai.aliyuncs.com/volunteer/20180701/fe804e3ab06045cab0fd30985aeb2c95.png', '2018-07-01 14:57:12');\nINSERT INTO `sys_oss` VALUES (27, 'http://yjjtest.oss-cn-shanghai.aliyuncs.com/volunteer/20180701/a763d391e1f5454693948da332fa5085.png', '2018-07-01 14:57:15');\nINSERT INTO `sys_oss` VALUES (28, 'http://yjjtest.oss-cn-shanghai.aliyuncs.com/volunteer/20180701/24c1712687654c8ebcd7b3d04d5dd871.png', '2018-07-01 15:16:28');\nINSERT INTO `sys_oss` VALUES (29, 'http://yjjtest.oss-cn-shanghai.aliyuncs.com/volunteer/20180701/1a26dcc306a749678d09208c3d561073.png', '2018-07-01 15:16:31');\nINSERT INTO `sys_oss` VALUES (30, 'http://yjjtest.oss-cn-shanghai.aliyuncs.com/volunteer/20180701/6e967cef777b44dba4262fdb344ee73c.png', '2018-07-01 19:27:25');\nINSERT INTO `sys_oss` VALUES (31, 'http://yjjtest.oss-cn-shanghai.aliyuncs.com/volunteer/20180701/92dd35cb621341b99fc47c7206dcddc3.png', '2018-07-01 19:27:27');\nINSERT INTO `sys_oss` VALUES (32, 'http://yjjtest.oss-cn-shanghai.aliyuncs.com/volunteer/20180701/a5889d9116574ca09696c9a3bbb1b59a.png', '2018-07-01 21:23:52');\nINSERT INTO `sys_oss` VALUES (33, 'http://yjjtest.oss-cn-shanghai.aliyuncs.com/volunteer/20180701/f72226f394a34403b1bd1d0ffdb8d608.png', '2018-07-01 21:23:55');\nINSERT INTO `sys_oss` VALUES (34, 'http://yjjtest.oss-cn-shanghai.aliyuncs.com/volunteer/20180702/1c441a7a78f74dc8b29d0aa448f94f5c.png', '2018-07-02 11:10:24');\nINSERT INTO `sys_oss` VALUES (35, 'http://yjjtest.oss-cn-shanghai.aliyuncs.com/volunteer/20180702/1a61bf8a8fac4f479b1ece806c957a0a.png', '2018-07-02 11:10:24');\nINSERT INTO `sys_oss` VALUES (36, 'http://yjjtest.oss-cn-shanghai.aliyuncs.com/volunteer/20180702/20c9cfd5f6184a9cb6d4f35e793a83bf.png', '2018-07-02 12:10:57');\nINSERT INTO `sys_oss` VALUES (37, 'http://yjjtest.oss-cn-shanghai.aliyuncs.com/volunteer/20180702/d7bf4c7dfe124bd78049d35346f0f4da.png', '2018-07-02 12:11:01');\nINSERT INTO `sys_oss` VALUES (38, 'http://yjjtest.oss-cn-shanghai.aliyuncs.com/volunteer/20180702/333fdf232c084feca7c6ba2e3bea3ff2.png', '2018-07-02 13:01:20');\nINSERT INTO `sys_oss` VALUES (39, 'http://yjjtest.oss-cn-shanghai.aliyuncs.com/volunteer/20180702/1da89288b5bb4d6f84f8715b51f8d8f3.png', '2018-07-02 13:01:22');\nINSERT INTO `sys_oss` VALUES (40, 'http://yjjtest.oss-cn-shanghai.aliyuncs.com/volunteer/20180715/bed5372b8c8b4ae2be33bc8f44119be8.png', '2018-07-15 13:30:32');\nINSERT INTO `sys_oss` VALUES (41, 'http://yjjtest.oss-cn-shanghai.aliyuncs.com/volunteer/20180715/6c15e0540a9f44c886ba1d84f72e5518.png', '2018-07-15 13:30:35');\nINSERT INTO `sys_oss` VALUES (42, 'http://yjjtest.oss-cn-shanghai.aliyuncs.com/volunteer/20180722/e6d031c8512444b7a1dd34109fadf2db.png', '2018-07-22 22:48:15');\nINSERT INTO `sys_oss` VALUES (43, 'http://yjjtest.oss-cn-shanghai.aliyuncs.com/volunteer/20180722/fe90c1ad741e4a279d5af0b7cb827718.png', '2018-07-22 22:48:18');\nINSERT INTO `sys_oss` VALUES (44, 'http://yjjtest.oss-cn-shanghai.aliyuncs.com/volunteer/20180723/a7df4e9e907844e3bfa3acced140beef.png', '2018-07-23 17:26:48');\nINSERT INTO `sys_oss` VALUES (45, 'http://yjjtest.oss-cn-shanghai.aliyuncs.com/volunteer/20180723/eecdfc1408884b94b52d724367b8be85.png', '2018-07-23 17:27:12');\nINSERT INTO `sys_oss` VALUES (46, 'http://yjjtest.oss-cn-shanghai.aliyuncs.com/volunteer/20180723/28415cbb9402424b9434fd1dd11110d1.png', '2018-07-23 17:27:31');\nINSERT INTO `sys_oss` VALUES (47, 'http://yjjtest.oss-cn-shanghai.aliyuncs.com/volunteer/20180723/84f2c3f4b1f64596a6d9dfd36e491453.png', '2018-07-23 19:55:52');\nINSERT INTO `sys_oss` VALUES (48, 'http://yjjtest.oss-cn-shanghai.aliyuncs.com/volunteer/20180723/14805ee1c1654e9ca036d2dedf0508f4.png', '2018-07-23 19:55:52');\nINSERT INTO `sys_oss` VALUES (49, 'http://yjjtest.oss-cn-shanghai.aliyuncs.com/volunteer/20180723/26e3e08da3c846fd8bd94304e1ff7ce3.png', '2018-07-23 21:01:40');\nINSERT INTO `sys_oss` VALUES (50, 'http://yjjtest.oss-cn-shanghai.aliyuncs.com/volunteer/20180723/455846e60ba647679b1c828294ac3a64.png', '2018-07-23 21:01:40');\nINSERT INTO `sys_oss` VALUES (51, 'http://yjjtest.oss-cn-shanghai.aliyuncs.com/volunteer/20181106/938d5ecaddb64f3d9814dc12661944de.jpg', '2018-11-06 11:56:18');\nINSERT INTO `sys_oss` VALUES (52, 'http://yjjtest.oss-cn-shanghai.aliyuncs.com/volunteer/20181106/ff3519dbee58439b990191232ddad9b3.jpg', '2018-11-06 11:56:18');\nINSERT INTO `sys_oss` VALUES (53, 'http://yjjtest.oss-cn-shanghai.aliyuncs.com/volunteer/20181106/30b78a66048f4d3d9424fe93c314d17c.jpg', '2018-11-06 23:47:37');\nINSERT INTO `sys_oss` VALUES (54, 'http://yjjtest.oss-cn-shanghai.aliyuncs.com/volunteer/20181106/86c441b3c0b14d92b6c70e5667709e6f.jpg', '2018-11-06 23:47:37');\nINSERT INTO `sys_oss` VALUES (55, 'http://yjjtest.oss-cn-shanghai.aliyuncs.com/volunteer/20181110/1b33ee88ab1e4ca2b03b3d13bc8e18d2.jpg', '2018-11-10 17:45:29');\nINSERT INTO `sys_oss` VALUES (56, 'http://yjjtest.oss-cn-shanghai.aliyuncs.com/volunteer/20181110/6e6d0b3e3b1a49599dfdcf77db948ce5.jpg', '2018-11-10 17:45:31');\nINSERT INTO `sys_oss` VALUES (57, 'http://yjjtest.oss-cn-shanghai.aliyuncs.com/volunteer/20181110/d4d7635cefae4837904a23a4ccbc3cf6.jpg', '2018-11-10 22:03:36');\nINSERT INTO `sys_oss` VALUES (58, 'http://yjjtest.oss-cn-shanghai.aliyuncs.com/volunteer/20181110/4721027eea524385ae6c5905d616e740.jpg', '2018-11-10 22:03:38');\nINSERT INTO `sys_oss` VALUES (59, 'http://yjjtest.oss-cn-shanghai.aliyuncs.com/volunteer/20181116/f59644753ad549bfaf1a07339d17156b.jpg', '2018-11-16 11:24:41');\nINSERT INTO `sys_oss` VALUES (60, 'http://yjjtest.oss-cn-shanghai.aliyuncs.com/volunteer/20181116/bfa71726e2274fa4b1713eff65da8aa3.jpg', '2018-11-16 11:24:43');\nINSERT INTO `sys_oss` VALUES (61, 'http://yjjtest.oss-cn-shanghai.aliyuncs.com/volunteer/20181117/d95067c299aa4dd6b984f28bc440719e.jpg', '2018-11-17 11:28:09');\nINSERT INTO `sys_oss` VALUES (62, 'http://yjjtest.oss-cn-shanghai.aliyuncs.com/volunteer/20181117/d3e7037d76024e6e93dec1e8610a902f.jpg', '2018-11-17 11:28:11');\nCOMMIT;\n\n-- ----------------------------\n-- Table structure for sys_role\n-- ----------------------------\nDROP TABLE IF EXISTS `sys_role`;\nCREATE TABLE `sys_role` (\n  `role_id` bigint(20) NOT NULL AUTO_INCREMENT,\n  `role_name` varchar(100) DEFAULT NULL COMMENT '角色名称',\n  `remark` varchar(100) DEFAULT NULL COMMENT '备注',\n  `create_user_id` bigint(20) DEFAULT NULL COMMENT '创建者ID',\n  `create_time` datetime DEFAULT NULL COMMENT '创建时间',\n  PRIMARY KEY (`role_id`)\n) ENGINE=InnoDB DEFAULT CHARSET=utf8 COMMENT='角色';\n\n-- ----------------------------\n-- Table structure for sys_role_menu\n-- ----------------------------\nDROP TABLE IF EXISTS `sys_role_menu`;\nCREATE TABLE `sys_role_menu` (\n  `id` bigint(20) NOT NULL AUTO_INCREMENT,\n  `role_id` bigint(20) DEFAULT NULL COMMENT '角色ID',\n  `menu_id` bigint(20) DEFAULT NULL COMMENT '菜单ID',\n  PRIMARY KEY (`id`)\n) ENGINE=InnoDB DEFAULT CHARSET=utf8 COMMENT='角色与菜单对应关系';\n\n-- ----------------------------\n-- Table structure for sys_user\n-- ----------------------------\nDROP TABLE IF EXISTS `sys_user`;\nCREATE TABLE `sys_user` (\n  `user_id` bigint(20) NOT NULL AUTO_INCREMENT,\n  `username` varchar(50) NOT NULL COMMENT '用户名',\n  `password` varchar(100) DEFAULT NULL COMMENT '密码',\n  `salt` varchar(20) DEFAULT NULL COMMENT '盐',\n  `email` varchar(100) DEFAULT NULL COMMENT '邮箱',\n  `mobile` varchar(100) DEFAULT NULL COMMENT '手机号',\n  `status` tinyint(4) DEFAULT NULL COMMENT '状态  0：禁用   1：正常',\n  `create_user_id` bigint(20) DEFAULT NULL COMMENT '创建者ID',\n  `create_time` datetime DEFAULT NULL COMMENT '创建时间',\n  PRIMARY KEY (`user_id`),\n  UNIQUE KEY `username` (`username`)\n) ENGINE=InnoDB AUTO_INCREMENT=2 DEFAULT CHARSET=utf8 COMMENT='系统用户';\n\n-- ----------------------------\n-- Records of sys_user\n-- ----------------------------\nBEGIN;\nINSERT INTO `sys_user` VALUES (1, 'admin', '9ec9750e709431dad22365cabc5c625482e574c74adaebba7dd02f1129e4ce1d', 'YzcmCZNvbXocrsz9dm8e', 'root@sdb.io', '13612345678', 1, 1, '2016-11-11 11:11:11');\nCOMMIT;\n\n-- ----------------------------\n-- Table structure for sys_user_role\n-- ----------------------------\nDROP TABLE IF EXISTS `sys_user_role`;\nCREATE TABLE `sys_user_role` (\n  `id` bigint(20) NOT NULL AUTO_INCREMENT,\n  `user_id` bigint(20) DEFAULT NULL COMMENT '用户ID',\n  `role_id` bigint(20) DEFAULT NULL COMMENT '角色ID',\n  PRIMARY KEY (`id`)\n) ENGINE=InnoDB DEFAULT CHARSET=utf8 COMMENT='用户与角色对应关系';\n\n-- ----------------------------\n-- Table structure for sys_user_token\n-- ----------------------------\nDROP TABLE IF EXISTS `sys_user_token`;\nCREATE TABLE `sys_user_token` (\n  `user_id` bigint(20) NOT NULL,\n  `token` varchar(100) NOT NULL COMMENT 'token',\n  `expire_time` datetime DEFAULT NULL COMMENT '过期时间',\n  `update_time` datetime DEFAULT NULL COMMENT '更新时间',\n  PRIMARY KEY (`user_id`),\n  UNIQUE KEY `token` (`token`)\n) ENGINE=InnoDB DEFAULT CHARSET=utf8 COMMENT='系统用户Token';\n\n-- ----------------------------\n-- Records of sys_user_token\n-- ----------------------------\nBEGIN;\nINSERT INTO `sys_user_token` VALUES (1, '4705d04808b088f13a3a4d0256783323', '2018-11-18 23:23:17', '2018-11-18 11:23:17');\nCOMMIT;\n\n-- ----------------------------\n-- Table structure for user\n-- ----------------------------\nDROP TABLE IF EXISTS `user`;\nCREATE TABLE `user` (\n  `user_id` varchar(50) NOT NULL COMMENT 'ID',\n  `username` varchar(50) DEFAULT NULL COMMENT '用户名',\n  `ma_open_id` varchar(100) DEFAULT NULL COMMENT '小程序openid',\n  `union_id` varchar(100) DEFAULT NULL COMMENT '开放平台id',\n  `nickname` varchar(50) DEFAULT NULL COMMENT '昵称',\n  `name` varchar(50) DEFAULT NULL COMMENT '真实姓名',\n  `email` varchar(50) DEFAULT NULL COMMENT '邮箱',\n  `gender` smallint(1) DEFAULT NULL COMMENT '性别 1-男 2-女',\n  `area_id` smallint(10) DEFAULT NULL COMMENT '地区id',\n  `language` smallint(1) DEFAULT NULL COMMENT '语言 1-中文 2-英文',\n  `volunteer` smallint(4) DEFAULT NULL COMMENT '是否志愿者',\n  `avatar` varchar(255) DEFAULT NULL COMMENT '头像',\n  `mobile` varchar(20) DEFAULT NULL COMMENT '手机号',\n  `password` varchar(64) DEFAULT NULL COMMENT '密码',\n  `update_date` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '更新时间',\n  `create_date` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间',\n  PRIMARY KEY (`user_id`),\n  UNIQUE KEY `idx_username` (`username`) USING BTREE,\n  KEY `idx_maopenid` (`ma_open_id`),\n  KEY `idx_unionid` (`union_id`),\n  KEY `idx_createdate` (`create_date`),\n  KEY `idx_nickname` (`nickname`),\n  KEY `idx_name` (`name`),\n  KEY `idex_mobile` (`mobile`)\n) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COMMENT='用户';\n\n-- ----------------------------\n-- Records of user\n-- ----------------------------\nBEGIN;\nINSERT INTO `user` VALUES ('20181106510403', NULL, 'oYfrD5NY6rOQ0oF9O6vCWVgWGSsE', NULL, 'dick😊', NULL, NULL, 1, NULL, 1, NULL, 'https://wx.qlogo.cn/mmopen/vi_32/DYAIOgq83epC7EgVMXrNCJ8S4dribQ8qsEuN96Vwkj8CwoLjXKGJwNfa75BxwkzhotBicHORLo1ORbojArcUFUUg/132', NULL, NULL, '2018-11-06 10:33:57', '2018-11-06 10:33:57');\nINSERT INTO `user` VALUES ('20181114510504', NULL, 'oYfrD5GYkQfQEbiTqPkANKCUXT7Y', 'o_lgh1XaLBvNYsrTRUgJVcFL5YnE', '---杨先生。', NULL, NULL, 1, NULL, 1, NULL, 'https://wx.qlogo.cn/mmopen/vi_32/Q0j4TwGTfTJ9PZJVYXlalb519EHqgHGqjnZCpHVPtT036asYcSUSSNpDylB2VecfhFWmZ5v1J3cy2Mg248cib5w/132', NULL, NULL, '2018-11-14 20:57:00', '2018-11-14 20:57:00');\nINSERT INTO `user` VALUES ('20181114510605', NULL, 'oYfrD5JlBQdQOUHjEYz88FHJyI40', 'o_lgh1XkS2anaHNdPzWNWY9r5x_w', 'little  fish。🐳', NULL, NULL, 2, NULL, 1, NULL, 'https://wx.qlogo.cn/mmopen/vi_32/DYAIOgq83eq7YJ6yJNJt1jbicRziaTg6yCBCMq2dRHqAibcibHcrqWxZKAJZQBHIAs0IRUNlnKSMnhxrY7mbHicxHAw/132', NULL, NULL, '2018-11-14 22:35:39', '2018-11-14 22:35:39');\nCOMMIT;\n\nSET FOREIGN_KEY_CHECKS = 1;\n"
  },
  {
    "path": "pom-war.xml",
    "content": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<project xmlns=\"http://maven.apache.org/POM/4.0.0\" xmlns:xsi=\"http://www.w3.org/2001/XMLSchema-instance\"\n         xsi:schemaLocation=\"http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd\">\n    <modelVersion>4.0.0</modelVersion>\n    <groupId>io.sdb</groupId>\n    <artifactId>sdb</artifactId>\n    <version>1.0.0</version>\n    <packaging>war</packaging>\n    <description>war包对应的pom，打war包，执行【mvn clean package -f pom-war.xml】</description>\n\n    <parent>\n        <groupId>org.springframework.boot</groupId>\n        <artifactId>spring-boot-starter-parent</artifactId>\n        <version>1.5.10.RELEASE</version>\n    </parent>\n\n    <properties>\n        <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>\n        <project.reporting.outputEncoding>UTF-8</project.reporting.outputEncoding>\n        <java.version>1.8</java.version>\n        <mybatisplus.spring.boot.version>1.0.5</mybatisplus.spring.boot.version>\n        <mybatisplus.version>2.1.9</mybatisplus.version>\n        <mysql.version>5.1.38</mysql.version>\n        <druid.version>1.1.3</druid.version>\n        <quartz.version>2.3.0</quartz.version>\n        <commons.lang.version>2.6</commons.lang.version>\n        <commons.fileupload.version>1.3.1</commons.fileupload.version>\n        <commons.io.version>2.5</commons.io.version>\n        <commons.codec.version>1.10</commons.codec.version>\n        <commons.configuration.version>1.10</commons.configuration.version>\n        <shiro.version>1.3.2</shiro.version>\n        <jwt.version>0.7.0</jwt.version>\n        <kaptcha.version>0.0.9</kaptcha.version>\n        <qiniu.version>[7.2.0, 7.2.99]</qiniu.version>\n        <aliyun.oss.version>2.5.0</aliyun.oss.version>\n        <qcloud.cos.version>4.4</qcloud.cos.version>\n        <swagger.version>2.2.2</swagger.version>\n        <joda.time.version>2.9.9</joda.time.version>\n    </properties>\n\n    <dependencies>\n        <dependency>\n            <groupId>org.springframework.boot</groupId>\n            <artifactId>spring-boot-starter-test</artifactId>\n            <scope>test</scope>\n        </dependency>\n        <dependency>\n            <groupId>org.springframework.boot</groupId>\n            <artifactId>spring-boot-starter-web</artifactId>\n        </dependency>\n        <dependency>\n            <groupId>org.springframework.boot</groupId>\n            <artifactId>spring-boot-starter-tomcat</artifactId>\n            <scope>provided</scope>\n        </dependency>\n        <dependency>\n            <groupId>org.springframework.boot</groupId>\n            <artifactId>spring-boot-starter-aop</artifactId>\n        </dependency>\n        <dependency>\n            <groupId>org.springframework</groupId>\n            <artifactId>spring-context-support</artifactId>\n        </dependency>\n        <dependency>\n            <groupId>org.springframework.boot</groupId>\n            <artifactId>spring-boot-starter-data-redis</artifactId>\n        </dependency>\n        <dependency>\n            <groupId>org.springframework.boot</groupId>\n            <artifactId>spring-boot-configuration-processor</artifactId>\n            <optional>true</optional>\n        </dependency>\n        <dependency>\n            <groupId>com.baomidou</groupId>\n            <artifactId>mybatisplus-spring-boot-starter</artifactId>\n            <version>${mybatisplus.spring.boot.version}</version>\n        </dependency>\n        <dependency>\n            <groupId>com.baomidou</groupId>\n            <artifactId>mybatis-plus</artifactId>\n            <version>${mybatisplus.version}</version>\n        </dependency>\n        <dependency>\n            <groupId>mysql</groupId>\n            <artifactId>mysql-connector-java</artifactId>\n            <version>${mysql.version}</version>\n        </dependency>\n        <dependency>\n            <groupId>com.alibaba</groupId>\n            <artifactId>druid-spring-boot-starter</artifactId>\n            <version>${druid.version}</version>\n        </dependency>\n        <dependency>\n            <groupId>org.quartz-scheduler</groupId>\n            <artifactId>quartz</artifactId>\n            <version>${quartz.version}</version>\n            <exclusions>\n                <exclusion>\n                    <groupId>com.mchange</groupId>\n                    <artifactId>c3p0</artifactId>\n                </exclusion>\n            </exclusions>\n        </dependency>\n        <dependency>\n            <groupId>commons-lang</groupId>\n            <artifactId>commons-lang</artifactId>\n            <version>${commons.lang.version}</version>\n        </dependency>\n        <dependency>\n            <groupId>commons-fileupload</groupId>\n            <artifactId>commons-fileupload</artifactId>\n            <version>${commons.fileupload.version}</version>\n        </dependency>\n        <dependency>\n            <groupId>commons-io</groupId>\n            <artifactId>commons-io</artifactId>\n            <version>${commons.io.version}</version>\n        </dependency>\n        <dependency>\n            <groupId>commons-codec</groupId>\n            <artifactId>commons-codec</artifactId>\n            <version>${commons.codec.version}</version>\n        </dependency>\n        <dependency>\n            <groupId>commons-configuration</groupId>\n            <artifactId>commons-configuration</artifactId>\n            <version>${commons.configuration.version}</version>\n        </dependency>\n        <dependency>\n            <groupId>org.apache.shiro</groupId>\n            <artifactId>shiro-core</artifactId>\n            <version>${shiro.version}</version>\n        </dependency>\n        <dependency>\n            <groupId>org.apache.shiro</groupId>\n            <artifactId>shiro-spring</artifactId>\n            <version>${shiro.version}</version>\n        </dependency>\n        <dependency>\n            <groupId>io.jsonwebtoken</groupId>\n            <artifactId>jjwt</artifactId>\n            <version>${jwt.version}</version>\n        </dependency>\n        <dependency>\n            <groupId>com.github.axet</groupId>\n            <artifactId>kaptcha</artifactId>\n            <version>${kaptcha.version}</version>\n        </dependency>\n        <dependency>\n            <groupId>io.springfox</groupId>\n            <artifactId>springfox-swagger2</artifactId>\n            <version>${swagger.version}</version>\n        </dependency>\n        <dependency>\n            <groupId>io.springfox</groupId>\n            <artifactId>springfox-swagger-ui</artifactId>\n            <version>${swagger.version}</version>\n        </dependency>\n        <dependency>\n            <groupId>com.qiniu</groupId>\n            <artifactId>qiniu-java-sdk</artifactId>\n            <version>${qiniu.version}</version>\n        </dependency>\n        <dependency>\n            <groupId>com.aliyun.oss</groupId>\n            <artifactId>aliyun-sdk-oss</artifactId>\n            <version>${aliyun.oss.version}</version>\n        </dependency>\n        <dependency>\n            <groupId>com.qcloud</groupId>\n            <artifactId>cos_api</artifactId>\n            <version>${qcloud.cos.version}</version>\n            <exclusions>\n                <exclusion>\n                    <groupId>org.slf4j</groupId>\n                    <artifactId>slf4j-log4j12</artifactId>\n                </exclusion>\n            </exclusions>\n        </dependency>\n        <dependency>\n            <groupId>joda-time</groupId>\n            <artifactId>joda-time</artifactId>\n            <version>${joda.time.version}</version>\n        </dependency>\n    </dependencies>\n\n    <build>\n        <finalName>${artifactId}</finalName>\n        <plugins>\n            <plugin>\n                <groupId>org.springframework.boot</groupId>\n                <artifactId>spring-boot-maven-plugin</artifactId>\n                <configuration>\n                    <fork>true</fork>\n                </configuration>\n            </plugin>\n            <!-- 跳过单元测试 -->\n            <plugin>\n                <groupId>org.apache.maven.plugins</groupId>\n                <artifactId>maven-surefire-plugin</artifactId>\n                <configuration>\n                    <skipTests>true</skipTests>\n                </configuration>\n            </plugin>\n        </plugins>\n    </build>\n\n    <repositories>\n        <repository>\n            <id>public</id>\n            <name>aliyun nexus</name>\n            <url>http://maven.aliyun.com/nexus/content/groups/public/</url>\n            <releases>\n                <enabled>true</enabled>\n            </releases>\n        </repository>\n    </repositories>\n    <pluginRepositories>\n        <pluginRepository>\n            <id>public</id>\n            <name>aliyun nexus</name>\n            <url>http://maven.aliyun.com/nexus/content/groups/public/</url>\n            <releases>\n                <enabled>true</enabled>\n            </releases>\n            <snapshots>\n                <enabled>false</enabled>\n            </snapshots>\n        </pluginRepository>\n    </pluginRepositories>\n</project>"
  },
  {
    "path": "pom.xml",
    "content": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<project xmlns=\"http://maven.apache.org/POM/4.0.0\" xmlns:xsi=\"http://www.w3.org/2001/XMLSchema-instance\"\n\txsi:schemaLocation=\"http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd\">\n\t<modelVersion>4.0.0</modelVersion>\n\t<groupId>io.sdb</groupId>\n\t<artifactId>sdb</artifactId>\n\t<version>1.0.0</version>\n\t<packaging>jar</packaging>\n\t<description>sdb mall</description>\n\n\t<parent>\n\t\t<groupId>org.springframework.boot</groupId>\n\t\t<artifactId>spring-boot-starter-parent</artifactId>\n\t\t<version>2.0.0.RELEASE</version>\n\t</parent>\n\n\t<properties>\n\t\t<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>\n\t\t<project.reporting.outputEncoding>UTF-8</project.reporting.outputEncoding>\n\t\t<java.version>1.8</java.version>\n\t\t<mybatisplus.spring.boot.version>1.0.5</mybatisplus.spring.boot.version>\n\t\t<mybatisplus.version>2.1.9</mybatisplus.version>\n\t\t<mysql.version>5.1.38</mysql.version>\n\t\t<mssql.version>4.0</mssql.version>\n\t\t<oracle.version>11.2.0.3</oracle.version>\n\t\t<druid.version>1.1.9</druid.version>\n\t\t<quartz.version>2.3.0</quartz.version>\n\t\t<commons.lang.version>3.7</commons.lang.version>\n\t\t<commons.fileupload.version>1.2.2</commons.fileupload.version>\n\t\t<commons.io.version>2.5</commons.io.version>\n\t\t<commons.codec.version>1.10</commons.codec.version>\n\t\t<commons.configuration.version>1.10</commons.configuration.version>\n\t\t<shiro.version>1.3.2</shiro.version>\n\t\t<jwt.version>0.7.0</jwt.version>\n\t\t<kaptcha.version>0.0.9</kaptcha.version>\n\t\t<qiniu.version>[7.2.0, 7.2.99]</qiniu.version>\n\t\t<aliyun.oss.version>2.8.3</aliyun.oss.version>\n\t\t<qcloud.cos.version>4.4</qcloud.cos.version>\n\t\t<swagger.version>2.8.0</swagger.version>\n\t\t<joda.time.version>2.9.9</joda.time.version>\n\t\t<fastjson.version>1.2.45</fastjson.version>\n\n\t\t<!--wagon plugin 配置-->\n\t\t<service-path>/work/sdb</service-path>\n\t\t<pack-name>${project.artifactId}-${project.version}.jar</pack-name>\n\t\t<remote-addr>192.168.1.10:22</remote-addr>\n\t\t<remote-username>root</remote-username>\n\t\t<remote-passwd>123456</remote-passwd>\n\n\t\t<docker.plugin.version>0.4.14</docker.plugin.version>\n\t\t<docker.image.prefix>registry.cn-hangzhou.aliyuncs.com/tcb</docker.image.prefix>\n\t\t<docker.image.base>java:8</docker.image.base>\n\t\t<docker.image.push>false</docker.image.push>\n\t\t<docker.expose>8080</docker.expose>\n\t</properties>\n\n\t<dependencies>\n\t\t<dependency>\n\t\t\t<groupId>com.alibaba</groupId>\n\t\t\t<artifactId>fastjson</artifactId>\n\t\t\t<version>${fastjson.version}</version>\n\t\t</dependency>\n\t\t<dependency>\n\t\t\t<groupId>org.springframework.boot</groupId>\n\t\t\t<artifactId>spring-boot-starter-actuator</artifactId>\n\t\t</dependency>\n\t\t<dependency>\n\t\t\t<groupId>org.springframework.boot</groupId>\n\t\t\t<artifactId>spring-boot-starter-mail</artifactId>\n\t\t</dependency>\n\t\t<dependency>\n\t\t\t<groupId>org.springframework.boot</groupId>\n\t\t\t<artifactId>spring-boot-starter-test</artifactId>\n\t\t\t<scope>test</scope>\n\t\t</dependency>\n\t\t<dependency>\n\t\t\t<groupId>org.springframework.boot</groupId>\n\t\t\t<artifactId>spring-boot-starter-web</artifactId>\n\t\t</dependency>\n\t\t<dependency>\n\t\t\t<groupId>org.springframework.boot</groupId>\n\t\t\t<artifactId>spring-boot-starter-aop</artifactId>\n\t\t</dependency>\n\t\t<dependency>\n\t\t\t<groupId>org.springframework</groupId>\n\t\t\t<artifactId>spring-context-support</artifactId>\n\t\t</dependency>\n\t\t<dependency>\n\t\t\t<groupId>org.springframework.boot</groupId>\n\t\t\t<artifactId>spring-boot-starter-data-redis</artifactId>\n\t\t</dependency>\n\t\t<dependency>\n\t\t\t<groupId>org.springframework.boot</groupId>\n\t\t\t<artifactId>spring-boot-configuration-processor</artifactId>\n\t\t\t<optional>true</optional>\n\t\t</dependency>\n\t\t<!--<dependency>-->\n\t\t\t<!--<groupId>org.springframework.boot</groupId>-->\n\t\t\t<!--<artifactId>spring-boot-devtools</artifactId>-->\n\t\t\t<!--<optional>true</optional>-->\n\t\t<!--</dependency>-->\n\t\t<dependency>\n\t\t\t<groupId>org.springframework.boot</groupId>\n\t\t\t<artifactId>spring-boot-starter-jdbc</artifactId>\n\t\t\t<version>1.5.7.RELEASE</version>\n\t\t\t<scope>compile</scope>\n\t\t</dependency>\n\t\t<dependency>\n\t\t\t<groupId>mysql</groupId>\n\t\t\t<artifactId>mysql-connector-java</artifactId>\n\t\t\t<version>${mysql.version}</version>\n\t\t</dependency>\n\t\t <!--oracle驱动-->\n\t\t<dependency>\n\t\t<groupId>com.oracle</groupId>\n\t\t<artifactId>ojdbc6</artifactId>\n\t\t<version>${oracle.version}</version>\n\t\t</dependency>\n\t\t <!--mssql驱动-->\n\t\t<dependency>\n\t\t<groupId>com.microsoft.sqlserver</groupId>\n\t\t<artifactId>sqljdbc4</artifactId>\n\t\t<version>${mssql.version}</version>\n\t\t</dependency>\n\t\t <!--postgresql驱动-->\n\t\t<dependency>\n\t\t<groupId>org.postgresql</groupId>\n\t\t<artifactId>postgresql</artifactId>\n\t\t</dependency>\n\t\t<dependency>\n\t\t\t<groupId>com.alibaba</groupId>\n\t\t\t<artifactId>druid-spring-boot-starter</artifactId>\n\t\t\t<version>${druid.version}</version>\n\t\t</dependency>\n\t\t<dependency>\n\t\t\t<groupId>org.quartz-scheduler</groupId>\n\t\t\t<artifactId>quartz</artifactId>\n\t\t\t<version>${quartz.version}</version>\n\t\t\t<exclusions>\n\t\t\t\t<exclusion>\n\t\t\t\t\t<groupId>com.mchange</groupId>\n\t\t\t\t\t<artifactId>c3p0</artifactId>\n\t\t\t\t</exclusion>\n\t\t\t</exclusions>\n\t\t</dependency>\n\t\t<dependency>\n            <groupId>org.apache.commons</groupId>\n            <artifactId>commons-lang3</artifactId>\n\t\t\t<version>${commons.lang.version}</version>\n\t\t</dependency>\n\t\t<dependency>\n\t\t\t<groupId>commons-fileupload</groupId>\n\t\t\t<artifactId>commons-fileupload</artifactId>\n\t\t\t<version>${commons.fileupload.version}</version>\n\t\t</dependency>\n\t\t<dependency>\n\t\t\t<groupId>commons-io</groupId>\n\t\t\t<artifactId>commons-io</artifactId>\n\t\t\t<version>${commons.io.version}</version>\n\t\t</dependency>\n\t\t<dependency>\n\t\t\t<groupId>commons-codec</groupId>\n\t\t\t<artifactId>commons-codec</artifactId>\n\t\t\t<version>${commons.codec.version}</version>\n\t\t</dependency>\n\t\t<dependency>\n\t\t\t<groupId>commons-configuration</groupId>\n\t\t\t<artifactId>commons-configuration</artifactId>\n\t\t\t<version>${commons.configuration.version}</version>\n\t\t</dependency>\n\t\t<dependency>\n\t\t\t<groupId>org.apache.shiro</groupId>\n\t\t\t<artifactId>shiro-core</artifactId>\n\t\t\t<version>${shiro.version}</version>\n\t\t</dependency>\n\t\t<dependency>\n\t\t\t<groupId>org.apache.shiro</groupId>\n\t\t\t<artifactId>shiro-spring</artifactId>\n\t\t\t<version>${shiro.version}</version>\n\t\t</dependency>\n\t\t<dependency>\n\t\t\t<groupId>io.jsonwebtoken</groupId>\n\t\t\t<artifactId>jjwt</artifactId>\n\t\t\t<version>${jwt.version}</version>\n\t\t</dependency>\n\t\t<dependency>\n\t\t\t<groupId>com.github.axet</groupId>\n\t\t\t<artifactId>kaptcha</artifactId>\n\t\t\t<version>${kaptcha.version}</version>\n\t\t</dependency>\n\t\t<dependency>\n\t\t\t<groupId>io.springfox</groupId>\n\t\t\t<artifactId>springfox-swagger2</artifactId>\n\t\t\t<version>${swagger.version}</version>\n\t\t</dependency>\n\t\t<dependency>\n\t\t\t<groupId>io.springfox</groupId>\n\t\t\t<artifactId>springfox-swagger-ui</artifactId>\n\t\t\t<version>${swagger.version}</version>\n\t\t</dependency>\n\t\t<dependency>\n\t\t\t<groupId>com.qiniu</groupId>\n\t\t\t<artifactId>qiniu-java-sdk</artifactId>\n\t\t\t<version>${qiniu.version}</version>\n\t\t</dependency>\n\t\t<dependency>\n\t\t\t<groupId>com.aliyun.oss</groupId>\n\t\t\t<artifactId>aliyun-sdk-oss</artifactId>\n\t\t\t<version>${aliyun.oss.version}</version>\n\t\t</dependency>\n\t\t<dependency>\n\t\t\t<groupId>com.qcloud</groupId>\n\t\t\t<artifactId>cos_api</artifactId>\n\t\t\t<version>${qcloud.cos.version}</version>\n\t\t\t<exclusions>\n\t\t\t\t<exclusion>\n\t\t\t\t\t<groupId>org.slf4j</groupId>\n\t\t\t\t\t<artifactId>slf4j-log4j12</artifactId>\n\t\t\t\t</exclusion>\n\t\t\t</exclusions>\n\t\t</dependency>\n\n\t\t<dependency>\n\t\t\t<groupId>joda-time</groupId>\n\t\t\t<artifactId>joda-time</artifactId>\n\t\t\t<version>${joda.time.version}</version>\n\t\t</dependency>\n\n\t\t<dependency>\n\t\t\t<groupId>com.jfinal</groupId>\n\t\t\t<artifactId>jfinal</artifactId>\n\t\t\t<version>3.5</version>\n\t\t</dependency>\n\n        <dependency>\n            <groupId>cn.hutool</groupId>\n            <artifactId>hutool-all</artifactId>\n            <version>4.0.12</version>\n        </dependency>\n\n        <dependency>\n            <groupId>org.projectlombok</groupId>\n            <artifactId>lombok</artifactId>\n        </dependency>\n\n        <dependency>\n            <groupId>org.slf4j</groupId>\n            <artifactId>slf4j-api</artifactId>\n            <version>1.7.7</version>\n        </dependency>\n\n        <dependency>\n            <groupId>com.googlecode.log4jdbc</groupId>\n            <artifactId>log4jdbc</artifactId>\n            <version>1.2</version>\n        </dependency>\n\n\t\t<!-- https://mvnrepository.com/artifact/org.apache.directory.studio/org.apache.commons.collections -->\n\t\t<dependency>\n\t\t\t<groupId>org.apache.directory.studio</groupId>\n\t\t\t<artifactId>org.apache.commons.collections</artifactId>\n\t\t\t<version>3.2.1</version>\n\t\t</dependency>\n\n        <dependency>\n            <groupId>org.springframework.boot</groupId>\n            <artifactId>spring-boot-starter-actuator</artifactId>\n        </dependency>\n\n\t\t<dependency>\n\t\t\t<groupId>com.github.binarywang</groupId>\n\t\t\t<artifactId>weixin-java-mp</artifactId>\n\t\t\t<version>2.9.0</version>\n\t\t</dependency>\n\n\t\t<dependency>\n\t\t\t<groupId>com.github.binarywang</groupId>\n\t\t\t<artifactId>weixin-java-miniapp</artifactId>\n\t\t\t<version>3.0.0</version>\n\t\t</dependency>\n\n\t\t<dependency>\n\t\t\t<groupId>cn.springboot</groupId>\n\t\t\t<artifactId>best-pay-sdk</artifactId>\n\t\t\t<version>1.2.0</version>\n\t\t</dependency>\n\n\t\t<!-- https://mvnrepository.com/artifact/com.alipay.sdk/alipay-sdk-java -->\n\t\t<dependency>\n\t\t\t<groupId>com.alipay.sdk</groupId>\n\t\t\t<artifactId>alipay-sdk-java</artifactId>\n\t\t\t<version>3.3.49.ALL</version>\n\t\t</dependency>\n    </dependencies>\n\n\t<build>\n\t\t<finalName>${project.artifactId}</finalName>\n\t\t<extensions>\n\t\t\t<extension>\n\t\t\t\t<groupId>org.apache.maven.wagon</groupId>\n\t\t\t\t<artifactId>wagon-ssh</artifactId>\n\t\t\t\t<version>2.8</version>\n\t\t\t</extension>\n\t\t</extensions>\n\t\t<plugins>\n\t\t\t<plugin>\n\t\t\t\t<groupId>org.springframework.boot</groupId>\n\t\t\t\t<artifactId>spring-boot-maven-plugin</artifactId>\n\t\t\t\t<configuration>\n\t\t\t\t\t<fork>true</fork>\n\t\t\t\t</configuration>\n\t\t\t</plugin>\n\t\t\t<!-- 跳过单元测试 -->\n\t\t\t<plugin>\n\t\t\t\t<groupId>org.apache.maven.plugins</groupId>\n\t\t\t\t<artifactId>maven-surefire-plugin</artifactId>\n\t\t\t\t<configuration>\n\t\t\t\t\t<skipTests>true</skipTests>\n\t\t\t\t</configuration>\n\t\t\t</plugin>\n\t\t\t<plugin>\n\t\t\t\t<groupId>org.codehaus.mojo</groupId>\n\t\t\t\t<artifactId>wagon-maven-plugin</artifactId>\n\t\t\t\t<version>1.0</version>\n\t\t\t\t<configuration>\n\t\t\t\t\t<fromFile>target/${pack-name}</fromFile>\n\t\t\t\t\t<url><![CDATA[scp://${remote-username}:${remote-passwd}@${remote-addr}${service-path}]]></url>\n\t\t\t\t\t<commands>\n\t\t\t\t\t\t<!-- Kill Old Process -->\n\t\t\t\t\t\t<command>pkill -f ${pack-name}</command>\n\t\t\t\t\t\t<command>rm -f ${service-path}/sdb.log</command>\n\t\t\t\t\t\t<!-- Restart jar package，write result into sdb.log -->\n\t\t\t\t\t\t<command><![CDATA[nohup java -jar ${service-path}/${pack-name} --spring.profiles.active=test > ${service-path}/sdb.log 2>&1 & ]]></command>\n\t\t\t\t\t\t<command><![CDATA[netstat -nptl]]></command>\n\t\t\t\t\t\t<command><![CDATA[ps -ef | grep java | grep -v grep]]></command>\n\t\t\t\t\t</commands>\n\t\t\t\t\t<!-- 运行命令 mvn clean package wagon:upload-single wagon:sshexec-->\n\t\t\t\t\t<displayCommandOutputs>true</displayCommandOutputs>\n\t\t\t\t</configuration>\n\t\t\t</plugin>\n\n\t\t\t<plugin>\n\t\t\t\t<groupId>com.spotify</groupId>\n\t\t\t\t<artifactId>docker-maven-plugin</artifactId>\n\t\t\t\t<version>${docker.plugin.version}</version>\n\t\t\t\t<executions>\n\t\t\t\t\t<execution>\n\t\t\t\t\t\t<phase>package</phase>\n\t\t\t\t\t\t<goals>\n\t\t\t\t\t\t\t<goal>build</goal>\n\t\t\t\t\t\t</goals>\n\t\t\t\t\t</execution>\n\t\t\t\t</executions>\n\t\t\t\t<configuration>\n\t\t\t\t\t<maintainer>yjjdick</maintainer>\n\t\t\t\t\t<pushImage>${docker.image.push}</pushImage>\n\t\t\t\t\t<imageName>${docker.image.prefix}/${project.artifactId}</imageName>\n\t\t\t\t\t<baseImage>${docker.image.base}</baseImage>\n\t\t\t\t\t<imageTags>\n\t\t\t\t\t\t<!--<imageTag>${project.version}</imageTag>-->\n\t\t\t\t\t\t<imageTag>latest</imageTag>\n\t\t\t\t\t</imageTags>\n\t\t\t\t\t<exposes>\n\t\t\t\t\t\t<expose>${docker.expose}</expose>\n\t\t\t\t\t</exposes>\n\t\t\t\t\t<entryPoint>[\"java\", \"-jar\", \"/${project.build.finalName}.jar\"]</entryPoint>\n\t\t\t\t\t<resources>\n\t\t\t\t\t\t<resource>\n\t\t\t\t\t\t\t<targetPath>/</targetPath>\n\t\t\t\t\t\t\t<directory>${project.build.directory}</directory>\n\t\t\t\t\t\t\t<include>${project.build.finalName}.jar</include>\n\t\t\t\t\t\t</resource>\n\t\t\t\t\t</resources>\n\n\t\t\t\t\t<serverId>docker-aliyun</serverId>\n\t\t\t\t\t<registryUrl>cn-hangzhou.aliyuncs.com</registryUrl>\n\t\t\t\t</configuration>\n\t\t\t\t<!-- 运行命令 mvn clean package docker:build 打包并生成docker镜像 -->\n\t\t\t</plugin>\n\t\t</plugins>\n\t</build>\n\n\t<repositories>\n\t\t<repository>\n\t\t\t<id>public</id>\n\t\t\t<name>aliyun nexus</name>\n\t\t\t<url>http://maven.aliyun.com/nexus/content/groups/public/</url>\n\t\t\t<releases>\n\t\t\t\t<enabled>true</enabled>\n\t\t\t</releases>\n\t\t</repository>\n\t</repositories>\n\t<pluginRepositories>\n\t\t<pluginRepository>\n\t\t\t<id>public</id>\n\t\t\t<name>aliyun nexus</name>\n\t\t\t<url>http://maven.aliyun.com/nexus/content/groups/public/</url>\n\t\t\t<releases>\n\t\t\t\t<enabled>true</enabled>\n\t\t\t</releases>\n\t\t\t<snapshots>\n\t\t\t\t<enabled>false</enabled>\n\t\t\t</snapshots>\n\t\t</pluginRepository>\n\t</pluginRepositories>\n\n</project>\n"
  },
  {
    "path": "sdb.iml",
    "content": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<module org.jetbrains.idea.maven.project.MavenProjectsManager.isMavenModule=\"true\" type=\"JAVA_MODULE\" version=\"4\">\n  <component name=\"FacetManager\">\n    <facet type=\"Spring\" name=\"Spring\">\n      <configuration />\n    </facet>\n    <facet type=\"web\" name=\"Web\">\n      <configuration>\n        <webroots />\n        <sourceRoots>\n          <root url=\"file://$MODULE_DIR$/src/main/java\" />\n          <root url=\"file://$MODULE_DIR$/src/main/resources\" />\n        </sourceRoots>\n      </configuration>\n    </facet>\n  </component>\n  <component name=\"NewModuleRootManager\" LANGUAGE_LEVEL=\"JDK_1_8\">\n    <output url=\"file://$MODULE_DIR$/target/classes\" />\n    <output-test url=\"file://$MODULE_DIR$/target/test-classes\" />\n    <content url=\"file://$MODULE_DIR$\">\n      <sourceFolder url=\"file://$MODULE_DIR$/src/main/java\" isTestSource=\"false\" />\n      <sourceFolder url=\"file://$MODULE_DIR$/src/main/resources\" type=\"java-resource\" />\n      <sourceFolder url=\"file://$MODULE_DIR$/src/test/java\" isTestSource=\"true\" />\n      <excludeFolder url=\"file://$MODULE_DIR$/target\" />\n    </content>\n    <orderEntry type=\"inheritedJdk\" />\n    <orderEntry type=\"sourceFolder\" forTests=\"false\" />\n    <orderEntry type=\"library\" name=\"Maven: com.alibaba:fastjson:1.2.45\" level=\"project\" />\n    <orderEntry type=\"library\" name=\"Maven: org.springframework.boot:spring-boot-starter-actuator:2.0.0.RELEASE\" level=\"project\" />\n    <orderEntry type=\"library\" name=\"Maven: org.springframework.boot:spring-boot-starter:2.0.0.RELEASE\" level=\"project\" />\n    <orderEntry type=\"library\" name=\"Maven: org.springframework.boot:spring-boot:2.0.0.RELEASE\" level=\"project\" />\n    <orderEntry type=\"library\" name=\"Maven: org.springframework.boot:spring-boot-starter-logging:2.0.0.RELEASE\" level=\"project\" />\n    <orderEntry type=\"library\" name=\"Maven: ch.qos.logback:logback-classic:1.2.3\" level=\"project\" />\n    <orderEntry type=\"library\" name=\"Maven: ch.qos.logback:logback-core:1.2.3\" level=\"project\" />\n    <orderEntry type=\"library\" name=\"Maven: org.apache.logging.log4j:log4j-to-slf4j:2.10.0\" level=\"project\" />\n    <orderEntry type=\"library\" name=\"Maven: org.apache.logging.log4j:log4j-api:2.10.0\" level=\"project\" />\n    <orderEntry type=\"library\" name=\"Maven: org.slf4j:jul-to-slf4j:1.7.25\" level=\"project\" />\n    <orderEntry type=\"library\" name=\"Maven: javax.annotation:javax.annotation-api:1.3.2\" level=\"project\" />\n    <orderEntry type=\"library\" scope=\"RUNTIME\" name=\"Maven: org.yaml:snakeyaml:1.19\" level=\"project\" />\n    <orderEntry type=\"library\" name=\"Maven: org.springframework.boot:spring-boot-actuator-autoconfigure:2.0.0.RELEASE\" level=\"project\" />\n    <orderEntry type=\"library\" name=\"Maven: org.springframework.boot:spring-boot-actuator:2.0.0.RELEASE\" level=\"project\" />\n    <orderEntry type=\"library\" name=\"Maven: com.fasterxml.jackson.datatype:jackson-datatype-jsr310:2.9.4\" level=\"project\" />\n    <orderEntry type=\"library\" name=\"Maven: io.micrometer:micrometer-core:1.0.1\" level=\"project\" />\n    <orderEntry type=\"library\" name=\"Maven: org.hdrhistogram:HdrHistogram:2.1.10\" level=\"project\" />\n    <orderEntry type=\"library\" name=\"Maven: org.latencyutils:LatencyUtils:2.0.3\" level=\"project\" />\n    <orderEntry type=\"library\" name=\"Maven: org.springframework.boot:spring-boot-starter-mail:2.0.0.RELEASE\" level=\"project\" />\n    <orderEntry type=\"library\" name=\"Maven: org.springframework:spring-context:5.0.4.RELEASE\" level=\"project\" />\n    <orderEntry type=\"library\" name=\"Maven: org.springframework:spring-expression:5.0.4.RELEASE\" level=\"project\" />\n    <orderEntry type=\"library\" name=\"Maven: com.sun.mail:javax.mail:1.6.1\" level=\"project\" />\n    <orderEntry type=\"library\" name=\"Maven: javax.activation:activation:1.1\" level=\"project\" />\n    <orderEntry type=\"library\" scope=\"TEST\" name=\"Maven: org.springframework.boot:spring-boot-starter-test:2.0.0.RELEASE\" level=\"project\" />\n    <orderEntry type=\"library\" scope=\"TEST\" name=\"Maven: org.springframework.boot:spring-boot-test:2.0.0.RELEASE\" level=\"project\" />\n    <orderEntry type=\"library\" scope=\"TEST\" name=\"Maven: org.springframework.boot:spring-boot-test-autoconfigure:2.0.0.RELEASE\" level=\"project\" />\n    <orderEntry type=\"library\" scope=\"TEST\" name=\"Maven: com.jayway.jsonpath:json-path:2.4.0\" level=\"project\" />\n    <orderEntry type=\"library\" scope=\"TEST\" name=\"Maven: net.minidev:json-smart:2.3\" level=\"project\" />\n    <orderEntry type=\"library\" scope=\"TEST\" name=\"Maven: net.minidev:accessors-smart:1.2\" level=\"project\" />\n    <orderEntry type=\"library\" scope=\"TEST\" name=\"Maven: org.ow2.asm:asm:5.0.4\" level=\"project\" />\n    <orderEntry type=\"library\" name=\"Maven: junit:junit:4.12\" level=\"project\" />\n    <orderEntry type=\"library\" scope=\"TEST\" name=\"Maven: org.assertj:assertj-core:3.9.1\" level=\"project\" />\n    <orderEntry type=\"library\" scope=\"TEST\" name=\"Maven: org.mockito:mockito-core:2.15.0\" level=\"project\" />\n    <orderEntry type=\"library\" name=\"Maven: net.bytebuddy:byte-buddy:1.7.10\" level=\"project\" />\n    <orderEntry type=\"library\" scope=\"TEST\" name=\"Maven: net.bytebuddy:byte-buddy-agent:1.7.10\" level=\"project\" />\n    <orderEntry type=\"library\" scope=\"TEST\" name=\"Maven: org.objenesis:objenesis:2.6\" level=\"project\" />\n    <orderEntry type=\"library\" name=\"Maven: org.hamcrest:hamcrest-core:1.3\" level=\"project\" />\n    <orderEntry type=\"library\" scope=\"TEST\" name=\"Maven: org.hamcrest:hamcrest-library:1.3\" level=\"project\" />\n    <orderEntry type=\"library\" scope=\"TEST\" name=\"Maven: org.skyscreamer:jsonassert:1.5.0\" level=\"project\" />\n    <orderEntry type=\"library\" scope=\"TEST\" name=\"Maven: com.vaadin.external.google:android-json:0.0.20131108.vaadin1\" level=\"project\" />\n    <orderEntry type=\"library\" name=\"Maven: org.springframework:spring-core:5.0.4.RELEASE\" level=\"project\" />\n    <orderEntry type=\"library\" name=\"Maven: org.springframework:spring-jcl:5.0.4.RELEASE\" level=\"project\" />\n    <orderEntry type=\"library\" scope=\"TEST\" name=\"Maven: org.springframework:spring-test:5.0.4.RELEASE\" level=\"project\" />\n    <orderEntry type=\"library\" scope=\"TEST\" name=\"Maven: org.xmlunit:xmlunit-core:2.5.1\" level=\"project\" />\n    <orderEntry type=\"library\" name=\"Maven: org.springframework.boot:spring-boot-starter-web:2.0.0.RELEASE\" level=\"project\" />\n    <orderEntry type=\"library\" name=\"Maven: org.springframework.boot:spring-boot-starter-json:2.0.0.RELEASE\" level=\"project\" />\n    <orderEntry type=\"library\" name=\"Maven: com.fasterxml.jackson.datatype:jackson-datatype-jdk8:2.9.4\" level=\"project\" />\n    <orderEntry type=\"library\" name=\"Maven: com.fasterxml.jackson.module:jackson-module-parameter-names:2.9.4\" level=\"project\" />\n    <orderEntry type=\"library\" name=\"Maven: org.springframework.boot:spring-boot-starter-tomcat:2.0.0.RELEASE\" level=\"project\" />\n    <orderEntry type=\"library\" name=\"Maven: org.apache.tomcat.embed:tomcat-embed-el:8.5.28\" level=\"project\" />\n    <orderEntry type=\"library\" name=\"Maven: org.apache.tomcat.embed:tomcat-embed-websocket:8.5.28\" level=\"project\" />\n    <orderEntry type=\"library\" name=\"Maven: org.hibernate.validator:hibernate-validator:6.0.7.Final\" level=\"project\" />\n    <orderEntry type=\"library\" name=\"Maven: javax.validation:validation-api:2.0.1.Final\" level=\"project\" />\n    <orderEntry type=\"library\" name=\"Maven: org.jboss.logging:jboss-logging:3.3.2.Final\" level=\"project\" />\n    <orderEntry type=\"library\" name=\"Maven: org.springframework:spring-web:5.0.4.RELEASE\" level=\"project\" />\n    <orderEntry type=\"library\" name=\"Maven: org.springframework:spring-webmvc:5.0.4.RELEASE\" level=\"project\" />\n    <orderEntry type=\"library\" name=\"Maven: org.springframework.boot:spring-boot-starter-aop:2.0.0.RELEASE\" level=\"project\" />\n    <orderEntry type=\"library\" name=\"Maven: org.springframework:spring-aop:5.0.4.RELEASE\" level=\"project\" />\n    <orderEntry type=\"library\" name=\"Maven: org.aspectj:aspectjweaver:1.8.13\" level=\"project\" />\n    <orderEntry type=\"library\" name=\"Maven: org.springframework:spring-context-support:5.0.4.RELEASE\" level=\"project\" />\n    <orderEntry type=\"library\" name=\"Maven: org.springframework:spring-beans:5.0.4.RELEASE\" level=\"project\" />\n    <orderEntry type=\"library\" name=\"Maven: org.springframework.boot:spring-boot-starter-data-redis:2.0.0.RELEASE\" level=\"project\" />\n    <orderEntry type=\"library\" name=\"Maven: org.springframework.data:spring-data-redis:2.0.5.RELEASE\" level=\"project\" />\n    <orderEntry type=\"library\" name=\"Maven: org.springframework.data:spring-data-keyvalue:2.0.5.RELEASE\" level=\"project\" />\n    <orderEntry type=\"library\" name=\"Maven: org.springframework.data:spring-data-commons:2.0.5.RELEASE\" level=\"project\" />\n    <orderEntry type=\"library\" name=\"Maven: org.springframework:spring-tx:5.0.4.RELEASE\" level=\"project\" />\n    <orderEntry type=\"library\" name=\"Maven: org.springframework:spring-oxm:5.0.4.RELEASE\" level=\"project\" />\n    <orderEntry type=\"library\" name=\"Maven: io.lettuce:lettuce-core:5.0.2.RELEASE\" level=\"project\" />\n    <orderEntry type=\"library\" name=\"Maven: io.projectreactor:reactor-core:3.1.5.RELEASE\" level=\"project\" />\n    <orderEntry type=\"library\" name=\"Maven: org.reactivestreams:reactive-streams:1.0.2\" level=\"project\" />\n    <orderEntry type=\"library\" name=\"Maven: io.netty:netty-common:4.1.22.Final\" level=\"project\" />\n    <orderEntry type=\"library\" name=\"Maven: io.netty:netty-transport:4.1.22.Final\" level=\"project\" />\n    <orderEntry type=\"library\" name=\"Maven: io.netty:netty-buffer:4.1.22.Final\" level=\"project\" />\n    <orderEntry type=\"library\" name=\"Maven: io.netty:netty-resolver:4.1.22.Final\" level=\"project\" />\n    <orderEntry type=\"library\" name=\"Maven: io.netty:netty-handler:4.1.22.Final\" level=\"project\" />\n    <orderEntry type=\"library\" name=\"Maven: io.netty:netty-codec:4.1.22.Final\" level=\"project\" />\n    <orderEntry type=\"library\" name=\"Maven: org.springframework.boot:spring-boot-configuration-processor:2.0.0.RELEASE\" level=\"project\" />\n    <orderEntry type=\"library\" name=\"Maven: org.springframework.boot:spring-boot-starter-jdbc:1.5.7.RELEASE\" level=\"project\" />\n    <orderEntry type=\"library\" name=\"Maven: org.apache.tomcat:tomcat-jdbc:8.5.28\" level=\"project\" />\n    <orderEntry type=\"library\" name=\"Maven: org.apache.tomcat:tomcat-juli:8.5.28\" level=\"project\" />\n    <orderEntry type=\"library\" name=\"Maven: org.springframework:spring-jdbc:5.0.4.RELEASE\" level=\"project\" />\n    <orderEntry type=\"library\" name=\"Maven: mysql:mysql-connector-java:5.1.38\" level=\"project\" />\n    <orderEntry type=\"library\" name=\"Maven: com.oracle:ojdbc6:11.2.0.3\" level=\"project\" />\n    <orderEntry type=\"library\" name=\"Maven: com.microsoft.sqlserver:sqljdbc4:4.0\" level=\"project\" />\n    <orderEntry type=\"library\" name=\"Maven: org.postgresql:postgresql:42.2.1\" level=\"project\" />\n    <orderEntry type=\"library\" name=\"Maven: com.alibaba:druid-spring-boot-starter:1.1.9\" level=\"project\" />\n    <orderEntry type=\"library\" name=\"Maven: com.alibaba:druid:1.1.9\" level=\"project\" />\n    <orderEntry type=\"library\" name=\"Maven: org.springframework.boot:spring-boot-autoconfigure:2.0.0.RELEASE\" level=\"project\" />\n    <orderEntry type=\"library\" name=\"Maven: org.quartz-scheduler:quartz:2.3.0\" level=\"project\" />\n    <orderEntry type=\"library\" name=\"Maven: com.mchange:mchange-commons-java:0.2.11\" level=\"project\" />\n    <orderEntry type=\"library\" name=\"Maven: com.zaxxer:HikariCP-java6:2.3.13\" level=\"project\" />\n    <orderEntry type=\"library\" name=\"Maven: org.apache.commons:commons-lang3:3.7\" level=\"project\" />\n    <orderEntry type=\"library\" name=\"Maven: commons-fileupload:commons-fileupload:1.2.2\" level=\"project\" />\n    <orderEntry type=\"library\" name=\"Maven: commons-io:commons-io:2.5\" level=\"project\" />\n    <orderEntry type=\"library\" name=\"Maven: commons-codec:commons-codec:1.10\" level=\"project\" />\n    <orderEntry type=\"library\" name=\"Maven: commons-configuration:commons-configuration:1.10\" level=\"project\" />\n    <orderEntry type=\"library\" name=\"Maven: commons-lang:commons-lang:2.6\" level=\"project\" />\n    <orderEntry type=\"library\" name=\"Maven: commons-logging:commons-logging:1.1.1\" level=\"project\" />\n    <orderEntry type=\"library\" name=\"Maven: org.apache.shiro:shiro-core:1.3.2\" level=\"project\" />\n    <orderEntry type=\"library\" name=\"Maven: commons-beanutils:commons-beanutils:1.8.3\" level=\"project\" />\n    <orderEntry type=\"library\" name=\"Maven: org.apache.shiro:shiro-spring:1.3.2\" level=\"project\" />\n    <orderEntry type=\"library\" name=\"Maven: org.apache.shiro:shiro-web:1.3.2\" level=\"project\" />\n    <orderEntry type=\"library\" name=\"Maven: io.jsonwebtoken:jjwt:0.7.0\" level=\"project\" />\n    <orderEntry type=\"library\" name=\"Maven: com.fasterxml.jackson.core:jackson-databind:2.9.4\" level=\"project\" />\n    <orderEntry type=\"library\" name=\"Maven: com.fasterxml.jackson.core:jackson-annotations:2.9.0\" level=\"project\" />\n    <orderEntry type=\"library\" name=\"Maven: com.github.axet:kaptcha:0.0.9\" level=\"project\" />\n    <orderEntry type=\"library\" name=\"Maven: com.jhlabs:filters:2.0.235\" level=\"project\" />\n    <orderEntry type=\"library\" name=\"Maven: io.springfox:springfox-swagger2:2.8.0\" level=\"project\" />\n    <orderEntry type=\"library\" name=\"Maven: io.swagger:swagger-annotations:1.5.14\" level=\"project\" />\n    <orderEntry type=\"library\" name=\"Maven: io.swagger:swagger-models:1.5.14\" level=\"project\" />\n    <orderEntry type=\"library\" name=\"Maven: io.springfox:springfox-spi:2.8.0\" level=\"project\" />\n    <orderEntry type=\"library\" name=\"Maven: io.springfox:springfox-core:2.8.0\" level=\"project\" />\n    <orderEntry type=\"library\" name=\"Maven: io.springfox:springfox-schema:2.8.0\" level=\"project\" />\n    <orderEntry type=\"library\" name=\"Maven: io.springfox:springfox-swagger-common:2.8.0\" level=\"project\" />\n    <orderEntry type=\"library\" name=\"Maven: io.springfox:springfox-spring-web:2.8.0\" level=\"project\" />\n    <orderEntry type=\"library\" name=\"Maven: org.reflections:reflections:0.9.11\" level=\"project\" />\n    <orderEntry type=\"library\" name=\"Maven: org.javassist:javassist:3.21.0-GA\" level=\"project\" />\n    <orderEntry type=\"library\" name=\"Maven: com.google.guava:guava:20.0\" level=\"project\" />\n    <orderEntry type=\"library\" name=\"Maven: com.fasterxml:classmate:1.3.4\" level=\"project\" />\n    <orderEntry type=\"library\" name=\"Maven: org.springframework.plugin:spring-plugin-core:1.2.0.RELEASE\" level=\"project\" />\n    <orderEntry type=\"library\" name=\"Maven: org.springframework.plugin:spring-plugin-metadata:1.2.0.RELEASE\" level=\"project\" />\n    <orderEntry type=\"library\" name=\"Maven: org.mapstruct:mapstruct:1.2.0.Final\" level=\"project\" />\n    <orderEntry type=\"library\" name=\"Maven: io.springfox:springfox-swagger-ui:2.8.0\" level=\"project\" />\n    <orderEntry type=\"library\" name=\"Maven: com.qiniu:qiniu-java-sdk:7.2.17\" level=\"project\" />\n    <orderEntry type=\"library\" name=\"Maven: com.squareup.okhttp3:okhttp:3.9.1\" level=\"project\" />\n    <orderEntry type=\"library\" name=\"Maven: com.squareup.okio:okio:1.13.0\" level=\"project\" />\n    <orderEntry type=\"library\" name=\"Maven: com.google.code.gson:gson:2.8.2\" level=\"project\" />\n    <orderEntry type=\"library\" name=\"Maven: com.aliyun.oss:aliyun-sdk-oss:2.8.3\" level=\"project\" />\n    <orderEntry type=\"library\" name=\"Maven: org.apache.httpcomponents:httpclient:4.5.5\" level=\"project\" />\n    <orderEntry type=\"library\" name=\"Maven: org.jdom:jdom:1.1\" level=\"project\" />\n    <orderEntry type=\"library\" name=\"Maven: com.qcloud:cos_api:4.4\" level=\"project\" />\n    <orderEntry type=\"library\" name=\"Maven: org.apache.httpcomponents:httpcore:4.4.9\" level=\"project\" />\n    <orderEntry type=\"library\" name=\"Maven: org.apache.httpcomponents:httpmime:4.5.5\" level=\"project\" />\n    <orderEntry type=\"library\" name=\"Maven: org.json:json:20140107\" level=\"project\" />\n    <orderEntry type=\"library\" name=\"Maven: joda-time:joda-time:2.9.9\" level=\"project\" />\n    <orderEntry type=\"library\" name=\"Maven: com.jfinal:jfinal:3.5\" level=\"project\" />\n    <orderEntry type=\"library\" name=\"Maven: cglib:cglib-nodep:3.2.5\" level=\"project\" />\n    <orderEntry type=\"library\" name=\"Maven: cn.hutool:hutool-all:4.0.12\" level=\"project\" />\n    <orderEntry type=\"library\" name=\"Maven: org.projectlombok:lombok:1.16.20\" level=\"project\" />\n    <orderEntry type=\"library\" name=\"Maven: org.slf4j:slf4j-api:1.7.7\" level=\"project\" />\n    <orderEntry type=\"library\" name=\"Maven: com.googlecode.log4jdbc:log4jdbc:1.2\" level=\"project\" />\n    <orderEntry type=\"library\" name=\"Maven: org.apache.directory.studio:org.apache.commons.collections:3.2.1\" level=\"project\" />\n    <orderEntry type=\"library\" name=\"Maven: commons-collections:commons-collections:3.2.1\" level=\"project\" />\n    <orderEntry type=\"library\" name=\"Maven: com.github.binarywang:weixin-java-mp:2.9.0\" level=\"project\" />\n    <orderEntry type=\"library\" name=\"Maven: com.github.binarywang:weixin-java-common:2.9.0\" level=\"project\" />\n    <orderEntry type=\"library\" name=\"Maven: com.thoughtworks.xstream:xstream:1.4.9\" level=\"project\" />\n    <orderEntry type=\"library\" name=\"Maven: xmlpull:xmlpull:1.1.3.1\" level=\"project\" />\n    <orderEntry type=\"library\" name=\"Maven: xpp3:xpp3_min:1.1.4c\" level=\"project\" />\n    <orderEntry type=\"library\" name=\"Maven: org.slf4j:jcl-over-slf4j:1.7.25\" level=\"project\" />\n    <orderEntry type=\"library\" name=\"Maven: com.github.binarywang:weixin-java-miniapp:3.0.0\" level=\"project\" />\n    <orderEntry type=\"library\" name=\"Maven: cn.springboot:best-pay-sdk:1.2.0\" level=\"project\" />\n    <orderEntry type=\"library\" name=\"Maven: org.glassfish.jersey.core:jersey-client:2.26\" level=\"project\" />\n    <orderEntry type=\"library\" name=\"Maven: javax.ws.rs:javax.ws.rs-api:2.1\" level=\"project\" />\n    <orderEntry type=\"library\" name=\"Maven: org.glassfish.jersey.core:jersey-common:2.26\" level=\"project\" />\n    <orderEntry type=\"library\" name=\"Maven: org.glassfish.hk2:osgi-resource-locator:1.0.1\" level=\"project\" />\n    <orderEntry type=\"library\" name=\"Maven: org.glassfish.hk2.external:javax.inject:2.5.0-b42\" level=\"project\" />\n    <orderEntry type=\"library\" name=\"Maven: org.glassfish.jersey.connectors:jersey-apache-connector:2.23.2\" level=\"project\" />\n    <orderEntry type=\"library\" name=\"Maven: com.fasterxml.jackson.core:jackson-core:2.9.4\" level=\"project\" />\n    <orderEntry type=\"library\" name=\"Maven: org.apache.tomcat.embed:tomcat-embed-core:8.5.28\" level=\"project\" />\n    <orderEntry type=\"library\" name=\"Maven: org.apache.tomcat:tomcat-annotations-api:8.5.28\" level=\"project\" />\n    <orderEntry type=\"library\" name=\"Maven: com.squareup.retrofit2:retrofit:2.3.0\" level=\"project\" />\n    <orderEntry type=\"library\" name=\"Maven: com.squareup.retrofit2:converter-simplexml:2.3.0\" level=\"project\" />\n    <orderEntry type=\"library\" name=\"Maven: org.simpleframework:simple-xml:2.7.1\" level=\"project\" />\n    <orderEntry type=\"library\" name=\"Maven: stax:stax-api:1.0.1\" level=\"project\" />\n    <orderEntry type=\"library\" name=\"Maven: stax:stax:1.2.0\" level=\"project\" />\n    <orderEntry type=\"library\" name=\"Maven: xpp3:xpp3:1.1.3.3\" level=\"project\" />\n    <orderEntry type=\"library\" name=\"Maven: com.squareup.okhttp3:logging-interceptor:3.8.0\" level=\"project\" />\n    <orderEntry type=\"library\" name=\"Maven: com.alipay.sdk:alipay-sdk-java:3.3.49.ALL\" level=\"project\" />\n  </component>\n</module>"
  },
  {
    "path": "src/main/java/com/baidu/ueditor/ActionEnter.java",
    "content": "package com.baidu.ueditor;\n\nimport java.util.Map;\n\nimport javax.servlet.http.HttpServletRequest;\n\nimport com.baidu.ueditor.define.ActionMap;\nimport com.baidu.ueditor.define.AppInfo;\nimport com.baidu.ueditor.define.BaseState;\nimport com.baidu.ueditor.define.State;\nimport com.baidu.ueditor.hunter.FileManager;\nimport com.baidu.ueditor.hunter.ImageHunter;\nimport com.baidu.ueditor.upload.Uploader;\n\npublic class ActionEnter {\n\t\n\tprivate HttpServletRequest request = null;\n\t\n\tprivate String rootPath = null;\n\tprivate String contextPath = null;\n\t\n\tprivate String actionType = null;\n\t\n\tprivate ConfigManager configManager = null;\n\n\tpublic ActionEnter ( HttpServletRequest request, String rootPath ) {\n\t\t\n\t\tthis.request = request;\n\t\tthis.rootPath = rootPath;\n\t\tthis.actionType = request.getParameter( \"action\" );\n\t\tthis.contextPath = request.getContextPath();\n\t\tthis.configManager = ConfigManager.getInstance( this.rootPath, this.contextPath, request.getRequestURI() );\n\t\t\n\t}\n\t\n\tpublic String exec () {\n\t\t\n\t\tString callbackName = this.request.getParameter(\"callback\");\n\t\t\n\t\tif ( callbackName != null ) {\n\n\t\t\tif ( !validCallbackName( callbackName ) ) {\n\t\t\t\treturn new BaseState( false, AppInfo.ILLEGAL ).toJSONString();\n\t\t\t}\n\t\t\t\n\t\t\treturn callbackName+\"(\"+this.invoke()+\");\";\n\t\t\t\n\t\t} else {\n\t\t\treturn this.invoke();\n\t\t}\n\n\t}\n\t\n\tpublic String invoke() {\n\t\t\n\t\tif ( actionType == null || !ActionMap.mapping.containsKey( actionType ) ) {\n\t\t\treturn new BaseState( false, AppInfo.INVALID_ACTION ).toJSONString();\n\t\t}\n\t\t\n\t\tif ( this.configManager == null || !this.configManager.valid() ) {\n\t\t\treturn new BaseState( false, AppInfo.CONFIG_ERROR ).toJSONString();\n\t\t}\n\t\t\n\t\tState state = null;\n\t\t\n\t\tint actionCode = ActionMap.getType( this.actionType );\n\t\t\n\t\tMap<String, Object> conf = null;\n\t\t\n\t\tswitch ( actionCode ) {\n\t\t\n\t\t\tcase ActionMap.CONFIG:\n\t\t\t\treturn this.configManager.getAllConfig().toString();\n\t\t\t\t\n\t\t\tcase ActionMap.UPLOAD_IMAGE:\n\t\t\tcase ActionMap.UPLOAD_SCRAWL:\n\t\t\tcase ActionMap.UPLOAD_VIDEO:\n\t\t\tcase ActionMap.UPLOAD_FILE:\n\t\t\t\tconf = this.configManager.getConfig( actionCode );\n\t\t\t\tstate = new Uploader( request, conf ).doExec();\n\t\t\t\tbreak;\n\t\t\t\t\n\t\t\tcase ActionMap.CATCH_IMAGE:\n\t\t\t\tconf = configManager.getConfig( actionCode );\n\t\t\t\tString[] list = this.request.getParameterValues( (String)conf.get( \"fieldName\" ) );\n\t\t\t\tstate = new ImageHunter( conf ).capture( list );\n\t\t\t\tbreak;\n\t\t\t\t\n\t\t\tcase ActionMap.LIST_IMAGE:\n\t\t\tcase ActionMap.LIST_FILE:\n\t\t\t\tconf = configManager.getConfig( actionCode );\n\t\t\t\tint start = this.getStartIndex();\n\t\t\t\tstate = new FileManager( conf ).listFile( start );\n\t\t\t\tbreak;\n\t\t\t\t\n\t\t}\n\t\t\n\t\treturn state.toJSONString();\n\t\t\n\t}\n\t\n\tpublic int getStartIndex () {\n\t\t\n\t\tString start = this.request.getParameter( \"start\" );\n\t\t\n\t\ttry {\n\t\t\treturn Integer.parseInt( start );\n\t\t} catch ( Exception e ) {\n\t\t\treturn 0;\n\t\t}\n\t\t\n\t}\n\t\n\t/**\n\t * callback参数验证\n\t */\n\tpublic boolean validCallbackName ( String name ) {\n\t\t\n\t\tif ( name.matches( \"^[a-zA-Z_]+[\\\\w0-9_]*$\" ) ) {\n\t\t\treturn true;\n\t\t}\n\t\t\n\t\treturn false;\n\t\t\n\t}\n\t\n}"
  },
  {
    "path": "src/main/java/com/baidu/ueditor/ConfigManager.java",
    "content": "package com.baidu.ueditor;\n\nimport java.io.BufferedReader;\nimport java.io.File;\nimport java.io.FileInputStream;\nimport java.io.FileNotFoundException;\nimport java.io.IOException;\nimport java.io.InputStreamReader;\nimport java.io.UnsupportedEncodingException;\nimport java.util.HashMap;\nimport java.util.Map;\n\nimport org.json.JSONArray;\nimport org.json.JSONObject;\n\nimport com.baidu.ueditor.define.ActionMap;\n\n/**\n * 配置管理器\n * @author hancong03@baidu.com\n *\n */\npublic final class ConfigManager {\n\n\tprivate final String rootPath;\n\tprivate final String originalPath;\n\tprivate final String contextPath;\n\tprivate static final String configFileName = \"config.json\";\n\tprivate String parentPath = null;\n\tprivate JSONObject jsonConfig = null;\n\t// 涂鸦上传filename定义\n\tprivate final static String SCRAWL_FILE_NAME = \"scrawl\";\n\t// 远程图片抓取filename定义\n\tprivate final static String REMOTE_FILE_NAME = \"remote\";\n\t\n\t/*\n\t * 通过一个给定的路径构建一个配置管理器， 该管理器要求地址路径所在目录下必须存在config.properties文件\n\t */\n\tprivate ConfigManager ( String rootPath, String contextPath, String uri ) throws FileNotFoundException, IOException {\n\t\t\n\t\trootPath = rootPath.replace( \"\\\\\", \"/\" );\n\t\t\n\t\tthis.rootPath = rootPath;\n\t\tthis.contextPath = contextPath;\n\t\t\n//\t\tif ( contextPath.length() > 0 ) {\n//\t\t\tthis.originalPath = this.rootPath + uri.substring( contextPath.length() );\n//\t\t} else {\n//\t\t\tthis.originalPath = this.rootPath + uri;\n//\t\t}\n\t\tthis.originalPath = \"src/main/resources/config.json\";\n\t\tthis.initEnv();\n\t\t\n\t}\n\t\n\t/**\n\t * 配置管理器构造工厂\n\t * @param rootPath 服务器根路径\n\t * @param contextPath 服务器所在项目路径\n\t * @param uri 当前访问的uri\n\t * @return 配置管理器实例或者null\n\t */\n\tpublic static ConfigManager getInstance ( String rootPath, String contextPath, String uri ) {\n\t\t\n\t\ttry {\n\t\t\treturn new ConfigManager(rootPath, contextPath, uri);\n\t\t} catch ( Exception e ) {\n\t\t\treturn null;\n\t\t}\n\t\t\n\t}\n\t\n\t// 验证配置文件加载是否正确\n\tpublic boolean valid () {\n\t\treturn this.jsonConfig != null;\n\t}\n\t\n\tpublic JSONObject getAllConfig () {\n\t\t\n\t\treturn this.jsonConfig;\n\t\t\n\t}\n\t\n\tpublic Map<String, Object> getConfig ( int type ) {\n\t\t\n\t\tMap<String, Object> conf = new HashMap<String, Object>();\n\t\tString savePath = null;\n\t\t\n\t\tswitch ( type ) {\n\t\t\n\t\t\tcase ActionMap.UPLOAD_FILE:\n\t\t\t\tconf.put( \"isBase64\", \"false\" );\n\t\t\t\tconf.put( \"maxSize\", this.jsonConfig.getLong( \"fileMaxSize\" ) );\n\t\t\t\tconf.put( \"allowFiles\", this.getArray( \"fileAllowFiles\" ) );\n\t\t\t\tconf.put( \"fieldName\", this.jsonConfig.getString( \"fileFieldName\" ) );\n\t\t\t\tsavePath = this.jsonConfig.getString( \"filePathFormat\" );\n\t\t\t\tbreak;\n\t\t\t\t\n\t\t\tcase ActionMap.UPLOAD_IMAGE:\n\t\t\t\tconf.put( \"isBase64\", \"false\" );\n\t\t\t\tconf.put( \"maxSize\", this.jsonConfig.getLong( \"imageMaxSize\" ) );\n\t\t\t\tconf.put( \"allowFiles\", this.getArray( \"imageAllowFiles\" ) );\n\t\t\t\tconf.put( \"fieldName\", this.jsonConfig.getString( \"imageFieldName\" ) );\n\t\t\t\tsavePath = this.jsonConfig.getString( \"imagePathFormat\" );\n\t\t\t\tbreak;\n\t\t\t\t\n\t\t\tcase ActionMap.UPLOAD_VIDEO:\n\t\t\t\tconf.put( \"maxSize\", this.jsonConfig.getLong( \"videoMaxSize\" ) );\n\t\t\t\tconf.put( \"allowFiles\", this.getArray( \"videoAllowFiles\" ) );\n\t\t\t\tconf.put( \"fieldName\", this.jsonConfig.getString( \"videoFieldName\" ) );\n\t\t\t\tsavePath = this.jsonConfig.getString( \"videoPathFormat\" );\n\t\t\t\tbreak;\n\t\t\t\t\n\t\t\tcase ActionMap.UPLOAD_SCRAWL:\n\t\t\t\tconf.put( \"filename\", ConfigManager.SCRAWL_FILE_NAME );\n\t\t\t\tconf.put( \"maxSize\", this.jsonConfig.getLong( \"scrawlMaxSize\" ) );\n\t\t\t\tconf.put( \"fieldName\", this.jsonConfig.getString( \"scrawlFieldName\" ) );\n\t\t\t\tconf.put( \"isBase64\", \"true\" );\n\t\t\t\tsavePath = this.jsonConfig.getString( \"scrawlPathFormat\" );\n\t\t\t\tbreak;\n\t\t\t\t\n\t\t\tcase ActionMap.CATCH_IMAGE:\n\t\t\t\tconf.put( \"filename\", ConfigManager.REMOTE_FILE_NAME );\n\t\t\t\tconf.put( \"filter\", this.getArray( \"catcherLocalDomain\" ) );\n\t\t\t\tconf.put( \"maxSize\", this.jsonConfig.getLong( \"catcherMaxSize\" ) );\n\t\t\t\tconf.put( \"allowFiles\", this.getArray( \"catcherAllowFiles\" ) );\n\t\t\t\tconf.put( \"fieldName\", this.jsonConfig.getString( \"catcherFieldName\" ) + \"[]\" );\n\t\t\t\tsavePath = this.jsonConfig.getString( \"catcherPathFormat\" );\n\t\t\t\tbreak;\n\t\t\t\t\n\t\t\tcase ActionMap.LIST_IMAGE:\n\t\t\t\tconf.put( \"allowFiles\", this.getArray( \"imageManagerAllowFiles\" ) );\n\t\t\t\tconf.put( \"dir\", this.jsonConfig.getString( \"imageManagerListPath\" ) );\n\t\t\t\tconf.put( \"count\", this.jsonConfig.getInt( \"imageManagerListSize\" ) );\n\t\t\t\tbreak;\n\t\t\t\t\n\t\t\tcase ActionMap.LIST_FILE:\n\t\t\t\tconf.put( \"allowFiles\", this.getArray( \"fileManagerAllowFiles\" ) );\n\t\t\t\tconf.put( \"dir\", this.jsonConfig.getString( \"fileManagerListPath\" ) );\n\t\t\t\tconf.put( \"count\", this.jsonConfig.getInt( \"fileManagerListSize\" ) );\n\t\t\t\tbreak;\n\t\t\t\t\n\t\t}\n\t\t\n\t\tconf.put( \"savePath\", savePath );\n\t\tconf.put( \"rootPath\", this.rootPath );\n\t\t\n\t\treturn conf;\n\t\t\n\t}\n\t\n\tprivate void initEnv () throws FileNotFoundException, IOException {\n\t\t\n\t\tFile file = new File( this.originalPath );\n\t\t\n\t\tif ( !file.isAbsolute() ) {\n\t\t\tfile = new File( file.getAbsolutePath() );\n\t\t}\n\t\t\n\t\tthis.parentPath = file.getParent();\n\t\t\n\t\tString configContent = this.readFile( this.getConfigPath() );\n\t\t\n\t\ttry{\n\t\t\tJSONObject jsonConfig = new JSONObject( configContent );\n\t\t\tthis.jsonConfig = jsonConfig;\n\t\t} catch ( Exception e ) {\n\t\t\tthis.jsonConfig = null;\n\t\t}\n\t\t\n\t}\n\t\n\tprivate String getConfigPath () {\n\t\treturn this.parentPath + File.separator + ConfigManager.configFileName;\n\t}\n\n\tprivate String[] getArray ( String key ) {\n\t\t\n\t\tJSONArray jsonArray = this.jsonConfig.getJSONArray( key );\n\t\tString[] result = new String[ jsonArray.length() ];\n\t\t\n\t\tfor ( int i = 0, len = jsonArray.length(); i < len; i++ ) {\n\t\t\tresult[i] = jsonArray.getString( i );\n\t\t}\n\t\t\n\t\treturn result;\n\t\t\n\t}\n\t\n\tprivate String readFile ( String path ) throws IOException {\n\t\t\n\t\tStringBuilder builder = new StringBuilder();\n\t\t\n\t\ttry {\n\t\t\t\n\t\t\tInputStreamReader reader = new InputStreamReader( new FileInputStream( path ), \"UTF-8\" );\n\t\t\tBufferedReader bfReader = new BufferedReader( reader );\n\t\t\t\n\t\t\tString tmpContent = null;\n\t\t\t\n\t\t\twhile ( ( tmpContent = bfReader.readLine() ) != null ) {\n\t\t\t\tbuilder.append( tmpContent );\n\t\t\t}\n\t\t\t\n\t\t\tbfReader.close();\n\t\t\t\n\t\t} catch ( UnsupportedEncodingException e ) {\n\t\t\t// 忽略\n\t\t}\n\t\t\n\t\treturn this.filter( builder.toString() );\n\t\t\n\t}\n\t\n\t// 过滤输入字符串, 剔除多行注释以及替换掉反斜杠\n\tprivate String filter ( String input ) {\n\t\t\n\t\treturn input.replaceAll( \"/\\\\*[\\\\s\\\\S]*?\\\\*/\", \"\" );\n\t\t\n\t}\n\t\n}\n"
  },
  {
    "path": "src/main/java/com/baidu/ueditor/Encoder.java",
    "content": "package com.baidu.ueditor;\n\npublic class Encoder {\n\n\tpublic static String toUnicode ( String input ) {\n\t\t\n\t\tStringBuilder builder = new StringBuilder();\n\t\tchar[] chars = input.toCharArray();\n\t\t\n\t\tfor ( char ch : chars ) {\n\t\t\t\n\t\t\tif ( ch < 256 ) {\n\t\t\t\tbuilder.append( ch );\n\t\t\t} else {\n\t\t\t\tbuilder.append( \"\\\\u\" +  Integer.toHexString( ch& 0xffff ) );\n\t\t\t}\n\t\t\t\n\t\t}\n\t\t\n\t\treturn builder.toString();\n\t\t\n\t}\n\t\n}"
  },
  {
    "path": "src/main/java/com/baidu/ueditor/PathFormat.java",
    "content": "package com.baidu.ueditor;\n\nimport java.text.SimpleDateFormat;\nimport java.util.Date;\nimport java.util.regex.Matcher;\nimport java.util.regex.Pattern;\n\npublic class PathFormat {\n\t\n\tprivate static final String TIME = \"time\";\n\tprivate static final String FULL_YEAR = \"yyyy\";\n\tprivate static final String YEAR = \"yy\";\n\tprivate static final String MONTH = \"mm\";\n\tprivate static final String DAY = \"dd\";\n\tprivate static final String HOUR = \"hh\";\n\tprivate static final String MINUTE = \"ii\";\n\tprivate static final String SECOND = \"ss\";\n\tprivate static final String RAND = \"rand\";\n\t\n\tprivate static Date currentDate = null;\n\t\n\tpublic static String parse ( String input ) {\n\t\t\n\t\tPattern pattern = Pattern.compile( \"\\\\{([^\\\\}]+)\\\\}\", Pattern.CASE_INSENSITIVE  );\n\t\tMatcher matcher = pattern.matcher(input);\n\t\t\n\t\tPathFormat.currentDate = new Date();\n\t\t\n\t\tStringBuffer sb = new StringBuffer();\n\t\t\n\t\twhile ( matcher.find() ) {\n\t\t\t\n\t\t\tmatcher.appendReplacement(sb, PathFormat.getString( matcher.group( 1 ) ) );\n\t\t\t\n\t\t}\n\t\t\n\t\tmatcher.appendTail(sb);\n\t\t\n\t\treturn sb.toString();\n\t}\n\t\n\t/**\n\t * 格式化路径, 把windows路径替换成标准路径\n\t * @param input 待格式化的路径\n\t * @return 格式化后的路径\n\t */\n\tpublic static String format ( String input ) {\n\t\t\n\t\treturn input.replace( \"\\\\\", \"/\" );\n\t\t\n\t}\n\n\tpublic static String parse ( String input, String filename ) {\n\t\n\t\tPattern pattern = Pattern.compile( \"\\\\{([^\\\\}]+)\\\\}\", Pattern.CASE_INSENSITIVE  );\n\t\tMatcher matcher = pattern.matcher(input);\n\t\tString matchStr = null;\n\t\t\n\t\tPathFormat.currentDate = new Date();\n\t\t\n\t\tStringBuffer sb = new StringBuffer();\n\t\t\n\t\twhile ( matcher.find() ) {\n\t\t\t\n\t\t\tmatchStr = matcher.group( 1 );\n\t\t\tif ( matchStr.indexOf( \"filename\" ) != -1 ) {\n\t\t\t\tfilename = filename.replace( \"$\", \"\\\\$\" ).replaceAll( \"[\\\\/:*?\\\"<>|]\", \"\" );\n\t\t\t\tmatcher.appendReplacement(sb, filename );\n\t\t\t} else {\n\t\t\t\tmatcher.appendReplacement(sb, PathFormat.getString( matchStr ) );\n\t\t\t}\n\t\t\t\n\t\t}\n\t\t\n\t\tmatcher.appendTail(sb);\n\t\t\n\t\treturn sb.toString();\n\t}\n\t\t\n\tprivate static String getString ( String pattern ) {\n\t\t\n\t\tpattern = pattern.toLowerCase();\n\t\t\n\t\t// time 处理\n\t\tif ( pattern.indexOf( PathFormat.TIME ) != -1 ) {\n\t\t\treturn PathFormat.getTimestamp();\n\t\t} else if ( pattern.indexOf( PathFormat.FULL_YEAR ) != -1 ) {\n\t\t\treturn PathFormat.getFullYear();\n\t\t} else if ( pattern.indexOf( PathFormat.YEAR ) != -1 ) {\n\t\t\treturn PathFormat.getYear();\n\t\t} else if ( pattern.indexOf( PathFormat.MONTH ) != -1 ) {\n\t\t\treturn PathFormat.getMonth();\n\t\t} else if ( pattern.indexOf( PathFormat.DAY ) != -1 ) {\n\t\t\treturn PathFormat.getDay();\n\t\t} else if ( pattern.indexOf( PathFormat.HOUR ) != -1 ) {\n\t\t\treturn PathFormat.getHour();\n\t\t} else if ( pattern.indexOf( PathFormat.MINUTE ) != -1 ) {\n\t\t\treturn PathFormat.getMinute();\n\t\t} else if ( pattern.indexOf( PathFormat.SECOND ) != -1 ) {\n\t\t\treturn PathFormat.getSecond();\n\t\t} else if ( pattern.indexOf( PathFormat.RAND ) != -1 ) {\n\t\t\treturn PathFormat.getRandom( pattern );\n\t\t}\n\t\t\n\t\treturn pattern;\n\t\t\n\t}\n\n\tprivate static String getTimestamp () {\n\t\treturn System.currentTimeMillis() + \"\";\n\t}\n\t\n\tprivate static String getFullYear () {\n\t\treturn new SimpleDateFormat( \"yyyy\" ).format( PathFormat.currentDate );\n\t}\n\t\n\tprivate static String getYear () {\n\t\treturn new SimpleDateFormat( \"yy\" ).format( PathFormat.currentDate );\n\t}\n\t\n\tprivate static String getMonth () {\n\t\treturn new SimpleDateFormat( \"MM\" ).format( PathFormat.currentDate );\n\t}\n\t\n\tprivate static String getDay () {\n\t\treturn new SimpleDateFormat( \"dd\" ).format( PathFormat.currentDate );\n\t}\n\t\n\tprivate static String getHour () {\n\t\treturn new SimpleDateFormat( \"HH\" ).format( PathFormat.currentDate );\n\t}\n\t\n\tprivate static String getMinute () {\n\t\treturn new SimpleDateFormat( \"mm\" ).format( PathFormat.currentDate );\n\t}\n\t\n\tprivate static String getSecond () {\n\t\treturn new SimpleDateFormat( \"ss\" ).format( PathFormat.currentDate );\n\t}\n\t\n\tprivate static String getRandom ( String pattern ) {\n\t\t\n\t\tint length = 0;\n\t\tpattern = pattern.split( \":\" )[ 1 ].trim();\n\t\t\n\t\tlength = Integer.parseInt( pattern );\n\t\t\n\t\treturn ( Math.random() + \"\" ).replace( \".\", \"\" ).substring( 0, length );\n\t\t\n\t}\n\n\tpublic static void main(String[] args) {\n\t\t// TODO Auto-generated method stub\n\n\t}\n\n}\n"
  },
  {
    "path": "src/main/java/com/baidu/ueditor/define/ActionMap.java",
    "content": "package com.baidu.ueditor.define;\n\nimport java.util.Map;\nimport java.util.HashMap;\n\n/**\n * 定义请求action类型\n * @author hancong03@baidu.com\n *\n */\n@SuppressWarnings(\"serial\")\npublic final class ActionMap {\n\n\tpublic static final Map<String, Integer> mapping;\n\t// 获取配置请求\n\tpublic static final int CONFIG = 0;\n\tpublic static final int UPLOAD_IMAGE = 1;\n\tpublic static final int UPLOAD_SCRAWL = 2;\n\tpublic static final int UPLOAD_VIDEO = 3;\n\tpublic static final int UPLOAD_FILE = 4;\n\tpublic static final int CATCH_IMAGE = 5;\n\tpublic static final int LIST_FILE = 6;\n\tpublic static final int LIST_IMAGE = 7;\n\t\n\tstatic {\n\t\tmapping = new HashMap<String, Integer>(){{\n\t\t\tput( \"config\", ActionMap.CONFIG );\n\t\t\tput( \"uploadimage\", ActionMap.UPLOAD_IMAGE );\n\t\t\tput( \"uploadscrawl\", ActionMap.UPLOAD_SCRAWL );\n\t\t\tput( \"uploadvideo\", ActionMap.UPLOAD_VIDEO );\n\t\t\tput( \"uploadfile\", ActionMap.UPLOAD_FILE );\n\t\t\tput( \"catchimage\", ActionMap.CATCH_IMAGE );\n\t\t\tput( \"listfile\", ActionMap.LIST_FILE );\n\t\t\tput( \"listimage\", ActionMap.LIST_IMAGE );\n\t\t}};\n\t}\n\t\n\tpublic static int getType ( String key ) {\n\t\treturn ActionMap.mapping.get( key );\n\t}\n\t\n}\n"
  },
  {
    "path": "src/main/java/com/baidu/ueditor/define/ActionState.java",
    "content": "package com.baidu.ueditor.define;\n\npublic enum ActionState {\n\tUNKNOW_ERROR\n}\n"
  },
  {
    "path": "src/main/java/com/baidu/ueditor/define/AppInfo.java",
    "content": "package com.baidu.ueditor.define;\n\nimport java.util.HashMap;\nimport java.util.Map;\n\npublic final class AppInfo {\n\t\n\tpublic static final int SUCCESS = 0;\n\tpublic static final int MAX_SIZE = 1;\n\tpublic static final int PERMISSION_DENIED = 2;\n\tpublic static final int FAILED_CREATE_FILE = 3;\n\tpublic static final int IO_ERROR = 4;\n\tpublic static final int NOT_MULTIPART_CONTENT = 5;\n\tpublic static final int PARSE_REQUEST_ERROR = 6;\n\tpublic static final int NOTFOUND_UPLOAD_DATA = 7;\n\tpublic static final int NOT_ALLOW_FILE_TYPE = 8;\n\t\n\tpublic static final int INVALID_ACTION = 101;\n\tpublic static final int CONFIG_ERROR = 102;\n\t\n\tpublic static final int PREVENT_HOST = 201;\n\tpublic static final int CONNECTION_ERROR = 202;\n\tpublic static final int REMOTE_FAIL = 203;\n\t\n\tpublic static final int NOT_DIRECTORY = 301;\n\tpublic static final int NOT_EXIST = 302;\n\t\n\tpublic static final int ILLEGAL = 401;\n\n\tpublic static Map<Integer, String> info = new HashMap<Integer, String>(){{\n\t\t\n\t\tput( AppInfo.SUCCESS, \"SUCCESS\" );\n\t\t\n\t\t// 无效的Action\n\t\tput( AppInfo.INVALID_ACTION, \"\\u65E0\\u6548\\u7684Action\" );\n\t\t// 配置文件初始化失败\n\t\tput( AppInfo.CONFIG_ERROR, \"\\u914D\\u7F6E\\u6587\\u4EF6\\u521D\\u59CB\\u5316\\u5931\\u8D25\" );\n\t\t// 抓取远程图片失败\n\t\tput( AppInfo.REMOTE_FAIL, \"\\u6293\\u53D6\\u8FDC\\u7A0B\\u56FE\\u7247\\u5931\\u8D25\" );\n\t\t\n\t\t// 被阻止的远程主机\n\t\tput( AppInfo.PREVENT_HOST, \"\\u88AB\\u963B\\u6B62\\u7684\\u8FDC\\u7A0B\\u4E3B\\u673A\" );\n\t\t// 远程连接出错\n\t\tput( AppInfo.CONNECTION_ERROR, \"\\u8FDC\\u7A0B\\u8FDE\\u63A5\\u51FA\\u9519\" );\n\t\t\n\t\t// \"文件大小超出限制\"\n\t\tput( AppInfo.MAX_SIZE, \"\\u6587\\u4ef6\\u5927\\u5c0f\\u8d85\\u51fa\\u9650\\u5236\" );\n\t\t// 权限不足， 多指写权限\n\t\tput( AppInfo.PERMISSION_DENIED, \"\\u6743\\u9650\\u4E0D\\u8DB3\" );\n\t\t// 创建文件失败\n\t\tput( AppInfo.FAILED_CREATE_FILE, \"\\u521B\\u5EFA\\u6587\\u4EF6\\u5931\\u8D25\" );\n\t\t// IO错误\n\t\tput( AppInfo.IO_ERROR, \"IO\\u9519\\u8BEF\" );\n\t\t// 上传表单不是multipart/form-data类型\n\t\tput( AppInfo.NOT_MULTIPART_CONTENT, \"\\u4E0A\\u4F20\\u8868\\u5355\\u4E0D\\u662Fmultipart/form-data\\u7C7B\\u578B\" );\n\t\t// 解析上传表单错误\n\t\tput( AppInfo.PARSE_REQUEST_ERROR, \"\\u89E3\\u6790\\u4E0A\\u4F20\\u8868\\u5355\\u9519\\u8BEF\" );\n\t\t// 未找到上传数据\n\t\tput( AppInfo.NOTFOUND_UPLOAD_DATA, \"\\u672A\\u627E\\u5230\\u4E0A\\u4F20\\u6570\\u636E\" );\n\t\t// 不允许的文件类型\n\t\tput( AppInfo.NOT_ALLOW_FILE_TYPE, \"\\u4E0D\\u5141\\u8BB8\\u7684\\u6587\\u4EF6\\u7C7B\\u578B\" );\n\t\t\n\t\t// 指定路径不是目录\n\t\tput( AppInfo.NOT_DIRECTORY, \"\\u6307\\u5B9A\\u8DEF\\u5F84\\u4E0D\\u662F\\u76EE\\u5F55\" );\n\t\t// 指定路径并不存在\n\t\tput( AppInfo.NOT_EXIST, \"\\u6307\\u5B9A\\u8DEF\\u5F84\\u5E76\\u4E0D\\u5B58\\u5728\" );\n\t\t\n\t\t// callback参数名不合法\n\t\tput( AppInfo.ILLEGAL, \"Callback\\u53C2\\u6570\\u540D\\u4E0D\\u5408\\u6CD5\" );\n\t\t\n\t}};\n\t\n\tpublic static String getStateInfo ( int key ) {\n\t\treturn AppInfo.info.get( key );\n\t}\n\t\n}\n"
  },
  {
    "path": "src/main/java/com/baidu/ueditor/define/BaseState.java",
    "content": "package com.baidu.ueditor.define;\n\nimport java.util.HashMap;\nimport java.util.Iterator;\nimport java.util.Map;\n\nimport com.baidu.ueditor.Encoder;\n\npublic class BaseState implements State {\n\n\tprivate boolean state = false;\n\tprivate String info = null;\n\t\n\tprivate Map<String, String> infoMap = new HashMap<String, String>();\n\t\n\tpublic BaseState () {\n\t\tthis.state = true;\n\t}\n\t\n\tpublic BaseState ( boolean state ) {\n\t\tthis.setState( state );\n\t}\n\t\n\tpublic BaseState ( boolean state, String info ) {\n\t\tthis.setState( state );\n\t\tthis.info = info;\n\t}\n\t\n\tpublic BaseState ( boolean state, int infoCode ) {\n\t\tthis.setState( state );\n\t\tthis.info = AppInfo.getStateInfo( infoCode );\n\t}\n\t\n\tpublic boolean isSuccess () {\n\t\treturn this.state;\n\t}\n\t\n\tpublic void setState ( boolean state ) {\n\t\tthis.state = state;\n\t}\n\t\n\tpublic void setInfo ( String info ) {\n\t\tthis.info = info;\n\t}\n\t\n\tpublic void setInfo ( int infoCode ) {\n\t\tthis.info = AppInfo.getStateInfo( infoCode );\n\t}\n\t\n\t@Override\n\tpublic String toJSONString() {\n\t\treturn this.toString();\n\t}\n\t\n\tpublic String toString () {\n\t\t\n\t\tString key = null;\n\t\tString stateVal = this.isSuccess() ? AppInfo.getStateInfo( AppInfo.SUCCESS ) : this.info;\n\t\t\n\t\tStringBuilder builder = new StringBuilder();\n\t\t\n\t\tbuilder.append( \"{\\\"state\\\": \\\"\" + stateVal + \"\\\"\" );\n\t\t\n\t\tIterator<String> iterator = this.infoMap.keySet().iterator();\n\t\t\n\t\twhile ( iterator.hasNext() ) {\n\t\t\t\n\t\t\tkey = iterator.next();\n\t\t\t\n\t\t\tbuilder.append( \",\\\"\" + key + \"\\\": \\\"\" + this.infoMap.get(key) + \"\\\"\" );\n\t\t\t\n\t\t}\n\t\t\n\t\tbuilder.append( \"}\" );\n\n\t\treturn Encoder.toUnicode( builder.toString() );\n\n\t}\n\n\t@Override\n\tpublic void putInfo(String name, String val) {\n\t\tthis.infoMap.put(name, val);\n\t}\n\n\t@Override\n\tpublic void putInfo(String name, long val) {\n\t\tthis.putInfo(name, val+\"\");\n\t}\n\n}\n"
  },
  {
    "path": "src/main/java/com/baidu/ueditor/define/FileType.java",
    "content": "package com.baidu.ueditor.define;\n\nimport java.util.HashMap;\nimport java.util.Map;\n\npublic class FileType {\n\n\tpublic static final String JPG = \"JPG\";\n\t\n\tprivate static final Map<String, String> types = new HashMap<String, String>(){{\n\t\t\n\t\tput( FileType.JPG, \".jpg\" );\n\t\t\n\t}};\n\t\n\tpublic static String getSuffix ( String key ) {\n\t\treturn FileType.types.get( key );\n\t}\n\t\n\t/**\n\t * 根据给定的文件名,获取其后缀信息\n\t * @param filename\n\t * @return\n\t */\n\tpublic static String getSuffixByFilename ( String filename ) {\n\t\t\n\t\treturn filename.substring( filename.lastIndexOf( \".\" ) ).toLowerCase();\n\t\t\n\t}\n\t\n}\n"
  },
  {
    "path": "src/main/java/com/baidu/ueditor/define/MIMEType.java",
    "content": "package com.baidu.ueditor.define;\n\nimport java.util.HashMap;\nimport java.util.Map;\n\npublic class MIMEType {\n\n\tpublic static final Map<String, String> types = new HashMap<String, String>(){{\n\t\tput( \"image/gif\", \".gif\" );\n\t\tput( \"image/jpeg\", \".jpg\" );\n\t\tput( \"image/jpg\", \".jpg\" );\n\t\tput( \"image/png\", \".png\" );\n\t\tput( \"image/bmp\", \".bmp\" );\n\t}};\n\t\n\tpublic static String getSuffix ( String mime ) {\n\t\treturn MIMEType.types.get( mime );\n\t}\n\t\n}\n"
  },
  {
    "path": "src/main/java/com/baidu/ueditor/define/MultiState.java",
    "content": "package com.baidu.ueditor.define;\n\nimport java.util.ArrayList;\nimport java.util.HashMap;\nimport java.util.Iterator;\nimport java.util.List;\nimport java.util.Map;\n\nimport com.baidu.ueditor.Encoder;\n\n/**\n * 多状态集合状态\n * 其包含了多个状态的集合, 其本身自己也是一个状态\n * @author hancong03@baidu.com\n *\n */\npublic class MultiState implements State {\n\n\tprivate boolean state = false;\n\tprivate String info = null;\n\tprivate Map<String, Long> intMap = new HashMap<String, Long>();\n\tprivate Map<String, String> infoMap = new HashMap<String, String>();\n\tprivate List<String> stateList = new ArrayList<String>();\n\t\n\tpublic MultiState ( boolean state ) {\n\t\tthis.state = state;\n\t}\n\t\n\tpublic MultiState ( boolean state, String info ) {\n\t\tthis.state = state;\n\t\tthis.info = info;\n\t}\n\t\n\tpublic MultiState ( boolean state, int infoKey ) {\n\t\tthis.state = state;\n\t\tthis.info = AppInfo.getStateInfo( infoKey );\n\t}\n\t\n\t@Override\n\tpublic boolean isSuccess() {\n\t\treturn this.state;\n\t}\n\t\n\tpublic void addState ( State state ) {\n\t\tstateList.add( state.toJSONString() );\n\t}\n\n\t/**\n\t * 该方法调用无效果\n\t */\n\t@Override\n\tpublic void putInfo(String name, String val) {\n\t\tthis.infoMap.put(name, val);\n\t}\n\n\t@Override\n\tpublic String toJSONString() {\n\t\t\n\t\tString stateVal = this.isSuccess() ? AppInfo.getStateInfo( AppInfo.SUCCESS ) : this.info;\n\t\t\n\t\tStringBuilder builder = new StringBuilder();\n\t\t\n\t\tbuilder.append( \"{\\\"state\\\": \\\"\" + stateVal + \"\\\"\" );\n\t\t\n\t\t// 数字转换\n\t\tIterator<String> iterator = this.intMap.keySet().iterator();\n\t\t\n\t\twhile ( iterator.hasNext() ) {\n\t\t\t\n\t\t\tstateVal = iterator.next();\n\t\t\t\n\t\t\tbuilder.append( \",\\\"\"+ stateVal +\"\\\": \" + this.intMap.get( stateVal ) );\n\t\t\t\n\t\t}\n\t\t\n\t\titerator = this.infoMap.keySet().iterator();\n\t\t\n\t\twhile ( iterator.hasNext() ) {\n\t\t\t\n\t\t\tstateVal = iterator.next();\n\t\t\t\n\t\t\tbuilder.append( \",\\\"\"+ stateVal +\"\\\": \\\"\" + this.infoMap.get( stateVal ) + \"\\\"\" );\n\t\t\t\n\t\t}\n\t\t\n\t\tbuilder.append( \", list: [\" );\n\t\t\n\t\t\n\t\titerator = this.stateList.iterator();\n\t\t\n\t\twhile ( iterator.hasNext() ) {\n\t\t\t\n\t\t\tbuilder.append( iterator.next() + \",\" );\n\t\t\t\n\t\t}\n\t\t\n\t\tif ( this.stateList.size() > 0 ) {\n\t\t\tbuilder.deleteCharAt( builder.length() - 1 );\n\t\t}\n\t\t\n\t\tbuilder.append( \" ]}\" );\n\n\t\treturn Encoder.toUnicode( builder.toString() );\n\n\t}\n\n\t@Override\n\tpublic void putInfo(String name, long val) {\n\t\tthis.intMap.put( name, val );\n\t}\n\n}\n"
  },
  {
    "path": "src/main/java/com/baidu/ueditor/define/State.java",
    "content": "package com.baidu.ueditor.define;\n\n/**\n * 处理状态接口\n * @author hancong03@baidu.com\n *\n */\npublic interface State {\n\t\n\tpublic boolean isSuccess();\n\t\n\tpublic void putInfo(String name, String val);\n\t\n\tpublic void putInfo(String name, long val);\n\t\n\tpublic String toJSONString();\n\n}\n"
  },
  {
    "path": "src/main/java/com/baidu/ueditor/hunter/FileManager.java",
    "content": "package com.baidu.ueditor.hunter;\n\nimport java.io.File;\nimport java.util.Arrays;\nimport java.util.Collection;\nimport java.util.Map;\n\nimport org.apache.commons.io.FileUtils;\n\nimport com.baidu.ueditor.PathFormat;\nimport com.baidu.ueditor.define.AppInfo;\nimport com.baidu.ueditor.define.BaseState;\nimport com.baidu.ueditor.define.MultiState;\nimport com.baidu.ueditor.define.State;\n\npublic class FileManager {\n\n\tprivate String dir = null;\n\tprivate String rootPath = null;\n\tprivate String[] allowFiles = null;\n\tprivate int count = 0;\n\t\n\tpublic FileManager ( Map<String, Object> conf ) {\n\n\t\tthis.rootPath = (String)conf.get( \"rootPath\" );\n\t\tthis.dir = this.rootPath + (String)conf.get( \"dir\" );\n\t\tthis.allowFiles = this.getAllowFiles( conf.get(\"allowFiles\") );\n\t\tthis.count = (Integer)conf.get( \"count\" );\n\t\t\n\t}\n\t\n\tpublic State listFile ( int index ) {\n\t\t\n\t\tFile dir = new File( this.dir );\n\t\tState state = null;\n\n\t\tif ( !dir.exists() ) {\n\t\t\treturn new BaseState( false, AppInfo.NOT_EXIST );\n\t\t}\n\t\t\n\t\tif ( !dir.isDirectory() ) {\n\t\t\treturn new BaseState( false, AppInfo.NOT_DIRECTORY );\n\t\t}\n\t\t\n\t\tCollection<File> list = FileUtils.listFiles( dir, this.allowFiles, true );\n\t\t\n\t\tif ( index < 0 || index > list.size() ) {\n\t\t\tstate = new MultiState( true );\n\t\t} else {\n\t\t\tObject[] fileList = Arrays.copyOfRange( list.toArray(), index, index + this.count );\n\t\t\tstate = this.getState( fileList );\n\t\t}\n\t\t\n\t\tstate.putInfo( \"start\", index );\n\t\tstate.putInfo( \"total\", list.size() );\n\t\t\n\t\treturn state;\n\t\t\n\t}\n\t\n\tprivate State getState ( Object[] files ) {\n\t\t\n\t\tMultiState state = new MultiState( true );\n\t\tBaseState fileState = null;\n\t\t\n\t\tFile file = null;\n\t\t\n\t\tfor ( Object obj : files ) {\n\t\t\tif ( obj == null ) {\n\t\t\t\tbreak;\n\t\t\t}\n\t\t\tfile = (File)obj;\n\t\t\tfileState = new BaseState( true );\n\t\t\tfileState.putInfo( \"url\", PathFormat.format( this.getPath( file ) ) );\n\t\t\tstate.addState( fileState );\n\t\t}\n\t\t\n\t\treturn state;\n\t\t\n\t}\n\t\n\tprivate String getPath ( File file ) {\n\t\t\n\t\tString path = file.getAbsolutePath();\n\t\t\n\t\treturn path.replace( this.rootPath, \"/\" );\n\t\t\n\t}\n\t\n\tprivate String[] getAllowFiles ( Object fileExt ) {\n\t\t\n\t\tString[] exts = null;\n\t\tString ext = null;\n\t\t\n\t\tif ( fileExt == null ) {\n\t\t\treturn new String[ 0 ];\n\t\t}\n\t\t\n\t\texts = (String[])fileExt;\n\t\t\n\t\tfor ( int i = 0, len = exts.length; i < len; i++ ) {\n\t\t\t\n\t\t\text = exts[ i ];\n\t\t\texts[ i ] = ext.replace( \".\", \"\" );\n\t\t\t\n\t\t}\n\t\t\n\t\treturn exts;\n\t\t\n\t}\n\t\n}\n"
  },
  {
    "path": "src/main/java/com/baidu/ueditor/hunter/ImageHunter.java",
    "content": "package com.baidu.ueditor.hunter;\n\nimport java.net.HttpURLConnection;\nimport java.net.InetAddress;\nimport java.net.URL;\nimport java.net.UnknownHostException;\nimport java.util.Arrays;\nimport java.util.List;\nimport java.util.Map;\n\nimport com.baidu.ueditor.PathFormat;\nimport com.baidu.ueditor.define.AppInfo;\nimport com.baidu.ueditor.define.BaseState;\nimport com.baidu.ueditor.define.MIMEType;\nimport com.baidu.ueditor.define.MultiState;\nimport com.baidu.ueditor.define.State;\nimport com.baidu.ueditor.upload.StorageManager;\n\n/**\n * 图片抓取器\n * @author hancong03@baidu.com\n *\n */\npublic class ImageHunter {\n\n\tprivate String filename = null;\n\tprivate String savePath = null;\n\tprivate String rootPath = null;\n\tprivate List<String> allowTypes = null;\n\tprivate long maxSize = -1;\n\t\n\tprivate List<String> filters = null;\n\t\n\tpublic ImageHunter ( Map<String, Object> conf ) {\n\t\t\n\t\tthis.filename = (String)conf.get( \"filename\" );\n\t\tthis.savePath = (String)conf.get( \"savePath\" );\n\t\tthis.rootPath = (String)conf.get( \"rootPath\" );\n\t\tthis.maxSize = (Long)conf.get( \"maxSize\" );\n\t\tthis.allowTypes = Arrays.asList( (String[])conf.get( \"allowFiles\" ) );\n\t\tthis.filters = Arrays.asList( (String[])conf.get( \"filter\" ) );\n\t\t\n\t}\n\t\n\tpublic State capture ( String[] list ) {\n\t\t\n\t\tMultiState state = new MultiState( true );\n\t\t\n\t\tfor ( String source : list ) {\n\t\t\tstate.addState( captureRemoteData( source ) );\n\t\t}\n\t\t\n\t\treturn state;\n\t\t\n\t}\n\n\tpublic State captureRemoteData ( String urlStr ) {\n\t\t\n\t\tHttpURLConnection connection = null;\n\t\tURL url = null;\n\t\tString suffix = null;\n\t\t\n\t\ttry {\n\t\t\turl = new URL( urlStr );\n\n\t\t\tif ( !validHost( url.getHost() ) ) {\n\t\t\t\treturn new BaseState( false, AppInfo.PREVENT_HOST );\n\t\t\t}\n\t\t\t\n\t\t\tconnection = (HttpURLConnection) url.openConnection();\n\t\t\n\t\t\tconnection.setInstanceFollowRedirects( true );\n\t\t\tconnection.setUseCaches( true );\n\t\t\n\t\t\tif ( !validContentState( connection.getResponseCode() ) ) {\n\t\t\t\treturn new BaseState( false, AppInfo.CONNECTION_ERROR );\n\t\t\t}\n\t\t\t\n\t\t\tsuffix = MIMEType.getSuffix( connection.getContentType() );\n\t\t\t\n\t\t\tif ( !validFileType( suffix ) ) {\n\t\t\t\treturn new BaseState( false, AppInfo.NOT_ALLOW_FILE_TYPE );\n\t\t\t}\n\t\t\t\n\t\t\tif ( !validFileSize( connection.getContentLength() ) ) {\n\t\t\t\treturn new BaseState( false, AppInfo.MAX_SIZE );\n\t\t\t}\n\t\t\t\n\t\t\tString savePath = this.getPath( this.savePath, this.filename, suffix );\n\t\t\tString physicalPath = this.rootPath + savePath;\n\n\t\t\tState state = StorageManager.saveFileByInputStream( connection.getInputStream(), physicalPath );\n\t\t\t\n\t\t\tif ( state.isSuccess() ) {\n\t\t\t\tstate.putInfo( \"url\", PathFormat.format( savePath ) );\n\t\t\t\tstate.putInfo( \"source\", urlStr );\n\t\t\t}\n\t\t\t\n\t\t\treturn state;\n\t\t\t\n\t\t} catch ( Exception e ) {\n\t\t\treturn new BaseState( false, AppInfo.REMOTE_FAIL );\n\t\t}\n\t\t\n\t}\n\t\n\tprivate String getPath ( String savePath, String filename, String suffix  ) {\n\t\t\n\t\treturn PathFormat.parse( savePath + suffix, filename );\n\t\t\n\t}\n\t\n\tprivate boolean validHost ( String hostname ) {\n\t\ttry {\n\t\t\tInetAddress ip = InetAddress.getByName(hostname);\n\t\t\t\n\t\t\tif (ip.isSiteLocalAddress()) {\n\t\t\t\treturn false;\n\t\t\t}\n\t\t} catch (UnknownHostException e) {\n\t\t\treturn false;\n\t\t}\n\t\t\n\t\treturn !filters.contains( hostname );\n\t\t\n\t}\n\t\n\tprivate boolean validContentState ( int code ) {\n\t\t\n\t\treturn HttpURLConnection.HTTP_OK == code;\n\t\t\n\t}\n\t\n\tprivate boolean validFileType ( String type ) {\n\t\t\n\t\treturn this.allowTypes.contains( type );\n\t\t\n\t}\n\t\n\tprivate boolean validFileSize ( int size ) {\n\t\treturn size < this.maxSize;\n\t}\n\t\n}\n"
  },
  {
    "path": "src/main/java/com/baidu/ueditor/upload/Base64Uploader.java",
    "content": "package com.baidu.ueditor.upload;\n\nimport com.baidu.ueditor.PathFormat;\nimport com.baidu.ueditor.define.AppInfo;\nimport com.baidu.ueditor.define.BaseState;\nimport com.baidu.ueditor.define.FileType;\nimport com.baidu.ueditor.define.State;\n\nimport java.util.Map;\n\nimport org.apache.commons.codec.binary.Base64;\n\npublic final class Base64Uploader {\n\n\tpublic static State save(String content, Map<String, Object> conf) {\n\t\t\n\t\tbyte[] data = decode(content);\n\n\t\tlong maxSize = ((Long) conf.get(\"maxSize\")).longValue();\n\n\t\tif (!validSize(data, maxSize)) {\n\t\t\treturn new BaseState(false, AppInfo.MAX_SIZE);\n\t\t}\n\n\t\tString suffix = FileType.getSuffix(\"JPG\");\n\n\t\tString savePath = PathFormat.parse((String) conf.get(\"savePath\"),\n\t\t\t\t(String) conf.get(\"filename\"));\n\t\t\n\t\tsavePath = savePath + suffix;\n\t\tString physicalPath = (String) conf.get(\"rootPath\") + savePath;\n\n\t\tState storageState = StorageManager.saveBinaryFile(data, physicalPath);\n\n\t\tif (storageState.isSuccess()) {\n\t\t\tstorageState.putInfo(\"url\", PathFormat.format(savePath));\n\t\t\tstorageState.putInfo(\"type\", suffix);\n\t\t\tstorageState.putInfo(\"original\", \"\");\n\t\t}\n\n\t\treturn storageState;\n\t}\n\n\tprivate static byte[] decode(String content) {\n\t\treturn Base64.decodeBase64(content);\n\t}\n\n\tprivate static boolean validSize(byte[] data, long length) {\n\t\treturn data.length <= length;\n\t}\n\t\n}"
  },
  {
    "path": "src/main/java/com/baidu/ueditor/upload/BinaryUploader.java",
    "content": "package com.baidu.ueditor.upload;\n\nimport com.baidu.ueditor.PathFormat;\nimport com.baidu.ueditor.define.AppInfo;\nimport com.baidu.ueditor.define.BaseState;\nimport com.baidu.ueditor.define.FileType;\nimport com.baidu.ueditor.define.State;\n\nimport java.io.IOException;\nimport java.io.InputStream;\nimport java.util.Arrays;\nimport java.util.List;\nimport java.util.Map;\n\nimport javax.servlet.http.HttpServletRequest;\n\nimport org.apache.commons.fileupload.FileItemIterator;\nimport org.apache.commons.fileupload.FileItemStream;\nimport org.apache.commons.fileupload.FileUploadException;\nimport org.apache.commons.fileupload.disk.DiskFileItemFactory;\nimport org.apache.commons.fileupload.servlet.ServletFileUpload;\n\npublic class BinaryUploader {\n\n\tpublic static final State save(HttpServletRequest request,\n\t\t\tMap<String, Object> conf) {\n\t\tFileItemStream fileStream = null;\n\t\tboolean isAjaxUpload = request.getHeader( \"X_Requested_With\" ) != null;\n\n\t\tif (!ServletFileUpload.isMultipartContent(request)) {\n\t\t\treturn new BaseState(false, AppInfo.NOT_MULTIPART_CONTENT);\n\t\t}\n\n\t\tServletFileUpload upload = new ServletFileUpload(\n\t\t\t\tnew DiskFileItemFactory());\n\n        if ( isAjaxUpload ) {\n            upload.setHeaderEncoding( \"UTF-8\" );\n        }\n\n\t\ttry {\n\t\t\tFileItemIterator iterator = upload.getItemIterator(request);\n\n\t\t\twhile (iterator.hasNext()) {\n\t\t\t\tfileStream = iterator.next();\n\n\t\t\t\tif (!fileStream.isFormField())\n\t\t\t\t\tbreak;\n\t\t\t\tfileStream = null;\n\t\t\t}\n\n\t\t\tif (fileStream == null) {\n\t\t\t\treturn new BaseState(false, AppInfo.NOTFOUND_UPLOAD_DATA);\n\t\t\t}\n\n\t\t\tString savePath = (String) conf.get(\"savePath\");\n\t\t\tString originFileName = fileStream.getName();\n\t\t\tString suffix = FileType.getSuffixByFilename(originFileName);\n\n\t\t\toriginFileName = originFileName.substring(0,\n\t\t\t\t\toriginFileName.length() - suffix.length());\n\t\t\tsavePath = savePath + suffix;\n\n\t\t\tlong maxSize = ((Long) conf.get(\"maxSize\")).longValue();\n\n\t\t\tif (!validType(suffix, (String[]) conf.get(\"allowFiles\"))) {\n\t\t\t\treturn new BaseState(false, AppInfo.NOT_ALLOW_FILE_TYPE);\n\t\t\t}\n\n\t\t\tsavePath = PathFormat.parse(savePath, originFileName);\n\n\t\t\tString physicalPath = (String) conf.get(\"rootPath\") + savePath;\n\n\t\t\tInputStream is = fileStream.openStream();\n\t\t\tState storageState = StorageManager.saveFileByInputStream(is,\n\t\t\t\t\tphysicalPath, maxSize);\n\t\t\tis.close();\n\n\t\t\tif (storageState.isSuccess()) {\n\t\t\t\tstorageState.putInfo(\"url\", PathFormat.format(savePath));\n\t\t\t\tstorageState.putInfo(\"type\", suffix);\n\t\t\t\tstorageState.putInfo(\"original\", originFileName + suffix);\n\t\t\t}\n\n\t\t\treturn storageState;\n\t\t} catch (FileUploadException e) {\n\t\t\treturn new BaseState(false, AppInfo.PARSE_REQUEST_ERROR);\n\t\t} catch (IOException e) {\n\t\t}\n\t\treturn new BaseState(false, AppInfo.IO_ERROR);\n\t}\n\n\tprivate static boolean validType(String type, String[] allowTypes) {\n\t\tList<String> list = Arrays.asList(allowTypes);\n\n\t\treturn list.contains(type);\n\t}\n}\n"
  },
  {
    "path": "src/main/java/com/baidu/ueditor/upload/StorageManager.java",
    "content": "package com.baidu.ueditor.upload;\n\nimport com.baidu.ueditor.define.AppInfo;\nimport com.baidu.ueditor.define.BaseState;\nimport com.baidu.ueditor.define.State;\n\nimport java.io.BufferedInputStream;\nimport java.io.BufferedOutputStream;\nimport java.io.File;\nimport java.io.FileOutputStream;\nimport java.io.IOException;\nimport java.io.InputStream;\n\nimport org.apache.commons.io.FileUtils;\n\npublic class StorageManager {\n\tpublic static final int BUFFER_SIZE = 8192;\n\n\tpublic StorageManager() {\n\t}\n\n\tpublic static State saveBinaryFile(byte[] data, String path) {\n\t\tFile file = new File(path);\n\n\t\tState state = valid(file);\n\n\t\tif (!state.isSuccess()) {\n\t\t\treturn state;\n\t\t}\n\n\t\ttry {\n\t\t\tBufferedOutputStream bos = new BufferedOutputStream(\n\t\t\t\t\tnew FileOutputStream(file));\n\t\t\tbos.write(data);\n\t\t\tbos.flush();\n\t\t\tbos.close();\n\t\t} catch (IOException ioe) {\n\t\t\treturn new BaseState(false, AppInfo.IO_ERROR);\n\t\t}\n\n\t\tstate = new BaseState(true, file.getAbsolutePath());\n\t\tstate.putInfo( \"size\", data.length );\n\t\tstate.putInfo( \"title\", file.getName() );\n\t\treturn state;\n\t}\n\n\tpublic static State saveFileByInputStream(InputStream is, String path,\n\t\t\tlong maxSize) {\n\t\tState state = null;\n\n\t\tFile tmpFile = getTmpFile();\n\n\t\tbyte[] dataBuf = new byte[ 2048 ];\n\t\tBufferedInputStream bis = new BufferedInputStream(is, StorageManager.BUFFER_SIZE);\n\n\t\ttry {\n\t\t\tBufferedOutputStream bos = new BufferedOutputStream(\n\t\t\t\t\tnew FileOutputStream(tmpFile), StorageManager.BUFFER_SIZE);\n\n\t\t\tint count = 0;\n\t\t\twhile ((count = bis.read(dataBuf)) != -1) {\n\t\t\t\tbos.write(dataBuf, 0, count);\n\t\t\t}\n\t\t\tbos.flush();\n\t\t\tbos.close();\n\n\t\t\tif (tmpFile.length() > maxSize) {\n\t\t\t\ttmpFile.delete();\n\t\t\t\treturn new BaseState(false, AppInfo.MAX_SIZE);\n\t\t\t}\n\n\t\t\tstate = saveTmpFile(tmpFile, path);\n\n\t\t\tif (!state.isSuccess()) {\n\t\t\t\ttmpFile.delete();\n\t\t\t}\n\n\t\t\treturn state;\n\t\t\t\n\t\t} catch (IOException e) {\n\t\t}\n\t\treturn new BaseState(false, AppInfo.IO_ERROR);\n\t}\n\n\tpublic static State saveFileByInputStream(InputStream is, String path) {\n\t\tState state = null;\n\n\t\tFile tmpFile = getTmpFile();\n\n\t\tbyte[] dataBuf = new byte[ 2048 ];\n\t\tBufferedInputStream bis = new BufferedInputStream(is, StorageManager.BUFFER_SIZE);\n\n\t\ttry {\n\t\t\tBufferedOutputStream bos = new BufferedOutputStream(\n\t\t\t\t\tnew FileOutputStream(tmpFile), StorageManager.BUFFER_SIZE);\n\n\t\t\tint count = 0;\n\t\t\twhile ((count = bis.read(dataBuf)) != -1) {\n\t\t\t\tbos.write(dataBuf, 0, count);\n\t\t\t}\n\t\t\tbos.flush();\n\t\t\tbos.close();\n\n\t\t\tstate = saveTmpFile(tmpFile, path);\n\n\t\t\tif (!state.isSuccess()) {\n\t\t\t\ttmpFile.delete();\n\t\t\t}\n\n\t\t\treturn state;\n\t\t} catch (IOException e) {\n\t\t}\n\t\treturn new BaseState(false, AppInfo.IO_ERROR);\n\t}\n\n\tprivate static File getTmpFile() {\n\t\tFile tmpDir = FileUtils.getTempDirectory();\n\t\tString tmpFileName = (Math.random() * 10000 + \"\").replace(\".\", \"\");\n\t\treturn new File(tmpDir, tmpFileName);\n\t}\n\n\tprivate static State saveTmpFile(File tmpFile, String path) {\n\t\tState state = null;\n\t\tFile targetFile = new File(path);\n\n\t\tif (targetFile.canWrite()) {\n\t\t\treturn new BaseState(false, AppInfo.PERMISSION_DENIED);\n\t\t}\n\t\ttry {\n\t\t\tFileUtils.moveFile(tmpFile, targetFile);\n\t\t} catch (IOException e) {\n\t\t\treturn new BaseState(false, AppInfo.IO_ERROR);\n\t\t}\n\n\t\tstate = new BaseState(true);\n\t\tstate.putInfo( \"size\", targetFile.length() );\n\t\tstate.putInfo( \"title\", targetFile.getName() );\n\t\t\n\t\treturn state;\n\t}\n\n\tprivate static State valid(File file) {\n\t\tFile parentPath = file.getParentFile();\n\n\t\tif ((!parentPath.exists()) && (!parentPath.mkdirs())) {\n\t\t\treturn new BaseState(false, AppInfo.FAILED_CREATE_FILE);\n\t\t}\n\n\t\tif (!parentPath.canWrite()) {\n\t\t\treturn new BaseState(false, AppInfo.PERMISSION_DENIED);\n\t\t}\n\n\t\treturn new BaseState(true);\n\t}\n}\n"
  },
  {
    "path": "src/main/java/com/baidu/ueditor/upload/Uploader.java",
    "content": "package com.baidu.ueditor.upload;\n\nimport com.baidu.ueditor.define.State;\nimport java.util.Map;\nimport javax.servlet.http.HttpServletRequest;\n\npublic class Uploader {\n\tprivate HttpServletRequest request = null;\n\tprivate Map<String, Object> conf = null;\n\n\tpublic Uploader(HttpServletRequest request, Map<String, Object> conf) {\n\t\tthis.request = request;\n\t\tthis.conf = conf;\n\t}\n\n\tpublic final State doExec() {\n\t\tString filedName = (String) this.conf.get(\"fieldName\");\n\t\tState state = null;\n\n\t\tif (\"true\".equals(this.conf.get(\"isBase64\"))) {\n\t\t\tstate = Base64Uploader.save(this.request.getParameter(filedName),\n\t\t\t\t\tthis.conf);\n\t\t} else {\n\t\t\tstate = BinaryUploader.save(this.request, this.conf);\n\t\t}\n\n\t\treturn state;\n\t}\n}\n"
  },
  {
    "path": "src/main/java/io/sdb/SdbApplication.java",
    "content": "package io.sdb;\n\nimport io.sdb.datasources.DynamicDataSourceConfig;\nimport org.springframework.boot.SpringApplication;\nimport org.springframework.boot.autoconfigure.SpringBootApplication;\nimport org.springframework.boot.autoconfigure.jdbc.DataSourceAutoConfiguration;\nimport org.springframework.boot.builder.SpringApplicationBuilder;\nimport org.springframework.boot.web.servlet.support.SpringBootServletInitializer;\nimport org.springframework.context.annotation.Import;\n\n\n@SpringBootApplication(exclude={DataSourceAutoConfiguration.class})\n@Import({DynamicDataSourceConfig.class})\npublic class SdbApplication extends SpringBootServletInitializer {\n\n\tpublic static void main(String[] args) {\n\t\tSpringApplication.run(io.sdb.SdbApplication.class, args);\n\t}\n\n\t@Override\n\tprotected SpringApplicationBuilder configure(SpringApplicationBuilder application) {\n\t\treturn application.sources(io.sdb.SdbApplication.class);\n\t}\n}\n"
  },
  {
    "path": "src/main/java/io/sdb/builder/AbstractBuilder.java",
    "content": "package io.sdb.builder;\n\nimport me.chanjar.weixin.mp.api.WxMpService;\nimport me.chanjar.weixin.mp.bean.message.WxMpXmlMessage;\nimport me.chanjar.weixin.mp.bean.message.WxMpXmlOutMessage;\nimport org.slf4j.Logger;\nimport org.slf4j.LoggerFactory;\n\n/**\n * @author Binary Wang(https://github.com/binarywang)\n */\npublic abstract class AbstractBuilder {\n    protected final Logger logger = LoggerFactory.getLogger(getClass());\n\n    public abstract WxMpXmlOutMessage build(String content,\n                                            WxMpXmlMessage wxMessage, WxMpService service);\n}\n"
  },
  {
    "path": "src/main/java/io/sdb/builder/ImageBuilder.java",
    "content": "package io.sdb.builder;\n\nimport me.chanjar.weixin.mp.api.WxMpService;\nimport me.chanjar.weixin.mp.bean.message.WxMpXmlMessage;\nimport me.chanjar.weixin.mp.bean.message.WxMpXmlOutImageMessage;\nimport me.chanjar.weixin.mp.bean.message.WxMpXmlOutMessage;\n\n/**\n * @author Binary Wang(https://github.com/binarywang)\n */\npublic class ImageBuilder extends AbstractBuilder {\n\n    @Override\n    public WxMpXmlOutMessage build(String content, WxMpXmlMessage wxMessage,\n                                   WxMpService service) {\n\n        WxMpXmlOutImageMessage m = WxMpXmlOutMessage.IMAGE().mediaId(content)\n            .fromUser(wxMessage.getToUser()).toUser(wxMessage.getFromUser())\n            .build();\n\n        return m;\n    }\n\n}\n"
  },
  {
    "path": "src/main/java/io/sdb/builder/MyMetaBuilder.java",
    "content": "package io.sdb.builder;\n\nimport com.jfinal.plugin.activerecord.generator.ColumnMeta;\nimport com.jfinal.plugin.activerecord.generator.MetaBuilder;\nimport com.jfinal.plugin.activerecord.generator.TableMeta;\n\nimport javax.sql.DataSource;\nimport java.sql.*;\nimport java.util.HashMap;\nimport java.util.Map;\n\npublic class MyMetaBuilder extends MetaBuilder {\n\n    public MyMetaBuilder(DataSource dataSource) {\n        super(dataSource);\n    }\n\n    @Override\n    protected void buildColumnMetas(TableMeta tableMeta) throws SQLException {\n        String sql = dialect.forTableBuilderDoBuild(tableMeta.name);\n        Statement stm = conn.createStatement();\n        ResultSet rs = stm.executeQuery(sql);\n        ResultSetMetaData rsmd = rs.getMetaData();\n\n        DatabaseMetaData dbMeta = conn.getMetaData();\n\n        Map<String, ColumnMeta> colmap = new HashMap<>();\n        ResultSet colMetaRs = null;\n        try {\n            colMetaRs = dbMeta.getColumns(null, null, tableMeta.name, null);\n            while (colMetaRs.next()) {\n                ColumnMeta columnMeta = new ColumnMeta();\n                columnMeta.name = colMetaRs.getString(\"COLUMN_NAME\");\n                columnMeta.remarks = colMetaRs.getString(\"REMARKS\");\n                colmap.put(columnMeta.name, columnMeta);\n            }\n\n        } catch (Exception e) {\n            System.out.println(e.getMessage());\n        } finally {\n            if (colMetaRs != null) {\n                colMetaRs.close();\n            }\n        }\n\n        for (int i=1; i<=rsmd.getColumnCount(); i++) {\n            ColumnMeta cm = new ColumnMeta();\n            cm.name = rsmd.getColumnName(i);\n\n            String typeStr = null;\n            if (dialect.isKeepByteAndShort()) {\n                int type = rsmd.getColumnType(i);\n                if (type == Types.TINYINT) {\n                    typeStr = \"java.lang.Byte\";\n                } else if (type == Types.SMALLINT) {\n                    typeStr = \"java.lang.Short\";\n                }\n            }\n\n            if (typeStr == null) {\n                String colClassName = rsmd.getColumnClassName(i);\n                typeStr = typeMapping.getType(colClassName);\n            }\n\n            if (typeStr == null) {\n                int type = rsmd.getColumnType(i);\n                if (type == Types.BINARY || type == Types.VARBINARY || type == Types.LONGVARBINARY || type == Types.BLOB) {\n                    typeStr = \"byte[]\";\n                } else if (type == Types.CLOB || type == Types.NCLOB) {\n                    typeStr = \"java.lang.String\";\n                }\n                // 支持 oracle 的 TIMESTAMP、DATE 字段类型，其中 Types.DATE 值并不会出现\n                // 保留对 Types.DATE 的判断，一是为了逻辑上的正确性、完备性，二是其它类型的数据库可能用得着\n                else if (type == Types.TIMESTAMP || type == Types.DATE) {\n                    typeStr = \"java.util.Date\";\n                }\n                // 支持 PostgreSql 的 jsonb json\n                else if (type == Types.OTHER) {\n                    typeStr = \"java.lang.Object\";\n                } else {\n                    typeStr = \"java.lang.String\";\n                }\n            }\n\n            typeStr = handleJavaType(typeStr, rsmd, i);\n\n            cm.javaType = typeStr;\n\n            // 构造字段对应的属性名 attrName\n            cm.attrName = buildAttrName(cm.name);\n\n            ColumnMeta cm1 = colmap.get(cm.name);\n            if (cm1 != null) {\n                cm.remarks = cm1.remarks;\n            }\n\n            tableMeta.columnMetas.add(cm);\n        }\n\n        rs.close();\n        stm.close();\n    }\n\n}\n"
  },
  {
    "path": "src/main/java/io/sdb/builder/TextBuilder.java",
    "content": "package io.sdb.builder;\n\nimport me.chanjar.weixin.mp.api.WxMpService;\nimport me.chanjar.weixin.mp.bean.message.WxMpXmlMessage;\nimport me.chanjar.weixin.mp.bean.message.WxMpXmlOutMessage;\nimport me.chanjar.weixin.mp.bean.message.WxMpXmlOutTextMessage;\n\n/**\n * @author Binary Wang(https://github.com/binarywang)\n */\npublic class TextBuilder extends AbstractBuilder {\n\n    @Override\n    public WxMpXmlOutMessage build(String content, WxMpXmlMessage wxMessage,\n                                   WxMpService service) {\n        WxMpXmlOutTextMessage m = WxMpXmlOutMessage.TEXT().content(content)\n            .fromUser(wxMessage.getToUser()).toUser(wxMessage.getFromUser())\n            .build();\n        return m;\n    }\n\n}\n"
  },
  {
    "path": "src/main/java/io/sdb/common/annotation/JFinalTx.java",
    "content": "package io.sdb.common.annotation;\n\nimport java.lang.annotation.*;\n\n/**\n * Created by chunmeng.lu\n * Date: 2016-30-03 19:26\n */\n@Inherited\n@Target(ElementType.METHOD)\n@Retention(RetentionPolicy.RUNTIME)\npublic @interface JFinalTx {\n\n}"
  },
  {
    "path": "src/main/java/io/sdb/common/annotation/Login.java",
    "content": "package io.sdb.common.annotation;\n\nimport java.lang.annotation.*;\n\n/**\n * app登录效验\n * @author chenshun\n * @email sunlightcs@gmail.com\n * @date 2017/9/23 14:30\n */\n@Target(ElementType.METHOD)\n@Retention(RetentionPolicy.RUNTIME)\n@Documented\npublic @interface Login {\n}\n"
  },
  {
    "path": "src/main/java/io/sdb/common/annotation/LoginUser.java",
    "content": "package io.sdb.common.annotation;\n\nimport java.lang.annotation.ElementType;\nimport java.lang.annotation.Retention;\nimport java.lang.annotation.RetentionPolicy;\nimport java.lang.annotation.Target;\n\n/**\n * 登录用户信息\n *\n * @author chenshun\n * @email sunlightcs@gmail.com\n * @date 2017-03-23 20:39\n */\n@Target(ElementType.PARAMETER)\n@Retention(RetentionPolicy.RUNTIME)\npublic @interface LoginUser {\n\n}\n"
  },
  {
    "path": "src/main/java/io/sdb/common/annotation/SysLog.java",
    "content": "package io.sdb.common.annotation;\n\nimport java.lang.annotation.Documented;\nimport java.lang.annotation.ElementType;\nimport java.lang.annotation.Retention;\nimport java.lang.annotation.RetentionPolicy;\nimport java.lang.annotation.Target;\n\n/**\n * 系统日志注解\n * \n * @author chenshun\n * @email sunlightcs@gmail.com\n * @date 2017年3月8日 上午10:19:56\n */\n@Target(ElementType.METHOD)\n@Retention(RetentionPolicy.RUNTIME)\n@Documented\npublic @interface SysLog {\n\n\tString value() default \"\";\n}\n"
  },
  {
    "path": "src/main/java/io/sdb/common/aspect/RedisAspect.java",
    "content": "package io.sdb.common.aspect;\n\nimport io.sdb.common.exception.RRException;\nimport org.aspectj.lang.ProceedingJoinPoint;\nimport org.aspectj.lang.annotation.Around;\nimport org.aspectj.lang.annotation.Aspect;\nimport org.slf4j.Logger;\nimport org.slf4j.LoggerFactory;\nimport org.springframework.beans.factory.annotation.Value;\nimport org.springframework.context.annotation.Configuration;\n\n/**\n * Redis切面处理类\n *\n * @author chenshun\n * @email sunlightcs@gmail.com\n * @date 2017-07-17 23:30\n */\n@Aspect\n@Configuration\npublic class RedisAspect {\n    private Logger logger = LoggerFactory.getLogger(getClass());\n    //是否开启redis缓存  true开启   false关闭\n    @Value(\"${spring.redis.open: false}\")\n    private boolean open;\n\n    @Around(\"execution(* io.sdb.common.utils.RedisUtils.*(..))\")\n    public Object around(ProceedingJoinPoint point) throws Throwable {\n        Object result = null;\n        if(open){\n            try{\n                result = point.proceed();\n            }catch (Exception e){\n                logger.error(\"redis error\", e);\n                throw new RRException(\"Redis服务异常\");\n            }\n        }\n        return result;\n    }\n}\n"
  },
  {
    "path": "src/main/java/io/sdb/common/aspect/SysLogAspect.java",
    "content": "package io.sdb.common.aspect;\n\nimport com.google.gson.Gson;\nimport io.sdb.common.annotation.SysLog;\nimport io.sdb.common.utils.HttpContextUtils;\nimport io.sdb.common.utils.IPUtils;\nimport io.sdb.model.SysUser;\nimport io.sdb.service.SysLogService;\nimport org.apache.shiro.SecurityUtils;\nimport org.aspectj.lang.ProceedingJoinPoint;\nimport org.aspectj.lang.annotation.Around;\nimport org.aspectj.lang.annotation.Aspect;\nimport org.aspectj.lang.annotation.Pointcut;\nimport org.aspectj.lang.reflect.MethodSignature;\nimport org.springframework.beans.factory.annotation.Autowired;\nimport org.springframework.stereotype.Component;\n\nimport javax.servlet.http.HttpServletRequest;\nimport java.lang.reflect.Method;\nimport java.util.Date;\n\n\n/**\n * 系统日志，切面处理类\n * \n * @author chenshun\n * @email sunlightcs@gmail.com\n * @date 2017年3月8日 上午11:07:35\n */\n@Aspect\n@Component\npublic class SysLogAspect {\n\t@Autowired\n\tprivate SysLogService sysLogService;\n\t\n\t@Pointcut(\"@annotation(io.sdb.common.annotation.SysLog)\")\n\tpublic void logPointCut() { \n\t\t\n\t}\n\n\t@Around(\"logPointCut()\")\n\tpublic Object around(ProceedingJoinPoint point) throws Throwable {\n\t\tlong beginTime = System.currentTimeMillis();\n\t\t//执行方法\n\t\tObject result = point.proceed();\n\t\t//执行时长(毫秒)\n\t\tlong time = System.currentTimeMillis() - beginTime;\n\n\t\t//保存日志\n\t\tsaveSysLog(point, time);\n\n\t\treturn result;\n\t}\n\n\tprivate void saveSysLog(ProceedingJoinPoint joinPoint, long time) {\n\t\tMethodSignature signature = (MethodSignature) joinPoint.getSignature();\n\t\tMethod method = signature.getMethod();\n\n\t\tio.sdb.model.SysLog sysLog = new io.sdb.model.SysLog();\n\t\tSysLog syslog = method.getAnnotation(SysLog.class);\n\t\tif(syslog != null){\n\t\t\t//注解上的描述\n\t\t\tsysLog.setOperation(syslog.value());\n\t\t}\n\n\t\t//请求的方法名\n\t\tString className = joinPoint.getTarget().getClass().getName();\n\t\tString methodName = signature.getName();\n\t\tsysLog.setMethod(className + \".\" + methodName + \"()\");\n\n\t\t//请求的参数\n\t\tObject[] args = joinPoint.getArgs();\n\t\ttry{\n\t\t\tString params = new Gson().toJson(args[0]);\n\t\t\tsysLog.setParams(params);\n\t\t}catch (Exception e){\n\n\t\t}\n\n\t\t//获取request\n\t\tHttpServletRequest request = HttpContextUtils.getHttpServletRequest();\n\t\t//设置IP地址\n\t\tsysLog.setIp(IPUtils.getIpAddr(request));\n\n\t\t//用户名\n\t\tString username = ((SysUser) SecurityUtils.getSubject().getPrincipal()).getUsername();\n\t\tsysLog.setUsername(username);\n\n\t\tsysLog.setTime(time);\n\t\tsysLog.setCreateDate(new Date());\n\t\t//保存系统日志\n\t\tsysLog.save();\n\t}\n}\n"
  },
  {
    "path": "src/main/java/io/sdb/common/entity/AreaNode.java",
    "content": "package io.sdb.common.entity;\n\nimport io.sdb.model.Area;\nimport lombok.Data;\n\n@Data\npublic class AreaNode extends Node<Area> {\n    String name;\n    String fullName;\n    Integer grade;\n    String treePath;\n\n    public AreaNode(Area area) {\n        super(area.getId(), area.getParentId());\n        this.name = area.getName();\n        this.fullName = area.getFullName();\n        this.grade = area.getGrade();\n        this.treePath = area.getTreePath();\n    }\n}\n"
  },
  {
    "path": "src/main/java/io/sdb/common/entity/Filter.java",
    "content": "package io.sdb.common.entity;\n\nimport org.apache.commons.lang3.builder.EqualsBuilder;\nimport org.apache.commons.lang3.builder.HashCodeBuilder;\n\nimport java.io.Serializable;\n\n/**\n * 筛选\n * \n * \n */\npublic class Filter implements Serializable {\n\n\tprivate static final long serialVersionUID = -8712382358441065075L;\n\n\tpublic enum WhereOpt {\n\t\tand,\n\t\tor\n\t}\n\n\t/**\n\t * 运算符\n\t */\n\tpublic enum Operator {\n\n\t\t/** 等于 */\n\t\teq,\n\n\t\t/** 不等于 */\n\t\tne,\n\n\t\t/** 大于 */\n\t\tgt,\n\n\t\t/** 小于 */\n\t\tlt,\n\n\t\t/** 大于等于 */\n\t\tge,\n\n\t\t/** 小于等于 */\n\t\tle,\n\n\t\t/** 相似 */\n\t\tlike,\n\n\t\t/** 包含 */\n\t\tin,\n\n\t\t/** 为Null */\n\t\tisNull,\n\n\t\t/** 不为Null */\n\t\tisNotNull\n\t}\n\n\t/** 默认是否忽略大小写 */\n\tprivate static final boolean DEFAULT_IGNORE_CASE = false;\n\n\t/** 属性 */\n\tprivate String property;\n\n\t/** 运算符 */\n\tprivate Filter.Operator operator;\n\n\tprivate Filter.WhereOpt whereOpt = WhereOpt.and;\n\n\t/** 值 */\n\tprivate Object value;\n\n\t/** 是否忽略大小写 */\n\tprivate Boolean ignoreCase = DEFAULT_IGNORE_CASE;\n\n\t/**\n\t * 构造方法\n\t */\n\tpublic Filter() {\n\t}\n\n\t/**\n\t * 构造方法\n\t *\n\t * @param property\n\t *            属性\n\t * @param operator\n\t *            运算符\n\t * @param value\n\t *            值\n\t */\n\tpublic Filter(String property, Filter.Operator operator, Object value) {\n\t\tthis.property = property;\n\t\tthis.operator = operator;\n\t\tthis.value = value;\n\t}\n\n\t/**\n\t * 构造方法\n\t *\n\t * @param property\n\t *            属性\n\t * @param operator\n\t *            运算符\n\t * @param value\n\t *            值\n\t * @param ignoreCase\n\t *            忽略大小写\n\t */\n\tpublic Filter(String property, Filter.Operator operator, Object value, boolean ignoreCase) {\n\t\tthis.property = property;\n\t\tthis.operator = operator;\n\t\tthis.value = value;\n\t\tthis.ignoreCase = ignoreCase;\n\t}\n\n\t/**\n\t * 返回等于筛选\n\t *\n\t * @param property\n\t *            属性\n\t * @param value\n\t *            值\n\t * @return 等于筛选\n\t */\n\tpublic static Filter eq(String property, Object value) {\n\t\treturn new Filter(property, Filter.Operator.eq, value);\n\t}\n\n\t/**\n\t * 返回等于筛选\n\t *\n\t * @param property\n\t *            属性\n\t * @param value\n\t *            值\n\t * @param ignoreCase\n\t *            忽略大小写\n\t * @return 等于筛选\n\t */\n\tpublic static Filter eq(String property, Object value, boolean ignoreCase) {\n\t\treturn new Filter(property, Filter.Operator.eq, value, ignoreCase);\n\t}\n\n\t/**\n\t * 返回不等于筛选\n\t *\n\t * @param property\n\t *            属性\n\t * @param value\n\t *            值\n\t * @return 不等于筛选\n\t */\n\tpublic static Filter ne(String property, Object value) {\n\t\treturn new Filter(property, Filter.Operator.ne, value);\n\t}\n\n\t/**\n\t * 返回不等于筛选\n\t *\n\t * @param property\n\t *            属性\n\t * @param value\n\t *            值\n\t * @param ignoreCase\n\t *            忽略大小写\n\t * @return 不等于筛选\n\t */\n\tpublic static Filter ne(String property, Object value, boolean ignoreCase) {\n\t\treturn new Filter(property, Filter.Operator.ne, value, ignoreCase);\n\t}\n\n\t/**\n\t * 返回大于筛选\n\t *\n\t * @param property\n\t *            属性\n\t * @param value\n\t *            值\n\t * @return 大于筛选\n\t */\n\tpublic static Filter gt(String property, Object value) {\n\t\treturn new Filter(property, Filter.Operator.gt, value);\n\t}\n\n\t/**\n\t * 返回小于筛选\n\t *\n\t * @param property\n\t *            属性\n\t * @param value\n\t *            值\n\t * @return 小于筛选\n\t */\n\tpublic static Filter lt(String property, Object value) {\n\t\treturn new Filter(property, Filter.Operator.lt, value);\n\t}\n\n\t/**\n\t * 返回大于等于筛选\n\t *\n\t * @param property\n\t *            属性\n\t * @param value\n\t *            值\n\t * @return 大于等于筛选\n\t */\n\tpublic static Filter ge(String property, Object value) {\n\t\treturn new Filter(property, Filter.Operator.ge, value);\n\t}\n\n\t/**\n\t * 返回小于等于筛选\n\t *\n\t * @param property\n\t *            属性\n\t * @param value\n\t *            值\n\t * @return 小于等于筛选\n\t */\n\tpublic static Filter le(String property, Object value) {\n\t\treturn new Filter(property, Filter.Operator.le, value);\n\t}\n\n\t/**\n\t * 返回相似筛选\n\t *\n\t * @param property\n\t *            属性\n\t * @param value\n\t *            值\n\t * @return 相似筛选\n\t */\n\tpublic static Filter like(String property, Object value) {\n\t\treturn new Filter(property, Filter.Operator.like, value);\n\t}\n\n\t/**\n\t * 返回包含筛选\n\t *\n\t * @param property\n\t *            属性\n\t * @param value\n\t *            值\n\t * @return 包含筛选\n\t */\n\tpublic static Filter in(String property, Object value) {\n\t\treturn new Filter(property, Filter.Operator.in, value);\n\t}\n\n\t/**\n\t * 返回为Null筛选\n\t *\n\t * @param property\n\t *            属性\n\t * @return 为Null筛选\n\t */\n\tpublic static Filter isNull(String property) {\n\t\treturn new Filter(property, Filter.Operator.isNull, null);\n\t}\n\n\t/**\n\t * 返回不为Null筛选\n\t *\n\t * @param property\n\t *            属性\n\t * @return 不为Null筛选\n\t */\n\tpublic static Filter isNotNull(String property) {\n\t\treturn new Filter(property, Filter.Operator.isNotNull, null);\n\t}\n\n\t/**\n\t * 返回忽略大小写筛选\n\t *\n\t * @return 忽略大小写筛选\n\t */\n\tpublic Filter ignoreCase() {\n\t\tthis.ignoreCase = true;\n\t\treturn this;\n\t}\n\n\t/**\n\t * 获取属性\n\t *\n\t * @return 属性\n\t */\n\tpublic String getProperty() {\n\t\treturn property;\n\t}\n\n\t/**\n\t * 设置属性\n\t *\n\t * @param property\n\t *            属性\n\t */\n\tpublic void setProperty(String property) {\n\t\tthis.property = property;\n\t}\n\n\t/**\n\t * 获取运算符\n\t *\n\t * @return 运算符\n\t */\n\tpublic Filter.Operator getOperator() {\n\t\treturn operator;\n\t}\n\n\t/**\n\t * 设置运算符\n\t *\n\t * @param operator\n\t *            运算符\n\t */\n\tpublic void setOperator(Filter.Operator operator) {\n\t\tthis.operator = operator;\n\t}\n\n\n\tpublic Filter.WhereOpt getWhereOpt() {\n\t\treturn whereOpt;\n\t}\n\n\tpublic void setWhereOpt(Filter.WhereOpt operator) {\n\t\tthis.whereOpt = operator;\n\t}\n\n\t/**\n\t * 获取值\n\t * \n\t * @return 值\n\t */\n\tpublic Object getValue() {\n\t\treturn value;\n\t}\n\n\t/**\n\t * 设置值\n\t * \n\t * @param value\n\t *            值\n\t */\n\tpublic void setValue(Object value) {\n\t\tthis.value = value;\n\t}\n\n\t/**\n\t * 获取是否忽略大小写\n\t * \n\t * @return 是否忽略大小写\n\t */\n\tpublic Boolean getIgnoreCase() {\n\t\treturn ignoreCase;\n\t}\n\n\t/**\n\t * 设置是否忽略大小写\n\t * \n\t * @param ignoreCase\n\t *            是否忽略大小写\n\t */\n\tpublic void setIgnoreCase(Boolean ignoreCase) {\n\t\tthis.ignoreCase = ignoreCase;\n\t}\n\n\tpublic String getWhereOptStr() {\n\t\treturn this.whereOpt.name().toUpperCase();\n\t}\n\n\t/**\n\t * 重写equals方法\n\t * \n\t * @param obj\n\t *            对象\n\t * @return 是否相等\n\t */\n\t@Override\n\tpublic boolean equals(Object obj) {\n\t\tif (obj == null) {\n\t\t\treturn false;\n\t\t}\n\t\tif (getClass() != obj.getClass()) {\n\t\t\treturn false;\n\t\t}\n\t\tif (this == obj) {\n\t\t\treturn true;\n\t\t}\n\t\tFilter other = (Filter) obj;\n\t\treturn new EqualsBuilder().append(getProperty(), other.getProperty()).append(getOperator(), other.getOperator()).append(getValue(), other.getValue()).isEquals();\n\t}\n\n\t/**\n\t * 重写hashCode方法\n\t * \n\t * @return HashCode\n\t */\n\t@Override\n\tpublic int hashCode() {\n\t\treturn new HashCodeBuilder(17, 37).append(getProperty()).append(getOperator()).append(getValue()).toHashCode();\n\t}\n\n}"
  },
  {
    "path": "src/main/java/io/sdb/common/entity/Node.java",
    "content": "package io.sdb.common.entity;\n\n\nimport lombok.Data;\n\nimport java.util.List;\n\n\nabstract class P{\n    public void print(){\n        System.out.println(\"pppppppppppp\");\n    }\n}\n\n\nclass C extends P{\n    public void print(){\n        System.out.println(\"ccccccccccccccc\");\n    }\n}\n\nclass A<T extends P> {\n    public void print(T param){\n        param.print();\n    }\n}\n\n@Data\npublic abstract class Node<T> {\n\n    private Long id;\n    private Long parentId;\n    private List<T> children;\n\n    public Node() {\n    }\n\n    public Node(Long id, Long pid) {\n        super();\n        this.id = id;\n        this.parentId = pid;\n    }\n\n\n    public static void main(String[] args) {\n        A a = new A<C>();\n        a.print(new C());\n\n    }\n}\n"
  },
  {
    "path": "src/main/java/io/sdb/common/entity/Order.java",
    "content": "package io.sdb.common.entity;\n\nimport org.apache.commons.lang3.builder.EqualsBuilder;\nimport org.apache.commons.lang3.builder.HashCodeBuilder;\n\nimport java.io.Serializable;\n\n/**\n * 排序\n * \n * \n */\npublic class Order implements Serializable {\n\n\tprivate static final long serialVersionUID = -3078342809727773232L;\n\n\t/**\n\t * 方向\n\t */\n\tpublic enum Direction {\n\n\t\t/** 递增 */\n\t\tasc,\n\n\t\t/** 递减 */\n\t\tdesc\n\t}\n\n\t/** 默认方向 */\n\tprivate static final Order.Direction DEFAULT_DIRECTION = Order.Direction.desc;\n\n\t/** 属性 */\n\tprivate String property;\n\n\t/** 方向 */\n\tprivate Order.Direction direction = DEFAULT_DIRECTION;\n\n\t/**\n\t * 构造方法\n\t */\n\tpublic Order() {\n\t}\n\n\t/**\n\t * 构造方法\n\t *\n\t * @param property\n\t *            属性\n\t * @param direction\n\t *            方向\n\t */\n\tpublic Order(String property, Order.Direction direction) {\n\t\tthis.property = property;\n\t\tthis.direction = direction;\n\t}\n\n\t/**\n\t * 返回递增排序\n\t *\n\t * @param property\n\t *            属性\n\t * @return 递增排序\n\t */\n\tpublic static Order asc(String property) {\n\t\treturn new Order(property, Order.Direction.asc);\n\t}\n\n\t/**\n\t * 返回递减排序\n\t *\n\t * @param property\n\t *            属性\n\t * @return 递减排序\n\t */\n\tpublic static Order desc(String property) {\n\t\treturn new Order(property, Order.Direction.desc);\n\t}\n\n\t/**\n\t * 获取属性\n\t *\n\t * @return 属性\n\t */\n\tpublic String getProperty() {\n\t\treturn property;\n\t}\n\n\t/**\n\t * 设置属性\n\t *\n\t * @param property\n\t *            属性\n\t */\n\tpublic void setProperty(String property) {\n\t\tthis.property = property;\n\t}\n\n\t/**\n\t * 获取方向\n\t *\n\t * @return 方向\n\t */\n\tpublic Order.Direction getDirection() {\n\t\treturn direction;\n\t}\n\n\t/**\n\t * 设置方向\n\t *\n\t * @param direction\n\t *            方向\n\t */\n\tpublic void setDirection(Order.Direction direction) {\n\t\tthis.direction = direction;\n\t}\n\n\t/**\n\t * 重写equals方法\n\t * \n\t * @param obj\n\t *            对象\n\t * @return 是否相等\n\t */\n\t@Override\n\tpublic boolean equals(Object obj) {\n\t\tif (obj == null) {\n\t\t\treturn false;\n\t\t}\n\t\tif (getClass() != obj.getClass()) {\n\t\t\treturn false;\n\t\t}\n\t\tif (this == obj) {\n\t\t\treturn true;\n\t\t}\n\t\tOrder other = (Order) obj;\n\t\treturn new EqualsBuilder().append(getProperty(), other.getProperty()).append(getDirection(), other.getDirection()).isEquals();\n\t}\n\n\t/**\n\t * 重写hashCode方法\n\t * \n\t * @return HashCode\n\t */\n\t@Override\n\tpublic int hashCode() {\n\t\treturn new HashCodeBuilder(17, 37).append(getProperty()).append(getDirection()).toHashCode();\n\t}\n\n}"
  },
  {
    "path": "src/main/java/io/sdb/common/entity/kuaidi100/MapCustomConverter.java",
    "content": "package io.sdb.common.entity.kuaidi100;\n\nimport com.thoughtworks.xstream.converters.MarshallingContext;\nimport com.thoughtworks.xstream.converters.UnmarshallingContext;\nimport com.thoughtworks.xstream.converters.collections.AbstractCollectionConverter;\nimport com.thoughtworks.xstream.io.ExtendedHierarchicalStreamWriterHelper;\nimport com.thoughtworks.xstream.io.HierarchicalStreamReader;\nimport com.thoughtworks.xstream.io.HierarchicalStreamWriter;\nimport com.thoughtworks.xstream.mapper.Mapper;\n\nimport java.util.HashMap;\nimport java.util.Iterator;\nimport java.util.Map;\nimport java.util.Map.Entry;\n\npublic class MapCustomConverter extends AbstractCollectionConverter {\n\n\tpublic MapCustomConverter(Mapper mapper) {\n\t\tsuper(mapper);\n\t}\n\n\t@SuppressWarnings(\"rawtypes\")\n\tpublic boolean canConvert(Class type) {\n\t\t// 这里只列了HashMap一种情况\n\t\treturn type.equals(HashMap.class);\n\t}\n\n\t@SuppressWarnings(\"rawtypes\")\n\tpublic void marshal(Object source, HierarchicalStreamWriter writer, MarshallingContext context) {\n\t\tMap map = (Map) source;\n\t\tfor (Iterator iterator = map.entrySet().iterator(); iterator.hasNext();) {\n\t\t\tEntry entry = (Entry) iterator.next();\n\t\t\tExtendedHierarchicalStreamWriterHelper.startNode(writer, entry.getKey().toString(), Entry.class);\n\n\t\t\twriter.setValue(entry.getValue().toString());\n\t\t\twriter.endNode();\n\t\t}\n\t}\n\n\t@SuppressWarnings(\"rawtypes\")\n\tpublic Object unmarshal(HierarchicalStreamReader reader, UnmarshallingContext context) {\n\t\tMap map = (Map) createCollection(context.getRequiredType());\n\t\tpopulateMap(reader, context, map);\n\t\treturn map;\n\n\t}\n\n\t@SuppressWarnings({ \"rawtypes\", \"unchecked\" })\n\tprotected void populateMap(HierarchicalStreamReader reader, UnmarshallingContext context, Map map) {\n\t\twhile (reader.hasMoreChildren()) {\n\t\t\treader.moveDown();\n\t\t\tObject key = reader.getNodeName();\n\t\t\tObject value = reader.getValue();\n\t\t\tmap.put(key, value);\n\t\t\treader.moveUp();\n\t\t}\n\t}\n\n}"
  },
  {
    "path": "src/main/java/io/sdb/common/entity/kuaidi100/NoticeRequest.java",
    "content": "package io.sdb.common.entity.kuaidi100;\n\nimport com.jfinal.kit.JsonKit;\nimport com.thoughtworks.xstream.XStream;\n\npublic class NoticeRequest {\n\tprivate static XStream xstream;\n\n\tprivate String status = \"\";\n\tprivate String billstatus = \"\";\n\tprivate String message = \"\";\n\tprivate Result lastResult = new Result();\n\n\tpublic String getStatus() {\n\t\treturn status;\n\t}\n\n\tpublic void setStatus(String status) {\n\t\tthis.status = status;\n\t}\n\n\tpublic String getBillstatus() {\n\t\treturn billstatus;\n\t}\n\n\tpublic void setBillstatus(String billstatus) {\n\t\tthis.billstatus = billstatus;\n\t}\n\n\tpublic String getMessage() {\n\t\treturn message;\n\t}\n\n\tpublic void setMessage(String message) {\n\t\tthis.message = message;\n\t}\n\n\tpublic Result getLastResult() {\n\t\treturn lastResult;\n\t}\n\n\tpublic void setLastResult(Result lastResult) {\n\t\tthis.lastResult = lastResult;\n\t}\n\n\tprivate static XStream getXStream() {\n\t\tif (xstream == null) {\n\t\t\txstream = new XStream();\n\t\t\txstream.autodetectAnnotations(true);\n\t\t\txstream.alias(\"pushRequest\", NoticeRequest.class);\n\t\t\txstream.alias(\"item\", ResultItem.class);\n\t\t\t\n\t\t}\n\t\treturn xstream;\n\t}\n\n\tpublic String toXml() {\n\t\treturn \"<?xml version='1.0' encoding='UTF-8'?>\\r\\n\" + getXStream().toXML(this);\n\t}\n\n\tpublic static NoticeRequest fromXml(String sXml) {\n\t\treturn (NoticeRequest) getXStream().fromXML(sXml);\n\t}\n\n\tpublic static void main(String[] args) {\n\t\tNoticeRequest req = new NoticeRequest();\n\t\treq.setBillstatus(\"polling\");\n\t\treq.setMessage(\"到达\");\n\t\treq.setStatus(\"check\");\n\t\treq.getLastResult().setCom(\"yauntong\");\n\t\treq.getLastResult().setCondition(\"F00\");\n\t\treq.getLastResult().setIscheck(\"0\");\n\t\treq.getLastResult().setNu(\"V030344422\");\n\t\treq.getLastResult().setState(\"0\");\n\t\treq.getLastResult().setStatus(\"200\");\n\t\treq.getLastResult().setMessage(\"ok\");\n\t\tResultItem item = new ResultItem();\n\t\titem.setContext(\"上海分拨中心/装件入车扫描 \");\n\t\titem.setFtime(\"2012-08-28 16:33:19\");\n\t\titem.setTime(\"2012-08-28 16:33:19\");\n\t\treq.getLastResult().getData().add(item);\n\t\titem = new ResultItem();\n\t\titem.setContext(\"上海分拨中心/下车扫描\");\n\t\titem.setFtime(\"2012-08-27 23:22:42\");\n\t\titem.setTime(\"2012-08-27 23:22:42\");\n\t\treq.getLastResult().getData().add(item);\n\t\tSystem.out.println(JsonKit.toJson(req));\n\t}\n\n}\n"
  },
  {
    "path": "src/main/java/io/sdb/common/entity/kuaidi100/NoticeResponse.java",
    "content": "package io.sdb.common.entity.kuaidi100;\n\nimport com.thoughtworks.xstream.XStream;\n\npublic class NoticeResponse {\n\tprivate static XStream xstream;\n\n\tprivate Boolean result;\n\tprivate String returnCode;\n\tprivate String message;\n\n\tpublic Boolean getResult() {\n\t\treturn result;\n\t}\n\n\tpublic void setResult(Boolean result) {\n\t\tthis.result = result;\n\t}\n\n\tpublic String getReturnCode() {\n\t\treturn returnCode;\n\t}\n\n\tpublic void setReturnCode(String returnCode) {\n\t\tthis.returnCode = returnCode;\n\t}\n\n\tpublic String getMessage() {\n\t\treturn message;\n\t}\n\n\tpublic void setMessage(String message) {\n\t\tthis.message = message;\n\t}\n\n\tprivate static XStream getXStream() {\n\t\tif (xstream == null) {\n\t\t\txstream = new XStream();\n\t\t\txstream.autodetectAnnotations(true);\n\t\t\txstream.alias(\"pushResponse\", NoticeResponse.class);\n\t\t}\n\t\treturn xstream;\n\t}\n\n\tpublic String toXml(){\n\t\treturn \"<?xml version='1.0' encoding='UTF-8'?>\\r\\n\" + getXStream().toXML(this);\n\t}\n\n\tpublic static NoticeResponse fromXml(String sXml){\n\t\treturn (NoticeResponse)getXStream().fromXML(sXml);\n\t}\n\n\n\tpublic static void main(String[] args){\n\t\tNoticeResponse req = new NoticeResponse();\n\t\treq.setMessage(\"成功\");\n\t\treq.setResult(true);\n\t\treq.setReturnCode(\"200\");\n\t\tSystem.out.print(req.toXml());\n\t}\n}\n"
  },
  {
    "path": "src/main/java/io/sdb/common/entity/kuaidi100/Result.java",
    "content": "package io.sdb.common.entity.kuaidi100;\n\nimport com.alibaba.fastjson.annotation.JSONField;\nimport com.jfinal.kit.JsonKit;\n\nimport java.util.ArrayList;\n\npublic class Result {\n\n\tprivate String message = \"\";\n\n\tprivate String nu = \"\";\n\t@JSONField(serialize = false)\n\tprivate String ischeck = \"0\";\n\t@JSONField(serialize = false)\n\tprivate String com = \"\";\n\tprivate String status = \"0\";\n\t@JSONField(serialize = false)\n\tprivate ArrayList<ResultItem> data = new ArrayList<ResultItem>();\n\t@JSONField(serialize = false)\n\tprivate String state = \"0\";\n\t@JSONField(serialize = false)\n\tprivate String condition = \"\";\n\n\t@SuppressWarnings(\"unchecked\")\n\tpublic Result clone() {\n\t\tResult r = new Result();\n\t\tr.setCom(this.getCom());\n\t\tr.setIscheck(this.getIscheck());\n\t\tr.setMessage(this.getMessage());\n\t\tr.setNu(this.getNu());\n\t\tr.setState(this.getState());\n\t\tr.setStatus(this.getStatus());\n\t\tr.setCondition(this.getCondition());\n\t\tr.setData((ArrayList<ResultItem>) this.getData().clone());\n\n\t\treturn r;\n\t}\n\n\tpublic String getMessage() {\n\t\treturn message;\n\t}\n\n\tpublic void setMessage(String message) {\n\t\tthis.message = message;\n\t}\n\n\tpublic String getNu() {\n\t\treturn nu;\n\t}\n\n\tpublic void setNu(String nu) {\n\t\tthis.nu = nu;\n\t}\n\n\tpublic String getCom() {\n\t\treturn com;\n\t}\n\n\tpublic void setCom(String com) {\n\t\tthis.com = com;\n\t}\n\n\tpublic ArrayList<ResultItem> getData() {\n\t\treturn data;\n\t}\n\n\tpublic void setData(ArrayList<ResultItem> data) {\n\t\tthis.data = data;\n\t}\n\n\tpublic String getIscheck() {\n\t\treturn ischeck;\n\t}\n\n\tpublic void setIscheck(String ischeck) {\n\t\tthis.ischeck = ischeck;\n\t}\n\n\tpublic String getStatus() {\n\t\treturn status;\n\t}\n\n\tpublic void setStatus(String status) {\n\t\tthis.status = status;\n\t}\n\n\tpublic String getState() {\n\t\treturn state;\n\t}\n\n\tpublic void setState(String state) {\n\t\tthis.state = state;\n\t}\n\n\tpublic String getCondition() {\n\t\treturn condition;\n\t}\n\n\tpublic void setCondition(String condition) {\n\t\tthis.condition = condition;\n\t}\n\n\t@Override\n\tpublic String toString() {\n\t\treturn JsonKit.toJson(this);\n\t}\n}\n"
  },
  {
    "path": "src/main/java/io/sdb/common/entity/kuaidi100/ResultItem.java",
    "content": "package io.sdb.common.entity.kuaidi100;\n\npublic class ResultItem {\n\tString time;\n\tString context;\n\tString ftime;\n\n\tpublic String getTime() {\n\t\treturn time;\n\t}\n\n\tpublic void setTime(String time) {\n\t\tthis.time = time;\n\t}\n\n\tpublic String getContext() {\n\t\treturn context;\n\t}\n\n\tpublic void setContext(String context) {\n\t\tthis.context = context;\n\t}\n\n\tpublic String getFtime() {\n\t\treturn ftime;\n\t}\n\n\tpublic void setFtime(String ftime) {\n\t\tthis.ftime = ftime;\n\t}\n\n}\n"
  },
  {
    "path": "src/main/java/io/sdb/common/entity/kuaidi100/TaskRequest.java",
    "content": "package io.sdb.common.entity.kuaidi100;\n\nimport com.jfinal.kit.JsonKit;\nimport com.thoughtworks.xstream.XStream;\nimport com.thoughtworks.xstream.mapper.DefaultMapper;\n\nimport java.util.HashMap;\nimport java.util.Map.Entry;\n\npublic class TaskRequest {\n\tprivate static XStream xstream;\n\tprivate String company;\n\tprivate String number;\n\tprivate String from;\n\tprivate String to;\n\tprivate String key;\n\tprivate String src;\n\n\tprivate HashMap<String, String> parameters = new HashMap<String, String>();\n\n\tpublic String getCompany() {\n\t\treturn company;\n\t}\n\n\tpublic void setCompany(String company) {\n\t\tthis.company = company;\n\t}\n\n\tpublic String getNumber() {\n\t\treturn number;\n\t}\n\n\tpublic void setNumber(String number) {\n\t\tthis.number = number;\n\t}\n\n\tpublic String getFrom() {\n\t\treturn from;\n\t}\n\n\tpublic void setFrom(String from) {\n\t\tthis.from = from;\n\t}\n\n\tpublic String getTo() {\n\t\treturn to;\n\t}\n\n\tpublic void setTo(String to) {\n\t\tthis.to = to;\n\t}\n\n\tpublic String getKey() {\n\t\treturn key;\n\t}\n\n\tpublic void setKey(String key) {\n\t\tthis.key = key;\n\t}\n\n\tpublic String getSrc() {\n\t\treturn src;\n\t}\n\n\tpublic void setSrc(String src) {\n\t\tthis.src = src;\n\t}\n\n\tpublic HashMap<String, String> getParameters() {\n\t\treturn parameters;\n\t}\n\n\tpublic void setParameters(HashMap<String, String> parameters) {\n\t\tthis.parameters = parameters;\n\t}\n\n\t@Override\n\tpublic String toString() {\n\t\treturn JsonKit.toJson(this);\n\t}\n\t\n\n\tprivate static XStream getXStream() {\n\t\tif (xstream == null) {\n\t\t\txstream = new XStream();\n\t\t\txstream.registerConverter(new MapCustomConverter(new DefaultMapper(XStream.class.getClassLoader())));\n\t\t\txstream.autodetectAnnotations(true);\n\t\t\txstream.alias(\"orderRequest\", TaskRequest.class);\n\t\t\txstream.alias(\"property\", Entry.class);\n\t\t}\n\t\treturn xstream;\n\t}\n\n\tpublic String toXml(){\n\t\treturn \"<?xml version='1.0' encoding='UTF-8'?>\\r\\n\" + getXStream().toXML(this);\n\t}\n\n\tpublic static TaskRequest fromXml(String sXml){\n\t\treturn (TaskRequest)getXStream().fromXML(sXml);\n\t}\n\n}\n"
  },
  {
    "path": "src/main/java/io/sdb/common/entity/kuaidi100/TaskResponse.java",
    "content": "package io.sdb.common.entity.kuaidi100;\n\nimport com.thoughtworks.xstream.XStream;\n\npublic class TaskResponse {\n\tprivate static XStream xstream;\n\tprivate Boolean result;\n\tprivate String returnCode;\n\tprivate String message;\n\n\tpublic Boolean getResult() {\n\t\treturn result;\n\t}\n\n\tpublic void setResult(Boolean result) {\n\t\tthis.result = result;\n\t}\n\n\tpublic String getReturnCode() {\n\t\treturn returnCode;\n\t}\n\n\tpublic void setReturnCode(String returnCode) {\n\t\tthis.returnCode = returnCode;\n\t}\n\n\tpublic String getMessage() {\n\t\treturn message;\n\t}\n\n\tpublic void setMessage(String message) {\n\t\tthis.message = message;\n\t}\n\n\tprivate static XStream getXStream() {\n\t\tif (xstream == null) {\n\t\t\txstream = new XStream();\n\t\t\txstream.autodetectAnnotations(true);\n\t\t\txstream.alias(\"orderResponse\", TaskResponse.class);\n\t\t}\n\t\treturn xstream;\n\t}\n\n\tpublic String toXml(){\n\t\treturn \"<?xml version='1.0' encoding='UTF-8'?>\\r\\n\" + getXStream().toXML(this);\n\t}\n\n\tpublic static TaskResponse fromXml(String sXml){\n\t\treturn (TaskResponse)getXStream().fromXML(sXml);\n\t}\n\n\tpublic static void main(String[] args){\n\t\tTaskResponse req = new TaskResponse();\n\t\treq.setMessage(\"订阅成功\");\n\t\treq.setResult(true);\n\t\treq.setReturnCode(\"200\");\n\t\tSystem.out.print(req.toXml());\n\t}\n\n}\n"
  },
  {
    "path": "src/main/java/io/sdb/common/exception/RRException.java",
    "content": "package io.sdb.common.exception;\n\nimport io.sdb.enums.ResultEnum;\n\n/**\n * 自定义异常\n * \n * @author chenshun\n * @email sunlightcs@gmail.com\n * @date 2016年10月27日 下午10:11:27\n */\npublic class RRException extends RuntimeException {\n\tprivate static final long serialVersionUID = 1L;\n\t\n    private String msg;\n    private int code = 500;\n    \n    public RRException(String msg) {\n\t\tsuper(msg);\n\t\tthis.msg = msg;\n\t}\n\t\n\tpublic RRException(String msg, Throwable e) {\n\t\tsuper(msg, e);\n\t\tthis.msg = msg;\n\t}\n\t\n\tpublic RRException(String msg, int code) {\n\t\tsuper(msg);\n\t\tthis.msg = msg;\n\t\tthis.code = code;\n\t}\n\t\n\tpublic RRException(String msg, int code, Throwable e) {\n\t\tsuper(msg, e);\n\t\tthis.msg = msg;\n\t\tthis.code = code;\n\t}\n\n\tpublic RRException(ResultEnum resultEnum) {\n\t\tsuper(resultEnum.getMessage());\n\t\tthis.msg = resultEnum.getMessage();\n\t\tthis.code = resultEnum.getCode();\n\t}\n\n\tpublic String getMsg() {\n\t\treturn msg;\n\t}\n\n\tpublic void setMsg(String msg) {\n\t\tthis.msg = msg;\n\t}\n\n\tpublic int getCode() {\n\t\treturn code;\n\t}\n\n\tpublic void setCode(int code) {\n\t\tthis.code = code;\n\t}\n\t\n\t\n}\n"
  },
  {
    "path": "src/main/java/io/sdb/common/exception/RRExceptionHandler.java",
    "content": "package io.sdb.common.exception;\n\nimport io.sdb.common.utils.R;\nimport org.apache.shiro.authz.AuthorizationException;\nimport org.slf4j.Logger;\nimport org.slf4j.LoggerFactory;\nimport org.springframework.dao.DuplicateKeyException;\nimport org.springframework.web.bind.annotation.ExceptionHandler;\nimport org.springframework.web.bind.annotation.RestControllerAdvice;\nimport org.springframework.web.servlet.NoHandlerFoundException;\n\n/**\n * 异常处理器\n * \n * @author chenshun\n * @email sunlightcs@gmail.com\n * @date 2016年10月27日 下午10:16:19\n */\n@RestControllerAdvice\npublic class RRExceptionHandler {\n\tprivate Logger logger = LoggerFactory.getLogger(getClass());\n\n\t/**\n\t * 处理自定义异常\n\t */\n\t@ExceptionHandler(RRException.class)\n\tpublic R handleRRException(RRException e){\n\t\tR r = new R();\n\t\tr.put(\"code\", e.getCode());\n\t\tr.put(\"msg\", e.getMessage());\n\n\t\treturn r;\n\t}\n\n\t@ExceptionHandler(NoHandlerFoundException.class)\n\tpublic R handlerNoFoundException(Exception e) {\n\t\tlogger.error(e.getMessage(), e);\n\t\treturn R.error(404, \"路径不存在，请检查路径是否正确\");\n\t}\n\n\t@ExceptionHandler(DuplicateKeyException.class)\n\tpublic R handleDuplicateKeyException(DuplicateKeyException e){\n\t\tlogger.error(e.getMessage(), e);\n\t\treturn R.error(\"数据库中已存在该记录\");\n\t}\n\n\t@ExceptionHandler(AuthorizationException.class)\n\tpublic R handleAuthorizationException(AuthorizationException e){\n\t\tlogger.error(e.getMessage(), e);\n\t\treturn R.error(\"没有权限，请联系管理员授权\");\n\t}\n\n\t@ExceptionHandler(Exception.class)\n\tpublic R handleException(Exception e){\n\t\tlogger.error(e.getMessage(), e);\n\t\treturn R.error();\n\t}\n}\n"
  },
  {
    "path": "src/main/java/io/sdb/common/utils/ConfigConstant.java",
    "content": "package io.sdb.common.utils;\n\n/**\n * 系统参数相关Key\n * @author chenshun\n * @email sunlightcs@gmail.com\n * @date 2017-03-26 10:33\n */\npublic class ConfigConstant {\n    /**\n     * 云存储配置KEY\n     */\n    public final static String CLOUD_STORAGE_CONFIG_KEY = \"CLOUD_STORAGE_CONFIG_KEY\";\n}\n"
  },
  {
    "path": "src/main/java/io/sdb/common/utils/Constant.java",
    "content": "package io.sdb.common.utils;\n\n/**\n * 常量\n * \n * @author chenshun\n * @email sunlightcs@gmail.com\n * @date 2016年11月15日 下午1:23:52\n */\npublic class Constant {\n\t/** 超级管理员ID */\n\tpublic static final int SUPER_ADMIN = 1;\n\n\t/**\n\t * 菜单类型\n\t * \n\t * @author chenshun\n\t * @email sunlightcs@gmail.com\n\t * @date 2016年11月15日 下午1:24:29\n\t */\n    public enum MenuType {\n        /**\n         * 目录\n         */\n    \tCATALOG(0),\n        /**\n         * 菜单\n         */\n        MENU(1),\n        /**\n         * 按钮\n         */\n        BUTTON(2);\n\n        private int value;\n\n        MenuType(int value) {\n            this.value = value;\n        }\n\n        public int getValue() {\n            return value;\n        }\n    }\n    \n    /**\n     * 定时任务状态\n     * \n     * @author chenshun\n     * @email sunlightcs@gmail.com\n     * @date 2016年12月3日 上午12:07:22\n     */\n    public enum ScheduleStatus {\n        /**\n         * 正常\n         */\n    \tNORMAL(0),\n        /**\n         * 暂停\n         */\n    \tPAUSE(1);\n\n        private int value;\n\n        ScheduleStatus(int value) {\n            this.value = value;\n        }\n        \n        public int getValue() {\n            return value;\n        }\n    }\n\n    /**\n     * 云服务商\n     */\n    public enum CloudService {\n        /**\n         * 七牛云\n         */\n        QINIU(1),\n        /**\n         * 阿里云\n         */\n        ALIYUN(2),\n        /**\n         * 腾讯云\n         */\n        QCLOUD(3);\n\n        private int value;\n\n        CloudService(int value) {\n            this.value = value;\n        }\n\n        public int getValue() {\n            return value;\n        }\n    }\n\n    /**\n     * 是否上架\n     */\n    public enum Marketable {\n        /**\n         * 下架\n         */\n        OBTAINED(0),\n        /**\n         * 上架\n         */\n        SHELF(1);\n\n        private int value;\n\n        Marketable(int value) {this.value = value; }\n\n        public int getValue() {return value;}\n    }\n\n}\n"
  },
  {
    "path": "src/main/java/io/sdb/common/utils/DateUtils.java",
    "content": "/**\n * Copyright 2018\n * <p>\n * Licensed under the Apache License, Version 2.0 (the \"License\"); you may not\n * use this file except in compliance with the License. You may obtain a copy of\n * the License at\n * <p>\n * http://www.apache.org/licenses/LICENSE-2.0\n * <p>\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS, WITHOUT\n * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the\n * License for the specific language governing permissions and limitations under\n * the License.\n */\n\npackage io.sdb.common.utils;\n\nimport org.apache.commons.lang.StringUtils;\nimport org.joda.time.DateTime;\nimport org.joda.time.LocalDate;\nimport org.joda.time.format.DateTimeFormat;\nimport org.joda.time.format.DateTimeFormatter;\n\nimport java.text.SimpleDateFormat;\nimport java.util.Date;\n\n/**\n * 日期处理\n * \n * @author chenshun\n * @email sunlightcs@gmail.com\n * @date 2016年12月21日 下午12:53:33\n */\npublic class DateUtils {\n\t/** 时间格式(yyyy-MM-dd) */\n\tpublic final static String DATE_PATTERN = \"yyyy-MM-dd\";\n\t/** 时间格式(yyyy-MM-dd HH:mm:ss) */\n\tpublic final static String DATE_TIME_PATTERN = \"yyyy-MM-dd HH:mm:ss\";\n\n    /**\n     * 日期格式化 日期格式为：yyyy-MM-dd\n     * @param date  日期\n     * @return  返回yyyy-MM-dd格式日期\n     */\n\tpublic static String format(Date date) {\n        return format(date, DATE_PATTERN);\n    }\n\n    /**\n     * 日期格式化 日期格式为：yyyy-MM-dd\n     * @param date  日期\n     * @param pattern  格式，如：DateUtils.DATE_TIME_PATTERN\n     * @return  返回yyyy-MM-dd格式日期\n     */\n    public static String format(Date date, String pattern) {\n        if(date != null){\n            SimpleDateFormat df = new SimpleDateFormat(pattern);\n            return df.format(date);\n        }\n        return null;\n    }\n\n    /**\n     * 字符串转换成日期\n     * @param strDate 日期字符串\n     * @param pattern 日期的格式，如：DateUtils.DATE_TIME_PATTERN\n     */\n    public static Date stringToDate(String strDate, String pattern) {\n        if (StringUtils.isBlank(strDate)){\n            return null;\n        }\n\n        DateTimeFormatter fmt = DateTimeFormat.forPattern(pattern);\n        return fmt.parseLocalDateTime(strDate).toDate();\n    }\n\n    /**\n     * 根据周数，获取开始日期、结束日期\n     * @param week  周期  0本周，-1上周，-2上上周，1下周，2下下周\n     * @return  返回date[0]开始日期、date[1]结束日期\n     */\n    public static Date[] getWeekStartAndEnd(int week) {\n        DateTime dateTime = new DateTime();\n        LocalDate date = new LocalDate(dateTime.plusWeeks(week));\n\n        date = date.dayOfWeek().withMinimumValue();\n        Date beginDate = date.toDate();\n        Date endDate = date.plusDays(6).toDate();\n        return new Date[]{beginDate, endDate};\n    }\n\n    /**\n     * 对日期的【秒】进行加/减\n     *\n     * @param date 日期\n     * @param seconds 秒数，负数为减\n     * @return 加/减几秒后的日期\n     */\n    public static Date addDateSeconds(Date date, int seconds) {\n        DateTime dateTime = new DateTime(date);\n        return dateTime.plusSeconds(seconds).toDate();\n    }\n\n    /**\n     * 对日期的【分钟】进行加/减\n     *\n     * @param date 日期\n     * @param minutes 分钟数，负数为减\n     * @return 加/减几分钟后的日期\n     */\n    public static Date addDateMinutes(Date date, int minutes) {\n        DateTime dateTime = new DateTime(date);\n        return dateTime.plusMinutes(minutes).toDate();\n    }\n\n    /**\n     * 对日期的【小时】进行加/减\n     *\n     * @param date 日期\n     * @param hours 小时数，负数为减\n     * @return 加/减几小时后的日期\n     */\n    public static Date addDateHours(Date date, int hours) {\n        DateTime dateTime = new DateTime(date);\n        return dateTime.plusHours(hours).toDate();\n    }\n\n    /**\n     * 对日期的【天】进行加/减\n     *\n     * @param date 日期\n     * @param days 天数，负数为减\n     * @return 加/减几天后的日期\n     */\n    public static Date addDateDays(Date date, int days) {\n        DateTime dateTime = new DateTime(date);\n        return dateTime.plusDays(days).toDate();\n    }\n\n    /**\n     * 对日期的【周】进行加/减\n     *\n     * @param date 日期\n     * @param weeks 周数，负数为减\n     * @return 加/减几周后的日期\n     */\n    public static Date addDateWeeks(Date date, int weeks) {\n        DateTime dateTime = new DateTime(date);\n        return dateTime.plusWeeks(weeks).toDate();\n    }\n\n    /**\n     * 对日期的【月】进行加/减\n     *\n     * @param date 日期\n     * @param months 月数，负数为减\n     * @return 加/减几月后的日期\n     */\n    public static Date addDateMonths(Date date, int months) {\n        DateTime dateTime = new DateTime(date);\n        return dateTime.plusMonths(months).toDate();\n    }\n\n    /**\n     * 对日期的【年】进行加/减\n     *\n     * @param date 日期\n     * @param years 年数，负数为减\n     * @return 加/减几年后的日期\n     */\n    public static Date addDateYears(Date date, int years) {\n        DateTime dateTime = new DateTime(date);\n        return dateTime.plusYears(years).toDate();\n    }\n}\n"
  },
  {
    "path": "src/main/java/io/sdb/common/utils/EnumUtil.java",
    "content": "package io.sdb.common.utils;\n\nimport io.sdb.enums.IEnum;\n\npublic class EnumUtil {\n\n    public static <T extends IEnum> T getByCode(Integer code, Class<T> enumClass) {\n        for (T each: enumClass.getEnumConstants()) {\n            if (code.equals(each.getCode())) {\n                return each;\n            }\n        }\n        return null;\n    }\n\n    public static <T extends IEnum> T getByMsg(String msg, Class<T> enumClass) {\n        for (T each: enumClass.getEnumConstants()) {\n            if (msg.equalsIgnoreCase(each.getMessage())) {\n                return each;\n            }\n        }\n        return null;\n    }\n}\n"
  },
  {
    "path": "src/main/java/io/sdb/common/utils/GenericsUtils.java",
    "content": "package io.sdb.common.utils;\n\nimport java.lang.reflect.ParameterizedType;\nimport java.lang.reflect.Type;\n\npublic class GenericsUtils {\n\t/**  \n\t * 通过反射,获得定义Class时声明的父类的范型参数的类型.  \n\t * 如public BookManager extends GenricManager<Book>  \n\t *  \n\t * @param clazz The class to introspect  \n\t * @return the first generic declaration, or <code>Object.class</code> if cannot be determined  \n\t */\n\tpublic static Class getSuperClassGenricType(Class clazz) {\n\t\treturn getSuperClassGenricType(clazz, 0);\n\t}\n\n\t/**  \n\t * 通过反射,获得定义Class时声明的父类的范型参数的类型.  \n\t * 如public BookManager extends GenricManager<Book>  \n\t *  \n\t * @param clazz clazz The class to introspect  \n\t * @param index the Index of the generic ddeclaration,start from 0.  \n\t */\n\tpublic static Class getSuperClassGenricType(Class clazz, int index) throws IndexOutOfBoundsException {\n\n\t\tType genType = clazz.getGenericSuperclass();\n\n\t\tif (!(genType instanceof ParameterizedType)) {\n\t\t\treturn Object.class;\n\t\t}\n\n\t\tType[] params = ((ParameterizedType) genType).getActualTypeArguments();\n\n\t\tif (index >= params.length || index < 0) {\n\t\t\treturn Object.class;\n\t\t}\n\t\tif (!(params[index] instanceof Class)) {\n\t\t\treturn Object.class;\n\t\t}\n\t\treturn (Class) params[index];\n\t}\n\t\n}"
  },
  {
    "path": "src/main/java/io/sdb/common/utils/HttpContextUtils.java",
    "content": "package io.sdb.common.utils;\n\nimport org.springframework.web.context.request.RequestContextHolder;\nimport org.springframework.web.context.request.ServletRequestAttributes;\n\nimport javax.servlet.http.HttpServletRequest;\n\npublic class HttpContextUtils {\n\n\tpublic static HttpServletRequest getHttpServletRequest() {\n\t\treturn ((ServletRequestAttributes) RequestContextHolder.getRequestAttributes()).getRequest();\n\t}\n\n\tpublic static String getDomain(){\n\t\tHttpServletRequest request = getHttpServletRequest();\n\t\tStringBuffer url = request.getRequestURL();\n\t\treturn url.delete(url.length() - request.getRequestURI().length(), url.length()).toString();\n\t}\n\n\tpublic static String getOrigin(){\n\t\tHttpServletRequest request = getHttpServletRequest();\n\t\treturn request.getHeader(\"Origin\");\n\t}\n}\n"
  },
  {
    "path": "src/main/java/io/sdb/common/utils/HttpRequest.java",
    "content": "package io.sdb.common.utils;\n\nimport com.jfinal.kit.LogKit;\nimport org.apache.http.HttpEntity;\nimport org.apache.http.NameValuePair;\nimport org.apache.http.StatusLine;\nimport org.apache.http.client.entity.UrlEncodedFormEntity;\nimport org.apache.http.client.methods.CloseableHttpResponse;\nimport org.apache.http.client.methods.HttpPost;\nimport org.apache.http.impl.client.CloseableHttpClient;\nimport org.apache.http.impl.client.HttpClients;\nimport org.apache.http.message.BasicNameValuePair;\nimport org.apache.http.util.EntityUtils;\n\nimport java.util.ArrayList;\nimport java.util.Iterator;\nimport java.util.List;\nimport java.util.Map;\n\npublic class HttpRequest {\n\t\n\tpublic static String addUrl(String head, String tail) {\n\t\tif (head.endsWith(\"/\")) {\n\t\t\tif (tail.startsWith(\"/\")) {\n\t\t\t\treturn head.substring(0, head.length() - 1) + tail;\n\t\t\t} else {\n\t\t\t\treturn head + tail;\n\t\t\t}\n\t\t} else {\n\t\t\tif (tail.startsWith(\"/\")) {\n\t\t\t\treturn head + tail;\n\t\t\t} else {\n\t\t\t\treturn head + \"/\" + tail;\n\t\t\t}\n\t\t}\n\t}\n\n\tpublic synchronized static String postData(String url, Map<String, String> params) throws Exception {\n        CloseableHttpClient httpclient = HttpClients.createDefault();\n\t    HttpPost httpPost = new HttpPost(url);\n\t\t//拼接参数\n\t\tList<NameValuePair> nvps = new ArrayList<NameValuePair>();\n\n        NameValuePair[] nameValuePairArray = assembleRequestParams(params);\n        for (NameValuePair value:nameValuePairArray\n             ) {\n            nvps.add(value);\n        }\n\n        httpPost.setEntity(new UrlEncodedFormEntity(nvps, \"UTF-8\"));\n\t\tCloseableHttpResponse response = httpclient.execute(httpPost);\n        String result = \"\";\n        try {\n            StatusLine statusLine = response.getStatusLine();\n\t\t\tHttpEntity entity = response.getEntity();\n            // do something useful with the response body\n            if (entity != null) {\n                result = EntityUtils.toString(entity, \"UTF-8\");\n            }else{\n                LogKit.error(\"httpRequest postData1 error entity = null code = \"+statusLine.getStatusCode());\n            }\n\t\t\t// and ensure it is fully consumed\n\t\t\t//消耗掉response\n\t\t\tEntityUtils.consume(entity);\n\t\t} finally {\n\t\t\tresponse.close();\n\t\t}\n\n\t\treturn result;\n\t}\n\n\tpublic synchronized static String postData(String url) throws Exception {\n        CloseableHttpClient httpclient = HttpClients.createDefault();\n        HttpPost httpPost = new HttpPost(url);\n        CloseableHttpResponse response = httpclient.execute(httpPost);\n        String result = \"\";\n        try {\n            StatusLine statusLine = response.getStatusLine();\n            HttpEntity entity = response.getEntity();\n            // do something useful with the response body\n            if (entity != null) {\n                result = EntityUtils.toString(entity, \"UTF-8\");\n            }else{\n                LogKit.error(\"httpRequest postData2 error entity = null code = \"+statusLine.getStatusCode());\n            }\n            // and ensure it is fully consumed\n            //消耗掉response\n            EntityUtils.consume(entity);\n        } finally {\n            response.close();\n        }\n\n        return result;\n\t}\n\n\t/**\n\t * 组装http请求参数\n\t * @return\n\t */\n\tprivate synchronized static NameValuePair[] assembleRequestParams(Map<String, String> data) {\n\t\tfinal List<NameValuePair> nameValueList = new ArrayList<NameValuePair>();\n\n\t\tIterator<Map.Entry<String, String>> it = data.entrySet().iterator();\n\t\twhile (it.hasNext()) {\n\t\t\tMap.Entry<String, String> entry = (Map.Entry<String, String>) it.next();\n\t\t\tnameValueList.add(new BasicNameValuePair((String) entry.getKey(), (String) entry.getValue()));\n\t\t}\n\n\t\treturn nameValueList.toArray(new NameValuePair[nameValueList.size()]);\n\t}\n\n}\n"
  },
  {
    "path": "src/main/java/io/sdb/common/utils/IPUtils.java",
    "content": "package io.sdb.common.utils;\n\nimport com.alibaba.druid.util.StringUtils;\nimport org.slf4j.Logger;\nimport org.slf4j.LoggerFactory;\n\nimport javax.servlet.http.HttpServletRequest;\n\n/**\n * IP地址\n * \n * @author chenshun\n * @email sunlightcs@gmail.com\n * @date 2017年3月8日 下午12:57:02\n */\npublic class IPUtils {\n\tprivate static Logger logger = LoggerFactory.getLogger(IPUtils.class);\n\n\t/**\n\t * 获取IP地址\n\t * \n\t * 使用Nginx等反向代理软件， 则不能通过request.getRemoteAddr()获取IP地址\n\t * 如果使用了多级反向代理的话，X-Forwarded-For的值并不止一个，而是一串IP地址，X-Forwarded-For中第一个非unknown的有效IP字符串，则为真实IP地址\n\t */\n\tpublic static String getIpAddr(HttpServletRequest request) {\n    \tString ip = null;\n        try {\n            ip = request.getHeader(\"x-forwarded-for\");\n            if (StringUtils.isEmpty(ip) || \"unknown\".equalsIgnoreCase(ip)) {\n                ip = request.getHeader(\"Proxy-Client-IP\");\n            }\n            if (StringUtils.isEmpty(ip) || ip.length() == 0 || \"unknown\".equalsIgnoreCase(ip)) {\n                ip = request.getHeader(\"WL-Proxy-Client-IP\");\n            }\n            if (StringUtils.isEmpty(ip) || \"unknown\".equalsIgnoreCase(ip)) {\n                ip = request.getHeader(\"HTTP_CLIENT_IP\");\n            }\n            if (StringUtils.isEmpty(ip) || \"unknown\".equalsIgnoreCase(ip)) {\n                ip = request.getHeader(\"HTTP_X_FORWARDED_FOR\");\n            }\n            if (StringUtils.isEmpty(ip) || \"unknown\".equalsIgnoreCase(ip)) {\n                ip = request.getRemoteAddr();\n            }\n        } catch (Exception e) {\n        \tlogger.error(\"IPUtils ERROR \", e);\n        }\n        \n//        //使用代理，则获取第一个IP地址\n//        if(StringUtils.isEmpty(ip) && ip.length() > 15) {\n//\t\t\tif(ip.indexOf(\",\") > 0) {\n//\t\t\t\tip = ip.substring(0, ip.indexOf(\",\"));\n//\t\t\t}\n//\t\t}\n        \n        return ip;\n    }\n\t\n}\n"
  },
  {
    "path": "src/main/java/io/sdb/common/utils/JfEnjoy.java",
    "content": "package io.sdb.common.utils;\n\nimport com.jfinal.kit.Kv;\nimport com.jfinal.kit.PathKit;\nimport com.jfinal.template.Engine;\n\nimport java.io.BufferedWriter;\nimport java.io.File;\nimport java.io.FileWriter;\nimport java.io.IOException;\n\npublic class JfEnjoy {\n    /**\n     * 根据具体魔板生成文件\n     * @param templateFileName  模板文件名称\n     * @param kv                渲染参数\n     * @param filePath          输出目录\n     * @return\n     */\n    public boolean render(String templateFileName, Kv kv, StringBuilder filePath)  {\n        BufferedWriter output = null;\n        try {\n            String baseTemplatePath = new StringBuilder(PathKit.getWebRootPath())\n                    .append(\"/src/main/java/\")\n                    .append(PathKit.getPackagePath(this))\n                    .append(\"/tpl\")\n                    .toString();\n\n            File file = new File(filePath.toString());\n            if(file.exists()){\n                return true;\n            }\n            File path = new File(file.getParent());\n            if ( ! path.exists() ) {\n                path.mkdirs();\n            }\n            output = new BufferedWriter(new FileWriter(file));\n\n            Engine.use()\n                    .setBaseTemplatePath(baseTemplatePath)\n                    .getTemplate(templateFileName)\n                    .render(kv, output);\n\n            return true;\n        } catch (IOException e) {\n            e.printStackTrace();\n            return false;\n        }finally{\n            try { if( output != null ) output.close(); } catch (IOException e) {}\n        }\n    }\n\n    /**\n     * 根据自定义内容生成文件\n     * @param data              自定义内容\n     * @param filePath          输出目录\n     * @return\n     */\n    public boolean render(String data, StringBuilder filePath)  {\n        BufferedWriter output = null;\n        try {\n\n            File file = new File(filePath.toString());\n\n            File path = new File(file.getParent());\n            if ( ! path.exists() ) {\n                path.mkdirs();\n            }\n            output = new BufferedWriter(new FileWriter(file));\n\n            output.write(data);\n            return true;\n        } catch (IOException e) {\n            e.printStackTrace();\n            return false;\n        }finally{\n            try { if( output != null ) output.close(); } catch (IOException e) {}\n        }\n    }\n}\n"
  },
  {
    "path": "src/main/java/io/sdb/common/utils/JsonUtils.java",
    "content": "package io.sdb.common.utils;\n\nimport com.fasterxml.jackson.annotation.JsonInclude.Include;\nimport com.fasterxml.jackson.core.JsonProcessingException;\nimport com.fasterxml.jackson.databind.ObjectMapper;\nimport com.fasterxml.jackson.databind.SerializationFeature;\n\n/**\n * @author <a href=\"https://github.com/binarywang\">Binary Wang</a>\n */\npublic class JsonUtils {\n    private static final ObjectMapper JSON = new ObjectMapper();\n\n    static {\n        JSON.setSerializationInclusion(Include.NON_NULL);\n        JSON.configure(SerializationFeature.INDENT_OUTPUT, Boolean.TRUE);\n    }\n\n    public static String toJson(Object obj) {\n        try {\n            return JSON.writeValueAsString(obj);\n        } catch (JsonProcessingException e) {\n            e.printStackTrace();\n        }\n\n        return null;\n    }\n}\n"
  },
  {
    "path": "src/main/java/io/sdb/common/utils/JwtUtils.java",
    "content": "package io.sdb.common.utils;\n\nimport io.jsonwebtoken.Claims;\nimport io.jsonwebtoken.Jwts;\nimport io.jsonwebtoken.SignatureAlgorithm;\nimport org.slf4j.Logger;\nimport org.slf4j.LoggerFactory;\nimport org.springframework.boot.context.properties.ConfigurationProperties;\nimport org.springframework.stereotype.Component;\n\nimport java.util.Date;\n\n/**\n * jwt工具类\n * @author chenshun\n * @email sunlightcs@gmail.com\n * @date 2017/9/21 22:21\n */\n@ConfigurationProperties(prefix = \"sdb.jwt\")\n@Component\npublic class JwtUtils {\n    private Logger logger = LoggerFactory.getLogger(getClass());\n\n    private String secret;\n    private long expire;\n    private String header;\n\n    /**\n     * 生成jwt token\n     */\n    public String generateToken(String userId) {\n        Date nowDate = new Date();\n        //过期时间\n        Date expireDate = new Date(nowDate.getTime() + expire * 1000);\n\n        return Jwts.builder()\n                .setHeaderParam(\"typ\", \"JWT\")\n                .setSubject(userId+\"\")\n                .setIssuedAt(nowDate)\n                .setExpiration(expireDate)\n                .signWith(SignatureAlgorithm.HS512, secret)\n                .compact();\n    }\n\n    public Claims getClaimByToken(String token) {\n        try {\n            return Jwts.parser()\n                    .setSigningKey(secret)\n                    .parseClaimsJws(token)\n                    .getBody();\n        }catch (Exception e){\n            logger.debug(\"validate is token error \", e);\n            return null;\n        }\n    }\n\n    /**\n     * token是否过期\n     * @return  true：过期\n     */\n    public boolean isTokenExpired(Date expiration) {\n        return expiration.before(new Date());\n    }\n\n    public String getSecret() {\n        return secret;\n    }\n\n    public void setSecret(String secret) {\n        this.secret = secret;\n    }\n\n    public long getExpire() {\n        return expire;\n    }\n\n    public void setExpire(long expire) {\n        this.expire = expire;\n    }\n\n    public String getHeader() {\n        return header;\n    }\n\n    public void setHeader(String header) {\n        this.header = header;\n    }\n}\n"
  },
  {
    "path": "src/main/java/io/sdb/common/utils/MapUtils.java",
    "content": "/**\n * Copyright 2018\n * <p>\n * Licensed under the Apache License, Version 2.0 (the \"License\"); you may not\n * use this file except in compliance with the License. You may obtain a copy of\n * the License at\n * <p>\n * http://www.apache.org/licenses/LICENSE-2.0\n * <p>\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS, WITHOUT\n * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the\n * License for the specific language governing permissions and limitations under\n * the License.\n */\n\npackage io.sdb.common.utils;\n\nimport java.util.HashMap;\n\n\n/**\n * Map工具类\n *\n * @author Mark sunlightcs@gmail.com\n * @since 2.0.0\n */\npublic class MapUtils extends HashMap<String, Object> {\n\n    @Override\n    public MapUtils put(String key, Object value) {\n        super.put(key, value);\n        return this;\n    }\n}\n"
  },
  {
    "path": "src/main/java/io/sdb/common/utils/MoneyUtils.java",
    "content": "package io.sdb.common.utils;\n\npublic class MoneyUtils {\n\n    /**\n     * 数字金额大写转换，思想先写个完整的然后将如零拾替换成零 要用到正则表达式\n     */\n    public static String digitUppercase(double n) {\n        String fraction[] = {\"角\", \"分\"};\n        String digit[] = {\"零\", \"壹\", \"贰\", \"叁\", \"肆\", \"伍\", \"陆\", \"柒\", \"捌\", \"玖\"};\n        String unit[][] = {{\"元\", \"万\", \"亿\"}, {\"\", \"拾\", \"佰\", \"仟\"}};\n\n        String head = n < 0 ? \"负\" : \"\";\n        n = Math.abs(n);\n\n        String s = \"\";\n        for (int i = 0; i < fraction.length; i++) {\n            s += (digit[(int) (Math.floor(n * 10 * Math.pow(10, i)) % 10)] + fraction[i]).replaceAll(\"(零.)+\", \"\");\n        }\n        if (s.length() < 1) {\n            s = \"整\";\n        }\n        int integerPart = (int) Math.floor(n);\n\n        for (int i = 0; i < unit[0].length && integerPart > 0; i++) {\n            String p = \"\";\n            for (int j = 0; j < unit[1].length && n > 0; j++) {\n                p = digit[integerPart % 10] + unit[1][j] + p;\n                integerPart = integerPart / 10;\n            }\n            s = p.replaceAll(\"(零.)*零$\", \"\").replaceAll(\"^$\", \"零\") + unit[0][i] + s;\n        }\n        return head + s.replaceAll(\"(零.)*零元\", \"元\").replaceFirst(\"(零.)+\", \"\").replaceAll(\"(零.)+\", \"零\").replaceAll(\"^整$\", \"零元整\");\n\n    }\n\n    private void number2Invoice(int num) {\n        //12345\n        String mark[] = new String[]{\"\", \"十\", \"百\", \"千\", \"万\", \"十\", \"百\", \"千\", \"亿\", \"十\", \"百\", \"千\", \"万\"};\n        String numCn[] = new String[]{\"零\", \"一\", \"二\", \"三\", \"四\", \"五\", \"六\", \"七\", \"八\", \"九\"};\n\n        char[] numArrRev = String.valueOf(num).toCharArray();\n\n        StringBuffer container = new StringBuffer();\n        for (int i = 0; i < numArrRev.length; i++) {\n            Integer val = Integer.valueOf(String.valueOf(numArrRev[i]));\n            String number = numCn[val];\n            int x = numArrRev.length - i - 1;\n            String sign = mark[x];\n\n            if (val == 0) {\n                if (x % 4 != 0) {// 删除单位\n                    sign = \"\";\n                }\n                if (i < numArrRev.length - 1) {\n                    Integer val1 = Integer.parseInt(String.valueOf(numArrRev[i + 1]));\n                    if (val == 0 && val == val1) {\n                        number = \"\";\n                    } else if (val == 0 && (\"万\".equals(sign) || \"亿\".equals(sign))) {\n                        number = \"\";\n                    }\n                } else if (i == numArrRev.length - 1) {\n                    number = \"\";\n                }\n            }\n\n            container.append(number + sign);\n        }\n\n        System.out.println(num + \"-->\" + container.toString());\n    }\n\n}\n"
  },
  {
    "path": "src/main/java/io/sdb/common/utils/PageUtils.java",
    "content": "/**\n * Copyright 2018\n * <p>\n * Licensed under the Apache License, Version 2.0 (the \"License\"); you may not\n * use this file except in compliance with the License. You may obtain a copy of\n * the License at\n * <p>\n * http://www.apache.org/licenses/LICENSE-2.0\n * <p>\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS, WITHOUT\n * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the\n * License for the specific language governing permissions and limitations under\n * the License.\n */\n\npackage io.sdb.common.utils;\n\nimport java.io.Serializable;\nimport java.util.List;\n\n/**\n * 分页工具类\n * \n * @author chenshun\n * @email sunlightcs@gmail.com\n * @date 2016年11月4日 下午12:59:00\n */\npublic class PageUtils implements Serializable {\n\tprivate static final long serialVersionUID = 1L;\n\t//总记录数\n\tprivate int totalCount;\n\t//每页记录数\n\tprivate int pageSize;\n\t//总页数\n\tprivate int totalPage;\n\t//当前页数\n\tprivate int currPage;\n\t//列表数据\n\tprivate List<?> list;\n\t\n\t/**\n\t * 分页\n\t * @param list        列表数据\n\t * @param totalCount  总记录数\n\t * @param pageSize    每页记录数\n\t * @param currPage    当前页数\n\t */\n\tpublic PageUtils(List<?> list, int totalCount, int pageSize, int currPage) {\n\t\tthis.list = list;\n\t\tthis.totalCount = totalCount;\n\t\tthis.pageSize = pageSize;\n\t\tthis.currPage = currPage;\n\t\tthis.totalPage = (int)Math.ceil((double)totalCount/pageSize);\n\t}\n\n\t/**\n\t * 分页\n\t */\n\tpublic PageUtils(com.jfinal.plugin.activerecord.Page<?> page) {\n\t\tthis.list = page.getList();\n\t\tthis.totalCount = page.getTotalRow();\n\t\tthis.pageSize = page.getPageSize();\n\t\tthis.currPage = page.getPageNumber();\n\t\tthis.totalPage = page.getTotalPage();\n\t}\n\n\tpublic int getTotalCount() {\n\t\treturn totalCount;\n\t}\n\n\tpublic void setTotalCount(int totalCount) {\n\t\tthis.totalCount = totalCount;\n\t}\n\n\tpublic int getPageSize() {\n\t\treturn pageSize;\n\t}\n\n\tpublic void setPageSize(int pageSize) {\n\t\tthis.pageSize = pageSize;\n\t}\n\n\tpublic int getTotalPage() {\n\t\treturn totalPage;\n\t}\n\n\tpublic void setTotalPage(int totalPage) {\n\t\tthis.totalPage = totalPage;\n\t}\n\n\tpublic int getCurrPage() {\n\t\treturn currPage;\n\t}\n\n\tpublic void setCurrPage(int currPage) {\n\t\tthis.currPage = currPage;\n\t}\n\n\tpublic List<?> getList() {\n\t\treturn list;\n\t}\n\n\tpublic void setList(List<?> list) {\n\t\tthis.list = list;\n\t}\n\t\n}\n"
  },
  {
    "path": "src/main/java/io/sdb/common/utils/Query.java",
    "content": "/**\n * Copyright 2018\n * <p>\n * Licensed under the Apache License, Version 2.0 (the \"License\"); you may not\n * use this file except in compliance with the License. You may obtain a copy of\n * the License at\n * <p>\n * http://www.apache.org/licenses/LICENSE-2.0\n * <p>\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS, WITHOUT\n * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the\n * License for the specific language governing permissions and limitations under\n * the License.\n */\n\npackage io.sdb.common.utils;\n\nimport io.sdb.common.xss.SQLFilter;\nimport io.sdb.common.entity.Order;\nimport lombok.Data;\nimport org.apache.commons.lang.StringUtils;\n\nimport java.util.LinkedHashMap;\nimport java.util.Map;\n\n/**\n * 查询参数\n *\n * @author Mark sunlightcs@gmail.com\n * @since 2.0.0 2017-03-14\n */\n@Data\npublic class Query<T> extends LinkedHashMap<String, Object> {\n\tprivate static final long serialVersionUID = 1L;\n\n    /**\n     * 当前页码\n     */\n    private int currPage = 1;\n    /**\n     * 每页条数\n     */\n    private int limit = 10;\n\n    private Order order;\n\n    public Query(Map<String, Object> params){\n        this.putAll(params);\n\n        //分页参数\n        if(params.get(\"page\") != null){\n            currPage = Integer.parseInt((String)params.get(\"page\"));\n        }\n        if(params.get(\"limit\") != null){\n            limit = Integer.parseInt((String)params.get(\"limit\"));\n        }\n\n        this.put(\"offset\", (currPage - 1) * limit);\n        this.put(\"page\", currPage);\n        this.put(\"limit\", limit);\n\n        //防止SQL注入（因为sidx、order是通过拼接SQL实现排序的，会有SQL注入风险）\n        String sidx = SQLFilter.sqlInject((String)params.get(\"sidx\"));\n        String strOrder = SQLFilter.sqlInject((String)params.get(\"order\"));\n        this.put(\"sidx\", sidx);\n        this.put(\"order\", strOrder);\n\n        //排序\n        if(StringUtils.isNotBlank(sidx) && StringUtils.isNotBlank(strOrder)){\n            order = new Order();\n            order.setProperty(sidx);\n            order.setDirection(\"ASC\".equalsIgnoreCase(strOrder)? Order.Direction.asc: Order.Direction.desc);\n        }\n\n    }\n\n    public int getCurrPage() {\n        return currPage;\n    }\n\n    public int getLimit() {\n        return limit;\n    }\n}\n"
  },
  {
    "path": "src/main/java/io/sdb/common/utils/R.java",
    "content": "package io.sdb.common.utils;\n\nimport io.sdb.enums.ResultEnum;\nimport org.apache.http.HttpStatus;\n\nimport java.util.HashMap;\nimport java.util.Map;\n\n/**\n * 返回数据\n * \n * @author chenshun\n * @email sunlightcs@gmail.com\n * @date 2016年10月27日 下午9:59:27\n */\npublic class R extends HashMap<String, Object> {\n\tprivate static final long serialVersionUID = 1L;\n\t\n\tpublic R() {\n\t\tput(\"code\", 0);\n\t\tput(\"msg\", \"success\");\n\t}\n\t\n\tpublic static R error() {\n\t\treturn error(HttpStatus.SC_INTERNAL_SERVER_ERROR, \"未知异常，请联系管理员\");\n\t}\n\t\n\tpublic static R error(String msg) {\n\t\treturn error(HttpStatus.SC_INTERNAL_SERVER_ERROR, msg);\n\t}\n\t\n\tpublic static R error(int code, String msg) {\n\t\tR r = new R();\n\t\tr.put(\"code\", code);\n\t\tr.put(\"msg\", msg);\n\t\treturn r;\n\t}\n\n\tpublic static R ok(String msg) {\n\t\tR r = new R();\n\t\tr.put(\"msg\", msg);\n\t\treturn r;\n\t}\n\t\n\tpublic static R ok(Map<String, Object> map) {\n\t\tR r = new R();\n\t\tr.putAll(map);\n\t\treturn r;\n\t}\n\t\n\tpublic static R ok() {\n\t\treturn new R();\n\t}\n\n\tpublic R put(String key, Object value) {\n\t\tsuper.put(key, value);\n\t\treturn this;\n\t}\n\n\tpublic static R error(ResultEnum resultEnum){\n\t\treturn error(resultEnum.getCode(), resultEnum.getMessage());\n\t}\n}\n"
  },
  {
    "path": "src/main/java/io/sdb/common/utils/RecordUtils.java",
    "content": "package io.sdb.common.utils;\n\nimport com.alibaba.fastjson.JSON;\n\nimport org.slf4j.Logger;\nimport org.slf4j.LoggerFactory;\nimport com.jfinal.plugin.activerecord.Record;\n\nimport java.util.List;\nimport java.util.Map;\nimport java.util.stream.Collectors;\n\npublic class RecordUtils {\n\n    private static final Logger logger = LoggerFactory.getLogger(RecordUtils.class);\n\n    /**\n     * Record 转 任意实例类\n     *\n     * @param record\n     * @return\n     */\n    public static <T> T converModel(Record record, Class<T> clazz) {\n        String str = JSON.toJSONString(record.getColumns());\n        T obj = JSON.parseObject(str, clazz);\n        return obj;\n    }\n\n    /**\n     * Record 转 任意实例类\n     *\n     * @param recordList\n     * @return\n     */\n    public static <T> List<T> converModel(List<Record> recordList, Class<T> clazz) {\n\n        List<Map<String, Object>> list = recordList.stream().map(item -> {\n            return item.getColumns();\n        }).collect(Collectors.toList());\n\n        String str = JSON.toJSONString(list);\n        List<T> arr = JSON.parseArray(str, clazz);\n        return arr;\n    }\n}"
  },
  {
    "path": "src/main/java/io/sdb/common/utils/RedisKeys.java",
    "content": "package io.sdb.common.utils;\n\n/**\n * Redis所有Keys\n *\n * @author chenshun\n * @email sunlightcs@gmail.com\n * @date 2017-07-18 19:51\n */\npublic class RedisKeys {\n\n    public static String getSysConfigKey(String key){\n        return \"sys:config:\" + key;\n    }\n}\n"
  },
  {
    "path": "src/main/java/io/sdb/common/utils/RedisLock.java",
    "content": "package io.sdb.common.utils;\n\nimport lombok.extern.slf4j.Slf4j;\nimport org.apache.commons.lang3.StringUtils;\nimport org.springframework.beans.factory.annotation.Autowired;\nimport org.springframework.data.redis.core.StringRedisTemplate;\nimport org.springframework.stereotype.Component;\n\n@Component\n@Slf4j\npublic class RedisLock {\n\n    @Autowired\n    private StringRedisTemplate redisTemplate;\n\n    public boolean lock(String key, String value) {\n        if (redisTemplate.opsForValue().setIfAbsent(key, value)) {\n            log.info(\"【RedisLock】成功加锁 setIfAbsent >>>>>>>>>>>>>>>>>>>>  threadId= {} key = {} aoldValue = {} time= {}\", Thread.currentThread().getId(),key, System.currentTimeMillis());\n            return true;\n        }\n\n        String currentValue = redisTemplate.opsForValue().get(key);\n        if (!StringUtils.isEmpty(currentValue) && Long.parseLong(currentValue) < System.currentTimeMillis()) {\n            log.info(\"【redislock 超时解锁】currentValue={} System.currentTimeMillis()={} threadId= {} time= {}\", currentValue, System.currentTimeMillis(), Thread.currentThread().getId(), System.currentTimeMillis());\n            String oldValue = redisTemplate.opsForValue().getAndSet(key, value);\n            if (!StringUtils.isEmpty(oldValue) && oldValue.equals(currentValue)) {\n                log.info(\"【RedisLock】成功加锁 超时解锁 >>>>>>>>>>>>>>>>>>>>  threadId= {}\", Thread.currentThread().getId());\n                return true;\n            }\n\n        }\n\n        return false;\n    }\n\n    public void unlock(String key, String value) {\n        try {\n            String currentValue = redisTemplate.opsForValue().get(key);\n            if (!StringUtils.isEmpty(currentValue) && currentValue.equals(value)) {\n                redisTemplate.opsForValue().getOperations().delete(key);\n                log.info(\"【RedisLock】unlock >>>>>>>>>>>>>>>>>>>>  threadId= {} stock = {} time= {}\", Thread.currentThread().getId(), 0, System.currentTimeMillis());\n                return;\n            }\n        } catch (Exception e) {\n            log.error(\"【redis分布式做】解锁\", e);\n        }\n    }\n\n}\n"
  },
  {
    "path": "src/main/java/io/sdb/common/utils/RedisUtils.java",
    "content": "package io.sdb.common.utils;\n\nimport com.google.gson.Gson;\nimport org.springframework.beans.factory.annotation.Autowired;\nimport org.springframework.data.redis.core.*;\nimport org.springframework.stereotype.Component;\n\nimport java.util.concurrent.TimeUnit;\n\n/**\n * Redis工具类\n *\n * @author chenshun\n * @email sunlightcs@gmail.com\n * @date 2017-07-17 21:12\n */\n@Component\npublic class RedisUtils {\n    @Autowired\n    private RedisTemplate<String, Object> redisTemplate;\n    @Autowired\n    private ValueOperations<String, String> valueOperations;\n    @Autowired\n    private HashOperations<String, String, Object> hashOperations;\n    @Autowired\n    private ListOperations<String, Object> listOperations;\n    @Autowired\n    private SetOperations<String, Object> setOperations;\n    @Autowired\n    private ZSetOperations<String, Object> zSetOperations;\n    /**  默认过期时长，单位：秒 */\n    public final static long DEFAULT_EXPIRE = 60 * 60 * 24;\n    /**  不设置过期时长 */\n    public final static long NOT_EXPIRE = -1;\n    private final static Gson gson = new Gson();\n\n    public void set(String key, Object value, long expire){\n        valueOperations.set(key, toJson(value));\n        if(expire != NOT_EXPIRE){\n            redisTemplate.expire(key, expire, TimeUnit.SECONDS);\n        }\n    }\n\n    public void set(String key, Object value){\n        set(key, value, DEFAULT_EXPIRE);\n    }\n\n    public <T> T get(String key, Class<T> clazz, long expire) {\n        String value = valueOperations.get(key);\n        if(expire != NOT_EXPIRE){\n            redisTemplate.expire(key, expire, TimeUnit.SECONDS);\n        }\n        return value == null ? null : fromJson(value, clazz);\n    }\n\n    public <T> T get(String key, Class<T> clazz) {\n        return get(key, clazz, NOT_EXPIRE);\n    }\n\n    public String get(String key, long expire) {\n        String value = valueOperations.get(key);\n        if(expire != NOT_EXPIRE){\n            redisTemplate.expire(key, expire, TimeUnit.SECONDS);\n        }\n        return value;\n    }\n\n    public String get(String key) {\n        return get(key, NOT_EXPIRE);\n    }\n\n    public void delete(String key) {\n        redisTemplate.delete(key);\n    }\n\n    /**\n     * Object转成JSON数据\n     */\n    private String toJson(Object object){\n        if(object instanceof Integer || object instanceof Long || object instanceof Float ||\n                object instanceof Double || object instanceof Boolean || object instanceof String){\n            return String.valueOf(object);\n        }\n        return gson.toJson(object);\n    }\n\n    /**\n     * JSON数据，转成Object\n     */\n    private <T> T fromJson(String json, Class<T> clazz){\n        return gson.fromJson(json, clazz);\n    }\n}\n"
  },
  {
    "path": "src/main/java/io/sdb/common/utils/ShiroUtils.java",
    "content": "package io.sdb.common.utils;\n\nimport io.sdb.common.exception.RRException;\nimport io.sdb.model.SysUser;\nimport org.apache.shiro.SecurityUtils;\nimport org.apache.shiro.session.Session;\nimport org.apache.shiro.subject.Subject;\n\n/**\n * Shiro工具类\n * \n * @author chenshun\n * @email sunlightcs@gmail.com\n * @date 2016年11月12日 上午9:49:19\n */\npublic class ShiroUtils {\n\n\tpublic static Session getSession() {\n\t\treturn SecurityUtils.getSubject().getSession();\n\t}\n\n\tpublic static Subject getSubject() {\n\t\treturn SecurityUtils.getSubject();\n\t}\n\n\tpublic static SysUser getUserEntity() {\n\t\treturn (SysUser)SecurityUtils.getSubject().getPrincipal();\n\t}\n\n\tpublic static Long getUserId() {\n\t\treturn getUserEntity().getUserId();\n\t}\n\t\n\tpublic static void setSessionAttribute(Object key, Object value) {\n\t\tgetSession().setAttribute(key, value);\n\t}\n\n\tpublic static Object getSessionAttribute(Object key) {\n\t\treturn getSession().getAttribute(key);\n\t}\n\n\tpublic static boolean isLogin() {\n\t\treturn SecurityUtils.getSubject().getPrincipal() != null;\n\t}\n\n\tpublic static String getKaptcha(String key) {\n\t\tObject kaptcha = getSessionAttribute(key);\n\t\tif(kaptcha == null){\n\t\t\tthrow new RRException(\"验证码已失效\");\n\t\t}\n\t\tgetSession().removeAttribute(key);\n\t\treturn kaptcha.toString();\n\t}\n\n}\n"
  },
  {
    "path": "src/main/java/io/sdb/common/utils/SpringContextUtils.java",
    "content": "package io.sdb.common.utils;\n\nimport org.springframework.beans.BeansException;\nimport org.springframework.context.ApplicationContext;\nimport org.springframework.context.ApplicationContextAware;\nimport org.springframework.stereotype.Component;\n\n/**\n * Spring Context 工具类\n * \n * @author chenshun\n * @email sunlightcs@gmail.com\n * @date 2016年11月29日 下午11:45:51\n */\n@Component\npublic class SpringContextUtils implements ApplicationContextAware {\n\tpublic static ApplicationContext applicationContext; \n\n\t@Override\n\tpublic void setApplicationContext(ApplicationContext applicationContext)\n\t\t\tthrows BeansException {\n\t\tSpringContextUtils.applicationContext = applicationContext;\n\t}\n\n\tpublic static Object getBean(String name) {\n\t\treturn applicationContext.getBean(name);\n\t}\n\n\tpublic static <T> T getBean(String name, Class<T> requiredType) {\n\t\treturn applicationContext.getBean(name, requiredType);\n\t}\n\n\tpublic static boolean containsBean(String name) {\n\t\treturn applicationContext.containsBean(name);\n\t}\n\n\tpublic static boolean isSingleton(String name) {\n\t\treturn applicationContext.isSingleton(name);\n\t}\n\n\tpublic static Class<? extends Object> getType(String name) {\n\t\treturn applicationContext.getType(name);\n\t}\n\n}"
  },
  {
    "path": "src/main/java/io/sdb/common/utils/SqlHelper.java",
    "content": "package io.sdb.common.utils;\n\nimport io.sdb.common.entity.Filter;\nimport org.apache.commons.collections.CollectionUtils;\nimport org.apache.commons.lang3.*;\n\nimport java.util.List;\n\npublic class SqlHelper {\n\n    public String test() {\n        return \" and #para(abc)\";\n    }\n\n    /**\n     * 转换为Predicate\n     *\n     * @param filters\n     *            筛选\n     * @return Predicate\n     */\n    public String getFilters(List<Filter> filters) {\n        String sql = \"\";\n        if (CollectionUtils.isEmpty(filters)) {\n            return \"\";\n        }\n        for (Filter filter : filters) {\n            if (filter == null) {\n                continue;\n            }\n            String property = filter.getProperty();\n            Filter.Operator operator = filter.getOperator();\n            Object value = filter.getValue();\n            Boolean ignoreCase = filter.getIgnoreCase();\n            switch (operator) {\n                case eq:\n                    if (value != null) {\n                        if (BooleanUtils.isTrue(ignoreCase) && value instanceof String) {\n                            sql +=\" AND \"+  property + \" = \" + ((String) value).toLowerCase();\n                        } else {\n                            sql +=\" AND \"+ property + \" = \" + value;\n                        }\n                    } else {\n                        sql +=\" AND \"+ property + \" IS NULL \";\n                    }\n                    break;\n                case ne:\n                    if (value != null) {\n                        if (BooleanUtils.isTrue(ignoreCase) && value instanceof String) {\n                            sql +=\" AND \"+ property + \" != \" + ((String) value).toLowerCase();\n                        } else {\n                            sql +=\" AND \"+ property + \" != \" + value;\n                        }\n                    } else {\n                        sql +=\" AND \"+ property + \" IS NOT NULL \";\n                    }\n                    break;\n                case gt:\n                    sql +=\" AND \"+ property + \" > \" + value;\n                    break;\n                case lt:\n                    sql +=\" AND \"+ property + \" < \" +  value;\n                    break;\n                case ge:\n                    sql +=\" AND \"+ property + \" >= \" + value;\n                    break;\n                case le:\n                    if (value instanceof Number) {\n                        sql +=\" AND \"+ property + \" <= \" + (Number) value;\n                    }\n                    break;\n                case like:\n                    if (value instanceof String) {\n                        if (BooleanUtils.isTrue(ignoreCase)) {\n                            sql += \" AND \" + property + \" LIKE '%\" + ((String) value).toLowerCase() + \"'\";\n                        } else {\n                            sql += \" AND \" + property + \" LIKE '%\" + (String) value + \"'\";\n                        }\n                    }\n                    break;\n                case in:\n                    sql +=\" AND \"+ property + \" IN(\" + value + \")\";\n                    break;\n                case isNull:\n                    sql +=\" AND \"+ property + \" IS NULL\";\n                    break;\n                case isNotNull:\n                    sql +=\" AND \"+ property + \" IS NOT NULL\";\n                    break;\n            }\n        }\n        return sql;\n    }\n}\n"
  },
  {
    "path": "src/main/java/io/sdb/common/utils/TreeBuilder.java",
    "content": "package io.sdb.common.utils;\n\nimport com.alibaba.fastjson.JSON;\nimport io.sdb.common.entity.Node;\nimport org.apache.commons.collections.CollectionUtils;\nimport org.apache.commons.collections.Predicate;\n\nimport java.util.ArrayList;\nimport java.util.List;\n\n/**\n * 构造目录JSON树\n * Created by fukang on 2017/5/26 0026.\n */\npublic class TreeBuilder<T extends Node> {\n\n    List<T> nodes = new ArrayList<>();\n\n    public List<T> buildTree(List<T> nodes) {\n        if(nodes == null || nodes.size() == 0){\n            return null;\n        }\n\n        TreeBuilder treeBuilder = new TreeBuilder(nodes);\n\n        return treeBuilder.buildTree();\n    }\n\n    public String buildTreeJson(List<T> nodes) {\n        if(nodes == null || nodes.size() == 0){\n            return null;\n        }\n\n        TreeBuilder treeBuilder = new TreeBuilder(nodes);\n\n        return treeBuilder.buildJSONTree();\n    }\n\n    public TreeBuilder() {\n    }\n\n    public TreeBuilder(List<T> nodes) {\n        super();\n        this.nodes = nodes;\n    }\n\n    // 构建JSON树形结构\n    public String buildJSONTree() {\n        List<T> nodeTree = buildTree();\n        String jsonString = JSON.toJSONString(nodeTree);\n        return jsonString;\n    }\n\n    // 构建树形结构\n    public List<T> buildTree() {\n        List<T> treeNodes = new ArrayList<>();\n        List<T> rootNodes = getRootNodes();\n        for (T rootNode : rootNodes) {\n            buildChildNodes(rootNode);\n            treeNodes.add(rootNode);\n        }\n\n        return treeNodes;\n    }\n\n    // 递归子节点\n    public void buildChildNodes(T node) {\n        List<T> children = getChildNodes(node);\n        if (!children.isEmpty()) {\n            for (T child : children) {\n                buildChildNodes(child);\n            }\n            node.setChildren(children);\n        }\n    }\n\n    // 获取父节点下所有的子节点\n    public List<T> getChildNodes(T pnode) {\n        List<T> childNodes = new ArrayList<>();\n        for (T n : nodes) {\n            if (pnode.getId().equals(n.getParentId())) {\n                childNodes.add(n);\n            }\n        }\n        return childNodes;\n    }\n\n    // 判断是否为根节点\n    public boolean rootNode(T node) {\n        boolean isRootNode = true;\n        for (T n : nodes) {\n            if (node.getParentId() != null && node.getParentId().equals(n.getId())) {\n                isRootNode = false;\n                break;\n            }\n        }\n        return isRootNode;\n    }\n\n    // 获取集合中所有的根节点\n    public List<T> getRootNodes() {\n        List<T> rootNodes = new ArrayList<>();\n        for (T n : nodes) {\n            if (rootNode(n)) {\n                rootNodes.add(n);\n            }\n        }\n        return rootNodes;\n    }\n}\n"
  },
  {
    "path": "src/main/java/io/sdb/common/utils/_JFCodeGenerator.java",
    "content": "package io.sdb.common.utils;\n\nimport com.jfinal.kit.Kv;\nimport com.jfinal.kit.PathKit;\nimport com.jfinal.kit.StrKit;\nimport com.jfinal.plugin.activerecord.dialect.MysqlDialect;\nimport com.jfinal.plugin.activerecord.generator.ColumnMeta;\nimport com.jfinal.plugin.activerecord.generator.DataDictionaryGenerator;\nimport com.jfinal.plugin.activerecord.generator.MetaBuilder;\nimport com.jfinal.plugin.activerecord.generator.TableMeta;\nimport io.sdb.builder.MyMetaBuilder;\nimport org.apache.commons.lang3.StringUtils;\n\nimport javax.sql.DataSource;\nimport java.util.HashMap;\nimport java.util.List;\nimport java.util.Map;\n\npublic class _JFCodeGenerator {\n    public static final _JFCodeGenerator me = new _JFCodeGenerator();\n    public static final boolean serviceGenerate = true;\n\n    protected String[] excludedControllerClass = new String[]{\n            \"Area\",\n            \"SysCaptcha\",\n            \"Cart\",\n            \"OrderDetail\",\n            \"OrderMaster\",\n            \"Product\",\n            \"Receiver\",\n            \"SysRoleMenu\",\n            \"ScheduleJob\",\n            \"ScheduleJobLog\",\n            \"Sn\",\n            \"SysUserRole\",\n            \"SysUserToken\",\n    };\n\n    protected String[] includedVueClass = new String[]{\n            \"TestTable\",\n    };\n\n    protected final JfEnjoy jfEngine = new JfEnjoy();\n\n    protected Kv tablemetaMap = null;\n    protected String packageBase = \"io\";\n    protected String basePath = \"sdb\";\n    protected String srcFolder = \"src/main/java\";\n    protected String viewFolder = \"/Users/apple/WebstormProjects/sdb-backend/src/views/modules/sys/\";\n\n\n    public _JFCodeGenerator setPackageBase(String packageBase) {\n        this.packageBase = packageBase;\n        return this;\n    }\n\n    public _JFCodeGenerator setBasePath(String basePath) {\n        this.basePath = basePath;\n        return this;\n    }\n\n    public _JFCodeGenerator setSrcFolder(String srcFolder) {\n        this.srcFolder = srcFolder;\n        return this;\n    }\n\n    public _JFCodeGenerator setViewFolder(String viewFolder) {\n        this.viewFolder = viewFolder;\n        return this;\n    }\n\n    protected class DataGenerator extends DataDictionaryGenerator {\n        public DataGenerator(DataSource dataSource, String dataDictionaryOutputDir) {\n            super(dataSource, dataDictionaryOutputDir);\n        }\n\n        public void rebuildColumnMetas(List<TableMeta> tableMetas) {\n            super.rebuildColumnMetas(tableMetas);\n        }\n    }\n\n    ;\n\n    public TableMeta getTableMeta(String tableName) {\n        if (tablemetaMap == null) {\n\n            DataSource dataSource = _JFinalGenerator.getDataSource();\n\n            MetaBuilder metaBuilder = new MetaBuilder(dataSource);\n            metaBuilder.setDialect(new MysqlDialect());\n            metaBuilder.addExcludedTable(_JFinalGenerator.excludedTable);\n            List<TableMeta> tableMetas = metaBuilder.build();\n            new DataGenerator(dataSource, null).rebuildColumnMetas(tableMetas);\n\n            if (tableMetas.size() == 0) {\n                System.out.println(\"TableMeta 数量为 0，不生成任何文件\");\n                return null;\n            }\n            Kv kv = Kv.create();\n            for (TableMeta tableMeta : tableMetas) {\n                kv.set(tableMeta.name, tableMeta);\n            }\n            tablemetaMap = kv;\n        }\n        return (TableMeta) tablemetaMap.get(tableName);\n    }\n\n    /**\n     * 生成手脚架代码\n     */\n    public _JFCodeGenerator allRender(String className, String tableName) {\n        return javaRender(className, tableName).htmlRender(className, tableName);\n    }\n\n    /**\n     * java 代码生成\n     */\n    public _JFCodeGenerator javaRender(String className, String tableName) {\n        //刷新 映射对象\n        _JFinalGenerator.main(null);\n\n        controller(className);\n        service(className, tableName);\n        return this;\n    }\n\n    private String toClassNameSmall(String className) {\n        return new StringBuffer(className.substring(0, 1).toLowerCase()).append(className.substring(1)).toString();\n    }\n\n    private String toPackages() {\n        return new StringBuffer(packageBase).append(\".\").append(basePath).toString();\n    }\n\n    /**\n     * 生成Controller\n     *\n     * @param className 类名称\n     */\n    public void controller(String className) {\n        for (String excluded:excludedControllerClass\n             ) {\n            if (excluded.equalsIgnoreCase(className)) {\n                return;\n            }\n        }\n\n        String packages = toPackages();\n\n        String classNameSmall = toClassNameSmall(className);\n\n        String controllerPathName = \"/controller/\";\n        if (!StringUtils.startsWith(className.toLowerCase(), \"sys\")) {\n            controllerPathName = \"/controller/Sys\";\n        }\n\n        jfEngine.render(\"/java/controller.html\",\n                Kv.by(\"package\", packages)\n                        .set(\"className\", className)\n                        .set(\"classNameSmall\", classNameSmall)\n                        .set(\"basePath\", basePath)\n                ,\n                new StringBuilder()\n                        .append(System.getProperty(\"user.dir\"))\n                        .append(\"/\")\n                        .append(srcFolder)\n                        .append(\"/\")\n                        .append(packages.replace(\".\", \"/\"))\n                        .append(controllerPathName)\n                        .append(className)\n                        .append(\"Controller.java\")\n        );\n    }\n\n    /**\n     * 生成Service\n     *\n     * @param className 类名称\n     * @param tableName 表名\n     */\n    public void service(String className, String tableName) {\n        String packages = toPackages();\n\n        String classNameSmall = toClassNameSmall(className);\n\n        jfEngine.render(\"/java/service.html\",\n                Kv.by(\"package\", packages)\n                        .set(\"className\", className)\n                        .set(\"classNameSmall\", classNameSmall)\n                        .set(\"tableName\", tableName)\n                ,\n                new StringBuilder()\n                        .append(System.getProperty(\"user.dir\"))\n                        .append(\"/\")\n                        .append(srcFolder)\n                        .append(\"/\")\n                        .append(packages.replace(\".\", \"/\"))\n                        .append(\"/service/\")\n                        .append(className)\n                        .append(\"Service.java\")\n        );\n    }\n\n    /**\n     * 生成ServiceImpl\n     *\n     * @param className 类名称\n     * @param tableName 表名\n     */\n    public void serviceImpl(String className, String tableName) {\n        String packages = toPackages();\n\n        String classNameSmall = toClassNameSmall(className);\n\n        jfEngine.render(\"/java/serviceImpl.html\",\n                Kv.by(\"package\", packages)\n                        .set(\"className\", className)\n                        .set(\"classNameSmall\", classNameSmall)\n                        .set(\"tableName\", tableName)\n                ,\n                new StringBuilder()\n                        .append(System.getProperty(\"user.dir\"))\n                        .append(\"/\")\n                        .append(srcFolder)\n                        .append(\"/\")\n                        .append(packages.replace(\".\", \"/\"))\n                        .append(\"/service/impl/\")\n                        .append(className)\n                        .append(\"ServiceImpl.java\")\n        );\n    }\n\n    /**\n     * 生成Dao\n     *\n     * @param className 类名称\n     * @param tableName 表名\n     */\n    public void dao(String className, String tableName) {\n        String packages = toPackages();\n\n        String classNameSmall = toClassNameSmall(className);\n\n        jfEngine.render(\"/java/dao.html\",\n                Kv.by(\"package\", packages)\n                        .set(\"className\", className)\n                        .set(\"classNameSmall\", classNameSmall)\n                        .set(\"tableName\", tableName)\n                ,\n                new StringBuilder()\n                        .append(System.getProperty(\"user.dir\"))\n                        .append(\"/\")\n                        .append(srcFolder)\n                        .append(\"/\")\n                        .append(packages.replace(\".\", \"/\"))\n                        .append(\"/dao/\")\n                        .append(className)\n                        .append(\"Dao.java\")\n        );\n    }\n\n    /**\n     * @param className\n     * @param tableName\n     */\n    public _JFCodeGenerator htmlRender(String className, String tableName) {\n        TableMeta tablemeta = getTableMeta(tableName);\n\n        htmlList(className, tablemeta);\n\n        return this;\n    }\n\n    //页面的生成一般定制比较多..就来个简单的吧\n\n    public void htmlList(String className, TableMeta tablemeta) {\n        String packages = toPackages();\n        String classNameSmall = toClassNameSmall(className);\n        String basePathUrl = basePath.replace('.', '/');\n\n        Map<String, String> columnMap = new HashMap<>();\n\n        for (ColumnMeta columnMeta :tablemeta.columnMetas\n             ) {\n\n            String desc = StringUtils.substringBetween(columnMeta.remarks, \"[\", \"]\");\n            columnMap.put(columnMeta.attrName, desc);\n        }\n\n        String primaryKey = StrKit.toCamelCase(tablemeta.primaryKey);\n\n        jfEngine.render(\"/html/index.vue\",\n                Kv.by(\"tablemeta\", tablemeta)\n                        .set(\"package\", packages)\n                        .set(\"className\", className)\n                        .set(\"columnMap\", columnMap)\n                        .set(\"primaryKey\", primaryKey)\n                        .set(\"classNameSmall\", classNameSmall)\n                        .set(\"basePath\", basePathUrl)\n                ,\n                new StringBuilder()\n                        .append(viewFolder)\n                        .append(\"/\")\n                        .append(classNameSmall)\n                        .append(\"List.html\")\n        );\n    }\n\n    //页面的生成一般定制比较多..就来个简单的吧\n\n    public void vue(String className, TableMeta tablemeta) {\n        boolean includeFlag = false;\n        for (String includeClass:includedVueClass\n                ) {\n            if (includeClass.equalsIgnoreCase(className)) {\n                includeFlag = true;\n                break;\n            }\n        }\n\n        if (!includeFlag) {\n            return;\n        }\n\n        String packages = toPackages();\n        String classNameSmall = toClassNameSmall(className);\n        String basePathUrl = basePath.replace('.', '/');\n\n        Map<String, String> columnMap = new HashMap<>();\n\n        for (ColumnMeta columnMeta :tablemeta.columnMetas\n             ) {\n\n            String desc = StringUtils.substringBetween(columnMeta.remarks, \"[\", \"]\");\n            columnMap.put(columnMeta.attrName, desc);\n        }\n\n        String primaryKey = StrKit.toCamelCase(tablemeta.primaryKey);\n\n        jfEngine.render(\"/html/index.html\",\n                Kv.by(\"tablemeta\", tablemeta)\n                        .set(\"package\", packages)\n                        .set(\"className\", className)\n                        .set(\"columnMap\", columnMap)\n                        .set(\"primaryKey\", primaryKey)\n                        .set(\"classNameSmall\", classNameSmall)\n                        .set(\"basePath\", basePathUrl)\n                ,\n                new StringBuilder()\n                        .append(viewFolder)\n                        .append(\"/\")\n                        .append(classNameSmall)\n                        .append(\".vue\")\n        );\n    }\n\n    public void vueAddUpdate(String className, TableMeta tablemeta) {\n        boolean includeFlag = false;\n        for (String includeClass:includedVueClass\n                ) {\n            if (includeClass.equalsIgnoreCase(className)) {\n                includeFlag = true;\n                break;\n            }\n        }\n\n        if (!includeFlag) {\n            return;\n        }\n\n        String packages = toPackages();\n        String classNameSmall = toClassNameSmall(className);\n        String basePathUrl = basePath.replace('.', '/');\n\n        Map<String, String> columnMap = new HashMap<>();\n\n        for (ColumnMeta columnMeta :tablemeta.columnMetas\n             ) {\n\n            String desc = StringUtils.substringBetween(columnMeta.remarks, \"[\", \"]\");\n            columnMap.put(columnMeta.attrName, desc);\n        }\n\n        String primaryKey = StrKit.toCamelCase(tablemeta.primaryKey);\n\n        jfEngine.render(\"/html/add-or-update.html\",\n                Kv.by(\"tablemeta\", tablemeta)\n                        .set(\"package\", packages)\n                        .set(\"className\", className)\n                        .set(\"columnMap\", columnMap)\n                        .set(\"primaryKey\", primaryKey)\n                        .set(\"classNameSmall\", classNameSmall)\n                        .set(\"basePath\", basePathUrl)\n                ,\n                new StringBuilder()\n                        .append(viewFolder)\n                        .append(\"/\")\n                        .append(classNameSmall)\n                        .append(\"-add-or-update\")\n                        .append(\".vue\")\n        );\n    }\n\n    public void generate(){\n        DataSource dataSource = _JFinalGenerator.getDataSource();\n\n        MyMetaBuilder metaBuilder = new MyMetaBuilder(dataSource);\n        metaBuilder.setDialect(new MysqlDialect());\n        metaBuilder.addExcludedTable(_JFinalGenerator.excludedTable);\n        List<TableMeta> tableMetas = metaBuilder.build();\n        for (TableMeta tableMeta : tableMetas\n                ) {\n            if (serviceGenerate) {\n                _JFCodeGenerator.me.service(tableMeta.modelName, tableMeta.name);\n                _JFCodeGenerator.me.serviceImpl(tableMeta.modelName, tableMeta.name);\n                _JFCodeGenerator.me.dao(tableMeta.modelName, tableMeta.name);\n                _JFCodeGenerator.me.controller(tableMeta.modelName);\n                _JFCodeGenerator.me.vue(tableMeta.modelName, tableMeta);\n                _JFCodeGenerator.me.vueAddUpdate(tableMeta.modelName, tableMeta);\n            }\n        }\n    }\n\n    // ... 继续扩展吧~\n\n    public static void main(String[] args) {\n        _JFCodeGenerator.me.generate();\n    }\n}\n"
  },
  {
    "path": "src/main/java/io/sdb/common/utils/_JFinalGenerator.java",
    "content": "package io.sdb.common.utils;\n\nimport com.jfinal.kit.PathKit;\nimport com.jfinal.plugin.activerecord.generator.Generator;\nimport com.jfinal.plugin.activerecord.generator.MetaBuilder;\nimport com.jfinal.plugin.druid.DruidPlugin;\n\nimport javax.sql.DataSource;\n\n/**\n * 在数据库表有任何变动时，运行一下 main 方法，极速响应变化进行代码重构\n */\npublic class _JFinalGenerator {\n\n    final static String DB_NAME = \"sdb\";\n    final static String DB_USER_NAME = \"root\";\n    final static String DB_USER_PWD = \"123456\";\n    final static String PK_NAME = \"sdb\"; //项目包名称\n\n    final static String[] excludedTable = new String[]{\n            \"QRTZ_JOB_DETAILS\",\n            \"QRTZ_TRIGGERS\",\n            \"QRTZ_SIMPLE_TRIGGERS\",\n            \"QRTZ_CRON_TRIGGERS\",\n            \"QRTZ_SIMPROP_TRIGGERS\",\n            \"QRTZ_BLOB_TRIGGERS\",\n            \"QRTZ_CALENDARS\",\n            \"QRTZ_PAUSED_TRIGGER_GRPS\",\n            \"QRTZ_FIRED_TRIGGERS\",\n            \"QRTZ_SCHEDULER_STATE\",\n            \"QRTZ_LOCKS\"\n    };\n\n\tpublic static DataSource getDataSource() {\n\t\tString jdbcUrl = \"jdbc:mysql://127.0.0.1:3306/\"+DB_NAME+\"?useUnicode=true&characterEncoding=UTF-8\";\n\t\tString user = DB_USER_NAME;\n\t\tString password = DB_USER_PWD;\n\t\tDruidPlugin druidPlugin = new DruidPlugin(jdbcUrl, user, password);\n\t\tdruidPlugin.start();\n\t\treturn druidPlugin.getDataSource();\n\t}\n\n\tpublic static void main(String[] args) {\n\n        String rootPath = PathKit.getWebRootPath();\n\n\t\t// base model 所使用的包名\n\t\tString baseModelPackageName = \"io.\"+PK_NAME+\".model.base\";\n\t\t// base model 文件保存路径\n\t\tString baseModelOutputDir = rootPath + \"/src/main/java/io/\"+PK_NAME+\"/model/base\";\n\n\n\t\t// model 所使用的包名 (MappingKit 默认使用的包名)\n\t\tString modelPackageName = \"io.\"+PK_NAME+\".model\";\n\t\t// model 文件保存路径 (MappingKit 与 DataDictionary 文件默认保存路径)\n\t\tString modelOutputDir = baseModelOutputDir + \"/..\";\n\n\t\t// 创建生成器\n\t\tGenerator gernerator = new Generator(getDataSource(), baseModelPackageName, baseModelOutputDir, modelPackageName, modelOutputDir);\n\n\n\t\tMetaBuilder mataBuilder = new MetaBuilder(getDataSource());\n\n\t\tmataBuilder.addExcludedTable(excludedTable);\n\n\t\tgernerator.setMetaBuilder(mataBuilder);\n\n\t\t// 添加不需要生成的表名\n//\t\tgernerator.addExcludedTable(\"order_coupon\");\n\t\t// 设置是否在 Model 中生成 dao 对象\n\t\tgernerator.setGenerateDaoInModel(true);\n\t\t// 设置是否生成字典文件\n\t\tgernerator.setGenerateDataDictionary(false);\n\t\t// 设置需要被移除的表名前缀用于生成modelName。例如表名 \"osc_user\"，移除前缀 \"osc_\"后生成的model名为 \"User\"而非 OscUser\n\t\tgernerator.setRemovedTableNamePrefixes(\"tb_\");\n\t\tgernerator.generate();\n\n\t\t//代码生成\n        _JFCodeGenerator.me.generate();\n\t}\n}\n\n\n\n\n"
  },
  {
    "path": "src/main/java/io/sdb/common/utils/tpl/html/add-or-update.html",
    "content": "<template>\n  <el-dialog\n    :title=\"!dataForm.id ? '新增' : '修改'\"\n    :close-on-click-modal=\"false\"\n    :visible.sync=\"visible\">\n    <el-form :model=\"dataForm\" :rules=\"dataRule\" ref=\"dataForm\" @keyup.enter.native=\"dataFormSubmit()\" label-width=\"80px\">\n        #for(columnData : columnMap)\n        #if(columnData.key != primaryKey)\n        <el-form-item label=\"#(columnData.value)\" prop=\"#(columnData.key)\">\n            <el-input v-model=\"dataForm.#(columnData.key)\" placeholder=\"#(columnData.value)\"></el-input>\n        </el-form-item>\n        #end\n        #end\n    </el-form>\n    <span slot=\"footer\" class=\"dialog-footer\">\n      <el-button @click=\"visible = false\">取消</el-button>\n      <el-button type=\"primary\" @click=\"dataFormSubmit()\">确定</el-button>\n    </span>\n  </el-dialog>\n</template>\n\n<script>\n  export default {\n    data () {\n      return {\n        visible: false,\n        roleList: [],\n        dataForm: {\n        #for(columnData : columnMap)\n          #(columnData.key): ''#if(!for.last),#end\n        #end\n        },\n        dataRule: {\n        }\n      }\n    },\n    methods: {\n      init (id) {\n        this.dataForm.id = id\n        this.visible = true\n        this.$nextTick(() => {\n          this.$refs['dataForm'].resetFields()\n          if (this.dataForm.id) {\n            this.$http({\n              url: this.$http.adornUrl(`/sys/#(classNameSmall)/info/${this.dataForm.id}`),\n              method: 'get',\n              params: this.$http.adornParams()\n            }).then(({data}) => {\n              if (data && data.code === 0) {\n              #for(columnData : columnMap)\n                this.dataForm.#(columnData.key) = data.#(classNameSmall).#(columnData.key)\n              #end\n              }\n            })\n          }\n        })\n      },\n      // 表单提交\n      dataFormSubmit () {\n        this.$refs['dataForm'].validate((valid) => {\n          if (valid) {\n            this.$http({\n              url: this.$http.adornUrl(`/sys/#(classNameSmall)/${!this.dataForm.id ? 'save' : 'update'}`),\n              method: 'post',\n              data: this.$http.adornData({\n              #for(columnData : columnMap)\n                '#(columnData.key)': this.dataForm.#(columnData.key)#if(!for.last),#end\n              #end\n              })\n            }).then(({data}) => {\n              if (data && data.code === 0) {\n                this.$message({\n                  message: '操作成功',\n                  type: 'success',\n                  duration: 1500,\n                  onClose: () => {\n                    this.visible = false\n                    this.$emit('refreshDataList')\n                  }\n                })\n              } else {\n                this.$message.error(data.msg)\n              }\n            })\n          }\n        })\n      }\n    }\n  }\n</script>\n"
  },
  {
    "path": "src/main/java/io/sdb/common/utils/tpl/html/index.html",
    "content": "<template>\n  <div class=\"mod-user\">\n    <el-form :inline=\"true\" :model=\"dataForm\" @keyup.enter.native=\"getDataList()\">\n      <el-form-item>\n        <el-button @click=\"getDataList()\">查询</el-button>\n        <el-button type=\"primary\" @click=\"addOrUpdateHandle()\">新增</el-button>\n        <el-button type=\"danger\" @click=\"deleteHandle()\" :disabled=\"dataListSelections.length <= 0\">批量删除</el-button>\n      </el-form-item>\n    </el-form>\n    <el-table\n      :data=\"dataList\"\n      border\n      v-loading=\"dataListLoading\"\n      @selection-change=\"selectionChangeHandle\"\n      style=\"width: 100%;\">\n      <el-table-column\n        type=\"selection\"\n        header-align=\"center\"\n        align=\"center\"\n        width=\"50\">\n      </el-table-column>\n\n    #for(columnData : columnMap)\n      <el-table-column\n        prop=\"#(columnData.key)\"\n        header-align=\"center\"\n        align=\"center\"\n        label=\" #(columnData.value)\">\n      </el-table-column>\n    #end\n\n      <el-table-column\n        fixed=\"right\"\n        header-align=\"center\"\n        align=\"center\"\n        width=\"150\"\n        label=\"操作\">\n        <template slot-scope=\"scope\">\n          <el-button type=\"text\" size=\"small\" @click=\"addOrUpdateHandle(scope.row.#(primaryKey))\">修改</el-button>\n          <el-button type=\"text\" size=\"small\" @click=\"deleteHandle(scope.row.#(primaryKey))\">删除</el-button>\n        </template>\n      </el-table-column>\n    </el-table>\n    <el-pagination\n      @size-change=\"sizeChangeHandle\"\n      @current-change=\"currentChangeHandle\"\n      :current-page=\"pageIndex\"\n      :page-sizes=\"[10, 20, 50, 100]\"\n      :page-size=\"pageSize\"\n      :total=\"totalPage\"\n      layout=\"total, sizes, prev, pager, next, jumper\">\n    </el-pagination>\n    <!-- 弹窗, 新增 / 修改 -->\n    <add-or-update v-if=\"addOrUpdateVisible\" ref=\"addOrUpdate\" @refreshDataList=\"getDataList\"></add-or-update>\n  </div>\n</template>\n\n<script>\n  import AddOrUpdate from './#(classNameSmall)-add-or-update'\n  export default {\n    data () {\n      return {\n        dataForm: {\n          userName: ''\n        },\n        dataList: [],\n        pageIndex: 1,\n        pageSize: 10,\n        totalPage: 0,\n        dataListLoading: false,\n        dataListSelections: [],\n        addOrUpdateVisible: false\n      }\n    },\n    components: {\n      AddOrUpdate\n    },\n    activated () {\n      this.getDataList()\n    },\n    methods: {\n      // 获取数据列表\n      getDataList () {\n        this.dataListLoading = true\n        this.$http({\n          url: this.$http.adornUrl('/sys/#(classNameSmall)/list'),\n          method: 'get',\n          params: this.$http.adornParams({\n            'page': this.pageIndex,\n            'limit': this.pageSize\n          })\n        }).then(({data}) => {\n          if (data && data.code === 0) {\n            this.dataList = data.page.list\n            this.totalPage = data.page.totalCount\n          } else {\n            this.dataList = []\n            this.totalPage = 0\n          }\n          this.dataListLoading = false\n        })\n      },\n      // 每页数\n      sizeChangeHandle (val) {\n        this.pageSize = val\n        this.pageIndex = 1\n        this.getDataList()\n      },\n      // 当前页\n      currentChangeHandle (val) {\n        this.pageIndex = val\n        this.getDataList()\n      },\n      // 多选\n      selectionChangeHandle (val) {\n        this.dataListSelections = val\n      },\n      // 新增 / 修改\n      addOrUpdateHandle (id) {\n        this.addOrUpdateVisible = true\n        this.$nextTick(() => {\n          this.$refs.addOrUpdate.init(id)\n        })\n      },\n      // 删除\n      deleteHandle (id) {\n        var ids = id ? [id] : this.dataListSelections.map(item => {\n          return item.#(primaryKey)\n        })\n        this.$confirm(`确定对[id=${ids.join(',')}]进行[${id ? '删除' : '批量删除'}]操作?`, '提示', {\n          confirmButtonText: '确定',\n          cancelButtonText: '取消',\n          type: 'warning'\n        }).then(() => {\n          this.$http({\n            url: this.$http.adornUrl('/sys/#(classNameSmall)/delete'),\n            method: 'post',\n            data: this.$http.adornData(ids, false)\n          }).then(({data}) => {\n            if (data && data.code === 0) {\n              this.$message({\n                message: '操作成功',\n                type: 'success',\n                duration: 1500,\n                onClose: () => {\n                  this.getDataList()\n                }\n              })\n            } else {\n              this.$message.error(data.msg)\n            }\n          })\n        }).catch(() => {})\n      }\n    }\n  }\n</script>\n"
  },
  {
    "path": "src/main/java/io/sdb/common/utils/tpl/java/controller.html",
    "content": "package #(package).controller;\n\nimport #(package).common.utils.PageUtils;\nimport #(package).common.utils.R;\nimport #(package).service.#(className)Service;\nimport #(package).model.#(className);\nimport org.springframework.beans.factory.annotation.Autowired;\nimport org.springframework.stereotype.Controller;\nimport org.springframework.web.bind.annotation.*;\n\nimport java.util.Map;\n\n@Controller\n@RequestMapping(\"/sys/#(classNameSmall)\")\npublic class Sys#(className)Controller {\n\n\t@Autowired\n\tprivate #(className)Service #(classNameSmall)Service;\n\n\t/**\n\t * 列表\n\t */\n\t@ResponseBody\n\t@GetMapping(\"/list\")\n\tpublic R list(@RequestParam Map<String, Object> params){\n\t\tPageUtils page = #(classNameSmall)Service.queryPage(params);\n\t\treturn R.ok().put(\"page\", page);\n\t}\n\n\t/**\n\t * 详情\n\t */\n\t@ResponseBody\n\t@GetMapping(\"/info/{id}\")\n\tpublic R info(@PathVariable Object id){\n        #(className) #(classNameSmall) = #(classNameSmall)Service.findById(id);\n\t\treturn R.ok().put(\"#(classNameSmall)\", #(classNameSmall));\n\t}\n\n\t/**\n\t * 更新\n\t */\n\t@ResponseBody\n\t@PostMapping(\"/update\")\n\tpublic R update(@RequestBody #(className) #(classNameSmall)) {\n\t\t#(classNameSmall).update();\n\t\treturn R.ok();\n\t}\n\n\t/**\n\t * 新增\n\t */\n\t@ResponseBody\n\t@PostMapping(\"/save\")\n\tpublic R save(@RequestBody #(className) #(classNameSmall)) {\n\t\t#(classNameSmall).save();\n\t\treturn R.ok();\n\t}\n\n\t/**\n\t * 删除\n\t */\n\t@ResponseBody\n\t@PostMapping(\"/delete\")\n    public R delete(@RequestBody Object[] ids) {\n        #(classNameSmall)Service.deleteBatch(ids);\n        return R.ok();\n    }\n\n}\n"
  },
  {
    "path": "src/main/java/io/sdb/common/utils/tpl/java/dao.html",
    "content": "package #(package).dao;\n\nimport #(package).dao.BaseDao;\nimport #(package).model.#(className);\nimport org.springframework.stereotype.Component;\n\n@Component\npublic class #(className)Dao extends BaseDao<#(className)> {\n    public #(className)Dao() {\n        super(#(className).class);\n    }\n}\n"
  },
  {
    "path": "src/main/java/io/sdb/common/utils/tpl/java/service.html",
    "content": "package #(package).service;\n\nimport #(package).model.#(className);\n\npublic interface #(className)Service extends BaseService<#(className)> {\n}"
  },
  {
    "path": "src/main/java/io/sdb/common/utils/tpl/java/serviceImpl.html",
    "content": "package #(package).service.impl;\n\nimport #(package).dao.#(className)Dao;\nimport #(package).model.#(className);\nimport #(package).service.#(className)Service;\nimport org.springframework.stereotype.Service;\n\n@Service\npublic class #(className)ServiceImpl extends BaseServiceImpl<#(className)Dao, #(className)> implements #(className)Service {\n}\n"
  },
  {
    "path": "src/main/java/io/sdb/common/validator/Assert.java",
    "content": "package io.sdb.common.validator;\n\nimport io.sdb.common.exception.RRException;\nimport org.apache.commons.lang.StringUtils;\n\n/**\n * 数据校验\n * @author chenshun\n * @email sunlightcs@gmail.com\n * @date 2017-03-23 15:50\n */\npublic abstract class Assert {\n\n    public static void isBlank(String str, String message) {\n        if (StringUtils.isBlank(str)) {\n            throw new RRException(message);\n        }\n    }\n\n    public static void isNull(Object object, String message) {\n        if (object == null) {\n            throw new RRException(message);\n        }\n    }\n}\n"
  },
  {
    "path": "src/main/java/io/sdb/common/validator/ValidatorUtils.java",
    "content": "package io.sdb.common.validator;\n\nimport io.sdb.common.exception.RRException;\n\nimport javax.validation.ConstraintViolation;\nimport javax.validation.Validation;\nimport javax.validation.Validator;\nimport java.util.Set;\n\n/**\n * hibernate-validator校验工具类\n *\n * 参考文档：http://docs.jboss.org/hibernate/validator/5.4/reference/en-US/html_single/\n *\n * @author chenshun\n * @email sunlightcs@gmail.com\n * @date 2017-03-15 10:50\n */\npublic class ValidatorUtils {\n    private static Validator validator;\n\n    static {\n        validator = Validation.buildDefaultValidatorFactory().getValidator();\n    }\n\n    /**\n     * 校验对象\n     * @param object        待校验对象\n     * @param groups        待校验的组\n     * @throws RRException  校验不通过，则报RRException异常\n     */\n    public static void validateEntity(Object object, Class<?>... groups)\n            throws RRException {\n        Set<ConstraintViolation<Object>> constraintViolations = validator.validate(object, groups);\n        if (!constraintViolations.isEmpty()) {\n            StringBuilder msg = new StringBuilder();\n            for(ConstraintViolation<Object> constraint:  constraintViolations){\n                msg.append(constraint.getMessage()).append(\"\\n\");\n            }\n            throw new RRException(msg.toString());\n        }\n    }\n}\n"
  },
  {
    "path": "src/main/java/io/sdb/common/validator/group/AddGroup.java",
    "content": "package io.sdb.common.validator.group;\n\n/**\n * 新增数据 Group\n * @author chenshun\n * @email sunlightcs@gmail.com\n * @date 2017-03-16 0:04\n */\npublic interface AddGroup {\n}\n"
  },
  {
    "path": "src/main/java/io/sdb/common/validator/group/AliyunGroup.java",
    "content": "package io.sdb.common.validator.group;\n\n/**\n * 阿里云\n * @author chenshun\n * @email sunlightcs@gmail.com\n * @date 2017-03-28 13:51\n */\npublic interface AliyunGroup {\n}\n"
  },
  {
    "path": "src/main/java/io/sdb/common/validator/group/Group.java",
    "content": "package io.sdb.common.validator.group;\n\nimport javax.validation.GroupSequence;\n\n/**\n * 定义校验顺序，如果AddGroup组失败，则UpdateGroup组不会再校验\n * @author chenshun\n * @email sunlightcs@gmail.com\n * @date 2017-03-15 23:15\n */\n@GroupSequence({AddGroup.class, UpdateGroup.class})\npublic interface Group {\n\n}\n"
  },
  {
    "path": "src/main/java/io/sdb/common/validator/group/QcloudGroup.java",
    "content": "package io.sdb.common.validator.group;\n\n/**\n * 腾讯云\n * @author chenshun\n * @email sunlightcs@gmail.com\n * @date 2017-03-28 13:51\n */\npublic interface QcloudGroup {\n}\n"
  },
  {
    "path": "src/main/java/io/sdb/common/validator/group/QiniuGroup.java",
    "content": "package io.sdb.common.validator.group;\n\n/**\n * 七牛\n * @author chenshun\n * @email sunlightcs@gmail.com\n * @date 2017-03-28 13:51\n */\npublic interface QiniuGroup {\n}\n"
  },
  {
    "path": "src/main/java/io/sdb/common/validator/group/UpdateGroup.java",
    "content": "package io.sdb.common.validator.group;\n\n/**\n * 更新数据 Group\n * @author chenshun\n * @email sunlightcs@gmail.com\n * @date 2017-03-15 21:21\n */\n\npublic interface UpdateGroup {\n\n}\n"
  },
  {
    "path": "src/main/java/io/sdb/common/xss/HTMLFilter.java",
    "content": "package io.sdb.common.xss;\n\nimport java.util.*;\nimport java.util.concurrent.ConcurrentHashMap;\nimport java.util.concurrent.ConcurrentMap;\nimport java.util.logging.Logger;\nimport java.util.regex.Matcher;\nimport java.util.regex.Pattern;\n\n/**\n *\n * HTML filtering utility for protecting against XSS (Cross Site Scripting).\n *\n * This code is licensed LGPLv3\n *\n * This code is a Java port of the original work in PHP by Cal Hendersen.\n * http://code.iamcal.com/php/lib_filter/\n *\n * The trickiest part of the translation was handling the differences in regex handling\n * between PHP and Java.  These resources were helpful in the process:\n *\n * http://java.sun.com/j2se/1.4.2/docs/api/java/util/regex/Pattern.html\n * http://us2.php.net/manual/en/reference.pcre.pattern.modifiers.php\n * http://www.regular-expressions.info/modifiers.html\n *\n * A note on naming conventions: instance variables are prefixed with a \"v\"; global\n * constants are in all caps.\n *\n * Sample use:\n * String input = ...\n * String clean = new HTMLFilter().filter( input );\n *\n * The class is not thread safe. Create a new instance if in doubt.\n *\n * If you find bugs or have suggestions on improvement (especially regarding\n * performance), please contact us.  The latest version of this\n * source, and our contact details, can be found at http://xss-html-filter.sf.net\n *\n * @author Joseph O'Connell\n * @author Cal Hendersen\n * @author Michael Semb Wever\n */\npublic final class HTMLFilter {\n\n    /** regex flag union representing /si modifiers in php **/\n    private static final int REGEX_FLAGS_SI = Pattern.CASE_INSENSITIVE | Pattern.DOTALL;\n    private static final Pattern P_COMMENTS = Pattern.compile(\"<!--(.*?)-->\", Pattern.DOTALL);\n    private static final Pattern P_COMMENT = Pattern.compile(\"^!--(.*)--$\", REGEX_FLAGS_SI);\n    private static final Pattern P_TAGS = Pattern.compile(\"<(.*?)>\", Pattern.DOTALL);\n    private static final Pattern P_END_TAG = Pattern.compile(\"^/([a-z0-9]+)\", REGEX_FLAGS_SI);\n    private static final Pattern P_START_TAG = Pattern.compile(\"^([a-z0-9]+)(.*?)(/?)$\", REGEX_FLAGS_SI);\n    private static final Pattern P_QUOTED_ATTRIBUTES = Pattern.compile(\"([a-z0-9]+)=([\\\"'])(.*?)\\\\2\", REGEX_FLAGS_SI);\n    private static final Pattern P_UNQUOTED_ATTRIBUTES = Pattern.compile(\"([a-z0-9]+)(=)([^\\\"\\\\s']+)\", REGEX_FLAGS_SI);\n    private static final Pattern P_PROTOCOL = Pattern.compile(\"^([^:]+):\", REGEX_FLAGS_SI);\n    private static final Pattern P_ENTITY = Pattern.compile(\"&#(\\\\d+);?\");\n    private static final Pattern P_ENTITY_UNICODE = Pattern.compile(\"&#x([0-9a-f]+);?\");\n    private static final Pattern P_ENCODE = Pattern.compile(\"%([0-9a-f]{2});?\");\n    private static final Pattern P_VALID_ENTITIES = Pattern.compile(\"&([^&;]*)(?=(;|&|$))\");\n    private static final Pattern P_VALID_QUOTES = Pattern.compile(\"(>|^)([^<]+?)(<|$)\", Pattern.DOTALL);\n    private static final Pattern P_END_ARROW = Pattern.compile(\"^>\");\n    private static final Pattern P_BODY_TO_END = Pattern.compile(\"<([^>]*?)(?=<|$)\");\n    private static final Pattern P_XML_CONTENT = Pattern.compile(\"(^|>)([^<]*?)(?=>)\");\n    private static final Pattern P_STRAY_LEFT_ARROW = Pattern.compile(\"<([^>]*?)(?=<|$)\");\n    private static final Pattern P_STRAY_RIGHT_ARROW = Pattern.compile(\"(^|>)([^<]*?)(?=>)\");\n    private static final Pattern P_AMP = Pattern.compile(\"&\");\n    private static final Pattern P_QUOTE = Pattern.compile(\"<\");\n    private static final Pattern P_LEFT_ARROW = Pattern.compile(\"<\");\n    private static final Pattern P_RIGHT_ARROW = Pattern.compile(\">\");\n    private static final Pattern P_BOTH_ARROWS = Pattern.compile(\"<>\");\n\n    // @xxx could grow large... maybe use sesat's ReferenceMap\n    private static final ConcurrentMap<String,Pattern> P_REMOVE_PAIR_BLANKS = new ConcurrentHashMap<String, Pattern>();\n    private static final ConcurrentMap<String,Pattern> P_REMOVE_SELF_BLANKS = new ConcurrentHashMap<String, Pattern>();\n\n    /** set of allowed html elements, along with allowed attributes for each element **/\n    private final Map<String, List<String>> vAllowed;\n    /** counts of open tags for each (allowable) html element **/\n    private final Map<String, Integer> vTagCounts = new HashMap<String, Integer>();\n\n    /** html elements which must always be self-closing (e.g. \"<img />\") **/\n    private final String[] vSelfClosingTags;\n    /** html elements which must always have separate opening and closing tags (e.g. \"<b></b>\") **/\n    private final String[] vNeedClosingTags;\n    /** set of disallowed html elements **/\n    private final String[] vDisallowed;\n    /** attributes which should be checked for valid protocols **/\n    private final String[] vProtocolAtts;\n    /** allowed protocols **/\n    private final String[] vAllowedProtocols;\n    /** tags which should be removed if they contain no content (e.g. \"<b></b>\" or \"<b />\") **/\n    private final String[] vRemoveBlanks;\n    /** entities allowed within html markup **/\n    private final String[] vAllowedEntities;\n    /** flag determining whether comments are allowed in input String. */\n    private final boolean stripComment;\n    private final boolean encodeQuotes;\n    private boolean vDebug = false;\n    /**\n     * flag determining whether to try to make tags when presented with \"unbalanced\"\n     * angle brackets (e.g. \"<b text </b>\" becomes \"<b> text </b>\").  If set to false,\n     * unbalanced angle brackets will be html escaped.\n     */\n    private final boolean alwaysMakeTags;\n\n    /** Default constructor.\n     *\n     */\n    public HTMLFilter() {\n        vAllowed = new HashMap<>();\n\n        final ArrayList<String> a_atts = new ArrayList<String>();\n        a_atts.add(\"href\");\n        a_atts.add(\"target\");\n        vAllowed.put(\"a\", a_atts);\n\n        final ArrayList<String> img_atts = new ArrayList<String>();\n        img_atts.add(\"src\");\n        img_atts.add(\"width\");\n        img_atts.add(\"height\");\n        img_atts.add(\"alt\");\n        vAllowed.put(\"img\", img_atts);\n\n        final ArrayList<String> no_atts = new ArrayList<String>();\n        vAllowed.put(\"b\", no_atts);\n        vAllowed.put(\"strong\", no_atts);\n        vAllowed.put(\"i\", no_atts);\n        vAllowed.put(\"em\", no_atts);\n\n        vSelfClosingTags = new String[]{\"img\"};\n        vNeedClosingTags = new String[]{\"a\", \"b\", \"strong\", \"i\", \"em\"};\n        vDisallowed = new String[]{};\n        vAllowedProtocols = new String[]{\"http\", \"mailto\", \"https\"}; // no ftp.\n        vProtocolAtts = new String[]{\"src\", \"href\"};\n        vRemoveBlanks = new String[]{\"a\", \"b\", \"strong\", \"i\", \"em\"};\n        vAllowedEntities = new String[]{\"amp\", \"gt\", \"lt\", \"quot\"};\n        stripComment = true;\n        encodeQuotes = true;\n        alwaysMakeTags = true;\n    }\n\n    /** Set debug flag to true. Otherwise use default settings. See the default constructor.\n     *\n     * @param debug turn debug on with a true argument\n     */\n    public HTMLFilter(final boolean debug) {\n        this();\n        vDebug = debug;\n\n    }\n\n    /** Map-parameter configurable constructor.\n     *\n     * @param conf map containing configuration. keys match field names.\n     */\n    public HTMLFilter(final Map<String,Object> conf) {\n\n        assert conf.containsKey(\"vAllowed\") : \"configuration requires vAllowed\";\n        assert conf.containsKey(\"vSelfClosingTags\") : \"configuration requires vSelfClosingTags\";\n        assert conf.containsKey(\"vNeedClosingTags\") : \"configuration requires vNeedClosingTags\";\n        assert conf.containsKey(\"vDisallowed\") : \"configuration requires vDisallowed\";\n        assert conf.containsKey(\"vAllowedProtocols\") : \"configuration requires vAllowedProtocols\";\n        assert conf.containsKey(\"vProtocolAtts\") : \"configuration requires vProtocolAtts\";\n        assert conf.containsKey(\"vRemoveBlanks\") : \"configuration requires vRemoveBlanks\";\n        assert conf.containsKey(\"vAllowedEntities\") : \"configuration requires vAllowedEntities\";\n\n        vAllowed = Collections.unmodifiableMap((HashMap<String, List<String>>) conf.get(\"vAllowed\"));\n        vSelfClosingTags = (String[]) conf.get(\"vSelfClosingTags\");\n        vNeedClosingTags = (String[]) conf.get(\"vNeedClosingTags\");\n        vDisallowed = (String[]) conf.get(\"vDisallowed\");\n        vAllowedProtocols = (String[]) conf.get(\"vAllowedProtocols\");\n        vProtocolAtts = (String[]) conf.get(\"vProtocolAtts\");\n        vRemoveBlanks = (String[]) conf.get(\"vRemoveBlanks\");\n        vAllowedEntities = (String[]) conf.get(\"vAllowedEntities\");\n        stripComment =  conf.containsKey(\"stripComment\") ? (Boolean) conf.get(\"stripComment\") : true;\n        encodeQuotes = conf.containsKey(\"encodeQuotes\") ? (Boolean) conf.get(\"encodeQuotes\") : true;\n        alwaysMakeTags = conf.containsKey(\"alwaysMakeTags\") ? (Boolean) conf.get(\"alwaysMakeTags\") : true;\n    }\n\n    private void reset() {\n        vTagCounts.clear();\n    }\n\n    private void debug(final String msg) {\n        if (vDebug) {\n            Logger.getAnonymousLogger().info(msg);\n        }\n    }\n\n    //---------------------------------------------------------------\n    // my versions of some PHP library functions\n    public static String chr(final int decimal) {\n        return String.valueOf((char) decimal);\n    }\n\n    public static String htmlSpecialChars(final String s) {\n        String result = s;\n        result = regexReplace(P_AMP, \"&amp;\", result);\n        result = regexReplace(P_QUOTE, \"&quot;\", result);\n        result = regexReplace(P_LEFT_ARROW, \"&lt;\", result);\n        result = regexReplace(P_RIGHT_ARROW, \"&gt;\", result);\n        return result;\n    }\n\n    //---------------------------------------------------------------\n    /**\n     * given a user submitted input String, filter out any invalid or restricted\n     * html.\n     *\n     * @param input text (i.e. submitted by a user) than may contain html\n     * @return \"clean\" version of input, with only valid, whitelisted html elements allowed\n     */\n    public String filter(final String input) {\n        reset();\n        String s = input;\n\n        debug(\"************************************************\");\n        debug(\"              INPUT: \" + input);\n\n        s = escapeComments(s);\n        debug(\"     escapeComments: \" + s);\n\n        s = balanceHTML(s);\n        debug(\"        balanceHTML: \" + s);\n\n        s = checkTags(s);\n        debug(\"          checkTags: \" + s);\n\n        s = processRemoveBlanks(s);\n        debug(\"processRemoveBlanks: \" + s);\n\n        s = validateEntities(s);\n        debug(\"    validateEntites: \" + s);\n\n        debug(\"************************************************\\n\\n\");\n        return s;\n    }\n\n    public boolean isAlwaysMakeTags(){\n        return alwaysMakeTags;\n    }\n\n    public boolean isStripComments(){\n        return stripComment;\n    }\n\n    private String escapeComments(final String s) {\n        final Matcher m = P_COMMENTS.matcher(s);\n        final StringBuffer buf = new StringBuffer();\n        if (m.find()) {\n            final String match = m.group(1); //(.*?)\n            m.appendReplacement(buf, Matcher.quoteReplacement(\"<!--\" + htmlSpecialChars(match) + \"-->\"));\n        }\n        m.appendTail(buf);\n\n        return buf.toString();\n    }\n\n    private String balanceHTML(String s) {\n        if (alwaysMakeTags) {\n            //\n            // try and form html\n            //\n            s = regexReplace(P_END_ARROW, \"\", s);\n            s = regexReplace(P_BODY_TO_END, \"<$1>\", s);\n            s = regexReplace(P_XML_CONTENT, \"$1<$2\", s);\n\n        } else {\n            //\n            // escape stray brackets\n            //\n            s = regexReplace(P_STRAY_LEFT_ARROW, \"&lt;$1\", s);\n            s = regexReplace(P_STRAY_RIGHT_ARROW, \"$1$2&gt;<\", s);\n\n            //\n            // the last regexp causes '<>' entities to appear\n            // (we need to do a lookahead assertion so that the last bracket can\n            // be used in the next pass of the regexp)\n            //\n            s = regexReplace(P_BOTH_ARROWS, \"\", s);\n        }\n\n        return s;\n    }\n\n    private String checkTags(String s) {\n        Matcher m = P_TAGS.matcher(s);\n\n        final StringBuffer buf = new StringBuffer();\n        while (m.find()) {\n            String replaceStr = m.group(1);\n            replaceStr = processTag(replaceStr);\n            m.appendReplacement(buf, Matcher.quoteReplacement(replaceStr));\n        }\n        m.appendTail(buf);\n\n        s = buf.toString();\n\n        // these get tallied in processTag\n        // (remember to reset before subsequent calls to filter method)\n        for (String key : vTagCounts.keySet()) {\n            for (int ii = 0; ii < vTagCounts.get(key); ii++) {\n                s += \"</\" + key + \">\";\n            }\n        }\n\n        return s;\n    }\n\n    private String processRemoveBlanks(final String s) {\n        String result = s;\n        for (String tag : vRemoveBlanks) {\n            if(!P_REMOVE_PAIR_BLANKS.containsKey(tag)){\n                P_REMOVE_PAIR_BLANKS.putIfAbsent(tag, Pattern.compile(\"<\" + tag + \"(\\\\s[^>]*)?></\" + tag + \">\"));\n            }\n            result = regexReplace(P_REMOVE_PAIR_BLANKS.get(tag), \"\", result);\n            if(!P_REMOVE_SELF_BLANKS.containsKey(tag)){\n                P_REMOVE_SELF_BLANKS.putIfAbsent(tag, Pattern.compile(\"<\" + tag + \"(\\\\s[^>]*)?/>\"));\n            }\n            result = regexReplace(P_REMOVE_SELF_BLANKS.get(tag), \"\", result);\n        }\n\n        return result;\n    }\n\n    private static String regexReplace(final Pattern regex_pattern, final String replacement, final String s) {\n        Matcher m = regex_pattern.matcher(s);\n        return m.replaceAll(replacement);\n    }\n\n    private String processTag(final String s) {\n        // ending tags\n        Matcher m = P_END_TAG.matcher(s);\n        if (m.find()) {\n            final String name = m.group(1).toLowerCase();\n            if (allowed(name)) {\n                if (!inArray(name, vSelfClosingTags)) {\n                    if (vTagCounts.containsKey(name)) {\n                        vTagCounts.put(name, vTagCounts.get(name) - 1);\n                        return \"</\" + name + \">\";\n                    }\n                }\n            }\n        }\n\n        // starting tags\n        m = P_START_TAG.matcher(s);\n        if (m.find()) {\n            final String name = m.group(1).toLowerCase();\n            final String body = m.group(2);\n            String ending = m.group(3);\n\n            //debug( \"in a starting tag, name='\" + name + \"'; body='\" + body + \"'; ending='\" + ending + \"'\" );\n            if (allowed(name)) {\n                String params = \"\";\n\n                final Matcher m2 = P_QUOTED_ATTRIBUTES.matcher(body);\n                final Matcher m3 = P_UNQUOTED_ATTRIBUTES.matcher(body);\n                final List<String> paramNames = new ArrayList<String>();\n                final List<String> paramValues = new ArrayList<String>();\n                while (m2.find()) {\n                    paramNames.add(m2.group(1)); //([a-z0-9]+)\n                    paramValues.add(m2.group(3)); //(.*?)\n                }\n                while (m3.find()) {\n                    paramNames.add(m3.group(1)); //([a-z0-9]+)\n                    paramValues.add(m3.group(3)); //([^\\\"\\\\s']+)\n                }\n\n                String paramName, paramValue;\n                for (int ii = 0; ii < paramNames.size(); ii++) {\n                    paramName = paramNames.get(ii).toLowerCase();\n                    paramValue = paramValues.get(ii);\n\n//          debug( \"paramName='\" + paramName + \"'\" );\n//          debug( \"paramValue='\" + paramValue + \"'\" );\n//          debug( \"allowed? \" + vAllowed.get( name ).contains( paramName ) );\n\n                    if (allowedAttribute(name, paramName)) {\n                        if (inArray(paramName, vProtocolAtts)) {\n                            paramValue = processParamProtocol(paramValue);\n                        }\n                        params += \" \" + paramName + \"=\\\"\" + paramValue + \"\\\"\";\n                    }\n                }\n\n                if (inArray(name, vSelfClosingTags)) {\n                    ending = \" /\";\n                }\n\n                if (inArray(name, vNeedClosingTags)) {\n                    ending = \"\";\n                }\n\n                if (ending == null || ending.length() < 1) {\n                    if (vTagCounts.containsKey(name)) {\n                        vTagCounts.put(name, vTagCounts.get(name) + 1);\n                    } else {\n                        vTagCounts.put(name, 1);\n                    }\n                } else {\n                    ending = \" /\";\n                }\n                return \"<\" + name + params + ending + \">\";\n            } else {\n                return \"\";\n            }\n        }\n\n        // comments\n        m = P_COMMENT.matcher(s);\n        if (!stripComment && m.find()) {\n            return  \"<\" + m.group() + \">\";\n        }\n\n        return \"\";\n    }\n\n    private String processParamProtocol(String s) {\n        s = decodeEntities(s);\n        final Matcher m = P_PROTOCOL.matcher(s);\n        if (m.find()) {\n            final String protocol = m.group(1);\n            if (!inArray(protocol, vAllowedProtocols)) {\n                // bad protocol, turn into local anchor link instead\n                s = \"#\" + s.substring(protocol.length() + 1, s.length());\n                if (s.startsWith(\"#//\")) {\n                    s = \"#\" + s.substring(3, s.length());\n                }\n            }\n        }\n\n        return s;\n    }\n\n    private String decodeEntities(String s) {\n        StringBuffer buf = new StringBuffer();\n\n        Matcher m = P_ENTITY.matcher(s);\n        while (m.find()) {\n            final String match = m.group(1);\n            final int decimal = Integer.decode(match).intValue();\n            m.appendReplacement(buf, Matcher.quoteReplacement(chr(decimal)));\n        }\n        m.appendTail(buf);\n        s = buf.toString();\n\n        buf = new StringBuffer();\n        m = P_ENTITY_UNICODE.matcher(s);\n        while (m.find()) {\n            final String match = m.group(1);\n            final int decimal = Integer.valueOf(match, 16).intValue();\n            m.appendReplacement(buf, Matcher.quoteReplacement(chr(decimal)));\n        }\n        m.appendTail(buf);\n        s = buf.toString();\n\n        buf = new StringBuffer();\n        m = P_ENCODE.matcher(s);\n        while (m.find()) {\n            final String match = m.group(1);\n            final int decimal = Integer.valueOf(match, 16).intValue();\n            m.appendReplacement(buf, Matcher.quoteReplacement(chr(decimal)));\n        }\n        m.appendTail(buf);\n        s = buf.toString();\n\n        s = validateEntities(s);\n        return s;\n    }\n\n    private String validateEntities(final String s) {\n        StringBuffer buf = new StringBuffer();\n\n        // validate entities throughout the string\n        Matcher m = P_VALID_ENTITIES.matcher(s);\n        while (m.find()) {\n            final String one = m.group(1); //([^&;]*)\n            final String two = m.group(2); //(?=(;|&|$))\n            m.appendReplacement(buf, Matcher.quoteReplacement(checkEntity(one, two)));\n        }\n        m.appendTail(buf);\n\n        return encodeQuotes(buf.toString());\n    }\n\n    private String encodeQuotes(final String s){\n        if(encodeQuotes){\n            StringBuffer buf = new StringBuffer();\n            Matcher m = P_VALID_QUOTES.matcher(s);\n            while (m.find()) {\n                final String one = m.group(1); //(>|^)\n                final String two = m.group(2); //([^<]+?)\n                final String three = m.group(3); //(<|$)\n                m.appendReplacement(buf, Matcher.quoteReplacement(one + regexReplace(P_QUOTE, \"&quot;\", two) + three));\n            }\n            m.appendTail(buf);\n            return buf.toString();\n        }else{\n            return s;\n        }\n    }\n\n    private String checkEntity(final String preamble, final String term) {\n\n        return \";\".equals(term) && isValidEntity(preamble)\n                ? '&' + preamble\n                : \"&amp;\" + preamble;\n    }\n\n    private boolean isValidEntity(final String entity) {\n        return inArray(entity, vAllowedEntities);\n    }\n\n    private static boolean inArray(final String s, final String[] array) {\n        for (String item : array) {\n            if (item != null && item.equals(s)) {\n                return true;\n            }\n        }\n        return false;\n    }\n\n    private boolean allowed(final String name) {\n        return (vAllowed.isEmpty() || vAllowed.containsKey(name)) && !inArray(name, vDisallowed);\n    }\n\n    private boolean allowedAttribute(final String name, final String paramName) {\n        return allowed(name) && (vAllowed.isEmpty() || vAllowed.get(name).contains(paramName));\n    }\n}"
  },
  {
    "path": "src/main/java/io/sdb/common/xss/SQLFilter.java",
    "content": "package io.sdb.common.xss;\n\nimport io.sdb.common.exception.RRException;\nimport org.apache.commons.lang.StringUtils;\n\n/**\n * SQL过滤\n * @author chenshun\n * @email sunlightcs@gmail.com\n * @date 2017-04-01 16:16\n */\npublic class SQLFilter {\n\n    /**\n     * SQL注入过滤\n     * @param str  待验证的字符串\n     */\n    public static String sqlInject(String str){\n        if(StringUtils.isBlank(str)){\n            return null;\n        }\n        //去掉'|\"|;|\\字符\n        str = StringUtils.replace(str, \"'\", \"\");\n        str = StringUtils.replace(str, \"\\\"\", \"\");\n        str = StringUtils.replace(str, \";\", \"\");\n        str = StringUtils.replace(str, \"\\\\\", \"\");\n\n        //转换成小写\n        str = str.toLowerCase();\n\n        //非法字符\n        String[] keywords = {\"master\", \"truncate\", \"insert\", \"select\", \"delete\", \"update\", \"declare\", \"alert\", \"drop\"};\n\n        //判断是否包含非法字符\n        for(String keyword : keywords){\n            if(str.indexOf(keyword) != -1){\n                throw new RRException(\"包含非法字符\");\n            }\n        }\n\n        return str;\n    }\n}\n"
  },
  {
    "path": "src/main/java/io/sdb/common/xss/XssFilter.java",
    "content": "package io.sdb.common.xss;\n\nimport javax.servlet.*;\nimport javax.servlet.http.HttpServletRequest;\nimport java.io.IOException;\n\n/**\n * XSS过滤\n * @author chenshun\n * @email sunlightcs@gmail.com\n * @date 2017-04-01 10:20\n */\npublic class XssFilter implements Filter {\n\n\t@Override\n\tpublic void init(FilterConfig config) throws ServletException {\n\t}\n\n\tpublic void doFilter(ServletRequest request, ServletResponse response, FilterChain chain)\n            throws IOException, ServletException {\n\t\tXssHttpServletRequestWrapper xssRequest = new XssHttpServletRequestWrapper(\n\t\t\t\t(HttpServletRequest) request);\n\t\tchain.doFilter(xssRequest, response);\n\t}\n\n\t@Override\n\tpublic void destroy() {\n\t}\n\n}"
  },
  {
    "path": "src/main/java/io/sdb/common/xss/XssHttpServletRequestWrapper.java",
    "content": "package io.sdb.common.xss;\n\nimport org.apache.commons.io.IOUtils;\nimport org.apache.commons.lang.StringUtils;\nimport org.springframework.http.HttpHeaders;\nimport org.springframework.http.MediaType;\n\nimport javax.servlet.ReadListener;\nimport javax.servlet.ServletInputStream;\nimport javax.servlet.http.HttpServletRequest;\nimport javax.servlet.http.HttpServletRequestWrapper;\nimport java.io.ByteArrayInputStream;\nimport java.io.IOException;\nimport java.util.LinkedHashMap;\nimport java.util.Map;\n\n/**\n * XSS过滤处理\n * @author chenshun\n * @email sunlightcs@gmail.com\n * @date 2017-04-01 11:29\n */\npublic class XssHttpServletRequestWrapper extends HttpServletRequestWrapper {\n    //没被包装过的HttpServletRequest（特殊场景，需要自己过滤）\n    HttpServletRequest orgRequest;\n    //html过滤\n    private final static HTMLFilter htmlFilter = new HTMLFilter();\n\n    public XssHttpServletRequestWrapper(HttpServletRequest request) {\n        super(request);\n        orgRequest = request;\n    }\n\n    @Override\n    public ServletInputStream getInputStream() throws IOException {\n        //非json类型，直接返回\n        if(!MediaType.APPLICATION_JSON_VALUE.equalsIgnoreCase(super.getHeader(HttpHeaders.CONTENT_TYPE))){\n            return super.getInputStream();\n        }\n\n        //为空，直接返回\n        String json = IOUtils.toString(super.getInputStream(), \"utf-8\");\n        if (StringUtils.isBlank(json)) {\n            return super.getInputStream();\n        }\n\n        //xss过滤\n        json = xssEncode(json);\n        final ByteArrayInputStream bis = new ByteArrayInputStream(json.getBytes(\"utf-8\"));\n        return new ServletInputStream() {\n            @Override\n            public boolean isFinished() {\n                return true;\n            }\n\n            @Override\n            public boolean isReady() {\n                return true;\n            }\n\n            @Override\n            public void setReadListener(ReadListener readListener) {\n\n            }\n\n            @Override\n            public int read() throws IOException {\n                return bis.read();\n            }\n        };\n    }\n\n    @Override\n    public String getParameter(String name) {\n        String value = super.getParameter(xssEncode(name));\n        if (StringUtils.isNotBlank(value)) {\n            value = xssEncode(value);\n        }\n        return value;\n    }\n\n    @Override\n    public String[] getParameterValues(String name) {\n        String[] parameters = super.getParameterValues(name);\n        if (parameters == null || parameters.length == 0) {\n            return null;\n        }\n\n        for (int i = 0; i < parameters.length; i++) {\n            parameters[i] = xssEncode(parameters[i]);\n        }\n        return parameters;\n    }\n\n    @Override\n    public Map<String,String[]> getParameterMap() {\n        Map<String,String[]> map = new LinkedHashMap<>();\n        Map<String,String[]> parameters = super.getParameterMap();\n        for (String key : parameters.keySet()) {\n            String[] values = parameters.get(key);\n            for (int i = 0; i < values.length; i++) {\n                values[i] = xssEncode(values[i]);\n            }\n            map.put(key, values);\n        }\n        return map;\n    }\n\n    @Override\n    public String getHeader(String name) {\n        String value = super.getHeader(xssEncode(name));\n        if (StringUtils.isNotBlank(value)) {\n            value = xssEncode(value);\n        }\n        return value;\n    }\n\n    private String xssEncode(String input) {\n        return htmlFilter.filter(input);\n    }\n\n    /**\n     * 获取最原始的request\n     */\n    public HttpServletRequest getOrgRequest() {\n        return orgRequest;\n    }\n\n    /**\n     * 获取最原始的request\n     */\n    public static HttpServletRequest getOrgRequest(HttpServletRequest request) {\n        if (request instanceof XssHttpServletRequestWrapper) {\n            return ((XssHttpServletRequestWrapper) request).getOrgRequest();\n        }\n\n        return request;\n    }\n\n}\n"
  },
  {
    "path": "src/main/java/io/sdb/config/ActiveRecordConfig.java",
    "content": "package io.sdb.config;\n\nimport com.jfinal.plugin.activerecord.ActiveRecordPlugin;\nimport com.jfinal.template.source.ClassPathSourceFactory;\nimport io.sdb.model._MappingKit;\nimport org.springframework.beans.factory.annotation.Autowired;\nimport org.springframework.context.annotation.Bean;\nimport org.springframework.stereotype.Component;\n\nimport javax.sql.DataSource;\n\n@Component\npublic class ActiveRecordConfig {\n\n    // 由于spring中已经注入了DruidDataSource这里直接拿\n    @Autowired\n    private DataSource ds;\n\n    @Bean(initMethod=\"start\", destroyMethod=\"stop\")\n    public ActiveRecordPlugin init() {\n        ActiveRecordPlugin arp = new ActiveRecordPlugin(ds);\n        arp.addSqlTemplate(\"sql/all.sql\");\n//        arp.addMapping(\"user\", UserModel.class);\n        arp.getEngine().setSourceFactory(new ClassPathSourceFactory());\n        _MappingKit.mapping(arp);\n        return arp;\n    }\n}\n"
  },
  {
    "path": "src/main/java/io/sdb/config/AlipayConfig.java",
    "content": "package io.sdb.config;\npublic class AlipayConfig {\n    // 商户appid\n\tpublic static String APPID = \"2016080200146930\";\n\t// 私钥 pkcs8格式的\n\tpublic static String RSA_PRIVATE_KEY = \"MIIEvwIBADANBgkqhkiG9w0BAQEFAASCBKkwggSlAgEAAoIBAQCvoIMcDKvaM7c224+YZg79hXJETq6aaXqGq4Ws2ClUtcDKek8ot12B5X65PT6B4eAsuAJmtioOB1d2IFx08YDE0wnOdQa7f4GnMhxsc5ncH3wcqFieFVaFqa36cOT6ctUUAEpfTtrevdQeIq3ZZPdPJlsdRQI83BvPjdruU8hna7Nc17WX3ypjZ4I62A0wS2/VKxIyB4eq6IMRzMBWasFV6hyMp4gtA7/2RPkHrjQzcKz2+47zvj/LqcvCaeNHgfNoO/Bde9F5fx40tXvYhsQeBjCbO1CZLVRFOoBAThczbXBMYroRGO5mWBrc4ObtJUEVyisLUuuMYdauCF9QcX5ZAgMBAAECggEAY3FLS3KRS/fEYbdoUy5Who4s6Sh0DNJ0ohQ0mG282U4gX4VplPBebdJ4MoLPBdPTjv6RvX6fyVm22BfywfSMqOWlw9TXfwrvarAhD/dUwyLAr6lSpBAI8Z3l+Mw7muOyaqTPd6+6lix+EqIoNdPJhHN/W89bOQKYbKkxsYiXDJcq1CgYw5CKO1dzNB1ciz1DZfEkfSBSjDQLrBzcJcU86VyEJwRlhz7OTbZGZ9/vugXn78aEIkl6sOI1JF1ci+opcViXAIlK9lg9UWZq7LHuVDx0gfXKWkhzc2TeUsshv9FQcMAyLKf5MXC/LYXVlb1/Cak8KFisjqwOWlF1I4dTQQKBgQDU1/491phjwCOl2k+mVFNNyCDuMtVxU7EC2HsXzC/wBRMjcgv939083E2+BmjFcKSGtgiw3bH7+ruaIu11VqNJT4v3mK63fvdQcvT96bkO2DBTpsdzsG8ceiyLPzKR83vrNx+CffbnC6jIxU6eMi704BvGwpfhh/c5zM4t8j7/BQKBgQDTPLklxa7FAq1sGHNQh9jLWj8+lTmKSrLE6DaV80ZcivkK5/BrSXNMdaH9AvA4vmYIsA6vHRnj4RFA1ndDTDDjeFh+J+Sr0kZSpMdjcpeLrAdO9heqWrgbgl3jZqXEsr7hikLy1FNNBa2wNBH5EO1hDMF5mq6yp9SgUBQIU8NaRQKBgQC99Q9pLS7QR9kI2nAfqD64upX5QNER1XmzanVhZdCazEyqY8ykBbmz6YJQx/OV0tRjje7vusxwcPQhum5nPK16bk4i6dd02RHscMyKGKAayYNIBR8Y9ywTJE7A7+Q4MjA0Wvv6QGWtCtDWbpGdynfyAFmJ6H4YwHo60bhpdTwX6QKBgQCK+7kWESsclNZl+PBmW/tYUNir5KMnSl61D9RadOYmnYmek1ysOneSJxOd1QEZVKztqmj+7rbKKJuhfXqa3NaN0/DlkHn0UzXRynkmBY+QZm+olGKdw3K/Jtd/d1o6QSE2ZDIIc4sbclEFTj1FEs4cvLfPuuaWxbYwhH+puvMdwQKBgQCkHW18bYaSPo4DI75TEvEyPzuTGp/pVTkro2eRjUFlwOuXQGUZwjrz+K4PJdITEUlRDSVr2WbmfEJ4EEj+ahHVKvWKVLq3Veb2SL/FUhX9Xbg8cAd+eU9pRaPoz3TxIlGQLjNcZNShhdmyzoQ7OU8G8FFL92kPAHhg0dKN4njYQg==\";\n\t// 服务器异步通知页面路径 需http://或者https://格式的完整路径，不能加?id=123这类自定义参数，必须外网可以正常访问\n\tpublic static String notify_url = \"http://sdbtest.s1.natapp.cc/sdb/pay/alinotify\";\n\t// 页面跳转同步通知页面路径 需http://或者https://格式的完整路径，不能加?id=123这类自定义参数，必须外网可以正常访问 商户可以自定义同步跳转地址\n\tpublic static String return_url = \"http://sdbtest.s1.natapp.cc/sdb/pay/returnUrl\";\n\t// 请求网关地址\n\tpublic static String URL = \"https://openapi.alipaydev.com/gateway.do\";\n\t// 编码\n\tpublic static String CHARSET = \"UTF-8\";\n\t// 返回格式\n\tpublic static String FORMAT = \"json\";\n\t// 支付宝公钥\n\tpublic static String ALIPAY_PUBLIC_KEY = \"MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEA11cJmqgBiJN8PGHVYHaVemuREwqZ6bQaa4EZvmIFeZt1juSJKfY1pSufhDrojAr5G8BBrYhywD3g4zzwmSnTKRpMEbwsf+S/YXd+sl3rZEcKihamJwOU1e9E7RXdmjJsKRh3rF38qXCklb2VqHkUMoPnzJlu2GQBGx2QxzuIiqJ3uEtCHYzssjfAgg4rz5iZuLGvkDTbJpWS3c0zP3KLPKFsZsvWGho2CPVtaDtwuLgq7I13XPo9qb0+K9N7ihoPUi3gzG4hkLWxa9kPjkoPJem6K+GKaSde/84GFXFbVhsQ7ozkOgKtbkdaC3RsJ7nf1VsUd+er601SAgueLxx0aQIDAQAB\";\n\n\t// 日志记录目录\n\tpublic static String log_path = \"/log\";\n\t// RSA2\n\tpublic static String SIGNTYPE = \"RSA2\";\n}\n"
  },
  {
    "path": "src/main/java/io/sdb/config/CorsConfig.java",
    "content": "package io.sdb.config;\n\nimport org.springframework.context.annotation.Configuration;\nimport org.springframework.web.servlet.config.annotation.CorsRegistry;\nimport org.springframework.web.servlet.config.annotation.WebMvcConfigurer;\n\n@Configuration\npublic class CorsConfig implements WebMvcConfigurer {\n\n    @Override\n    public void addCorsMappings(CorsRegistry registry) {\n        registry.addMapping(\"/**\")\n            .allowedOrigins(\"*\")\n            .allowCredentials(true)\n            .allowedMethods(\"GET\", \"POST\", \"PUT\", \"DELETE\", \"OPTIONS\")\n            .maxAge(3600);\n    }\n}"
  },
  {
    "path": "src/main/java/io/sdb/config/FilterConfig.java",
    "content": "package io.sdb.config;\n\nimport io.sdb.common.xss.XssFilter;\nimport org.springframework.boot.web.servlet.FilterRegistrationBean;\nimport org.springframework.context.annotation.Bean;\nimport org.springframework.context.annotation.Configuration;\nimport org.springframework.web.filter.DelegatingFilterProxy;\n\nimport javax.servlet.DispatcherType;\n\n/**\n * Filter配置\n *\n * @author chenshun\n * @email sunlightcs@gmail.com\n * @date 2017-04-21 21:56\n */\n@Configuration\npublic class FilterConfig {\n\n    @Bean\n    public FilterRegistrationBean shiroFilterRegistration() {\n        FilterRegistrationBean registration = new FilterRegistrationBean();\n        registration.setFilter(new DelegatingFilterProxy(\"shiroFilter\"));\n        //该值缺省为false，表示生命周期由SpringApplicationContext管理，设置为true则表示由ServletContainer管理\n        registration.addInitParameter(\"targetFilterLifecycle\", \"true\");\n        registration.setEnabled(true);\n        registration.setOrder(Integer.MAX_VALUE - 1);\n        registration.addUrlPatterns(\"/*\");\n        return registration;\n    }\n\n    @Bean\n    public FilterRegistrationBean xssFilterRegistration() {\n        FilterRegistrationBean registration = new FilterRegistrationBean();\n        registration.setDispatcherTypes(DispatcherType.REQUEST);\n        registration.setFilter(new XssFilter());\n        registration.addUrlPatterns(\"/*\");\n        registration.setName(\"xssFilter\");\n        registration.setOrder(Integer.MAX_VALUE);\n        return registration;\n    }\n}\n"
  },
  {
    "path": "src/main/java/io/sdb/config/JFinalTxAop.java",
    "content": "package io.sdb.config;\n\nimport com.jfinal.kit.LogKit;\nimport com.jfinal.plugin.activerecord.ActiveRecordException;\nimport com.jfinal.plugin.activerecord.Config;\nimport com.jfinal.plugin.activerecord.DbKit;\nimport com.jfinal.plugin.activerecord.NestedTransactionHelpException;\nimport com.jfinal.plugin.activerecord.tx.TxConfig;\nimport org.aspectj.lang.ProceedingJoinPoint;\nimport org.aspectj.lang.annotation.Around;\nimport org.aspectj.lang.annotation.Aspect;\nimport org.aspectj.lang.annotation.Pointcut;\nimport org.aspectj.lang.reflect.MethodSignature;\nimport org.springframework.stereotype.Component;\n\nimport java.lang.reflect.Method;\nimport java.sql.Connection;\nimport java.sql.SQLException;\n\n/**\n * Created by chunmeng.lu\n * Date: 2016-30-03 19:30\n */\n@Aspect\n@Component\npublic class JFinalTxAop {\n\n    @Pointcut(value = \"@annotation(io.sdb.common.annotation.JFinalTx)\")\n    private void jFinalTx() {}\n\n    @Around(value = \"jFinalTx()\", argNames = \"pjp\")\n    public Object doAround(ProceedingJoinPoint pjp) throws Throwable {\n        Object retVal = null;\n        Config config = getConfigWithTxConfig(pjp);\n        if (config == null)\n            config = DbKit.getConfig();\n\n        Connection conn = config.getThreadLocalConnection();\n        // Nested transaction support\n        if (conn != null) {\n            try {\n                if (conn.getTransactionIsolation() < getTransactionLevel(config))\n                    conn.setTransactionIsolation(getTransactionLevel(config));\n                retVal = pjp.proceed();\n                return retVal;\n            } catch (SQLException e) {\n                throw new ActiveRecordException(e);\n            }\n        }\n\n        Boolean autoCommit = null;\n        try {\n            conn = config.getConnection();\n            autoCommit = conn.getAutoCommit();\n            config.setThreadLocalConnection(conn);\n            // conn.setTransactionIsolation(transactionLevel);\n            conn.setTransactionIsolation(getTransactionLevel(config));\n\n            conn.setAutoCommit(false);\n            retVal = pjp.proceed();\n            conn.commit();\n        } catch (NestedTransactionHelpException e) {\n            if (conn != null) try {conn.rollback();} catch (Exception e1) {LogKit.error(e1.getMessage(), e1);}\n            LogKit.logNothing(e);\n        } catch (Throwable t) {\n            if (conn != null) try {conn.rollback();} catch (Exception e1) {LogKit.error(e1.getMessage(), e1);}\n            throw t instanceof RuntimeException ? (RuntimeException)t : new ActiveRecordException(t);\n        }\n        finally {\n            try {\n                if (conn != null) {\n                    if (autoCommit != null)\n                        conn.setAutoCommit(autoCommit);\n                    conn.close();\n                }\n            } catch (Throwable t) {\n                // can not throw exception here, otherwise the more important exception in previous catch block can not be thrown\n                LogKit.error(t.getMessage(), t);\n            }\n            finally {\n                // prevent memory leak\n                config.removeThreadLocalConnection();\n            }\n        }\n        return retVal;\n    }\n\n    /**\n     * 获取配置的事务级别\n     * @param config\n     * @return\n     */\n    protected int getTransactionLevel(Config config) {\n        return config.getTransactionLevel();\n    }\n\n    /**\n     * 获取配置的TxConfig，可注解到class或者方法上\n     * @param pjp\n     * @return Config\n     */\n    public static Config getConfigWithTxConfig(ProceedingJoinPoint pjp) {\n        MethodSignature ms = (MethodSignature) pjp.getSignature();\n        Method method = ms.getMethod();\n        TxConfig txConfig = method.getAnnotation(TxConfig.class);\n        if (txConfig == null)\n            txConfig = pjp.getTarget().getClass().getAnnotation(TxConfig.class);\n\n        if (txConfig != null) {\n            Config config = DbKit.getConfig(txConfig.value());\n            if (config == null)\n                throw new RuntimeException(\"Config not found with TxConfig: \" + txConfig.value());\n            return config;\n        }\n        return null;\n    }\n}"
  },
  {
    "path": "src/main/java/io/sdb/config/KaptchaConfig.java",
    "content": "package io.sdb.config;\n\nimport com.google.code.kaptcha.impl.DefaultKaptcha;\nimport com.google.code.kaptcha.util.Config;\nimport org.springframework.context.annotation.Bean;\nimport org.springframework.context.annotation.Configuration;\n\nimport java.util.Properties;\n\n\n/**\n * 生成验证码配置\n *\n * @author chenshun\n * @email sunlightcs@gmail.com\n * @date 2017-04-20 19:22\n */\n@Configuration\npublic class KaptchaConfig {\n\n    @Bean\n    public DefaultKaptcha producer() {\n        Properties properties = new Properties();\n        properties.put(\"kaptcha.border\", \"no\");\n        properties.put(\"kaptcha.textproducer.font.color\", \"black\");\n        properties.put(\"kaptcha.textproducer.char.space\", \"5\");\n        Config config = new Config(properties);\n        DefaultKaptcha defaultKaptcha = new DefaultKaptcha();\n        defaultKaptcha.setConfig(config);\n        return defaultKaptcha;\n    }\n}\n"
  },
  {
    "path": "src/main/java/io/sdb/config/Kuaidi100Config.java",
    "content": "package io.sdb.config;\n\nimport lombok.Data;\nimport org.springframework.boot.context.properties.ConfigurationProperties;\nimport org.springframework.stereotype.Component;\n\nimport java.util.Map;\n\n/**\n * Created by yjjdick\n * 2017-07-03 01:31\n */\n@Data\n@Component\n@ConfigurationProperties(prefix = \"kuaidi100\")\npublic class Kuaidi100Config {\n\n    private String notifyUrl;\n\n    private String kuaidi100Key;\n\n    private String kuaidi100PollUrl;\n\n}\n"
  },
  {
    "path": "src/main/java/io/sdb/config/OrderProperties.java",
    "content": "package io.sdb.config;\n\nimport lombok.Data;\nimport org.apache.commons.lang3.builder.ToStringBuilder;\nimport org.apache.commons.lang3.builder.ToStringStyle;\nimport org.springframework.boot.context.properties.ConfigurationProperties;\nimport org.springframework.stereotype.Component;\n\n/**\n * @author <a href=\"https://github.com/binarywang\">Binary Wang</a>\n */\n@ConfigurationProperties(prefix = \"order\")\n@Component\n@Data\npublic class OrderProperties {\n    Boolean refund;\n}\n"
  },
  {
    "path": "src/main/java/io/sdb/config/RedisConfig.java",
    "content": "package io.sdb.config;\n\nimport org.springframework.beans.factory.annotation.Autowired;\nimport org.springframework.context.annotation.Bean;\nimport org.springframework.context.annotation.Configuration;\nimport org.springframework.data.redis.connection.RedisConnectionFactory;\nimport org.springframework.data.redis.core.*;\nimport org.springframework.data.redis.serializer.StringRedisSerializer;\n\n/**\n * Redis配置\n *\n * @author chenshun\n * @email sunlightcs@gmail.com\n * @date 2017-07-70 19:22\n */\n@Configuration\npublic class RedisConfig {\n    @Autowired\n    private RedisConnectionFactory factory;\n\n    @Bean\n    public RedisTemplate<String, Object> redisTemplate() {\n        RedisTemplate<String, Object> redisTemplate = new RedisTemplate<>();\n        redisTemplate.setKeySerializer(new StringRedisSerializer());\n        redisTemplate.setHashKeySerializer(new StringRedisSerializer());\n        redisTemplate.setHashValueSerializer(new StringRedisSerializer());\n        redisTemplate.setValueSerializer(new StringRedisSerializer());\n        redisTemplate.setConnectionFactory(factory);\n        return redisTemplate;\n    }\n\n    @Bean\n    public HashOperations<String, String, Object> hashOperations(RedisTemplate<String, Object> redisTemplate) {\n        return redisTemplate.opsForHash();\n    }\n\n    @Bean\n    public ValueOperations<String, String> valueOperations(RedisTemplate<String, String> redisTemplate) {\n        return redisTemplate.opsForValue();\n    }\n\n    @Bean\n    public ListOperations<String, Object> listOperations(RedisTemplate<String, Object> redisTemplate) {\n        return redisTemplate.opsForList();\n    }\n\n    @Bean\n    public SetOperations<String, Object> setOperations(RedisTemplate<String, Object> redisTemplate) {\n        return redisTemplate.opsForSet();\n    }\n\n    @Bean\n    public ZSetOperations<String, Object> zSetOperations(RedisTemplate<String, Object> redisTemplate) {\n        return redisTemplate.opsForZSet();\n    }\n}\n"
  },
  {
    "path": "src/main/java/io/sdb/config/ShiroConfig.java",
    "content": "package io.sdb.config;\n\nimport io.sdb.sys.oauth2.OAuth2Filter;\nimport io.sdb.sys.oauth2.OAuth2Realm;\nimport org.apache.shiro.mgt.SecurityManager;\nimport org.apache.shiro.session.mgt.SessionManager;\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.apache.shiro.web.session.mgt.DefaultWebSessionManager;\nimport org.springframework.aop.framework.autoproxy.DefaultAdvisorAutoProxyCreator;\nimport org.springframework.context.annotation.Bean;\nimport org.springframework.context.annotation.Configuration;\n\nimport javax.servlet.Filter;\nimport java.util.HashMap;\nimport java.util.LinkedHashMap;\nimport java.util.Map;\n\n/**\n * Shiro配置\n *\n * @author chenshun\n * @email sunlightcs@gmail.com\n * @date 2017-04-20 18:33\n */\n@Configuration\npublic class ShiroConfig {\n\n    @Bean(\"sessionManager\")\n    public SessionManager sessionManager(){\n        DefaultWebSessionManager sessionManager = new DefaultWebSessionManager();\n        sessionManager.setSessionValidationSchedulerEnabled(true);\n        sessionManager.setSessionIdCookieEnabled(true);\n        return sessionManager;\n    }\n\n    @Bean(\"securityManager\")\n    public SecurityManager securityManager(OAuth2Realm oAuth2Realm, SessionManager sessionManager) {\n        DefaultWebSecurityManager securityManager = new DefaultWebSecurityManager();\n        securityManager.setRealm(oAuth2Realm);\n        securityManager.setSessionManager(sessionManager);\n\n        return securityManager;\n    }\n\n    @Bean(\"shiroFilter\")\n    public ShiroFilterFactoryBean shirFilter(SecurityManager securityManager) {\n        ShiroFilterFactoryBean shiroFilter = new ShiroFilterFactoryBean();\n        shiroFilter.setSecurityManager(securityManager);\n\n        //oauth过滤\n        Map<String, Filter> filters = new HashMap<>();\n        filters.put(\"oauth2\", new OAuth2Filter());\n        shiroFilter.setFilters(filters);\n\n        Map<String, String> filterMap = new LinkedHashMap<>();\n        filterMap.put(\"/test/**\", \"anon\");\n        filterMap.put(\"/actuator/**\", \"anon\");\n        filterMap.put(\"/pay/**\", \"anon\");\n        filterMap.put(\"/webjars/**\", \"anon\");\n        filterMap.put(\"/druid/**\", \"anon\");\n        filterMap.put(\"/app/**\", \"anon\");\n        filterMap.put(\"/file/**\", \"anon\");\n        filterMap.put(\"/wechat/**\", \"anon\");\n        filterMap.put(\"/UEditor/**\", \"anon\");\n        filterMap.put(\"/sys/login\", \"anon\");\n        filterMap.put(\"/sys/logistics/**\", \"anon\");\n        filterMap.put(\"/swagger/**\", \"anon\");\n        filterMap.put(\"/wx/**\", \"anon\");\n        filterMap.put(\"/v2/api-docs\", \"anon\");\n        filterMap.put(\"/swagger-ui.html\", \"anon\");\n        filterMap.put(\"/swagger-resources/**\", \"anon\");\n        filterMap.put(\"/captcha.jpg\", \"anon\");\n        filterMap.put(\"/**\", \"oauth2\");\n        shiroFilter.setFilterChainDefinitionMap(filterMap);\n\n        return shiroFilter;\n    }\n\n    @Bean(\"lifecycleBeanPostProcessor\")\n    public LifecycleBeanPostProcessor lifecycleBeanPostProcessor() {\n        return new LifecycleBeanPostProcessor();\n    }\n\n    @Bean\n    public DefaultAdvisorAutoProxyCreator defaultAdvisorAutoProxyCreator() {\n        DefaultAdvisorAutoProxyCreator proxyCreator = new DefaultAdvisorAutoProxyCreator();\n        proxyCreator.setProxyTargetClass(true);\n        return proxyCreator;\n    }\n\n    @Bean\n    public AuthorizationAttributeSourceAdvisor authorizationAttributeSourceAdvisor(SecurityManager securityManager) {\n        AuthorizationAttributeSourceAdvisor advisor = new AuthorizationAttributeSourceAdvisor();\n        advisor.setSecurityManager(securityManager);\n        return advisor;\n    }\n\n}\n"
  },
  {
    "path": "src/main/java/io/sdb/config/SpringBootConfig.java",
    "content": "package io.sdb.config;\n\nimport com.jfinal.template.ext.spring.JFinalViewResolver;\nimport com.jfinal.template.source.ClassPathSourceFactory;\nimport org.springframework.context.annotation.Bean;\nimport org.springframework.context.annotation.Configuration;\n\n@Configuration\npublic class SpringBootConfig {\n    @Bean(name = \"jfinalViewResolver\")\n    public JFinalViewResolver getJfinalViewRrsolver() {\n        JFinalViewResolver jfr = new JFinalViewResolver();\n        jfr.setDevMode(true);\n\n        jfr.setSourceFactory(new ClassPathSourceFactory());\n        jfr.setPrefix(\"/templates/\");\n        jfr.setSuffix(\".html\");\n        jfr.setContentType(\"text/html;charset=UTF-8\");\n        jfr.setOrder(0);\n//        jfr.addSharedFunction(\"/view/common/_layout.html\");\n        return jfr;\n    }\n}\n"
  },
  {
    "path": "src/main/java/io/sdb/config/SwaggerConfig.java",
    "content": "package io.sdb.config;\n\nimport io.swagger.annotations.ApiOperation;\nimport org.springframework.context.annotation.Bean;\nimport org.springframework.context.annotation.Configuration;\nimport org.springframework.web.servlet.config.annotation.ResourceHandlerRegistry;\nimport org.springframework.web.servlet.config.annotation.WebMvcConfigurer;\nimport springfox.documentation.builders.ApiInfoBuilder;\nimport springfox.documentation.builders.PathSelectors;\nimport springfox.documentation.builders.RequestHandlerSelectors;\nimport springfox.documentation.service.ApiInfo;\nimport springfox.documentation.spi.DocumentationType;\nimport springfox.documentation.spring.web.plugins.Docket;\nimport springfox.documentation.swagger2.annotations.EnableSwagger2;\n\n@Configuration\n@EnableSwagger2\npublic class SwaggerConfig implements WebMvcConfigurer {\n\n    @Override\n    public void addResourceHandlers(ResourceHandlerRegistry registry) {\n        registry.addResourceHandler(\"swagger-ui.html\").addResourceLocations(\"classpath:/META-INF/resources/\");\n        registry.addResourceHandler(\"/webjars/**\").addResourceLocations(\"classpath:/META-INF/resources/webjars/\");\n    }\n\n    @Bean\n    public Docket createRestApi() {\n        return new Docket(DocumentationType.SWAGGER_2)\n            .apiInfo(apiInfo())\n            .select()\n            .apis(RequestHandlerSelectors.withMethodAnnotation(ApiOperation.class))           //加了ApiOperation注解的方法，生成接口文档\n//            .apis(RequestHandlerSelectors.basePackage(\"io.sdb.controller\"))  //包下的类，生成接口文档\n            .paths(PathSelectors.any())\n            .build();\n    }\n\n    private ApiInfo apiInfo() {\n        return new ApiInfoBuilder()\n            .title(\"森多邦开源\")\n            .description(\"森多邦框架文档\")\n            .termsOfServiceUrl(\"http://www.senduobang.com\")\n            .version(\"1.0\")\n            .build();\n    }\n\n}"
  },
  {
    "path": "src/main/java/io/sdb/config/WebMvcConfig.java",
    "content": "package io.sdb.config;\n\nimport io.sdb.interceptor.AuthorizationInterceptor;\nimport io.sdb.resolver.LoginUserHandlerMethodArgumentResolver;\nimport org.springframework.beans.factory.annotation.Autowired;\nimport org.springframework.context.annotation.Configuration;\nimport org.springframework.web.method.support.HandlerMethodArgumentResolver;\nimport org.springframework.web.servlet.config.annotation.InterceptorRegistry;\nimport org.springframework.web.servlet.config.annotation.WebMvcConfigurer;\n\nimport java.util.List;\n\n/**\n * MVC配置\n *\n * @author chenshun\n * @email sunlightcs@gmail.com\n * @date 2017-04-20 22:30\n */\n@Configuration\npublic class WebMvcConfig implements WebMvcConfigurer {\n    @Autowired\n    private AuthorizationInterceptor authorizationInterceptor;\n    @Autowired\n    private LoginUserHandlerMethodArgumentResolver loginUserHandlerMethodArgumentResolver;\n\n    @Override\n    public void addInterceptors(InterceptorRegistry registry) {\n        registry.addInterceptor(authorizationInterceptor).addPathPatterns(\"/app/**\");\n        registry.addInterceptor(authorizationInterceptor).addPathPatterns(\"/wechat/**\");\n    }\n\n    @Override\n    public void addArgumentResolvers(List<HandlerMethodArgumentResolver> argumentResolvers) {\n        argumentResolvers.add(loginUserHandlerMethodArgumentResolver);\n    }\n}"
  },
  {
    "path": "src/main/java/io/sdb/config/WechatOpenConfig.java",
    "content": "package io.sdb.config;\n\nimport me.chanjar.weixin.mp.api.WxMpConfigStorage;\nimport me.chanjar.weixin.mp.api.WxMpInMemoryConfigStorage;\nimport me.chanjar.weixin.mp.api.WxMpService;\nimport me.chanjar.weixin.mp.api.impl.WxMpServiceImpl;\nimport org.springframework.beans.factory.annotation.Autowired;\nimport org.springframework.context.annotation.Bean;\nimport org.springframework.stereotype.Component;\n\n/**\n * Created by yjjdick\n * 2017-07-30 11:05\n */\n@Component\npublic class WechatOpenConfig {\n\n    @Autowired\n    private WxMpProperties config;\n\n    @Bean\n    public WxMpService wxOpenService() {\n        WxMpService wxOpenService = new WxMpServiceImpl();\n        wxOpenService.setWxMpConfigStorage(wxOpenConfigStorage());\n        return wxOpenService;\n    }\n\n    @Bean\n    public WxMpConfigStorage wxOpenConfigStorage() {\n        WxMpInMemoryConfigStorage wxMpInMemoryConfigStorage = new WxMpInMemoryConfigStorage();\n        wxMpInMemoryConfigStorage.setAppId(config.getOpenAppId());\n        wxMpInMemoryConfigStorage.setSecret(config.getOpenAppSecret());\n        return wxMpInMemoryConfigStorage;\n    }\n}\n"
  },
  {
    "path": "src/main/java/io/sdb/config/WechatPayConfig.java",
    "content": "package io.sdb.config;\n\nimport com.google.common.collect.Maps;\nimport com.lly835.bestpay.config.WxPayH5Config;\nimport com.lly835.bestpay.service.impl.BestPayServiceImpl;\nimport me.chanjar.weixin.mp.api.WxMpInMemoryConfigStorage;\nimport me.chanjar.weixin.mp.api.WxMpService;\nimport me.chanjar.weixin.mp.api.impl.WxMpServiceImpl;\nimport org.springframework.beans.factory.annotation.Autowired;\nimport org.springframework.boot.context.properties.EnableConfigurationProperties;\nimport org.springframework.context.annotation.Bean;\nimport org.springframework.context.annotation.Configuration;\nimport org.springframework.stereotype.Component;\n\nimport java.util.Map;\nimport java.util.stream.Collectors;\n\n/**\n * Created by yjjdick\n * 2017-07-04 01:05\n */\n@Configuration\n@EnableConfigurationProperties(WxMpProperties.class)\npublic class WechatPayConfig {\n\n    private WxMaProperties properties;\n\n    public WechatPayConfig(WxMaProperties maProperties) {\n        this.properties = maProperties;\n    }\n\n    @Bean\n    public BestPayServiceImpl bestPayService() {\n        BestPayServiceImpl bestPayService = new BestPayServiceImpl();\n        bestPayService.setWxPayH5Config(wxPayH5Config());\n        return bestPayService;\n    }\n\n    @Bean\n    public WxPayH5Config wxPayH5Config() {\n        WxPayH5Config wxPayH5Config = new WxPayH5Config();\n        wxPayH5Config.setAppId(this.properties.getAppid());\n        wxPayH5Config.setAppSecret(properties.getSecret());\n        wxPayH5Config.setMchId(properties.getMchId());\n        wxPayH5Config.setMchKey(properties.getMchKey());\n        wxPayH5Config.setKeyPath(properties.getKeyPath());\n        wxPayH5Config.setNotifyUrl(properties.getNotifyUrl());\n        return wxPayH5Config;\n    }\n}\n"
  },
  {
    "path": "src/main/java/io/sdb/config/WxMaConfiguration.java",
    "content": "package io.sdb.config;\n\nimport cn.binarywang.wx.miniapp.api.WxMaService;\nimport cn.binarywang.wx.miniapp.api.impl.WxMaServiceImpl;\nimport cn.binarywang.wx.miniapp.bean.WxMaKefuMessage;\nimport cn.binarywang.wx.miniapp.bean.WxMaTemplateMessage;\nimport cn.binarywang.wx.miniapp.config.WxMaConfig;\nimport cn.binarywang.wx.miniapp.config.WxMaInMemoryConfig;\nimport cn.binarywang.wx.miniapp.message.WxMaMessageHandler;\nimport cn.binarywang.wx.miniapp.message.WxMaMessageRouter;\nimport com.google.common.collect.Lists;\nimport me.chanjar.weixin.common.bean.result.WxMediaUploadResult;\nimport me.chanjar.weixin.common.exception.WxErrorException;\nimport org.springframework.beans.factory.annotation.Autowired;\nimport org.springframework.boot.autoconfigure.condition.ConditionalOnClass;\nimport org.springframework.boot.autoconfigure.condition.ConditionalOnMissingBean;\nimport org.springframework.boot.context.properties.EnableConfigurationProperties;\nimport org.springframework.context.annotation.Bean;\nimport org.springframework.context.annotation.Configuration;\n\nimport java.io.File;\n\n/**\n * @author <a href=\"https://github.com/binarywang\">Binary Wang</a>\n */\n@Configuration\n@ConditionalOnClass(WxMaService.class)\n@EnableConfigurationProperties(WxMaProperties.class)\npublic class WxMaConfiguration {\n\n    private WxMaProperties properties;\n\n    public WxMaConfiguration(WxMaProperties properties) {\n        this.properties = properties;\n    }\n\n\n    private static final WxMaMessageHandler templateMsgHandler = (wxMessage, context, service, sessionManager) ->\n            service.getMsgService().sendTemplateMsg(WxMaTemplateMessage.builder()\n                    .templateId(\"此处更换为自己的模板id\")\n                    .formId(\"自己替换可用的formid\")\n                    .data(Lists.newArrayList(\n                            new WxMaTemplateMessage.Data(\"keyword1\", \"339208499\", \"#173177\")))\n                    .toUser(wxMessage.getFromUser())\n                    .build());\n\n    private final WxMaMessageHandler logHandler = (wxMessage, context, service, sessionManager) -> {\n        System.out.println(\"收到消息：\" + wxMessage.toString());\n        service.getMsgService().sendKefuMsg(WxMaKefuMessage.newTextBuilder().content(\"收到信息为：\" + wxMessage.toJson())\n                .toUser(wxMessage.getFromUser()).build());\n    };\n\n    private final WxMaMessageHandler textHandler = (wxMessage, context, service, sessionManager) ->\n            service.getMsgService().sendKefuMsg(WxMaKefuMessage.newTextBuilder().content(\"回复文本消息\")\n                    .toUser(wxMessage.getFromUser()).build());\n\n    private final WxMaMessageHandler picHandler = (wxMessage, context, service, sessionManager) -> {\n        try {\n            WxMediaUploadResult uploadResult = service.getMediaService()\n                    .uploadMedia(\"image\", \"png\",\n                            ClassLoader.getSystemResourceAsStream(\"tmp.png\"));\n            service.getMsgService().sendKefuMsg(\n                    WxMaKefuMessage\n                            .newImageBuilder()\n                            .mediaId(uploadResult.getMediaId())\n                            .toUser(wxMessage.getFromUser())\n                            .build());\n        } catch (WxErrorException e) {\n            e.printStackTrace();\n        }\n    };\n\n    private final WxMaMessageHandler qrcodeHandler = (wxMessage, context, service, sessionManager) -> {\n        try {\n            final File file = service.getQrcodeService().createQrcode(\"123\", 430);\n            WxMediaUploadResult uploadResult = service.getMediaService().uploadMedia(\"image\", file);\n            service.getMsgService().sendKefuMsg(\n                    WxMaKefuMessage\n                            .newImageBuilder()\n                            .mediaId(uploadResult.getMediaId())\n                            .toUser(wxMessage.getFromUser())\n                            .build());\n        } catch (WxErrorException e) {\n            e.printStackTrace();\n        }\n    };\n\n    @Bean\n    @ConditionalOnMissingBean\n    public WxMaConfig maConfig() {\n        WxMaInMemoryConfig config = new WxMaInMemoryConfig();\n        config.setAppid(this.properties.getAppid());\n        config.setSecret(this.properties.getSecret());\n        config.setToken(this.properties.getToken());\n        config.setAesKey(this.properties.getAesKey());\n        config.setMsgDataFormat(this.properties.getMsgDataFormat());\n\n        return config;\n    }\n\n    @Bean\n    @ConditionalOnMissingBean\n    public WxMaService wxMaService(WxMaConfig maConfig) {\n        WxMaService service = new WxMaServiceImpl();\n        service.setWxMaConfig(maConfig);\n        return service;\n    }\n\n    @Bean\n    public WxMaMessageRouter router(WxMaService service) {\n        final WxMaMessageRouter router = new WxMaMessageRouter(service);\n        router\n                .rule().handler(logHandler).next()\n                .rule().async(false).content(\"模板\").handler(templateMsgHandler).end()\n                .rule().async(false).content(\"文本\").handler(textHandler).end()\n                .rule().async(false).content(\"图片\").handler(picHandler).end()\n                .rule().async(false).content(\"二维码\").handler(qrcodeHandler).end();\n        return router;\n    }\n\n}\n"
  },
  {
    "path": "src/main/java/io/sdb/config/WxMaProperties.java",
    "content": "package io.sdb.config;\n\nimport lombok.Data;\nimport org.apache.commons.lang3.builder.ToStringBuilder;\nimport org.apache.commons.lang3.builder.ToStringStyle;\nimport org.springframework.boot.context.properties.ConfigurationProperties;\n\n/**\n * @author <a href=\"https://github.com/binarywang\">Binary Wang</a>\n */\n@ConfigurationProperties(prefix = \"wechat.ma\")\n@Data\npublic class WxMaProperties {\n    /**\n     * 设置微信小程序的appid\n     */\n    private String appid;\n\n    /**\n     * 设置微信小程序的Secret\n     */\n    private String secret;\n\n    /**\n     * 设置微信小程序的token\n     */\n    private String token;\n\n    /**\n     * 设置微信小程序的EncodingAESKey\n     */\n    private String aesKey;\n\n    /**\n     * 消息格式，XML或者JSON\n     */\n    private String msgDataFormat;\n\n    /**\n     * 开放平台APPID\n     */\n    private String openAppId;\n\n    /**\n     * 开放平台密钥\n     */\n    private String openAppSecret;\n\n    /**\n     * 商户号\n     */\n    private String mchId;\n\n    /**\n     * 商户密钥\n     */\n    private String mchKey;\n\n    /**\n     * 商户证书路径\n     */\n    private String keyPath;\n\n    /**\n     * 微信支付异步通知地址\n     */\n    private String notifyUrl;\n\n    @Override\n    public String toString() {\n        return ToStringBuilder.reflectionToString(this, ToStringStyle.JSON_STYLE);\n    }\n}\n"
  },
  {
    "path": "src/main/java/io/sdb/config/WxMpConfiguration.java",
    "content": "package io.sdb.config;\n\nimport cn.binarywang.wx.miniapp.api.WxMaService;\nimport cn.binarywang.wx.miniapp.message.WxMaMessageRouter;\nimport io.sdb.handler.*;\nimport com.google.common.collect.Maps;\nimport me.chanjar.weixin.mp.api.WxMpInMemoryConfigStorage;\nimport me.chanjar.weixin.mp.api.WxMpMessageRouter;\nimport me.chanjar.weixin.mp.api.WxMpService;\nimport me.chanjar.weixin.mp.api.impl.WxMpServiceImpl;\nimport me.chanjar.weixin.mp.constant.WxMpEventConstants;\nimport org.springframework.beans.factory.annotation.Autowired;\nimport org.springframework.boot.context.properties.EnableConfigurationProperties;\nimport org.springframework.context.annotation.Bean;\nimport org.springframework.context.annotation.Configuration;\n\nimport java.util.Map;\nimport java.util.stream.Collectors;\n\nimport static me.chanjar.weixin.common.api.WxConsts.*;\n\n/**\n * wechat mp configuration\n *\n * @author Binary Wang(https://github.com/binarywang)\n */\n@Configuration\n@EnableConfigurationProperties(WxMpProperties.class)\npublic class WxMpConfiguration {\n    private LogHandler logHandler;\n    private NullHandler nullHandler;\n    private KfSessionHandler kfSessionHandler;\n    private StoreCheckNotifyHandler storeCheckNotifyHandler;\n    private LocationHandler locationHandler;\n    private MenuHandler menuHandler;\n    private MsgHandler msgHandler;\n    private UnsubscribeHandler unsubscribeHandler;\n    private SubscribeHandler subscribeHandler;\n\n    private WxMpProperties properties;\n\n    private static Map<String, WxMpMessageRouter> routers = Maps.newHashMap();\n    private static Map<String, WxMpService> mpServices = Maps.newHashMap();\n\n    @Autowired\n    public WxMpConfiguration(LogHandler logHandler, NullHandler nullHandler, KfSessionHandler kfSessionHandler,\n                             StoreCheckNotifyHandler storeCheckNotifyHandler, LocationHandler locationHandler,\n                             MenuHandler menuHandler, MsgHandler msgHandler, UnsubscribeHandler unsubscribeHandler,\n                             SubscribeHandler subscribeHandler, WxMpProperties properties) {\n        this.logHandler = logHandler;\n        this.nullHandler = nullHandler;\n        this.kfSessionHandler = kfSessionHandler;\n        this.storeCheckNotifyHandler = storeCheckNotifyHandler;\n        this.locationHandler = locationHandler;\n        this.menuHandler = menuHandler;\n        this.msgHandler = msgHandler;\n        this.unsubscribeHandler = unsubscribeHandler;\n        this.subscribeHandler = subscribeHandler;\n        this.properties = properties;\n    }\n\n    public static Map<String, WxMpMessageRouter> getRouters() {\n        return routers;\n    }\n\n    public static Map<String, WxMpService> getMpServices() {\n        return mpServices;\n    }\n\n    @Bean\n    public Object services() {\n        mpServices = this.properties.getConfigs()\n                .stream()\n                .map(a -> {\n                    WxMpInMemoryConfigStorage configStorage = new WxMpInMemoryConfigStorage();\n                    configStorage.setAppId(a.getAppId());\n                    configStorage.setSecret(a.getSecret());\n                    configStorage.setToken(a.getToken());\n                    configStorage.setAesKey(a.getAesKey());\n\n                    WxMpService service = new WxMpServiceImpl();\n                    service.setWxMpConfigStorage(configStorage);\n                    routers.put(a.getAppId(), this.newRouter(service));\n                    return service;\n                }).collect(Collectors.toMap(s -> s.getWxMpConfigStorage().getAppId(), a -> a));\n\n        return Boolean.TRUE;\n    }\n\n    private WxMpMessageRouter newRouter(WxMpService wxMpService) {\n        final WxMpMessageRouter newRouter = new WxMpMessageRouter(wxMpService);\n\n        // 记录所有事件的日志 （异步执行）\n        newRouter.rule().handler(this.logHandler).next();\n\n        // 接收客服会话管理事件\n        newRouter.rule().async(false).msgType(XmlMsgType.EVENT)\n            .event(WxMpEventConstants.CustomerService.KF_CREATE_SESSION)\n            .handler(this.kfSessionHandler).end();\n        newRouter.rule().async(false).msgType(XmlMsgType.EVENT)\n            .event(WxMpEventConstants.CustomerService.KF_CLOSE_SESSION)\n            .handler(this.kfSessionHandler)\n            .end();\n        newRouter.rule().async(false).msgType(XmlMsgType.EVENT)\n            .event(WxMpEventConstants.CustomerService.KF_SWITCH_SESSION)\n            .handler(this.kfSessionHandler).end();\n\n        // 门店审核事件\n        newRouter.rule().async(false).msgType(XmlMsgType.EVENT)\n            .event(WxMpEventConstants.POI_CHECK_NOTIFY)\n            .handler(this.storeCheckNotifyHandler).end();\n\n        // 自定义菜单事件\n        newRouter.rule().async(false).msgType(XmlMsgType.EVENT)\n            .event(MenuButtonType.CLICK).handler(this.menuHandler).end();\n\n        // 点击菜单连接事件\n        newRouter.rule().async(false).msgType(XmlMsgType.EVENT)\n            .event(MenuButtonType.VIEW).handler(this.nullHandler).end();\n\n        // 关注事件\n        newRouter.rule().async(false).msgType(XmlMsgType.EVENT)\n            .event(EventType.SUBSCRIBE).handler(this.subscribeHandler)\n            .end();\n\n        // 取消关注事件\n        newRouter.rule().async(false).msgType(XmlMsgType.EVENT)\n            .event(EventType.UNSUBSCRIBE)\n            .handler(this.unsubscribeHandler).end();\n\n        // 上报地理位置事件\n        newRouter.rule().async(false).msgType(XmlMsgType.EVENT)\n            .event(EventType.LOCATION).handler(this.locationHandler)\n            .end();\n\n        // 接收地理位置消息\n        newRouter.rule().async(false).msgType(XmlMsgType.LOCATION)\n            .handler(this.locationHandler).end();\n\n        // 扫码事件\n        newRouter.rule().async(false).msgType(XmlMsgType.EVENT)\n            .event(EventType.SCAN).handler(this.nullHandler).end();\n\n        // 默认\n        newRouter.rule().async(false).handler(this.msgHandler).end();\n\n        return newRouter;\n    }\n\n\n}\n"
  },
  {
    "path": "src/main/java/io/sdb/config/WxMpProperties.java",
    "content": "package io.sdb.config;\n\nimport lombok.Data;\nimport org.springframework.boot.context.properties.ConfigurationProperties;\nimport org.springframework.stereotype.Component;\n\nimport java.util.List;\nimport java.util.Map;\n\n/**\n * Created by yjjdick\n * 2017-07-03 01:31\n */\n@Data\n@ConfigurationProperties(prefix = \"wechat.mp\")\npublic class WxMpProperties {\n\n    private List<MpConfig> configs;\n\n    @Data\n    public static class MpConfig {\n        /**\n         * 设置微信公众号的appid\n         */\n        private String appId;\n\n        /**\n         * 设置微信公众号的app secret\n         */\n        private String secret;\n\n        /**\n         * 设置微信公众号的token\n         */\n        private String token;\n\n        /**\n         * 设置微信公众号的EncodingAESKey\n         */\n        private String aesKey;\n    }\n\n\n    private String openAppId;\n\n    /**\n     * 开放平台密钥\n     */\n    private String openAppSecret;\n\n    /**\n     * 商户号\n     */\n    private String mchId;\n\n    /**\n     * 商户密钥\n     */\n    private String mchKey;\n\n    /**\n     * 商户证书路径\n     */\n    private String keyPath;\n\n    /**\n     * 微信支付异步通知地址\n     */\n    private String notifyUrl;\n\n}\n"
  },
  {
    "path": "src/main/java/io/sdb/controller/AbstractController.java",
    "content": "package io.sdb.controller;\n\nimport io.sdb.model.SysUser;\nimport org.apache.shiro.SecurityUtils;\nimport org.slf4j.Logger;\nimport org.slf4j.LoggerFactory;\n\n/**\n * Controller公共组件\n * \n * @author chenshun\n * @email sunlightcs@gmail.com\n * @date 2016年11月9日 下午9:42:26\n */\npublic abstract class AbstractController {\n\tprotected Logger logger = LoggerFactory.getLogger(getClass());\n\t\n\tprotected SysUser getUser() {\n\t\treturn (SysUser) SecurityUtils.getSubject().getPrincipal();\n\t}\n\n\tprotected Long getUserId() {\n\t\treturn getUser().getUserId();\n\t}\n}\n"
  },
  {
    "path": "src/main/java/io/sdb/controller/AppLoginController.java",
    "content": "package io.sdb.controller;\n\n\nimport io.sdb.common.utils.R;\nimport io.sdb.common.validator.ValidatorUtils;\nimport io.sdb.form.LoginForm;\nimport io.sdb.service.UserService;\nimport io.sdb.common.utils.JwtUtils;\nimport io.swagger.annotations.Api;\nimport io.swagger.annotations.ApiOperation;\nimport org.springframework.beans.factory.annotation.Autowired;\nimport org.springframework.web.bind.annotation.PostMapping;\nimport org.springframework.web.bind.annotation.RequestBody;\nimport org.springframework.web.bind.annotation.RequestMapping;\nimport org.springframework.web.bind.annotation.RestController;\n\nimport java.util.HashMap;\nimport java.util.Map;\n\n/**\n * APP登录授权\n *\n * @author chenshun\n * @email sunlightcs@gmail.com\n * @date 2017-03-23 15:31\n */\n@RestController\n@RequestMapping(\"/app\")\n@Api(\"APP登录接口\")\npublic class AppLoginController {\n    @Autowired\n    private UserService userService;\n    @Autowired\n    private JwtUtils jwtUtils;\n\n    /**\n     * 登录\n     */\n    @PostMapping(\"login\")\n    @ApiOperation(\"登录\")\n    public R login(@RequestBody LoginForm form){\n        //表单校验\n        ValidatorUtils.validateEntity(form);\n\n        //用户登录\n        String userId = userService.login(form);\n\n        //生成token\n        String token = jwtUtils.generateToken(userId);\n\n        Map<String, Object> map = new HashMap<>();\n        map.put(\"token\", token);\n        map.put(\"expire\", jwtUtils.getExpire());\n\n        return R.ok(map);\n    }\n\n}\n"
  },
  {
    "path": "src/main/java/io/sdb/controller/AppRegisterController.java",
    "content": "package io.sdb.controller;\n\n\nimport io.sdb.common.utils.R;\nimport io.sdb.common.validator.ValidatorUtils;\nimport io.sdb.model.User;\nimport io.sdb.form.RegisterForm;\nimport io.sdb.service.UserService;\nimport io.swagger.annotations.Api;\nimport io.swagger.annotations.ApiOperation;\nimport org.apache.commons.codec.digest.DigestUtils;\nimport org.springframework.beans.factory.annotation.Autowired;\nimport org.springframework.web.bind.annotation.PostMapping;\nimport org.springframework.web.bind.annotation.RequestBody;\nimport org.springframework.web.bind.annotation.RequestMapping;\nimport org.springframework.web.bind.annotation.RestController;\n\nimport java.util.Date;\n\n/**\n * 注册\n * @author chenshun\n * @email sunlightcs@gmail.com\n * @date 2017-03-26 17:27\n */\n@RestController\n@RequestMapping(\"/app\")\n@Api(\"APP注册接口\")\npublic class AppRegisterController {\n    @Autowired\n    private UserService userService;\n\n    @PostMapping(\"register\")\n    @ApiOperation(\"注册\")\n    public R register(@RequestBody RegisterForm form){\n        //表单校验\n        ValidatorUtils.validateEntity(form);\n\n        User user = new User();\n        user.setMobile(form.getMobile());\n        user.setUsername(form.getMobile());\n        user.setPassword(DigestUtils.sha256Hex(form.getPassword()));\n        user.setCreateDate(new Date());\n        user.save();\n\n        return R.ok();\n    }\n}\n"
  },
  {
    "path": "src/main/java/io/sdb/controller/AppTestController.java",
    "content": "package io.sdb.controller;\n\n\nimport io.sdb.common.utils.R;\nimport io.sdb.model.User;\nimport io.sdb.common.annotation.Login;\nimport io.sdb.common.annotation.LoginUser;\nimport io.swagger.annotations.Api;\nimport io.swagger.annotations.ApiOperation;\nimport org.springframework.web.bind.annotation.GetMapping;\nimport org.springframework.web.bind.annotation.RequestAttribute;\nimport org.springframework.web.bind.annotation.RequestMapping;\nimport org.springframework.web.bind.annotation.RestController;\n\n/**\n * APP测试接口\n *\n * @author chenshun\n * @email sunlightcs@gmail.com\n * @date 2017-03-23 15:47\n */\n@RestController\n@RequestMapping(\"/app\")\n@Api(\"APP测试接口\")\npublic class AppTestController {\n\n    @Login\n    @GetMapping(\"userInfo\")\n    @ApiOperation(\"获取用户信息\")\n    public R userInfo(@LoginUser User user){\n        return R.ok().put(\"user\", user);\n    }\n\n    @Login\n    @GetMapping(\"userId\")\n    @ApiOperation(\"获取用户ID\")\n    public R userInfo(@RequestAttribute(\"userId\") Integer userId){\n        return R.ok().put(\"userId\", userId);\n    }\n\n    @GetMapping(\"notToken\")\n    @ApiOperation(\"忽略Token验证测试\")\n    public R notToken(){\n        return R.ok().put(\"msg\", \"无需token也能访问。。。\");\n    }\n\n}\n"
  },
  {
    "path": "src/main/java/io/sdb/controller/CartController.java",
    "content": "/**\n * Copyright 2018\n * <p>\n * Licensed under the Apache License, Version 2.0 (the \"License\"); you may not\n * use this file except in compliance with the License. You may obtain a copy of\n * the License at\n * <p>\n * http://www.apache.org/licenses/LICENSE-2.0\n * <p>\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS, WITHOUT\n * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the\n * License for the specific language governing permissions and limitations under\n * the License.\n */\n\npackage io.sdb.controller;\n\nimport io.sdb.common.utils.R;\nimport io.sdb.dto.CartDTO;\nimport io.sdb.model.Cart;\nimport io.sdb.model.User;\nimport io.sdb.common.annotation.Login;\nimport io.sdb.common.annotation.LoginUser;\nimport io.sdb.form.CartForm;\nimport io.sdb.service.CartService;\nimport org.springframework.beans.factory.annotation.Autowired;\nimport org.springframework.web.bind.annotation.*;\n\nimport java.util.List;\n\n\n@RestController\n@RequestMapping(\"/wechat/cart\")\npublic class CartController {\n\t@Autowired\n\tprivate CartService cartService;\n\n\t@PostMapping(\"/add\")\n\t@Login\n\tpublic R info(@LoginUser User user, @RequestBody CartForm cartForm){\n\t\tcartService.saveOrUpdate(user.getUserId(), cartForm.getProductId(), cartForm.getQuantity());\n\t\tCart query = new Cart();\n\t\tquery.setUserId(user.getUserId());\n\t\tList<Cart> cartList = cartService.findByModel(query);\n\t\treturn R.ok().put(\"cartList\", cartList);\n\t}\n\n\t@PostMapping(\"/remove\")\n\t@Login\n\tpublic R remove(@LoginUser User user, @RequestBody CartForm cartForm) {\n\t\tLong[] cartItemIdArr = cartForm.getCartItemIds().toArray(new Long[cartForm.getCartItemIds().size()]);\n\t\tcartService.deleteBatch(cartItemIdArr);\n\t\tCart query = new Cart();\n\t\tquery.setUserId(user.getUserId());\n\t\tList<Cart> cartList = cartService.findByModel(query);\n\t\treturn R.ok().put(\"cartList\", cartList);\n\t}\n\n\t/**\n\t * 列表\n\t */\n\t@GetMapping(\"/list\")\n\t@Login\n\tpublic R list(@LoginUser User user){\n\t\tList<CartDTO> cartDTOList = cartService.listDetail(user.getUserId());\n\t\treturn R.ok().put(\"cartList\", cartDTOList);\n\t}\n}"
  },
  {
    "path": "src/main/java/io/sdb/controller/FavoriteGoodsController.java",
    "content": "package io.sdb.controller;\n\nimport io.sdb.common.annotation.Login;\nimport io.sdb.common.annotation.LoginUser;\nimport io.sdb.common.entity.Filter;\nimport io.sdb.common.utils.R;\nimport io.sdb.dto.FavoriteGoodsDTO;\nimport io.sdb.model.FavoriteGoods;\nimport io.sdb.model.User;\nimport io.sdb.service.FavoriteGoodsService;\nimport org.springframework.beans.factory.annotation.Autowired;\nimport org.springframework.stereotype.Controller;\nimport org.springframework.web.bind.annotation.*;\n\nimport java.util.ArrayList;\nimport java.util.List;\n\n@Controller\n@RequestMapping(\"/wechat/favoriteGoods\")\npublic class FavoriteGoodsController {\n\n\t@Autowired\n\tprivate FavoriteGoodsService favoriteGoodsService;\n\n\t@ResponseBody\n\t@GetMapping(\"list\")\n\t@Login\n\tpublic R list(@LoginUser User user){\n\t\tList<FavoriteGoodsDTO> favoriteGoodsDTOList = favoriteGoodsService.list(user.getUserId());\n\t\treturn R.ok().put(\"favoriteList\",favoriteGoodsDTOList);\n\t}\n\n\t/**\n\t * 添加收藏\n\t */\n\t@ResponseBody\n\t@GetMapping(\"/add/{goodsId}\")\n\t@Login\n\tpublic R add(@LoginUser User user, @PathVariable String goodsId){\n\t\tList<Filter> filterList = new ArrayList<>();\n\t\tFilter filterGoods = new Filter();\n\t\tfilterGoods.setProperty(\"favorite_goods\");\n\t\tfilterGoods.setOperator(Filter.Operator.eq);\n\t\tfilterGoods.setValue(goodsId);\n\t\tfilterList.add(filterGoods);\n\t\tFilter filterUser = new Filter();\n\t\tfilterUser.setProperty(\"favorite_user\");\n\t\tfilterUser.setOperator(Filter.Operator.eq);\n\t\tfilterUser.setValue(user.getUserId());\n\t\tfilterList.add(filterUser);\n\t\tList<FavoriteGoods> favoriteGoodsList = favoriteGoodsService.findByFilters(filterList);\n\t\tif(favoriteGoodsList==null || favoriteGoodsList.isEmpty()){\n\t\t\tFavoriteGoods favoriteGoods = new FavoriteGoods();\n\t\t\tfavoriteGoods.setFavoriteGoods(goodsId);\n\t\t\tfavoriteGoods.setFavoriteUser(user.getUserId());\n\t\t\tfavoriteGoodsService.insert(favoriteGoods);\n\t\t}\n\t\treturn R.ok();\n\t}\n\n\t/**\n\t * remove\n\t */\n\t@ResponseBody\n\t@Login\n\t@GetMapping(\"/remove/{goodsId}\")\n\tpublic R remove(@LoginUser User user, @PathVariable String goodsId){\n\t\tFilter filter = new Filter();\n\t\tfilter.setProperty(\"favorite_goods\");\n\t\tfilter.setOperator(Filter.Operator.eq);\n\t\tfilter.setValue(goodsId);\n\t\tfilter.setWhereOpt(Filter.WhereOpt.and);\n\t\tfilter.setProperty(\"favorite_user\");\n\t\tfilter.setOperator(Filter.Operator.eq);\n\t\tfilter.setValue(user.getUserId());\n\t\tList<FavoriteGoods> favoriteGoodsList = favoriteGoodsService.findByFilter(filter);\n\t\tif(favoriteGoodsList!=null || favoriteGoodsList.size()>0){\n\t\t\tFavoriteGoods favoriteGoods = new FavoriteGoods();\n\t\t\tfavoriteGoods.setFavoriteGoods(goodsId);\n\t\t\tfavoriteGoods.setFavoriteUser(user.getUserId());\n\t\t\tfavoriteGoodsService.deleteByModel(favoriteGoods);\n\t\t}\n\t\treturn R.ok();\n\t}\n\n}"
  },
  {
    "path": "src/main/java/io/sdb/controller/FileController.java",
    "content": "package io.sdb.controller;\n\nimport io.sdb.common.exception.RRException;\nimport io.sdb.common.utils.R;\nimport io.sdb.enums.ResultEnum;\nimport io.sdb.model.SysOss;\nimport io.sdb.common.annotation.Login;\nimport io.sdb.oss.cloud.OSSFactory;\nimport lombok.extern.slf4j.Slf4j;\nimport org.springframework.web.bind.annotation.*;\nimport org.springframework.web.multipart.MultipartFile;\n\nimport java.util.Date;\n\n/**\n * 微信小程序用户接口\n *\n * @author <a href=\"https://github.com/binarywang\">Binary Wang</a>\n */\n@RestController\n@Slf4j\n@RequestMapping(\"/file\")\npublic class FileController {\n\n    @PostMapping(\"/upload\")\n    @Login\n    public R upload(@RequestParam(\"file\") MultipartFile file) throws Exception {\n        if (file.isEmpty()) {\n            throw new RRException(\"上传文件不能为空\");\n        }\n\n        Long fileSize = file.getSize();\n        if (fileSize > 2048 * 1000) {\n            return R.error(ResultEnum.VOLUNTEER_UPLOAD_FILE_BIG);\n        }\n\n        //上传文件\n        String suffix = file.getOriginalFilename().substring(file.getOriginalFilename().lastIndexOf(\".\"));\n        String url = OSSFactory.build().uploadSuffix(file.getBytes(), suffix);\n\n        //保存文件信息\n        SysOss sysOss = new SysOss();\n        sysOss.setUrl(url);\n        sysOss.setCreateDate(new Date());\n        sysOss.save();\n\n        return R.ok().put(\"url\", url);\n    }\n\n}\n"
  },
  {
    "path": "src/main/java/io/sdb/controller/GoodsController.java",
    "content": "/**\n * Copyright 2018\n * <p>\n * Licensed under the Apache License, Version 2.0 (the \"License\"); you may not\n * use this file except in compliance with the License. You may obtain a copy of\n * the License at\n * <p>\n * http://www.apache.org/licenses/LICENSE-2.0\n * <p>\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS, WITHOUT\n * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the\n * License for the specific language governing permissions and limitations under\n * the License.\n */\n\npackage io.sdb.controller;\n\nimport com.jfinal.plugin.activerecord.Page;\nimport io.sdb.common.annotation.LoginUser;\nimport io.sdb.common.entity.Filter;\nimport io.sdb.common.entity.Order;\nimport io.sdb.common.utils.R;\nimport io.sdb.enums.GeneralEnum;\nimport io.sdb.model.FavoriteGoods;\nimport io.sdb.model.Goods;\nimport io.sdb.model.ProductCategory;\nimport io.sdb.common.annotation.Login;\nimport io.sdb.form.GoodsListForm;\nimport io.sdb.model.User;\nimport io.sdb.service.FavoriteGoodsService;\nimport io.sdb.service.GoodsService;\nimport io.sdb.service.ProductCategoryService;\nimport io.sdb.vo.GoodsVO;\nimport org.springframework.beans.BeanUtils;\nimport org.springframework.beans.factory.annotation.Autowired;\nimport org.springframework.stereotype.Controller;\nimport org.springframework.web.bind.annotation.*;\n\nimport java.util.ArrayList;\nimport java.util.List;\nimport java.util.stream.Collectors;\n\n\n@Controller\n@RequestMapping(\"/wechat/goods\")\npublic class GoodsController {\n\t@Autowired\n\tprivate GoodsService goodsService;\n\t@Autowired\n\tprivate ProductCategoryService productCategoryService;\n\t@Autowired\n\tprivate FavoriteGoodsService favoriteGoodsService;\n\n\t/**\n\t * 列表\n\t */\n\t@ResponseBody\n\t@Login\n\t@GetMapping(\"/info/{goodId}\")\n\tpublic R info(@LoginUser User user, @PathVariable String goodId){\n\t\tGoods goods = goodsService.findById(goodId);\n\n\t\tGoodsVO goodsVO = new GoodsVO();\n\t\tBeanUtils.copyProperties(goods, goodsVO);\n\t\tList<Filter> filterList = new ArrayList<>();\n\t\tFilter filterGoods = new Filter();\n\t\tfilterGoods.setProperty(\"favorite_goods\");\n\t\tfilterGoods.setOperator(Filter.Operator.eq);\n\t\tfilterGoods.setValue(goodId);\n\t\tFilter filterUser = new Filter();\n\t\tfilterUser.setProperty(\"favorite_user\");\n\t\tfilterUser.setOperator(Filter.Operator.eq);\n\t\tfilterUser.setValue(user.getUserId());\n\t\tfilterList.add(filterGoods);\n\t\tfilterList.add(filterUser);\n\t\tList<FavoriteGoods> favoriteGoodsList = favoriteGoodsService.findByFilters(filterList);\n\t\tif(favoriteGoodsList!=null && favoriteGoodsList.size()>0){\n\t\t\tgoodsVO.setFavorite(true);\n\t\t}\n\t\treturn R.ok().put(\"goodsInfo\", goodsVO);\n\t}\n\n\t/**\n\t * 列表\n\t */\n\t@ResponseBody\n\t@Login\n\t@PostMapping(\"/list\")\n\tpublic R info(@RequestBody GoodsListForm goodsListForm){\n\t\tList<Filter> filterList = new ArrayList<>();\n\n\t\tFilter filter = new Filter();\n\t\tif (goodsListForm.getCategoryId() != null &&!goodsListForm.getCategoryId().equals(-1)) {\n\t\t\tfilter.setProperty(\"product_category_id\");\n\t\t\tfilter.setOperator(Filter.Operator.in);\n\t\t\tFilter pc = new Filter();\n\t\t\tpc.setProperty(\"tree_path\");\n\t\t\tpc.setValue(goodsListForm.getCategoryId());\n\t\t\tpc.setOperator(Filter.Operator.like);\n\t\t\tList<ProductCategory> productCategoryList = productCategoryService.findByFilter(pc);\n\t\t\tList<Long> categoryIds = productCategoryList.stream().map(item -> {\n\t\t\t\treturn item.getId();\n\t\t\t}).collect(Collectors.toList());\n\t\t\tfilter.setValue(categoryIds);\n\t\t\tfilterList.add(filter);\n\t\t}\n\n\t\tfilter = new Filter();\n\t\tfilter.setProperty(\"is_marketable\");\n\t\tfilter.setValue(GeneralEnum.TRUE.getCode());\n\t\tfilter.setOperator(Filter.Operator.eq);\n\t\tfilterList.add(filter);\n\n\t\tOrder order = new Order();\n\t\torder.setProperty(\"create_date\");\n\t\torder.setDirection(Order.Direction.desc);\n\n\t\tPage<Goods> pr = goodsService.paginate(goodsListForm.getPageNum(), goodsListForm.getPageSize(), filterList, order);\n\n\t\treturn R.ok().put(\"goodsPage\", pr);\n\t}\n}"
  },
  {
    "path": "src/main/java/io/sdb/controller/GrouponController.java",
    "content": "package io.sdb.controller;\n\nimport com.jfinal.plugin.activerecord.Page;\nimport io.sdb.common.entity.Filter;\nimport io.sdb.common.entity.Order;\nimport io.sdb.common.utils.PageUtils;\nimport io.sdb.common.utils.R;\nimport io.sdb.enums.GeneralEnum;\nimport io.sdb.enums.GrouponStatusEnum;\nimport io.sdb.model.Groupon;\nimport io.sdb.model.GrouponTeam;\nimport io.sdb.model.User;\nimport io.sdb.service.GrouponService;\nimport io.sdb.service.GrouponTeamService;\nimport io.sdb.service.UserService;\nimport io.sdb.vo.GrouponDetailVO;\nimport io.sdb.vo.GrouponTeamVO;\nimport io.sdb.vo.GrouponVO;\nimport io.swagger.models.auth.In;\nimport org.apache.commons.collections.CollectionUtils;\nimport org.apache.commons.collections.Predicate;\nimport org.springframework.beans.BeanUtils;\nimport org.springframework.beans.factory.annotation.Autowired;\nimport org.springframework.stereotype.Controller;\nimport org.springframework.web.bind.annotation.*;\n\nimport java.util.*;\nimport java.util.stream.Collectors;\n\n@Controller\n@RequestMapping(\"/wechat/groupon\")\npublic class GrouponController {\n\n\t@Autowired\n\tprivate GrouponService grouponService;\n\n\t@Autowired\n\tprivate GrouponTeamService grouponTeamService;\n\n    @Autowired\n    private UserService userService;\n\n    @ResponseBody\n    @GetMapping(\"/grouponTeam/{grouponId}\")\n    public R grouponTeam(@PathVariable String grouponId){\n        Filter filter = new Filter();\n        filter.setProperty(\"groupon_id\");\n        filter.setOperator(Filter.Operator.eq);\n        filter.setValue(grouponId);\n\n        List<GrouponTeam> grouponTeamList = grouponTeamService.findByFilter(filter);\n\n        List<GrouponTeamVO> grouponTeamVOList = grouponTeamList.stream().map(item -> {\n            GrouponTeamVO grouponTeamVO = new GrouponTeamVO();\n            BeanUtils.copyProperties(item, grouponTeamVO);\n            User user = userService.findById(item.getUserId());\n            grouponTeamVO.setHeadUrl(user.getAvatar());\n            return grouponTeamVO;\n        }).collect(Collectors.toList());\n\n        Groupon groupon = grouponService.findById(grouponId);\n        Integer surplus = groupon.getCount() - grouponTeamList.size();\n        if (surplus < 0) {\n            surplus = 0;\n        }\n\n        return R.ok().put(\"grouponTeamList\", grouponTeamVOList).put(\"surplus\", surplus).put(\"grouponExpireTime\", groupon.getExpireDate().getTime());\n    }\n\n\t@ResponseBody\n\t@GetMapping(\"/grouponTop/{goodsId}\")\n\tpublic R grouponTop(@PathVariable String goodsId){\n        List<Filter> filterList = new ArrayList<>();\n        Filter filter = new Filter();\n\t\tfilter.setProperty(\"goods_id\");\n\t\tfilter.setOperator(Filter.Operator.eq);\n\t\tfilter.setValue(goodsId);\n        filterList.add(filter);\n\n        filter = new Filter();\n\t\tfilter.setProperty(\"expire_date\");\n\t\tfilter.setOperator(Filter.Operator.gt);\n\t\tfilter.setValue(new Date());\n        filterList.add(filter);\n\n        filter = new Filter();\n        filter.setProperty(\"status\");\n        filter.setOperator(Filter.Operator.eq);\n        filter.setValue(GrouponStatusEnum.PENDING.getCode());\n        filterList.add(filter);\n\n\t\tOrder order = new Order();\n\t\torder.setDirection(Order.Direction.asc);\n\t\torder.setProperty(\"create_date\");\n\t\tPage<Groupon> page = grouponService.paginate(1, 10, filterList, order);\n\n        List<Groupon> grouponList = page.getList();\n\n        List<GrouponDetailVO> grouponDetailVOList = grouponList.stream().map(item -> {\n            GrouponDetailVO grouponDetailVO = new GrouponDetailVO();\n            grouponDetailVO.setGrouponId(item.getId());\n            grouponDetailVO.setTotalCount(item.getCount());\n\n            List<Filter> gtFilterList = new ArrayList<>();\n\n            Filter gtFilter = new Filter();\n            gtFilter.setProperty(\"groupon_id\");\n            gtFilter.setOperator(Filter.Operator.eq);\n            gtFilter.setValue(item.getId());\n            gtFilterList.add(gtFilter);\n\n            List<GrouponTeam> grouponTeamList = grouponTeamService.findByFilters(gtFilterList);\n            GrouponTeam captain = new GrouponTeam();\n            for (GrouponTeam grouponTeam : grouponTeamList) {\n                if (grouponTeam.getCaptain() == GeneralEnum.TRUE.getCode()) {\n                    captain = grouponTeam;\n                    break;\n                }\n            }\n\n            User user = userService.findById(captain.getUserId());\n            grouponDetailVO.setHeadUrl(user.getAvatar());\n            grouponDetailVO.setName(user.getNickname());\n            grouponDetailVO.setJoinedCount(grouponTeamList.size());\n            return grouponDetailVO;\n        }).collect(Collectors.toList());\n\n\t\treturn R.ok().put(\"grouponDetailList\", grouponDetailVOList);\n\t}\n\n}"
  },
  {
    "path": "src/main/java/io/sdb/controller/OrderController.java",
    "content": "package io.sdb.controller;\n\nimport com.jfinal.plugin.activerecord.Page;\nimport com.lly835.bestpay.model.PayResponse;\nimport io.sdb.common.entity.Filter;\nimport io.sdb.common.entity.Order;\nimport io.sdb.common.exception.RRException;\nimport io.sdb.common.utils.PageUtils;\nimport io.sdb.common.utils.R;\nimport io.sdb.dto.OrderDTO;\nimport io.sdb.dto.ProductDTO;\nimport io.sdb.enums.*;\nimport io.sdb.form.*;\nimport io.sdb.model.*;\nimport io.sdb.common.annotation.Login;\nimport io.sdb.common.annotation.LoginUser;\nimport io.sdb.service.LogisticsService;\nimport io.sdb.service.*;\nimport io.sdb.vo.OrderDetailVO;\nimport io.sdb.vo.OrderVO;\nimport org.apache.commons.lang.StringUtils;\nimport org.springframework.beans.BeanUtils;\nimport org.springframework.beans.factory.annotation.Autowired;\nimport org.springframework.web.bind.annotation.*;\n\nimport javax.servlet.http.HttpServletRequest;\nimport java.util.ArrayList;\nimport java.util.List;\nimport java.util.stream.Collectors;\n\n@RestController\n@RequestMapping(\"/wechat/order\")\npublic class OrderController {\n\n    @Autowired\n    ReceiverService receiverService;\n\n    @Autowired\n    SnService snService;\n\n    @Autowired\n    CartService cartService;\n\n    @Autowired\n    OrderMasterService orderService;\n\n    @Autowired\n    OrderDetailService orderDetailService;\n\n    @Autowired\n    ProductService productService;\n\n    @Autowired\n    GoodsService goodsService;\n\n    @Autowired\n    PayService payService;\n\n    @Autowired\n    LogisticsService logisticsService;\n\n    @Autowired\n    GrouponService grouponService;\n\n    @Autowired\n    GrouponTeamService grouponTeamService;\n\n\n    @Login\n    @PostMapping(\"refund\")\n    public R refund(HttpServletRequest request, @LoginUser User user, @RequestBody RefundForm refundForm) {\n        OrderMaster orderMaster = orderService.findById(refundForm.getOrderId());\n        if (orderMaster.getOrderStatus().equals(OrderStatusEnum.NEW.getCode()) && orderMaster.getPayStatus().equals(PayStatusEnum.SUCCESS.getCode())) {\n            orderMaster = payService.refund(refundForm.getOrderId());\n            return R.ok().put(\"refundTradeNo\", orderMaster.getRefundTradeNo());\n        }else {\n            throw new RRException(ResultEnum.ORDER_STATUS_ERROR);\n        }\n    }\n\n    @Login\n    @PostMapping(\"cancel\")\n    public R cancel(@LoginUser User user,@RequestBody RefundForm refundForm) {\n        OrderMaster orderMaster = orderService.cancel(refundForm.getOrderId());\n        return R.ok().put(\"refundTradeNo\", orderMaster.getRefundTradeNo());\n    }\n\n    @Login\n    @GetMapping(\"logistic/{orderId}\")\n    public R logistic(@LoginUser User user, @PathVariable String orderId) {\n        OrderMaster orderMaster = orderService.findById(orderId);\n        Logistics logistics = logisticsService.findById(orderMaster.getTrackingNumber());\n        Filter filter = new Filter();\n        filter.setProperty(\"order_id\");\n        filter.setOperator(Filter.Operator.eq);\n        filter.setValue(orderId);\n\n        List<OrderDetail> orderDetails = orderDetailService.findByFilter(filter);\n        List<OrderDetailVO> orderDetailVOList = orderDetails.stream().map(item -> {\n            OrderDetailVO detailVO = new OrderDetailVO();\n            BeanUtils.copyProperties(item, detailVO);\n            return detailVO;\n        }).collect(Collectors.toList());\n        OrderVO orderVO = new OrderVO();\n        BeanUtils.copyProperties(orderMaster, orderVO);\n        orderVO.setOrderDetailList(orderDetailVOList);\n\n        return R.ok().put(\"orderInfo\", orderVO).put(\"logistics\", logistics);\n    }\n\n    @Login\n    @PostMapping(\"finish\")\n    public R finish(@LoginUser User user, @RequestBody OrderForm orderForm) {\n        OrderMaster orderMaster = orderService.findById(orderForm.getOrderId());\n        if (!orderMaster.getOrderStatus().equals(OrderStatusEnum.SHIPPING.getCode()) || !orderMaster.getBuyerId().equals(user.getUserId())) {\n            throw new RRException(ResultEnum.ORDER_STATUS_ERROR);\n        }\n        orderMaster.setOrderStatus(OrderStatusEnum.FINISHED.getCode());\n        orderMaster.update();\n        return R.ok();\n    }\n\n    @Login\n    @PostMapping(\"delete\")\n    public R delete(@LoginUser User user, @RequestBody OrderForm orderForm) {\n        OrderMaster orderMaster = orderService.findById(orderForm.getOrderId());\n        if (orderMaster.getOrderStatus().equals(OrderStatusEnum.FINISHED.getCode()) || orderMaster.getOrderStatus().equals(OrderStatusEnum.SHIPPING.getCode()) || !orderMaster.getBuyerId().equals(user.getUserId())) {\n            throw new RRException(ResultEnum.ORDER_STATUS_ERROR);\n        }\n        orderService.delete(orderForm.getOrderId());\n        return R.ok();\n    }\n\n    @Login\n    @GetMapping(\"info/{id}\")\n    public R checkout(@LoginUser User user, @PathVariable String id) {\n        OrderMaster orderMaster = orderService.findById(id);\n        OrderDetail query = new OrderDetail();\n        query.setOrderId(orderMaster.getOrderId());\n        List<OrderDetail> orderDetailList = orderDetailService.findByModel(query);\n        OrderVO orderVO = new OrderVO();\n        BeanUtils.copyProperties(orderMaster, orderVO);\n        List<OrderDetailVO> orderDetailVOList = orderDetailList.stream().map(item -> {\n            OrderDetailVO orderDetailVO = new OrderDetailVO();\n            BeanUtils.copyProperties(item, orderDetailVO);\n            return orderDetailVO;\n        }).collect(Collectors.toList());\n        orderVO.setOrderDetailList(orderDetailVOList);\n\n        if (orderMaster.getGroupon() == GeneralEnum.TRUE.getCode()) {\n            OrderDetail orderDetail = orderDetailList.get(0);\n            String productId = orderDetail.getProductId();\n            Product product = productService.findById(productId);\n            return R.ok().put(\"orderInfo\", orderVO).put(\"goodsId\", product.getGoodsSn());\n        }else {\n            return R.ok().put(\"orderInfo\", orderVO);\n        }\n    }\n\n    @Login\n    @PostMapping(\"detailList\")\n    public R detailList(@LoginUser User user,@RequestBody OrderDetailForm orderDetailForm) {\n\n        List<Filter> filterList = new ArrayList<>();\n        List<Order> orderList = new ArrayList<>();\n        Filter filter = new Filter();\n        filter.setProperty(\"buyer_id\");\n        filter.setOperator(Filter.Operator.eq);\n        filter.setValue(user.getUserId());\n        filterList.add(filter);\n\n        if (orderDetailForm.getOrderStatus() != -1) {\n            filter = new Filter();\n            filter.setProperty(\"order_status\");\n            filter.setOperator(Filter.Operator.in);\n            filter.setValue(orderDetailForm.getOrderStatus());\n            filterList.add(filter);\n        }\n\n        if (orderDetailForm.getOrderStatus() == OrderStatusEnum.NEW.getCode()) {\n            filter = new Filter();\n            filter.setProperty(\"order_status\");\n            filter.setOperator(Filter.Operator.in);\n            filter.setValue(OrderStatusEnum.GROUPON_SUCC.getCode());\n            filter.setWhereOpt(Filter.WhereOpt.or);\n            filterList.add(filter);\n        }\n\n        if (orderDetailForm.getPayStatus() != -1) {\n            filter = new Filter();\n            filter.setProperty(\"pay_status\");\n            filter.setOperator(Filter.Operator.in);\n            filter.setValue(orderDetailForm.getPayStatus());\n            filterList.add(filter);\n        }\n\n        Order order = new Order();\n        order.setProperty(\"create_date\");\n        order.setDirection(Order.Direction.desc);\n        orderList.add(order);\n\n        Page<OrderMaster> orderDetailPage = orderService.paginate(orderDetailForm.getPageNum(), orderDetailForm.getPageSize(), filterList, orderList);\n\n        if(orderDetailPage.getList().size() == 0) {\n            return R.ok().put(\"orderDetailPage\", new ArrayList<>());\n        }\n\n        List<String> orderIdList = orderDetailPage.getList().stream().map(item -> {\n            return item.getOrderId();\n        }).collect(Collectors.toList());\n\n        filter = new Filter();\n        filter.setProperty(\"order_id\");\n        filter.setOperator(Filter.Operator.in);\n        filter.setValue(orderIdList);\n        filterList.add(filter);\n\n        List<OrderVO> orderVOList = orderDetailPage.getList().stream().map(item -> {\n            OrderVO orderVO = new OrderVO();\n            BeanUtils.copyProperties(item, orderVO);\n            return orderVO;\n        }).collect(Collectors.toList());\n\n        List<OrderDetail> orderDetailList = orderDetailService.findByFilter(filter);\n        for (OrderVO orderVO:orderVOList\n             ) {\n            for (OrderDetail detail :\n                    orderDetailList) {\n                if (detail.getOrderId().equals(orderVO.getOrderId())) {\n                    OrderDetailVO orderDetailVO = new OrderDetailVO();\n                    BeanUtils.copyProperties(detail, orderDetailVO);\n                    if(orderVO.getOrderDetailList() == null) {\n                        orderVO.setOrderDetailList(new ArrayList<>());\n                    }\n                    orderVO.getOrderDetailList().add(orderDetailVO);\n                }\n            }\n        }\n\n        return R.ok().put(\"orderDetailPage\", new PageUtils(orderVOList, orderDetailPage.getTotalPage(), orderDetailPage.getPageSize(), orderDetailForm.getPageNum()));\n    }\n\n    @Login\n    @PostMapping(\"create\")\n    public R create(@LoginUser User user,@RequestBody CheckOutForm checkOutForm) {\n\n        if (checkOutForm.getProductInfos() == null || checkOutForm.getProductInfos().size() == 0) {\n            throw new RRException(ResultEnum.CART_CANNOT_NULL);\n        }\n\n        if (checkOutForm.isGroupon() && !StringUtils.isBlank(checkOutForm.getGrouponId())) {\n            Groupon groupon = grouponService.findById(checkOutForm.getGrouponId());\n            Integer total = groupon.getCount();\n            Filter filter = new Filter();\n            filter.setProperty(\"groupon_id\");\n            filter.setOperator(Filter.Operator.eq);\n            filter.setValue(checkOutForm.getGrouponId());\n\n            List<GrouponTeam> grouponTeamList = grouponTeamService.findByFilter(filter);\n            Integer joinCount = grouponTeamList.size();\n            if (total <= joinCount) {\n                throw new RRException(ResultEnum.GROUPON_NOT_ENOUGH);\n            }\n\n            GrouponTeam grouponTeam = grouponTeamService.findById(checkOutForm.getGrouponId(), user.getUserId());\n            if(grouponTeam != null) {\n                throw new RRException(ResultEnum.GROUPON_USER_EXSITS);\n            }\n        }\n\n        InvoiceInfo invoiceInfo = checkOutForm.getInvoiceInfo();\n        ReceiveInfo receiveInfo = checkOutForm.getReceiveInfo();\n\n        List<String> productIds = checkOutForm.getProductInfos().stream().map(item -> {\n            return item.getId();\n        }).collect(Collectors.toList());\n\n        List<ProductDTO> productList = productService.listDetailByProductIds(String.join(\",\", productIds));\n\n        for (ProductDTO item :productList\n             ) {\n            for (ProductInfo info :checkOutForm.getProductInfos()\n                 ) {\n                if (info.getId().equals(item.getSn())) {\n                    item.setQuantity(info.getQuantity());\n                    break;\n                }\n            }\n        }\n\n        OrderDTO orderDTO = new OrderDTO();\n        orderDTO.setBuyerAddress(receiveInfo.getFullAddr());\n        orderDTO.setBuyerName(receiveInfo.getName());\n        orderDTO.setBuyerOpenid(user.getMaOpenId());\n        orderDTO.setBuyerPhone(receiveInfo.getPhone());\n        orderDTO.setBuyerId(user.getUserId());\n        orderDTO.setTitle(invoiceInfo.getTitle());\n        orderDTO.setTaxNumber(invoiceInfo.getTaxNumber());\n        orderDTO.setBankAccount(invoiceInfo.getBankAccount());\n        orderDTO.setBankName(invoiceInfo.getBankName());\n        orderDTO.setInvoiceType(invoiceInfo.getType());\n        orderDTO.setCompanyAddress(invoiceInfo.getCompanyAddress());\n        orderDTO.setTelephone(invoiceInfo.getTelephone());\n        orderDTO.setRemark(checkOutForm.getRemark());\n        orderDTO.setNeedInvoice(checkOutForm.isNeedInvoice()? GeneralEnum.TRUE.getCode(): GeneralEnum.FALSE.getCode());\n        orderDTO.setTitle(invoiceInfo.getTitle());\n        orderDTO.setOrderStatus(OrderStatusEnum.NEW.getCode());\n        orderDTO.setPayStatus(PayStatusEnum.WAIT.getCode());\n        if(checkOutForm.isGroupon()) {\n            orderDTO.setGroupon(GeneralEnum.TRUE.getCode());\n            orderDTO.setGrouponId(checkOutForm.getGrouponId());\n            ProductDTO productDTO = productList.get(0);\n            Goods goods = goodsService.findById(productDTO.getGoodsSn());\n            orderDTO.setGrouponCount(goods.getGrouponCount());\n        }else {\n            orderDTO.setGroupon(GeneralEnum.FALSE.getCode());\n        }\n\n        List<OrderDetail> orderDetails = productList.stream().map(item->{\n            OrderDetail orderDetail = new OrderDetail();\n            String sn = snService.generate(SnEnum.ORDER_MASTER);\n            orderDetail.setDetailId(sn);\n            orderDetail.setProductIcon(item.getImage());\n            orderDetail.setProductId(item.getSn());\n            orderDetail.setProductName(item.getName());\n            orderDetail.setProductModel(item.getModel());\n            orderDetail.setProductSpec(item.getSpecificationValues());\n            orderDetail.setProductPrice(item.getPrice());\n            orderDetail.setGroupPrice(item.getGroupPrice());\n            orderDetail.setProductQuantity(item.getQuantity());\n            return orderDetail;\n        }).collect(Collectors.toList());\n        orderDTO.setOrderDetailList(orderDetails);\n\n        orderDTO = orderService.create(orderDTO);\n        if (checkOutForm.getCartItemIds() != null && checkOutForm.getCartItemIds().size() > 0) {\n            Object[] ids = checkOutForm.getCartItemIds().toArray();\n            cartService.deleteBatch(ids);\n        }\n\n        PayResponse payResponse = null;\n        if(orderDTO.getPayStatus().equals(PayStatusEnum.WAIT.getCode())) {\n            payResponse = payService.create(orderDTO);\n        }\n\n        return R.ok().put(\"orderDTO\", orderDTO).put(\"payResponse\", payResponse);\n    }\n\n\n\n}\n"
  },
  {
    "path": "src/main/java/io/sdb/controller/PayController.java",
    "content": "package io.sdb.controller;\n\nimport com.alipay.api.AlipayApiException;\nimport com.alipay.api.AlipayClient;\nimport com.alipay.api.DefaultAlipayClient;\nimport com.alipay.api.domain.AlipayTradeRefundModel;\nimport com.alipay.api.domain.AlipayTradeWapPayModel;\nimport com.alipay.api.internal.util.AlipaySignature;\nimport com.alipay.api.request.AlipayTradeRefundRequest;\nimport com.alipay.api.request.AlipayTradeWapPayRequest;\nimport com.alipay.api.response.AlipayTradeRefundResponse;\nimport io.sdb.config.AlipayConfig;\nimport io.sdb.service.OrderMasterService;\nimport io.sdb.service.PayService;\nimport lombok.extern.slf4j.Slf4j;\nimport org.springframework.beans.factory.annotation.Autowired;\nimport org.springframework.stereotype.Controller;\nimport org.springframework.web.bind.annotation.*;\nimport org.springframework.web.servlet.ModelAndView;\n\nimport javax.servlet.http.HttpServletRequest;\nimport javax.servlet.http.HttpServletResponse;\nimport java.io.IOException;\nimport java.io.UnsupportedEncodingException;\nimport java.util.HashMap;\nimport java.util.Iterator;\nimport java.util.Map;\nimport java.util.UUID;\n\n/**\n * APP登录授权\n *\n * @author chenshun\n * @email sunlightcs@gmail.com\n * @date 2017-03-23 15:31\n */\n@Controller\n@Slf4j\n@RequestMapping(\"/pay\")\npublic class PayController {\n\n    @Autowired\n    PayService payService;\n\n    @Autowired\n    OrderMasterService orderService;\n\n    @RequestMapping(\"/returnUrl\")\n    public void returnUrl(HttpServletResponse response, HttpServletRequest request) throws IOException, AlipayApiException {\n        response.sendRedirect(\"https://www.baidu.com\");\n    }\n\n    @RequestMapping(\"/refund/{no}\")\n    public void testTradeRefund(@PathVariable String no) throws Exception {\n        AlipayClient client = new DefaultAlipayClient(AlipayConfig.URL, AlipayConfig.APPID, AlipayConfig.RSA_PRIVATE_KEY, AlipayConfig.FORMAT, AlipayConfig.CHARSET, AlipayConfig.ALIPAY_PUBLIC_KEY,AlipayConfig.SIGNTYPE);\n        AlipayTradeRefundModel model = new AlipayTradeRefundModel();\n        model.setOutTradeNo(no); //与预授权转支付商户订单号相同，代表对该笔交易退款\n        model.setRefundAmount(\"0.01\");\n        model.setRefundReason(\"预授权退款测试\");\n        model.setOutRequestNo(\"refund0000001\");//标识一次退款请求，同一笔交易多次退款需要保证唯一，如部分退款则此参数必传。\n        AlipayTradeRefundRequest request = new AlipayTradeRefundRequest();\n        request.setBizModel(model);\n        AlipayTradeRefundResponse response = client.execute(request);\n        log.info(\"response: {}\"+response.getBody());\n\n\n\n//退款失败的\"fund_change\":\"N\"\n//        {\"alipay_trade_refund_response\":{\"code\":\"10000\",\"msg\":\"Success\",\"buyer_logon_id\":\"mqv***@sandbox.com\",\"buyer_user_id\":\"2088102171383132\",\"fund_change\":\"N\",\"gmt_refund_pay\":\"2018-08-30 15:39:03\",\"out_trade_no\":\"13c7b574-5f54-42da-8165-e9fc0602f74e\",\"refund_fee\":\"0.01\",\"send_back_fee\":\"0.00\",\"trade_no\":\"2018083021001004130500297310\"},\"sign\":\"LgzBU1K7056OLY0AAvFAZBVcZuXXt7PTbZDms5nB5qieslSKiKbYc22Jw4As/GdCJJuH7NVEtBABRM9UBXtTJBCGGn7By/H+vZfkulv43E4ASHvLC8OjXiPrypUO4SDleBTB4WW5h3Vnwk8q/SJ+UXv0lb5xrib84Zspsbz//3rrhzqGJ2sr/40YZIoIuevq/OAmLAkbNuAyIiC4ZxkJijF+mD3PbITTdYs/5e4cVEwriZcdLWnptblucSUtjKwEZvwaAuXuB+CEbqaMEBnpPgye0yqvY9tNb6PmVxHX7sc8sL9rfgDjK09xIXMhU9tgh0R/cgPZsRXvSs/HjHiqlA==\"}\n\n//退款成功的\"fund_change\":\"Y\"\n//        {\"alipay_trade_refund_response\":{\"code\":\"10000\",\"msg\":\"Success\",\"buyer_logon_id\":\"mqv***@sandbox.com\",\"buyer_user_id\":\"2088102171383132\",\"fund_change\":\"Y\",\"gmt_refund_pay\":\"2018-08-30 15:42:15\",\"out_trade_no\":\"2936025a-73eb-4273-8b1c-dfa8d637ff70\",\"refund_fee\":\"0.01\",\"send_back_fee\":\"0.00\",\"trade_no\":\"2018083021001004130500297311\"},\"sign\":\"Nr6WroDGtVfWVCvqSSY7Z2SPtV68UbN9eII9GSMIZ3D4xlMRd+NoEUPl8EB9h3z2T8rR7fUrjAAjfIfC5qamaW6LW9tGXI4d8GprgU0YGx+53ZqyXJIaz3LeSJ6+U7NsC3h62/jOmgow6qAqca/XHkjHXmDTeERC+D6nqJLY28E5EKbVZK2IvupCo4sJLih8nI6BS0H5IjVIsRztAjgosrqCHic32JUel4/uyouBfRGPp5pp+3fzbxdJ1yMbUeKjuipNFS9Bhdvdt3ngTJoOAF+o7vQn7DIsJZQn5zNNP3BCEeXZIiXEfF/yha2HBlAM/ush5yZBpjMhDLXYRGuJUQ==\"}\n    }\n\n    /**\n     * 微信异步通知\n     * @param notifyData\n     */\n    @RequestMapping(\"/notify\")\n    public ModelAndView notify(@RequestBody String notifyData) {\n        payService.notify(notifyData);\n        //返回给微信处理结果\n        return new ModelAndView(\"success\");\n    }\n\n    @RequestMapping(\"/alinotify\")\n    public void alinotify(HttpServletRequest request, HttpServletResponse response) {\n        //获取支付宝POST过来反馈信息\n        Map<String,String> params = new HashMap<String,String>();\n        Map requestParams = request.getParameterMap();\n        for (Iterator iter = requestParams.keySet().iterator(); iter.hasNext();) {\n            String name = (String) iter.next();\n            String[] values = (String[]) requestParams.get(name);\n            String valueStr = \"\";\n            for (int i = 0; i < values.length; i++) {\n                valueStr = (i == values.length - 1) ? valueStr + values[i]\n                        : valueStr + values[i] + \",\";\n            }\n            //乱码解决，这段代码在出现乱码时使用。如果mysign和sign不相等也可以使用这段代码转化\n            //valueStr = new String(valueStr.getBytes(\"ISO-8859-1\"), \"gbk\");\n            params.put(name, valueStr);\n        }\n        //获取支付宝的通知返回参数，可参考技术文档中页面跳转同步通知参数列表(以下仅供参考)//\n        //商户订单号\n        String out_trade_no = \"\";\n        String trade_no = \"\";\n        String trade_status = \"\";\n\n        try {\n            out_trade_no = new String(request.getParameter(\"out_trade_no\").getBytes(\"ISO-8859-1\"),\"UTF-8\");\n            //支付宝交易号\n            log.info(\"alinotify out_trade_no = {}\", out_trade_no);\n\n            trade_no = new String(request.getParameter(\"trade_no\").getBytes(\"ISO-8859-1\"),\"UTF-8\");\n            log.info(\"alinotify trade_no = {}\", trade_no);\n\n            //交易状态\n            trade_status = new String(request.getParameter(\"trade_status\").getBytes(\"ISO-8859-1\"),\"UTF-8\");\n\n        } catch (UnsupportedEncodingException e) {\n            e.printStackTrace();\n        }\n\n        //获取支付宝的通知返回参数，可参考技术文档中页面跳转同步通知参数列表(以上仅供参考)//\n        //计算得出通知验证结果\n        //boolean AlipaySignature.rsaCheckV1(Map<String, String> params, String publicKey, String charset, String sign_type)\n        boolean verify_result = false;\n        try {\n            verify_result = AlipaySignature.rsaCheckV1(params, AlipayConfig.ALIPAY_PUBLIC_KEY, AlipayConfig.CHARSET, \"RSA2\");\n        } catch (AlipayApiException e) {\n            e.printStackTrace();\n        }\n\n        if(verify_result){//验证成功\n            //////////////////////////////////////////////////////////////////////////////////////////\n            //请在这里加上商户的业务逻辑程序代码\n\n            //——请根据您的业务逻辑来编写程序（以下代码仅作参考）——\n\n            if(trade_status.equals(\"TRADE_FINISHED\")){\n                //判断该笔订单是否在商户网站中已经做过处理\n                //如果没有做过处理，根据订单号（out_trade_no）在商户网站的订单系统中查到该笔订单的详细，并执行商户的业务程序\n                //请务必判断请求时的total_fee、seller_id与通知时获取的total_fee、seller_id为一致的\n                //如果有做过处理，不执行商户的业务程序\n\n                //注意：\n                //如果签约的是可退款协议，退款日期超过可退款期限后（如三个月可退款），支付宝系统发送该交易状态通知\n                //如果没有签约可退款协议，那么付款完成后，支付宝系统发送该交易状态通知。\n            } else if (trade_status.equals(\"TRADE_SUCCESS\")){\n                //判断该笔订单是否在商户网站中已经做过处理\n                //如果没有做过处理，根据订单号（out_trade_no）在商户网站的订单系统中查到该笔订单的详细，并执行商户的业务程序\n                //请务必判断请求时的total_fee、seller_id与通知时获取的total_fee、seller_id为一致的\n                //如果有做过处理，不执行商户的业务程序\n\n                //注意：\n                //如果签约的是可退款协议，那么付款完成后，支付宝系统发送该交易状态通知。\n            }\n\n            //——请根据您的业务逻辑来编写程序（以上代码仅作参考）——\n//            out.clear();\n            try {\n                response.getWriter().print(\"success\");\t//请不要修改或删除\n            } catch (IOException e) {\n                e.printStackTrace();\n            }\n\n            //////////////////////////////////////////////////////////////////////////////////////////\n        }else{//验证失败\n            try {\n                response.getWriter().print(\"fail\");\n            } catch (IOException e) {\n                e.printStackTrace();\n            }\n        }\n    }\n\n    @RequestMapping(\"/test\")\n    public ModelAndView test() {\n        return new ModelAndView(\"success\");\n    }\n\n    @RequestMapping(\"/alipay\")\n    public void alipay(HttpServletResponse response) {\n        // 商户订单号，商户网站订单系统中唯一订单号，必填\n        String out_trade_no = UUID.randomUUID().toString();\n        // 订单名称，必填\n        String subject = \"test\" + UUID.randomUUID().toString();\n        System.out.println(subject);\n        // 付款金额，必填\n        String total_amount= \"0.01\";\n        // 商品描述，可空\n        String body = \"test desc\";\n        // 超时时间 可空\n        String timeout_express=\"\";\n        // 销售产品码 必填\n        String product_code=\"QUICK_WAP_WAY\";\n        /**********************/\n        // SDK 公共请求类，包含公共请求参数，以及封装了签名与验签，开发者无需关注签名与验签\n        //调用RSA签名方式\n        AlipayClient client = new DefaultAlipayClient(AlipayConfig.URL, AlipayConfig.APPID, AlipayConfig.RSA_PRIVATE_KEY, AlipayConfig.FORMAT, AlipayConfig.CHARSET, AlipayConfig.ALIPAY_PUBLIC_KEY,AlipayConfig.SIGNTYPE);\n        AlipayTradeWapPayRequest alipay_request=new AlipayTradeWapPayRequest();\n\n        // 封装请求支付信息\n        AlipayTradeWapPayModel model=new AlipayTradeWapPayModel();\n        model.setOutTradeNo(out_trade_no);\n        model.setSubject(subject);\n        model.setTotalAmount(total_amount);\n        model.setBody(body);\n        model.setTimeoutExpress(timeout_express);\n        model.setProductCode(product_code);\n        alipay_request.setBizModel(model);\n        // 设置异步通知地址\n        alipay_request.setNotifyUrl(AlipayConfig.notify_url);\n        // 设置同步地址\n        alipay_request.setReturnUrl(AlipayConfig.return_url);\n\n        // form表单生产\n        String form = \"\";\n        try {\n            // 调用SDK生成表单\n            form = client.pageExecute(alipay_request).getBody();\n            response.setContentType(\"text/html;charset=\" + AlipayConfig.CHARSET);\n            response.getWriter().write(form);//直接将完整的表单html输出到页面\n            response.getWriter().flush();\n            response.getWriter().close();\n        } catch (AlipayApiException e) {\n            // TODO Auto-generated catch block\n            e.printStackTrace();\n            log.error(\"Alipay ApiException>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>\", e);\n        } catch (IOException e) {\n            e.printStackTrace();\n            log.error(\"Alipay IOException>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>\", e);\n        }\n    }\n}\n"
  },
  {
    "path": "src/main/java/io/sdb/controller/ProductCategoryController.java",
    "content": "/**\n * Copyright 2018\n * <p>\n * Licensed under the Apache License, Version 2.0 (the \"License\"); you may not\n * use this file except in compliance with the License. You may obtain a copy of\n * the License at\n * <p>\n * http://www.apache.org/licenses/LICENSE-2.0\n * <p>\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS, WITHOUT\n * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the\n * License for the specific language governing permissions and limitations under\n * the License.\n */\n\npackage io.sdb.controller;\n\nimport io.sdb.common.utils.R;\nimport io.sdb.common.utils.TreeBuilder;\nimport io.sdb.model.ProductCategory;\nimport io.sdb.common.annotation.Login;\nimport io.sdb.service.ProductCategoryService;\nimport io.sdb.vo.ProductCategoryVO;\nimport org.springframework.beans.factory.annotation.Autowired;\nimport org.springframework.stereotype.Controller;\nimport org.springframework.web.bind.annotation.GetMapping;\nimport org.springframework.web.bind.annotation.RequestMapping;\nimport org.springframework.web.bind.annotation.ResponseBody;\n\nimport java.util.List;\nimport java.util.stream.Collectors;\n\n@Controller\n@RequestMapping(\"/wechat/productCategory\")\npublic class ProductCategoryController {\n\t@Autowired\n\tprivate ProductCategoryService productCategoryService;\n\n\t@ResponseBody\n\t@Login\n\t@GetMapping(\"/tree\")\n\tpublic R tree(){\n\t\tList<ProductCategory> productCategoryList = productCategoryService.findAll();\n\n\t\tList<ProductCategoryVO> productCategoryVOList = productCategoryList.stream().map(item -> {\n\t\t\tProductCategoryVO productCategoryVO = new ProductCategoryVO(item);\n\t\t\treturn productCategoryVO;\n\t\t}).collect(Collectors.toList());\n\t\tList<ProductCategoryVO> productCategoryVOTree = new TreeBuilder().buildTree(productCategoryVOList);\n\n\t\treturn R.ok().put(\"productCategroyTree\", productCategoryVOTree);\n\t}\n\n\t/**\n\t * 列表\n\t */\n\t@ResponseBody\n\t@Login\n\t@GetMapping(\"/list\")\n\tpublic R list(){\n\t\tList<ProductCategory> productCategoryList = productCategoryService.findAll();\n\t\treturn R.ok().put(\"productCategoryList\", productCategoryList);\n\t}\n}"
  },
  {
    "path": "src/main/java/io/sdb/controller/ProductController.java",
    "content": "/**\n * Copyright 2018\n * <p>\n * Licensed under the Apache License, Version 2.0 (the \"License\"); you may not\n * use this file except in compliance with the License. You may obtain a copy of\n * the License at\n * <p>\n * http://www.apache.org/licenses/LICENSE-2.0\n * <p>\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS, WITHOUT\n * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the\n * License for the specific language governing permissions and limitations under\n * the License.\n */\n\npackage io.sdb.controller;\n\nimport io.sdb.common.entity.Filter;\nimport io.sdb.common.utils.R;\nimport io.sdb.dto.ProductDTO;\nimport io.sdb.model.Product;\nimport io.sdb.model.Specification;\nimport io.sdb.service.ProductService;\nimport io.sdb.service.SpecificationService;\nimport io.sdb.vo.ProductVO;\nimport io.sdb.vo.SpecificationVO;\nimport org.springframework.beans.BeanUtils;\nimport org.springframework.beans.factory.annotation.Autowired;\nimport org.springframework.stereotype.Controller;\nimport org.springframework.web.bind.annotation.GetMapping;\nimport org.springframework.web.bind.annotation.PathVariable;\nimport org.springframework.web.bind.annotation.RequestMapping;\nimport org.springframework.web.bind.annotation.ResponseBody;\n\nimport java.util.Arrays;\nimport java.util.List;\nimport java.util.stream.Collectors;\n\n@Controller\n@RequestMapping(\"/wechat/product\")\npublic class ProductController {\n\t@Autowired\n\tprivate ProductService productService;\n\n\t/**\n\t * 列表\n\t */\n\t@ResponseBody\n\t@GetMapping(\"/listByGoodId/{goodId}\")\n\tpublic R listByGoodId(@PathVariable String goodId){\n\t\tProduct product = new Product();\n\t\tproduct.setGoodsSn(goodId);\n\t\tList<Product> productList = productService.findByModel(product);\n\t\treturn R.ok().put(\"productList\", productList);\n\t}\n\n\t/**\n\t * 列表\n\t */\n\t@ResponseBody\n\t@GetMapping(\"/listByProductIds/{productIds}\")\n\tpublic R listByProductIds(@PathVariable String productIds){\n        String[] productIdArr = productIds.split(\",\");\n//        List<String> pruductIdList = Arrays.asList(productIdArr);\n        Filter filter = new Filter();\n        filter.setOperator(Filter.Operator.in);\n        filter.setProperty(\"sn\");\n        filter.setValue(productIdArr);\n        List<Product> productList = productService.findByFilter(filter);\n\t\treturn R.ok().put(\"productList\", productList);\n\t}\n\n\t/**\n\t * 列表\n\t */\n\t@ResponseBody\n\t@GetMapping(\"/listDetailByProductIds/{productIds}\")\n\tpublic R listDetailByProductIds(@PathVariable String productIds){\n        List<ProductDTO> productList = productService.listDetailByProductIds(productIds);\n\n        List<ProductVO> productVOList = productList.stream().map(item -> {\n            ProductVO productVO = new ProductVO();\n            BeanUtils.copyProperties(item, productVO);\n            return productVO;\n        }).collect(Collectors.toList());\n\n\t\treturn R.ok().put(\"productList\", productVOList);\n\t}\n}"
  },
  {
    "path": "src/main/java/io/sdb/controller/ScheduleJobController.java",
    "content": "/**\n * Copyright 2018\n * <p>\n * Licensed under the Apache License, Version 2.0 (the \"License\"); you may not\n * use this file except in compliance with the License. You may obtain a copy of\n * the License at\n * <p>\n * http://www.apache.org/licenses/LICENSE-2.0\n * <p>\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS, WITHOUT\n * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the\n * License for the specific language governing permissions and limitations under\n * the License.\n */\n\npackage io.sdb.controller;\n\nimport io.sdb.common.annotation.SysLog;\nimport io.sdb.common.utils.PageUtils;\nimport io.sdb.common.utils.R;\nimport io.sdb.common.validator.ValidatorUtils;\nimport io.sdb.model.ScheduleJob;\nimport io.sdb.service.ScheduleJobService;\nimport org.apache.shiro.authz.annotation.RequiresPermissions;\nimport org.springframework.beans.factory.annotation.Autowired;\nimport org.springframework.web.bind.annotation.*;\n\nimport java.util.Map;\n\n/**\n * 定时任务\n *\n * @author Mark sunlightcs@gmail.com\n * @since 1.2.0 2016-11-28\n */\n@RestController\n@RequestMapping(\"/sys/schedule\")\npublic class ScheduleJobController {\n\t@Autowired\n\tprivate ScheduleJobService scheduleJobService;\n\t\n\t/**\n\t * 定时任务列表\n\t */\n\t@GetMapping(\"/list\")\n\t@RequiresPermissions(\"sys:schedule:list\")\n\tpublic R list(@RequestParam Map<String, Object> params){\n\t\tPageUtils page = scheduleJobService.queryPage(params);\n\n\t\treturn R.ok().put(\"page\", page);\n\t}\n\t\n\t/**\n\t * 定时任务信息\n\t */\n\t@GetMapping(\"/info/{jobId}\")\n\t@RequiresPermissions(\"sys:schedule:info\")\n\tpublic R info(@PathVariable(\"jobId\") Long jobId){\n\t\tScheduleJob schedule = scheduleJobService.findById(jobId);\n\t\t\n\t\treturn R.ok().put(\"schedule\", schedule);\n\t}\n\t\n\t/**\n\t * 保存定时任务\n\t */\n\t@SysLog(\"保存定时任务\")\n\t@PostMapping(\"/save\")\n\t@RequiresPermissions(\"sys:schedule:save\")\n\tpublic R save(@RequestBody ScheduleJob scheduleJob){\n\t\tValidatorUtils.validateEntity(scheduleJob);\n\n\t\tscheduleJobService.save(scheduleJob);\n\t\t\n\t\treturn R.ok();\n\t}\n\t\n\t/**\n\t * 修改定时任务\n\t */\n\t@SysLog(\"修改定时任务\")\n\t@PostMapping(\"/update\")\n\t@RequiresPermissions(\"sys:schedule:update\")\n\tpublic R update(@RequestBody ScheduleJob scheduleJob){\n\t\tValidatorUtils.validateEntity(scheduleJob);\n\t\t\t\t\n\t\tscheduleJobService.update(scheduleJob);\n\t\t\n\t\treturn R.ok();\n\t}\n\t\n\t/**\n\t * 删除定时任务\n\t */\n\t@SysLog(\"删除定时任务\")\n\t@PostMapping(\"/delete\")\n\t@RequiresPermissions(\"sys:schedule:delete\")\n\tpublic R delete(@RequestBody Long[] jobIds){\n\t\tscheduleJobService.deleteBatch(jobIds);\n\t\t\n\t\treturn R.ok();\n\t}\n\t\n\t/**\n\t * 立即执行任务\n\t */\n\t@SysLog(\"立即执行任务\")\n\t@PostMapping(\"/run\")\n\t@RequiresPermissions(\"sys:schedule:run\")\n\tpublic R run(@RequestBody Long[] jobIds){\n\t\tscheduleJobService.run(jobIds);\n\t\t\n\t\treturn R.ok();\n\t}\n\t\n\t/**\n\t * 暂停定时任务\n\t */\n\t@SysLog(\"暂停定时任务\")\n\t@PostMapping(\"/pause\")\n\t@RequiresPermissions(\"sys:schedule:pause\")\n\tpublic R pause(@RequestBody Long[] jobIds){\n\t\tscheduleJobService.pause(jobIds);\n\t\t\n\t\treturn R.ok();\n\t}\n\t\n\t/**\n\t * 恢复定时任务\n\t */\n\t@SysLog(\"恢复定时任务\")\n\t@PostMapping(\"/resume\")\n\t@RequiresPermissions(\"sys:schedule:resume\")\n\tpublic R resume(@RequestBody Long[] jobIds){\n\t\tscheduleJobService.resume(jobIds);\n\t\t\n\t\treturn R.ok();\n\t}\n\n}\n"
  },
  {
    "path": "src/main/java/io/sdb/controller/ScheduleJobLogController.java",
    "content": "/**\n * Copyright 2018\n * <p>\n * Licensed under the Apache License, Version 2.0 (the \"License\"); you may not\n * use this file except in compliance with the License. You may obtain a copy of\n * the License at\n * <p>\n * http://www.apache.org/licenses/LICENSE-2.0\n * <p>\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS, WITHOUT\n * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the\n * License for the specific language governing permissions and limitations under\n * the License.\n */\n\npackage io.sdb.controller;\n\nimport io.sdb.common.utils.PageUtils;\nimport io.sdb.common.utils.R;\nimport io.sdb.model.ScheduleJobLog;\nimport io.sdb.service.ScheduleJobLogService;\nimport org.apache.shiro.authz.annotation.RequiresPermissions;\nimport org.springframework.beans.factory.annotation.Autowired;\nimport org.springframework.web.bind.annotation.*;\n\nimport java.util.Map;\n\n/**\n * 定时任务日志\n *\n * @author Mark sunlightcs@gmail.com\n * @since 1.2.0 2016-11-28\n */\n@RestController\n@RequestMapping(\"/sys/scheduleLog\")\npublic class ScheduleJobLogController {\n\t@Autowired\n\tprivate ScheduleJobLogService scheduleJobLogService;\n\t\n\t/**\n\t * 定时任务日志列表\n\t */\n\t@GetMapping(\"/list\")\n\t@RequiresPermissions(\"sys:schedule:log\")\n\tpublic R list(@RequestParam Map<String, Object> params){\n\t\tPageUtils page = scheduleJobLogService.queryPage(params);\n\t\t\n\t\treturn R.ok().put(\"page\", page);\n\t}\n\t\n\t/**\n\t * 定时任务日志信息\n\t */\n\t@GetMapping(\"/info/{logId}\")\n\tpublic R info(@PathVariable(\"logId\") Long logId){\n\t\tScheduleJobLog log = scheduleJobLogService.findById(logId);\n\t\t\n\t\treturn R.ok().put(\"log\", log);\n\t}\n}\n"
  },
  {
    "path": "src/main/java/io/sdb/controller/SpecificationController.java",
    "content": "/**\n * Copyright 2018\n * <p>\n * Licensed under the Apache License, Version 2.0 (the \"License\"); you may not\n * use this file except in compliance with the License. You may obtain a copy of\n * the License at\n * <p>\n * http://www.apache.org/licenses/LICENSE-2.0\n * <p>\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS, WITHOUT\n * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the\n * License for the specific language governing permissions and limitations under\n * the License.\n */\n\npackage io.sdb.controller;\n\nimport io.sdb.common.utils.R;\nimport io.sdb.common.utils.TreeBuilder;\nimport io.sdb.model.Specification;\nimport io.sdb.service.SpecificationService;\nimport io.sdb.vo.SpecificationVO;\nimport org.springframework.beans.factory.annotation.Autowired;\nimport org.springframework.stereotype.Controller;\nimport org.springframework.web.bind.annotation.GetMapping;\nimport org.springframework.web.bind.annotation.RequestMapping;\nimport org.springframework.web.bind.annotation.ResponseBody;\n\nimport java.util.List;\nimport java.util.stream.Collectors;\n\n@Controller\n@RequestMapping(\"/wechat/specification\")\npublic class SpecificationController {\n\t@Autowired\n\tprivate SpecificationService specificationService;\n\n\t/**\n\t * 列表\n\t */\n\t@ResponseBody\n\t@GetMapping(\"/list\")\n\tpublic R list(){\n\t\tList<Specification> specificationList = specificationService.findAll();\n\n\t\tList<SpecificationVO> specificationVOList = specificationList.stream().map(item -> {\n\t\t\tSpecificationVO specificationVO = new SpecificationVO(item);\n\t\t\treturn specificationVO;\n\t\t}).collect(Collectors.toList());\n\n\t\treturn R.ok().put(\"specificationList\", specificationVOList);\n\t}\n}"
  },
  {
    "path": "src/main/java/io/sdb/controller/SysCampaignController.java",
    "content": "package io.sdb.controller;\n\nimport io.sdb.common.utils.PageUtils;\nimport io.sdb.common.utils.R;\nimport io.sdb.service.CampaignService;\nimport io.sdb.model.Campaign;\nimport org.springframework.beans.factory.annotation.Autowired;\nimport org.springframework.stereotype.Controller;\nimport org.springframework.web.bind.annotation.*;\n\nimport java.util.Map;\n\n@Controller\n@RequestMapping(\"/sys/campaign\")\npublic class SysCampaignController {\n\n\t@Autowired\n\tprivate CampaignService campaignService;\n\n\t/**\n\t * 列表\n\t */\n\t@ResponseBody\n\t@GetMapping(\"/list\")\n\tpublic R list(@RequestParam Map<String, Object> params){\n\t\tPageUtils page = campaignService.queryPage(params);\n\t\treturn R.ok().put(\"page\", page);\n\t}\n\n\t/**\n\t * 更新\n\t */\n\t@ResponseBody\n\t@PostMapping(\"/update\")\n\tpublic R update(@RequestBody Campaign campaign) {\n\t\tcampaign.update();\n\t\treturn R.ok();\n\t}\n\n\t/**\n\t * 新增\n\t */\n\t@ResponseBody\n\t@PostMapping(\"/save\")\n\tpublic R save(@RequestBody Campaign campaign) {\n\t\tcampaign.save();\n\t\treturn R.ok();\n\t}\n\n\t/**\n\t * 删除\n\t */\n\t@ResponseBody\n\t@PostMapping(\"/delete\")\n\tpublic R delete(@RequestBody Campaign campaign) {\n\t\tcampaign.delete();\n\t\treturn R.ok();\n\t}\n\n}"
  },
  {
    "path": "src/main/java/io/sdb/controller/SysConfigController.java",
    "content": "/**\n * Copyright 2018\n * <p>\n * Licensed under the Apache License, Version 2.0 (the \"License\"); you may not\n * use this file except in compliance with the License. You may obtain a copy of\n * the License at\n * <p>\n * http://www.apache.org/licenses/LICENSE-2.0\n * <p>\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS, WITHOUT\n * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the\n * License for the specific language governing permissions and limitations under\n * the License.\n */\n\npackage io.sdb.controller;\n\n\nimport io.sdb.common.annotation.SysLog;\nimport io.sdb.common.utils.PageUtils;\nimport io.sdb.common.utils.R;\nimport io.sdb.common.validator.ValidatorUtils;\nimport io.sdb.model.SysConfig;\nimport io.sdb.service.SysConfigService;\nimport org.apache.shiro.authz.annotation.RequiresPermissions;\nimport org.springframework.beans.factory.annotation.Autowired;\nimport org.springframework.web.bind.annotation.*;\n\nimport java.util.Map;\n\n/**\n * 系统配置信息\n * \n * @author chenshun\n * @email sunlightcs@gmail.com\n * @date 2016年12月4日 下午6:55:53\n */\n@RestController\n@RequestMapping(\"/sys/config\")\npublic class SysConfigController extends AbstractController {\n\t@Autowired\n\tprivate SysConfigService sysConfigService;\n\t\n\t/**\n\t * 所有配置列表\n\t */\n\t@GetMapping(\"/list\")\n\t@RequiresPermissions(\"sys:config:list\")\n\tpublic R list(@RequestParam Map<String, Object> params){\n\t\tPageUtils page = sysConfigService.queryPage(params);\n\n\t\treturn R.ok().put(\"page\", page);\n\t}\n\t\n\t\n\t/**\n\t * 配置信息\n\t */\n\t@GetMapping(\"/info/{id}\")\n\t@RequiresPermissions(\"sys:config:info\")\n\tpublic R info(@PathVariable(\"id\") Long id){\n\t\tSysConfig config = sysConfigService.findById(id);\n\t\t\n\t\treturn R.ok().put(\"config\", config);\n\t}\n\t\n\t/**\n\t * 保存配置\n\t */\n\t@SysLog(\"保存配置\")\n\t@PostMapping(\"/save\")\n\t@RequiresPermissions(\"sys:config:save\")\n\tpublic R save(@RequestBody SysConfig config){\n\t\tValidatorUtils.validateEntity(config);\n\n\t\tsysConfigService.save(config);\n\t\t\n\t\treturn R.ok();\n\t}\n\t\n\t/**\n\t * 修改配置\n\t */\n\t@SysLog(\"修改配置\")\n\t@PostMapping(\"/update\")\n\t@RequiresPermissions(\"sys:config:update\")\n\tpublic R update(@RequestBody SysConfig config){\n\t\tValidatorUtils.validateEntity(config);\n\t\t\n\t\tsysConfigService.update(config);\n\t\t\n\t\treturn R.ok();\n\t}\n\t\n\t/**\n\t * 删除配置\n\t */\n\t@SysLog(\"删除配置\")\n\t@PostMapping(\"/delete\")\n\t@RequiresPermissions(\"sys:config:delete\")\n\tpublic R delete(@RequestBody Long[] ids){\n\t\tsysConfigService.deleteBatch(ids);\n\t\t\n\t\treturn R.ok();\n\t}\n\n}\n"
  },
  {
    "path": "src/main/java/io/sdb/controller/SysDeliveryCorpController.java",
    "content": "/**\n * Copyright 2018\n * <p>\n * Licensed under the Apache License, Version 2.0 (the \"License\"); you may not\n * use this file except in compliance with the License. You may obtain a copy of\n * the License at\n * <p>\n * http://www.apache.org/licenses/LICENSE-2.0\n * <p>\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS, WITHOUT\n * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the\n * License for the specific language governing permissions and limitations under\n * the License.\n */\n\npackage io.sdb.controller;\n\nimport io.sdb.common.utils.R;\nimport io.sdb.model.DeliveryCorp;\nimport io.sdb.service.DeliveryCorpService;\nimport io.sdb.vo.DeliveryCorpVO;\nimport org.springframework.beans.factory.annotation.Autowired;\nimport org.springframework.stereotype.Controller;\nimport org.springframework.web.bind.annotation.*;\n\nimport java.util.List;\nimport java.util.stream.Collectors;\n\n@Controller\n@RequestMapping(\"/sys/deliveryCorp\")\npublic class SysDeliveryCorpController {\n\n\t@Autowired\n\tDeliveryCorpService deliveryCorpService;\n\t/**\n\t * 列表\n\t */\n\t@ResponseBody\n\t@GetMapping(\"/list\")\n\tpublic R list(){\n\t\tList<DeliveryCorp> deliveryCorpList = deliveryCorpService.findAll();\n\t\tList<DeliveryCorpVO> deliveryCorpVOList = deliveryCorpList.stream().map(item -> {\n\t\t\treturn convert(item);\n\t\t}).collect(Collectors.toList());\n\t\treturn R.ok().put(\"deliveryCorpVOList\", deliveryCorpVOList);\n\t}\n\n\tprivate DeliveryCorpVO convert(DeliveryCorp deliveryCorp) {\n\t\tDeliveryCorpVO deliveryCorpVO = new DeliveryCorpVO();\n\t\tdeliveryCorpVO.setValue(deliveryCorp.getCode());\n\t\tdeliveryCorpVO.setLabel(deliveryCorp.getName());\n\t\treturn deliveryCorpVO;\n\t}\n}\n"
  },
  {
    "path": "src/main/java/io/sdb/controller/SysFavoriteGoodsController.java",
    "content": "package io.sdb.controller;\n\nimport io.sdb.common.utils.PageUtils;\nimport io.sdb.common.utils.R;\nimport io.sdb.service.FavoriteGoodsService;\nimport io.sdb.model.FavoriteGoods;\nimport org.springframework.beans.factory.annotation.Autowired;\nimport org.springframework.stereotype.Controller;\nimport org.springframework.web.bind.annotation.*;\n\nimport java.util.Map;\n\n@Controller\n@RequestMapping(\"/sys/favoriteGoods\")\npublic class SysFavoriteGoodsController {\n\n\t@Autowired\n\tprivate FavoriteGoodsService favoriteGoodsService;\n\n\t/**\n\t * 列表\n\t */\n\t@ResponseBody\n\t@GetMapping(\"/list\")\n\tpublic R list(@RequestParam Map<String, Object> params){\n\t\tPageUtils page = favoriteGoodsService.queryPage(params);\n\t\treturn R.ok().put(\"page\", page);\n\t}\n\n\t/**\n\t * 更新\n\t */\n\t@ResponseBody\n\t@PostMapping(\"/update\")\n\tpublic R update(@RequestBody FavoriteGoods favoriteGoods) {\n\t\tfavoriteGoods.update();\n\t\treturn R.ok();\n\t}\n\n\t/**\n\t * 新增\n\t */\n\t@ResponseBody\n\t@PostMapping(\"/save\")\n\tpublic R save(@RequestBody FavoriteGoods favoriteGoods) {\n\t\tfavoriteGoods.save();\n\t\treturn R.ok();\n\t}\n\n\t/**\n\t * 删除\n\t */\n\t@ResponseBody\n\t@PostMapping(\"/delete\")\n\tpublic R delete(@RequestBody FavoriteGoods favoriteGoods) {\n\t\tfavoriteGoods.delete();\n\t\treturn R.ok();\n\t}\n\n}"
  },
  {
    "path": "src/main/java/io/sdb/controller/SysGoodsController.java",
    "content": "/**\n * Copyright 2018\n * <p>\n * Licensed under the Apache License, Version 2.0 (the \"License\"); you may not\n * use this file except in compliance with the License. You may obtain a copy of\n * the License at\n * <p>\n * http://www.apache.org/licenses/LICENSE-2.0\n * <p>\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS, WITHOUT\n * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the\n * License for the specific language governing permissions and limitations under\n * the License.\n */\n\npackage io.sdb.controller;\n\nimport io.sdb.model.Goods;\nimport io.sdb.model.Product;\nimport io.sdb.model.ProductCategory;\nimport io.sdb.form.GoodsForm;\nimport io.sdb.common.utils.PageUtils;\nimport io.sdb.common.utils.R;\nimport io.sdb.service.GoodsService;\nimport io.sdb.service.ProductCategoryService;\nimport io.sdb.service.ProductService;\nimport org.springframework.beans.factory.annotation.Autowired;\nimport org.springframework.stereotype.Controller;\nimport org.springframework.web.bind.annotation.*;\n\nimport java.util.List;\nimport java.util.Map;\n\n@Controller\n@RequestMapping(\"/sys/goods\")\npublic class SysGoodsController {\n\t@Autowired\n\tprivate GoodsService goodsService;\n\t@Autowired\n\tprivate ProductService productService;\n\t@Autowired\n\tprivate ProductCategoryService productCategoryService;\n\t\n\t/**\n\t * 列表\n\t */\n\t@ResponseBody\n\t@GetMapping(\"/list\")\n\tpublic R list(@RequestParam Map<String, Object> params){\n\t\tPageUtils page = goodsService.queryPage(params);\n\t\treturn R.ok().put(\"page\", page);\n\t}\n\n\t/**\n\t * 新增\n\t */\n\t@ResponseBody\n\t@PostMapping(\"/add\")\n\tpublic R add(@RequestBody GoodsForm goodsForm){\n\t\tgoodsService.saveUpdateGoods(goodsForm.getGoods(), goodsForm.getParaList(), goodsForm.getSpecList());\n\t\treturn R.ok();\n\t}\n\n\t/**\n\t * 信息\n\t */\n\t@ResponseBody\n\t@GetMapping(\"/info/{goodsId}\")\n\tpublic R info(@PathVariable String goodsId){\n\t\tGoods goods = goodsService.findById(goodsId);\n\t\tProduct query = new Product();\n\t\tquery.setGoodsSn(goodsId);\n\t\tList<Product> productList = productService.findByModel(query);\n\t\tgoods.setProductList(productList);\n\n\t\tProductCategory productCategory = productCategoryService.findById(goods.getProductCategoryId());\n\t\treturn R.ok().put(\"goodsInfo\", goods).put(\"treePath\", productCategory.getTreePath());\n\t}\n\n\t@ResponseBody\n\t@PostMapping(\"batchShelf\")\n\tpublic R batchShelf(@RequestBody String[] ids){\n\t\treturn goodsService.batchShelf(ids);\n\t}\n\n\t@ResponseBody\n\t@PostMapping(\"batchObtained\")\n\tpublic R batchObtained(@RequestBody String[] ids){\n\t\treturn goodsService.batchObtained(ids);\n\t}\n}\n"
  },
  {
    "path": "src/main/java/io/sdb/controller/SysGrouponController.java",
    "content": "package io.sdb.controller;\n\nimport io.sdb.common.utils.PageUtils;\nimport io.sdb.common.utils.R;\nimport io.sdb.service.GrouponService;\nimport io.sdb.model.Groupon;\nimport org.springframework.beans.factory.annotation.Autowired;\nimport org.springframework.stereotype.Controller;\nimport org.springframework.web.bind.annotation.*;\n\nimport java.util.Map;\n\n@Controller\n@RequestMapping(\"/sys/groupon\")\npublic class SysGrouponController {\n\n\t@Autowired\n\tprivate GrouponService grouponService;\n\n\t/**\n\t * 列表\n\t */\n\t@ResponseBody\n\t@GetMapping(\"/list\")\n\tpublic R list(@RequestParam Map<String, Object> params){\n\t\tPageUtils page = grouponService.queryPage(params);\n\t\treturn R.ok().put(\"page\", page);\n\t}\n\n\t/**\n\t * 详情\n\t */\n\t@ResponseBody\n\t@GetMapping(\"/info/{id}\")\n\tpublic R info(@PathVariable Object id){\n        Groupon groupon = grouponService.findById(id);\n\t\treturn R.ok().put(\"groupon\", groupon);\n\t}\n\n\t/**\n\t * 更新\n\t */\n\t@ResponseBody\n\t@PostMapping(\"/update\")\n\tpublic R update(@RequestBody Groupon groupon) {\n\t\tgroupon.update();\n\t\treturn R.ok();\n\t}\n\n\t/**\n\t * 新增\n\t */\n\t@ResponseBody\n\t@PostMapping(\"/save\")\n\tpublic R save(@RequestBody Groupon groupon) {\n\t\tgroupon.save();\n\t\treturn R.ok();\n\t}\n\n\t/**\n\t * 删除\n\t */\n\t@ResponseBody\n\t@PostMapping(\"/delete\")\n    public R delete(@RequestBody Object[] ids) {\n        grouponService.deleteBatch(ids);\n        return R.ok();\n    }\n\n}"
  },
  {
    "path": "src/main/java/io/sdb/controller/SysGrouponTeamController.java",
    "content": "package io.sdb.controller;\n\nimport io.sdb.common.utils.PageUtils;\nimport io.sdb.common.utils.R;\nimport io.sdb.service.GrouponTeamService;\nimport io.sdb.model.GrouponTeam;\nimport org.springframework.beans.factory.annotation.Autowired;\nimport org.springframework.stereotype.Controller;\nimport org.springframework.web.bind.annotation.*;\n\nimport java.util.Map;\n\n@Controller\n@RequestMapping(\"/sys/grouponTeam\")\npublic class SysGrouponTeamController {\n\n\t@Autowired\n\tprivate GrouponTeamService grouponTeamService;\n\n\t/**\n\t * 列表\n\t */\n\t@ResponseBody\n\t@GetMapping(\"/list\")\n\tpublic R list(@RequestParam Map<String, Object> params){\n\t\tPageUtils page = grouponTeamService.queryPage(params);\n\t\treturn R.ok().put(\"page\", page);\n\t}\n\n\t/**\n\t * 详情\n\t */\n\t@ResponseBody\n\t@GetMapping(\"/info/{id}\")\n\tpublic R info(@PathVariable Object id){\n        GrouponTeam grouponTeam = grouponTeamService.findById(id);\n\t\treturn R.ok().put(\"grouponTeam\", grouponTeam);\n\t}\n\n\t/**\n\t * 更新\n\t */\n\t@ResponseBody\n\t@PostMapping(\"/update\")\n\tpublic R update(@RequestBody GrouponTeam grouponTeam) {\n\t\tgrouponTeam.update();\n\t\treturn R.ok();\n\t}\n\n\t/**\n\t * 新增\n\t */\n\t@ResponseBody\n\t@PostMapping(\"/save\")\n\tpublic R save(@RequestBody GrouponTeam grouponTeam) {\n\t\tgrouponTeam.save();\n\t\treturn R.ok();\n\t}\n\n\t/**\n\t * 删除\n\t */\n\t@ResponseBody\n\t@PostMapping(\"/delete\")\n    public R delete(@RequestBody Object[] ids) {\n        grouponTeamService.deleteBatch(ids);\n        return R.ok();\n    }\n\n}"
  },
  {
    "path": "src/main/java/io/sdb/controller/SysLogController.java",
    "content": "/**\n * Copyright 2018\n * <p>\n * Licensed under the Apache License, Version 2.0 (the \"License\"); you may not\n * use this file except in compliance with the License. You may obtain a copy of\n * the License at\n * <p>\n * http://www.apache.org/licenses/LICENSE-2.0\n * <p>\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS, WITHOUT\n * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the\n * License for the specific language governing permissions and limitations under\n * the License.\n */\n\npackage io.sdb.controller;\n\nimport io.sdb.common.utils.PageUtils;\nimport io.sdb.common.utils.R;\nimport io.sdb.service.SysLogService;\nimport org.apache.shiro.authz.annotation.RequiresPermissions;\nimport org.springframework.beans.factory.annotation.Autowired;\nimport org.springframework.stereotype.Controller;\nimport org.springframework.web.bind.annotation.GetMapping;\nimport org.springframework.web.bind.annotation.RequestMapping;\nimport org.springframework.web.bind.annotation.RequestParam;\nimport org.springframework.web.bind.annotation.ResponseBody;\n\nimport java.util.Map;\n\n\n/**\n * 系统日志\n * \n * @author chenshun\n * @email sunlightcs@gmail.com\n * @date 2017-03-08 10:40:56\n */\n@Controller\n@RequestMapping(\"/sys/log\")\npublic class SysLogController {\n\t@Autowired\n\tprivate SysLogService sysLogService;\n\t\n\t/**\n\t * 列表\n\t */\n\t@ResponseBody\n\t@GetMapping(\"/list\")\n\t@RequiresPermissions(\"sys:log:list\")\n\tpublic R list(@RequestParam Map<String, Object> params){\n\t\tPageUtils page = sysLogService.queryPage(params);\n\n\t\treturn R.ok().put(\"page\", page);\n\t}\n\t\n}\n"
  },
  {
    "path": "src/main/java/io/sdb/controller/SysLoginController.java",
    "content": "package io.sdb.controller;\n\nimport io.sdb.common.utils.R;\nimport io.sdb.enums.OrderStatusEnum;\nimport io.sdb.model.OrderMaster;\nimport io.sdb.model.SysUser;\nimport io.sdb.service.*;\nimport io.sdb.form.SysLoginForm;\nimport org.apache.commons.io.IOUtils;\nimport org.apache.shiro.crypto.hash.Sha256Hash;\nimport org.springframework.beans.factory.annotation.Autowired;\nimport org.springframework.web.bind.annotation.GetMapping;\nimport org.springframework.web.bind.annotation.PostMapping;\nimport org.springframework.web.bind.annotation.RequestBody;\nimport org.springframework.web.bind.annotation.RestController;\n\nimport javax.imageio.ImageIO;\nimport javax.servlet.ServletException;\nimport javax.servlet.ServletOutputStream;\nimport javax.servlet.http.HttpServletResponse;\nimport java.awt.image.BufferedImage;\nimport java.io.IOException;\nimport java.math.BigDecimal;\nimport java.util.List;\nimport java.util.Map;\n\n/**\n * 登录相关\n * \n * @author chenshun\n * @email sunlightcs@gmail.com\n * @date 2016年11月10日 下午1:15:31\n */\n@RestController\npublic class SysLoginController extends AbstractController {\n\t@Autowired\n\tprivate SysUserService sysUserService;\n\t@Autowired\n\tprivate SysUserTokenService sysUserTokenService;\n\t@Autowired\n\tprivate SysCaptchaService sysCaptchaService;\n\n\t@Autowired\n\tprivate OrderMasterService orderService;\n\n\t@Autowired\n\tprivate UserService userService;\n\n\t/**\n\t * 验证码\n\t */\n\t@GetMapping(\"captcha.jpg\")\n\tpublic void captcha(HttpServletResponse response, String uuid)throws ServletException, IOException {\n\t\tresponse.setHeader(\"Cache-Control\", \"no-store, no-cache\");\n\t\tresponse.setContentType(\"image/jpeg\");\n\n\t\t//获取图片验证码\n\t\tBufferedImage image = sysCaptchaService.getCaptcha(uuid);\n\n\t\tServletOutputStream out = response.getOutputStream();\n\t\tImageIO.write(image, \"jpg\", out);\n\t\tIOUtils.closeQuietly(out);\n\t}\n\n\t/**\n\t * 验证码\n\t */\n\t@GetMapping(\"/home/dash/info\")\n\tpublic void dashInfo(){\n\t\tBigDecimal totalSale = orderService.getTodayTotalSale();\n\t\tInteger totalUsers = userService.getTotalUsers();\n\t\tInteger newUsers = userService.getYestodayNewUsers();\n\t\tList<OrderMaster> orderMasterList = orderService.getTodayOrders();\n\t\tInteger totalOrder = orderMasterList.size();\n\t\tInteger waitingOrder = 0;\n\t\tfor (OrderMaster orderMaster:orderMasterList\n\t\t\t ) {\n\t\t\tif (orderMaster.getOrderStatus() == OrderStatusEnum.NEW.getCode()) {\n\t\t\t\twaitingOrder++;\n\t\t\t}\n\t\t}\n\n\t\tR.ok().put(\"totalSale\", totalSale)\n\t\t\t\t.put(\"newUsers\", newUsers)\n\t\t\t\t.put(\"totalUsers\", totalUsers)\n\t\t\t\t.put(\"waitingOrder\", waitingOrder)\n\t\t\t\t.put(\"totalOrder\", totalOrder);\n\n\t}\n\n\t/**\n\t * 登录\n\t */\n\t@PostMapping(\"/sys/login\")\n\tpublic Map<String, Object> login(@RequestBody SysLoginForm form)throws IOException {\n\t\tboolean captcha = sysCaptchaService.validate(form.getUuid(), form.getCaptcha());\n\t\tif(!captcha){\n\t\t\treturn R.error(\"验证码不正确\");\n\t\t}\n\n\t\t//用户信息\n\t\tSysUser user = sysUserService.queryByUserName(form.getUsername());\n\n\t\t//账号不存在、密码错误\n\t\tif(user == null || !user.getPassword().equals(new Sha256Hash(form.getPassword(), user.getSalt()).toHex())) {\n\t\t\treturn R.error(\"账号或密码不正确\");\n\t\t}\n\n\t\t//账号锁定\n\t\tif(user.getStatus() == 0){\n\t\t\treturn R.error(\"账号已被锁定,请联系管理员\");\n\t\t}\n\n\t\t//生成token，并保存到数据库\n\t\tR r = sysUserTokenService.createToken(user.getUserId());\n\t\treturn r;\n\t}\n\n\n\t/**\n\t * 退出\n\t */\n\t@PostMapping(\"/sys/logout\")\n\tpublic R logout() {\n\t\tsysUserTokenService.logout(getUserId());\n\t\treturn R.ok();\n\t}\n\t\n}\n"
  },
  {
    "path": "src/main/java/io/sdb/controller/SysLogisticsController.java",
    "content": "package io.sdb.controller;\n\nimport com.alibaba.fastjson.JSON;\nimport com.jfinal.kit.JsonKit;\nimport com.jfinal.kit.LogKit;\nimport io.sdb.common.entity.kuaidi100.NoticeRequest;\nimport io.sdb.common.entity.kuaidi100.NoticeResponse;\nimport io.sdb.common.entity.kuaidi100.Result;\nimport io.sdb.model.Logistics;\nimport lombok.extern.slf4j.Slf4j;\nimport org.springframework.web.bind.annotation.GetMapping;\nimport org.springframework.web.bind.annotation.RequestMapping;\nimport org.springframework.web.bind.annotation.RequestParam;\nimport org.springframework.web.bind.annotation.RestController;\n\nimport java.util.Date;\n\n@RestController\n@Slf4j\n@RequestMapping(\"/sys/logistics\")\npublic class SysLogisticsController {\n\n    @RequestMapping(\"notify\")\n    public NoticeResponse kuaidi100Notify(@RequestParam String param){\n        NoticeResponse resp = new NoticeResponse();\n        resp.setResult(false);\n        resp.setReturnCode(\"500\");\n        resp.setMessage(\"保存失败\");\n        try {\n            NoticeRequest nReq = JSON.parseObject(param,\n                    NoticeRequest.class);\n\n            Result result = nReq.getLastResult();\n            // 处理快递结果\n            Logistics logistics = Logistics.dao.findById(result.getNu());\n            resp.setResult(true);\n            resp.setReturnCode(\"200\");\n            resp.setMessage(\"提交成功\");\n            if(logistics != null){\n                logistics.setUpdateDate(new Date());\n                logistics.setOrderState(Integer.parseInt(result.getState()));\n                logistics.setData(JSON.toJSONString(result.getData()));\n                logistics.update();\n                return resp;\n            }else {\n                logistics = new Logistics();\n                logistics.setUpdateDate(new Date());\n                logistics.setOrderState(Integer.parseInt(result.getState()));\n                logistics.setData(JSON.toJSONString(result.getData()));\n                logistics.setTrackingNo(result.getNu());\n                logistics.save();\n                return resp;\n            }\n\n            //response.getWriter().print(JsonKit.toJson(resp)); //这里必须返回，否则认为失败，过30分钟又会重复推送。\n        } catch (Exception e) {\n            e.printStackTrace();\n            log.error(\"kuaidi100Notify 保存失败 error = \", e);\n            resp.setMessage(\"保存失败\");\n            return resp;\n            //response.getWriter().print(JsonKit.toJson(resp));//保存失败，服务端等30分钟会重复推送。\n        }\n\n\n    }\n}\n"
  },
  {
    "path": "src/main/java/io/sdb/controller/SysMenuController.java",
    "content": "/**\n * Copyright 2018\n * <p>\n * Licensed under the Apache License, Version 2.0 (the \"License\"); you may not\n * use this file except in compliance with the License. You may obtain a copy of\n * the License at\n * <p>\n * http://www.apache.org/licenses/LICENSE-2.0\n * <p>\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS, WITHOUT\n * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the\n * License for the specific language governing permissions and limitations under\n * the License.\n */\n\npackage io.sdb.controller;\n\nimport io.sdb.common.annotation.SysLog;\nimport io.sdb.common.exception.RRException;\nimport io.sdb.common.utils.Constant;\nimport io.sdb.common.utils.R;\nimport io.sdb.model.SysMenu;\nimport io.sdb.service.ShiroService;\nimport io.sdb.service.SysMenuService;\nimport org.apache.commons.io.IOUtils;\nimport org.apache.commons.lang.StringUtils;\nimport org.apache.shiro.authz.annotation.RequiresPermissions;\nimport org.springframework.beans.factory.annotation.Autowired;\nimport org.springframework.web.bind.annotation.*;\n\nimport javax.servlet.ServletContext;\nimport javax.servlet.http.HttpServletRequest;\nimport javax.servlet.http.HttpServletResponse;\nimport java.io.FileInputStream;\nimport java.io.IOException;\nimport java.io.InputStream;\nimport java.util.List;\nimport java.util.Set;\n\n/**\n * 系统菜单\n * \n * @author chenshun\n * @email sunlightcs@gmail.com\n * @date 2016年10月27日 下午9:58:15\n */\n@RestController\n@RequestMapping(\"/sys/menu\")\npublic class SysMenuController extends AbstractController {\n\t@Autowired\n\tprivate SysMenuService sysMenuService;\n\t@Autowired\n\tprivate ShiroService shiroService;\n\n\t@RequestMapping(value=\"/media/\", method=RequestMethod.GET)\n\tpublic void getDownload(Long id, HttpServletRequest request, HttpServletResponse response) {\n\n\t\t// Get your file stream from wherever.\n\t\tString fullPath = \"E:/\" + id +\".rmvb\";\n\n\t\tServletContext context = request.getServletContext();\n\n\t\t// get MIME type of the file\n\t\tString mimeType = context.getMimeType(fullPath);\n\t\tif (mimeType == null) {\n\t\t\t// set to binary type if MIME mapping not found\n\t\t\tmimeType = \"application/octet-stream\";\n\t\t\tSystem.out.println(\"context getMimeType is null\");\n\t\t}\n\t\tSystem.out.println(\"MIME type: \" + mimeType);\n\n\t\t// set content attributes for the response\n\t\tresponse.setContentType(mimeType);\n//\t\tresponse.setContentLength((int) downloadFile.length());\n\n\t\t// set headers for the response\n\t\tString headerKey = \"Content-Disposition\";\n\t\tString headerValue = String.format(\"attachment; filename=\\\"%s\\\"\",\n\t\t\t\t\"test\");\n\t\tresponse.setHeader(headerKey, headerValue);\n\t\t// Copy the stream to the response's output stream.\n\t\ttry {\n\t\t\tInputStream myStream = new FileInputStream(fullPath);\n\t\t\tIOUtils.copy(myStream, response.getOutputStream());\n\t\t\tresponse.flushBuffer();\n\t\t} catch (IOException e) {\n\t\t\te.printStackTrace();\n\t\t}\n\t}\n\n\t/**\n\t * 导航菜单\n\t */\n\t@GetMapping(\"/nav\")\n\tpublic R nav(){\n\t\tList<SysMenu> menuList = sysMenuService.getUserMenuList(getUserId());\n\t\tSet<String> permissions = shiroService.getUserPermissions(getUserId());\n\t\treturn R.ok().put(\"menuList\", menuList).put(\"permissions\", permissions);\n\t}\n\t\n\t/**\n\t * 所有菜单列表\n\t */\n\t@GetMapping(\"/list\")\n\t@RequiresPermissions(\"sys:menu:list\")\n\tpublic List<SysMenu> list(){\n\t\tList<SysMenu> menuList = sysMenuService.findAll();\n\t\tfor(SysMenu SysMenu : menuList){\n\t\t\tSysMenu parentMenu = sysMenuService.findById(SysMenu.getParentId());\n\t\t\tif(parentMenu != null){\n\t\t\t\tSysMenu.setParentName(parentMenu.getName());\n\t\t\t}\n\t\t}\n\n\t\treturn menuList;\n\t}\n\t\n\t/**\n\t * 选择菜单(添加、修改菜单)\n\t */\n\t@GetMapping(\"/select\")\n\t@RequiresPermissions(\"sys:menu:select\")\n\tpublic R select(){\n\t\t//查询列表数据\n\t\tList<SysMenu> menuList = sysMenuService.queryNotButtonList();\n\t\t\n\t\t//添加顶级菜单\n\t\tSysMenu root = new SysMenu();\n\t\troot.setMenuId(0L);\n\t\troot.setName(\"一级菜单\");\n\t\troot.setParentId(-1L);\n\t\troot.setOpen(true);\n\t\tmenuList.add(root);\n\t\t\n\t\treturn R.ok().put(\"menuList\", menuList);\n\t}\n\t\n\t/**\n\t * 菜单信息\n\t */\n\t@GetMapping(\"/info/{menuId}\")\n\t@RequiresPermissions(\"sys:menu:info\")\n\tpublic R info(@PathVariable(\"menuId\") Long menuId){\n\t\tSysMenu menu = sysMenuService.findById(menuId);\n\t\treturn R.ok().put(\"menu\", menu);\n\t}\n\t\n\t/**\n\t * 保存\n\t */\n\t@SysLog(\"保存菜单\")\n\t@PostMapping(\"/save\")\n\t@RequiresPermissions(\"sys:menu:save\")\n\tpublic R save(@RequestBody SysMenu menu){\n\t\t//数据校验\n\t\tverifyForm(menu);\n\n\t\tmenu.save();\n\t\t\n\t\treturn R.ok();\n\t}\n\t\n\t/**\n\t * 修改\n\t */\n\t@SysLog(\"修改菜单\")\n\t@PostMapping(\"/update\")\n\t@RequiresPermissions(\"sys:menu:update\")\n\tpublic R update(@RequestBody SysMenu menu){\n\t\t//数据校验\n\t\tverifyForm(menu);\n\t\tmenu.update();\n\t\t\n\t\treturn R.ok();\n\t}\n\t\n\t/**\n\t * 删除\n\t */\n\t@SysLog(\"删除菜单\")\n\t@PostMapping(\"/delete/{menuId}\")\n\t@RequiresPermissions(\"sys:menu:delete\")\n\tpublic R delete(@PathVariable(\"menuId\") long menuId){\n\t\tif(menuId <= 31){\n\t\t\treturn R.error(\"系统菜单，不能删除\");\n\t\t}\n\n\t\t//判断是否有子菜单或按钮\n\t\tList<SysMenu> menuList = sysMenuService.queryListParentId(menuId);\n\t\tif(menuList.size() > 0){\n\t\t\treturn R.error(\"请先删除子菜单或按钮\");\n\t\t}\n\n\t\tsysMenuService.delete(menuId);\n\n\t\treturn R.ok();\n\t}\n\t\n\t/**\n\t * 验证参数是否正确\n\t */\n\tprivate void verifyForm(SysMenu menu){\n\t\tif(StringUtils.isBlank(menu.getName())){\n\t\t\tthrow new RRException(\"菜单名称不能为空\");\n\t\t}\n\t\t\n\t\tif(menu.getParentId() == null){\n\t\t\tthrow new RRException(\"上级菜单不能为空\");\n\t\t}\n\t\t\n\t\t//菜单\n\t\tif(menu.getType() == Constant.MenuType.MENU.getValue()){\n\t\t\tif(StringUtils.isBlank(menu.getUrl())){\n\t\t\t\tthrow new RRException(\"菜单URL不能为空\");\n\t\t\t}\n\t\t}\n\t\t\n\t\t//上级菜单类型\n\t\tint parentType = Constant.MenuType.CATALOG.getValue();\n\t\tif(menu.getParentId() != 0){\n\t\t\tSysMenu parentMenu = sysMenuService.findById(menu.getParentId());\n\t\t\tparentType = parentMenu.getType();\n\t\t}\n\t\t\n\t\t//目录、菜单\n\t\tif(menu.getType() == Constant.MenuType.CATALOG.getValue() ||\n\t\t\t\tmenu.getType() == Constant.MenuType.MENU.getValue()){\n\t\t\tif(parentType != Constant.MenuType.CATALOG.getValue()){\n\t\t\t\tthrow new RRException(\"上级菜单只能为目录类型\");\n\t\t\t}\n\t\t\treturn ;\n\t\t}\n\t\t\n\t\t//按钮\n\t\tif(menu.getType() == Constant.MenuType.BUTTON.getValue()){\n\t\t\tif(parentType != Constant.MenuType.MENU.getValue()){\n\t\t\t\tthrow new RRException(\"上级菜单只能为菜单类型\");\n\t\t\t}\n\t\t\treturn ;\n\t\t}\n\t}\n}\n"
  },
  {
    "path": "src/main/java/io/sdb/controller/SysOrderController.java",
    "content": "/**\n * Copyright 2018\n * <p>\n * Licensed under the Apache License, Version 2.0 (the \"License\"); you may not\n * use this file except in compliance with the License. You may obtain a copy of\n * the License at\n * <p>\n * http://www.apache.org/licenses/LICENSE-2.0\n * <p>\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS, WITHOUT\n * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the\n * License for the specific language governing permissions and limitations under\n * the License.\n */\n\npackage io.sdb.controller;\n\nimport com.jfinal.validate.Validator;\nimport io.sdb.common.exception.RRException;\nimport io.sdb.common.utils.PageUtils;\nimport io.sdb.common.utils.R;\nimport io.sdb.dto.OrderDTO;\nimport io.sdb.enums.OrderStatusEnum;\nimport io.sdb.enums.PayStatusEnum;\nimport io.sdb.enums.ResultEnum;\nimport io.sdb.model.OrderDetail;\nimport io.sdb.model.OrderMaster;\nimport io.sdb.form.SysOrderForm;\nimport io.sdb.service.OrderDetailService;\nimport io.sdb.service.OrderMasterService;\nimport io.sdb.service.PayService;\nimport org.springframework.beans.BeanUtils;\nimport org.springframework.beans.factory.annotation.Autowired;\nimport org.springframework.stereotype.Controller;\nimport org.springframework.web.bind.annotation.*;\n\nimport java.util.List;\nimport java.util.Map;\n\n@Controller\n@RequestMapping(\"/sys/order\")\npublic class SysOrderController {\n\t@Autowired\n\tprivate OrderMasterService orderService;\n\t@Autowired\n\tprivate OrderDetailService orderDetailService;\n\t@Autowired\n\tprivate PayService payService;\n\n\t/**\n\t * 列表\n\t */\n\t@ResponseBody\n\t@GetMapping(\"/list\")\n\tpublic R list(@RequestParam Map<String, Object> params){\n\t\tPageUtils page = orderService.queryPage(params);\n\t\treturn R.ok().put(\"page\", page);\n\t}\n\n\t/**\n\t * 退款\n\t */\n\t@ResponseBody\n\t@PostMapping(\"/refund\")\n\tpublic R list(@RequestBody SysOrderForm orderForm){\n\n\t\tOrderMaster orderMaster = orderService.findById(orderForm.getOrderId());\n\t\tif (orderMaster.getOrderStatus().equals(OrderStatusEnum.NEW.getCode()) && orderMaster.getPayStatus().equals(PayStatusEnum.SUCCESS.getCode())) {\n\t\t\torderMaster = payService.refund(orderForm.getOrderId());\n\t\t\treturn R.ok().put(\"refundTradeNo\", orderMaster.getRefundTradeNo());\n\t\t}else {\n\t\t\tthrow new RRException(ResultEnum.ORDER_STATUS_ERROR);\n\t\t}\n\n\t}\n\n\t/**\n\t * 信息\n\t */\n\t@ResponseBody\n\t@GetMapping(\"/info/{id}\")\n\tpublic R list(@PathVariable String id){\n\t\tOrderMaster orderMaster = orderService.findById(id);\n\t\treturn R.ok().put(\"order\", orderMaster);\n\t}\n\n\t/**\n\t * 详情\n\t */\n\t@ResponseBody\n\t@GetMapping(\"/detail/{id}\")\n\tpublic R detail(@PathVariable String id){\n\t\tList<OrderDetail> orderDetailList = orderDetailService.findByModel(new OrderDetail(){\n\t\t\t{this.setOrderId(id);}\n\t\t});\n\t\treturn R.ok().put(\"orderDetailList\", orderDetailList);\n\t}\n\n\t/**\n\t * 更新\n\t */\n\t@ResponseBody\n\t@PostMapping(\"/update\")\n\tpublic R update(@RequestBody SysOrderForm orderForm) {\n\t\tOrderMaster orderMaster = new OrderMaster();\n\t\tBeanUtils.copyProperties(orderForm, orderMaster);\n\t\torderMaster.update();\n\t\treturn R.ok();\n\t}\n\n\t/**\n\t * 发货\n\t */\n\t@ResponseBody\n\t@PostMapping(\"/shipping\")\n\tpublic R shipping(@RequestBody SysOrderForm orderForm) {\n\t\tOrderDTO orderDTO = new OrderDTO();\n\t\torderDTO.setOrderId(orderForm.getOrderId());\n\t\torderDTO.setTrackingNumber(orderForm.getTrackingNumber());\n\t\torderDTO.setDeliveryCode(orderForm.getDeliveryCode());\n\n\t\torderService.shipping(orderDTO, orderForm.getDeliveryCode());\n\t\treturn R.ok();\n\t}\n\n\t/**\n\t * 收款\n\t */\n\t@ResponseBody\n\t@PostMapping(\"/gathering\")\n\tpublic R gathering(@RequestBody SysOrderForm orderForm) {\n\t\tOrderMaster orderMaster = new OrderMaster();\n\t\tBeanUtils.copyProperties(orderForm, orderMaster);\n\t\torderMaster.setOrderStatus(OrderStatusEnum.FINISHED.getCode());\n\t\torderMaster.setPayStatus(PayStatusEnum.SUCCESS.getCode());\n\t\torderMaster.update();\n\t\treturn R.ok();\n\t}\n\n}\n"
  },
  {
    "path": "src/main/java/io/sdb/controller/SysOssController.java",
    "content": "/**\n * Copyright 2018\n * <p>\n * Licensed under the Apache License, Version 2.0 (the \"License\"); you may not\n * use this file except in compliance with the License. You may obtain a copy of\n * the License at\n * <p>\n * http://www.apache.org/licenses/LICENSE-2.0\n * <p>\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS, WITHOUT\n * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the\n * License for the specific language governing permissions and limitations under\n * the License.\n */\n\npackage io.sdb.controller;\n\nimport com.google.gson.Gson;\nimport io.sdb.common.exception.RRException;\nimport io.sdb.common.utils.ConfigConstant;\nimport io.sdb.common.utils.Constant;\nimport io.sdb.common.utils.PageUtils;\nimport io.sdb.common.utils.R;\nimport io.sdb.common.validator.ValidatorUtils;\nimport io.sdb.common.validator.group.AliyunGroup;\nimport io.sdb.common.validator.group.QcloudGroup;\nimport io.sdb.common.validator.group.QiniuGroup;\nimport io.sdb.model.SysOss;\nimport io.sdb.oss.cloud.CloudStorageConfig;\nimport io.sdb.oss.cloud.OSSFactory;\nimport io.sdb.service.SysOssService;\nimport io.sdb.service.SysConfigService;\nimport org.apache.shiro.authz.annotation.RequiresPermissions;\nimport org.springframework.beans.factory.annotation.Autowired;\nimport org.springframework.web.bind.annotation.*;\nimport org.springframework.web.multipart.MultipartFile;\n\nimport java.util.Date;\nimport java.util.Map;\n\n/**\n * 文件上传\n * \n * @author chenshun\n * @email sunlightcs@gmail.com\n * @date 2017-03-25 12:13:26\n */\n@RestController\n@RequestMapping(\"sys/oss\")\npublic class SysOssController {\n\t@Autowired\n\tprivate SysOssService sysOssService;\n    @Autowired\n    private SysConfigService sysConfigService;\n\n    private final static String KEY = ConfigConstant.CLOUD_STORAGE_CONFIG_KEY;\n\t\n\t/**\n\t * 列表\n\t */\n\t@GetMapping(\"/list\")\n\t@RequiresPermissions(\"sys:oss:all\")\n\tpublic R list(@RequestParam Map<String, Object> params){\n\t\tPageUtils page = sysOssService.queryPage(params);\n\n\t\treturn R.ok().put(\"page\", page);\n\t}\n\n\n    /**\n     * 云存储配置信息\n     */\n    @GetMapping(\"/config\")\n    @RequiresPermissions(\"sys:oss:all\")\n    public R config(){\n        CloudStorageConfig config = sysConfigService.getConfigObject(KEY, CloudStorageConfig.class);\n\n        return R.ok().put(\"config\", config);\n    }\n\n\n\t/**\n\t * 保存云存储配置信息\n\t */\n\t@PostMapping(\"/saveConfig\")\n\t@RequiresPermissions(\"sys:oss:all\")\n\tpublic R saveConfig(@RequestBody CloudStorageConfig config){\n\t\t//校验类型\n\t\tValidatorUtils.validateEntity(config);\n\n\t\tif(config.getType() == Constant.CloudService.QINIU.getValue()){\n\t\t\t//校验七牛数据\n\t\t\tValidatorUtils.validateEntity(config, QiniuGroup.class);\n\t\t}else if(config.getType() == Constant.CloudService.ALIYUN.getValue()){\n\t\t\t//校验阿里云数据\n\t\t\tValidatorUtils.validateEntity(config, AliyunGroup.class);\n\t\t}else if(config.getType() == Constant.CloudService.QCLOUD.getValue()){\n\t\t\t//校验腾讯云数据\n\t\t\tValidatorUtils.validateEntity(config, QcloudGroup.class);\n\t\t}\n\n        sysConfigService.updateValueByKey(KEY, new Gson().toJson(config));\n\n\t\treturn R.ok();\n\t}\n\t\n\n\t/**\n\t * 上传文件\n\t */\n\t@PostMapping(\"/upload\")\n\t@RequiresPermissions(\"sys:oss:all\")\n\tpublic R upload(@RequestParam(\"file\") MultipartFile file) throws Exception {\n\t\tif (file.isEmpty()) {\n\t\t\tthrow new RRException(\"上传文件不能为空\");\n\t\t}\n\n\t\t//上传文件\n\t\tString suffix = file.getOriginalFilename().substring(file.getOriginalFilename().lastIndexOf(\".\"));\n\t\tString url = OSSFactory.build().uploadSuffix(file.getBytes(), suffix);\n\n\t\t//保存文件信息\n\t\tSysOss sysOss = new SysOss();\n\t\tsysOss.setUrl(url);\n\t\tsysOss.setCreateDate(new Date());\n\t\tsysOss.save();\n\n\t\treturn R.ok().put(\"url\", url);\n\t}\n\n\n\t/**\n\t * 删除\n\t */\n\t@PostMapping(\"/delete\")\n\t@RequiresPermissions(\"sys:oss:all\")\n\tpublic R delete(@RequestBody Long[] ids){\n\t\tsysConfigService.deleteBatch(ids);\n\t\treturn R.ok();\n\t}\n\n}\n"
  },
  {
    "path": "src/main/java/io/sdb/controller/SysProductCategoryController.java",
    "content": "/**\n * Copyright 2018\n * <p>\n * Licensed under the Apache License, Version 2.0 (the \"License\"); you may not\n * use this file except in compliance with the License. You may obtain a copy of\n * the License at\n * <p>\n * http://www.apache.org/licenses/LICENSE-2.0\n * <p>\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS, WITHOUT\n * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the\n * License for the specific language governing permissions and limitations under\n * the License.\n */\n\npackage io.sdb.controller;\n\nimport io.sdb.common.annotation.SysLog;\nimport io.sdb.common.exception.RRException;\nimport io.sdb.vo.ProductCategoryVO;\nimport io.sdb.common.utils.R;\nimport io.sdb.common.utils.TreeBuilder;\nimport io.sdb.model.ProductCategory;\nimport io.sdb.service.ProductCategoryService;\nimport org.apache.commons.lang.StringUtils;\nimport org.apache.shiro.authz.annotation.RequiresPermissions;\nimport org.springframework.beans.factory.annotation.Autowired;\nimport org.springframework.web.bind.annotation.*;\n\nimport java.util.List;\nimport java.util.stream.Collectors;\n\n@RestController\n@RequestMapping(\"/sys/productCategory\")\npublic class SysProductCategoryController extends AbstractController {\n\t@Autowired\n\tprivate ProductCategoryService productCategoryService;\n\n\t@ResponseBody\n\t@GetMapping(\"/tree\")\n\tpublic R tree(){\n\t\tList<ProductCategory> productCategoryList = productCategoryService.findAll();\n\n\t\tList<ProductCategoryVO> productCategoryVOList = productCategoryList.stream().map(item -> {\n\t\t\tProductCategoryVO productCategoryVO = new ProductCategoryVO(item);\n\t\t\treturn productCategoryVO;\n\t\t}).collect(Collectors.toList());\n\t\tList<ProductCategoryVO> productCategoryVOTree = new TreeBuilder().buildTree(productCategoryVOList);\n\n\t\treturn R.ok().put(\"productCategroyTree\", productCategoryVOTree);\n\t}\n\n\t/**\n\t * 列表\n\t */\n\t@ResponseBody\n\t@GetMapping(\"/list\")\n\tpublic R list(){\n\t\tList<ProductCategory> productCategoryList = productCategoryService.findAll();\n\t\tfor(ProductCategory p : productCategoryList){\n\t\t\tProductCategory productCategory = productCategoryService.findById(p.getParentId());\n\t\t\tif(productCategory!=null){\n\t\t\t\tp.setParentName(productCategory.getName());\n\t\t\t}\n\t\t}\n\t\treturn R.ok().put(\"productCategoryList\", productCategoryList);\n\t}\n\n\t/**\n\t * 分类信息\n\t */\n\t@GetMapping(\"/info/{productCategoryId}\")\n//\t@RequiresPermissions(\"sys:productCategory:info\")\n\tpublic R info(@PathVariable(\"productCategoryId\") Long productCategoryId){\n\t\tProductCategory productCategory = productCategoryService.findById(productCategoryId);\n\t\treturn R.ok().put(\"productCategory\", productCategory);\n\t}\n\n\t/**\n\t * 选择菜单(添加、修改菜单)\n\t */\n\t@GetMapping(\"/select\")\n//\t@RequiresPermissions(\"sys:productCategory:select\")\n\tpublic R select(){\n\t\t//查询列表数据\n\t\tList<ProductCategory> productCategoryList = productCategoryService.queryListOrder();\n\t\t//添加顶级菜单\n\t\t/*ProductCategory root = new ProductCategory();\n\t\troot.setId(null);\n\t\troot.setName(\"一级菜单\");\n\t\troot.setParentId(-1L);\n\t\troot.setOpen(true);\n\t\troot.setOrder(100);\n\t\tproductCategoryList.add(0, root);*/\n\n\t\treturn R.ok().put(\"productCategoryList\", productCategoryList);\n\t}\n\n\t/**\n\t * 保存\n\t */\n\t@SysLog(\"保存商品类目\")\n\t@PostMapping(\"/save\")\n//\t@RequiresPermissions(\"sys:productCategory:save\")\n\tpublic R save(@RequestBody ProductCategory productCategory){\n\t\t//数据校验\n\t\tverifyForm(productCategory);\n\t\tproductCategoryService.save(productCategory);\n\n\t\treturn R.ok();\n\t}\n\n\t/**\n\t * 修改\n\t */\n\t@SysLog(\"修改菜单\")\n\t@PostMapping(\"/update\")\n//\t@RequiresPermissions(\"sys:productCategory:update\")\n\tpublic R update(@RequestBody ProductCategory productCategory){\n\t\t//数据校验\n\t\tverifyForm(productCategory);\n\t\tproductCategoryService.update(productCategory);\n\n\t\treturn R.ok();\n\t}\n\n\t/**\n\t * 删除\n\t */\n\t@SysLog(\"删除菜单\")\n\t@PostMapping(\"/delete/{productCategoryId}\")\n//\t@RequiresPermissions(\"sys:productCategory:delete\")\n\tpublic R delete(@PathVariable(\"productCategoryId\") long productCategoryId){\n\t\treturn productCategoryService.delete(productCategoryId);\n\t}\n\n\t/**\n\t * 验证参数是否正确\n\t */\n\tprivate void verifyForm(ProductCategory productCategory){\n\t\tif(StringUtils.isBlank(productCategory.getName())){\n\t\t\tthrow new RRException(\"类目名称不能为空\");\n\t\t}\n\n//\t\tif(productCategory.getParentId() == null){\n//\t\t\tthrow new RRException(\"上级类目不能为空\");\n//\t\t}\n\t}\n}"
  },
  {
    "path": "src/main/java/io/sdb/controller/SysRoleController.java",
    "content": "package io.sdb.controller;\n\nimport io.sdb.common.annotation.SysLog;\nimport io.sdb.common.utils.Constant;\nimport io.sdb.common.utils.PageUtils;\nimport io.sdb.common.utils.R;\nimport io.sdb.common.validator.ValidatorUtils;\nimport io.sdb.model.SysRole;\nimport io.sdb.service.SysRoleMenuService;\nimport io.sdb.service.SysRoleService;\nimport org.apache.shiro.authz.annotation.RequiresPermissions;\nimport org.springframework.beans.factory.annotation.Autowired;\nimport org.springframework.web.bind.annotation.*;\n\nimport java.util.List;\nimport java.util.Map;\n\n/**\n * 角色管理\n * \n * @author chenshun\n * @email sunlightcs@gmail.com\n * @date 2016年11月8日 下午2:18:33\n */\n@RestController\n@RequestMapping(\"/sys/role\")\npublic class SysRoleController extends AbstractController {\n\t@Autowired\n\tprivate SysRoleService sysRoleService;\n\t@Autowired\n\tprivate SysRoleMenuService sysRoleMenuService;\n\n\t/**\n\t * 角色列表\n\t */\n\t@GetMapping(\"/list\")\n\t@RequiresPermissions(\"sys:role:list\")\n\tpublic R list(@RequestParam Map<String, Object> params){\n\t\t//如果不是超级管理员，则只查询自己创建的角色列表\n\t\tif(getUserId() != Constant.SUPER_ADMIN){\n\t\t\tparams.put(\"createUserId\", getUserId());\n\t\t}\n\n\t\tPageUtils page = sysRoleService.queryPage(params);\n\n\t\treturn R.ok().put(\"page\", page);\n\t}\n\t\n\t/**\n\t * 角色列表\n\t */\n\t@GetMapping(\"/select\")\n\t@RequiresPermissions(\"sys:role:select\")\n\tpublic R select(){\n\t\tSysRole sysRole = new SysRole();\n\t\t\n\t\t//如果不是超级管理员，则只查询自己所拥有的角色列表\n\t\tif(getUserId() != Constant.SUPER_ADMIN){\n\t\t\tsysRole.setCreateUserId(getUserId());\n\t\t}\n\t\tList<SysRole> list = sysRoleService.findByModel(sysRole);\n\t\t\n\t\treturn R.ok().put(\"list\", list);\n\t}\n\t\n\t/**\n\t * 角色信息\n\t */\n\t@GetMapping(\"/info/{roleId}\")\n\t@RequiresPermissions(\"sys:role:info\")\n\tpublic R info(@PathVariable(\"roleId\") Long roleId){\n\t\tSysRole role = sysRoleService.findById(roleId);\n\t\t\n\t\t//查询角色对应的菜单\n\t\tList<Long> menuIdList = sysRoleMenuService.queryMenuIdList(roleId);\n\t\trole.setMenuIdList(menuIdList);\n\t\t\n\t\treturn R.ok().put(\"role\", role);\n\t}\n\t\n\t/**\n\t * 保存角色\n\t */\n\t@SysLog(\"保存角色\")\n\t@PostMapping(\"/save\")\n\t@RequiresPermissions(\"sys:role:save\")\n\tpublic R save(@RequestBody SysRole role){\n\t\tValidatorUtils.validateEntity(role);\n\t\t\n\t\trole.setCreateUserId(getUserId());\n\t\tsysRoleService.save(role);\n\t\t\n\t\treturn R.ok();\n\t}\n\t\n\t/**\n\t * 修改角色\n\t */\n\t@SysLog(\"修改角色\")\n\t@PostMapping(\"/update\")\n\t@RequiresPermissions(\"sys:role:update\")\n\tpublic R update(@RequestBody SysRole role){\n\t\tValidatorUtils.validateEntity(role);\n\t\trole.setCreateUserId(getUserId());\n\t\tsysRoleService.update(role);\n\t\t\n\t\treturn R.ok();\n\t}\n\t\n\t/**\n\t * 删除角色\n\t */\n\t@SysLog(\"删除角色\")\n\t@PostMapping(\"/delete\")\n\t@RequiresPermissions(\"sys:role:delete\")\n\tpublic R delete(@RequestBody Long[] roleIds){\n\t\tsysRoleService.deleteBatch(roleIds);\n\t\t\n\t\treturn R.ok();\n\t}\n}\n"
  },
  {
    "path": "src/main/java/io/sdb/controller/SysSpecificationController.java",
    "content": "/**\n * Copyright 2018\n * <p>\n * Licensed under the Apache License, Version 2.0 (the \"License\"); you may not\n * use this file except in compliance with the License. You may obtain a copy of\n * the License at\n * <p>\n * http://www.apache.org/licenses/LICENSE-2.0\n * <p>\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS, WITHOUT\n * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the\n * License for the specific language governing permissions and limitations under\n * the License.\n */\n\npackage io.sdb.controller;\n\nimport io.sdb.common.annotation.SysLog;\nimport io.sdb.common.entity.Filter;\nimport io.sdb.common.exception.RRException;\nimport io.sdb.common.utils.R;\nimport io.sdb.common.utils.TreeBuilder;\nimport io.sdb.model.Specification;\nimport io.sdb.service.SpecificationService;\nimport io.sdb.vo.SpecificationVO;\nimport org.apache.commons.lang.StringUtils;\nimport org.apache.shiro.authz.annotation.RequiresPermissions;\nimport org.springframework.beans.factory.annotation.Autowired;\nimport org.springframework.web.bind.annotation.*;\n\nimport java.util.List;\nimport java.util.stream.Collectors;\n\n@RestController\n@RequestMapping(\"/sys/specification\")\npublic class SysSpecificationController extends AbstractController{\n\t@Autowired\n\tprivate SpecificationService specificationService;\n\t\n\t/**\n\t * 列表\n\t */\n\t@ResponseBody\n\t@GetMapping(\"/tree\")\n\tpublic R tree(){\n\t\tList<Specification> specificationList = specificationService.findAll();\n\n\t\tList<SpecificationVO> specificationVOList = specificationList.stream().map(item -> {\n\t\t\tSpecificationVO specificationVO = new SpecificationVO(item);\n\t\t\treturn specificationVO;\n\t\t}).collect(Collectors.toList());\n\t\tList<SpecificationVO> specificationTree = new TreeBuilder().buildTree(specificationVOList);\n\n\t\treturn R.ok().put(\"specificationTree\", specificationTree);\n\t}\n\n\t/**\n\t * 列表\n\t */\n\t@ResponseBody\n\t@GetMapping(\"/treeParent\")\n\tpublic R treeParent(){\n\t\tList<Specification> specificationList = specificationService.findByFilter(Filter.isNull(\"parent\"));\n\n\t\tList<SpecificationVO> specificationVOList = specificationList.stream().map(item -> {\n\t\t\tSpecificationVO specificationVO = new SpecificationVO(item);\n\t\t\treturn specificationVO;\n\t\t}).collect(Collectors.toList());\n\t\tList<SpecificationVO> specificationTree = new TreeBuilder().buildTree(specificationVOList);\n\n\t\treturn R.ok().put(\"specificationTree\", specificationTree);\n\t}\n\n\t/**\n\t * 列表\n\t */\n\t@ResponseBody\n\t@GetMapping(\"/list\")\n\tpublic R list(){\n\t\tList<Specification> specificationList = specificationService.findAll();\n\n\t\t/*List<SpecificationVO> specificationVOList = specificationList.stream().map(item -> {\n\t\t\tSpecificationVO specificationVO = new SpecificationVO(item);\n\t\t\treturn specificationVO;\n\t\t}).collect(Collectors.toList());*/\n\n\n\t\treturn R.ok().put(\"specificationList\", specificationList);\n\t}\n\n\t/**\n\t * 规格信息\n\t */\n\t@GetMapping(\"/info/{id}\")\n//\t@RequiresPermissions(\"sys:specification:info\")\n\tpublic R info(@PathVariable(\"id\") Long id){\n\t\tSpecification specification = specificationService.findById(id);\n\t\treturn R.ok().put(\"specification\", specification);\n\t}\n\n\t/**\n\t * 选择规格(添加、修改规格)\n\t */\n\t@GetMapping(\"/select\")\n//\t@RequiresPermissions(\"sys:specification:select\")\n\tpublic R select(){\n\t\t//查询列表数据\n\t\tList<Specification> specificationList = specificationService.queryListByOrder();\n\n\t\treturn R.ok().put(\"specificationList\", specificationList);\n\t}\n\n\t/**\n\t * 保存\n\t */\n\t@SysLog(\"保存规格\")\n\t@PostMapping(\"/save\")\n//\t@RequiresPermissions(\"sys:specification:save\")\n\tpublic R save(@RequestBody Specification specification){\n\t\t//数据校验\n\t\tverifyForm(specification);\n\n\t\treturn specificationService.save(specification);\n\n\t}\n\n\t/**\n\t * 修改\n\t */\n\t@SysLog(\"修改规格\")\n\t@PostMapping(\"/update\")\n//\t@RequiresPermissions(\"sys:specification:update\")\n\tpublic R update(@RequestBody Specification specification){\n\t\t//数据校验\n\t\tverifyForm(specification);\n\t\tspecificationService.update(specification);\n\t\treturn R.ok();\n\t}\n\n\t/**\n\t * 删除\n\t */\n\t@SysLog(\"删除规格\")\n\t@PostMapping(\"/delete/{id}\")\n//\t@RequiresPermissions(\"sys:specification:delete\")\n\tpublic R delete(@PathVariable(\"id\") long id){\n\t\treturn specificationService.delete(id);\n\t}\n\n\t/**\n\t * 验证参数是否正确\n\t */\n\tprivate void verifyForm(Specification specification){\n\t\tif(StringUtils.isBlank(specification.getName())){\n\t\t\tthrow new RRException(\"规格名称不能为空\");\n\t\t}\n\n\t\t/*if(specification.getParentId() == null){\n\t\t\tthrow new RRException(\"上级规格不能为空\");\n\t\t}*/\n\n\t\tif(specification.getType() == null){\n\t\t\tthrow new RRException(\"规格类型不正确\");\n\t\t}\n\t}\n\n}"
  },
  {
    "path": "src/main/java/io/sdb/controller/SysUserController.java",
    "content": "package io.sdb.controller;\n\nimport io.sdb.common.annotation.SysLog;\nimport io.sdb.common.utils.Constant;\nimport io.sdb.common.utils.PageUtils;\nimport io.sdb.common.utils.R;\nimport io.sdb.common.validator.Assert;\nimport io.sdb.common.validator.ValidatorUtils;\nimport io.sdb.common.validator.group.AddGroup;\nimport io.sdb.common.validator.group.UpdateGroup;\nimport io.sdb.model.SysUser;\nimport io.sdb.form.PasswordForm;\nimport io.sdb.service.SysUserRoleService;\nimport io.sdb.service.SysUserService;\nimport org.apache.commons.lang.ArrayUtils;\nimport org.apache.shiro.authz.annotation.RequiresPermissions;\nimport org.apache.shiro.crypto.hash.Sha256Hash;\nimport org.springframework.beans.factory.annotation.Autowired;\nimport org.springframework.web.bind.annotation.*;\n\nimport java.util.List;\nimport java.util.Map;\n\n/**\n * 系统用户\n * \n * @author chenshun\n * @email sunlightcs@gmail.com\n * @date 2016年10月31日 上午10:40:10\n */\n@RestController\n@RequestMapping(\"/sys/user\")\npublic class SysUserController extends AbstractController {\n\t@Autowired\n\tprivate SysUserService sysUserService;\n\t@Autowired\n\tprivate SysUserRoleService sysUserRoleService;\n\n\t/**\n\t * 所有用户列表\n\t */\n\t@GetMapping(\"/list\")\n\t@RequiresPermissions(\"sys:user:list\")\n\tpublic R list(@RequestParam Map<String, Object> params){\n\t\t//只有超级管理员，才能查看所有管理员列表\n\t\tif(getUserId() != Constant.SUPER_ADMIN){\n\t\t\tparams.put(\"createUserId\", getUserId());\n\t\t}\n\t\tPageUtils page = sysUserService.queryPage(params);\n\n\t\treturn R.ok().put(\"page\", page);\n\t}\n\t\n\t/**\n\t * 获取登录的用户信息\n\t */\n\t@GetMapping(\"/info\")\n\tpublic R info(){\n\t\treturn R.ok().put(\"user\", getUser());\n\t}\n\t\n\t/**\n\t * 修改登录用户密码\n\t */\n\t@SysLog(\"修改密码\")\n\t@PostMapping(\"/password\")\n\tpublic R password(@RequestBody PasswordForm form){\n\t\tAssert.isBlank(form.getNewPassword(), \"新密码不为能空\");\n\t\t\n\t\t//sha256加密\n\t\tString password = new Sha256Hash(form.getPassword(), getUser().getSalt()).toHex();\n\t\t//sha256加密\n\t\tString newPassword = new Sha256Hash(form.getNewPassword(), getUser().getSalt()).toHex();\n\t\t\t\t\n\t\t//更新密码\n\t\tboolean flag = sysUserService.updatePassword(getUserId(), password, newPassword);\n\t\tif(!flag){\n\t\t\treturn R.error(\"原密码不正确\");\n\t\t}\n\t\t\n\t\treturn R.ok();\n\t}\n\t\n\t/**\n\t * 用户信息\n\t */\n\t@GetMapping(\"/info/{userId}\")\n\t@RequiresPermissions(\"sys:user:info\")\n\tpublic R info(@PathVariable(\"userId\") Long userId){\n\t\tSysUser user = sysUserService.findById(userId);\n\t\t\n\t\t//获取用户所属的角色列表\n\t\tList<Long> roleIdList = sysUserRoleService.queryRoleIdList(userId);\n\t\tuser.setRoleIdList(roleIdList);\n\t\t\n\t\treturn R.ok().put(\"user\", user);\n\t}\n\t\n\t/**\n\t * 保存用户\n\t */\n\t@SysLog(\"保存用户\")\n\t@PostMapping(\"/save\")\n\t@RequiresPermissions(\"sys:user:save\")\n\tpublic R save(@RequestBody SysUser user){\n\t\tValidatorUtils.validateEntity(user, AddGroup.class);\n\t\t\n\t\tuser.setCreateUserId(getUserId());\n\t\tsysUserService.save(user);\n\t\t\n\t\treturn R.ok();\n\t}\n\t\n\t/**\n\t * 修改用户\n\t */\n\t@SysLog(\"修改用户\")\n\t@PostMapping(\"/update\")\n\t@RequiresPermissions(\"sys:user:update\")\n\tpublic R update(@RequestBody SysUser user){\n\t\tValidatorUtils.validateEntity(user, UpdateGroup.class);\n\n\t\tuser.setCreateUserId(getUserId());\n\t\tsysUserService.update(user);\n\t\t\n\t\treturn R.ok();\n\t}\n\t\n\t/**\n\t * 删除用户\n\t */\n\t@SysLog(\"删除用户\")\n\t@PostMapping(\"/delete\")\n\t@RequiresPermissions(\"sys:user:delete\")\n\tpublic R delete(@RequestBody Long[] userIds){\n\t\tif(ArrayUtils.contains(userIds, 1L)){\n\t\t\treturn R.error(\"系统管理员不能删除\");\n\t\t}\n\t\t\n\t\tif(ArrayUtils.contains(userIds, getUserId())){\n\t\t\treturn R.error(\"当前用户不能删除\");\n\t\t}\n\t\t\n\t\tsysUserService.deleteBatch(userIds);\n\t\t\n\t\treturn R.ok();\n\t}\n}\n"
  },
  {
    "path": "src/main/java/io/sdb/controller/TestController.java",
    "content": "package io.sdb.controller;\n\nimport com.jfinal.kit.PathKit;\nimport com.lly835.bestpay.model.PayResponse;\nimport io.sdb.common.utils.R;\nimport io.sdb.service.PayService;\nimport lombok.extern.slf4j.Slf4j;\nimport org.springframework.beans.factory.annotation.Autowired;\nimport org.springframework.stereotype.Controller;\nimport org.springframework.web.bind.annotation.*;\nimport org.springframework.web.servlet.ModelAndView;\n\nimport javax.servlet.http.HttpServletResponse;\nimport java.net.InetAddress;\nimport java.net.UnknownHostException;\n\n@Controller\n@RequestMapping(\"/test\")\n@Slf4j\npublic class TestController {\n\n    @Autowired\n    PayService payService;\n\n    @GetMapping(\"/hello\")\n    public ModelAndView hello(ModelAndView modelAndView, HttpServletResponse response) {\n        response.setCharacterEncoding(\"UTF-8\");\n        response.setHeader(\"Content-disposition\", \"attachment; filename=test.doc\");\n        response.setContentType(\"application/octet-stream;charset=UTF-8\");\n        modelAndView.addObject(\"value\", \"test\");\n        modelAndView.setViewName(\"hello\");\n        return modelAndView;\n    }\n\n    @PostMapping(\"/pay\")\n    @ResponseBody\n    public R pay() {\n        PayResponse payResponse = payService.create(null);\n        return R.ok().put(\"payResponse\", payResponse);\n    }\n\n    @GetMapping(\"/ip\")\n    @ResponseBody\n    public String ip() {\n        String host = null;\n        try {\n            host = InetAddress.getLocalHost().getHostAddress();\n        } catch (UnknownHostException e) {\n            log.error(\"get server host Exception e:\", e);\n        }\n        return host;\n    }\n\n    /**\n     * 微信异步通知\n     * @param notifyData\n     */\n    @RequestMapping(\"/notify\")\n    public ModelAndView notify(@RequestBody String notifyData) {\n        payService.notify(notifyData);\n\n        //返回给微信处理结果\n        return new ModelAndView(\"success\");\n    }\n\n    public static void main(String[] args) {\n        String baseTemplatePath = new StringBuilder(PathKit.getRootClassPath())\n                .append(\"/\")\n//                .append(PathKit.getPackagePath(this))\n//                .append(\"/tpl\")\n                .toString();\n        log.info(System.getProperty(\"user.dir\"));\n    }\n}"
  },
  {
    "path": "src/main/java/io/sdb/controller/UEditorController.java",
    "content": "package io.sdb.controller;\n\nimport java.io.IOException;\nimport java.io.PrintWriter;\n\nimport javax.servlet.ServletContext;\nimport javax.servlet.ServletException;\nimport javax.servlet.annotation.WebServlet;\nimport javax.servlet.http.HttpServlet;\nimport javax.servlet.http.HttpServletRequest;\nimport javax.servlet.http.HttpServletResponse;\n\nimport com.baidu.ueditor.ActionEnter;\n\n@WebServlet(name = \"UEditorServlet\", urlPatterns = \"/UEditor\")\npublic class UEditorController extends HttpServlet {\n\n    public void doGet(HttpServletRequest request,HttpServletResponse response) throws ServletException,IOException{\n        doPost(request, response);\n    }\n\n    public void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {\n        request.setCharacterEncoding( \"utf-8\" );\n        response.setHeader(\"Content-Type\" , \"text/html\");\n        PrintWriter out = response.getWriter();\n        ServletContext application=this.getServletContext();\n        String rootPath = application.getRealPath( \"/\" );\n\n        String action = request.getParameter(\"action\");\n        String result = new ActionEnter( request, rootPath ).exec();\n        if( action!=null &&\n                (action.equals(\"listfile\") || action.equals(\"listimage\") ) ){\n            rootPath = rootPath.replace(\"\\\\\", \"/\");\n            result = result.replaceAll(rootPath, \"/\");\n        }\n        out.write( result );\n    }\n\n}"
  },
  {
    "path": "src/main/java/io/sdb/controller/WxMaMediaController.java",
    "content": "package io.sdb.controller;\n\nimport cn.binarywang.wx.miniapp.api.WxMaService;\nimport cn.binarywang.wx.miniapp.constant.WxMaConstants;\nimport com.google.common.collect.Lists;\nimport com.google.common.io.Files;\nimport me.chanjar.weixin.common.bean.result.WxMediaUploadResult;\nimport me.chanjar.weixin.common.exception.WxErrorException;\nimport org.slf4j.Logger;\nimport org.slf4j.LoggerFactory;\nimport org.springframework.beans.factory.annotation.Autowired;\nimport org.springframework.web.bind.annotation.*;\nimport org.springframework.web.multipart.MultipartFile;\nimport org.springframework.web.multipart.MultipartHttpServletRequest;\nimport org.springframework.web.multipart.commons.CommonsMultipartResolver;\n\nimport javax.servlet.http.HttpServletRequest;\nimport java.io.File;\nimport java.io.IOException;\nimport java.util.Iterator;\nimport java.util.List;\n\n/**\n * <pre>\n *  小程序临时素材接口\n *  Created by BinaryWang on 2017/6/16.\n * </pre>\n *\n * @author <a href=\"https://github.com/binarywang\">Binary Wang</a>\n */\n@RestController\n@RequestMapping(\"/wechat/media\")\npublic class WxMaMediaController {\n    private final Logger logger = LoggerFactory.getLogger(this.getClass());\n\n    @Autowired\n    private WxMaService service;\n\n    /**\n     * 上传临时素材\n     *\n     * @return 素材的media_id列表，实际上如果有的话，只会有一个\n     */\n    @PostMapping(\"/upload\")\n    public List<String> uploadMedia(HttpServletRequest request) throws WxErrorException {\n        CommonsMultipartResolver resolver = new CommonsMultipartResolver(request.getSession().getServletContext());\n\n        if (!resolver.isMultipart(request)) {\n            return Lists.newArrayList();\n        }\n\n        MultipartHttpServletRequest multiRequest = (MultipartHttpServletRequest) request;\n        Iterator<String> it = multiRequest.getFileNames();\n        List<String> result = Lists.newArrayList();\n        while (it.hasNext()) {\n            try {\n                MultipartFile file = multiRequest.getFile(it.next());\n                File newFile = new File(Files.createTempDir(), file.getOriginalFilename());\n                this.logger.info(\"filePath is ：\" + newFile.toString());\n                file.transferTo(newFile);\n                WxMediaUploadResult uploadResult = this.service.getMediaService().uploadMedia(WxMaConstants.KefuMsgType.IMAGE, newFile);\n                this.logger.info(\"media_id ： \" + uploadResult.getMediaId());\n                result.add(uploadResult.getMediaId());\n            } catch (IOException e) {\n                this.logger.error(e.getMessage(), e);\n            }\n        }\n\n        return result;\n    }\n\n    /**\n     * 下载临时素材\n     */\n    @GetMapping(\"/download/{mediaId}\")\n    public File getMedia(@PathVariable String mediaId) throws WxErrorException {\n        return this.service.getMediaService().getMedia(mediaId);\n    }\n}\n"
  },
  {
    "path": "src/main/java/io/sdb/controller/WxMaUserController.java",
    "content": "package io.sdb.controller;\n\nimport io.sdb.common.utils.JsonUtils;\nimport io.sdb.common.utils.R;\nimport io.sdb.enums.ResultEnum;\nimport io.sdb.model.User;\nimport io.sdb.common.annotation.Login;\nimport io.sdb.common.annotation.LoginUser;\nimport io.sdb.form.MaLoginForm;\nimport io.sdb.service.UserService;\nimport io.sdb.common.utils.JwtUtils;\nimport lombok.extern.slf4j.Slf4j;\nimport org.apache.commons.lang3.StringUtils;\nimport org.slf4j.Logger;\nimport org.slf4j.LoggerFactory;\nimport org.springframework.beans.factory.annotation.Autowired;\nimport org.springframework.web.bind.annotation.*;\n\nimport cn.binarywang.wx.miniapp.api.WxMaService;\nimport cn.binarywang.wx.miniapp.bean.WxMaJscode2SessionResult;\nimport cn.binarywang.wx.miniapp.bean.WxMaPhoneNumberInfo;\nimport cn.binarywang.wx.miniapp.bean.WxMaUserInfo;\nimport me.chanjar.weixin.common.exception.WxErrorException;\n\nimport javax.servlet.http.HttpServletRequest;\nimport java.util.HashMap;\nimport java.util.Map;\n\n/**\n * 微信小程序用户接口\n *\n * @author <a href=\"https://github.com/binarywang\">Binary Wang</a>\n */\n@RestController\n@Slf4j\n@RequestMapping(\"/wechat/user\")\npublic class WxMaUserController {\n    private final Logger logger = LoggerFactory.getLogger(this.getClass());\n\n    @Autowired\n    private WxMaService wxService;\n    @Autowired\n    private JwtUtils jwtUtils;\n\n    @Autowired\n    private UserService userService;\n\n    /**\n     * 登陆接口\n     */\n    @PostMapping(\"/login\")\n    public R login(HttpServletRequest request, @RequestBody MaLoginForm maLoginForm) {\n\n        if (StringUtils.isBlank(maLoginForm.getCode())) {\n            return R.error(\"empty jscode\");\n        }\n\n        try {\n            WxMaJscode2SessionResult session = this.wxService.getUserService().getSessionInfo(maLoginForm.getCode());\n\n            String sessionKey = session.getSessionKey();\n            String openId = session.getOpenid();\n\n            // 用户信息校验\n            if (!this.wxService.getUserService().checkUserInfo(sessionKey, maLoginForm.getRawData(), maLoginForm.getSignature())) {\n                return R.error(\"user check failed\");\n            }\n\n            User user = new User();\n            user.setMaOpenId(openId);\n\n            User dbUser = userService.findFirstByModel(user);\n            if (dbUser == null) {\n                // 解密用户信息\n                WxMaUserInfo userInfo = this.wxService.getUserService().getUserInfo(sessionKey, maLoginForm.getEncryptedData(), maLoginForm.getIv());\n                dbUser = userService.addMaUser(userInfo);\n                if (dbUser.getUserId() == null) {\n                    return R.error(ResultEnum.MA_LOGIN_ERROR);\n                }\n            }\n\n            //生成token\n            String token = jwtUtils.generateToken(dbUser.getUserId());\n\n            Map<String, Object> map = new HashMap<>();\n            map.put(\"token\", token);\n            map.put(\"expire\", jwtUtils.getExpire());\n\n            return R.ok(map);\n        } catch (WxErrorException e) {\n            this.logger.error(e.getMessage(), e);\n            return R.error(e.toString());\n        }\n    }\n\n    @Login\n    @GetMapping(\"userInfo\")\n    public R userInfo(@LoginUser User user) {\n        return R.ok().put(\"user\", user);\n    }\n\n    /**\n     * <pre>\n     * 获取用户信息接口\n     * </pre>\n     */\n    @GetMapping(\"/info\")\n    public String info(String sessionKey, String signature, String rawData, String encryptedData, String iv) {\n        // 用户信息校验\n        if (!this.wxService.getUserService().checkUserInfo(sessionKey, rawData, signature)) {\n            return \"user check failed\";\n        }\n\n        // 解密用户信息\n        WxMaUserInfo userInfo = this.wxService.getUserService().getUserInfo(sessionKey, encryptedData, iv);\n\n        return JsonUtils.toJson(userInfo);\n    }\n\n    /**\n     * <pre>\n     * 获取用户绑定手机号信息\n     * </pre>\n     */\n    @GetMapping(\"/phone\")\n    public String phone(String sessionKey, String signature, String rawData, String encryptedData, String iv) {\n        // 用户信息校验\n        if (!this.wxService.getUserService().checkUserInfo(sessionKey, rawData, signature)) {\n            return \"user check failed\";\n        }\n\n        // 解密\n        WxMaPhoneNumberInfo phoneNoInfo = this.wxService.getUserService().getPhoneNoInfo(sessionKey, encryptedData, iv);\n\n        return JsonUtils.toJson(phoneNoInfo);\n    }\n}\n"
  },
  {
    "path": "src/main/java/io/sdb/controller/WxPayController.java",
    "content": "package io.sdb.controller;\n\n\nimport com.lly835.bestpay.model.PayResponse;\nimport io.sdb.common.utils.R;\nimport io.sdb.dto.OrderDTO;\nimport io.sdb.enums.PayStatusEnum;\nimport io.sdb.model.OrderMaster;\nimport io.sdb.model.User;\nimport io.sdb.common.annotation.Login;\nimport io.sdb.common.annotation.LoginUser;\nimport io.sdb.service.OrderMasterService;\nimport io.sdb.service.PayService;\nimport org.springframework.beans.BeanUtils;\nimport org.springframework.beans.factory.annotation.Autowired;\nimport org.springframework.web.bind.annotation.*;\n\n/**\n * APP登录授权\n *\n * @author chenshun\n * @email sunlightcs@gmail.com\n * @date 2017-03-23 15:31\n */\n@RestController\n@RequestMapping(\"/wechat/pay\")\npublic class WxPayController {\n\n    @Autowired\n    PayService payService;\n\n    @Autowired\n    OrderMasterService orderService;\n\n    @Login\n    @GetMapping(\"/create/{orderId}\")\n    public R create(@LoginUser User user, @PathVariable String orderId) {\n        PayResponse payResponse = null;\n        OrderMaster orderMaster = orderService.findById(orderId);\n        if(orderMaster.getPayStatus().equals(PayStatusEnum.WAIT.getCode())) {\n            OrderDTO orderDTO = new OrderDTO();\n            orderDTO.setBuyerOpenid(user.getMaOpenId());\n            BeanUtils.copyProperties(orderMaster, orderDTO);\n            payResponse = payService.create(orderDTO);\n        }\n        //返回给微信处理结果\n        return R.ok().put(\"payResponse\", payResponse);\n    }\n\n}\n"
  },
  {
    "path": "src/main/java/io/sdb/controller/WxPortalController.java",
    "content": "package io.sdb.controller;\n\nimport io.sdb.config.WxMpConfiguration;\nimport lombok.extern.slf4j.Slf4j;\nimport me.chanjar.weixin.mp.api.WxMpService;\nimport me.chanjar.weixin.mp.bean.message.WxMpXmlMessage;\nimport me.chanjar.weixin.mp.bean.message.WxMpXmlOutMessage;\nimport org.apache.commons.lang3.StringUtils;\nimport org.springframework.beans.factory.annotation.Autowired;\nimport org.springframework.web.bind.annotation.*;\n\n/**\n * @author Binary Wang(https://github.com/binarywang)\n */\n@RestController\n@RequestMapping(\"/wx/portal/{appid}\")\n@Slf4j\npublic class WxPortalController {\n\n    @GetMapping(produces = \"text/plain;charset=utf-8\")\n    public String authGet(@PathVariable String appid,\n                          @RequestParam(name = \"signature\", required = false) String signature,\n                          @RequestParam(name = \"timestamp\", required = false) String timestamp,\n                          @RequestParam(name = \"nonce\", required = false) String nonce,\n                          @RequestParam(name = \"echostr\", required = false) String echostr) {\n        final WxMpService wxService = WxMpConfiguration.getMpServices().get(appid);\n\n        log.info(\"\\n接收到来自微信服务器的认证消息：[{}, {}, {}, {}]\", signature,\n            timestamp, nonce, echostr);\n\n        if (StringUtils.isAnyBlank(signature, timestamp, nonce, echostr)) {\n            throw new IllegalArgumentException(\"请求参数非法，请核实!\");\n        }\n\n        if (wxService.checkSignature(timestamp, nonce, signature)) {\n            return echostr;\n        }\n\n        return \"非法请求\";\n    }\n\n    @PostMapping(produces = \"application/xml; charset=UTF-8\")\n    public String post(@PathVariable String appid,\n                       @RequestBody String requestBody,\n                       @RequestParam(\"signature\") String signature,\n                       @RequestParam(\"timestamp\") String timestamp,\n                       @RequestParam(\"nonce\") String nonce,\n                       @RequestParam(name = \"encrypt_type\", required = false) String encType,\n                       @RequestParam(name = \"msg_signature\", required = false) String msgSignature) {\n        final WxMpService wxService = WxMpConfiguration.getMpServices().get(appid);\n\n        log.info(\"\\n接收微信请求：[signature=[{}], encType=[{}], msgSignature=[{}],\"\n                + \" timestamp=[{}], nonce=[{}], requestBody=[\\n{}\\n] \",\n            signature, encType, msgSignature, timestamp, nonce, requestBody);\n\n        if (!wxService.checkSignature(timestamp, nonce, signature)) {\n            throw new IllegalArgumentException(\"非法请求，可能属于伪造的请求！\");\n        }\n\n        String out = null;\n        if (encType == null) {\n            // 明文传输的消息\n            WxMpXmlMessage inMessage = WxMpXmlMessage.fromXml(requestBody);\n            WxMpXmlOutMessage outMessage = this.route(inMessage, appid);\n            if (outMessage == null) {\n                return \"\";\n            }\n\n            out = outMessage.toXml();\n        } else if (\"aes\".equalsIgnoreCase(encType)) {\n            // aes加密的消息\n            WxMpXmlMessage inMessage = WxMpXmlMessage.fromEncryptedXml(requestBody, wxService.getWxMpConfigStorage(),\n                timestamp, nonce, msgSignature);\n            log.info(\"\\n消息解密后内容为：\\n{} \", inMessage.toString());\n            WxMpXmlOutMessage outMessage = this.route(inMessage, appid);\n            if (outMessage == null) {\n                return \"\";\n            }\n\n            out = outMessage.toEncryptedXml(wxService.getWxMpConfigStorage());\n        }\n\n        log.info(\"\\n组装回复信息：{}\", out);\n        return out;\n    }\n\n    private WxMpXmlOutMessage route(WxMpXmlMessage message, String appid) {\n        try {\n            return WxMpConfiguration.getRouters().get(appid).route(message);\n        } catch (Exception e) {\n            log.error(\"路由消息时出现异常！\", e);\n        }\n\n        return null;\n    }\n\n}\n"
  },
  {
    "path": "src/main/java/io/sdb/dao/AreaDao.java",
    "content": "package io.sdb.dao;\n\nimport io.sdb.model.Area;\nimport org.springframework.stereotype.Component;\n\n@Component\npublic class AreaDao extends BaseDao<Area> {\n    public AreaDao() {\n        super(Area.class);\n    }\n}\n"
  },
  {
    "path": "src/main/java/io/sdb/dao/BaseDao.java",
    "content": "package io.sdb.dao;\n\nimport com.jfinal.kit.Kv;\nimport com.jfinal.kit.LogKit;\nimport com.jfinal.plugin.activerecord.*;\nimport com.zaxxer.hikari.util.FastList;\nimport io.sdb.common.entity.Filter;\nimport io.sdb.common.entity.Order;\nimport io.sdb.common.utils.GenericsUtils;\nimport org.apache.commons.lang3.BooleanUtils;\nimport org.apache.commons.lang3.StringUtils;\nimport org.springframework.util.Assert;\nimport org.springframework.util.CollectionUtils;\n\nimport java.util.ArrayList;\nimport java.util.List;\n\n/**\n * Dao - 基类\n * \n * \n */\npublic class BaseDao<M extends Model<M>> {\n\n\t/** \"ID\"属性名称 */\n\tpublic static final String ID = \"id\";\n\n\t/** \"创建日期\"属性名称 */\n\tpublic static final String CREATE_DATE = \"create_date\";\n\n\t/** 实体类类型 */\n\tprivate Class<M> modelClass;\n\t\n\tprotected M modelManager;\n\t\n\tpublic Class<M> getModelClass() {\n\t\treturn modelClass;\n\t}\n\n\tpublic void setModelClass(Class<M> modelClass) {\n\t\tthis.modelClass = modelClass;\n\t}\n\t\n\t/**\n\t * 构造方法\n\t */\n\t@SuppressWarnings(\"unchecked\")\n\tpublic BaseDao(Class<M> entityClass) {\n\t\tthis.setModelClass(GenericsUtils.getSuperClassGenricType(entityClass));\n\t\ttry {\n\t\t\tmodelManager = modelClass.newInstance();\n\t\t} catch (InstantiationException e) {\n\t\t\tLogKit.error(\"instance model fail!\" + e);\n\t\t} catch (IllegalAccessException e) {\n\t\t\tLogKit.error(\"instance model fail!\" + e);\n\t\t}\n\t}\n\t\n\tpublic String getTableName() {\n\t\tTable table = TableMapping.me().getTable(getModelClass());\n\t\treturn table.getName();\n\t}\n\n\tpublic String[] getPrimaryKeys() {\n\t\tTable table = TableMapping.me().getTable(getModelClass());\n\t\ttable.getPrimaryKey();\n\t\treturn table.getPrimaryKey();\n\t}\n\t\n\t/**\n\t * 查找实体对象\n\t * \n\t * @param id\n\t *            ID\n\t * @return 实体对象，若不存在则返回null\n\t */\n\tpublic M findById(Object ...id) {\n\t\tif (id == null) {\n\t\t\treturn null;\n\t\t}\n\t\treturn modelManager.findById(id);\n\t}\n\n\tpublic M findFirstByModel(M model){\n\t\tRecord record = model.toRecord();\n\t\tSqlPara sqlPara = Db.getSqlPara(\"common.findByModel\", Kv.by(\"record\", record.getColumns()).set(\"tableName\", this.getTableName()));\n\t\treturn this.modelManager.findFirst(sqlPara);\n\t}\n\n\tpublic List<M> findByModel(M model){\n\t\tRecord record = model.toRecord();\n\t\tSqlPara sqlPara = Db.getSqlPara(\"common.findByModel\", Kv.by(\"record\", record.getColumns()).set(\"tableName\", this.getTableName()));\n\t\treturn this.modelManager.find(sqlPara);\n\t}\n\n\tpublic List<M> findByFilter(Filter filter){\n\t\tList<Filter> filters = new ArrayList<>();\n\t\tfilters.add(filter);\n\t\treturn this.findByFilters(filters);\n\t}\n\n\tpublic List<M> findByFilters(List<Filter> filters){\n\t\tSqlPara sqlPara = Db.getSqlPara(\"common.findList\", Kv.by(\"filters\", filters).set(\"tableName\", this.getTableName()));\n\t\tList<M> modelList = this.modelManager.find(sqlPara);\n\t\treturn modelList;\n\t}\n\n\tpublic boolean deleteByModel(M model){\n\t\tRecord record = model.toRecord();\n\t\tSqlPara sqlPara = Db.getSqlPara(\"common.deleteByModel\", Kv.by(\"record\", record.getColumns()).set(\"tableName\", this.getTableName()));\n\t\treturn Db.update(sqlPara) > 0;\n\t}\n\n\tpublic boolean deleteById(Object ...id){\n\t\treturn this.modelManager.deleteById(id);\n\t}\n\n\tpublic M getDao(){\n\t\treturn modelManager;\n\t}\n\n\tpublic List<M> findAll() {\n\t\treturn findList(null, null, null, null);\n\t}\n\n\n\t/**\n\t * 查找实体对象集合\n\t *\n\t * @param first\n\t *            起始记录\n\t * @param count\n\t *            数量\n\t * @param filters\n\t *            筛选\n\t * @param orders\n\t *            排序\n\t * @return 实体对象集合\n\t */\n\tpublic List<M> findList(Integer first, Integer count, List<Filter> filters, List<Order> orders) {\n\t\tString sql = \"SELECT * FROM `\" + getTableName() + \"` WHERE 1 = 1 \";\n\t\treturn findList(sql, first, count, filters, orders);\n\t}\n\n\t/**\n\t * 查找实体对象集合\n\t *\n\t * @param sql\n\t *            查询条件\n\t * @param first\n\t *            起始记录\n\t * @param count\n\t *            数量\n\t * @param filters\n\t *            筛选\n\t * @param orders\n\t *            排序\n\t * @return 实体对象集合\n\t */\n\tprotected List<M> findList(String sql, Integer first, Integer count, List<Filter> filters, List<Order> orders) {\n\t\tAssert.notNull(sql, \"baseDao findList sql cannot null\");\n\n\t\tString sqlFilters = getFilters(filters);\n\t\tsql += sqlFilters;\n\n\t\tString sqlOrders = getOrders(orders);\n\t\tsql += sqlOrders;\n\n\t\tif (first != null && count != null) {\n\t\t\tsql += \" LIMIT \" + first + \", \" + count;\n\t\t}\n\t\treturn modelManager.find(sql);\n\t}\n\n\t/**\n\t * 转换为Predicate\n\t *\n\t * @param filters\n\t *            筛选\n\t * @return Predicate\n\t */\n\tprivate String getFilters(List<Filter> filters) {\n\t\tString sql = \"\";\n\t\tif (CollectionUtils.isEmpty(filters)) {\n\t\t\treturn \"\";\n\t\t}\n\t\tfor (Filter filter : filters) {\n\t\t\tif (filter == null) {\n\t\t\t\tcontinue;\n\t\t\t}\n\t\t\tString property = filter.getProperty();\n\t\t\tFilter.Operator operator = filter.getOperator();\n\t\t\tObject value = filter.getValue();\n\t\t\tBoolean ignoreCase = filter.getIgnoreCase();\n\t\t\tswitch (operator) {\n\t\t\t\tcase eq:\n\t\t\t\t\tif (value != null) {\n\t\t\t\t\t\tif (BooleanUtils.isTrue(ignoreCase) && value instanceof String) {\n\t\t\t\t\t\t\tsql +=\" AND \"+  property + \" = \" + ((String) value).toLowerCase();\n\t\t\t\t\t\t} else {\n\t\t\t\t\t\t\tsql +=\" AND \"+ property + \" = \" + value;\n\t\t\t\t\t\t}\n\t\t\t\t\t} else {\n\t\t\t\t\t\tsql +=\" AND \"+ property + \" IS NULL \";\n\t\t\t\t\t}\n\t\t\t\t\tbreak;\n\t\t\t\tcase ne:\n\t\t\t\t\tif (value != null) {\n\t\t\t\t\t\tif (BooleanUtils.isTrue(ignoreCase) && value instanceof String) {\n\t\t\t\t\t\t\tsql +=\" AND \"+ property + \" != \" + ((String) value).toLowerCase();\n\t\t\t\t\t\t} else {\n\t\t\t\t\t\t\tsql +=\" AND \"+ property + \" != \" + value;\n\t\t\t\t\t\t}\n\t\t\t\t\t} else {\n\t\t\t\t\t\tsql +=\" AND \"+ property + \" IS NOT NULL \";\n\t\t\t\t\t}\n\t\t\t\t\tbreak;\n\t\t\t\tcase gt:\n\t\t\t\t\tif (value instanceof Number) {\n\t\t\t\t\t\tsql +=\" AND \"+ property + \" > \" + (Number) value;\n\t\t\t\t\t}\n\t\t\t\t\tbreak;\n\t\t\t\tcase lt:\n\t\t\t\t\tif (value instanceof Number) {\n\t\t\t\t\t\tsql +=\" AND \"+ property + \" < \" + (Number) value;\n\t\t\t\t\t}\n\t\t\t\t\tbreak;\n\t\t\t\tcase ge:\n\t\t\t\t\tif (value instanceof Number) {\n\t\t\t\t\t\tsql +=\" AND \"+ property + \" >= \" + (Number) value;\n\t\t\t\t\t}\n\t\t\t\t\tbreak;\n\t\t\t\tcase le:\n\t\t\t\t\tif (value instanceof Number) {\n\t\t\t\t\t\tsql +=\" AND \"+ property + \" <= \" + (Number) value;\n\t\t\t\t\t}\n\t\t\t\t\tbreak;\n\t\t\t\tcase like:\n\t\t\t\t\tif (value instanceof String) {\n\t\t\t\t\t\tif (BooleanUtils.isTrue(ignoreCase)) {\n\t\t\t\t\t\t\tsql += \" AND \" + property + \" LIKE '%\" + ((String) value).toLowerCase() + \"'\";\n\t\t\t\t\t\t} else {\n\t\t\t\t\t\t\tsql += \" AND \" + property + \" LIKE '%\" + (String) value + \"'\";\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t\tbreak;\n\t\t\t\tcase in:\n\t\t\t\t\tsql +=\" AND \"+ property + \" IN(\" + value + \")\";\n\t\t\t\t\tbreak;\n\t\t\t\tcase isNull:\n\t\t\t\t\tsql +=\" AND \"+ property + \" IS NULL\";\n\t\t\t\t\tbreak;\n\t\t\t\tcase isNotNull:\n\t\t\t\t\tsql +=\" AND \"+ property + \" IS NOT NULL\";\n\t\t\t\t\tbreak;\n\t\t\t}\n\t\t}\n\t\treturn sql;\n\t}\n\n\t/**\n\t * 转换为Order\n\t *\n\t * @param orders\n\t *            排序\n\t * @return Order\n\t */\n\tprivate String getOrders(List<Order> orders) {\n\t\tString orderSql = \"\";\n\t\tif (!CollectionUtils.isEmpty(orders)) {\n\t\t\torderSql = \" ORDER BY \";\n\t\t\tfor (Order order : orders) {\n\t\t\t\tString property = order.getProperty();\n\t\t\t\tOrder.Direction direction = order.getDirection();\n\t\t\t\tswitch (direction) {\n\t\t\t\t\tcase asc:\n\t\t\t\t\t\torderSql += property + \" ASC, \";\n\t\t\t\t\t\tbreak;\n\t\t\t\t\tcase desc:\n\t\t\t\t\t\torderSql += property + \" DESC,\";\n\t\t\t\t\t\tbreak;\n\t\t\t\t}\n\t\t\t}\n\t\t\torderSql = StringUtils.substring(orderSql, 0, orderSql.length() - 1);\n\t\t}\n\t\treturn orderSql;\n\t}\n\n\tpublic Page<M> paginate(Integer pageNum, Integer pageSize, Filter filter, Order order) {\n\t\tList<Filter> filters = new ArrayList<>();\n\t\tfilters.add(filter);\n\t\tList<Order> orders = new ArrayList<>();\n\t\torders.add(order);\n\t\tPage<M> pr = this.paginate(pageNum, pageSize, filters, orders);\n\t\treturn pr;\n\t}\n\n\tpublic Page<M> paginate(Integer pageNum, Integer pageSize) {\n\t\tList<Filter> filters = new ArrayList<>();\n\t\tList<Order> orders = new ArrayList<>();\n\t\tPage<M> pr = this.paginate(pageNum, pageSize, filters, orders);\n\t\treturn pr;\n\t}\n\n\tpublic Page<M> paginate(Integer pageNum, Integer pageSize, List<Filter> filters, Order order) {\n\t\tList<Order> orders = new ArrayList<>();\n\t\tif (order != null) {\n\t\t\torders.add(order);\n\t\t}\n\t\tPage<M> pr = this.paginate(pageNum, pageSize, filters, orders);\n\t\treturn pr;\n\t}\n\n\tpublic Page<M> paginate(Integer pageNum, Integer pageSize, List<Filter> filters) {\n\t\tList<Order> orders = new ArrayList<>();\n\t\tPage<M> pr = this.paginate(pageNum, pageSize, filters, orders);\n\t\treturn pr;\n\t}\n\n\tpublic Page<M> paginate(Integer pageNum, Integer pageSize, List<Filter> filters, List<Order> orders) {\n\t\tSqlPara sqlPara = Db.getSqlPara(\"common.findList\", Kv.by(\"filters\", filters).set(\"orders\", orders).set(\"tableName\", this.getTableName()));\n\t\tPage<M> pr = this.modelManager.paginate(pageNum, pageSize, sqlPara);\n\t\treturn pr;\n\t}\n\n\tpublic Page<M> paginate(Integer pageNum, Integer pageSize, Filter filter, List<Order> orders) {\n\t\tList<Filter> filters = new ArrayList<>();\n\t\tfilters.add(filter);\n\t\tPage<M> pr = this.paginate(pageNum, pageSize, filters, orders);\n\t\treturn pr;\n\t}\n\n\tpublic boolean deleteBatch(Object[]... ids) {\n\t\treturn this.deleteBatch(null, ids);\n\t}\n\n\tpublic boolean deleteBatch(String[] columns, Object[]... ids) {\n\t\tString[] primaryKeys = columns;\n\t\tif (columns == null) {\n\t\t\tprimaryKeys = this.getPrimaryKeys();\n\t\t}\n\n\t\tSqlPara sqlPara = Db.getSqlPara(\"common.deleteBatch\", Kv.by(\"ids\", ids).set(\"primaryKeys\", primaryKeys).set(\"tableName\", this.getTableName()));\n\t\treturn Db.update(sqlPara) > 0;\n\t}\n\n\tpublic M findFirst(SqlPara sqlPara) {\n\t\treturn this.modelManager.findFirst(sqlPara);\n\t}\n\n\tpublic List<M> find(SqlPara sqlPara) {\n\t\treturn this.modelManager.find(sqlPara);\n\t}\n\n}"
  },
  {
    "path": "src/main/java/io/sdb/dao/CampaignDao.java",
    "content": "package io.sdb.dao;\n\nimport io.sdb.dao.BaseDao;\nimport io.sdb.model.Campaign;\nimport org.springframework.stereotype.Component;\n\n@Component\npublic class CampaignDao extends BaseDao<Campaign> {\n    public CampaignDao() {\n        super(Campaign.class);\n    }\n}"
  },
  {
    "path": "src/main/java/io/sdb/dao/CartDao.java",
    "content": "package io.sdb.dao;\n\nimport io.sdb.model.Cart;\nimport io.sdb.model.Goods;\nimport org.springframework.stereotype.Component;\n\n@Component\npublic class CartDao extends BaseDao<Cart> {\n    public CartDao() {\n        super(Cart.class);\n    }\n}\n"
  },
  {
    "path": "src/main/java/io/sdb/dao/DeliveryCorpDao.java",
    "content": "package io.sdb.dao;\n\nimport com.jfinal.plugin.activerecord.Db;\nimport io.sdb.common.annotation.JFinalTx;\nimport io.sdb.enums.SnEnum;\nimport io.sdb.model.DeliveryCorp;\nimport io.sdb.model.Sn;\nimport org.apache.commons.lang3.time.DateFormatUtils;\nimport org.springframework.stereotype.Component;\n\nimport java.util.Date;\n\n/**\n * Dao - 序列号\n * \n * \n */\n@Component\npublic class DeliveryCorpDao extends BaseDao<DeliveryCorp> {\n\n\t/**\n\t * 构造方法\n\t */\n\tpublic DeliveryCorpDao() {\n\t\tsuper(DeliveryCorp.class);\n\t}\n}"
  },
  {
    "path": "src/main/java/io/sdb/dao/FavoriteGoodsDao.java",
    "content": "package io.sdb.dao;\n\nimport io.sdb.dao.BaseDao;\nimport io.sdb.model.FavoriteGoods;\nimport org.springframework.stereotype.Component;\n\n@Component\npublic class FavoriteGoodsDao extends BaseDao<FavoriteGoods> {\n    public FavoriteGoodsDao() {\n        super(FavoriteGoods.class);\n    }\n}"
  },
  {
    "path": "src/main/java/io/sdb/dao/GoodsDao.java",
    "content": "package io.sdb.dao;\n\nimport io.sdb.model.Goods;\nimport org.springframework.stereotype.Component;\n\n@Component\npublic class GoodsDao extends BaseDao<Goods> {\n    public GoodsDao() {\n        super(Goods.class);\n    }\n}\n"
  },
  {
    "path": "src/main/java/io/sdb/dao/GrouponDao.java",
    "content": "package io.sdb.dao;\n\nimport io.sdb.dao.BaseDao;\nimport io.sdb.model.Groupon;\nimport org.springframework.stereotype.Component;\n\n@Component\npublic class GrouponDao extends BaseDao<Groupon> {\n    public GrouponDao() {\n        super(Groupon.class);\n    }\n}"
  },
  {
    "path": "src/main/java/io/sdb/dao/GrouponTeamDao.java",
    "content": "package io.sdb.dao;\n\nimport io.sdb.dao.BaseDao;\nimport io.sdb.model.GrouponTeam;\nimport org.springframework.stereotype.Component;\n\n@Component\npublic class GrouponTeamDao extends BaseDao<GrouponTeam> {\n    public GrouponTeamDao() {\n        super(GrouponTeam.class);\n    }\n}"
  },
  {
    "path": "src/main/java/io/sdb/dao/LogisticsDao.java",
    "content": "package io.sdb.dao;\n\nimport io.sdb.dao.BaseDao;\nimport io.sdb.model.Logistics;\nimport org.springframework.stereotype.Component;\n\n@Component\npublic class LogisticsDao extends BaseDao<Logistics> {\n    public LogisticsDao() {\n        super(Logistics.class);\n    }\n}"
  },
  {
    "path": "src/main/java/io/sdb/dao/OrderDetailDao.java",
    "content": "package io.sdb.dao;\n\nimport io.sdb.model.OrderDetail;\nimport io.sdb.model.OrderMaster;\nimport org.springframework.stereotype.Component;\n\n@Component\npublic class OrderDetailDao extends BaseDao<OrderDetail> {\n    public OrderDetailDao() {\n        super(OrderDetail.class);\n    }\n}\n"
  },
  {
    "path": "src/main/java/io/sdb/dao/OrderMasterDao.java",
    "content": "package io.sdb.dao;\n\nimport io.sdb.model.Cart;\nimport io.sdb.model.OrderMaster;\nimport org.springframework.stereotype.Component;\n\n@Component\npublic class OrderMasterDao extends BaseDao<OrderMaster> {\n    public OrderMasterDao() {\n        super(OrderMaster.class);\n    }\n}\n"
  },
  {
    "path": "src/main/java/io/sdb/dao/ProductCategoryDao.java",
    "content": "package io.sdb.dao;\n\nimport com.jfinal.plugin.activerecord.Db;\nimport com.jfinal.plugin.activerecord.SqlPara;\nimport io.sdb.model.Goods;\nimport io.sdb.model.ProductCategory;\nimport org.springframework.stereotype.Component;\n\nimport java.util.List;\n\n@Component\npublic class ProductCategoryDao extends BaseDao<ProductCategory> {\n    public ProductCategoryDao() {\n        super(ProductCategory.class);\n    }\n\n    public List<ProductCategory> queryListOrder(){\n        SqlPara sqlPara = Db.getSqlPara(\"productCategory.queryListOrder\");\n        return this.find(sqlPara);\n    }\n}\n"
  },
  {
    "path": "src/main/java/io/sdb/dao/ProductDao.java",
    "content": "package io.sdb.dao;\n\nimport io.sdb.model.Cart;\nimport io.sdb.model.Product;\nimport org.springframework.stereotype.Component;\n\n@Component\npublic class ProductDao extends BaseDao<Product> {\n    public ProductDao() {\n        super(Product.class);\n    }\n}\n"
  },
  {
    "path": "src/main/java/io/sdb/dao/ReceiverDao.java",
    "content": "package io.sdb.dao;\n\nimport io.sdb.model.Receiver;\nimport org.springframework.stereotype.Component;\n\n@Component\npublic class ReceiverDao extends BaseDao<Receiver> {\n    public ReceiverDao() {\n        super(Receiver.class);\n    }\n}\n"
  },
  {
    "path": "src/main/java/io/sdb/dao/ScheduleJobDao.java",
    "content": "package io.sdb.dao;\n\nimport io.sdb.model.ScheduleJob;\nimport org.springframework.stereotype.Component;\n\n@Component\npublic class ScheduleJobDao extends BaseDao<ScheduleJob> {\n    public ScheduleJobDao() {\n        super(ScheduleJob.class);\n    }\n}\n"
  },
  {
    "path": "src/main/java/io/sdb/dao/ScheduleJobLogDao.java",
    "content": "package io.sdb.dao;\n\nimport io.sdb.model.ScheduleJobLog;\nimport org.springframework.stereotype.Component;\n\n@Component\npublic class ScheduleJobLogDao extends BaseDao<ScheduleJobLog> {\n    public ScheduleJobLogDao() {\n        super(ScheduleJobLog.class);\n    }\n}\n"
  },
  {
    "path": "src/main/java/io/sdb/dao/SnDao.java",
    "content": "package io.sdb.dao;\n\nimport com.jfinal.plugin.activerecord.Db;\nimport io.sdb.common.annotation.JFinalTx;\nimport io.sdb.enums.SnEnum;\nimport io.sdb.model.Sn;\nimport org.apache.commons.lang3.time.DateFormatUtils;\nimport org.springframework.stereotype.Component;\n\nimport java.util.Date;\n\n/**\n * Dao - 序列号\n * \n * \n */\n@Component\npublic class SnDao extends BaseDao<Sn> {\n\t\n\t/**\n\t * 构造方法\n\t */\n\tpublic SnDao() {\n\t\tsuper(Sn.class);\n\t}\n\n\tprivate String goodsPrefix = \"yyyyMMdd\";\n\tprivate int goodsMaxLo = 100;\n\tprivate String productPrefix = \"yyyyMMdd\";\n\tprivate int productMaxLo = 100;\n\tprivate String orderMasterPrefix = \"yyyyMMdd\";\n\tprivate int orderMasterMaxLo = 100;\n\tprivate String orderDetailPrefix = \"yyyyMMdd\";\n\tprivate int orderDetailMaxLo = 100;\n\tprivate String userPrefix = \"yyyyMMdd\";\n\tprivate int userMaxLo = 100;\n\tprivate String grouponPrefix = \"yyyyMMdd\";\n\tprivate int grouponMaxLo = 100;\n\n\t/** 货品编号生成器 */\n\tprivate HiloOptimizer goodsHiloOptimizer = new HiloOptimizer(SnEnum.GOODS, goodsPrefix, goodsMaxLo);\n\tprivate HiloOptimizer productHiloOptimizer = new HiloOptimizer(SnEnum.PRODUCT, productPrefix, productMaxLo);\n\tprivate HiloOptimizer orderMasterHiloOptimizer = new HiloOptimizer(SnEnum.ORDER_MASTER, orderMasterPrefix, orderMasterMaxLo);\n\tprivate HiloOptimizer orderDetailHiloOptimizer = new HiloOptimizer(SnEnum.ORDER_DETAIL, orderDetailPrefix, orderDetailMaxLo);\n\tprivate HiloOptimizer userHiloOptimizer = new HiloOptimizer(SnEnum.USER, userPrefix, userMaxLo);\n\tprivate HiloOptimizer grouponHiloOptimizer = new HiloOptimizer(SnEnum.GROUPON, grouponPrefix, grouponMaxLo);\n\n\t/**\n\t * 生成序列号\n\t * \n\t * @param type\n\t *            类型\n\t * @return 序列号\n\t */\n\tpublic String generate(SnEnum type) {\n\t\tswitch (type) {\n\t\t\tcase GOODS:\n\t\t\t\treturn goodsHiloOptimizer.generate();\n\t\t\tcase PRODUCT:\n\t\t\t\treturn productHiloOptimizer.generate();\n\t\t\tcase ORDER_MASTER:\n\t\t\t\treturn orderMasterHiloOptimizer.generate();\n\t\t\tcase ORDER_DETAIL:\n\t\t\t\treturn orderDetailHiloOptimizer.generate();\n\t\t\tcase USER:\n\t\t\t\treturn userHiloOptimizer.generate();\n\t\t\tcase GROUPON:\n\t\t\t\treturn grouponHiloOptimizer.generate();\n\t\t}\n\t\treturn null;\n\t}\n\n\t/**\n\t * 获取末值\n\t * \n\t * @param type\n\t *            类型\n\t * @return 末值\n\t */\n\t@JFinalTx\n\tprivate long getLastValue(SnEnum type) {\n\t\tString sql = \"SELECT * FROM sn WHERE type = ?\";\n\t\tSn sn = modelManager.findFirst(sql, type.getCode());\n\t\tlong lastValue = sn.getLastValue();\n\t\tString updateSql = \"UPDATE sn SET last_value = ? WHERE type = ? AND last_value = ?\";\n\t\tint result = Db.update(updateSql, lastValue + 1, type.getCode(), lastValue);\n\t\treturn 0 < result ? lastValue : getLastValue(type);\n\t}\n\n\t\n\t/**\n\t * 高低位算法生成器\n\t */\n\tprivate class HiloOptimizer {\n\n\t\t/** 类型 */\n\t\tprivate SnEnum type;\n\n\t\t/** 前缀 */\n\t\tprivate String prefix;\n\n\t\t/** 最大低位值 */\n\t\tprivate int maxLo;\n\n\t\t/** 低位值 */\n\t\tprivate int lo;\n\n\t\t/** 高位值 */\n\t\tprivate long hi;\n\n\t\t/** 末值 */\n\t\tprivate long lastValue;\n\n\t\t/**\n\t\t * 构造方法\n\t\t * \n\t\t * @param type\n\t\t *            类型\n\t\t * @param prefix\n\t\t *            前缀\n\t\t * @param maxLo\n\t\t *            最大低位值\n\t\t */\n\t\tpublic HiloOptimizer(SnEnum type, String prefix, int maxLo) {\n\t\t\tthis.type = type;\n\t\t\tthis.prefix = prefix != null ? prefix : \"\";\n\t\t\tthis.maxLo = maxLo;\n\t\t\tthis.lo = maxLo + 1;\n\t\t}\n\n\t\tpublic String getDate(String pattern) {\n\t\t\treturn DateFormatUtils.format(new Date(), pattern);\n\t\t}\n\n\t\t/**\n\t\t * 生成序列号\n\t\t * \n\t\t * @return 序列号\n\t\t */\n\t\tpublic synchronized String generate() {\n\t\t\tif (lo > maxLo) {\n\t\t\t\tlastValue = getLastValue(type);\n\t\t\t\tlo = lastValue == 0 ? 1 : 0;\n\t\t\t\thi = lastValue * (maxLo + 1);\n\t\t\t}\n\t\t\treturn this.getDate(prefix) + type.getCode() + (hi + lo++);\n\t\t}\n\t}\n}"
  },
  {
    "path": "src/main/java/io/sdb/dao/SpecificationDao.java",
    "content": "package io.sdb.dao;\n\nimport io.sdb.model.ProductCategory;\nimport io.sdb.model.Specification;\nimport org.springframework.stereotype.Component;\n\n@Component\npublic class SpecificationDao extends BaseDao<Specification> {\n    public SpecificationDao() {\n        super(Specification.class);\n    }\n}\n"
  },
  {
    "path": "src/main/java/io/sdb/dao/SysCaptchaDao.java",
    "content": "package io.sdb.dao;\n\nimport io.sdb.model.SysCaptcha;\nimport org.springframework.stereotype.Component;\n\n@Component\npublic class SysCaptchaDao extends BaseDao<SysCaptcha> {\n    public SysCaptchaDao() {\n        super(SysCaptcha.class);\n    }\n}\n"
  },
  {
    "path": "src/main/java/io/sdb/dao/SysConfigDao.java",
    "content": "package io.sdb.dao;\n\nimport io.sdb.model.SysConfig;\nimport org.springframework.stereotype.Component;\n\n@Component\npublic class SysConfigDao extends BaseDao<SysConfig> {\n    public SysConfigDao() {\n        super(SysConfig.class);\n    }\n}\n"
  },
  {
    "path": "src/main/java/io/sdb/dao/SysLogDao.java",
    "content": "package io.sdb.dao;\n\nimport io.sdb.model.SysLog;\nimport org.springframework.stereotype.Component;\n\n@Component\npublic class SysLogDao extends BaseDao<SysLog> {\n    public SysLogDao() {\n        super(SysLog.class);\n    }\n}\n"
  },
  {
    "path": "src/main/java/io/sdb/dao/SysMenuDao.java",
    "content": "package io.sdb.dao;\n\nimport com.jfinal.plugin.activerecord.Db;\nimport com.jfinal.plugin.activerecord.SqlPara;\nimport io.sdb.model.SysMenu;\nimport org.springframework.stereotype.Component;\n\nimport java.util.List;\n\n@Component\npublic class SysMenuDao extends BaseDao<SysMenu> {\n    public SysMenuDao() {\n        super(SysMenu.class);\n    }\n\n    public List<SysMenu> queryNotButtonList() {\n        SqlPara sqlPara = Db.getSqlPara(\"sysMenu.queryNotButtonList\");\n        return this.find(sqlPara);\n    }\n}\n"
  },
  {
    "path": "src/main/java/io/sdb/dao/SysOssDao.java",
    "content": "package io.sdb.dao;\n\nimport io.sdb.model.SysOss;\nimport org.springframework.stereotype.Component;\n\n@Component\npublic class SysOssDao extends BaseDao<SysOss> {\n    public SysOssDao() {\n        super(SysOss.class);\n    }\n}\n"
  },
  {
    "path": "src/main/java/io/sdb/dao/SysRoleDao.java",
    "content": "package io.sdb.dao;\n\nimport io.sdb.model.SysRole;\nimport org.springframework.stereotype.Component;\n\n@Component\npublic class SysRoleDao extends BaseDao<SysRole> {\n    public SysRoleDao() {\n        super(SysRole.class);\n    }\n}\n"
  },
  {
    "path": "src/main/java/io/sdb/dao/SysRoleMenuDao.java",
    "content": "package io.sdb.dao;\n\nimport io.sdb.model.SysRoleMenu;\nimport org.springframework.stereotype.Component;\n\n@Component\npublic class SysRoleMenuDao extends BaseDao<SysRoleMenu> {\n    public SysRoleMenuDao() {\n        super(SysRoleMenu.class);\n    }\n}\n"
  },
  {
    "path": "src/main/java/io/sdb/dao/SysUserDao.java",
    "content": "package io.sdb.dao;\n\nimport com.jfinal.kit.Kv;\nimport com.jfinal.plugin.activerecord.Db;\nimport com.jfinal.plugin.activerecord.Record;\nimport com.jfinal.plugin.activerecord.SqlPara;\nimport io.sdb.model.SysUser;\nimport org.springframework.stereotype.Component;\n\nimport java.util.ArrayList;\nimport java.util.List;\n\n@Component\npublic class SysUserDao extends BaseDao<SysUser> {\n    public SysUserDao() {\n        super(SysUser.class);\n    }\n\n    public List<String> queryAllPerms(Long userId) {\n        SqlPara sqlPara = Db.getSqlPara(\"sysUser.queryAllPerms\", Kv.by(\"userId\", userId));\n        List<Record> sysUserList = Db.find(sqlPara);\n        List<String> perms = new ArrayList<>();\n        for (Record r:sysUserList\n             ) {\n            if(r == null || r.get(\"perms\") == null) {\n                continue;\n            }\n            perms.add(r.get(\"perms\"));\n        }\n\n        return perms;\n    }\n\n    public List<Long> queryAllMenuId(Long userId) {\n        SqlPara sqlPara = Db.getSqlPara(\"sysUser.queryAllMenuId\", Kv.by(\"userId\", userId));\n        List<Record> sysMenuList = Db.find(sqlPara);\n        List<Long> menuIds = new ArrayList<>();\n        for (Record r:sysMenuList\n             ) {\n            if(r == null || r.get(\"menu_id\") == null) {\n                continue;\n            }\n            menuIds.add(r.get(\"menu_id\"));\n        }\n\n        return menuIds;\n    }\n\n    public SysUser queryByUserName(String name) {\n        SqlPara sqlPara = Db.getSqlPara(\"sysUser.queryByUserName\", Kv.by(\"username\", name));\n        SysUser sysUserList = this.findFirst(sqlPara);\n        return sysUserList;\n    }\n}\n"
  },
  {
    "path": "src/main/java/io/sdb/dao/SysUserRoleDao.java",
    "content": "package io.sdb.dao;\n\nimport io.sdb.model.SysUserRole;\nimport org.springframework.stereotype.Component;\n\n@Component\npublic class SysUserRoleDao extends BaseDao<SysUserRole> {\n    public SysUserRoleDao() {\n        super(SysUserRole.class);\n    }\n}\n"
  },
  {
    "path": "src/main/java/io/sdb/dao/SysUserTokenDao.java",
    "content": "package io.sdb.dao;\n\nimport io.sdb.model.SysUserToken;\nimport org.springframework.stereotype.Component;\n\n@Component\npublic class SysUserTokenDao extends BaseDao<SysUserToken> {\n    public SysUserTokenDao() {\n        super(SysUserToken.class);\n    }\n}\n"
  },
  {
    "path": "src/main/java/io/sdb/dao/UserDao.java",
    "content": "package io.sdb.dao;\n\nimport io.sdb.model.User;\nimport org.springframework.stereotype.Component;\n\n@Component\npublic class UserDao extends BaseDao<User> {\n    public UserDao() {\n        super(User.class);\n    }\n}\n"
  },
  {
    "path": "src/main/java/io/sdb/datasources/DataSourceNames.java",
    "content": "package io.sdb.datasources;\n\n/**\n * 增加多数据源，在此配置\n *\n * @author chenshun\n * @email sunlightcs@gmail.com\n * @date 2017/8/18 23:46\n */\npublic interface DataSourceNames {\n    String FIRST = \"first\";\n    String SECOND = \"second\";\n\n}\n"
  },
  {
    "path": "src/main/java/io/sdb/datasources/DynamicDataSource.java",
    "content": "package io.sdb.datasources;\n\nimport org.springframework.jdbc.datasource.lookup.AbstractRoutingDataSource;\n\nimport javax.sql.DataSource;\nimport java.util.Map;\n\n/**\n * 动态数据源\n * @author chenshun\n * @email sunlightcs@gmail.com\n * @date 2017/8/19 1:03\n */\npublic class DynamicDataSource extends AbstractRoutingDataSource {\n    private static final ThreadLocal<String> contextHolder = new ThreadLocal<>();\n\n    public DynamicDataSource(DataSource defaultTargetDataSource, Map<Object, Object> targetDataSources) {\n        super.setDefaultTargetDataSource(defaultTargetDataSource);\n        super.setTargetDataSources(targetDataSources);\n        super.afterPropertiesSet();\n    }\n\n    @Override\n    protected Object determineCurrentLookupKey() {\n        return getDataSource();\n    }\n\n    public static void setDataSource(String dataSource) {\n        contextHolder.set(dataSource);\n    }\n\n    public static String getDataSource() {\n        return contextHolder.get();\n    }\n\n    public static void clearDataSource() {\n        contextHolder.remove();\n    }\n\n}\n"
  },
  {
    "path": "src/main/java/io/sdb/datasources/DynamicDataSourceConfig.java",
    "content": "package io.sdb.datasources;\n\nimport com.alibaba.druid.filter.Filter;\nimport com.alibaba.druid.filter.stat.StatFilter;\nimport com.alibaba.druid.pool.DruidDataSource;\nimport com.alibaba.druid.spring.boot.autoconfigure.DruidDataSourceBuilder;\nimport com.alibaba.druid.wall.WallConfig;\nimport com.alibaba.druid.wall.WallFilter;\nimport com.google.common.collect.Lists;\nimport lombok.extern.slf4j.Slf4j;\nimport org.springframework.boot.context.properties.ConfigurationProperties;\nimport org.springframework.context.annotation.Bean;\nimport org.springframework.context.annotation.Configuration;\nimport org.springframework.context.annotation.Primary;\n\nimport javax.sql.DataSource;\nimport java.util.HashMap;\nimport java.util.Map;\n\n/**\n * 配置多数据源\n * @author chenshun\n * @email sunlightcs@gmail.com\n * @date 2017/8/19 0:41\n */\n@Configuration\n@Slf4j\npublic class DynamicDataSourceConfig {\n\n    @Bean\n    @ConfigurationProperties(\"spring.datasource.druid.first\")\n    public DruidDataSource firstDataSource(){\n        DruidDataSource druidDataSource = DruidDataSourceBuilder.create().build();\n        return druidDataSource;\n    }\n\n    public DruidDataSource profileDataSource(){\n        DruidDataSource druidDataSource = DruidDataSourceBuilder.create().build();\n        druidDataSource.setProxyFilters(Lists.newArrayList(statFilter()));\n        return druidDataSource;\n    }\n\n    public Filter statFilter() {\n        StatFilter filter = new StatFilter();\n        filter.setSlowSqlMillis(2000);\n        filter.setLogSlowSql(true);\n        filter.setMergeSql(true);\n        WallFilter filter1 = new WallFilter();\n        WallConfig wallConfig = new WallConfig();\n        wallConfig.setMultiStatementAllow(true);\n        filter1.setConfig(wallConfig);\n        return filter;\n    }\n\n    @Bean\n    @ConfigurationProperties(\"spring.datasource.druid.second\")\n    public DruidDataSource secondDataSource(){\n        return DruidDataSourceBuilder.create().build();\n    }\n\n    @Bean\n    @Primary\n    public DynamicDataSource dataSource(DataSource firstDataSource, DataSource secondDataSource) {\n        Map<Object, Object> targetDataSources = new HashMap<>();\n        targetDataSources.put(DataSourceNames.FIRST, firstDataSource);\n        targetDataSources.put(DataSourceNames.SECOND, secondDataSource);\n        return new DynamicDataSource(firstDataSource, targetDataSources);\n    }\n}\n"
  },
  {
    "path": "src/main/java/io/sdb/datasources/annotation/DataSource.java",
    "content": "package io.sdb.datasources.annotation;\n\nimport java.lang.annotation.*;\n\n/**\n * 多数据源注解\n * @author chenshun\n * @email sunlightcs@gmail.com\n * @date 2017/9/16 22:16\n */\n@Target(ElementType.METHOD)\n@Retention(RetentionPolicy.RUNTIME)\n@Documented\npublic @interface DataSource {\n    String name() default \"\";\n}\n"
  },
  {
    "path": "src/main/java/io/sdb/datasources/aspect/DataSourceAspect.java",
    "content": "package io.sdb.datasources.aspect;\n\nimport io.sdb.datasources.DataSourceNames;\nimport io.sdb.datasources.DynamicDataSource;\nimport io.sdb.datasources.annotation.DataSource;\nimport org.aspectj.lang.ProceedingJoinPoint;\nimport org.aspectj.lang.annotation.Around;\nimport org.aspectj.lang.annotation.Aspect;\nimport org.aspectj.lang.annotation.Pointcut;\nimport org.aspectj.lang.reflect.MethodSignature;\nimport org.slf4j.Logger;\nimport org.slf4j.LoggerFactory;\nimport org.springframework.core.Ordered;\nimport org.springframework.stereotype.Component;\n\nimport java.lang.reflect.Method;\n\n/**\n * 多数据源，切面处理类\n * @author chenshun\n * @email sunlightcs@gmail.com\n * @date 2017/9/16 22:20\n */\n@Aspect\n@Component\npublic class DataSourceAspect implements Ordered {\n    protected Logger logger = LoggerFactory.getLogger(getClass());\n\n    @Pointcut(\"@annotation(io.sdb.datasources.annotation.DataSource)\")\n    public void dataSourcePointCut() {\n\n    }\n\n    @Around(\"dataSourcePointCut()\")\n    public Object around(ProceedingJoinPoint point) throws Throwable {\n        MethodSignature signature = (MethodSignature) point.getSignature();\n        Method method = signature.getMethod();\n\n        DataSource ds = method.getAnnotation(DataSource.class);\n        if(ds == null){\n            DynamicDataSource.setDataSource(DataSourceNames.FIRST);\n            logger.debug(\"set datasource is \" + DataSourceNames.FIRST);\n        }else {\n            DynamicDataSource.setDataSource(ds.name());\n            logger.debug(\"set datasource is \" + ds.name());\n        }\n\n        try {\n            return point.proceed();\n        } finally {\n            DynamicDataSource.clearDataSource();\n            logger.debug(\"clean datasource\");\n        }\n    }\n\n    @Override\n    public int getOrder() {\n        return 1;\n    }\n}\n"
  },
  {
    "path": "src/main/java/io/sdb/dto/CartDTO.java",
    "content": "package io.sdb.dto;\n\nimport lombok.Data;\n\nimport java.math.BigDecimal;\n\n/**\n * 购物车\n * Created by yjjdick\n * 2017-06-11 19:37\n */\n@Data\npublic class CartDTO {\n    Integer id;\n\n    /** 商品Id. */\n    String productId;\n\n    /** 数量. */\n    Integer quantity;\n\n    BigDecimal price;\n\n    String name;\n\n    String caption;\n\n    String specificationValues;\n\n    String image;\n\n    String goodsId;\n\n    public CartDTO() {\n    }\n\n    public CartDTO(String productId, Integer productQuantity) {\n        this.productId = productId;\n        this.quantity = productQuantity;\n    }\n}\n"
  },
  {
    "path": "src/main/java/io/sdb/dto/FavoriteGoodsDTO.java",
    "content": "package io.sdb.dto;\n\nimport lombok.Data;\n\nimport java.math.BigDecimal;\n\n@Data\npublic class FavoriteGoodsDTO {\n    /** 商品Id. */\n    String goodsId;\n\n    BigDecimal price;\n\n    String name;\n\n    String caption;\n\n    String specificationValues;\n\n    String image;\n}\n"
  },
  {
    "path": "src/main/java/io/sdb/dto/GoodsDTO.java",
    "content": "package io.sdb.dto;\n\nimport io.sdb.model.Goods;\n\npublic class GoodsDTO extends Goods {\n}\n"
  },
  {
    "path": "src/main/java/io/sdb/dto/OrderDTO.java",
    "content": "package io.sdb.dto;\n\nimport com.fasterxml.jackson.annotation.JsonIgnore;\nimport com.fasterxml.jackson.databind.annotation.JsonSerialize;\nimport io.sdb.common.utils.EnumUtil;\nimport io.sdb.enums.OrderStatusEnum;\nimport io.sdb.enums.PayStatusEnum;\nimport io.sdb.model.OrderDetail;\nimport io.sdb.serializer.Date2LongSerializer;\nimport lombok.Data;\n\nimport java.math.BigDecimal;\nimport java.util.Date;\nimport java.util.List;\n\n/**\n * Created by yjjdick\n * 2017-06-11 18:30\n */\n@Data\n//@JsonSerialize(include = JsonSerialize.Inclusion.NON_NULL)\n//@JsonInclude(JsonInclude.Include.NON_NULL)\npublic class OrderDTO {\n\n    /** 订单id. */\n    private String orderId;\n\n    /** 买家名字. */\n    private String buyerName;\n\n    /** 买家手机号. */\n    private String buyerPhone;\n\n    /** 买家地址. */\n    private String buyerAddress;\n\n    /** 买家微信Openid. */\n    private String buyerOpenid;\n\n    /** 买家微信Openid. */\n    private String buyerId;\n\n    /** 订单总金额. */\n    private BigDecimal orderAmount;\n\n    /** 订单状态, 默认为0新下单. */\n    private Integer orderStatus;\n\n    /** 支付状态, 默认为0未支付. */\n    private Integer payStatus;\n\n    /** 买家备注 */\n    private String remark;\n\n    /** 是否需要开发 */\n    private Integer needInvoice;\n\n    private Integer invoiceType;\n    private String title;\n    private String taxNumber;\n    private String companyAddress;\n    private String telephone;\n    private String bankName;\n    private String bankAccount;\n    private String payTradeNo;\n    private String refundTradeNo;\n\n    private String trackingNumber;\n    private String deliveryCode;\n\n    private Integer groupon;\n    private String grouponId;\n    private Integer grouponCount;\n\n    /** 创建时间. */\n    @JsonSerialize(using = Date2LongSerializer.class)\n    private Date createTime;\n\n    /** 更新时间. */\n    @JsonSerialize(using = Date2LongSerializer.class)\n    private Date updateTime;\n\n    List<OrderDetail> orderDetailList;\n\n    @JsonIgnore\n    public OrderStatusEnum getOrderStatusEnum() {\n        return EnumUtil.getByCode(orderStatus, OrderStatusEnum.class);\n    }\n\n}\n"
  },
  {
    "path": "src/main/java/io/sdb/dto/ProductDTO.java",
    "content": "package io.sdb.dto;\n\nimport com.jfinal.plugin.activerecord.Model;\nimport lombok.Data;\n\nimport java.math.BigDecimal;\nimport java.util.Date;\n\n/**\n * 购物车\n * Created by yjjdick\n * 2017-06-11 19:37\n */\n@Data\npublic class ProductDTO {\n    String name;\n    String model;\n    String goodsSn;\n    String caption;\n    String image;\n    String specificationValues;\n    Integer stock;\n    String sn;\n    BigDecimal price;\n    BigDecimal groupPrice;\n    Integer enable;\n    Integer quantity;\n    Date createDate;\n}\n"
  },
  {
    "path": "src/main/java/io/sdb/enums/CampaignEnum.java",
    "content": "package io.sdb.enums;\n\nimport lombok.Getter;\n\n/**\n * Created by yjjdick\n * 2017-06-11 17:12\n */\n@Getter\npublic enum CampaignEnum implements IEnum {\n    GROUPON(1, \"团购\"),\n    ;\n\n    private Integer code;\n\n    private String message;\n\n    CampaignEnum(Integer code, String message) {\n        this.code = code;\n        this.message = message;\n    }\n}\n"
  },
  {
    "path": "src/main/java/io/sdb/enums/GeneralEnum.java",
    "content": "package io.sdb.enums;\n\nimport lombok.Getter;\n\n@Getter\npublic enum GeneralEnum {\n    TRUE(1,\"true\"),\n    FALSE(0,\"false\"),\n    ;\n\n    private Integer code;\n    private String message;\n    GeneralEnum(Integer code, String message){\n        this.code = code;\n        this.message = message;\n    }\n}\n"
  },
  {
    "path": "src/main/java/io/sdb/enums/GrouponStatusEnum.java",
    "content": "package io.sdb.enums;\n\nimport lombok.Getter;\n\n/**\n * Created by yjjdick\n * 2017-06-11 17:12\n */\n@Getter\npublic enum GrouponStatusEnum implements IEnum {\n    PENDING(0, \"等待开团\"),\n    OPEN(1, \"已开团\"),\n    CANCEL(2, \"取消\"),\n    ;\n\n    private Integer code;\n\n    private String message;\n\n    GrouponStatusEnum(Integer code, String message) {\n        this.code = code;\n        this.message = message;\n    }\n}\n"
  },
  {
    "path": "src/main/java/io/sdb/enums/IEnum.java",
    "content": "package io.sdb.enums;\n\npublic interface IEnum {\n    Integer getCode();\n    String getMessage();\n}\n"
  },
  {
    "path": "src/main/java/io/sdb/enums/Language.java",
    "content": "package io.sdb.enums;\n\nimport org.apache.commons.lang.StringUtils;\n\npublic enum Language {\n\n\tzh_CN((byte) 1, \"简体中文\"),\n\n\tzh_TW((byte) 2, \"繁体中文TW\"),\n\n\tzh_HK((byte) 3, \"繁体中文HK\"),\n\n\ten((byte) 4, \"英文\"),\n\n\tid((byte) 5, \"印尼\"),\n\n\tms((byte) 6, \"马来\"),\n\n\tes((byte) 7, \"西班牙\"),\n\n\tko((byte) 8, \"韩国\"),\n\n\tit((byte) 9, \"意大利\"),\n\n\tja((byte) 10, \"日本\"),\n\n\tpl((byte) 11, \"波兰\"),\n\n\tpt((byte) 12, \"葡萄牙\"),\n\n\tru((byte) 13, \"俄国\"),\n\n\tth((byte) 14, \"泰文\"),\n\n\tvi((byte) 15, \"越南\"),\n\n\tar((byte) 16, \"阿拉伯语\"),\n\n\thi((byte) 17, \"北印度\"),\n\n\the((byte) 18, \"希伯来\"),\n\n\ttr((byte) 19, \"土耳其\"),\n\n\tde((byte) 20, \"德语\"),\n\n\tFR((byte) 21, \"法语\"), ;\n\n\tprivate byte value;\n\n\tprivate String cnname;\n\n\t/**\n\t * @param value\n\t * @param cnname\n\t */\n\tprivate Language(byte value, String cnname) {\n\t\tthis.value = value;\n\t\tthis.cnname = cnname;\n\t}\n\n\tpublic byte getValue() {\n\t\treturn value;\n\t}\n\n\tpublic String getCnName() {\n\t\treturn cnname;\n\t}\n\n\tpublic void setValue(byte value) {\n\t\tthis.value = value;\n\t}\n\n\tpublic void setCnName(String cnname) {\n\t\tthis.cnname = cnname;\n\t}\n\n\tpublic static Language getValueByCnName(String cnname) {\n\t\tif (StringUtils.isBlank(cnname)) {\n\t\t\treturn null;\n\t\t}\n\t\tfor (Language language : Language.values()) {\n\t\t\tif (language.getCnName().equalsIgnoreCase(cnname)) {\n\t\t\t\treturn language;\n\t\t\t}\n\t\t}\n\t\treturn null;\n\t}\n\n\tpublic static Language getByValue(Byte value) {\n\t\tif (value == null) {\n\t\t\treturn null;\n\t\t}\n\t\tfor (Language language : Language.values()) {\n\t\t\tif (language.getValue() == value) {\n\t\t\t\treturn language;\n\t\t\t}\n\t\t}\n\t\treturn null;\n\t}\n\n\tpublic static Language getByEnumName(String enumName) {\n\t\tif (enumName == null) {\n\t\t\treturn null;\n\t\t}\n\t\tfor (Language language : Language.values()) {\n\t\t\tif (language.name().equals(enumName)) {\n\t\t\t\treturn language;\n\t\t\t}\n\t\t}\n\t\treturn null;\n\t}\n\n}\n"
  },
  {
    "path": "src/main/java/io/sdb/enums/OrderStatusEnum.java",
    "content": "package io.sdb.enums;\n\nimport lombok.Getter;\n\n/**\n * Created by yjjdick\n * 2017-06-11 17:12\n */\n@Getter\npublic enum OrderStatusEnum implements IEnum {\n    NEW(0, \"待发货\"),\n    SHIPPING(1, \"已发货\"),\n    FINISHED(2, \"已完成\"),\n    CANCEL(3, \"已取消\"),\n    GROUPON_PENDING(4, \"等待拼团\"),\n    GROUPON_SUCC(5, \"拼团成功\"),\n    ;\n\n    private Integer code;\n\n    private String message;\n\n    OrderStatusEnum(Integer code, String message) {\n        this.code = code;\n        this.message = message;\n    }\n}\n"
  },
  {
    "path": "src/main/java/io/sdb/enums/PayStatusEnum.java",
    "content": "package io.sdb.enums;\n\nimport lombok.Getter;\n\n/**\n * Created by yjjdick\n * 2017-06-11 17:16\n */\n@Getter\npublic enum PayStatusEnum implements IEnum {\n\n    WAIT(0, \"等待支付\"),\n    SUCCESS(1, \"支付成功\"),\n    REFUND(2, \"退款\"),\n\n    ;\n\n    private Integer code;\n\n    private String message;\n\n    PayStatusEnum(Integer code, String message) {\n        this.code = code;\n        this.message = message;\n    }\n}\n"
  },
  {
    "path": "src/main/java/io/sdb/enums/ProductStatusEnum.java",
    "content": "package io.sdb.enums;\n\nimport lombok.Getter;\n\n/**\n * 商品状态\n * Created by yjjdick\n * 2017-05-09 17:33\n */\n@Getter\npublic enum ProductStatusEnum implements IEnum {\n    UP(0, \"在架\"),\n    DOWN(1, \"下架\")\n    ;\n\n    private Integer code;\n\n    private String message;\n\n    ProductStatusEnum(Integer code, String message) {\n        this.code = code;\n        this.message = message;\n    }\n\n\n}\n"
  },
  {
    "path": "src/main/java/io/sdb/enums/ResultEnum.java",
    "content": "package io.sdb.enums;\n\nimport lombok.Getter;\n\n@Getter\npublic enum ResultEnum {\n    SYSTEM_SUCCESS(0,\"成功\"),//成功\n    SYSTM_ERROR(500, \"系统错误\"),//系统错误\n    PARAM_ERROR(1, \"参数不正确\"),//参数不正确\n    APPID_NULL(2, \"APPID缺失\"),//APPID缺失\n    MA_LOGIN_ERROR(1001, \"小程序登录失败\"),//小程序登录失败\n    VOLUNTEER_NOT_FOUND(1002, \"未找到志愿者\"),//未找到志愿者\n    VOLUNTEER_UPLOAD_FILE_BIG(1003, \"上传文件太大\"),//上传文件太大\n    RECVER_CANNOT_NULL(1004, \"收件人不能为空\"),//收件人不能为空\n    CART_CANNOT_NULL(1005, \"购物车不能为空\"),//购物车不能为空\n\n    PRODUCT_NOT_EXIST(2010, \"商品不存在\"),\n\n    PRODUCT_STOCK_ERROR(2011, \"商品库存不正确\"),\n\n    ORDER_NOT_EXIST(2012, \"订单不存在\"),\n\n    ORDERDETAIL_NOT_EXIST(2013, \"订单详情不存在\"),\n\n    ORDER_STATUS_ERROR(2014, \"订单状态不正确\"),\n\n    ORDER_UPDATE_FAIL(2015, \"订单更新失败\"),\n\n    ORDER_DETAIL_EMPTY(2016, \"订单详情为空\"),\n\n    ORDER_PAY_STATUS_ERROR(2017, \"订单支付状态不正确\"),\n\n    CART_EMPTY(2018, \"购物车为空\"),\n\n    ORDER_OWNER_ERROR(2019, \"该订单不属于当前用户\"),\n\n    WECHAT_MP_ERROR(2020, \"微信公众账号方面错误\"),\n\n    WXPAY_NOTIFY_MONEY_VERIFY_ERROR(2021, \"微信支付异步通知金额校验不通过\"),\n\n    ORDER_CANCEL_SUCCESS(2022, \"订单取消成功\"),\n\n    ORDER_FINISH_SUCCESS(2023, \"订单完结成功\"),\n\n    PRODUCT_STATUS_ERROR(2024, \"商品状态不正确\"),\n    GROUPON_USER_EXSITS(2025, \"不能重复参团\"),\n    GROUPON_NOT_ENOUGH(2026, \"拼团人数已满\"),\n    ;\n\n    private Integer code;\n    private String message;\n    ResultEnum(Integer code, String message){\n        this.code = code;\n        this.message = message;\n    }\n}\n"
  },
  {
    "path": "src/main/java/io/sdb/enums/SnEnum.java",
    "content": "package io.sdb.enums;\n\nimport lombok.Getter;\n\n@Getter\npublic enum SnEnum {\n    GOODS(1,\"goods\"),//货品sn\n    PRODUCT(2,\"product\"),//商品sn\n    ORDER_MASTER(3,\"order_master\"),//订单\n    ORDER_DETAIL(4,\"order_detail\"),//订单详情\n    USER(5,\"user\"),//微信用户\n    GROUPON(6,\"groupon\"),//拼团\n    ;\n\n    private Integer code;\n    private String message;\n    SnEnum(Integer code, String message){\n        this.code = code;\n        this.message = message;\n    }\n}\n"
  },
  {
    "path": "src/main/java/io/sdb/enums/VolunteerStateEnum.java",
    "content": "package io.sdb.enums;\n\nimport lombok.Getter;\n\n@Getter\npublic enum VolunteerStateEnum implements IEnum {\n    PENDING(0,\"VOLUNTEER_STATE_PENDING\"),//待审核\n    PASS(1,\"VOLUNTEER_STATE_PASS\"),//通过\n    REJUECT(2,\"VOLUNTEER_STATE_REJUECT\"),//拒绝\n    ;\n\n    private Integer code;\n    private String message;\n    VolunteerStateEnum(Integer code, String message){\n        this.code = code;\n        this.message = message;\n    }\n}\n"
  },
  {
    "path": "src/main/java/io/sdb/form/CartForm.java",
    "content": "package io.sdb.form;\n\nimport io.swagger.annotations.ApiModel;\nimport io.swagger.annotations.ApiModelProperty;\nimport lombok.Data;\n\nimport javax.validation.constraints.NotBlank;\nimport java.util.List;\n\n/**\n * Created by IntelliJ IDEA.\n * User: quendi\n * Date: 2018/6/4\n */\n@Data\npublic class CartForm {\n    String productId;\n    Integer quantity;\n    List<Long> cartItemIds;\n}\n"
  },
  {
    "path": "src/main/java/io/sdb/form/CheckOutForm.java",
    "content": "package io.sdb.form;\n\nimport lombok.Data;\n\nimport java.util.List;\n\n/**\n * Created by IntelliJ IDEA.\n * User: quendi\n * Date: 2018/6/4\n */\n@Data\npublic class CheckOutForm {\n    private List<Long> cartItemIds;\n    private List<ProductInfo> productInfos;\n    private InvoiceInfo invoiceInfo;\n    private ReceiveInfo receiveInfo;\n    private boolean needInvoice;\n    private boolean groupon;\n    private String grouponId;\n    private String remark;\n}\n"
  },
  {
    "path": "src/main/java/io/sdb/form/GoodsData.java",
    "content": "package io.sdb.form;\n\nimport lombok.Data;\n\nimport java.math.BigDecimal;\nimport java.util.List;\n\n@Data\npublic class GoodsData {\n    private String sn;\n    private String name;\n    private String model;\n    private String caption;\n    private String unit;\n    private boolean hasSpec;\n    private boolean groupon;\n    private Integer grouponCount;\n    private boolean delivery;\n    private boolean marketable;\n    private Integer productDefault;\n    private List<Long> categoryId;\n    private float weight;\n    private Integer stock;\n    private BigDecimal price;\n    private BigDecimal cost;\n    private List<String> introImageUrlArr;\n    private List<String> productImageUrlArr;\n    private List<GoodsSpecGroupData> specificationGroup;\n\n}\n"
  },
  {
    "path": "src/main/java/io/sdb/form/GoodsForm.java",
    "content": "/**\n * Copyright 2018\n * <p>\n * Licensed under the Apache License, Version 2.0 (the \"License\"); you may not\n * use this file except in compliance with the License. You may obtain a copy of\n * the License at\n * <p>\n * http://www.apache.org/licenses/LICENSE-2.0\n * <p>\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS, WITHOUT\n * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the\n * License for the specific language governing permissions and limitations under\n * the License.\n */\n\npackage io.sdb.form;\n\nimport lombok.Data;\n\nimport java.util.List;\n\n/**\n * 登录表单\n *\n * @author Mark sunlightcs@gmail.com\n * @since 2.0.0 2018-01-25\n */\n@Data\npublic class GoodsForm {\n    private GoodsData goods;\n    private List<GoodsParaData> paraList;\n    private List<GoodsSpecData> specList;\n}\n"
  },
  {
    "path": "src/main/java/io/sdb/form/GoodsListForm.java",
    "content": "package io.sdb.form;\n\nimport io.swagger.models.auth.In;\nimport lombok.Data;\n\nimport java.util.List;\n\n/**\n * Created by IntelliJ IDEA.\n * User: quendi\n * Date: 2018/6/4\n */\n@Data\npublic class GoodsListForm {\n    Integer pageNum;\n    Integer pageSize;\n    Integer categoryId;\n}\n"
  },
  {
    "path": "src/main/java/io/sdb/form/GoodsParaData.java",
    "content": "package io.sdb.form;\n\nimport lombok.Data;\n\nimport java.util.List;\n\n@Data\npublic class GoodsParaData {\n    private String name;\n    private List<GoodsParaEntryData> entries;\n}\n"
  },
  {
    "path": "src/main/java/io/sdb/form/GoodsParaEntryData.java",
    "content": "package io.sdb.form;\n\nimport lombok.Data;\n\n@Data\npublic class GoodsParaEntryData {\n    private String name;\n    private String value;\n}\n"
  },
  {
    "path": "src/main/java/io/sdb/form/GoodsSpecData.java",
    "content": "package io.sdb.form;\n\nimport lombok.Data;\n\nimport java.math.BigDecimal;\nimport java.util.List;\n\n@Data\npublic class GoodsSpecData {\n    private String sn;\n    private BigDecimal cost;\n    private BigDecimal price;\n    private BigDecimal groupPrice;\n    private Integer stock;\n    private Boolean enable;\n    private String specIds;\n}\n"
  },
  {
    "path": "src/main/java/io/sdb/form/GoodsSpecGroupData.java",
    "content": "package io.sdb.form;\n\nimport lombok.Data;\n\nimport java.math.BigDecimal;\nimport java.util.List;\n\n@Data\npublic class GoodsSpecGroupData {\n    private Long specificationName;\n    private List<Long> specificationEntries;\n}"
  },
  {
    "path": "src/main/java/io/sdb/form/InvoiceInfo.java",
    "content": "package io.sdb.form;\n\nimport lombok.Data;\n\nimport java.util.List;\n\n/**\n * Created by IntelliJ IDEA.\n * User: quendi\n * Date: 2018/6/4\n */\n@Data\npublic class InvoiceInfo {\n    private Integer type;\n    private String title;\n    private String taxNumber;\n    private String companyAddress;\n    private String telephone;\n    private String bankName;\n    private String bankAccount;\n}\n"
  },
  {
    "path": "src/main/java/io/sdb/form/LoginForm.java",
    "content": "/**\n * Copyright 2018\n * <p>\n * Licensed under the Apache License, Version 2.0 (the \"License\"); you may not\n * use this file except in compliance with the License. You may obtain a copy of\n * the License at\n * <p>\n * http://www.apache.org/licenses/LICENSE-2.0\n * <p>\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS, WITHOUT\n * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the\n * License for the specific language governing permissions and limitations under\n * the License.\n */\n\npackage io.sdb.form;\n\nimport io.swagger.annotations.ApiModel;\nimport io.swagger.annotations.ApiModelProperty;\nimport org.hibernate.validator.constraints.NotBlank;\n\n/**\n * 登录表单\n *\n * @author Mark sunlightcs@gmail.com\n * @since 3.1.0 2018-01-25\n */\n@ApiModel(value = \"登录表单\")\npublic class LoginForm {\n    @ApiModelProperty(value = \"手机号\")\n    @NotBlank(message=\"手机号不能为空\")\n    private String mobile;\n\n    @ApiModelProperty(value = \"密码\")\n    @NotBlank(message=\"密码不能为空\")\n    private String password;\n\n    public String getMobile() {\n        return mobile;\n    }\n\n    public void setMobile(String mobile) {\n        this.mobile = mobile;\n    }\n\n    public String getPassword() {\n        return password;\n    }\n\n    public void setPassword(String password) {\n        this.password = password;\n    }\n}\n"
  },
  {
    "path": "src/main/java/io/sdb/form/MaLoginForm.java",
    "content": "/**\n * Copyright 2018\n * <p>\n * Licensed under the Apache License, Version 2.0 (the \"License\"); you may not\n * use this file except in compliance with the License. You may obtain a copy of\n * the License at\n * <p>\n * http://www.apache.org/licenses/LICENSE-2.0\n * <p>\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS, WITHOUT\n * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the\n * License for the specific language governing permissions and limitations under\n * the License.\n */\n\npackage io.sdb.form;\n\nimport io.swagger.annotations.ApiModel;\nimport lombok.Data;\n\n/**\n * 登录表单\n *\n * @author Mark sunlightcs@gmail.com\n * @since 3.1.0 2018-01-25\n */\n@ApiModel(value = \"小程序登录表单\")\n@Data\npublic class MaLoginForm {\n    private String code;\n    private String encryptedData;\n    private String iv;\n    private String signature;\n    private String rawData;\n}\n"
  },
  {
    "path": "src/main/java/io/sdb/form/NewsAddForm.java",
    "content": "package io.sdb.form;\n\nimport io.swagger.annotations.ApiModel;\nimport io.swagger.annotations.ApiModelProperty;\n\nimport javax.validation.constraints.NotBlank;\n\n/**\n * Created by IntelliJ IDEA.\n * User: quendi\n * Date: 2018/6/4\n */\n@ApiModel(value = \"新闻表单\")\npublic class NewsAddForm {\n    @ApiModelProperty(value = \"标题\")\n    @NotBlank(message = \"标题不能为空\")\n    private String title;\n\n    @ApiModelProperty(value = \"是否头条\")\n    @NotBlank(message = \"是否头条\")\n    private Integer head;\n\n    @ApiModelProperty(value = \"新闻图片\")\n    private String img;\n\n    @ApiModelProperty(value = \"新闻内容\")\n    @NotBlank(message = \"新闻内容不能为空\")\n    private String content;\n}\n"
  },
  {
    "path": "src/main/java/io/sdb/form/OrderDetailForm.java",
    "content": "package io.sdb.form;\n\nimport lombok.Data;\n\nimport java.util.List;\n\n/**\n * Created by IntelliJ IDEA.\n * User: quendi\n * Date: 2018/6/4\n */\n@Data\npublic class OrderDetailForm {\n    Integer pageNum;\n    Integer pageSize;\n    Integer payStatus;\n    Integer orderStatus;\n}\n"
  },
  {
    "path": "src/main/java/io/sdb/form/OrderForm.java",
    "content": "package io.sdb.form;\n\nimport lombok.Data;\n\n/**\n * Created by IntelliJ IDEA.\n * User: quendi\n * Date: 2018/6/4\n */\n@Data\npublic class OrderForm {\n    String orderId;\n}\n"
  },
  {
    "path": "src/main/java/io/sdb/form/PasswordForm.java",
    "content": "/**\n * Copyright 2018\n * <p>\n * Licensed under the Apache License, Version 2.0 (the \"License\"); you may not\n * use this file except in compliance with the License. You may obtain a copy of\n * the License at\n * <p>\n * http://www.apache.org/licenses/LICENSE-2.0\n * <p>\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS, WITHOUT\n * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the\n * License for the specific language governing permissions and limitations under\n * the License.\n */\n\npackage io.sdb.form;\n\n/**\n * 密码表单\n *\n * @author Mark sunlightcs@gmail.com\n * @since 1.4.0 2018-01-25\n */\npublic class PasswordForm {\n    /**\n     * 原密码\n     */\n    private String password;\n    /**\n     * 新密码\n     */\n    private String newPassword;\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 getNewPassword() {\n        return newPassword;\n    }\n\n    public void setNewPassword(String newPassword) {\n        this.newPassword = newPassword;\n    }\n}\n"
  },
  {
    "path": "src/main/java/io/sdb/form/ProductInfo.java",
    "content": "package io.sdb.form;\n\nimport lombok.Data;\n\n/**\n * Created by IntelliJ IDEA.\n * User: quendi\n * Date: 2018/6/4\n */\n@Data\npublic class ProductInfo {\n    private String id;\n    private Integer quantity;\n}\n"
  },
  {
    "path": "src/main/java/io/sdb/form/ReceiveInfo.java",
    "content": "package io.sdb.form;\n\nimport lombok.Data;\n\nimport java.util.List;\n\n/**\n * Created by IntelliJ IDEA.\n * User: quendi\n * Date: 2018/6/4\n */\n@Data\npublic class ReceiveInfo {\n    private String fullAddr;\n    private String name;\n    private String phone;\n}\n"
  },
  {
    "path": "src/main/java/io/sdb/form/RefundForm.java",
    "content": "/**\n * Copyright 2018\n * <p>\n * Licensed under the Apache License, Version 2.0 (the \"License\"); you may not\n * use this file except in compliance with the License. You may obtain a copy of\n * the License at\n * <p>\n * http://www.apache.org/licenses/LICENSE-2.0\n * <p>\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS, WITHOUT\n * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the\n * License for the specific language governing permissions and limitations under\n * the License.\n */\n\npackage io.sdb.form;\n\nimport io.swagger.annotations.ApiModel;\nimport io.swagger.annotations.ApiModelProperty;\nimport lombok.Data;\nimport org.hibernate.validator.constraints.NotBlank;\n\n/**\n * 登录表单\n *\n * @author Mark sunlightcs@gmail.com\n * @since 3.1.0 2018-01-25\n */\n@Data\npublic class RefundForm {\n    String orderId;\n}\n"
  },
  {
    "path": "src/main/java/io/sdb/form/RegisterForm.java",
    "content": "/**\n * Copyright 2018\n * <p>\n * Licensed under the Apache License, Version 2.0 (the \"License\"); you may not\n * use this file except in compliance with the License. You may obtain a copy of\n * the License at\n * <p>\n * http://www.apache.org/licenses/LICENSE-2.0\n * <p>\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS, WITHOUT\n * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the\n * License for the specific language governing permissions and limitations under\n * the License.\n */\n\npackage io.sdb.form;\n\nimport io.swagger.annotations.ApiModel;\nimport io.swagger.annotations.ApiModelProperty;\nimport org.hibernate.validator.constraints.NotBlank;\n\n/**\n * 注册表单\n *\n * @author Mark sunlightcs@gmail.com\n * @since 3.1.0 2018-01-25\n */\n@ApiModel(value = \"注册表单\")\npublic class RegisterForm {\n    @ApiModelProperty(value = \"手机号\")\n    @NotBlank(message=\"手机号不能为空\")\n    private String mobile;\n\n    @ApiModelProperty(value = \"密码\")\n    @NotBlank(message=\"密码不能为空\")\n    private String password;\n\n    public String getMobile() {\n        return mobile;\n    }\n\n    public void setMobile(String mobile) {\n        this.mobile = mobile;\n    }\n\n    public String getPassword() {\n        return password;\n    }\n\n    public void setPassword(String password) {\n        this.password = password;\n    }\n}\n"
  },
  {
    "path": "src/main/java/io/sdb/form/SysLoginForm.java",
    "content": "/**\n * Copyright 2018\n * <p>\n * Licensed under the Apache License, Version 2.0 (the \"License\"); you may not\n * use this file except in compliance with the License. You may obtain a copy of\n * the License at\n * <p>\n * http://www.apache.org/licenses/LICENSE-2.0\n * <p>\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS, WITHOUT\n * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the\n * License for the specific language governing permissions and limitations under\n * the License.\n */\n\npackage io.sdb.form;\n\n/**\n * 登录表单\n *\n * @author Mark sunlightcs@gmail.com\n * @since 2.0.0 2018-01-25\n */\npublic class SysLoginForm {\n    private String username;\n    private String password;\n    private String captcha;\n    private String uuid;\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 getCaptcha() {\n        return captcha;\n    }\n\n    public void setCaptcha(String captcha) {\n        this.captcha = captcha;\n    }\n\n    public String getUuid() {\n        return uuid;\n    }\n\n    public void setUuid(String uuid) {\n        this.uuid = uuid;\n    }\n}\n"
  },
  {
    "path": "src/main/java/io/sdb/form/SysNewsForm.java",
    "content": "package io.sdb.form;\n\nimport io.sdb.common.validator.group.AddGroup;\nimport io.sdb.common.validator.group.UpdateGroup;\nimport lombok.Data;\n\nimport javax.validation.constraints.NotBlank;\n\n/**\n * Created by IntelliJ IDEA.\n * User: quendi\n * Date: 2018/6/10\n */\n@Data\npublic class SysNewsForm {\n\n    private Long id;\n    @NotBlank(message = \"新闻标题不能为空\",groups = {AddGroup.class,UpdateGroup.class})\n    private String title;\n    private String img;\n    @NotBlank(message = \"新闻内容不能为空\",groups = {AddGroup.class,UpdateGroup.class})\n    private String content;\n    private Integer head;\n}\n"
  },
  {
    "path": "src/main/java/io/sdb/form/SysOrderForm.java",
    "content": "/**\n * Copyright 2018\n * <p>\n * Licensed under the Apache License, Version 2.0 (the \"License\"); you may not\n * use this file except in compliance with the License. You may obtain a copy of\n * the License at\n * <p>\n * http://www.apache.org/licenses/LICENSE-2.0\n * <p>\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS, WITHOUT\n * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the\n * License for the specific language governing permissions and limitations under\n * the License.\n */\n\npackage io.sdb.form;\n\nimport lombok.Data;\n\nimport java.math.BigDecimal;\n\n/**\n * 登录表单\n *\n * @author Mark sunlightcs@gmail.com\n * @since 2.0.0 2018-01-25\n */\n@Data\npublic class SysOrderForm {\n    String orderId;\n    String buyerName;\n    String buyerPhone;\n    String buyerAddress;\n    BigDecimal orderAmount;\n    String trackingNumber;\n    String deliveryCode;\n}\n"
  },
  {
    "path": "src/main/java/io/sdb/handler/AbstractHandler.java",
    "content": "package io.sdb.handler;\n\nimport me.chanjar.weixin.mp.api.WxMpMessageHandler;\nimport org.slf4j.Logger;\nimport org.slf4j.LoggerFactory;\n\n/**\n * @author Binary Wang(https://github.com/binarywang)\n */\npublic abstract class AbstractHandler implements WxMpMessageHandler {\n    protected Logger logger = LoggerFactory.getLogger(getClass());\n}\n"
  },
  {
    "path": "src/main/java/io/sdb/handler/KfSessionHandler.java",
    "content": "package io.sdb.handler;\n\nimport me.chanjar.weixin.common.session.WxSessionManager;\nimport me.chanjar.weixin.mp.api.WxMpService;\nimport me.chanjar.weixin.mp.bean.message.WxMpXmlMessage;\nimport me.chanjar.weixin.mp.bean.message.WxMpXmlOutMessage;\nimport org.springframework.stereotype.Component;\n\nimport java.util.Map;\n\n/**\n * @author Binary Wang(https://github.com/binarywang)\n */\n@Component\npublic class KfSessionHandler extends AbstractHandler {\n\n    @Override\n    public WxMpXmlOutMessage handle(WxMpXmlMessage wxMessage,\n                                    Map<String, Object> context, WxMpService wxMpService,\n                                    WxSessionManager sessionManager) {\n        //TODO 对会话做处理\n        return null;\n    }\n\n}\n"
  },
  {
    "path": "src/main/java/io/sdb/handler/LocationHandler.java",
    "content": "package io.sdb.handler;\n\nimport io.sdb.builder.TextBuilder;\nimport me.chanjar.weixin.common.session.WxSessionManager;\nimport me.chanjar.weixin.mp.api.WxMpService;\nimport me.chanjar.weixin.mp.bean.message.WxMpXmlMessage;\nimport me.chanjar.weixin.mp.bean.message.WxMpXmlOutMessage;\nimport org.springframework.stereotype.Component;\n\nimport java.util.Map;\n\nimport static me.chanjar.weixin.common.api.WxConsts.XmlMsgType;\n\n/**\n * @author Binary Wang(https://github.com/binarywang)\n */\n@Component\npublic class LocationHandler extends AbstractHandler {\n\n    @Override\n    public WxMpXmlOutMessage handle(WxMpXmlMessage wxMessage,\n                                    Map<String, Object> context, WxMpService wxMpService,\n                                    WxSessionManager sessionManager) {\n        if (wxMessage.getMsgType().equals(XmlMsgType.LOCATION)) {\n            //TODO 接收处理用户发送的地理位置消息\n            try {\n                String content = \"感谢反馈，您的的地理位置已收到！\";\n                return new TextBuilder().build(content, wxMessage, null);\n            } catch (Exception e) {\n                this.logger.error(\"位置消息接收处理失败\", e);\n                return null;\n            }\n        }\n\n        //上报地理位置事件\n        this.logger.info(\"上报地理位置，纬度 : {}，经度 : {}，精度 : {}\",\n            wxMessage.getLatitude(), wxMessage.getLongitude(), String.valueOf(wxMessage.getPrecision()));\n\n        //TODO  可以将用户地理位置信息保存到本地数据库，以便以后使用\n\n        return null;\n    }\n\n}\n"
  },
  {
    "path": "src/main/java/io/sdb/handler/LogHandler.java",
    "content": "package io.sdb.handler;\n\nimport io.sdb.common.utils.JsonUtils;\nimport me.chanjar.weixin.common.session.WxSessionManager;\nimport me.chanjar.weixin.mp.api.WxMpService;\nimport me.chanjar.weixin.mp.bean.message.WxMpXmlMessage;\nimport me.chanjar.weixin.mp.bean.message.WxMpXmlOutMessage;\nimport org.springframework.stereotype.Component;\n\nimport java.util.Map;\n\n/**\n * @author Binary Wang(https://github.com/binarywang)\n */\n@Component\npublic class LogHandler extends AbstractHandler {\n    @Override\n    public WxMpXmlOutMessage handle(WxMpXmlMessage wxMessage,\n                                    Map<String, Object> context, WxMpService wxMpService,\n                                    WxSessionManager sessionManager) {\n        this.logger.info(\"\\n接收到请求消息，内容：{}\", JsonUtils.toJson(wxMessage));\n        return null;\n    }\n\n}\n"
  },
  {
    "path": "src/main/java/io/sdb/handler/MenuHandler.java",
    "content": "package io.sdb.handler;\n\nimport me.chanjar.weixin.common.session.WxSessionManager;\nimport me.chanjar.weixin.mp.api.WxMpService;\nimport me.chanjar.weixin.mp.bean.message.WxMpXmlMessage;\nimport me.chanjar.weixin.mp.bean.message.WxMpXmlOutMessage;\nimport org.springframework.stereotype.Component;\n\nimport java.util.Map;\n\nimport static me.chanjar.weixin.common.api.WxConsts.MenuButtonType;\n\n/**\n * @author Binary Wang(https://github.com/binarywang)\n */\n@Component\npublic class MenuHandler extends AbstractHandler {\n\n    @Override\n    public WxMpXmlOutMessage handle(WxMpXmlMessage wxMessage,\n                                    Map<String, Object> context, WxMpService weixinService,\n                                    WxSessionManager sessionManager) {\n\n        String msg = String.format(\"type:%s, event:%s, key:%s\",\n            wxMessage.getMsgType(), wxMessage.getEvent(),\n            wxMessage.getEventKey());\n        if (MenuButtonType.VIEW.equals(wxMessage.getEvent())) {\n            return null;\n        }\n\n        return WxMpXmlOutMessage.TEXT().content(msg)\n            .fromUser(wxMessage.getToUser()).toUser(wxMessage.getFromUser())\n            .build();\n    }\n\n}\n"
  },
  {
    "path": "src/main/java/io/sdb/handler/MsgHandler.java",
    "content": "package io.sdb.handler;\n\nimport io.sdb.builder.TextBuilder;\nimport io.sdb.common.utils.JsonUtils;\nimport me.chanjar.weixin.common.exception.WxErrorException;\nimport me.chanjar.weixin.common.session.WxSessionManager;\nimport me.chanjar.weixin.mp.api.WxMpService;\nimport me.chanjar.weixin.mp.bean.message.WxMpXmlMessage;\nimport me.chanjar.weixin.mp.bean.message.WxMpXmlOutMessage;\nimport org.apache.commons.lang3.StringUtils;\nimport org.springframework.stereotype.Component;\n\nimport java.util.Map;\n\nimport static me.chanjar.weixin.common.api.WxConsts.XmlMsgType;\n\n/**\n * @author Binary Wang(https://github.com/binarywang)\n */\n@Component\npublic class MsgHandler extends AbstractHandler {\n\n    @Override\n    public WxMpXmlOutMessage handle(WxMpXmlMessage wxMessage,\n                                    Map<String, Object> context, WxMpService weixinService,\n                                    WxSessionManager sessionManager) {\n\n        if (!wxMessage.getMsgType().equals(XmlMsgType.EVENT)) {\n            //TODO 可以选择将消息保存到本地\n        }\n\n        //当用户输入关键词如“你好”，“客服”等，并且有客服在线时，把消息转发给在线客服\n        try {\n            if (StringUtils.startsWithAny(wxMessage.getContent(), \"你好\", \"客服\")\n                && weixinService.getKefuService().kfOnlineList()\n                .getKfOnlineList().size() > 0) {\n                return WxMpXmlOutMessage.TRANSFER_CUSTOMER_SERVICE()\n                    .fromUser(wxMessage.getToUser())\n                    .toUser(wxMessage.getFromUser()).build();\n            }\n        } catch (WxErrorException e) {\n            e.printStackTrace();\n        }\n\n        //TODO 组装回复消息\n        String content = \"收到信息内容：\" + JsonUtils.toJson(wxMessage);\n\n        return new TextBuilder().build(content, wxMessage, weixinService);\n\n    }\n\n}\n"
  },
  {
    "path": "src/main/java/io/sdb/handler/NullHandler.java",
    "content": "package io.sdb.handler;\n\nimport me.chanjar.weixin.common.session.WxSessionManager;\nimport me.chanjar.weixin.mp.api.WxMpService;\nimport me.chanjar.weixin.mp.bean.message.WxMpXmlMessage;\nimport me.chanjar.weixin.mp.bean.message.WxMpXmlOutMessage;\nimport org.springframework.stereotype.Component;\n\nimport java.util.Map;\n\n/**\n * @author Binary Wang(https://github.com/binarywang)\n */\n@Component\npublic class NullHandler extends AbstractHandler {\n\n    @Override\n    public WxMpXmlOutMessage handle(WxMpXmlMessage wxMessage,\n                                    Map<String, Object> context, WxMpService wxMpService,\n                                    WxSessionManager sessionManager) {\n        return null;\n    }\n\n}\n"
  },
  {
    "path": "src/main/java/io/sdb/handler/ScanHandler.java",
    "content": "package io.sdb.handler;\n\n/**\n * @author Binary Wang(https://github.com/binarywang)\n */\npublic abstract class ScanHandler extends AbstractHandler {\n\n}\n"
  },
  {
    "path": "src/main/java/io/sdb/handler/StoreCheckNotifyHandler.java",
    "content": "package io.sdb.handler;\n\nimport me.chanjar.weixin.common.session.WxSessionManager;\nimport me.chanjar.weixin.mp.api.WxMpService;\nimport me.chanjar.weixin.mp.bean.message.WxMpXmlMessage;\nimport me.chanjar.weixin.mp.bean.message.WxMpXmlOutMessage;\nimport org.springframework.stereotype.Component;\n\nimport java.util.Map;\n\n/**\n * 门店审核事件处理\n *\n * @author Binary Wang(https://github.com/binarywang)\n */\n@Component\npublic class StoreCheckNotifyHandler extends AbstractHandler {\n\n    @Override\n    public WxMpXmlOutMessage handle(WxMpXmlMessage wxMessage,\n                                    Map<String, Object> context, WxMpService wxMpService,\n                                    WxSessionManager sessionManager) {\n        // TODO 处理门店审核事件\n        return null;\n    }\n\n}\n"
  },
  {
    "path": "src/main/java/io/sdb/handler/SubscribeHandler.java",
    "content": "package io.sdb.handler;\n\nimport io.sdb.builder.TextBuilder;\nimport me.chanjar.weixin.common.exception.WxErrorException;\nimport me.chanjar.weixin.common.session.WxSessionManager;\nimport me.chanjar.weixin.mp.api.WxMpService;\nimport me.chanjar.weixin.mp.bean.message.WxMpXmlMessage;\nimport me.chanjar.weixin.mp.bean.message.WxMpXmlOutMessage;\nimport me.chanjar.weixin.mp.bean.result.WxMpUser;\nimport org.springframework.stereotype.Component;\n\nimport java.util.Map;\n\n/**\n * @author Binary Wang(https://github.com/binarywang)\n */\n@Component\npublic class SubscribeHandler extends AbstractHandler {\n\n    @Override\n    public WxMpXmlOutMessage handle(WxMpXmlMessage wxMessage,\n                                    Map<String, Object> context, WxMpService weixinService,\n                                    WxSessionManager sessionManager) throws WxErrorException {\n\n        this.logger.info(\"新关注用户 OPENID: \" + wxMessage.getFromUser());\n\n        // 获取微信用户基本信息\n        WxMpUser userWxInfo = weixinService.getUserService()\n            .userInfo(wxMessage.getFromUser(), null);\n\n        if (userWxInfo != null) {\n            // TODO 可以添加关注用户到本地\n        }\n\n        WxMpXmlOutMessage responseResult = null;\n        try {\n            responseResult = handleSpecial(wxMessage);\n        } catch (Exception e) {\n            this.logger.error(e.getMessage(), e);\n        }\n\n        if (responseResult != null) {\n            return responseResult;\n        }\n\n        try {\n            return new TextBuilder().build(\"感谢关注\", wxMessage, weixinService);\n        } catch (Exception e) {\n            this.logger.error(e.getMessage(), e);\n        }\n\n        return null;\n    }\n\n    /**\n     * 处理特殊请求，比如如果是扫码进来的，可以做相应处理\n     */\n    private WxMpXmlOutMessage handleSpecial(WxMpXmlMessage wxMessage)\n        throws Exception {\n        //TODO\n        return null;\n    }\n\n}\n"
  },
  {
    "path": "src/main/java/io/sdb/handler/UnsubscribeHandler.java",
    "content": "package io.sdb.handler;\n\nimport me.chanjar.weixin.common.session.WxSessionManager;\nimport me.chanjar.weixin.mp.api.WxMpService;\nimport me.chanjar.weixin.mp.bean.message.WxMpXmlMessage;\nimport me.chanjar.weixin.mp.bean.message.WxMpXmlOutMessage;\nimport org.springframework.stereotype.Component;\n\nimport java.util.Map;\n\n/**\n * @author Binary Wang(https://github.com/binarywang)\n */\n@Component\npublic class UnsubscribeHandler extends AbstractHandler {\n\n    @Override\n    public WxMpXmlOutMessage handle(WxMpXmlMessage wxMessage,\n                                    Map<String, Object> context, WxMpService wxMpService,\n                                    WxSessionManager sessionManager) {\n        String openId = wxMessage.getFromUser();\n        this.logger.info(\"取消关注用户 OPENID: \" + openId);\n        // TODO 可以更新本地数据库为取消关注状态\n        return null;\n    }\n\n}\n"
  },
  {
    "path": "src/main/java/io/sdb/interceptor/AuthorizationInterceptor.java",
    "content": "package io.sdb.interceptor;\n\n\nimport io.jsonwebtoken.Claims;\nimport io.sdb.common.exception.RRException;\nimport io.sdb.common.utils.JwtUtils;\nimport io.sdb.common.annotation.Login;\nimport org.apache.commons.lang.StringUtils;\nimport org.springframework.beans.factory.annotation.Autowired;\nimport org.springframework.http.HttpStatus;\nimport org.springframework.stereotype.Component;\nimport org.springframework.web.method.HandlerMethod;\nimport org.springframework.web.servlet.handler.HandlerInterceptorAdapter;\n\nimport javax.servlet.http.HttpServletRequest;\nimport javax.servlet.http.HttpServletResponse;\n\n/**\n * 权限(Token)验证\n * @author chenshun\n * @email sunlightcs@gmail.com\n * @date 2017-03-23 15:38\n */\n@Component\npublic class AuthorizationInterceptor extends HandlerInterceptorAdapter {\n    @Autowired\n    private JwtUtils jwtUtils;\n\n    public static final String USER_KEY = \"userId\";\n\n    @Override\n    public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {\n        Login annotation;\n        if(handler instanceof HandlerMethod) {\n            annotation = ((HandlerMethod) handler).getMethodAnnotation(Login.class);\n        }else{\n            return true;\n        }\n\n        if(annotation == null){\n            return true;\n        }\n\n        //获取用户凭证\n        String token = request.getHeader(jwtUtils.getHeader());\n        if(StringUtils.isBlank(token)){\n            token = request.getParameter(jwtUtils.getHeader());\n        }\n\n        //凭证为空\n        if(StringUtils.isBlank(token)){\n            throw new RRException(jwtUtils.getHeader() + \"不能为空\", HttpStatus.UNAUTHORIZED.value());\n        }\n\n        Claims claims = jwtUtils.getClaimByToken(token);\n        if(claims == null || jwtUtils.isTokenExpired(claims.getExpiration())){\n            throw new RRException(jwtUtils.getHeader() + \"失效，请重新登录\", HttpStatus.UNAUTHORIZED.value());\n        }\n\n        //设置userId到request里，后续根据userId，获取用户信息\n        request.setAttribute(USER_KEY, Long.parseLong(claims.getSubject()));\n\n        return true;\n    }\n}\n"
  },
  {
    "path": "src/main/java/io/sdb/job/config/ScheduleConfig.java",
    "content": "/**\n * Copyright 2018\n * <p>\n * Licensed under the Apache License, Version 2.0 (the \"License\"); you may not\n * use this file except in compliance with the License. You may obtain a copy of\n * the License at\n * <p>\n * http://www.apache.org/licenses/LICENSE-2.0\n * <p>\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS, WITHOUT\n * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the\n * License for the specific language governing permissions and limitations under\n * the License.\n */\n\npackage io.sdb.job.config;\n\nimport org.springframework.beans.factory.annotation.Value;\nimport org.springframework.context.annotation.Bean;\nimport org.springframework.context.annotation.Configuration;\nimport org.springframework.scheduling.quartz.SchedulerFactoryBean;\n\nimport javax.sql.DataSource;\nimport java.util.Properties;\n\n/**\n * 定时任务配置\n *\n * @author Mark sunlightcs@gmail.com\n * @since 2.0.0 2017-04-20\n */\n@Configuration\npublic class ScheduleConfig {\n\n    @Value(\"${schedule.open}\")\n    Boolean scheduleOpen;\n\n    @Bean\n    public SchedulerFactoryBean schedulerFactoryBean(DataSource dataSource) {\n        SchedulerFactoryBean factory = new SchedulerFactoryBean();\n        factory.setDataSource(dataSource);\n\n        //quartz参数\n        Properties prop = new Properties();\n        prop.put(\"org.quartz.scheduler.instanceName\", \"SdbScheduler\");\n        prop.put(\"org.quartz.scheduler.instanceId\", \"AUTO\");\n        //线程池配置\n        prop.put(\"org.quartz.threadPool.class\", \"org.quartz.simpl.SimpleThreadPool\");\n        prop.put(\"org.quartz.threadPool.threadCount\", \"20\");\n        prop.put(\"org.quartz.threadPool.threadPriority\", \"5\");\n        //JobStore配置\n        prop.put(\"org.quartz.jobStore.class\", \"org.quartz.impl.jdbcjobstore.JobStoreTX\");\n        //集群配置\n        prop.put(\"org.quartz.jobStore.isClustered\", \"true\");\n        prop.put(\"org.quartz.jobStore.clusterCheckinInterval\", \"15000\");\n        prop.put(\"org.quartz.jobStore.maxMisfiresToHandleAtATime\", \"1\");\n\n        prop.put(\"org.quartz.jobStore.misfireThreshold\", \"12000\");\n        prop.put(\"org.quartz.jobStore.tablePrefix\", \"QRTZ_\");\n        prop.put(\"org.quartz.jobStore.selectWithLockSQL\", \"SELECT * FROM {0}LOCKS UPDLOCK WHERE LOCK_NAME = ?\");\n\n        //PostgreSQL数据库，需要打开此注释\n        //prop.put(\"org.quartz.jobStore.driverDelegateClass\", \"org.quartz.impl.jdbcjobstore.PostgreSQLDelegate\");\n\n        factory.setQuartzProperties(prop);\n\n        factory.setSchedulerName(\"SdbScheduler\");\n        //延时启动\n        factory.setStartupDelay(30);\n        factory.setApplicationContextSchedulerContextKey(\"applicationContextKey\");\n        //可选，QuartzScheduler 启动时更新己存在的Job，这样就不用每次修改targetObject后删除qrtz_job_details表对应记录了\n        factory.setOverwriteExistingJobs(true);\n        //设置自动启动，默认为true\n        factory.setAutoStartup(scheduleOpen);\n\n        return factory;\n    }\n}\n"
  },
  {
    "path": "src/main/java/io/sdb/job/task/TestTask.java",
    "content": "package io.sdb.job.task;\n\n/**\n * Copyright 2018\n * <p>\n * Licensed under the Apache License, Version 2.0 (the \"License\"); you may not\n * use this file except in compliance with the License. You may obtain a copy of\n * the License at\n * <p>\n * http://www.apache.org/licenses/LICENSE-2.0\n * <p>\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS, WITHOUT\n * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the\n * License for the specific language governing permissions and limitations under\n * the License.\n */\n\nimport io.sdb.model.SysUser;\nimport io.sdb.service.SysUserService;\nimport org.apache.commons.lang.builder.ToStringBuilder;\nimport org.slf4j.Logger;\nimport org.slf4j.LoggerFactory;\nimport org.springframework.beans.factory.annotation.Autowired;\nimport org.springframework.stereotype.Component;\n\n/**\n * 测试定时任务(演示Demo，可删除)\n *\n * testTask为spring bean的名称\n *\n * @author Mark sunlightcs@gmail.com\n * @since 1.2.0 2016-11-28\n */\n@Component(\"testTask\")\npublic class TestTask {\n\tprivate Logger logger = LoggerFactory.getLogger(getClass());\n\t\n\t@Autowired\n\tprivate SysUserService sysUserService;\n\t\n\tpublic void test(String params){\n\t\tlogger.info(\"我是带参数的test方法，正在被执行，参数为：\" + params);\n\t\t\n\t\ttry {\n\t\t\tThread.sleep(1000L);\n\t\t} catch (InterruptedException e) {\n\t\t\te.printStackTrace();\n\t\t}\n\t\t\n\t\tSysUser user = sysUserService.findById(1L);\n\t\tSystem.out.println(ToStringBuilder.reflectionToString(user));\n\t\t\n\t}\n\t\n\t\n\tpublic void test2(){\n\t\tlogger.info(\"我是不带参数的test2方法，正在被执行\");\n\t}\n}\n"
  },
  {
    "path": "src/main/java/io/sdb/job/utils/ScheduleJob.java",
    "content": "/**\n * Copyright 2018\n * <p>\n * Licensed under the Apache License, Version 2.0 (the \"License\"); you may not\n * use this file except in compliance with the License. You may obtain a copy of\n * the License at\n * <p>\n * http://www.apache.org/licenses/LICENSE-2.0\n * <p>\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS, WITHOUT\n * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the\n * License for the specific language governing permissions and limitations under\n * the License.\n */\n\npackage io.sdb.job.utils;\n\nimport io.sdb.common.utils.SpringContextUtils;\nimport io.sdb.model.ScheduleJobLog;\nimport io.sdb.service.ScheduleJobLogService;\nimport org.apache.commons.lang.StringUtils;\nimport org.quartz.JobExecutionContext;\nimport org.quartz.JobExecutionException;\nimport org.slf4j.Logger;\nimport org.slf4j.LoggerFactory;\nimport org.springframework.scheduling.quartz.QuartzJobBean;\n\nimport java.util.Date;\nimport java.util.concurrent.ExecutorService;\nimport java.util.concurrent.Executors;\nimport java.util.concurrent.Future;\n\n\n/**\n * 定时任务\n *\n * @author Mark sunlightcs@gmail.com\n * @since 1.2.0 2016-11-28\n */\npublic class ScheduleJob extends QuartzJobBean {\n\tprivate Logger logger = LoggerFactory.getLogger(getClass());\n\tprivate ExecutorService service = Executors.newSingleThreadExecutor(); \n\t\n    @Override\n    protected void executeInternal(JobExecutionContext context) throws JobExecutionException {\n        io.sdb.model.ScheduleJob scheduleJob = (io.sdb.model.ScheduleJob) context.getMergedJobDataMap()\n        \t\t.get(io.sdb.model.ScheduleJob.JOB_PARAM_KEY);\n        \n        //获取spring bean\n        ScheduleJobLogService scheduleJobLogService = (ScheduleJobLogService) SpringContextUtils.getBean(\"scheduleJobLogService\");\n        \n        //数据库保存执行记录\n        ScheduleJobLog log = new ScheduleJobLog();\n        log.setJobId(scheduleJob.getJobId());\n        log.setBeanName(scheduleJob.getBeanName());\n        log.setMethodName(scheduleJob.getMethodName());\n        log.setParams(scheduleJob.getParams());\n        log.setCreateTime(new Date());\n        \n        //任务开始时间\n        long startTime = System.currentTimeMillis();\n        \n        try {\n            //执行任务\n        \tlogger.info(\"任务准备执行，任务ID：\" + scheduleJob.getJobId());\n            ScheduleRunnable task = new ScheduleRunnable(scheduleJob.getBeanName(),\n            \t\tscheduleJob.getMethodName(), scheduleJob.getParams());\n            Future<?> future = service.submit(task);\n            \n\t\t\tfuture.get();\n\t\t\t\n\t\t\t//任务执行总时长\n\t\t\tlong times = System.currentTimeMillis() - startTime;\n\t\t\tlog.setTimes((int)times);\n\t\t\t//任务状态    0：成功    1：失败\n\t\t\tlog.setStatus(0);\n\t\t\t\n\t\t\tlogger.info(\"任务执行完毕，任务ID：\" + scheduleJob.getJobId() + \"  总共耗时：\" + times + \"毫秒\");\n\t\t} catch (Exception e) {\n\t\t\tlogger.error(\"任务执行失败，任务ID：\" + scheduleJob.getJobId(), e);\n\t\t\t\n\t\t\t//任务执行总时长\n\t\t\tlong times = System.currentTimeMillis() - startTime;\n\t\t\tlog.setTimes((int)times);\n\t\t\t\n\t\t\t//任务状态    0：成功    1：失败\n\t\t\tlog.setStatus(1);\n\t\t\tlog.setError(StringUtils.substring(e.toString(), 0, 2000));\n\t\t}finally {\n\t\t\tlog.save();\n\t\t}\n    }\n}\n"
  },
  {
    "path": "src/main/java/io/sdb/job/utils/ScheduleRunnable.java",
    "content": "/**\n * Copyright 2018\n * <p>\n * Licensed under the Apache License, Version 2.0 (the \"License\"); you may not\n * use this file except in compliance with the License. You may obtain a copy of\n * the License at\n * <p>\n * http://www.apache.org/licenses/LICENSE-2.0\n * <p>\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS, WITHOUT\n * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the\n * License for the specific language governing permissions and limitations under\n * the License.\n */\n\npackage io.sdb.job.utils;\n\nimport io.sdb.common.exception.RRException;\nimport io.sdb.common.utils.SpringContextUtils;\nimport org.apache.commons.lang.StringUtils;\nimport org.springframework.util.ReflectionUtils;\n\nimport java.lang.reflect.Method;\n\n/**\n * 执行定时任务\n *\n * @author Mark sunlightcs@gmail.com\n * @since 1.2.0 2016-11-28\n */\npublic class ScheduleRunnable implements Runnable {\n\tprivate Object target;\n\tprivate Method method;\n\tprivate String params;\n\t\n\tpublic ScheduleRunnable(String beanName, String methodName, String params) throws NoSuchMethodException, SecurityException {\n\t\tthis.target = SpringContextUtils.getBean(beanName);\n\t\tthis.params = params;\n\t\t\n\t\tif(StringUtils.isNotBlank(params)){\n\t\t\tthis.method = target.getClass().getDeclaredMethod(methodName, String.class);\n\t\t}else{\n\t\t\tthis.method = target.getClass().getDeclaredMethod(methodName);\n\t\t}\n\t}\n\n\t@Override\n\tpublic void run() {\n\t\ttry {\n\t\t\tReflectionUtils.makeAccessible(method);\n\t\t\tif(StringUtils.isNotBlank(params)){\n\t\t\t\tmethod.invoke(target, params);\n\t\t\t}else{\n\t\t\t\tmethod.invoke(target);\n\t\t\t}\n\t\t}catch (Exception e) {\n\t\t\tthrow new RRException(\"执行定时任务失败\", e);\n\t\t}\n\t}\n\n}\n"
  },
  {
    "path": "src/main/java/io/sdb/job/utils/ScheduleUtils.java",
    "content": "/**\n * Copyright 2018\n * <p>\n * Licensed under the Apache License, Version 2.0 (the \"License\"); you may not\n * use this file except in compliance with the License. You may obtain a copy of\n * the License at\n * <p>\n * http://www.apache.org/licenses/LICENSE-2.0\n * <p>\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS, WITHOUT\n * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the\n * License for the specific language governing permissions and limitations under\n * the License.\n */\n\npackage io.sdb.job.utils;\n\nimport io.sdb.common.exception.RRException;\nimport io.sdb.common.utils.Constant;\nimport org.quartz.*;\n\n/**\n * 定时任务工具类\n *\n * @author Mark sunlightcs@gmail.com\n * @since 1.2.0 2016-11-28\n */\npublic class ScheduleUtils {\n    private final static String JOB_NAME = \"TASK_\";\n\n    /**\n     * 获取触发器key\n     */\n    public static TriggerKey getTriggerKey(Long jobId) {\n        return TriggerKey.triggerKey(JOB_NAME + jobId);\n    }\n\n    /**\n     * 获取jobKey\n     */\n    public static JobKey getJobKey(Long jobId) {\n        return JobKey.jobKey(JOB_NAME + jobId);\n    }\n\n    /**\n     * 获取表达式触发器\n     */\n    public static CronTrigger getCronTrigger(Scheduler scheduler, Long jobId) {\n        try {\n            return (CronTrigger) scheduler.getTrigger(getTriggerKey(jobId));\n        } catch (SchedulerException e) {\n            throw new RRException(\"获取定时任务CronTrigger出现异常\", e);\n        }\n    }\n\n    /**\n     * 创建定时任务\n     */\n    public static void createScheduleJob(Scheduler scheduler, io.sdb.model.ScheduleJob scheduleJob) {\n        try {\n        \t//构建job信息\n            JobDetail jobDetail = JobBuilder.newJob(ScheduleJob.class).withIdentity(getJobKey(scheduleJob.getJobId())).build();\n\n            //表达式调度构建器\n            CronScheduleBuilder scheduleBuilder = CronScheduleBuilder.cronSchedule(scheduleJob.getCronExpression())\n            \t\t.withMisfireHandlingInstructionDoNothing();\n\n            //按新的cronExpression表达式构建一个新的trigger\n            CronTrigger trigger = TriggerBuilder.newTrigger().withIdentity(getTriggerKey(scheduleJob.getJobId())).withSchedule(scheduleBuilder).build();\n\n            //放入参数，运行时的方法可以获取\n            jobDetail.getJobDataMap().put(io.sdb.model.ScheduleJob.JOB_PARAM_KEY, scheduleJob);\n\n            scheduler.scheduleJob(jobDetail, trigger);\n\n            //暂停任务\n            if(scheduleJob.getStatus() == Constant.ScheduleStatus.PAUSE.getValue()){\n            \tpauseJob(scheduler, scheduleJob.getJobId());\n            }\n        } catch (SchedulerException e) {\n            throw new RRException(\"创建定时任务失败\", e);\n        }\n    }\n\n    /**\n     * 更新定时任务\n     */\n    public static void updateScheduleJob(Scheduler scheduler, io.sdb.model.ScheduleJob scheduleJob) {\n        try {\n            TriggerKey triggerKey = getTriggerKey(scheduleJob.getJobId());\n\n            //表达式调度构建器\n            CronScheduleBuilder scheduleBuilder = CronScheduleBuilder.cronSchedule(scheduleJob.getCronExpression())\n            \t\t.withMisfireHandlingInstructionDoNothing();\n\n            CronTrigger trigger = getCronTrigger(scheduler, scheduleJob.getJobId());\n\n            //按新的cronExpression表达式重新构建trigger\n            trigger = trigger.getTriggerBuilder().withIdentity(triggerKey).withSchedule(scheduleBuilder).build();\n\n            //参数\n            trigger.getJobDataMap().put(io.sdb.model.ScheduleJob.JOB_PARAM_KEY, scheduleJob);\n\n            scheduler.rescheduleJob(triggerKey, trigger);\n\n            //暂停任务\n            if(scheduleJob.getStatus() == Constant.ScheduleStatus.PAUSE.getValue()){\n            \tpauseJob(scheduler, scheduleJob.getJobId());\n            }\n\n        } catch (SchedulerException e) {\n            throw new RRException(\"更新定时任务失败\", e);\n        }\n    }\n\n    /**\n     * 立即执行任务\n     */\n    public static void run(Scheduler scheduler, io.sdb.model.ScheduleJob scheduleJob) {\n        try {\n        \t//参数\n        \tJobDataMap dataMap = new JobDataMap();\n        \tdataMap.put(io.sdb.model.ScheduleJob.JOB_PARAM_KEY, scheduleJob);\n        \t\n            scheduler.triggerJob(getJobKey(scheduleJob.getJobId()), dataMap);\n        } catch (SchedulerException e) {\n            throw new RRException(\"立即执行定时任务失败\", e);\n        }\n    }\n\n    /**\n     * 暂停任务\n     */\n    public static void pauseJob(Scheduler scheduler, Long jobId) {\n        try {\n            scheduler.pauseJob(getJobKey(jobId));\n        } catch (SchedulerException e) {\n            throw new RRException(\"暂停定时任务失败\", e);\n        }\n    }\n\n    /**\n     * 恢复任务\n     */\n    public static void resumeJob(Scheduler scheduler, Long jobId) {\n        try {\n            scheduler.resumeJob(getJobKey(jobId));\n        } catch (SchedulerException e) {\n            throw new RRException(\"暂停定时任务失败\", e);\n        }\n    }\n\n    /**\n     * 删除定时任务\n     */\n    public static void deleteScheduleJob(Scheduler scheduler, Long jobId) {\n        try {\n            scheduler.deleteJob(getJobKey(jobId));\n        } catch (SchedulerException e) {\n            throw new RRException(\"删除定时任务失败\", e);\n        }\n    }\n}\n"
  },
  {
    "path": "src/main/java/io/sdb/model/Area.java",
    "content": "package io.sdb.model;\n\nimport io.sdb.model.base.BaseArea;\n\n/**\n * Generated by JFinal.\n */\n@SuppressWarnings(\"serial\")\npublic class Area extends BaseArea<Area> {\n\tpublic static final Area dao = new Area().dao();\n}\n"
  },
  {
    "path": "src/main/java/io/sdb/model/Campaign.java",
    "content": "package io.sdb.model;\n\nimport io.sdb.model.base.BaseCampaign;\n\n/**\n * Generated by JFinal.\n */\n@SuppressWarnings(\"serial\")\npublic class Campaign extends BaseCampaign<Campaign> {\n\tpublic static final Campaign dao = new Campaign().dao();\n}\n"
  },
  {
    "path": "src/main/java/io/sdb/model/Cart.java",
    "content": "package io.sdb.model;\n\nimport io.sdb.model.base.BaseCart;\n\n/**\n * Generated by JFinal.\n */\n@SuppressWarnings(\"serial\")\npublic class Cart extends BaseCart<Cart> {\n\tpublic static final Cart dao = new Cart().dao();\n}\n"
  },
  {
    "path": "src/main/java/io/sdb/model/DeliveryCorp.java",
    "content": "package io.sdb.model;\n\nimport io.sdb.model.base.BaseDeliveryCorp;\n\n/**\n * Generated by JFinal.\n */\n@SuppressWarnings(\"serial\")\npublic class DeliveryCorp extends BaseDeliveryCorp<DeliveryCorp> {\n\tpublic static final DeliveryCorp dao = new DeliveryCorp().dao();\n}\n"
  },
  {
    "path": "src/main/java/io/sdb/model/FavoriteGoods.java",
    "content": "package io.sdb.model;\n\nimport io.sdb.model.base.BaseFavoriteGoods;\n\n/**\n * Generated by JFinal.\n */\n@SuppressWarnings(\"serial\")\npublic class FavoriteGoods extends BaseFavoriteGoods<FavoriteGoods> {\n\tpublic static final FavoriteGoods dao = new FavoriteGoods().dao();\n}\n"
  },
  {
    "path": "src/main/java/io/sdb/model/Goods.java",
    "content": "package io.sdb.model;\n\nimport io.sdb.model.base.BaseArea;\nimport io.sdb.model.base.BaseGoods;\nimport lombok.Data;\n\nimport java.util.List;\n\n/**\n * Generated by JFinal.\n */\n@SuppressWarnings(\"serial\")\n@Data\npublic class Goods extends BaseGoods<Goods> {\n\tpublic static final Goods dao = new Goods().dao();\n\n\tprivate List<Product> productList;\n}\n"
  },
  {
    "path": "src/main/java/io/sdb/model/Groupon.java",
    "content": "package io.sdb.model;\n\nimport io.sdb.model.base.BaseGroupon;\n\n/**\n * Generated by JFinal.\n */\n@SuppressWarnings(\"serial\")\npublic class Groupon extends BaseGroupon<Groupon> {\n\tpublic static final Groupon dao = new Groupon().dao();\n}\n"
  },
  {
    "path": "src/main/java/io/sdb/model/GrouponTeam.java",
    "content": "package io.sdb.model;\n\nimport io.sdb.model.base.BaseGrouponTeam;\n\n/**\n * Generated by JFinal.\n */\n@SuppressWarnings(\"serial\")\npublic class GrouponTeam extends BaseGrouponTeam<GrouponTeam> {\n\tpublic static final GrouponTeam dao = new GrouponTeam().dao();\n}\n"
  },
  {
    "path": "src/main/java/io/sdb/model/Logistics.java",
    "content": "package io.sdb.model;\n\nimport io.sdb.model.base.BaseLogistics;\n\n/**\n * Generated by JFinal.\n */\n@SuppressWarnings(\"serial\")\npublic class Logistics extends BaseLogistics<Logistics> {\n\tpublic static final Logistics dao = new Logistics().dao();\n}\n"
  },
  {
    "path": "src/main/java/io/sdb/model/OrderDetail.java",
    "content": "package io.sdb.model;\n\nimport io.sdb.model.base.BaseOrderDetail;\n\n/**\n * Generated by JFinal.\n */\n@SuppressWarnings(\"serial\")\npublic class OrderDetail extends BaseOrderDetail<OrderDetail> {\n\tpublic static final OrderDetail dao = new OrderDetail().dao();\n}\n"
  },
  {
    "path": "src/main/java/io/sdb/model/OrderMaster.java",
    "content": "package io.sdb.model;\n\nimport io.sdb.model.base.BaseOrderMaster;\n\n/**\n * Generated by JFinal.\n */\n@SuppressWarnings(\"serial\")\npublic class OrderMaster extends BaseOrderMaster<OrderMaster> {\n\tpublic static final OrderMaster dao = new OrderMaster().dao();\n}\n"
  },
  {
    "path": "src/main/java/io/sdb/model/Product.java",
    "content": "package io.sdb.model;\n\nimport io.sdb.model.base.BaseProduct;\nimport lombok.Data;\n\n/**\n * Generated by JFinal.\n */\n@SuppressWarnings(\"serial\")\n@Data\npublic class Product extends BaseProduct<Product> {\n\tpublic static final Product dao = new Product().dao();\n\n\tInteger quantity;\n}\n"
  },
  {
    "path": "src/main/java/io/sdb/model/ProductCategory.java",
    "content": "package io.sdb.model;\n\nimport io.sdb.model.base.BaseProductCategory;\nimport lombok.Data;\n\n/**\n * Generated by JFinal.\n */\n@SuppressWarnings(\"serial\")\n@Data\npublic class ProductCategory extends BaseProductCategory<ProductCategory> {\n\tpublic static final ProductCategory dao = new ProductCategory().dao();\n\n\tString parentName;\n\tboolean open;\n}\n"
  },
  {
    "path": "src/main/java/io/sdb/model/Receiver.java",
    "content": "package io.sdb.model;\n\nimport io.sdb.model.base.BaseReceiver;\n\n/**\n * Generated by JFinal.\n */\n@SuppressWarnings(\"serial\")\npublic class Receiver extends BaseReceiver<Receiver> {\n\tpublic static final Receiver dao = new Receiver().dao();\n}\n"
  },
  {
    "path": "src/main/java/io/sdb/model/ScheduleJob.java",
    "content": "package io.sdb.model;\n\nimport io.sdb.model.base.BaseScheduleJob;\n\n/**\n * Generated by JFinal.\n */\n@SuppressWarnings(\"serial\")\npublic class ScheduleJob extends BaseScheduleJob<ScheduleJob> {\n\tpublic static final ScheduleJob dao = new ScheduleJob().dao();\n\n\t/**\n\t * 任务调度参数key\n\t */\n\tpublic static final String JOB_PARAM_KEY = \"JOB_PARAM_KEY\";\n}\n"
  },
  {
    "path": "src/main/java/io/sdb/model/ScheduleJobLog.java",
    "content": "package io.sdb.model;\n\nimport io.sdb.model.base.BaseScheduleJobLog;\n\n/**\n * Generated by JFinal.\n */\n@SuppressWarnings(\"serial\")\npublic class ScheduleJobLog extends BaseScheduleJobLog<ScheduleJobLog> {\n\tpublic static final ScheduleJobLog dao = new ScheduleJobLog().dao();\n}\n"
  },
  {
    "path": "src/main/java/io/sdb/model/Sn.java",
    "content": "package io.sdb.model;\n\nimport io.sdb.model.base.BaseSn;\n\n/**\n * Generated by JFinal.\n */\n@SuppressWarnings(\"serial\")\npublic class Sn extends BaseSn<Sn> {\n\tpublic static final Sn dao = new Sn().dao();\n}\n"
  },
  {
    "path": "src/main/java/io/sdb/model/Specification.java",
    "content": "package io.sdb.model;\n\nimport io.sdb.model.base.BaseSpecification;\nimport lombok.Data;\n\n/**\n * Generated by JFinal.\n */\n@SuppressWarnings(\"serial\")\n@Data\npublic class Specification extends BaseSpecification<Specification> {\n\tpublic static final Specification dao = new Specification().dao();\n\n\tString parentName;\n\tboolean open;\n}\n"
  },
  {
    "path": "src/main/java/io/sdb/model/SysCaptcha.java",
    "content": "package io.sdb.model;\n\nimport io.sdb.model.base.BaseSysCaptcha;\n\n/**\n * Generated by JFinal.\n */\n@SuppressWarnings(\"serial\")\npublic class SysCaptcha extends BaseSysCaptcha<SysCaptcha> {\n\tpublic static final SysCaptcha dao = new SysCaptcha().dao();\n}\n"
  },
  {
    "path": "src/main/java/io/sdb/model/SysConfig.java",
    "content": "package io.sdb.model;\n\nimport io.sdb.model.base.BaseSysConfig;\n\n/**\n * Generated by JFinal.\n */\n@SuppressWarnings(\"serial\")\npublic class SysConfig extends BaseSysConfig<SysConfig> {\n\tpublic static final SysConfig dao = new SysConfig().dao();\n}\n"
  },
  {
    "path": "src/main/java/io/sdb/model/SysLog.java",
    "content": "package io.sdb.model;\n\nimport io.sdb.model.base.BaseSysLog;\n\n/**\n * Generated by JFinal.\n */\n@SuppressWarnings(\"serial\")\npublic class SysLog extends BaseSysLog<SysLog> {\n\tpublic static final SysLog dao = new SysLog().dao();\n}\n"
  },
  {
    "path": "src/main/java/io/sdb/model/SysMenu.java",
    "content": "package io.sdb.model;\n\nimport io.sdb.model.base.BaseSysMenu;\nimport lombok.Data;\n\nimport java.util.List;\n\n/**\n * Generated by JFinal.\n */\n@SuppressWarnings(\"serial\")\n@Data\npublic class SysMenu extends BaseSysMenu<SysMenu> {\n\tpublic static final SysMenu dao = new SysMenu().dao();\n\n\tString parentName;\n\tList<SysMenu> list;\n\tboolean open;\n}\n"
  },
  {
    "path": "src/main/java/io/sdb/model/SysOss.java",
    "content": "package io.sdb.model;\n\nimport io.sdb.model.base.BaseSysOss;\n\n/**\n * Generated by JFinal.\n */\n@SuppressWarnings(\"serial\")\npublic class SysOss extends BaseSysOss<SysOss> {\n\tpublic static final SysOss dao = new SysOss().dao();\n}\n"
  },
  {
    "path": "src/main/java/io/sdb/model/SysRole.java",
    "content": "package io.sdb.model;\n\nimport io.sdb.model.base.BaseSysRole;\nimport lombok.Data;\n\nimport java.util.List;\n\n/**\n * Generated by JFinal.\n */\n@SuppressWarnings(\"serial\")\n@Data\npublic class SysRole extends BaseSysRole<SysRole> {\n\tpublic static final SysRole dao = new SysRole().dao();\n\n\tprivate List<Long> menuIdList;\n}\n"
  },
  {
    "path": "src/main/java/io/sdb/model/SysRoleMenu.java",
    "content": "package io.sdb.model;\n\nimport io.sdb.model.base.BaseSysRoleMenu;\n\n/**\n * Generated by JFinal.\n */\n@SuppressWarnings(\"serial\")\npublic class SysRoleMenu extends BaseSysRoleMenu<SysRoleMenu> {\n\tpublic static final SysRoleMenu dao = new SysRoleMenu().dao();\n}\n"
  },
  {
    "path": "src/main/java/io/sdb/model/SysUser.java",
    "content": "package io.sdb.model;\n\nimport io.sdb.model.base.BaseSysUser;\n\nimport java.util.List;\n\n/**\n * Generated by JFinal.\n */\n@SuppressWarnings(\"serial\")\npublic class SysUser extends BaseSysUser<SysUser> {\n\n\tpublic static final SysUser dao = new SysUser().dao();\n\n\tprivate List<Long> roleIdList;\n\n\tpublic List<Long> getRoleIdList() {\n\t\treturn roleIdList;\n\t}\n\n\tpublic void setRoleIdList(List<Long> roleIdList) {\n\t\tthis.roleIdList = roleIdList;\n\t}\n}\n"
  },
  {
    "path": "src/main/java/io/sdb/model/SysUserRole.java",
    "content": "package io.sdb.model;\n\nimport io.sdb.model.base.BaseSysUserRole;\n\n/**\n * Generated by JFinal.\n */\n@SuppressWarnings(\"serial\")\npublic class SysUserRole extends BaseSysUserRole<SysUserRole> {\n\tpublic static final SysUserRole dao = new SysUserRole().dao();\n}\n"
  },
  {
    "path": "src/main/java/io/sdb/model/SysUserToken.java",
    "content": "package io.sdb.model;\n\nimport io.sdb.model.base.BaseSysUserToken;\n\n/**\n * Generated by JFinal.\n */\n@SuppressWarnings(\"serial\")\npublic class SysUserToken extends BaseSysUserToken<SysUserToken> {\n\tpublic static final SysUserToken dao = new SysUserToken().dao();\n}\n"
  },
  {
    "path": "src/main/java/io/sdb/model/TbUser.java",
    "content": "package io.sdb.model;\n\nimport io.sdb.model.base.BaseTbUser;\n\n/**\n * Generated by JFinal.\n */\n@SuppressWarnings(\"serial\")\npublic class TbUser extends BaseTbUser<TbUser> {\n\tpublic static final TbUser dao = new TbUser().dao();\n}\n"
  },
  {
    "path": "src/main/java/io/sdb/model/User.java",
    "content": "package io.sdb.model;\n\nimport io.sdb.model.base.BaseUser;\n\n/**\n * Generated by JFinal.\n */\n@SuppressWarnings(\"serial\")\npublic class User extends BaseUser<User> {\n\tpublic static final User dao = new User().dao();\n}\n"
  },
  {
    "path": "src/main/java/io/sdb/model/_MappingKit.java",
    "content": "package io.sdb.model;\n\nimport com.jfinal.plugin.activerecord.ActiveRecordPlugin;\n\n/**\n * Generated by JFinal, do not modify this file.\n * <pre>\n * Example:\n * public void configPlugin(Plugins me) {\n *     ActiveRecordPlugin arp = new ActiveRecordPlugin(...);\n *     _MappingKit.mapping(arp);\n *     me.add(arp);\n * }\n * </pre>\n */\npublic class _MappingKit {\n\t\n\tpublic static void mapping(ActiveRecordPlugin arp) {\n\t\tarp.addMapping(\"area\", \"id\", Area.class);\n\t\tarp.addMapping(\"campaign\", \"id\", Campaign.class);\n\t\tarp.addMapping(\"cart\", \"id\", Cart.class);\n\t\tarp.addMapping(\"delivery_corp\", \"code\", DeliveryCorp.class);\n\t\t// Composite Primary Key order: favorite_goods,favorite_user\n\t\tarp.addMapping(\"favorite_goods\", \"favorite_goods,favorite_user\", FavoriteGoods.class);\n\t\tarp.addMapping(\"goods\", \"sn\", Goods.class);\n\t\tarp.addMapping(\"groupon\", \"id\", Groupon.class);\n\t\t// Composite Primary Key order: groupon_id,user_id\n\t\tarp.addMapping(\"groupon_team\", \"groupon_id,user_id\", GrouponTeam.class);\n\t\tarp.addMapping(\"logistics\", \"tracking_no\", Logistics.class);\n\t\tarp.addMapping(\"order_detail\", \"detail_id\", OrderDetail.class);\n\t\tarp.addMapping(\"order_master\", \"order_id\", OrderMaster.class);\n\t\tarp.addMapping(\"product\", \"sn\", Product.class);\n\t\tarp.addMapping(\"product_category\", \"id\", ProductCategory.class);\n\t\tarp.addMapping(\"receiver\", \"id\", Receiver.class);\n\t\tarp.addMapping(\"schedule_job\", \"job_id\", ScheduleJob.class);\n\t\tarp.addMapping(\"schedule_job_log\", \"log_id\", ScheduleJobLog.class);\n\t\tarp.addMapping(\"sn\", \"type\", Sn.class);\n\t\tarp.addMapping(\"specification\", \"id\", Specification.class);\n\t\tarp.addMapping(\"sys_captcha\", \"uuid\", SysCaptcha.class);\n\t\tarp.addMapping(\"sys_config\", \"id\", SysConfig.class);\n\t\tarp.addMapping(\"sys_log\", \"id\", SysLog.class);\n\t\tarp.addMapping(\"sys_menu\", \"menu_id\", SysMenu.class);\n\t\tarp.addMapping(\"sys_oss\", \"id\", SysOss.class);\n\t\tarp.addMapping(\"sys_role\", \"role_id\", SysRole.class);\n\t\tarp.addMapping(\"sys_role_menu\", \"id\", SysRoleMenu.class);\n\t\tarp.addMapping(\"sys_user\", \"user_id\", SysUser.class);\n\t\tarp.addMapping(\"sys_user_role\", \"id\", SysUserRole.class);\n\t\tarp.addMapping(\"sys_user_token\", \"user_id\", SysUserToken.class);\n\t\tarp.addMapping(\"user\", \"user_id\", User.class);\n\t}\n}\n\n"
  },
  {
    "path": "src/main/java/io/sdb/model/base/BaseArea.java",
    "content": "package io.sdb.model.base;\n\nimport com.jfinal.plugin.activerecord.Model;\nimport com.jfinal.plugin.activerecord.IBean;\n\n/**\n * Generated by JFinal, do not modify this file.\n */\n@SuppressWarnings(\"serial\")\npublic abstract class BaseArea<M extends BaseArea<M>> extends Model<M> implements IBean {\n\n\tpublic void setId(java.lang.Long id) {\n\t\tset(\"id\", id);\n\t}\n\t\n\tpublic java.lang.Long getId() {\n\t\treturn getLong(\"id\");\n\t}\n\n\tpublic void setCreateDate(java.util.Date createDate) {\n\t\tset(\"create_date\", createDate);\n\t}\n\t\n\tpublic java.util.Date getCreateDate() {\n\t\treturn get(\"create_date\");\n\t}\n\n\tpublic void setModifyDate(java.util.Date modifyDate) {\n\t\tset(\"modify_date\", modifyDate);\n\t}\n\t\n\tpublic java.util.Date getModifyDate() {\n\t\treturn get(\"modify_date\");\n\t}\n\n\tpublic void setVersion(java.lang.Long version) {\n\t\tset(\"version\", version);\n\t}\n\t\n\tpublic java.lang.Long getVersion() {\n\t\treturn getLong(\"version\");\n\t}\n\n\tpublic void setOrders(java.lang.Integer orders) {\n\t\tset(\"orders\", orders);\n\t}\n\t\n\tpublic java.lang.Integer getOrders() {\n\t\treturn getInt(\"orders\");\n\t}\n\n\tpublic void setFullName(java.lang.String fullName) {\n\t\tset(\"full_name\", fullName);\n\t}\n\t\n\tpublic java.lang.String getFullName() {\n\t\treturn getStr(\"full_name\");\n\t}\n\n\tpublic void setGrade(java.lang.Integer grade) {\n\t\tset(\"grade\", grade);\n\t}\n\t\n\tpublic java.lang.Integer getGrade() {\n\t\treturn getInt(\"grade\");\n\t}\n\n\tpublic void setName(java.lang.String name) {\n\t\tset(\"name\", name);\n\t}\n\t\n\tpublic java.lang.String getName() {\n\t\treturn getStr(\"name\");\n\t}\n\n\tpublic void setTreePath(java.lang.String treePath) {\n\t\tset(\"tree_path\", treePath);\n\t}\n\t\n\tpublic java.lang.String getTreePath() {\n\t\treturn getStr(\"tree_path\");\n\t}\n\n\tpublic void setParentId(java.lang.Long parentId) {\n\t\tset(\"parent_id\", parentId);\n\t}\n\t\n\tpublic java.lang.Long getParentId() {\n\t\treturn getLong(\"parent_id\");\n\t}\n\n}\n"
  },
  {
    "path": "src/main/java/io/sdb/model/base/BaseCampaign.java",
    "content": "package io.sdb.model.base;\n\nimport com.jfinal.plugin.activerecord.Model;\nimport com.jfinal.plugin.activerecord.IBean;\n\n/**\n * Generated by JFinal, do not modify this file.\n */\n@SuppressWarnings(\"serial\")\npublic abstract class BaseCampaign<M extends BaseCampaign<M>> extends Model<M> implements IBean {\n\n\tpublic void setId(java.lang.Long id) {\n\t\tset(\"id\", id);\n\t}\n\t\n\tpublic java.lang.Long getId() {\n\t\treturn getLong(\"id\");\n\t}\n\n\tpublic void setType(java.lang.Integer type) {\n\t\tset(\"type\", type);\n\t}\n\t\n\tpublic java.lang.Integer getType() {\n\t\treturn getInt(\"type\");\n\t}\n\n\tpublic void setParamName1(java.lang.String paramName1) {\n\t\tset(\"param_name1\", paramName1);\n\t}\n\t\n\tpublic java.lang.String getParamName1() {\n\t\treturn getStr(\"param_name1\");\n\t}\n\n\tpublic void setParamValue1(java.lang.String paramValue1) {\n\t\tset(\"param_value1\", paramValue1);\n\t}\n\t\n\tpublic java.lang.String getParamValue1() {\n\t\treturn getStr(\"param_value1\");\n\t}\n\n\tpublic void setParamName2(java.lang.String paramName2) {\n\t\tset(\"param_name2\", paramName2);\n\t}\n\t\n\tpublic java.lang.String getParamName2() {\n\t\treturn getStr(\"param_name2\");\n\t}\n\n\tpublic void setParamValue2(java.lang.String paramValue2) {\n\t\tset(\"param_value2\", paramValue2);\n\t}\n\t\n\tpublic java.lang.String getParamValue2() {\n\t\treturn getStr(\"param_value2\");\n\t}\n\n\tpublic void setParamName3(java.lang.String paramName3) {\n\t\tset(\"param_name3\", paramName3);\n\t}\n\t\n\tpublic java.lang.String getParamName3() {\n\t\treturn getStr(\"param_name3\");\n\t}\n\n\tpublic void setParamValue3(java.lang.String paramValue3) {\n\t\tset(\"param_value3\", paramValue3);\n\t}\n\t\n\tpublic java.lang.String getParamValue3() {\n\t\treturn getStr(\"param_value3\");\n\t}\n\n\tpublic void setStartTime(java.util.Date startTime) {\n\t\tset(\"start_time\", startTime);\n\t}\n\t\n\tpublic java.util.Date getStartTime() {\n\t\treturn get(\"start_time\");\n\t}\n\n\tpublic void setEndTime(java.util.Date endTime) {\n\t\tset(\"end_time\", endTime);\n\t}\n\t\n\tpublic java.util.Date getEndTime() {\n\t\treturn get(\"end_time\");\n\t}\n\n\tpublic void setCreateDate(java.util.Date createDate) {\n\t\tset(\"create_date\", createDate);\n\t}\n\t\n\tpublic java.util.Date getCreateDate() {\n\t\treturn get(\"create_date\");\n\t}\n\n\tpublic void setUpdateDate(java.util.Date updateDate) {\n\t\tset(\"update_date\", updateDate);\n\t}\n\t\n\tpublic java.util.Date getUpdateDate() {\n\t\treturn get(\"update_date\");\n\t}\n\n}\n"
  },
  {
    "path": "src/main/java/io/sdb/model/base/BaseCart.java",
    "content": "package io.sdb.model.base;\n\nimport com.jfinal.plugin.activerecord.Model;\nimport com.jfinal.plugin.activerecord.IBean;\n\n/**\n * Generated by JFinal, do not modify this file.\n */\n@SuppressWarnings(\"serial\")\npublic abstract class BaseCart<M extends BaseCart<M>> extends Model<M> implements IBean {\n\n\tpublic void setId(java.lang.Long id) {\n\t\tset(\"id\", id);\n\t}\n\t\n\tpublic java.lang.Long getId() {\n\t\treturn getLong(\"id\");\n\t}\n\n\tpublic void setUserId(java.lang.String userId) {\n\t\tset(\"user_id\", userId);\n\t}\n\t\n\tpublic java.lang.String getUserId() {\n\t\treturn getStr(\"user_id\");\n\t}\n\n\tpublic void setProductId(java.lang.String productId) {\n\t\tset(\"product_id\", productId);\n\t}\n\t\n\tpublic java.lang.String getProductId() {\n\t\treturn getStr(\"product_id\");\n\t}\n\n\tpublic void setQuantity(java.lang.Integer quantity) {\n\t\tset(\"quantity\", quantity);\n\t}\n\t\n\tpublic java.lang.Integer getQuantity() {\n\t\treturn getInt(\"quantity\");\n\t}\n\n\tpublic void setCreateDate(java.util.Date createDate) {\n\t\tset(\"create_date\", createDate);\n\t}\n\t\n\tpublic java.util.Date getCreateDate() {\n\t\treturn get(\"create_date\");\n\t}\n\n\tpublic void setUpdateDate(java.util.Date updateDate) {\n\t\tset(\"update_date\", updateDate);\n\t}\n\t\n\tpublic java.util.Date getUpdateDate() {\n\t\treturn get(\"update_date\");\n\t}\n\n}\n"
  },
  {
    "path": "src/main/java/io/sdb/model/base/BaseDeliveryCorp.java",
    "content": "package io.sdb.model.base;\n\nimport com.jfinal.plugin.activerecord.Model;\nimport com.jfinal.plugin.activerecord.IBean;\n\n/**\n * Generated by JFinal, do not modify this file.\n */\n@SuppressWarnings(\"serial\")\npublic abstract class BaseDeliveryCorp<M extends BaseDeliveryCorp<M>> extends Model<M> implements IBean {\n\n\tpublic void setCode(java.lang.String code) {\n\t\tset(\"code\", code);\n\t}\n\t\n\tpublic java.lang.String getCode() {\n\t\treturn getStr(\"code\");\n\t}\n\n\tpublic void setName(java.lang.String name) {\n\t\tset(\"name\", name);\n\t}\n\t\n\tpublic java.lang.String getName() {\n\t\treturn getStr(\"name\");\n\t}\n\n\tpublic void setUrl(java.lang.String url) {\n\t\tset(\"url\", url);\n\t}\n\t\n\tpublic java.lang.String getUrl() {\n\t\treturn getStr(\"url\");\n\t}\n\n}\n"
  },
  {
    "path": "src/main/java/io/sdb/model/base/BaseFavoriteGoods.java",
    "content": "package io.sdb.model.base;\n\nimport com.jfinal.plugin.activerecord.Model;\nimport com.jfinal.plugin.activerecord.IBean;\n\n/**\n * Generated by JFinal, do not modify this file.\n */\n@SuppressWarnings(\"serial\")\npublic abstract class BaseFavoriteGoods<M extends BaseFavoriteGoods<M>> extends Model<M> implements IBean {\n\n\tpublic void setFavoriteUser(java.lang.String favoriteUser) {\n\t\tset(\"favorite_user\", favoriteUser);\n\t}\n\t\n\tpublic java.lang.String getFavoriteUser() {\n\t\treturn getStr(\"favorite_user\");\n\t}\n\n\tpublic void setFavoriteGoods(java.lang.String favoriteGoods) {\n\t\tset(\"favorite_goods\", favoriteGoods);\n\t}\n\t\n\tpublic java.lang.String getFavoriteGoods() {\n\t\treturn getStr(\"favorite_goods\");\n\t}\n\n}\n"
  },
  {
    "path": "src/main/java/io/sdb/model/base/BaseGoods.java",
    "content": "package io.sdb.model.base;\n\nimport com.jfinal.plugin.activerecord.Model;\nimport com.jfinal.plugin.activerecord.IBean;\n\n/**\n * Generated by JFinal, do not modify this file.\n */\n@SuppressWarnings(\"serial\")\npublic abstract class BaseGoods<M extends BaseGoods<M>> extends Model<M> implements IBean {\n\n\tpublic void setSn(java.lang.String sn) {\n\t\tset(\"sn\", sn);\n\t}\n\t\n\tpublic java.lang.String getSn() {\n\t\treturn getStr(\"sn\");\n\t}\n\n\tpublic void setName(java.lang.String name) {\n\t\tset(\"name\", name);\n\t}\n\t\n\tpublic java.lang.String getName() {\n\t\treturn getStr(\"name\");\n\t}\n\n\tpublic void setModel(java.lang.String model) {\n\t\tset(\"model\", model);\n\t}\n\t\n\tpublic java.lang.String getModel() {\n\t\treturn getStr(\"model\");\n\t}\n\n\tpublic void setCaption(java.lang.String caption) {\n\t\tset(\"caption\", caption);\n\t}\n\t\n\tpublic java.lang.String getCaption() {\n\t\treturn getStr(\"caption\");\n\t}\n\n\tpublic void setImage(java.lang.String image) {\n\t\tset(\"image\", image);\n\t}\n\t\n\tpublic java.lang.String getImage() {\n\t\treturn getStr(\"image\");\n\t}\n\n\tpublic void setPrice(java.math.BigDecimal price) {\n\t\tset(\"price\", price);\n\t}\n\t\n\tpublic java.math.BigDecimal getPrice() {\n\t\treturn get(\"price\");\n\t}\n\n\tpublic void setIsDelivery(java.lang.Boolean isDelivery) {\n\t\tset(\"is_delivery\", isDelivery);\n\t}\n\t\n\tpublic java.lang.Boolean getIsDelivery() {\n\t\treturn get(\"is_delivery\");\n\t}\n\n\tpublic void setIsMarketable(java.lang.Boolean isMarketable) {\n\t\tset(\"is_marketable\", isMarketable);\n\t}\n\t\n\tpublic java.lang.Boolean getIsMarketable() {\n\t\treturn get(\"is_marketable\");\n\t}\n\n\tpublic void setParameterValues(java.lang.String parameterValues) {\n\t\tset(\"parameter_values\", parameterValues);\n\t}\n\t\n\tpublic java.lang.String getParameterValues() {\n\t\treturn getStr(\"parameter_values\");\n\t}\n\n\tpublic void setSpecificationItems(java.lang.String specificationItems) {\n\t\tset(\"specification_items\", specificationItems);\n\t}\n\t\n\tpublic java.lang.String getSpecificationItems() {\n\t\treturn getStr(\"specification_items\");\n\t}\n\n\tpublic void setIntroduction(java.lang.String introduction) {\n\t\tset(\"introduction\", introduction);\n\t}\n\t\n\tpublic java.lang.String getIntroduction() {\n\t\treturn getStr(\"introduction\");\n\t}\n\n\tpublic void setProductImages(java.lang.String productImages) {\n\t\tset(\"product_images\", productImages);\n\t}\n\t\n\tpublic java.lang.String getProductImages() {\n\t\treturn getStr(\"product_images\");\n\t}\n\n\tpublic void setCampaign(java.lang.Integer campaign) {\n\t\tset(\"campaign\", campaign);\n\t}\n\t\n\tpublic java.lang.Integer getCampaign() {\n\t\treturn getInt(\"campaign\");\n\t}\n\n\tpublic void setGrouponCount(java.lang.Integer grouponCount) {\n\t\tset(\"groupon_count\", grouponCount);\n\t}\n\t\n\tpublic java.lang.Integer getGrouponCount() {\n\t\treturn getInt(\"groupon_count\");\n\t}\n\n\tpublic void setWeight(java.lang.Float weight) {\n\t\tset(\"weight\", weight);\n\t}\n\t\n\tpublic java.lang.Float getWeight() {\n\t\treturn getFloat(\"weight\");\n\t}\n\n\tpublic void setUnit(java.lang.String unit) {\n\t\tset(\"unit\", unit);\n\t}\n\t\n\tpublic java.lang.String getUnit() {\n\t\treturn getStr(\"unit\");\n\t}\n\n\tpublic void setProductCategoryId(java.lang.Long productCategoryId) {\n\t\tset(\"product_category_id\", productCategoryId);\n\t}\n\t\n\tpublic java.lang.Long getProductCategoryId() {\n\t\treturn getLong(\"product_category_id\");\n\t}\n\n\tpublic void setCreateDate(java.util.Date createDate) {\n\t\tset(\"create_date\", createDate);\n\t}\n\t\n\tpublic java.util.Date getCreateDate() {\n\t\treturn get(\"create_date\");\n\t}\n\n\tpublic void setUpdateDate(java.util.Date updateDate) {\n\t\tset(\"update_date\", updateDate);\n\t}\n\t\n\tpublic java.util.Date getUpdateDate() {\n\t\treturn get(\"update_date\");\n\t}\n\n}\n"
  },
  {
    "path": "src/main/java/io/sdb/model/base/BaseGroupon.java",
    "content": "package io.sdb.model.base;\n\nimport com.jfinal.plugin.activerecord.Model;\nimport com.jfinal.plugin.activerecord.IBean;\n\n/**\n * Generated by JFinal, do not modify this file.\n */\n@SuppressWarnings(\"serial\")\npublic abstract class BaseGroupon<M extends BaseGroupon<M>> extends Model<M> implements IBean {\n\n\tpublic void setId(java.lang.String id) {\n\t\tset(\"id\", id);\n\t}\n\t\n\tpublic java.lang.String getId() {\n\t\treturn getStr(\"id\");\n\t}\n\n\tpublic void setGoodsId(java.lang.String goodsId) {\n\t\tset(\"goods_id\", goodsId);\n\t}\n\t\n\tpublic java.lang.String getGoodsId() {\n\t\treturn getStr(\"goods_id\");\n\t}\n\n\tpublic void setCount(java.lang.Integer count) {\n\t\tset(\"count\", count);\n\t}\n\t\n\tpublic java.lang.Integer getCount() {\n\t\treturn getInt(\"count\");\n\t}\n\n\tpublic void setStatus(java.lang.Integer status) {\n\t\tset(\"status\", status);\n\t}\n\t\n\tpublic java.lang.Integer getStatus() {\n\t\treturn getInt(\"status\");\n\t}\n\n\tpublic void setExpireDate(java.util.Date expireDate) {\n\t\tset(\"expire_date\", expireDate);\n\t}\n\t\n\tpublic java.util.Date getExpireDate() {\n\t\treturn get(\"expire_date\");\n\t}\n\n\tpublic void setCreateDate(java.util.Date createDate) {\n\t\tset(\"create_date\", createDate);\n\t}\n\t\n\tpublic java.util.Date getCreateDate() {\n\t\treturn get(\"create_date\");\n\t}\n\n\tpublic void setUpdateDate(java.util.Date updateDate) {\n\t\tset(\"update_date\", updateDate);\n\t}\n\t\n\tpublic java.util.Date getUpdateDate() {\n\t\treturn get(\"update_date\");\n\t}\n\n}\n"
  },
  {
    "path": "src/main/java/io/sdb/model/base/BaseGrouponTeam.java",
    "content": "package io.sdb.model.base;\n\nimport com.jfinal.plugin.activerecord.Model;\nimport com.jfinal.plugin.activerecord.IBean;\n\n/**\n * Generated by JFinal, do not modify this file.\n */\n@SuppressWarnings(\"serial\")\npublic abstract class BaseGrouponTeam<M extends BaseGrouponTeam<M>> extends Model<M> implements IBean {\n\n\tpublic void setGrouponId(java.lang.String grouponId) {\n\t\tset(\"groupon_id\", grouponId);\n\t}\n\t\n\tpublic java.lang.String getGrouponId() {\n\t\treturn getStr(\"groupon_id\");\n\t}\n\n\tpublic void setUserId(java.lang.String userId) {\n\t\tset(\"user_id\", userId);\n\t}\n\t\n\tpublic java.lang.String getUserId() {\n\t\treturn getStr(\"user_id\");\n\t}\n\n\tpublic void setCaptain(java.lang.Integer captain) {\n\t\tset(\"captain\", captain);\n\t}\n\t\n\tpublic java.lang.Integer getCaptain() {\n\t\treturn getInt(\"captain\");\n\t}\n\n\tpublic void setCreateDate(java.util.Date createDate) {\n\t\tset(\"create_date\", createDate);\n\t}\n\t\n\tpublic java.util.Date getCreateDate() {\n\t\treturn get(\"create_date\");\n\t}\n\n\tpublic void setUpdateDate(java.util.Date updateDate) {\n\t\tset(\"update_date\", updateDate);\n\t}\n\t\n\tpublic java.util.Date getUpdateDate() {\n\t\treturn get(\"update_date\");\n\t}\n\n}\n"
  },
  {
    "path": "src/main/java/io/sdb/model/base/BaseLogistics.java",
    "content": "package io.sdb.model.base;\n\nimport com.jfinal.plugin.activerecord.Model;\nimport com.jfinal.plugin.activerecord.IBean;\n\n/**\n * Generated by JFinal, do not modify this file.\n */\n@SuppressWarnings(\"serial\")\npublic abstract class BaseLogistics<M extends BaseLogistics<M>> extends Model<M> implements IBean {\n\n\tpublic void setTrackingNo(java.lang.String trackingNo) {\n\t\tset(\"tracking_no\", trackingNo);\n\t}\n\t\n\tpublic java.lang.String getTrackingNo() {\n\t\treturn getStr(\"tracking_no\");\n\t}\n\n\tpublic void setCheckState(java.lang.Integer checkState) {\n\t\tset(\"check_state\", checkState);\n\t}\n\t\n\tpublic java.lang.Integer getCheckState() {\n\t\treturn getInt(\"check_state\");\n\t}\n\n\tpublic void setOrderState(java.lang.Integer orderState) {\n\t\tset(\"order_state\", orderState);\n\t}\n\t\n\tpublic java.lang.Integer getOrderState() {\n\t\treturn getInt(\"order_state\");\n\t}\n\n\tpublic void setData(java.lang.String data) {\n\t\tset(\"data\", data);\n\t}\n\t\n\tpublic java.lang.String getData() {\n\t\treturn getStr(\"data\");\n\t}\n\n\tpublic void setCreateDate(java.util.Date createDate) {\n\t\tset(\"create_date\", createDate);\n\t}\n\t\n\tpublic java.util.Date getCreateDate() {\n\t\treturn get(\"create_date\");\n\t}\n\n\tpublic void setUpdateDate(java.util.Date updateDate) {\n\t\tset(\"update_date\", updateDate);\n\t}\n\t\n\tpublic java.util.Date getUpdateDate() {\n\t\treturn get(\"update_date\");\n\t}\n\n}\n"
  },
  {
    "path": "src/main/java/io/sdb/model/base/BaseOrderDetail.java",
    "content": "package io.sdb.model.base;\n\nimport com.jfinal.plugin.activerecord.Model;\nimport com.jfinal.plugin.activerecord.IBean;\n\n/**\n * Generated by JFinal, do not modify this file.\n */\n@SuppressWarnings(\"serial\")\npublic abstract class BaseOrderDetail<M extends BaseOrderDetail<M>> extends Model<M> implements IBean {\n\n\tpublic void setDetailId(java.lang.String detailId) {\n\t\tset(\"detail_id\", detailId);\n\t}\n\t\n\tpublic java.lang.String getDetailId() {\n\t\treturn getStr(\"detail_id\");\n\t}\n\n\tpublic void setOrderId(java.lang.String orderId) {\n\t\tset(\"order_id\", orderId);\n\t}\n\t\n\tpublic java.lang.String getOrderId() {\n\t\treturn getStr(\"order_id\");\n\t}\n\n\tpublic void setProductId(java.lang.String productId) {\n\t\tset(\"product_id\", productId);\n\t}\n\t\n\tpublic java.lang.String getProductId() {\n\t\treturn getStr(\"product_id\");\n\t}\n\n\tpublic void setProductName(java.lang.String productName) {\n\t\tset(\"product_name\", productName);\n\t}\n\t\n\tpublic java.lang.String getProductName() {\n\t\treturn getStr(\"product_name\");\n\t}\n\n\tpublic void setProductModel(java.lang.String productModel) {\n\t\tset(\"product_model\", productModel);\n\t}\n\t\n\tpublic java.lang.String getProductModel() {\n\t\treturn getStr(\"product_model\");\n\t}\n\n\tpublic void setProductSpec(java.lang.String productSpec) {\n\t\tset(\"product_spec\", productSpec);\n\t}\n\t\n\tpublic java.lang.String getProductSpec() {\n\t\treturn getStr(\"product_spec\");\n\t}\n\n\tpublic void setGroupPrice(java.math.BigDecimal groupPrice) {\n\t\tset(\"group_price\", groupPrice);\n\t}\n\t\n\tpublic java.math.BigDecimal getGroupPrice() {\n\t\treturn get(\"group_price\");\n\t}\n\n\tpublic void setProductPrice(java.math.BigDecimal productPrice) {\n\t\tset(\"product_price\", productPrice);\n\t}\n\t\n\tpublic java.math.BigDecimal getProductPrice() {\n\t\treturn get(\"product_price\");\n\t}\n\n\tpublic void setProductQuantity(java.lang.Integer productQuantity) {\n\t\tset(\"product_quantity\", productQuantity);\n\t}\n\t\n\tpublic java.lang.Integer getProductQuantity() {\n\t\treturn getInt(\"product_quantity\");\n\t}\n\n\tpublic void setProductIcon(java.lang.String productIcon) {\n\t\tset(\"product_icon\", productIcon);\n\t}\n\t\n\tpublic java.lang.String getProductIcon() {\n\t\treturn getStr(\"product_icon\");\n\t}\n\n\tpublic void setCreateDate(java.util.Date createDate) {\n\t\tset(\"create_date\", createDate);\n\t}\n\t\n\tpublic java.util.Date getCreateDate() {\n\t\treturn get(\"create_date\");\n\t}\n\n\tpublic void setUpdateDate(java.util.Date updateDate) {\n\t\tset(\"update_date\", updateDate);\n\t}\n\t\n\tpublic java.util.Date getUpdateDate() {\n\t\treturn get(\"update_date\");\n\t}\n\n}\n"
  },
  {
    "path": "src/main/java/io/sdb/model/base/BaseOrderMaster.java",
    "content": "package io.sdb.model.base;\n\nimport com.jfinal.plugin.activerecord.Model;\nimport com.jfinal.plugin.activerecord.IBean;\n\n/**\n * Generated by JFinal, do not modify this file.\n */\n@SuppressWarnings(\"serial\")\npublic abstract class BaseOrderMaster<M extends BaseOrderMaster<M>> extends Model<M> implements IBean {\n\n\tpublic void setOrderId(java.lang.String orderId) {\n\t\tset(\"order_id\", orderId);\n\t}\n\t\n\tpublic java.lang.String getOrderId() {\n\t\treturn getStr(\"order_id\");\n\t}\n\n\tpublic void setBuyerName(java.lang.String buyerName) {\n\t\tset(\"buyer_name\", buyerName);\n\t}\n\t\n\tpublic java.lang.String getBuyerName() {\n\t\treturn getStr(\"buyer_name\");\n\t}\n\n\tpublic void setBuyerPhone(java.lang.String buyerPhone) {\n\t\tset(\"buyer_phone\", buyerPhone);\n\t}\n\t\n\tpublic java.lang.String getBuyerPhone() {\n\t\treturn getStr(\"buyer_phone\");\n\t}\n\n\tpublic void setBuyerAddress(java.lang.String buyerAddress) {\n\t\tset(\"buyer_address\", buyerAddress);\n\t}\n\t\n\tpublic java.lang.String getBuyerAddress() {\n\t\treturn getStr(\"buyer_address\");\n\t}\n\n\tpublic void setBuyerId(java.lang.String buyerId) {\n\t\tset(\"buyer_id\", buyerId);\n\t}\n\t\n\tpublic java.lang.String getBuyerId() {\n\t\treturn getStr(\"buyer_id\");\n\t}\n\n\tpublic void setNeedInvoice(java.lang.Integer needInvoice) {\n\t\tset(\"need_invoice\", needInvoice);\n\t}\n\t\n\tpublic java.lang.Integer getNeedInvoice() {\n\t\treturn getInt(\"need_invoice\");\n\t}\n\n\tpublic void setInvoiceType(java.lang.Integer invoiceType) {\n\t\tset(\"invoice_type\", invoiceType);\n\t}\n\t\n\tpublic java.lang.Integer getInvoiceType() {\n\t\treturn getInt(\"invoice_type\");\n\t}\n\n\tpublic void setGroupon(java.lang.Integer groupon) {\n\t\tset(\"groupon\", groupon);\n\t}\n\t\n\tpublic java.lang.Integer getGroupon() {\n\t\treturn getInt(\"groupon\");\n\t}\n\n\tpublic void setGrouponId(java.lang.String grouponId) {\n\t\tset(\"groupon_id\", grouponId);\n\t}\n\t\n\tpublic java.lang.String getGrouponId() {\n\t\treturn getStr(\"groupon_id\");\n\t}\n\n\tpublic void setGrouponCount(java.lang.Integer grouponCount) {\n\t\tset(\"groupon_count\", grouponCount);\n\t}\n\t\n\tpublic java.lang.Integer getGrouponCount() {\n\t\treturn getInt(\"groupon_count\");\n\t}\n\n\tpublic void setTitle(java.lang.String title) {\n\t\tset(\"title\", title);\n\t}\n\t\n\tpublic java.lang.String getTitle() {\n\t\treturn getStr(\"title\");\n\t}\n\n\tpublic void setTaxNumber(java.lang.String taxNumber) {\n\t\tset(\"tax_number\", taxNumber);\n\t}\n\t\n\tpublic java.lang.String getTaxNumber() {\n\t\treturn getStr(\"tax_number\");\n\t}\n\n\tpublic void setCompanyAddress(java.lang.String companyAddress) {\n\t\tset(\"company_address\", companyAddress);\n\t}\n\t\n\tpublic java.lang.String getCompanyAddress() {\n\t\treturn getStr(\"company_address\");\n\t}\n\n\tpublic void setTelephone(java.lang.String telephone) {\n\t\tset(\"telephone\", telephone);\n\t}\n\t\n\tpublic java.lang.String getTelephone() {\n\t\treturn getStr(\"telephone\");\n\t}\n\n\tpublic void setBankName(java.lang.String bankName) {\n\t\tset(\"bank_name\", bankName);\n\t}\n\t\n\tpublic java.lang.String getBankName() {\n\t\treturn getStr(\"bank_name\");\n\t}\n\n\tpublic void setBankAccount(java.lang.String bankAccount) {\n\t\tset(\"bank_account\", bankAccount);\n\t}\n\t\n\tpublic java.lang.String getBankAccount() {\n\t\treturn getStr(\"bank_account\");\n\t}\n\n\tpublic void setOrderAmount(java.math.BigDecimal orderAmount) {\n\t\tset(\"order_amount\", orderAmount);\n\t}\n\t\n\tpublic java.math.BigDecimal getOrderAmount() {\n\t\treturn get(\"order_amount\");\n\t}\n\n\tpublic void setOrderStatus(java.lang.Integer orderStatus) {\n\t\tset(\"order_status\", orderStatus);\n\t}\n\t\n\tpublic java.lang.Integer getOrderStatus() {\n\t\treturn getInt(\"order_status\");\n\t}\n\n\tpublic void setTrackingNumber(java.lang.String trackingNumber) {\n\t\tset(\"tracking_number\", trackingNumber);\n\t}\n\t\n\tpublic java.lang.String getTrackingNumber() {\n\t\treturn getStr(\"tracking_number\");\n\t}\n\n\tpublic void setDeliveryCode(java.lang.String deliveryCode) {\n\t\tset(\"delivery_code\", deliveryCode);\n\t}\n\t\n\tpublic java.lang.String getDeliveryCode() {\n\t\treturn getStr(\"delivery_code\");\n\t}\n\n\tpublic void setRefundTradeNo(java.lang.String refundTradeNo) {\n\t\tset(\"refund_trade_no\", refundTradeNo);\n\t}\n\t\n\tpublic java.lang.String getRefundTradeNo() {\n\t\treturn getStr(\"refund_trade_no\");\n\t}\n\n\tpublic void setPayTradeNo(java.lang.String payTradeNo) {\n\t\tset(\"pay_trade_no\", payTradeNo);\n\t}\n\t\n\tpublic java.lang.String getPayTradeNo() {\n\t\treturn getStr(\"pay_trade_no\");\n\t}\n\n\tpublic void setPayStatus(java.lang.Integer payStatus) {\n\t\tset(\"pay_status\", payStatus);\n\t}\n\t\n\tpublic java.lang.Integer getPayStatus() {\n\t\treturn getInt(\"pay_status\");\n\t}\n\n\tpublic void setRemark(java.lang.String remark) {\n\t\tset(\"remark\", remark);\n\t}\n\t\n\tpublic java.lang.String getRemark() {\n\t\treturn getStr(\"remark\");\n\t}\n\n\tpublic void setContract(java.lang.String contract) {\n\t\tset(\"contract\", contract);\n\t}\n\t\n\tpublic java.lang.String getContract() {\n\t\treturn getStr(\"contract\");\n\t}\n\n\tpublic void setCreateDate(java.util.Date createDate) {\n\t\tset(\"create_date\", createDate);\n\t}\n\t\n\tpublic java.util.Date getCreateDate() {\n\t\treturn get(\"create_date\");\n\t}\n\n\tpublic void setUpdateDate(java.util.Date updateDate) {\n\t\tset(\"update_date\", updateDate);\n\t}\n\t\n\tpublic java.util.Date getUpdateDate() {\n\t\treturn get(\"update_date\");\n\t}\n\n}\n"
  },
  {
    "path": "src/main/java/io/sdb/model/base/BaseProduct.java",
    "content": "package io.sdb.model.base;\n\nimport com.jfinal.plugin.activerecord.Model;\nimport com.jfinal.plugin.activerecord.IBean;\n\n/**\n * Generated by JFinal, do not modify this file.\n */\n@SuppressWarnings(\"serial\")\npublic abstract class BaseProduct<M extends BaseProduct<M>> extends Model<M> implements IBean {\n\n\tpublic void setSn(java.lang.String sn) {\n\t\tset(\"sn\", sn);\n\t}\n\t\n\tpublic java.lang.String getSn() {\n\t\treturn getStr(\"sn\");\n\t}\n\n\tpublic void setPrice(java.math.BigDecimal price) {\n\t\tset(\"price\", price);\n\t}\n\t\n\tpublic java.math.BigDecimal getPrice() {\n\t\treturn get(\"price\");\n\t}\n\n\tpublic void setGroupPrice(java.math.BigDecimal groupPrice) {\n\t\tset(\"group_price\", groupPrice);\n\t}\n\t\n\tpublic java.math.BigDecimal getGroupPrice() {\n\t\treturn get(\"group_price\");\n\t}\n\n\tpublic void setCost(java.math.BigDecimal cost) {\n\t\tset(\"cost\", cost);\n\t}\n\t\n\tpublic java.math.BigDecimal getCost() {\n\t\treturn get(\"cost\");\n\t}\n\n\tpublic void setIsDefault(java.lang.Boolean isDefault) {\n\t\tset(\"is_default\", isDefault);\n\t}\n\t\n\tpublic java.lang.Boolean getIsDefault() {\n\t\treturn get(\"is_default\");\n\t}\n\n\tpublic void setSpecificationValues(java.lang.String specificationValues) {\n\t\tset(\"specification_values\", specificationValues);\n\t}\n\t\n\tpublic java.lang.String getSpecificationValues() {\n\t\treturn getStr(\"specification_values\");\n\t}\n\n\tpublic void setStock(java.lang.Integer stock) {\n\t\tset(\"stock\", stock);\n\t}\n\t\n\tpublic java.lang.Integer getStock() {\n\t\treturn getInt(\"stock\");\n\t}\n\n\tpublic void setGoodsSn(java.lang.String goodsSn) {\n\t\tset(\"goods_sn\", goodsSn);\n\t}\n\t\n\tpublic java.lang.String getGoodsSn() {\n\t\treturn getStr(\"goods_sn\");\n\t}\n\n\tpublic void setEnable(java.lang.Boolean enable) {\n\t\tset(\"enable\", enable);\n\t}\n\t\n\tpublic java.lang.Boolean getEnable() {\n\t\treturn get(\"enable\");\n\t}\n\n\tpublic void setCreateDate(java.util.Date createDate) {\n\t\tset(\"create_date\", createDate);\n\t}\n\t\n\tpublic java.util.Date getCreateDate() {\n\t\treturn get(\"create_date\");\n\t}\n\n\tpublic void setUpdateDate(java.util.Date updateDate) {\n\t\tset(\"update_date\", updateDate);\n\t}\n\t\n\tpublic java.util.Date getUpdateDate() {\n\t\treturn get(\"update_date\");\n\t}\n\n}\n"
  },
  {
    "path": "src/main/java/io/sdb/model/base/BaseProductCategory.java",
    "content": "package io.sdb.model.base;\n\nimport com.jfinal.plugin.activerecord.Model;\nimport com.jfinal.plugin.activerecord.IBean;\n\n/**\n * Generated by JFinal, do not modify this file.\n */\n@SuppressWarnings(\"serial\")\npublic abstract class BaseProductCategory<M extends BaseProductCategory<M>> extends Model<M> implements IBean {\n\n\tpublic void setId(java.lang.Long id) {\n\t\tset(\"id\", id);\n\t}\n\t\n\tpublic java.lang.Long getId() {\n\t\treturn getLong(\"id\");\n\t}\n\n\tpublic void setName(java.lang.String name) {\n\t\tset(\"name\", name);\n\t}\n\t\n\tpublic java.lang.String getName() {\n\t\treturn getStr(\"name\");\n\t}\n\n\tpublic void setParentId(java.lang.Long parentId) {\n\t\tset(\"parent_id\", parentId);\n\t}\n\t\n\tpublic java.lang.Long getParentId() {\n\t\treturn getLong(\"parent_id\");\n\t}\n\n\tpublic void setTreePath(java.lang.String treePath) {\n\t\tset(\"tree_path\", treePath);\n\t}\n\t\n\tpublic java.lang.String getTreePath() {\n\t\treturn getStr(\"tree_path\");\n\t}\n\n\tpublic void setOrder(java.lang.Integer order) {\n\t\tset(\"order\", order);\n\t}\n\t\n\tpublic java.lang.Integer getOrder() {\n\t\treturn getInt(\"order\");\n\t}\n\n\tpublic void setCreateDate(java.util.Date createDate) {\n\t\tset(\"create_date\", createDate);\n\t}\n\t\n\tpublic java.util.Date getCreateDate() {\n\t\treturn get(\"create_date\");\n\t}\n\n\tpublic void setUpdateDate(java.util.Date updateDate) {\n\t\tset(\"update_date\", updateDate);\n\t}\n\t\n\tpublic java.util.Date getUpdateDate() {\n\t\treturn get(\"update_date\");\n\t}\n\n}\n"
  },
  {
    "path": "src/main/java/io/sdb/model/base/BaseReceiver.java",
    "content": "package io.sdb.model.base;\n\nimport com.jfinal.plugin.activerecord.Model;\nimport com.jfinal.plugin.activerecord.IBean;\n\n/**\n * Generated by JFinal, do not modify this file.\n */\n@SuppressWarnings(\"serial\")\npublic abstract class BaseReceiver<M extends BaseReceiver<M>> extends Model<M> implements IBean {\n\n\tpublic void setId(java.lang.Long id) {\n\t\tset(\"id\", id);\n\t}\n\t\n\tpublic java.lang.Long getId() {\n\t\treturn getLong(\"id\");\n\t}\n\n\tpublic void setAddress(java.lang.String address) {\n\t\tset(\"address\", address);\n\t}\n\t\n\tpublic java.lang.String getAddress() {\n\t\treturn getStr(\"address\");\n\t}\n\n\tpublic void setAreaName(java.lang.String areaName) {\n\t\tset(\"area_name\", areaName);\n\t}\n\t\n\tpublic java.lang.String getAreaName() {\n\t\treturn getStr(\"area_name\");\n\t}\n\n\tpublic void setConsignee(java.lang.String consignee) {\n\t\tset(\"consignee\", consignee);\n\t}\n\t\n\tpublic java.lang.String getConsignee() {\n\t\treturn getStr(\"consignee\");\n\t}\n\n\tpublic void setIsDefault(java.lang.Boolean isDefault) {\n\t\tset(\"is_default\", isDefault);\n\t}\n\t\n\tpublic java.lang.Boolean getIsDefault() {\n\t\treturn get(\"is_default\");\n\t}\n\n\tpublic void setPhone(java.lang.String phone) {\n\t\tset(\"phone\", phone);\n\t}\n\t\n\tpublic java.lang.String getPhone() {\n\t\treturn getStr(\"phone\");\n\t}\n\n\tpublic void setZipCode(java.lang.String zipCode) {\n\t\tset(\"zip_code\", zipCode);\n\t}\n\t\n\tpublic java.lang.String getZipCode() {\n\t\treturn getStr(\"zip_code\");\n\t}\n\n\tpublic void setAreaId(java.lang.Long areaId) {\n\t\tset(\"area_id\", areaId);\n\t}\n\t\n\tpublic java.lang.Long getAreaId() {\n\t\treturn getLong(\"area_id\");\n\t}\n\n\tpublic void setMemberId(java.lang.String memberId) {\n\t\tset(\"member_id\", memberId);\n\t}\n\t\n\tpublic java.lang.String getMemberId() {\n\t\treturn getStr(\"member_id\");\n\t}\n\n\tpublic void setCreateDate(java.util.Date createDate) {\n\t\tset(\"create_date\", createDate);\n\t}\n\t\n\tpublic java.util.Date getCreateDate() {\n\t\treturn get(\"create_date\");\n\t}\n\n\tpublic void setUpdateDate(java.util.Date updateDate) {\n\t\tset(\"update_date\", updateDate);\n\t}\n\t\n\tpublic java.util.Date getUpdateDate() {\n\t\treturn get(\"update_date\");\n\t}\n\n}\n"
  },
  {
    "path": "src/main/java/io/sdb/model/base/BaseScheduleJob.java",
    "content": "package io.sdb.model.base;\n\nimport com.jfinal.plugin.activerecord.Model;\nimport com.jfinal.plugin.activerecord.IBean;\n\n/**\n * Generated by JFinal, do not modify this file.\n */\n@SuppressWarnings(\"serial\")\npublic abstract class BaseScheduleJob<M extends BaseScheduleJob<M>> extends Model<M> implements IBean {\n\n\tpublic void setJobId(java.lang.Long jobId) {\n\t\tset(\"job_id\", jobId);\n\t}\n\t\n\tpublic java.lang.Long getJobId() {\n\t\treturn getLong(\"job_id\");\n\t}\n\n\tpublic void setBeanName(java.lang.String beanName) {\n\t\tset(\"bean_name\", beanName);\n\t}\n\t\n\tpublic java.lang.String getBeanName() {\n\t\treturn getStr(\"bean_name\");\n\t}\n\n\tpublic void setMethodName(java.lang.String methodName) {\n\t\tset(\"method_name\", methodName);\n\t}\n\t\n\tpublic java.lang.String getMethodName() {\n\t\treturn getStr(\"method_name\");\n\t}\n\n\tpublic void setParams(java.lang.String params) {\n\t\tset(\"params\", params);\n\t}\n\t\n\tpublic java.lang.String getParams() {\n\t\treturn getStr(\"params\");\n\t}\n\n\tpublic void setCronExpression(java.lang.String cronExpression) {\n\t\tset(\"cron_expression\", cronExpression);\n\t}\n\t\n\tpublic java.lang.String getCronExpression() {\n\t\treturn getStr(\"cron_expression\");\n\t}\n\n\tpublic void setStatus(java.lang.Integer status) {\n\t\tset(\"status\", status);\n\t}\n\t\n\tpublic java.lang.Integer getStatus() {\n\t\treturn getInt(\"status\");\n\t}\n\n\tpublic void setRemark(java.lang.String remark) {\n\t\tset(\"remark\", remark);\n\t}\n\t\n\tpublic java.lang.String getRemark() {\n\t\treturn getStr(\"remark\");\n\t}\n\n\tpublic void setCreateTime(java.util.Date createTime) {\n\t\tset(\"create_time\", createTime);\n\t}\n\t\n\tpublic java.util.Date getCreateTime() {\n\t\treturn get(\"create_time\");\n\t}\n\n}\n"
  },
  {
    "path": "src/main/java/io/sdb/model/base/BaseScheduleJobLog.java",
    "content": "package io.sdb.model.base;\n\nimport com.jfinal.plugin.activerecord.Model;\nimport com.jfinal.plugin.activerecord.IBean;\n\n/**\n * Generated by JFinal, do not modify this file.\n */\n@SuppressWarnings(\"serial\")\npublic abstract class BaseScheduleJobLog<M extends BaseScheduleJobLog<M>> extends Model<M> implements IBean {\n\n\tpublic void setLogId(java.lang.Long logId) {\n\t\tset(\"log_id\", logId);\n\t}\n\t\n\tpublic java.lang.Long getLogId() {\n\t\treturn getLong(\"log_id\");\n\t}\n\n\tpublic void setJobId(java.lang.Long jobId) {\n\t\tset(\"job_id\", jobId);\n\t}\n\t\n\tpublic java.lang.Long getJobId() {\n\t\treturn getLong(\"job_id\");\n\t}\n\n\tpublic void setBeanName(java.lang.String beanName) {\n\t\tset(\"bean_name\", beanName);\n\t}\n\t\n\tpublic java.lang.String getBeanName() {\n\t\treturn getStr(\"bean_name\");\n\t}\n\n\tpublic void setMethodName(java.lang.String methodName) {\n\t\tset(\"method_name\", methodName);\n\t}\n\t\n\tpublic java.lang.String getMethodName() {\n\t\treturn getStr(\"method_name\");\n\t}\n\n\tpublic void setParams(java.lang.String params) {\n\t\tset(\"params\", params);\n\t}\n\t\n\tpublic java.lang.String getParams() {\n\t\treturn getStr(\"params\");\n\t}\n\n\tpublic void setStatus(java.lang.Integer status) {\n\t\tset(\"status\", status);\n\t}\n\t\n\tpublic java.lang.Integer getStatus() {\n\t\treturn getInt(\"status\");\n\t}\n\n\tpublic void setError(java.lang.String error) {\n\t\tset(\"error\", error);\n\t}\n\t\n\tpublic java.lang.String getError() {\n\t\treturn getStr(\"error\");\n\t}\n\n\tpublic void setTimes(java.lang.Integer times) {\n\t\tset(\"times\", times);\n\t}\n\t\n\tpublic java.lang.Integer getTimes() {\n\t\treturn getInt(\"times\");\n\t}\n\n\tpublic void setCreateTime(java.util.Date createTime) {\n\t\tset(\"create_time\", createTime);\n\t}\n\t\n\tpublic java.util.Date getCreateTime() {\n\t\treturn get(\"create_time\");\n\t}\n\n}\n"
  },
  {
    "path": "src/main/java/io/sdb/model/base/BaseSn.java",
    "content": "package io.sdb.model.base;\n\nimport com.jfinal.plugin.activerecord.Model;\nimport com.jfinal.plugin.activerecord.IBean;\n\n/**\n * Generated by JFinal, do not modify this file.\n */\n@SuppressWarnings(\"serial\")\npublic abstract class BaseSn<M extends BaseSn<M>> extends Model<M> implements IBean {\n\n\tpublic void setType(java.lang.Integer type) {\n\t\tset(\"type\", type);\n\t}\n\t\n\tpublic java.lang.Integer getType() {\n\t\treturn getInt(\"type\");\n\t}\n\n\tpublic void setLastValue(java.lang.Long lastValue) {\n\t\tset(\"last_value\", lastValue);\n\t}\n\t\n\tpublic java.lang.Long getLastValue() {\n\t\treturn getLong(\"last_value\");\n\t}\n\n\tpublic void setCreateDate(java.util.Date createDate) {\n\t\tset(\"create_date\", createDate);\n\t}\n\t\n\tpublic java.util.Date getCreateDate() {\n\t\treturn get(\"create_date\");\n\t}\n\n\tpublic void setModifyDate(java.util.Date modifyDate) {\n\t\tset(\"modify_date\", modifyDate);\n\t}\n\t\n\tpublic java.util.Date getModifyDate() {\n\t\treturn get(\"modify_date\");\n\t}\n\n}\n"
  },
  {
    "path": "src/main/java/io/sdb/model/base/BaseSpecification.java",
    "content": "package io.sdb.model.base;\n\nimport com.jfinal.plugin.activerecord.Model;\nimport com.jfinal.plugin.activerecord.IBean;\n\n/**\n * Generated by JFinal, do not modify this file.\n */\n@SuppressWarnings(\"serial\")\npublic abstract class BaseSpecification<M extends BaseSpecification<M>> extends Model<M> implements IBean {\n\n\tpublic void setId(java.lang.Long id) {\n\t\tset(\"id\", id);\n\t}\n\t\n\tpublic java.lang.Long getId() {\n\t\treturn getLong(\"id\");\n\t}\n\n\tpublic void setParentId(java.lang.Long parentId) {\n\t\tset(\"parent_id\", parentId);\n\t}\n\t\n\tpublic java.lang.Long getParentId() {\n\t\treturn getLong(\"parent_id\");\n\t}\n\n\tpublic void setType(java.lang.Integer type) {\n\t\tset(\"type\", type);\n\t}\n\t\n\tpublic java.lang.Integer getType() {\n\t\treturn getInt(\"type\");\n\t}\n\n\tpublic void setOrder(java.lang.Integer order) {\n\t\tset(\"order\", order);\n\t}\n\t\n\tpublic java.lang.Integer getOrder() {\n\t\treturn getInt(\"order\");\n\t}\n\n\tpublic void setName(java.lang.String name) {\n\t\tset(\"name\", name);\n\t}\n\t\n\tpublic java.lang.String getName() {\n\t\treturn getStr(\"name\");\n\t}\n\n\tpublic void setCategoryId(java.lang.Long categoryId) {\n\t\tset(\"category_id\", categoryId);\n\t}\n\t\n\tpublic java.lang.Long getCategoryId() {\n\t\treturn getLong(\"category_id\");\n\t}\n\n}\n"
  },
  {
    "path": "src/main/java/io/sdb/model/base/BaseSysCaptcha.java",
    "content": "package io.sdb.model.base;\n\nimport com.jfinal.plugin.activerecord.Model;\nimport com.jfinal.plugin.activerecord.IBean;\n\n/**\n * Generated by JFinal, do not modify this file.\n */\n@SuppressWarnings(\"serial\")\npublic abstract class BaseSysCaptcha<M extends BaseSysCaptcha<M>> extends Model<M> implements IBean {\n\n\tpublic void setUuid(java.lang.String uuid) {\n\t\tset(\"uuid\", uuid);\n\t}\n\t\n\tpublic java.lang.String getUuid() {\n\t\treturn getStr(\"uuid\");\n\t}\n\n\tpublic void setCode(java.lang.String code) {\n\t\tset(\"code\", code);\n\t}\n\t\n\tpublic java.lang.String getCode() {\n\t\treturn getStr(\"code\");\n\t}\n\n\tpublic void setExpireTime(java.util.Date expireTime) {\n\t\tset(\"expire_time\", expireTime);\n\t}\n\t\n\tpublic java.util.Date getExpireTime() {\n\t\treturn get(\"expire_time\");\n\t}\n\n}\n"
  },
  {
    "path": "src/main/java/io/sdb/model/base/BaseSysConfig.java",
    "content": "package io.sdb.model.base;\n\nimport com.jfinal.plugin.activerecord.Model;\nimport com.jfinal.plugin.activerecord.IBean;\n\n/**\n * Generated by JFinal, do not modify this file.\n */\n@SuppressWarnings(\"serial\")\npublic abstract class BaseSysConfig<M extends BaseSysConfig<M>> extends Model<M> implements IBean {\n\n\tpublic void setId(java.lang.Long id) {\n\t\tset(\"id\", id);\n\t}\n\t\n\tpublic java.lang.Long getId() {\n\t\treturn getLong(\"id\");\n\t}\n\n\tpublic void setParamKey(java.lang.String paramKey) {\n\t\tset(\"param_key\", paramKey);\n\t}\n\t\n\tpublic java.lang.String getParamKey() {\n\t\treturn getStr(\"param_key\");\n\t}\n\n\tpublic void setParamValue(java.lang.String paramValue) {\n\t\tset(\"param_value\", paramValue);\n\t}\n\t\n\tpublic java.lang.String getParamValue() {\n\t\treturn getStr(\"param_value\");\n\t}\n\n\tpublic void setStatus(java.lang.Integer status) {\n\t\tset(\"status\", status);\n\t}\n\t\n\tpublic java.lang.Integer getStatus() {\n\t\treturn getInt(\"status\");\n\t}\n\n\tpublic void setRemark(java.lang.String remark) {\n\t\tset(\"remark\", remark);\n\t}\n\t\n\tpublic java.lang.String getRemark() {\n\t\treturn getStr(\"remark\");\n\t}\n\n}\n"
  },
  {
    "path": "src/main/java/io/sdb/model/base/BaseSysLog.java",
    "content": "package io.sdb.model.base;\n\nimport com.jfinal.plugin.activerecord.Model;\nimport com.jfinal.plugin.activerecord.IBean;\n\n/**\n * Generated by JFinal, do not modify this file.\n */\n@SuppressWarnings(\"serial\")\npublic abstract class BaseSysLog<M extends BaseSysLog<M>> extends Model<M> implements IBean {\n\n\tpublic void setId(java.lang.Long id) {\n\t\tset(\"id\", id);\n\t}\n\t\n\tpublic java.lang.Long getId() {\n\t\treturn getLong(\"id\");\n\t}\n\n\tpublic void setUsername(java.lang.String username) {\n\t\tset(\"username\", username);\n\t}\n\t\n\tpublic java.lang.String getUsername() {\n\t\treturn getStr(\"username\");\n\t}\n\n\tpublic void setOperation(java.lang.String operation) {\n\t\tset(\"operation\", operation);\n\t}\n\t\n\tpublic java.lang.String getOperation() {\n\t\treturn getStr(\"operation\");\n\t}\n\n\tpublic void setMethod(java.lang.String method) {\n\t\tset(\"method\", method);\n\t}\n\t\n\tpublic java.lang.String getMethod() {\n\t\treturn getStr(\"method\");\n\t}\n\n\tpublic void setParams(java.lang.String params) {\n\t\tset(\"params\", params);\n\t}\n\t\n\tpublic java.lang.String getParams() {\n\t\treturn getStr(\"params\");\n\t}\n\n\tpublic void setTime(java.lang.Long time) {\n\t\tset(\"time\", time);\n\t}\n\t\n\tpublic java.lang.Long getTime() {\n\t\treturn getLong(\"time\");\n\t}\n\n\tpublic void setIp(java.lang.String ip) {\n\t\tset(\"ip\", ip);\n\t}\n\t\n\tpublic java.lang.String getIp() {\n\t\treturn getStr(\"ip\");\n\t}\n\n\tpublic void setCreateDate(java.util.Date createDate) {\n\t\tset(\"create_date\", createDate);\n\t}\n\t\n\tpublic java.util.Date getCreateDate() {\n\t\treturn get(\"create_date\");\n\t}\n\n}\n"
  },
  {
    "path": "src/main/java/io/sdb/model/base/BaseSysMenu.java",
    "content": "package io.sdb.model.base;\n\nimport com.jfinal.plugin.activerecord.Model;\nimport com.jfinal.plugin.activerecord.IBean;\n\n/**\n * Generated by JFinal, do not modify this file.\n */\n@SuppressWarnings(\"serial\")\npublic abstract class BaseSysMenu<M extends BaseSysMenu<M>> extends Model<M> implements IBean {\n\n\tpublic void setMenuId(java.lang.Long menuId) {\n\t\tset(\"menu_id\", menuId);\n\t}\n\t\n\tpublic java.lang.Long getMenuId() {\n\t\treturn getLong(\"menu_id\");\n\t}\n\n\tpublic void setParentId(java.lang.Long parentId) {\n\t\tset(\"parent_id\", parentId);\n\t}\n\t\n\tpublic java.lang.Long getParentId() {\n\t\treturn getLong(\"parent_id\");\n\t}\n\n\tpublic void setName(java.lang.String name) {\n\t\tset(\"name\", name);\n\t}\n\t\n\tpublic java.lang.String getName() {\n\t\treturn getStr(\"name\");\n\t}\n\n\tpublic void setUrl(java.lang.String url) {\n\t\tset(\"url\", url);\n\t}\n\t\n\tpublic java.lang.String getUrl() {\n\t\treturn getStr(\"url\");\n\t}\n\n\tpublic void setPerms(java.lang.String perms) {\n\t\tset(\"perms\", perms);\n\t}\n\t\n\tpublic java.lang.String getPerms() {\n\t\treturn getStr(\"perms\");\n\t}\n\n\tpublic void setType(java.lang.Integer type) {\n\t\tset(\"type\", type);\n\t}\n\t\n\tpublic java.lang.Integer getType() {\n\t\treturn getInt(\"type\");\n\t}\n\n\tpublic void setIcon(java.lang.String icon) {\n\t\tset(\"icon\", icon);\n\t}\n\t\n\tpublic java.lang.String getIcon() {\n\t\treturn getStr(\"icon\");\n\t}\n\n\tpublic void setOrderNum(java.lang.Integer orderNum) {\n\t\tset(\"order_num\", orderNum);\n\t}\n\t\n\tpublic java.lang.Integer getOrderNum() {\n\t\treturn getInt(\"order_num\");\n\t}\n\n}\n"
  },
  {
    "path": "src/main/java/io/sdb/model/base/BaseSysOss.java",
    "content": "package io.sdb.model.base;\n\nimport com.jfinal.plugin.activerecord.Model;\nimport com.jfinal.plugin.activerecord.IBean;\n\n/**\n * Generated by JFinal, do not modify this file.\n */\n@SuppressWarnings(\"serial\")\npublic abstract class BaseSysOss<M extends BaseSysOss<M>> extends Model<M> implements IBean {\n\n\tpublic void setId(java.lang.Long id) {\n\t\tset(\"id\", id);\n\t}\n\t\n\tpublic java.lang.Long getId() {\n\t\treturn getLong(\"id\");\n\t}\n\n\tpublic void setUrl(java.lang.String url) {\n\t\tset(\"url\", url);\n\t}\n\t\n\tpublic java.lang.String getUrl() {\n\t\treturn getStr(\"url\");\n\t}\n\n\tpublic void setCreateDate(java.util.Date createDate) {\n\t\tset(\"create_date\", createDate);\n\t}\n\t\n\tpublic java.util.Date getCreateDate() {\n\t\treturn get(\"create_date\");\n\t}\n\n}\n"
  },
  {
    "path": "src/main/java/io/sdb/model/base/BaseSysRole.java",
    "content": "package io.sdb.model.base;\n\nimport com.jfinal.plugin.activerecord.Model;\nimport com.jfinal.plugin.activerecord.IBean;\n\n/**\n * Generated by JFinal, do not modify this file.\n */\n@SuppressWarnings(\"serial\")\npublic abstract class BaseSysRole<M extends BaseSysRole<M>> extends Model<M> implements IBean {\n\n\tpublic void setRoleId(java.lang.Long roleId) {\n\t\tset(\"role_id\", roleId);\n\t}\n\t\n\tpublic java.lang.Long getRoleId() {\n\t\treturn getLong(\"role_id\");\n\t}\n\n\tpublic void setRoleName(java.lang.String roleName) {\n\t\tset(\"role_name\", roleName);\n\t}\n\t\n\tpublic java.lang.String getRoleName() {\n\t\treturn getStr(\"role_name\");\n\t}\n\n\tpublic void setRemark(java.lang.String remark) {\n\t\tset(\"remark\", remark);\n\t}\n\t\n\tpublic java.lang.String getRemark() {\n\t\treturn getStr(\"remark\");\n\t}\n\n\tpublic void setCreateUserId(java.lang.Long createUserId) {\n\t\tset(\"create_user_id\", createUserId);\n\t}\n\t\n\tpublic java.lang.Long getCreateUserId() {\n\t\treturn getLong(\"create_user_id\");\n\t}\n\n\tpublic void setCreateTime(java.util.Date createTime) {\n\t\tset(\"create_time\", createTime);\n\t}\n\t\n\tpublic java.util.Date getCreateTime() {\n\t\treturn get(\"create_time\");\n\t}\n\n}\n"
  },
  {
    "path": "src/main/java/io/sdb/model/base/BaseSysRoleMenu.java",
    "content": "package io.sdb.model.base;\n\nimport com.jfinal.plugin.activerecord.Model;\nimport com.jfinal.plugin.activerecord.IBean;\n\n/**\n * Generated by JFinal, do not modify this file.\n */\n@SuppressWarnings(\"serial\")\npublic abstract class BaseSysRoleMenu<M extends BaseSysRoleMenu<M>> extends Model<M> implements IBean {\n\n\tpublic void setId(java.lang.Long id) {\n\t\tset(\"id\", id);\n\t}\n\t\n\tpublic java.lang.Long getId() {\n\t\treturn getLong(\"id\");\n\t}\n\n\tpublic void setRoleId(java.lang.Long roleId) {\n\t\tset(\"role_id\", roleId);\n\t}\n\t\n\tpublic java.lang.Long getRoleId() {\n\t\treturn getLong(\"role_id\");\n\t}\n\n\tpublic void setMenuId(java.lang.Long menuId) {\n\t\tset(\"menu_id\", menuId);\n\t}\n\t\n\tpublic java.lang.Long getMenuId() {\n\t\treturn getLong(\"menu_id\");\n\t}\n\n}\n"
  },
  {
    "path": "src/main/java/io/sdb/model/base/BaseSysUser.java",
    "content": "package io.sdb.model.base;\n\nimport com.jfinal.plugin.activerecord.Model;\nimport com.jfinal.plugin.activerecord.IBean;\n\n/**\n * Generated by JFinal, do not modify this file.\n */\n@SuppressWarnings(\"serial\")\npublic abstract class BaseSysUser<M extends BaseSysUser<M>> extends Model<M> implements IBean {\n\n\tpublic void setUserId(java.lang.Long userId) {\n\t\tset(\"user_id\", userId);\n\t}\n\t\n\tpublic java.lang.Long getUserId() {\n\t\treturn getLong(\"user_id\");\n\t}\n\n\tpublic void setUsername(java.lang.String username) {\n\t\tset(\"username\", username);\n\t}\n\t\n\tpublic java.lang.String getUsername() {\n\t\treturn getStr(\"username\");\n\t}\n\n\tpublic void setPassword(java.lang.String password) {\n\t\tset(\"password\", password);\n\t}\n\t\n\tpublic java.lang.String getPassword() {\n\t\treturn getStr(\"password\");\n\t}\n\n\tpublic void setSalt(java.lang.String salt) {\n\t\tset(\"salt\", salt);\n\t}\n\t\n\tpublic java.lang.String getSalt() {\n\t\treturn getStr(\"salt\");\n\t}\n\n\tpublic void setEmail(java.lang.String email) {\n\t\tset(\"email\", email);\n\t}\n\t\n\tpublic java.lang.String getEmail() {\n\t\treturn getStr(\"email\");\n\t}\n\n\tpublic void setMobile(java.lang.String mobile) {\n\t\tset(\"mobile\", mobile);\n\t}\n\t\n\tpublic java.lang.String getMobile() {\n\t\treturn getStr(\"mobile\");\n\t}\n\n\tpublic void setStatus(java.lang.Integer status) {\n\t\tset(\"status\", status);\n\t}\n\t\n\tpublic java.lang.Integer getStatus() {\n\t\treturn getInt(\"status\");\n\t}\n\n\tpublic void setCreateUserId(java.lang.Long createUserId) {\n\t\tset(\"create_user_id\", createUserId);\n\t}\n\t\n\tpublic java.lang.Long getCreateUserId() {\n\t\treturn getLong(\"create_user_id\");\n\t}\n\n\tpublic void setCreateTime(java.util.Date createTime) {\n\t\tset(\"create_time\", createTime);\n\t}\n\t\n\tpublic java.util.Date getCreateTime() {\n\t\treturn get(\"create_time\");\n\t}\n\n}\n"
  },
  {
    "path": "src/main/java/io/sdb/model/base/BaseSysUserRole.java",
    "content": "package io.sdb.model.base;\n\nimport com.jfinal.plugin.activerecord.Model;\nimport com.jfinal.plugin.activerecord.IBean;\n\n/**\n * Generated by JFinal, do not modify this file.\n */\n@SuppressWarnings(\"serial\")\npublic abstract class BaseSysUserRole<M extends BaseSysUserRole<M>> extends Model<M> implements IBean {\n\n\tpublic void setId(java.lang.Long id) {\n\t\tset(\"id\", id);\n\t}\n\t\n\tpublic java.lang.Long getId() {\n\t\treturn getLong(\"id\");\n\t}\n\n\tpublic void setUserId(java.lang.Long userId) {\n\t\tset(\"user_id\", userId);\n\t}\n\t\n\tpublic java.lang.Long getUserId() {\n\t\treturn getLong(\"user_id\");\n\t}\n\n\tpublic void setRoleId(java.lang.Long roleId) {\n\t\tset(\"role_id\", roleId);\n\t}\n\t\n\tpublic java.lang.Long getRoleId() {\n\t\treturn getLong(\"role_id\");\n\t}\n\n}\n"
  },
  {
    "path": "src/main/java/io/sdb/model/base/BaseSysUserToken.java",
    "content": "package io.sdb.model.base;\n\nimport com.jfinal.plugin.activerecord.Model;\nimport com.jfinal.plugin.activerecord.IBean;\n\n/**\n * Generated by JFinal, do not modify this file.\n */\n@SuppressWarnings(\"serial\")\npublic abstract class BaseSysUserToken<M extends BaseSysUserToken<M>> extends Model<M> implements IBean {\n\n\tpublic void setUserId(java.lang.Long userId) {\n\t\tset(\"user_id\", userId);\n\t}\n\t\n\tpublic java.lang.Long getUserId() {\n\t\treturn getLong(\"user_id\");\n\t}\n\n\tpublic void setToken(java.lang.String token) {\n\t\tset(\"token\", token);\n\t}\n\t\n\tpublic java.lang.String getToken() {\n\t\treturn getStr(\"token\");\n\t}\n\n\tpublic void setExpireTime(java.util.Date expireTime) {\n\t\tset(\"expire_time\", expireTime);\n\t}\n\t\n\tpublic java.util.Date getExpireTime() {\n\t\treturn get(\"expire_time\");\n\t}\n\n\tpublic void setUpdateTime(java.util.Date updateTime) {\n\t\tset(\"update_time\", updateTime);\n\t}\n\t\n\tpublic java.util.Date getUpdateTime() {\n\t\treturn get(\"update_time\");\n\t}\n\n}\n"
  },
  {
    "path": "src/main/java/io/sdb/model/base/BaseTbUser.java",
    "content": "package io.sdb.model.base;\n\nimport com.jfinal.plugin.activerecord.Model;\nimport com.jfinal.plugin.activerecord.IBean;\n\n/**\n * Generated by JFinal, do not modify this file.\n */\n@SuppressWarnings(\"serial\")\npublic abstract class BaseTbUser<M extends BaseTbUser<M>> extends Model<M> implements IBean {\n\n\tpublic void setUserId(java.lang.Long userId) {\n\t\tset(\"user_id\", userId);\n\t}\n\t\n\tpublic java.lang.Long getUserId() {\n\t\treturn getLong(\"user_id\");\n\t}\n\n\tpublic void setUsername(java.lang.String username) {\n\t\tset(\"username\", username);\n\t}\n\t\n\tpublic java.lang.String getUsername() {\n\t\treturn getStr(\"username\");\n\t}\n\n\tpublic void setMobile(java.lang.String mobile) {\n\t\tset(\"mobile\", mobile);\n\t}\n\t\n\tpublic java.lang.String getMobile() {\n\t\treturn getStr(\"mobile\");\n\t}\n\n\tpublic void setPassword(java.lang.String password) {\n\t\tset(\"password\", password);\n\t}\n\t\n\tpublic java.lang.String getPassword() {\n\t\treturn getStr(\"password\");\n\t}\n\n\tpublic void setCreateTime(java.util.Date createTime) {\n\t\tset(\"create_time\", createTime);\n\t}\n\t\n\tpublic java.util.Date getCreateTime() {\n\t\treturn get(\"create_time\");\n\t}\n\n}\n"
  },
  {
    "path": "src/main/java/io/sdb/model/base/BaseTestTable.java",
    "content": "package io.sdb.model.base;\n\nimport com.jfinal.plugin.activerecord.Model;\nimport com.jfinal.plugin.activerecord.IBean;\n\n/**\n * Generated by JFinal, do not modify this file.\n */\n@SuppressWarnings(\"serial\")\npublic abstract class BaseTestTable<M extends BaseTestTable<M>> extends Model<M> implements IBean {\n\n\tpublic void setId(java.lang.Integer id) {\n\t\tset(\"id\", id);\n\t}\n\t\n\tpublic java.lang.Integer getId() {\n\t\treturn getInt(\"id\");\n\t}\n\n\tpublic void setName(java.lang.String name) {\n\t\tset(\"name\", name);\n\t}\n\t\n\tpublic java.lang.String getName() {\n\t\treturn getStr(\"name\");\n\t}\n\n\tpublic void setSex(java.lang.Integer sex) {\n\t\tset(\"sex\", sex);\n\t}\n\t\n\tpublic java.lang.Integer getSex() {\n\t\treturn getInt(\"sex\");\n\t}\n\n\tpublic void setCreateDate(java.util.Date createDate) {\n\t\tset(\"create_date\", createDate);\n\t}\n\t\n\tpublic java.util.Date getCreateDate() {\n\t\treturn get(\"create_date\");\n\t}\n\n\tpublic void setUpdateDate(java.util.Date updateDate) {\n\t\tset(\"update_date\", updateDate);\n\t}\n\t\n\tpublic java.util.Date getUpdateDate() {\n\t\treturn get(\"update_date\");\n\t}\n\n}\n"
  },
  {
    "path": "src/main/java/io/sdb/model/base/BaseUser.java",
    "content": "package io.sdb.model.base;\n\nimport com.jfinal.plugin.activerecord.Model;\nimport com.jfinal.plugin.activerecord.IBean;\n\n/**\n * Generated by JFinal, do not modify this file.\n */\n@SuppressWarnings(\"serial\")\npublic abstract class BaseUser<M extends BaseUser<M>> extends Model<M> implements IBean {\n\n\tpublic void setUserId(java.lang.String userId) {\n\t\tset(\"user_id\", userId);\n\t}\n\t\n\tpublic java.lang.String getUserId() {\n\t\treturn getStr(\"user_id\");\n\t}\n\n\tpublic void setUsername(java.lang.String username) {\n\t\tset(\"username\", username);\n\t}\n\t\n\tpublic java.lang.String getUsername() {\n\t\treturn getStr(\"username\");\n\t}\n\n\tpublic void setMaOpenId(java.lang.String maOpenId) {\n\t\tset(\"ma_open_id\", maOpenId);\n\t}\n\t\n\tpublic java.lang.String getMaOpenId() {\n\t\treturn getStr(\"ma_open_id\");\n\t}\n\n\tpublic void setUnionId(java.lang.String unionId) {\n\t\tset(\"union_id\", unionId);\n\t}\n\t\n\tpublic java.lang.String getUnionId() {\n\t\treturn getStr(\"union_id\");\n\t}\n\n\tpublic void setNickname(java.lang.String nickname) {\n\t\tset(\"nickname\", nickname);\n\t}\n\t\n\tpublic java.lang.String getNickname() {\n\t\treturn getStr(\"nickname\");\n\t}\n\n\tpublic void setName(java.lang.String name) {\n\t\tset(\"name\", name);\n\t}\n\t\n\tpublic java.lang.String getName() {\n\t\treturn getStr(\"name\");\n\t}\n\n\tpublic void setEmail(java.lang.String email) {\n\t\tset(\"email\", email);\n\t}\n\t\n\tpublic java.lang.String getEmail() {\n\t\treturn getStr(\"email\");\n\t}\n\n\tpublic void setGender(java.lang.Integer gender) {\n\t\tset(\"gender\", gender);\n\t}\n\t\n\tpublic java.lang.Integer getGender() {\n\t\treturn getInt(\"gender\");\n\t}\n\n\tpublic void setAreaId(java.lang.Integer areaId) {\n\t\tset(\"area_id\", areaId);\n\t}\n\t\n\tpublic java.lang.Integer getAreaId() {\n\t\treturn getInt(\"area_id\");\n\t}\n\n\tpublic void setLanguage(java.lang.Integer language) {\n\t\tset(\"language\", language);\n\t}\n\t\n\tpublic java.lang.Integer getLanguage() {\n\t\treturn getInt(\"language\");\n\t}\n\n\tpublic void setVolunteer(java.lang.Integer volunteer) {\n\t\tset(\"volunteer\", volunteer);\n\t}\n\t\n\tpublic java.lang.Integer getVolunteer() {\n\t\treturn getInt(\"volunteer\");\n\t}\n\n\tpublic void setAvatar(java.lang.String avatar) {\n\t\tset(\"avatar\", avatar);\n\t}\n\t\n\tpublic java.lang.String getAvatar() {\n\t\treturn getStr(\"avatar\");\n\t}\n\n\tpublic void setMobile(java.lang.String mobile) {\n\t\tset(\"mobile\", mobile);\n\t}\n\t\n\tpublic java.lang.String getMobile() {\n\t\treturn getStr(\"mobile\");\n\t}\n\n\tpublic void setPassword(java.lang.String password) {\n\t\tset(\"password\", password);\n\t}\n\t\n\tpublic java.lang.String getPassword() {\n\t\treturn getStr(\"password\");\n\t}\n\n\tpublic void setUpdateDate(java.util.Date updateDate) {\n\t\tset(\"update_date\", updateDate);\n\t}\n\t\n\tpublic java.util.Date getUpdateDate() {\n\t\treturn get(\"update_date\");\n\t}\n\n\tpublic void setCreateDate(java.util.Date createDate) {\n\t\tset(\"create_date\", createDate);\n\t}\n\t\n\tpublic java.util.Date getCreateDate() {\n\t\treturn get(\"create_date\");\n\t}\n\n}\n"
  },
  {
    "path": "src/main/java/io/sdb/model/base/BaseVolunteerInfo.java",
    "content": "package io.sdb.model.base;\n\nimport com.jfinal.plugin.activerecord.Model;\nimport com.jfinal.plugin.activerecord.IBean;\n\n/**\n * Generated by JFinal, do not modify this file.\n */\n@SuppressWarnings(\"serial\")\npublic abstract class BaseVolunteerInfo<M extends BaseVolunteerInfo<M>> extends Model<M> implements IBean {\n\n\tpublic void setId(java.lang.String id) {\n\t\tset(\"id\", id);\n\t}\n\t\n\tpublic java.lang.String getId() {\n\t\treturn getStr(\"id\");\n\t}\n\n\tpublic void setIdType(java.lang.Integer idType) {\n\t\tset(\"id_type\", idType);\n\t}\n\t\n\tpublic java.lang.Integer getIdType() {\n\t\treturn getInt(\"id_type\");\n\t}\n\n\tpublic void setIdCard(java.lang.String idCard) {\n\t\tset(\"id_card\", idCard);\n\t}\n\t\n\tpublic java.lang.String getIdCard() {\n\t\treturn getStr(\"id_card\");\n\t}\n\n\tpublic void setName(java.lang.String name) {\n\t\tset(\"name\", name);\n\t}\n\t\n\tpublic java.lang.String getName() {\n\t\treturn getStr(\"name\");\n\t}\n\n\tpublic void setGender(java.lang.Integer gender) {\n\t\tset(\"gender\", gender);\n\t}\n\t\n\tpublic java.lang.Integer getGender() {\n\t\treturn getInt(\"gender\");\n\t}\n\n\tpublic void setAge(java.lang.Integer age) {\n\t\tset(\"age\", age);\n\t}\n\t\n\tpublic java.lang.Integer getAge() {\n\t\treturn getInt(\"age\");\n\t}\n\n\tpublic void setWork(java.lang.String work) {\n\t\tset(\"work\", work);\n\t}\n\t\n\tpublic java.lang.String getWork() {\n\t\treturn getStr(\"work\");\n\t}\n\n\tpublic void setMobile(java.lang.String mobile) {\n\t\tset(\"mobile\", mobile);\n\t}\n\t\n\tpublic java.lang.String getMobile() {\n\t\treturn getStr(\"mobile\");\n\t}\n\n\tpublic void setAreaId(java.lang.Integer areaId) {\n\t\tset(\"area_id\", areaId);\n\t}\n\t\n\tpublic java.lang.Integer getAreaId() {\n\t\treturn getInt(\"area_id\");\n\t}\n\n\tpublic void setEmail(java.lang.String email) {\n\t\tset(\"email\", email);\n\t}\n\t\n\tpublic java.lang.String getEmail() {\n\t\treturn getStr(\"email\");\n\t}\n\n\tpublic void setAddress(java.lang.String address) {\n\t\tset(\"address\", address);\n\t}\n\t\n\tpublic java.lang.String getAddress() {\n\t\treturn getStr(\"address\");\n\t}\n\n\tpublic void setComment(java.lang.String comment) {\n\t\tset(\"comment\", comment);\n\t}\n\t\n\tpublic java.lang.String getComment() {\n\t\treturn getStr(\"comment\");\n\t}\n\n\tpublic void setStatus(java.lang.Integer status) {\n\t\tset(\"status\", status);\n\t}\n\t\n\tpublic java.lang.Integer getStatus() {\n\t\treturn getInt(\"status\");\n\t}\n\n\tpublic void setCardFront(java.lang.String cardFront) {\n\t\tset(\"card_front\", cardFront);\n\t}\n\t\n\tpublic java.lang.String getCardFront() {\n\t\treturn getStr(\"card_front\");\n\t}\n\n\tpublic void setCardBack(java.lang.String cardBack) {\n\t\tset(\"card_back\", cardBack);\n\t}\n\t\n\tpublic java.lang.String getCardBack() {\n\t\treturn getStr(\"card_back\");\n\t}\n\n\tpublic void setUserId(java.lang.Long userId) {\n\t\tset(\"user_id\", userId);\n\t}\n\t\n\tpublic java.lang.Long getUserId() {\n\t\treturn getLong(\"user_id\");\n\t}\n\n\tpublic void setCreateDate(java.util.Date createDate) {\n\t\tset(\"create_date\", createDate);\n\t}\n\t\n\tpublic java.util.Date getCreateDate() {\n\t\treturn get(\"create_date\");\n\t}\n\n\tpublic void setUpdateDate(java.util.Date updateDate) {\n\t\tset(\"update_date\", updateDate);\n\t}\n\t\n\tpublic java.util.Date getUpdateDate() {\n\t\treturn get(\"update_date\");\n\t}\n\n}\n"
  },
  {
    "path": "src/main/java/io/sdb/oss/cloud/AliyunCloudStorageService.java",
    "content": "/**\n * Copyright 2018\n * <p>\n * Licensed under the Apache License, Version 2.0 (the \"License\"); you may not\n * use this file except in compliance with the License. You may obtain a copy of\n * the License at\n * <p>\n * http://www.apache.org/licenses/LICENSE-2.0\n * <p>\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS, WITHOUT\n * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the\n * License for the specific language governing permissions and limitations under\n * the License.\n */\n\npackage io.sdb.oss.cloud;\n\nimport com.aliyun.oss.OSSClient;\nimport io.sdb.common.exception.RRException;\n\nimport java.io.ByteArrayInputStream;\nimport java.io.InputStream;\n\n/**\n * 阿里云存储\n * @author chenshun\n * @email sunlightcs@gmail.com\n * @date 2017-03-26 16:22\n */\npublic class AliyunCloudStorageService extends CloudStorageService {\n    private OSSClient client;\n\n    public AliyunCloudStorageService(CloudStorageConfig config){\n        this.config = config;\n\n        //初始化\n        init();\n    }\n\n    private void init(){\n        client = new OSSClient(config.getAliyunEndPoint(), config.getAliyunAccessKeyId(),\n                config.getAliyunAccessKeySecret());\n    }\n\n    @Override\n    public String upload(byte[] data, String path) {\n        return upload(new ByteArrayInputStream(data), path);\n    }\n\n    @Override\n    public String upload(InputStream inputStream, String path) {\n        try {\n            client.putObject(config.getAliyunBucketName(), path, inputStream);\n        } catch (Exception e){\n            throw new RRException(\"上传文件失败，请检查配置信息\", e);\n        }\n\n        return config.getAliyunDomain() + \"/\" + path;\n    }\n\n    @Override\n    public String uploadSuffix(byte[] data, String suffix) {\n        return upload(data, getPath(config.getAliyunPrefix(), suffix));\n    }\n\n    @Override\n    public String uploadSuffix(InputStream inputStream, String suffix) {\n        return upload(inputStream, getPath(config.getAliyunPrefix(), suffix));\n    }\n}\n"
  },
  {
    "path": "src/main/java/io/sdb/oss/cloud/CloudStorageConfig.java",
    "content": "/**\n * Copyright 2018\n * <p>\n * Licensed under the Apache License, Version 2.0 (the \"License\"); you may not\n * use this file except in compliance with the License. You may obtain a copy of\n * the License at\n * <p>\n * http://www.apache.org/licenses/LICENSE-2.0\n * <p>\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS, WITHOUT\n * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the\n * License for the specific language governing permissions and limitations under\n * the License.\n */\n\npackage io.sdb.oss.cloud;\n\n\nimport io.sdb.common.validator.group.AliyunGroup;\nimport io.sdb.common.validator.group.QcloudGroup;\nimport io.sdb.common.validator.group.QiniuGroup;\nimport org.hibernate.validator.constraints.NotBlank;\nimport org.hibernate.validator.constraints.Range;\nimport org.hibernate.validator.constraints.URL;\n\nimport javax.validation.constraints.NotNull;\nimport java.io.Serializable;\n\n/**\n * 云存储配置信息\n * @author chenshun\n * @email sunlightcs@gmail.com\n * @date 2017-03-25 16:12\n */\npublic class CloudStorageConfig implements Serializable {\n    private static final long serialVersionUID = 1L;\n\n    //类型 1：七牛  2：阿里云  3：腾讯云\n    @Range(min=1, max=3, message = \"类型错误\")\n    private Integer type;\n\n    //七牛绑定的域名\n    @NotBlank(message=\"七牛绑定的域名不能为空\", groups = QiniuGroup.class)\n    @URL(message = \"七牛绑定的域名格式不正确\", groups = QiniuGroup.class)\n    private String qiniuDomain;\n    //七牛路径前缀\n    private String qiniuPrefix;\n    //七牛ACCESS_KEY\n    @NotBlank(message=\"七牛AccessKey不能为空\", groups = QiniuGroup.class)\n    private String qiniuAccessKey;\n    //七牛SECRET_KEY\n    @NotBlank(message=\"七牛SecretKey不能为空\", groups = QiniuGroup.class)\n    private String qiniuSecretKey;\n    //七牛存储空间名\n    @NotBlank(message=\"七牛空间名不能为空\", groups = QiniuGroup.class)\n    private String qiniuBucketName;\n\n    //阿里云绑定的域名\n    @NotBlank(message=\"阿里云绑定的域名不能为空\", groups = AliyunGroup.class)\n    @URL(message = \"阿里云绑定的域名格式不正确\", groups = AliyunGroup.class)\n    private String aliyunDomain;\n    //阿里云路径前缀\n    private String aliyunPrefix;\n    //阿里云EndPoint\n    @NotBlank(message=\"阿里云EndPoint不能为空\", groups = AliyunGroup.class)\n    private String aliyunEndPoint;\n    //阿里云AccessKeyId\n    @NotBlank(message=\"阿里云AccessKeyId不能为空\", groups = AliyunGroup.class)\n    private String aliyunAccessKeyId;\n    //阿里云AccessKeySecret\n    @NotBlank(message=\"阿里云AccessKeySecret不能为空\", groups = AliyunGroup.class)\n    private String aliyunAccessKeySecret;\n    //阿里云BucketName\n    @NotBlank(message=\"阿里云BucketName不能为空\", groups = AliyunGroup.class)\n    private String aliyunBucketName;\n\n    //腾讯云绑定的域名\n    @NotBlank(message=\"腾讯云绑定的域名不能为空\", groups = QcloudGroup.class)\n    @URL(message = \"腾讯云绑定的域名格式不正确\", groups = QcloudGroup.class)\n    private String qcloudDomain;\n    //腾讯云路径前缀\n    private String qcloudPrefix;\n    //腾讯云AppId\n    @NotNull(message=\"腾讯云AppId不能为空\", groups = QcloudGroup.class)\n    private Integer qcloudAppId;\n    //腾讯云SecretId\n    @NotBlank(message=\"腾讯云SecretId不能为空\", groups = QcloudGroup.class)\n    private String qcloudSecretId;\n    //腾讯云SecretKey\n    @NotBlank(message=\"腾讯云SecretKey不能为空\", groups = QcloudGroup.class)\n    private String qcloudSecretKey;\n    //腾讯云BucketName\n    @NotBlank(message=\"腾讯云BucketName不能为空\", groups = QcloudGroup.class)\n    private String qcloudBucketName;\n    //腾讯云COS所属地区\n    @NotBlank(message=\"所属地区不能为空\", groups = QcloudGroup.class)\n    private String qcloudRegion;\n\n    public Integer getType() {\n        return type;\n    }\n\n    public void setType(Integer type) {\n        this.type = type;\n    }\n\n    public String getQiniuDomain() {\n        return qiniuDomain;\n    }\n\n    public void setQiniuDomain(String qiniuDomain) {\n        this.qiniuDomain = qiniuDomain;\n    }\n\n    public String getQiniuAccessKey() {\n        return qiniuAccessKey;\n    }\n\n    public void setQiniuAccessKey(String qiniuAccessKey) {\n        this.qiniuAccessKey = qiniuAccessKey;\n    }\n\n    public String getQiniuSecretKey() {\n        return qiniuSecretKey;\n    }\n\n    public void setQiniuSecretKey(String qiniuSecretKey) {\n        this.qiniuSecretKey = qiniuSecretKey;\n    }\n\n    public String getQiniuBucketName() {\n        return qiniuBucketName;\n    }\n\n    public void setQiniuBucketName(String qiniuBucketName) {\n        this.qiniuBucketName = qiniuBucketName;\n    }\n\n    public String getQiniuPrefix() {\n        return qiniuPrefix;\n    }\n\n    public void setQiniuPrefix(String qiniuPrefix) {\n        this.qiniuPrefix = qiniuPrefix;\n    }\n\n    public String getAliyunDomain() {\n        return aliyunDomain;\n    }\n\n    public void setAliyunDomain(String aliyunDomain) {\n        this.aliyunDomain = aliyunDomain;\n    }\n\n    public String getAliyunPrefix() {\n        return aliyunPrefix;\n    }\n\n    public void setAliyunPrefix(String aliyunPrefix) {\n        this.aliyunPrefix = aliyunPrefix;\n    }\n\n    public String getAliyunEndPoint() {\n        return aliyunEndPoint;\n    }\n\n    public void setAliyunEndPoint(String aliyunEndPoint) {\n        this.aliyunEndPoint = aliyunEndPoint;\n    }\n\n    public String getAliyunAccessKeyId() {\n        return aliyunAccessKeyId;\n    }\n\n    public void setAliyunAccessKeyId(String aliyunAccessKeyId) {\n        this.aliyunAccessKeyId = aliyunAccessKeyId;\n    }\n\n    public String getAliyunAccessKeySecret() {\n        return aliyunAccessKeySecret;\n    }\n\n    public void setAliyunAccessKeySecret(String aliyunAccessKeySecret) {\n        this.aliyunAccessKeySecret = aliyunAccessKeySecret;\n    }\n\n    public String getAliyunBucketName() {\n        return aliyunBucketName;\n    }\n\n    public void setAliyunBucketName(String aliyunBucketName) {\n        this.aliyunBucketName = aliyunBucketName;\n    }\n\n    public String getQcloudDomain() {\n        return qcloudDomain;\n    }\n\n    public void setQcloudDomain(String qcloudDomain) {\n        this.qcloudDomain = qcloudDomain;\n    }\n\n    public String getQcloudPrefix() {\n        return qcloudPrefix;\n    }\n\n    public void setQcloudPrefix(String qcloudPrefix) {\n        this.qcloudPrefix = qcloudPrefix;\n    }\n\n    public Integer getQcloudAppId() {\n        return qcloudAppId;\n    }\n\n    public void setQcloudAppId(Integer qcloudAppId) {\n        this.qcloudAppId = qcloudAppId;\n    }\n\n    public String getQcloudSecretId() {\n        return qcloudSecretId;\n    }\n\n    public void setQcloudSecretId(String qcloudSecretId) {\n        this.qcloudSecretId = qcloudSecretId;\n    }\n\n    public String getQcloudSecretKey() {\n        return qcloudSecretKey;\n    }\n\n    public void setQcloudSecretKey(String qcloudSecretKey) {\n        this.qcloudSecretKey = qcloudSecretKey;\n    }\n\n    public String getQcloudBucketName() {\n        return qcloudBucketName;\n    }\n\n    public void setQcloudBucketName(String qcloudBucketName) {\n        this.qcloudBucketName = qcloudBucketName;\n    }\n\n\tpublic String getQcloudRegion() {\n\t\treturn qcloudRegion;\n\t}\n\n\tpublic void setQcloudRegion(String qcloudRegion) {\n\t\tthis.qcloudRegion = qcloudRegion;\n\t}\n}\n"
  },
  {
    "path": "src/main/java/io/sdb/oss/cloud/CloudStorageService.java",
    "content": "/**\n * Copyright 2018\n * <p>\n * Licensed under the Apache License, Version 2.0 (the \"License\"); you may not\n * use this file except in compliance with the License. You may obtain a copy of\n * the License at\n * <p>\n * http://www.apache.org/licenses/LICENSE-2.0\n * <p>\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS, WITHOUT\n * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the\n * License for the specific language governing permissions and limitations under\n * the License.\n */\n\npackage io.sdb.oss.cloud;\n\nimport io.sdb.common.utils.DateUtils;\nimport org.apache.commons.lang.StringUtils;\n\nimport java.io.InputStream;\nimport java.util.Date;\nimport java.util.UUID;\n\n/**\n * 云存储(支持七牛、阿里云、腾讯云、又拍云)\n * @author chenshun\n * @email sunlightcs@gmail.com\n * @date 2017-03-25 14:58\n */\npublic abstract class CloudStorageService {\n    /** 云存储配置信息 */\n    CloudStorageConfig config;\n\n    /**\n     * 文件路径\n     * @param prefix 前缀\n     * @param suffix 后缀\n     * @return 返回上传路径\n     */\n    public String getPath(String prefix, String suffix) {\n        //生成uuid\n        String uuid = UUID.randomUUID().toString().replaceAll(\"-\", \"\");\n        //文件路径\n        String path = DateUtils.format(new Date(), \"yyyyMMdd\") + \"/\" + uuid;\n\n        if(StringUtils.isNotBlank(prefix)){\n            path = prefix + \"/\" + path;\n        }\n\n        return path + suffix;\n    }\n\n    /**\n     * 文件上传\n     * @param data    文件字节数组\n     * @param path    文件路径，包含文件名\n     * @return        返回http地址\n     */\n    public abstract String upload(byte[] data, String path);\n\n    /**\n     * 文件上传\n     * @param data     文件字节数组\n     * @param suffix   后缀\n     * @return         返回http地址\n     */\n    public abstract String uploadSuffix(byte[] data, String suffix);\n\n    /**\n     * 文件上传\n     * @param inputStream   字节流\n     * @param path          文件路径，包含文件名\n     * @return              返回http地址\n     */\n    public abstract String upload(InputStream inputStream, String path);\n\n    /**\n     * 文件上传\n     * @param inputStream  字节流\n     * @param suffix       后缀\n     * @return             返回http地址\n     */\n    public abstract String uploadSuffix(InputStream inputStream, String suffix);\n\n}\n"
  },
  {
    "path": "src/main/java/io/sdb/oss/cloud/OSSFactory.java",
    "content": "/**\n * Copyright 2018\n * <p>\n * Licensed under the Apache License, Version 2.0 (the \"License\"); you may not\n * use this file except in compliance with the License. You may obtain a copy of\n * the License at\n * <p>\n * http://www.apache.org/licenses/LICENSE-2.0\n * <p>\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS, WITHOUT\n * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the\n * License for the specific language governing permissions and limitations under\n * the License.\n */\n\npackage io.sdb.oss.cloud;\n\n\nimport io.sdb.common.utils.ConfigConstant;\nimport io.sdb.common.utils.Constant;\nimport io.sdb.common.utils.SpringContextUtils;\nimport io.sdb.service.SysConfigService;\n\n/**\n * 文件上传Factory\n * @author chenshun\n * @email sunlightcs@gmail.com\n * @date 2017-03-26 10:18\n */\npublic final class OSSFactory {\n    private static SysConfigService sysConfigService;\n\n    static {\n        OSSFactory.sysConfigService = (SysConfigService) SpringContextUtils.getBean(\"sysConfigService\");\n    }\n\n    public static CloudStorageService build(){\n        //获取云存储配置信息\n        CloudStorageConfig config = sysConfigService.getConfigObject(ConfigConstant.CLOUD_STORAGE_CONFIG_KEY, CloudStorageConfig.class);\n\n        if(config.getType() == Constant.CloudService.QINIU.getValue()){\n            return new QiniuCloudStorageService(config);\n        }else if(config.getType() == Constant.CloudService.ALIYUN.getValue()){\n            return new AliyunCloudStorageService(config);\n        }else if(config.getType() == Constant.CloudService.QCLOUD.getValue()){\n            return new QcloudCloudStorageService(config);\n        }\n\n        return null;\n    }\n\n}\n"
  },
  {
    "path": "src/main/java/io/sdb/oss/cloud/QcloudCloudStorageService.java",
    "content": "/**\n * Copyright 2018\n * <p>\n * Licensed under the Apache License, Version 2.0 (the \"License\"); you may not\n * use this file except in compliance with the License. You may obtain a copy of\n * the License at\n * <p>\n * http://www.apache.org/licenses/LICENSE-2.0\n * <p>\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS, WITHOUT\n * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the\n * License for the specific language governing permissions and limitations under\n * the License.\n */\n\npackage io.sdb.oss.cloud;\n\n\nimport com.alibaba.fastjson.JSONObject;\nimport com.qcloud.cos.COSClient;\nimport com.qcloud.cos.ClientConfig;\nimport com.qcloud.cos.request.UploadFileRequest;\nimport com.qcloud.cos.sign.Credentials;\nimport io.sdb.common.exception.RRException;\nimport org.apache.commons.io.IOUtils;\n\nimport java.io.IOException;\nimport java.io.InputStream;\n\n/**\n * 腾讯云存储\n * @author chenshun\n * @email sunlightcs@gmail.com\n * @date 2017-03-26 20:51\n */\npublic class QcloudCloudStorageService extends CloudStorageService {\n    private COSClient client;\n\n    public QcloudCloudStorageService(CloudStorageConfig config){\n        this.config = config;\n\n        //初始化\n        init();\n    }\n\n    private void init(){\n    \tCredentials credentials = new Credentials(config.getQcloudAppId(), config.getQcloudSecretId(),\n                config.getQcloudSecretKey());\n    \t\n    \t//初始化客户端配置\n        ClientConfig clientConfig = new ClientConfig();\n        //设置bucket所在的区域，华南：gz 华北：tj 华东：sh\n        clientConfig.setRegion(config.getQcloudRegion());\n        \n    \tclient = new COSClient(clientConfig, credentials);\n    }\n\n    @Override\n    public String upload(byte[] data, String path) {\n        //腾讯云必需要以\"/\"开头\n        if(!path.startsWith(\"/\")) {\n            path = \"/\" + path;\n        }\n        \n        //上传到腾讯云\n        UploadFileRequest request = new UploadFileRequest(config.getQcloudBucketName(), path, data);\n        String response = client.uploadFile(request);\n\n        JSONObject jsonObject = JSONObject.parseObject(response);\n        if(jsonObject.getInteger(\"code\") != 0) {\n            throw new RRException(\"文件上传失败，\" + jsonObject.getString(\"message\"));\n        }\n\n        return config.getQcloudDomain() + path;\n    }\n\n    @Override\n    public String upload(InputStream inputStream, String path) {\n    \ttry {\n            byte[] data = IOUtils.toByteArray(inputStream);\n            return this.upload(data, path);\n        } catch (IOException e) {\n            throw new RRException(\"上传文件失败\", e);\n        }\n    }\n\n    @Override\n    public String uploadSuffix(byte[] data, String suffix) {\n        return upload(data, getPath(config.getQcloudPrefix(), suffix));\n    }\n\n    @Override\n    public String uploadSuffix(InputStream inputStream, String suffix) {\n        return upload(inputStream, getPath(config.getQcloudPrefix(), suffix));\n    }\n}\n"
  },
  {
    "path": "src/main/java/io/sdb/oss/cloud/QiniuCloudStorageService.java",
    "content": "/**\n * Copyright 2018\n * <p>\n * Licensed under the Apache License, Version 2.0 (the \"License\"); you may not\n * use this file except in compliance with the License. You may obtain a copy of\n * the License at\n * <p>\n * http://www.apache.org/licenses/LICENSE-2.0\n * <p>\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS, WITHOUT\n * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the\n * License for the specific language governing permissions and limitations under\n * the License.\n */\n\npackage io.sdb.oss.cloud;\n\nimport com.qiniu.common.Zone;\nimport com.qiniu.http.Response;\nimport com.qiniu.storage.Configuration;\nimport com.qiniu.storage.UploadManager;\nimport com.qiniu.util.Auth;\nimport io.sdb.common.exception.RRException;\nimport org.apache.commons.io.IOUtils;\n\nimport java.io.IOException;\nimport java.io.InputStream;\n\n/**\n * 七牛云存储\n * @author chenshun\n * @email sunlightcs@gmail.com\n * @date 2017-03-25 15:41\n */\npublic class QiniuCloudStorageService extends CloudStorageService {\n    private UploadManager uploadManager;\n    private String token;\n\n    public QiniuCloudStorageService(CloudStorageConfig config){\n        this.config = config;\n\n        //初始化\n        init();\n    }\n\n    private void init(){\n        uploadManager = new UploadManager(new Configuration(Zone.autoZone()));\n        token = Auth.create(config.getQiniuAccessKey(), config.getQiniuSecretKey()).\n                uploadToken(config.getQiniuBucketName());\n    }\n\n    @Override\n    public String upload(byte[] data, String path) {\n        try {\n            Response res = uploadManager.put(data, path, token);\n            if (!res.isOK()) {\n                throw new RuntimeException(\"上传七牛出错：\" + res.toString());\n            }\n        } catch (Exception e) {\n            throw new RRException(\"上传文件失败，请核对七牛配置信息\", e);\n        }\n\n        return config.getQiniuDomain() + \"/\" + path;\n    }\n\n    @Override\n    public String upload(InputStream inputStream, String path) {\n        try {\n            byte[] data = IOUtils.toByteArray(inputStream);\n            return this.upload(data, path);\n        } catch (IOException e) {\n            throw new RRException(\"上传文件失败\", e);\n        }\n    }\n\n    @Override\n    public String uploadSuffix(byte[] data, String suffix) {\n        return upload(data, getPath(config.getQiniuPrefix(), suffix));\n    }\n\n    @Override\n    public String uploadSuffix(InputStream inputStream, String suffix) {\n        return upload(inputStream, getPath(config.getQiniuPrefix(), suffix));\n    }\n}\n"
  },
  {
    "path": "src/main/java/io/sdb/resolver/LoginUserHandlerMethodArgumentResolver.java",
    "content": "package io.sdb.resolver;\n\nimport io.sdb.common.exception.RRException;\nimport io.sdb.model.User;\nimport io.sdb.common.annotation.LoginUser;\nimport io.sdb.interceptor.AuthorizationInterceptor;\nimport io.sdb.service.UserService;\nimport org.springframework.beans.factory.annotation.Autowired;\nimport org.springframework.core.MethodParameter;\nimport org.springframework.http.HttpStatus;\nimport org.springframework.stereotype.Component;\nimport org.springframework.web.bind.support.WebDataBinderFactory;\nimport org.springframework.web.context.request.NativeWebRequest;\nimport org.springframework.web.context.request.RequestAttributes;\nimport org.springframework.web.method.support.HandlerMethodArgumentResolver;\nimport org.springframework.web.method.support.ModelAndViewContainer;\n\n/**\n * 有@LoginUser注解的方法参数，注入当前登录用户\n * @author chenshun\n * @email sunlightcs@gmail.com\n * @date 2017-03-23 22:02\n */\n@Component\npublic class LoginUserHandlerMethodArgumentResolver implements HandlerMethodArgumentResolver {\n    @Autowired\n    private UserService userService;\n\n    @Override\n    public boolean supportsParameter(MethodParameter parameter) {\n        return parameter.getParameterType().isAssignableFrom(User.class) && parameter.hasParameterAnnotation(LoginUser.class);\n    }\n\n    @Override\n    public Object resolveArgument(MethodParameter parameter, ModelAndViewContainer container,\n                                  NativeWebRequest request, WebDataBinderFactory factory) throws Exception {\n        //获取用户ID\n        Object object = request.getAttribute(AuthorizationInterceptor.USER_KEY, RequestAttributes.SCOPE_REQUEST);\n        if(object == null){\n            throw new RRException(\"token失效，请重新登录\", HttpStatus.UNAUTHORIZED.value());\n        }\n\n        //获取用户信息\n        User user = userService.findById((Long)object);\n        if (user == null) {\n            throw new RRException(\"token失效，请重新登录\", HttpStatus.UNAUTHORIZED.value());\n        }\n        return user;\n    }\n}\n"
  },
  {
    "path": "src/main/java/io/sdb/serializer/Date2LongSerializer.java",
    "content": "package io.sdb.serializer;\n\nimport com.fasterxml.jackson.core.JsonGenerator;\nimport com.fasterxml.jackson.core.JsonProcessingException;\nimport com.fasterxml.jackson.databind.JsonSerializer;\nimport com.fasterxml.jackson.databind.SerializerProvider;\n\nimport java.io.IOException;\nimport java.util.Date;\n\npublic class Date2LongSerializer extends JsonSerializer<Date> {\n    @Override\n    public void serialize(Date date, JsonGenerator jsonGenerator, SerializerProvider serializerProvider) throws IOException, JsonProcessingException {\n        jsonGenerator.writeNumber(date.getTime());\n    }\n}\n"
  },
  {
    "path": "src/main/java/io/sdb/serializer/Int2BoolSerializer.java",
    "content": "package io.sdb.serializer;\n\nimport com.fasterxml.jackson.core.JsonGenerator;\nimport com.fasterxml.jackson.core.JsonProcessingException;\nimport com.fasterxml.jackson.databind.JsonSerializer;\nimport com.fasterxml.jackson.databind.SerializerProvider;\nimport io.sdb.enums.GeneralEnum;\n\nimport java.io.IOException;\n\npublic class Int2BoolSerializer extends JsonSerializer<Integer> {\n    @Override\n    public void serialize(Integer integer, JsonGenerator jsonGenerator, SerializerProvider serializerProvider) throws IOException, JsonProcessingException {\n        jsonGenerator.writeBoolean(integer == GeneralEnum.TRUE.getCode()?true:false);\n    }\n}\n"
  },
  {
    "path": "src/main/java/io/sdb/service/AreaService.java",
    "content": "/**\n * Copyright 2018\n * <p>\n * Licensed under the Apache License, Version 2.0 (the \"License\"); you may not\n * use this file except in compliance with the License. You may obtain a copy of\n * the License at\n * <p>\n * http://www.apache.org/licenses/LICENSE-2.0\n * <p>\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS, WITHOUT\n * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the\n * License for the specific language governing permissions and limitations under\n * the License.\n */\n\npackage io.sdb.service;\n\nimport io.sdb.model.Area;\n\n\n/**\n * 地区\n * \n * @author dick\n */\npublic interface AreaService extends BaseService<Area> {\n}\n"
  },
  {
    "path": "src/main/java/io/sdb/service/BaseService.java",
    "content": "package io.sdb.service;\n\nimport com.jfinal.plugin.activerecord.Model;\nimport com.jfinal.plugin.activerecord.Page;\nimport com.jfinal.plugin.activerecord.SqlPara;\nimport io.sdb.common.entity.Filter;\nimport io.sdb.common.entity.Order;\nimport io.sdb.common.utils.PageUtils;\n\nimport java.util.List;\nimport java.util.Map;\n\npublic interface BaseService<M extends Model<M>> {\n\n    List<M> findAll();\n\n    M findById(Object ...id);\n\n    List<M> findByModel(M model);\n\n    M findFirstByModel(M model);\n\n    List<M> find(SqlPara sqlPara);\n\n    M findFirst(SqlPara sqlPara);\n\n    boolean deleteBatch(Object[]... ids);\n\n    boolean deleteBatch(String[] columns, Object[]... ids);\n\n    boolean deleteByModel(M model);\n\n    Page<M> paginate(Integer pageNum, Integer pageSize, List<Filter> filters, Order order);\n\n    Page<M> paginate(Integer pageNum, Integer pageSize, List<Filter> filters);\n\n    Page<M> paginate(Integer pageNum, Integer pageSize);\n\n    Page<M> paginate(Integer pageNum, Integer pageSize, List<Filter> filters, List<Order> orders);\n\n    Page<M> paginate(Integer pageNum, Integer pageSize, Filter filter, List<Order> orders);\n\n    Page<M> paginate(Integer pageNum, Integer pageSize, Filter filter, Order order);\n\n    PageUtils queryPage(Map<String, Object> params);\n\n    M insert(M model);\n\n    List<M> findByFilter(Filter filter);\n\n    List<M> findByFilters(List<Filter> filter);\n\n    boolean update(M model);\n\n    boolean delete(M model);\n}\n"
  },
  {
    "path": "src/main/java/io/sdb/service/CampaignService.java",
    "content": "package io.sdb.service;\n\nimport io.sdb.model.Campaign;\n\npublic interface CampaignService extends BaseService<Campaign> {\n}"
  },
  {
    "path": "src/main/java/io/sdb/service/CartService.java",
    "content": "/**\n * Copyright 2018\n * <p>\n * Licensed under the Apache License, Version 2.0 (the \"License\"); you may not\n * use this file except in compliance with the License. You may obtain a copy of\n * the License at\n * <p>\n * http://www.apache.org/licenses/LICENSE-2.0\n * <p>\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS, WITHOUT\n * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the\n * License for the specific language governing permissions and limitations under\n * the License.\n */\n\npackage io.sdb.service;\n\nimport io.sdb.dto.CartDTO;\nimport io.sdb.model.Cart;\nimport io.sdb.model.Product;\n\nimport java.util.List;\n\n\n/**\n * 系统日志\n *\n * @author chenshun\n * @email sunlightcs@gmail.com\n * @date 2017-03-08 10:40:56\n */\npublic interface CartService extends BaseService<Cart> {\n\n    Boolean saveOrUpdate(String userId, String productId, Integer quantity);\n\n    Boolean remove(String userId, String cartIds);\n\n    List<Product> getCartProduct(List<Long> cartItemIds);\n\n    List<CartDTO> listDetail(String userId);\n}\n"
  },
  {
    "path": "src/main/java/io/sdb/service/DeliveryCorpService.java",
    "content": "package io.sdb.service;\n\nimport io.sdb.model.DeliveryCorp;\n\npublic interface DeliveryCorpService extends BaseService<DeliveryCorp> {\n}"
  },
  {
    "path": "src/main/java/io/sdb/service/FavoriteGoodsService.java",
    "content": "package io.sdb.service;\n\nimport io.sdb.dto.FavoriteGoodsDTO;\nimport io.sdb.model.FavoriteGoods;\n\nimport java.util.List;\n\n/**\n * 收藏商品\n */\npublic interface FavoriteGoodsService extends BaseService<FavoriteGoods> {\n    List<FavoriteGoodsDTO> list(String userId);\n}"
  },
  {
    "path": "src/main/java/io/sdb/service/GoodsService.java",
    "content": "/**\n * Copyright 2018\n * <p>\n * Licensed under the Apache License, Version 2.0 (the \"License\"); you may not\n * use this file except in compliance with the License. You may obtain a copy of\n * the License at\n * <p>\n * http://www.apache.org/licenses/LICENSE-2.0\n * <p>\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS, WITHOUT\n * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the\n * License for the specific language governing permissions and limitations under\n * the License.\n */\n\npackage io.sdb.service;\n\nimport io.sdb.common.utils.R;\nimport io.sdb.form.GoodsData;\nimport io.sdb.form.GoodsParaData;\nimport io.sdb.form.GoodsSpecData;\nimport io.sdb.common.utils.PageUtils;\nimport io.sdb.model.Goods;\n\nimport java.util.List;\nimport java.util.Map;\n\n\n/**\n * 系统日志\n * \n * @author chenshun\n * @email sunlightcs@gmail.com\n * @date 2017-03-08 10:40:56\n */\npublic interface GoodsService extends BaseService<Goods> {\n    PageUtils queryPage(Map<String, Object> params);\n    Goods saveUpdateGoods(GoodsData goods, List<GoodsParaData> paraList, List<GoodsSpecData> specList);\n    R batchShelf(String[] ids);\n    R batchObtained(String[] ids);\n}\n"
  },
  {
    "path": "src/main/java/io/sdb/service/GrouponService.java",
    "content": "package io.sdb.service;\n\nimport io.sdb.model.Groupon;\n\npublic interface GrouponService extends BaseService<Groupon> {\n}"
  },
  {
    "path": "src/main/java/io/sdb/service/GrouponTeamService.java",
    "content": "package io.sdb.service;\n\nimport io.sdb.model.GrouponTeam;\n\npublic interface GrouponTeamService extends BaseService<GrouponTeam> {\n}"
  },
  {
    "path": "src/main/java/io/sdb/service/LogisticsService.java",
    "content": "/**\n * Copyright 2018\n * <p>\n * Licensed under the Apache License, Version 2.0 (the \"License\"); you may not\n * use this file except in compliance with the License. You may obtain a copy of\n * the License at\n * <p>\n * http://www.apache.org/licenses/LICENSE-2.0\n * <p>\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS, WITHOUT\n * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the\n * License for the specific language governing permissions and limitations under\n * the License.\n */\n\npackage io.sdb.service;\n\nimport io.sdb.common.utils.PageUtils;\nimport io.sdb.model.Logistics;\nimport io.sdb.model.SysLog;\nimport io.sdb.service.BaseService;\n\nimport java.util.Map;\n\n\n/**\n * 系统日志\n * \n * @author chenshun\n * @email sunlightcs@gmail.com\n * @date 2017-03-08 10:40:56\n */\npublic interface LogisticsService extends BaseService<Logistics> {\n\n    Boolean subscribe(String tradeNo, String code);\n\n}\n"
  },
  {
    "path": "src/main/java/io/sdb/service/OrderDetailService.java",
    "content": "/**\n * Copyright 2018\n * <p>\n * Licensed under the Apache License, Version 2.0 (the \"License\"); you may not\n * use this file except in compliance with the License. You may obtain a copy of\n * the License at\n * <p>\n * http://www.apache.org/licenses/LICENSE-2.0\n * <p>\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS, WITHOUT\n * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the\n * License for the specific language governing permissions and limitations under\n * the License.\n */\n\npackage io.sdb.service;\n\nimport io.sdb.model.OrderDetail;\nimport io.sdb.model.OrderMaster;\n\n\n/**\n * 系统日志\n * \n * @author chenshun\n * @email sunlightcs@gmail.com\n * @date 2017-03-08 10:40:56\n */\npublic interface OrderDetailService extends BaseService<OrderDetail> {\n\n}\n"
  },
  {
    "path": "src/main/java/io/sdb/service/OrderMasterService.java",
    "content": "package io.sdb.service;\n\nimport io.sdb.common.utils.PageUtils;\nimport io.sdb.dto.OrderDTO;\nimport io.sdb.model.OrderMaster;\n\nimport java.math.BigDecimal;\nimport java.util.List;\nimport java.util.Map;\n\npublic interface OrderMasterService extends BaseService<OrderMaster> {\n    PageUtils queryPage(Map<String, Object> params);\n\n    OrderDTO create(OrderDTO orderDTO);\n\n\n    OrderMaster cancel(String orderId);\n\n\n    Boolean updateByGrouponId(String grouponId,Integer status);\n\n    /** 支付订单. */\n    OrderMaster paid(OrderMaster orderMaster);\n\n    Boolean shipping(OrderDTO orderDTO, String deliveryCode);\n\n    Boolean delete(String orderId);\n\n    BigDecimal getTodayTotalSale();\n\n    List<OrderMaster> getTodayTotalOrders();\n\n    List<OrderMaster> getTodayOrders();\n\n}"
  },
  {
    "path": "src/main/java/io/sdb/service/PayService.java",
    "content": "/**\n * Copyright 2018\n * <p>\n * Licensed under the Apache License, Version 2.0 (the \"License\"); you may not\n * use this file except in compliance with the License. You may obtain a copy of\n * the License at\n * <p>\n * http://www.apache.org/licenses/LICENSE-2.0\n * <p>\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS, WITHOUT\n * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the\n * License for the specific language governing permissions and limitations under\n * the License.\n */\n\npackage io.sdb.service;\n\nimport com.lly835.bestpay.model.PayResponse;\nimport io.sdb.dto.OrderDTO;\nimport io.sdb.model.OrderMaster;\n\n\n/**\n * 系统日志\n * \n * @author chenshun\n * @email sunlightcs@gmail.com\n * @date 2017-03-08 10:40:56\n */\npublic interface PayService {\n    PayResponse create(OrderDTO orderDTO);\n\n    OrderMaster refund(String orderId);\n\n    PayResponse notify(String notifyData);\n}\n"
  },
  {
    "path": "src/main/java/io/sdb/service/ProductCategoryService.java",
    "content": "/**\n * Copyright 2018\n * <p>\n * Licensed under the Apache License, Version 2.0 (the \"License\"); you may not\n * use this file except in compliance with the License. You may obtain a copy of\n * the License at\n * <p>\n * http://www.apache.org/licenses/LICENSE-2.0\n * <p>\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS, WITHOUT\n * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the\n * License for the specific language governing permissions and limitations under\n * the License.\n */\n\npackage io.sdb.service;\n\nimport io.sdb.common.utils.R;\nimport io.sdb.model.ProductCategory;\n\nimport java.util.List;\n\n\n/**\n * 系统日志\n * \n * @author chenshun\n * @email sunlightcs@gmail.com\n * @date 2017-03-08 10:40:56\n */\npublic interface ProductCategoryService extends BaseService<ProductCategory> {\n    /**\n     * 查询商品分类\n     * @return\n     */\n    List<ProductCategory> queryListOrder();\n\n    /**\n     * 根据parentId查询列表\n     * @return\n     */\n    List<ProductCategory> queryListByParentId(Long parentId);\n\n    /**\n     * 删除商品类目\n     * @param productCategoryId\n     * @return\n     */\n    R delete(Long productCategoryId);\n\n    /**\n     * 保存商品类目\n     * @param productCategory\n     * @return\n     */\n    R save(ProductCategory productCategory);\n}\n"
  },
  {
    "path": "src/main/java/io/sdb/service/ProductService.java",
    "content": "/**\n * Copyright 2018\n * <p>\n * Licensed under the Apache License, Version 2.0 (the \"License\"); you may not\n * use this file except in compliance with the License. You may obtain a copy of\n * the License at\n * <p>\n * http://www.apache.org/licenses/LICENSE-2.0\n * <p>\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS, WITHOUT\n * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the\n * License for the specific language governing permissions and limitations under\n * the License.\n */\n\npackage io.sdb.service;\n\nimport io.sdb.dto.CartDTO;\nimport io.sdb.dto.ProductDTO;\nimport io.sdb.model.Goods;\nimport io.sdb.model.Product;\n\nimport java.util.List;\n\n\n/**\n * 系统日志\n * \n * @author chenshun\n * @email sunlightcs@gmail.com\n * @date 2017-03-08 10:40:56\n */\npublic interface ProductService extends BaseService<Product> {\n    void decreaseStock(List<CartDTO> cartDTOList);\n\n    void creaseStock(List<CartDTO> cartDTOList);\n\n    Goods getGoods(String productId);\n\n    List<ProductDTO> listDetailByProductIds(String productIds);\n}\n"
  },
  {
    "path": "src/main/java/io/sdb/service/ReceiverService.java",
    "content": "/**\n * Copyright 2018\n * <p>\n * Licensed under the Apache License, Version 2.0 (the \"License\"); you may not\n * use this file except in compliance with the License. You may obtain a copy of\n * the License at\n * <p>\n * http://www.apache.org/licenses/LICENSE-2.0\n * <p>\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS, WITHOUT\n * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the\n * License for the specific language governing permissions and limitations under\n * the License.\n */\n\npackage io.sdb.service;\n\nimport io.sdb.model.Cart;\nimport io.sdb.model.Receiver;\n\n\n/**\n * 系统日志\n * \n * @author chenshun\n * @email sunlightcs@gmail.com\n * @date 2017-03-08 10:40:56\n */\npublic interface ReceiverService extends BaseService<Receiver> {\n    Receiver findDefault(String userId);\n}\n"
  },
  {
    "path": "src/main/java/io/sdb/service/ScheduleJobLogService.java",
    "content": "/**\n * Copyright 2018\n * <p>\n * Licensed under the Apache License, Version 2.0 (the \"License\"); you may not\n * use this file except in compliance with the License. You may obtain a copy of\n * the License at\n * <p>\n * http://www.apache.org/licenses/LICENSE-2.0\n * <p>\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS, WITHOUT\n * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the\n * License for the specific language governing permissions and limitations under\n * the License.\n */\n\npackage io.sdb.service;\n\nimport io.sdb.common.utils.PageUtils;\nimport io.sdb.model.ScheduleJobLog;\nimport io.sdb.service.BaseService;\n\nimport java.util.Map;\n\n/**\n * 定时任务日志\n *\n * @author Mark sunlightcs@gmail.com\n * @since 1.2.0 2016-11-28\n */\npublic interface ScheduleJobLogService extends BaseService<ScheduleJobLog> {\n\n\tPageUtils queryPage(Map<String, Object> params);\n\t\n}\n"
  },
  {
    "path": "src/main/java/io/sdb/service/ScheduleJobService.java",
    "content": "/**\n * Copyright 2018\n * <p>\n * Licensed under the Apache License, Version 2.0 (the \"License\"); you may not\n * use this file except in compliance with the License. You may obtain a copy of\n * the License at\n * <p>\n * http://www.apache.org/licenses/LICENSE-2.0\n * <p>\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS, WITHOUT\n * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the\n * License for the specific language governing permissions and limitations under\n * the License.\n */\n\npackage io.sdb.service;\n\nimport io.sdb.common.utils.PageUtils;\nimport io.sdb.model.ScheduleJob;\nimport io.sdb.service.BaseService;\n\nimport java.util.Map;\n\n/**\n * 定时任务\n *\n * @author Mark sunlightcs@gmail.com\n * @since 1.2.0 2016-11-28\n */\npublic interface ScheduleJobService extends BaseService<ScheduleJob> {\n\n\tPageUtils queryPage(Map<String, Object> params);\n\n\t/**\n\t * 保存定时任务\n\t */\n\tvoid save(ScheduleJob scheduleJob);\n\t\n\t/**\n\t * 更新定时任务\n\t */\n\tboolean update(ScheduleJob scheduleJob);\n\t\n\t/**\n\t * 批量删除定时任务\n\t */\n\tvoid deleteBatch(Long[] jobIds);\n\t\n\t/**\n\t * 批量更新定时任务状态\n\t */\n\tint updateBatch(Long[] jobIds, int status);\n\t\n\t/**\n\t * 立即执行\n\t */\n\tvoid run(Long[] jobIds);\n\t\n\t/**\n\t * 暂停运行\n\t */\n\tvoid pause(Long[] jobIds);\n\t\n\t/**\n\t * 恢复运行\n\t */\n\tvoid resume(Long[] jobIds);\n}\n"
  },
  {
    "path": "src/main/java/io/sdb/service/ShiroService.java",
    "content": "package io.sdb.service;\n\nimport io.sdb.model.SysUser;\nimport io.sdb.model.SysUserToken;\n\nimport java.util.Set;\n\n/**\n * shiro相关接口\n * @author chenshun\n * @email sunlightcs@gmail.com\n * @date 2017-06-06 8:49\n */\npublic interface ShiroService {\n    /**\n     * 获取用户权限列表\n     */\n    Set<String> getUserPermissions(long userId);\n\n    SysUserToken queryByToken(String token);\n\n    /**\n     * 根据用户ID，查询用户\n     * @param userId\n     */\n    SysUser queryUser(Long userId);\n}\n"
  },
  {
    "path": "src/main/java/io/sdb/service/SnService.java",
    "content": "/**\n * Copyright 2018\n * <p>\n * Licensed under the Apache License, Version 2.0 (the \"License\"); you may not\n * use this file except in compliance with the License. You may obtain a copy of\n * the License at\n * <p>\n * http://www.apache.org/licenses/LICENSE-2.0\n * <p>\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS, WITHOUT\n * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the\n * License for the specific language governing permissions and limitations under\n * the License.\n */\n\npackage io.sdb.service;\n\nimport io.sdb.enums.SnEnum;\nimport io.sdb.model.Sn;\n\n\n/**\n * sn生成\n * \n * @author dick\n */\npublic interface SnService extends BaseService<Sn> {\n    String generate(SnEnum type);\n}\n"
  },
  {
    "path": "src/main/java/io/sdb/service/SpecificationService.java",
    "content": "/**\n * Copyright 2018\n * <p>\n * Licensed under the Apache License, Version 2.0 (the \"License\"); you may not\n * use this file except in compliance with the License. You may obtain a copy of\n * the License at\n * <p>\n * http://www.apache.org/licenses/LICENSE-2.0\n * <p>\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS, WITHOUT\n * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the\n * License for the specific language governing permissions and limitations under\n * the License.\n */\n\npackage io.sdb.service;\n\nimport io.sdb.common.utils.R;\nimport io.sdb.model.Specification;\n\nimport java.util.List;\n\n\n/**\n * 规格\n * \n * @author chenshun\n * @email sunlightcs@gmail.com\n * @date 2017-03-08 10:40:56\n */\npublic interface SpecificationService extends BaseService<Specification> {\n    /**\n     * 根据商品类目查询规格\n     * @param categoryId\n     * @return\n     */\n    List<Specification> queryListByCategoryId(Long categoryId);\n\n    /**\n     * 查询规格信息\n     * @return\n     */\n    List<Specification> queryListByOrder();\n\n    /**\n     * 删除规格信息\n     * @param id\n     * @return\n     */\n    R delete(Long id);\n\n    /**\n     * 保存规格信息\n     * @param specification\n     * @return\n     */\n    R save(Specification specification);\n}\n"
  },
  {
    "path": "src/main/java/io/sdb/service/SysCaptchaService.java",
    "content": "/**\n * Copyright 2018\n * <p>\n * Licensed under the Apache License, Version 2.0 (the \"License\"); you may not\n * use this file except in compliance with the License. You may obtain a copy of\n * the License at\n * <p>\n * http://www.apache.org/licenses/LICENSE-2.0\n * <p>\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS, WITHOUT\n * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the\n * License for the specific language governing permissions and limitations under\n * the License.\n */\n\npackage io.sdb.service;\n\nimport io.sdb.model.SysCaptcha;\nimport io.sdb.service.BaseService;\n\nimport java.awt.image.BufferedImage;\n\n/**\n * 验证码\n *\n * @author Mark sunlightcs@gmail.com\n * @since 2.0.0 2018-02-10\n */\npublic interface SysCaptchaService extends BaseService<SysCaptcha> {\n\n    /**\n     * 获取图片验证码\n     */\n    BufferedImage getCaptcha(String uuid);\n\n    /**\n     * 验证码效验\n     * @param uuid  uuid\n     * @param code  验证码\n     * @return  true：成功  false：失败\n     */\n    boolean validate(String uuid, String code);\n}\n"
  },
  {
    "path": "src/main/java/io/sdb/service/SysConfigService.java",
    "content": "/**\n * Copyright 2018\n * <p>\n * Licensed under the Apache License, Version 2.0 (the \"License\"); you may not\n * use this file except in compliance with the License. You may obtain a copy of\n * the License at\n * <p>\n * http://www.apache.org/licenses/LICENSE-2.0\n * <p>\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS, WITHOUT\n * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the\n * License for the specific language governing permissions and limitations under\n * the License.\n */\n\npackage io.sdb.service;\n\nimport io.sdb.common.utils.PageUtils;\nimport io.sdb.model.SysConfig;\nimport io.sdb.service.BaseService;\n\nimport java.util.Map;\n\n/**\n * 系统配置信息\n * \n * @author chenshun\n * @email sunlightcs@gmail.com\n * @date 2016年12月4日 下午6:49:01\n */\npublic interface SysConfigService extends BaseService<SysConfig> {\n\n\tPageUtils queryPage(Map<String, Object> params);\n\t\n\t/**\n\t * 保存配置信息\n\t */\n\tvoid save(SysConfig config);\n\t\n\t/**\n\t * 更新配置信息\n\t */\n\tboolean update(SysConfig config);\n\t\n\t/**\n\t * 根据key，更新value\n\t */\n\tvoid updateValueByKey(String key, String value);\n\n\t/**\n\t * 删除配置信息\n\t */\n\tvoid deleteBatch(Long[] ids);\n\t\n\t/**\n\t * 根据key，获取配置的value值\n\t * \n\t * @param key           key\n\t */\n\tString getValue(String key);\n\t\n\t/**\n\t * 根据key，获取value的Object对象\n\t * @param key    key\n\t * @param clazz  Object对象\n\t */\n\t<T> T getConfigObject(String key, Class<T> clazz);\n\t\n}\n"
  },
  {
    "path": "src/main/java/io/sdb/service/SysLogService.java",
    "content": "/**\n * Copyright 2018\n * <p>\n * Licensed under the Apache License, Version 2.0 (the \"License\"); you may not\n * use this file except in compliance with the License. You may obtain a copy of\n * the License at\n * <p>\n * http://www.apache.org/licenses/LICENSE-2.0\n * <p>\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS, WITHOUT\n * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the\n * License for the specific language governing permissions and limitations under\n * the License.\n */\n\npackage io.sdb.service;\n\nimport io.sdb.common.utils.PageUtils;\nimport io.sdb.model.SysLog;\nimport io.sdb.service.BaseService;\n\nimport java.util.Map;\n\n\n/**\n * 系统日志\n * \n * @author chenshun\n * @email sunlightcs@gmail.com\n * @date 2017-03-08 10:40:56\n */\npublic interface SysLogService extends BaseService<SysLog> {\n\n    PageUtils queryPage(Map<String, Object> params);\n\n}\n"
  },
  {
    "path": "src/main/java/io/sdb/service/SysMenuService.java",
    "content": "/**\n * Copyright 2018\n * <p>\n * Licensed under the Apache License, Version 2.0 (the \"License\"); you may not\n * use this file except in compliance with the License. You may obtain a copy of\n * the License at\n * <p>\n * http://www.apache.org/licenses/LICENSE-2.0\n * <p>\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS, WITHOUT\n * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the\n * License for the specific language governing permissions and limitations under\n * the License.\n */\n\npackage io.sdb.service;\n\nimport io.sdb.model.SysMenu;\nimport io.sdb.service.BaseService;\n\nimport java.util.List;\n\n\n/**\n * 菜单管理\n * \n * @author chenshun\n * @email sunlightcs@gmail.com\n * @date 2016年9月18日 上午9:42:16\n */\npublic interface SysMenuService extends BaseService<SysMenu> {\n\n\t/**\n\t * 根据父菜单，查询子菜单\n\t * @param parentId 父菜单ID\n\t * @param menuIdList  用户菜单ID\n\t */\n\tList<SysMenu> queryListParentId(Long parentId, List<Long> menuIdList);\n\n\t/**\n\t * 根据父菜单，查询子菜单\n\t * @param parentId 父菜单ID\n\t */\n\tList<SysMenu> queryListParentId(Long parentId);\n\t\n\t/**\n\t * 获取不包含按钮的菜单列表\n\t */\n\tList<SysMenu> queryNotButtonList();\n\t\n\t/**\n\t * 获取用户菜单列表\n\t */\n\tList<SysMenu> getUserMenuList(Long userId);\n\n\t/**\n\t * 删除\n\t */\n\tvoid delete(Long menuId);\n}\n"
  },
  {
    "path": "src/main/java/io/sdb/service/SysOssService.java",
    "content": "/**\n * Copyright 2018\n * <p>\n * Licensed under the Apache License, Version 2.0 (the \"License\"); you may not\n * use this file except in compliance with the License. You may obtain a copy of\n * the License at\n * <p>\n * http://www.apache.org/licenses/LICENSE-2.0\n * <p>\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS, WITHOUT\n * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the\n * License for the specific language governing permissions and limitations under\n * the License.\n */\n\npackage io.sdb.service;\n\nimport io.sdb.common.utils.PageUtils;\nimport io.sdb.model.SysOss;\nimport io.sdb.service.BaseService;\n\nimport java.util.Map;\n\n/**\n * 文件上传\n * \n * @author chenshun\n * @email sunlightcs@gmail.com\n * @date 2017-03-25 12:13:26\n */\npublic interface SysOssService extends BaseService<SysOss> {\n\n\tPageUtils queryPage(Map<String, Object> params);\n}\n"
  },
  {
    "path": "src/main/java/io/sdb/service/SysRoleMenuService.java",
    "content": "package io.sdb.service;\n\nimport io.sdb.model.SysRoleMenu;\nimport io.sdb.service.BaseService;\n\nimport java.util.List;\n\n\n\n/**\n * 角色与菜单对应关系\n * \n * @author chenshun\n * @email sunlightcs@gmail.com\n * @date 2016年9月18日 上午9:42:30\n */\npublic interface SysRoleMenuService extends BaseService<SysRoleMenu> {\n\t\n\tvoid saveOrUpdate(Long roleId, List<Long> menuIdList);\n\t\n\t/**\n\t * 根据角色ID，获取菜单ID列表\n\t */\n\tList<Long> queryMenuIdList(Long roleId);\n\n\t/**\n\t * 根据角色ID数组，批量删除\n\t */\n\tboolean deleteBatch(Long[] roleIds);\n\t\n}\n"
  },
  {
    "path": "src/main/java/io/sdb/service/SysRoleService.java",
    "content": "package io.sdb.service;\n\nimport io.sdb.common.utils.PageUtils;\nimport io.sdb.model.SysRole;\nimport io.sdb.service.BaseService;\n\nimport java.util.List;\nimport java.util.Map;\n\n\n/**\n * 角色\n * \n * @author chenshun\n * @email sunlightcs@gmail.com\n * @date 2016年9月18日 上午9:42:52\n */\npublic interface SysRoleService extends BaseService<SysRole> {\n\n\tPageUtils queryPage(Map<String, Object> params);\n\n\tvoid save(SysRole role);\n\n\tboolean update(SysRole role);\n\n\tvoid deleteBatch(Long[] roleIds);\n\n\t/**\n\t * 查询用户创建的角色ID列表\n\t */\n\tList<Long> queryRoleIdList(Long createUserId);\n}\n"
  },
  {
    "path": "src/main/java/io/sdb/service/SysUserRoleService.java",
    "content": "package io.sdb.service;\n\nimport io.sdb.model.SysUserRole;\nimport io.sdb.service.BaseService;\n\nimport java.util.List;\n\n\n\n/**\n * 用户与角色对应关系\n * \n * @author chenshun\n * @email sunlightcs@gmail.com\n * @date 2016年9月18日 上午9:43:24\n */\npublic interface SysUserRoleService extends BaseService<SysUserRole> {\n\t\n\tvoid saveOrUpdate(Long userId, List<Long> roleIdList);\n\t\n\t/**\n\t * 根据用户ID，获取角色ID列表\n\t */\n\tList<Long> queryRoleIdList(Long userId);\n}\n"
  },
  {
    "path": "src/main/java/io/sdb/service/SysUserService.java",
    "content": "package io.sdb.service;\n\nimport io.sdb.common.utils.PageUtils;\nimport io.sdb.model.SysUser;\nimport io.sdb.service.BaseService;\n\nimport java.util.List;\nimport java.util.Map;\n\n\n/**\n * 系统用户\n * \n * @author chenshun\n * @email sunlightcs@gmail.com\n * @date 2016年9月18日 上午9:43:39\n */\npublic interface SysUserService extends BaseService<SysUser> {\n\n\tPageUtils queryPage(Map<String, Object> params);\n\n\t/**\n\t * 查询用户的所有权限\n\t * @param userId  用户ID\n\t */\n\tList<String> queryAllPerms(Long userId);\n\t\n\t/**\n\t * 查询用户的所有菜单ID\n\t */\n\tList<Long> queryAllMenuId(Long userId);\n\n\t/**\n\t * 根据用户名，查询系统用户\n\t */\n\tSysUser queryByUserName(String username);\n\n\t/**\n\t * 保存用户\n\t */\n\tvoid save(SysUser user);\n\t\n\t/**\n\t * 修改用户\n\t */\n\tboolean update(SysUser user);\n\n\t/**\n\t * 修改密码\n\t * @param userId       用户ID\n\t * @param password     原密码\n\t * @param newPassword  新密码\n\t */\n\tboolean updatePassword(Long userId, String password, String newPassword);\n}\n"
  },
  {
    "path": "src/main/java/io/sdb/service/SysUserTokenService.java",
    "content": "package io.sdb.service;\n\nimport io.sdb.common.utils.R;\nimport io.sdb.model.SysUserToken;\nimport io.sdb.service.BaseService;\n\n/**\n * 用户Token\n * \n * @author chenshun\n * @email sunlightcs@gmail.com\n * @date 2017-03-23 15:22:07\n */\npublic interface SysUserTokenService extends BaseService<SysUserToken> {\n\n\t/**\n\t * 生成token\n\t * @param userId  用户ID\n\t */\n\tR createToken(long userId);\n\n\t/**\n\t * 退出，修改token值\n\t * @param userId  用户ID\n\t */\n\tvoid logout(long userId);\n\n}\n"
  },
  {
    "path": "src/main/java/io/sdb/service/UserService.java",
    "content": "package io.sdb.service;\n\nimport cn.binarywang.wx.miniapp.bean.WxMaUserInfo;\nimport io.sdb.model.User;\nimport io.sdb.form.LoginForm;\nimport io.sdb.service.BaseService;\n\n/**\n * 用户\n * \n * @author dick\n */\npublic interface UserService extends BaseService<User> {\n\n\tUser queryByMobile(String mobile);\n\n\t/**\n\t * 用户登录\n\t * @param form    登录表单\n\t * @return        返回用户ID\n\t */\n\tString login(LoginForm form);\n\n\tUser addMaUser(WxMaUserInfo wxMaUserInfo);\n\n\tInteger getYestodayNewUsers();\n\n\tInteger getTotalUsers();\n}\n"
  },
  {
    "path": "src/main/java/io/sdb/service/impl/AreaServiceImpl.java",
    "content": "package io.sdb.service.impl;\n\nimport io.sdb.dao.AreaDao;\nimport io.sdb.model.Area;\nimport io.sdb.service.AreaService;\nimport org.springframework.stereotype.Service;\n\n\n@Service\npublic class AreaServiceImpl extends BaseServiceImpl<AreaDao, Area> implements AreaService {\n}\n"
  },
  {
    "path": "src/main/java/io/sdb/service/impl/BaseServiceImpl.java",
    "content": "package io.sdb.service.impl;\n\nimport com.jfinal.plugin.activerecord.*;\nimport io.sdb.common.entity.Filter;\nimport io.sdb.common.entity.Order;\nimport io.sdb.common.utils.PageUtils;\nimport io.sdb.common.utils.Query;\nimport io.sdb.dao.*;\nimport io.sdb.model.Goods;\nimport io.sdb.service.BaseService;\nimport org.apache.commons.lang.StringUtils;\nimport org.springframework.beans.factory.annotation.Autowired;\n\nimport java.util.ArrayList;\nimport java.util.List;\nimport java.util.Map;\n\npublic class BaseServiceImpl<T extends BaseDao<M>, M extends Model<M>> implements BaseService<M> {\n\n    @Autowired\n    public T dao;\n\n    @Override\n    public List<M> findAll() {\n        return dao.findAll();\n    }\n\n    @Override\n    public M findById(Object... id) {\n        return dao.findById(id);\n    }\n\n    @Override\n    public List<M> findByModel(M model) {\n        return dao.findByModel(model);\n    }\n\n    @Override\n    public M findFirstByModel(M model) {\n        return dao.findFirstByModel(model);\n    }\n\n    @Override\n    public List<M> find(SqlPara sqlPara) {\n        return dao.find(sqlPara);\n    }\n\n    @Override\n    public M findFirst(SqlPara sqlPara) {\n        return dao.findFirst(sqlPara);\n    }\n\n    @Override\n    public boolean deleteBatch(Object[]... ids) {\n        return dao.deleteBatch(ids);\n    }\n\n    @Override\n    public boolean deleteBatch(String[] columns, Object[]... ids) {\n        return dao.deleteBatch(columns, ids);\n    }\n\n    @Override\n    public boolean deleteByModel(M model) {\n        return dao.deleteByModel(model);\n    }\n\n    @Override\n    public Page<M> paginate(Integer pageNum, Integer pageSize, List<Filter> filters, Order order) {\n        return this.dao.paginate(pageNum, pageSize, filters, order);\n    }\n\n    @Override\n    public Page<M> paginate(Integer pageNum, Integer pageSize, List<Filter> filters) {\n        return this.dao.paginate(pageNum, pageSize, filters);\n    }\n\n    @Override\n    public Page<M> paginate(Integer pageNum, Integer pageSize) {\n        return this.dao.paginate(pageNum, pageSize);\n    }\n\n    @Override\n    public Page<M> paginate(Integer pageNum, Integer pageSize, List<Filter> filters, List<Order> orders) {\n        return this.dao.paginate(pageNum, pageSize, filters, orders);\n    }\n\n    @Override\n    public Page<M> paginate(Integer pageNum, Integer pageSize, Filter filter, List<Order> orders) {\n        return this.dao.paginate(pageNum, pageSize, filter, orders);\n    }\n\n    @Override\n    public Page<M> paginate(Integer pageNum, Integer pageSize, Filter filter, Order order) {\n        List<Order> orderList = new ArrayList<>();\n        orderList.add(order);\n        return this.dao.paginate(pageNum, pageSize, filter, orderList);\n    }\n\n    @Override\n    public PageUtils queryPage(Map<String, Object> params) {\n        Query<M> query = new Query<>(params);\n        Page<M> pr = this.paginate(query.getCurrPage(), query.getLimit());\n        return new PageUtils(pr);\n    }\n\n    @Override\n    public M insert(M model) {\n        model.save();\n        return model;\n    }\n\n    @Override\n    public List<M> findByFilter(Filter filter) {\n        return this.dao.findByFilter(filter);\n    }\n\n    @Override\n    public List<M> findByFilters(List<Filter> filter) {\n        return this.dao.findByFilters(filter);\n    }\n\n    @Override\n    public boolean update(M model) {\n        return model.update();\n    }\n\n    @Override\n    public boolean delete(M model) {\n        return model.delete();\n    }\n}\n"
  },
  {
    "path": "src/main/java/io/sdb/service/impl/CampaignServiceImpl.java",
    "content": "package io.sdb.service.impl;\n\nimport io.sdb.dao.CampaignDao;\nimport io.sdb.model.Campaign;\nimport io.sdb.service.CampaignService;\nimport org.springframework.stereotype.Service;\n\n@Service\npublic class CampaignServiceImpl extends BaseServiceImpl<CampaignDao, Campaign> implements CampaignService {\n}"
  },
  {
    "path": "src/main/java/io/sdb/service/impl/CartServiceImpl.java",
    "content": "package io.sdb.service.impl;\n\nimport com.jfinal.kit.Kv;\nimport com.jfinal.plugin.activerecord.Db;\nimport com.jfinal.plugin.activerecord.Record;\nimport com.jfinal.plugin.activerecord.SqlPara;\nimport io.sdb.common.entity.Filter;\nimport io.sdb.dao.CartDao;\nimport io.sdb.dto.CartDTO;\nimport io.sdb.model.Cart;\nimport io.sdb.model.Product;\nimport io.sdb.common.utils.RecordUtils;\nimport io.sdb.service.CartService;\nimport io.sdb.service.ProductService;\nimport org.springframework.beans.factory.annotation.Autowired;\nimport org.springframework.stereotype.Service;\n\nimport java.util.Date;\nimport java.util.List;\nimport java.util.stream.Collectors;\n\n@Service\npublic class CartServiceImpl extends BaseServiceImpl<CartDao, Cart> implements CartService {\n\n    @Autowired\n    ProductService productService;\n\n    @Override\n    public Boolean saveOrUpdate(String userId, String productId, Integer quantity) {\n        Cart qcart = new Cart();\n        qcart.setProductId(productId);\n        Cart cart = this.findFirstByModel(qcart);\n        if (cart == null) {\n            cart = new Cart();\n            cart.setQuantity(quantity);\n            cart.setProductId(productId);\n            cart.setUserId(userId);\n            cart.save();\n        }else {\n            cart.setQuantity(cart.getQuantity() + quantity);\n            cart.setUpdateDate(new Date());\n            cart.update();\n        }\n        return true;\n    }\n\n    @Override\n    public Boolean remove(String userId, String cartIds) {\n        String[] cartIdArr = cartIds.split(\",\");\n        return this.deleteBatch(cartIdArr);\n    }\n\n    @Override\n    public List<Product> getCartProduct(List<Long> cartItemIds) {\n        Filter filter = new Filter();\n        filter.setProperty(\"product_id\");\n        filter.setValue(cartItemIds);\n        filter.setOperator(Filter.Operator.in);\n        List<Cart> cartList = this.findByFilter(filter);\n\n        List<String> productIds = cartList.stream().map(item -> {\n            return item.getProductId();\n        }).collect(Collectors.toList());\n        filter = new Filter();\n        filter.setProperty(\"product_id\");\n        filter.setValue(productIds);\n        filter.setOperator(Filter.Operator.in);\n        List<Product> productList = productService.findByFilter(filter);\n\n        for (Cart cart : cartList) {\n            for (Product product : productList) {\n                if (cart.getProductId().equals(product.getSn())) {\n                    product.setQuantity(cart.getQuantity());\n                    break;\n                }\n            }\n        }\n\n        return productList;\n    }\n\n    @Override\n    public List<CartDTO> listDetail(String userId) {\n        SqlPara sqlPara =  Db.getSqlPara(\"cart.listDetail\", Kv.by(\"userId\", userId));\n        List<Record> recordList = Db.find(sqlPara);\n        List<CartDTO> cartDTOList = RecordUtils.converModel(recordList, CartDTO.class);\n        return cartDTOList;\n    }\n}\n"
  },
  {
    "path": "src/main/java/io/sdb/service/impl/DeliveryCorpServiceImpl.java",
    "content": "package io.sdb.service.impl;\n\nimport io.sdb.dao.DeliveryCorpDao;\nimport io.sdb.model.DeliveryCorp;\nimport io.sdb.service.DeliveryCorpService;\nimport org.springframework.stereotype.Service;\n\n@Service\npublic class DeliveryCorpServiceImpl extends BaseServiceImpl<DeliveryCorpDao, DeliveryCorp> implements DeliveryCorpService {\n}"
  },
  {
    "path": "src/main/java/io/sdb/service/impl/FavoriteGoodsServiceImpl.java",
    "content": "package io.sdb.service.impl;\n\nimport com.jfinal.kit.Kv;\nimport com.jfinal.plugin.activerecord.Db;\nimport com.jfinal.plugin.activerecord.Record;\nimport com.jfinal.plugin.activerecord.SqlPara;\nimport io.sdb.common.utils.RecordUtils;\nimport io.sdb.dao.FavoriteGoodsDao;\nimport io.sdb.dto.FavoriteGoodsDTO;\nimport io.sdb.model.FavoriteGoods;\nimport io.sdb.service.FavoriteGoodsService;\nimport org.springframework.stereotype.Service;\n\nimport java.util.List;\n\n@Service\npublic class FavoriteGoodsServiceImpl extends BaseServiceImpl<FavoriteGoodsDao, FavoriteGoods> implements FavoriteGoodsService {\n\n    @Override\n    public List<FavoriteGoodsDTO> list(String userId) {\n        SqlPara sqlPara =  Db.getSqlPara(\"favoriteGoods.list\", Kv.by(\"userId\", userId));\n        List<Record> recordList = Db.find(sqlPara);\n        List<FavoriteGoodsDTO> favoriteGoodsDTOList = RecordUtils.converModel(recordList, FavoriteGoodsDTO.class);\n        return favoriteGoodsDTOList;\n    }\n}"
  },
  {
    "path": "src/main/java/io/sdb/service/impl/GoodsServiceImpl.java",
    "content": "package io.sdb.service.impl;\n\nimport com.alibaba.fastjson.JSONArray;\nimport com.alibaba.fastjson.JSONObject;\nimport com.jfinal.plugin.activerecord.Db;\nimport com.jfinal.plugin.activerecord.Page;\nimport io.sdb.common.annotation.JFinalTx;\nimport io.sdb.common.entity.Filter;\nimport io.sdb.common.entity.Order;\nimport io.sdb.common.utils.R;\nimport io.sdb.form.GoodsData;\nimport io.sdb.form.GoodsParaData;\nimport io.sdb.form.GoodsSpecData;\nimport io.sdb.common.utils.PageUtils;\nimport io.sdb.common.utils.Query;\nimport io.sdb.dao.GoodsDao;\nimport io.sdb.enums.SnEnum;\nimport io.sdb.model.Goods;\nimport io.sdb.model.Product;\nimport io.sdb.service.GoodsService;\nimport io.sdb.service.SnService;\nimport org.apache.commons.lang.StringUtils;\nimport org.springframework.beans.factory.annotation.Autowired;\nimport org.springframework.stereotype.Service;\n\nimport java.math.BigDecimal;\nimport java.util.ArrayList;\nimport java.util.List;\nimport java.util.Map;\n\n@Service\npublic class GoodsServiceImpl extends BaseServiceImpl<GoodsDao, Goods> implements GoodsService {\n\n    @Autowired\n    SnService snService;\n\n    @Override\n    public PageUtils queryPage(Map<String, Object> params) {\n        String searchKey = (String)params.get(\"searchKey\");\n        Query<Goods> query = new Query<Goods>(params);\n        List<Filter> filters = new ArrayList<>();\n        if (!StringUtils.isBlank(searchKey)) {\n            Filter filter = new Filter();\n            filter.setProperty(\"name\");\n            filter.setValue(searchKey);\n            filter.setOperator(Filter.Operator.like);\n            filters.add(filter);\n\n            filter = new Filter();\n            filter.setProperty(\"caption\");\n            filter.setValue(searchKey);\n            filter.setOperator(Filter.Operator.like);\n            filter.setWhereOpt(Filter.WhereOpt.or);\n            filters.add(filter);\n\n            filter = new Filter();\n            filter.setProperty(\"sn\");\n            filter.setValue(searchKey);\n            filter.setOperator(Filter.Operator.like);\n            filter.setWhereOpt(Filter.WhereOpt.or);\n            filters.add(filter);\n        }\n\n        Order order = new Order();\n        order.setProperty(\"create_date\");\n        order.setDirection(Order.Direction.desc);\n        Page<Goods> pr = this.paginate(query.getCurrPage(), query.getLimit(), filters, order);\n\n        return new PageUtils(pr);\n    }\n\n    @Override\n    @JFinalTx\n    public Goods saveUpdateGoods(GoodsData goods, List<GoodsParaData> paraList, List<GoodsSpecData> specList) {\n        Goods newGoods = new Goods();\n        newGoods.setName(goods.getName());\n        newGoods.setModel(goods.getModel());\n        newGoods.setCaption(goods.getCaption());\n        newGoods.setImage(goods.getProductImageUrlArr().get(0));\n        newGoods.setProductImages(StringUtils.join(goods.getProductImageUrlArr(), ','));\n        newGoods.setIntroduction(StringUtils.join(goods.getIntroImageUrlArr(), ','));\n        newGoods.setIsDelivery(goods.isDelivery());\n        newGoods.setIsMarketable(goods.isMarketable());\n        newGoods.setUnit(goods.getUnit());\n        newGoods.setWeight(goods.getWeight());\n        newGoods.setParameterValues(JSONArray.toJSONString(paraList));\n        newGoods.setProductCategoryId(goods.getCategoryId().get(goods.getCategoryId().size() - 1));\n        newGoods.setPrice(goods.getPrice());\n        if(goods.isGroupon()) {\n            //TODO 之后活动变多后需要用位运算\n            newGoods.setCampaign(1);\n            newGoods.setGrouponCount(goods.getGrouponCount());\n        }\n\n        if(goods.isHasSpec()){\n            newGoods.setSpecificationItems(JSONObject.toJSONString(goods.getSpecificationGroup()));\n        }\n\n        String goodsSn = null;\n        if (goods.getSn() == null) {\n            goodsSn = snService.generate(SnEnum.GOODS);\n            newGoods.setSn(goodsSn);\n            newGoods.save();\n        } else {\n            newGoods.setSn(goods.getSn());\n            newGoods.update();\n        }\n\n        if (goods.isHasSpec()) {\n            int defaultIdx = goods.getProductDefault();\n            int curidx = 0;\n            List<Product> products = new ArrayList<>();\n            for (GoodsSpecData goodsSpecData : specList) {\n                Product product = new Product();\n                boolean defaultFlag = false;\n                if (curidx == defaultIdx) {\n                    defaultFlag = true;\n                }\n                product.setIsDefault(defaultFlag);\n                product.setPrice(goodsSpecData.getPrice());\n                if(goods.isGroupon()) {\n                    product.setGroupPrice(goodsSpecData.getGroupPrice());\n                }else {\n                    product.setGroupPrice(BigDecimal.ZERO);\n                }\n\n                product.setCost(goodsSpecData.getCost());\n                product.setEnable(goodsSpecData.getEnable());\n                product.setSpecificationValues(goodsSpecData.getSpecIds());\n                if (goodsSn != null) {\n                    product.setGoodsSn(goodsSn);\n                }\n\n                if (goodsSpecData.getSn() == null) {\n                    String productSn = snService.generate(SnEnum.PRODUCT);\n                    product.setSn(productSn);\n                }else {\n                    product.setSn(goodsSpecData.getSn());\n                }\n\n                product.setStock(goodsSpecData.getStock());\n                products.add(product);\n                curidx ++;\n            }\n\n            if (goods.getSn() != null) {\n                Db.batchUpdate(products, products.size());\n            } else {\n                Db.batchSave(products, products.size());\n            }\n\n            newGoods.setProductList(products);\n        }else {\n            Product product = new Product();\n            product.setIsDefault(true);\n            product.setPrice(goods.getPrice());\n            product.setCost(goods.getCost());\n            product.setStock(goods.getStock());\n            product.setEnable(true);\n            if (goods.getSn() != null) {\n                product.setGoodsSn(goods.getSn());\n                String productSn = snService.generate(SnEnum.PRODUCT);\n                product.setSn(productSn);\n                product.save();\n            } else {\n                GoodsSpecData goodsSpecData = specList.get(0);\n                String productSn = goodsSpecData.getSn();\n                product.setSn(productSn);\n                product.update();\n            }\n            newGoods.setProductList(new ArrayList<Product>(){\n                {add(product);}\n            });\n        }\n\n        return newGoods;\n    }\n\n    @Override\n    @JFinalTx\n    public R batchShelf(String[] ids) {\n        if(ids == null){\n            return R.error(\"请选择商品\");\n        }\n        Filter filter = new Filter();\n        filter.setProperty(\"sn\");\n        filter.setOperator(Filter.Operator.in);\n        filter.setValue(ids);\n        List<Goods> goodsList = this.dao.findByFilter(filter);\n        if(goodsList == null){\n            return R.error();\n        }\n        for(Goods good : goodsList){\n            good.setIsMarketable(true);\n        }\n        Db.batchUpdate(goodsList,goodsList.size());\n        return R.ok();\n    }\n\n    @Override\n    @JFinalTx\n    public R batchObtained(String[] ids) {\n        if(ids == null){\n            return R.error(\"请选择商品\");\n        }\n        Filter filter = new Filter();\n        filter.setProperty(\"sn\");\n        filter.setOperator(Filter.Operator.in);\n        filter.setValue(ids);\n        List<Goods> goodsList = this.dao.findByFilter(filter);\n        if(goodsList == null){\n            return R.error();\n        }\n        for(Goods good : goodsList){\n            good.setIsMarketable(false);\n        }\n        Db.batchUpdate(goodsList,goodsList.size());\n        return R.ok();\n    }\n}\n"
  },
  {
    "path": "src/main/java/io/sdb/service/impl/GrouponServiceImpl.java",
    "content": "package io.sdb.service.impl;\n\nimport io.sdb.dao.GrouponDao;\nimport io.sdb.model.Groupon;\nimport io.sdb.service.GrouponService;\nimport org.springframework.stereotype.Service;\n\n@Service\npublic class GrouponServiceImpl extends BaseServiceImpl<GrouponDao, Groupon> implements GrouponService {\n}"
  },
  {
    "path": "src/main/java/io/sdb/service/impl/GrouponTeamServiceImpl.java",
    "content": "package io.sdb.service.impl;\n\nimport io.sdb.dao.GrouponTeamDao;\nimport io.sdb.model.GrouponTeam;\nimport io.sdb.service.GrouponTeamService;\nimport org.springframework.stereotype.Service;\n\n@Service\npublic class GrouponTeamServiceImpl extends BaseServiceImpl<GrouponTeamDao, GrouponTeam> implements GrouponTeamService {\n}"
  },
  {
    "path": "src/main/java/io/sdb/service/impl/LogisticsServiceImpl.java",
    "content": "/**\n * Copyright 2018\n * <p>\n * Licensed under the Apache License, Version 2.0 (the \"License\"); you may not\n * use this file except in compliance with the License. You may obtain a copy of\n * the License at\n * <p>\n * http://www.apache.org/licenses/LICENSE-2.0\n * <p>\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS, WITHOUT\n * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the\n * License for the specific language governing permissions and limitations under\n * the License.\n */\n\npackage io.sdb.service.impl;\n\nimport com.alibaba.fastjson.JSON;\nimport io.sdb.common.entity.kuaidi100.TaskRequest;\nimport io.sdb.common.entity.kuaidi100.TaskResponse;\nimport io.sdb.common.utils.HttpRequest;\nimport io.sdb.config.Kuaidi100Config;\nimport io.sdb.dao.LogisticsDao;\nimport io.sdb.model.Logistics;\nimport io.sdb.service.LogisticsService;\nimport io.sdb.service.impl.BaseServiceImpl;\nimport lombok.extern.slf4j.Slf4j;\nimport org.springframework.beans.factory.annotation.Autowired;\nimport org.springframework.stereotype.Service;\nimport java.util.HashMap;\n\n@Service(\"sysLogisticsService\")\n@Slf4j\npublic class LogisticsServiceImpl extends BaseServiceImpl<LogisticsDao, Logistics> implements LogisticsService {\n\n    @Autowired\n    Kuaidi100Config kuaidi100Config;\n\n    @Override\n    public Boolean subscribe(String tradeNo, String code) {\n        TaskRequest req = new TaskRequest();\n        req.setCompany(code);\n        req.setNumber(tradeNo);\n        req.getParameters().put(\"callbackurl\", kuaidi100Config.getNotifyUrl());\n        req.setKey(kuaidi100Config.getKuaidi100Key());\n\n        String kuaidi100PollUrl = kuaidi100Config.getKuaidi100PollUrl();\n\n        HashMap<String, String> p = new HashMap<String, String>();\n        p.put(\"schema\", \"json\");\n        p.put(\"param\", JSON.toJSONString(req));\n        try {\n            String ret = HttpRequest.postData(kuaidi100PollUrl, p);\n            TaskResponse resp = JSON.parseObject(ret, TaskResponse.class);\n            if(resp.getResult() == true){\n                log.info(\"订阅成功 订单号 = \" + tradeNo);\n                Logistics curLogistics = Logistics.dao.findById(tradeNo);\n                if(curLogistics == null){\n                    Logistics logistics = new Logistics();\n                    logistics.setCheckState(1);\n                    logistics.setTrackingNo(tradeNo);\n                    logistics.save();\n                }else {\n                    curLogistics.setCheckState(1);\n                    curLogistics.update();\n                }\n\n                return true;\n            }else{\n                log.info(\"订阅失败 订单号 = \" + tradeNo);\n                Logistics curLogistics = Logistics.dao.findById(tradeNo);\n                if(curLogistics == null){\n                    Logistics logistics = new Logistics();\n                    logistics.setCheckState(2);\n                    logistics.setTrackingNo(tradeNo);\n                    logistics.save();\n                }else {\n                    curLogistics.setCheckState(2);\n                    curLogistics.update();\n                }\n                return false;\n            }\n        } catch (Exception e) {\n            e.printStackTrace();\n            return false;\n        }\n    }\n}\n"
  },
  {
    "path": "src/main/java/io/sdb/service/impl/MailService.java",
    "content": "package io.sdb.service.impl;\n\nimport org.springframework.beans.factory.annotation.Autowired;\nimport org.springframework.beans.factory.annotation.Value;\nimport org.springframework.mail.SimpleMailMessage;\nimport org.springframework.mail.javamail.JavaMailSender;\nimport org.springframework.scheduling.annotation.Async;\nimport org.springframework.stereotype.Service;\n\n@Service\npublic class MailService {\n\n  @Autowired\n  private JavaMailSender mailSender;\n\n  @Value(\"${spring.mail.username}\")\n  private String from;\n\n  @Async\n  public void sendMail(String title, String content, String email) {\n    SimpleMailMessage message = new SimpleMailMessage();\n    message.setFrom(from);\n    message.setSubject(title);\n    message.setTo(email);\n    message.setText(content);\n    mailSender.send(message);\n  }\n}\n"
  },
  {
    "path": "src/main/java/io/sdb/service/impl/OrderDetailServiceImpl.java",
    "content": "package io.sdb.service.impl;\n\nimport io.sdb.dao.OrderDetailDao;;\nimport io.sdb.model.OrderDetail;\nimport io.sdb.service.OrderDetailService;\nimport org.springframework.stereotype.Service;\n\n@Service\npublic class OrderDetailServiceImpl extends BaseServiceImpl<OrderDetailDao, OrderDetail> implements OrderDetailService {\n}\n"
  },
  {
    "path": "src/main/java/io/sdb/service/impl/OrderMasterServiceImpl.java",
    "content": "package io.sdb.service.impl;\n\nimport cn.hutool.core.date.DateUtil;\nimport com.jfinal.kit.Kv;\nimport com.jfinal.plugin.activerecord.Db;\nimport com.jfinal.plugin.activerecord.Page;\nimport com.jfinal.plugin.activerecord.SqlPara;\nimport io.sdb.common.annotation.JFinalTx;\nimport io.sdb.common.entity.Filter;\nimport io.sdb.common.entity.Order;\nimport io.sdb.common.exception.RRException;\nimport io.sdb.common.utils.PageUtils;\nimport io.sdb.common.utils.Query;\nimport io.sdb.config.OrderProperties;\nimport io.sdb.dao.OrderMasterDao;\nimport io.sdb.dao.SnDao;\nimport io.sdb.dto.CartDTO;\nimport io.sdb.dto.OrderDTO;\nimport io.sdb.enums.*;\nimport io.sdb.model.*;\nimport io.sdb.service.LogisticsService;\nimport io.sdb.service.*;\nimport lombok.extern.slf4j.Slf4j;\nimport org.apache.commons.lang.StringUtils;\nimport org.springframework.beans.BeanUtils;\nimport org.springframework.beans.factory.annotation.Autowired;\nimport org.springframework.stereotype.Service;\n\nimport java.math.BigDecimal;\nimport java.math.BigInteger;\nimport java.util.ArrayList;\nimport java.util.Date;\nimport java.util.List;\nimport java.util.Map;\nimport java.util.stream.Collectors;\n\n@Service\n@Slf4j\npublic class OrderMasterServiceImpl extends BaseServiceImpl<OrderMasterDao, OrderMaster> implements OrderMasterService {\n\n    private final Integer GROUPON_EXPIRE_DAY = 2;\n\n    @Autowired\n    ProductService productService;\n\n    @Autowired\n    SnService snService;\n\n    @Autowired\n    PayService payService;\n\n    @Autowired\n    OrderDetailService orderDetailService;\n\n    @Autowired\n    OrderMasterService orderMasterService;\n\n    @Autowired\n    LogisticsService sysLogisticsService;\n\n    @Autowired\n    OrderProperties orderProperties;\n\n    @Autowired\n    GrouponService grouponService;\n\n    @Autowired\n    GrouponTeamService grouponTeamService;\n\n\n    @Autowired\n    GoodsService goodsService;\n\n    @Autowired\n    SnDao snDao;\n\n    @Override\n    public PageUtils queryPage(Map<String, Object> params) {\n        String searchKey = (String)params.get(\"searchKey\");\n        Query<Goods> query = new Query<Goods>(params);\n        List<Filter> filters = new ArrayList<>();\n\n        if (!StringUtils.isBlank(searchKey)) {\n            Filter filter = new Filter();\n            filter.setProperty(\"order_id\");\n            filter.setValue(searchKey);\n            filter.setOperator(Filter.Operator.like);\n            filters.add(filter);\n        }\n\n        Order order = new Order();\n        order.setProperty(\"create_date\");\n        order.setDirection(Order.Direction.desc);\n\n        Page<OrderMaster> pr = this.paginate(query.getCurrPage(), query.getLimit(), filters, order);\n\n        return new PageUtils(pr);\n    }\n\n    @Override\n    @JFinalTx\n    public OrderDTO create(OrderDTO orderDTO) {\n        String orderId = snService.generate(SnEnum.ORDER_MASTER);\n        BigDecimal orderAmount = new BigDecimal(BigInteger.ZERO);\n\n        //1. 查询商品（数量, 价格）\n        for (OrderDetail orderDetail: orderDTO.getOrderDetailList()) {\n//            Product ProductInfo =  productService.findById(orderDetail.getProductId());\n//            if (ProductInfo == null) {\n//                throw new RRException(ResultEnum.PRODUCT_NOT_EXIST);\n//            }\n\n            //2. 计算订单总价\n            if (orderDTO.getGroupon() == GeneralEnum.TRUE.getCode()) {\n                orderAmount = orderDetail.getGroupPrice()\n                        .multiply(new BigDecimal(orderDetail.getProductQuantity()))\n                        .add(orderAmount);\n            } else{\n                orderAmount = orderDetail.getProductPrice()\n                        .multiply(new BigDecimal(orderDetail.getProductQuantity()))\n                        .add(orderAmount);\n            }\n\n\n            //订单详情入库\n            String orderDetailId = snService.generate(SnEnum.ORDER_DETAIL);\n            orderDetail.setDetailId(orderDetailId);\n            orderDetail.setOrderId(orderId);\n            orderDetail.save();\n\n        }\n\n        //3. 写入订单数据库（orderMaster和orderDetail）\n        OrderMaster orderMaster = new OrderMaster();\n        orderDTO.setOrderId(orderId);\n        BeanUtils.copyProperties(orderDTO, orderMaster);\n        orderMaster.setOrderAmount(orderAmount);\n        orderMaster.setOrderStatus(OrderStatusEnum.NEW.getCode());\n        orderMaster.setPayStatus(PayStatusEnum.WAIT.getCode());\n        orderMaster.setRemark(orderDTO.getRemark());\n        orderMaster.save();\n\n        orderDTO.setOrderAmount(orderAmount);\n        orderDTO.setCreateTime(new Date());\n        orderDTO.setUpdateTime(new Date());\n        //4. 扣库存\n        List<CartDTO> cartDTOList = orderDTO.getOrderDetailList().stream().map(e ->\n                new CartDTO(e.getProductId(), e.getProductQuantity())\n        ).collect(Collectors.toList());\n        productService.decreaseStock(cartDTOList);\n\n        return orderDTO;\n    }\n\n    @Override\n    @JFinalTx\n    public OrderMaster cancel(String orderId) {\n        OrderMaster orderMaster = orderMasterService.findById(orderId);\n        if(orderMaster == null) {\n            throw new RRException(ResultEnum.ORDER_NOT_EXIST);\n        }\n        orderMaster.setOrderStatus(OrderStatusEnum.CANCEL.getCode());\n        orderMaster.setPayStatus(PayStatusEnum.REFUND.getCode());\n        OrderDetail query = new OrderDetail();\n        query.setOrderId(orderMaster.getOrderId());\n\n        List<OrderDetail> orderDetails = orderDetailService.findByModel(query);\n        List<CartDTO> cartDTOList = orderDetails.stream().map(item -> {\n            CartDTO cartDTO = new CartDTO(item.getProductId(), item.getProductQuantity());\n            return cartDTO;\n        }).collect(Collectors.toList());\n        productService.creaseStock(cartDTOList);\n\n        orderMaster.update();\n        if (orderProperties.getRefund()) {\n            payService.refund(orderId);\n        }\n\n        return orderMaster;\n    }\n\n    @Override\n    public Boolean updateByGrouponId(String grouponId,Integer status) {\n        SqlPara sqlPara = Db.getSqlPara(\"order.updateByGrouponId\", Kv.by(\"orderStatus\", status).set(\"grouponId\", grouponId));\n        return Db.update(sqlPara) > 0;\n    }\n\n    @Override\n    @JFinalTx\n    public OrderMaster paid(OrderMaster orderMaster) {\n        //判断订单状态\n        if (!orderMaster.getOrderStatus().equals(OrderStatusEnum.NEW.getCode())) {\n            log.error(\"【订单支付完成】订单状态不正确, orderId={}, orderStatus={}\", orderMaster.getOrderId(), orderMaster.getOrderStatus());\n            throw new RRException(ResultEnum.ORDER_STATUS_ERROR);\n        }\n\n        //判断支付状态\n        if (!orderMaster.getPayStatus().equals(PayStatusEnum.WAIT.getCode())) {\n            return orderMaster;\n        }\n\n        boolean grouponSucc = false;\n\n        if (orderMaster.getGroupon() == GeneralEnum.TRUE.getCode()) {\n            orderMaster.setOrderStatus(OrderStatusEnum.GROUPON_PENDING.getCode());\n\n            if (StringUtils.isBlank(orderMaster.getGrouponId())) {\n                String sn = snDao.generate(SnEnum.GROUPON);\n                Groupon groupon = new Groupon();\n                OrderDetail queryOrderDetail = new OrderDetail();\n                queryOrderDetail.setOrderId(orderMaster.getOrderId());\n                OrderDetail orderDetail = orderDetailService.findFirstByModel(queryOrderDetail);\n                String productId = orderDetail.getProductId();\n                Product product = productService.findById(productId);\n                groupon.setGoodsId(product.getGoodsSn());\n                groupon.setId(sn);\n                groupon.setCreateDate(new Date());\n                groupon.setUpdateDate(new Date());\n                groupon.setCount(orderMaster.getGrouponCount());\n                groupon.setStatus(GrouponStatusEnum.PENDING.getCode());\n                Date expireTime = DateUtil.offsetDay(new Date(), GROUPON_EXPIRE_DAY);\n                groupon.setExpireDate(expireTime);\n                grouponService.insert(groupon);\n\n                GrouponTeam grouponTeam = new GrouponTeam();\n                grouponTeam.setCaptain(GeneralEnum.TRUE.getCode());\n                grouponTeam.setGrouponId(sn);\n                grouponTeam.setCreateDate(new Date());\n                grouponTeam.setUpdateDate(new Date());\n                grouponTeam.setUserId(orderMaster.getBuyerId());\n                grouponTeamService.insert(grouponTeam);\n\n                orderMaster.setGrouponId(sn);\n            }else {\n                GrouponTeam grouponTeam = new GrouponTeam();\n                grouponTeam.setCaptain(GeneralEnum.FALSE.getCode());\n                grouponTeam.setGrouponId(orderMaster.getGrouponId());\n                grouponTeam.setUpdateDate(new Date());\n                grouponTeam.setUserId(orderMaster.getBuyerId());\n                grouponTeamService.insert(grouponTeam);\n\n                Filter filter = new Filter();\n                filter.setProperty(\"groupon_id\");\n                filter.setValue(orderMaster.getGrouponId());\n                filter.setOperator(Filter.Operator.eq);\n\n                List<GrouponTeam> grouponTeamList = grouponTeamService.findByFilter(filter);\n                if (grouponTeamList.size() >= orderMaster.getGrouponCount()) {\n                    Groupon groupon = new Groupon();\n                    groupon.setId(orderMaster.getGrouponId());\n                    groupon.setStatus(GrouponStatusEnum.OPEN.getCode());\n                    groupon.setUpdateDate(new Date());\n                    groupon.update();\n\n                    orderMaster.setOrderStatus(OrderStatusEnum.GROUPON_SUCC.getCode());\n                    grouponSucc = true;\n                }\n            }\n\n\n        }\n\n        //修改支付状态\n        orderMaster.setPayStatus(PayStatusEnum.SUCCESS.getCode());\n        orderMaster.setUpdateDate(new Date());\n        if (!orderMaster.update()) {\n            log.error(\"【订单支付完成】更新失败, orderMaster={}\", orderMaster);\n            throw new RRException(ResultEnum.ORDER_UPDATE_FAIL);\n        }\n\n        if (grouponSucc) {\n            this.updateByGrouponId(orderMaster.getGrouponId(), OrderStatusEnum.GROUPON_SUCC.getCode());\n        }\n\n        return orderMaster;\n    }\n\n    @Override\n    @JFinalTx\n    public Boolean shipping(OrderDTO orderDTO, String deliveryCode) {\n        OrderMaster orderMaster = new OrderMaster();\n        orderMaster.setOrderId(orderDTO.getOrderId());\n        orderMaster.setTrackingNumber(orderDTO.getTrackingNumber());\n        orderMaster.setDeliveryCode(orderDTO.getDeliveryCode());\n        orderMaster.setOrderStatus(OrderStatusEnum.SHIPPING.getCode());\n        orderMaster.update();\n        if(deliveryCode != null) {\n            sysLogisticsService.subscribe(orderMaster.getTrackingNumber(), deliveryCode);\n        }\n\n        return true;\n    }\n\n    @Override\n    @JFinalTx\n    public Boolean delete(String orderId) {\n        OrderMaster mpara = new OrderMaster();\n        mpara.setOrderId(orderId);\n        this.deleteByModel(mpara);\n        OrderDetail para = new OrderDetail();\n        para.setOrderId(orderId);\n        orderDetailService.deleteByModel(para);\n        return true;\n    }\n\n    @Override\n    public BigDecimal getTodayTotalSale() {\n        List<OrderMaster> orderMasterList = this.getTodayTotalOrders();\n        BigDecimal totalSale = BigDecimal.ZERO;\n        for (OrderMaster orderMaster:orderMasterList\n                ) {\n            totalSale.add(orderMaster.getOrderAmount());\n        }\n\n        return totalSale;\n    }\n\n    @Override\n    public List<OrderMaster> getTodayTotalOrders() {\n        List<Filter> filterList = new ArrayList<>();\n\n        Filter start = new Filter();\n        start.setOperator(Filter.Operator.ge);\n        start.setProperty(\"create_date\");\n        Date todayBegin = DateUtil.beginOfDay(new Date());\n        start.setValue(todayBegin);\n        filterList.add(start);\n\n        Filter end = new Filter();\n        end.setOperator(Filter.Operator.le);\n        end.setProperty(\"create_date\");\n        Date todayEnd = DateUtil.endOfDay(new Date());\n        end.setValue(todayEnd);\n        filterList.add(end);\n\n        Filter payFilter = new Filter();\n        payFilter.setOperator(Filter.Operator.eq);\n        payFilter.setProperty(\"pay_status\");\n        payFilter.setValue(PayStatusEnum.SUCCESS);\n        filterList.add(payFilter);\n\n        List<OrderMaster> orderMasterList = this.findByFilters(filterList);\n\n        return orderMasterList;\n    }\n\n    @Override\n    public List<OrderMaster> getTodayOrders() {\n        List<Filter> filterList = new ArrayList<>();\n\n        Filter start = new Filter();\n        start.setOperator(Filter.Operator.ge);\n        start.setProperty(\"create_date\");\n        Date todayBegin = DateUtil.beginOfDay(new Date());\n        start.setValue(todayBegin);\n        filterList.add(start);\n\n        Filter end = new Filter();\n        end.setOperator(Filter.Operator.le);\n        end.setProperty(\"create_date\");\n        Date todayEnd = DateUtil.endOfDay(new Date());\n        end.setValue(todayEnd);\n        filterList.add(end);\n\n        Filter orderFilter = new Filter();\n        orderFilter.setOperator(Filter.Operator.ne);\n        orderFilter.setProperty(\"order_status\");\n        orderFilter.setValue(OrderStatusEnum.CANCEL);\n        filterList.add(orderFilter);\n\n        List<OrderMaster> orderMasterList = this.findByFilters(filterList);\n\n        return orderMasterList;\n    }\n\n\n}\n"
  },
  {
    "path": "src/main/java/io/sdb/service/impl/PayServiceImpl.java",
    "content": "package io.sdb.service.impl;\n\nimport com.lly835.bestpay.enums.BestPayTypeEnum;\nimport com.lly835.bestpay.model.PayRequest;\nimport com.lly835.bestpay.model.PayResponse;\nimport com.lly835.bestpay.model.RefundRequest;\nimport com.lly835.bestpay.model.RefundResponse;\nimport com.lly835.bestpay.service.BestPayService;\nimport com.lly835.bestpay.service.impl.BestPayServiceImpl;\nimport com.lly835.bestpay.utils.JsonUtil;\nimport io.sdb.common.exception.RRException;\nimport io.sdb.config.WechatPayConfig;\nimport io.sdb.dto.OrderDTO;\nimport io.sdb.enums.ResultEnum;\nimport io.sdb.model.OrderMaster;\nimport io.sdb.service.OrderMasterService;\nimport io.sdb.service.PayService;\nimport lombok.extern.slf4j.Slf4j;\nimport org.springframework.beans.factory.annotation.Autowired;\nimport org.springframework.stereotype.Service;\n\nimport java.util.Date;\n\n@Service\n@Slf4j\npublic class PayServiceImpl implements PayService {\n\n    @Autowired\n    OrderMasterService orderService;\n\n    @Autowired\n    BestPayService bestPayService;\n\n    @Override\n    public PayResponse create(OrderDTO orderDTO) {\n\n        PayRequest payRequest = new PayRequest();\n        payRequest.setOpenid(orderDTO.getBuyerOpenid());\n        payRequest.setOrderAmount(orderDTO.getOrderAmount().doubleValue());\n        payRequest.setOrderId(orderDTO.getOrderId());\n        payRequest.setOrderName(\"sdb\");\n        payRequest.setPayTypeEnum(BestPayTypeEnum.WXPAY_H5);\n        PayResponse payResponse = bestPayService.pay(payRequest);\n        log.info(\"[微信支付] payResponse = {}\", payResponse);\n        return payResponse;\n    }\n\n    @Override\n    public OrderMaster refund(String orderId) {\n\n        OrderMaster orderMaster = orderService.findById(orderId);\n        RefundRequest refundRequest = new RefundRequest();\n        refundRequest.setOrderAmount(orderMaster.getOrderAmount().doubleValue());\n        refundRequest.setOrderId(orderMaster.getOrderId());\n        refundRequest.setPayTypeEnum(BestPayTypeEnum.WXPAY_H5);\n        RefundResponse refundResponse = bestPayService.refund(refundRequest);\n        orderMaster.setRefundTradeNo(refundResponse.getOutRefundNo());\n        orderMaster.setUpdateDate(new Date());\n        orderMaster.update();\n        return orderMaster;\n    }\n\n    @Override\n    public PayResponse notify(String notifyData) {\n        //1. 验证签名\n        //2. 支付的状态\n        //3. 支付金额\n        //4. 支付人(下单人 == 支付人)\n\n        PayResponse payResponse = bestPayService.asyncNotify(notifyData);\n\n        log.info(\"【微信支付】异步通知, payResponse={}\", JsonUtil.toJson(payResponse));\n\n        //查询订单\n        OrderMaster orderMaster = orderService.findById(payResponse.getOrderId());\n\n        //判断订单是否存在\n        if (orderMaster == null) {\n            log.error(\"【微信支付】异步通知, 订单不存在, orderId={}\", payResponse.getOrderId());\n            throw new RRException(ResultEnum.ORDER_NOT_EXIST);\n        }\n\n        //判断金额是否一致(0.10   0.1)\n        if (payResponse.getOrderAmount() != orderMaster.getOrderAmount().doubleValue()) {\n            log.error(\"【微信支付】异步通知, 订单金额不一致, orderId={}, 微信通知金额={}, 系统金额={}\",\n                    payResponse.getOrderId(),\n                    payResponse.getOrderAmount(),\n                    orderMaster.getOrderAmount());\n            throw new RRException(ResultEnum.WXPAY_NOTIFY_MONEY_VERIFY_ERROR);\n        }\n\n        orderMaster.setPayTradeNo(payResponse.getOutTradeNo());\n\n        //修改订单的支付状态\n        orderService.paid(orderMaster);\n\n        return payResponse;\n    }\n}\n"
  },
  {
    "path": "src/main/java/io/sdb/service/impl/ProductCategoryServiceImpl.java",
    "content": "package io.sdb.service.impl;\n\nimport io.sdb.common.utils.R;\nimport io.sdb.dao.ProductCategoryDao;\nimport io.sdb.model.Goods;\nimport io.sdb.model.ProductCategory;\nimport io.sdb.model.Specification;\nimport io.sdb.service.GoodsService;\nimport io.sdb.service.ProductCategoryService;\nimport io.sdb.service.SpecificationService;\nimport org.springframework.beans.factory.annotation.Autowired;\nimport org.springframework.stereotype.Service;\n\nimport java.util.List;\n\n@Service\npublic class ProductCategoryServiceImpl extends BaseServiceImpl<ProductCategoryDao, ProductCategory> implements ProductCategoryService {\n\n    @Autowired\n    private SpecificationService specificationService;\n\n    @Autowired\n    private GoodsService goodsService;\n\n    @Override\n    public List<ProductCategory> queryListOrder() {\n        return this.dao.queryListOrder();\n    }\n\n    @Override\n    public List<ProductCategory> queryListByParentId(Long parentId) {\n        ProductCategory productCategory = new ProductCategory();\n        productCategory.setParentId(parentId);\n        return this.dao.findByModel(productCategory);\n    }\n\n    @Override\n    public R delete(Long productCategoryId) {\n        //判断是否有子类目\n        List<ProductCategory> productCategoryList = queryListByParentId(productCategoryId);\n        if(productCategoryList!=null && productCategoryList.size() > 0) {\n            return R.error(\"请先删除子类目\");\n        }\n        //判断是否有规格\n        List<Specification> specificationList = specificationService.queryListByCategoryId(productCategoryId);\n        if(specificationList!=null && specificationList.size()>0){\n            return R.error(\"请先删除规格\");\n        }\n\n        //判断是否有商品\n        Goods goods = new Goods();\n        goods.setProductCategoryId(productCategoryId);\n        List<Goods> goodsList = goodsService.findByModel(goods);\n        if(goodsList!=null && goodsList.size()>0){\n            return R.error(\"请删除商品\");\n        }\n        boolean isOk = this.dao.deleteById(productCategoryId);\n        if(isOk){\n            return R.ok();\n        }else {\n            return R.error(\"删除类目失败\");\n        }\n    }\n\n    @Override\n    public R save(ProductCategory productCategory) {\n\n        if (productCategory.getParentId() == null) {\n            productCategory.setTreePath(\",\"+productCategory.getId()+\",\");\n        } else {\n            ProductCategory parent = this.findById(productCategory.getParentId());\n            productCategory.setTreePath(parent.getTreePath() + productCategory.getId() + \",\");\n        }\n\n        productCategory.save();\n        return R.ok();\n    }\n}\n"
  },
  {
    "path": "src/main/java/io/sdb/service/impl/ProductServiceImpl.java",
    "content": "package io.sdb.service.impl;\n\nimport com.jfinal.kit.Kv;\nimport com.jfinal.plugin.activerecord.Db;\nimport com.jfinal.plugin.activerecord.Record;\nimport com.jfinal.plugin.activerecord.SqlPara;\nimport io.sdb.common.annotation.JFinalTx;\nimport io.sdb.common.exception.RRException;\nimport io.sdb.dao.ProductDao;\nimport io.sdb.dto.CartDTO;\nimport io.sdb.dto.ProductDTO;\nimport io.sdb.enums.ResultEnum;\nimport io.sdb.model.Goods;\nimport io.sdb.model.Product;\nimport io.sdb.common.utils.RecordUtils;\nimport io.sdb.service.GoodsService;\nimport io.sdb.service.ProductService;\nimport org.springframework.beans.factory.annotation.Autowired;\nimport org.springframework.stereotype.Service;\n\nimport java.util.List;\n\n@Service\npublic class ProductServiceImpl extends BaseServiceImpl<ProductDao, Product> implements ProductService {\n\n    @Autowired\n    GoodsService goodsService;\n\n    @Override\n    @JFinalTx\n    public void decreaseStock(List<CartDTO> cartDTOList) {\n        //TODO 后续需要优化，处理并发\n        for (CartDTO cartDTO: cartDTOList) {\n            Product productInfo = this.findById(cartDTO.getProductId());\n            if (productInfo == null) {\n                throw new RRException(ResultEnum.PRODUCT_NOT_EXIST);\n            }\n\n            Integer result = productInfo.getStock() - cartDTO.getQuantity();\n            if (result < 0) {\n                throw new RRException(ResultEnum.PRODUCT_STOCK_ERROR);\n            }\n\n            productInfo.setStock(result);\n\n            productInfo.update();\n        }\n    }\n\n    @Override\n    public void creaseStock(List<CartDTO> cartDTOList) {\n        //TODO 后续需要优化，处理并发\n        for (CartDTO cartDTO: cartDTOList) {\n            Product productInfo = this.findById(cartDTO.getProductId());\n            if (productInfo == null) {\n                throw new RRException(ResultEnum.PRODUCT_NOT_EXIST);\n            }\n\n            Integer result = productInfo.getStock() + cartDTO.getQuantity();\n            productInfo.setStock(result);\n            productInfo.update();\n        }\n    }\n\n    @Override\n    public Goods getGoods(String productId) {\n        Product product = this.findById(productId);\n        Goods goods = goodsService.findById(product.getGoodsSn());\n        return goods;\n    }\n\n    @Override\n    public List<ProductDTO> listDetailByProductIds(String productIds) {\n        String[] productIdArr = productIds.split(\",\");\n        SqlPara sqlPara = Db.getSqlPara(\"product.listDetailByProductIds\", Kv.by(\"productIds\", productIdArr));\n        List<Record> recordList = Db.find(sqlPara);\n        List<ProductDTO> productDTOList = RecordUtils.converModel(recordList, ProductDTO.class);\n\n        return productDTOList;\n    }\n\n}\n"
  },
  {
    "path": "src/main/java/io/sdb/service/impl/ReceiverServiceImpl.java",
    "content": "package io.sdb.service.impl;\n\nimport io.sdb.dao.ReceiverDao;\nimport io.sdb.model.Receiver;\nimport io.sdb.service.ReceiverService;\nimport org.springframework.stereotype.Service;\n\nimport java.util.Date;\n\n@Service\npublic class ReceiverServiceImpl extends BaseServiceImpl<ReceiverDao, Receiver> implements ReceiverService {\n\n    @Override\n    public Receiver findDefault(String userId) {\n        Receiver qr = new Receiver();\n        qr.setMemberId(userId);\n        qr.setIsDefault(true);\n        Receiver receiver = this.findFirstByModel(qr);\n        return receiver;\n    }\n}\n"
  },
  {
    "path": "src/main/java/io/sdb/service/impl/ScheduleJobLogServiceImpl.java",
    "content": "/**\n * Copyright 2018\n * <p>\n * Licensed under the Apache License, Version 2.0 (the \"License\"); you may not\n * use this file except in compliance with the License. You may obtain a copy of\n * the License at\n * <p>\n * http://www.apache.org/licenses/LICENSE-2.0\n * <p>\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS, WITHOUT\n * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the\n * License for the specific language governing permissions and limitations under\n * the License.\n */\n\npackage io.sdb.service.impl;\n\nimport com.jfinal.plugin.activerecord.Page;\nimport io.sdb.common.utils.PageUtils;\nimport io.sdb.common.utils.Query;\nimport io.sdb.common.entity.Filter;\nimport io.sdb.dao.ScheduleJobLogDao;\nimport io.sdb.model.ScheduleJobLog;\nimport io.sdb.service.ScheduleJobLogService;\nimport org.apache.commons.lang.StringUtils;\nimport org.springframework.stereotype.Service;\n\nimport java.util.ArrayList;\nimport java.util.List;\nimport java.util.Map;\n\n@Service(\"scheduleJobLogService\")\npublic class ScheduleJobLogServiceImpl extends BaseServiceImpl<ScheduleJobLogDao, ScheduleJobLog> implements ScheduleJobLogService {\n\n\t@Override\n\tpublic PageUtils queryPage(Map<String, Object> params) {\n\t\tString jobId = (String)params.get(\"jobId\");\n\n\t\tList<Filter> filters = new ArrayList<>();\n\t\tif (!StringUtils.isBlank(jobId)) {\n\t\t\tFilter filter = new Filter();\n\t\t\tfilter.setProperty(\"job_id\");\n\t\t\tfilter.setValue(jobId);\n\t\t\tfilter.setOperator(Filter.Operator.like);\n\t\t\tfilters.add(filter);\n\t\t}\n\n\t\tQuery<ScheduleJobLog> query = new Query<ScheduleJobLog>(params);\n\t\tPage<ScheduleJobLog> pr = this.paginate(query.getCurrPage(), query.getLimit(), filters, query.getOrder());\n\n\t\treturn new PageUtils(pr);\n\t}\n\n}\n"
  },
  {
    "path": "src/main/java/io/sdb/service/impl/ScheduleJobServiceImpl.java",
    "content": "/**\n * Copyright 2018\n * <p>\n * Licensed under the Apache License, Version 2.0 (the \"License\"); you may not\n * use this file except in compliance with the License. You may obtain a copy of\n * the License at\n * <p>\n * http://www.apache.org/licenses/LICENSE-2.0\n * <p>\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS, WITHOUT\n * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the\n * License for the specific language governing permissions and limitations under\n * the License.\n */\n\npackage io.sdb.service.impl;\n\nimport com.jfinal.plugin.activerecord.ActiveRecordPlugin;\nimport com.jfinal.plugin.activerecord.Db;\nimport com.jfinal.plugin.activerecord.Page;\nimport io.sdb.common.annotation.JFinalTx;\nimport io.sdb.common.utils.Constant;\nimport io.sdb.common.utils.PageUtils;\nimport io.sdb.common.utils.Query;\nimport io.sdb.common.entity.Filter;\nimport io.sdb.dao.ScheduleJobDao;\nimport io.sdb.model.ScheduleJob;\nimport io.sdb.service.ScheduleJobService;\nimport io.sdb.job.utils.ScheduleUtils;\nimport org.apache.commons.lang.StringUtils;\nimport org.quartz.CronTrigger;\nimport org.quartz.Scheduler;\nimport org.springframework.beans.factory.annotation.Autowired;\nimport org.springframework.stereotype.Service;\n\nimport javax.annotation.PostConstruct;\nimport java.util.*;\n\n@Service(\"scheduleJobService\")\npublic class ScheduleJobServiceImpl extends BaseServiceImpl<ScheduleJobDao, ScheduleJob> implements ScheduleJobService {\n\t@Autowired\n    private Scheduler scheduler;\n\n    @Autowired\n    ActiveRecordPlugin activeRecordPlugin;\n\n\t/**\n\t * 项目启动时，初始化定时器\n\t */\n\t@PostConstruct\n\tpublic void init(){\n\t\tList<ScheduleJob> scheduleJobList = this.findAll();\n\t\tfor(ScheduleJob scheduleJob : scheduleJobList){\n\t\t\tCronTrigger cronTrigger = ScheduleUtils.getCronTrigger(scheduler, scheduleJob.getJobId());\n            //如果不存在，则创建\n            if(cronTrigger == null) {\n                ScheduleUtils.createScheduleJob(scheduler, scheduleJob);\n            }else {\n                ScheduleUtils.updateScheduleJob(scheduler, scheduleJob);\n            }\n\t\t}\n\t}\n\n\t@Override\n\tpublic PageUtils queryPage(Map<String, Object> params) {\n\t\tString beanName = (String)params.get(\"beanName\");\n\n        List<Filter> filters = new ArrayList<>();\n        if(!StringUtils.isBlank(beanName)) {\n            Filter filter = new Filter();\n            filter.setProperty(\"bean_name\");\n            filter.setOperator(Filter.Operator.like);\n            filter.setValue(beanName);\n            filters.add(filter);\n        }\n\n        Query<ScheduleJob> query = new Query<ScheduleJob>(params);\n        Page<ScheduleJob> pr = this.paginate(query.getCurrPage(), query.getLimit(), filters, query.getOrder());\n\n\t\treturn new PageUtils(pr);\n\t}\n\n\n\t@Override\n\t@JFinalTx\n\tpublic void save(ScheduleJob scheduleJob) {\n\t\tscheduleJob.setCreateTime(new Date());\n\t\tscheduleJob.setStatus(Constant.ScheduleStatus.NORMAL.getValue());\n\t\tscheduleJob.save();\n        \n        ScheduleUtils.createScheduleJob(scheduler, scheduleJob);\n    }\n\t\n\t@Override\n\t@JFinalTx\n\tpublic boolean update(ScheduleJob scheduleJob) {\n        ScheduleUtils.updateScheduleJob(scheduler, scheduleJob);\n        return scheduleJob.update();\n    }\n\n\t@Override\n\t@JFinalTx\n    public void deleteBatch(Long[] jobIds) {\n    \tfor(Long jobId : jobIds){\n    \t\tScheduleUtils.deleteScheduleJob(scheduler, jobId);\n    \t}\n    \t\n    \t//删除数据\n        this.dao.deleteBatch(jobIds);\n\t}\n\n\t@Override\n    public int updateBatch(Long[] jobIds, int status){\n    \tMap<String, Object> map = new HashMap<>();\n    \tmap.put(\"list\", jobIds);\n    \tmap.put(\"status\", status);\n        List<ScheduleJob> scheduleJobList = new ArrayList<>();\n        for (Long jobId : jobIds) {\n            ScheduleJob scheduleJob = new ScheduleJob();\n            scheduleJob.setJobId(jobId);\n            scheduleJob.setStatus(status);\n            scheduleJobList.add(scheduleJob);\n        }\n\n        Db.batchUpdate(scheduleJobList, scheduleJobList.size());\n    \treturn 1;\n    }\n    \n\t@Override\n\t@JFinalTx\n    public void run(Long[] jobIds) {\n    \tfor(Long jobId : jobIds){\n    \t\tScheduleUtils.run(scheduler, this.findById(jobId));\n    \t}\n    }\n\n\t@Override\n\t@JFinalTx\n    public void pause(Long[] jobIds) {\n        for(Long jobId : jobIds){\n    \t\tScheduleUtils.pauseJob(scheduler, jobId);\n    \t}\n        \n    \tupdateBatch(jobIds, Constant.ScheduleStatus.PAUSE.getValue());\n    }\n\n\t@Override\n\t@JFinalTx\n    public void resume(Long[] jobIds) {\n    \tfor(Long jobId : jobIds){\n    \t\tScheduleUtils.resumeJob(scheduler, jobId);\n    \t}\n\n    \tupdateBatch(jobIds, Constant.ScheduleStatus.NORMAL.getValue());\n    }\n    \n}\n"
  },
  {
    "path": "src/main/java/io/sdb/service/impl/ShiroServiceImpl.java",
    "content": "package io.sdb.service.impl;\n\nimport io.sdb.common.utils.Constant;\nimport io.sdb.model.SysMenu;\nimport io.sdb.model.SysUser;\nimport io.sdb.model.SysUserToken;\nimport io.sdb.service.ShiroService;\nimport io.sdb.service.SysMenuService;\nimport io.sdb.service.SysUserService;\nimport io.sdb.service.SysUserTokenService;\nimport org.apache.commons.lang.StringUtils;\nimport org.springframework.beans.factory.annotation.Autowired;\nimport org.springframework.stereotype.Service;\n\nimport java.util.*;\n\n@Service\npublic class ShiroServiceImpl implements ShiroService {\n\n    @Autowired\n    private SysMenuService sysMenuService;\n    @Autowired\n    private SysUserService sysUserService;\n    @Autowired\n    private SysUserTokenService sysUserTokenService;\n\n    @Override\n    public Set<String> getUserPermissions(long userId) {\n        List<String> permsList;\n\n        //系统管理员，拥有最高权限\n        if(userId == Constant.SUPER_ADMIN){\n            List<SysMenu> menuList = sysMenuService.findAll();\n            permsList = new ArrayList<>(menuList.size());\n            for(SysMenu menu : menuList){\n                permsList.add(menu.getPerms());\n            }\n        }else{\n            permsList = sysUserService.queryAllPerms(userId);\n        }\n        //用户权限列表\n        Set<String> permsSet = new HashSet<>();\n        for(String perms : permsList){\n            if(StringUtils.isBlank(perms)){\n                continue;\n            }\n            permsSet.addAll(Arrays.asList(perms.trim().split(\",\")));\n        }\n        return permsSet;\n    }\n\n    @Override\n    public SysUserToken queryByToken(String token) {\n        SysUserToken sysUserToken = new SysUserToken();\n        sysUserToken.setToken(token);\n        return sysUserTokenService.findFirstByModel(sysUserToken);\n    }\n\n    @Override\n    public SysUser queryUser(Long userId) {\n        return sysUserService.findById(userId);\n    }\n}\n"
  },
  {
    "path": "src/main/java/io/sdb/service/impl/SnServiceImpl.java",
    "content": "package io.sdb.service.impl;\n\nimport io.sdb.dao.SnDao;\nimport io.sdb.enums.SnEnum;\nimport io.sdb.model.Sn;\nimport io.sdb.service.SnService;\nimport org.springframework.stereotype.Service;\n\n\n@Service\npublic class SnServiceImpl extends BaseServiceImpl<SnDao, Sn> implements SnService {\n\n    @Override\n    public String generate(SnEnum type) {\n        return this.dao.generate(type);\n    }\n}\n"
  },
  {
    "path": "src/main/java/io/sdb/service/impl/SpecificationServiceImpl.java",
    "content": "package io.sdb.service.impl;\n\nimport io.sdb.common.entity.Filter;\nimport io.sdb.common.utils.R;\nimport io.sdb.dao.SpecificationDao;\nimport io.sdb.model.Specification;\nimport io.sdb.service.SpecificationService;\nimport org.springframework.stereotype.Service;\n\nimport java.util.List;\n\n@Service\npublic class SpecificationServiceImpl extends BaseServiceImpl<SpecificationDao, Specification> implements SpecificationService {\n\n    @Override\n    public List<Specification> queryListByCategoryId(Long categoryId) {\n        Specification specification = new Specification();\n        specification.setCategoryId(categoryId);\n        return this.dao.findByModel(specification);\n    }\n\n    @Override\n    public List<Specification> queryListByOrder() {\n        return this.findByFilter(Filter.isNull(\"parent_id\"));\n    }\n\n    @Override\n    public R delete(Long id) {\n         Filter filter = new Filter();\n         filter.setProperty(\"parent_id\");\n         filter.setOperator(Filter.Operator.eq);\n         filter.setValue(id);\n         List<Specification> specificationList = this.dao.findByFilter(filter);\n         if(specificationList!=null && specificationList.size()>0){\n             return R.error(\"请先删除下级规格\");\n         }\n         boolean bool = this.dao.deleteById(id);\n         if(bool){\n             return R.ok();\n         }\n         return R.error();\n    }\n\n    @Override\n    public R save(Specification specification) {\n        boolean bool =  specification.save();\n        if(bool){\n            return R.ok();\n        }\n        return R.error();\n    }\n}\n"
  },
  {
    "path": "src/main/java/io/sdb/service/impl/SysCaptchaServiceImpl.java",
    "content": "/**\n * Copyright 2018\n * <p>\n * Licensed under the Apache License, Version 2.0 (the \"License\"); you may not\n * use this file except in compliance with the License. You may obtain a copy of\n * the License at\n * <p>\n * http://www.apache.org/licenses/LICENSE-2.0\n * <p>\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS, WITHOUT\n * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the\n * License for the specific language governing permissions and limitations under\n * the License.\n */\n\npackage io.sdb.service.impl;\n\nimport com.google.code.kaptcha.Producer;\nimport io.sdb.common.exception.RRException;\nimport io.sdb.common.utils.DateUtils;\nimport io.sdb.dao.SysCaptchaDao;\nimport io.sdb.model.SysCaptcha;\nimport io.sdb.service.SysCaptchaService;\nimport org.apache.commons.lang.StringUtils;\nimport org.springframework.beans.factory.annotation.Autowired;\nimport org.springframework.stereotype.Service;\n\nimport java.awt.image.BufferedImage;\nimport java.util.Date;\n\n/**\n * 验证码\n *\n * @author Mark sunlightcs@gmail.com\n * @since 2.0.0 2018-02-10\n */\n@Service(\"sysCaptchaService\")\npublic class SysCaptchaServiceImpl extends BaseServiceImpl<SysCaptchaDao, SysCaptcha> implements SysCaptchaService {\n    @Autowired\n    private Producer producer;\n\n    @Override\n    public BufferedImage getCaptcha(String uuid) {\n        if(StringUtils.isBlank(uuid)){\n            throw new RRException(\"uuid不能为空\");\n        }\n        //生成文字验证码\n        String code = producer.createText();\n\n        SysCaptcha captcha = new SysCaptcha();\n        captcha.setUuid(uuid);\n        captcha.setCode(code);\n        //5分钟后过期\n        captcha.setExpireTime(DateUtils.addDateMinutes(new Date(), 5));\n        captcha.save();\n\n        return producer.createImage(code);\n    }\n\n    @Override\n    public boolean validate(String uuid, String code) {\n        SysCaptcha qSysCaptcha = new SysCaptcha();\n        qSysCaptcha.setUuid(uuid);\n\n\n        SysCaptcha captcha = this.dao.findFirstByModel(qSysCaptcha);\n        if(captcha == null){\n            return false;\n        }\n\n        //删除验证码\n        captcha.delete();\n\n        if(captcha.getCode().equalsIgnoreCase(code) && captcha.getExpireTime().getTime() >= System.currentTimeMillis()){\n            return true;\n        }\n\n        return false;\n    }\n}\n"
  },
  {
    "path": "src/main/java/io/sdb/service/impl/SysConfigServiceImpl.java",
    "content": "/**\n * Copyright 2018\n * <p>\n * Licensed under the Apache License, Version 2.0 (the \"License\"); you may not\n * use this file except in compliance with the License. You may obtain a copy of\n * the License at\n * <p>\n * http://www.apache.org/licenses/LICENSE-2.0\n * <p>\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS, WITHOUT\n * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the\n * License for the specific language governing permissions and limitations under\n * the License.\n */\n\npackage io.sdb.service.impl;\n\nimport com.google.gson.Gson;\nimport com.jfinal.kit.Kv;\nimport com.jfinal.plugin.activerecord.Db;\nimport com.jfinal.plugin.activerecord.Page;\nimport com.jfinal.plugin.activerecord.SqlPara;\nimport io.sdb.common.annotation.JFinalTx;\nimport io.sdb.common.exception.RRException;\nimport io.sdb.common.utils.PageUtils;\nimport io.sdb.common.utils.Query;\nimport io.sdb.common.entity.Filter;\nimport io.sdb.dao.SysConfigDao;\nimport io.sdb.model.SysConfig;\nimport io.sdb.sys.redis.SysConfigRedis;\nimport io.sdb.service.SysConfigService;\nimport org.apache.commons.lang.StringUtils;\nimport org.springframework.beans.factory.annotation.Autowired;\nimport org.springframework.stereotype.Service;\n\nimport java.util.ArrayList;\nimport java.util.List;\nimport java.util.Map;\n\n@Service(\"sysConfigService\")\npublic class SysConfigServiceImpl extends BaseServiceImpl<SysConfigDao, SysConfig> implements SysConfigService {\n\n\t@Autowired\n\tprivate SysConfigRedis sysConfigRedis;\n\n\t@Override\n\tpublic PageUtils queryPage(Map<String, Object> params) {\n\t\tString paramKey = (String)params.get(\"paramKey\");\n\n\t\tList<Filter> filters = new ArrayList<>();\n\t\tif(!StringUtils.isBlank(paramKey)) {\n\t\t\tFilter filter = new Filter();\n\t\t\tfilter.setProperty(\"param_key\");\n\t\t\tfilter.setOperator(Filter.Operator.like);\n\t\t\tfilter.setValue(paramKey);\n\t\t\tfilters.add(filter);\n\t\t}\n\n\t\tFilter filter = new Filter();\n\t\tfilter.setProperty(\"status\");\n\t\tfilter.setOperator(Filter.Operator.eq);\n\t\tfilter.setValue(1);\n\t\tfilters.add(filter);\n\n\t\tQuery<SysConfig> query = new Query<SysConfig>(params);\n\t\tPage<SysConfig> pr = this.paginate(query.getCurrPage(), query.getLimit(), filters, query.getOrder());\n\n\t\treturn new PageUtils(pr);\n\t}\n\t\n\t@Override\n\t@JFinalTx\n\tpublic void save(SysConfig config) {\n\t\tconfig.save();\n\t\tsysConfigRedis.saveOrUpdate(config);\n\t}\n\n\t@Override\n\t@JFinalTx\n\tpublic boolean update(SysConfig config) {\n\t\tboolean updateSucc = config.update();\n\t\tsysConfigRedis.saveOrUpdate(config);\n\t\treturn updateSucc;\n\t}\n\n\t@Override\n\t@JFinalTx\n\tpublic void updateValueByKey(String key, String value) {\n\t\tSqlPara sqlPara = Db.getSqlPara(\"sysConfig.updateValueByKey\", Kv.by(\"paramValue\", value).set(\"paramKey\", key));\n\t\tDb.update(sqlPara);\n\t\tsysConfigRedis.delete(key);\n\t}\n\n\t@Override\n\t@JFinalTx\n\tpublic void deleteBatch(Long[] ids) {\n\t\tfor(Long id : ids){\n\t\t\tSysConfig config = this.findById(id);\n\t\t\tsysConfigRedis.delete(config.getParamKey());\n\t\t}\n\n\t\tthis.dao.deleteBatch(ids);\n\t}\n\n\t@Override\n\tpublic String getValue(String key) {\n\t\tSysConfig config = sysConfigRedis.get(key);\n\t\tif(config == null){\n\t\t\tconfig = new SysConfig();\n\t\t\tconfig.setParamKey(key);\n\t\t\tconfig = this.findFirstByModel(config);\n\t\t\tsysConfigRedis.saveOrUpdate(config);\n\t\t}\n\n\t\treturn config == null ? null : config.getParamValue();\n\t}\n\t\n\t@Override\n\tpublic <T> T getConfigObject(String key, Class<T> clazz) {\n\t\tString value = getValue(key);\n\t\tif(StringUtils.isNotBlank(value)){\n\t\t\treturn new Gson().fromJson(value, clazz);\n\t\t}\n\n\t\ttry {\n\t\t\treturn clazz.newInstance();\n\t\t} catch (Exception e) {\n\t\t\tthrow new RRException(\"获取参数失败\");\n\t\t}\n\t}\n}\n"
  },
  {
    "path": "src/main/java/io/sdb/service/impl/SysLogServiceImpl.java",
    "content": "/**\n * Copyright 2018\n * <p>\n * Licensed under the Apache License, Version 2.0 (the \"License\"); you may not\n * use this file except in compliance with the License. You may obtain a copy of\n * the License at\n * <p>\n * http://www.apache.org/licenses/LICENSE-2.0\n * <p>\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS, WITHOUT\n * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the\n * License for the specific language governing permissions and limitations under\n * the License.\n */\n\npackage io.sdb.service.impl;\n\nimport com.jfinal.plugin.activerecord.Page;\nimport io.sdb.common.utils.PageUtils;\nimport io.sdb.common.utils.Query;\nimport io.sdb.common.entity.Filter;\nimport io.sdb.common.entity.Order;\nimport io.sdb.dao.SysLogDao;\nimport io.sdb.model.SysLog;\nimport io.sdb.service.SysLogService;\nimport org.apache.commons.lang.StringUtils;\nimport org.springframework.stereotype.Service;\n\nimport java.util.ArrayList;\nimport java.util.List;\nimport java.util.Map;\n\n\n@Service(\"sysLogService\")\npublic class SysLogServiceImpl extends BaseServiceImpl<SysLogDao, SysLog> implements SysLogService {\n\n    @Override\n    public PageUtils queryPage(Map<String, Object> params) {\n        String key = (String)params.get(\"key\");\n\n        List<Filter> filters = new ArrayList<>();\n        if (!StringUtils.isBlank(key)) {\n            Filter filter = new Filter();\n            filter.setProperty(\"username\");\n            filter.setValue(key);\n            filter.setOperator(Filter.Operator.like);\n            filters.add(filter);\n        }\n\n        Order order = new Order();\n        order.setProperty(\"create_date\");\n        order.setDirection(Order.Direction.desc);\n\n        Query<SysLog> query = new Query<SysLog>(params);\n        Page<SysLog> pr = this.paginate(query.getCurrPage(), query.getLimit(), filters, order);\n\n        return new PageUtils(pr);\n    }\n}\n"
  },
  {
    "path": "src/main/java/io/sdb/service/impl/SysMenuServiceImpl.java",
    "content": "/**\n * Copyright 2018\n * <p>\n * Licensed under the Apache License, Version 2.0 (the \"License\"); you may not\n * use this file except in compliance with the License. You may obtain a copy of\n * the License at\n * <p>\n * http://www.apache.org/licenses/LICENSE-2.0\n * <p>\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS, WITHOUT\n * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the\n * License for the specific language governing permissions and limitations under\n * the License.\n */\n\npackage io.sdb.service.impl;\n\nimport io.sdb.common.annotation.JFinalTx;\nimport io.sdb.common.utils.Constant;\nimport io.sdb.dao.SysMenuDao;\nimport io.sdb.model.SysMenu;\nimport io.sdb.model.SysRoleMenu;\nimport io.sdb.service.SysMenuService;\nimport io.sdb.service.SysRoleMenuService;\nimport io.sdb.service.SysUserService;\nimport org.springframework.beans.factory.annotation.Autowired;\nimport org.springframework.stereotype.Service;\n\nimport java.util.ArrayList;\nimport java.util.List;\n\n\n@Service(\"sysMenuService\")\npublic class SysMenuServiceImpl extends BaseServiceImpl<SysMenuDao, SysMenu> implements SysMenuService {\n\n\t@Autowired\n\tprivate SysUserService sysUserService;\n\t@Autowired\n\tprivate SysRoleMenuService sysRoleMenuService;\n\t\n\t@Override\n\tpublic List<SysMenu> queryListParentId(Long parentId, List<Long> menuIdList) {\n\t\tList<SysMenu> menuList = queryListParentId(parentId);\n\t\tif(menuIdList == null){\n\t\t\treturn menuList;\n\t\t}\n\t\t\n\t\tList<SysMenu> userMenuList = new ArrayList<>();\n\t\tfor(SysMenu menu : menuList){\n\t\t\tif(menuIdList.contains(menu.getMenuId())){\n\t\t\t\tuserMenuList.add(menu);\n\t\t\t}\n\t\t}\n\t\treturn userMenuList;\n\t}\n\n\t@Override\n\tpublic List<SysMenu> queryListParentId(Long parentId) {\n\t\tSysMenu sysMenu = new SysMenu();\n\t\tsysMenu.setParentId(parentId);\n\t\treturn this.dao.findByModel(sysMenu);\n\t}\n\n\t@Override\n\tpublic List<SysMenu> queryNotButtonList() {\n\t\treturn this.dao.queryNotButtonList();\n\t}\n\n\t@Override\n\tpublic List<SysMenu> getUserMenuList(Long userId) {\n\t\t//系统管理员，拥有最高权限\n\t\tif(userId == Constant.SUPER_ADMIN){\n\t\t\treturn getAllMenuList(null);\n\t\t}\n\t\t\n\t\t//用户菜单列表\n\t\tList<Long> menuIdList = sysUserService.queryAllMenuId(userId);\n\t\treturn getAllMenuList(menuIdList);\n\t}\n\n\t@Override\n\t@JFinalTx\n\tpublic void delete(Long menuId){\n\t\t//删除菜单\n\t\tthis.dao.deleteById(menuId);\n\t\t//删除菜单与角色关联\n\t\tSysRoleMenu sysRoleMenu = new SysRoleMenu();\n\t\tsysRoleMenu.setMenuId(menuId);\n\t\tsysRoleMenuService.deleteByModel(sysRoleMenu);\n\t}\n\n\t/**\n\t * 获取所有菜单列表\n\t */\n\tprivate List<SysMenu> getAllMenuList(List<Long> menuIdList){\n\t\t//查询根菜单列表\n\t\tList<SysMenu> menuList = queryListParentId(0L, menuIdList);\n\t\t//递归获取子菜单\n\t\tgetMenuTreeList(menuList, menuIdList);\n\t\t\n\t\treturn menuList;\n\t}\n\n\t/**\n\t * 递归\n\t */\n\tprivate List<SysMenu> getMenuTreeList(List<SysMenu> menuList, List<Long> menuIdList){\n\t\tList<SysMenu> subMenuList = new ArrayList<SysMenu>();\n\t\t\n\t\tfor(SysMenu entity : menuList){\n\t\t\t//目录\n\t\t\tif(entity.getType() == Constant.MenuType.CATALOG.getValue()){\n\t\t\t\tentity.setList(getMenuTreeList(queryListParentId(entity.getMenuId(), menuIdList), menuIdList));\n\t\t\t}\n\t\t\tsubMenuList.add(entity);\n\t\t}\n\t\t\n\t\treturn subMenuList;\n\t}\n}\n"
  },
  {
    "path": "src/main/java/io/sdb/service/impl/SysOssServiceImpl.java",
    "content": "/**\n * Copyright 2018\n * <p>\n * Licensed under the Apache License, Version 2.0 (the \"License\"); you may not\n * use this file except in compliance with the License. You may obtain a copy of\n * the License at\n * <p>\n * http://www.apache.org/licenses/LICENSE-2.0\n * <p>\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS, WITHOUT\n * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the\n * License for the specific language governing permissions and limitations under\n * the License.\n */\n\npackage io.sdb.service.impl;\n\nimport com.jfinal.plugin.activerecord.Page;\nimport io.sdb.common.utils.PageUtils;\nimport io.sdb.common.utils.Query;\nimport io.sdb.dao.SysOssDao;\nimport io.sdb.model.SysOss;\nimport io.sdb.service.SysOssService;\nimport org.springframework.stereotype.Service;\n\nimport java.util.Map;\n\n\n@Service(\"sysOssService\")\npublic class SysOssServiceImpl extends BaseServiceImpl<SysOssDao, SysOss> implements SysOssService {\n\n\t@Override\n\tpublic PageUtils queryPage(Map<String, Object> params) {\n\n\t\tQuery<SysOss> query = new Query<SysOss>(params);\n\t\tPage<SysOss> pr = this.paginate(query.getCurrPage(), query.getLimit());\n\n\t\treturn new PageUtils(pr);\n\t}\n\t\n}\n"
  },
  {
    "path": "src/main/java/io/sdb/service/impl/SysRoleMenuServiceImpl.java",
    "content": "package io.sdb.service.impl;\n\nimport com.jfinal.plugin.activerecord.Db;\nimport io.sdb.common.annotation.JFinalTx;\nimport io.sdb.dao.SysRoleMenuDao;\nimport io.sdb.model.SysRoleMenu;\nimport io.sdb.service.SysRoleMenuService;\nimport org.springframework.stereotype.Service;\n\nimport java.util.ArrayList;\nimport java.util.List;\nimport java.util.stream.Collectors;\n\n\n/**\n * 角色与菜单对应关系\n * \n * @author chenshun\n * @email sunlightcs@gmail.com\n * @date 2016年9月18日 上午9:44:35\n */\n@Service(\"sysRoleMenuService\")\npublic class SysRoleMenuServiceImpl extends BaseServiceImpl<SysRoleMenuDao, SysRoleMenu> implements SysRoleMenuService {\n\n\t@Override\n\t@JFinalTx\n\tpublic void saveOrUpdate(Long roleId, List<Long> menuIdList) {\n\t\t//先删除角色与菜单关系\n\t\tdeleteBatch(new Long[]{roleId});\n\n\t\tif(menuIdList.size() == 0){\n\t\t\treturn ;\n\t\t}\n\n\t\t//保存角色与菜单关系\n\t\tList<SysRoleMenu> list = new ArrayList<>(menuIdList.size());\n\t\tfor(Long menuId : menuIdList){\n\t\t\tSysRoleMenu sysRoleMenu = new SysRoleMenu();\n\t\t\tsysRoleMenu.setMenuId(menuId);\n\t\t\tsysRoleMenu.setRoleId(roleId);\n\n\t\t\tlist.add(sysRoleMenu);\n\t\t}\n\n\t\tDb.batchSave(list, list.size());\n\t}\n\n\t@Override\n\tpublic List<Long> queryMenuIdList(Long roleId) {\n\t\tSysRoleMenu sysRoleMenu = new SysRoleMenu();\n\t\tsysRoleMenu.setRoleId(roleId);\n\t\tList<SysRoleMenu> sysRoleMenuList = this.dao.findByModel(sysRoleMenu);\n\t\tList<Long> menuIdList = sysRoleMenuList.stream().map(item -> {\n\t\t\treturn item.getMenuId();\n\t\t}).collect(Collectors.toList());\n\t\treturn menuIdList;\n\t}\n\n\t@Override\n\tpublic boolean deleteBatch(Long[] roleIds){\n\t\treturn this.dao.deleteBatch(new String[]{\"role_id\"}, roleIds);\n\t}\n\n}\n"
  },
  {
    "path": "src/main/java/io/sdb/service/impl/SysRoleServiceImpl.java",
    "content": "package io.sdb.service.impl;\n\nimport com.jfinal.plugin.activerecord.Page;\nimport io.sdb.common.annotation.JFinalTx;\nimport io.sdb.common.exception.RRException;\nimport io.sdb.common.utils.Constant;\nimport io.sdb.common.utils.PageUtils;\nimport io.sdb.common.utils.Query;\nimport io.sdb.common.entity.Filter;\nimport io.sdb.dao.SysRoleDao;\nimport io.sdb.model.SysRole;\nimport io.sdb.service.SysRoleMenuService;\nimport io.sdb.service.SysRoleService;\nimport io.sdb.service.SysUserRoleService;\nimport io.sdb.service.SysUserService;\nimport org.apache.commons.lang.StringUtils;\nimport org.springframework.beans.factory.annotation.Autowired;\nimport org.springframework.stereotype.Service;\n\nimport java.util.ArrayList;\nimport java.util.Date;\nimport java.util.List;\nimport java.util.Map;\nimport java.util.stream.Collectors;\n\n/**\n * 角色\n * \n * @author chenshun\n * @email sunlightcs@gmail.com\n * @date 2016年9月18日 上午9:45:12\n */\n@Service(\"sysRoleService\")\npublic class SysRoleServiceImpl extends BaseServiceImpl<SysRoleDao, SysRole> implements SysRoleService {\n\n\t@Autowired\n\tprivate SysRoleMenuService sysRoleMenuService;\n\t@Autowired\n\tprivate SysUserService sysUserService;\n    @Autowired\n    private SysUserRoleService sysUserRoleService;\n\n\t@Override\n\tpublic PageUtils queryPage(Map<String, Object> params) {\n\t\tString roleName = (String)params.get(\"roleName\");\n\t\tLong createUserId = (Long)params.get(\"createUserId\");\n\n\t\tList<Filter> filters = new ArrayList<>();\n\n\t\tif(createUserId != null) {\n\t\t\tFilter filter = new Filter();\n\t\t\tfilter.setProperty(\"create_user_id\");\n\t\t\tfilter.setValue(createUserId);\n\t\t\tfilter.setOperator(Filter.Operator.eq);\n\t\t\tfilters.add(filter);\n\t\t}\n\n\t\tif (!StringUtils.isBlank(roleName)) {\n\t\t\tFilter filter = new Filter();\n\t\t\tfilter.setProperty(\"role_name\");\n\t\t\tfilter.setValue(roleName);\n\t\t\tfilter.setOperator(Filter.Operator.like);\n\t\t\tfilters.add(filter);\n\t\t}\n\n\t\tQuery<SysRole> query = new Query<SysRole>(params);\n\t\tPage<SysRole> pr = this.paginate(query.getCurrPage(), query.getLimit(), filters, query.getOrder());\n\n\t\treturn new PageUtils(pr);\n\t}\n\n    @Override\n\t@JFinalTx\n    public void save(SysRole role) {\n        role.setCreateTime(new Date());\n\t\trole.save();\n\n        //检查权限是否越权\n        checkPrems(role);\n\n        //保存角色与菜单关系\n        sysRoleMenuService.saveOrUpdate(role.getRoleId(), role.getMenuIdList());\n    }\n\n    @Override\n\t@JFinalTx\n    public boolean update(SysRole role) {\n\t\tboolean updateSucc = role.update();\n        //检查权限是否越权\n        checkPrems(role);\n\n        //更新角色与菜单关系\n        sysRoleMenuService.saveOrUpdate(role.getRoleId(), role.getMenuIdList());\n\t\treturn updateSucc;\n    }\n\n    @Override\n    @JFinalTx\n    public void deleteBatch(Long[] roleIds) {\n        //删除角色\n\t\tthis.dao.deleteBatch(roleIds);\n\n        //删除角色与菜单关联\n        sysRoleMenuService.deleteBatch(roleIds);\n\n        //删除角色与用户关联\n        sysUserRoleService.deleteBatch(roleIds);\n    }\n\n\t@Override\n\tpublic List<Long> queryRoleIdList(Long createUserId) {\n\t\tSysRole sysRole = new SysRole();\n\t\tsysRole.setCreateUserId(createUserId);\n\t\tList<SysRole> sysRoleList = this.dao.findByModel(sysRole);\n\t\tList<Long> roleIdList = sysRoleList.stream().map(item->{ return item.getRoleId();}).collect(Collectors.toList());\n\t\treturn roleIdList;\n\t}\n\n\t/**\n\t * 检查权限是否越权\n\t */\n\tprivate void checkPrems(SysRole role){\n\t\t//如果不是超级管理员，则需要判断角色的权限是否超过自己的权限\n\t\tif(role.getCreateUserId() == Constant.SUPER_ADMIN){\n\t\t\treturn ;\n\t\t}\n\t\t\n\t\t//查询用户所拥有的菜单列表\n\t\tList<Long> menuIdList = sysUserService.queryAllMenuId(role.getCreateUserId());\n\t\t\n\t\t//判断是否越权\n\t\tif(!menuIdList.containsAll(role.getMenuIdList())){\n\t\t\tthrow new RRException(\"新增角色的权限，已超出你的权限范围\");\n\t\t}\n\t}\n}\n"
  },
  {
    "path": "src/main/java/io/sdb/service/impl/SysUserRoleServiceImpl.java",
    "content": "package io.sdb.service.impl;\n\nimport com.jfinal.plugin.activerecord.Db;\nimport io.sdb.common.annotation.JFinalTx;\nimport io.sdb.dao.SysUserRoleDao;\nimport io.sdb.model.SysUserRole;\nimport io.sdb.service.SysUserRoleService;\nimport org.springframework.stereotype.Service;\n\nimport java.util.ArrayList;\nimport java.util.List;\nimport java.util.stream.Collectors;\n\n\n/**\n * 用户与角色对应关系\n * \n * @author chenshun\n * @email sunlightcs@gmail.com\n * @date 2016年9月18日 上午9:45:48\n */\n@Service(\"sysUserRoleService\")\npublic class SysUserRoleServiceImpl extends BaseServiceImpl<SysUserRoleDao, SysUserRole> implements SysUserRoleService {\n\n\t@Override\n\t@JFinalTx\n\tpublic void saveOrUpdate(Long userId, List<Long> roleIdList) {\n\t\t//先删除用户与角色关系\n\t\tSysUserRole delSysUserRole = new SysUserRole();\n\t\tdelSysUserRole.setUserId(userId);\n\t\tthis.deleteByModel(delSysUserRole);\n\n\t\tif(roleIdList == null || roleIdList.size() == 0){\n\t\t\treturn ;\n\t\t}\n\n\t\t//保存用户与角色关系\n\t\tList<SysUserRole> list = new ArrayList<>(roleIdList.size());\n\t\tfor(Long roleId : roleIdList){\n\t\t\tSysUserRole sysUserRole = new SysUserRole();\n\t\t\tsysUserRole.setUserId(userId);\n\t\t\tsysUserRole.setRoleId(roleId);\n\n\t\t\tlist.add(sysUserRole);\n\t\t}\n\n\t\tDb.batchSave(list, list.size());\n\t}\n\n\t@Override\n\tpublic List<Long> queryRoleIdList(Long userId) {\n\t\tSysUserRole sysUserRole = new SysUserRole();\n\t\tsysUserRole.setUserId(userId);\n\t\tList<SysUserRole> sysUserRoleList = this.findByModel(sysUserRole);\n\t\tList<Long> roleIdList = sysUserRoleList.stream().map(item->{ return item.getRoleId(); }).collect(Collectors.toList());\n\t\treturn roleIdList;\n\t}\n\n}\n"
  },
  {
    "path": "src/main/java/io/sdb/service/impl/SysUserServiceImpl.java",
    "content": "package io.sdb.service.impl;\n\nimport com.jfinal.plugin.activerecord.Page;\nimport io.sdb.common.annotation.JFinalTx;\nimport io.sdb.common.exception.RRException;\nimport io.sdb.common.utils.Constant;\nimport io.sdb.common.utils.PageUtils;\nimport io.sdb.common.utils.Query;\nimport io.sdb.common.entity.Filter;\nimport io.sdb.dao.SysUserDao;\nimport io.sdb.model.SysUser;\nimport io.sdb.service.SysRoleService;\nimport io.sdb.service.SysUserRoleService;\nimport io.sdb.service.SysUserService;\nimport org.apache.commons.lang.RandomStringUtils;\nimport org.apache.commons.lang.StringUtils;\n\nimport org.apache.shiro.crypto.hash.Sha256Hash;\nimport org.springframework.beans.factory.annotation.Autowired;\nimport org.springframework.stereotype.Service;\n\nimport java.util.*;\n\n\n/**\n * 系统用户\n * \n * @author chenshun\n * @email sunlightcs@gmail.com\n * @date 2016年9月18日 上午9:46:09\n */\n@Service(\"sysUserService\")\npublic class SysUserServiceImpl extends BaseServiceImpl<SysUserDao, SysUser> implements SysUserService {\n\n\t@Autowired\n\tprivate SysUserRoleService sysUserRoleService;\n\t@Autowired\n\tprivate SysRoleService sysRoleService;\n\n\t@Override\n\tpublic PageUtils queryPage(Map<String, Object> params) {\n\t\tString username = (String)params.get(\"username\");\n\t\tLong createUserId = (Long)params.get(\"createUserId\");\n\t\tQuery<SysUser> query = new Query<SysUser>(params);\n\t\tList<Filter> filters = new ArrayList<>();\n\n\t\tif(createUserId != null) {\n            Filter filter = new Filter();\n            filter.setProperty(\"create_user_id\");\n            filter.setValue(createUserId);\n            filter.setOperator(Filter.Operator.eq);\n            filters.add(filter);\n        }\n\n        if (!StringUtils.isBlank(username)) {\n            Filter filter = new Filter();\n            filter.setProperty(\"username\");\n            filter.setValue(username);\n            filter.setOperator(Filter.Operator.like);\n            filters.add(filter);\n        }\n\n\n\t\tPage<SysUser> pr = this.paginate(query.getCurrPage(), query.getLimit(), filters, query.getOrder());\n\n\t\treturn new PageUtils(pr);\n\t}\n\n\t@Override\n\tpublic List<String> queryAllPerms(Long userId) {\n\t\treturn this.dao.queryAllPerms(userId);\n\t}\n\n\t@Override\n\tpublic List<Long> queryAllMenuId(Long userId) {\n\t\treturn this.dao.queryAllMenuId(userId);\n\t}\n\n\t@Override\n\tpublic SysUser queryByUserName(String username) {\n\t\treturn this.dao.queryByUserName(username);\n\t}\n\n\t@Override\n\t@JFinalTx\n\tpublic void save(SysUser user) {\n\t\tuser.setCreateTime(new Date());\n\t\t//sha256加密\n\t\tString salt = RandomStringUtils.randomAlphanumeric(20);\n\t\tuser.setPassword(new Sha256Hash(user.getPassword(), salt).toHex());\n\t\tuser.setSalt(salt);\n\t\tuser.save();\n\t\t\n\t\t//检查角色是否越权\n\t\tcheckRole(user);\n\t\t\n\t\t//保存用户与角色关系\n\t\tsysUserRoleService.saveOrUpdate(user.getUserId(), user.getRoleIdList());\n\t}\n\n\t@Override\n\t@JFinalTx\n\tpublic boolean update(SysUser user) {\n\t\tif(StringUtils.isBlank(user.getPassword())){\n\t\t\tuser.remove(\"password\");\n\t\t}else{\n\t\t\tuser.setPassword(new Sha256Hash(user.getPassword(), user.getSalt()).toHex());\n\t\t}\n\t\tboolean updateSucc = user.update();\n\t\t\n\t\t//检查角色是否越权\n\t\tcheckRole(user);\n\t\t\n\t\t//保存用户与角色关系\n\t\tsysUserRoleService.saveOrUpdate(user.getUserId(), user.getRoleIdList());\n\n\t\treturn updateSucc;\n\t}\n\n    @Override\n\tpublic boolean updatePassword(Long userId, String password, String newPassword) {\n\t\tSysUser sysUser = new SysUser();\n\t\tsysUser.setPassword(newPassword);\n\t\tsysUser.setUserId(userId);\n\t\tsysUser.setPassword(password);\n\t\tboolean succ = sysUser.update();\n\t\treturn succ;\n\t}\n\t\n\t/**\n\t * 检查角色是否越权\n\t */\n\tprivate void checkRole(SysUser user){\n\t\tif(user.getRoleIdList() == null || user.getRoleIdList().size() == 0){\n\t\t\treturn;\n\t\t}\n\t\t//如果不是超级管理员，则需要判断用户的角色是否自己创建\n\t\tif(user.getCreateUserId() == Constant.SUPER_ADMIN){\n\t\t\treturn ;\n\t\t}\n\n\t\t//查询用户创建的角色列表\n\t\tList<Long> roleIdList = sysRoleService.queryRoleIdList(user.getCreateUserId());\n\n\t\t//判断是否越权\n\t\tif(!roleIdList.containsAll(user.getRoleIdList())){\n\t\t\tthrow new RRException(\"新增用户所选角色，不是本人创建\");\n\t\t}\n\t}\n}\n"
  },
  {
    "path": "src/main/java/io/sdb/service/impl/SysUserTokenServiceImpl.java",
    "content": "package io.sdb.service.impl;\n\nimport io.sdb.common.utils.R;\nimport io.sdb.dao.SysUserTokenDao;\nimport io.sdb.model.SysUserToken;\nimport io.sdb.sys.oauth2.TokenGenerator;\nimport io.sdb.service.SysUserTokenService;\nimport org.springframework.stereotype.Service;\n\nimport java.util.Date;\n\n\n@Service(\"sysUserTokenService\")\npublic class SysUserTokenServiceImpl extends BaseServiceImpl<SysUserTokenDao, SysUserToken> implements SysUserTokenService {\n\n\t//12小时后过期\n\tprivate final static int EXPIRE = 3600 * 12;\n\n\n\t@Override\n\tpublic R createToken(long userId) {\n\t\t//生成一个token\n\t\tString token = TokenGenerator.generateValue();\n\n\t\t//当前时间\n\t\tDate now = new Date();\n\t\t//过期时间\n\t\tDate expireTime = new Date(now.getTime() + EXPIRE * 1000);\n\n\t\t//判断是否生成过token\n\t\tSysUserToken tokenEntity = this.dao.findById(userId);\n\t\tif(tokenEntity == null){\n\t\t\ttokenEntity = new SysUserToken();\n\t\t\ttokenEntity.setUserId(userId);\n\t\t\ttokenEntity.setToken(token);\n\t\t\ttokenEntity.setUpdateTime(now);\n\t\t\ttokenEntity.setExpireTime(expireTime);\n\n\t\t\t//保存token\n\t\t\ttokenEntity.save();\n\t\t}else{\n\t\t\ttokenEntity.setToken(token);\n\t\t\ttokenEntity.setUpdateTime(now);\n\t\t\ttokenEntity.setExpireTime(expireTime);\n\n\t\t\t//更新token\n\t\t\ttokenEntity.update();\n\t\t}\n\n\t\tR r = R.ok().put(\"token\", token).put(\"expire\", EXPIRE);\n\n\t\treturn r;\n\t}\n\n\t@Override\n\tpublic void logout(long userId) {\n\t\t//生成一个token\n\t\tString token = TokenGenerator.generateValue();\n\n\t\t//修改token\n\t\tSysUserToken tokenEntity = new SysUserToken();\n\t\ttokenEntity.setUserId(userId);\n\t\ttokenEntity.setToken(token);\n\t\ttokenEntity.update();\n\t}\n}\n"
  },
  {
    "path": "src/main/java/io/sdb/service/impl/UserServiceImpl.java",
    "content": "package io.sdb.service.impl;\n\n\nimport cn.binarywang.wx.miniapp.bean.WxMaUserInfo;\nimport cn.hutool.core.date.DateUtil;\nimport io.sdb.common.entity.Filter;\nimport io.sdb.common.exception.RRException;\nimport io.sdb.common.validator.Assert;\nimport io.sdb.dao.UserDao;\nimport io.sdb.enums.Language;\nimport io.sdb.enums.SnEnum;\nimport io.sdb.model.User;\nimport io.sdb.form.LoginForm;\nimport io.sdb.service.UserService;\nimport io.sdb.service.AreaService;\nimport io.sdb.service.SnService;\nimport org.apache.commons.codec.digest.DigestUtils;\nimport org.springframework.beans.factory.annotation.Autowired;\nimport org.springframework.stereotype.Service;\n\nimport java.util.ArrayList;\nimport java.util.Date;\nimport java.util.List;\n\n\n@Service(\"userService\")\npublic class UserServiceImpl extends BaseServiceImpl<UserDao, User> implements UserService {\n\n\t@Autowired\n\tAreaService areaService;\n\n\t@Autowired\n\tprivate SnService snService;\n\n\t@Override\n\tpublic User queryByMobile(String mobile) {\n\t\tUser user = new User();\n\t\tuser.setMobile(mobile);\n\t\treturn this.findFirstByModel(user);\n\t}\n\n\t@Override\n\tpublic String login(LoginForm form) {\n\t\tUser user = queryByMobile(form.getMobile());\n\t\tAssert.isNull(user, \"手机号或密码错误\");\n\n\t\t//密码错误\n\t\tif(!user.getPassword().equals(DigestUtils.sha256Hex(form.getPassword()))){\n\t\t\tthrow new RRException(\"手机号或密码错误\");\n\t\t}\n\n\t\treturn user.getUserId();\n\t}\n\n\t@Override\n\tpublic User addMaUser(WxMaUserInfo wxMaUserInfo) {\n\t\tUser user = new User();\n\t\tString userId = snService.generate(SnEnum.USER);\n\t\tuser.setUserId(userId);\n\t\tuser.setAvatar(wxMaUserInfo.getAvatarUrl());\n\t\tuser.setMaOpenId(wxMaUserInfo.getOpenId());\n        user.setNickname(wxMaUserInfo.getNickName());\n        user.setGender(Integer.parseInt(wxMaUserInfo.getGender()));\n        user.setUnionId(wxMaUserInfo.getUnionId());\n        Language language = Language.getByEnumName(wxMaUserInfo.getLanguage());\n        user.setLanguage((int)language.getValue());\n        user.save();\n\t\treturn user;\n\t}\n\n\t@Override\n\tpublic Integer getYestodayNewUsers() {\n\t\tList<Filter> filterList = new ArrayList<>();\n\n\t\tFilter start = new Filter();\n\t\tstart.setOperator(Filter.Operator.ge);\n\t\tstart.setProperty(\"create_date\");\n\t\tDate todayBegin = DateUtil.beginOfDay(new Date());\n\t\ttodayBegin = DateUtil.offsetDay(todayBegin, -1);\n\t\tstart.setValue(todayBegin);\n\t\tfilterList.add(start);\n\n\t\tFilter end = new Filter();\n\t\tend.setOperator(Filter.Operator.le);\n\t\tend.setProperty(\"create_date\");\n\t\tDate todayEnd = DateUtil.endOfDay(new Date());\n\t\ttodayEnd = DateUtil.offsetDay(todayEnd, -1);\n\t\tend.setValue(todayEnd);\n\t\tfilterList.add(end);\n\n\t\tList<User> userList = this.findByFilters(filterList);\n\n\t\treturn userList.size();\n\t}\n\n\t@Override\n\tpublic Integer getTotalUsers() {\n\t\tList<User> users = this.findAll();\n\t\treturn users.size();\n\t}\n}\n"
  },
  {
    "path": "src/main/java/io/sdb/sys/oauth2/OAuth2Filter.java",
    "content": "package io.sdb.sys.oauth2;\n\nimport com.google.gson.Gson;\nimport io.sdb.common.utils.HttpContextUtils;\nimport io.sdb.common.utils.R;\nimport org.apache.commons.lang.StringUtils;\nimport org.apache.http.HttpStatus;\nimport org.apache.shiro.authc.AuthenticationException;\nimport org.apache.shiro.authc.AuthenticationToken;\nimport org.apache.shiro.web.filter.authc.AuthenticatingFilter;\nimport org.springframework.web.bind.annotation.RequestMethod;\n\nimport javax.servlet.ServletRequest;\nimport javax.servlet.ServletResponse;\nimport javax.servlet.http.HttpServletRequest;\nimport javax.servlet.http.HttpServletResponse;\nimport java.io.IOException;\n\n/**\n * oauth2过滤器\n *\n * @author chenshun\n * @email sunlightcs@gmail.com\n * @date 2017-05-20 13:00\n */\npublic class OAuth2Filter extends AuthenticatingFilter {\n\n    @Override\n    protected AuthenticationToken createToken(ServletRequest request, ServletResponse response) throws Exception {\n        //获取请求token\n        String token = getRequestToken((HttpServletRequest) request);\n\n        if(StringUtils.isBlank(token)){\n            return null;\n        }\n\n        return new OAuth2Token(token);\n    }\n\n    @Override\n    protected boolean isAccessAllowed(ServletRequest request, ServletResponse response, Object mappedValue) {\n        if(((HttpServletRequest) request).getMethod().equals(RequestMethod.OPTIONS.name())){\n            return true;\n        }\n\n        return false;\n    }\n\n    @Override\n    protected boolean onAccessDenied(ServletRequest request, ServletResponse response) throws Exception {\n        //获取请求token，如果token不存在，直接返回401\n        String token = getRequestToken((HttpServletRequest) request);\n        if(StringUtils.isBlank(token)){\n            HttpServletResponse httpResponse = (HttpServletResponse) response;\n            httpResponse.setHeader(\"Access-Control-Allow-Credentials\", \"true\");\n            httpResponse.setHeader(\"Access-Control-Allow-Origin\", HttpContextUtils.getOrigin());\n\n            String json = new Gson().toJson(R.error(HttpStatus.SC_UNAUTHORIZED, \"invalid token\"));\n\n            httpResponse.getWriter().print(json);\n\n            return false;\n        }\n\n        return executeLogin(request, response);\n    }\n\n    @Override\n    protected boolean onLoginFailure(AuthenticationToken token, AuthenticationException e, ServletRequest request, ServletResponse response) {\n        HttpServletResponse httpResponse = (HttpServletResponse) response;\n        httpResponse.setContentType(\"application/json;charset=utf-8\");\n        httpResponse.setHeader(\"Access-Control-Allow-Credentials\", \"true\");\n        httpResponse.setHeader(\"Access-Control-Allow-Origin\", HttpContextUtils.getOrigin());\n        try {\n            //处理登录失败的异常\n            Throwable throwable = e.getCause() == null ? e : e.getCause();\n            R r = R.error(HttpStatus.SC_UNAUTHORIZED, throwable.getMessage());\n\n            String json = new Gson().toJson(r);\n            httpResponse.getWriter().print(json);\n        } catch (IOException e1) {\n\n        }\n\n        return false;\n    }\n\n    /**\n     * 获取请求的token\n     */\n    private String getRequestToken(HttpServletRequest httpRequest){\n        //从header中获取token\n        String token = httpRequest.getHeader(\"token\");\n\n        //如果header中不存在token，则从参数中获取token\n        if(StringUtils.isBlank(token)){\n            token = httpRequest.getParameter(\"token\");\n        }\n\n        return token;\n    }\n\n\n}\n"
  },
  {
    "path": "src/main/java/io/sdb/sys/oauth2/OAuth2Realm.java",
    "content": "package io.sdb.sys.oauth2;\n\nimport io.sdb.model.SysUser;\nimport io.sdb.model.SysUserToken;\nimport io.sdb.service.ShiroService;\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;\nimport org.springframework.stereotype.Component;\n\nimport java.util.Set;\n\n/**\n * 认证\n *\n * @author chenshun\n * @email sunlightcs@gmail.com\n * @date 2017-05-20 14:00\n */\n@Component\npublic class OAuth2Realm extends AuthorizingRealm {\n    @Autowired\n    private ShiroService shiroService;\n\n    @Override\n    public boolean supports(AuthenticationToken token) {\n        return token instanceof OAuth2Token;\n    }\n\n    /**\n     * 授权(验证权限时调用)\n     */\n    @Override\n    protected AuthorizationInfo doGetAuthorizationInfo(PrincipalCollection principals) {\n        SysUser user = (SysUser)principals.getPrimaryPrincipal();\n        Long userId = user.getUserId();\n\n        //用户权限列表\n        Set<String> permsSet = shiroService.getUserPermissions(userId);\n\n        SimpleAuthorizationInfo info = new SimpleAuthorizationInfo();\n        info.setStringPermissions(permsSet);\n        return info;\n    }\n\n    /**\n     * 认证(登录时调用)\n     */\n    @Override\n    protected AuthenticationInfo doGetAuthenticationInfo(AuthenticationToken token) throws AuthenticationException {\n        String accessToken = (String) token.getPrincipal();\n\n        //根据accessToken，查询用户信息\n        SysUserToken tokenEntity = shiroService.queryByToken(accessToken);\n        //token失效\n        if(tokenEntity == null || tokenEntity.getExpireTime().getTime() < System.currentTimeMillis()){\n            throw new IncorrectCredentialsException(\"token失效，请重新登录\");\n        }\n\n        //查询用户信息\n        SysUser user = shiroService.queryUser(tokenEntity.getUserId());\n        //账号锁定\n        if(user.getStatus() == 0){\n            throw new LockedAccountException(\"账号已被锁定,请联系管理员\");\n        }\n\n        SimpleAuthenticationInfo info = new SimpleAuthenticationInfo(user, accessToken, getName());\n        return info;\n    }\n}\n"
  },
  {
    "path": "src/main/java/io/sdb/sys/oauth2/OAuth2Token.java",
    "content": "package io.sdb.sys.oauth2;\n\n\nimport org.apache.shiro.authc.AuthenticationToken;\n\n/**\n * token\n *\n * @author chenshun\n * @email sunlightcs@gmail.com\n * @date 2017-05-20 13:22\n */\npublic class OAuth2Token implements AuthenticationToken {\n    private String token;\n\n    public OAuth2Token(String token){\n        this.token = token;\n    }\n\n    @Override\n    public String getPrincipal() {\n        return token;\n    }\n\n    @Override\n    public Object getCredentials() {\n        return token;\n    }\n}\n"
  },
  {
    "path": "src/main/java/io/sdb/sys/oauth2/TokenGenerator.java",
    "content": "package io.sdb.sys.oauth2;\n\nimport io.sdb.common.exception.RRException;\n\nimport java.security.MessageDigest;\nimport java.util.UUID;\n\n/**\n * 生成token\n *\n * @author chenshun\n * @email sunlightcs@gmail.com\n * @date 2017-05-20 14:41\n */\npublic class TokenGenerator {\n\n    public static String generateValue() {\n        return generateValue(UUID.randomUUID().toString());\n    }\n\n    private static final char[] hexCode = \"0123456789abcdef\".toCharArray();\n\n    public static String toHexString(byte[] data) {\n        if(data == null) {\n            return null;\n        }\n        StringBuilder r = new StringBuilder(data.length*2);\n        for ( byte b : data) {\n            r.append(hexCode[(b >> 4) & 0xF]);\n            r.append(hexCode[(b & 0xF)]);\n        }\n        return r.toString();\n    }\n\n    public static String generateValue(String param) {\n        try {\n            MessageDigest algorithm = MessageDigest.getInstance(\"MD5\");\n            algorithm.reset();\n            algorithm.update(param.getBytes());\n            byte[] messageDigest = algorithm.digest();\n            return toHexString(messageDigest);\n        } catch (Exception e) {\n            throw new RRException(\"生成Token失败\", e);\n        }\n    }\n}\n"
  },
  {
    "path": "src/main/java/io/sdb/sys/redis/SysConfigRedis.java",
    "content": "/**\n * Copyright 2018\n * <p>\n * Licensed under the Apache License, Version 2.0 (the \"License\"); you may not\n * use this file except in compliance with the License. You may obtain a copy of\n * the License at\n * <p>\n * http://www.apache.org/licenses/LICENSE-2.0\n * <p>\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS, WITHOUT\n * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the\n * License for the specific language governing permissions and limitations under\n * the License.\n */\n\npackage io.sdb.sys.redis;\n\n\nimport io.sdb.common.utils.RedisKeys;\nimport io.sdb.common.utils.RedisUtils;\nimport io.sdb.model.SysConfig;\nimport org.springframework.beans.factory.annotation.Autowired;\nimport org.springframework.stereotype.Component;\n\n/**\n * 系统配置Redis\n *\n * @author chenshun\n * @email sunlightcs@gmail.com\n * @date 2017/7/18 21:08\n */\n@Component\npublic class SysConfigRedis {\n    @Autowired\n    private RedisUtils redisUtils;\n\n    public void saveOrUpdate(SysConfig config) {\n        if(config == null){\n            return ;\n        }\n        String key = RedisKeys.getSysConfigKey(config.getParamKey());\n        redisUtils.set(key, config);\n    }\n\n    public void delete(String configKey) {\n        String key = RedisKeys.getSysConfigKey(configKey);\n        redisUtils.delete(key);\n    }\n\n    public SysConfig get(String configKey){\n        String key = RedisKeys.getSysConfigKey(configKey);\n        return redisUtils.get(key, SysConfig.class);\n    }\n}\n"
  },
  {
    "path": "src/main/java/io/sdb/vo/DeliveryCorpVO.java",
    "content": "package io.sdb.vo;\n\nimport io.sdb.common.entity.Node;\nimport io.sdb.model.DeliveryCorp;\nimport io.sdb.model.Specification;\nimport lombok.Data;\n\n@Data\npublic class DeliveryCorpVO{\n    String value;\n    String label;\n}\n"
  },
  {
    "path": "src/main/java/io/sdb/vo/GoodsVO.java",
    "content": "package io.sdb.vo;\n\nimport io.sdb.model.Goods;\nimport io.sdb.model.base.BaseGoods;\nimport lombok.Data;\n\n@Data\npublic class GoodsVO extends Goods {\n    Boolean favorite = false;\n}\n"
  },
  {
    "path": "src/main/java/io/sdb/vo/GrouponDetailVO.java",
    "content": "package io.sdb.vo;\n\nimport lombok.Data;\n\n@Data\npublic class GrouponDetailVO {\n    String grouponId;\n    Integer totalCount;\n    Integer joinedCount;\n    String headUrl;\n    String name;\n\n    public Integer getSurplus() {\n        Integer surplus = totalCount - joinedCount;\n        if (surplus < 0) {\n            return 0;\n        }\n        return surplus;\n    }\n}\n"
  },
  {
    "path": "src/main/java/io/sdb/vo/GrouponTeamVO.java",
    "content": "package io.sdb.vo;\n\nimport io.sdb.model.Groupon;\nimport io.sdb.model.GrouponTeam;\nimport lombok.Data;\n\n@Data\npublic class GrouponTeamVO extends GrouponTeam {\n    String headUrl;\n}\n"
  },
  {
    "path": "src/main/java/io/sdb/vo/GrouponVO.java",
    "content": "package io.sdb.vo;\n\nimport io.sdb.model.Groupon;\nimport lombok.Data;\n\n@Data\npublic class GrouponVO extends Groupon {\n}\n"
  },
  {
    "path": "src/main/java/io/sdb/vo/NewsVO.java",
    "content": "package io.sdb.vo;\n\nimport com.fasterxml.jackson.databind.annotation.JsonSerialize;\nimport io.sdb.serializer.Date2LongSerializer;\nimport lombok.Data;\n\nimport java.util.Date;\n\n/**\n * Created by IntelliJ IDEA.\n * User: quendi\n * Date: 2018/6/14\n */\n@Data\npublic class NewsVO {\n    Long id;\n    String title;\n    Integer head;\n    String img;\n    String content;\n    @JsonSerialize(using = Date2LongSerializer.class)\n    Date createDate;\n    @JsonSerialize(using = Date2LongSerializer.class)\n    Date updateDate;\n    Integer enable;\n}\n"
  },
  {
    "path": "src/main/java/io/sdb/vo/OrderDetailVO.java",
    "content": "package io.sdb.vo;\n\nimport com.fasterxml.jackson.annotation.JsonIgnore;\nimport com.fasterxml.jackson.databind.annotation.JsonSerialize;\nimport io.sdb.common.utils.EnumUtil;\nimport io.sdb.enums.OrderStatusEnum;\nimport io.sdb.model.OrderDetail;\nimport io.sdb.serializer.Date2LongSerializer;\nimport lombok.Data;\n\nimport java.math.BigDecimal;\nimport java.util.Date;\nimport java.util.List;\n\n/**\n * Created by yjjdick\n * 2017-06-11 18:30\n */\n@Data\npublic class OrderDetailVO {\n    String detailId;\n    String orderId;\n    String productId;\n    String productName;\n    String productModel;\n    String productSpec;\n    BigDecimal productPrice;\n    BigDecimal groupPrice;\n    Integer productQuantity;\n    String productIcon;\n    @JsonSerialize(using = Date2LongSerializer.class)\n    Date createDate;\n    @JsonSerialize(using = Date2LongSerializer.class)\n    Date updateDate;\n}\n"
  },
  {
    "path": "src/main/java/io/sdb/vo/OrderVO.java",
    "content": "package io.sdb.vo;\n\nimport com.fasterxml.jackson.annotation.JsonIgnore;\nimport com.fasterxml.jackson.databind.annotation.JsonSerialize;\nimport io.sdb.common.utils.EnumUtil;\nimport io.sdb.enums.OrderStatusEnum;\nimport io.sdb.model.OrderDetail;\nimport io.sdb.serializer.Date2LongSerializer;\nimport lombok.Data;\n\nimport java.math.BigDecimal;\nimport java.util.Date;\nimport java.util.List;\n\n/**\n * Created by yjjdick\n * 2017-06-11 18:30\n */\n@Data\n//@JsonSerialize(include = JsonSerialize.Inclusion.NON_NULL)\n//@JsonInclude(JsonInclude.Include.NON_NULL)\npublic class OrderVO {\n\n    /** 订单id. */\n    private String orderId;\n\n    /** 买家名字. */\n    private String buyerName;\n\n    /** 买家手机号. */\n    private String buyerPhone;\n\n    /** 买家地址. */\n    private String buyerAddress;\n\n    /** 买家微信Openid. */\n    private String buyerOpenid;\n\n    /** 买家微信Openid. */\n    private String buyerId;\n\n    /** 订单总金额. */\n    private BigDecimal orderAmount;\n\n    /** 订单状态, 默认为0新下单. */\n    private Integer orderStatus;\n\n    /** 支付状态, 默认为0未支付. */\n    private Integer payStatus;\n\n    /** 买家备注 */\n    private String remark;\n\n    /** 是否需要开发 */\n    private Integer needInvoice;\n\n    private Integer invoiceType;\n    private String title;\n    private String taxNumber;\n    private String companyAddress;\n    private String telephone;\n    private String bankName;\n    private String bankAccount;\n    private String payTradeNo;\n    private String refundTradeNo;\n\n    private String trackingNumber;\n    private String deliveryCode;\n\n    private Integer groupon;\n    private String grouponId;\n    private Integer grouponCount;\n\n    /** 创建时间. */\n    @JsonSerialize(using = Date2LongSerializer.class)\n    private Date createDate;\n\n    /** 更新时间. */\n    @JsonSerialize(using = Date2LongSerializer.class)\n    private Date updateDate;\n\n    List<OrderDetailVO> orderDetailList;\n\n    @JsonIgnore\n    public OrderStatusEnum getOrderStatusEnum() {\n        return EnumUtil.getByCode(orderStatus, OrderStatusEnum.class);\n    }\n\n}\n"
  },
  {
    "path": "src/main/java/io/sdb/vo/ProductCategoryVO.java",
    "content": "package io.sdb.vo;\n\nimport io.sdb.common.entity.Node;\nimport io.sdb.model.Area;\nimport io.sdb.model.ProductCategory;\nimport lombok.Data;\n\n@Data\npublic class ProductCategoryVO extends Node<ProductCategory> {\n    Long value;\n    String label;\n    String treePath;\n\n    public ProductCategoryVO(ProductCategory productCategory) {\n        super(productCategory.getId(), productCategory.getParentId());\n        this.value = productCategory.getId();\n        this.label = productCategory.getName();\n        this.treePath = productCategory.getTreePath();\n    }\n}\n"
  },
  {
    "path": "src/main/java/io/sdb/vo/ProductVO.java",
    "content": "package io.sdb.vo;\n\nimport com.fasterxml.jackson.databind.annotation.JsonSerialize;\nimport com.jfinal.plugin.activerecord.Model;\nimport io.sdb.serializer.Date2LongSerializer;\nimport lombok.Data;\n\nimport java.math.BigDecimal;\nimport java.util.Date;\n\n/**\n * 购物车\n * Created by yjjdick\n * 2017-06-11 19:37\n */\n@Data\npublic class ProductVO{\n    String name;\n    String caption;\n    String image;\n    String specificationValues;\n    Integer stock;\n    String sn;\n    BigDecimal price;\n    BigDecimal groupPrice;\n    Integer enable;\n    @JsonSerialize(using = Date2LongSerializer.class)\n    Date createDate;\n}\n"
  },
  {
    "path": "src/main/java/io/sdb/vo/SpecificationVO.java",
    "content": "package io.sdb.vo;\n\nimport io.sdb.common.entity.Node;\nimport io.sdb.model.ProductCategory;\nimport io.sdb.model.Specification;\nimport lombok.Data;\n\n@Data\npublic class SpecificationVO extends Node<Specification> {\n    Long value;\n    String label;\n\n    public SpecificationVO(Specification specification) {\n        super(specification.getId(), specification.getParentId());\n        this.value = specification.getId();\n        this.label = specification.getName();\n    }\n}\n"
  },
  {
    "path": "src/main/java/io/sdb/vo/VolunteerInfoVO.java",
    "content": "package io.sdb.vo;\n\nimport com.fasterxml.jackson.databind.annotation.JsonSerialize;\nimport io.sdb.serializer.Date2LongSerializer;\nimport lombok.Data;\n\nimport java.util.Date;\n\n@Data\npublic class VolunteerInfoVO {\n    String name;\n    String idCard;\n    @JsonSerialize(using = Date2LongSerializer.class)\n    Date createDate;\n    String id;\n    Integer status;\n}\n"
  },
  {
    "path": "src/main/resources/application-dev.yml",
    "content": "spring:\n  datasource:\n    type: com.alibaba.druid.pool.DruidDataSource\n    driverClassName: net.sf.log4jdbc.DriverSpy\n    druid:\n        first:  #数据源1\n            url: jdbc:log4jdbc:mysql://127.0.0.1:3306/sdb?allowMultiQueries=true&useUnicode=true&characterEncoding=utf-8\n            username: root\n            password: 123456\n            initial-size: 10\n            max-active: 100\n            min-idle: 10\n            max-wait: 60000\n            pool-prepared-statements: true\n            max-pool-prepared-statement-per-connection-size: 20\n            time-between-eviction-runs-millis: 60000\n            min-evictable-idle-time-millis: 300000\n            validation-query: SELECT 1 FROM DUAL\n            test-while-idle: true\n            test-on-borrow: false\n            test-on-return: false\n            stat-view-servlet:\n                enabled: true\n                url-pattern: /druid/*\n                #login-username: admin\n                #login-password: admin\n            filter:\n                stat:\n                    log-slow-sql: true\n                    slow-sql-millis: 1000\n                    merge-sql: true\n                wall:\n                    config:\n                        multi-statement-allow: true\n            connection-init-sqls: set names utf8mb4;\n        second:  #数据源2\n            url: jdbc:log4jdbc:mysql://127.0.0.1:3306/sdb?allowMultiQueries=true&useUnicode=true&characterEncoding=utf-8\n            username: root\n            password: 123456\n            initial-size: 10\n            max-active: 100\n            min-idle: 10\n            max-wait: 60000\n            pool-prepared-statements: true\n            max-pool-prepared-statement-per-connection-size: 20\n            time-between-eviction-runs-millis: 60000\n            min-evictable-idle-time-millis: 300000\n            validation-query: SELECT 1 FROM DUAL\n            test-while-idle: true\n            test-on-borrow: false\n            test-on-return: false\n            stat-view-servlet:\n                enabled: true\n                url-pattern: /druid/*\n                #login-username: admin\n                #login-password: admin\n            filter:\n                stat:\n                    log-slow-sql: true\n                    slow-sql-millis: 2000\n                    merge-sql: true\n                wall:\n                    config:\n                        multi-statement-allow: true\n            connection-init-sqls: set names utf8mb4;"
  },
  {
    "path": "src/main/resources/application-prod.yml",
    "content": "spring:\n  datasource:\n    type: com.alibaba.druid.pool.DruidDataSource\n    driverClassName: net.sf.log4jdbc.DriverSpy\n    druid:\n        first:  #数据源1\n            url: jdbc:log4jdbc:mysql://127.0.0.1:3306/sdb?allowMultiQueries=true&useUnicode=true&characterEncoding=utf-8\n            username: root\n            password: 123456\n            initial-size: 10\n            max-active: 100\n            min-idle: 10\n            max-wait: 60000\n            pool-prepared-statements: true\n            max-pool-prepared-statement-per-connection-size: 20\n            time-between-eviction-runs-millis: 60000\n            min-evictable-idle-time-millis: 300000\n            validation-query: SELECT 1 FROM DUAL\n            test-while-idle: true\n            test-on-borrow: false\n            test-on-return: false\n            stat-view-servlet:\n                enabled: true\n                url-pattern: /druid/*\n                #login-username: admin\n                #login-password: admin\n            filter:\n                stat:\n                    log-slow-sql: true\n                    slow-sql-millis: 1000\n                    merge-sql: true\n                wall:\n                    config:\n                        multi-statement-allow: true\n            connection-init-sqls: set names utf8mb4;\n        second:  #数据源2\n            url: jdbc:log4jdbc:mysql://127.0.0.1:3306/sdb?allowMultiQueries=true&useUnicode=true&characterEncoding=utf-8\n            username: root\n            password: 123456\n            initial-size: 10\n            max-active: 100\n            min-idle: 10\n            max-wait: 60000\n            pool-prepared-statements: true\n            max-pool-prepared-statement-per-connection-size: 20\n            time-between-eviction-runs-millis: 60000\n            min-evictable-idle-time-millis: 300000\n            validation-query: SELECT 1 FROM DUAL\n            test-while-idle: true\n            test-on-borrow: false\n            test-on-return: false\n            stat-view-servlet:\n                enabled: true\n                url-pattern: /druid/*\n                #login-username: admin\n                #login-password: admin\n            filter:\n                stat:\n                    log-slow-sql: true\n                    slow-sql-millis: 2000\n                    merge-sql: true\n                wall:\n                    config:\n                        multi-statement-allow: true\n            connection-init-sqls: set names utf8mb4;\nwechat:\n  miniapp:\n    notifyUrl: http://sdbtest.s1.natapp.cc/sdb/pay/notify\n\nschedule:\n    open: true"
  },
  {
    "path": "src/main/resources/application-test.yml",
    "content": "spring:\n  datasource:\n    type: com.alibaba.druid.pool.DruidDataSource\n    driverClassName: net.sf.log4jdbc.DriverSpy\n    druid:\n        first:  #数据源1\n            url: jdbc:log4jdbc:mysql://10.12.130.184:3306/sdb?allowMultiQueries=true&useUnicode=true&characterEncoding=utf-8\n            username: root\n            password: 123456\n            initial-size: 10\n            max-active: 100\n            min-idle: 10\n            max-wait: 60000\n            pool-prepared-statements: true\n            max-pool-prepared-statement-per-connection-size: 20\n            time-between-eviction-runs-millis: 60000\n            min-evictable-idle-time-millis: 300000\n            validation-query: SELECT 1 FROM DUAL\n            test-while-idle: true\n            test-on-borrow: false\n            test-on-return: false\n            stat-view-servlet:\n                enabled: true\n                url-pattern: /druid/*\n                #login-username: admin\n                #login-password: admin\n            filter:\n                stat:\n                    log-slow-sql: true\n                    slow-sql-millis: 1000\n                    merge-sql: true\n                wall:\n                    config:\n                        multi-statement-allow: true\n            connection-init-sqls: set names utf8mb4;\n        second:  #数据源2\n            url: jdbc:log4jdbc:mysql://10.12.130.184:3306/sdb?allowMultiQueries=true&useUnicode=true&characterEncoding=utf-8\n            username: root\n            password: 123456\n            initial-size: 10\n            max-active: 100\n            min-idle: 10\n            max-wait: 60000\n            pool-prepared-statements: true\n            max-pool-prepared-statement-per-connection-size: 20\n            time-between-eviction-runs-millis: 60000\n            min-evictable-idle-time-millis: 300000\n            validation-query: SELECT 1 FROM DUAL\n            test-while-idle: true\n            test-on-borrow: false\n            test-on-return: false\n            stat-view-servlet:\n                enabled: true\n                url-pattern: /druid/*\n                #login-username: admin\n                #login-password: admin\n            filter:\n                stat:\n                    log-slow-sql: true\n                    slow-sql-millis: 2000\n                    merge-sql: true\n                wall:\n                    config:\n                        multi-statement-allow: true\nwechat:\n  miniapp:\n    notifyUrl: http://wxsdb.natapp4.cc/sdb/pay/notify\n\nschedule:\n    open: true"
  },
  {
    "path": "src/main/resources/application.yml",
    "content": "# Tomcat\nserver:\n    tomcat:\n        uri-encoding: UTF-8\n        max-threads: 1000\n        min-spare-threads: 30\n    port: 8080\n    connection-timeout: 5000ms\n    servlet:\n      context-path: /sdb\n\n# /info 端点的显示\ninfo:\n  name: @project.artifactId@\n  version: @project.version@\n  date: @maven.build.timestamp@\n  description: @project.description@\n\nspring:\n    # 环境 dev|test|prod\n    profiles:\n        active: dev\n    # jackson时间格式化\n    jackson:\n        time-zone: GMT+8\n        date-format: yyyy-MM-dd HH:mm:ss\n    http:\n        multipart:\n          servlet:\n            max-file-size: 100MB\n            max-request-size: 100MB\n            enabled: true\n    redis:\n        open: false  # 是否开启redis缓存  true开启   false关闭\n        database: 0\n        host: 127.0.0.1\n        port: 6379\n        password: 123456 # 密码（默认为空）\n        timeout: 6000ms  # 连接超时时长（毫秒）\n        jedis:\n          pool:\n              max-active: 1000  # 连接池最大连接数（使用负值表示没有限制）\n              max-wait: -1ms      # 连接池最大阻塞等待时间（使用负值表示没有限制）\n              max-idle: 10      # 连接池中的最大空闲连接\n              min-idle: 5       # 连接池中的最小空闲连接\n    mvc:\n        throw-exception-if-no-handler-found: true\n    resources:\n        add-mappings: false\n    mail:\n        host: smtp.163.com\n        username: yaojiajunnsh@163.com\n        password: yjj123456\n        properties:\n          mail:\n            smtp:\n              auth: true\n              starttls:\n                required: true\n                enable: true\n\nsdb:\n  # APP模块，是通过jwt认证的，如果要使用APP模块，则需要修改【加密秘钥】\n  jwt:\n    # 加密秘钥\n    secret: www.senduobang.com\n    # token有效时长，7天，单位秒\n    expire: 604800\n    header: token\n\nschedule:\n    open: false\n\nwechat:\n  ma:\n    msgDataFormat: JSON\n    appid:\n    secret:\n    mchId:\n    mchKey:\n    keyPath:\n    notifyUrl:\n  mp:\n    openAppId:\n    openAppSecret:\n    configs:\n      - appid:\n        secret:\n        token:\n        aesKey:\n\norder:\n  refund: false\n\nkuaidi100:\n  notifyUrl:\n  kuaidi100Key:\n  kuaidi100PollUrl:\n\n\n"
  },
  {
    "path": "src/main/resources/banner.txt",
    "content": "${AnsiColor.BLUE}\n                  ,---,  ,---,\n                ,---.'|,---.'|\n  .--.--.       |   | :|   | :\n /  /    '      |   | |:   : :\n|  :  /`./    ,--.__| |:     |,-.\n|  :  ;_     /   ,'   ||   : '  |\n \\  \\    `. .   '  /  ||   |  / :\n  `----.   \\'   ; |:  |'   : |: |\n /  /`--'  /|   | '/  '|   | '/ :\n'--'.     / |   :    :||   :    |\n  `--'---'   \\   \\  /  /    \\  /\n              `----'   `-'----'\n -------------------------森多邦商城开源系统--------------------------\n 官方QQ交流群：346743162\n\n\n"
  },
  {
    "path": "src/main/resources/log4jdbc.properties",
    "content": "log4jdbc.sqltiming.warn.threshold=2000\n"
  },
  {
    "path": "src/main/resources/logback-spring.xml",
    "content": "<?xml version=\"1.0\" encoding=\"UTF-8\" ?>\n<configuration>\n    <include resource=\"org/springframework/boot/logging/logback/base.xml\"/>\n\n    <logger name=\"jdbc.connection\" additivity=\"false\" level=\"FATAL\">\n    </logger>\n    <logger name=\"jdbc.resultset\" additivity=\"false\" level=\"INFO\">\n    </logger>\n    <logger name=\"jdbc.audit\" additivity=\"false\" level=\"INFO\">\n    </logger>\n    <logger name=\"jdbc.sqlonly\" additivity=\"false\" level=\"DEBUG\">\n    </logger>\n    <logger name=\"jdbc.sqltiming\" additivity=\"false\" level=\"INFO\">\n        <appender-ref ref=\"CONSOLE\" />\n        <appender-ref ref=\"FILE\" />\n    </logger>\n\n    <!--定义日志文件的存储地址 勿在 LogBack 的配置中使用相对路径-->\n    <property name=\"LOG_HOME\" value=\"/logs\" />\n\n    <!--<appender name=\"consoleLog\" class=\"ch.qos.logback.core.ConsoleAppender\">-->\n    <!--<layout class=\"ch.qos.logback.classic.PatternLayout\">-->\n    <!--<pattern>-->\n    <!--%d{yyyy-MM-dd HH:mm:ss.SSS} [%thread] %-5level %logger{50} - %msg%n-->\n    <!--</pattern>-->\n    <!--</layout>-->\n    <!--</appender>-->\n\n    <appender name=\"fileInfoLog\" class=\"ch.qos.logback.core.rolling.RollingFileAppender\">\n        <file>${LOG_HOME}/sdb/log_info.log</file>\n        <filter class=\"ch.qos.logback.classic.filter.LevelFilter\">\n            <level>ERROR</level>\n            <onMatch>DENY</onMatch>\n            <onMismatch>ACCEPT</onMismatch>\n        </filter>\n        <encoder>\n            <pattern>\n                %d{yyyy-MM-dd HH:mm:ss.SSS} [%thread] %-5level %logger{50} - %msg%n\n            </pattern>\n            <charset>utf-8</charset>\n        </encoder>\n        <!--滚动策略-->\n        <rollingPolicy class=\"ch.qos.logback.core.rolling.TimeBasedRollingPolicy\">\n            <!-- 归档的日志文件的路径，例如今天是2013-12-21日志，当前写的日志文件路径为file节点指定，可以将此文件与file指定文件路径设置为不同路径，从而将当前日志文件或归档日志文件置不同的目录。\n            而2013-12-21的日志文件在由fileNamePattern指定。%d{yyyy-MM-dd}指定日期格式，%i指定索引 -->\n            <fileNamePattern> ${LOG_HOME}/sdb/info/log-info-%d{yyyy-MM-dd}.%i.log</fileNamePattern>\n            <maxHistory>30</maxHistory>\n            <totalSizeCap>3GB</totalSizeCap>\n            <!-- 除按日志记录之外，还配置了日志文件不能超过2M，若超过2M，日志文件会以索引0开始，\n            命名日志文件，例如log-error-2013-12-21.0.log -->\n            <timeBasedFileNamingAndTriggeringPolicy class=\"ch.qos.logback.core.rolling.SizeAndTimeBasedFNATP\">\n                <maxFileSize>2MB</maxFileSize>\n            </timeBasedFileNamingAndTriggeringPolicy>\n        </rollingPolicy>\n    </appender>\n\n    <appender name=\"fileErrorLog\" class=\"ch.qos.logback.core.rolling.RollingFileAppender\">\n        <!-- 正在记录的日志文件的路径及文件名 -->\n        <file>${LOG_HOME}/sdb/log_error.log</file>\n        <filter class=\"ch.qos.logback.classic.filter.ThresholdFilter\">\n            <level>ERROR</level>\n        </filter>\n        <encoder>\n            <pattern>\n                %d{yyyy-MM-dd HH:mm:ss.SSS} [%thread] %-5level %logger{50} - %msg%n\n            </pattern>\n            <charset>utf-8</charset>\n        </encoder>\n        <!--滚动策略-->\n        <rollingPolicy class=\"ch.qos.logback.core.rolling.TimeBasedRollingPolicy\">\n            <!-- 归档的日志文件的路径，例如今天是2013-12-21日志，当前写的日志文件路径为file节点指定，可以将此文件与file指定文件路径设置为不同路径，从而将当前日志文件或归档日志文件置不同的目录。\n            而2013-12-21的日志文件在由fileNamePattern指定。%d{yyyy-MM-dd}指定日期格式，%i指定索引 -->\n            <fileNamePattern> ${LOG_HOME}/sdb/error/log-error-%d{yyyy-MM-dd}.%i.log</fileNamePattern>\n            <maxHistory>30</maxHistory>\n            <totalSizeCap>1GB</totalSizeCap>\n            <!-- 除按日志记录之外，还配置了日志文件不能超过2M，若超过2M，日志文件会以索引0开始，\n            命名日志文件，例如log-error-2013-12-21.0.log -->\n            <timeBasedFileNamingAndTriggeringPolicy class=\"ch.qos.logback.core.rolling.SizeAndTimeBasedFNATP\">\n                <maxFileSize>2MB</maxFileSize>\n            </timeBasedFileNamingAndTriggeringPolicy>\n        </rollingPolicy>\n\n        <!-- 追加方式记录日志 -->\n        <append>true</append>\n    </appender>\n\n    <springProfile name=\"dev\">\n        <root level=\"info\">\n            <!--<appender-ref ref=\"consoleLog\" />-->\n            <appender-ref ref=\"fileInfoLog\" />\n            <appender-ref ref=\"fileErrorLog\" />\n        </root>\n    </springProfile>\n\n    <springProfile name=\"test\">\n        <root level=\"info\">\n            <!--<appender-ref ref=\"consoleLog\" />-->\n            <appender-ref ref=\"fileInfoLog\" />\n            <appender-ref ref=\"fileErrorLog\" />\n        </root>\n    </springProfile>\n\n    <springProfile name=\"prod\">\n        <root level=\"info\">\n            <appender-ref ref=\"fileInfoLog\" />\n            <appender-ref ref=\"fileErrorLog\" />\n        </root>\n    </springProfile>\n\n</configuration>"
  },
  {
    "path": "src/main/resources/sql/all.sql",
    "content": "#namespace(\"common\")\n  #include(\"common.sql\")\n#end\n\n#namespace(\"sysUser\")\n  #include(\"sysUser.sql\")\n#end\n\n#namespace(\"sysMenu\")\n  #include(\"sysMenu.sql\")\n#end\n\n#namespace(\"sysConfig\")\n  #include(\"sysConfig.sql\")\n#end\n\n#namespace(\"news\")\n  #include(\"news.sql\")\n#end\n\n#namespace(\"product\")\n  #include(\"product.sql\")\n#end\n\n#namespace(\"cart\")\n  #include(\"cart.sql\")\n#end\n\n#namespace(\"order\")\n  #include(\"order.sql\")\n#end\n\n#namespace(\"productCategory\")\n  #include(\"productCategory.sql\")\n#end\n\n#namespace(\"favoriteGoods\")\n  #include(\"favoriteGoods.sql\")\n#end"
  },
  {
    "path": "src/main/resources/sql/cart.sql",
    "content": "#sql(\"listDetail\")\n\tSELECT\n\tc.id id,\n\tg.name name,\n\tg.caption caption,\n\tp.sn product_id,\n\tp.specification_values specification_values,\n\tc.quantity quantity,\n\tp.price price,\n  g.image image,\n  g.sn goodsId\nFROM\n\tcart c\n\tLEFT JOIN product p ON c.product_id = p.sn\n\tLEFT JOIN goods g ON p.goods_sn = g.sn\nWHERE\n\tc.user_id = #para(userId)\n#end"
  },
  {
    "path": "src/main/resources/sql/common.sql",
    "content": "#sql(\"findList\")\n  SELECT * FROM #(tableName) where 1=1\n  #for(filter:filters)\n\n    #if(!filter.getProperty()??)\n      #continue\n    #end\n\n    #if(filter.getOperator().name() == \"eq\")\n      #if(filter.getValue()??)\n        #(filter.getWhereOptStr()) #(filter.getProperty()) = #para(filter.getValue())\n      #else\n        #(filter.getWhereOptStr()) #(filter.getProperty()) IS NULL\n      #end\n    #elseif(filter.getOperator().name() == \"ne\")\n      #if(filter.getValue()??)\n        #(filter.getWhereOptStr()) #(filter.getProperty()) != #para(filter.getValue())\n      #else\n        #(filter.getWhereOptStr()) #(filter.getProperty()) IS NOT NULL\n      #end\n    #elseif(filter.getOperator().name() == \"gt\")\n      #(filter.getWhereOptStr()) #(filter.getProperty()) > #para(filter.getValue())\n    #elseif(filter.getOperator().name() == \"lt\")\n      #(filter.getWhereOptStr()) #(filter.getProperty()) < #para(filter.getValue())\n    #elseif(filter.getOperator().name() == \"ge\")\n      #(filter.getWhereOptStr()) #(filter.getProperty()) >= #para(filter.getValue())\n    #elseif(filter.getOperator().name() == \"le\")\n      #(filter.getWhereOptStr()) #(filter.getProperty()) <= #para(filter.getValue())\n    #elseif(filter.getOperator().name() == \"like\")\n      #(filter.getWhereOptStr()) #(filter.getProperty()) like concat('%', #para(filter.getValue()), '%')\n    #elseif(filter.getOperator().name() == \"isNull\")\n      #(filter.getWhereOptStr()) #(filter.getProperty()) IS NULL\n    #elseif(filter.getOperator().name() == \"isNotNull\")\n      #(filter.getWhereOptStr()) #(filter.getProperty()) IS NOT NULL\n    #elseif(filter.getOperator().name() == \"in\")\n      #(filter.getWhereOptStr()) #(filter.getProperty()) in (\n      #for(v:filter.getValue())\n        #para(v)\n        #if(!for.last)\n        ,\n        #end\n      #end\n      )\n    #end\n  #end\n\n  #for(order: orders)\n      #if(for.first)\n        order by\n      #end\n      #if(!for.first)\n        ,\n      #end\n      #(order.getProperty()??) #(order.getDirection().name()??)\n    #end\n#end\n\n#sql(\"deleteBatch\")\n  DELETE FROM #(tableName) where\n  #for(i = 0;i<primaryKeys.length;i++)\n    #if(primaryKeys[i])\n      #(primaryKeys[i]) in (\n        #for(id:ids[i])\n          #if(!for.first)\n            ,\n          #end\n          #(id)\n        #end\n      )\n    #end\n  #end\n#end\n\n#sql(\"findByModel\")\n  SELECT * FROM #(tableName) WHERE 1=1\n  #for(v:record)\n    AND #(v.key) = #para(v.value)\n  #end\n#end\n\n#sql(\"deleteByModel\")\n  DELETE FROM #(tableName) WHERE 1=1\n  #for(v:record)\n    AND #(v.key) = #para(v.value)\n  #end\n#end"
  },
  {
    "path": "src/main/resources/sql/favoriteGoods.sql",
    "content": "#sql(\"list\")\n\tSELECT\n\tg.sn goodsId,\n  g.name name,\n\tg.caption caption,\n\tg.price price,\n  g.image image\nFROM\n\tfavorite_goods f\n\tLEFT JOIN goods g ON f.favorite_goods = g.sn\nWHERE\n\tf.favorite_user = #para(userId)\n#end"
  },
  {
    "path": "src/main/resources/sql/news.sql",
    "content": "#sql(\"queryAllNews\")\n\tSELECT * FROM news WHERE enable = 1 ORDER BY create_date desc\n#end\n\n#sql(\"queryHeadNews\")\n\tSELECT * FROM news WHERE enable = 1 and head = 1 ORDER BY create_date desc limit 3\n#end\n\n#sql(\"deleteById\")\n  UPDATE news SET enable = 0 WHERE id = #para(0)\n#end"
  },
  {
    "path": "src/main/resources/sql/order.sql",
    "content": "#sql(\"updateByGrouponId\")\n\tupdate order_master set order_status = #para(orderStatus) where groupon_id = #para(grouponId)\n#end"
  },
  {
    "path": "src/main/resources/sql/product.sql",
    "content": "#sql(\"listDetailByProductIds\")\n\tSELECT\n\tg.`name` name,\n\tg.`model` model,\n\tg.`sn` goods_sn,\n\tg.caption caption,\n\tg.image image,\n    p.specification_values specification_values,\n    p.stock stock,\n\tp.sn sn,\n\tp.price price,\n\tp.group_price groupPrice,\n\tp.`enable` `enable`,\n\tp.create_date create_date\nFROM\n\tproduct p\n\tLEFT JOIN goods g ON p.goods_sn = g.sn\n\tWHERE p.sn in (\n\t    #for(v:productIds)\n        #para(v)\n        #if(!for.last)\n        ,\n        #end\n      #end\n\t)\n#end"
  },
  {
    "path": "src/main/resources/sql/productCategory.sql",
    "content": "#sql(\"queryListOrder\")\n\tSELECT * FROM product_category  ORDER BY `order` asc\n#end"
  },
  {
    "path": "src/main/resources/sql/sysConfig.sql",
    "content": "#sql(\"updateValueByKey\")\n  update sys_config set param_value = #para(paramValue) where param_key = #para(paramKey)\n#end"
  },
  {
    "path": "src/main/resources/sql/sysMenu.sql",
    "content": "#sql(\"queryNotButtonList\")\n\tSELECT * FROM sys_menu WHERE TYPE != 2 ORDER BY order_num asc\n#end"
  },
  {
    "path": "src/main/resources/sql/sysUser.sql",
    "content": "#sql(\"queryAllPerms\")\n  select m.perms from sys_user_role ur\n\t\t\tLEFT JOIN sys_role_menu rm on ur.role_id = rm.role_id\n\t\t\tLEFT JOIN sys_menu m on rm.menu_id = m.menu_id\n\twhere ur.user_id = #para(userId)\n#end\n\n#sql(\"queryAllMenuId\")\n  select distinct rm.menu_id from sys_user_role ur\n\t\t\tLEFT JOIN sys_role_menu rm on ur.role_id = rm.role_id\n\t\twhere ur.user_id = #para(userId)\n#end\n\n#sql(\"queryByUserName\")\n  select * from sys_user where username = #para(username)\n#end"
  },
  {
    "path": "src/main/resources/static/swagger/css/print.css",
    "content": ".swagger-section pre code{display:block;padding:.5em;background:#f0f0f0}.swagger-section pre .clojure .built_in,.swagger-section pre .lisp .title,.swagger-section pre .nginx .title,.swagger-section pre .subst,.swagger-section pre .tag .title,.swagger-section pre code{color:#000}.swagger-section pre .addition,.swagger-section pre .aggregate,.swagger-section pre .apache .cbracket,.swagger-section pre .apache .tag,.swagger-section pre .bash .variable,.swagger-section pre .constant,.swagger-section pre .django .variable,.swagger-section pre .erlang_repl .function_or_atom,.swagger-section pre .flow,.swagger-section pre .markdown .header,.swagger-section pre .parent,.swagger-section pre .preprocessor,.swagger-section pre .ruby .symbol,.swagger-section pre .ruby .symbol .string,.swagger-section pre .rules .value,.swagger-section pre .rules .value .number,.swagger-section pre .smalltalk .class,.swagger-section pre .stream,.swagger-section pre .string,.swagger-section pre .tag .value,.swagger-section pre .template_tag,.swagger-section pre .tex .command,.swagger-section pre .tex .special,.swagger-section pre .title{color:#800}.swagger-section pre .annotation,.swagger-section pre .chunk,.swagger-section pre .comment,.swagger-section pre .diff .header,.swagger-section pre .markdown .blockquote,.swagger-section pre .template_comment{color:#888}.swagger-section pre .change,.swagger-section pre .date,.swagger-section pre .go .constant,.swagger-section pre .literal,.swagger-section pre .markdown .bullet,.swagger-section pre .markdown .link_url,.swagger-section pre .number,.swagger-section pre .regexp,.swagger-section pre .smalltalk .char,.swagger-section pre .smalltalk .symbol{color:#080}.swagger-section pre .apache .sqbracket,.swagger-section pre .array,.swagger-section pre .attr_selector,.swagger-section pre .clojure .attribute,.swagger-section pre .coffeescript .property,.swagger-section pre .decorator,.swagger-section pre .deletion,.swagger-section pre .doctype,.swagger-section pre .envvar,.swagger-section pre .erlang_repl .reserved,.swagger-section pre .filter .argument,.swagger-section pre .important,.swagger-section pre .javadoc,.swagger-section pre .label,.swagger-section pre .localvars,.swagger-section pre .markdown .link_label,.swagger-section pre .nginx .built_in,.swagger-section pre .pi,.swagger-section pre .prompt,.swagger-section pre .pseudo,.swagger-section pre .ruby .string,.swagger-section pre .shebang,.swagger-section pre .tex .formula,.swagger-section pre .vhdl .attribute{color:#88f}.swagger-section pre .aggregate,.swagger-section pre .apache .tag,.swagger-section pre .bash .variable,.swagger-section pre .built_in,.swagger-section pre .css .tag,.swagger-section pre .go .typename,.swagger-section pre .id,.swagger-section pre .javadoctag,.swagger-section pre .keyword,.swagger-section pre .markdown .strong,.swagger-section pre .phpdoc,.swagger-section pre .request,.swagger-section pre .smalltalk .class,.swagger-section pre .status,.swagger-section pre .tex .command,.swagger-section pre .title,.swagger-section pre .winutils,.swagger-section pre .yardoctag{font-weight:700}.swagger-section pre .markdown .emphasis{font-style:italic}.swagger-section pre .nginx .built_in{font-weight:400}.swagger-section pre .coffeescript .javascript,.swagger-section pre .javascript .xml,.swagger-section pre .tex .formula,.swagger-section pre .xml .cdata,.swagger-section pre .xml .css,.swagger-section pre .xml .javascript,.swagger-section pre .xml .vbscript{opacity:.5}.swagger-section .hljs{display:block;overflow-x:auto;padding:.5em;background:#f0f0f0}.swagger-section .hljs,.swagger-section .hljs-subst{color:#444}.swagger-section .hljs-attribute,.swagger-section .hljs-doctag,.swagger-section .hljs-keyword,.swagger-section .hljs-meta-keyword,.swagger-section .hljs-name,.swagger-section .hljs-selector-tag{font-weight:700}.swagger-section .hljs-addition,.swagger-section .hljs-built_in,.swagger-section .hljs-bullet,.swagger-section .hljs-code,.swagger-section .hljs-literal{color:#1f811f}.swagger-section .hljs-link,.swagger-section .hljs-regexp,.swagger-section .hljs-selector-attr,.swagger-section .hljs-selector-pseudo,.swagger-section .hljs-symbol,.swagger-section .hljs-template-variable,.swagger-section .hljs-variable{color:#bc6060}.swagger-section .hljs-deletion,.swagger-section .hljs-number,.swagger-section .hljs-quote,.swagger-section .hljs-selector-class,.swagger-section .hljs-selector-id,.swagger-section .hljs-string,.swagger-section .hljs-template-tag,.swagger-section .hljs-type{color:#800}.swagger-section .hljs-section,.swagger-section .hljs-title{color:#800;font-weight:700}.swagger-section .hljs-comment{color:#888}.swagger-section .hljs-meta{color:#2b6ea1}.swagger-section .hljs-emphasis{font-style:italic}.swagger-section .hljs-strong{font-weight:700}.swagger-section .swagger-ui-wrap{line-height:1;font-family:Droid Sans,sans-serif;min-width:760px;max-width:960px;margin-left:auto;margin-right:auto}.swagger-section .swagger-ui-wrap b,.swagger-section .swagger-ui-wrap strong{font-family:Droid Sans,sans-serif;font-weight:700}.swagger-section .swagger-ui-wrap blockquote,.swagger-section .swagger-ui-wrap q{quotes:none}.swagger-section .swagger-ui-wrap p{line-height:1.4em;padding:0 0 10px;color:#333}.swagger-section .swagger-ui-wrap blockquote:after,.swagger-section .swagger-ui-wrap blockquote:before,.swagger-section .swagger-ui-wrap q:after,.swagger-section .swagger-ui-wrap q:before{content:none}.swagger-section .swagger-ui-wrap .heading_with_menu h1,.swagger-section .swagger-ui-wrap .heading_with_menu h2,.swagger-section .swagger-ui-wrap .heading_with_menu h3,.swagger-section .swagger-ui-wrap .heading_with_menu h4,.swagger-section .swagger-ui-wrap .heading_with_menu h5,.swagger-section .swagger-ui-wrap .heading_with_menu h6{display:block;clear:none;float:left;-ms-box-sizing:border-box;box-sizing:border-box;width:60%}.swagger-section .swagger-ui-wrap table{border-collapse:collapse;border-spacing:0}.swagger-section .swagger-ui-wrap table thead tr th{padding:5px;font-size:.9em;color:#666;border-bottom:1px solid #999}.swagger-section .swagger-ui-wrap table tbody tr:last-child td{border-bottom:none}.swagger-section .swagger-ui-wrap table tbody tr.offset{background-color:#f0f0f0}.swagger-section .swagger-ui-wrap table tbody tr td{padding:6px;font-size:.9em;border-bottom:1px solid #ccc;vertical-align:top;line-height:1.3em}.swagger-section .swagger-ui-wrap ol{margin:0 0 10px;padding:0 0 0 18px;list-style-type:decimal}.swagger-section .swagger-ui-wrap ol li{padding:5px 0;font-size:.9em;color:#333}.swagger-section .swagger-ui-wrap ol,.swagger-section .swagger-ui-wrap ul{list-style:none}.swagger-section .swagger-ui-wrap h1 a,.swagger-section .swagger-ui-wrap h2 a,.swagger-section .swagger-ui-wrap h3 a,.swagger-section .swagger-ui-wrap h4 a,.swagger-section .swagger-ui-wrap h5 a,.swagger-section .swagger-ui-wrap h6 a{text-decoration:none}.swagger-section .swagger-ui-wrap h1 a:hover,.swagger-section .swagger-ui-wrap h2 a:hover,.swagger-section .swagger-ui-wrap h3 a:hover,.swagger-section .swagger-ui-wrap h4 a:hover,.swagger-section .swagger-ui-wrap h5 a:hover,.swagger-section .swagger-ui-wrap h6 a:hover{text-decoration:underline}.swagger-section .swagger-ui-wrap h1 span.divider,.swagger-section .swagger-ui-wrap h2 span.divider,.swagger-section .swagger-ui-wrap h3 span.divider,.swagger-section .swagger-ui-wrap h4 span.divider,.swagger-section .swagger-ui-wrap h5 span.divider,.swagger-section .swagger-ui-wrap h6 span.divider{color:#aaa}.swagger-section .swagger-ui-wrap a{color:#547f00}.swagger-section .swagger-ui-wrap a img{border:none}.swagger-section .swagger-ui-wrap article,.swagger-section .swagger-ui-wrap aside,.swagger-section .swagger-ui-wrap details,.swagger-section .swagger-ui-wrap figcaption,.swagger-section .swagger-ui-wrap figure,.swagger-section .swagger-ui-wrap footer,.swagger-section .swagger-ui-wrap header,.swagger-section .swagger-ui-wrap hgroup,.swagger-section .swagger-ui-wrap menu,.swagger-section .swagger-ui-wrap nav,.swagger-section .swagger-ui-wrap section,.swagger-section .swagger-ui-wrap summary{display:block}.swagger-section .swagger-ui-wrap pre{font-family:Anonymous Pro,Menlo,Consolas,Bitstream Vera Sans Mono,Courier New,monospace;background-color:#fcf6db;border:1px solid #e5e0c6;padding:10px}.swagger-section .swagger-ui-wrap pre code{line-height:1.6em;background:none}.swagger-section .swagger-ui-wrap .content>.content-type>div>label{clear:both;display:block;color:#0f6ab4;font-size:1.1em;margin:0;padding:15px 0 5px}.swagger-section .swagger-ui-wrap .content pre{font-size:12px;margin-top:5px;padding:5px}.swagger-section .swagger-ui-wrap .icon-btn{cursor:pointer}.swagger-section .swagger-ui-wrap .info_title{padding-bottom:10px;font-weight:700;font-size:25px}.swagger-section .swagger-ui-wrap .footer{margin-top:20px}.swagger-section .swagger-ui-wrap div.big p,.swagger-section .swagger-ui-wrap p.big{font-size:1em;margin-bottom:10px}.swagger-section .swagger-ui-wrap form.fullwidth ol li.numeric input,.swagger-section .swagger-ui-wrap form.fullwidth ol li.string input,.swagger-section .swagger-ui-wrap form.fullwidth ol li.text textarea,.swagger-section .swagger-ui-wrap form.fullwidth ol li.url input{width:500px!important}.swagger-section .swagger-ui-wrap .info_license,.swagger-section .swagger-ui-wrap .info_tos{padding-bottom:5px}.swagger-section .swagger-ui-wrap .message-fail{color:#c00}.swagger-section .swagger-ui-wrap .info_email,.swagger-section .swagger-ui-wrap .info_name,.swagger-section .swagger-ui-wrap .info_url{padding-bottom:5px}.swagger-section .swagger-ui-wrap .info_description{padding-bottom:10px;font-size:15px}.swagger-section .swagger-ui-wrap .markdown ol li,.swagger-section .swagger-ui-wrap .markdown ul li{padding:3px 0;line-height:1.4em;color:#333}.swagger-section .swagger-ui-wrap form.formtastic fieldset.inputs ol li.numeric input,.swagger-section .swagger-ui-wrap form.formtastic fieldset.inputs ol li.string input,.swagger-section .swagger-ui-wrap form.formtastic fieldset.inputs ol li.url input{display:block;padding:4px;width:auto;clear:both}.swagger-section .swagger-ui-wrap form.formtastic fieldset.inputs ol li.numeric input.title,.swagger-section .swagger-ui-wrap form.formtastic fieldset.inputs ol li.string input.title,.swagger-section .swagger-ui-wrap form.formtastic fieldset.inputs ol li.url input.title{font-size:1.3em}.swagger-section .swagger-ui-wrap table.fullwidth{width:100%}.swagger-section .swagger-ui-wrap .model-signature{font-family:Droid Sans,sans-serif;font-size:1em;line-height:1.5em}.swagger-section .swagger-ui-wrap .model-signature .signature-nav a{text-decoration:none;color:#aaa}.swagger-section .swagger-ui-wrap .model-signature .signature-nav a:hover{text-decoration:underline;color:#000}.swagger-section .swagger-ui-wrap .model-signature .signature-nav .selected{color:#000;text-decoration:none}.swagger-section .swagger-ui-wrap .model-signature .propType{color:#55a}.swagger-section .swagger-ui-wrap .model-signature pre:hover{background-color:#ffd}.swagger-section .swagger-ui-wrap .model-signature pre{font-size:.85em;line-height:1.2em;overflow:auto;height:200px;resize:vertical;cursor:pointer}.swagger-section .swagger-ui-wrap .model-signature ul.signature-nav{display:block;min-width:230px;margin:0;padding:0}.swagger-section .swagger-ui-wrap .model-signature ul.signature-nav li:last-child{padding-right:0;border-right:none}.swagger-section .swagger-ui-wrap .model-signature ul.signature-nav li{float:left;margin:0 5px 5px 0;padding:2px 5px 2px 0;border-right:1px solid #ddd}.swagger-section .swagger-ui-wrap .model-signature .propOpt{color:#555}.swagger-section .swagger-ui-wrap .model-signature .snippet small{font-size:.75em}.swagger-section .swagger-ui-wrap .model-signature .propOptKey{font-style:italic}.swagger-section .swagger-ui-wrap .model-signature .description .strong{font-weight:700;color:#000;font-size:.9em}.swagger-section .swagger-ui-wrap .model-signature .description div{font-size:.9em;line-height:1.5em;margin-left:1em}.swagger-section .swagger-ui-wrap .model-signature .description .stronger{font-weight:700;color:#000}.swagger-section .swagger-ui-wrap .model-signature .description .propWrap .optionsWrapper{border-spacing:0;position:absolute;background-color:#fff;border:1px solid #bbb;display:none;font-size:11px;max-width:400px;line-height:30px;color:#000;padding:5px;margin-left:10px}.swagger-section .swagger-ui-wrap .model-signature .description .propWrap .optionsWrapper th{text-align:center;background-color:#eee;border:1px solid #bbb;font-size:11px;color:#666;font-weight:700;padding:5px;line-height:15px}.swagger-section .swagger-ui-wrap .model-signature .description .propWrap .optionsWrapper .optionName{font-weight:700}.swagger-section .swagger-ui-wrap .model-signature .description .propDesc.markdown>p:first-child,.swagger-section .swagger-ui-wrap .model-signature .description .propDesc.markdown>p:last-child{display:inline}.swagger-section .swagger-ui-wrap .model-signature .description .propDesc.markdown>p:not(:first-child):before{display:block;content:''}.swagger-section .swagger-ui-wrap .model-signature .description span:last-of-type.propDesc.markdown>p:only-child{margin-right:-3px}.swagger-section .swagger-ui-wrap .model-signature .propName{font-weight:700}.swagger-section .swagger-ui-wrap .model-signature .signature-container{clear:both}.swagger-section .swagger-ui-wrap .body-textarea{width:300px;height:100px;border:1px solid #aaa}.swagger-section .swagger-ui-wrap .markdown li code,.swagger-section .swagger-ui-wrap .markdown p code{font-family:Anonymous Pro,Menlo,Consolas,Bitstream Vera Sans Mono,Courier New,monospace;background-color:#f0f0f0;color:#000;padding:1px 3px}.swagger-section .swagger-ui-wrap .required{font-weight:700}.swagger-section .swagger-ui-wrap .editor_holder{font-family:Anonymous Pro,Menlo,Consolas,Bitstream Vera Sans Mono,Courier New,monospace;font-size:.9em}.swagger-section .swagger-ui-wrap .editor_holder label{font-weight:400!important}.swagger-section .swagger-ui-wrap .editor_holder label.required{font-weight:700!important}.swagger-section .swagger-ui-wrap input.parameter{width:300px;border:1px solid #aaa}.swagger-section .swagger-ui-wrap h1{color:#000;font-size:1.5em;line-height:1.3em;padding:10px 0;font-family:Droid Sans,sans-serif;font-weight:700}.swagger-section .swagger-ui-wrap .heading_with_menu{float:none;clear:both;overflow:hidden;display:block}.swagger-section .swagger-ui-wrap .heading_with_menu ul{display:block;clear:none;float:right;-ms-box-sizing:border-box;box-sizing:border-box;margin-top:10px}.swagger-section .swagger-ui-wrap h2{color:#000;font-size:1.3em;padding:10px 0}.swagger-section .swagger-ui-wrap h2 a{color:#000}.swagger-section .swagger-ui-wrap h2 span.sub{font-size:.7em;color:#999;font-style:italic}.swagger-section .swagger-ui-wrap h2 span.sub a{color:#777}.swagger-section .swagger-ui-wrap span.weak{color:#666}.swagger-section .swagger-ui-wrap .message-success{color:#89bf04}.swagger-section .swagger-ui-wrap caption,.swagger-section .swagger-ui-wrap td,.swagger-section .swagger-ui-wrap th{text-align:left;font-weight:400;vertical-align:middle}.swagger-section .swagger-ui-wrap .code{font-family:Anonymous Pro,Menlo,Consolas,Bitstream Vera Sans Mono,Courier New,monospace}.swagger-section .swagger-ui-wrap form.formtastic fieldset.inputs ol li.text textarea{font-family:Droid Sans,sans-serif;height:250px;padding:4px;display:block;clear:both}.swagger-section .swagger-ui-wrap form.formtastic fieldset.inputs ol li.select select{display:block;clear:both}.swagger-section .swagger-ui-wrap form.formtastic fieldset.inputs ol li.boolean{float:none;clear:both;overflow:hidden;display:block}.swagger-section .swagger-ui-wrap form.formtastic fieldset.inputs ol li.boolean label{display:block;float:left;clear:none;margin:0;padding:0}.swagger-section .swagger-ui-wrap form.formtastic fieldset.inputs ol li.boolean input{display:block;float:left;clear:none;margin:0 5px 0 0}.swagger-section .swagger-ui-wrap form.formtastic fieldset.inputs ol li.required label{color:#000}.swagger-section .swagger-ui-wrap form.formtastic fieldset.inputs ol li label{display:block;clear:both;width:auto;padding:0 0 3px;color:#666}.swagger-section .swagger-ui-wrap form.formtastic fieldset.inputs ol li label abbr{padding-left:3px;color:#888}.swagger-section .swagger-ui-wrap form.formtastic fieldset.inputs ol li p.inline-hints{margin-left:0;font-style:italic;font-size:.9em;margin:0}.swagger-section .swagger-ui-wrap form.formtastic fieldset.buttons{margin:0;padding:0}.swagger-section .swagger-ui-wrap span.blank,.swagger-section .swagger-ui-wrap span.empty{color:#888;font-style:italic}.swagger-section .swagger-ui-wrap .markdown h3{color:#547f00}.swagger-section .swagger-ui-wrap .markdown h4{color:#666}.swagger-section .swagger-ui-wrap .markdown pre{font-family:Anonymous Pro,Menlo,Consolas,Bitstream Vera Sans Mono,Courier New,monospace;background-color:#fcf6db;border:1px solid #e5e0c6;padding:10px;margin:0 0 10px}.swagger-section .swagger-ui-wrap .markdown pre code{line-height:1.6em;overflow:auto}.swagger-section .swagger-ui-wrap div.gist{margin:20px 0 25px!important}.swagger-section .swagger-ui-wrap ul#resources{font-family:Droid Sans,sans-serif;font-size:.9em}.swagger-section .swagger-ui-wrap ul#resources li.resource{border-bottom:1px solid #ddd}.swagger-section .swagger-ui-wrap ul#resources li.resource.active div.heading h2 a,.swagger-section .swagger-ui-wrap ul#resources li.resource:hover div.heading h2 a{color:#000}.swagger-section .swagger-ui-wrap ul#resources li.resource.active div.heading ul.options li a,.swagger-section .swagger-ui-wrap ul#resources li.resource:hover div.heading ul.options li a{color:#555}.swagger-section .swagger-ui-wrap ul#resources li.resource:last-child{border-bottom:none}.swagger-section .swagger-ui-wrap ul#resources li.resource div.heading{border:1px solid transparent;float:none;clear:both;overflow:hidden;display:block}.swagger-section .swagger-ui-wrap ul#resources li.resource div.heading ul.options{overflow:hidden;padding:0;display:block;clear:none;float:right;margin:14px 10px 0 0}.swagger-section .swagger-ui-wrap ul#resources li.resource div.heading ul.options li{float:left;clear:none;margin:0;padding:2px 10px;border-right:1px solid #ddd;color:#666;font-size:.9em}.swagger-section .swagger-ui-wrap ul#resources li.resource div.heading ul.options li a{color:#aaa;text-decoration:none}.swagger-section .swagger-ui-wrap ul#resources li.resource div.heading ul.options li a:hover{text-decoration:underline;color:#000}.swagger-section .swagger-ui-wrap ul#resources li.resource div.heading ul.options li a.active,.swagger-section .swagger-ui-wrap ul#resources li.resource div.heading ul.options li a:active,.swagger-section .swagger-ui-wrap ul#resources li.resource div.heading ul.options li a:hover{text-decoration:underline}.swagger-section .swagger-ui-wrap ul#resources li.resource div.heading ul.options li.first,.swagger-section .swagger-ui-wrap ul#resources li.resource div.heading ul.options li:first-child{padding-left:0}.swagger-section .swagger-ui-wrap ul#resources li.resource div.heading ul.options li.last,.swagger-section .swagger-ui-wrap ul#resources li.resource div.heading ul.options li:last-child{padding-right:0;border-right:none}.swagger-section .swagger-ui-wrap ul#resources li.resource div.heading ul.options.first,.swagger-section .swagger-ui-wrap ul#resources li.resource div.heading ul.options:first-child{padding-left:0}.swagger-section .swagger-ui-wrap ul#resources li.resource div.heading h2{color:#999;padding-left:0;display:block;clear:none;float:left;font-family:Droid Sans,sans-serif;font-weight:700}.swagger-section .swagger-ui-wrap ul#resources li.resource div.heading h2 a{color:#999}.swagger-section .swagger-ui-wrap ul#resources li.resource div.heading h2 a:hover{color:#000}.swagger-section .swagger-ui-wrap ul#resources li.resource ul.endpoints li.endpoint ul.operations li.operation{float:none;clear:both;overflow:hidden;display:block;margin:0 0 10px;padding:0}.swagger-section .swagger-ui-wrap ul#resources li.resource ul.endpoints li.endpoint ul.operations li.operation div.heading{float:none;clear:both;overflow:hidden;display:block;margin:0;padding:0}.swagger-section .swagger-ui-wrap ul#resources li.resource ul.endpoints li.endpoint ul.operations li.operation div.heading h3{display:block;clear:none;float:left;width:auto;margin:0;padding:0;line-height:1.1em;color:#000}.swagger-section .swagger-ui-wrap ul#resources li.resource ul.endpoints li.endpoint ul.operations li.operation div.heading h3 span.path{padding-left:10px}.swagger-section .swagger-ui-wrap ul#resources li.resource ul.endpoints li.endpoint ul.operations li.operation div.heading h3 span.path a{color:#000;text-decoration:none}.swagger-section .swagger-ui-wrap ul#resources li.resource ul.endpoints li.endpoint ul.operations li.operation div.heading h3 span.path a.toggleOperation.deprecated{text-decoration:line-through}.swagger-section .swagger-ui-wrap ul#resources li.resource ul.endpoints li.endpoint ul.operations li.operation div.heading h3 span.path a:hover{text-decoration:underline}.swagger-section .swagger-ui-wrap ul#resources li.resource ul.endpoints li.endpoint ul.operations li.operation div.heading h3 span.http_method a{text-transform:uppercase;text-decoration:none;color:#fff;display:inline-block;width:50px;font-size:.7em;text-align:center;padding:7px 0 4px;border-radius:2px}.swagger-section .swagger-ui-wrap ul#resources li.resource ul.endpoints li.endpoint ul.operations li.operation div.heading h3 span{margin:0;padding:0}.swagger-section .swagger-ui-wrap ul#resources li.resource ul.endpoints li.endpoint ul.operations li.operation div.heading ul.options{overflow:hidden;padding:0;display:block;clear:none;float:right;margin:6px 10px 0 0}.swagger-section .swagger-ui-wrap ul#resources li.resource ul.endpoints li.endpoint ul.operations li.operation div.heading ul.options li{float:left;clear:none;margin:0;padding:2px 10px;font-size:.9em}.swagger-section .swagger-ui-wrap ul#resources li.resource ul.endpoints li.endpoint ul.operations li.operation div.heading ul.options li a{text-decoration:none}.swagger-section .swagger-ui-wrap ul#resources li.resource ul.endpoints li.endpoint ul.operations li.operation div.heading ul.options li a .markdown p{color:inherit;padding:0;line-height:inherit}.swagger-section .swagger-ui-wrap ul#resources li.resource ul.endpoints li.endpoint ul.operations li.operation div.heading ul.options li a .nickname{color:#aaa;padding:0;line-height:inherit}.swagger-section .swagger-ui-wrap ul#resources li.resource ul.endpoints li.endpoint ul.operations li.operation div.heading ul.options li.access{color:#000}.swagger-section .swagger-ui-wrap ul#resources li.resource ul.endpoints li.endpoint ul.operations li.operation div.content{border-top:none;padding:10px;border-bottom-left-radius:6px;border-bottom-right-radius:6px;margin:0 0 20px}.swagger-section .swagger-ui-wrap ul#resources li.resource ul.endpoints li.endpoint ul.operations li.operation div.content h4{font-size:1.1em;margin:0;padding:15px 0 5px}.swagger-section .swagger-ui-wrap ul#resources li.resource ul.endpoints li.endpoint ul.operations li.operation div.content div.sandbox_header{float:none;clear:both;overflow:hidden;display:block}.swagger-section .swagger-ui-wrap ul#resources li.resource ul.endpoints li.endpoint ul.operations li.operation div.content div.sandbox_header a{padding:4px 0 0 10px;display:inline-block;font-size:.9em}.swagger-section .swagger-ui-wrap ul#resources li.resource ul.endpoints li.endpoint ul.operations li.operation div.content div.sandbox_header input.submit{display:block;clear:none;float:left;padding:6px 8px}.swagger-section .swagger-ui-wrap ul#resources li.resource ul.endpoints li.endpoint ul.operations li.operation div.content div.sandbox_header span.response_throbber{background-image:url(../images/throbber.gif);width:128px;height:16px;display:block;clear:none;float:right}.swagger-section .swagger-ui-wrap ul#resources li.resource ul.endpoints li.endpoint ul.operations li.operation div.content form input[type=text].error{outline:2px solid #000;outline-color:#c00}.swagger-section .swagger-ui-wrap ul#resources li.resource ul.endpoints li.endpoint ul.operations li.operation div.content form select[name=parameterContentType]{max-width:300px}.swagger-section .swagger-ui-wrap ul#resources li.resource ul.endpoints li.endpoint ul.operations li.operation div.content div.response div.block pre{font-family:Anonymous Pro,Menlo,Consolas,Bitstream Vera Sans Mono,Courier New,monospace;padding:10px;font-size:.9em;max-height:400px;overflow-y:auto}.swagger-section .swagger-ui-wrap ul#resources li.resource ul.endpoints li.endpoint ul.operations li.operation.put div.heading{background-color:#f9f2e9;border:1px solid #f0e0ca}.swagger-section .swagger-ui-wrap ul#resources li.resource ul.endpoints li.endpoint ul.operations li.operation.put div.heading h3 span.http_method a{background-color:#c5862b}.swagger-section .swagger-ui-wrap ul#resources li.resource ul.endpoints li.endpoint ul.operations li.operation.put div.heading ul.options li{border-right:1px solid #ddd;border-right-color:#f0e0ca;color:#c5862b}.swagger-section .swagger-ui-wrap ul#resources li.resource ul.endpoints li.endpoint ul.operations li.operation.put div.heading ul.options li a{color:#c5862b}.swagger-section .swagger-ui-wrap ul#resources li.resource ul.endpoints li.endpoint ul.operations li.operation.put div.content{background-color:#faf5ee;border:1px solid #f0e0ca}.swagger-section .swagger-ui-wrap ul#resources li.resource ul.endpoints li.endpoint ul.operations li.operation.put div.content h4{color:#c5862b}.swagger-section .swagger-ui-wrap ul#resources li.resource ul.endpoints li.endpoint ul.operations li.operation.put div.content div.sandbox_header a{color:#dcb67f}.swagger-section .swagger-ui-wrap ul#resources li.resource ul.endpoints li.endpoint ul.operations li.operation.head div.heading{background-color:#fcffcd;border:1px solid #000;border-color:#ffd20f}.swagger-section .swagger-ui-wrap ul#resources li.resource ul.endpoints li.endpoint ul.operations li.operation.head div.heading h3 span.http_method a{text-transform:uppercase;background-color:#ffd20f}.swagger-section .swagger-ui-wrap ul#resources li.resource ul.endpoints li.endpoint ul.operations li.operation.head div.heading ul.options li{border-right:1px solid #ddd;border-right-color:#ffd20f;color:#ffd20f}.swagger-section .swagger-ui-wrap ul#resources li.resource ul.endpoints li.endpoint ul.operations li.operation.head div.heading ul.options li a{color:#ffd20f}.swagger-section .swagger-ui-wrap ul#resources li.resource ul.endpoints li.endpoint ul.operations li.operation.head div.content{background-color:#fcffcd;border:1px solid #000;border-color:#ffd20f}.swagger-section .swagger-ui-wrap ul#resources li.resource ul.endpoints li.endpoint ul.operations li.operation.head div.content h4{color:#ffd20f}.swagger-section .swagger-ui-wrap ul#resources li.resource ul.endpoints li.endpoint ul.operations li.operation.head div.content div.sandbox_header a{color:#6fc992}.swagger-section .swagger-ui-wrap ul#resources li.resource ul.endpoints li.endpoint ul.operations li.operation.delete div.heading{background-color:#f5e8e8;border:1px solid #e8c6c7}.swagger-section .swagger-ui-wrap ul#resources li.resource ul.endpoints li.endpoint ul.operations li.operation.delete div.heading h3 span.http_method a{text-transform:uppercase;background-color:#a41e22}.swagger-section .swagger-ui-wrap ul#resources li.resource ul.endpoints li.endpoint ul.operations li.operation.delete div.heading ul.options li{border-right:1px solid #ddd;border-right-color:#e8c6c7;color:#a41e22}.swagger-section .swagger-ui-wrap ul#resources li.resource ul.endpoints li.endpoint ul.operations li.operation.delete div.heading ul.options li a{color:#a41e22}.swagger-section .swagger-ui-wrap ul#resources li.resource ul.endpoints li.endpoint ul.operations li.operation.delete div.content{background-color:#f7eded;border:1px solid #e8c6c7}.swagger-section .swagger-ui-wrap ul#resources li.resource ul.endpoints li.endpoint ul.operations li.operation.delete div.content h4{color:#a41e22}.swagger-section .swagger-ui-wrap ul#resources li.resource ul.endpoints li.endpoint ul.operations li.operation.delete div.content div.sandbox_header a{color:#c8787a}.swagger-section .swagger-ui-wrap ul#resources li.resource ul.endpoints li.endpoint ul.operations li.operation.post div.heading{background-color:#e7f6ec;border:1px solid #c3e8d1}.swagger-section .swagger-ui-wrap ul#resources li.resource ul.endpoints li.endpoint ul.operations li.operation.post div.heading h3 span.http_method a{background-color:#10a54a}.swagger-section .swagger-ui-wrap ul#resources li.resource ul.endpoints li.endpoint ul.operations li.operation.post div.heading ul.options li{border-right:1px solid #ddd;border-right-color:#c3e8d1;color:#10a54a}.swagger-section .swagger-ui-wrap ul#resources li.resource ul.endpoints li.endpoint ul.operations li.operation.post div.heading ul.options li a{color:#10a54a}.swagger-section .swagger-ui-wrap ul#resources li.resource ul.endpoints li.endpoint ul.operations li.operation.post div.content{background-color:#ebf7f0;border:1px solid #c3e8d1}.swagger-section .swagger-ui-wrap ul#resources li.resource ul.endpoints li.endpoint ul.operations li.operation.post div.content h4{color:#10a54a}.swagger-section .swagger-ui-wrap ul#resources li.resource ul.endpoints li.endpoint ul.operations li.operation.post div.content div.sandbox_header a{color:#6fc992}.swagger-section .swagger-ui-wrap ul#resources li.resource ul.endpoints li.endpoint ul.operations li.operation.patch div.heading{background-color:#fce9e3;border:1px solid #f5d5c3}.swagger-section .swagger-ui-wrap ul#resources li.resource ul.endpoints li.endpoint ul.operations li.operation.patch div.heading h3 span.http_method a{background-color:#d38042}.swagger-section .swagger-ui-wrap ul#resources li.resource ul.endpoints li.endpoint ul.operations li.operation.patch div.heading ul.options li{border-right:1px solid #ddd;border-right-color:#f0cecb;color:#d38042}.swagger-section .swagger-ui-wrap ul#resources li.resource ul.endpoints li.endpoint ul.operations li.operation.patch div.heading ul.options li a{color:#d38042}.swagger-section .swagger-ui-wrap ul#resources li.resource ul.endpoints li.endpoint ul.operations li.operation.patch div.content{background-color:#faf0ef;border:1px solid #f0cecb}.swagger-section .swagger-ui-wrap ul#resources li.resource ul.endpoints li.endpoint ul.operations li.operation.patch div.content h4{color:#d38042}.swagger-section .swagger-ui-wrap ul#resources li.resource ul.endpoints li.endpoint ul.operations li.operation.patch div.content div.sandbox_header a{color:#dcb67f}.swagger-section .swagger-ui-wrap ul#resources li.resource ul.endpoints li.endpoint ul.operations li.operation.get div.heading{background-color:#e7f0f7;border:1px solid #c3d9ec}.swagger-section .swagger-ui-wrap ul#resources li.resource ul.endpoints li.endpoint ul.operations li.operation.get div.heading h3 span.http_method a{background-color:#0f6ab4}.swagger-section .swagger-ui-wrap ul#resources li.resource ul.endpoints li.endpoint ul.operations li.operation.get div.heading ul.options li{border-right:1px solid #ddd;border-right-color:#c3d9ec;color:#0f6ab4}.swagger-section .swagger-ui-wrap ul#resources li.resource ul.endpoints li.endpoint ul.operations li.operation.get div.heading ul.options li a{color:#0f6ab4}.swagger-section .swagger-ui-wrap ul#resources li.resource ul.endpoints li.endpoint ul.operations li.operation.get div.content{background-color:#ebf3f9;border:1px solid #c3d9ec}.swagger-section .swagger-ui-wrap ul#resources li.resource ul.endpoints li.endpoint ul.operations li.operation.get div.content h4{color:#0f6ab4}.swagger-section .swagger-ui-wrap ul#resources li.resource ul.endpoints li.endpoint ul.operations li.operation.get div.content div.sandbox_header a{color:#6fa5d2}.swagger-section .swagger-ui-wrap ul#resources li.resource ul.endpoints li.endpoint ul.operations li.operation.options div.heading{background-color:#e7f0f7;border:1px solid #c3d9ec}.swagger-section .swagger-ui-wrap ul#resources li.resource ul.endpoints li.endpoint ul.operations li.operation.options div.heading h3 span.http_method a{background-color:#0f6ab4}.swagger-section .swagger-ui-wrap ul#resources li.resource ul.endpoints li.endpoint ul.operations li.operation.options div.heading ul.options li{border-right:1px solid #ddd;border-right-color:#c3d9ec;color:#0f6ab4}.swagger-section .swagger-ui-wrap ul#resources li.resource ul.endpoints li.endpoint ul.operations li.operation.options div.heading ul.options li a{color:#0f6ab4}.swagger-section .swagger-ui-wrap ul#resources li.resource ul.endpoints li.endpoint ul.operations li.operation.options div.content{background-color:#ebf3f9;border:1px solid #c3d9ec}.swagger-section .swagger-ui-wrap ul#resources li.resource ul.endpoints li.endpoint ul.operations li.operation.options div.content h4{color:#0f6ab4}.swagger-section .swagger-ui-wrap ul#resources li.resource ul.endpoints li.endpoint ul.operations li.operation.options div.content div.sandbox_header a{color:#6fa5d2}.swagger-section .swagger-ui-wrap ul#resources li.resource ul.endpoints li.endpoint ul.operations li.operation.delete div.content,.swagger-section .swagger-ui-wrap ul#resources li.resource ul.endpoints li.endpoint ul.operations li.operation.get div.content,.swagger-section .swagger-ui-wrap ul#resources li.resource ul.endpoints li.endpoint ul.operations li.operation.head div.content,.swagger-section .swagger-ui-wrap ul#resources li.resource ul.endpoints li.endpoint ul.operations li.operation.patch div.content,.swagger-section .swagger-ui-wrap ul#resources li.resource ul.endpoints li.endpoint ul.operations li.operation.post div.content,.swagger-section .swagger-ui-wrap ul#resources li.resource ul.endpoints li.endpoint ul.operations li.operation.put div.content{border-top:none}.swagger-section .swagger-ui-wrap ul#resources li.resource ul.endpoints li.endpoint ul.operations li.operation.delete div.heading ul.options li.last,.swagger-section .swagger-ui-wrap ul#resources li.resource ul.endpoints li.endpoint ul.operations li.operation.delete div.heading ul.options li:last-child,.swagger-section .swagger-ui-wrap ul#resources li.resource ul.endpoints li.endpoint ul.operations li.operation.get div.heading ul.options li.last,.swagger-section .swagger-ui-wrap ul#resources li.resource ul.endpoints li.endpoint ul.operations li.operation.get div.heading ul.options li:last-child,.swagger-section .swagger-ui-wrap ul#resources li.resource ul.endpoints li.endpoint ul.operations li.operation.head div.heading ul.options li.last,.swagger-section .swagger-ui-wrap ul#resources li.resource ul.endpoints li.endpoint ul.operations li.operation.head div.heading ul.options li:last-child,.swagger-section .swagger-ui-wrap ul#resources li.resource ul.endpoints li.endpoint ul.operations li.operation.patch div.heading ul.options li.last,.swagger-section .swagger-ui-wrap ul#resources li.resource ul.endpoints li.endpoint ul.operations li.operation.patch div.heading ul.options li:last-child,.swagger-section .swagger-ui-wrap ul#resources li.resource ul.endpoints li.endpoint ul.operations li.operation.post div.heading ul.options li.last,.swagger-section .swagger-ui-wrap ul#resources li.resource ul.endpoints li.endpoint ul.operations li.operation.post div.heading ul.options li:last-child,.swagger-section .swagger-ui-wrap ul#resources li.resource ul.endpoints li.endpoint ul.operations li.operation.put div.heading ul.options li.last,.swagger-section .swagger-ui-wrap ul#resources li.resource ul.endpoints li.endpoint ul.operations li.operation.put div.heading ul.options li:last-child{padding-right:0;border-right:none}.swagger-section .swagger-ui-wrap ul#resources li.resource ul.endpoints li.endpoint ul.operations ul.options li a.active,.swagger-section .swagger-ui-wrap ul#resources li.resource ul.endpoints li.endpoint ul.operations ul.options li a:active,.swagger-section .swagger-ui-wrap ul#resources li.resource ul.endpoints li.endpoint ul.operations ul.options li a:hover{text-decoration:underline}.swagger-section .swagger-ui-wrap ul#resources li.resource ul.endpoints li.endpoint ul.operations.first,.swagger-section .swagger-ui-wrap ul#resources li.resource ul.endpoints li.endpoint ul.operations:first-child,.swagger-section .swagger-ui-wrap ul#resources li.resource ul.endpoints li.endpoint ul.operations ul.options li.first,.swagger-section .swagger-ui-wrap ul#resources li.resource ul.endpoints li.endpoint ul.operations ul.options li:first-child{padding-left:0}.swagger-section .swagger-ui-wrap p#colophon{margin:0 15px 40px;padding:10px 0;font-size:.8em;border-top:1px solid #ddd;font-family:Droid Sans,sans-serif;color:#999;font-style:italic}.swagger-section .swagger-ui-wrap p#colophon a{text-decoration:none;color:#547f00}.swagger-section .swagger-ui-wrap h3{color:#000;font-size:1.1em;padding:10px 0}.swagger-section .swagger-ui-wrap .markdown ol,.swagger-section .swagger-ui-wrap .markdown ul{font-family:Droid Sans,sans-serif;margin:5px 0 10px;padding:0 0 0 18px;list-style-type:disc}.swagger-section .swagger-ui-wrap form.form_box{background-color:#ebf3f9;border:1px solid #c3d9ec;padding:10px}.swagger-section .swagger-ui-wrap form.form_box label{color:#0f6ab4!important}.swagger-section .swagger-ui-wrap form.form_box input[type=submit]{display:block;padding:10px}.swagger-section .swagger-ui-wrap form.form_box p.weak{font-size:.8em}.swagger-section .swagger-ui-wrap form.form_box p{font-size:.9em;padding:0 0 15px;color:#7e7b6d}.swagger-section .swagger-ui-wrap form.form_box p a{color:#646257}.swagger-section .swagger-ui-wrap form.form_box p strong{color:#000}.swagger-section .swagger-ui-wrap .operation-status td.markdown>p:last-child{padding-bottom:0}.swagger-section .title{font-style:bold}.swagger-section .secondary_form{display:none}.swagger-section .main_image{display:block;margin-left:auto;margin-right:auto}.swagger-section .oauth_body{margin-left:100px;margin-right:100px}.swagger-section .oauth_submit{text-align:center;display:inline-block}.swagger-section .authorize-wrapper{margin:15px 0 10px}.swagger-section .authorize-wrapper_operation{float:right}.swagger-section .authorize__btn:hover{text-decoration:underline;cursor:pointer}.swagger-section .authorize__btn_operation:hover .authorize-scopes{display:block}.swagger-section .authorize-scopes{position:absolute;margin-top:20px;background:#fff;border:1px solid #ccc;border-radius:5px;display:none;font-size:13px;max-width:300px;line-height:30px;color:#000;padding:5px}.swagger-section .authorize-scopes .authorize__scope{text-decoration:none}.swagger-section .authorize__btn_operation{height:18px;vertical-align:middle;display:inline-block;background:url(../images/explorer_icons.png) no-repeat}.swagger-section .authorize__btn_operation_login{background-position:0 0;width:18px;margin-top:-6px;margin-left:4px}.swagger-section .authorize__btn_operation_logout{background-position:-30px 0;width:18px;margin-top:-6px;margin-left:4px}.swagger-section #auth_container{color:#fff;display:inline-block;border:none;padding:5px;width:87px;height:13px}.swagger-section #auth_container .authorize__btn{color:#fff}.swagger-section .auth_container{padding:0 0 10px;margin-bottom:5px;border-bottom:1px solid #ccc;font-size:.9em}.swagger-section .auth_container .auth__title{color:#547f00;font-size:1.2em}.swagger-section .auth_container .basic_auth__label{display:inline-block;width:60px}.swagger-section .auth_container .auth__description{color:#999;margin-bottom:5px}.swagger-section .auth_container .auth__button{margin-top:10px;height:30px}.swagger-section .auth_container .key_auth__field{margin:5px 0}.swagger-section .auth_container .key_auth__label{display:inline-block;width:60px}.swagger-section .api-popup-dialog{position:absolute;display:none}.swagger-section .api-popup-dialog-wrapper{z-index:2;width:500px;background:#fff;padding:20px;border:1px solid #ccc;border-radius:5px;font-size:13px;color:#777;position:fixed;top:50%;left:50%;transform:translate(-50%,-50%)}.swagger-section .api-popup-dialog-shadow{position:fixed;top:0;left:0;width:100%;height:100%;opacity:.2;background-color:gray;z-index:1}.swagger-section .api-popup-dialog .api-popup-title{font-size:24px;padding:10px 0}.swagger-section .api-popup-dialog .error-msg{padding-left:5px;padding-bottom:5px}.swagger-section .api-popup-dialog .api-popup-content{max-height:500px;overflow-y:auto}.swagger-section .api-popup-dialog .api-popup-authbtn,.swagger-section .api-popup-dialog .api-popup-cancel{height:30px}.swagger-section .api-popup-scopes{padding:10px 20px}.swagger-section .api-popup-scopes li{padding:5px 0;line-height:20px}.swagger-section .api-popup-scopes li input{position:relative;top:2px}.swagger-section .api-popup-scopes .api-scope-desc{padding-left:20px;font-style:italic}.swagger-section .api-popup-actions{padding-top:10px}.swagger-section fieldset{padding-bottom:10px;padding-left:20px}#header{display:none}.swagger-section .swagger-ui-wrap .model-signature pre{max-height:none}.swagger-section .swagger-ui-wrap .body-textarea,.swagger-section .swagger-ui-wrap input.parameter{width:100px}.swagger-section .swagger-ui-wrap ul#resources li.resource div.heading ul.options{display:none}.swagger-section .swagger-ui-wrap ul#resources li.resource ul.endpoints,.swagger-section .swagger-ui-wrap ul#resources li.resource ul.endpoints li.endpoint ul.operations li.operation div.content{display:block!important}"
  },
  {
    "path": "src/main/resources/static/swagger/css/reset.css",
    "content": "a,abbr,acronym,address,applet,article,aside,audio,b,big,blockquote,body,canvas,caption,center,cite,code,dd,del,details,dfn,div,dl,dt,em,embed,fieldset,figcaption,figure,footer,form,h1,h2,h3,h4,h5,h6,header,hgroup,html,i,iframe,img,ins,kbd,label,legend,li,mark,menu,nav,object,ol,output,p,pre,q,ruby,s,samp,section,small,span,strike,strong,sub,summary,sup,table,tbody,td,tfoot,th,thead,time,tr,tt,u,ul,var,video{margin:0;padding:0;border:0;font-size:100%;font:inherit;vertical-align:baseline}article,aside,details,figcaption,figure,footer,header,hgroup,menu,nav,section{display:block}body{line-height:1}ol,ul{list-style:none}blockquote,q{quotes:none}blockquote:after,blockquote:before,q:after,q:before{content:'';content:none}table{border-collapse:collapse;border-spacing:0}"
  },
  {
    "path": "src/main/resources/static/swagger/css/screen.css",
    "content": ".swagger-section pre code{display:block;padding:.5em;background:#f0f0f0}.swagger-section pre .clojure .built_in,.swagger-section pre .lisp .title,.swagger-section pre .nginx .title,.swagger-section pre .subst,.swagger-section pre .tag .title,.swagger-section pre code{color:#000}.swagger-section pre .addition,.swagger-section pre .aggregate,.swagger-section pre .apache .cbracket,.swagger-section pre .apache .tag,.swagger-section pre .bash .variable,.swagger-section pre .constant,.swagger-section pre .django .variable,.swagger-section pre .erlang_repl .function_or_atom,.swagger-section pre .flow,.swagger-section pre .markdown .header,.swagger-section pre .parent,.swagger-section pre .preprocessor,.swagger-section pre .ruby .symbol,.swagger-section pre .ruby .symbol .string,.swagger-section pre .rules .value,.swagger-section pre .rules .value .number,.swagger-section pre .smalltalk .class,.swagger-section pre .stream,.swagger-section pre .string,.swagger-section pre .tag .value,.swagger-section pre .template_tag,.swagger-section pre .tex .command,.swagger-section pre .tex .special,.swagger-section pre .title{color:#800}.swagger-section pre .annotation,.swagger-section pre .chunk,.swagger-section pre .comment,.swagger-section pre .diff .header,.swagger-section pre .markdown .blockquote,.swagger-section pre .template_comment{color:#888}.swagger-section pre .change,.swagger-section pre .date,.swagger-section pre .go .constant,.swagger-section pre .literal,.swagger-section pre .markdown .bullet,.swagger-section pre .markdown .link_url,.swagger-section pre .number,.swagger-section pre .regexp,.swagger-section pre .smalltalk .char,.swagger-section pre .smalltalk .symbol{color:#080}.swagger-section pre .apache .sqbracket,.swagger-section pre .array,.swagger-section pre .attr_selector,.swagger-section pre .clojure .attribute,.swagger-section pre .coffeescript .property,.swagger-section pre .decorator,.swagger-section pre .deletion,.swagger-section pre .doctype,.swagger-section pre .envvar,.swagger-section pre .erlang_repl .reserved,.swagger-section pre .filter .argument,.swagger-section pre .important,.swagger-section pre .javadoc,.swagger-section pre .label,.swagger-section pre .localvars,.swagger-section pre .markdown .link_label,.swagger-section pre .nginx .built_in,.swagger-section pre .pi,.swagger-section pre .prompt,.swagger-section pre .pseudo,.swagger-section pre .ruby .string,.swagger-section pre .shebang,.swagger-section pre .tex .formula,.swagger-section pre .vhdl .attribute{color:#88f}.swagger-section pre .aggregate,.swagger-section pre .apache .tag,.swagger-section pre .bash .variable,.swagger-section pre .built_in,.swagger-section pre .css .tag,.swagger-section pre .go .typename,.swagger-section pre .id,.swagger-section pre .javadoctag,.swagger-section pre .keyword,.swagger-section pre .markdown .strong,.swagger-section pre .phpdoc,.swagger-section pre .request,.swagger-section pre .smalltalk .class,.swagger-section pre .status,.swagger-section pre .tex .command,.swagger-section pre .title,.swagger-section pre .winutils,.swagger-section pre .yardoctag{font-weight:700}.swagger-section pre .markdown .emphasis{font-style:italic}.swagger-section pre .nginx .built_in{font-weight:400}.swagger-section pre .coffeescript .javascript,.swagger-section pre .javascript .xml,.swagger-section pre .tex .formula,.swagger-section pre .xml .cdata,.swagger-section pre .xml .css,.swagger-section pre .xml .javascript,.swagger-section pre .xml .vbscript{opacity:.5}.swagger-section .hljs{display:block;overflow-x:auto;padding:.5em;background:#f0f0f0}.swagger-section .hljs,.swagger-section .hljs-subst{color:#444}.swagger-section .hljs-attribute,.swagger-section .hljs-doctag,.swagger-section .hljs-keyword,.swagger-section .hljs-meta-keyword,.swagger-section .hljs-name,.swagger-section .hljs-selector-tag{font-weight:700}.swagger-section .hljs-addition,.swagger-section .hljs-built_in,.swagger-section .hljs-bullet,.swagger-section .hljs-code,.swagger-section .hljs-literal{color:#1f811f}.swagger-section .hljs-link,.swagger-section .hljs-regexp,.swagger-section .hljs-selector-attr,.swagger-section .hljs-selector-pseudo,.swagger-section .hljs-symbol,.swagger-section .hljs-template-variable,.swagger-section .hljs-variable{color:#bc6060}.swagger-section .hljs-deletion,.swagger-section .hljs-number,.swagger-section .hljs-quote,.swagger-section .hljs-selector-class,.swagger-section .hljs-selector-id,.swagger-section .hljs-string,.swagger-section .hljs-template-tag,.swagger-section .hljs-type{color:#800}.swagger-section .hljs-section,.swagger-section .hljs-title{color:#800;font-weight:700}.swagger-section .hljs-comment{color:#888}.swagger-section .hljs-meta{color:#2b6ea1}.swagger-section .hljs-emphasis{font-style:italic}.swagger-section .hljs-strong{font-weight:700}.swagger-section .swagger-ui-wrap{line-height:1;font-family:Droid Sans,sans-serif;min-width:760px;max-width:960px;margin-left:auto;margin-right:auto}.swagger-section .swagger-ui-wrap b,.swagger-section .swagger-ui-wrap strong{font-family:Droid Sans,sans-serif;font-weight:700}.swagger-section .swagger-ui-wrap blockquote,.swagger-section .swagger-ui-wrap q{quotes:none}.swagger-section .swagger-ui-wrap p{line-height:1.4em;padding:0 0 10px;color:#333}.swagger-section .swagger-ui-wrap blockquote:after,.swagger-section .swagger-ui-wrap blockquote:before,.swagger-section .swagger-ui-wrap q:after,.swagger-section .swagger-ui-wrap q:before{content:none}.swagger-section .swagger-ui-wrap .heading_with_menu h1,.swagger-section .swagger-ui-wrap .heading_with_menu h2,.swagger-section .swagger-ui-wrap .heading_with_menu h3,.swagger-section .swagger-ui-wrap .heading_with_menu h4,.swagger-section .swagger-ui-wrap .heading_with_menu h5,.swagger-section .swagger-ui-wrap .heading_with_menu h6{display:block;clear:none;float:left;-ms-box-sizing:border-box;box-sizing:border-box;width:60%}.swagger-section .swagger-ui-wrap table{border-collapse:collapse;border-spacing:0}.swagger-section .swagger-ui-wrap table thead tr th{padding:5px;font-size:.9em;color:#666;border-bottom:1px solid #999}.swagger-section .swagger-ui-wrap table tbody tr:last-child td{border-bottom:none}.swagger-section .swagger-ui-wrap table tbody tr.offset{background-color:#f0f0f0}.swagger-section .swagger-ui-wrap table tbody tr td{padding:6px;font-size:.9em;border-bottom:1px solid #ccc;vertical-align:top;line-height:1.3em}.swagger-section .swagger-ui-wrap ol{margin:0 0 10px;padding:0 0 0 18px;list-style-type:decimal}.swagger-section .swagger-ui-wrap ol li{padding:5px 0;font-size:.9em;color:#333}.swagger-section .swagger-ui-wrap ol,.swagger-section .swagger-ui-wrap ul{list-style:none}.swagger-section .swagger-ui-wrap h1 a,.swagger-section .swagger-ui-wrap h2 a,.swagger-section .swagger-ui-wrap h3 a,.swagger-section .swagger-ui-wrap h4 a,.swagger-section .swagger-ui-wrap h5 a,.swagger-section .swagger-ui-wrap h6 a{text-decoration:none}.swagger-section .swagger-ui-wrap h1 a:hover,.swagger-section .swagger-ui-wrap h2 a:hover,.swagger-section .swagger-ui-wrap h3 a:hover,.swagger-section .swagger-ui-wrap h4 a:hover,.swagger-section .swagger-ui-wrap h5 a:hover,.swagger-section .swagger-ui-wrap h6 a:hover{text-decoration:underline}.swagger-section .swagger-ui-wrap h1 span.divider,.swagger-section .swagger-ui-wrap h2 span.divider,.swagger-section .swagger-ui-wrap h3 span.divider,.swagger-section .swagger-ui-wrap h4 span.divider,.swagger-section .swagger-ui-wrap h5 span.divider,.swagger-section .swagger-ui-wrap h6 span.divider{color:#aaa}.swagger-section .swagger-ui-wrap a{color:#547f00}.swagger-section .swagger-ui-wrap a img{border:none}.swagger-section .swagger-ui-wrap article,.swagger-section .swagger-ui-wrap aside,.swagger-section .swagger-ui-wrap details,.swagger-section .swagger-ui-wrap figcaption,.swagger-section .swagger-ui-wrap figure,.swagger-section .swagger-ui-wrap footer,.swagger-section .swagger-ui-wrap header,.swagger-section .swagger-ui-wrap hgroup,.swagger-section .swagger-ui-wrap menu,.swagger-section .swagger-ui-wrap nav,.swagger-section .swagger-ui-wrap section,.swagger-section .swagger-ui-wrap summary{display:block}.swagger-section .swagger-ui-wrap pre{font-family:Anonymous Pro,Menlo,Consolas,Bitstream Vera Sans Mono,Courier New,monospace;background-color:#fcf6db;border:1px solid #e5e0c6;padding:10px}.swagger-section .swagger-ui-wrap pre code{line-height:1.6em;background:none}.swagger-section .swagger-ui-wrap .content>.content-type>div>label{clear:both;display:block;color:#0f6ab4;font-size:1.1em;margin:0;padding:15px 0 5px}.swagger-section .swagger-ui-wrap .content pre{font-size:12px;margin-top:5px;padding:5px}.swagger-section .swagger-ui-wrap .icon-btn{cursor:pointer}.swagger-section .swagger-ui-wrap .info_title{padding-bottom:10px;font-weight:700;font-size:25px}.swagger-section .swagger-ui-wrap .footer{margin-top:20px}.swagger-section .swagger-ui-wrap div.big p,.swagger-section .swagger-ui-wrap p.big{font-size:1em;margin-bottom:10px}.swagger-section .swagger-ui-wrap form.fullwidth ol li.numeric input,.swagger-section .swagger-ui-wrap form.fullwidth ol li.string input,.swagger-section .swagger-ui-wrap form.fullwidth ol li.text textarea,.swagger-section .swagger-ui-wrap form.fullwidth ol li.url input{width:500px!important}.swagger-section .swagger-ui-wrap .info_license,.swagger-section .swagger-ui-wrap .info_tos{padding-bottom:5px}.swagger-section .swagger-ui-wrap .message-fail{color:#c00}.swagger-section .swagger-ui-wrap .info_email,.swagger-section .swagger-ui-wrap .info_name,.swagger-section .swagger-ui-wrap .info_url{padding-bottom:5px}.swagger-section .swagger-ui-wrap .info_description{padding-bottom:10px;font-size:15px}.swagger-section .swagger-ui-wrap .markdown ol li,.swagger-section .swagger-ui-wrap .markdown ul li{padding:3px 0;line-height:1.4em;color:#333}.swagger-section .swagger-ui-wrap form.formtastic fieldset.inputs ol li.numeric input,.swagger-section .swagger-ui-wrap form.formtastic fieldset.inputs ol li.string input,.swagger-section .swagger-ui-wrap form.formtastic fieldset.inputs ol li.url input{display:block;padding:4px;width:auto;clear:both}.swagger-section .swagger-ui-wrap form.formtastic fieldset.inputs ol li.numeric input.title,.swagger-section .swagger-ui-wrap form.formtastic fieldset.inputs ol li.string input.title,.swagger-section .swagger-ui-wrap form.formtastic fieldset.inputs ol li.url input.title{font-size:1.3em}.swagger-section .swagger-ui-wrap table.fullwidth{width:100%}.swagger-section .swagger-ui-wrap .model-signature{font-family:Droid Sans,sans-serif;font-size:1em;line-height:1.5em}.swagger-section .swagger-ui-wrap .model-signature .signature-nav a{text-decoration:none;color:#aaa}.swagger-section .swagger-ui-wrap .model-signature .signature-nav a:hover{text-decoration:underline;color:#000}.swagger-section .swagger-ui-wrap .model-signature .signature-nav .selected{color:#000;text-decoration:none}.swagger-section .swagger-ui-wrap .model-signature .propType{color:#55a}.swagger-section .swagger-ui-wrap .model-signature pre:hover{background-color:#ffd}.swagger-section .swagger-ui-wrap .model-signature pre{font-size:.85em;line-height:1.2em;overflow:auto;height:200px;resize:vertical;cursor:pointer}.swagger-section .swagger-ui-wrap .model-signature ul.signature-nav{display:block;min-width:230px;margin:0;padding:0}.swagger-section .swagger-ui-wrap .model-signature ul.signature-nav li:last-child{padding-right:0;border-right:none}.swagger-section .swagger-ui-wrap .model-signature ul.signature-nav li{float:left;margin:0 5px 5px 0;padding:2px 5px 2px 0;border-right:1px solid #ddd}.swagger-section .swagger-ui-wrap .model-signature .propOpt{color:#555}.swagger-section .swagger-ui-wrap .model-signature .snippet small{font-size:.75em}.swagger-section .swagger-ui-wrap .model-signature .propOptKey{font-style:italic}.swagger-section .swagger-ui-wrap .model-signature .description .strong{font-weight:700;color:#000;font-size:.9em}.swagger-section .swagger-ui-wrap .model-signature .description div{font-size:.9em;line-height:1.5em;margin-left:1em}.swagger-section .swagger-ui-wrap .model-signature .description .stronger{font-weight:700;color:#000}.swagger-section .swagger-ui-wrap .model-signature .description .propWrap .optionsWrapper{border-spacing:0;position:absolute;background-color:#fff;border:1px solid #bbb;display:none;font-size:11px;max-width:400px;line-height:30px;color:#000;padding:5px;margin-left:10px}.swagger-section .swagger-ui-wrap .model-signature .description .propWrap .optionsWrapper th{text-align:center;background-color:#eee;border:1px solid #bbb;font-size:11px;color:#666;font-weight:700;padding:5px;line-height:15px}.swagger-section .swagger-ui-wrap .model-signature .description .propWrap .optionsWrapper .optionName{font-weight:700}.swagger-section .swagger-ui-wrap .model-signature .description .propDesc.markdown>p:first-child,.swagger-section .swagger-ui-wrap .model-signature .description .propDesc.markdown>p:last-child{display:inline}.swagger-section .swagger-ui-wrap .model-signature .description .propDesc.markdown>p:not(:first-child):before{display:block;content:''}.swagger-section .swagger-ui-wrap .model-signature .description span:last-of-type.propDesc.markdown>p:only-child{margin-right:-3px}.swagger-section .swagger-ui-wrap .model-signature .propName{font-weight:700}.swagger-section .swagger-ui-wrap .model-signature .signature-container{clear:both}.swagger-section .swagger-ui-wrap .body-textarea{width:300px;height:100px;border:1px solid #aaa}.swagger-section .swagger-ui-wrap .markdown li code,.swagger-section .swagger-ui-wrap .markdown p code{font-family:Anonymous Pro,Menlo,Consolas,Bitstream Vera Sans Mono,Courier New,monospace;background-color:#f0f0f0;color:#000;padding:1px 3px}.swagger-section .swagger-ui-wrap .required{font-weight:700}.swagger-section .swagger-ui-wrap .editor_holder{font-family:Anonymous Pro,Menlo,Consolas,Bitstream Vera Sans Mono,Courier New,monospace;font-size:.9em}.swagger-section .swagger-ui-wrap .editor_holder label{font-weight:400!important}.swagger-section .swagger-ui-wrap .editor_holder label.required{font-weight:700!important}.swagger-section .swagger-ui-wrap input.parameter{width:300px;border:1px solid #aaa}.swagger-section .swagger-ui-wrap h1{color:#000;font-size:1.5em;line-height:1.3em;padding:10px 0;font-family:Droid Sans,sans-serif;font-weight:700}.swagger-section .swagger-ui-wrap .heading_with_menu{float:none;clear:both;overflow:hidden;display:block}.swagger-section .swagger-ui-wrap .heading_with_menu ul{display:block;clear:none;float:right;-ms-box-sizing:border-box;box-sizing:border-box;margin-top:10px}.swagger-section .swagger-ui-wrap h2{color:#000;font-size:1.3em;padding:10px 0}.swagger-section .swagger-ui-wrap h2 a{color:#000}.swagger-section .swagger-ui-wrap h2 span.sub{font-size:.7em;color:#999;font-style:italic}.swagger-section .swagger-ui-wrap h2 span.sub a{color:#777}.swagger-section .swagger-ui-wrap span.weak{color:#666}.swagger-section .swagger-ui-wrap .message-success{color:#89bf04}.swagger-section .swagger-ui-wrap caption,.swagger-section .swagger-ui-wrap td,.swagger-section .swagger-ui-wrap th{text-align:left;font-weight:400;vertical-align:middle}.swagger-section .swagger-ui-wrap .code{font-family:Anonymous Pro,Menlo,Consolas,Bitstream Vera Sans Mono,Courier New,monospace}.swagger-section .swagger-ui-wrap form.formtastic fieldset.inputs ol li.text textarea{font-family:Droid Sans,sans-serif;height:250px;padding:4px;display:block;clear:both}.swagger-section .swagger-ui-wrap form.formtastic fieldset.inputs ol li.select select{display:block;clear:both}.swagger-section .swagger-ui-wrap form.formtastic fieldset.inputs ol li.boolean{float:none;clear:both;overflow:hidden;display:block}.swagger-section .swagger-ui-wrap form.formtastic fieldset.inputs ol li.boolean label{display:block;float:left;clear:none;margin:0;padding:0}.swagger-section .swagger-ui-wrap form.formtastic fieldset.inputs ol li.boolean input{display:block;float:left;clear:none;margin:0 5px 0 0}.swagger-section .swagger-ui-wrap form.formtastic fieldset.inputs ol li.required label{color:#000}.swagger-section .swagger-ui-wrap form.formtastic fieldset.inputs ol li label{display:block;clear:both;width:auto;padding:0 0 3px;color:#666}.swagger-section .swagger-ui-wrap form.formtastic fieldset.inputs ol li label abbr{padding-left:3px;color:#888}.swagger-section .swagger-ui-wrap form.formtastic fieldset.inputs ol li p.inline-hints{margin-left:0;font-style:italic;font-size:.9em;margin:0}.swagger-section .swagger-ui-wrap form.formtastic fieldset.buttons{margin:0;padding:0}.swagger-section .swagger-ui-wrap span.blank,.swagger-section .swagger-ui-wrap span.empty{color:#888;font-style:italic}.swagger-section .swagger-ui-wrap .markdown h3{color:#547f00}.swagger-section .swagger-ui-wrap .markdown h4{color:#666}.swagger-section .swagger-ui-wrap .markdown pre{font-family:Anonymous Pro,Menlo,Consolas,Bitstream Vera Sans Mono,Courier New,monospace;background-color:#fcf6db;border:1px solid #e5e0c6;padding:10px;margin:0 0 10px}.swagger-section .swagger-ui-wrap .markdown pre code{line-height:1.6em;overflow:auto}.swagger-section .swagger-ui-wrap div.gist{margin:20px 0 25px!important}.swagger-section .swagger-ui-wrap ul#resources{font-family:Droid Sans,sans-serif;font-size:.9em}.swagger-section .swagger-ui-wrap ul#resources li.resource{border-bottom:1px solid #ddd}.swagger-section .swagger-ui-wrap ul#resources li.resource.active div.heading h2 a,.swagger-section .swagger-ui-wrap ul#resources li.resource:hover div.heading h2 a{color:#000}.swagger-section .swagger-ui-wrap ul#resources li.resource.active div.heading ul.options li a,.swagger-section .swagger-ui-wrap ul#resources li.resource:hover div.heading ul.options li a{color:#555}.swagger-section .swagger-ui-wrap ul#resources li.resource:last-child{border-bottom:none}.swagger-section .swagger-ui-wrap ul#resources li.resource div.heading{border:1px solid transparent;float:none;clear:both;overflow:hidden;display:block}.swagger-section .swagger-ui-wrap ul#resources li.resource div.heading ul.options{overflow:hidden;padding:0;display:block;clear:none;float:right;margin:14px 10px 0 0}.swagger-section .swagger-ui-wrap ul#resources li.resource div.heading ul.options li{float:left;clear:none;margin:0;padding:2px 10px;border-right:1px solid #ddd;color:#666;font-size:.9em}.swagger-section .swagger-ui-wrap ul#resources li.resource div.heading ul.options li a{color:#aaa;text-decoration:none}.swagger-section .swagger-ui-wrap ul#resources li.resource div.heading ul.options li a:hover{text-decoration:underline;color:#000}.swagger-section .swagger-ui-wrap ul#resources li.resource div.heading ul.options li a.active,.swagger-section .swagger-ui-wrap ul#resources li.resource div.heading ul.options li a:active,.swagger-section .swagger-ui-wrap ul#resources li.resource div.heading ul.options li a:hover{text-decoration:underline}.swagger-section .swagger-ui-wrap ul#resources li.resource div.heading ul.options li.first,.swagger-section .swagger-ui-wrap ul#resources li.resource div.heading ul.options li:first-child{padding-left:0}.swagger-section .swagger-ui-wrap ul#resources li.resource div.heading ul.options li.last,.swagger-section .swagger-ui-wrap ul#resources li.resource div.heading ul.options li:last-child{padding-right:0;border-right:none}.swagger-section .swagger-ui-wrap ul#resources li.resource div.heading ul.options.first,.swagger-section .swagger-ui-wrap ul#resources li.resource div.heading ul.options:first-child{padding-left:0}.swagger-section .swagger-ui-wrap ul#resources li.resource div.heading h2{color:#999;padding-left:0;display:block;clear:none;float:left;font-family:Droid Sans,sans-serif;font-weight:700}.swagger-section .swagger-ui-wrap ul#resources li.resource div.heading h2 a{color:#999}.swagger-section .swagger-ui-wrap ul#resources li.resource div.heading h2 a:hover{color:#000}.swagger-section .swagger-ui-wrap ul#resources li.resource ul.endpoints li.endpoint ul.operations li.operation{float:none;clear:both;overflow:hidden;display:block;margin:0 0 10px;padding:0}.swagger-section .swagger-ui-wrap ul#resources li.resource ul.endpoints li.endpoint ul.operations li.operation div.heading{float:none;clear:both;overflow:hidden;display:block;margin:0;padding:0}.swagger-section .swagger-ui-wrap ul#resources li.resource ul.endpoints li.endpoint ul.operations li.operation div.heading h3{display:block;clear:none;float:left;width:auto;margin:0;padding:0;line-height:1.1em;color:#000}.swagger-section .swagger-ui-wrap ul#resources li.resource ul.endpoints li.endpoint ul.operations li.operation div.heading h3 span.path{padding-left:10px}.swagger-section .swagger-ui-wrap ul#resources li.resource ul.endpoints li.endpoint ul.operations li.operation div.heading h3 span.path a{color:#000;text-decoration:none}.swagger-section .swagger-ui-wrap ul#resources li.resource ul.endpoints li.endpoint ul.operations li.operation div.heading h3 span.path a.toggleOperation.deprecated{text-decoration:line-through}.swagger-section .swagger-ui-wrap ul#resources li.resource ul.endpoints li.endpoint ul.operations li.operation div.heading h3 span.path a:hover{text-decoration:underline}.swagger-section .swagger-ui-wrap ul#resources li.resource ul.endpoints li.endpoint ul.operations li.operation div.heading h3 span.http_method a{text-transform:uppercase;text-decoration:none;color:#fff;display:inline-block;width:50px;font-size:.7em;text-align:center;padding:7px 0 4px;border-radius:2px}.swagger-section .swagger-ui-wrap ul#resources li.resource ul.endpoints li.endpoint ul.operations li.operation div.heading h3 span{margin:0;padding:0}.swagger-section .swagger-ui-wrap ul#resources li.resource ul.endpoints li.endpoint ul.operations li.operation div.heading ul.options{overflow:hidden;padding:0;display:block;clear:none;float:right;margin:6px 10px 0 0}.swagger-section .swagger-ui-wrap ul#resources li.resource ul.endpoints li.endpoint ul.operations li.operation div.heading ul.options li{float:left;clear:none;margin:0;padding:2px 10px;font-size:.9em}.swagger-section .swagger-ui-wrap ul#resources li.resource ul.endpoints li.endpoint ul.operations li.operation div.heading ul.options li a{text-decoration:none}.swagger-section .swagger-ui-wrap ul#resources li.resource ul.endpoints li.endpoint ul.operations li.operation div.heading ul.options li a .markdown p{color:inherit;padding:0;line-height:inherit}.swagger-section .swagger-ui-wrap ul#resources li.resource ul.endpoints li.endpoint ul.operations li.operation div.heading ul.options li a .nickname{color:#aaa;padding:0;line-height:inherit}.swagger-section .swagger-ui-wrap ul#resources li.resource ul.endpoints li.endpoint ul.operations li.operation div.heading ul.options li.access{color:#000}.swagger-section .swagger-ui-wrap ul#resources li.resource ul.endpoints li.endpoint ul.operations li.operation div.content{border-top:none;padding:10px;border-bottom-left-radius:6px;border-bottom-right-radius:6px;margin:0 0 20px}.swagger-section .swagger-ui-wrap ul#resources li.resource ul.endpoints li.endpoint ul.operations li.operation div.content h4{font-size:1.1em;margin:0;padding:15px 0 5px}.swagger-section .swagger-ui-wrap ul#resources li.resource ul.endpoints li.endpoint ul.operations li.operation div.content div.sandbox_header{float:none;clear:both;overflow:hidden;display:block}.swagger-section .swagger-ui-wrap ul#resources li.resource ul.endpoints li.endpoint ul.operations li.operation div.content div.sandbox_header a{padding:4px 0 0 10px;display:inline-block;font-size:.9em}.swagger-section .swagger-ui-wrap ul#resources li.resource ul.endpoints li.endpoint ul.operations li.operation div.content div.sandbox_header input.submit{display:block;clear:none;float:left;padding:6px 8px}.swagger-section .swagger-ui-wrap ul#resources li.resource ul.endpoints li.endpoint ul.operations li.operation div.content div.sandbox_header span.response_throbber{background-image:url(../images/throbber.gif);width:128px;height:16px;display:block;clear:none;float:right}.swagger-section .swagger-ui-wrap ul#resources li.resource ul.endpoints li.endpoint ul.operations li.operation div.content form input[type=text].error{outline:2px solid #000;outline-color:#c00}.swagger-section .swagger-ui-wrap ul#resources li.resource ul.endpoints li.endpoint ul.operations li.operation div.content form select[name=parameterContentType]{max-width:300px}.swagger-section .swagger-ui-wrap ul#resources li.resource ul.endpoints li.endpoint ul.operations li.operation div.content div.response div.block pre{font-family:Anonymous Pro,Menlo,Consolas,Bitstream Vera Sans Mono,Courier New,monospace;padding:10px;font-size:.9em;max-height:400px;overflow-y:auto}.swagger-section .swagger-ui-wrap ul#resources li.resource ul.endpoints li.endpoint ul.operations li.operation.put div.heading{background-color:#f9f2e9;border:1px solid #f0e0ca}.swagger-section .swagger-ui-wrap ul#resources li.resource ul.endpoints li.endpoint ul.operations li.operation.put div.heading h3 span.http_method a{background-color:#c5862b}.swagger-section .swagger-ui-wrap ul#resources li.resource ul.endpoints li.endpoint ul.operations li.operation.put div.heading ul.options li{border-right:1px solid #ddd;border-right-color:#f0e0ca;color:#c5862b}.swagger-section .swagger-ui-wrap ul#resources li.resource ul.endpoints li.endpoint ul.operations li.operation.put div.heading ul.options li a{color:#c5862b}.swagger-section .swagger-ui-wrap ul#resources li.resource ul.endpoints li.endpoint ul.operations li.operation.put div.content{background-color:#faf5ee;border:1px solid #f0e0ca}.swagger-section .swagger-ui-wrap ul#resources li.resource ul.endpoints li.endpoint ul.operations li.operation.put div.content h4{color:#c5862b}.swagger-section .swagger-ui-wrap ul#resources li.resource ul.endpoints li.endpoint ul.operations li.operation.put div.content div.sandbox_header a{color:#dcb67f}.swagger-section .swagger-ui-wrap ul#resources li.resource ul.endpoints li.endpoint ul.operations li.operation.head div.heading{background-color:#fcffcd;border:1px solid #000;border-color:#ffd20f}.swagger-section .swagger-ui-wrap ul#resources li.resource ul.endpoints li.endpoint ul.operations li.operation.head div.heading h3 span.http_method a{text-transform:uppercase;background-color:#ffd20f}.swagger-section .swagger-ui-wrap ul#resources li.resource ul.endpoints li.endpoint ul.operations li.operation.head div.heading ul.options li{border-right:1px solid #ddd;border-right-color:#ffd20f;color:#ffd20f}.swagger-section .swagger-ui-wrap ul#resources li.resource ul.endpoints li.endpoint ul.operations li.operation.head div.heading ul.options li a{color:#ffd20f}.swagger-section .swagger-ui-wrap ul#resources li.resource ul.endpoints li.endpoint ul.operations li.operation.head div.content{background-color:#fcffcd;border:1px solid #000;border-color:#ffd20f}.swagger-section .swagger-ui-wrap ul#resources li.resource ul.endpoints li.endpoint ul.operations li.operation.head div.content h4{color:#ffd20f}.swagger-section .swagger-ui-wrap ul#resources li.resource ul.endpoints li.endpoint ul.operations li.operation.head div.content div.sandbox_header a{color:#6fc992}.swagger-section .swagger-ui-wrap ul#resources li.resource ul.endpoints li.endpoint ul.operations li.operation.delete div.heading{background-color:#f5e8e8;border:1px solid #e8c6c7}.swagger-section .swagger-ui-wrap ul#resources li.resource ul.endpoints li.endpoint ul.operations li.operation.delete div.heading h3 span.http_method a{text-transform:uppercase;background-color:#a41e22}.swagger-section .swagger-ui-wrap ul#resources li.resource ul.endpoints li.endpoint ul.operations li.operation.delete div.heading ul.options li{border-right:1px solid #ddd;border-right-color:#e8c6c7;color:#a41e22}.swagger-section .swagger-ui-wrap ul#resources li.resource ul.endpoints li.endpoint ul.operations li.operation.delete div.heading ul.options li a{color:#a41e22}.swagger-section .swagger-ui-wrap ul#resources li.resource ul.endpoints li.endpoint ul.operations li.operation.delete div.content{background-color:#f7eded;border:1px solid #e8c6c7}.swagger-section .swagger-ui-wrap ul#resources li.resource ul.endpoints li.endpoint ul.operations li.operation.delete div.content h4{color:#a41e22}.swagger-section .swagger-ui-wrap ul#resources li.resource ul.endpoints li.endpoint ul.operations li.operation.delete div.content div.sandbox_header a{color:#c8787a}.swagger-section .swagger-ui-wrap ul#resources li.resource ul.endpoints li.endpoint ul.operations li.operation.post div.heading{background-color:#e7f6ec;border:1px solid #c3e8d1}.swagger-section .swagger-ui-wrap ul#resources li.resource ul.endpoints li.endpoint ul.operations li.operation.post div.heading h3 span.http_method a{background-color:#10a54a}.swagger-section .swagger-ui-wrap ul#resources li.resource ul.endpoints li.endpoint ul.operations li.operation.post div.heading ul.options li{border-right:1px solid #ddd;border-right-color:#c3e8d1;color:#10a54a}.swagger-section .swagger-ui-wrap ul#resources li.resource ul.endpoints li.endpoint ul.operations li.operation.post div.heading ul.options li a{color:#10a54a}.swagger-section .swagger-ui-wrap ul#resources li.resource ul.endpoints li.endpoint ul.operations li.operation.post div.content{background-color:#ebf7f0;border:1px solid #c3e8d1}.swagger-section .swagger-ui-wrap ul#resources li.resource ul.endpoints li.endpoint ul.operations li.operation.post div.content h4{color:#10a54a}.swagger-section .swagger-ui-wrap ul#resources li.resource ul.endpoints li.endpoint ul.operations li.operation.post div.content div.sandbox_header a{color:#6fc992}.swagger-section .swagger-ui-wrap ul#resources li.resource ul.endpoints li.endpoint ul.operations li.operation.patch div.heading{background-color:#fce9e3;border:1px solid #f5d5c3}.swagger-section .swagger-ui-wrap ul#resources li.resource ul.endpoints li.endpoint ul.operations li.operation.patch div.heading h3 span.http_method a{background-color:#d38042}.swagger-section .swagger-ui-wrap ul#resources li.resource ul.endpoints li.endpoint ul.operations li.operation.patch div.heading ul.options li{border-right:1px solid #ddd;border-right-color:#f0cecb;color:#d38042}.swagger-section .swagger-ui-wrap ul#resources li.resource ul.endpoints li.endpoint ul.operations li.operation.patch div.heading ul.options li a{color:#d38042}.swagger-section .swagger-ui-wrap ul#resources li.resource ul.endpoints li.endpoint ul.operations li.operation.patch div.content{background-color:#faf0ef;border:1px solid #f0cecb}.swagger-section .swagger-ui-wrap ul#resources li.resource ul.endpoints li.endpoint ul.operations li.operation.patch div.content h4{color:#d38042}.swagger-section .swagger-ui-wrap ul#resources li.resource ul.endpoints li.endpoint ul.operations li.operation.patch div.content div.sandbox_header a{color:#dcb67f}.swagger-section .swagger-ui-wrap ul#resources li.resource ul.endpoints li.endpoint ul.operations li.operation.get div.heading{background-color:#e7f0f7;border:1px solid #c3d9ec}.swagger-section .swagger-ui-wrap ul#resources li.resource ul.endpoints li.endpoint ul.operations li.operation.get div.heading h3 span.http_method a{background-color:#0f6ab4}.swagger-section .swagger-ui-wrap ul#resources li.resource ul.endpoints li.endpoint ul.operations li.operation.get div.heading ul.options li{border-right:1px solid #ddd;border-right-color:#c3d9ec;color:#0f6ab4}.swagger-section .swagger-ui-wrap ul#resources li.resource ul.endpoints li.endpoint ul.operations li.operation.get div.heading ul.options li a{color:#0f6ab4}.swagger-section .swagger-ui-wrap ul#resources li.resource ul.endpoints li.endpoint ul.operations li.operation.get div.content{background-color:#ebf3f9;border:1px solid #c3d9ec}.swagger-section .swagger-ui-wrap ul#resources li.resource ul.endpoints li.endpoint ul.operations li.operation.get div.content h4{color:#0f6ab4}.swagger-section .swagger-ui-wrap ul#resources li.resource ul.endpoints li.endpoint ul.operations li.operation.get div.content div.sandbox_header a{color:#6fa5d2}.swagger-section .swagger-ui-wrap ul#resources li.resource ul.endpoints li.endpoint ul.operations li.operation.options div.heading{background-color:#e7f0f7;border:1px solid #c3d9ec}.swagger-section .swagger-ui-wrap ul#resources li.resource ul.endpoints li.endpoint ul.operations li.operation.options div.heading h3 span.http_method a{background-color:#0f6ab4}.swagger-section .swagger-ui-wrap ul#resources li.resource ul.endpoints li.endpoint ul.operations li.operation.options div.heading ul.options li{border-right:1px solid #ddd;border-right-color:#c3d9ec;color:#0f6ab4}.swagger-section .swagger-ui-wrap ul#resources li.resource ul.endpoints li.endpoint ul.operations li.operation.options div.heading ul.options li a{color:#0f6ab4}.swagger-section .swagger-ui-wrap ul#resources li.resource ul.endpoints li.endpoint ul.operations li.operation.options div.content{background-color:#ebf3f9;border:1px solid #c3d9ec}.swagger-section .swagger-ui-wrap ul#resources li.resource ul.endpoints li.endpoint ul.operations li.operation.options div.content h4{color:#0f6ab4}.swagger-section .swagger-ui-wrap ul#resources li.resource ul.endpoints li.endpoint ul.operations li.operation.options div.content div.sandbox_header a{color:#6fa5d2}.swagger-section .swagger-ui-wrap ul#resources li.resource ul.endpoints li.endpoint ul.operations li.operation.delete div.content,.swagger-section .swagger-ui-wrap ul#resources li.resource ul.endpoints li.endpoint ul.operations li.operation.get div.content,.swagger-section .swagger-ui-wrap ul#resources li.resource ul.endpoints li.endpoint ul.operations li.operation.head div.content,.swagger-section .swagger-ui-wrap ul#resources li.resource ul.endpoints li.endpoint ul.operations li.operation.patch div.content,.swagger-section .swagger-ui-wrap ul#resources li.resource ul.endpoints li.endpoint ul.operations li.operation.post div.content,.swagger-section .swagger-ui-wrap ul#resources li.resource ul.endpoints li.endpoint ul.operations li.operation.put div.content{border-top:none}.swagger-section .swagger-ui-wrap ul#resources li.resource ul.endpoints li.endpoint ul.operations li.operation.delete div.heading ul.options li.last,.swagger-section .swagger-ui-wrap ul#resources li.resource ul.endpoints li.endpoint ul.operations li.operation.delete div.heading ul.options li:last-child,.swagger-section .swagger-ui-wrap ul#resources li.resource ul.endpoints li.endpoint ul.operations li.operation.get div.heading ul.options li.last,.swagger-section .swagger-ui-wrap ul#resources li.resource ul.endpoints li.endpoint ul.operations li.operation.get div.heading ul.options li:last-child,.swagger-section .swagger-ui-wrap ul#resources li.resource ul.endpoints li.endpoint ul.operations li.operation.head div.heading ul.options li.last,.swagger-section .swagger-ui-wrap ul#resources li.resource ul.endpoints li.endpoint ul.operations li.operation.head div.heading ul.options li:last-child,.swagger-section .swagger-ui-wrap ul#resources li.resource ul.endpoints li.endpoint ul.operations li.operation.patch div.heading ul.options li.last,.swagger-section .swagger-ui-wrap ul#resources li.resource ul.endpoints li.endpoint ul.operations li.operation.patch div.heading ul.options li:last-child,.swagger-section .swagger-ui-wrap ul#resources li.resource ul.endpoints li.endpoint ul.operations li.operation.post div.heading ul.options li.last,.swagger-section .swagger-ui-wrap ul#resources li.resource ul.endpoints li.endpoint ul.operations li.operation.post div.heading ul.options li:last-child,.swagger-section .swagger-ui-wrap ul#resources li.resource ul.endpoints li.endpoint ul.operations li.operation.put div.heading ul.options li.last,.swagger-section .swagger-ui-wrap ul#resources li.resource ul.endpoints li.endpoint ul.operations li.operation.put div.heading ul.options li:last-child{padding-right:0;border-right:none}.swagger-section .swagger-ui-wrap ul#resources li.resource ul.endpoints li.endpoint ul.operations ul.options li a.active,.swagger-section .swagger-ui-wrap ul#resources li.resource ul.endpoints li.endpoint ul.operations ul.options li a:active,.swagger-section .swagger-ui-wrap ul#resources li.resource ul.endpoints li.endpoint ul.operations ul.options li a:hover{text-decoration:underline}.swagger-section .swagger-ui-wrap ul#resources li.resource ul.endpoints li.endpoint ul.operations.first,.swagger-section .swagger-ui-wrap ul#resources li.resource ul.endpoints li.endpoint ul.operations:first-child,.swagger-section .swagger-ui-wrap ul#resources li.resource ul.endpoints li.endpoint ul.operations ul.options li.first,.swagger-section .swagger-ui-wrap ul#resources li.resource ul.endpoints li.endpoint ul.operations ul.options li:first-child{padding-left:0}.swagger-section .swagger-ui-wrap p#colophon{margin:0 15px 40px;padding:10px 0;font-size:.8em;border-top:1px solid #ddd;font-family:Droid Sans,sans-serif;color:#999;font-style:italic}.swagger-section .swagger-ui-wrap p#colophon a{text-decoration:none;color:#547f00}.swagger-section .swagger-ui-wrap h3{color:#000;font-size:1.1em;padding:10px 0}.swagger-section .swagger-ui-wrap .markdown ol,.swagger-section .swagger-ui-wrap .markdown ul{font-family:Droid Sans,sans-serif;margin:5px 0 10px;padding:0 0 0 18px;list-style-type:disc}.swagger-section .swagger-ui-wrap form.form_box{background-color:#ebf3f9;border:1px solid #c3d9ec;padding:10px}.swagger-section .swagger-ui-wrap form.form_box label{color:#0f6ab4!important}.swagger-section .swagger-ui-wrap form.form_box input[type=submit]{display:block;padding:10px}.swagger-section .swagger-ui-wrap form.form_box p.weak{font-size:.8em}.swagger-section .swagger-ui-wrap form.form_box p{font-size:.9em;padding:0 0 15px;color:#7e7b6d}.swagger-section .swagger-ui-wrap form.form_box p a{color:#646257}.swagger-section .swagger-ui-wrap form.form_box p strong{color:#000}.swagger-section .swagger-ui-wrap .operation-status td.markdown>p:last-child{padding-bottom:0}.swagger-section .title{font-style:bold}.swagger-section .secondary_form{display:none}.swagger-section .main_image{display:block;margin-left:auto;margin-right:auto}.swagger-section .oauth_body{margin-left:100px;margin-right:100px}.swagger-section .oauth_submit{text-align:center;display:inline-block}.swagger-section .authorize-wrapper{margin:15px 0 10px}.swagger-section .authorize-wrapper_operation{float:right}.swagger-section .authorize__btn:hover{text-decoration:underline;cursor:pointer}.swagger-section .authorize__btn_operation:hover .authorize-scopes{display:block}.swagger-section .authorize-scopes{position:absolute;margin-top:20px;background:#fff;border:1px solid #ccc;border-radius:5px;display:none;font-size:13px;max-width:300px;line-height:30px;color:#000;padding:5px}.swagger-section .authorize-scopes .authorize__scope{text-decoration:none}.swagger-section .authorize__btn_operation{height:18px;vertical-align:middle;display:inline-block;background:url(../images/explorer_icons.png) no-repeat}.swagger-section .authorize__btn_operation_login{background-position:0 0;width:18px;margin-top:-6px;margin-left:4px}.swagger-section .authorize__btn_operation_logout{background-position:-30px 0;width:18px;margin-top:-6px;margin-left:4px}.swagger-section #auth_container{color:#fff;display:inline-block;border:none;padding:5px;width:87px;height:13px}.swagger-section #auth_container .authorize__btn{color:#fff}.swagger-section .auth_container{padding:0 0 10px;margin-bottom:5px;border-bottom:1px solid #ccc;font-size:.9em}.swagger-section .auth_container .auth__title{color:#547f00;font-size:1.2em}.swagger-section .auth_container .basic_auth__label{display:inline-block;width:60px}.swagger-section .auth_container .auth__description{color:#999;margin-bottom:5px}.swagger-section .auth_container .auth__button{margin-top:10px;height:30px}.swagger-section .auth_container .key_auth__field{margin:5px 0}.swagger-section .auth_container .key_auth__label{display:inline-block;width:60px}.swagger-section .api-popup-dialog{position:absolute;display:none}.swagger-section .api-popup-dialog-wrapper{z-index:2;width:500px;background:#fff;padding:20px;border:1px solid #ccc;border-radius:5px;font-size:13px;color:#777;position:fixed;top:50%;left:50%;transform:translate(-50%,-50%)}.swagger-section .api-popup-dialog-shadow{position:fixed;top:0;left:0;width:100%;height:100%;opacity:.2;background-color:gray;z-index:1}.swagger-section .api-popup-dialog .api-popup-title{font-size:24px;padding:10px 0}.swagger-section .api-popup-dialog .error-msg{padding-left:5px;padding-bottom:5px}.swagger-section .api-popup-dialog .api-popup-content{max-height:500px;overflow-y:auto}.swagger-section .api-popup-dialog .api-popup-authbtn,.swagger-section .api-popup-dialog .api-popup-cancel{height:30px}.swagger-section .api-popup-scopes{padding:10px 20px}.swagger-section .api-popup-scopes li{padding:5px 0;line-height:20px}.swagger-section .api-popup-scopes li input{position:relative;top:2px}.swagger-section .api-popup-scopes .api-scope-desc{padding-left:20px;font-style:italic}.swagger-section .api-popup-actions{padding-top:10px}.swagger-section fieldset{padding-bottom:10px;padding-left:20px}.swagger-section .access,.swagger-section .auth{float:right}.swagger-section .api-ic{height:18px;vertical-align:middle;display:inline-block;background:url(../images/explorer_icons.png) no-repeat}.swagger-section .api-ic .api_information_panel{position:relative;margin-top:20px;margin-left:-5px;background:#fff;border:1px solid #ccc;border-radius:5px;display:none;font-size:13px;max-width:300px;line-height:30px;color:#000;padding:5px}.swagger-section .api-ic .api_information_panel p .api-msg-enabled{color:green}.swagger-section .api-ic .api_information_panel p .api-msg-disabled{color:red}.swagger-section .api-ic:hover .api_information_panel{position:absolute;display:block}.swagger-section .ic-info{background-position:0 0;width:18px;margin-top:-6px;margin-left:4px}.swagger-section .ic-warning{background-position:-60px 0;width:18px;margin-top:-6px;margin-left:4px}.swagger-section .ic-error{background-position:-30px 0;width:18px;margin-top:-6px;margin-left:4px}.swagger-section .ic-off{background-position:-90px 0;width:58px;margin-top:-4px;cursor:pointer}.swagger-section .ic-on{background-position:-160px 0;width:58px;margin-top:-4px;cursor:pointer}.swagger-section #header{background-color:#89bf04;padding:9px 14px 19px;height:23px;min-width:775px}.swagger-section #input_baseUrl{width:400px}.swagger-section #api_selector{display:block;clear:none;float:right}.swagger-section #api_selector .input{display:inline-block;clear:none;margin:0 10px 0 0}.swagger-section #api_selector input{font-size:.9em;padding:3px;margin:0}.swagger-section #input_apiKey{width:200px}.swagger-section #auth_container .authorize__btn,.swagger-section #explore{display:block;text-decoration:none;font-weight:700;padding:6px 8px;font-size:.9em;color:#fff;background-color:#547f00;border-radius:4px}.swagger-section #auth_container .authorize__btn:hover,.swagger-section #explore:hover{background-color:#547f00}.swagger-section #header #logo{font-size:1.5em;font-weight:700;text-decoration:none;color:#fff}.swagger-section #header #logo .logo__img{display:block;float:left;margin-top:2px}.swagger-section #header #logo .logo__title{display:inline-block;padding:5px 0 0 10px}.swagger-section #content_message{margin:10px 15px;font-style:italic;color:#999}.swagger-section #message-bar{min-height:30px;text-align:center;padding-top:10px}.swagger-section .swagger-collapse:before{content:\"-\"}.swagger-section .swagger-expand:before{content:\"+\"}.swagger-section .error{outline-color:#c00;background-color:#f2dede}"
  },
  {
    "path": "src/main/resources/static/swagger/css/style.css",
    "content": ".swagger-section #header a#logo{font-size:1.5em;font-weight:700;text-decoration:none;padding:20px 0 20px 40px}#text-head{font-size:80px;font-family:Roboto,sans-serif;color:#fff;float:right;margin-right:20%}.navbar-fixed-top .navbar-brand,.navbar-fixed-top .navbar-nav,.navbar-header{height:auto}.navbar-inverse{background-color:#000;border-color:#000}#navbar-brand{margin-left:20%}.navtext{font-size:10px}.h1,h1{font-size:60px}.navbar-default .navbar-header .navbar-brand{color:#a2dfee}.swagger-section .swagger-ui-wrap ul#resources li.resource div.heading h2 a{color:#393939;font-family:Arvo,serif;font-size:1.5em}.swagger-section .swagger-ui-wrap ul#resources li.resource div.heading h2 a:hover{color:#000}.swagger-section .swagger-ui-wrap ul#resources li.resource div.heading h2{color:#525252;padding-left:0;display:block;clear:none;float:left;font-family:Arvo,serif;font-weight:700}.navbar-default .navbar-collapse,.navbar-default .navbar-form{border-color:#0a0a0a}.container1{width:1500px;margin:auto;margin-top:0;background-repeat:no-repeat;background-position:-40px -20px;margin-bottom:210px}.container-inner{width:1200px;margin:auto;background-color:hsla(192,8%,88%,.75);padding-bottom:40px;padding-top:40px;border-radius:15px}.header-content{padding:0;width:1000px}.title1{font-size:80px;font-family:Vollkorn,serif;color:#404040;text-align:center;padding-top:40px;padding-bottom:100px}#icon{margin-top:-18px}.subtext{font-size:25px;font-style:italic;color:#08b;text-align:right;padding-right:250px}.bg-primary{background-color:#00468b}.navbar-default .nav>li>a,.navbar-default .nav>li>a:focus,.navbar-default .nav>li>a:focus:hover,.navbar-default .nav>li>a:hover{color:#08b}.text-faded{font-size:25px;font-family:Vollkorn,serif}.section-heading{font-family:Vollkorn,serif;font-size:45px;padding-bottom:10px}hr{border-color:#00468b;padding-bottom:10px}.description{margin-top:20px;padding-bottom:200px}.description li{font-family:Vollkorn,serif;font-size:25px;color:#525252;margin-left:28%;padding-top:5px}.gap{margin-top:200px}.troubleshootingtext{color:hsla(0,0%,100%,.7);padding-left:30%}.troubleshootingtext li{list-style-type:circle;font-size:25px;padding-bottom:5px}.overlay{position:absolute;top:0;left:0;width:100%;height:100%;z-index:1}.block.response_body.json:hover{cursor:pointer}.backdrop{color:blue}#myModal{height:100%}.modal-backdrop{bottom:0;position:fixed}.curl{padding:10px;font-family:Anonymous Pro,Menlo,Consolas,Bitstream Vera Sans Mono,Courier New,monospace;font-size:.9em;max-height:400px;margin-top:5px;overflow-y:auto;background-color:#fcf6db;border:1px solid #e5e0c6;border-radius:4px}.curl_title{font-size:1.1em;margin:0;padding:15px 0 5px;font-family:Open Sans,Helvetica Neue,Arial,sans-serif;font-weight:500;line-height:1.1}.footer{display:none}.swagger-section .swagger-ui-wrap h2{padding:0}h2{margin:0;margin-bottom:5px}.markdown p,.swagger-section .swagger-ui-wrap .code{font-size:15px;font-family:Arvo,serif}.swagger-section .swagger-ui-wrap b{font-family:Arvo,serif}#signin:hover{cursor:pointer}.dropdown-menu{padding:15px}.navbar-right .dropdown-menu{left:0;right:auto}#signinbutton{width:100%;height:32px;font-size:13px;font-weight:700;color:#08b}.navbar-default .nav>li .details{color:#000;text-transform:none;font-size:15px;font-weight:400;font-family:Open Sans,sans-serif;font-style:italic;line-height:20px;top:-2px}.navbar-default .nav>li .details:hover{color:#000}#signout{width:100%;height:32px;font-size:13px;font-weight:700;color:#08b}"
  },
  {
    "path": "src/main/resources/static/swagger/css/typography.css",
    "content": ""
  },
  {
    "path": "src/main/resources/static/swagger/index.html",
    "content": "<!DOCTYPE html>\n<html>\n<head>\n  <meta charset=\"UTF-8\">\n  <meta http-equiv=\"x-ua-compatible\" content=\"IE=edge\">\n  <title>接口文档 - 森多邦</title>\n  <link rel=\"icon\" type=\"image/png\" href=\"/favicon.ico\" />\n  <link href='css/typography.css' media='screen' rel='stylesheet' type='text/css'/>\n  <link href='css/reset.css' media='screen' rel='stylesheet' type='text/css'/>\n  <link href='css/screen.css' media='screen' rel='stylesheet' type='text/css'/>\n  <link href='css/reset.css' media='print' rel='stylesheet' type='text/css'/>\n  <link href='css/print.css' media='print' rel='stylesheet' type='text/css'/>\n\n  <script src='lib/object-assign-pollyfill.js' type='text/javascript'></script>\n  <script src='lib/jquery-1.8.0.min.js' type='text/javascript'></script>\n  <script src='lib/jquery.slideto.min.js' type='text/javascript'></script>\n  <script src='lib/jquery.wiggle.min.js' type='text/javascript'></script>\n  <script src='lib/jquery.ba-bbq.min.js' type='text/javascript'></script>\n  <script src='lib/handlebars-4.0.5.js' type='text/javascript'></script>\n  <script src='lib/lodash.min.js' type='text/javascript'></script>\n  <script src='lib/backbone-min.js' type='text/javascript'></script>\n  <script src='swagger-ui.js' type='text/javascript'></script>\n  <script src='lib/highlight.9.1.0.pack.js' type='text/javascript'></script>\n  <script src='lib/highlight.9.1.0.pack_extended.js' type='text/javascript'></script>\n  <script src='lib/jsoneditor.min.js' type='text/javascript'></script>\n  <script src='lib/marked.js' type='text/javascript'></script>\n  <script src='lib/swagger-oauth.js' type='text/javascript'></script>\n\n  <!-- Some basic translations -->\n  <script src='lang/translator.js' type='text/javascript'></script>\n  <script src='lang/zh-cn.js' type='text/javascript'></script>\n\n  <script type=\"text/javascript\">\n    $(function () {\n      var url = window.location.search.match(/url=([^&]+)/);\n      if (url && url.length > 1) {\n        url = decodeURIComponent(url[1]);\n      } else {\n        //url = \"http://petstore.swagger.io/v2/swagger.json\";\n          url = \"../index.yaml\";\n      }\n\n      hljs.configure({\n        highlightSizeThreshold: 5000\n      });\n\n      // Pre load translate...\n      if(window.SwaggerTranslator) {\n        window.SwaggerTranslator.translate();\n      }\n      window.swaggerUi = new SwaggerUi({\n        url: url,\n        dom_id: \"swagger-ui-container\",\n        supportedSubmitMethods: ['get', 'post', 'put', 'delete', 'patch'],\n        onComplete: function(swaggerApi, swaggerUi){\n          if(typeof initOAuth == \"function\") {\n            initOAuth({\n              clientId: \"your-client-id\",\n              clientSecret: \"your-client-secret-if-required\",\n              realm: \"your-realms\",\n              appName: \"your-app-name\",\n              scopeSeparator: \" \",\n              additionalQueryStringParams: {}\n            });\n          }\n\n          if(window.SwaggerTranslator) {\n            window.SwaggerTranslator.translate();\n          }\n        },\n        onFailure: function(data) {\n          log(\"Unable to Load SwaggerUI\");\n        },\n        docExpansion: \"none\",\n        jsonEditor: false,\n        defaultModelRendering: 'schema',\n        showRequestHeaders: false,\n        showOperationIds: false\n      });\n\n      window.swaggerUi.load();\n\n      function log() {\n        if ('console' in window) {\n          console.log.apply(console, arguments);\n        }\n      }\n  });\n  </script>\n</head>\n\n<body class=\"swagger-section\">\n<div id='header'>\n  <div class=\"swagger-ui-wrap\">\n    <a id=\"logo\" href=\"http://swagger.io\"><img class=\"logo__img\" alt=\"swagger\" height=\"30\" width=\"30\" src=\"images/logo_small.png\" /><span class=\"logo__title\">swagger</span></a>\n    <form id='api_selector'>\n      <div class='input'><input placeholder=\"http://example.com/api\" id=\"input_baseUrl\" name=\"baseUrl\" type=\"text\"/></div>\n      <div id='auth_container'></div>\n      <div class='input'><a id=\"explore\" class=\"header__btn\" href=\"#\" data-sw-translate>Explore</a></div>\n    </form>\n  </div>\n</div>\n\n<div id=\"message-bar\" class=\"swagger-ui-wrap\" data-sw-translate>&nbsp;</div>\n<div id=\"swagger-ui-container\" class=\"swagger-ui-wrap\"></div>\n</body>\n</html>\n"
  },
  {
    "path": "src/main/resources/static/swagger/index.yaml",
    "content": "swagger: '2.0'\ninfo:\n  description: sdb是一个轻量级的Java快速开发平台，能快速开发项目并交付【接私活利器】\n  version: 1.0.0\n  title: 人人快速开发平台\n\nbasePath: /sdb\n\nschemes:\n  - http\n\n#认证\nsecurityDefinitions:\n  api_key:\n    type: \"apiKey\"\n    name: \"token\"\n    in: \"header\"\n\n#定义接口数据\npaths:\n  /captcha.jpg:\n    get:\n      tags:\n        - 用户登录\n      summary: 获取验证码\n      produces:\n        - application/octet-stream\n      parameters:\n        - name: uuid\n          description: UUID\n          in: query\n          type: string\n          required: true\n  /sys/login:\n    post:\n      tags:\n        - 用户登录\n      summary: 用户登录\n      produces:\n        - application/json\n      parameters:\n        - name: body\n          description: 管理员对象\n          in: body\n          type: string\n          schema:\n            $ref: '#/definitions/LoginForm'\n          required: true\n      responses:\n        '200':\n          schema:\n            $ref: '#/definitions/Login'\n\n  /sys/user/list:\n    get:\n      tags:\n        - 管理员管理\n      summary: 管理员列表\n      produces:\n        - application/json\n      parameters:\n        - name: page\n          description: 页码\n          in: query\n          type: integer\n          required: true\n        - name: limit\n          description: 每页条数\n          in: query\n          type: integer\n          required: true\n        - name: sidx\n          description: 排序字段\n          in: query\n          type: string\n        - name: order\n          description: 排序方式，如：asc、desc\n          in: query\n          type: string\n        - name: username\n          description: 用户名\n          in: query\n          type: string\n      responses:\n        '200':\n          description: 返回管理员列表\n          schema:\n            $ref: '#/definitions/SysUserList'\n  /sys/user/info:\n    get:\n      tags:\n        - 管理员管理\n      summary: 当前管理员信息\n      produces:\n        - application/json\n      responses:\n        '200':\n          description: 返回当前管理员信息\n          schema:\n            type: object\n            properties:\n              code:\n                description: 状态码 0：成功  非0：失败\n                type: integer\n                format: int32\n              user:\n                $ref: '#/definitions/SysUser'\n  /sys/user/info/{userId}:\n    get:\n      tags:\n        - 管理员管理\n      summary: 获取管理员信息\n      produces:\n        - application/json\n      parameters:\n        - name: userId\n          description: 用户ID\n          in: path\n          type: integer\n          required: true\n      responses:\n        '200':\n          description: 返回管理员信息\n          schema:\n            type: object\n            properties:\n              code:\n                description: 状态码 0：成功  非0：失败\n                type: integer\n                format: int32\n              user:\n                $ref: '#/definitions/SysUser'\n  /sys/user/password:\n    post:\n      tags:\n        - 管理员管理\n      summary: 修改密码\n      produces:\n        - application/json\n      parameters:\n        - name: body\n          description: 管理员对象\n          in: body\n          type: string\n          schema:\n            $ref: '#/definitions/PasswordForm'\n          required: true\n      responses:\n        '200':\n          schema:\n            $ref: '#/definitions/R'\n  /sys/user/save:\n    post:\n      tags:\n        - 管理员管理\n      summary: 添加管理员\n      produces:\n        - application/json\n      parameters:\n        - name: body\n          description: 管理员对象\n          in: body\n          type: string\n          schema:\n            $ref: '#/definitions/SysUserEdit'\n          required: true\n      responses:\n        '200':\n          schema:\n            $ref: '#/definitions/R'\n  /sys/user/update:\n    post:\n      tags:\n        - 管理员管理\n      summary: 修改管理员\n      produces:\n        - application/json\n      parameters:\n        - name: body\n          description: 管理员对象\n          in: body\n          type: string\n          schema:\n            $ref: '#/definitions/SysUserEdit'\n          required: true\n      responses:\n        '200':\n          schema:\n            $ref: '#/definitions/R'\n  /sys/user/delete:\n    post:\n      tags:\n        - 管理员管理\n      summary: 删除管理员\n      produces:\n        - application/json\n      parameters:\n        - name: body\n          description: 用户ID列表\n          in: body\n          type: array\n          items:\n            type: integer\n            format: int64\n            default: 0\n          required: true\n      responses:\n        '200':\n          schema:\n            $ref: '#/definitions/R'\n\n  /sys/role/list:\n    get:\n      tags:\n        - 角色管理\n      summary: 角色列表\n      produces:\n        - application/json\n      parameters:\n        - name: page\n          description: 页码\n          in: query\n          type: integer\n          required: true\n        - name: limit\n          description: 每页条数\n          in: query\n          type: integer\n          required: true\n        - name: sidx\n          description: 排序字段\n          in: query\n          type: string\n        - name: order\n          description: 排序方式，如：asc、desc\n          in: query\n          type: string\n        - name: roleName\n          description: 角色名\n          in: query\n          type: string\n      responses:\n        '200':\n          description: 返回角色列表\n          schema:\n            $ref: '#/definitions/SysRoleList'\n  /sys/role/select:\n    get:\n      tags:\n        - 角色管理\n      summary: 当前账号角色列表\n      description: 如果是超级管理员，则能查询所有的角色列表\n      produces:\n        - application/json\n      responses:\n        '200':\n          description: 返回角色列表\n          schema:\n            type: object\n            properties:\n              code:\n                description: 状态码 0：成功  非0：失败\n                type: integer\n                format: int32\n              list:\n                type: array\n                items:\n                  $ref: '#/definitions/SysRole'\n  /sys/role/info/{roleId}:\n    get:\n      tags:\n        - 角色管理\n      summary: 获取角色信息\n      produces:\n        - application/json\n      parameters:\n        - name: roleId\n          description: 角色ID\n          in: path\n          type: integer\n          required: true\n      responses:\n        '200':\n          description: 返回角色信息\n          schema:\n            type: object\n            properties:\n              code:\n                description: 状态码 0：成功  非0：失败\n                type: integer\n                format: int32\n              role:\n                $ref: '#/definitions/SysRole'\n  /sys/role/save:\n    post:\n      tags:\n        - 角色管理\n      summary: 添加角色\n      produces:\n        - application/json\n      parameters:\n        - name: body\n          description: 角色对象\n          in: body\n          type: string\n          schema:\n            $ref: '#/definitions/SysRoleEdit'\n          required: true\n      responses:\n        '200':\n          schema:\n            $ref: '#/definitions/R'\n  /sys/role/update:\n    post:\n      tags:\n        - 角色管理\n      summary: 修改角色\n      produces:\n        - application/json\n      parameters:\n        - name: body\n          description: 角色对象\n          in: body\n          type: string\n          schema:\n            $ref: '#/definitions/SysRoleEdit'\n          required: true\n      responses:\n        '200':\n          schema:\n            $ref: '#/definitions/R'\n  /sys/role/delete:\n    post:\n      tags:\n        - 角色管理\n      summary: 删除角色\n      produces:\n        - application/json\n      parameters:\n        - name: body\n          description: 角色ID列表\n          in: body\n          type: array\n          items:\n            type: integer\n            format: int64\n            default: 0\n          required: true\n      responses:\n        '200':\n          schema:\n            $ref: '#/definitions/R'\n\n  /sys/menu/nav:\n    get:\n      tags:\n        - 菜单管理\n      summary: 导航菜单列表\n      produces:\n        - application/json\n      responses:\n        '200':\n          description: 返回导航菜单列表\n          schema:\n            type: object\n            properties:\n              code:\n                description: 状态码 0：成功  非0：失败\n                type: integer\n                format: int32\n              menuList:\n                description: 菜单列表\n                type: array\n                items:\n                  $ref: '#/definitions/SysMenuEntity'\n              permissions:\n                description: 权限列表\n                type: array\n                items:\n                  type: string\n  /sys/menu/list:\n    get:\n      tags:\n        - 菜单管理\n      summary: 菜单列表\n      produces:\n        - application/json\n      responses:\n        '200':\n          description: 返回菜单列表\n          schema:\n            type: array\n            items:\n              $ref: '#/definitions/SysMenuEntity'\n  /sys/menu/select:\n    get:\n      tags:\n        - 菜单管理\n      summary: 选择菜单\n      description: 添加、修改菜单的时候，选择上级菜单接口\n      produces:\n        - application/json\n      responses:\n        '200':\n          description: 返回菜单列表\n          schema:\n            type: object\n            properties:\n              code:\n                description: 状态码 0：成功  非0：失败\n                type: integer\n                format: int32\n              menuList:\n                description: 菜单列表\n                type: array\n                items:\n                  $ref: '#/definitions/SysMenuEntity'\n  /sys/menu/info/{menuId}:\n    get:\n      tags:\n        - 菜单管理\n      summary: 获取菜单信息\n      produces:\n        - application/json\n      parameters:\n        - name: menuId\n          description: 菜单ID\n          in: path\n          type: integer\n          required: true\n      responses:\n        '200':\n          description: 返回菜单信息\n          schema:\n            type: object\n            properties:\n              code:\n                description: 状态码 0：成功  非0：失败\n                type: integer\n                format: int32\n              menu:\n                description: 菜单信息\n                $ref: '#/definitions/SysMenuEntity'\n  /sys/menu/save:\n    post:\n      tags:\n        - 菜单管理\n      summary: 添加菜单\n      produces:\n        - application/json\n      parameters:\n        - name: body\n          description: 菜单对象\n          in: body\n          type: string\n          schema:\n            $ref: '#/definitions/SysMenuEntityEdit'\n          required: true\n      responses:\n        '200':\n          schema:\n            $ref: '#/definitions/R'\n  /sys/menu/update:\n    post:\n      tags:\n        - 菜单管理\n      summary: 修改菜单\n      produces:\n        - application/json\n      parameters:\n        - name: body\n          description: 菜单对象\n          in: body\n          type: string\n          schema:\n            $ref: '#/definitions/SysMenuEntityEdit'\n          required: true\n      responses:\n        '200':\n          schema:\n            $ref: '#/definitions/R'\n  /sys/menu/delete/{menuId}:\n    post:\n      tags:\n        - 菜单管理\n      summary: 删除菜单\n      produces:\n        - application/json\n      parameters:\n        - name: menuId\n          description: 菜单ID\n          in: path\n          type: integer\n          required: true\n      responses:\n        '200':\n          schema:\n            $ref: '#/definitions/R'\n\n  /sys/log/list:\n    get:\n      tags:\n        - 系统日志\n      summary: 日志列表\n      produces:\n        - application/json\n      parameters:\n        - name: page\n          description: 页码\n          in: query\n          type: integer\n          required: true\n        - name: limit\n          description: 每页条数\n          in: query\n          type: integer\n          required: true\n        - name: sidx\n          description: 排序字段\n          in: query\n          type: string\n        - name: order\n          description: 排序方式，如：asc、desc\n          in: query\n          type: string\n        - name: key\n          description: 用户名或用户操作\n          in: query\n          type: string\n      responses:\n        '200':\n          description: 返回日志列表\n          schema:\n            $ref: '#/definitions/SysLogEntityList'\n\n  /sys/config/list:\n    get:\n      tags:\n        - 参数管理\n      summary: 参数列表\n      produces:\n        - application/json\n      parameters:\n        - name: page\n          description: 页码\n          in: query\n          type: integer\n          required: true\n        - name: limit\n          description: 每页条数\n          in: query\n          type: integer\n          required: true\n        - name: sidx\n          description: 排序字段\n          in: query\n          type: string\n        - name: order\n          description: 排序方式，如：asc、desc\n          in: query\n          type: string\n        - name: key\n          description: 参数名\n          in: query\n          type: string\n      responses:\n        '200':\n          description: 返回参数列表\n          schema:\n            $ref: '#/definitions/SysConfigEntityList'\n  /sys/config/info/{id}:\n    get:\n      tags:\n        - 参数管理\n      summary: 获取参数信息\n      produces:\n        - application/json\n      parameters:\n        - name: id\n          description: 参数ID\n          in: path\n          type: integer\n          required: true\n      responses:\n        '200':\n          description: 返回参数信息\n          schema:\n            type: object\n            properties:\n              code:\n                description: 状态码 0：成功  非0：失败\n                type: integer\n                format: int32\n              config:\n                description: 返回参数信息\n                $ref: '#/definitions/SysConfigEntity'\n  /sys/config/save:\n    post:\n      tags:\n        - 参数管理\n      summary: 添加参数\n      produces:\n        - application/json\n      parameters:\n        - name: body\n          description: 参数对象\n          in: body\n          type: string\n          schema:\n            $ref: '#/definitions/SysConfigEntity'\n          required: true\n      responses:\n        '200':\n          schema:\n            $ref: '#/definitions/R'\n  /sys/config/update:\n    post:\n      tags:\n        - 参数管理\n      summary: 修改参数\n      produces:\n        - application/json\n      parameters:\n        - name: body\n          description: 参数对象\n          in: body\n          type: string\n          schema:\n            $ref: '#/definitions/SysConfigEntity'\n          required: true\n      responses:\n        '200':\n          schema:\n            $ref: '#/definitions/R'\n  /sys/config/delete:\n    post:\n      tags:\n        - 参数管理\n      summary: 删除参数\n      produces:\n        - application/json\n      parameters:\n        - name: body\n          description: 参数ID列表\n          in: body\n          type: array\n          items:\n            type: integer\n            format: int64\n            default: 0\n          required: true\n      responses:\n        '200':\n          schema:\n            $ref: '#/definitions/R'\n\n  /sys/oss/list:\n    get:\n      tags:\n        - 文件服务\n      summary: 文件列表\n      produces:\n        - application/json\n      parameters:\n        - name: page\n          description: 页码\n          in: query\n          type: integer\n          required: true\n        - name: limit\n          description: 每页条数\n          in: query\n          type: integer\n          required: true\n        - name: sidx\n          description: 排序字段\n          in: query\n          type: string\n        - name: order\n          description: 排序方式，如：asc、desc\n          in: query\n          type: string\n      responses:\n        '200':\n          description: 返回文件列表\n          schema:\n            $ref: '#/definitions/SysOssEntityList'\n  /sys/oss/config:\n    get:\n      tags:\n        - 文件服务\n      summary: 云存储配置信息\n      produces:\n        - application/json\n      responses:\n        '200':\n          description: 返回云存储配置信息\n          schema:\n            type: object\n            properties:\n              code:\n                description: 状态码 0：成功  非0：失败\n                type: integer\n                format: int32\n              config:\n                description: 云存储配置信息\n                $ref: '#/definitions/SysCloudStorageEntity'\n  /sys/oss/saveConfig:\n    post:\n      tags:\n        - 文件服务\n      summary: 保存云存储配置信息\n      produces:\n        - application/json\n      parameters:\n        - name: body\n          description: 参数对象\n          in: body\n          type: string\n          schema:\n            $ref: '#/definitions/SysCloudStorageEntity'\n          required: true\n      responses:\n        '200':\n          schema:\n            $ref: '#/definitions/R'\n  /sys/oss/upload:\n    post:\n      tags:\n        - 文件服务\n      summary: 上传文件\n      consumes:\n        - multipart/form-data\n      produces:\n        - application/json\n      parameters:\n        - name: file\n          description: 文件\n          in: formData\n          type: file\n          required: true\n      responses:\n        '200':\n          description: 返回文件列表\n          schema:\n            $ref: '#/definitions/FileUpload'\n  /sys/oss/delete:\n    post:\n      tags:\n        - 文件服务\n      summary: 删除文件\n      produces:\n        - application/json\n      parameters:\n        - name: body\n          description: 文件ID列表\n          in: body\n          type: array\n          items:\n            type: integer\n            format: int64\n            default: 0\n          required: true\n      responses:\n        '200':\n          schema:\n            $ref: '#/definitions/R'\n\n  /sys/schedule/list:\n    get:\n      tags:\n        - 定时任务\n      summary: 定时任务列表\n      produces:\n        - application/json\n      parameters:\n        - name: page\n          description: 页码\n          in: query\n          type: integer\n          required: true\n        - name: limit\n          description: 每页条数\n          in: query\n          type: integer\n          required: true\n        - name: sidx\n          description: 排序字段\n          in: query\n          type: string\n        - name: order\n          description: 排序方式，如：asc、desc\n          in: query\n          type: string\n        - name: beanName\n          description: spring bean名称\n          in: query\n          type: string\n      responses:\n        '200':\n          description: 返回定时任务列表\n          schema:\n            $ref: '#/definitions/ScheduleJobList'\n  /sys/schedule/info/{jobId}:\n    get:\n      tags:\n        - 定时任务\n      summary: 获取定时任务信息\n      produces:\n        - application/json\n      parameters:\n        - name: jobId\n          description: 定时任务ID\n          in: path\n          type: integer\n          required: true\n      responses:\n        '200':\n          description: 返回定时任务信息\n          schema:\n            type: object\n            properties:\n              code:\n                description: 状态码 0：成功  非0：失败\n                type: integer\n                format: int32\n              schedule:\n                description: 定时任务信息\n                $ref: '#/definitions/ScheduleJob'\n  /sys/schedule/save:\n    post:\n      tags:\n        - 定时任务\n      summary: 添加定时任务\n      produces:\n        - application/json\n      parameters:\n        - name: body\n          description: 定时任务对象\n          in: body\n          type: string\n          schema:\n            $ref: '#/definitions/ScheduleJob'\n          required: true\n      responses:\n        '200':\n          schema:\n            $ref: '#/definitions/R'\n  /sys/schedule/update:\n    post:\n      tags:\n        - 定时任务\n      summary: 修改定时任务\n      produces:\n        - application/json\n      parameters:\n        - name: body\n          description: 定时任务对象\n          in: body\n          type: string\n          schema:\n            $ref: '#/definitions/ScheduleJob'\n          required: true\n      responses:\n        '200':\n          schema:\n            $ref: '#/definitions/R'\n  /sys/schedule/delete:\n    post:\n      tags:\n        - 定时任务\n      summary: 删除定时任务\n      produces:\n        - application/json\n      parameters:\n        - name: body\n          description: 定时任务ID列表\n          in: body\n          type: array\n          items:\n            type: integer\n            format: int64\n            default: 0\n          required: true\n      responses:\n        '200':\n          schema:\n            $ref: '#/definitions/R'\n  /sys/schedule/run:\n    post:\n      tags:\n        - 定时任务\n      summary: 立即执行任务\n      produces:\n        - application/json\n      parameters:\n        - name: body\n          description: 定时任务ID列表\n          in: body\n          type: array\n          items:\n            type: integer\n            format: int64\n            default: 0\n          required: true\n      responses:\n        '200':\n          schema:\n            $ref: '#/definitions/R'\n  /sys/schedule/pause:\n    post:\n      tags:\n        - 定时任务\n      summary: 暂停定时任务\n      produces:\n        - application/json\n      parameters:\n        - name: body\n          description: 定时任务ID列表\n          in: body\n          type: array\n          items:\n            type: integer\n            format: int64\n            default: 0\n          required: true\n      responses:\n        '200':\n          schema:\n            $ref: '#/definitions/R'\n  /sys/schedule/resume:\n    post:\n      tags:\n        - 定时任务\n      summary: 恢复定时任务\n      produces:\n        - application/json\n      parameters:\n        - name: body\n          description: 定时任务ID列表\n          in: body\n          type: array\n          items:\n            type: integer\n            format: int64\n            default: 0\n          required: true\n      responses:\n        '200':\n          schema:\n            $ref: '#/definitions/R'\n\n  /sys/scheduleLog/list:\n    get:\n      tags:\n        - 定时任务\n      summary: 定时任务日志列表\n      produces:\n        - application/json\n      parameters:\n        - name: page\n          description: 页码\n          in: query\n          type: integer\n          required: true\n        - name: limit\n          description: 每页条数\n          in: query\n          type: integer\n          required: true\n        - name: sidx\n          description: 排序字段\n          in: query\n          type: string\n        - name: order\n          description: 排序方式，如：asc、desc\n          in: query\n          type: string\n        - name: beanName\n          description: spring bean名称\n          in: query\n          type: string\n      responses:\n        '200':\n          description: 返回定时任务日志列表\n          schema:\n            $ref: '#/definitions/ScheduleJobLogList'\n  /sys/scheduleLog/info/{logId}:\n    get:\n      tags:\n        - 定时任务\n      summary: 获取定时任务日志信息\n      produces:\n        - application/json\n      parameters:\n        - name: logId\n          description: 日志ID\n          in: path\n          type: integer\n          required: true\n      responses:\n        '200':\n          description: 返回定时任务日志信息\n          schema:\n            type: object\n            properties:\n              code:\n                description: 状态码 0：成功  非0：失败\n                type: integer\n                format: int32\n              schedule:\n                description: 定时任务日志信息\n                $ref: '#/definitions/ScheduleJobLog'\n\n#定义数据模型\ndefinitions:\n  R:\n      type: object\n      properties:\n        code:\n          description: 状态码 0：成功  非0：失败\n          type: integer\n          format: int32\n        msg:\n          description: 失败原因\n          type: string\n  Login:\n      type: object\n      properties:\n        code:\n          description: 状态码 0：成功  非0：失败\n          type: integer\n          format: int32\n        token:\n          description: token\n          type: string\n        expire:\n          description: 过期时长\n          type: integer\n          format: int32\n        msg:\n          description: 失败原因\n          type: string\n  LoginForm:\n    type: object\n    properties:\n      username:\n        description: 用户名\n        type: string\n      password:\n        description: 密码\n        type: string\n      captcha:\n        description: 验证码\n        type: string\n      uuid:\n        description: UUID\n        type: string\n  PasswordForm:\n    type: object\n    properties:\n      password:\n        description: 原密码\n        type: string\n      newPassword:\n        description: 新密码\n        type: string\n  SysUser:\n    type: object\n    properties:\n      userId:\n        description: 用户ID\n        type: integer\n        format: int64\n      username:\n        description: 用户名\n        type: string\n      password:\n        description: 密码\n        type: string\n      email:\n        description: 邮箱\n        type: string\n      mobile:\n        description: 手机号\n        type: string\n      status:\n        description: 状态  0：禁用   1：正常\n        type: integer\n        format: int32\n      roleIdList:\n        description: 角色ID列表\n        type: array\n        items:\n          type: integer\n          format: int64\n      createUserId:\n        description: 创建者ID\n        type: integer\n        format: int64\n      createTime:\n        description: 创建时间\n        type: string\n        format: date-time\n  SysUserList:\n    type: object\n    properties:\n      code:\n        description: 状态码 0：成功  非0：失败\n        type: integer\n        format: int32\n      page:\n        type: object\n        properties:\n          totalCount:\n            description: 总记录数\n            type: integer\n            format: int32\n          pageSize:\n            description: 每页记录数\n            type: integer\n            format: int32\n          totalPage:\n            description: 总页数\n            type: integer\n            format: int32\n          currPage:\n            description: 当前页数\n            type: integer\n            format: int32\n          list:\n            type: array\n            items:\n              $ref: '#/definitions/SysUser'\n  SysUserEdit:\n      type: object\n      properties:\n        userId:\n          description: 用户ID\n          type: integer\n          format: int64\n        username:\n          description: 用户名\n          type: string\n        password:\n          description: 密码\n          type: string\n        email:\n          description: 邮箱\n          type: string\n        mobile:\n          description: 手机号\n          type: string\n        status:\n          description: 状态  0：禁用   1：正常\n          type: integer\n          format: int32\n        roleIdList:\n          description: 角色ID列表\n          type: array\n          items:\n            type: integer\n            format: int32\n\n  SysRole:\n    type: object\n    properties:\n      roleId:\n        description: 角色ID\n        type: integer\n        format: int64\n      roleName:\n        description: 角色名称\n        type: string\n      remark:\n        description: 备注\n        type: string\n      menuIdList:\n        description: 菜单ID列表\n        type: array\n        items:\n          type: integer\n          format: int64\n      createUserId:\n        description: 创建者ID\n        type: integer\n        format: int64\n      createTime:\n        description: 创建时间\n        type: string\n        format: date-time\n  SysRoleList:\n    type: object\n    properties:\n      code:\n        description: 状态码 0：成功  非0：失败\n        type: integer\n        format: int32\n      page:\n        type: object\n        properties:\n          totalCount:\n            description: 总记录数\n            type: integer\n            format: int32\n          pageSize:\n            description: 每页记录数\n            type: integer\n            format: int32\n          totalPage:\n            description: 总页数\n            type: integer\n            format: int32\n          currPage:\n            description: 当前页数\n            type: integer\n            format: int32\n          list:\n            type: array\n            items:\n              $ref: '#/definitions/SysRole'\n  SysRoleEdit:\n    type: object\n    properties:\n      roleId:\n        description: 角色ID\n        type: integer\n        format: int64\n      roleName:\n        description: 角色名称\n        type: string\n      remark:\n        description: 备注\n        type: string\n      menuIdList:\n        description: 菜单ID列表\n        type: array\n        items:\n          type: integer\n          format: int64\n\n  SysMenuEntity:\n    type: object\n    properties:\n      menuId:\n        description: 菜单ID\n        type: integer\n        format: int64\n      name:\n        description: 菜单名称\n        type: string\n      parentId:\n        description: 父菜单ID，一级菜单为0\n        type: integer\n        format: int64\n      parentName:\n        description: 父菜单名称\n        type: string\n      url:\n        description: 菜单URL\n        type: string\n      perms:\n        description: 授权标识\n        type: string\n      type:\n        description: 类型     0：目录   1：菜单   2：按钮\n        type: integer\n        format: int32\n      icon:\n        description: 菜单图标\n        type: string\n      orderNum:\n        description: 排序\n        type: integer\n        format: int32\n      open:\n        description: 是否展开   true：展开   false：不展开\n        type: boolean\n        format: int32\n  SysMenuEntityEdit:\n    type: object\n    properties:\n      menuId:\n        description: 菜单ID\n        type: integer\n        format: int64\n      name:\n        description: 菜单名称\n        type: string\n      parentId:\n        description: 父菜单ID，一级菜单为0\n        type: integer\n        format: int64\n      url:\n        description: 菜单URL\n        type: string\n      perms:\n        description: 授权标识\n        type: string\n      type:\n        description: 类型     0：目录   1：菜单   2：按钮\n        type: integer\n        format: int32\n      icon:\n        description: 菜单图标\n        type: string\n      orderNum:\n        description: 排序\n        type: integer\n        format: int32\n\n  SysLogEntity:\n    type: object\n    properties:\n      id:\n        description: 日志ID\n        type: integer\n        format: int64\n      username:\n        description: 用户名\n        type: string\n      operation:\n        description: 用户操作\n        type: string\n      method:\n        description: 请求方法\n        type: string\n      params:\n        description: 请求参数\n        type: string\n      time:\n        description: 执行时长(毫秒)\n        type: integer\n        format: int64\n      ip:\n        description: IP地址\n        type: string\n      createTime:\n        description: 创建时间\n        type: string\n        format: date-time\n  SysLogEntityList:\n    type: object\n    properties:\n      code:\n        description: 状态码 0：成功  非0：失败\n        type: integer\n        format: int32\n      page:\n        type: object\n        properties:\n          totalCount:\n            description: 总记录数\n            type: integer\n            format: int32\n          pageSize:\n            description: 每页记录数\n            type: integer\n            format: int32\n          totalPage:\n            description: 总页数\n            type: integer\n            format: int32\n          currPage:\n            description: 当前页数\n            type: integer\n            format: int32\n          list:\n            type: array\n            items:\n              $ref: '#/definitions/SysLogEntity'\n\n  SysConfigEntity:\n    type: object\n    properties:\n      id:\n        description: 参数ID\n        type: integer\n        format: int64\n      key:\n        description: 参数名\n        type: string\n      value:\n        description: 参数值\n        type: string\n      remark:\n        description: 备注\n        type: string\n  SysConfigEntityList:\n    type: object\n    properties:\n      code:\n        description: 状态码 0：成功  非0：失败\n        type: integer\n        format: int32\n      page:\n        type: object\n        properties:\n          totalCount:\n            description: 总记录数\n            type: integer\n            format: int32\n          pageSize:\n            description: 每页记录数\n            type: integer\n            format: int32\n          totalPage:\n            description: 总页数\n            type: integer\n            format: int32\n          currPage:\n            description: 当前页数\n            type: integer\n            format: int32\n          list:\n            type: array\n            items:\n              $ref: '#/definitions/SysConfigEntity'\n\n  SysOssEntity:\n    type: object\n    properties:\n      id:\n        description: ID\n        type: integer\n        format: int64\n      url:\n        description: URL地址\n        type: string\n      createTime:\n        description: 创建时间\n        type: string\n        format: date-time\n  SysOssEntityList:\n    type: object\n    properties:\n      code:\n        description: 状态码 0：成功  非0：失败\n        type: integer\n        format: int32\n      page:\n        type: object\n        properties:\n          totalCount:\n            description: 总记录数\n            type: integer\n            format: int32\n          pageSize:\n            description: 每页记录数\n            type: integer\n            format: int32\n          totalPage:\n            description: 总页数\n            type: integer\n            format: int32\n          currPage:\n            description: 当前页数\n            type: integer\n            format: int32\n          list:\n            type: array\n            items:\n              $ref: '#/definitions/SysOssEntity'\n  SysCloudStorageEntity:\n    type: object\n    properties:\n      type:\n        description: 类型 1：七牛  2：阿里云  3：腾讯云\n        type: integer\n        format: int32\n      qiniuDomain:\n        description: 七牛绑定的域名\n        type: string\n      qiniuPrefix:\n        description: 七牛路径前缀\n        type: string\n      qiniuAccessKey:\n        description: 七牛ACCESS_KEY\n        type: string\n      qiniuSecretKey:\n        description: 七牛SECRET_KEY\n        type: string\n      qiniuBucketName:\n        description: 七牛存储空间名\n        type: string\n      aliyunDomain:\n        description: 阿里云绑定的域名\n        type: string\n      aliyunPrefix:\n        description: 阿里云路径前缀\n        type: string\n      aliyunEndPoint:\n        description: 阿里云EndPoint\n        type: string\n      aliyunAccessKeyId:\n        description: 阿里云AccessKeyId\n        type: string\n      aliyunAccessKeySecret:\n        description: 阿里云AccessKeySecret\n        type: string\n      aliyunBucketName:\n        description: 阿里云BucketName\n        type: string\n      qcloudDomain:\n        description: 腾讯云绑定的域名\n        type: string\n      qcloudPrefix:\n        description: 腾讯云路径前缀\n        type: string\n      qcloudAppId:\n        description: 腾讯云AppId\n        type: string\n      qcloudSecretId:\n        description: 腾讯云SecretId\n        type: string\n      qcloudSecretKey:\n        description: 腾讯云SecretKey\n        type: string\n      qcloudBucketName:\n        description: 腾讯云BucketName\n        type: string\n      qcloudRegion:\n        description: 腾讯云COS所属地区\n        type: string\n  FileUpload:\n      type: object\n      properties:\n        code:\n          description: 状态码 0：成功  非0：失败\n          type: integer\n          format: int32\n        url:\n          description: 文件URL地址\n          type: string\n        msg:\n          description: 失败原因\n          type: string\n\n  ScheduleJob:\n    type: object\n    properties:\n      jobId:\n        description: 任务ID\n        type: integer\n        format: int64\n      beanName:\n        description: spring bean名称\n        type: string\n      methodName:\n        description: 方法名\n        type: string\n      params:\n        description: 参数\n        type: string\n      cronExpression:\n        description: cron表达式\n        type: string\n      status:\n        description: 任务状态  0：正常  1：暂停\n        type: integer\n        format: int32\n      remark:\n        description: 备注\n        type: string\n      createTime:\n        description: 创建时间\n        type: string\n        format: date-time\n  ScheduleJobList:\n    type: object\n    properties:\n      code:\n        description: 状态码 0：成功  非0：失败\n        type: integer\n        format: int32\n      page:\n        type: object\n        properties:\n          totalCount:\n            description: 总记录数\n            type: integer\n            format: int32\n          pageSize:\n            description: 每页记录数\n            type: integer\n            format: int32\n          totalPage:\n            description: 总页数\n            type: integer\n            format: int32\n          currPage:\n            description: 当前页数\n            type: integer\n            format: int32\n          list:\n            type: array\n            items:\n              $ref: '#/definitions/ScheduleJob'\n\n  ScheduleJobLog:\n    type: object\n    properties:\n      logId:\n        description: 日志id\n        type: integer\n        format: int64\n      jobId:\n        description: 任务id\n        type: integer\n        format: int64\n      beanName:\n        description: spring bean名称\n        type: string\n      methodName:\n        description: 方法名\n        type: string\n      params:\n        description: 参数\n        type: string\n      status:\n        description: 任务状态    0：成功    1：失败\n        type: integer\n        format: int32\n      error:\n        description: 失败信息\n        type: string\n      times:\n        description: 耗时(单位：毫秒)\n        type: integer\n        format: int32\n      createTime:\n        description: 创建时间\n        type: string\n        format: date-time\n  ScheduleJobLogList:\n    type: object\n    properties:\n      code:\n        description: 状态码 0：成功  非0：失败\n        type: integer\n        format: int32\n      page:\n        type: object\n        properties:\n          totalCount:\n            description: 总记录数\n            type: integer\n            format: int32\n          pageSize:\n            description: 每页记录数\n            type: integer\n            format: int32\n          totalPage:\n            description: 总页数\n            type: integer\n            format: int32\n          currPage:\n            description: 当前页数\n            type: integer\n            format: int32\n          list:\n            type: array\n            items:\n              $ref: '#/definitions/ScheduleJobLog'"
  },
  {
    "path": "src/main/resources/static/swagger/lang/en.js",
    "content": "'use strict';\n\n/* jshint quotmark: double */\nwindow.SwaggerTranslator.learn({\n    \"Warning: Deprecated\":\"Warning: Deprecated\",\n    \"Implementation Notes\":\"Implementation Notes\",\n    \"Response Class\":\"Response Class\",\n    \"Status\":\"Status\",\n    \"Parameters\":\"Parameters\",\n    \"Parameter\":\"Parameter\",\n    \"Value\":\"Value\",\n    \"Description\":\"Description\",\n    \"Parameter Type\":\"Parameter Type\",\n    \"Data Type\":\"Data Type\",\n    \"Response Messages\":\"Response Messages\",\n    \"HTTP Status Code\":\"HTTP Status Code\",\n    \"Reason\":\"Reason\",\n    \"Response Model\":\"Response Model\",\n    \"Request URL\":\"Request URL\",\n    \"Response Body\":\"Response Body\",\n    \"Response Code\":\"Response Code\",\n    \"Response Headers\":\"Response Headers\",\n    \"Hide Response\":\"Hide Response\",\n    \"Headers\":\"Headers\",\n    \"Try it out!\":\"Try it out!\",\n    \"Show/Hide\":\"Show/Hide\",\n    \"List Operations\":\"List Operations\",\n    \"Expand Operations\":\"Expand Operations\",\n    \"Raw\":\"Raw\",\n    \"can't parse JSON.  Raw result\":\"can't parse JSON.  Raw result\",\n    \"Example Value\":\"Example Value\",\n    \"Model Schema\":\"Model Schema\",\n    \"Model\":\"Model\",\n    \"Click to set as parameter value\":\"Click to set as parameter value\",\n    \"apply\":\"apply\",\n    \"Username\":\"Username\",\n    \"Password\":\"Password\",\n    \"Terms of service\":\"Terms of service\",\n    \"Created by\":\"Created by\",\n    \"See more at\":\"See more at\",\n    \"Contact the developer\":\"Contact the developer\",\n    \"api version\":\"api version\",\n    \"Response Content Type\":\"Response Content Type\",\n    \"Parameter content type:\":\"Parameter content type:\",\n    \"fetching resource\":\"fetching resource\",\n    \"fetching resource list\":\"fetching resource list\",\n    \"Explore\":\"Explore\",\n    \"Show Swagger Petstore Example Apis\":\"Show Swagger Petstore Example Apis\",\n    \"Can't read from server.  It may not have the appropriate access-control-origin settings.\":\"Can't read from server.  It may not have the appropriate access-control-origin settings.\",\n    \"Please specify the protocol for\":\"Please specify the protocol for\",\n    \"Can't read swagger JSON from\":\"Can't read swagger JSON from\",\n    \"Finished Loading Resource Information. Rendering Swagger UI\":\"Finished Loading Resource Information. Rendering Swagger UI\",\n    \"Unable to read api\":\"Unable to read api\",\n    \"from path\":\"from path\",\n    \"server returned\":\"server returned\"\n});\n"
  },
  {
    "path": "src/main/resources/static/swagger/lang/translator.js",
    "content": "'use strict';\n\n/**\n * Translator for documentation pages.\n *\n * To enable translation you should include one of language-files in your index.html\n * after <script src='lang/translator.js' type='text/javascript'></script>.\n * For example - <script src='lang/ru.js' type='text/javascript'></script>\n *\n * If you wish to translate some new texts you should do two things:\n * 1. Add a new phrase pair (\"New Phrase\": \"New Translation\") into your language file (for example lang/ru.js). It will be great if you add it in other language files too.\n * 2. Mark that text it templates this way <anyHtmlTag data-sw-translate>New Phrase</anyHtmlTag> or <anyHtmlTag data-sw-translate value='New Phrase'/>.\n * The main thing here is attribute data-sw-translate. Only inner html, title-attribute and value-attribute are going to translate.\n *\n */\nwindow.SwaggerTranslator = {\n\n    _words:[],\n\n    translate: function(sel) {\n      var $this = this;\n      sel = sel || '[data-sw-translate]';\n\n      $(sel).each(function() {\n        $(this).html($this._tryTranslate($(this).html()));\n\n        $(this).val($this._tryTranslate($(this).val()));\n        $(this).attr('title', $this._tryTranslate($(this).attr('title')));\n      });\n    },\n\n    _tryTranslate: function(word) {\n      return this._words[$.trim(word)] !== undefined ? this._words[$.trim(word)] : word;\n    },\n\n    learn: function(wordsMap) {\n      this._words = wordsMap;\n    }\n};\n"
  },
  {
    "path": "src/main/resources/static/swagger/lang/zh-cn.js",
    "content": "'use strict';\n\n/* jshint quotmark: double */\nwindow.SwaggerTranslator.learn({\n    \"Warning: Deprecated\":\"警告：已过时\",\n    \"Implementation Notes\":\"接口备注\",\n    \"Response Class\":\"响应类\",\n    \"Status\":\"状态\",\n    \"Parameters\":\"参数\",\n    \"Parameter\":\"参数\",\n    \"Value\":\"值\",\n    \"Description\":\"描述\",\n    \"Parameter Type\":\"参数类型\",\n    \"Data Type\":\"数据类型\",\n    \"Response Messages\":\"响应消息\",\n    \"HTTP Status Code\":\"HTTP状态码\",\n    \"Reason\":\"原因\",\n    \"Response Model\":\"响应模型\",\n    \"Request URL\":\"请求URL\",\n    \"Response Body\":\"响应体\",\n    \"Response Code\":\"响应码\",\n    \"Response Headers\":\"响应头\",\n    \"Hide Response\":\"隐藏响应\",\n    \"Headers\":\"头\",\n    \"Try it out!\":\"试一下！\",\n    \"Show/Hide\":\"显示/隐藏\",\n    \"List Operations\":\"显示操作\",\n    \"Expand Operations\":\"展开操作\",\n    \"Raw\":\"原始\",\n    \"can't parse JSON.  Raw result\":\"无法解析JSON. 原始结果\",\n    \"Example Value\":\"示例\",\n    \"Click to set as parameter value\":\"点击设置参数\",\n    \"Model Schema\":\"模型架构\",\n    \"Model\":\"模型\",\n    \"apply\":\"应用\",\n    \"Username\":\"用户名\",\n    \"Password\":\"密码\",\n    \"Terms of service\":\"服务条款\",\n    \"Created by\":\"创建者\",\n    \"See more at\":\"查看更多：\",\n    \"Contact the developer\":\"联系开发者\",\n    \"api version\":\"api版本\",\n    \"Response Content Type\":\"响应类型\",\n    \"Parameter content type:\":\"参数类型:\",\n    \"fetching resource\":\"正在获取资源\",\n    \"fetching resource list\":\"正在获取资源列表\",\n    \"Explore\":\"浏览\",\n    \"Show Swagger Petstore Example Apis\":\"显示 Swagger Petstore 示例 Apis\",\n    \"Can't read from server.  It may not have the appropriate access-control-origin settings.\":\"无法从服务器读取。可能没有正确设置access-control-origin。\",\n    \"Please specify the protocol for\":\"请指定协议：\",\n    \"Can't read swagger JSON from\":\"无法读取swagger JSON于\",\n    \"Finished Loading Resource Information. Rendering Swagger UI\":\"已加载资源信息。正在渲染Swagger UI\",\n    \"Unable to read api\":\"无法读取api\",\n    \"from path\":\"从路径\",\n    \"server returned\":\"服务器返回\"\n});\n"
  },
  {
    "path": "src/main/resources/static/swagger/lib/backbone-min.js",
    "content": "!function(t,e){if(\"function\"==typeof define&&define.amd)define([\"underscore\",\"jquery\",\"exports\"],function(i,n,s){t.Backbone=e(t,s,i,n)});else if(\"undefined\"!=typeof exports){var i=require(\"underscore\");e(t,exports,i)}else t.Backbone=e(t,{},t._,t.jQuery||t.Zepto||t.ender||t.$)}(this,function(t,e,i,n){var s=t.Backbone,r=[],a=(r.push,r.slice);r.splice;e.VERSION=\"1.1.2\",e.$=n,e.noConflict=function(){return t.Backbone=s,this},e.emulateHTTP=!1,e.emulateJSON=!1;var o=e.Events={on:function(t,e,i){if(!c(this,\"on\",t,[e,i])||!e)return this;this._events||(this._events={});var n=this._events[t]||(this._events[t]=[]);return n.push({callback:e,context:i,ctx:i||this}),this},once:function(t,e,n){if(!c(this,\"once\",t,[e,n])||!e)return this;var s=this,r=i.once(function(){s.off(t,r),e.apply(this,arguments)});return r._callback=e,this.on(t,r,n)},off:function(t,e,n){var s,r,a,o,h,u,l,d;if(!this._events||!c(this,\"off\",t,[e,n]))return this;if(!t&&!e&&!n)return this._events=void 0,this;for(o=t?[t]:i.keys(this._events),h=0,u=o.length;h<u;h++)if(t=o[h],a=this._events[t]){if(this._events[t]=s=[],e||n)for(l=0,d=a.length;l<d;l++)r=a[l],(e&&e!==r.callback&&e!==r.callback._callback||n&&n!==r.context)&&s.push(r);s.length||delete this._events[t]}return this},trigger:function(t){if(!this._events)return this;var e=a.call(arguments,1);if(!c(this,\"trigger\",t,e))return this;var i=this._events[t],n=this._events.all;return i&&u(i,e),n&&u(n,arguments),this},stopListening:function(t,e,n){var s=this._listeningTo;if(!s)return this;var r=!e&&!n;n||\"object\"!=typeof e||(n=this),t&&((s={})[t._listenId]=t);for(var a in s)t=s[a],t.off(e,n,this),(r||i.isEmpty(t._events))&&delete this._listeningTo[a];return this}},h=/\\s+/,c=function(t,e,i,n){if(!i)return!0;if(\"object\"==typeof i){for(var s in i)t[e].apply(t,[s,i[s]].concat(n));return!1}if(h.test(i)){for(var r=i.split(h),a=0,o=r.length;a<o;a++)t[e].apply(t,[r[a]].concat(n));return!1}return!0},u=function(t,e){var i,n=-1,s=t.length,r=e[0],a=e[1],o=e[2];switch(e.length){case 0:for(;++n<s;)(i=t[n]).callback.call(i.ctx);return;case 1:for(;++n<s;)(i=t[n]).callback.call(i.ctx,r);return;case 2:for(;++n<s;)(i=t[n]).callback.call(i.ctx,r,a);return;case 3:for(;++n<s;)(i=t[n]).callback.call(i.ctx,r,a,o);return;default:for(;++n<s;)(i=t[n]).callback.apply(i.ctx,e);return}},l={listenTo:\"on\",listenToOnce:\"once\"};i.each(l,function(t,e){o[e]=function(e,n,s){var r=this._listeningTo||(this._listeningTo={}),a=e._listenId||(e._listenId=i.uniqueId(\"l\"));return r[a]=e,s||\"object\"!=typeof n||(s=this),e[t](n,s,this),this}}),o.bind=o.on,o.unbind=o.off,i.extend(e,o);var d=e.Model=function(t,e){var n=t||{};e||(e={}),this.cid=i.uniqueId(\"c\"),this.attributes={},e.collection&&(this.collection=e.collection),e.parse&&(n=this.parse(n,e)||{}),n=i.defaults({},n,i.result(this,\"defaults\")),this.set(n,e),this.changed={},this.initialize.apply(this,arguments)};i.extend(d.prototype,o,{changed:null,validationError:null,idAttribute:\"id\",initialize:function(){},toJSON:function(t){return i.clone(this.attributes)},sync:function(){return e.sync.apply(this,arguments)},get:function(t){return this.attributes[t]},escape:function(t){return i.escape(this.get(t))},has:function(t){return null!=this.get(t)},set:function(t,e,n){var s,r,a,o,h,c,u,l;if(null==t)return this;if(\"object\"==typeof t?(r=t,n=e):(r={})[t]=e,n||(n={}),!this._validate(r,n))return!1;a=n.unset,h=n.silent,o=[],c=this._changing,this._changing=!0,c||(this._previousAttributes=i.clone(this.attributes),this.changed={}),l=this.attributes,u=this._previousAttributes,this.idAttribute in r&&(this.id=r[this.idAttribute]);for(s in r)e=r[s],i.isEqual(l[s],e)||o.push(s),i.isEqual(u[s],e)?delete this.changed[s]:this.changed[s]=e,a?delete l[s]:l[s]=e;if(!h){o.length&&(this._pending=n);for(var d=0,f=o.length;d<f;d++)this.trigger(\"change:\"+o[d],this,l[o[d]],n)}if(c)return this;if(!h)for(;this._pending;)n=this._pending,this._pending=!1,this.trigger(\"change\",this,n);return this._pending=!1,this._changing=!1,this},unset:function(t,e){return this.set(t,void 0,i.extend({},e,{unset:!0}))},clear:function(t){var e={};for(var n in this.attributes)e[n]=void 0;return this.set(e,i.extend({},t,{unset:!0}))},hasChanged:function(t){return null==t?!i.isEmpty(this.changed):i.has(this.changed,t)},changedAttributes:function(t){if(!t)return!!this.hasChanged()&&i.clone(this.changed);var e,n=!1,s=this._changing?this._previousAttributes:this.attributes;for(var r in t)i.isEqual(s[r],e=t[r])||((n||(n={}))[r]=e);return n},previous:function(t){return null!=t&&this._previousAttributes?this._previousAttributes[t]:null},previousAttributes:function(){return i.clone(this._previousAttributes)},fetch:function(t){t=t?i.clone(t):{},void 0===t.parse&&(t.parse=!0);var e=this,n=t.success;return t.success=function(i){return!!e.set(e.parse(i,t),t)&&(n&&n(e,i,t),void e.trigger(\"sync\",e,i,t))},U(this,t),this.sync(\"read\",this,t)},save:function(t,e,n){var s,r,a,o=this.attributes;if(null==t||\"object\"==typeof t?(s=t,n=e):(s={})[t]=e,n=i.extend({validate:!0},n),s&&!n.wait){if(!this.set(s,n))return!1}else if(!this._validate(s,n))return!1;s&&n.wait&&(this.attributes=i.extend({},o,s)),void 0===n.parse&&(n.parse=!0);var h=this,c=n.success;return n.success=function(t){h.attributes=o;var e=h.parse(t,n);return n.wait&&(e=i.extend(s||{},e)),!(i.isObject(e)&&!h.set(e,n))&&(c&&c(h,t,n),void h.trigger(\"sync\",h,t,n))},U(this,n),r=this.isNew()?\"create\":n.patch?\"patch\":\"update\",\"patch\"===r&&(n.attrs=s),a=this.sync(r,this,n),s&&n.wait&&(this.attributes=o),a},destroy:function(t){t=t?i.clone(t):{};var e=this,n=t.success,s=function(){e.trigger(\"destroy\",e,e.collection,t)};if(t.success=function(i){(t.wait||e.isNew())&&s(),n&&n(e,i,t),e.isNew()||e.trigger(\"sync\",e,i,t)},this.isNew())return t.success(),!1;U(this,t);var r=this.sync(\"delete\",this,t);return t.wait||s(),r},url:function(){var t=i.result(this,\"urlRoot\")||i.result(this.collection,\"url\")||j();return this.isNew()?t:t.replace(/([^\\/])$/,\"$1/\")+encodeURIComponent(this.id)},parse:function(t,e){return t},clone:function(){return new this.constructor(this.attributes)},isNew:function(){return!this.has(this.idAttribute)},isValid:function(t){return this._validate({},i.extend(t||{},{validate:!0}))},_validate:function(t,e){if(!e.validate||!this.validate)return!0;t=i.extend({},this.attributes,t);var n=this.validationError=this.validate(t,e)||null;return!n||(this.trigger(\"invalid\",this,n,i.extend(e,{validationError:n})),!1)}});var f=[\"keys\",\"values\",\"pairs\",\"invert\",\"pick\",\"omit\"];i.each(f,function(t){d.prototype[t]=function(){var e=a.call(arguments);return e.unshift(this.attributes),i[t].apply(i,e)}});var p=e.Collection=function(t,e){e||(e={}),e.model&&(this.model=e.model),void 0!==e.comparator&&(this.comparator=e.comparator),this._reset(),this.initialize.apply(this,arguments),t&&this.reset(t,i.extend({silent:!0},e))},g={add:!0,remove:!0,merge:!0},v={add:!0,remove:!1};i.extend(p.prototype,o,{model:d,initialize:function(){},toJSON:function(t){return this.map(function(e){return e.toJSON(t)})},sync:function(){return e.sync.apply(this,arguments)},add:function(t,e){return this.set(t,i.extend({merge:!1},e,v))},remove:function(t,e){var n=!i.isArray(t);t=n?[t]:i.clone(t),e||(e={});var s,r,a,o;for(s=0,r=t.length;s<r;s++)o=t[s]=this.get(t[s]),o&&(delete this._byId[o.id],delete this._byId[o.cid],a=this.indexOf(o),this.models.splice(a,1),this.length--,e.silent||(e.index=a,o.trigger(\"remove\",o,this,e)),this._removeReference(o,e));return n?t[0]:t},set:function(t,e){e=i.defaults({},e,g),e.parse&&(t=this.parse(t,e));var n=!i.isArray(t);t=n?t?[t]:[]:i.clone(t);var s,r,a,o,h,c,u,l=e.at,f=this.model,p=this.comparator&&null==l&&e.sort!==!1,v=i.isString(this.comparator)?this.comparator:null,m=[],y=[],_={},b=e.add,w=e.merge,x=e.remove,E=!(p||!b||!x)&&[];for(s=0,r=t.length;s<r;s++){if(h=t[s]||{},a=h instanceof d?o=h:h[f.prototype.idAttribute||\"id\"],c=this.get(a))x&&(_[c.cid]=!0),w&&(h=h===o?o.attributes:h,e.parse&&(h=c.parse(h,e)),c.set(h,e),p&&!u&&c.hasChanged(v)&&(u=!0)),t[s]=c;else if(b){if(o=t[s]=this._prepareModel(h,e),!o)continue;m.push(o),this._addReference(o,e)}o=c||o,!E||!o.isNew()&&_[o.id]||E.push(o),_[o.id]=!0}if(x){for(s=0,r=this.length;s<r;++s)_[(o=this.models[s]).cid]||y.push(o);y.length&&this.remove(y,e)}if(m.length||E&&E.length)if(p&&(u=!0),this.length+=m.length,null!=l)for(s=0,r=m.length;s<r;s++)this.models.splice(l+s,0,m[s]);else{E&&(this.models.length=0);var k=E||m;for(s=0,r=k.length;s<r;s++)this.models.push(k[s])}if(u&&this.sort({silent:!0}),!e.silent){for(s=0,r=m.length;s<r;s++)(o=m[s]).trigger(\"add\",o,this,e);(u||E&&E.length)&&this.trigger(\"sort\",this,e)}return n?t[0]:t},reset:function(t,e){e||(e={});for(var n=0,s=this.models.length;n<s;n++)this._removeReference(this.models[n],e);return e.previousModels=this.models,this._reset(),t=this.add(t,i.extend({silent:!0},e)),e.silent||this.trigger(\"reset\",this,e),t},push:function(t,e){return this.add(t,i.extend({at:this.length},e))},pop:function(t){var e=this.at(this.length-1);return this.remove(e,t),e},unshift:function(t,e){return this.add(t,i.extend({at:0},e))},shift:function(t){var e=this.at(0);return this.remove(e,t),e},slice:function(){return a.apply(this.models,arguments)},get:function(t){if(null!=t)return this._byId[t]||this._byId[t.id]||this._byId[t.cid]},at:function(t){return this.models[t]},where:function(t,e){return i.isEmpty(t)?e?void 0:[]:this[e?\"find\":\"filter\"](function(e){for(var i in t)if(t[i]!==e.get(i))return!1;return!0})},findWhere:function(t){return this.where(t,!0)},sort:function(t){if(!this.comparator)throw new Error(\"Cannot sort a set without a comparator\");return t||(t={}),i.isString(this.comparator)||1===this.comparator.length?this.models=this.sortBy(this.comparator,this):this.models.sort(i.bind(this.comparator,this)),t.silent||this.trigger(\"sort\",this,t),this},pluck:function(t){return i.invoke(this.models,\"get\",t)},fetch:function(t){t=t?i.clone(t):{},void 0===t.parse&&(t.parse=!0);var e=t.success,n=this;return t.success=function(i){var s=t.reset?\"reset\":\"set\";n[s](i,t),e&&e(n,i,t),n.trigger(\"sync\",n,i,t)},U(this,t),this.sync(\"read\",this,t)},create:function(t,e){if(e=e?i.clone(e):{},!(t=this._prepareModel(t,e)))return!1;e.wait||this.add(t,e);var n=this,s=e.success;return e.success=function(t,i){e.wait&&n.add(t,e),s&&s(t,i,e)},t.save(null,e),t},parse:function(t,e){return t},clone:function(){return new this.constructor(this.models)},_reset:function(){this.length=0,this.models=[],this._byId={}},_prepareModel:function(t,e){if(t instanceof d)return t;e=e?i.clone(e):{},e.collection=this;var n=new this.model(t,e);return n.validationError?(this.trigger(\"invalid\",this,n.validationError,e),!1):n},_addReference:function(t,e){this._byId[t.cid]=t,null!=t.id&&(this._byId[t.id]=t),t.collection||(t.collection=this),t.on(\"all\",this._onModelEvent,this)},_removeReference:function(t,e){this===t.collection&&delete t.collection,t.off(\"all\",this._onModelEvent,this)},_onModelEvent:function(t,e,i,n){(\"add\"!==t&&\"remove\"!==t||i===this)&&(\"destroy\"===t&&this.remove(e,n),e&&t===\"change:\"+e.idAttribute&&(delete this._byId[e.previous(e.idAttribute)],null!=e.id&&(this._byId[e.id]=e)),this.trigger.apply(this,arguments))}});var m=[\"forEach\",\"each\",\"map\",\"collect\",\"reduce\",\"foldl\",\"inject\",\"reduceRight\",\"foldr\",\"find\",\"detect\",\"filter\",\"select\",\"reject\",\"every\",\"all\",\"some\",\"any\",\"include\",\"contains\",\"invoke\",\"max\",\"min\",\"toArray\",\"size\",\"first\",\"head\",\"take\",\"initial\",\"rest\",\"tail\",\"drop\",\"last\",\"without\",\"difference\",\"indexOf\",\"shuffle\",\"lastIndexOf\",\"isEmpty\",\"chain\",\"sample\"];i.each(m,function(t){p.prototype[t]=function(){var e=a.call(arguments);return e.unshift(this.models),i[t].apply(i,e)}});var y=[\"groupBy\",\"countBy\",\"sortBy\",\"indexBy\"];i.each(y,function(t){p.prototype[t]=function(e,n){var s=i.isFunction(e)?e:function(t){return t.get(e)};return i[t](this.models,s,n)}});var _=e.View=function(t){this.cid=i.uniqueId(\"view\"),t||(t={}),i.extend(this,i.pick(t,w)),this._ensureElement(),this.initialize.apply(this,arguments),this.delegateEvents()},b=/^(\\S+)\\s*(.*)$/,w=[\"model\",\"collection\",\"el\",\"id\",\"attributes\",\"className\",\"tagName\",\"events\"];i.extend(_.prototype,o,{tagName:\"div\",$:function(t){return this.$el.find(t)},initialize:function(){},render:function(){return this},remove:function(){return this.$el.remove(),this.stopListening(),this},setElement:function(t,i){return this.$el&&this.undelegateEvents(),this.$el=t instanceof e.$?t:e.$(t),this.el=this.$el[0],i!==!1&&this.delegateEvents(),this},delegateEvents:function(t){if(!t&&!(t=i.result(this,\"events\")))return this;this.undelegateEvents();for(var e in t){var n=t[e];if(i.isFunction(n)||(n=this[t[e]]),n){var s=e.match(b),r=s[1],a=s[2];n=i.bind(n,this),r+=\".delegateEvents\"+this.cid,\"\"===a?this.$el.on(r,n):this.$el.on(r,a,n)}}return this},undelegateEvents:function(){return this.$el.off(\".delegateEvents\"+this.cid),this},_ensureElement:function(){if(this.el)this.setElement(i.result(this,\"el\"),!1);else{var t=i.extend({},i.result(this,\"attributes\"));this.id&&(t.id=i.result(this,\"id\")),this.className&&(t[\"class\"]=i.result(this,\"className\"));var n=e.$(\"<\"+i.result(this,\"tagName\")+\">\").attr(t);this.setElement(n,!1)}}}),e.sync=function(t,n,s){var r=E[t];i.defaults(s||(s={}),{emulateHTTP:e.emulateHTTP,emulateJSON:e.emulateJSON});var a={type:r,dataType:\"json\"};if(s.url||(a.url=i.result(n,\"url\")||j()),null!=s.data||!n||\"create\"!==t&&\"update\"!==t&&\"patch\"!==t||(a.contentType=\"application/json\",a.data=JSON.stringify(s.attrs||n.toJSON(s))),s.emulateJSON&&(a.contentType=\"application/x-www-form-urlencoded\",a.data=a.data?{model:a.data}:{}),s.emulateHTTP&&(\"PUT\"===r||\"DELETE\"===r||\"PATCH\"===r)){a.type=\"POST\",s.emulateJSON&&(a.data._method=r);var o=s.beforeSend;s.beforeSend=function(t){if(t.setRequestHeader(\"X-HTTP-Method-Override\",r),o)return o.apply(this,arguments)}}\"GET\"===a.type||s.emulateJSON||(a.processData=!1),\"PATCH\"===a.type&&x&&(a.xhr=function(){return new ActiveXObject(\"Microsoft.XMLHTTP\")});var h=s.xhr=e.ajax(i.extend(a,s));return n.trigger(\"request\",n,h,s),h};var x=!(\"undefined\"==typeof window||!window.ActiveXObject||window.XMLHttpRequest&&(new XMLHttpRequest).dispatchEvent),E={create:\"POST\",update:\"PUT\",patch:\"PATCH\",\"delete\":\"DELETE\",read:\"GET\"};e.ajax=function(){return e.$.ajax.apply(e.$,arguments)};var k=e.Router=function(t){t||(t={}),t.routes&&(this.routes=t.routes),this._bindRoutes(),this.initialize.apply(this,arguments)},T=/\\((.*?)\\)/g,$=/(\\(\\?)?:\\w+/g,S=/\\*\\w+/g,H=/[\\-{}\\[\\]+?.,\\\\\\^$|#\\s]/g;i.extend(k.prototype,o,{initialize:function(){},route:function(t,n,s){i.isRegExp(t)||(t=this._routeToRegExp(t)),i.isFunction(n)&&(s=n,n=\"\"),s||(s=this[n]);var r=this;return e.history.route(t,function(i){var a=r._extractParameters(t,i);r.execute(s,a),r.trigger.apply(r,[\"route:\"+n].concat(a)),r.trigger(\"route\",n,a),e.history.trigger(\"route\",r,n,a)}),this},execute:function(t,e){t&&t.apply(this,e)},navigate:function(t,i){return e.history.navigate(t,i),this},_bindRoutes:function(){if(this.routes){this.routes=i.result(this,\"routes\");for(var t,e=i.keys(this.routes);null!=(t=e.pop());)this.route(t,this.routes[t])}},_routeToRegExp:function(t){return t=t.replace(H,\"\\\\$&\").replace(T,\"(?:$1)?\").replace($,function(t,e){return e?t:\"([^/?]+)\"}).replace(S,\"([^?]*?)\"),new RegExp(\"^\"+t+\"(?:\\\\?([\\\\s\\\\S]*))?$\")},_extractParameters:function(t,e){var n=t.exec(e).slice(1);return i.map(n,function(t,e){return e===n.length-1?t||null:t?decodeURIComponent(t):null})}});var A=e.History=function(){this.handlers=[],i.bindAll(this,\"checkUrl\"),\"undefined\"!=typeof window&&(this.location=window.location,this.history=window.history)},I=/^[#\\/]|\\s+$/g,N=/^\\/+|\\/+$/g,R=/msie [\\w.]+/,O=/\\/$/,P=/#.*$/;A.started=!1,i.extend(A.prototype,o,{interval:50,atRoot:function(){return this.location.pathname.replace(/[^\\/]$/,\"$&/\")===this.root},getHash:function(t){var e=(t||this).location.href.match(/#(.*)$/);return e?e[1]:\"\"},getFragment:function(t,e){if(null==t)if(this._hasPushState||!this._wantsHashChange||e){t=decodeURI(this.location.pathname+this.location.search);var i=this.root.replace(O,\"\");t.indexOf(i)||(t=t.slice(i.length))}else t=this.getHash();return t.replace(I,\"\")},start:function(t){if(A.started)throw new Error(\"Backbone.history has already been started\");A.started=!0,this.options=i.extend({root:\"/\"},this.options,t),this.root=this.options.root,this._wantsHashChange=this.options.hashChange!==!1,this._wantsPushState=!!this.options.pushState,this._hasPushState=!!(this.options.pushState&&this.history&&this.history.pushState);var n=this.getFragment(),s=document.documentMode,r=R.exec(navigator.userAgent.toLowerCase())&&(!s||s<=7);if(this.root=(\"/\"+this.root+\"/\").replace(N,\"/\"),r&&this._wantsHashChange){var a=e.$('<iframe src=\"javascript:0\" tabindex=\"-1\">');this.iframe=a.hide().appendTo(\"body\")[0].contentWindow,this.navigate(n)}this._hasPushState?e.$(window).on(\"popstate\",this.checkUrl):this._wantsHashChange&&\"onhashchange\"in window&&!r?e.$(window).on(\"hashchange\",this.checkUrl):this._wantsHashChange&&(this._checkUrlInterval=setInterval(this.checkUrl,this.interval)),this.fragment=n;var o=this.location;if(this._wantsHashChange&&this._wantsPushState){if(!this._hasPushState&&!this.atRoot())return this.fragment=this.getFragment(null,!0),this.location.replace(this.root+\"#\"+this.fragment),!0;this._hasPushState&&this.atRoot()&&o.hash&&(this.fragment=this.getHash().replace(I,\"\"),this.history.replaceState({},document.title,this.root+this.fragment))}if(!this.options.silent)return this.loadUrl()},stop:function(){e.$(window).off(\"popstate\",this.checkUrl).off(\"hashchange\",this.checkUrl),this._checkUrlInterval&&clearInterval(this._checkUrlInterval),A.started=!1},route:function(t,e){this.handlers.unshift({route:t,callback:e})},checkUrl:function(t){var e=this.getFragment();return e===this.fragment&&this.iframe&&(e=this.getFragment(this.getHash(this.iframe))),e!==this.fragment&&(this.iframe&&this.navigate(e),void this.loadUrl())},loadUrl:function(t){return t=this.fragment=this.getFragment(t),i.any(this.handlers,function(e){if(e.route.test(t))return e.callback(t),!0})},navigate:function(t,e){if(!A.started)return!1;e&&e!==!0||(e={trigger:!!e});var i=this.root+(t=this.getFragment(t||\"\"));if(t=t.replace(P,\"\"),this.fragment!==t){if(this.fragment=t,\"\"===t&&\"/\"!==i&&(i=i.slice(0,-1)),this._hasPushState)this.history[e.replace?\"replaceState\":\"pushState\"]({},document.title,i);else{if(!this._wantsHashChange)return this.location.assign(i);this._updateHash(this.location,t,e.replace),this.iframe&&t!==this.getFragment(this.getHash(this.iframe))&&(e.replace||this.iframe.document.open().close(),this._updateHash(this.iframe.location,t,e.replace))}return e.trigger?this.loadUrl(t):void 0}},_updateHash:function(t,e,i){if(i){var n=t.href.replace(/(javascript:|#).*$/,\"\");t.replace(n+\"#\"+e)}else t.hash=\"#\"+e}}),e.history=new A;var C=function(t,e){var n,s=this;n=t&&i.has(t,\"constructor\")?t.constructor:function(){return s.apply(this,arguments)},i.extend(n,s,e);var r=function(){this.constructor=n};return r.prototype=s.prototype,n.prototype=new r,t&&i.extend(n.prototype,t),n.__super__=s.prototype,n};d.extend=p.extend=k.extend=_.extend=A.extend=C;var j=function(){throw new Error('A \"url\" property or function must be specified')},U=function(t,e){var i=e.error;e.error=function(n){i&&i(t,n,e),t.trigger(\"error\",t,n,e)}};return e}),Backbone.View=function(t){return t.extend({constructor:function(e){this.options=e||{},t.apply(this,arguments)}})}(Backbone.View);"
  },
  {
    "path": "src/main/resources/static/swagger/lib/es5-shim.js",
    "content": "!function(t,e){\"use strict\";\"function\"==typeof define&&define.amd?define(e):\"object\"==typeof exports?module.exports=e():t.returnExports=e()}(this,function(){var t,e,r=Array,n=r.prototype,o=Object,i=o.prototype,a=Function,u=a.prototype,f=String,s=f.prototype,l=Number,c=l.prototype,h=n.slice,p=n.splice,y=n.push,d=n.unshift,g=n.concat,v=n.join,b=u.call,w=u.apply,T=Math.max,m=Math.min,D=i.toString,x=\"function\"==typeof Symbol&&\"symbol\"==typeof Symbol.toStringTag,S=Function.prototype.toString,O=/^\\s*class /,j=function(t){try{var e=S.call(t),r=e.replace(/\\/\\/.*\\n/g,\"\"),n=r.replace(/\\/\\*[.\\s\\S]*\\*\\//g,\"\"),o=n.replace(/\\n/gm,\" \").replace(/ {2}/g,\" \");return O.test(o)}catch(i){return!1}},E=function(t){try{return!j(t)&&(S.call(t),!0)}catch(e){return!1}},M=\"[object Function]\",I=\"[object GeneratorFunction]\",t=function(t){if(!t)return!1;if(\"function\"!=typeof t&&\"object\"!=typeof t)return!1;if(x)return E(t);if(j(t))return!1;var e=D.call(t);return e===M||e===I},U=RegExp.prototype.exec,F=function(t){try{return U.call(t),!0}catch(e){return!1}},N=\"[object RegExp]\";e=function(t){return\"object\"==typeof t&&(x?F(t):D.call(t)===N)};var k,C=String.prototype.valueOf,R=function(t){try{return C.call(t),!0}catch(e){return!1}},A=\"[object String]\";k=function(t){return\"string\"==typeof t||\"object\"==typeof t&&(x?R(t):D.call(t)===A)};var $=o.defineProperty&&function(){try{var t={};o.defineProperty(t,\"x\",{enumerable:!1,value:t});for(var e in t)return!1;return t.x===t}catch(r){return!1}}(),P=function(t){var e;return e=$?function(t,e,r,n){!n&&e in t||o.defineProperty(t,e,{configurable:!0,enumerable:!1,writable:!0,value:r})}:function(t,e,r,n){!n&&e in t||(t[e]=r)},function(r,n,o){for(var i in n)t.call(n,i)&&e(r,i,n[i],o)}}(i.hasOwnProperty),J=function(t){var e=typeof t;return null===t||\"object\"!==e&&\"function\"!==e},Z=l.isNaN||function(t){return t!==t},z={ToInteger:function(t){var e=+t;return Z(e)?e=0:0!==e&&e!==1/0&&e!==-(1/0)&&(e=(e>0||-1)*Math.floor(Math.abs(e))),e},ToPrimitive:function(e){var r,n,o;if(J(e))return e;if(n=e.valueOf,t(n)&&(r=n.call(e),J(r)))return r;if(o=e.toString,t(o)&&(r=o.call(e),J(r)))return r;throw new TypeError},ToObject:function(t){if(null==t)throw new TypeError(\"can't convert \"+t+\" to object\");return o(t)},ToUint32:function(t){return t>>>0}},G=function(){};P(u,{bind:function(e){var r=this;if(!t(r))throw new TypeError(\"Function.prototype.bind called on incompatible \"+r);for(var n,i=h.call(arguments,1),u=function(){if(this instanceof n){var t=w.call(r,this,g.call(i,h.call(arguments)));return o(t)===t?t:this}return w.call(r,e,g.call(i,h.call(arguments)))},f=T(0,r.length-i.length),s=[],l=0;l<f;l++)y.call(s,\"$\"+l);return n=a(\"binder\",\"return function (\"+v.call(s,\",\")+\"){ return binder.apply(this, arguments); }\")(u),r.prototype&&(G.prototype=r.prototype,n.prototype=new G,G.prototype=null),n}});var Y=b.bind(i.hasOwnProperty),B=b.bind(i.toString),H=b.bind(h),W=w.bind(h),L=b.bind(s.slice),X=b.bind(s.split),q=b.bind(s.indexOf),K=b.bind(y),Q=b.bind(i.propertyIsEnumerable),V=b.bind(n.sort),_=r.isArray||function(t){return\"[object Array]\"===B(t)},tt=1!==[].unshift(0);P(n,{unshift:function(){return d.apply(this,arguments),this.length}},tt),P(r,{isArray:_});var et=o(\"a\"),rt=\"a\"!==et[0]||!(0 in et),nt=function(t){var e=!0,r=!0,n=!1;if(t)try{t.call(\"foo\",function(t,r,n){\"object\"!=typeof n&&(e=!1)}),t.call([1],function(){\"use strict\";r=\"string\"==typeof this},\"x\")}catch(o){n=!0}return!!t&&!n&&e&&r};P(n,{forEach:function(e){var r,n=z.ToObject(this),o=rt&&k(this)?X(this,\"\"):n,i=-1,a=z.ToUint32(o.length);if(arguments.length>1&&(r=arguments[1]),!t(e))throw new TypeError(\"Array.prototype.forEach callback must be a function\");for(;++i<a;)i in o&&(\"undefined\"==typeof r?e(o[i],i,n):e.call(r,o[i],i,n))}},!nt(n.forEach)),P(n,{map:function(e){var n,o=z.ToObject(this),i=rt&&k(this)?X(this,\"\"):o,a=z.ToUint32(i.length),u=r(a);if(arguments.length>1&&(n=arguments[1]),!t(e))throw new TypeError(\"Array.prototype.map callback must be a function\");for(var f=0;f<a;f++)f in i&&(\"undefined\"==typeof n?u[f]=e(i[f],f,o):u[f]=e.call(n,i[f],f,o));return u}},!nt(n.map)),P(n,{filter:function(e){var r,n,o=z.ToObject(this),i=rt&&k(this)?X(this,\"\"):o,a=z.ToUint32(i.length),u=[];if(arguments.length>1&&(n=arguments[1]),!t(e))throw new TypeError(\"Array.prototype.filter callback must be a function\");for(var f=0;f<a;f++)f in i&&(r=i[f],(\"undefined\"==typeof n?e(r,f,o):e.call(n,r,f,o))&&K(u,r));return u}},!nt(n.filter)),P(n,{every:function(e){var r,n=z.ToObject(this),o=rt&&k(this)?X(this,\"\"):n,i=z.ToUint32(o.length);if(arguments.length>1&&(r=arguments[1]),!t(e))throw new TypeError(\"Array.prototype.every callback must be a function\");for(var a=0;a<i;a++)if(a in o&&!(\"undefined\"==typeof r?e(o[a],a,n):e.call(r,o[a],a,n)))return!1;return!0}},!nt(n.every)),P(n,{some:function(e){var r,n=z.ToObject(this),o=rt&&k(this)?X(this,\"\"):n,i=z.ToUint32(o.length);if(arguments.length>1&&(r=arguments[1]),!t(e))throw new TypeError(\"Array.prototype.some callback must be a function\");for(var a=0;a<i;a++)if(a in o&&(\"undefined\"==typeof r?e(o[a],a,n):e.call(r,o[a],a,n)))return!0;return!1}},!nt(n.some));var ot=!1;n.reduce&&(ot=\"object\"==typeof n.reduce.call(\"es5\",function(t,e,r,n){return n})),P(n,{reduce:function(e){var r=z.ToObject(this),n=rt&&k(this)?X(this,\"\"):r,o=z.ToUint32(n.length);if(!t(e))throw new TypeError(\"Array.prototype.reduce callback must be a function\");if(0===o&&1===arguments.length)throw new TypeError(\"reduce of empty array with no initial value\");var i,a=0;if(arguments.length>=2)i=arguments[1];else for(;;){if(a in n){i=n[a++];break}if(++a>=o)throw new TypeError(\"reduce of empty array with no initial value\")}for(;a<o;a++)a in n&&(i=e(i,n[a],a,r));return i}},!ot);var it=!1;n.reduceRight&&(it=\"object\"==typeof n.reduceRight.call(\"es5\",function(t,e,r,n){return n})),P(n,{reduceRight:function(e){var r=z.ToObject(this),n=rt&&k(this)?X(this,\"\"):r,o=z.ToUint32(n.length);if(!t(e))throw new TypeError(\"Array.prototype.reduceRight callback must be a function\");if(0===o&&1===arguments.length)throw new TypeError(\"reduceRight of empty array with no initial value\");var i,a=o-1;if(arguments.length>=2)i=arguments[1];else for(;;){if(a in n){i=n[a--];break}if(--a<0)throw new TypeError(\"reduceRight of empty array with no initial value\")}if(a<0)return i;do a in n&&(i=e(i,n[a],a,r));while(a--);return i}},!it);var at=n.indexOf&&[0,1].indexOf(1,2)!==-1;P(n,{indexOf:function(t){var e=rt&&k(this)?X(this,\"\"):z.ToObject(this),r=z.ToUint32(e.length);if(0===r)return-1;var n=0;for(arguments.length>1&&(n=z.ToInteger(arguments[1])),n=n>=0?n:T(0,r+n);n<r;n++)if(n in e&&e[n]===t)return n;return-1}},at);var ut=n.lastIndexOf&&[0,1].lastIndexOf(0,-3)!==-1;P(n,{lastIndexOf:function(t){var e=rt&&k(this)?X(this,\"\"):z.ToObject(this),r=z.ToUint32(e.length);if(0===r)return-1;var n=r-1;for(arguments.length>1&&(n=m(n,z.ToInteger(arguments[1]))),n=n>=0?n:r-Math.abs(n);n>=0;n--)if(n in e&&t===e[n])return n;return-1}},ut);var ft=function(){var t=[1,2],e=t.splice();return 2===t.length&&_(e)&&0===e.length}();P(n,{splice:function(t,e){return 0===arguments.length?[]:p.apply(this,arguments)}},!ft);var st=function(){var t={};return n.splice.call(t,0,0,1),1===t.length}();P(n,{splice:function(t,e){if(0===arguments.length)return[];var r=arguments;return this.length=T(z.ToInteger(this.length),0),arguments.length>0&&\"number\"!=typeof e&&(r=H(arguments),r.length<2?K(r,this.length-t):r[1]=z.ToInteger(e)),p.apply(this,r)}},!st);var lt=function(){var t=new r(1e5);return t[8]=\"x\",t.splice(1,1),7===t.indexOf(\"x\")}(),ct=function(){var t=256,e=[];return e[t]=\"a\",e.splice(t+1,0,\"b\"),\"a\"===e[t]}();P(n,{splice:function(t,e){for(var r,n=z.ToObject(this),o=[],i=z.ToUint32(n.length),a=z.ToInteger(t),u=a<0?T(i+a,0):m(a,i),s=m(T(z.ToInteger(e),0),i-u),l=0;l<s;)r=f(u+l),Y(n,r)&&(o[l]=n[r]),l+=1;var c,h=H(arguments,2),p=h.length;if(p<s){l=u;for(var y=i-s;l<y;)r=f(l+s),c=f(l+p),Y(n,r)?n[c]=n[r]:delete n[c],l+=1;l=i;for(var d=i-s+p;l>d;)delete n[l-1],l-=1}else if(p>s)for(l=i-s;l>u;)r=f(l+s-1),c=f(l+p-1),Y(n,r)?n[c]=n[r]:delete n[c],l-=1;l=u;for(var g=0;g<h.length;++g)n[l]=h[g],l+=1;return n.length=i-s+p,o}},!lt||!ct);var ht,pt=n.join;try{ht=\"1,2,3\"!==Array.prototype.join.call(\"123\",\",\")}catch(yt){ht=!0}ht&&P(n,{join:function(t){var e=\"undefined\"==typeof t?\",\":t;return pt.call(k(this)?X(this,\"\"):this,e)}},ht);var dt=\"1,2\"!==[1,2].join(void 0);dt&&P(n,{join:function(t){var e=\"undefined\"==typeof t?\",\":t;return pt.call(this,e)}},dt);var gt=function(t){for(var e=z.ToObject(this),r=z.ToUint32(e.length),n=0;n<arguments.length;)e[r+n]=arguments[n],n+=1;return e.length=r+n,r+n},vt=function(){var t={},e=Array.prototype.push.call(t,void 0);return 1!==e||1!==t.length||\"undefined\"!=typeof t[0]||!Y(t,0)}();P(n,{push:function(t){return _(this)?y.apply(this,arguments):gt.apply(this,arguments)}},vt);var bt=function(){var t=[],e=t.push(void 0);return 1!==e||1!==t.length||\"undefined\"!=typeof t[0]||!Y(t,0)}();P(n,{push:gt},bt),P(n,{slice:function(t,e){var r=k(this)?X(this,\"\"):this;return W(r,arguments)}},rt);var wt=function(){try{return[1,2].sort(null),[1,2].sort({}),!0}catch(t){}return!1}(),Tt=function(){try{return[1,2].sort(/a/),!1}catch(t){}return!0}(),mt=function(){try{return[1,2].sort(void 0),!0}catch(t){}return!1}();P(n,{sort:function(e){if(\"undefined\"==typeof e)return V(this);if(!t(e))throw new TypeError(\"Array.prototype.sort callback must be a function\");return V(this,e)}},wt||!mt||!Tt);var Dt=!Q({toString:null},\"toString\"),xt=Q(function(){},\"prototype\"),St=!Y(\"x\",\"0\"),Ot=function(t){var e=t.constructor;return e&&e.prototype===t},jt={$window:!0,$console:!0,$parent:!0,$self:!0,$frame:!0,$frames:!0,$frameElement:!0,$webkitIndexedDB:!0,$webkitStorageInfo:!0,$external:!0},Et=function(){if(\"undefined\"==typeof window)return!1;for(var t in window)try{!jt[\"$\"+t]&&Y(window,t)&&null!==window[t]&&\"object\"==typeof window[t]&&Ot(window[t])}catch(e){return!0}return!1}(),Mt=function(t){if(\"undefined\"==typeof window||!Et)return Ot(t);try{return Ot(t)}catch(e){return!1}},It=[\"toString\",\"toLocaleString\",\"valueOf\",\"hasOwnProperty\",\"isPrototypeOf\",\"propertyIsEnumerable\",\"constructor\"],Ut=It.length,Ft=function(t){return\"[object Arguments]\"===B(t)},Nt=function(e){return null!==e&&\"object\"==typeof e&&\"number\"==typeof e.length&&e.length>=0&&!_(e)&&t(e.callee)},kt=Ft(arguments)?Ft:Nt;P(o,{keys:function(e){var r=t(e),n=kt(e),o=null!==e&&\"object\"==typeof e,i=o&&k(e);if(!o&&!r&&!n)throw new TypeError(\"Object.keys called on a non-object\");var a=[],u=xt&&r;if(i&&St||n)for(var s=0;s<e.length;++s)K(a,f(s));if(!n)for(var l in e)u&&\"prototype\"===l||!Y(e,l)||K(a,f(l));if(Dt)for(var c=Mt(e),h=0;h<Ut;h++){var p=It[h];c&&\"constructor\"===p||!Y(e,p)||K(a,p)}return a}});var Ct=o.keys&&function(){return 2===o.keys(arguments).length}(1,2),Rt=o.keys&&function(){var t=o.keys(arguments);return 1!==arguments.length||1!==t.length||1!==t[0]}(1),At=o.keys;P(o,{keys:function(t){return At(kt(t)?H(t):t)}},!Ct||Rt);var $t,Pt,Jt=0!==new Date((-0xc782b5b342b24)).getUTCMonth(),Zt=new Date((-0x55d318d56a724)),zt=new Date(14496624e5),Gt=\"Mon, 01 Jan -45875 11:59:59 GMT\"!==Zt.toUTCString(),Yt=Zt.getTimezoneOffset();Yt<-720?($t=\"Tue Jan 02 -45875\"!==Zt.toDateString(),Pt=!/^Thu Dec 10 2015 \\d\\d:\\d\\d:\\d\\d GMT[-\\+]\\d\\d\\d\\d(?: |$)/.test(zt.toString())):($t=\"Mon Jan 01 -45875\"!==Zt.toDateString(),Pt=!/^Wed Dec 09 2015 \\d\\d:\\d\\d:\\d\\d GMT[-\\+]\\d\\d\\d\\d(?: |$)/.test(zt.toString()));var Bt=b.bind(Date.prototype.getFullYear),Ht=b.bind(Date.prototype.getMonth),Wt=b.bind(Date.prototype.getDate),Lt=b.bind(Date.prototype.getUTCFullYear),Xt=b.bind(Date.prototype.getUTCMonth),qt=b.bind(Date.prototype.getUTCDate),Kt=b.bind(Date.prototype.getUTCDay),Qt=b.bind(Date.prototype.getUTCHours),Vt=b.bind(Date.prototype.getUTCMinutes),_t=b.bind(Date.prototype.getUTCSeconds),te=b.bind(Date.prototype.getUTCMilliseconds),ee=[\"Sun\",\"Mon\",\"Tue\",\"Wed\",\"Thu\",\"Fri\",\"Sat\"],re=[\"Jan\",\"Feb\",\"Mar\",\"Apr\",\"May\",\"Jun\",\"Jul\",\"Aug\",\"Sep\",\"Oct\",\"Nov\",\"Dec\"],ne=function(t,e){return Wt(new Date(e,t,0))};P(Date.prototype,{getFullYear:function(){if(!(this&&this instanceof Date))throw new TypeError(\"this is not a Date object.\");var t=Bt(this);return t<0&&Ht(this)>11?t+1:t},getMonth:function(){if(!(this&&this instanceof Date))throw new TypeError(\"this is not a Date object.\");var t=Bt(this),e=Ht(this);return t<0&&e>11?0:e},getDate:function(){if(!(this&&this instanceof Date))throw new TypeError(\"this is not a Date object.\");var t=Bt(this),e=Ht(this),r=Wt(this);if(t<0&&e>11){if(12===e)return r;var n=ne(0,t+1);return n-r+1}return r},getUTCFullYear:function(){if(!(this&&this instanceof Date))throw new TypeError(\"this is not a Date object.\");var t=Lt(this);return t<0&&Xt(this)>11?t+1:t},getUTCMonth:function(){if(!(this&&this instanceof Date))throw new TypeError(\"this is not a Date object.\");var t=Lt(this),e=Xt(this);return t<0&&e>11?0:e},getUTCDate:function(){if(!(this&&this instanceof Date))throw new TypeError(\"this is not a Date object.\");var t=Lt(this),e=Xt(this),r=qt(this);if(t<0&&e>11){if(12===e)return r;var n=ne(0,t+1);return n-r+1}return r}},Jt),P(Date.prototype,{toUTCString:function(){if(!(this&&this instanceof Date))throw new TypeError(\"this is not a Date object.\");var t=Kt(this),e=qt(this),r=Xt(this),n=Lt(this),o=Qt(this),i=Vt(this),a=_t(this);return ee[t]+\", \"+(e<10?\"0\"+e:e)+\" \"+re[r]+\" \"+n+\" \"+(o<10?\"0\"+o:o)+\":\"+(i<10?\"0\"+i:i)+\":\"+(a<10?\"0\"+a:a)+\" GMT\"}},Jt||Gt),P(Date.prototype,{toDateString:function(){if(!(this&&this instanceof Date))throw new TypeError(\"this is not a Date object.\");var t=this.getDay(),e=this.getDate(),r=this.getMonth(),n=this.getFullYear();return ee[t]+\" \"+re[r]+\" \"+(e<10?\"0\"+e:e)+\" \"+n}},Jt||$t),(Jt||Pt)&&(Date.prototype.toString=function(){if(!(this&&this instanceof Date))throw new TypeError(\"this is not a Date object.\");var t=this.getDay(),e=this.getDate(),r=this.getMonth(),n=this.getFullYear(),o=this.getHours(),i=this.getMinutes(),a=this.getSeconds(),u=this.getTimezoneOffset(),f=Math.floor(Math.abs(u)/60),s=Math.floor(Math.abs(u)%60);return ee[t]+\" \"+re[r]+\" \"+(e<10?\"0\"+e:e)+\" \"+n+\" \"+(o<10?\"0\"+o:o)+\":\"+(i<10?\"0\"+i:i)+\":\"+(a<10?\"0\"+a:a)+\" GMT\"+(u>0?\"-\":\"+\")+(f<10?\"0\"+f:f)+(s<10?\"0\"+s:s)},$&&o.defineProperty(Date.prototype,\"toString\",{configurable:!0,enumerable:!1,writable:!0}));var oe=-621987552e5,ie=\"-000001\",ae=Date.prototype.toISOString&&new Date(oe).toISOString().indexOf(ie)===-1,ue=Date.prototype.toISOString&&\"1969-12-31T23:59:59.999Z\"!==new Date((-1)).toISOString(),fe=b.bind(Date.prototype.getTime);P(Date.prototype,{toISOString:function(){if(!isFinite(this)||!isFinite(fe(this)))throw new RangeError(\"Date.prototype.toISOString called on non-finite value.\");var t=Lt(this),e=Xt(this);t+=Math.floor(e/12),e=(e%12+12)%12;var r=[e+1,qt(this),Qt(this),Vt(this),_t(this)];t=(t<0?\"-\":t>9999?\"+\":\"\")+L(\"00000\"+Math.abs(t),0<=t&&t<=9999?-4:-6);for(var n=0;n<r.length;++n)r[n]=L(\"00\"+r[n],-2);return t+\"-\"+H(r,0,2).join(\"-\")+\"T\"+H(r,2).join(\":\")+\".\"+L(\"000\"+te(this),-3)+\"Z\"}},ae||ue);var se=function(){try{return Date.prototype.toJSON&&null===new Date(NaN).toJSON()&&new Date(oe).toJSON().indexOf(ie)!==-1&&Date.prototype.toJSON.call({toISOString:function(){return!0}})}catch(t){return!1}}();se||(Date.prototype.toJSON=function(e){var r=o(this),n=z.ToPrimitive(r);if(\"number\"==typeof n&&!isFinite(n))return null;var i=r.toISOString;if(!t(i))throw new TypeError(\"toISOString property is not callable\");return i.call(r)});var le=1e15===Date.parse(\"+033658-09-27T01:46:40.000Z\"),ce=!isNaN(Date.parse(\"2012-04-04T24:00:00.500Z\"))||!isNaN(Date.parse(\"2012-11-31T23:59:59.000Z\"))||!isNaN(Date.parse(\"2012-12-31T23:59:60.000Z\")),he=isNaN(Date.parse(\"2000-01-01T00:00:00.000Z\"));if(he||ce||!le){var pe=Math.pow(2,31)-1,ye=Z(new Date(1970,0,1,0,0,0,pe+1).getTime());Date=function(t){var e=function(r,n,o,i,a,u,s){var l,c=arguments.length;if(this instanceof t){var h=u,p=s;if(ye&&c>=7&&s>pe){var y=Math.floor(s/pe)*pe,d=Math.floor(y/1e3);h+=d,p-=1e3*d}l=1===c&&f(r)===r?new t(e.parse(r)):c>=7?new t(r,n,o,i,a,h,p):c>=6?new t(r,n,o,i,a,h):c>=5?new t(r,n,o,i,a):c>=4?new t(r,n,o,i):c>=3?new t(r,n,o):c>=2?new t(r,n):c>=1?new t(r instanceof t?+r:r):new t}else l=t.apply(this,arguments);return J(l)||P(l,{constructor:e},!0),l},r=new RegExp(\"^(\\\\d{4}|[+-]\\\\d{6})(?:-(\\\\d{2})(?:-(\\\\d{2})(?:T(\\\\d{2}):(\\\\d{2})(?::(\\\\d{2})(?:(\\\\.\\\\d{1,}))?)?(Z|(?:([-+])(\\\\d{2}):(\\\\d{2})))?)?)?)?$\"),n=[0,31,59,90,120,151,181,212,243,273,304,334,365],o=function(t,e){var r=e>1?1:0;return n[e]+Math.floor((t-1969+r)/4)-Math.floor((t-1901+r)/100)+Math.floor((t-1601+r)/400)+365*(t-1970)},i=function(e){var r=0,n=e;if(ye&&n>pe){var o=Math.floor(n/pe)*pe,i=Math.floor(o/1e3);r+=i,n-=1e3*i}return l(new t(1970,0,1,0,0,r,n))};for(var a in t)Y(t,a)&&(e[a]=t[a]);P(e,{now:t.now,UTC:t.UTC},!0),e.prototype=t.prototype,P(e.prototype,{constructor:e},!0);var u=function(e){var n=r.exec(e);if(n){var a,u=l(n[1]),f=l(n[2]||1)-1,s=l(n[3]||1)-1,c=l(n[4]||0),h=l(n[5]||0),p=l(n[6]||0),y=Math.floor(1e3*l(n[7]||0)),d=Boolean(n[4]&&!n[8]),g=\"-\"===n[9]?1:-1,v=l(n[10]||0),b=l(n[11]||0),w=h>0||p>0||y>0;return c<(w?24:25)&&h<60&&p<60&&y<1e3&&f>-1&&f<12&&v<24&&b<60&&s>-1&&s<o(u,f+1)-o(u,f)&&(a=60*(24*(o(u,f)+s)+c+v*g),a=1e3*(60*(a+h+b*g)+p)+y,d&&(a=i(a)),-864e13<=a&&a<=864e13)?a:NaN}return t.parse.apply(this,arguments)};return P(e,{parse:u}),e}(Date)}Date.now||(Date.now=function(){return(new Date).getTime()});var de=c.toFixed&&(\"0.000\"!==8e-5.toFixed(3)||\"1\"!==.9.toFixed(0)||\"1.25\"!==1.255.toFixed(2)||\"1000000000000000128\"!==(0xde0b6b3a7640080).toFixed(0)),ge={base:1e7,size:6,data:[0,0,0,0,0,0],multiply:function(t,e){for(var r=-1,n=e;++r<ge.size;)n+=t*ge.data[r],ge.data[r]=n%ge.base,n=Math.floor(n/ge.base)},divide:function(t){for(var e=ge.size,r=0;--e>=0;)r+=ge.data[e],ge.data[e]=Math.floor(r/t),r=r%t*ge.base},numToString:function(){for(var t=ge.size,e=\"\";--t>=0;)if(\"\"!==e||0===t||0!==ge.data[t]){var r=f(ge.data[t]);\"\"===e?e=r:e+=L(\"0000000\",0,7-r.length)+r}return e},pow:function Ae(t,e,r){return 0===e?r:e%2===1?Ae(t,e-1,r*t):Ae(t*t,e/2,r)},log:function(t){for(var e=0,r=t;r>=4096;)e+=12,r/=4096;for(;r>=2;)e+=1,r/=2;return e}},ve=function(t){var e,r,n,o,i,a,u,s;if(e=l(t),e=Z(e)?0:Math.floor(e),e<0||e>20)throw new RangeError(\"Number.toFixed called with invalid number of decimals\");if(r=l(this),Z(r))return\"NaN\";if(r<=-1e21||r>=1e21)return f(r);if(n=\"\",r<0&&(n=\"-\",r=-r),o=\"0\",r>1e-21)if(i=ge.log(r*ge.pow(2,69,1))-69,a=i<0?r*ge.pow(2,-i,1):r/ge.pow(2,i,1),a*=4503599627370496,i=52-i,i>0){for(ge.multiply(0,a),u=e;u>=7;)ge.multiply(1e7,0),u-=7;for(ge.multiply(ge.pow(10,u,1),0),u=i-1;u>=23;)ge.divide(1<<23),u-=23;ge.divide(1<<u),ge.multiply(1,1),ge.divide(2),o=ge.numToString()}else ge.multiply(0,a),ge.multiply(1<<-i,0),o=ge.numToString()+L(\"0.00000000000000000000\",2,2+e);return e>0?(s=o.length,o=s<=e?n+L(\"0.0000000000000000000\",0,e-s+2)+o:n+L(o,0,s-e)+\".\"+L(o,s-e)):o=n+o,o};P(c,{toFixed:ve},de);var be=function(){try{return\"1\"===1..toPrecision(void 0)}catch(t){return!0}}(),we=c.toPrecision;P(c,{toPrecision:function(t){return\"undefined\"==typeof t?we.call(this):we.call(this,t)}},be),2!==\"ab\".split(/(?:ab)*/).length||4!==\".\".split(/(.?)(.?)/).length||\"t\"===\"tesst\".split(/(s)*/)[1]||4!==\"test\".split(/(?:)/,-1).length||\"\".split(/.?/).length||\".\".split(/()()/).length>1?!function(){var t=\"undefined\"==typeof/()??/.exec(\"\")[1],r=Math.pow(2,32)-1;s.split=function(n,o){var i=String(this);if(\"undefined\"==typeof n&&0===o)return[];if(!e(n))return X(this,n,o);var a,u,f,s,l=[],c=(n.ignoreCase?\"i\":\"\")+(n.multiline?\"m\":\"\")+(n.unicode?\"u\":\"\")+(n.sticky?\"y\":\"\"),h=0,p=new RegExp(n.source,c+\"g\");t||(a=new RegExp(\"^\"+p.source+\"$(?!\\\\s)\",c));var d=\"undefined\"==typeof o?r:z.ToUint32(o);for(u=p.exec(i);u&&(f=u.index+u[0].length,!(f>h&&(K(l,L(i,h,u.index)),!t&&u.length>1&&u[0].replace(a,function(){for(var t=1;t<arguments.length-2;t++)\"undefined\"==typeof arguments[t]&&(u[t]=void 0)}),u.length>1&&u.index<i.length&&y.apply(l,H(u,1)),s=u[0].length,h=f,l.length>=d)));)p.lastIndex===u.index&&p.lastIndex++,u=p.exec(i);return h===i.length?!s&&p.test(\"\")||K(l,\"\"):K(l,L(i,h)),l.length>d?H(l,0,d):l}}():\"0\".split(void 0,0).length&&(s.split=function(t,e){return\"undefined\"==typeof t&&0===e?[]:X(this,t,e)});var Te=s.replace,me=function(){var t=[];return\"x\".replace(/x(.)?/g,function(e,r){K(t,r)}),1===t.length&&\"undefined\"==typeof t[0]}();me||(s.replace=function(r,n){var o=t(n),i=e(r)&&/\\)[*?]/.test(r.source);if(o&&i){var a=function(t){var e=arguments.length,o=r.lastIndex;r.lastIndex=0;var i=r.exec(t)||[];return r.lastIndex=o,K(i,arguments[e-2],arguments[e-1]),n.apply(this,i)};return Te.call(this,r,a)}return Te.call(this,r,n)});var De=s.substr,xe=\"\".substr&&\"b\"!==\"0b\".substr(-1);P(s,{substr:function(t,e){var r=t;return t<0&&(r=T(this.length+t,0)),De.call(this,r,e)}},xe);var Se=\"\\t\\n\\x0B\\f\\r   ᠎             　\\u2028\\u2029\\ufeff\",Oe=\"​\",je=\"[\"+Se+\"]\",Ee=new RegExp(\"^\"+je+je+\"*\"),Me=new RegExp(je+je+\"*$\"),Ie=s.trim&&(Se.trim()||!Oe.trim());P(s,{trim:function(){if(\"undefined\"==typeof this||null===this)throw new TypeError(\"can't convert \"+this+\" to object\");return f(this).replace(Ee,\"\").replace(Me,\"\")}},Ie);var Ue=b.bind(String.prototype.trim),Fe=s.lastIndexOf&&\"abcあい\".lastIndexOf(\"あい\",2)!==-1;P(s,{lastIndexOf:function(t){if(\"undefined\"==typeof this||null===this)throw new TypeError(\"can't convert \"+this+\" to object\");for(var e=f(this),r=f(t),n=arguments.length>1?l(arguments[1]):NaN,o=Z(n)?1/0:z.ToInteger(n),i=m(T(o,0),e.length),a=r.length,u=i+a;u>0;){u=T(0,u-a);var s=q(L(e,u,i+a),r);if(s!==-1)return u+s}return-1}},Fe);var Ne=s.lastIndexOf;if(P(s,{lastIndexOf:function(t){return Ne.apply(this,arguments)}},1!==s.lastIndexOf.length),8===parseInt(Se+\"08\")&&22===parseInt(Se+\"0x16\")||(parseInt=function(t){var e=/^[\\-+]?0[xX]/;return function(r,n){var o=Ue(String(r)),i=l(n)||(e.test(o)?16:10);return t(o,i)}}(parseInt)),1/parseFloat(\"-0\")!==-(1/0)&&(parseFloat=function(t){return function(e){var r=Ue(String(e)),n=t(r);return 0===n&&\"-\"===L(r,0,1)?-0:n}}(parseFloat)),\"RangeError: test\"!==String(new RangeError(\"test\"))){var ke=function(){if(\"undefined\"==typeof this||null===this)throw new TypeError(\"can't convert \"+this+\" to object\");var t=this.name;\"undefined\"==typeof t?t=\"Error\":\"string\"!=typeof t&&(t=f(t));var e=this.message;return\"undefined\"==typeof e?e=\"\":\"string\"!=typeof e&&(e=f(e)),t?e?t+\": \"+e:t:e};Error.prototype.toString=ke}if($){var Ce=function(t,e){if(Q(t,e)){var r=Object.getOwnPropertyDescriptor(t,e);r.configurable&&(r.enumerable=!1,Object.defineProperty(t,e,r))}};Ce(Error.prototype,\"message\"),\"\"!==Error.prototype.message&&(Error.prototype.message=\"\"),Ce(Error.prototype,\"name\")}if(\"/a/gim\"!==String(/a/gim)){var Re=function(){var t=\"/\"+this.source+\"/\";return this.global&&(t+=\"g\"),this.ignoreCase&&(t+=\"i\"),this.multiline&&(t+=\"m\"),t};RegExp.prototype.toString=Re}});"
  },
  {
    "path": "src/main/resources/static/swagger/lib/handlebars-4.0.5.js",
    "content": "!function(t,e){\"object\"==typeof exports&&\"object\"==typeof module?module.exports=e():\"function\"==typeof define&&define.amd?define([],e):\"object\"==typeof exports?exports.Handlebars=e():t.Handlebars=e()}(this,function(){return function(t){function e(s){if(r[s])return r[s].exports;var i=r[s]={exports:{},id:s,loaded:!1};return t[s].call(i.exports,i,i.exports,e),i.loaded=!0,i.exports}var r={};return e.m=t,e.c=r,e.p=\"\",e(0)}([function(t,e,r){\"use strict\";function s(){var t=v();return t.compile=function(e,r){return l.compile(e,r,t)},t.precompile=function(e,r){return l.precompile(e,r,t)},t.AST=c[\"default\"],t.Compiler=l.Compiler,t.JavaScriptCompiler=u[\"default\"],t.Parser=h.parser,t.parse=h.parse,t}var i=r(1)[\"default\"];e.__esModule=!0;var a=r(2),n=i(a),o=r(21),c=i(o),h=r(22),l=r(27),p=r(28),u=i(p),f=r(25),d=i(f),m=r(20),g=i(m),v=n[\"default\"].create,y=s();y.create=s,g[\"default\"](y),y.Visitor=d[\"default\"],y[\"default\"]=y,e[\"default\"]=y,t.exports=e[\"default\"]},function(t,e){\"use strict\";e[\"default\"]=function(t){return t&&t.__esModule?t:{\"default\":t}},e.__esModule=!0},function(t,e,r){\"use strict\";function s(){var t=new o.HandlebarsEnvironment;return f.extend(t,o),t.SafeString=h[\"default\"],t.Exception=p[\"default\"],t.Utils=f,t.escapeExpression=f.escapeExpression,t.VM=m,t.template=function(e){return m.template(e,t)},t}var i=r(3)[\"default\"],a=r(1)[\"default\"];e.__esModule=!0;var n=r(4),o=i(n),c=r(18),h=a(c),l=r(6),p=a(l),u=r(5),f=i(u),d=r(19),m=i(d),g=r(20),v=a(g),y=s();y.create=s,v[\"default\"](y),y[\"default\"]=y,e[\"default\"]=y,t.exports=e[\"default\"]},function(t,e){\"use strict\";e[\"default\"]=function(t){if(t&&t.__esModule)return t;var e={};if(null!=t)for(var r in t)Object.prototype.hasOwnProperty.call(t,r)&&(e[r]=t[r]);return e[\"default\"]=t,e},e.__esModule=!0},function(t,e,r){\"use strict\";function s(t,e,r){this.helpers=t||{},this.partials=e||{},this.decorators=r||{},c.registerDefaultHelpers(this),h.registerDefaultDecorators(this)}var i=r(1)[\"default\"];e.__esModule=!0,e.HandlebarsEnvironment=s;var a=r(5),n=r(6),o=i(n),c=r(7),h=r(15),l=r(17),p=i(l),u=\"4.0.5\";e.VERSION=u;var f=7;e.COMPILER_REVISION=f;var d={1:\"<= 1.0.rc.2\",2:\"== 1.0.0-rc.3\",3:\"== 1.0.0-rc.4\",4:\"== 1.x.x\",5:\"== 2.0.0-alpha.x\",6:\">= 2.0.0-beta.1\",7:\">= 4.0.0\"};e.REVISION_CHANGES=d;var m=\"[object Object]\";s.prototype={constructor:s,logger:p[\"default\"],log:p[\"default\"].log,registerHelper:function(t,e){if(a.toString.call(t)===m){if(e)throw new o[\"default\"](\"Arg not supported with multiple helpers\");a.extend(this.helpers,t)}else this.helpers[t]=e},unregisterHelper:function(t){delete this.helpers[t]},registerPartial:function(t,e){if(a.toString.call(t)===m)a.extend(this.partials,t);else{if(\"undefined\"==typeof e)throw new o[\"default\"]('Attempting to register a partial called \"'+t+'\" as undefined');this.partials[t]=e}},unregisterPartial:function(t){delete this.partials[t]},registerDecorator:function(t,e){if(a.toString.call(t)===m){if(e)throw new o[\"default\"](\"Arg not supported with multiple decorators\");a.extend(this.decorators,t)}else this.decorators[t]=e},unregisterDecorator:function(t){delete this.decorators[t]}};var g=p[\"default\"].log;e.log=g,e.createFrame=a.createFrame,e.logger=p[\"default\"]},function(t,e){\"use strict\";function r(t){return l[t]}function s(t){for(var e=1;e<arguments.length;e++)for(var r in arguments[e])Object.prototype.hasOwnProperty.call(arguments[e],r)&&(t[r]=arguments[e][r]);return t}function i(t,e){for(var r=0,s=t.length;r<s;r++)if(t[r]===e)return r;return-1}function a(t){if(\"string\"!=typeof t){if(t&&t.toHTML)return t.toHTML();if(null==t)return\"\";if(!t)return t+\"\";t=\"\"+t}return u.test(t)?t.replace(p,r):t}function n(t){return!t&&0!==t||!(!m(t)||0!==t.length)}function o(t){var e=s({},t);return e._parent=t,e}function c(t,e){return t.path=e,t}function h(t,e){return(t?t+\".\":\"\")+e}e.__esModule=!0,e.extend=s,e.indexOf=i,e.escapeExpression=a,e.isEmpty=n,e.createFrame=o,e.blockParams=c,e.appendContextPath=h;var l={\"&\":\"&amp;\",\"<\":\"&lt;\",\">\":\"&gt;\",'\"':\"&quot;\",\"'\":\"&#x27;\",\"`\":\"&#x60;\",\"=\":\"&#x3D;\"},p=/[&<>\"'`=]/g,u=/[&<>\"'`=]/,f=Object.prototype.toString;e.toString=f;var d=function(t){return\"function\"==typeof t};d(/x/)&&(e.isFunction=d=function(t){return\"function\"==typeof t&&\"[object Function]\"===f.call(t)}),e.isFunction=d;var m=Array.isArray||function(t){return!(!t||\"object\"!=typeof t)&&\"[object Array]\"===f.call(t)};e.isArray=m},function(t,e){\"use strict\";function r(t,e){var i=e&&e.loc,a=void 0,n=void 0;i&&(a=i.start.line,n=i.start.column,t+=\" - \"+a+\":\"+n);for(var o=Error.prototype.constructor.call(this,t),c=0;c<s.length;c++)this[s[c]]=o[s[c]];Error.captureStackTrace&&Error.captureStackTrace(this,r),i&&(this.lineNumber=a,this.column=n)}e.__esModule=!0;var s=[\"description\",\"fileName\",\"lineNumber\",\"message\",\"name\",\"number\",\"stack\"];r.prototype=new Error,e[\"default\"]=r,t.exports=e[\"default\"]},function(t,e,r){\"use strict\";function s(t){n[\"default\"](t),c[\"default\"](t),l[\"default\"](t),u[\"default\"](t),d[\"default\"](t),g[\"default\"](t),y[\"default\"](t)}var i=r(1)[\"default\"];e.__esModule=!0,e.registerDefaultHelpers=s;var a=r(8),n=i(a),o=r(9),c=i(o),h=r(10),l=i(h),p=r(11),u=i(p),f=r(12),d=i(f),m=r(13),g=i(m),v=r(14),y=i(v)},function(t,e,r){\"use strict\";e.__esModule=!0;var s=r(5);e[\"default\"]=function(t){t.registerHelper(\"blockHelperMissing\",function(e,r){var i=r.inverse,a=r.fn;if(e===!0)return a(this);if(e===!1||null==e)return i(this);if(s.isArray(e))return e.length>0?(r.ids&&(r.ids=[r.name]),t.helpers.each(e,r)):i(this);if(r.data&&r.ids){var n=s.createFrame(r.data);n.contextPath=s.appendContextPath(r.data.contextPath,r.name),r={data:n}}return a(e,r)})},t.exports=e[\"default\"]},function(t,e,r){\"use strict\";var s=r(1)[\"default\"];e.__esModule=!0;var i=r(5),a=r(6),n=s(a);e[\"default\"]=function(t){t.registerHelper(\"each\",function(t,e){function r(e,r,a){h&&(h.key=e,h.index=r,h.first=0===r,h.last=!!a,l&&(h.contextPath=l+e)),c+=s(t[e],{data:h,blockParams:i.blockParams([t[e],e],[l+e,null])})}if(!e)throw new n[\"default\"](\"Must pass iterator to #each\");var s=e.fn,a=e.inverse,o=0,c=\"\",h=void 0,l=void 0;if(e.data&&e.ids&&(l=i.appendContextPath(e.data.contextPath,e.ids[0])+\".\"),i.isFunction(t)&&(t=t.call(this)),e.data&&(h=i.createFrame(e.data)),t&&\"object\"==typeof t)if(i.isArray(t))for(var p=t.length;o<p;o++)o in t&&r(o,o,o===t.length-1);else{var u=void 0;for(var f in t)t.hasOwnProperty(f)&&(void 0!==u&&r(u,o-1),u=f,o++);void 0!==u&&r(u,o-1,!0)}return 0===o&&(c=a(this)),c})},t.exports=e[\"default\"]},function(t,e,r){\"use strict\";var s=r(1)[\"default\"];e.__esModule=!0;var i=r(6),a=s(i);e[\"default\"]=function(t){t.registerHelper(\"helperMissing\",function(){if(1!==arguments.length)throw new a[\"default\"]('Missing helper: \"'+arguments[arguments.length-1].name+'\"')})},t.exports=e[\"default\"]},function(t,e,r){\"use strict\";e.__esModule=!0;var s=r(5);e[\"default\"]=function(t){t.registerHelper(\"if\",function(t,e){return s.isFunction(t)&&(t=t.call(this)),!e.hash.includeZero&&!t||s.isEmpty(t)?e.inverse(this):e.fn(this)}),t.registerHelper(\"unless\",function(e,r){return t.helpers[\"if\"].call(this,e,{fn:r.inverse,inverse:r.fn,hash:r.hash})})},t.exports=e[\"default\"]},function(t,e){\"use strict\";e.__esModule=!0,e[\"default\"]=function(t){t.registerHelper(\"log\",function(){for(var e=[void 0],r=arguments[arguments.length-1],s=0;s<arguments.length-1;s++)e.push(arguments[s]);var i=1;null!=r.hash.level?i=r.hash.level:r.data&&null!=r.data.level&&(i=r.data.level),e[0]=i,t.log.apply(t,e)})},t.exports=e[\"default\"]},function(t,e){\"use strict\";e.__esModule=!0,e[\"default\"]=function(t){t.registerHelper(\"lookup\",function(t,e){return t&&t[e]})},t.exports=e[\"default\"]},function(t,e,r){\"use strict\";e.__esModule=!0;var s=r(5);e[\"default\"]=function(t){t.registerHelper(\"with\",function(t,e){s.isFunction(t)&&(t=t.call(this));var r=e.fn;if(s.isEmpty(t))return e.inverse(this);var i=e.data;return e.data&&e.ids&&(i=s.createFrame(e.data),i.contextPath=s.appendContextPath(e.data.contextPath,e.ids[0])),r(t,{data:i,blockParams:s.blockParams([t],[i&&i.contextPath])})})},t.exports=e[\"default\"]},function(t,e,r){\"use strict\";function s(t){n[\"default\"](t)}var i=r(1)[\"default\"];e.__esModule=!0,e.registerDefaultDecorators=s;var a=r(16),n=i(a)},function(t,e,r){\"use strict\";e.__esModule=!0;var s=r(5);e[\"default\"]=function(t){t.registerDecorator(\"inline\",function(t,e,r,i){var a=t;return e.partials||(e.partials={},a=function(i,a){var n=r.partials;r.partials=s.extend({},n,e.partials);var o=t(i,a);return r.partials=n,o}),e.partials[i.args[0]]=i.fn,a})},t.exports=e[\"default\"]},function(t,e,r){\"use strict\";e.__esModule=!0;var s=r(5),i={methodMap:[\"debug\",\"info\",\"warn\",\"error\"],level:\"info\",lookupLevel:function(t){if(\"string\"==typeof t){var e=s.indexOf(i.methodMap,t.toLowerCase());t=e>=0?e:parseInt(t,10)}return t},log:function(t){if(t=i.lookupLevel(t),\"undefined\"!=typeof console&&i.lookupLevel(i.level)<=t){var e=i.methodMap[t];console[e]||(e=\"log\");for(var r=arguments.length,s=Array(r>1?r-1:0),a=1;a<r;a++)s[a-1]=arguments[a];console[e].apply(console,s)}}};e[\"default\"]=i,t.exports=e[\"default\"]},function(t,e){\"use strict\";function r(t){this.string=t}e.__esModule=!0,r.prototype.toString=r.prototype.toHTML=function(){return\"\"+this.string},e[\"default\"]=r,t.exports=e[\"default\"]},function(t,e,r){\"use strict\";function s(t){var e=t&&t[0]||1,r=v.COMPILER_REVISION;if(e!==r){if(e<r){var s=v.REVISION_CHANGES[r],i=v.REVISION_CHANGES[e];throw new g[\"default\"](\"Template was precompiled with an older version of Handlebars than the current runtime. Please update your precompiler to a newer version (\"+s+\") or downgrade your runtime to an older version (\"+i+\").\")}throw new g[\"default\"](\"Template was precompiled with a newer version of Handlebars than the current runtime. Please update your runtime to a newer version (\"+t[1]+\").\")}}function i(t,e){function r(r,s,i){i.hash&&(s=d.extend({},s,i.hash),i.ids&&(i.ids[0]=!0)),r=e.VM.resolvePartial.call(this,r,s,i);var a=e.VM.invokePartial.call(this,r,s,i);if(null==a&&e.compile&&(i.partials[i.name]=e.compile(r,t.compilerOptions,e),a=i.partials[i.name](s,i)),null!=a){if(i.indent){for(var n=a.split(\"\\n\"),o=0,c=n.length;o<c&&(n[o]||o+1!==c);o++)n[o]=i.indent+n[o];a=n.join(\"\\n\")}return a}throw new g[\"default\"](\"The partial \"+i.name+\" could not be compiled when running in runtime-only mode\")}function s(e){function r(e){return\"\"+t.main(i,e,i.helpers,i.partials,n,c,o)}var a=arguments.length<=1||void 0===arguments[1]?{}:arguments[1],n=a.data;s._setup(a),!a.partial&&t.useData&&(n=h(e,n));var o=void 0,c=t.useBlockParams?[]:void 0;return t.useDepths&&(o=a.depths?e!==a.depths[0]?[e].concat(a.depths):a.depths:[e]),(r=l(t.main,r,i,a.depths||[],n,c))(e,a)}if(!e)throw new g[\"default\"](\"No environment passed to template\");if(!t||!t.main)throw new g[\"default\"](\"Unknown template object: \"+typeof t);t.main.decorator=t.main_d,e.VM.checkRevision(t.compiler);var i={strict:function(t,e){if(!(e in t))throw new g[\"default\"]('\"'+e+'\" not defined in '+t);return t[e]},lookup:function(t,e){for(var r=t.length,s=0;s<r;s++)if(t[s]&&null!=t[s][e])return t[s][e]},lambda:function(t,e){return\"function\"==typeof t?t.call(e):t},escapeExpression:d.escapeExpression,invokePartial:r,fn:function(e){var r=t[e];return r.decorator=t[e+\"_d\"],r},programs:[],program:function(t,e,r,s,i){var n=this.programs[t],o=this.fn(t);return e||i||s||r?n=a(this,t,o,e,r,s,i):n||(n=this.programs[t]=a(this,t,o)),n},data:function(t,e){for(;t&&e--;)t=t._parent;return t},merge:function(t,e){var r=t||e;return t&&e&&t!==e&&(r=d.extend({},e,t)),r},noop:e.VM.noop,compilerInfo:t.compiler};return s.isTop=!0,s._setup=function(r){r.partial?(i.helpers=r.helpers,i.partials=r.partials,i.decorators=r.decorators):(i.helpers=i.merge(r.helpers,e.helpers),t.usePartial&&(i.partials=i.merge(r.partials,e.partials)),(t.usePartial||t.useDecorators)&&(i.decorators=i.merge(r.decorators,e.decorators)))},s._child=function(e,r,s,n){if(t.useBlockParams&&!s)throw new g[\"default\"](\"must pass block params\");if(t.useDepths&&!n)throw new g[\"default\"](\"must pass parent depths\");return a(i,e,t[e],r,0,s,n)},s}function a(t,e,r,s,i,a,n){function o(e){var i=arguments.length<=1||void 0===arguments[1]?{}:arguments[1],o=n;return n&&e!==n[0]&&(o=[e].concat(n)),r(t,e,t.helpers,t.partials,i.data||s,a&&[i.blockParams].concat(a),o)}return o=l(r,o,t,n,s,a),o.program=e,o.depth=n?n.length:0,o.blockParams=i||0,o}function n(t,e,r){return t?t.call||r.name||(r.name=t,t=r.partials[t]):t=\"@partial-block\"===r.name?r.data[\"partial-block\"]:r.partials[r.name],t}function o(t,e,r){r.partial=!0,r.ids&&(r.data.contextPath=r.ids[0]||r.data.contextPath);var s=void 0;if(r.fn&&r.fn!==c&&(r.data=v.createFrame(r.data),s=r.data[\"partial-block\"]=r.fn,s.partials&&(r.partials=d.extend({},r.partials,s.partials))),void 0===t&&s&&(t=s),void 0===t)throw new g[\"default\"](\"The partial \"+r.name+\" could not be found\");if(t instanceof Function)return t(e,r)}function c(){return\"\"}function h(t,e){return e&&\"root\"in e||(e=e?v.createFrame(e):{},e.root=t),e}function l(t,e,r,s,i,a){if(t.decorator){var n={};e=t.decorator(e,n,r,s&&s[0],i,a,s),d.extend(e,n)}return e}var p=r(3)[\"default\"],u=r(1)[\"default\"];e.__esModule=!0,e.checkRevision=s,e.template=i,e.wrapProgram=a,e.resolvePartial=n,e.invokePartial=o,e.noop=c;var f=r(5),d=p(f),m=r(6),g=u(m),v=r(4)},function(t,e){(function(r){\"use strict\";e.__esModule=!0,e[\"default\"]=function(t){var e=\"undefined\"!=typeof r?r:window,s=e.Handlebars;t.noConflict=function(){return e.Handlebars===t&&(e.Handlebars=s),t}},t.exports=e[\"default\"]}).call(e,function(){return this}())},function(t,e){\"use strict\";e.__esModule=!0;var r={helpers:{helperExpression:function(t){return\"SubExpression\"===t.type||(\"MustacheStatement\"===t.type||\"BlockStatement\"===t.type)&&!!(t.params&&t.params.length||t.hash)},scopedId:function(t){return/^\\.|this\\b/.test(t.original)},simpleId:function(t){return 1===t.parts.length&&!r.helpers.scopedId(t)&&!t.depth}}};e[\"default\"]=r,t.exports=e[\"default\"]},function(t,e,r){\"use strict\";function s(t,e){if(\"Program\"===t.type)return t;o[\"default\"].yy=f,f.locInfo=function(t){return new f.SourceLocation(e&&e.srcName,t)};var r=new h[\"default\"](e);return r.accept(o[\"default\"].parse(t))}var i=r(1)[\"default\"],a=r(3)[\"default\"];e.__esModule=!0,e.parse=s;var n=r(23),o=i(n),c=r(24),h=i(c),l=r(26),p=a(l),u=r(5);e.parser=o[\"default\"];var f={};u.extend(f,p)},function(t,e){\"use strict\";var r=function(){function t(){this.yy={}}var e={trace:function(){},yy:{},symbols_:{error:2,root:3,program:4,EOF:5,program_repetition0:6,statement:7,mustache:8,block:9,rawBlock:10,partial:11,partialBlock:12,content:13,COMMENT:14,CONTENT:15,openRawBlock:16,rawBlock_repetition_plus0:17,END_RAW_BLOCK:18,OPEN_RAW_BLOCK:19,helperName:20,openRawBlock_repetition0:21,openRawBlock_option0:22,CLOSE_RAW_BLOCK:23,openBlock:24,block_option0:25,closeBlock:26,openInverse:27,block_option1:28,OPEN_BLOCK:29,openBlock_repetition0:30,openBlock_option0:31,openBlock_option1:32,CLOSE:33,OPEN_INVERSE:34,openInverse_repetition0:35,openInverse_option0:36,openInverse_option1:37,openInverseChain:38,OPEN_INVERSE_CHAIN:39,openInverseChain_repetition0:40,openInverseChain_option0:41,openInverseChain_option1:42,inverseAndProgram:43,INVERSE:44,inverseChain:45,inverseChain_option0:46,OPEN_ENDBLOCK:47,OPEN:48,mustache_repetition0:49,mustache_option0:50,OPEN_UNESCAPED:51,mustache_repetition1:52,mustache_option1:53,CLOSE_UNESCAPED:54,OPEN_PARTIAL:55,partialName:56,partial_repetition0:57,partial_option0:58,openPartialBlock:59,OPEN_PARTIAL_BLOCK:60,openPartialBlock_repetition0:61,openPartialBlock_option0:62,param:63,sexpr:64,OPEN_SEXPR:65,sexpr_repetition0:66,sexpr_option0:67,CLOSE_SEXPR:68,hash:69,hash_repetition_plus0:70,hashSegment:71,ID:72,EQUALS:73,blockParams:74,OPEN_BLOCK_PARAMS:75,blockParams_repetition_plus0:76,CLOSE_BLOCK_PARAMS:77,path:78,dataName:79,STRING:80,NUMBER:81,BOOLEAN:82,UNDEFINED:83,NULL:84,DATA:85,pathSegments:86,SEP:87,$accept:0,$end:1},terminals_:{2:\"error\",5:\"EOF\",14:\"COMMENT\",15:\"CONTENT\",18:\"END_RAW_BLOCK\",19:\"OPEN_RAW_BLOCK\",23:\"CLOSE_RAW_BLOCK\",29:\"OPEN_BLOCK\",33:\"CLOSE\",34:\"OPEN_INVERSE\",39:\"OPEN_INVERSE_CHAIN\",44:\"INVERSE\",47:\"OPEN_ENDBLOCK\",48:\"OPEN\",51:\"OPEN_UNESCAPED\",54:\"CLOSE_UNESCAPED\",55:\"OPEN_PARTIAL\",60:\"OPEN_PARTIAL_BLOCK\",65:\"OPEN_SEXPR\",68:\"CLOSE_SEXPR\",72:\"ID\",73:\"EQUALS\",75:\"OPEN_BLOCK_PARAMS\",77:\"CLOSE_BLOCK_PARAMS\",80:\"STRING\",81:\"NUMBER\",82:\"BOOLEAN\",83:\"UNDEFINED\",84:\"NULL\",85:\"DATA\",87:\"SEP\"},productions_:[0,[3,2],[4,1],[7,1],[7,1],[7,1],[7,1],[7,1],[7,1],[7,1],[13,1],[10,3],[16,5],[9,4],[9,4],[24,6],[27,6],[38,6],[43,2],[45,3],[45,1],[26,3],[8,5],[8,5],[11,5],[12,3],[59,5],[63,1],[63,1],[64,5],[69,1],[71,3],[74,3],[20,1],[20,1],[20,1],[20,1],[20,1],[20,1],[20,1],[56,1],[56,1],[79,2],[78,1],[86,3],[86,1],[6,0],[6,2],[17,1],[17,2],[21,0],[21,2],[22,0],[22,1],[25,0],[25,1],[28,0],[28,1],[30,0],[30,2],[31,0],[31,1],[32,0],[32,1],[35,0],[35,2],[36,0],[36,1],[37,0],[37,1],[40,0],[40,2],[41,0],[41,1],[42,0],[42,1],[46,0],[46,1],[49,0],[49,2],[50,0],[50,1],[52,0],[52,2],[53,0],[53,1],[57,0],[57,2],[58,0],[58,1],[61,0],[61,2],[62,0],[62,1],[66,0],[66,2],[67,0],[67,1],[70,1],[70,2],[76,1],[76,2]],performAction:function(t,e,r,s,i,a,n){var o=a.length-1;switch(i){case 1:return a[o-1];case 2:this.$=s.prepareProgram(a[o]);break;case 3:this.$=a[o];break;case 4:this.$=a[o];break;case 5:this.$=a[o];break;case 6:this.$=a[o];break;case 7:this.$=a[o];break;case 8:this.$=a[o];break;case 9:this.$={type:\"CommentStatement\",value:s.stripComment(a[o]),strip:s.stripFlags(a[o],a[o]),loc:s.locInfo(this._$)};break;case 10:this.$={type:\"ContentStatement\",original:a[o],value:a[o],loc:s.locInfo(this._$)};break;case 11:this.$=s.prepareRawBlock(a[o-2],a[o-1],a[o],this._$);break;case 12:this.$={path:a[o-3],params:a[o-2],hash:a[o-1]};break;case 13:this.$=s.prepareBlock(a[o-3],a[o-2],a[o-1],a[o],!1,this._$);break;case 14:this.$=s.prepareBlock(a[o-3],a[o-2],a[o-1],a[o],!0,this._$);break;case 15:this.$={open:a[o-5],path:a[o-4],params:a[o-3],hash:a[o-2],blockParams:a[o-1],strip:s.stripFlags(a[o-5],a[o])};break;case 16:this.$={path:a[o-4],params:a[o-3],hash:a[o-2],blockParams:a[o-1],strip:s.stripFlags(a[o-5],a[o])};break;case 17:this.$={path:a[o-4],params:a[o-3],hash:a[o-2],blockParams:a[o-1],strip:s.stripFlags(a[o-5],a[o])};break;case 18:this.$={strip:s.stripFlags(a[o-1],a[o-1]),program:a[o]};break;case 19:var c=s.prepareBlock(a[o-2],a[o-1],a[o],a[o],!1,this._$),h=s.prepareProgram([c],a[o-1].loc);h.chained=!0,this.$={strip:a[o-2].strip,program:h,chain:!0};break;case 20:this.$=a[o];break;case 21:this.$={path:a[o-1],strip:s.stripFlags(a[o-2],a[o])};break;case 22:this.$=s.prepareMustache(a[o-3],a[o-2],a[o-1],a[o-4],s.stripFlags(a[o-4],a[o]),this._$);break;case 23:this.$=s.prepareMustache(a[o-3],a[o-2],a[o-1],a[o-4],s.stripFlags(a[o-4],a[o]),this._$);break;case 24:this.$={type:\"PartialStatement\",name:a[o-3],params:a[o-2],hash:a[o-1],indent:\"\",strip:s.stripFlags(a[o-4],a[o]),loc:s.locInfo(this._$)};break;case 25:this.$=s.preparePartialBlock(a[o-2],a[o-1],a[o],this._$);break;case 26:this.$={path:a[o-3],params:a[o-2],hash:a[o-1],strip:s.stripFlags(a[o-4],a[o])};break;case 27:this.$=a[o];break;case 28:this.$=a[o];break;case 29:this.$={type:\"SubExpression\",path:a[o-3],params:a[o-2],hash:a[o-1],loc:s.locInfo(this._$)};break;case 30:this.$={type:\"Hash\",pairs:a[o],loc:s.locInfo(this._$)};break;case 31:this.$={type:\"HashPair\",key:s.id(a[o-2]),value:a[o],loc:s.locInfo(this._$)};break;case 32:this.$=s.id(a[o-1]);break;case 33:this.$=a[o];break;case 34:this.$=a[o];break;case 35:this.$={type:\"StringLiteral\",value:a[o],original:a[o],loc:s.locInfo(this._$)};break;case 36:this.$={type:\"NumberLiteral\",value:Number(a[o]),original:Number(a[o]),loc:s.locInfo(this._$)};break;case 37:this.$={type:\"BooleanLiteral\",value:\"true\"===a[o],original:\"true\"===a[o],loc:s.locInfo(this._$)};break;case 38:this.$={type:\"UndefinedLiteral\",original:void 0,value:void 0,loc:s.locInfo(this._$)};break;case 39:this.$={type:\"NullLiteral\",original:null,value:null,loc:s.locInfo(this._$)};break;case 40:this.$=a[o];break;case 41:this.$=a[o];break;case 42:this.$=s.preparePath(!0,a[o],this._$);break;case 43:this.$=s.preparePath(!1,a[o],this._$);break;case 44:a[o-2].push({part:s.id(a[o]),original:a[o],separator:a[o-1]}),this.$=a[o-2];break;case 45:this.$=[{part:s.id(a[o]),original:a[o]}];break;case 46:this.$=[];break;case 47:a[o-1].push(a[o]);break;case 48:this.$=[a[o]];break;case 49:a[o-1].push(a[o]);break;case 50:this.$=[];break;case 51:a[o-1].push(a[o]);break;case 58:this.$=[];break;case 59:a[o-1].push(a[o]);break;case 64:this.$=[];break;case 65:a[o-1].push(a[o]);break;case 70:this.$=[];break;case 71:a[o-1].push(a[o]);break;case 78:this.$=[];break;case 79:a[o-1].push(a[o]);break;case 82:this.$=[];break;case 83:a[o-1].push(a[o]);break;case 86:this.$=[];break;case 87:a[o-1].push(a[o]);break;case 90:this.$=[];break;case 91:a[o-1].push(a[o]);break;case 94:this.$=[];break;case 95:a[o-1].push(a[o]);break;case 98:this.$=[a[o]];break;case 99:a[o-1].push(a[o]);break;case 100:this.$=[a[o]];break;case 101:a[o-1].push(a[o])}},table:[{3:1,4:2,5:[2,46],6:3,14:[2,46],15:[2,46],19:[2,46],29:[2,46],34:[2,46],48:[2,46],51:[2,46],55:[2,46],60:[2,46]},{1:[3]},{5:[1,4]},{5:[2,2],7:5,8:6,9:7,10:8,11:9,12:10,13:11,14:[1,12],15:[1,20],16:17,19:[1,23],24:15,27:16,29:[1,21],34:[1,22],39:[2,2],44:[2,2],47:[2,2],48:[1,13],51:[1,14],55:[1,18],59:19,60:[1,24]},{1:[2,1]},{5:[2,47],14:[2,47],15:[2,47],19:[2,47],29:[2,47],34:[2,47],39:[2,47],44:[2,47],47:[2,47],48:[2,47],51:[2,47],55:[2,47],60:[2,47]},{5:[2,3],14:[2,3],15:[2,3],19:[2,3],29:[2,3],34:[2,3],39:[2,3],44:[2,3],47:[2,3],48:[2,3],51:[2,3],55:[2,3],60:[2,3]},{5:[2,4],14:[2,4],15:[2,4],19:[2,4],29:[2,4],34:[2,4],39:[2,4],44:[2,4],47:[2,4],48:[2,4],51:[2,4],55:[2,4],60:[2,4]},{5:[2,5],14:[2,5],15:[2,5],19:[2,5],29:[2,5],34:[2,5],39:[2,5],44:[2,5],47:[2,5],48:[2,5],51:[2,5],55:[2,5],60:[2,5]},{5:[2,6],14:[2,6],15:[2,6],19:[2,6],29:[2,6],34:[2,6],39:[2,6],44:[2,6],47:[2,6],48:[2,6],51:[2,6],55:[2,6],60:[2,6]},{5:[2,7],14:[2,7],15:[2,7],19:[2,7],29:[2,7],34:[2,7],39:[2,7],44:[2,7],47:[2,7],48:[2,7],51:[2,7],55:[2,7],60:[2,7]},{5:[2,8],14:[2,8],15:[2,8],19:[2,8],29:[2,8],34:[2,8],39:[2,8],44:[2,8],47:[2,8],48:[2,8],51:[2,8],55:[2,8],60:[2,8]},{5:[2,9],14:[2,9],15:[2,9],19:[2,9],29:[2,9],34:[2,9],39:[2,9],44:[2,9],47:[2,9],48:[2,9],51:[2,9],55:[2,9],60:[2,9]},{20:25,72:[1,35],78:26,79:27,80:[1,28],81:[1,29],82:[1,30],83:[1,31],84:[1,32],85:[1,34],86:33},{20:36,72:[1,35],78:26,79:27,80:[1,28],81:[1,29],82:[1,30],83:[1,31],84:[1,32],85:[1,34],86:33},{4:37,6:3,14:[2,46],15:[2,46],19:[2,46],29:[2,46],34:[2,46],39:[2,46],44:[2,46],47:[2,46],48:[2,46],51:[2,46],55:[2,46],60:[2,46]},{4:38,6:3,14:[2,46],15:[2,46],19:[2,46],29:[2,46],34:[2,46],44:[2,46],47:[2,46],48:[2,46],51:[2,46],55:[2,46],60:[2,46]},{13:40,15:[1,20],17:39},{20:42,56:41,64:43,65:[1,44],72:[1,35],78:26,79:27,80:[1,28],81:[1,29],82:[1,30],83:[1,31],84:[1,32],85:[1,34],86:33},{4:45,6:3,14:[2,46],15:[2,46],19:[2,46],29:[2,46],34:[2,46],47:[2,46],48:[2,46],51:[2,46],55:[2,46],60:[2,46]},{5:[2,10],14:[2,10],15:[2,10],18:[2,10],19:[2,10],29:[2,10],34:[2,10],39:[2,10],44:[2,10],47:[2,10],48:[2,10],51:[2,10],55:[2,10],60:[2,10]},{20:46,72:[1,35],78:26,79:27,80:[1,28],81:[1,29],82:[1,30],83:[1,31],84:[1,32],85:[1,34],86:33},{20:47,72:[1,35],78:26,79:27,80:[1,28],81:[1,29],82:[1,30],83:[1,31],84:[1,32],85:[1,34],86:33},{20:48,72:[1,35],78:26,79:27,80:[1,28],81:[1,29],82:[1,30],83:[1,31],84:[1,32],85:[1,34],86:33},{20:42,56:49,64:43,65:[1,44],72:[1,35],78:26,79:27,80:[1,28],81:[1,29],82:[1,30],83:[1,31],84:[1,32],85:[1,34],86:33},{33:[2,78],49:50,65:[2,78],72:[2,78],80:[2,78],81:[2,78],82:[2,78],83:[2,78],84:[2,78],85:[2,78]},{23:[2,33],33:[2,33],54:[2,33],65:[2,33],68:[2,33],72:[2,33],75:[2,33],80:[2,33],81:[2,33],82:[2,33],83:[2,33],84:[2,33],85:[2,33]},{23:[2,34],33:[2,34],54:[2,34],65:[2,34],68:[2,34],72:[2,34],75:[2,34],80:[2,34],81:[2,34],82:[2,34],83:[2,34],84:[2,34],85:[2,34]},{23:[2,35],33:[2,35],54:[2,35],65:[2,35],68:[2,35],72:[2,35],75:[2,35],80:[2,35],81:[2,35],82:[2,35],83:[2,35],84:[2,35],85:[2,35]},{23:[2,36],33:[2,36],54:[2,36],65:[2,36],68:[2,36],72:[2,36],75:[2,36],80:[2,36],81:[2,36],82:[2,36],83:[2,36],84:[2,36],85:[2,36]},{23:[2,37],33:[2,37],54:[2,37],65:[2,37],68:[2,37],72:[2,37],75:[2,37],80:[2,37],81:[2,37],82:[2,37],83:[2,37],84:[2,37],85:[2,37]},{23:[2,38],33:[2,38],54:[2,38],65:[2,38],68:[2,38],72:[2,38],75:[2,38],80:[2,38],81:[2,38],82:[2,38],83:[2,38],84:[2,38],85:[2,38]},{23:[2,39],33:[2,39],54:[2,39],65:[2,39],68:[2,39],72:[2,39],75:[2,39],80:[2,39],81:[2,39],82:[2,39],83:[2,39],84:[2,39],85:[2,39]},{23:[2,43],33:[2,43],54:[2,43],65:[2,43],68:[2,43],72:[2,43],75:[2,43],80:[2,43],81:[2,43],82:[2,43],83:[2,43],84:[2,43],85:[2,43],87:[1,51]},{72:[1,35],86:52},{23:[2,45],33:[2,45],54:[2,45],65:[2,45],68:[2,45],72:[2,45],75:[2,45],80:[2,45],81:[2,45],82:[2,45],83:[2,45],84:[2,45],85:[2,45],87:[2,45]},{52:53,54:[2,82],65:[2,82],72:[2,82],80:[2,82],81:[2,82],82:[2,82],83:[2,82],84:[2,82],85:[2,82]},{25:54,38:56,39:[1,58],43:57,44:[1,59],45:55,47:[2,54]},{28:60,43:61,44:[1,59],47:[2,56]},{13:63,15:[1,20],18:[1,62]},{15:[2,48],18:[2,48]},{33:[2,86],57:64,65:[2,86],72:[2,86],80:[2,86],81:[2,86],82:[2,86],83:[2,86],84:[2,86],85:[2,86]},{33:[2,40],65:[2,40],72:[2,40],80:[2,40],81:[2,40],82:[2,40],83:[2,40],84:[2,40],85:[2,40]},{33:[2,41],65:[2,41],72:[2,41],80:[2,41],81:[2,41],82:[2,41],83:[2,41],84:[2,41],85:[2,41]},{20:65,72:[1,35],78:26,79:27,80:[1,28],81:[1,29],82:[1,30],83:[1,31],84:[1,32],85:[1,34],86:33},{26:66,47:[1,67]},{30:68,33:[2,58],65:[2,58],72:[2,58],75:[2,58],80:[2,58],81:[2,58],82:[2,58],83:[2,58],84:[2,58],85:[2,58]},{33:[2,64],35:69,65:[2,64],72:[2,64],75:[2,64],80:[2,64],81:[2,64],82:[2,64],83:[2,64],84:[2,64],85:[2,64]},{21:70,23:[2,50],65:[2,50],72:[2,50],80:[2,50],81:[2,50],82:[2,50],83:[2,50],84:[2,50],85:[2,50]},{33:[2,90],61:71,65:[2,90],72:[2,90],80:[2,90],81:[2,90],82:[2,90],83:[2,90],84:[2,90],85:[2,90]},{20:75,33:[2,80],50:72,63:73,64:76,65:[1,44],69:74,70:77,71:78,72:[1,79],78:26,79:27,80:[1,28],81:[1,29],82:[1,30],83:[1,31],84:[1,32],85:[1,34],86:33},{72:[1,80]},{23:[2,42],33:[2,42],54:[2,42],65:[2,42],68:[2,42],72:[2,42],75:[2,42],80:[2,42],81:[2,42],82:[2,42],83:[2,42],84:[2,42],85:[2,42],87:[1,51]},{20:75,53:81,54:[2,84],63:82,64:76,65:[1,44],69:83,70:77,71:78,72:[1,79],78:26,79:27,80:[1,28],81:[1,29],82:[1,30],83:[1,31],84:[1,32],85:[1,34],86:33},{26:84,47:[1,67]},{47:[2,55]},{4:85,6:3,14:[2,46],15:[2,46],19:[2,46],29:[2,46],34:[2,46],39:[2,46],44:[2,46],47:[2,46],48:[2,46],51:[2,46],55:[2,46],60:[2,46]},{47:[2,20]},{20:86,72:[1,35],78:26,79:27,80:[1,28],81:[1,29],82:[1,30],83:[1,31],84:[1,32],85:[1,34],86:33},{4:87,6:3,14:[2,46],15:[2,46],19:[2,46],29:[2,46],34:[2,46],47:[2,46],48:[2,46],51:[2,46],55:[2,46],60:[2,46]},{26:88,47:[1,67]},{47:[2,57]},{5:[2,11],14:[2,11],15:[2,11],19:[2,11],29:[2,11],34:[2,11],39:[2,11],44:[2,11],47:[2,11],48:[2,11],51:[2,11],55:[2,11],60:[2,11]},{15:[2,49],18:[2,49]},{20:75,33:[2,88],58:89,63:90,64:76,65:[1,44],69:91,70:77,71:78,72:[1,79],78:26,79:27,80:[1,28],81:[1,29],82:[1,30],83:[1,31],84:[1,32],85:[1,34],86:33},{65:[2,94],66:92,68:[2,94],72:[2,94],80:[2,94],81:[2,94],82:[2,94],83:[2,94],84:[2,94],85:[2,94]},{5:[2,25],14:[2,25],15:[2,25],19:[2,25],29:[2,25],34:[2,25],39:[2,25],44:[2,25],47:[2,25],48:[2,25],51:[2,25],55:[2,25],60:[2,25]},{20:93,72:[1,35],78:26,79:27,80:[1,28],81:[1,29],82:[1,30],83:[1,31],84:[1,32],85:[1,34],86:33},{20:75,31:94,33:[2,60],63:95,64:76,65:[1,44],69:96,70:77,71:78,72:[1,79],75:[2,60],78:26,79:27,80:[1,28],81:[1,29],82:[1,30],83:[1,31],84:[1,32],85:[1,34],86:33},{20:75,33:[2,66],36:97,63:98,64:76,65:[1,44],69:99,70:77,71:78,72:[1,79],75:[2,66],78:26,79:27,80:[1,28],81:[1,29],82:[1,30],83:[1,31],84:[1,32],85:[1,34],86:33},{20:75,22:100,23:[2,52],63:101,64:76,65:[1,44],69:102,70:77,71:78,72:[1,79],78:26,79:27,80:[1,28],81:[1,29],82:[1,30],83:[1,31],84:[1,32],85:[1,34],86:33},{20:75,33:[2,92],62:103,63:104,64:76,65:[1,44],69:105,70:77,71:78,72:[1,79],78:26,79:27,80:[1,28],81:[1,29],82:[1,30],83:[1,31],84:[1,32],85:[1,34],86:33},{33:[1,106]},{33:[2,79],65:[2,79],72:[2,79],80:[2,79],81:[2,79],82:[2,79],83:[2,79],84:[2,79],85:[2,79]},{33:[2,81]},{23:[2,27],33:[2,27],54:[2,27],65:[2,27],68:[2,27],72:[2,27],75:[2,27],80:[2,27],81:[2,27],82:[2,27],83:[2,27],84:[2,27],85:[2,27]},{23:[2,28],33:[2,28],54:[2,28],65:[2,28],68:[2,28],72:[2,28],75:[2,28],80:[2,28],81:[2,28],82:[2,28],83:[2,28],84:[2,28],85:[2,28]},{23:[2,30],33:[2,30],54:[2,30],68:[2,30],71:107,72:[1,108],75:[2,30]},{23:[2,98],33:[2,98],54:[2,98],68:[2,98],72:[2,98],75:[2,98]},{23:[2,45],33:[2,45],54:[2,45],65:[2,45],68:[2,45],72:[2,45],73:[1,109],75:[2,45],80:[2,45],81:[2,45],82:[2,45],83:[2,45],84:[2,45],85:[2,45],87:[2,45]},{23:[2,44],33:[2,44],54:[2,44],65:[2,44],68:[2,44],72:[2,44],75:[2,44],80:[2,44],81:[2,44],82:[2,44],83:[2,44],84:[2,44],85:[2,44],87:[2,44]},{54:[1,110]},{54:[2,83],65:[2,83],72:[2,83],80:[2,83],81:[2,83],82:[2,83],83:[2,83],84:[2,83],85:[2,83]},{54:[2,85]},{5:[2,13],14:[2,13],15:[2,13],19:[2,13],29:[2,13],34:[2,13],39:[2,13],44:[2,13],47:[2,13],48:[2,13],51:[2,13],55:[2,13],60:[2,13]},{38:56,39:[1,58],43:57,44:[1,59],45:112,46:111,47:[2,76]},{33:[2,70],40:113,65:[2,70],72:[2,70],75:[2,70],80:[2,70],81:[2,70],82:[2,70],83:[2,70],84:[2,70],85:[2,70]},{47:[2,18]},{5:[2,14],14:[2,14],15:[2,14],19:[2,14],29:[2,14],34:[2,14],39:[2,14],44:[2,14],47:[2,14],48:[2,14],51:[2,14],55:[2,14],60:[2,14]},{33:[1,114]},{33:[2,87],65:[2,87],72:[2,87],80:[2,87],81:[2,87],82:[2,87],83:[2,87],84:[2,87],85:[2,87]},{33:[2,89]},{20:75,63:116,64:76,65:[1,44],67:115,68:[2,96],69:117,70:77,71:78,72:[1,79],78:26,79:27,80:[1,28],81:[1,29],82:[1,30],83:[1,31],84:[1,32],85:[1,34],86:33},{33:[1,118]},{32:119,33:[2,62],74:120,75:[1,121]},{33:[2,59],65:[2,59],72:[2,59],75:[2,59],80:[2,59],81:[2,59],82:[2,59],83:[2,59],84:[2,59],85:[2,59]},{33:[2,61],75:[2,61]},{33:[2,68],37:122,74:123,75:[1,121]},{33:[2,65],65:[2,65],72:[2,65],75:[2,65],80:[2,65],81:[2,65],82:[2,65],83:[2,65],84:[2,65],85:[2,65]},{33:[2,67],75:[2,67]},{23:[1,124]},{23:[2,51],65:[2,51],72:[2,51],80:[2,51],81:[2,51],82:[2,51],83:[2,51],84:[2,51],85:[2,51]},{23:[2,53]},{33:[1,125]},{33:[2,91],65:[2,91],72:[2,91],80:[2,91],81:[2,91],82:[2,91],83:[2,91],84:[2,91],85:[2,91]},{33:[2,93]},{5:[2,22],14:[2,22],15:[2,22],19:[2,22],29:[2,22],34:[2,22],39:[2,22],44:[2,22],47:[2,22],48:[2,22],51:[2,22],55:[2,22],60:[2,22]},{23:[2,99],33:[2,99],54:[2,99],68:[2,99],72:[2,99],75:[2,99]},{73:[1,109]},{20:75,63:126,64:76,65:[1,44],72:[1,35],78:26,79:27,80:[1,28],81:[1,29],82:[1,30],83:[1,31],84:[1,32],85:[1,34],86:33},{5:[2,23],14:[2,23],15:[2,23],19:[2,23],29:[2,23],34:[2,23],39:[2,23],44:[2,23],47:[2,23],48:[2,23],51:[2,23],55:[2,23],60:[2,23]},{47:[2,19]},{47:[2,77]},{20:75,33:[2,72],41:127,63:128,64:76,65:[1,44],69:129,70:77,71:78,72:[1,79],75:[2,72],78:26,79:27,80:[1,28],81:[1,29],82:[1,30],83:[1,31],84:[1,32],85:[1,34],86:33},{5:[2,24],14:[2,24],15:[2,24],19:[2,24],29:[2,24],34:[2,24],39:[2,24],44:[2,24],47:[2,24],48:[2,24],51:[2,24],55:[2,24],60:[2,24]},{68:[1,130]},{65:[2,95],68:[2,95],72:[2,95],80:[2,95],81:[2,95],82:[2,95],83:[2,95],84:[2,95],85:[2,95]},{68:[2,97]},{5:[2,21],14:[2,21],15:[2,21],19:[2,21],29:[2,21],34:[2,21],39:[2,21],44:[2,21],47:[2,21],48:[2,21],51:[2,21],55:[2,21],60:[2,21]},{33:[1,131]},{33:[2,63]},{72:[1,133],76:132},{33:[1,134]},{33:[2,69]},{15:[2,12]},{14:[2,26],15:[2,26],19:[2,26],29:[2,26],34:[2,26],47:[2,26],48:[2,26],51:[2,26],55:[2,26],60:[2,26]},{23:[2,31],33:[2,31],54:[2,31],68:[2,31],72:[2,31],75:[2,31]},{33:[2,74],42:135,74:136,75:[1,121]},{33:[2,71],65:[2,71],72:[2,71],75:[2,71],80:[2,71],81:[2,71],82:[2,71],83:[2,71],84:[2,71],85:[2,71]},{33:[2,73],75:[2,73]},{23:[2,29],33:[2,29],54:[2,29],65:[2,29],68:[2,29],72:[2,29],75:[2,29],80:[2,29],81:[2,29],82:[2,29],83:[2,29],84:[2,29],85:[2,29]},{14:[2,15],15:[2,15],19:[2,15],29:[2,15],34:[2,15],39:[2,15],44:[2,15],47:[2,15],48:[2,15],51:[2,15],55:[2,15],60:[2,15]},{72:[1,138],77:[1,137]},{72:[2,100],77:[2,100]},{14:[2,16],15:[2,16],19:[2,16],29:[2,16],34:[2,16],44:[2,16],47:[2,16],\n48:[2,16],51:[2,16],55:[2,16],60:[2,16]},{33:[1,139]},{33:[2,75]},{33:[2,32]},{72:[2,101],77:[2,101]},{14:[2,17],15:[2,17],19:[2,17],29:[2,17],34:[2,17],39:[2,17],44:[2,17],47:[2,17],48:[2,17],51:[2,17],55:[2,17],60:[2,17]}],defaultActions:{4:[2,1],55:[2,55],57:[2,20],61:[2,57],74:[2,81],83:[2,85],87:[2,18],91:[2,89],102:[2,53],105:[2,93],111:[2,19],112:[2,77],117:[2,97],120:[2,63],123:[2,69],124:[2,12],136:[2,75],137:[2,32]},parseError:function(t,e){throw new Error(t)},parse:function(t){function e(){var t;return t=r.lexer.lex()||1,\"number\"!=typeof t&&(t=r.symbols_[t]||t),t}var r=this,s=[0],i=[null],a=[],n=this.table,o=\"\",c=0,h=0,l=0;this.lexer.setInput(t),this.lexer.yy=this.yy,this.yy.lexer=this.lexer,this.yy.parser=this,\"undefined\"==typeof this.lexer.yylloc&&(this.lexer.yylloc={});var p=this.lexer.yylloc;a.push(p);var u=this.lexer.options&&this.lexer.options.ranges;\"function\"==typeof this.yy.parseError&&(this.parseError=this.yy.parseError);for(var f,d,m,g,v,y,k,S,b,_={};;){if(m=s[s.length-1],this.defaultActions[m]?g=this.defaultActions[m]:(null!==f&&\"undefined\"!=typeof f||(f=e()),g=n[m]&&n[m][f]),\"undefined\"==typeof g||!g.length||!g[0]){var P=\"\";if(!l){b=[];for(y in n[m])this.terminals_[y]&&y>2&&b.push(\"'\"+this.terminals_[y]+\"'\");P=this.lexer.showPosition?\"Parse error on line \"+(c+1)+\":\\n\"+this.lexer.showPosition()+\"\\nExpecting \"+b.join(\", \")+\", got '\"+(this.terminals_[f]||f)+\"'\":\"Parse error on line \"+(c+1)+\": Unexpected \"+(1==f?\"end of input\":\"'\"+(this.terminals_[f]||f)+\"'\"),this.parseError(P,{text:this.lexer.match,token:this.terminals_[f]||f,line:this.lexer.yylineno,loc:p,expected:b})}}if(g[0]instanceof Array&&g.length>1)throw new Error(\"Parse Error: multiple actions possible at state: \"+m+\", token: \"+f);switch(g[0]){case 1:s.push(f),i.push(this.lexer.yytext),a.push(this.lexer.yylloc),s.push(g[1]),f=null,d?(f=d,d=null):(h=this.lexer.yyleng,o=this.lexer.yytext,c=this.lexer.yylineno,p=this.lexer.yylloc,l>0&&l--);break;case 2:if(k=this.productions_[g[1]][1],_.$=i[i.length-k],_._$={first_line:a[a.length-(k||1)].first_line,last_line:a[a.length-1].last_line,first_column:a[a.length-(k||1)].first_column,last_column:a[a.length-1].last_column},u&&(_._$.range=[a[a.length-(k||1)].range[0],a[a.length-1].range[1]]),v=this.performAction.call(_,o,h,c,this.yy,g[1],i,a),\"undefined\"!=typeof v)return v;k&&(s=s.slice(0,-1*k*2),i=i.slice(0,-1*k),a=a.slice(0,-1*k)),s.push(this.productions_[g[1]][0]),i.push(_.$),a.push(_._$),S=n[s[s.length-2]][s[s.length-1]],s.push(S);break;case 3:return!0}}return!0}},r=function(){var t={EOF:1,parseError:function(t,e){if(!this.yy.parser)throw new Error(t);this.yy.parser.parseError(t,e)},setInput:function(t){return this._input=t,this._more=this._less=this.done=!1,this.yylineno=this.yyleng=0,this.yytext=this.matched=this.match=\"\",this.conditionStack=[\"INITIAL\"],this.yylloc={first_line:1,first_column:0,last_line:1,last_column:0},this.options.ranges&&(this.yylloc.range=[0,0]),this.offset=0,this},input:function(){var t=this._input[0];this.yytext+=t,this.yyleng++,this.offset++,this.match+=t,this.matched+=t;var e=t.match(/(?:\\r\\n?|\\n).*/g);return e?(this.yylineno++,this.yylloc.last_line++):this.yylloc.last_column++,this.options.ranges&&this.yylloc.range[1]++,this._input=this._input.slice(1),t},unput:function(t){var e=t.length,r=t.split(/(?:\\r\\n?|\\n)/g);this._input=t+this._input,this.yytext=this.yytext.substr(0,this.yytext.length-e-1),this.offset-=e;var s=this.match.split(/(?:\\r\\n?|\\n)/g);this.match=this.match.substr(0,this.match.length-1),this.matched=this.matched.substr(0,this.matched.length-1),r.length-1&&(this.yylineno-=r.length-1);var i=this.yylloc.range;return this.yylloc={first_line:this.yylloc.first_line,last_line:this.yylineno+1,first_column:this.yylloc.first_column,last_column:r?(r.length===s.length?this.yylloc.first_column:0)+s[s.length-r.length].length-r[0].length:this.yylloc.first_column-e},this.options.ranges&&(this.yylloc.range=[i[0],i[0]+this.yyleng-e]),this},more:function(){return this._more=!0,this},less:function(t){this.unput(this.match.slice(t))},pastInput:function(){var t=this.matched.substr(0,this.matched.length-this.match.length);return(t.length>20?\"...\":\"\")+t.substr(-20).replace(/\\n/g,\"\")},upcomingInput:function(){var t=this.match;return t.length<20&&(t+=this._input.substr(0,20-t.length)),(t.substr(0,20)+(t.length>20?\"...\":\"\")).replace(/\\n/g,\"\")},showPosition:function(){var t=this.pastInput(),e=new Array(t.length+1).join(\"-\");return t+this.upcomingInput()+\"\\n\"+e+\"^\"},next:function(){if(this.done)return this.EOF;this._input||(this.done=!0);var t,e,r,s,i;this._more||(this.yytext=\"\",this.match=\"\");for(var a=this._currentRules(),n=0;n<a.length&&(r=this._input.match(this.rules[a[n]]),!r||e&&!(r[0].length>e[0].length)||(e=r,s=n,this.options.flex));n++);return e?(i=e[0].match(/(?:\\r\\n?|\\n).*/g),i&&(this.yylineno+=i.length),this.yylloc={first_line:this.yylloc.last_line,last_line:this.yylineno+1,first_column:this.yylloc.last_column,last_column:i?i[i.length-1].length-i[i.length-1].match(/\\r?\\n?/)[0].length:this.yylloc.last_column+e[0].length},this.yytext+=e[0],this.match+=e[0],this.matches=e,this.yyleng=this.yytext.length,this.options.ranges&&(this.yylloc.range=[this.offset,this.offset+=this.yyleng]),this._more=!1,this._input=this._input.slice(e[0].length),this.matched+=e[0],t=this.performAction.call(this,this.yy,this,a[s],this.conditionStack[this.conditionStack.length-1]),this.done&&this._input&&(this.done=!1),t?t:void 0):\"\"===this._input?this.EOF:this.parseError(\"Lexical error on line \"+(this.yylineno+1)+\". Unrecognized text.\\n\"+this.showPosition(),{text:\"\",token:null,line:this.yylineno})},lex:function(){var t=this.next();return\"undefined\"!=typeof t?t:this.lex()},begin:function(t){this.conditionStack.push(t)},popState:function(){return this.conditionStack.pop()},_currentRules:function(){return this.conditions[this.conditionStack[this.conditionStack.length-1]].rules},topState:function(){return this.conditionStack[this.conditionStack.length-2]},pushState:function(t){this.begin(t)}};return t.options={},t.performAction=function(t,e,r,s){function i(t,r){return e.yytext=e.yytext.substr(t,e.yyleng-r)}switch(r){case 0:if(\"\\\\\\\\\"===e.yytext.slice(-2)?(i(0,1),this.begin(\"mu\")):\"\\\\\"===e.yytext.slice(-1)?(i(0,1),this.begin(\"emu\")):this.begin(\"mu\"),e.yytext)return 15;break;case 1:return 15;case 2:return this.popState(),15;case 3:return this.begin(\"raw\"),15;case 4:return this.popState(),\"raw\"===this.conditionStack[this.conditionStack.length-1]?15:(e.yytext=e.yytext.substr(5,e.yyleng-9),\"END_RAW_BLOCK\");case 5:return 15;case 6:return this.popState(),14;case 7:return 65;case 8:return 68;case 9:return 19;case 10:return this.popState(),this.begin(\"raw\"),23;case 11:return 55;case 12:return 60;case 13:return 29;case 14:return 47;case 15:return this.popState(),44;case 16:return this.popState(),44;case 17:return 34;case 18:return 39;case 19:return 51;case 20:return 48;case 21:this.unput(e.yytext),this.popState(),this.begin(\"com\");break;case 22:return this.popState(),14;case 23:return 48;case 24:return 73;case 25:return 72;case 26:return 72;case 27:return 87;case 28:break;case 29:return this.popState(),54;case 30:return this.popState(),33;case 31:return e.yytext=i(1,2).replace(/\\\\\"/g,'\"'),80;case 32:return e.yytext=i(1,2).replace(/\\\\'/g,\"'\"),80;case 33:return 85;case 34:return 82;case 35:return 82;case 36:return 83;case 37:return 84;case 38:return 81;case 39:return 75;case 40:return 77;case 41:return 72;case 42:return e.yytext=e.yytext.replace(/\\\\([\\\\\\]])/g,\"$1\"),72;case 43:return\"INVALID\";case 44:return 5}},t.rules=[/^(?:[^\\x00]*?(?=(\\{\\{)))/,/^(?:[^\\x00]+)/,/^(?:[^\\x00]{2,}?(?=(\\{\\{|\\\\\\{\\{|\\\\\\\\\\{\\{|$)))/,/^(?:\\{\\{\\{\\{(?=[^\\/]))/,/^(?:\\{\\{\\{\\{\\/[^\\s!\"#%-,\\.\\/;->@\\[-\\^`\\{-~]+(?=[=}\\s\\/.])\\}\\}\\}\\})/,/^(?:[^\\x00]*?(?=(\\{\\{\\{\\{)))/,/^(?:[\\s\\S]*?--(~)?\\}\\})/,/^(?:\\()/,/^(?:\\))/,/^(?:\\{\\{\\{\\{)/,/^(?:\\}\\}\\}\\})/,/^(?:\\{\\{(~)?>)/,/^(?:\\{\\{(~)?#>)/,/^(?:\\{\\{(~)?#\\*?)/,/^(?:\\{\\{(~)?\\/)/,/^(?:\\{\\{(~)?\\^\\s*(~)?\\}\\})/,/^(?:\\{\\{(~)?\\s*else\\s*(~)?\\}\\})/,/^(?:\\{\\{(~)?\\^)/,/^(?:\\{\\{(~)?\\s*else\\b)/,/^(?:\\{\\{(~)?\\{)/,/^(?:\\{\\{(~)?&)/,/^(?:\\{\\{(~)?!--)/,/^(?:\\{\\{(~)?![\\s\\S]*?\\}\\})/,/^(?:\\{\\{(~)?\\*?)/,/^(?:=)/,/^(?:\\.\\.)/,/^(?:\\.(?=([=~}\\s\\/.)|])))/,/^(?:[\\/.])/,/^(?:\\s+)/,/^(?:\\}(~)?\\}\\})/,/^(?:(~)?\\}\\})/,/^(?:\"(\\\\[\"]|[^\"])*\")/,/^(?:'(\\\\[']|[^'])*')/,/^(?:@)/,/^(?:true(?=([~}\\s)])))/,/^(?:false(?=([~}\\s)])))/,/^(?:undefined(?=([~}\\s)])))/,/^(?:null(?=([~}\\s)])))/,/^(?:-?[0-9]+(?:\\.[0-9]+)?(?=([~}\\s)])))/,/^(?:as\\s+\\|)/,/^(?:\\|)/,/^(?:([^\\s!\"#%-,\\.\\/;->@\\[-\\^`\\{-~]+(?=([=~}\\s\\/.)|]))))/,/^(?:\\[(\\\\\\]|[^\\]])*\\])/,/^(?:.)/,/^(?:$)/],t.conditions={mu:{rules:[7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24,25,26,27,28,29,30,31,32,33,34,35,36,37,38,39,40,41,42,43,44],inclusive:!1},emu:{rules:[2],inclusive:!1},com:{rules:[6],inclusive:!1},raw:{rules:[3,4,5],inclusive:!1},INITIAL:{rules:[0,1,44],inclusive:!0}},t}();return e.lexer=r,t.prototype=e,e.Parser=t,new t}();e.__esModule=!0,e[\"default\"]=r},function(t,e,r){\"use strict\";function s(){var t=arguments.length<=0||void 0===arguments[0]?{}:arguments[0];this.options=t}function i(t,e,r){void 0===e&&(e=t.length);var s=t[e-1],i=t[e-2];return s?\"ContentStatement\"===s.type?(i||!r?/\\r?\\n\\s*?$/:/(^|\\r?\\n)\\s*?$/).test(s.original):void 0:r}function a(t,e,r){void 0===e&&(e=-1);var s=t[e+1],i=t[e+2];return s?\"ContentStatement\"===s.type?(i||!r?/^\\s*?\\r?\\n/:/^\\s*?(\\r?\\n|$)/).test(s.original):void 0:r}function n(t,e,r){var s=t[null==e?0:e+1];if(s&&\"ContentStatement\"===s.type&&(r||!s.rightStripped)){var i=s.value;s.value=s.value.replace(r?/^\\s+/:/^[ \\t]*\\r?\\n?/,\"\"),s.rightStripped=s.value!==i}}function o(t,e,r){var s=t[null==e?t.length-1:e-1];if(s&&\"ContentStatement\"===s.type&&(r||!s.leftStripped)){var i=s.value;return s.value=s.value.replace(r?/\\s+$/:/[ \\t]+$/,\"\"),s.leftStripped=s.value!==i,s.leftStripped}}var c=r(1)[\"default\"];e.__esModule=!0;var h=r(25),l=c(h);s.prototype=new l[\"default\"],s.prototype.Program=function(t){var e=!this.options.ignoreStandalone,r=!this.isRootSeen;this.isRootSeen=!0;for(var s=t.body,c=0,h=s.length;c<h;c++){var l=s[c],p=this.accept(l);if(p){var u=i(s,c,r),f=a(s,c,r),d=p.openStandalone&&u,m=p.closeStandalone&&f,g=p.inlineStandalone&&u&&f;p.close&&n(s,c,!0),p.open&&o(s,c,!0),e&&g&&(n(s,c),o(s,c)&&\"PartialStatement\"===l.type&&(l.indent=/([ \\t]+$)/.exec(s[c-1].original)[1])),e&&d&&(n((l.program||l.inverse).body),o(s,c)),e&&m&&(n(s,c),o((l.inverse||l.program).body))}}return t},s.prototype.BlockStatement=s.prototype.DecoratorBlock=s.prototype.PartialBlockStatement=function(t){this.accept(t.program),this.accept(t.inverse);var e=t.program||t.inverse,r=t.program&&t.inverse,s=r,c=r;if(r&&r.chained)for(s=r.body[0].program;c.chained;)c=c.body[c.body.length-1].program;var h={open:t.openStrip.open,close:t.closeStrip.close,openStandalone:a(e.body),closeStandalone:i((s||e).body)};if(t.openStrip.close&&n(e.body,null,!0),r){var l=t.inverseStrip;l.open&&o(e.body,null,!0),l.close&&n(s.body,null,!0),t.closeStrip.open&&o(c.body,null,!0),!this.options.ignoreStandalone&&i(e.body)&&a(s.body)&&(o(e.body),n(s.body))}else t.closeStrip.open&&o(e.body,null,!0);return h},s.prototype.Decorator=s.prototype.MustacheStatement=function(t){return t.strip},s.prototype.PartialStatement=s.prototype.CommentStatement=function(t){var e=t.strip||{};return{inlineStandalone:!0,open:e.open,close:e.close}},e[\"default\"]=s,t.exports=e[\"default\"]},function(t,e,r){\"use strict\";function s(){this.parents=[]}function i(t){this.acceptRequired(t,\"path\"),this.acceptArray(t.params),this.acceptKey(t,\"hash\")}function a(t){i.call(this,t),this.acceptKey(t,\"program\"),this.acceptKey(t,\"inverse\")}function n(t){this.acceptRequired(t,\"name\"),this.acceptArray(t.params),this.acceptKey(t,\"hash\")}var o=r(1)[\"default\"];e.__esModule=!0;var c=r(6),h=o(c);s.prototype={constructor:s,mutating:!1,acceptKey:function(t,e){var r=this.accept(t[e]);if(this.mutating){if(r&&!s.prototype[r.type])throw new h[\"default\"]('Unexpected node type \"'+r.type+'\" found when accepting '+e+\" on \"+t.type);t[e]=r}},acceptRequired:function(t,e){if(this.acceptKey(t,e),!t[e])throw new h[\"default\"](t.type+\" requires \"+e)},acceptArray:function(t){for(var e=0,r=t.length;e<r;e++)this.acceptKey(t,e),t[e]||(t.splice(e,1),e--,r--)},accept:function(t){if(t){if(!this[t.type])throw new h[\"default\"](\"Unknown type: \"+t.type,t);this.current&&this.parents.unshift(this.current),this.current=t;var e=this[t.type](t);return this.current=this.parents.shift(),!this.mutating||e?e:e!==!1?t:void 0}},Program:function(t){this.acceptArray(t.body)},MustacheStatement:i,Decorator:i,BlockStatement:a,DecoratorBlock:a,PartialStatement:n,PartialBlockStatement:function(t){n.call(this,t),this.acceptKey(t,\"program\")},ContentStatement:function(){},CommentStatement:function(){},SubExpression:i,PathExpression:function(){},StringLiteral:function(){},NumberLiteral:function(){},BooleanLiteral:function(){},UndefinedLiteral:function(){},NullLiteral:function(){},Hash:function(t){this.acceptArray(t.pairs)},HashPair:function(t){this.acceptRequired(t,\"value\")}},e[\"default\"]=s,t.exports=e[\"default\"]},function(t,e,r){\"use strict\";function s(t,e){if(e=e.path?e.path.original:e,t.path.original!==e){var r={loc:t.path.loc};throw new g[\"default\"](t.path.original+\" doesn't match \"+e,r)}}function i(t,e){this.source=t,this.start={line:e.first_line,column:e.first_column},this.end={line:e.last_line,column:e.last_column}}function a(t){return/^\\[.*\\]$/.test(t)?t.substr(1,t.length-2):t}function n(t,e){return{open:\"~\"===t.charAt(2),close:\"~\"===e.charAt(e.length-3)}}function o(t){return t.replace(/^\\{\\{~?\\!-?-?/,\"\").replace(/-?-?~?\\}\\}$/,\"\")}function c(t,e,r){r=this.locInfo(r);for(var s=t?\"@\":\"\",i=[],a=0,n=\"\",o=0,c=e.length;o<c;o++){var h=e[o].part,l=e[o].original!==h;if(s+=(e[o].separator||\"\")+h,l||\"..\"!==h&&\".\"!==h&&\"this\"!==h)i.push(h);else{if(i.length>0)throw new g[\"default\"](\"Invalid path: \"+s,{loc:r});\"..\"===h&&(a++,n+=\"../\")}}return{type:\"PathExpression\",data:t,depth:a,parts:i,original:s,loc:r}}function h(t,e,r,s,i,a){var n=s.charAt(3)||s.charAt(2),o=\"{\"!==n&&\"&\"!==n,c=/\\*/.test(s);return{type:c?\"Decorator\":\"MustacheStatement\",path:t,params:e,hash:r,escaped:o,strip:i,loc:this.locInfo(a)}}function l(t,e,r,i){s(t,r),i=this.locInfo(i);var a={type:\"Program\",body:e,strip:{},loc:i};return{type:\"BlockStatement\",path:t.path,params:t.params,hash:t.hash,program:a,openStrip:{},inverseStrip:{},closeStrip:{},loc:i}}function p(t,e,r,i,a,n){i&&i.path&&s(t,i);var o=/\\*/.test(t.open);e.blockParams=t.blockParams;var c=void 0,h=void 0;if(r){if(o)throw new g[\"default\"](\"Unexpected inverse block on decorator\",r);r.chain&&(r.program.body[0].closeStrip=i.strip),h=r.strip,c=r.program}return a&&(a=c,c=e,e=a),{type:o?\"DecoratorBlock\":\"BlockStatement\",path:t.path,params:t.params,hash:t.hash,program:e,inverse:c,openStrip:t.strip,inverseStrip:h,closeStrip:i&&i.strip,loc:this.locInfo(n)}}function u(t,e){if(!e&&t.length){var r=t[0].loc,s=t[t.length-1].loc;r&&s&&(e={source:r.source,start:{line:r.start.line,column:r.start.column},end:{line:s.end.line,column:s.end.column}})}return{type:\"Program\",body:t,strip:{},loc:e}}function f(t,e,r,i){return s(t,r),{type:\"PartialBlockStatement\",name:t.path,params:t.params,hash:t.hash,program:e,openStrip:t.strip,closeStrip:r&&r.strip,loc:this.locInfo(i)}}var d=r(1)[\"default\"];e.__esModule=!0,e.SourceLocation=i,e.id=a,e.stripFlags=n,e.stripComment=o,e.preparePath=c,e.prepareMustache=h,e.prepareRawBlock=l,e.prepareBlock=p,e.prepareProgram=u,e.preparePartialBlock=f;var m=r(6),g=d(m)},function(t,e,r){\"use strict\";function s(){}function i(t,e,r){if(null==t||\"string\"!=typeof t&&\"Program\"!==t.type)throw new l[\"default\"](\"You must pass a string or Handlebars AST to Handlebars.precompile. You passed \"+t);e=e||{},\"data\"in e||(e.data=!0),e.compat&&(e.useDepths=!0);var s=r.parse(t,e),i=(new r.Compiler).compile(s,e);return(new r.JavaScriptCompiler).compile(i,e)}function a(t,e,r){function s(){var s=r.parse(t,e),i=(new r.Compiler).compile(s,e),a=(new r.JavaScriptCompiler).compile(i,e,void 0,!0);return r.template(a)}function i(t,e){return a||(a=s()),a.call(this,t,e)}if(void 0===e&&(e={}),null==t||\"string\"!=typeof t&&\"Program\"!==t.type)throw new l[\"default\"](\"You must pass a string or Handlebars AST to Handlebars.compile. You passed \"+t);\"data\"in e||(e.data=!0),e.compat&&(e.useDepths=!0);var a=void 0;return i._setup=function(t){return a||(a=s()),a._setup(t)},i._child=function(t,e,r,i){return a||(a=s()),a._child(t,e,r,i)},i}function n(t,e){if(t===e)return!0;if(p.isArray(t)&&p.isArray(e)&&t.length===e.length){for(var r=0;r<t.length;r++)if(!n(t[r],e[r]))return!1;return!0}}function o(t){if(!t.path.parts){var e=t.path;t.path={type:\"PathExpression\",data:!1,depth:0,parts:[e.original+\"\"],original:e.original+\"\",loc:e.loc}}}var c=r(1)[\"default\"];e.__esModule=!0,e.Compiler=s,e.precompile=i,e.compile=a;var h=r(6),l=c(h),p=r(5),u=r(21),f=c(u),d=[].slice;s.prototype={compiler:s,equals:function(t){var e=this.opcodes.length;if(t.opcodes.length!==e)return!1;for(var r=0;r<e;r++){var s=this.opcodes[r],i=t.opcodes[r];if(s.opcode!==i.opcode||!n(s.args,i.args))return!1}e=this.children.length;for(var r=0;r<e;r++)if(!this.children[r].equals(t.children[r]))return!1;return!0},guid:0,compile:function(t,e){this.sourceNode=[],this.opcodes=[],this.children=[],this.options=e,this.stringParams=e.stringParams,this.trackIds=e.trackIds,e.blockParams=e.blockParams||[];var r=e.knownHelpers;if(e.knownHelpers={helperMissing:!0,blockHelperMissing:!0,each:!0,\"if\":!0,unless:!0,\"with\":!0,log:!0,lookup:!0},r)for(var s in r)s in r&&(e.knownHelpers[s]=r[s]);return this.accept(t)},compileProgram:function(t){var e=new this.compiler,r=e.compile(t,this.options),s=this.guid++;return this.usePartial=this.usePartial||r.usePartial,this.children[s]=r,this.useDepths=this.useDepths||r.useDepths,s},accept:function(t){if(!this[t.type])throw new l[\"default\"](\"Unknown type: \"+t.type,t);this.sourceNode.unshift(t);var e=this[t.type](t);return this.sourceNode.shift(),e},Program:function(t){this.options.blockParams.unshift(t.blockParams);for(var e=t.body,r=e.length,s=0;s<r;s++)this.accept(e[s]);return this.options.blockParams.shift(),this.isSimple=1===r,this.blockParams=t.blockParams?t.blockParams.length:0,this},BlockStatement:function(t){o(t);var e=t.program,r=t.inverse;e=e&&this.compileProgram(e),r=r&&this.compileProgram(r);var s=this.classifySexpr(t);\"helper\"===s?this.helperSexpr(t,e,r):\"simple\"===s?(this.simpleSexpr(t),this.opcode(\"pushProgram\",e),this.opcode(\"pushProgram\",r),this.opcode(\"emptyHash\"),this.opcode(\"blockValue\",t.path.original)):(this.ambiguousSexpr(t,e,r),this.opcode(\"pushProgram\",e),this.opcode(\"pushProgram\",r),this.opcode(\"emptyHash\"),this.opcode(\"ambiguousBlockValue\")),this.opcode(\"append\")},DecoratorBlock:function(t){var e=t.program&&this.compileProgram(t.program),r=this.setupFullMustacheParams(t,e,void 0),s=t.path;this.useDecorators=!0,this.opcode(\"registerDecorator\",r.length,s.original)},PartialStatement:function(t){this.usePartial=!0;var e=t.program;e&&(e=this.compileProgram(t.program));var r=t.params;if(r.length>1)throw new l[\"default\"](\"Unsupported number of partial arguments: \"+r.length,t);r.length||(this.options.explicitPartialContext?this.opcode(\"pushLiteral\",\"undefined\"):r.push({type:\"PathExpression\",parts:[],depth:0}));var s=t.name.original,i=\"SubExpression\"===t.name.type;i&&this.accept(t.name),this.setupFullMustacheParams(t,e,void 0,!0);var a=t.indent||\"\";this.options.preventIndent&&a&&(this.opcode(\"appendContent\",a),a=\"\"),this.opcode(\"invokePartial\",i,s,a),this.opcode(\"append\")},PartialBlockStatement:function(t){this.PartialStatement(t)},MustacheStatement:function(t){this.SubExpression(t),t.escaped&&!this.options.noEscape?this.opcode(\"appendEscaped\"):this.opcode(\"append\")},Decorator:function(t){this.DecoratorBlock(t)},ContentStatement:function(t){t.value&&this.opcode(\"appendContent\",t.value)},CommentStatement:function(){},SubExpression:function(t){o(t);var e=this.classifySexpr(t);\"simple\"===e?this.simpleSexpr(t):\"helper\"===e?this.helperSexpr(t):this.ambiguousSexpr(t)},ambiguousSexpr:function(t,e,r){var s=t.path,i=s.parts[0],a=null!=e||null!=r;this.opcode(\"getContext\",s.depth),this.opcode(\"pushProgram\",e),this.opcode(\"pushProgram\",r),s.strict=!0,this.accept(s),this.opcode(\"invokeAmbiguous\",i,a)},simpleSexpr:function(t){var e=t.path;e.strict=!0,this.accept(e),this.opcode(\"resolvePossibleLambda\")},helperSexpr:function(t,e,r){var s=this.setupFullMustacheParams(t,e,r),i=t.path,a=i.parts[0];if(this.options.knownHelpers[a])this.opcode(\"invokeKnownHelper\",s.length,a);else{if(this.options.knownHelpersOnly)throw new l[\"default\"](\"You specified knownHelpersOnly, but used the unknown helper \"+a,t);i.strict=!0,i.falsy=!0,this.accept(i),this.opcode(\"invokeHelper\",s.length,i.original,f[\"default\"].helpers.simpleId(i))}},PathExpression:function(t){this.addDepth(t.depth),this.opcode(\"getContext\",t.depth);var e=t.parts[0],r=f[\"default\"].helpers.scopedId(t),s=!t.depth&&!r&&this.blockParamIndex(e);s?this.opcode(\"lookupBlockParam\",s,t.parts):e?t.data?(this.options.data=!0,this.opcode(\"lookupData\",t.depth,t.parts,t.strict)):this.opcode(\"lookupOnContext\",t.parts,t.falsy,t.strict,r):this.opcode(\"pushContext\")},StringLiteral:function(t){this.opcode(\"pushString\",t.value)},NumberLiteral:function(t){this.opcode(\"pushLiteral\",t.value)},BooleanLiteral:function(t){this.opcode(\"pushLiteral\",t.value)},UndefinedLiteral:function(){this.opcode(\"pushLiteral\",\"undefined\")},NullLiteral:function(){this.opcode(\"pushLiteral\",\"null\")},Hash:function(t){var e=t.pairs,r=0,s=e.length;for(this.opcode(\"pushHash\");r<s;r++)this.pushParam(e[r].value);for(;r--;)this.opcode(\"assignToHash\",e[r].key);this.opcode(\"popHash\")},opcode:function(t){this.opcodes.push({opcode:t,args:d.call(arguments,1),loc:this.sourceNode[0].loc})},addDepth:function(t){t&&(this.useDepths=!0)},classifySexpr:function(t){var e=f[\"default\"].helpers.simpleId(t.path),r=e&&!!this.blockParamIndex(t.path.parts[0]),s=!r&&f[\"default\"].helpers.helperExpression(t),i=!r&&(s||e);if(i&&!s){var a=t.path.parts[0],n=this.options;n.knownHelpers[a]?s=!0:n.knownHelpersOnly&&(i=!1)}return s?\"helper\":i?\"ambiguous\":\"simple\"},pushParams:function(t){for(var e=0,r=t.length;e<r;e++)this.pushParam(t[e])},pushParam:function(t){var e=null!=t.value?t.value:t.original||\"\";if(this.stringParams)e.replace&&(e=e.replace(/^(\\.?\\.\\/)*/g,\"\").replace(/\\//g,\".\")),t.depth&&this.addDepth(t.depth),this.opcode(\"getContext\",t.depth||0),this.opcode(\"pushStringParam\",e,t.type),\"SubExpression\"===t.type&&this.accept(t);else{if(this.trackIds){var r=void 0;if(!t.parts||f[\"default\"].helpers.scopedId(t)||t.depth||(r=this.blockParamIndex(t.parts[0])),r){var s=t.parts.slice(1).join(\".\");this.opcode(\"pushId\",\"BlockParam\",r,s)}else e=t.original||e,e.replace&&(e=e.replace(/^this(?:\\.|$)/,\"\").replace(/^\\.\\//,\"\").replace(/^\\.$/,\"\")),this.opcode(\"pushId\",t.type,e)}this.accept(t)}},setupFullMustacheParams:function(t,e,r,s){var i=t.params;return this.pushParams(i),this.opcode(\"pushProgram\",e),this.opcode(\"pushProgram\",r),t.hash?this.accept(t.hash):this.opcode(\"emptyHash\",s),i},blockParamIndex:function(t){for(var e=0,r=this.options.blockParams.length;e<r;e++){var s=this.options.blockParams[e],i=s&&p.indexOf(s,t);if(s&&i>=0)return[e,i]}}}},function(t,e,r){\"use strict\";function s(t){this.value=t}function i(){}function a(t,e,r,s){var i=e.popStack(),a=0,n=r.length;for(t&&n--;a<n;a++)i=e.nameLookup(i,r[a],s);return t?[e.aliasable(\"container.strict\"),\"(\",i,\", \",e.quotedString(r[a]),\")\"]:i}var n=r(1)[\"default\"];e.__esModule=!0;var o=r(4),c=r(6),h=n(c),l=r(5),p=r(29),u=n(p);i.prototype={nameLookup:function(t,e){return i.isValidJavaScriptVariableName(e)?[t,\".\",e]:[t,\"[\",JSON.stringify(e),\"]\"]},depthedLookup:function(t){return[this.aliasable(\"container.lookup\"),'(depths, \"',t,'\")']},compilerInfo:function(){var t=o.COMPILER_REVISION,e=o.REVISION_CHANGES[t];return[t,e]},appendToBuffer:function(t,e,r){return l.isArray(t)||(t=[t]),t=this.source.wrap(t,e),this.environment.isSimple?[\"return \",t,\";\"]:r?[\"buffer += \",t,\";\"]:(t.appendToBuffer=!0,t)},initializeBuffer:function(){return this.quotedString(\"\")},compile:function(t,e,r,s){this.environment=t,this.options=e,this.stringParams=this.options.stringParams,this.trackIds=this.options.trackIds,this.precompile=!s,this.name=this.environment.name,this.isChild=!!r,this.context=r||{decorators:[],programs:[],environments:[]},this.preamble(),this.stackSlot=0,this.stackVars=[],this.aliases={},this.registers={list:[]},this.hashes=[],this.compileStack=[],this.inlineStack=[],this.blockParams=[],this.compileChildren(t,e),this.useDepths=this.useDepths||t.useDepths||t.useDecorators||this.options.compat,this.useBlockParams=this.useBlockParams||t.useBlockParams;var i=t.opcodes,a=void 0,n=void 0,o=void 0,c=void 0;for(o=0,c=i.length;o<c;o++)a=i[o],this.source.currentLocation=a.loc,n=n||a.loc,this[a.opcode].apply(this,a.args);if(this.source.currentLocation=n,this.pushSource(\"\"),this.stackSlot||this.inlineStack.length||this.compileStack.length)throw new h[\"default\"](\"Compile completed with content left on stack\");this.decorators.isEmpty()?this.decorators=void 0:(this.useDecorators=!0,this.decorators.prepend(\"var decorators = container.decorators;\\n\"),this.decorators.push(\"return fn;\"),s?this.decorators=Function.apply(this,[\"fn\",\"props\",\"container\",\"depth0\",\"data\",\"blockParams\",\"depths\",this.decorators.merge()]):(this.decorators.prepend(\"function(fn, props, container, depth0, data, blockParams, depths) {\\n\"),this.decorators.push(\"}\\n\"),this.decorators=this.decorators.merge()));var l=this.createFunctionContext(s);if(this.isChild)return l;var p={compiler:this.compilerInfo(),main:l};this.decorators&&(p.main_d=this.decorators,p.useDecorators=!0);var u=this.context,f=u.programs,d=u.decorators;for(o=0,c=f.length;o<c;o++)f[o]&&(p[o]=f[o],d[o]&&(p[o+\"_d\"]=d[o],p.useDecorators=!0));return this.environment.usePartial&&(p.usePartial=!0),this.options.data&&(p.useData=!0),this.useDepths&&(p.useDepths=!0),this.useBlockParams&&(p.useBlockParams=!0),this.options.compat&&(p.compat=!0),s?p.compilerOptions=this.options:(p.compiler=JSON.stringify(p.compiler),this.source.currentLocation={start:{line:1,column:0}},p=this.objectLiteral(p),e.srcName?(p=p.toStringWithSourceMap({file:e.destName}),p.map=p.map&&p.map.toString()):p=p.toString()),p},preamble:function(){this.lastContext=0,this.source=new u[\"default\"](this.options.srcName),this.decorators=new u[\"default\"](this.options.srcName)},createFunctionContext:function(t){var e=\"\",r=this.stackVars.concat(this.registers.list);r.length>0&&(e+=\", \"+r.join(\", \"));var s=0;for(var i in this.aliases){var a=this.aliases[i];this.aliases.hasOwnProperty(i)&&a.children&&a.referenceCount>1&&(e+=\", alias\"+ ++s+\"=\"+i,a.children[0]=\"alias\"+s)}var n=[\"container\",\"depth0\",\"helpers\",\"partials\",\"data\"];(this.useBlockParams||this.useDepths)&&n.push(\"blockParams\"),this.useDepths&&n.push(\"depths\");var o=this.mergeSource(e);return t?(n.push(o),Function.apply(this,n)):this.source.wrap([\"function(\",n.join(\",\"),\") {\\n  \",o,\"}\"])},mergeSource:function(t){var e=this.environment.isSimple,r=!this.forceBuffer,s=void 0,i=void 0,a=void 0,n=void 0;return this.source.each(function(t){t.appendToBuffer?(a?t.prepend(\"  + \"):a=t,n=t):(a&&(i?a.prepend(\"buffer += \"):s=!0,n.add(\";\"),a=n=void 0),i=!0,e||(r=!1))}),r?a?(a.prepend(\"return \"),n.add(\";\")):i||this.source.push('return \"\";'):(t+=\", buffer = \"+(s?\"\":this.initializeBuffer()),a?(a.prepend(\"return buffer + \"),n.add(\";\")):this.source.push(\"return buffer;\")),t&&this.source.prepend(\"var \"+t.substring(2)+(s?\"\":\";\\n\")),this.source.merge()},blockValue:function(t){var e=this.aliasable(\"helpers.blockHelperMissing\"),r=[this.contextName(0)];this.setupHelperArgs(t,0,r);var s=this.popStack();r.splice(1,0,s),this.push(this.source.functionCall(e,\"call\",r))},ambiguousBlockValue:function(){var t=this.aliasable(\"helpers.blockHelperMissing\"),e=[this.contextName(0)];this.setupHelperArgs(\"\",0,e,!0),this.flushInline();var r=this.topStack();e.splice(1,0,r),this.pushSource([\"if (!\",this.lastHelper,\") { \",r,\" = \",this.source.functionCall(t,\"call\",e),\"}\"])},appendContent:function(t){this.pendingContent?t=this.pendingContent+t:this.pendingLocation=this.source.currentLocation,this.pendingContent=t},append:function(){if(this.isInline())this.replaceStack(function(t){return[\" != null ? \",t,' : \"\"']}),this.pushSource(this.appendToBuffer(this.popStack()));else{var t=this.popStack();this.pushSource([\"if (\",t,\" != null) { \",this.appendToBuffer(t,void 0,!0),\" }\"]),this.environment.isSimple&&this.pushSource([\"else { \",this.appendToBuffer(\"''\",void 0,!0),\" }\"])}},appendEscaped:function(){this.pushSource(this.appendToBuffer([this.aliasable(\"container.escapeExpression\"),\"(\",this.popStack(),\")\"]))},getContext:function(t){this.lastContext=t},pushContext:function(){this.pushStackLiteral(this.contextName(this.lastContext))},lookupOnContext:function(t,e,r,s){var i=0;s||!this.options.compat||this.lastContext?this.pushContext():this.push(this.depthedLookup(t[i++])),this.resolvePath(\"context\",t,i,e,r)},lookupBlockParam:function(t,e){this.useBlockParams=!0,this.push([\"blockParams[\",t[0],\"][\",t[1],\"]\"]),this.resolvePath(\"context\",e,1)},lookupData:function(t,e,r){t?this.pushStackLiteral(\"container.data(data, \"+t+\")\"):this.pushStackLiteral(\"data\"),this.resolvePath(\"data\",e,0,!0,r)},resolvePath:function(t,e,r,s,i){var n=this;if(this.options.strict||this.options.assumeObjects)return void this.push(a(this.options.strict&&i,this,e,t));for(var o=e.length;r<o;r++)this.replaceStack(function(i){var a=n.nameLookup(i,e[r],t);return s?[\" && \",a]:[\" != null ? \",a,\" : \",i]})},resolvePossibleLambda:function(){this.push([this.aliasable(\"container.lambda\"),\"(\",this.popStack(),\", \",this.contextName(0),\")\"])},pushStringParam:function(t,e){this.pushContext(),this.pushString(e),\"SubExpression\"!==e&&(\"string\"==typeof t?this.pushString(t):this.pushStackLiteral(t))},emptyHash:function(t){this.trackIds&&this.push(\"{}\"),this.stringParams&&(this.push(\"{}\"),this.push(\"{}\")),this.pushStackLiteral(t?\"undefined\":\"{}\")},pushHash:function(){this.hash&&this.hashes.push(this.hash),this.hash={values:[],types:[],contexts:[],ids:[]}},popHash:function(){var t=this.hash;this.hash=this.hashes.pop(),this.trackIds&&this.push(this.objectLiteral(t.ids)),this.stringParams&&(this.push(this.objectLiteral(t.contexts)),this.push(this.objectLiteral(t.types))),this.push(this.objectLiteral(t.values))},pushString:function(t){this.pushStackLiteral(this.quotedString(t))},pushLiteral:function(t){this.pushStackLiteral(t)},pushProgram:function(t){null!=t?this.pushStackLiteral(this.programExpression(t)):this.pushStackLiteral(null)},registerDecorator:function(t,e){var r=this.nameLookup(\"decorators\",e,\"decorator\"),s=this.setupHelperArgs(e,t);this.decorators.push([\"fn = \",this.decorators.functionCall(r,\"\",[\"fn\",\"props\",\"container\",s]),\" || fn;\"])},invokeHelper:function(t,e,r){var s=this.popStack(),i=this.setupHelper(t,e),a=r?[i.name,\" || \"]:\"\",n=[\"(\"].concat(a,s);this.options.strict||n.push(\" || \",this.aliasable(\"helpers.helperMissing\")),n.push(\")\"),this.push(this.source.functionCall(n,\"call\",i.callParams))},invokeKnownHelper:function(t,e){var r=this.setupHelper(t,e);this.push(this.source.functionCall(r.name,\"call\",r.callParams))},invokeAmbiguous:function(t,e){this.useRegister(\"helper\");var r=this.popStack();this.emptyHash();var s=this.setupHelper(0,t,e),i=this.lastHelper=this.nameLookup(\"helpers\",t,\"helper\"),a=[\"(\",\"(helper = \",i,\" || \",r,\")\"];this.options.strict||(a[0]=\"(helper = \",a.push(\" != null ? helper : \",this.aliasable(\"helpers.helperMissing\"))),this.push([\"(\",a,s.paramsInit?[\"),(\",s.paramsInit]:[],\"),\",\"(typeof helper === \",this.aliasable('\"function\"'),\" ? \",this.source.functionCall(\"helper\",\"call\",s.callParams),\" : helper))\"])},invokePartial:function(t,e,r){var s=[],i=this.setupParams(e,1,s);t&&(e=this.popStack(),delete i.name),r&&(i.indent=JSON.stringify(r)),i.helpers=\"helpers\",i.partials=\"partials\",i.decorators=\"container.decorators\",t?s.unshift(e):s.unshift(this.nameLookup(\"partials\",e,\"partial\")),this.options.compat&&(i.depths=\"depths\"),i=this.objectLiteral(i),\ns.push(i),this.push(this.source.functionCall(\"container.invokePartial\",\"\",s))},assignToHash:function(t){var e=this.popStack(),r=void 0,s=void 0,i=void 0;this.trackIds&&(i=this.popStack()),this.stringParams&&(s=this.popStack(),r=this.popStack());var a=this.hash;r&&(a.contexts[t]=r),s&&(a.types[t]=s),i&&(a.ids[t]=i),a.values[t]=e},pushId:function(t,e,r){\"BlockParam\"===t?this.pushStackLiteral(\"blockParams[\"+e[0]+\"].path[\"+e[1]+\"]\"+(r?\" + \"+JSON.stringify(\".\"+r):\"\")):\"PathExpression\"===t?this.pushString(e):\"SubExpression\"===t?this.pushStackLiteral(\"true\"):this.pushStackLiteral(\"null\")},compiler:i,compileChildren:function(t,e){for(var r=t.children,s=void 0,i=void 0,a=0,n=r.length;a<n;a++){s=r[a],i=new this.compiler;var o=this.matchExistingProgram(s);null==o?(this.context.programs.push(\"\"),o=this.context.programs.length,s.index=o,s.name=\"program\"+o,this.context.programs[o]=i.compile(s,e,this.context,!this.precompile),this.context.decorators[o]=i.decorators,this.context.environments[o]=s,this.useDepths=this.useDepths||i.useDepths,this.useBlockParams=this.useBlockParams||i.useBlockParams):(s.index=o,s.name=\"program\"+o,this.useDepths=this.useDepths||s.useDepths,this.useBlockParams=this.useBlockParams||s.useBlockParams)}},matchExistingProgram:function(t){for(var e=0,r=this.context.environments.length;e<r;e++){var s=this.context.environments[e];if(s&&s.equals(t))return e}},programExpression:function(t){var e=this.environment.children[t],r=[e.index,\"data\",e.blockParams];return(this.useBlockParams||this.useDepths)&&r.push(\"blockParams\"),this.useDepths&&r.push(\"depths\"),\"container.program(\"+r.join(\", \")+\")\"},useRegister:function(t){this.registers[t]||(this.registers[t]=!0,this.registers.list.push(t))},push:function(t){return t instanceof s||(t=this.source.wrap(t)),this.inlineStack.push(t),t},pushStackLiteral:function(t){this.push(new s(t))},pushSource:function(t){this.pendingContent&&(this.source.push(this.appendToBuffer(this.source.quotedString(this.pendingContent),this.pendingLocation)),this.pendingContent=void 0),t&&this.source.push(t)},replaceStack:function(t){var e=[\"(\"],r=void 0,i=void 0,a=void 0;if(!this.isInline())throw new h[\"default\"](\"replaceStack on non-inline\");var n=this.popStack(!0);if(n instanceof s)r=[n.value],e=[\"(\",r],a=!0;else{i=!0;var o=this.incrStack();e=[\"((\",this.push(o),\" = \",n,\")\"],r=this.topStack()}var c=t.call(this,r);a||this.popStack(),i&&this.stackSlot--,this.push(e.concat(c,\")\"))},incrStack:function(){return this.stackSlot++,this.stackSlot>this.stackVars.length&&this.stackVars.push(\"stack\"+this.stackSlot),this.topStackName()},topStackName:function(){return\"stack\"+this.stackSlot},flushInline:function(){var t=this.inlineStack;this.inlineStack=[];for(var e=0,r=t.length;e<r;e++){var i=t[e];if(i instanceof s)this.compileStack.push(i);else{var a=this.incrStack();this.pushSource([a,\" = \",i,\";\"]),this.compileStack.push(a)}}},isInline:function(){return this.inlineStack.length},popStack:function(t){var e=this.isInline(),r=(e?this.inlineStack:this.compileStack).pop();if(!t&&r instanceof s)return r.value;if(!e){if(!this.stackSlot)throw new h[\"default\"](\"Invalid stack pop\");this.stackSlot--}return r},topStack:function(){var t=this.isInline()?this.inlineStack:this.compileStack,e=t[t.length-1];return e instanceof s?e.value:e},contextName:function(t){return this.useDepths&&t?\"depths[\"+t+\"]\":\"depth\"+t},quotedString:function(t){return this.source.quotedString(t)},objectLiteral:function(t){return this.source.objectLiteral(t)},aliasable:function(t){var e=this.aliases[t];return e?(e.referenceCount++,e):(e=this.aliases[t]=this.source.wrap(t),e.aliasable=!0,e.referenceCount=1,e)},setupHelper:function(t,e,r){var s=[],i=this.setupHelperArgs(e,t,s,r),a=this.nameLookup(\"helpers\",e,\"helper\"),n=this.aliasable(this.contextName(0)+\" != null ? \"+this.contextName(0)+\" : {}\");return{params:s,paramsInit:i,name:a,callParams:[n].concat(s)}},setupParams:function(t,e,r){var s={},i=[],a=[],n=[],o=!r,c=void 0;o&&(r=[]),s.name=this.quotedString(t),s.hash=this.popStack(),this.trackIds&&(s.hashIds=this.popStack()),this.stringParams&&(s.hashTypes=this.popStack(),s.hashContexts=this.popStack());var h=this.popStack(),l=this.popStack();(l||h)&&(s.fn=l||\"container.noop\",s.inverse=h||\"container.noop\");for(var p=e;p--;)c=this.popStack(),r[p]=c,this.trackIds&&(n[p]=this.popStack()),this.stringParams&&(a[p]=this.popStack(),i[p]=this.popStack());return o&&(s.args=this.source.generateArray(r)),this.trackIds&&(s.ids=this.source.generateArray(n)),this.stringParams&&(s.types=this.source.generateArray(a),s.contexts=this.source.generateArray(i)),this.options.data&&(s.data=\"data\"),this.useBlockParams&&(s.blockParams=\"blockParams\"),s},setupHelperArgs:function(t,e,r,s){var i=this.setupParams(t,e,r);return i=this.objectLiteral(i),s?(this.useRegister(\"options\"),r.push(\"options\"),[\"options=\",i]):r?(r.push(i),\"\"):i}},function(){for(var t=\"break else new var case finally return void catch for switch while continue function this with default if throw delete in try do instanceof typeof abstract enum int short boolean export interface static byte extends long super char final native synchronized class float package throws const goto private transient debugger implements protected volatile double import public let yield await null true false\".split(\" \"),e=i.RESERVED_WORDS={},r=0,s=t.length;r<s;r++)e[t[r]]=!0}(),i.isValidJavaScriptVariableName=function(t){return!i.RESERVED_WORDS[t]&&/^[a-zA-Z_$][0-9a-zA-Z_$]*$/.test(t)},e[\"default\"]=i,t.exports=e[\"default\"]},function(t,e,r){\"use strict\";function s(t,e,r){if(a.isArray(t)){for(var s=[],i=0,n=t.length;i<n;i++)s.push(e.wrap(t[i],r));return s}return\"boolean\"==typeof t||\"number\"==typeof t?t+\"\":t}function i(t){this.srcFile=t,this.source=[]}e.__esModule=!0;var a=r(5),n=void 0;try{}catch(o){}n||(n=function(t,e,r,s){this.src=\"\",s&&this.add(s)},n.prototype={add:function(t){a.isArray(t)&&(t=t.join(\"\")),this.src+=t},prepend:function(t){a.isArray(t)&&(t=t.join(\"\")),this.src=t+this.src},toStringWithSourceMap:function(){return{code:this.toString()}},toString:function(){return this.src}}),i.prototype={isEmpty:function(){return!this.source.length},prepend:function(t,e){this.source.unshift(this.wrap(t,e))},push:function(t,e){this.source.push(this.wrap(t,e))},merge:function(){var t=this.empty();return this.each(function(e){t.add([\"  \",e,\"\\n\"])}),t},each:function(t){for(var e=0,r=this.source.length;e<r;e++)t(this.source[e])},empty:function(){var t=this.currentLocation||{start:{}};return new n(t.start.line,t.start.column,this.srcFile)},wrap:function(t){var e=arguments.length<=1||void 0===arguments[1]?this.currentLocation||{start:{}}:arguments[1];return t instanceof n?t:(t=s(t,this,e),new n(e.start.line,e.start.column,this.srcFile,t))},functionCall:function(t,e,r){return r=this.generateList(r),this.wrap([t,e?\".\"+e+\"(\":\"(\",r,\")\"])},quotedString:function(t){return'\"'+(t+\"\").replace(/\\\\/g,\"\\\\\\\\\").replace(/\"/g,'\\\\\"').replace(/\\n/g,\"\\\\n\").replace(/\\r/g,\"\\\\r\").replace(/\\u2028/g,\"\\\\u2028\").replace(/\\u2029/g,\"\\\\u2029\")+'\"'},objectLiteral:function(t){var e=[];for(var r in t)if(t.hasOwnProperty(r)){var i=s(t[r],this);\"undefined\"!==i&&e.push([this.quotedString(r),\":\",i])}var a=this.generateList(e);return a.prepend(\"{\"),a.add(\"}\"),a},generateList:function(t){for(var e=this.empty(),r=0,i=t.length;r<i;r++)r&&e.add(\",\"),e.add(s(t[r],this));return e},generateArray:function(t){var e=this.generateList(t);return e.prepend(\"[\"),e.add(\"]\"),e}},e[\"default\"]=i,t.exports=e[\"default\"]}])});"
  },
  {
    "path": "src/main/resources/static/swagger/lib/highlight.9.1.0.pack.js",
    "content": "!function(e){\"undefined\"!=typeof exports?e(exports):(self.hljs=e({}),\"function\"==typeof define&&define.amd&&define(\"hljs\",[],function(){return self.hljs}))}(function(e){function r(e){return e.replace(/&/gm,\"&amp;\").replace(/</gm,\"&lt;\").replace(/>/gm,\"&gt;\")}function t(e){return e.nodeName.toLowerCase()}function n(e,r){var t=e&&e.exec(r);return t&&0==t.index}function a(e){return/^(no-?highlight|plain|text)$/i.test(e)}function c(e){var r,t,n,c=e.className+\" \";if(c+=e.parentNode?e.parentNode.className:\"\",t=/\\blang(?:uage)?-([\\w-]+)\\b/i.exec(c))return E(t[1])?t[1]:\"no-highlight\";for(c=c.split(/\\s+/),r=0,n=c.length;n>r;r++)if(E(c[r])||a(c[r]))return c[r]}function i(e,r){var t,n={};for(t in e)n[t]=e[t];if(r)for(t in r)n[t]=r[t];return n}function o(e){var r=[];return function n(e,a){for(var c=e.firstChild;c;c=c.nextSibling)3==c.nodeType?a+=c.nodeValue.length:1==c.nodeType&&(r.push({event:\"start\",offset:a,node:c}),a=n(c,a),t(c).match(/br|hr|img|input/)||r.push({event:\"stop\",offset:a,node:c}));return a}(e,0),r}function s(e,n,a){function c(){return e.length&&n.length?e[0].offset!=n[0].offset?e[0].offset<n[0].offset?e:n:\"start\"==n[0].event?e:n:e.length?e:n}function i(e){function n(e){return\" \"+e.nodeName+'=\"'+r(e.value)+'\"'}l+=\"<\"+t(e)+Array.prototype.map.call(e.attributes,n).join(\"\")+\">\"}function o(e){l+=\"</\"+t(e)+\">\"}function s(e){(\"start\"==e.event?i:o)(e.node)}for(var u=0,l=\"\",f=[];e.length||n.length;){var b=c();if(l+=r(a.substr(u,b[0].offset-u)),u=b[0].offset,b==e){f.reverse().forEach(o);do s(b.splice(0,1)[0]),b=c();while(b==e&&b.length&&b[0].offset==u);f.reverse().forEach(i)}else\"start\"==b[0].event?f.push(b[0].node):f.pop(),s(b.splice(0,1)[0])}return l+r(a.substr(u))}function u(e){function r(e){return e&&e.source||e}function t(t,n){return new RegExp(r(t),\"m\"+(e.cI?\"i\":\"\")+(n?\"g\":\"\"))}function n(a,c){if(!a.compiled){if(a.compiled=!0,a.k=a.k||a.bK,a.k){var o={},s=function(r,t){e.cI&&(t=t.toLowerCase()),t.split(\" \").forEach(function(e){var t=e.split(\"|\");o[t[0]]=[r,t[1]?Number(t[1]):1]})};\"string\"==typeof a.k?s(\"keyword\",a.k):Object.keys(a.k).forEach(function(e){s(e,a.k[e])}),a.k=o}a.lR=t(a.l||/\\b\\w+\\b/,!0),c&&(a.bK&&(a.b=\"\\\\b(\"+a.bK.split(\" \").join(\"|\")+\")\\\\b\"),a.b||(a.b=/\\B|\\b/),a.bR=t(a.b),a.e||a.eW||(a.e=/\\B|\\b/),a.e&&(a.eR=t(a.e)),a.tE=r(a.e)||\"\",a.eW&&c.tE&&(a.tE+=(a.e?\"|\":\"\")+c.tE)),a.i&&(a.iR=t(a.i)),void 0===a.r&&(a.r=1),a.c||(a.c=[]);var u=[];a.c.forEach(function(e){e.v?e.v.forEach(function(r){u.push(i(e,r))}):u.push(\"self\"==e?a:e)}),a.c=u,a.c.forEach(function(e){n(e,a)}),a.starts&&n(a.starts,c);var l=a.c.map(function(e){return e.bK?\"\\\\.?(\"+e.b+\")\\\\.?\":e.b}).concat([a.tE,a.i]).map(r).filter(Boolean);a.t=l.length?t(l.join(\"|\"),!0):{exec:function(){return null}}}}n(e)}function l(e,t,a,c){function i(e,r){for(var t=0;t<r.c.length;t++)if(n(r.c[t].bR,e))return r.c[t]}function o(e,r){if(n(e.eR,r)){for(;e.endsParent&&e.parent;)e=e.parent;return e}return e.eW?o(e.parent,r):void 0}function s(e,r){return!a&&n(r.iR,e)}function b(e,r){var t=N.cI?r[0].toLowerCase():r[0];return e.k.hasOwnProperty(t)&&e.k[t]}function g(e,r,t,n){var a=n?\"\":w.classPrefix,c='<span class=\"'+a,i=t?\"\":\"</span>\";return c+=e+'\">',c+r+i}function p(){if(!M.k)return r(B);var e=\"\",t=0;M.lR.lastIndex=0;for(var n=M.lR.exec(B);n;){e+=r(B.substr(t,n.index-t));var a=b(M,n);a?(L+=a[1],e+=g(a[0],r(n[0]))):e+=r(n[0]),t=M.lR.lastIndex,n=M.lR.exec(B)}return e+r(B.substr(t))}function h(){var e=\"string\"==typeof M.sL;if(e&&!y[M.sL])return r(B);var t=e?l(M.sL,B,!0,R[M.sL]):f(B,M.sL.length?M.sL:void 0);return M.r>0&&(L+=t.r),e&&(R[M.sL]=t.top),g(t.language,t.value,!1,!0)}function d(){return void 0!==M.sL?h():p()}function m(e,t){var n=e.cN?g(e.cN,\"\",!0):\"\";e.rB?(x+=n,B=\"\"):e.eB?(x+=r(t)+n,B=\"\"):(x+=n,B=t),M=Object.create(e,{parent:{value:M}})}function v(e,t){if(B+=e,void 0===t)return x+=d(),0;var n=i(t,M);if(n)return x+=d(),m(n,t),n.rB?0:t.length;var a=o(M,t);if(a){var c=M;c.rE||c.eE||(B+=t),x+=d();do M.cN&&(x+=\"</span>\"),L+=M.r,M=M.parent;while(M!=a.parent);return c.eE&&(x+=r(t)),B=\"\",a.starts&&m(a.starts,\"\"),c.rE?0:t.length}if(s(t,M))throw new Error('Illegal lexeme \"'+t+'\" for mode \"'+(M.cN||\"<unnamed>\")+'\"');return B+=t,t.length||1}var N=E(e);if(!N)throw new Error('Unknown language: \"'+e+'\"');u(N);var C,M=c||N,R={},x=\"\";for(C=M;C!=N;C=C.parent)C.cN&&(x=g(C.cN,\"\",!0)+x);var B=\"\",L=0;try{for(var S,A,k=0;M.t.lastIndex=k,S=M.t.exec(t),S;)A=v(t.substr(k,S.index-k),S[0]),k=S.index+A;for(v(t.substr(k)),C=M;C.parent;C=C.parent)C.cN&&(x+=\"</span>\");return{r:L,value:x,language:e,top:M}}catch(I){if(-1!=I.message.indexOf(\"Illegal\"))return{r:0,value:r(t)};throw I}}function f(e,t){t=t||w.languages||Object.keys(y);var n={r:0,value:r(e)},a=n;return t.forEach(function(r){if(E(r)){var t=l(r,e,!1);t.language=r,t.r>a.r&&(a=t),t.r>n.r&&(a=n,n=t)}}),a.language&&(n.second_best=a),n}function b(e){return w.tabReplace&&(e=e.replace(/^((<[^>]+>|\\t)+)/gm,function(e,r){return r.replace(/\\t/g,w.tabReplace)})),w.useBR&&(e=e.replace(/\\n/g,\"<br>\")),e}function g(e,r,t){var n=r?C[r]:t,a=[e.trim()];return e.match(/\\bhljs\\b/)||a.push(\"hljs\"),-1===e.indexOf(n)&&a.push(n),a.join(\" \").trim()}function p(e){var r=c(e);if(!a(r)){var t;w.useBR?(t=document.createElementNS(\"http://www.w3.org/1999/xhtml\",\"div\"),t.innerHTML=e.innerHTML.replace(/\\n/g,\"\").replace(/<br[ \\/]*>/g,\"\\n\")):t=e;var n=t.textContent,i=r?l(r,n,!0):f(n),u=o(t);if(u.length){var p=document.createElementNS(\"http://www.w3.org/1999/xhtml\",\"div\");p.innerHTML=i.value,i.value=s(u,o(p),n)}i.value=b(i.value),e.innerHTML=i.value,e.className=g(e.className,r,i.language),e.result={language:i.language,re:i.r},i.second_best&&(e.second_best={language:i.second_best.language,re:i.second_best.r})}}function h(e){w=i(w,e)}function d(){if(!d.called){d.called=!0;var e=document.querySelectorAll(\"pre code\");Array.prototype.forEach.call(e,p)}}function m(){addEventListener(\"DOMContentLoaded\",d,!1),addEventListener(\"load\",d,!1)}function v(r,t){var n=y[r]=t(e);n.aliases&&n.aliases.forEach(function(e){C[e]=r})}function N(){return Object.keys(y)}function E(e){return e=(e||\"\").toLowerCase(),y[e]||y[C[e]]}var w={classPrefix:\"hljs-\",tabReplace:null,useBR:!1,languages:void 0},y={},C={};return e.highlight=l,e.highlightAuto=f,e.fixMarkup=b,e.highlightBlock=p,e.configure=h,e.initHighlighting=d,e.initHighlightingOnLoad=m,e.registerLanguage=v,e.listLanguages=N,e.getLanguage=E,e.inherit=i,e.IR=\"[a-zA-Z]\\\\w*\",e.UIR=\"[a-zA-Z_]\\\\w*\",e.NR=\"\\\\b\\\\d+(\\\\.\\\\d+)?\",e.CNR=\"(-?)(\\\\b0[xX][a-fA-F0-9]+|(\\\\b\\\\d+(\\\\.\\\\d*)?|\\\\.\\\\d+)([eE][-+]?\\\\d+)?)\",e.BNR=\"\\\\b(0b[01]+)\",e.RSR=\"!|!=|!==|%|%=|&|&&|&=|\\\\*|\\\\*=|\\\\+|\\\\+=|,|-|-=|/=|/|:|;|<<|<<=|<=|<|===|==|=|>>>=|>>=|>=|>>>|>>|>|\\\\?|\\\\[|\\\\{|\\\\(|\\\\^|\\\\^=|\\\\||\\\\|=|\\\\|\\\\||~\",e.BE={b:\"\\\\\\\\[\\\\s\\\\S]\",r:0},e.ASM={cN:\"string\",b:\"'\",e:\"'\",i:\"\\\\n\",c:[e.BE]},e.QSM={cN:\"string\",b:'\"',e:'\"',i:\"\\\\n\",c:[e.BE]},e.PWM={b:/\\b(a|an|the|are|I|I'm|isn't|don't|doesn't|won't|but|just|should|pretty|simply|enough|gonna|going|wtf|so|such|will|you|your|like)\\b/},e.C=function(r,t,n){var a=e.inherit({cN:\"comment\",b:r,e:t,c:[]},n||{});return a.c.push(e.PWM),a.c.push({cN:\"doctag\",b:\"(?:TODO|FIXME|NOTE|BUG|XXX):\",r:0}),a},e.CLCM=e.C(\"//\",\"$\"),e.CBCM=e.C(\"/\\\\*\",\"\\\\*/\"),e.HCM=e.C(\"#\",\"$\"),e.NM={cN:\"number\",b:e.NR,r:0},e.CNM={cN:\"number\",b:e.CNR,r:0},e.BNM={cN:\"number\",b:e.BNR,r:0},e.CSSNM={cN:\"number\",b:e.NR+\"(%|em|ex|ch|rem|vw|vh|vmin|vmax|cm|mm|in|pt|pc|px|deg|grad|rad|turn|s|ms|Hz|kHz|dpi|dpcm|dppx)?\",r:0},e.RM={cN:\"regexp\",b:/\\//,e:/\\/[gimuy]*/,i:/\\n/,c:[e.BE,{b:/\\[/,e:/\\]/,r:0,c:[e.BE]}]},e.TM={cN:\"title\",b:e.IR,r:0},e.UTM={cN:\"title\",b:e.UIR,r:0},e}),hljs.registerLanguage(\"json\",function(e){var r={literal:\"true false null\"},t=[e.QSM,e.CNM],n={e:\",\",eW:!0,eE:!0,c:t,k:r},a={b:\"{\",e:\"}\",c:[{cN:\"attr\",b:'\\\\s*\"',e:'\"\\\\s*:\\\\s*',eB:!0,eE:!0,c:[e.BE],i:\"\\\\n\",starts:n}],i:\"\\\\S\"},c={b:\"\\\\[\",e:\"\\\\]\",c:[e.inherit(n)],i:\"\\\\S\"};return t.splice(t.length,0,a,c),{c:t,k:r,i:\"\\\\S\"}}),hljs.registerLanguage(\"xml\",function(e){var r=\"[A-Za-z0-9\\\\._:-]+\",t={b:/<\\?(php)?(?!\\w)/,e:/\\?>/,sL:\"php\"},n={eW:!0,i:/</,r:0,c:[t,{cN:\"attr\",b:r,r:0},{b:\"=\",r:0,c:[{cN:\"string\",c:[t],v:[{b:/\"/,e:/\"/},{b:/'/,e:/'/},{b:/[^\\s\\/>]+/}]}]}]};return{aliases:[\"html\",\"xhtml\",\"rss\",\"atom\",\"xsl\",\"plist\"],cI:!0,c:[{cN:\"meta\",b:\"<!DOCTYPE\",e:\">\",r:10,c:[{b:\"\\\\[\",e:\"\\\\]\"}]},e.C(\"<!--\",\"-->\",{r:10}),{b:\"<\\\\!\\\\[CDATA\\\\[\",e:\"\\\\]\\\\]>\",r:10},{cN:\"tag\",b:\"<style(?=\\\\s|>|$)\",e:\">\",k:{name:\"style\"},c:[n],starts:{e:\"</style>\",rE:!0,sL:[\"css\",\"xml\"]}},{cN:\"tag\",b:\"<script(?=\\\\s|>|$)\",e:\">\",k:{name:\"script\"},c:[n],starts:{e:\"</script>\",rE:!0,sL:[\"actionscript\",\"javascript\",\"handlebars\",\"xml\"]}},t,{cN:\"meta\",b:/<\\?\\w+/,e:/\\?>/,r:10},{cN:\"tag\",b:\"</?\",e:\"/?>\",c:[{cN:\"name\",b:/[^\\/><\\s]+/,r:0},n]}]}}),hljs.registerLanguage(\"javascript\",function(e){return{aliases:[\"js\"],k:{keyword:\"in of if for while finally var new function do return void else break catch instanceof with throw case default try this switch continue typeof delete let yield const export super debugger as async await import from as\",literal:\"true false null undefined NaN Infinity\",built_in:\"eval isFinite isNaN parseFloat parseInt decodeURI decodeURIComponent encodeURI encodeURIComponent escape unescape Object Function Boolean Error EvalError InternalError RangeError ReferenceError StopIteration SyntaxError TypeError URIError Number Math Date String RegExp Array Float32Array Float64Array Int16Array Int32Array Int8Array Uint16Array Uint32Array Uint8Array Uint8ClampedArray ArrayBuffer DataView JSON Intl arguments require module console window document Symbol Set Map WeakSet WeakMap Proxy Reflect Promise\"},c:[{cN:\"meta\",r:10,b:/^\\s*['\"]use (strict|asm)['\"]/},{cN:\"meta\",b:/^#!/,e:/$/},e.ASM,e.QSM,{cN:\"string\",b:\"`\",e:\"`\",c:[e.BE,{cN:\"subst\",b:\"\\\\$\\\\{\",e:\"\\\\}\"}]},e.CLCM,e.CBCM,{cN:\"number\",v:[{b:\"\\\\b(0[bB][01]+)\"},{b:\"\\\\b(0[oO][0-7]+)\"},{b:e.CNR}],r:0},{b:\"(\"+e.RSR+\"|\\\\b(case|return|throw)\\\\b)\\\\s*\",k:\"return throw case\",c:[e.CLCM,e.CBCM,e.RM,{b:/</,e:/>\\s*[);\\]]/,r:0,sL:\"xml\"}],r:0},{cN:\"function\",bK:\"function\",e:/\\{/,eE:!0,c:[e.inherit(e.TM,{b:/[A-Za-z$_][0-9A-Za-z$_]*/}),{cN:\"params\",b:/\\(/,e:/\\)/,eB:!0,eE:!0,c:[e.CLCM,e.CBCM]}],i:/\\[|%/},{b:/\\$[(.]/},{b:\"\\\\.\"+e.IR,r:0},{cN:\"class\",bK:\"class\",e:/[{;=]/,eE:!0,i:/[:\"\\[\\]]/,c:[{bK:\"extends\"},e.UTM]},{bK:\"constructor\",e:/\\{/,eE:!0}],i:/#(?!!)/}}),hljs.registerLanguage(\"css\",function(e){var r=\"[a-zA-Z-][a-zA-Z0-9_-]*\",t={b:/[A-Z\\_\\.\\-]+\\s*:/,rB:!0,e:\";\",eW:!0,c:[{cN:\"attribute\",b:/\\S/,e:\":\",eE:!0,starts:{eW:!0,eE:!0,c:[{b:/[\\w-]+\\s*\\(/,rB:!0,c:[{cN:\"built_in\",b:/[\\w-]+/}]},e.CSSNM,e.QSM,e.ASM,e.CBCM,{cN:\"number\",b:\"#[0-9A-Fa-f]+\"},{cN:\"meta\",b:\"!important\"}]}}]};return{cI:!0,i:/[=\\/|'\\$]/,c:[e.CBCM,{cN:\"selector-id\",b:/#[A-Za-z0-9_-]+/},{cN:\"selector-class\",b:/\\.[A-Za-z0-9_-]+/},{cN:\"selector-attr\",b:/\\[/,e:/\\]/,i:\"$\"},{cN:\"selector-pseudo\",b:/:(:)?[a-zA-Z0-9\\_\\-\\+\\(\\)\"'.]+/},{b:\"@(font-face|page)\",l:\"[a-z-]+\",k:\"font-face page\"},{b:\"@\",e:\"[{;]\",c:[{cN:\"keyword\",b:/\\S+/},{b:/\\s/,eW:!0,eE:!0,r:0,c:[e.ASM,e.QSM,e.CSSNM]}]},{cN:\"selector-tag\",b:r,r:0},{b:\"{\",e:\"}\",i:/\\S/,c:[e.CBCM,t]}]}});"
  },
  {
    "path": "src/main/resources/static/swagger/lib/highlight.9.1.0.pack_extended.js",
    "content": "\"use strict\";!function(){var h,l;h=hljs.configure,hljs.configure=function(l){var i=l.highlightSizeThreshold;hljs.highlightSizeThreshold=i===+i?i:null,h.call(this,l)},l=hljs.highlightBlock,hljs.highlightBlock=function(h){var i=h.innerHTML,g=hljs.highlightSizeThreshold;(null==g||g>i.length)&&l.call(hljs,h)}}();"
  },
  {
    "path": "src/main/resources/static/swagger/lib/marked.js",
    "content": "(function(){function e(e){this.tokens=[],this.tokens.links={},this.options=e||a.defaults,this.rules=p.normal,this.options.gfm&&(this.options.tables?this.rules=p.tables:this.rules=p.gfm)}function t(e,t){if(this.options=t||a.defaults,this.links=e,this.rules=u.normal,this.renderer=this.options.renderer||new n,this.renderer.options=this.options,!this.links)throw new Error(\"Tokens array requires a `links` property.\");this.options.gfm?this.options.breaks?this.rules=u.breaks:this.rules=u.gfm:this.options.pedantic&&(this.rules=u.pedantic)}function n(e){this.options=e||{}}function r(e){this.tokens=[],this.token=null,this.options=e||a.defaults,this.options.renderer=this.options.renderer||new n,this.renderer=this.options.renderer,this.renderer.options=this.options}function s(e,t){return e.replace(t?/&/g:/&(?!#?\\w+;)/g,\"&amp;\").replace(/</g,\"&lt;\").replace(/>/g,\"&gt;\").replace(/\"/g,\"&quot;\").replace(/'/g,\"&#39;\")}function i(e){return e.replace(/&([#\\w]+);/g,function(e,t){return t=t.toLowerCase(),\"colon\"===t?\":\":\"#\"===t.charAt(0)?\"x\"===t.charAt(1)?String.fromCharCode(parseInt(t.substring(2),16)):String.fromCharCode(+t.substring(1)):\"\"})}function l(e,t){return e=e.source,t=t||\"\",function n(r,s){return r?(s=s.source||s,s=s.replace(/(^|[^\\[])\\^/g,\"$1\"),e=e.replace(r,s),n):new RegExp(e,t)}}function o(){}function h(e){for(var t,n,r=1;r<arguments.length;r++){t=arguments[r];for(n in t)Object.prototype.hasOwnProperty.call(t,n)&&(e[n]=t[n])}return e}function a(t,n,i){if(i||\"function\"==typeof n){i||(i=n,n=null),n=h({},a.defaults,n||{});var l,o,p=n.highlight,u=0;try{l=e.lex(t,n)}catch(c){return i(c)}o=l.length;var g=function(e){if(e)return n.highlight=p,i(e);var t;try{t=r.parse(l,n)}catch(s){e=s}return n.highlight=p,e?i(e):i(null,t)};if(!p||p.length<3)return g();if(delete n.highlight,!o)return g();for(;u<l.length;u++)!function(e){return\"code\"!==e.type?--o||g():p(e.text,e.lang,function(t,n){return t?g(t):null==n||n===e.text?--o||g():(e.text=n,e.escaped=!0,void(--o||g()))})}(l[u])}else try{return n&&(n=h({},a.defaults,n)),r.parse(e.lex(t,n),n)}catch(c){if(c.message+=\"\\nPlease report this to https://github.com/chjj/marked.\",(n||a.defaults).silent)return\"<p>An error occured:</p><pre>\"+s(c.message+\"\",!0)+\"</pre>\";throw c}}var p={newline:/^\\n+/,code:/^( {4}[^\\n]+\\n*)+/,fences:o,hr:/^( *[-*_]){3,} *(?:\\n+|$)/,heading:/^ *(#{1,6}) *([^\\n]+?) *#* *(?:\\n+|$)/,nptable:o,lheading:/^([^\\n]+)\\n *(=|-){2,} *(?:\\n+|$)/,blockquote:/^( *>[^\\n]+(\\n(?!def)[^\\n]+)*\\n*)+/,list:/^( *)(bull) [\\s\\S]+?(?:hr|def|\\n{2,}(?! )(?!\\1bull )\\n*|\\s*$)/,html:/^ *(?:comment *(?:\\n|\\s*$)|closed *(?:\\n{2,}|\\s*$)|closing *(?:\\n{2,}|\\s*$))/,def:/^ *\\[([^\\]]+)\\]: *<?([^\\s>]+)>?(?: +[\"(]([^\\n]+)[\")])? *(?:\\n+|$)/,table:o,paragraph:/^((?:[^\\n]+\\n?(?!hr|heading|lheading|blockquote|tag|def))+)\\n*/,text:/^[^\\n]+/};p.bullet=/(?:[*+-]|\\d+\\.)/,p.item=/^( *)(bull) [^\\n]*(?:\\n(?!\\1bull )[^\\n]*)*/,p.item=l(p.item,\"gm\")(/bull/g,p.bullet)(),p.list=l(p.list)(/bull/g,p.bullet)(\"hr\",\"\\\\n+(?=\\\\1?(?:[-*_] *){3,}(?:\\\\n+|$))\")(\"def\",\"\\\\n+(?=\"+p.def.source+\")\")(),p.blockquote=l(p.blockquote)(\"def\",p.def)(),p._tag=\"(?!(?:a|em|strong|small|s|cite|q|dfn|abbr|data|time|code|var|samp|kbd|sub|sup|i|b|u|mark|ruby|rt|rp|bdi|bdo|span|br|wbr|ins|del|img)\\\\b)\\\\w+(?!:/|[^\\\\w\\\\s@]*@)\\\\b\",p.html=l(p.html)(\"comment\",/<!--[\\s\\S]*?-->/)(\"closed\",/<(tag)[\\s\\S]+?<\\/\\1>/)(\"closing\",/<tag(?:\"[^\"]*\"|'[^']*'|[^'\">])*?>/)(/tag/g,p._tag)(),p.paragraph=l(p.paragraph)(\"hr\",p.hr)(\"heading\",p.heading)(\"lheading\",p.lheading)(\"blockquote\",p.blockquote)(\"tag\",\"<\"+p._tag)(\"def\",p.def)(),p.normal=h({},p),p.gfm=h({},p.normal,{fences:/^ *(`{3,}|~{3,}) *(\\S+)? *\\n([\\s\\S]+?)\\s*\\1 *(?:\\n+|$)/,paragraph:/^/}),p.gfm.paragraph=l(p.paragraph)(\"(?!\",\"(?!\"+p.gfm.fences.source.replace(\"\\\\1\",\"\\\\2\")+\"|\"+p.list.source.replace(\"\\\\1\",\"\\\\3\")+\"|\")(),p.tables=h({},p.gfm,{nptable:/^ *(\\S.*\\|.*)\\n *([-:]+ *\\|[-| :]*)\\n((?:.*\\|.*(?:\\n|$))*)\\n*/,table:/^ *\\|(.+)\\n *\\|( *[-:]+[-| :]*)\\n((?: *\\|.*(?:\\n|$))*)\\n*/}),e.rules=p,e.lex=function(t,n){var r=new e(n);return r.lex(t)},e.prototype.lex=function(e){return e=e.replace(/\\r\\n|\\r/g,\"\\n\").replace(/\\t/g,\"    \").replace(/\\u00a0/g,\" \").replace(/\\u2424/g,\"\\n\"),this.token(e,!0)},e.prototype.token=function(e,t,n){for(var r,s,i,l,o,h,a,u,c,e=e.replace(/^ +$/gm,\"\");e;)if((i=this.rules.newline.exec(e))&&(e=e.substring(i[0].length),i[0].length>1&&this.tokens.push({type:\"space\"})),i=this.rules.code.exec(e))e=e.substring(i[0].length),i=i[0].replace(/^ {4}/gm,\"\"),this.tokens.push({type:\"code\",text:this.options.pedantic?i:i.replace(/\\n+$/,\"\")});else if(i=this.rules.fences.exec(e))e=e.substring(i[0].length),this.tokens.push({type:\"code\",lang:i[2],text:i[3]});else if(i=this.rules.heading.exec(e))e=e.substring(i[0].length),this.tokens.push({type:\"heading\",depth:i[1].length,text:i[2]});else if(t&&(i=this.rules.nptable.exec(e))){for(e=e.substring(i[0].length),h={type:\"table\",header:i[1].replace(/^ *| *\\| *$/g,\"\").split(/ *\\| */),align:i[2].replace(/^ *|\\| *$/g,\"\").split(/ *\\| */),cells:i[3].replace(/\\n$/,\"\").split(\"\\n\")},u=0;u<h.align.length;u++)/^ *-+: *$/.test(h.align[u])?h.align[u]=\"right\":/^ *:-+: *$/.test(h.align[u])?h.align[u]=\"center\":/^ *:-+ *$/.test(h.align[u])?h.align[u]=\"left\":h.align[u]=null;for(u=0;u<h.cells.length;u++)h.cells[u]=h.cells[u].split(/ *\\| */);this.tokens.push(h)}else if(i=this.rules.lheading.exec(e))e=e.substring(i[0].length),this.tokens.push({type:\"heading\",depth:\"=\"===i[2]?1:2,text:i[1]});else if(i=this.rules.hr.exec(e))e=e.substring(i[0].length),this.tokens.push({type:\"hr\"});else if(i=this.rules.blockquote.exec(e))e=e.substring(i[0].length),this.tokens.push({type:\"blockquote_start\"}),i=i[0].replace(/^ *> ?/gm,\"\"),this.token(i,t,!0),this.tokens.push({type:\"blockquote_end\"});else if(i=this.rules.list.exec(e)){for(e=e.substring(i[0].length),l=i[2],this.tokens.push({type:\"list_start\",ordered:l.length>1}),i=i[0].match(this.rules.item),r=!1,c=i.length,u=0;u<c;u++)h=i[u],a=h.length,h=h.replace(/^ *([*+-]|\\d+\\.) +/,\"\"),~h.indexOf(\"\\n \")&&(a-=h.length,h=this.options.pedantic?h.replace(/^ {1,4}/gm,\"\"):h.replace(new RegExp(\"^ {1,\"+a+\"}\",\"gm\"),\"\")),this.options.smartLists&&u!==c-1&&(o=p.bullet.exec(i[u+1])[0],l===o||l.length>1&&o.length>1||(e=i.slice(u+1).join(\"\\n\")+e,u=c-1)),s=r||/\\n\\n(?!\\s*$)/.test(h),u!==c-1&&(r=\"\\n\"===h.charAt(h.length-1),s||(s=r)),this.tokens.push({type:s?\"loose_item_start\":\"list_item_start\"}),this.token(h,!1,n),this.tokens.push({type:\"list_item_end\"});this.tokens.push({type:\"list_end\"})}else if(i=this.rules.html.exec(e))e=e.substring(i[0].length),this.tokens.push({type:this.options.sanitize?\"paragraph\":\"html\",pre:\"pre\"===i[1]||\"script\"===i[1]||\"style\"===i[1],text:i[0]});else if(!n&&t&&(i=this.rules.def.exec(e)))e=e.substring(i[0].length),this.tokens.links[i[1].toLowerCase()]={href:i[2],title:i[3]};else if(t&&(i=this.rules.table.exec(e))){for(e=e.substring(i[0].length),h={type:\"table\",header:i[1].replace(/^ *| *\\| *$/g,\"\").split(/ *\\| */),align:i[2].replace(/^ *|\\| *$/g,\"\").split(/ *\\| */),cells:i[3].replace(/(?: *\\| *)?\\n$/,\"\").split(\"\\n\")},u=0;u<h.align.length;u++)/^ *-+: *$/.test(h.align[u])?h.align[u]=\"right\":/^ *:-+: *$/.test(h.align[u])?h.align[u]=\"center\":/^ *:-+ *$/.test(h.align[u])?h.align[u]=\"left\":h.align[u]=null;for(u=0;u<h.cells.length;u++)h.cells[u]=h.cells[u].replace(/^ *\\| *| *\\| *$/g,\"\").split(/ *\\| */);this.tokens.push(h)}else if(t&&(i=this.rules.paragraph.exec(e)))e=e.substring(i[0].length),this.tokens.push({type:\"paragraph\",text:\"\\n\"===i[1].charAt(i[1].length-1)?i[1].slice(0,-1):i[1]});else if(i=this.rules.text.exec(e))e=e.substring(i[0].length),this.tokens.push({type:\"text\",text:i[0]});else if(e)throw new Error(\"Infinite loop on byte: \"+e.charCodeAt(0));return this.tokens};var u={escape:/^\\\\([\\\\`*{}\\[\\]()#+\\-.!_>])/,autolink:/^<([^ >]+(@|:\\/)[^ >]+)>/,url:o,tag:/^<!--[\\s\\S]*?-->|^<\\/?\\w+(?:\"[^\"]*\"|'[^']*'|[^'\">])*?>/,link:/^!?\\[(inside)\\]\\(href\\)/,reflink:/^!?\\[(inside)\\]\\s*\\[([^\\]]*)\\]/,nolink:/^!?\\[((?:\\[[^\\]]*\\]|[^\\[\\]])*)\\]/,strong:/^__([\\s\\S]+?)__(?!_)|^\\*\\*([\\s\\S]+?)\\*\\*(?!\\*)/,em:/^\\b_((?:__|[\\s\\S])+?)_\\b|^\\*((?:\\*\\*|[\\s\\S])+?)\\*(?!\\*)/,code:/^(`+)\\s*([\\s\\S]*?[^`])\\s*\\1(?!`)/,br:/^ {2,}\\n(?!\\s*$)/,del:o,text:/^[\\s\\S]+?(?=[\\\\<!\\[_*`]| {2,}\\n|$)/};u._inside=/(?:\\[[^\\]]*\\]|[^\\[\\]]|\\](?=[^\\[]*\\]))*/,u._href=/\\s*<?([\\s\\S]*?)>?(?:\\s+['\"]([\\s\\S]*?)['\"])?\\s*/,u.link=l(u.link)(\"inside\",u._inside)(\"href\",u._href)(),u.reflink=l(u.reflink)(\"inside\",u._inside)(),u.normal=h({},u),u.pedantic=h({},u.normal,{strong:/^__(?=\\S)([\\s\\S]*?\\S)__(?!_)|^\\*\\*(?=\\S)([\\s\\S]*?\\S)\\*\\*(?!\\*)/,em:/^_(?=\\S)([\\s\\S]*?\\S)_(?!_)|^\\*(?=\\S)([\\s\\S]*?\\S)\\*(?!\\*)/}),u.gfm=h({},u.normal,{escape:l(u.escape)(\"])\",\"~|])\")(),url:/^(https?:\\/\\/[^\\s<]+[^<.,:;\"')\\]\\s])/,del:/^~~(?=\\S)([\\s\\S]*?\\S)~~/,text:l(u.text)(\"]|\",\"~]|\")(\"|\",\"|https?://|\")()}),u.breaks=h({},u.gfm,{br:l(u.br)(\"{2,}\",\"*\")(),text:l(u.gfm.text)(\"{2,}\",\"*\")()}),t.rules=u,t.output=function(e,n,r){var s=new t(n,r);return s.output(e)},t.prototype.output=function(e){for(var t,n,r,i,l=\"\";e;)if(i=this.rules.escape.exec(e))e=e.substring(i[0].length),l+=i[1];else if(i=this.rules.autolink.exec(e))e=e.substring(i[0].length),\"@\"===i[2]?(n=\":\"===i[1].charAt(6)?this.mangle(i[1].substring(7)):this.mangle(i[1]),r=this.mangle(\"mailto:\")+n):(n=s(i[1]),r=n),l+=this.renderer.link(r,null,n);else if(this.inLink||!(i=this.rules.url.exec(e))){if(i=this.rules.tag.exec(e))!this.inLink&&/^<a /i.test(i[0])?this.inLink=!0:this.inLink&&/^<\\/a>/i.test(i[0])&&(this.inLink=!1),e=e.substring(i[0].length),l+=this.options.sanitize?s(i[0]):i[0];else if(i=this.rules.link.exec(e))e=e.substring(i[0].length),this.inLink=!0,l+=this.outputLink(i,{href:i[2],title:i[3]}),this.inLink=!1;else if((i=this.rules.reflink.exec(e))||(i=this.rules.nolink.exec(e))){if(e=e.substring(i[0].length),t=(i[2]||i[1]).replace(/\\s+/g,\" \"),t=this.links[t.toLowerCase()],!t||!t.href){l+=i[0].charAt(0),e=i[0].substring(1)+e;continue}this.inLink=!0,l+=this.outputLink(i,t),this.inLink=!1}else if(i=this.rules.strong.exec(e))e=e.substring(i[0].length),l+=this.renderer.strong(this.output(i[2]||i[1]));else if(i=this.rules.em.exec(e))e=e.substring(i[0].length),l+=this.renderer.em(this.output(i[2]||i[1]));else if(i=this.rules.code.exec(e))e=e.substring(i[0].length),l+=this.renderer.codespan(s(i[2],!0));else if(i=this.rules.br.exec(e))e=e.substring(i[0].length),l+=this.renderer.br();else if(i=this.rules.del.exec(e))e=e.substring(i[0].length),l+=this.renderer.del(this.output(i[1]));else if(i=this.rules.text.exec(e))e=e.substring(i[0].length),l+=s(this.smartypants(i[0]));else if(e)throw new Error(\"Infinite loop on byte: \"+e.charCodeAt(0))}else e=e.substring(i[0].length),n=s(i[1]),r=n,l+=this.renderer.link(r,null,n);return l},t.prototype.outputLink=function(e,t){var n=s(t.href),r=t.title?s(t.title):null;return\"!\"!==e[0].charAt(0)?this.renderer.link(n,r,this.output(e[1])):this.renderer.image(n,r,s(e[1]))},t.prototype.smartypants=function(e){return this.options.smartypants?e.replace(/--/g,\"—\").replace(/(^|[-\\u2014\\/(\\[{\"\\s])'/g,\"$1‘\").replace(/'/g,\"’\").replace(/(^|[-\\u2014\\/(\\[{\\u2018\\s])\"/g,\"$1“\").replace(/\"/g,\"”\").replace(/\\.{3}/g,\"…\"):e},t.prototype.mangle=function(e){for(var t,n=\"\",r=e.length,s=0;s<r;s++)t=e.charCodeAt(s),Math.random()>.5&&(t=\"x\"+t.toString(16)),n+=\"&#\"+t+\";\";return n},n.prototype.code=function(e,t,n){if(this.options.highlight){var r=this.options.highlight(e,t);null!=r&&r!==e&&(n=!0,e=r)}return t?'<pre><code class=\"'+this.options.langPrefix+s(t,!0)+'\">'+(n?e:s(e,!0))+\"\\n</code></pre>\\n\":\"<pre><code>\"+(n?e:s(e,!0))+\"\\n</code></pre>\"},n.prototype.blockquote=function(e){return\"<blockquote>\\n\"+e+\"</blockquote>\\n\"},n.prototype.html=function(e){return e},n.prototype.heading=function(e,t,n){return\"<h\"+t+' id=\"'+this.options.headerPrefix+n.toLowerCase().replace(/[^\\w]+/g,\"-\")+'\">'+e+\"</h\"+t+\">\\n\"},n.prototype.hr=function(){return this.options.xhtml?\"<hr/>\\n\":\"<hr>\\n\"},n.prototype.list=function(e,t){var n=t?\"ol\":\"ul\";return\"<\"+n+\">\\n\"+e+\"</\"+n+\">\\n\"},n.prototype.listitem=function(e){return\"<li>\"+e+\"</li>\\n\"},n.prototype.paragraph=function(e){return\"<p>\"+e+\"</p>\\n\"},n.prototype.table=function(e,t){return\"<table>\\n<thead>\\n\"+e+\"</thead>\\n<tbody>\\n\"+t+\"</tbody>\\n</table>\\n\"},n.prototype.tablerow=function(e){return\"<tr>\\n\"+e+\"</tr>\\n\"},n.prototype.tablecell=function(e,t){var n=t.header?\"th\":\"td\",r=t.align?\"<\"+n+' style=\"text-align:'+t.align+'\">':\"<\"+n+\">\";return r+e+\"</\"+n+\">\\n\"},n.prototype.strong=function(e){return\"<strong>\"+e+\"</strong>\"},n.prototype.em=function(e){return\"<em>\"+e+\"</em>\"},n.prototype.codespan=function(e){return\"<code>\"+e+\"</code>\"},n.prototype.br=function(){return this.options.xhtml?\"<br/>\":\"<br>\"},n.prototype.del=function(e){return\"<del>\"+e+\"</del>\"},n.prototype.link=function(e,t,n){if(this.options.sanitize){try{var r=decodeURIComponent(i(e)).replace(/[^\\w:]/g,\"\").toLowerCase()}catch(s){return\"\"}if(0===r.indexOf(\"javascript:\"))return\"\"}var l='<a href=\"'+e+'\"';return t&&(l+=' title=\"'+t+'\"'),l+=\">\"+n+\"</a>\"},n.prototype.image=function(e,t,n){var r='<img src=\"'+e+'\" alt=\"'+n+'\"';return t&&(r+=' title=\"'+t+'\"'),r+=this.options.xhtml?\"/>\":\">\"},r.parse=function(e,t,n){var s=new r(t,n);return s.parse(e)},r.prototype.parse=function(e){this.inline=new t(e.links,this.options,this.renderer),this.tokens=e.reverse();for(var n=\"\";this.next();)n+=this.tok();return n},r.prototype.next=function(){return this.token=this.tokens.pop()},r.prototype.peek=function(){return this.tokens[this.tokens.length-1]||0},r.prototype.parseText=function(){for(var e=this.token.text;\"text\"===this.peek().type;)e+=\"\\n\"+this.next().text;return this.inline.output(e)},r.prototype.tok=function(){switch(this.token.type){case\"space\":return\"\";case\"hr\":return this.renderer.hr();case\"heading\":return this.renderer.heading(this.inline.output(this.token.text),this.token.depth,this.token.text);case\"code\":return this.renderer.code(this.token.text,this.token.lang,this.token.escaped);case\"table\":var e,t,n,r,s,i=\"\",l=\"\";for(n=\"\",e=0;e<this.token.header.length;e++)r={header:!0,align:this.token.align[e]},n+=this.renderer.tablecell(this.inline.output(this.token.header[e]),{header:!0,align:this.token.align[e]});for(i+=this.renderer.tablerow(n),e=0;e<this.token.cells.length;e++){for(t=this.token.cells[e],n=\"\",s=0;s<t.length;s++)n+=this.renderer.tablecell(this.inline.output(t[s]),{header:!1,align:this.token.align[s]});l+=this.renderer.tablerow(n)}return this.renderer.table(i,l);case\"blockquote_start\":for(var l=\"\";\"blockquote_end\"!==this.next().type;)l+=this.tok();return this.renderer.blockquote(l);case\"list_start\":for(var l=\"\",o=this.token.ordered;\"list_end\"!==this.next().type;)l+=this.tok();return this.renderer.list(l,o);case\"list_item_start\":for(var l=\"\";\"list_item_end\"!==this.next().type;)l+=\"text\"===this.token.type?this.parseText():this.tok();return this.renderer.listitem(l);case\"loose_item_start\":for(var l=\"\";\"list_item_end\"!==this.next().type;)l+=this.tok();return this.renderer.listitem(l);case\"html\":var h=this.token.pre||this.options.pedantic?this.token.text:this.inline.output(this.token.text);return this.renderer.html(h);case\"paragraph\":return this.renderer.paragraph(this.inline.output(this.token.text));case\"text\":return this.renderer.paragraph(this.parseText())}},o.exec=o,a.options=a.setOptions=function(e){return h(a.defaults,e),a},a.defaults={gfm:!0,tables:!0,breaks:!1,pedantic:!1,sanitize:!1,smartLists:!1,silent:!1,highlight:null,langPrefix:\"lang-\",smartypants:!1,headerPrefix:\"\",renderer:new n,xhtml:!1},a.Parser=r,a.parser=r.parse,a.Renderer=n,a.Lexer=e,a.lexer=e.lex,a.InlineLexer=t,a.inlineLexer=t.output,a.parse=a,\"undefined\"!=typeof module&&\"object\"==typeof exports?module.exports=a:\"function\"==typeof define&&define.amd?define(function(){return a}):this.marked=a}).call(function(){return this||(\"undefined\"!=typeof window?window:global)}());"
  },
  {
    "path": "src/main/resources/static/swagger/lib/object-assign-pollyfill.js",
    "content": "\"function\"!=typeof Object.assign&&!function(){Object.assign=function(n){\"use strict\";if(void 0===n||null===n)throw new TypeError(\"Cannot convert undefined or null to object\");for(var t=Object(n),o=1;o<arguments.length;o++){var r=arguments[o];if(void 0!==r&&null!==r)for(var e in r)Object.prototype.hasOwnProperty.call(r,e)&&(t[e]=r[e])}return t}}();"
  },
  {
    "path": "src/main/resources/static/swagger/lib/swagger-oauth.js",
    "content": "function handleLogin(){var e=[],o=window.swaggerUiAuth.authSchemes||window.swaggerUiAuth.securityDefinitions;if(o){var i,n=o;for(i in n){var a=n[i];if(\"oauth2\"===a.type&&a.scopes){var t;if(Array.isArray(a.scopes)){var p;for(p=0;p<a.scopes.length;p++)e.push(a.scopes[p])}else for(t in a.scopes)e.push({scope:t,description:a.scopes[t],OAuthSchemeKey:i})}}}for(window.swaggerUi.api&&window.swaggerUi.api.info&&(appName=window.swaggerUi.api.info.title),$(\".api-popup-dialog\").remove(),popupDialog=$(['<div class=\"api-popup-dialog\">','<div class=\"api-popup-title\">Select OAuth2.0 Scopes</div>','<div class=\"api-popup-content\">',\"<p>Scopes are used to grant an application different levels of access to data on behalf of the end user. Each API may declare one or more scopes.\",'<a href=\"#\">Learn how to use</a>',\"</p>\",\"<p><strong>\"+appName+\"</strong> API requires the following scopes. Select which ones you want to grant to Swagger UI.</p>\",'<ul class=\"api-popup-scopes\">',\"</ul>\",'<p class=\"error-msg\"></p>','<div class=\"api-popup-actions\"><button class=\"api-popup-authbtn api-button green\" type=\"button\">Authorize</button><button class=\"api-popup-cancel api-button gray\" type=\"button\">Cancel</button></div>',\"</div>\",\"</div>\"].join(\"\")),$(document.body).append(popupDialog),popup=popupDialog.find(\"ul.api-popup-scopes\").empty(),p=0;p<e.length;p++)t=e[p],str='<li><input type=\"checkbox\" id=\"scope_'+p+'\" scope=\"'+t.scope+'\"\" oauthtype=\"'+t.OAuthSchemeKey+'\"/><label for=\"scope_'+p+'\">'+t.scope,t.description&&($.map(o,function(e,o){return o}).length>1?str+='<br/><span class=\"api-scope-desc\">'+t.description+\" (\"+t.OAuthSchemeKey+\")</span>\":str+='<br/><span class=\"api-scope-desc\">'+t.description+\"</span>\"),str+=\"</label></li>\",popup.append(str);var r=$(window),s=r.width(),c=r.height(),l=r.scrollTop(),d=popupDialog.outerWidth(),u=popupDialog.outerHeight(),h=(c-u)/2+l,g=(s-d)/2;popupDialog.css({top:(h<0?0:h)+\"px\",left:(g<0?0:g)+\"px\"}),popupDialog.find(\"button.api-popup-cancel\").click(function(){popupMask.hide(),popupDialog.hide(),popupDialog.empty(),popupDialog=[]}),$(\"button.api-popup-authbtn\").unbind(),popupDialog.find(\"button.api-popup-authbtn\").click(function(){function e(e){return e.vendorExtensions[\"x-tokenName\"]||e.tokenName}popupMask.hide(),popupDialog.hide();var o,i=window.swaggerUi.api.authSchemes,n=window.location,a=location.pathname.substring(0,location.pathname.lastIndexOf(\"/\")),t=n.protocol+\"//\"+n.host+a+\"/o2c.html\",p=window.oAuthRedirectUrl||t,r=null,s=[],c=popup.find(\"input:checked\"),l=[];for(k=0;k<c.length;k++){var d=$(c[k]).attr(\"scope\");s.indexOf(d)===-1&&s.push(d);var u=$(c[k]).attr(\"oauthtype\");l.indexOf(u)===-1&&l.push(u)}window.enabledScopes=s;for(var h in i)if(i.hasOwnProperty(h)&&l.indexOf(h)!=-1){var g=i[h].flow;if(\"oauth2\"!==i[h].type||!g||\"implicit\"!==g&&\"accessCode\"!==g){if(\"oauth2\"===i[h].type&&g&&\"application\"===g){var w=i[h];return window.swaggerUi.tokenName=e(w)||\"access_token\",void clientCredentialsFlow(s,w.tokenUrl,h)}if(i[h].grantTypes){var c=i[h].grantTypes;for(var f in c)if(c.hasOwnProperty(f)&&\"implicit\"===f){var w=c[f];w.loginEndpoint.url;r=w.loginEndpoint.url+\"?response_type=token\",window.swaggerUi.tokenName=e(w)}else if(c.hasOwnProperty(f)&&\"accessCode\"===f){var w=c[f];w.tokenRequestEndpoint.url;r=w.tokenRequestEndpoint.url+\"?response_type=code\",window.swaggerUi.tokenName=e(w)}}}else{var w=i[h];r=w.authorizationUrl+\"?response_type=\"+(\"implicit\"===g?\"token\":\"code\"),window.swaggerUi.tokenName=e(w)||\"access_token\",window.swaggerUi.tokenUrl=\"accessCode\"===g?w.tokenUrl:null,o=h}}redirect_uri=p,r+=\"&redirect_uri=\"+encodeURIComponent(p),r+=\"&realm=\"+encodeURIComponent(realm),r+=\"&client_id=\"+encodeURIComponent(clientId),r+=\"&scope=\"+encodeURIComponent(s.join(scopeSeparator)),r+=\"&state=\"+encodeURIComponent(o);for(var h in additionalQueryStringParams)r+=\"&\"+h+\"=\"+encodeURIComponent(additionalQueryStringParams[h]);window.open(r)}),popupMask.show(),popupDialog.show()}function handleLogout(){for(key in window.swaggerUi.api.clientAuthorizations.authz)window.swaggerUi.api.clientAuthorizations.remove(key);window.enabledScopes=null,$(\".api-ic.ic-on\").addClass(\"ic-off\"),$(\".api-ic.ic-on\").removeClass(\"ic-on\"),$(\".api-ic.ic-warning\").addClass(\"ic-error\"),$(\".api-ic.ic-warning\").removeClass(\"ic-warning\")}function initOAuth(e){var o=e||{},i=[];return appName=o.appName||i.push(\"missing appName\"),popupMask=o.popupMask||$(\"#api-common-mask\"),popupDialog=o.popupDialog||$(\".api-popup-dialog\"),clientId=o.clientId||i.push(\"missing client id\"),clientSecret=o.clientSecret||null,realm=o.realm||i.push(\"missing realm\"),scopeSeparator=o.scopeSeparator||\" \",additionalQueryStringParams=o.additionalQueryStringParams||{},i.length>0?void log(\"auth unable initialize oauth: \"+i):($(\"pre code\").each(function(e,o){hljs.highlightBlock(o)}),$(\".api-ic\").unbind(),void $(\".api-ic\").click(function(e){$(e.target).hasClass(\"ic-off\")?handleLogin():handleLogout()}))}function clientCredentialsFlow(e,o,i){var n={client_id:clientId,client_secret:clientSecret,scope:e.join(\" \"),grant_type:\"client_credentials\"};$.ajax({url:o,type:\"POST\",data:n,success:function(e,o,n){onOAuthComplete(e,i)},error:function(e,o,i){onOAuthComplete(\"\")}})}var appName,popupMask,popupDialog,clientId,realm,redirect_uri,clientSecret,scopeSeparator,additionalQueryStringParams;window.processOAuthCode=function(e){var o=e.state,i=window.location,n=location.pathname.substring(0,location.pathname.lastIndexOf(\"/\")),a=i.protocol+\"//\"+i.host+n+\"/o2c.html\",t=window.oAuthRedirectUrl||a,p={client_id:clientId,code:e.code,grant_type:\"authorization_code\",redirect_uri:t};clientSecret&&(p.client_secret=clientSecret),$.ajax({url:window.swaggerUiAuth.tokenUrl,type:\"POST\",data:p,success:function(e,i,n){onOAuthComplete(e,o)},error:function(e,o,i){onOAuthComplete(\"\")}})},window.onOAuthComplete=function(e,o){if(e)if(e.error){var i=$(\"input[type=checkbox],.secured\");i.each(function(e){i[e].checked=!1}),alert(e.error)}else{var n=e[window.swaggerUiAuth.tokenName];if(o||(o=e.state),n){var a=null;$.each($(\".auth .api-ic .api_information_panel\"),function(e,o){var i=o;if(i&&i.childNodes){var n=[];$.each(i.childNodes,function(e,o){var i=o.innerHTML;i&&n.push(i)});for(var t=[],p=0;p<n.length;p++){var r=n[p];window.enabledScopes&&window.enabledScopes.indexOf(r)==-1&&t.push(r)}t.length>0?(a=o.parentNode.parentNode,$(a.parentNode).find(\".api-ic.ic-on\").addClass(\"ic-off\"),$(a.parentNode).find(\".api-ic.ic-on\").removeClass(\"ic-on\"),$(a).find(\".api-ic\").addClass(\"ic-warning\"),$(a).find(\".api-ic\").removeClass(\"ic-error\")):(a=o.parentNode.parentNode,$(a.parentNode).find(\".api-ic.ic-off\").addClass(\"ic-on\"),$(a.parentNode).find(\".api-ic.ic-off\").removeClass(\"ic-off\"),$(a).find(\".api-ic\").addClass(\"ic-info\"),$(a).find(\".api-ic\").removeClass(\"ic-warning\"),$(a).find(\".api-ic\").removeClass(\"ic-error\"))}}),\"undefined\"!=typeof window.swaggerUi&&(window.swaggerUi.api.clientAuthorizations.add(window.swaggerUiAuth.OAuthSchemeKey,new SwaggerClient.ApiKeyAuthorization(\"Authorization\",\"Bearer \"+n,\"header\")),window.swaggerUi.load())}}};"
  },
  {
    "path": "src/main/resources/static/swagger/o2c.html",
    "content": "<script>\nvar qp = null;\nif(/code|token|error/.test(window.location.hash)) {\n  qp = location.hash.substring(1);\n}\nelse {\n  qp = location.search.substring(1);\n}\nqp = qp ? JSON.parse('{\"' + qp.replace(/&/g, '\",\"').replace(/=/g,'\":\"') + '\"}',\n  function(key, value) {\n    return key===\"\"?value:decodeURIComponent(value) }\n  ):{}\n\nif (window.opener.swaggerUiAuth.tokenUrl)\n    window.opener.processOAuthCode(qp);\nelse\n    window.opener.onOAuthComplete(qp);\n\nwindow.close();\n</script>\n"
  },
  {
    "path": "src/main/resources/static/swagger/oauth2-redirect.html",
    "content": "<!doctype html>\n<html lang=\"en-US\">\n<body onload=\"run()\">\n</body>\n</html>\n<script>\n    'use strict';\n    function run () {\n        var oauth2 = window.opener.swaggerUIRedirectOauth2;\n        var sentState = oauth2.state;\n        var redirectUrl = oauth2.redirectUrl;\n        var isValid, qp, arr;\n\n        qp = (window.location.hash || location.search).substring(1);\n\n        arr = qp.split(\"&\")\n        arr.forEach(function (v,i,_arr) { _arr[i] = '\"' + v.replace('=', '\":\"') + '\"';})\n        qp = qp ? JSON.parse('{' + arr.join() + '}',\n                function (key, value) {\n                    return key === \"\" ? value : decodeURIComponent(value)\n                }\n        ) : {}\n\n        isValid = qp.state === sentState\n\n        if (oauth2.auth.schema.get(\"flow\") === \"accessCode\" && !oauth2.auth.code) {\n            if (!isValid) {\n                oauth2.errCb({\n                    authId: oauth2.auth.name,\n                    source: \"auth\",\n                    level: \"warning\",\n                    message: \"Authorization may be unsafe, passed state was changed in server Passed state wasn't returned from auth server\"\n                });\n            }\n\n            if (qp.code) {\n                delete oauth2.state;\n                oauth2.auth.code = qp.code;\n                oauth2.callback({auth: oauth2.auth, redirectUrl: redirectUrl});\n            } else {\n                oauth2.errCb({\n                    authId: oauth2.auth.name,\n                    source: \"auth\",\n                    level: \"error\",\n                    message: \"Authorization failed: no accessCode received from the server\"\n                });\n            }\n        } else {\n            oauth2.callback({auth: oauth2.auth, token: qp, isValid: isValid, redirectUrl: redirectUrl});\n        }\n        window.close();\n    }\n</script>\n"
  },
  {
    "path": "src/main/resources/static/swagger/swagger-ui-bundle.js",
    "content": "!function(e,t){\"object\"==typeof exports&&\"object\"==typeof module?module.exports=t():\"function\"==typeof define&&define.amd?define([],t):\"object\"==typeof exports?exports.SwaggerUIBundle=t():e.SwaggerUIBundle=t()}(this,function(){return function(e){function t(r){if(n[r])return n[r].exports;var i=n[r]={exports:{},id:r,loaded:!1};return e[r].call(i.exports,i,i.exports,t),i.loaded=!0,i.exports}var n={};return t.m=e,t.c=n,t.p=\"/dist\",t(0)}(function(e){for(var t in e)if(Object.prototype.hasOwnProperty.call(e,t))switch(typeof e[t]){case\"function\":break;case\"object\":e[t]=function(t){var n=t.slice(1),r=e[t[0]];return function(e,t,i){r.apply(this,[e,t,i].concat(n))}}(e[t]);break;default:e[t]=e[e[t]]}return e}([function(e,t,n){n(1),e.exports=n(56)},function(e,t,n){\"use strict\";n(2)},function(e,t,n){n(3),n(17),n(30),n(36),e.exports=n(16).Promise},function(e,t,n){\"use strict\";var r=n(4),i={};i[n(6)(\"toStringTag\")]=\"z\",i+\"\"!=\"[object z]\"&&n(10)(Object.prototype,\"toString\",function(){return\"[object \"+r(this)+\"]\"},!0)},function(e,t,n){var r=n(5),i=n(6)(\"toStringTag\"),o=\"Arguments\"==r(function(){return arguments}());e.exports=function(e){var t,n,a;return void 0===e?\"Undefined\":null===e?\"Null\":\"string\"==typeof(n=(t=Object(e))[i])?n:o?r(t):\"Object\"==(a=r(t))&&\"function\"==typeof t.callee?\"Arguments\":a}},function(e,t){var n={}.toString;e.exports=function(e){return n.call(e).slice(8,-1)}},function(e,t,n){var r=n(7)(\"wks\"),i=n(9),o=n(8).Symbol;e.exports=function(e){return r[e]||(r[e]=o&&o[e]||(o||i)(\"Symbol.\"+e))}},function(e,t,n){var r=n(8),i=\"__core-js_shared__\",o=r[i]||(r[i]={});e.exports=function(e){return o[e]||(o[e]={})}},function(e,t){var n=e.exports=\"undefined\"!=typeof window&&window.Math==Math?window:\"undefined\"!=typeof self&&self.Math==Math?self:Function(\"return this\")();\"number\"==typeof __g&&(__g=n)},function(e,t){var n=0,r=Math.random();e.exports=function(e){return\"Symbol(\".concat(void 0===e?\"\":e,\")_\",(++n+r).toString(36))}},function(e,t,n){var r=n(8),i=n(11),o=n(9)(\"src\"),a=\"toString\",s=Function[a],u=(\"\"+s).split(a);n(16).inspectSource=function(e){return s.call(e)},(e.exports=function(e,t,n,a){\"function\"==typeof n&&(n.hasOwnProperty(o)||i(n,o,e[t]?\"\"+e[t]:u.join(String(t))),n.hasOwnProperty(\"name\")||i(n,\"name\",t)),e===r?e[t]=n:(a||delete e[t],i(e,t,n))})(Function.prototype,a,function(){return\"function\"==typeof this&&this[o]||s.call(this)})},function(e,t,n){var r=n(12),i=n(13);e.exports=n(14)?function(e,t,n){return r.setDesc(e,t,i(1,n))}:function(e,t,n){return e[t]=n,e}},function(e,t){var n=Object;e.exports={create:n.create,getProto:n.getPrototypeOf,isEnum:{}.propertyIsEnumerable,getDesc:n.getOwnPropertyDescriptor,setDesc:n.defineProperty,setDescs:n.defineProperties,getKeys:n.keys,getNames:n.getOwnPropertyNames,getSymbols:n.getOwnPropertySymbols,each:[].forEach}},function(e,t){e.exports=function(e,t){return{enumerable:!(1&e),configurable:!(2&e),writable:!(4&e),value:t}}},function(e,t,n){e.exports=!n(15)(function(){return 7!=Object.defineProperty({},\"a\",{get:function(){return 7}}).a})},function(e,t){e.exports=function(e){try{return!!e()}catch(e){return!0}}},function(e,t){var n=e.exports={version:\"1.2.6\"};\"number\"==typeof __e&&(__e=n)},function(e,t,n){\"use strict\";var r=n(18)(!0);n(21)(String,\"String\",function(e){this._t=String(e),this._i=0},function(){var e,t=this._t,n=this._i;return n>=t.length?{value:void 0,done:!0}:(e=r(t,n),this._i+=e.length,{value:e,done:!1})})},function(e,t,n){var r=n(19),i=n(20);e.exports=function(e){return function(t,n){var o,a,s=String(i(t)),u=r(n),c=s.length;return u<0||u>=c?e?\"\":void 0:(o=s.charCodeAt(u),o<55296||o>56319||u+1===c||(a=s.charCodeAt(u+1))<56320||a>57343?e?s.charAt(u):o:e?s.slice(u,u+2):(o-55296<<10)+(a-56320)+65536)}}},function(e,t){var n=Math.ceil,r=Math.floor;e.exports=function(e){return isNaN(e=+e)?0:(e>0?r:n)(e)}},function(e,t){e.exports=function(e){if(void 0==e)throw TypeError(\"Can't call method on  \"+e);return e}},function(e,t,n){\"use strict\";var r=n(22),i=n(23),o=n(10),a=n(11),s=n(26),u=n(27),c=n(28),l=n(29),p=n(12).getProto,f=n(6)(\"iterator\"),h=!([].keys&&\"next\"in[].keys()),d=\"@@iterator\",m=\"keys\",v=\"values\",y=function(){return this};e.exports=function(e,t,n,g,_,b,x){c(n,t,g);var w,k,S=function(e){if(!h&&e in T)return T[e];switch(e){case m:return function(){return new n(this,e)};case v:return function(){return new n(this,e)}}return function(){return new n(this,e)}},E=t+\" Iterator\",C=_==v,A=!1,T=e.prototype,D=T[f]||T[d]||_&&T[_],M=D||S(_);if(D){var O=p(M.call(new e));l(O,E,!0),!r&&s(T,d)&&a(O,f,y),C&&D.name!==v&&(A=!0,M=function(){return D.call(this)})}if(r&&!x||!h&&!A&&T[f]||a(T,f,M),u[t]=M,u[E]=y,_)if(w={values:C?M:S(v),keys:b?M:S(m),entries:C?S(\"entries\"):M},x)for(k in w)k in T||o(T,k,w[k]);else i(i.P+i.F*(h||A),t,w);return w}},function(e,t){e.exports=!1},function(e,t,n){var r=n(8),i=n(16),o=n(11),a=n(10),s=n(24),u=\"prototype\",c=function(e,t,n){var l,p,f,h,d=e&c.F,m=e&c.G,v=e&c.S,y=e&c.P,g=e&c.B,_=m?r:v?r[t]||(r[t]={}):(r[t]||{})[u],b=m?i:i[t]||(i[t]={}),x=b[u]||(b[u]={});m&&(n=t);for(l in n)p=!d&&_&&l in _,f=(p?_:n)[l],h=g&&p?s(f,r):y&&\"function\"==typeof f?s(Function.call,f):f,_&&!p&&a(_,l,f),b[l]!=f&&o(b,l,h),y&&x[l]!=f&&(x[l]=f)};r.core=i,c.F=1,c.G=2,c.S=4,c.P=8,c.B=16,c.W=32,e.exports=c},function(e,t,n){var r=n(25);e.exports=function(e,t,n){if(r(e),void 0===t)return e;switch(n){case 1:return function(n){return e.call(t,n)};case 2:return function(n,r){return e.call(t,n,r)};case 3:return function(n,r,i){return e.call(t,n,r,i)}}return function(){return e.apply(t,arguments)}}},function(e,t){e.exports=function(e){if(\"function\"!=typeof e)throw TypeError(e+\" is not a function!\");return e}},function(e,t){var n={}.hasOwnProperty;e.exports=function(e,t){return n.call(e,t)}},function(e,t){e.exports={}},function(e,t,n){\"use strict\";var r=n(12),i=n(13),o=n(29),a={};n(11)(a,n(6)(\"iterator\"),function(){return this}),e.exports=function(e,t,n){e.prototype=r.create(a,{next:i(1,n)}),o(e,t+\" Iterator\")}},function(e,t,n){var r=n(12).setDesc,i=n(26),o=n(6)(\"toStringTag\");e.exports=function(e,t,n){e&&!i(e=n?e:e.prototype,o)&&r(e,o,{configurable:!0,value:t})}},function(e,t,n){n(31);var r=n(8),i=n(11),o=n(27),a=n(6)(\"iterator\"),s=r.NodeList,u=r.HTMLCollection,c=s&&s.prototype,l=u&&u.prototype,p=o.NodeList=o.HTMLCollection=o.Array;c&&!c[a]&&i(c,a,p),l&&!l[a]&&i(l,a,p)},function(e,t,n){\"use strict\";var r=n(32),i=n(33),o=n(27),a=n(34);e.exports=n(21)(Array,\"Array\",function(e,t){this._t=a(e),this._i=0,this._k=t},function(){var e=this._t,t=this._k,n=this._i++;return!e||n>=e.length?(this._t=void 0,i(1)):\"keys\"==t?i(0,n):\"values\"==t?i(0,e[n]):i(0,[n,e[n]])},\"values\"),o.Arguments=o.Array,r(\"keys\"),r(\"values\"),r(\"entries\")},function(e,t,n){var r=n(6)(\"unscopables\"),i=Array.prototype;void 0==i[r]&&n(11)(i,r,{}),e.exports=function(e){i[r][e]=!0}},function(e,t){e.exports=function(e,t){return{value:t,done:!!e}}},function(e,t,n){var r=n(35),i=n(20);e.exports=function(e){return r(i(e))}},function(e,t,n){var r=n(5);e.exports=Object(\"z\").propertyIsEnumerable(0)?Object:function(e){return\"String\"==r(e)?e.split(\"\"):Object(e)}},function(e,t,n){\"use strict\";var r,i=n(12),o=n(22),a=n(8),s=n(24),u=n(4),c=n(23),l=n(37),p=n(38),f=n(25),h=n(39),d=n(40),m=n(45).set,v=n(46),y=n(6)(\"species\"),g=n(47),_=n(48),b=\"Promise\",x=a.process,w=\"process\"==u(x),k=a[b],S=function(){},E=function(e){var t,n=new k(S);return e&&(n.constructor=function(e){e(S,S)}),(t=k.resolve(n)).catch(S),t===n},C=function(){function e(t){var n=new k(t);return m(n,e.prototype),n}var t=!1;try{if(t=k&&k.resolve&&E(),m(e,k),e.prototype=i.create(k.prototype,{constructor:{value:e}}),e.resolve(5).then(function(){})instanceof e||(t=!1),t&&n(14)){var r=!1;k.resolve(i.setDesc({},\"then\",{get:function(){r=!0}})),t=r}}catch(e){t=!1}return t}(),A=function(e,t){return!(!o||e!==k||t!==r)||v(e,t)},T=function(e){var t=p(e)[y];return void 0!=t?t:e},D=function(e){var t;return!(!l(e)||\"function\"!=typeof(t=e.then))&&t},M=function(e){var t,n;this.promise=new e(function(e,r){if(void 0!==t||void 0!==n)throw TypeError(\"Bad Promise constructor\");t=e,n=r}),this.resolve=f(t),this.reject=f(n)},O=function(e){try{e()}catch(e){return{error:e}}},P=function(e,t){if(!e.n){e.n=!0;var n=e.c;_(function(){for(var r=e.v,i=1==e.s,o=0,s=function(t){var n,o,a=i?t.ok:t.fail,s=t.resolve,u=t.reject;try{a?(i||(e.h=!0),n=a===!0?r:a(r),n===t.promise?u(TypeError(\"Promise-chain cycle\")):(o=D(n))?o.call(n,s,u):s(n)):u(r)}catch(e){u(e)}};n.length>o;)s(n[o++]);n.length=0,e.n=!1,t&&setTimeout(function(){var t,n,i=e.p;I(i)&&(w?x.emit(\"unhandledRejection\",r,i):(t=a.onunhandledrejection)?t({promise:i,reason:r}):(n=a.console)&&n.error&&n.error(\"Unhandled promise rejection\",r)),e.a=void 0},1)})}},I=function(e){var t,n=e._d,r=n.a||n.c,i=0;if(n.h)return!1;for(;r.length>i;)if(t=r[i++],t.fail||!I(t.promise))return!1;return!0},N=function(e){var t=this;t.d||(t.d=!0,t=t.r||t,t.v=e,t.s=2,t.a=t.c.slice(),P(t,!0))},R=function(e){var t,n=this;if(!n.d){n.d=!0,n=n.r||n;try{if(n.p===e)throw TypeError(\"Promise can't be resolved itself\");(t=D(e))?_(function(){var r={r:n,d:!1};try{t.call(e,s(R,r,1),s(N,r,1))}catch(e){N.call(r,e)}}):(n.v=e,n.s=1,P(n,!1))}catch(e){N.call({r:n,d:!1},e)}}};C||(k=function(e){f(e);var t=this._d={p:h(this,k,b),c:[],a:void 0,s:0,d:!1,v:void 0,h:!1,n:!1};try{e(s(R,t,1),s(N,t,1))}catch(e){N.call(t,e)}},n(53)(k.prototype,{then:function(e,t){var n=new M(g(this,k)),r=n.promise,i=this._d;return n.ok=\"function\"!=typeof e||e,n.fail=\"function\"==typeof t&&t,i.c.push(n),i.a&&i.a.push(n),i.s&&P(i,!1),r},catch:function(e){return this.then(void 0,e)}})),c(c.G+c.W+c.F*!C,{Promise:k}),n(29)(k,b),n(54)(b),r=n(16)[b],c(c.S+c.F*!C,b,{reject:function(e){var t=new M(this),n=t.reject;return n(e),t.promise}}),c(c.S+c.F*(!C||E(!0)),b,{resolve:function(e){if(e instanceof k&&A(e.constructor,this))return e;var t=new M(this),n=t.resolve;return n(e),t.promise}}),c(c.S+c.F*!(C&&n(55)(function(e){k.all(e).catch(function(){})})),b,{all:function(e){var t=T(this),n=new M(t),r=n.resolve,o=n.reject,a=[],s=O(function(){d(e,!1,a.push,a);var n=a.length,s=Array(n);n?i.each.call(a,function(e,i){var a=!1;t.resolve(e).then(function(e){a||(a=!0,s[i]=e,--n||r(s))},o)}):r(s)});return s&&o(s.error),n.promise},race:function(e){var t=T(this),n=new M(t),r=n.reject,i=O(function(){d(e,!1,function(e){t.resolve(e).then(n.resolve,r)})});return i&&r(i.error),n.promise}})},function(e,t){e.exports=function(e){return\"object\"==typeof e?null!==e:\"function\"==typeof e}},function(e,t,n){var r=n(37);e.exports=function(e){if(!r(e))throw TypeError(e+\" is not an object!\");return e}},function(e,t){e.exports=function(e,t,n){if(!(e instanceof t))throw TypeError(n+\": use the 'new' operator!\");return e}},function(e,t,n){var r=n(24),i=n(41),o=n(42),a=n(38),s=n(43),u=n(44);e.exports=function(e,t,n,c){var l,p,f,h=u(e),d=r(n,c,t?2:1),m=0;if(\"function\"!=typeof h)throw TypeError(e+\" is not iterable!\");if(o(h))for(l=s(e.length);l>m;m++)t?d(a(p=e[m])[0],p[1]):d(e[m]);else for(f=h.call(e);!(p=f.next()).done;)i(f,d,p.value,t)}},function(e,t,n){var r=n(38);e.exports=function(e,t,n,i){try{return i?t(r(n)[0],n[1]):t(n)}catch(t){var o=e.return;throw void 0!==o&&r(o.call(e)),t}}},function(e,t,n){var r=n(27),i=n(6)(\"iterator\"),o=Array.prototype;e.exports=function(e){return void 0!==e&&(r.Array===e||o[i]===e)}},function(e,t,n){var r=n(19),i=Math.min;e.exports=function(e){return e>0?i(r(e),9007199254740991):0}},function(e,t,n){var r=n(4),i=n(6)(\"iterator\"),o=n(27);e.exports=n(16).getIteratorMethod=function(e){if(void 0!=e)return e[i]||e[\"@@iterator\"]||o[r(e)]}},function(e,t,n){var r=n(12).getDesc,i=n(37),o=n(38),a=function(e,t){if(o(e),!i(t)&&null!==t)throw TypeError(t+\": can't set as prototype!\")};e.exports={set:Object.setPrototypeOf||(\"__proto__\"in{}?function(e,t,i){try{i=n(24)(Function.call,r(Object.prototype,\"__proto__\").set,2),i(e,[]),t=!(e instanceof Array)}catch(e){t=!0}return function(e,n){return a(e,n),t?e.__proto__=n:i(e,n),e}}({},!1):void 0),check:a}},function(e,t){e.exports=Object.is||function(e,t){return e===t?0!==e||1/e===1/t:e!=e&&t!=t}},function(e,t,n){var r=n(38),i=n(25),o=n(6)(\"species\");e.exports=function(e,t){var n,a=r(e).constructor;return void 0===a||void 0==(n=r(a)[o])?t:i(n)}},function(e,t,n){var r,i,o,a=n(8),s=n(49).set,u=a.MutationObserver||a.WebKitMutationObserver,c=a.process,l=a.Promise,p=\"process\"==n(5)(c),f=function(){var e,t,n;for(p&&(e=c.domain)&&(c.domain=null,e.exit());r;)t=r.domain,n=r.fn,t&&t.enter(),n(),t&&t.exit(),r=r.next;i=void 0,e&&e.enter()};if(p)o=function(){c.nextTick(f)};else if(u){var h=1,d=document.createTextNode(\"\");new u(f).observe(d,{characterData:!0}),o=function(){d.data=h=-h}}else o=l&&l.resolve?function(){l.resolve().then(f)}:function(){s.call(a,f)};e.exports=function(e){var t={fn:e,next:void 0,domain:p&&c.domain};i&&(i.next=t),r||(r=t,o()),i=t}},function(e,t,n){var r,i,o,a=n(24),s=n(50),u=n(51),c=n(52),l=n(8),p=l.process,f=l.setImmediate,h=l.clearImmediate,d=l.MessageChannel,m=0,v={},y=\"onreadystatechange\",g=function(){var e=+this;if(v.hasOwnProperty(e)){var t=v[e];delete v[e],t()}},_=function(e){g.call(e.data)};f&&h||(f=function(e){for(var t=[],n=1;arguments.length>n;)t.push(arguments[n++]);return v[++m]=function(){s(\"function\"==typeof e?e:Function(e),t)},r(m),m},h=function(e){delete v[e]},\"process\"==n(5)(p)?r=function(e){p.nextTick(a(g,e,1))}:d?(i=new d,o=i.port2,i.port1.onmessage=_,r=a(o.postMessage,o,1)):l.addEventListener&&\"function\"==typeof postMessage&&!l.importScripts?(r=function(e){l.postMessage(e+\"\",\"*\")},l.addEventListener(\"message\",_,!1)):r=y in c(\"script\")?function(e){u.appendChild(c(\"script\"))[y]=function(){u.removeChild(this),g.call(e)}}:function(e){setTimeout(a(g,e,1),0)}),e.exports={set:f,clear:h}},function(e,t){e.exports=function(e,t,n){var r=void 0===n;switch(t.length){case 0:return r?e():e.call(n);case 1:return r?e(t[0]):e.call(n,t[0]);case 2:return r?e(t[0],t[1]):e.call(n,t[0],t[1]);case 3:return r?e(t[0],t[1],t[2]):e.call(n,t[0],t[1],t[2]);case 4:return r?e(t[0],t[1],t[2],t[3]):e.call(n,t[0],t[1],t[2],t[3])}return e.apply(n,t)}},function(e,t,n){e.exports=n(8).document&&document.documentElement},function(e,t,n){var r=n(37),i=n(8).document,o=r(i)&&r(i.createElement);e.exports=function(e){return o?i.createElement(e):{}}},function(e,t,n){var r=n(10);e.exports=function(e,t){for(var n in t)r(e,n,t[n]);return e}},function(e,t,n){\"use strict\";var r=n(8),i=n(12),o=n(14),a=n(6)(\"species\");e.exports=function(e){var t=r[e];o&&t&&!t[a]&&i.setDesc(t,a,{configurable:!0,get:function(){return this}})}},function(e,t,n){var r=n(6)(\"iterator\"),i=!1;try{var o=[7][r]();o.return=function(){i=!0},Array.from(o,function(){throw 2})}catch(e){}e.exports=function(e,t){if(!t&&!i)return!1;var n=!1;try{var o=[7],a=o[r]();a.next=function(){return{done:n=!0}},o[r]=function(){return a},e(o)}catch(e){}return n}},function(e,t,n){\"use strict\";function r(e){if(e&&e.__esModule)return e;var t={};if(null!=e)for(var n in e)Object.prototype.hasOwnProperty.call(e,n)&&(t[n]=e[n]);return t.default=e,t}function i(e){return e&&e.__esModule?e:{default:e}}var o=n(57),a=i(o),s=n(60),u=i(s),c=n(94),l=i(c),p=n(131),f=i(p),h=n(136),d=i(h),m=n(177),v=i(m),y=n(414),g=i(y),_=n(1175),b=r(_),x=n(183),w=[\"url\",\"spec\",\"validatorUrl\",\"onComplete\",\"onFailure\",\"authorizations\",\"docExpansion\",\"apisSorter\",\"operationsSorter\",\"supportedSubmitMethods\",\"dom_id\",\"defaultModelRendering\",\"oauth2RedirectUrl\",\"showRequestHeaders\",\"custom\",\"modelPropertyMacro\",\"parameterMacro\",\"displayOperationId\"],k={PACKAGE_VERSION:\"3.0.17\",GIT_COMMIT:\"gf3c3c5c\",GIT_DIRTY:!0},S=k.GIT_DIRTY,E=k.GIT_COMMIT,C=k.PACKAGE_VERSION;e.exports=function(e){v.default.versions=v.default.versions||{},v.default.versions.swaggerUi=C+\"/\"+(E||\"unknown\")+(S?\"-dirty\":\"\");var t={dom_id:null,spec:{},url:\"\",layout:\"BaseLayout\",docExpansion:\"list\",validatorUrl:\"https://online.swagger.io/validator\",configs:{},custom:{},displayOperationId:!1,presets:[],plugins:[],fn:{},components:{},state:{},store:{}},n=(0,f.default)({},t,e),r=(0,f.default)({},n.store,{system:{configs:n.configs},plugins:n.presets,state:{layout:{layout:n.layout},spec:{spec:\"\",url:n.url}}}),i=function(){return{fn:n.fn,components:n.components,state:n.state}},o=new d.default(r);o.register([n.plugins,i]);var s=o.getSystem(),c=(0,x.parseSeach)();s.initOAuth=s.authActions.configureAuth;var p=function(e){if(\"object\"!==(\"undefined\"==typeof n?\"undefined\":(0,l.default)(n)))return s;var t=s.specSelectors.getLocalConfig?s.specSelectors.getLocalConfig():{},r=(0,f.default)({},t,n,e||{},c);return o.setConfigs((0,x.filterConfigs)(r,w)),null!==e&&(!c.url&&\"object\"===(0,l.default)(r.spec)&&(0,u.default)(r.spec).length?(s.specActions.updateUrl(\"\"),s.specActions.updateLoadingStatus(\"success\"),s.specActions.updateSpec((0,a.default)(r.spec))):s.specActions.download&&r.url&&(s.specActions.updateUrl(r.url),s.specActions.download(r.url))),r.dom_id?s.render(r.dom_id,\"App\"):console.error(\"Skipped rendering: no `dom_id` was specified\"),s},h=c.config||n.configUrl;return!h||!s.specActions.getConfigByUrl||s.specActions.getConfigByUrl&&!s.specActions.getConfigByUrl(h,p)?p():s},e.exports.presets={apis:g.default},e.exports.plugins=b},function(e,t,n){e.exports={default:n(58),__esModule:!0}},function(e,t,n){var r=n(59),i=r.JSON||(r.JSON={stringify:JSON.stringify});e.exports=function(e){return i.stringify.apply(i,arguments)}},function(e,t){var n=e.exports={version:\"2.4.0\"};\"number\"==typeof __e&&(__e=n)},function(e,t,n){e.exports={default:n(61),__esModule:!0}},function(e,t,n){n(62),e.exports=n(59).Object.keys},function(e,t,n){var r=n(63),i=n(65);n(80)(\"keys\",function(){return function(e){return i(r(e))}})},function(e,t,n){var r=n(64);e.exports=function(e){return Object(r(e))}},20,function(e,t,n){var r=n(66),i=n(79);e.exports=Object.keys||function(e){return r(e,i)}},function(e,t,n){var r=n(67),i=n(68),o=n(71)(!1),a=n(75)(\"IE_PROTO\");e.exports=function(e,t){var n,s=i(e),u=0,c=[];for(n in s)n!=a&&r(s,n)&&c.push(n);for(;t.length>u;)r(s,n=t[u++])&&(~o(c,n)||c.push(n));return c}},26,function(e,t,n){var r=n(69),i=n(64);e.exports=function(e){return r(i(e))}},function(e,t,n){var r=n(70);e.exports=Object(\"z\").propertyIsEnumerable(0)?Object:function(e){return\"String\"==r(e)?e.split(\"\"):Object(e)}},5,function(e,t,n){var r=n(68),i=n(72),o=n(74);e.exports=function(e){return function(t,n,a){var s,u=r(t),c=i(u.length),l=o(a,c);if(e&&n!=n){for(;c>l;)if(s=u[l++],s!=s)return!0}else for(;c>l;l++)if((e||l in u)&&u[l]===n)return e||l||0;return!e&&-1}}},function(e,t,n){var r=n(73),i=Math.min;e.exports=function(e){return e>0?i(r(e),9007199254740991):0}},19,function(e,t,n){var r=n(73),i=Math.max,o=Math.min;e.exports=function(e,t){return e=r(e),e<0?i(e+t,0):o(e,t)}},function(e,t,n){var r=n(76)(\"keys\"),i=n(78);e.exports=function(e){return r[e]||(r[e]=i(e))}},function(e,t,n){var r=n(77),i=\"__core-js_shared__\",o=r[i]||(r[i]={});e.exports=function(e){return o[e]||(o[e]={})}},8,9,function(e,t){e.exports=\"constructor,hasOwnProperty,isPrototypeOf,propertyIsEnumerable,toLocaleString,toString,valueOf\".split(\",\")},function(e,t,n){var r=n(81),i=n(59),o=n(90);e.exports=function(e,t){var n=(i.Object||{})[e]||Object[e],a={};a[e]=t(n),r(r.S+r.F*o(function(){n(1)}),\"Object\",a)}},function(e,t,n){var r=n(77),i=n(59),o=n(82),a=n(84),s=\"prototype\",u=function(e,t,n){var c,l,p,f=e&u.F,h=e&u.G,d=e&u.S,m=e&u.P,v=e&u.B,y=e&u.W,g=h?i:i[t]||(i[t]={}),_=g[s],b=h?r:d?r[t]:(r[t]||{})[s];h&&(n=t);for(c in n)l=!f&&b&&void 0!==b[c],l&&c in g||(p=l?b[c]:n[c],g[c]=h&&\"function\"!=typeof b[c]?n[c]:v&&l?o(p,r):y&&b[c]==p?function(e){var t=function(t,n,r){if(this instanceof e){switch(arguments.length){case 0:return new e;case 1:return new e(t);case 2:return new e(t,n)}return new e(t,n,r)}return e.apply(this,arguments)};return t[s]=e[s],t}(p):m&&\"function\"==typeof p?o(Function.call,p):p,m&&((g.virtual||(g.virtual={}))[c]=p,e&u.R&&_&&!_[c]&&a(_,c,p)))};u.F=1,u.G=2,u.S=4,u.P=8,u.B=16,u.W=32,u.U=64,u.R=128,e.exports=u},function(e,t,n){var r=n(83);e.exports=function(e,t,n){if(r(e),void 0===t)return e;switch(n){case 1:return function(n){return e.call(t,n)};case 2:return function(n,r){return e.call(t,n,r)};case 3:return function(n,r,i){return e.call(t,n,r,i)}}return function(){return e.apply(t,arguments)}}},25,function(e,t,n){var r=n(85),i=n(93);e.exports=n(89)?function(e,t,n){return r.f(e,t,i(1,n))}:function(e,t,n){return e[t]=n,e}},function(e,t,n){var r=n(86),i=n(88),o=n(92),a=Object.defineProperty;t.f=n(89)?Object.defineProperty:function(e,t,n){if(r(e),t=o(t,!0),r(n),i)try{return a(e,t,n)}catch(e){}if(\"get\"in n||\"set\"in n)throw TypeError(\"Accessors not supported!\");return\"value\"in n&&(e[t]=n.value),e}},function(e,t,n){var r=n(87);e.exports=function(e){if(!r(e))throw TypeError(e+\" is not an object!\");return e}},37,function(e,t,n){e.exports=!n(89)&&!n(90)(function(){return 7!=Object.defineProperty(n(91)(\"div\"),\"a\",{get:function(){return 7}}).a})},function(e,t,n){e.exports=!n(90)(function(){return 7!=Object.defineProperty({},\"a\",{get:function(){return 7}}).a})},15,function(e,t,n){var r=n(87),i=n(77).document,o=r(i)&&r(i.createElement);e.exports=function(e){return o?i.createElement(e):{}}},function(e,t,n){var r=n(87);e.exports=function(e,t){if(!r(e))return e;var n,i;if(t&&\"function\"==typeof(n=e.toString)&&!r(i=n.call(e)))return i;if(\"function\"==typeof(n=e.valueOf)&&!r(i=n.call(e)))return i;if(!t&&\"function\"==typeof(n=e.toString)&&!r(i=n.call(e)))return i;throw TypeError(\"Can't convert object to primitive value\")}},13,function(e,t,n){\"use strict\";function r(e){return e&&e.__esModule?e:{default:e}}t.__esModule=!0;var i=n(95),o=r(i),a=n(115),s=r(a),u=\"function\"==typeof s.default&&\"symbol\"==typeof o.default?function(e){return typeof e}:function(e){return e&&\"function\"==typeof s.default&&e.constructor===s.default&&e!==s.default.prototype?\"symbol\":typeof e};t.default=\"function\"==typeof s.default&&\"symbol\"===u(o.default)?function(e){return\"undefined\"==typeof e?\"undefined\":u(e)}:function(e){return e&&\"function\"==typeof s.default&&e.constructor===s.default&&e!==s.default.prototype?\"symbol\":\"undefined\"==typeof e?\"undefined\":u(e)}},function(e,t,n){e.exports={default:n(96),__esModule:!0}},function(e,t,n){n(97),n(110),e.exports=n(114).f(\"iterator\")},function(e,t,n){\"use strict\";var r=n(98)(!0);n(99)(String,\"String\",function(e){this._t=String(e),this._i=0},function(){var e,t=this._t,n=this._i;return n>=t.length?{value:void 0,done:!0}:(e=r(t,n),this._i+=e.length,{value:e,done:!1})})},function(e,t,n){var r=n(73),i=n(64);e.exports=function(e){return function(t,n){var o,a,s=String(i(t)),u=r(n),c=s.length;return u<0||u>=c?e?\"\":void 0:(o=s.charCodeAt(u),o<55296||o>56319||u+1===c||(a=s.charCodeAt(u+1))<56320||a>57343?e?s.charAt(u):o:e?s.slice(u,u+2):(o-55296<<10)+(a-56320)+65536)}}},function(e,t,n){\"use strict\";var r=n(100),i=n(81),o=n(101),a=n(84),s=n(67),u=n(102),c=n(103),l=n(107),p=n(109),f=n(108)(\"iterator\"),h=!([].keys&&\"next\"in[].keys()),d=\"@@iterator\",m=\"keys\",v=\"values\",y=function(){return this};e.exports=function(e,t,n,g,_,b,x){c(n,t,g);var w,k,S,E=function(e){if(!h&&e in D)return D[e];switch(e){case m:return function(){return new n(this,e)};case v:return function(){return new n(this,e)}}return function(){return new n(this,e)}},C=t+\" Iterator\",A=_==v,T=!1,D=e.prototype,M=D[f]||D[d]||_&&D[_],O=M||E(_),P=_?A?E(\"entries\"):O:void 0,I=\"Array\"==t?D.entries||M:M;if(I&&(S=p(I.call(new e)),S!==Object.prototype&&(l(S,C,!0),r||s(S,f)||a(S,f,y))),A&&M&&M.name!==v&&(T=!0,O=function(){return M.call(this)}),r&&!x||!h&&!T&&D[f]||a(D,f,O),u[t]=O,u[C]=y,_)if(w={values:A?O:E(v),keys:b?O:E(m),entries:P},x)for(k in w)k in D||o(D,k,w[k]);else i(i.P+i.F*(h||T),t,w);return w}},function(e,t){e.exports=!0},function(e,t,n){e.exports=n(84)},27,function(e,t,n){\"use strict\";var r=n(104),i=n(93),o=n(107),a={};n(84)(a,n(108)(\"iterator\"),function(){return this}),e.exports=function(e,t,n){e.prototype=r(a,{next:i(1,n)}),o(e,t+\" Iterator\")}},function(e,t,n){var r=n(86),i=n(105),o=n(79),a=n(75)(\"IE_PROTO\"),s=function(){},u=\"prototype\",c=function(){var e,t=n(91)(\"iframe\"),r=o.length,i=\"<\",a=\">\";for(t.style.display=\"none\",n(106).appendChild(t),t.src=\"javascript:\",e=t.contentWindow.document,e.open(),e.write(i+\"script\"+a+\"document.F=Object\"+i+\"/script\"+a),e.close(),c=e.F;r--;)delete c[u][o[r]];return c()};e.exports=Object.create||function(e,t){var n;return null!==e?(s[u]=r(e),n=new s,s[u]=null,n[a]=e):n=c(),void 0===t?n:i(n,t)}},function(e,t,n){var r=n(85),i=n(86),o=n(65);e.exports=n(89)?Object.defineProperties:function(e,t){i(e);for(var n,a=o(t),s=a.length,u=0;s>u;)r.f(e,n=a[u++],t[n]);return e}},function(e,t,n){e.exports=n(77).document&&document.documentElement},function(e,t,n){var r=n(85).f,i=n(67),o=n(108)(\"toStringTag\");e.exports=function(e,t,n){e&&!i(e=n?e:e.prototype,o)&&r(e,o,{configurable:!0,value:t})}},function(e,t,n){var r=n(76)(\"wks\"),i=n(78),o=n(77).Symbol,a=\"function\"==typeof o,s=e.exports=function(e){return r[e]||(r[e]=a&&o[e]||(a?o:i)(\"Symbol.\"+e))};s.store=r},function(e,t,n){var r=n(67),i=n(63),o=n(75)(\"IE_PROTO\"),a=Object.prototype;e.exports=Object.getPrototypeOf||function(e){return e=i(e),r(e,o)?e[o]:\"function\"==typeof e.constructor&&e instanceof e.constructor?e.constructor.prototype:e instanceof Object?a:null}},function(e,t,n){n(111);for(var r=n(77),i=n(84),o=n(102),a=n(108)(\"toStringTag\"),s=[\"NodeList\",\"DOMTokenList\",\"MediaList\",\"StyleSheetList\",\"CSSRuleList\"],u=0;u<5;u++){var c=s[u],l=r[c],p=l&&l.prototype;p&&!p[a]&&i(p,a,c),o[c]=o.Array}},function(e,t,n){\"use strict\";var r=n(112),i=n(113),o=n(102),a=n(68);e.exports=n(99)(Array,\"Array\",function(e,t){this._t=a(e),this._i=0,this._k=t},function(){var e=this._t,t=this._k,n=this._i++;return!e||n>=e.length?(this._t=void 0,i(1)):\"keys\"==t?i(0,n):\"values\"==t?i(0,e[n]):i(0,[n,e[n]])},\"values\"),o.Arguments=o.Array,r(\"keys\"),r(\"values\"),r(\"entries\")},function(e,t){e.exports=function(){}},33,function(e,t,n){t.f=n(108)},function(e,t,n){e.exports={default:n(116),__esModule:!0}},function(e,t,n){n(117),n(128),n(129),n(130),e.exports=n(59).Symbol},function(e,t,n){\"use strict\";var r=n(77),i=n(67),o=n(89),a=n(81),s=n(101),u=n(118).KEY,c=n(90),l=n(76),p=n(107),f=n(78),h=n(108),d=n(114),m=n(119),v=n(120),y=n(121),g=n(124),_=n(86),b=n(68),x=n(92),w=n(93),k=n(104),S=n(125),E=n(127),C=n(85),A=n(65),T=E.f,D=C.f,M=S.f,O=r.Symbol,P=r.JSON,I=P&&P.stringify,N=\"prototype\",R=h(\"_hidden\"),j=h(\"toPrimitive\"),F={}.propertyIsEnumerable,B=l(\"symbol-registry\"),L=l(\"symbols\"),z=l(\"op-symbols\"),q=Object[N],U=\"function\"==typeof O,W=r.QObject,K=!W||!W[N]||!W[N].findChild,V=o&&c(function(){return 7!=k(D({},\"a\",{get:function(){return D(this,\"a\",{value:7}).a}})).a})?function(e,t,n){var r=T(q,t);r&&delete q[t],D(e,t,n),r&&e!==q&&D(q,t,r)}:D,H=function(e){var t=L[e]=k(O[N]);return t._k=e,t},J=U&&\"symbol\"==typeof O.iterator?function(e){return\"symbol\"==typeof e}:function(e){return e instanceof O},G=function(e,t,n){return e===q&&G(z,t,n),_(e),t=x(t,!0),_(n),i(L,t)?(n.enumerable?(i(e,R)&&e[R][t]&&(e[R][t]=!1),n=k(n,{enumerable:w(0,!1)})):(i(e,R)||D(e,R,w(1,{})),e[R][t]=!0),V(e,t,n)):D(e,t,n)},X=function(e,t){_(e);for(var n,r=y(t=b(t)),i=0,o=r.length;o>i;)G(e,n=r[i++],t[n]);return e},Y=function(e,t){return void 0===t?k(e):X(k(e),t)},$=function(e){var t=F.call(this,e=x(e,!0));return!(this===q&&i(L,e)&&!i(z,e))&&(!(t||!i(this,e)||!i(L,e)||i(this,R)&&this[R][e])||t)},Z=function(e,t){if(e=b(e),t=x(t,!0),e!==q||!i(L,t)||i(z,t)){var n=T(e,t);return!n||!i(L,t)||i(e,R)&&e[R][t]||(n.enumerable=!0),n}},Q=function(e){for(var t,n=M(b(e)),r=[],o=0;n.length>o;)i(L,t=n[o++])||t==R||t==u||r.push(t);return r},ee=function(e){for(var t,n=e===q,r=M(n?z:b(e)),o=[],a=0;r.length>a;)!i(L,t=r[a++])||n&&!i(q,t)||o.push(L[t]);return o};U||(O=function(){if(this instanceof O)throw TypeError(\"Symbol is not a constructor!\");var e=f(arguments.length>0?arguments[0]:void 0),t=function(n){this===q&&t.call(z,n),i(this,R)&&i(this[R],e)&&(this[R][e]=!1),V(this,e,w(1,n))};return o&&K&&V(q,e,{configurable:!0,set:t}),H(e)},s(O[N],\"toString\",function(){return this._k}),E.f=Z,C.f=G,n(126).f=S.f=Q,n(123).f=$,n(122).f=ee,o&&!n(100)&&s(q,\"propertyIsEnumerable\",$,!0),d.f=function(e){return H(h(e))}),a(a.G+a.W+a.F*!U,{Symbol:O});for(var te=\"hasInstance,isConcatSpreadable,iterator,match,replace,search,species,split,toPrimitive,toStringTag,unscopables\".split(\",\"),ne=0;te.length>ne;)h(te[ne++]);for(var te=A(h.store),ne=0;te.length>ne;)m(te[ne++]);a(a.S+a.F*!U,\"Symbol\",{for:function(e){return i(B,e+=\"\")?B[e]:B[e]=O(e)},keyFor:function(e){if(J(e))return v(B,e);throw TypeError(e+\" is not a symbol!\")},useSetter:function(){K=!0},useSimple:function(){K=!1}}),a(a.S+a.F*!U,\"Object\",{create:Y,defineProperty:G,defineProperties:X,getOwnPropertyDescriptor:Z,getOwnPropertyNames:Q,getOwnPropertySymbols:ee}),P&&a(a.S+a.F*(!U||c(function(){var e=O();return\"[null]\"!=I([e])||\"{}\"!=I({a:e})||\"{}\"!=I(Object(e))})),\"JSON\",{stringify:function(e){if(void 0!==e&&!J(e)){for(var t,n,r=[e],i=1;arguments.length>i;)r.push(arguments[i++]);return t=r[1],\"function\"==typeof t&&(n=t),!n&&g(t)||(t=function(e,t){if(n&&(t=n.call(this,e,t)),!J(t))return t}),r[1]=t,I.apply(P,r)}}}),O[N][j]||n(84)(O[N],j,O[N].valueOf),p(O,\"Symbol\"),p(Math,\"Math\",!0),p(r.JSON,\"JSON\",!0)},function(e,t,n){var r=n(78)(\"meta\"),i=n(87),o=n(67),a=n(85).f,s=0,u=Object.isExtensible||function(){return!0},c=!n(90)(function(){return u(Object.preventExtensions({}))}),l=function(e){a(e,r,{value:{i:\"O\"+ ++s,w:{}}})},p=function(e,t){if(!i(e))return\"symbol\"==typeof e?e:(\"string\"==typeof e?\"S\":\"P\")+e;if(!o(e,r)){if(!u(e))return\"F\";if(!t)return\"E\";l(e)}return e[r].i},f=function(e,t){if(!o(e,r)){if(!u(e))return!0;if(!t)return!1;l(e)}return e[r].w},h=function(e){return c&&d.NEED&&u(e)&&!o(e,r)&&l(e),e},d=e.exports={KEY:r,NEED:!1,fastKey:p,getWeak:f,onFreeze:h}},function(e,t,n){var r=n(77),i=n(59),o=n(100),a=n(114),s=n(85).f;e.exports=function(e){var t=i.Symbol||(i.Symbol=o?{}:r.Symbol||{});\"_\"==e.charAt(0)||e in t||s(t,e,{value:a.f(e)})}},function(e,t,n){var r=n(65),i=n(68);e.exports=function(e,t){for(var n,o=i(e),a=r(o),s=a.length,u=0;s>u;)if(o[n=a[u++]]===t)return n}},function(e,t,n){var r=n(65),i=n(122),o=n(123);e.exports=function(e){var t=r(e),n=i.f;if(n)for(var a,s=n(e),u=o.f,c=0;s.length>c;)u.call(e,a=s[c++])&&t.push(a);return t}},function(e,t){t.f=Object.getOwnPropertySymbols},function(e,t){t.f={}.propertyIsEnumerable},function(e,t,n){var r=n(70);e.exports=Array.isArray||function(e){return\"Array\"==r(e)}},function(e,t,n){var r=n(68),i=n(126).f,o={}.toString,a=\"object\"==typeof window&&window&&Object.getOwnPropertyNames?Object.getOwnPropertyNames(window):[],s=function(e){try{return i(e)}catch(e){return a.slice()}};e.exports.f=function(e){return a&&\"[object Window]\"==o.call(e)?s(e):i(r(e))}},function(e,t,n){var r=n(66),i=n(79).concat(\"length\",\"prototype\");t.f=Object.getOwnPropertyNames||function(e){return r(e,i)}},function(e,t,n){var r=n(123),i=n(93),o=n(68),a=n(92),s=n(67),u=n(88),c=Object.getOwnPropertyDescriptor;t.f=n(89)?c:function(e,t){if(e=o(e),t=a(t,!0),u)try{return c(e,t)}catch(e){}if(s(e,t))return i(!r.f.call(e,t),e[t])}},function(e,t){},function(e,t,n){n(119)(\"asyncIterator\")},function(e,t,n){n(119)(\"observable\")},function(e,t,n){(function(t){/*!\n\t * @description Recursive object extending\n\t * @author Viacheslav Lotsmanov <lotsmanov89@gmail.com>\n\t * @license MIT\n\t *\n\t * The MIT License (MIT)\n\t *\n\t * Copyright (c) 2013-2015 Viacheslav Lotsmanov\n\t *\n\t * Permission is hereby granted, free of charge, to any person obtaining a copy of\n\t * this software and associated documentation files (the \"Software\"), to deal in\n\t * the Software without restriction, including without limitation the rights to\n\t * use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of\n\t * the Software, and to permit persons to whom the Software is furnished to do so,\n\t * subject to the following conditions:\n\t *\n\t * The above copyright notice and this permission notice shall be included in all\n\t * copies or substantial portions of the Software.\n\t *\n\t * THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n\t * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS\n\t * FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR\n\t * COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER\n\t * IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN\n\t * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.\n\t */\n\"use strict\";function n(e){return e instanceof t||e instanceof Date||e instanceof RegExp}function r(e){if(e instanceof t){var n=new t(e.length);return e.copy(n),n}if(e instanceof Date)return new Date(e.getTime());if(e instanceof RegExp)return new RegExp(e);throw new Error(\"Unexpected situation\")}function i(e){var t=[];return e.forEach(function(e,a){\"object\"==typeof e&&null!==e?Array.isArray(e)?t[a]=i(e):n(e)?t[a]=r(e):t[a]=o({},e):t[a]=e}),t}var o=e.exports=function(){if(arguments.length<1||\"object\"!=typeof arguments[0])return!1;if(arguments.length<2)return arguments[0];var e,t,a=arguments[0],s=Array.prototype.slice.call(arguments,1);return s.forEach(function(s){\"object\"!=typeof s||Array.isArray(s)||Object.keys(s).forEach(function(u){return t=a[u],e=s[u],e===a?void 0:\"object\"!=typeof e||null===e?void(a[u]=e):Array.isArray(e)?void(a[u]=i(e)):n(e)?void(a[u]=r(e)):\"object\"!=typeof t||null===t||Array.isArray(t)?void(a[u]=o({},e)):void(a[u]=o(t,e))})}),a}}).call(t,n(132).Buffer)},function(e,t,n){(function(e){/*!\n\t * The buffer module from node.js, for the browser.\n\t *\n\t * @author   Feross Aboukhadijeh <feross@feross.org> <http://feross.org>\n\t * @license  MIT\n\t */\n\"use strict\";function r(){try{var e=new Uint8Array(1);return e.__proto__={__proto__:Uint8Array.prototype,foo:function(){return 42}},42===e.foo()&&\"function\"==typeof e.subarray&&0===e.subarray(1,1).byteLength}catch(e){return!1}}function i(){return a.TYPED_ARRAY_SUPPORT?2147483647:1073741823}function o(e,t){if(i()<t)throw new RangeError(\"Invalid typed array length\");return a.TYPED_ARRAY_SUPPORT?(e=new Uint8Array(t),e.__proto__=a.prototype):(null===e&&(e=new a(t)),e.length=t),e}function a(e,t,n){if(!(a.TYPED_ARRAY_SUPPORT||this instanceof a))return new a(e,t,n);if(\"number\"==typeof e){if(\"string\"==typeof t)throw new Error(\"If encoding is specified then the first argument must be a string\");return l(this,e)}return s(this,e,t,n)}function s(e,t,n,r){if(\"number\"==typeof t)throw new TypeError('\"value\" argument must not be a number');return\"undefined\"!=typeof ArrayBuffer&&t instanceof ArrayBuffer?h(e,t,n,r):\"string\"==typeof t?p(e,t,n):d(e,t)}function u(e){if(\"number\"!=typeof e)throw new TypeError('\"size\" argument must be a number');if(e<0)throw new RangeError('\"size\" argument must not be negative')}function c(e,t,n,r){return u(t),t<=0?o(e,t):void 0!==n?\"string\"==typeof r?o(e,t).fill(n,r):o(e,t).fill(n):o(e,t)}function l(e,t){if(u(t),e=o(e,t<0?0:0|m(t)),!a.TYPED_ARRAY_SUPPORT)for(var n=0;n<t;++n)e[n]=0;return e}function p(e,t,n){if(\"string\"==typeof n&&\"\"!==n||(n=\"utf8\"),!a.isEncoding(n))throw new TypeError('\"encoding\" must be a valid string encoding');var r=0|y(t,n);e=o(e,r);var i=e.write(t,n);return i!==r&&(e=e.slice(0,i)),e}function f(e,t){var n=t.length<0?0:0|m(t.length);e=o(e,n);for(var r=0;r<n;r+=1)e[r]=255&t[r];return e}function h(e,t,n,r){if(t.byteLength,n<0||t.byteLength<n)throw new RangeError(\"'offset' is out of bounds\");if(t.byteLength<n+(r||0))throw new RangeError(\"'length' is out of bounds\");return t=void 0===n&&void 0===r?new Uint8Array(t):void 0===r?new Uint8Array(t,n):new Uint8Array(t,n,r),a.TYPED_ARRAY_SUPPORT?(e=t,e.__proto__=a.prototype):e=f(e,t),e}function d(e,t){if(a.isBuffer(t)){var n=0|m(t.length);return e=o(e,n),0===e.length?e:(t.copy(e,0,0,n),e)}if(t){if(\"undefined\"!=typeof ArrayBuffer&&t.buffer instanceof ArrayBuffer||\"length\"in t)return\"number\"!=typeof t.length||Y(t.length)?o(e,0):f(e,t);if(\"Buffer\"===t.type&&Q(t.data))return f(e,t.data)}throw new TypeError(\"First argument must be a string, Buffer, ArrayBuffer, Array, or array-like object.\")}function m(e){if(e>=i())throw new RangeError(\"Attempt to allocate Buffer larger than maximum size: 0x\"+i().toString(16)+\" bytes\");return 0|e}function v(e){return+e!=e&&(e=0),a.alloc(+e)}function y(e,t){if(a.isBuffer(e))return e.length;if(\"undefined\"!=typeof ArrayBuffer&&\"function\"==typeof ArrayBuffer.isView&&(ArrayBuffer.isView(e)||e instanceof ArrayBuffer))return e.byteLength;\"string\"!=typeof e&&(e=\"\"+e);var n=e.length;if(0===n)return 0;for(var r=!1;;)switch(t){case\"ascii\":case\"latin1\":case\"binary\":return n;case\"utf8\":case\"utf-8\":case void 0:return V(e).length;case\"ucs2\":case\"ucs-2\":case\"utf16le\":case\"utf-16le\":return 2*n;case\"hex\":return n>>>1;case\"base64\":return G(e).length;default:if(r)return V(e).length;t=(\"\"+t).toLowerCase(),r=!0}}function g(e,t,n){var r=!1;if((void 0===t||t<0)&&(t=0),t>this.length)return\"\";if((void 0===n||n>this.length)&&(n=this.length),n<=0)return\"\";if(n>>>=0,t>>>=0,n<=t)return\"\";for(e||(e=\"utf8\");;)switch(e){case\"hex\":return I(this,t,n);case\"utf8\":case\"utf-8\":return D(this,t,n);case\"ascii\":return O(this,t,n);case\"latin1\":case\"binary\":return P(this,t,n);case\"base64\":return T(this,t,n);case\"ucs2\":case\"ucs-2\":case\"utf16le\":case\"utf-16le\":return N(this,t,n);default:if(r)throw new TypeError(\"Unknown encoding: \"+e);e=(e+\"\").toLowerCase(),r=!0}}function _(e,t,n){var r=e[t];e[t]=e[n],e[n]=r}function b(e,t,n,r,i){if(0===e.length)return-1;if(\"string\"==typeof n?(r=n,n=0):n>2147483647?n=2147483647:n<-2147483648&&(n=-2147483648),n=+n,isNaN(n)&&(n=i?0:e.length-1),n<0&&(n=e.length+n),n>=e.length){if(i)return-1;n=e.length-1}else if(n<0){if(!i)return-1;n=0}if(\"string\"==typeof t&&(t=a.from(t,r)),a.isBuffer(t))return 0===t.length?-1:x(e,t,n,r,i);if(\"number\"==typeof t)return t&=255,a.TYPED_ARRAY_SUPPORT&&\"function\"==typeof Uint8Array.prototype.indexOf?i?Uint8Array.prototype.indexOf.call(e,t,n):Uint8Array.prototype.lastIndexOf.call(e,t,n):x(e,[t],n,r,i);throw new TypeError(\"val must be string, number or Buffer\")}function x(e,t,n,r,i){function o(e,t){return 1===a?e[t]:e.readUInt16BE(t*a)}var a=1,s=e.length,u=t.length;if(void 0!==r&&(r=String(r).toLowerCase(),\"ucs2\"===r||\"ucs-2\"===r||\"utf16le\"===r||\"utf-16le\"===r)){if(e.length<2||t.length<2)return-1;a=2,s/=2,u/=2,n/=2}var c;if(i){var l=-1;for(c=n;c<s;c++)if(o(e,c)===o(t,l===-1?0:c-l)){if(l===-1&&(l=c),c-l+1===u)return l*a}else l!==-1&&(c-=c-l),l=-1}else for(n+u>s&&(n=s-u),c=n;c>=0;c--){for(var p=!0,f=0;f<u;f++)if(o(e,c+f)!==o(t,f)){p=!1;break}if(p)return c}return-1}function w(e,t,n,r){n=Number(n)||0;var i=e.length-n;r?(r=Number(r),r>i&&(r=i)):r=i;var o=t.length;if(o%2!==0)throw new TypeError(\"Invalid hex string\");r>o/2&&(r=o/2);for(var a=0;a<r;++a){var s=parseInt(t.substr(2*a,2),16);if(isNaN(s))return a;e[n+a]=s}return a}function k(e,t,n,r){return X(V(t,e.length-n),e,n,r)}function S(e,t,n,r){return X(H(t),e,n,r)}function E(e,t,n,r){return S(e,t,n,r)}function C(e,t,n,r){return X(G(t),e,n,r)}function A(e,t,n,r){return X(J(t,e.length-n),e,n,r)}function T(e,t,n){return 0===t&&n===e.length?$.fromByteArray(e):$.fromByteArray(e.slice(t,n))}function D(e,t,n){n=Math.min(e.length,n);for(var r=[],i=t;i<n;){var o=e[i],a=null,s=o>239?4:o>223?3:o>191?2:1;if(i+s<=n){var u,c,l,p;switch(s){case 1:o<128&&(a=o);break;case 2:u=e[i+1],128===(192&u)&&(p=(31&o)<<6|63&u,p>127&&(a=p));break;case 3:u=e[i+1],c=e[i+2],128===(192&u)&&128===(192&c)&&(p=(15&o)<<12|(63&u)<<6|63&c,p>2047&&(p<55296||p>57343)&&(a=p));break;case 4:u=e[i+1],c=e[i+2],l=e[i+3],128===(192&u)&&128===(192&c)&&128===(192&l)&&(p=(15&o)<<18|(63&u)<<12|(63&c)<<6|63&l,p>65535&&p<1114112&&(a=p))}}null===a?(a=65533,s=1):a>65535&&(a-=65536,r.push(a>>>10&1023|55296),a=56320|1023&a),r.push(a),i+=s}return M(r)}function M(e){var t=e.length;if(t<=ee)return String.fromCharCode.apply(String,e);for(var n=\"\",r=0;r<t;)n+=String.fromCharCode.apply(String,e.slice(r,r+=ee));return n}function O(e,t,n){var r=\"\";n=Math.min(e.length,n);for(var i=t;i<n;++i)r+=String.fromCharCode(127&e[i]);return r}function P(e,t,n){var r=\"\";n=Math.min(e.length,n);for(var i=t;i<n;++i)r+=String.fromCharCode(e[i]);return r}function I(e,t,n){var r=e.length;(!t||t<0)&&(t=0),(!n||n<0||n>r)&&(n=r);for(var i=\"\",o=t;o<n;++o)i+=K(e[o]);return i}function N(e,t,n){for(var r=e.slice(t,n),i=\"\",o=0;o<r.length;o+=2)i+=String.fromCharCode(r[o]+256*r[o+1]);return i}function R(e,t,n){if(e%1!==0||e<0)throw new RangeError(\"offset is not uint\");if(e+t>n)throw new RangeError(\"Trying to access beyond buffer length\")}function j(e,t,n,r,i,o){if(!a.isBuffer(e))throw new TypeError('\"buffer\" argument must be a Buffer instance');if(t>i||t<o)throw new RangeError('\"value\" argument is out of bounds');if(n+r>e.length)throw new RangeError(\"Index out of range\")}function F(e,t,n,r){t<0&&(t=65535+t+1);for(var i=0,o=Math.min(e.length-n,2);i<o;++i)e[n+i]=(t&255<<8*(r?i:1-i))>>>8*(r?i:1-i)}function B(e,t,n,r){t<0&&(t=4294967295+t+1);for(var i=0,o=Math.min(e.length-n,4);i<o;++i)e[n+i]=t>>>8*(r?i:3-i)&255}function L(e,t,n,r,i,o){if(n+r>e.length)throw new RangeError(\"Index out of range\");if(n<0)throw new RangeError(\"Index out of range\")}function z(e,t,n,r,i){return i||L(e,t,n,4,3.4028234663852886e38,-3.4028234663852886e38),Z.write(e,t,n,r,23,4),n+4}function q(e,t,n,r,i){return i||L(e,t,n,8,1.7976931348623157e308,-1.7976931348623157e308),Z.write(e,t,n,r,52,8),n+8}function U(e){if(e=W(e).replace(te,\"\"),e.length<2)return\"\";for(;e.length%4!==0;)e+=\"=\";return e}function W(e){return e.trim?e.trim():e.replace(/^\\s+|\\s+$/g,\"\")}function K(e){return e<16?\"0\"+e.toString(16):e.toString(16)}function V(e,t){t=t||1/0;for(var n,r=e.length,i=null,o=[],a=0;a<r;++a){if(n=e.charCodeAt(a),n>55295&&n<57344){if(!i){if(n>56319){(t-=3)>-1&&o.push(239,191,189);continue}if(a+1===r){(t-=3)>-1&&o.push(239,191,189);continue}i=n;continue}if(n<56320){(t-=3)>-1&&o.push(239,191,189),i=n;continue}n=(i-55296<<10|n-56320)+65536}else i&&(t-=3)>-1&&o.push(239,191,189);if(i=null,n<128){if((t-=1)<0)break;o.push(n)}else if(n<2048){if((t-=2)<0)break;o.push(n>>6|192,63&n|128)}else if(n<65536){if((t-=3)<0)break;o.push(n>>12|224,n>>6&63|128,63&n|128)}else{if(!(n<1114112))throw new Error(\"Invalid code point\");if((t-=4)<0)break;o.push(n>>18|240,n>>12&63|128,n>>6&63|128,63&n|128)}}return o}function H(e){for(var t=[],n=0;n<e.length;++n)t.push(255&e.charCodeAt(n));return t}function J(e,t){for(var n,r,i,o=[],a=0;a<e.length&&!((t-=2)<0);++a)n=e.charCodeAt(a),r=n>>8,i=n%256,o.push(i),o.push(r);return o}function G(e){return $.toByteArray(U(e))}function X(e,t,n,r){for(var i=0;i<r&&!(i+n>=t.length||i>=e.length);++i)t[i+n]=e[i];return i}function Y(e){return e!==e}var $=n(133),Z=n(134),Q=n(135);t.Buffer=a,t.SlowBuffer=v,t.INSPECT_MAX_BYTES=50,a.TYPED_ARRAY_SUPPORT=void 0!==e.TYPED_ARRAY_SUPPORT?e.TYPED_ARRAY_SUPPORT:r(),t.kMaxLength=i(),a.poolSize=8192,a._augment=function(e){return e.__proto__=a.prototype,e},a.from=function(e,t,n){return s(null,e,t,n)},a.TYPED_ARRAY_SUPPORT&&(a.prototype.__proto__=Uint8Array.prototype,a.__proto__=Uint8Array,\"undefined\"!=typeof Symbol&&Symbol.species&&a[Symbol.species]===a&&Object.defineProperty(a,Symbol.species,{value:null,configurable:!0})),a.alloc=function(e,t,n){return c(null,e,t,n)},a.allocUnsafe=function(e){return l(null,e)},a.allocUnsafeSlow=function(e){return l(null,e)},a.isBuffer=function(e){return!(null==e||!e._isBuffer)},a.compare=function(e,t){if(!a.isBuffer(e)||!a.isBuffer(t))throw new TypeError(\"Arguments must be Buffers\");if(e===t)return 0;for(var n=e.length,r=t.length,i=0,o=Math.min(n,r);i<o;++i)if(e[i]!==t[i]){n=e[i],r=t[i];break}return n<r?-1:r<n?1:0},a.isEncoding=function(e){switch(String(e).toLowerCase()){case\"hex\":case\"utf8\":case\"utf-8\":case\"ascii\":case\"latin1\":case\"binary\":case\"base64\":case\"ucs2\":case\"ucs-2\":case\"utf16le\":case\"utf-16le\":return!0;default:return!1}},a.concat=function(e,t){if(!Q(e))throw new TypeError('\"list\" argument must be an Array of Buffers');if(0===e.length)return a.alloc(0);var n;if(void 0===t)for(t=0,n=0;n<e.length;++n)t+=e[n].length;var r=a.allocUnsafe(t),i=0;for(n=0;n<e.length;++n){var o=e[n];if(!a.isBuffer(o))throw new TypeError('\"list\" argument must be an Array of Buffers');o.copy(r,i),i+=o.length}return r},a.byteLength=y,a.prototype._isBuffer=!0,a.prototype.swap16=function(){var e=this.length;if(e%2!==0)throw new RangeError(\"Buffer size must be a multiple of 16-bits\");for(var t=0;t<e;t+=2)_(this,t,t+1);return this},a.prototype.swap32=function(){var e=this.length;if(e%4!==0)throw new RangeError(\"Buffer size must be a multiple of 32-bits\");for(var t=0;t<e;t+=4)_(this,t,t+3),_(this,t+1,t+2);return this},a.prototype.swap64=function(){var e=this.length;if(e%8!==0)throw new RangeError(\"Buffer size must be a multiple of 64-bits\");for(var t=0;t<e;t+=8)_(this,t,t+7),_(this,t+1,t+6),_(this,t+2,t+5),_(this,t+3,t+4);return this},a.prototype.toString=function(){var e=0|this.length;return 0===e?\"\":0===arguments.length?D(this,0,e):g.apply(this,arguments)},a.prototype.equals=function(e){if(!a.isBuffer(e))throw new TypeError(\"Argument must be a Buffer\");return this===e||0===a.compare(this,e)},a.prototype.inspect=function(){var e=\"\",n=t.INSPECT_MAX_BYTES;return this.length>0&&(e=this.toString(\"hex\",0,n).match(/.{2}/g).join(\" \"),this.length>n&&(e+=\" ... \")),\"<Buffer \"+e+\">\"},a.prototype.compare=function(e,t,n,r,i){if(!a.isBuffer(e))throw new TypeError(\"Argument must be a Buffer\");if(void 0===t&&(t=0),void 0===n&&(n=e?e.length:0),void 0===r&&(r=0),void 0===i&&(i=this.length),t<0||n>e.length||r<0||i>this.length)throw new RangeError(\"out of range index\");if(r>=i&&t>=n)return 0;if(r>=i)return-1;if(t>=n)return 1;if(t>>>=0,n>>>=0,r>>>=0,i>>>=0,this===e)return 0;for(var o=i-r,s=n-t,u=Math.min(o,s),c=this.slice(r,i),l=e.slice(t,n),p=0;p<u;++p)if(c[p]!==l[p]){o=c[p],s=l[p];break}return o<s?-1:s<o?1:0},a.prototype.includes=function(e,t,n){return this.indexOf(e,t,n)!==-1},a.prototype.indexOf=function(e,t,n){return b(this,e,t,n,!0)},a.prototype.lastIndexOf=function(e,t,n){return b(this,e,t,n,!1)},a.prototype.write=function(e,t,n,r){if(void 0===t)r=\"utf8\",n=this.length,t=0;else if(void 0===n&&\"string\"==typeof t)r=t,n=this.length,t=0;else{if(!isFinite(t))throw new Error(\"Buffer.write(string, encoding, offset[, length]) is no longer supported\");t|=0,isFinite(n)?(n|=0,void 0===r&&(r=\"utf8\")):(r=n,n=void 0)}var i=this.length-t;if((void 0===n||n>i)&&(n=i),e.length>0&&(n<0||t<0)||t>this.length)throw new RangeError(\"Attempt to write outside buffer bounds\");r||(r=\"utf8\");for(var o=!1;;)switch(r){case\"hex\":return w(this,e,t,n);case\"utf8\":case\"utf-8\":return k(this,e,t,n);case\"ascii\":return S(this,e,t,n);case\"latin1\":case\"binary\":return E(this,e,t,n);case\"base64\":return C(this,e,t,n);case\"ucs2\":case\"ucs-2\":case\"utf16le\":case\"utf-16le\":return A(this,e,t,n);default:if(o)throw new TypeError(\"Unknown encoding: \"+r);r=(\"\"+r).toLowerCase(),o=!0}},a.prototype.toJSON=function(){return{type:\"Buffer\",data:Array.prototype.slice.call(this._arr||this,0)}};var ee=4096;a.prototype.slice=function(e,t){var n=this.length;e=~~e,t=void 0===t?n:~~t,e<0?(e+=n,e<0&&(e=0)):e>n&&(e=n),t<0?(t+=n,t<0&&(t=0)):t>n&&(t=n),t<e&&(t=e);var r;if(a.TYPED_ARRAY_SUPPORT)r=this.subarray(e,t),r.__proto__=a.prototype;else{var i=t-e;r=new a(i,void 0);for(var o=0;o<i;++o)r[o]=this[o+e]}return r},a.prototype.readUIntLE=function(e,t,n){e|=0,t|=0,n||R(e,t,this.length);for(var r=this[e],i=1,o=0;++o<t&&(i*=256);)r+=this[e+o]*i;return r},a.prototype.readUIntBE=function(e,t,n){e|=0,t|=0,n||R(e,t,this.length);for(var r=this[e+--t],i=1;t>0&&(i*=256);)r+=this[e+--t]*i;return r},a.prototype.readUInt8=function(e,t){return t||R(e,1,this.length),this[e]},a.prototype.readUInt16LE=function(e,t){return t||R(e,2,this.length),this[e]|this[e+1]<<8},a.prototype.readUInt16BE=function(e,t){return t||R(e,2,this.length),this[e]<<8|this[e+1]},a.prototype.readUInt32LE=function(e,t){return t||R(e,4,this.length),(this[e]|this[e+1]<<8|this[e+2]<<16)+16777216*this[e+3]},a.prototype.readUInt32BE=function(e,t){return t||R(e,4,this.length),16777216*this[e]+(this[e+1]<<16|this[e+2]<<8|this[e+3])},a.prototype.readIntLE=function(e,t,n){e|=0,t|=0,n||R(e,t,this.length);for(var r=this[e],i=1,o=0;++o<t&&(i*=256);)r+=this[e+o]*i;return i*=128,r>=i&&(r-=Math.pow(2,8*t)),r},a.prototype.readIntBE=function(e,t,n){e|=0,t|=0,n||R(e,t,this.length);for(var r=t,i=1,o=this[e+--r];r>0&&(i*=256);)o+=this[e+--r]*i;return i*=128,o>=i&&(o-=Math.pow(2,8*t)),o},a.prototype.readInt8=function(e,t){return t||R(e,1,this.length),128&this[e]?(255-this[e]+1)*-1:this[e]},a.prototype.readInt16LE=function(e,t){t||R(e,2,this.length);var n=this[e]|this[e+1]<<8;return 32768&n?4294901760|n:n},a.prototype.readInt16BE=function(e,t){t||R(e,2,this.length);var n=this[e+1]|this[e]<<8;return 32768&n?4294901760|n:n},a.prototype.readInt32LE=function(e,t){return t||R(e,4,this.length),this[e]|this[e+1]<<8|this[e+2]<<16|this[e+3]<<24},a.prototype.readInt32BE=function(e,t){return t||R(e,4,this.length),this[e]<<24|this[e+1]<<16|this[e+2]<<8|this[e+3]},a.prototype.readFloatLE=function(e,t){return t||R(e,4,this.length),Z.read(this,e,!0,23,4)},a.prototype.readFloatBE=function(e,t){return t||R(e,4,this.length),Z.read(this,e,!1,23,4)},a.prototype.readDoubleLE=function(e,t){return t||R(e,8,this.length),Z.read(this,e,!0,52,8)},a.prototype.readDoubleBE=function(e,t){return t||R(e,8,this.length),Z.read(this,e,!1,52,8)},a.prototype.writeUIntLE=function(e,t,n,r){if(e=+e,t|=0,n|=0,!r){var i=Math.pow(2,8*n)-1;j(this,e,t,n,i,0)}var o=1,a=0;for(this[t]=255&e;++a<n&&(o*=256);)this[t+a]=e/o&255;return t+n},a.prototype.writeUIntBE=function(e,t,n,r){if(e=+e,t|=0,n|=0,!r){var i=Math.pow(2,8*n)-1;j(this,e,t,n,i,0)}var o=n-1,a=1;for(this[t+o]=255&e;--o>=0&&(a*=256);)this[t+o]=e/a&255;return t+n},a.prototype.writeUInt8=function(e,t,n){return e=+e,t|=0,n||j(this,e,t,1,255,0),a.TYPED_ARRAY_SUPPORT||(e=Math.floor(e)),this[t]=255&e,t+1},a.prototype.writeUInt16LE=function(e,t,n){return e=+e,t|=0,n||j(this,e,t,2,65535,0),a.TYPED_ARRAY_SUPPORT?(this[t]=255&e,this[t+1]=e>>>8):F(this,e,t,!0),t+2},a.prototype.writeUInt16BE=function(e,t,n){return e=+e,t|=0,n||j(this,e,t,2,65535,0),a.TYPED_ARRAY_SUPPORT?(this[t]=e>>>8,this[t+1]=255&e):F(this,e,t,!1),t+2},a.prototype.writeUInt32LE=function(e,t,n){return e=+e,t|=0,n||j(this,e,t,4,4294967295,0),a.TYPED_ARRAY_SUPPORT?(this[t+3]=e>>>24,this[t+2]=e>>>16,this[t+1]=e>>>8,this[t]=255&e):B(this,e,t,!0),t+4},a.prototype.writeUInt32BE=function(e,t,n){return e=+e,t|=0,n||j(this,e,t,4,4294967295,0),a.TYPED_ARRAY_SUPPORT?(this[t]=e>>>24,this[t+1]=e>>>16,this[t+2]=e>>>8,this[t+3]=255&e):B(this,e,t,!1),t+4},a.prototype.writeIntLE=function(e,t,n,r){if(e=+e,t|=0,!r){var i=Math.pow(2,8*n-1);j(this,e,t,n,i-1,-i)}var o=0,a=1,s=0;for(this[t]=255&e;++o<n&&(a*=256);)e<0&&0===s&&0!==this[t+o-1]&&(s=1),this[t+o]=(e/a>>0)-s&255;return t+n},a.prototype.writeIntBE=function(e,t,n,r){if(e=+e,t|=0,!r){var i=Math.pow(2,8*n-1);j(this,e,t,n,i-1,-i)}var o=n-1,a=1,s=0;for(this[t+o]=255&e;--o>=0&&(a*=256);)e<0&&0===s&&0!==this[t+o+1]&&(s=1),this[t+o]=(e/a>>0)-s&255;return t+n},a.prototype.writeInt8=function(e,t,n){return e=+e,t|=0,n||j(this,e,t,1,127,-128),a.TYPED_ARRAY_SUPPORT||(e=Math.floor(e)),e<0&&(e=255+e+1),this[t]=255&e,t+1},a.prototype.writeInt16LE=function(e,t,n){return e=+e,t|=0,n||j(this,e,t,2,32767,-32768),a.TYPED_ARRAY_SUPPORT?(this[t]=255&e,this[t+1]=e>>>8):F(this,e,t,!0),t+2},a.prototype.writeInt16BE=function(e,t,n){return e=+e,t|=0,n||j(this,e,t,2,32767,-32768),a.TYPED_ARRAY_SUPPORT?(this[t]=e>>>8,this[t+1]=255&e):F(this,e,t,!1),t+2},a.prototype.writeInt32LE=function(e,t,n){return e=+e,t|=0,n||j(this,e,t,4,2147483647,-2147483648),a.TYPED_ARRAY_SUPPORT?(this[t]=255&e,this[t+1]=e>>>8,this[t+2]=e>>>16,this[t+3]=e>>>24):B(this,e,t,!0),t+4},a.prototype.writeInt32BE=function(e,t,n){return e=+e,t|=0,n||j(this,e,t,4,2147483647,-2147483648),e<0&&(e=4294967295+e+1),a.TYPED_ARRAY_SUPPORT?(this[t]=e>>>24,this[t+1]=e>>>16,this[t+2]=e>>>8,this[t+3]=255&e):B(this,e,t,!1),t+4},a.prototype.writeFloatLE=function(e,t,n){return z(this,e,t,!0,n)},a.prototype.writeFloatBE=function(e,t,n){return z(this,e,t,!1,n)},a.prototype.writeDoubleLE=function(e,t,n){return q(this,e,t,!0,n)},a.prototype.writeDoubleBE=function(e,t,n){return q(this,e,t,!1,n)},a.prototype.copy=function(e,t,n,r){if(n||(n=0),r||0===r||(r=this.length),t>=e.length&&(t=e.length),t||(t=0),r>0&&r<n&&(r=n),r===n)return 0;if(0===e.length||0===this.length)return 0;if(t<0)throw new RangeError(\"targetStart out of bounds\");if(n<0||n>=this.length)throw new RangeError(\"sourceStart out of bounds\");if(r<0)throw new RangeError(\"sourceEnd out of bounds\");r>this.length&&(r=this.length),e.length-t<r-n&&(r=e.length-t+n);var i,o=r-n;if(this===e&&n<t&&t<r)for(i=o-1;i>=0;--i)e[i+t]=this[i+n];else if(o<1e3||!a.TYPED_ARRAY_SUPPORT)for(i=0;i<o;++i)e[i+t]=this[i+n];else Uint8Array.prototype.set.call(e,this.subarray(n,n+o),t);return o},a.prototype.fill=function(e,t,n,r){if(\"string\"==typeof e){if(\"string\"==typeof t?(r=t,t=0,n=this.length):\"string\"==typeof n&&(r=n,n=this.length),1===e.length){var i=e.charCodeAt(0);i<256&&(e=i)}if(void 0!==r&&\"string\"!=typeof r)throw new TypeError(\"encoding must be a string\");if(\"string\"==typeof r&&!a.isEncoding(r))throw new TypeError(\"Unknown encoding: \"+r)}else\"number\"==typeof e&&(e&=255);if(t<0||this.length<t||this.length<n)throw new RangeError(\"Out of range index\");if(n<=t)return this;t>>>=0,n=void 0===n?this.length:n>>>0,e||(e=0);var o;if(\"number\"==typeof e)for(o=t;o<n;++o)this[o]=e;else{var s=a.isBuffer(e)?e:V(new a(e,r).toString()),u=s.length;for(o=0;o<n-t;++o)this[o+t]=s[o%u]}return this};var te=/[^+\\/0-9A-Za-z-_]/g}).call(t,function(){return this}())},function(e,t){\"use strict\";function n(e){var t=e.length;if(t%4>0)throw new Error(\"Invalid string. Length must be a multiple of 4\");return\"=\"===e[t-2]?2:\"=\"===e[t-1]?1:0}function r(e){return 3*e.length/4-n(e)}function i(e){var t,r,i,o,a,s=e.length;o=n(e),a=new l(3*s/4-o),r=o>0?s-4:s;var u=0;for(t=0;t<r;t+=4)i=c[e.charCodeAt(t)]<<18|c[e.charCodeAt(t+1)]<<12|c[e.charCodeAt(t+2)]<<6|c[e.charCodeAt(t+3)],a[u++]=i>>16&255,a[u++]=i>>8&255,a[u++]=255&i;return 2===o?(i=c[e.charCodeAt(t)]<<2|c[e.charCodeAt(t+1)]>>4,a[u++]=255&i):1===o&&(i=c[e.charCodeAt(t)]<<10|c[e.charCodeAt(t+1)]<<4|c[e.charCodeAt(t+2)]>>2,a[u++]=i>>8&255,a[u++]=255&i),a}function o(e){return u[e>>18&63]+u[e>>12&63]+u[e>>6&63]+u[63&e]}function a(e,t,n){for(var r,i=[],a=t;a<n;a+=3)r=(e[a]<<16)+(e[a+1]<<8)+e[a+2],i.push(o(r));return i.join(\"\")}function s(e){for(var t,n=e.length,r=n%3,i=\"\",o=[],s=16383,c=0,l=n-r;c<l;c+=s)o.push(a(e,c,c+s>l?l:c+s));return 1===r?(t=e[n-1],i+=u[t>>2],i+=u[t<<4&63],i+=\"==\"):2===r&&(t=(e[n-2]<<8)+e[n-1],i+=u[t>>10],i+=u[t>>4&63],i+=u[t<<2&63],i+=\"=\"),o.push(i),o.join(\"\")}t.byteLength=r,t.toByteArray=i,t.fromByteArray=s;for(var u=[],c=[],l=\"undefined\"!=typeof Uint8Array?Uint8Array:Array,p=\"ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/\",f=0,h=p.length;f<h;++f)u[f]=p[f],c[p.charCodeAt(f)]=f;c[\"-\".charCodeAt(0)]=62,c[\"_\".charCodeAt(0)]=63},function(e,t){t.read=function(e,t,n,r,i){var o,a,s=8*i-r-1,u=(1<<s)-1,c=u>>1,l=-7,p=n?i-1:0,f=n?-1:1,h=e[t+p];for(p+=f,o=h&(1<<-l)-1,h>>=-l,l+=s;l>0;o=256*o+e[t+p],p+=f,l-=8);for(a=o&(1<<-l)-1,o>>=-l,l+=r;l>0;a=256*a+e[t+p],p+=f,l-=8);if(0===o)o=1-c;else{if(o===u)return a?NaN:(h?-1:1)*(1/0);a+=Math.pow(2,r),o-=c}return(h?-1:1)*a*Math.pow(2,o-r)},t.write=function(e,t,n,r,i,o){var a,s,u,c=8*o-i-1,l=(1<<c)-1,p=l>>1,f=23===i?Math.pow(2,-24)-Math.pow(2,-77):0,h=r?0:o-1,d=r?1:-1,m=t<0||0===t&&1/t<0?1:0;for(t=Math.abs(t),isNaN(t)||t===1/0?(s=isNaN(t)?1:0,a=l):(a=Math.floor(Math.log(t)/Math.LN2),t*(u=Math.pow(2,-a))<1&&(a--,u*=2),t+=a+p>=1?f/u:f*Math.pow(2,1-p),t*u>=2&&(a++,u/=2),a+p>=l?(s=0,a=l):a+p>=1?(s=(t*u-1)*Math.pow(2,i),a+=p):(s=t*Math.pow(2,p-1)*Math.pow(2,i),a=0));i>=8;e[n+h]=255&s,h+=d,s/=256,i-=8);for(a=a<<i|s,c+=i;c>0;e[n+h]=255&a,h+=d,a/=256,c-=8);e[n+h-d]|=128*m}},function(e,t){var n={}.toString;e.exports=Array.isArray||function(e){return\"[object Array]\"==n.call(e)}},function(e,t,n){\"use strict\";function r(e){return e&&e.__esModule?e:{default:e}}function i(e,t,n){var r=[(0,P.systemThunkMiddleware)(n)],i=O.default.__REDUX_DEVTOOLS_EXTENSION_COMPOSE__||x.compose;return(0,x.createStore)(e,t,i(x.applyMiddleware.apply(void 0,r)))}function o(e,t){return(0,P.isObject)(e)&&!(0,P.isArray)(e)?e:(0,P.isFunc)(e)?o(e(t),t):(0,P.isArray)(e)?e.map(function(e){return o(e,t)}).reduce(a,{}):{}}function a(){var e=arguments.length>0&&void 0!==arguments[0]?arguments[0]:{},t=arguments.length>1&&void 0!==arguments[1]?arguments[1]:{};if(!(0,P.isObject)(e))return{};if(!(0,P.isObject)(t))return e;var n=e.statePlugins;if((0,P.isObject)(n))for(var r in n){var i=n[r];if((0,P.isObject)(i)&&(0,P.isObject)(i.wrapActions)){var o=i.wrapActions;for(var a in o){var s=o[a];Array.isArray(s)||(s=[s],o[a]=s),t&&t.statePlugins&&t.statePlugins[r]&&t.statePlugins[r].wrapActions&&t.statePlugins[r].wrapActions[a]&&(t.statePlugins[r].wrapActions[a]=o[a].concat(t.statePlugins[r].wrapActions[a]))}}}return(0,E.default)(e,t)}function s(e){var t=(0,P.objMap)(e,function(e){return e.reducers});return u(t)}function u(e){var t=(0,f.default)(e).reduce(function(t,n){return t[n]=c(e[n]),t},{});return(0,f.default)(t).length?(0,C.combineReducers)(t):I}function c(e){return function(){var t=arguments.length>0&&void 0!==arguments[0]?arguments[0]:new w.Map,n=arguments[1];if(!e)return t;var r=e[n.type];return r?r(t,n):t}}function l(e,t,n){var r=i(e,t,n);return r}Object.defineProperty(t,\"__esModule\",{value:!0});var p=n(60),f=r(p),h=n(137),d=r(h),m=n(141),v=r(m),y=n(145),g=r(y),_=n(146),b=r(_),x=n(147),w=n(168),k=r(w),S=n(131),E=r(S),C=n(169),A=n(175),T=r(A),D=n(176),M=n(177),O=r(M),P=n(183),I=function(e){return e},N=function(){function e(){var t=arguments.length>0&&void 0!==arguments[0]?arguments[0]:{};(0,g.default)(this,e),(0,E.default)(this,{state:{},plugins:[],system:{configs:{},fn:{},components:{},rootInjects:{},statePlugins:{}},boundSystem:{},toolbox:{}},t),this.getSystem=this._getSystem.bind(this),this.store=l(I,(0,w.fromJS)(this.state),this.getSystem),this.buildSystem(!1),this.register(this.plugins)}return(0,b.default)(e,[{key:\"getStore\",value:function(){return this.store}},{key:\"register\",value:function(e){var t=!(arguments.length>1&&void 0!==arguments[1])||arguments[1],n=o(e,this.getSystem());a(this.system,n),t&&this.buildSystem()}},{key:\"buildSystem\",value:function(){var e=!(arguments.length>0&&void 0!==arguments[0])||arguments[0],t=this.getStore().dispatch,n=this.getStore().getState;this.boundSystem=(0,v.default)({},this.getRootInjects(),this.getWrappedAndBoundActions(t),this.getBoundSelectors(n,this.getSystem),this.getStateThunks(n),this.getFn(),this.getConfigs()),e&&this.rebuildReducer()}},{key:\"_getSystem\",value:function(){return this.boundSystem}},{key:\"getRootInjects\",value:function(){return(0,v.default)({getSystem:this.getSystem,getStore:this.getStore.bind(this),getComponents:this.getComponents.bind(this),getState:this.getStore().getState,getConfigs:this._getConfigs.bind(this),Im:k.default},this.system.rootInjects||{})}},{key:\"_getConfigs\",value:function(){return this.system.configs}},{key:\"getConfigs\",value:function(){return{configs:this.system.configs}}},{key:\"setConfigs\",value:function(e){this.system.configs=e}},{key:\"rebuildReducer\",value:function(){this.store.replaceReducer(s(this.system.statePlugins))}},{key:\"getType\",value:function(e){var t=e[0].toUpperCase()+e.slice(1);return(0,P.objReduce)(this.system.statePlugins,function(n,r){var i=n[e];if(i)return(0,d.default)({},r+t,i)})}},{key:\"getSelectors\",value:function(){return this.getType(\"selectors\")}},{key:\"getActions\",value:function(){var e=this.getType(\"actions\");return(0,P.objMap)(e,function(e){return(0,P.objReduce)(e,function(e,t){if((0,P.isFn)(e))return(0,d.default)({},t,e)})})}},{key:\"getWrappedAndBoundActions\",value:function(e){var t=this,n=this.getBoundActions(e);return(0,P.objMap)(n,function(e,n){var r=t.system.statePlugins[n.slice(0,-7)].wrapActions;return r?(0,P.objMap)(e,function(e,n){var i=r[n];return i?(Array.isArray(i)||(i=[i]),i.reduce(function(e,n){var r=function(){return n(e,t.getSystem()).apply(void 0,arguments)};if(!(0,P.isFn)(r))throw new TypeError(\"wrapActions needs to return a function that returns a new function (ie the wrapped action)\");return r},e||Function.prototype)):e}):e})}},{key:\"getStates\",value:function(e){return(0,f.default)(this.system.statePlugins).reduce(function(t,n){return t[n]=e.get(n),t},{})}},{key:\"getStateThunks\",value:function(e){return(0,f.default)(this.system.statePlugins).reduce(function(t,n){return t[n]=function(){return e().get(n)},t},{})}},{key:\"getFn\",value:function(){return{fn:this.system.fn}}},{key:\"getComponents\",value:function(e){return\"undefined\"!=typeof e?this.system.components[e]:this.system.components}},{key:\"getBoundSelectors\",value:function(e,t){return(0,P.objMap)(this.getSelectors(),function(n,r){var i=[r.slice(0,-9)],o=function(){return e().getIn(i)};return(0,P.objMap)(n,function(e){return function(){for(var n=arguments.length,r=Array(n),i=0;i<n;i++)r[i]=arguments[i];var a=e.apply(null,[o()].concat(r));return\"function\"==typeof a&&(a=a(t())),a}})})}},{key:\"getBoundActions\",value:function(e){e=e||this.getStore().dispatch;var t=function e(t){return\"function\"!=typeof t?(0,P.objMap)(t,function(t){return e(t)}):function(){var e=null;try{e=t.apply(void 0,arguments)}catch(t){e={type:D.NEW_THROWN_ERR,error:!0,payload:(0,T.default)(t)}}finally{return e}}};return(0,P.objMap)(this.getActions(),function(n){return(0,x.bindActionCreators)(t(n),e)})}},{key:\"getMapStateToProps\",value:function(){var e=this;return function(){var t=(0,v.default)({},e.getSystem());return t}}},{key:\"getMapDispatchToProps\",value:function(e){var t=this;return function(n){return(0,E.default)({},t.getWrappedAndBoundActions(n),t.getFn(),e)}}}]),e}();t.default=N},function(e,t,n){\"use strict\";function r(e){return e&&e.__esModule?e:{default:e}}t.__esModule=!0;var i=n(138),o=r(i);t.default=function(e,t,n){return t in e?(0,o.default)(e,t,{value:n,enumerable:!0,configurable:!0,writable:!0}):e[t]=n,e}},function(e,t,n){e.exports={default:n(139),__esModule:!0}},function(e,t,n){n(140);var r=n(59).Object;e.exports=function(e,t,n){return r.defineProperty(e,t,n)}},function(e,t,n){var r=n(81);r(r.S+r.F*!n(89),\"Object\",{defineProperty:n(85).f})},function(e,t,n){e.exports={default:n(142),__esModule:!0}},function(e,t,n){n(143),e.exports=n(59).Object.assign},function(e,t,n){var r=n(81);r(r.S+r.F,\"Object\",{assign:n(144)})},function(e,t,n){\"use strict\";var r=n(65),i=n(122),o=n(123),a=n(63),s=n(69),u=Object.assign;e.exports=!u||n(90)(function(){var e={},t={},n=Symbol(),r=\"abcdefghijklmnopqrst\";return e[n]=7,r.split(\"\").forEach(function(e){t[e]=e}),7!=u({},e)[n]||Object.keys(u({},t)).join(\"\")!=r})?function(e,t){for(var n=a(e),u=arguments.length,c=1,l=i.f,p=o.f;u>c;)for(var f,h=s(arguments[c++]),d=l?r(h).concat(l(h)):r(h),m=d.length,v=0;m>v;)p.call(h,f=d[v++])&&(n[f]=h[f]);return n}:u},function(e,t){\"use strict\";t.__esModule=!0,t.default=function(e,t){if(!(e instanceof t))throw new TypeError(\"Cannot call a class as a function\")}},function(e,t,n){\"use strict\";function r(e){return e&&e.__esModule?e:{default:e}}t.__esModule=!0;var i=n(138),o=r(i);t.default=function(){function e(e,t){for(var n=0;n<t.length;n++){var r=t[n];r.enumerable=r.enumerable||!1,r.configurable=!0,\"value\"in r&&(r.writable=!0),(0,o.default)(e,r.key,r)}}return function(t,n,r){return n&&e(t.prototype,n),r&&e(t,r),t}}()},function(e,t,n){\"use strict\";function r(e){return e&&e.__esModule?e:{default:e}}t.__esModule=!0,t.compose=t.applyMiddleware=t.bindActionCreators=t.combineReducers=t.createStore=void 0;var i=n(148),o=r(i),a=n(163),s=r(a),u=n(165),c=r(u),l=n(166),p=r(l),f=n(167),h=r(f),d=n(164);r(d);t.createStore=o.default,t.combineReducers=s.default,t.bindActionCreators=c.default,t.applyMiddleware=p.default,t.compose=h.default},function(e,t,n){\"use strict\";function r(e){return e&&e.__esModule?e:{default:e}}function i(e,t,n){function r(){y===v&&(y=v.slice())}function o(){return m}function s(e){if(\"function\"!=typeof e)throw new Error(\"Expected listener to be a function.\");var t=!0;return r(),y.push(e),function(){if(t){t=!1,r();var n=y.indexOf(e);y.splice(n,1)}}}function l(e){if(!(0,a.default)(e))throw new Error(\"Actions must be plain objects. Use custom middleware for async actions.\");if(\"undefined\"==typeof e.type)throw new Error('Actions may not have an undefined \"type\" property. Have you misspelled a constant?');if(g)throw new Error(\"Reducers may not dispatch actions.\");try{g=!0,m=d(m,e)}finally{g=!1}for(var t=v=y,n=0;n<t.length;n++){var r=t[n];r()}return e}function p(e){if(\"function\"!=typeof e)throw new Error(\"Expected the nextReducer to be a function.\");d=e,l({type:c.INIT})}function f(){var e,t=s;return e={subscribe:function(e){function n(){e.next&&e.next(o())}if(\"object\"!=typeof e)throw new TypeError(\"Expected the observer to be an object.\");n();var r=t(n);return{unsubscribe:r}}},e[u.default]=function(){return this},e}var h;if(\"function\"==typeof t&&\"undefined\"==typeof n&&(n=t,t=void 0),\"undefined\"!=typeof n){if(\"function\"!=typeof n)throw new Error(\"Expected the enhancer to be a function.\");return n(i)(e,t)}if(\"function\"!=typeof e)throw new Error(\"Expected the reducer to be a function.\");var d=e,m=t,v=[],y=v,g=!1;return l({type:c.INIT}),h={dispatch:l,subscribe:s,getState:o,replaceReducer:p},h[u.default]=f,h}t.__esModule=!0,t.ActionTypes=void 0,t.default=i;var o=n(149),a=r(o),s=n(159),u=r(s),c=t.ActionTypes={INIT:\"@@redux/INIT\"}},function(e,t,n){function r(e){if(!a(e)||i(e)!=s)return!1;var t=o(e);if(null===t)return!0;var n=p.call(t,\"constructor\")&&t.constructor;return\"function\"==typeof n&&n instanceof n&&l.call(n)==f}var i=n(150),o=n(156),a=n(158),s=\"[object Object]\",u=Function.prototype,c=Object.prototype,l=u.toString,p=c.hasOwnProperty,f=l.call(Object);\ne.exports=r},function(e,t,n){function r(e){return null==e?void 0===e?u:s:(e=Object(e),c&&c in e?o(e):a(e))}var i=n(151),o=n(154),a=n(155),s=\"[object Null]\",u=\"[object Undefined]\",c=i?i.toStringTag:void 0;e.exports=r},[1177,152],[1178,153],function(e,t){(function(t){var n=\"object\"==typeof t&&t&&t.Object===Object&&t;e.exports=n}).call(t,function(){return this}())},function(e,t,n){function r(e){var t=a.call(e,u),n=e[u];try{e[u]=void 0;var r=!0}catch(e){}var i=s.call(e);return r&&(t?e[u]=n:delete e[u]),i}var i=n(151),o=Object.prototype,a=o.hasOwnProperty,s=o.toString,u=i?i.toStringTag:void 0;e.exports=r},function(e,t){function n(e){return i.call(e)}var r=Object.prototype,i=r.toString;e.exports=n},[1179,157],function(e,t){function n(e,t){return function(n){return e(t(n))}}e.exports=n},function(e,t){function n(e){return null!=e&&\"object\"==typeof e}e.exports=n},function(e,t,n){e.exports=n(160)},function(e,t,n){(function(e,r){\"use strict\";function i(e){return e&&e.__esModule?e:{default:e}}Object.defineProperty(t,\"__esModule\",{value:!0});var o,a=n(162),s=i(a);o=\"undefined\"!=typeof self?self:\"undefined\"!=typeof window?window:\"undefined\"!=typeof e?e:r;var u=(0,s.default)(o);t.default=u}).call(t,function(){return this}(),n(161)(e))},function(e,t){e.exports=function(e){return e.webpackPolyfill||(e.deprecate=function(){},e.paths=[],e.children=[],e.webpackPolyfill=1),e}},function(e,t){\"use strict\";function n(e){var t,n=e.Symbol;return\"function\"==typeof n?n.observable?t=n.observable:(t=n(\"observable\"),n.observable=t):t=\"@@observable\",t}Object.defineProperty(t,\"__esModule\",{value:!0}),t.default=n},function(e,t,n){\"use strict\";function r(e){return e&&e.__esModule?e:{default:e}}function i(e,t){var n=t&&t.type,r=n&&'\"'+n.toString()+'\"'||\"an action\";return\"Given action \"+r+', reducer \"'+e+'\" returned undefined. To ignore an action, you must explicitly return the previous state. If you want this reducer to hold no value, you can return null instead of undefined.'}function o(e){Object.keys(e).forEach(function(t){var n=e[t],r=n(void 0,{type:s.ActionTypes.INIT});if(\"undefined\"==typeof r)throw new Error('Reducer \"'+t+\"\\\" returned undefined during initialization. If the state passed to the reducer is undefined, you must explicitly return the initial state. The initial state may not be undefined. If you don't want to set a value for this reducer, you can use null instead of undefined.\");var i=\"@@redux/PROBE_UNKNOWN_ACTION_\"+Math.random().toString(36).substring(7).split(\"\").join(\".\");if(\"undefined\"==typeof n(void 0,{type:i}))throw new Error('Reducer \"'+t+'\" returned undefined when probed with a random type. '+(\"Don't try to handle \"+s.ActionTypes.INIT+' or other actions in \"redux/*\" ')+\"namespace. They are considered private. Instead, you must return the current state for any unknown actions, unless it is undefined, in which case you must return the initial state, regardless of the action type. The initial state may not be undefined, but can be null.\")})}function a(e){for(var t=Object.keys(e),n={},r=0;r<t.length;r++){var a=t[r];\"function\"==typeof e[a]&&(n[a]=e[a])}var s=Object.keys(n),u=void 0;try{o(n)}catch(e){u=e}return function(){var e=arguments.length>0&&void 0!==arguments[0]?arguments[0]:{},t=arguments[1];if(u)throw u;for(var r=!1,o={},a=0;a<s.length;a++){var c=s[a],l=n[c],p=e[c],f=l(p,t);if(\"undefined\"==typeof f){var h=i(c,t);throw new Error(h)}o[c]=f,r=r||f!==p}return r?o:e}}t.__esModule=!0,t.default=a;var s=n(148),u=n(149),c=(r(u),n(164));r(c)},function(e,t){\"use strict\";function n(e){\"undefined\"!=typeof console&&\"function\"==typeof console.error&&console.error(e);try{throw new Error(e)}catch(e){}}t.__esModule=!0,t.default=n},function(e,t,n){\"use strict\";function r(e){return e&&e.__esModule?e:{default:e}}function i(e,t){return function(){return t(e.apply(void 0,arguments))}}function o(e,t){if(\"function\"==typeof e)return i(e,t);if(\"object\"!=typeof e||null===e)throw new Error(\"bindActionCreators expected an object or a function, instead received \"+(null===e?\"null\":typeof e)+'. Did you write \"import ActionCreators from\" instead of \"import * as ActionCreators from\"?');for(var n=Object.keys(e),r={},o=0;o<n.length;o++){var a=n[o],u=e[a];\"function\"==typeof u?r[a]=i(u,t):(0,s.default)(\"bindActionCreators expected a function actionCreator for key '\"+a+\"', instead received type '\"+typeof u+\"'.\")}return r}t.__esModule=!0,t.default=o;var a=n(164),s=r(a)},function(e,t,n){\"use strict\";function r(e){return e&&e.__esModule?e:{default:e}}function i(){for(var e=arguments.length,t=Array(e),n=0;n<e;n++)t[n]=arguments[n];return function(e){return function(n,r,i){var a=e(n,r,i),u=a.dispatch,c=[],l={getState:a.getState,dispatch:function(e){return u(e)}};return c=t.map(function(e){return e(l)}),u=s.default.apply(void 0,c)(a.dispatch),o({},a,{dispatch:u})}}}t.__esModule=!0;var o=Object.assign||function(e){for(var t=1;t<arguments.length;t++){var n=arguments[t];for(var r in n)Object.prototype.hasOwnProperty.call(n,r)&&(e[r]=n[r])}return e};t.default=i;var a=n(167),s=r(a)},function(e,t){\"use strict\";function n(){for(var e=arguments.length,t=Array(e),n=0;n<e;n++)t[n]=arguments[n];return 0===t.length?function(e){return e}:1===t.length?t[0]:t.reduce(function(e,t){return function(){return e(t.apply(void 0,arguments))}})}t.__esModule=!0,t.default=n},function(e,t,n){!function(t,n){e.exports=n()}(this,function(){\"use strict\";function e(e,t){t&&(e.prototype=Object.create(t.prototype)),e.prototype.constructor=e}function t(e){return o(e)?e:D(e)}function n(e){return a(e)?e:M(e)}function r(e){return s(e)?e:O(e)}function i(e){return o(e)&&!u(e)?e:P(e)}function o(e){return!(!e||!e[cn])}function a(e){return!(!e||!e[ln])}function s(e){return!(!e||!e[pn])}function u(e){return a(e)||s(e)}function c(e){return!(!e||!e[fn])}function l(e){return e.value=!1,e}function p(e){e&&(e.value=!0)}function f(){}function h(e,t){t=t||0;for(var n=Math.max(0,e.length-t),r=new Array(n),i=0;i<n;i++)r[i]=e[i+t];return r}function d(e){return void 0===e.size&&(e.size=e.__iterate(v)),e.size}function m(e,t){if(\"number\"!=typeof t){var n=t>>>0;if(\"\"+n!==t||4294967295===n)return NaN;t=n}return t<0?d(e)+t:t}function v(){return!0}function y(e,t,n){return(0===e||void 0!==n&&e<=-n)&&(void 0===t||void 0!==n&&t>=n)}function g(e,t){return b(e,t,0)}function _(e,t){return b(e,t,t)}function b(e,t,n){return void 0===e?n:e<0?Math.max(0,t+e):void 0===t?e:Math.min(t,e)}function x(e){this.next=e}function w(e,t,n,r){var i=0===e?t:1===e?n:[t,n];return r?r.value=i:r={value:i,done:!1},r}function k(){return{value:void 0,done:!0}}function S(e){return!!A(e)}function E(e){return e&&\"function\"==typeof e.next}function C(e){var t=A(e);return t&&t.call(e)}function A(e){var t=e&&(kn&&e[kn]||e[Sn]);if(\"function\"==typeof t)return t}function T(e){return e&&\"number\"==typeof e.length}function D(e){return null===e||void 0===e?B():o(e)?e.toSeq():q(e)}function M(e){return null===e||void 0===e?B().toKeyedSeq():o(e)?a(e)?e.toSeq():e.fromEntrySeq():L(e)}function O(e){return null===e||void 0===e?B():o(e)?a(e)?e.entrySeq():e.toIndexedSeq():z(e)}function P(e){return(null===e||void 0===e?B():o(e)?a(e)?e.entrySeq():e:z(e)).toSetSeq()}function I(e){this._array=e,this.size=e.length}function N(e){var t=Object.keys(e);this._object=e,this._keys=t,this.size=t.length}function R(e){this._iterable=e,this.size=e.length||e.size}function j(e){this._iterator=e,this._iteratorCache=[]}function F(e){return!(!e||!e[Cn])}function B(){return An||(An=new I([]))}function L(e){var t=Array.isArray(e)?new I(e).fromEntrySeq():E(e)?new j(e).fromEntrySeq():S(e)?new R(e).fromEntrySeq():\"object\"==typeof e?new N(e):void 0;if(!t)throw new TypeError(\"Expected Array or iterable object of [k, v] entries, or keyed object: \"+e);return t}function z(e){var t=U(e);if(!t)throw new TypeError(\"Expected Array or iterable object of values: \"+e);return t}function q(e){var t=U(e)||\"object\"==typeof e&&new N(e);if(!t)throw new TypeError(\"Expected Array or iterable object of values, or keyed object: \"+e);return t}function U(e){return T(e)?new I(e):E(e)?new j(e):S(e)?new R(e):void 0}function W(e,t,n,r){var i=e._cache;if(i){for(var o=i.length-1,a=0;a<=o;a++){var s=i[n?o-a:a];if(t(s[1],r?s[0]:a,e)===!1)return a+1}return a}return e.__iterateUncached(t,n)}function K(e,t,n,r){var i=e._cache;if(i){var o=i.length-1,a=0;return new x(function(){var e=i[n?o-a:a];return a++>o?k():w(t,r?e[0]:a-1,e[1])})}return e.__iteratorUncached(t,n)}function V(e,t){return t?H(t,e,\"\",{\"\":e}):J(e)}function H(e,t,n,r){return Array.isArray(t)?e.call(r,n,O(t).map(function(n,r){return H(e,n,r,t)})):G(t)?e.call(r,n,M(t).map(function(n,r){return H(e,n,r,t)})):t}function J(e){return Array.isArray(e)?O(e).map(J).toList():G(e)?M(e).map(J).toMap():e}function G(e){return e&&(e.constructor===Object||void 0===e.constructor)}function X(e,t){if(e===t||e!==e&&t!==t)return!0;if(!e||!t)return!1;if(\"function\"==typeof e.valueOf&&\"function\"==typeof t.valueOf){if(e=e.valueOf(),t=t.valueOf(),e===t||e!==e&&t!==t)return!0;if(!e||!t)return!1}return!(\"function\"!=typeof e.equals||\"function\"!=typeof t.equals||!e.equals(t))}function Y(e,t){if(e===t)return!0;if(!o(t)||void 0!==e.size&&void 0!==t.size&&e.size!==t.size||void 0!==e.__hash&&void 0!==t.__hash&&e.__hash!==t.__hash||a(e)!==a(t)||s(e)!==s(t)||c(e)!==c(t))return!1;if(0===e.size&&0===t.size)return!0;var n=!u(e);if(c(e)){var r=e.entries();return t.every(function(e,t){var i=r.next().value;return i&&X(i[1],e)&&(n||X(i[0],t))})&&r.next().done}var i=!1;if(void 0===e.size)if(void 0===t.size)\"function\"==typeof e.cacheResult&&e.cacheResult();else{i=!0;var l=e;e=t,t=l}var p=!0,f=t.__iterate(function(t,r){if(n?!e.has(t):i?!X(t,e.get(r,yn)):!X(e.get(r,yn),t))return p=!1,!1});return p&&e.size===f}function $(e,t){if(!(this instanceof $))return new $(e,t);if(this._value=e,this.size=void 0===t?1/0:Math.max(0,t),0===this.size){if(Tn)return Tn;Tn=this}}function Z(e,t){if(!e)throw new Error(t)}function Q(e,t,n){if(!(this instanceof Q))return new Q(e,t,n);if(Z(0!==n,\"Cannot step a Range by 0\"),e=e||0,void 0===t&&(t=1/0),n=void 0===n?1:Math.abs(n),t<e&&(n=-n),this._start=e,this._end=t,this._step=n,this.size=Math.max(0,Math.ceil((t-e)/n-1)+1),0===this.size){if(Dn)return Dn;Dn=this}}function ee(){throw TypeError(\"Abstract\")}function te(){}function ne(){}function re(){}function ie(e){return e>>>1&1073741824|3221225471&e}function oe(e){if(e===!1||null===e||void 0===e)return 0;if(\"function\"==typeof e.valueOf&&(e=e.valueOf(),e===!1||null===e||void 0===e))return 0;if(e===!0)return 1;var t=typeof e;if(\"number\"===t){if(e!==e||e===1/0)return 0;var n=0|e;for(n!==e&&(n^=4294967295*e);e>4294967295;)e/=4294967295,n^=e;return ie(n)}if(\"string\"===t)return e.length>Fn?ae(e):se(e);if(\"function\"==typeof e.hashCode)return e.hashCode();if(\"object\"===t)return ue(e);if(\"function\"==typeof e.toString)return se(e.toString());throw new Error(\"Value type \"+t+\" cannot be hashed.\")}function ae(e){var t=zn[e];return void 0===t&&(t=se(e),Ln===Bn&&(Ln=0,zn={}),Ln++,zn[e]=t),t}function se(e){for(var t=0,n=0;n<e.length;n++)t=31*t+e.charCodeAt(n)|0;return ie(t)}function ue(e){var t;if(Nn&&(t=Mn.get(e),void 0!==t))return t;if(t=e[jn],void 0!==t)return t;if(!In){if(t=e.propertyIsEnumerable&&e.propertyIsEnumerable[jn],void 0!==t)return t;if(t=ce(e),void 0!==t)return t}if(t=++Rn,1073741824&Rn&&(Rn=0),Nn)Mn.set(e,t);else{if(void 0!==Pn&&Pn(e)===!1)throw new Error(\"Non-extensible objects are not allowed as keys.\");if(In)Object.defineProperty(e,jn,{enumerable:!1,configurable:!1,writable:!1,value:t});else if(void 0!==e.propertyIsEnumerable&&e.propertyIsEnumerable===e.constructor.prototype.propertyIsEnumerable)e.propertyIsEnumerable=function(){return this.constructor.prototype.propertyIsEnumerable.apply(this,arguments)},e.propertyIsEnumerable[jn]=t;else{if(void 0===e.nodeType)throw new Error(\"Unable to set a non-enumerable property on object.\");e[jn]=t}}return t}function ce(e){if(e&&e.nodeType>0)switch(e.nodeType){case 1:return e.uniqueID;case 9:return e.documentElement&&e.documentElement.uniqueID}}function le(e){Z(e!==1/0,\"Cannot perform this action with an infinite size.\")}function pe(e){return null===e||void 0===e?we():fe(e)&&!c(e)?e:we().withMutations(function(t){var r=n(e);le(r.size),r.forEach(function(e,n){return t.set(n,e)})})}function fe(e){return!(!e||!e[qn])}function he(e,t){this.ownerID=e,this.entries=t}function de(e,t,n){this.ownerID=e,this.bitmap=t,this.nodes=n}function me(e,t,n){this.ownerID=e,this.count=t,this.nodes=n}function ve(e,t,n){this.ownerID=e,this.keyHash=t,this.entries=n}function ye(e,t,n){this.ownerID=e,this.keyHash=t,this.entry=n}function ge(e,t,n){this._type=t,this._reverse=n,this._stack=e._root&&be(e._root)}function _e(e,t){return w(e,t[0],t[1])}function be(e,t){return{node:e,index:0,__prev:t}}function xe(e,t,n,r){var i=Object.create(Un);return i.size=e,i._root=t,i.__ownerID=n,i.__hash=r,i.__altered=!1,i}function we(){return Wn||(Wn=xe(0))}function ke(e,t,n){var r,i;if(e._root){var o=l(gn),a=l(_n);if(r=Se(e._root,e.__ownerID,0,void 0,t,n,o,a),!a.value)return e;i=e.size+(o.value?n===yn?-1:1:0)}else{if(n===yn)return e;i=1,r=new he(e.__ownerID,[[t,n]])}return e.__ownerID?(e.size=i,e._root=r,e.__hash=void 0,e.__altered=!0,e):r?xe(i,r):we()}function Se(e,t,n,r,i,o,a,s){return e?e.update(t,n,r,i,o,a,s):o===yn?e:(p(s),p(a),new ye(t,r,[i,o]))}function Ee(e){return e.constructor===ye||e.constructor===ve}function Ce(e,t,n,r,i){if(e.keyHash===r)return new ve(t,r,[e.entry,i]);var o,a=(0===n?e.keyHash:e.keyHash>>>n)&vn,s=(0===n?r:r>>>n)&vn,u=a===s?[Ce(e,t,n+dn,r,i)]:(o=new ye(t,r,i),a<s?[e,o]:[o,e]);return new de(t,1<<a|1<<s,u)}function Ae(e,t,n,r){e||(e=new f);for(var i=new ye(e,oe(n),[n,r]),o=0;o<t.length;o++){var a=t[o];i=i.update(e,0,void 0,a[0],a[1])}return i}function Te(e,t,n,r){for(var i=0,o=0,a=new Array(n),s=0,u=1,c=t.length;s<c;s++,u<<=1){var l=t[s];void 0!==l&&s!==r&&(i|=u,a[o++]=l)}return new de(e,i,a)}function De(e,t,n,r,i){for(var o=0,a=new Array(mn),s=0;0!==n;s++,n>>>=1)a[s]=1&n?t[o++]:void 0;return a[r]=i,new me(e,o+1,a)}function Me(e,t,r){for(var i=[],a=0;a<r.length;a++){var s=r[a],u=n(s);o(s)||(u=u.map(function(e){return V(e)})),i.push(u)}return Ie(e,t,i)}function Oe(e,t,n){return e&&e.mergeDeep&&o(t)?e.mergeDeep(t):X(e,t)?e:t}function Pe(e){return function(t,n,r){if(t&&t.mergeDeepWith&&o(n))return t.mergeDeepWith(e,n);var i=e(t,n,r);return X(t,i)?t:i}}function Ie(e,t,n){return n=n.filter(function(e){return 0!==e.size}),0===n.length?e:0!==e.size||e.__ownerID||1!==n.length?e.withMutations(function(e){for(var r=t?function(n,r){e.update(r,yn,function(e){return e===yn?n:t(e,n,r)})}:function(t,n){e.set(n,t)},i=0;i<n.length;i++)n[i].forEach(r)}):e.constructor(n[0])}function Ne(e,t,n,r){var i=e===yn,o=t.next();if(o.done){var a=i?n:e,s=r(a);return s===a?e:s}Z(i||e&&e.set,\"invalid keyPath\");var u=o.value,c=i?yn:e.get(u,yn),l=Ne(c,t,n,r);return l===c?e:l===yn?e.remove(u):(i?we():e).set(u,l)}function Re(e){return e-=e>>1&1431655765,e=(858993459&e)+(e>>2&858993459),e=e+(e>>4)&252645135,e+=e>>8,e+=e>>16,127&e}function je(e,t,n,r){var i=r?e:h(e);return i[t]=n,i}function Fe(e,t,n,r){var i=e.length+1;if(r&&t+1===i)return e[t]=n,e;for(var o=new Array(i),a=0,s=0;s<i;s++)s===t?(o[s]=n,a=-1):o[s]=e[s+a];return o}function Be(e,t,n){var r=e.length-1;if(n&&t===r)return e.pop(),e;for(var i=new Array(r),o=0,a=0;a<r;a++)a===t&&(o=1),i[a]=e[a+o];return i}function Le(e){var t=Ke();if(null===e||void 0===e)return t;if(ze(e))return e;var n=r(e),i=n.size;return 0===i?t:(le(i),i>0&&i<mn?We(0,i,dn,null,new qe(n.toArray())):t.withMutations(function(e){e.setSize(i),n.forEach(function(t,n){return e.set(n,t)})}))}function ze(e){return!(!e||!e[Jn])}function qe(e,t){this.array=e,this.ownerID=t}function Ue(e,t){function n(e,t,n){return 0===t?r(e,n):i(e,t,n)}function r(e,n){var r=n===s?u&&u.array:e&&e.array,i=n>o?0:o-n,c=a-n;return c>mn&&(c=mn),function(){if(i===c)return Yn;var e=t?--c:i++;return r&&r[e]}}function i(e,r,i){var s,u=e&&e.array,c=i>o?0:o-i>>r,l=(a-i>>r)+1;return l>mn&&(l=mn),function(){for(;;){if(s){var e=s();if(e!==Yn)return e;s=null}if(c===l)return Yn;var o=t?--l:c++;s=n(u&&u[o],r-dn,i+(o<<r))}}}var o=e._origin,a=e._capacity,s=$e(a),u=e._tail;return n(e._root,e._level,0)}function We(e,t,n,r,i,o,a){var s=Object.create(Gn);return s.size=t-e,s._origin=e,s._capacity=t,s._level=n,s._root=r,s._tail=i,s.__ownerID=o,s.__hash=a,s.__altered=!1,s}function Ke(){return Xn||(Xn=We(0,0,dn))}function Ve(e,t,n){if(t=m(e,t),t!==t)return e;if(t>=e.size||t<0)return e.withMutations(function(e){t<0?Xe(e,t).set(0,n):Xe(e,0,t+1).set(t,n)});t+=e._origin;var r=e._tail,i=e._root,o=l(_n);return t>=$e(e._capacity)?r=He(r,e.__ownerID,0,t,n,o):i=He(i,e.__ownerID,e._level,t,n,o),o.value?e.__ownerID?(e._root=i,e._tail=r,e.__hash=void 0,e.__altered=!0,e):We(e._origin,e._capacity,e._level,i,r):e}function He(e,t,n,r,i,o){var a=r>>>n&vn,s=e&&a<e.array.length;if(!s&&void 0===i)return e;var u;if(n>0){var c=e&&e.array[a],l=He(c,t,n-dn,r,i,o);return l===c?e:(u=Je(e,t),u.array[a]=l,u)}return s&&e.array[a]===i?e:(p(o),u=Je(e,t),void 0===i&&a===u.array.length-1?u.array.pop():u.array[a]=i,u)}function Je(e,t){return t&&e&&t===e.ownerID?e:new qe(e?e.array.slice():[],t)}function Ge(e,t){if(t>=$e(e._capacity))return e._tail;if(t<1<<e._level+dn){for(var n=e._root,r=e._level;n&&r>0;)n=n.array[t>>>r&vn],r-=dn;return n}}function Xe(e,t,n){void 0!==t&&(t|=0),void 0!==n&&(n|=0);var r=e.__ownerID||new f,i=e._origin,o=e._capacity,a=i+t,s=void 0===n?o:n<0?o+n:i+n;if(a===i&&s===o)return e;if(a>=s)return e.clear();for(var u=e._level,c=e._root,l=0;a+l<0;)c=new qe(c&&c.array.length?[void 0,c]:[],r),u+=dn,l+=1<<u;l&&(a+=l,i+=l,s+=l,o+=l);for(var p=$e(o),h=$e(s);h>=1<<u+dn;)c=new qe(c&&c.array.length?[c]:[],r),u+=dn;var d=e._tail,m=h<p?Ge(e,s-1):h>p?new qe([],r):d;if(d&&h>p&&a<o&&d.array.length){c=Je(c,r);for(var v=c,y=u;y>dn;y-=dn){var g=p>>>y&vn;v=v.array[g]=Je(v.array[g],r)}v.array[p>>>dn&vn]=d}if(s<o&&(m=m&&m.removeAfter(r,0,s)),a>=h)a-=h,s-=h,u=dn,c=null,m=m&&m.removeBefore(r,0,a);else if(a>i||h<p){for(l=0;c;){var _=a>>>u&vn;if(_!==h>>>u&vn)break;_&&(l+=(1<<u)*_),u-=dn,c=c.array[_]}c&&a>i&&(c=c.removeBefore(r,u,a-l)),c&&h<p&&(c=c.removeAfter(r,u,h-l)),l&&(a-=l,s-=l)}return e.__ownerID?(e.size=s-a,e._origin=a,e._capacity=s,e._level=u,e._root=c,e._tail=m,e.__hash=void 0,e.__altered=!0,e):We(a,s,u,c,m)}function Ye(e,t,n){for(var i=[],a=0,s=0;s<n.length;s++){var u=n[s],c=r(u);c.size>a&&(a=c.size),o(u)||(c=c.map(function(e){return V(e)})),i.push(c)}return a>e.size&&(e=e.setSize(a)),Ie(e,t,i)}function $e(e){return e<mn?0:e-1>>>dn<<dn}function Ze(e){return null===e||void 0===e?tt():Qe(e)?e:tt().withMutations(function(t){var r=n(e);le(r.size),r.forEach(function(e,n){return t.set(n,e)})})}function Qe(e){return fe(e)&&c(e)}function et(e,t,n,r){var i=Object.create(Ze.prototype);return i.size=e?e.size:0,i._map=e,i._list=t,i.__ownerID=n,i.__hash=r,i}function tt(){return $n||($n=et(we(),Ke()))}function nt(e,t,n){var r,i,o=e._map,a=e._list,s=o.get(t),u=void 0!==s;if(n===yn){if(!u)return e;a.size>=mn&&a.size>=2*o.size?(i=a.filter(function(e,t){return void 0!==e&&s!==t}),r=i.toKeyedSeq().map(function(e){return e[0]}).flip().toMap(),e.__ownerID&&(r.__ownerID=i.__ownerID=e.__ownerID)):(r=o.remove(t),i=s===a.size-1?a.pop():a.set(s,void 0))}else if(u){if(n===a.get(s)[1])return e;r=o,i=a.set(s,[t,n])}else r=o.set(t,a.size),i=a.set(a.size,[t,n]);return e.__ownerID?(e.size=r.size,e._map=r,e._list=i,e.__hash=void 0,e):et(r,i)}function rt(e,t){this._iter=e,this._useKeys=t,this.size=e.size}function it(e){this._iter=e,this.size=e.size}function ot(e){this._iter=e,this.size=e.size}function at(e){this._iter=e,this.size=e.size}function st(e){var t=Tt(e);return t._iter=e,t.size=e.size,t.flip=function(){return e},t.reverse=function(){var t=e.reverse.apply(this);return t.flip=function(){return e.reverse()},t},t.has=function(t){return e.includes(t)},t.includes=function(t){return e.has(t)},t.cacheResult=Dt,t.__iterateUncached=function(t,n){var r=this;return e.__iterate(function(e,n){return t(n,e,r)!==!1},n)},t.__iteratorUncached=function(t,n){if(t===wn){var r=e.__iterator(t,n);return new x(function(){var e=r.next();if(!e.done){var t=e.value[0];e.value[0]=e.value[1],e.value[1]=t}return e})}return e.__iterator(t===xn?bn:xn,n)},t}function ut(e,t,n){var r=Tt(e);return r.size=e.size,r.has=function(t){return e.has(t)},r.get=function(r,i){var o=e.get(r,yn);return o===yn?i:t.call(n,o,r,e)},r.__iterateUncached=function(r,i){var o=this;return e.__iterate(function(e,i,a){return r(t.call(n,e,i,a),i,o)!==!1},i)},r.__iteratorUncached=function(r,i){var o=e.__iterator(wn,i);return new x(function(){var i=o.next();if(i.done)return i;var a=i.value,s=a[0];return w(r,s,t.call(n,a[1],s,e),i)})},r}function ct(e,t){var n=Tt(e);return n._iter=e,n.size=e.size,n.reverse=function(){return e},e.flip&&(n.flip=function(){var t=st(e);return t.reverse=function(){return e.flip()},t}),n.get=function(n,r){return e.get(t?n:-1-n,r)},n.has=function(n){return e.has(t?n:-1-n)},n.includes=function(t){return e.includes(t)},n.cacheResult=Dt,n.__iterate=function(t,n){var r=this;return e.__iterate(function(e,n){return t(e,n,r)},!n)},n.__iterator=function(t,n){return e.__iterator(t,!n)},n}function lt(e,t,n,r){var i=Tt(e);return r&&(i.has=function(r){var i=e.get(r,yn);return i!==yn&&!!t.call(n,i,r,e)},i.get=function(r,i){var o=e.get(r,yn);return o!==yn&&t.call(n,o,r,e)?o:i}),i.__iterateUncached=function(i,o){var a=this,s=0;return e.__iterate(function(e,o,u){if(t.call(n,e,o,u))return s++,i(e,r?o:s-1,a)},o),s},i.__iteratorUncached=function(i,o){var a=e.__iterator(wn,o),s=0;return new x(function(){for(;;){var o=a.next();if(o.done)return o;var u=o.value,c=u[0],l=u[1];if(t.call(n,l,c,e))return w(i,r?c:s++,l,o)}})},i}function pt(e,t,n){var r=pe().asMutable();return e.__iterate(function(i,o){r.update(t.call(n,i,o,e),0,function(e){return e+1})}),r.asImmutable()}function ft(e,t,n){var r=a(e),i=(c(e)?Ze():pe()).asMutable();e.__iterate(function(o,a){i.update(t.call(n,o,a,e),function(e){return e=e||[],e.push(r?[a,o]:o),e})});var o=At(e);return i.map(function(t){return St(e,o(t))})}function ht(e,t,n,r){var i=e.size;if(void 0!==t&&(t|=0),void 0!==n&&(n===1/0?n=i:n|=0),y(t,n,i))return e;var o=g(t,i),a=_(n,i);if(o!==o||a!==a)return ht(e.toSeq().cacheResult(),t,n,r);var s,u=a-o;u===u&&(s=u<0?0:u);var c=Tt(e);return c.size=0===s?s:e.size&&s||void 0,!r&&F(e)&&s>=0&&(c.get=function(t,n){return t=m(this,t),t>=0&&t<s?e.get(t+o,n):n}),c.__iterateUncached=function(t,n){var i=this;if(0===s)return 0;if(n)return this.cacheResult().__iterate(t,n);var a=0,u=!0,c=0;return e.__iterate(function(e,n){if(!u||!(u=a++<o))return c++,t(e,r?n:c-1,i)!==!1&&c!==s}),c},c.__iteratorUncached=function(t,n){if(0!==s&&n)return this.cacheResult().__iterator(t,n);var i=0!==s&&e.__iterator(t,n),a=0,u=0;return new x(function(){for(;a++<o;)i.next();if(++u>s)return k();var e=i.next();return r||t===xn?e:t===bn?w(t,u-1,void 0,e):w(t,u-1,e.value[1],e)})},c}function dt(e,t,n){var r=Tt(e);return r.__iterateUncached=function(r,i){var o=this;if(i)return this.cacheResult().__iterate(r,i);var a=0;return e.__iterate(function(e,i,s){return t.call(n,e,i,s)&&++a&&r(e,i,o)}),a},r.__iteratorUncached=function(r,i){var o=this;if(i)return this.cacheResult().__iterator(r,i);var a=e.__iterator(wn,i),s=!0;return new x(function(){if(!s)return k();var e=a.next();if(e.done)return e;var i=e.value,u=i[0],c=i[1];return t.call(n,c,u,o)?r===wn?e:w(r,u,c,e):(s=!1,k())})},r}function mt(e,t,n,r){var i=Tt(e);return i.__iterateUncached=function(i,o){var a=this;if(o)return this.cacheResult().__iterate(i,o);var s=!0,u=0;return e.__iterate(function(e,o,c){if(!s||!(s=t.call(n,e,o,c)))return u++,i(e,r?o:u-1,a)}),u},i.__iteratorUncached=function(i,o){var a=this;if(o)return this.cacheResult().__iterator(i,o);var s=e.__iterator(wn,o),u=!0,c=0;return new x(function(){var e,o,l;do{if(e=s.next(),e.done)return r||i===xn?e:i===bn?w(i,c++,void 0,e):w(i,c++,e.value[1],e);var p=e.value;o=p[0],l=p[1],u&&(u=t.call(n,l,o,a))}while(u);return i===wn?e:w(i,o,l,e)})},i}function vt(e,t){var r=a(e),i=[e].concat(t).map(function(e){return o(e)?r&&(e=n(e)):e=r?L(e):z(Array.isArray(e)?e:[e]),e}).filter(function(e){return 0!==e.size});if(0===i.length)return e;if(1===i.length){var u=i[0];if(u===e||r&&a(u)||s(e)&&s(u))return u}var c=new I(i);return r?c=c.toKeyedSeq():s(e)||(c=c.toSetSeq()),c=c.flatten(!0),c.size=i.reduce(function(e,t){if(void 0!==e){var n=t.size;if(void 0!==n)return e+n}},0),c}function yt(e,t,n){var r=Tt(e);return r.__iterateUncached=function(r,i){function a(e,c){var l=this;e.__iterate(function(e,i){return(!t||c<t)&&o(e)?a(e,c+1):r(e,n?i:s++,l)===!1&&(u=!0),!u},i)}var s=0,u=!1;return a(e,0),s},r.__iteratorUncached=function(r,i){var a=e.__iterator(r,i),s=[],u=0;return new x(function(){for(;a;){var e=a.next();if(e.done===!1){var c=e.value;if(r===wn&&(c=c[1]),t&&!(s.length<t)||!o(c))return n?e:w(r,u++,c,e);s.push(a),a=c.__iterator(r,i)}else a=s.pop()}return k()})},r}function gt(e,t,n){var r=At(e);return e.toSeq().map(function(i,o){return r(t.call(n,i,o,e))}).flatten(!0)}function _t(e,t){var n=Tt(e);return n.size=e.size&&2*e.size-1,n.__iterateUncached=function(n,r){var i=this,o=0;return e.__iterate(function(e,r){return(!o||n(t,o++,i)!==!1)&&n(e,o++,i)!==!1},r),o},n.__iteratorUncached=function(n,r){var i,o=e.__iterator(xn,r),a=0;return new x(function(){return(!i||a%2)&&(i=o.next(),i.done)?i:a%2?w(n,a++,t):w(n,a++,i.value,i)})},n}function bt(e,t,n){t||(t=Mt);var r=a(e),i=0,o=e.toSeq().map(function(t,r){return[r,t,i++,n?n(t,r,e):t]}).toArray();return o.sort(function(e,n){return t(e[3],n[3])||e[2]-n[2]}).forEach(r?function(e,t){o[t].length=2}:function(e,t){o[t]=e[1]}),r?M(o):s(e)?O(o):P(o)}function xt(e,t,n){if(t||(t=Mt),n){var r=e.toSeq().map(function(t,r){return[t,n(t,r,e)]}).reduce(function(e,n){return wt(t,e[1],n[1])?n:e});return r&&r[0]}return e.reduce(function(e,n){return wt(t,e,n)?n:e})}function wt(e,t,n){var r=e(n,t);return 0===r&&n!==t&&(void 0===n||null===n||n!==n)||r>0}function kt(e,n,r){var i=Tt(e);return i.size=new I(r).map(function(e){return e.size}).min(),i.__iterate=function(e,t){for(var n,r=this.__iterator(xn,t),i=0;!(n=r.next()).done&&e(n.value,i++,this)!==!1;);return i},i.__iteratorUncached=function(e,i){var o=r.map(function(e){return e=t(e),C(i?e.reverse():e)}),a=0,s=!1;return new x(function(){var t;return s||(t=o.map(function(e){return e.next()}),s=t.some(function(e){return e.done})),s?k():w(e,a++,n.apply(null,t.map(function(e){return e.value})))})},i}function St(e,t){return F(e)?t:e.constructor(t)}function Et(e){if(e!==Object(e))throw new TypeError(\"Expected [K, V] tuple: \"+e)}function Ct(e){return le(e.size),d(e)}function At(e){return a(e)?n:s(e)?r:i}function Tt(e){return Object.create((a(e)?M:s(e)?O:P).prototype)}function Dt(){return this._iter.cacheResult?(this._iter.cacheResult(),this.size=this._iter.size,this):D.prototype.cacheResult.call(this)}function Mt(e,t){return e>t?1:e<t?-1:0}function Ot(e){var n=C(e);if(!n){if(!T(e))throw new TypeError(\"Expected iterable or array-like: \"+e);n=C(t(e))}return n}function Pt(e,t){var n,r=function(o){if(o instanceof r)return o;if(!(this instanceof r))return new r(o);if(!n){n=!0;var a=Object.keys(e);Rt(i,a),i.size=a.length,i._name=t,i._keys=a,i._defaultValues=e}this._map=pe(o)},i=r.prototype=Object.create(Zn);return i.constructor=r,r}function It(e,t,n){var r=Object.create(Object.getPrototypeOf(e));return r._map=t,r.__ownerID=n,r}function Nt(e){return e._name||e.constructor.name||\"Record\"}function Rt(e,t){try{t.forEach(jt.bind(void 0,e))}catch(e){}}function jt(e,t){Object.defineProperty(e,t,{get:function(){return this.get(t)},set:function(e){Z(this.__ownerID,\"Cannot set on an immutable record.\"),this.set(t,e)}})}function Ft(e){return null===e||void 0===e?qt():Bt(e)&&!c(e)?e:qt().withMutations(function(t){var n=i(e);le(n.size),n.forEach(function(e){return t.add(e)})})}function Bt(e){return!(!e||!e[Qn])}function Lt(e,t){return e.__ownerID?(e.size=t.size,e._map=t,e):t===e._map?e:0===t.size?e.__empty():e.__make(t)}function zt(e,t){var n=Object.create(er);return n.size=e?e.size:0,n._map=e,n.__ownerID=t,n}function qt(){return tr||(tr=zt(we()))}function Ut(e){return null===e||void 0===e?Vt():Wt(e)?e:Vt().withMutations(function(t){var n=i(e);le(n.size),n.forEach(function(e){return t.add(e)})})}function Wt(e){return Bt(e)&&c(e)}function Kt(e,t){var n=Object.create(nr);return n.size=e?e.size:0,n._map=e,n.__ownerID=t,n}function Vt(){return rr||(rr=Kt(tt()))}function Ht(e){return null===e||void 0===e?Xt():Jt(e)?e:Xt().unshiftAll(e)}function Jt(e){return!(!e||!e[ir])}function Gt(e,t,n,r){var i=Object.create(or);return i.size=e,i._head=t,i.__ownerID=n,i.__hash=r,i.__altered=!1,i}function Xt(){return ar||(ar=Gt(0))}function Yt(e,t){var n=function(n){e.prototype[n]=t[n]};return Object.keys(t).forEach(n),Object.getOwnPropertySymbols&&Object.getOwnPropertySymbols(t).forEach(n),e}function $t(e,t){return t}function Zt(e,t){return[t,e]}function Qt(e){return function(){return!e.apply(this,arguments)}}function en(e){return function(){return-e.apply(this,arguments)}}function tn(e){return\"string\"==typeof e?JSON.stringify(e):String(e)}function nn(){return h(arguments)}function rn(e,t){return e<t?1:e>t?-1:0}function on(e){if(e.size===1/0)return 0;var t=c(e),n=a(e),r=t?1:0,i=e.__iterate(n?t?function(e,t){r=31*r+sn(oe(e),oe(t))|0}:function(e,t){r=r+sn(oe(e),oe(t))|0}:t?function(e){r=31*r+oe(e)|0}:function(e){r=r+oe(e)|0});return an(i,r)}function an(e,t){return t=On(t,3432918353),t=On(t<<15|t>>>-15,461845907),t=On(t<<13|t>>>-13,5),t=(t+3864292196|0)^e,t=On(t^t>>>16,2246822507),t=On(t^t>>>13,3266489909),t=ie(t^t>>>16)}function sn(e,t){return e^t+2654435769+(e<<6)+(e>>2)|0}var un=Array.prototype.slice;e(n,t),e(r,t),e(i,t),t.isIterable=o,t.isKeyed=a,t.isIndexed=s,t.isAssociative=u,t.isOrdered=c,t.Keyed=n,t.Indexed=r,t.Set=i;var cn=\"@@__IMMUTABLE_ITERABLE__@@\",ln=\"@@__IMMUTABLE_KEYED__@@\",pn=\"@@__IMMUTABLE_INDEXED__@@\",fn=\"@@__IMMUTABLE_ORDERED__@@\",hn=\"delete\",dn=5,mn=1<<dn,vn=mn-1,yn={},gn={value:!1},_n={value:!1},bn=0,xn=1,wn=2,kn=\"function\"==typeof Symbol&&Symbol.iterator,Sn=\"@@iterator\",En=kn||Sn;x.prototype.toString=function(){return\"[Iterator]\"},x.KEYS=bn,x.VALUES=xn,x.ENTRIES=wn,x.prototype.inspect=x.prototype.toSource=function(){return this.toString()},x.prototype[En]=function(){return this},e(D,t),D.of=function(){return D(arguments)},D.prototype.toSeq=function(){return this},D.prototype.toString=function(){return this.__toString(\"Seq {\",\"}\")},D.prototype.cacheResult=function(){return!this._cache&&this.__iterateUncached&&(this._cache=this.entrySeq().toArray(),this.size=this._cache.length),this},D.prototype.__iterate=function(e,t){return W(this,e,t,!0)},D.prototype.__iterator=function(e,t){return K(this,e,t,!0)},e(M,D),M.prototype.toKeyedSeq=function(){return this},e(O,D),O.of=function(){return O(arguments)},O.prototype.toIndexedSeq=function(){return this},O.prototype.toString=function(){return this.__toString(\"Seq [\",\"]\")},O.prototype.__iterate=function(e,t){return W(this,e,t,!1)},O.prototype.__iterator=function(e,t){return K(this,e,t,!1)},e(P,D),P.of=function(){return P(arguments)},P.prototype.toSetSeq=function(){return this},D.isSeq=F,D.Keyed=M,D.Set=P,D.Indexed=O;var Cn=\"@@__IMMUTABLE_SEQ__@@\";D.prototype[Cn]=!0,e(I,O),I.prototype.get=function(e,t){return this.has(e)?this._array[m(this,e)]:t},I.prototype.__iterate=function(e,t){for(var n=this._array,r=n.length-1,i=0;i<=r;i++)if(e(n[t?r-i:i],i,this)===!1)return i+1;return i},I.prototype.__iterator=function(e,t){var n=this._array,r=n.length-1,i=0;return new x(function(){return i>r?k():w(e,i,n[t?r-i++:i++])})},e(N,M),N.prototype.get=function(e,t){return void 0===t||this.has(e)?this._object[e]:t},N.prototype.has=function(e){return this._object.hasOwnProperty(e)},N.prototype.__iterate=function(e,t){for(var n=this._object,r=this._keys,i=r.length-1,o=0;o<=i;o++){var a=r[t?i-o:o];if(e(n[a],a,this)===!1)return o+1}return o},N.prototype.__iterator=function(e,t){var n=this._object,r=this._keys,i=r.length-1,o=0;return new x(function(){var a=r[t?i-o:o];return o++>i?k():w(e,a,n[a])})},N.prototype[fn]=!0,\ne(R,O),R.prototype.__iterateUncached=function(e,t){if(t)return this.cacheResult().__iterate(e,t);var n=this._iterable,r=C(n),i=0;if(E(r))for(var o;!(o=r.next()).done&&e(o.value,i++,this)!==!1;);return i},R.prototype.__iteratorUncached=function(e,t){if(t)return this.cacheResult().__iterator(e,t);var n=this._iterable,r=C(n);if(!E(r))return new x(k);var i=0;return new x(function(){var t=r.next();return t.done?t:w(e,i++,t.value)})},e(j,O),j.prototype.__iterateUncached=function(e,t){if(t)return this.cacheResult().__iterate(e,t);for(var n=this._iterator,r=this._iteratorCache,i=0;i<r.length;)if(e(r[i],i++,this)===!1)return i;for(var o;!(o=n.next()).done;){var a=o.value;if(r[i]=a,e(a,i++,this)===!1)break}return i},j.prototype.__iteratorUncached=function(e,t){if(t)return this.cacheResult().__iterator(e,t);var n=this._iterator,r=this._iteratorCache,i=0;return new x(function(){if(i>=r.length){var t=n.next();if(t.done)return t;r[i]=t.value}return w(e,i,r[i++])})};var An;e($,O),$.prototype.toString=function(){return 0===this.size?\"Repeat []\":\"Repeat [ \"+this._value+\" \"+this.size+\" times ]\"},$.prototype.get=function(e,t){return this.has(e)?this._value:t},$.prototype.includes=function(e){return X(this._value,e)},$.prototype.slice=function(e,t){var n=this.size;return y(e,t,n)?this:new $(this._value,_(t,n)-g(e,n))},$.prototype.reverse=function(){return this},$.prototype.indexOf=function(e){return X(this._value,e)?0:-1},$.prototype.lastIndexOf=function(e){return X(this._value,e)?this.size:-1},$.prototype.__iterate=function(e,t){for(var n=0;n<this.size;n++)if(e(this._value,n,this)===!1)return n+1;return n},$.prototype.__iterator=function(e,t){var n=this,r=0;return new x(function(){return r<n.size?w(e,r++,n._value):k()})},$.prototype.equals=function(e){return e instanceof $?X(this._value,e._value):Y(e)};var Tn;e(Q,O),Q.prototype.toString=function(){return 0===this.size?\"Range []\":\"Range [ \"+this._start+\"...\"+this._end+(1!==this._step?\" by \"+this._step:\"\")+\" ]\"},Q.prototype.get=function(e,t){return this.has(e)?this._start+m(this,e)*this._step:t},Q.prototype.includes=function(e){var t=(e-this._start)/this._step;return t>=0&&t<this.size&&t===Math.floor(t)},Q.prototype.slice=function(e,t){return y(e,t,this.size)?this:(e=g(e,this.size),t=_(t,this.size),t<=e?new Q(0,0):new Q(this.get(e,this._end),this.get(t,this._end),this._step))},Q.prototype.indexOf=function(e){var t=e-this._start;if(t%this._step===0){var n=t/this._step;if(n>=0&&n<this.size)return n}return-1},Q.prototype.lastIndexOf=function(e){return this.indexOf(e)},Q.prototype.__iterate=function(e,t){for(var n=this.size-1,r=this._step,i=t?this._start+n*r:this._start,o=0;o<=n;o++){if(e(i,o,this)===!1)return o+1;i+=t?-r:r}return o},Q.prototype.__iterator=function(e,t){var n=this.size-1,r=this._step,i=t?this._start+n*r:this._start,o=0;return new x(function(){var a=i;return i+=t?-r:r,o>n?k():w(e,o++,a)})},Q.prototype.equals=function(e){return e instanceof Q?this._start===e._start&&this._end===e._end&&this._step===e._step:Y(this,e)};var Dn;e(ee,t),e(te,ee),e(ne,ee),e(re,ee),ee.Keyed=te,ee.Indexed=ne,ee.Set=re;var Mn,On=\"function\"==typeof Math.imul&&Math.imul(4294967295,2)===-2?Math.imul:function(e,t){e|=0,t|=0;var n=65535&e,r=65535&t;return n*r+((e>>>16)*r+n*(t>>>16)<<16>>>0)|0},Pn=Object.isExtensible,In=function(){try{return Object.defineProperty({},\"@\",{}),!0}catch(e){return!1}}(),Nn=\"function\"==typeof WeakMap;Nn&&(Mn=new WeakMap);var Rn=0,jn=\"__immutablehash__\";\"function\"==typeof Symbol&&(jn=Symbol(jn));var Fn=16,Bn=255,Ln=0,zn={};e(pe,te),pe.of=function(){var e=un.call(arguments,0);return we().withMutations(function(t){for(var n=0;n<e.length;n+=2){if(n+1>=e.length)throw new Error(\"Missing value for key: \"+e[n]);t.set(e[n],e[n+1])}})},pe.prototype.toString=function(){return this.__toString(\"Map {\",\"}\")},pe.prototype.get=function(e,t){return this._root?this._root.get(0,void 0,e,t):t},pe.prototype.set=function(e,t){return ke(this,e,t)},pe.prototype.setIn=function(e,t){return this.updateIn(e,yn,function(){return t})},pe.prototype.remove=function(e){return ke(this,e,yn)},pe.prototype.deleteIn=function(e){return this.updateIn(e,function(){return yn})},pe.prototype.update=function(e,t,n){return 1===arguments.length?e(this):this.updateIn([e],t,n)},pe.prototype.updateIn=function(e,t,n){n||(n=t,t=void 0);var r=Ne(this,Ot(e),t,n);return r===yn?void 0:r},pe.prototype.clear=function(){return 0===this.size?this:this.__ownerID?(this.size=0,this._root=null,this.__hash=void 0,this.__altered=!0,this):we()},pe.prototype.merge=function(){return Me(this,void 0,arguments)},pe.prototype.mergeWith=function(e){var t=un.call(arguments,1);return Me(this,e,t)},pe.prototype.mergeIn=function(e){var t=un.call(arguments,1);return this.updateIn(e,we(),function(e){return\"function\"==typeof e.merge?e.merge.apply(e,t):t[t.length-1]})},pe.prototype.mergeDeep=function(){return Me(this,Oe,arguments)},pe.prototype.mergeDeepWith=function(e){var t=un.call(arguments,1);return Me(this,Pe(e),t)},pe.prototype.mergeDeepIn=function(e){var t=un.call(arguments,1);return this.updateIn(e,we(),function(e){return\"function\"==typeof e.mergeDeep?e.mergeDeep.apply(e,t):t[t.length-1]})},pe.prototype.sort=function(e){return Ze(bt(this,e))},pe.prototype.sortBy=function(e,t){return Ze(bt(this,t,e))},pe.prototype.withMutations=function(e){var t=this.asMutable();return e(t),t.wasAltered()?t.__ensureOwner(this.__ownerID):this},pe.prototype.asMutable=function(){return this.__ownerID?this:this.__ensureOwner(new f)},pe.prototype.asImmutable=function(){return this.__ensureOwner()},pe.prototype.wasAltered=function(){return this.__altered},pe.prototype.__iterator=function(e,t){return new ge(this,e,t)},pe.prototype.__iterate=function(e,t){var n=this,r=0;return this._root&&this._root.iterate(function(t){return r++,e(t[1],t[0],n)},t),r},pe.prototype.__ensureOwner=function(e){return e===this.__ownerID?this:e?xe(this.size,this._root,e,this.__hash):(this.__ownerID=e,this.__altered=!1,this)},pe.isMap=fe;var qn=\"@@__IMMUTABLE_MAP__@@\",Un=pe.prototype;Un[qn]=!0,Un[hn]=Un.remove,Un.removeIn=Un.deleteIn,he.prototype.get=function(e,t,n,r){for(var i=this.entries,o=0,a=i.length;o<a;o++)if(X(n,i[o][0]))return i[o][1];return r},he.prototype.update=function(e,t,n,r,i,o,a){for(var s=i===yn,u=this.entries,c=0,l=u.length;c<l&&!X(r,u[c][0]);c++);var f=c<l;if(f?u[c][1]===i:s)return this;if(p(a),(s||!f)&&p(o),!s||1!==u.length){if(!f&&!s&&u.length>=Kn)return Ae(e,u,r,i);var d=e&&e===this.ownerID,m=d?u:h(u);return f?s?c===l-1?m.pop():m[c]=m.pop():m[c]=[r,i]:m.push([r,i]),d?(this.entries=m,this):new he(e,m)}},de.prototype.get=function(e,t,n,r){void 0===t&&(t=oe(n));var i=1<<((0===e?t:t>>>e)&vn),o=this.bitmap;return 0===(o&i)?r:this.nodes[Re(o&i-1)].get(e+dn,t,n,r)},de.prototype.update=function(e,t,n,r,i,o,a){void 0===n&&(n=oe(r));var s=(0===t?n:n>>>t)&vn,u=1<<s,c=this.bitmap,l=0!==(c&u);if(!l&&i===yn)return this;var p=Re(c&u-1),f=this.nodes,h=l?f[p]:void 0,d=Se(h,e,t+dn,n,r,i,o,a);if(d===h)return this;if(!l&&d&&f.length>=Vn)return De(e,f,c,s,d);if(l&&!d&&2===f.length&&Ee(f[1^p]))return f[1^p];if(l&&d&&1===f.length&&Ee(d))return d;var m=e&&e===this.ownerID,v=l?d?c:c^u:c|u,y=l?d?je(f,p,d,m):Be(f,p,m):Fe(f,p,d,m);return m?(this.bitmap=v,this.nodes=y,this):new de(e,v,y)},me.prototype.get=function(e,t,n,r){void 0===t&&(t=oe(n));var i=(0===e?t:t>>>e)&vn,o=this.nodes[i];return o?o.get(e+dn,t,n,r):r},me.prototype.update=function(e,t,n,r,i,o,a){void 0===n&&(n=oe(r));var s=(0===t?n:n>>>t)&vn,u=i===yn,c=this.nodes,l=c[s];if(u&&!l)return this;var p=Se(l,e,t+dn,n,r,i,o,a);if(p===l)return this;var f=this.count;if(l){if(!p&&(f--,f<Hn))return Te(e,c,f,s)}else f++;var h=e&&e===this.ownerID,d=je(c,s,p,h);return h?(this.count=f,this.nodes=d,this):new me(e,f,d)},ve.prototype.get=function(e,t,n,r){for(var i=this.entries,o=0,a=i.length;o<a;o++)if(X(n,i[o][0]))return i[o][1];return r},ve.prototype.update=function(e,t,n,r,i,o,a){void 0===n&&(n=oe(r));var s=i===yn;if(n!==this.keyHash)return s?this:(p(a),p(o),Ce(this,e,t,n,[r,i]));for(var u=this.entries,c=0,l=u.length;c<l&&!X(r,u[c][0]);c++);var f=c<l;if(f?u[c][1]===i:s)return this;if(p(a),(s||!f)&&p(o),s&&2===l)return new ye(e,this.keyHash,u[1^c]);var d=e&&e===this.ownerID,m=d?u:h(u);return f?s?c===l-1?m.pop():m[c]=m.pop():m[c]=[r,i]:m.push([r,i]),d?(this.entries=m,this):new ve(e,this.keyHash,m)},ye.prototype.get=function(e,t,n,r){return X(n,this.entry[0])?this.entry[1]:r},ye.prototype.update=function(e,t,n,r,i,o,a){var s=i===yn,u=X(r,this.entry[0]);return(u?i===this.entry[1]:s)?this:(p(a),s?void p(o):u?e&&e===this.ownerID?(this.entry[1]=i,this):new ye(e,this.keyHash,[r,i]):(p(o),Ce(this,e,t,oe(r),[r,i])))},he.prototype.iterate=ve.prototype.iterate=function(e,t){for(var n=this.entries,r=0,i=n.length-1;r<=i;r++)if(e(n[t?i-r:r])===!1)return!1},de.prototype.iterate=me.prototype.iterate=function(e,t){for(var n=this.nodes,r=0,i=n.length-1;r<=i;r++){var o=n[t?i-r:r];if(o&&o.iterate(e,t)===!1)return!1}},ye.prototype.iterate=function(e,t){return e(this.entry)},e(ge,x),ge.prototype.next=function(){for(var e=this._type,t=this._stack;t;){var n,r=t.node,i=t.index++;if(r.entry){if(0===i)return _e(e,r.entry)}else if(r.entries){if(n=r.entries.length-1,i<=n)return _e(e,r.entries[this._reverse?n-i:i])}else if(n=r.nodes.length-1,i<=n){var o=r.nodes[this._reverse?n-i:i];if(o){if(o.entry)return _e(e,o.entry);t=this._stack=be(o,t)}continue}t=this._stack=this._stack.__prev}return k()};var Wn,Kn=mn/4,Vn=mn/2,Hn=mn/4;e(Le,ne),Le.of=function(){return this(arguments)},Le.prototype.toString=function(){return this.__toString(\"List [\",\"]\")},Le.prototype.get=function(e,t){if(e=m(this,e),e>=0&&e<this.size){e+=this._origin;var n=Ge(this,e);return n&&n.array[e&vn]}return t},Le.prototype.set=function(e,t){return Ve(this,e,t)},Le.prototype.remove=function(e){return this.has(e)?0===e?this.shift():e===this.size-1?this.pop():this.splice(e,1):this},Le.prototype.insert=function(e,t){return this.splice(e,0,t)},Le.prototype.clear=function(){return 0===this.size?this:this.__ownerID?(this.size=this._origin=this._capacity=0,this._level=dn,this._root=this._tail=null,this.__hash=void 0,this.__altered=!0,this):Ke()},Le.prototype.push=function(){var e=arguments,t=this.size;return this.withMutations(function(n){Xe(n,0,t+e.length);for(var r=0;r<e.length;r++)n.set(t+r,e[r])})},Le.prototype.pop=function(){return Xe(this,0,-1)},Le.prototype.unshift=function(){var e=arguments;return this.withMutations(function(t){Xe(t,-e.length);for(var n=0;n<e.length;n++)t.set(n,e[n])})},Le.prototype.shift=function(){return Xe(this,1)},Le.prototype.merge=function(){return Ye(this,void 0,arguments)},Le.prototype.mergeWith=function(e){var t=un.call(arguments,1);return Ye(this,e,t)},Le.prototype.mergeDeep=function(){return Ye(this,Oe,arguments)},Le.prototype.mergeDeepWith=function(e){var t=un.call(arguments,1);return Ye(this,Pe(e),t)},Le.prototype.setSize=function(e){return Xe(this,0,e)},Le.prototype.slice=function(e,t){var n=this.size;return y(e,t,n)?this:Xe(this,g(e,n),_(t,n))},Le.prototype.__iterator=function(e,t){var n=0,r=Ue(this,t);return new x(function(){var t=r();return t===Yn?k():w(e,n++,t)})},Le.prototype.__iterate=function(e,t){for(var n,r=0,i=Ue(this,t);(n=i())!==Yn&&e(n,r++,this)!==!1;);return r},Le.prototype.__ensureOwner=function(e){return e===this.__ownerID?this:e?We(this._origin,this._capacity,this._level,this._root,this._tail,e,this.__hash):(this.__ownerID=e,this)},Le.isList=ze;var Jn=\"@@__IMMUTABLE_LIST__@@\",Gn=Le.prototype;Gn[Jn]=!0,Gn[hn]=Gn.remove,Gn.setIn=Un.setIn,Gn.deleteIn=Gn.removeIn=Un.removeIn,Gn.update=Un.update,Gn.updateIn=Un.updateIn,Gn.mergeIn=Un.mergeIn,Gn.mergeDeepIn=Un.mergeDeepIn,Gn.withMutations=Un.withMutations,Gn.asMutable=Un.asMutable,Gn.asImmutable=Un.asImmutable,Gn.wasAltered=Un.wasAltered,qe.prototype.removeBefore=function(e,t,n){if(n===t?1<<t:0===this.array.length)return this;var r=n>>>t&vn;if(r>=this.array.length)return new qe([],e);var i,o=0===r;if(t>0){var a=this.array[r];if(i=a&&a.removeBefore(e,t-dn,n),i===a&&o)return this}if(o&&!i)return this;var s=Je(this,e);if(!o)for(var u=0;u<r;u++)s.array[u]=void 0;return i&&(s.array[r]=i),s},qe.prototype.removeAfter=function(e,t,n){if(n===(t?1<<t:0)||0===this.array.length)return this;var r=n-1>>>t&vn;if(r>=this.array.length)return this;var i;if(t>0){var o=this.array[r];if(i=o&&o.removeAfter(e,t-dn,n),i===o&&r===this.array.length-1)return this}var a=Je(this,e);return a.array.splice(r+1),i&&(a.array[r]=i),a};var Xn,Yn={};e(Ze,pe),Ze.of=function(){return this(arguments)},Ze.prototype.toString=function(){return this.__toString(\"OrderedMap {\",\"}\")},Ze.prototype.get=function(e,t){var n=this._map.get(e);return void 0!==n?this._list.get(n)[1]:t},Ze.prototype.clear=function(){return 0===this.size?this:this.__ownerID?(this.size=0,this._map.clear(),this._list.clear(),this):tt()},Ze.prototype.set=function(e,t){return nt(this,e,t)},Ze.prototype.remove=function(e){return nt(this,e,yn)},Ze.prototype.wasAltered=function(){return this._map.wasAltered()||this._list.wasAltered()},Ze.prototype.__iterate=function(e,t){var n=this;return this._list.__iterate(function(t){return t&&e(t[1],t[0],n)},t)},Ze.prototype.__iterator=function(e,t){return this._list.fromEntrySeq().__iterator(e,t)},Ze.prototype.__ensureOwner=function(e){if(e===this.__ownerID)return this;var t=this._map.__ensureOwner(e),n=this._list.__ensureOwner(e);return e?et(t,n,e,this.__hash):(this.__ownerID=e,this._map=t,this._list=n,this)},Ze.isOrderedMap=Qe,Ze.prototype[fn]=!0,Ze.prototype[hn]=Ze.prototype.remove;var $n;e(rt,M),rt.prototype.get=function(e,t){return this._iter.get(e,t)},rt.prototype.has=function(e){return this._iter.has(e)},rt.prototype.valueSeq=function(){return this._iter.valueSeq()},rt.prototype.reverse=function(){var e=this,t=ct(this,!0);return this._useKeys||(t.valueSeq=function(){return e._iter.toSeq().reverse()}),t},rt.prototype.map=function(e,t){var n=this,r=ut(this,e,t);return this._useKeys||(r.valueSeq=function(){return n._iter.toSeq().map(e,t)}),r},rt.prototype.__iterate=function(e,t){var n,r=this;return this._iter.__iterate(this._useKeys?function(t,n){return e(t,n,r)}:(n=t?Ct(this):0,function(i){return e(i,t?--n:n++,r)}),t)},rt.prototype.__iterator=function(e,t){if(this._useKeys)return this._iter.__iterator(e,t);var n=this._iter.__iterator(xn,t),r=t?Ct(this):0;return new x(function(){var i=n.next();return i.done?i:w(e,t?--r:r++,i.value,i)})},rt.prototype[fn]=!0,e(it,O),it.prototype.includes=function(e){return this._iter.includes(e)},it.prototype.__iterate=function(e,t){var n=this,r=0;return this._iter.__iterate(function(t){return e(t,r++,n)},t)},it.prototype.__iterator=function(e,t){var n=this._iter.__iterator(xn,t),r=0;return new x(function(){var t=n.next();return t.done?t:w(e,r++,t.value,t)})},e(ot,P),ot.prototype.has=function(e){return this._iter.includes(e)},ot.prototype.__iterate=function(e,t){var n=this;return this._iter.__iterate(function(t){return e(t,t,n)},t)},ot.prototype.__iterator=function(e,t){var n=this._iter.__iterator(xn,t);return new x(function(){var t=n.next();return t.done?t:w(e,t.value,t.value,t)})},e(at,M),at.prototype.entrySeq=function(){return this._iter.toSeq()},at.prototype.__iterate=function(e,t){var n=this;return this._iter.__iterate(function(t){if(t){Et(t);var r=o(t);return e(r?t.get(1):t[1],r?t.get(0):t[0],n)}},t)},at.prototype.__iterator=function(e,t){var n=this._iter.__iterator(xn,t);return new x(function(){for(;;){var t=n.next();if(t.done)return t;var r=t.value;if(r){Et(r);var i=o(r);return w(e,i?r.get(0):r[0],i?r.get(1):r[1],t)}}})},it.prototype.cacheResult=rt.prototype.cacheResult=ot.prototype.cacheResult=at.prototype.cacheResult=Dt,e(Pt,te),Pt.prototype.toString=function(){return this.__toString(Nt(this)+\" {\",\"}\")},Pt.prototype.has=function(e){return this._defaultValues.hasOwnProperty(e)},Pt.prototype.get=function(e,t){if(!this.has(e))return t;var n=this._defaultValues[e];return this._map?this._map.get(e,n):n},Pt.prototype.clear=function(){if(this.__ownerID)return this._map&&this._map.clear(),this;var e=this.constructor;return e._empty||(e._empty=It(this,we()))},Pt.prototype.set=function(e,t){if(!this.has(e))throw new Error('Cannot set unknown key \"'+e+'\" on '+Nt(this));if(this._map&&!this._map.has(e)){var n=this._defaultValues[e];if(t===n)return this}var r=this._map&&this._map.set(e,t);return this.__ownerID||r===this._map?this:It(this,r)},Pt.prototype.remove=function(e){if(!this.has(e))return this;var t=this._map&&this._map.remove(e);return this.__ownerID||t===this._map?this:It(this,t)},Pt.prototype.wasAltered=function(){return this._map.wasAltered()},Pt.prototype.__iterator=function(e,t){var r=this;return n(this._defaultValues).map(function(e,t){return r.get(t)}).__iterator(e,t)},Pt.prototype.__iterate=function(e,t){var r=this;return n(this._defaultValues).map(function(e,t){return r.get(t)}).__iterate(e,t)},Pt.prototype.__ensureOwner=function(e){if(e===this.__ownerID)return this;var t=this._map&&this._map.__ensureOwner(e);return e?It(this,t,e):(this.__ownerID=e,this._map=t,this)};var Zn=Pt.prototype;Zn[hn]=Zn.remove,Zn.deleteIn=Zn.removeIn=Un.removeIn,Zn.merge=Un.merge,Zn.mergeWith=Un.mergeWith,Zn.mergeIn=Un.mergeIn,Zn.mergeDeep=Un.mergeDeep,Zn.mergeDeepWith=Un.mergeDeepWith,Zn.mergeDeepIn=Un.mergeDeepIn,Zn.setIn=Un.setIn,Zn.update=Un.update,Zn.updateIn=Un.updateIn,Zn.withMutations=Un.withMutations,Zn.asMutable=Un.asMutable,Zn.asImmutable=Un.asImmutable,e(Ft,re),Ft.of=function(){return this(arguments)},Ft.fromKeys=function(e){return this(n(e).keySeq())},Ft.prototype.toString=function(){return this.__toString(\"Set {\",\"}\")},Ft.prototype.has=function(e){return this._map.has(e)},Ft.prototype.add=function(e){return Lt(this,this._map.set(e,!0))},Ft.prototype.remove=function(e){return Lt(this,this._map.remove(e))},Ft.prototype.clear=function(){return Lt(this,this._map.clear())},Ft.prototype.union=function(){var e=un.call(arguments,0);return e=e.filter(function(e){return 0!==e.size}),0===e.length?this:0!==this.size||this.__ownerID||1!==e.length?this.withMutations(function(t){for(var n=0;n<e.length;n++)i(e[n]).forEach(function(e){return t.add(e)})}):this.constructor(e[0])},Ft.prototype.intersect=function(){var e=un.call(arguments,0);if(0===e.length)return this;e=e.map(function(e){return i(e)});var t=this;return this.withMutations(function(n){t.forEach(function(t){e.every(function(e){return e.includes(t)})||n.remove(t)})})},Ft.prototype.subtract=function(){var e=un.call(arguments,0);if(0===e.length)return this;e=e.map(function(e){return i(e)});var t=this;return this.withMutations(function(n){t.forEach(function(t){e.some(function(e){return e.includes(t)})&&n.remove(t)})})},Ft.prototype.merge=function(){return this.union.apply(this,arguments)},Ft.prototype.mergeWith=function(e){var t=un.call(arguments,1);return this.union.apply(this,t)},Ft.prototype.sort=function(e){return Ut(bt(this,e))},Ft.prototype.sortBy=function(e,t){return Ut(bt(this,t,e))},Ft.prototype.wasAltered=function(){return this._map.wasAltered()},Ft.prototype.__iterate=function(e,t){var n=this;return this._map.__iterate(function(t,r){return e(r,r,n)},t)},Ft.prototype.__iterator=function(e,t){return this._map.map(function(e,t){return t}).__iterator(e,t)},Ft.prototype.__ensureOwner=function(e){if(e===this.__ownerID)return this;var t=this._map.__ensureOwner(e);return e?this.__make(t,e):(this.__ownerID=e,this._map=t,this)},Ft.isSet=Bt;var Qn=\"@@__IMMUTABLE_SET__@@\",er=Ft.prototype;er[Qn]=!0,er[hn]=er.remove,er.mergeDeep=er.merge,er.mergeDeepWith=er.mergeWith,er.withMutations=Un.withMutations,er.asMutable=Un.asMutable,er.asImmutable=Un.asImmutable,er.__empty=qt,er.__make=zt;var tr;e(Ut,Ft),Ut.of=function(){return this(arguments)},Ut.fromKeys=function(e){return this(n(e).keySeq())},Ut.prototype.toString=function(){return this.__toString(\"OrderedSet {\",\"}\")},Ut.isOrderedSet=Wt;var nr=Ut.prototype;nr[fn]=!0,nr.__empty=Vt,nr.__make=Kt;var rr;e(Ht,ne),Ht.of=function(){return this(arguments)},Ht.prototype.toString=function(){return this.__toString(\"Stack [\",\"]\")},Ht.prototype.get=function(e,t){var n=this._head;for(e=m(this,e);n&&e--;)n=n.next;return n?n.value:t},Ht.prototype.peek=function(){return this._head&&this._head.value},Ht.prototype.push=function(){if(0===arguments.length)return this;for(var e=this.size+arguments.length,t=this._head,n=arguments.length-1;n>=0;n--)t={value:arguments[n],next:t};return this.__ownerID?(this.size=e,this._head=t,this.__hash=void 0,this.__altered=!0,this):Gt(e,t)},Ht.prototype.pushAll=function(e){if(e=r(e),0===e.size)return this;le(e.size);var t=this.size,n=this._head;return e.reverse().forEach(function(e){t++,n={value:e,next:n}}),this.__ownerID?(this.size=t,this._head=n,this.__hash=void 0,this.__altered=!0,this):Gt(t,n)},Ht.prototype.pop=function(){return this.slice(1)},Ht.prototype.unshift=function(){return this.push.apply(this,arguments)},Ht.prototype.unshiftAll=function(e){return this.pushAll(e)},Ht.prototype.shift=function(){return this.pop.apply(this,arguments)},Ht.prototype.clear=function(){return 0===this.size?this:this.__ownerID?(this.size=0,this._head=void 0,this.__hash=void 0,this.__altered=!0,this):Xt()},Ht.prototype.slice=function(e,t){if(y(e,t,this.size))return this;var n=g(e,this.size),r=_(t,this.size);if(r!==this.size)return ne.prototype.slice.call(this,e,t);for(var i=this.size-n,o=this._head;n--;)o=o.next;return this.__ownerID?(this.size=i,this._head=o,this.__hash=void 0,this.__altered=!0,this):Gt(i,o)},Ht.prototype.__ensureOwner=function(e){return e===this.__ownerID?this:e?Gt(this.size,this._head,e,this.__hash):(this.__ownerID=e,this.__altered=!1,this)},Ht.prototype.__iterate=function(e,t){if(t)return this.reverse().__iterate(e);for(var n=0,r=this._head;r&&e(r.value,n++,this)!==!1;)r=r.next;return n},Ht.prototype.__iterator=function(e,t){if(t)return this.reverse().__iterator(e);var n=0,r=this._head;return new x(function(){if(r){var t=r.value;return r=r.next,w(e,n++,t)}return k()})},Ht.isStack=Jt;var ir=\"@@__IMMUTABLE_STACK__@@\",or=Ht.prototype;or[ir]=!0,or.withMutations=Un.withMutations,or.asMutable=Un.asMutable,or.asImmutable=Un.asImmutable,or.wasAltered=Un.wasAltered;var ar;t.Iterator=x,Yt(t,{toArray:function(){le(this.size);var e=new Array(this.size||0);return this.valueSeq().__iterate(function(t,n){e[n]=t}),e},toIndexedSeq:function(){return new it(this)},toJS:function(){return this.toSeq().map(function(e){return e&&\"function\"==typeof e.toJS?e.toJS():e}).__toJS()},toJSON:function(){return this.toSeq().map(function(e){return e&&\"function\"==typeof e.toJSON?e.toJSON():e}).__toJS()},toKeyedSeq:function(){return new rt(this,!0)},toMap:function(){return pe(this.toKeyedSeq())},toObject:function(){le(this.size);var e={};return this.__iterate(function(t,n){e[n]=t}),e},toOrderedMap:function(){return Ze(this.toKeyedSeq())},toOrderedSet:function(){return Ut(a(this)?this.valueSeq():this)},toSet:function(){return Ft(a(this)?this.valueSeq():this)},toSetSeq:function(){return new ot(this)},toSeq:function(){return s(this)?this.toIndexedSeq():a(this)?this.toKeyedSeq():this.toSetSeq()},toStack:function(){return Ht(a(this)?this.valueSeq():this)},toList:function(){return Le(a(this)?this.valueSeq():this)},toString:function(){return\"[Iterable]\"},__toString:function(e,t){return 0===this.size?e+t:e+\" \"+this.toSeq().map(this.__toStringMapper).join(\", \")+\" \"+t},concat:function(){var e=un.call(arguments,0);return St(this,vt(this,e))},includes:function(e){return this.some(function(t){return X(t,e)})},entries:function(){return this.__iterator(wn)},every:function(e,t){le(this.size);var n=!0;return this.__iterate(function(r,i,o){if(!e.call(t,r,i,o))return n=!1,!1}),n},filter:function(e,t){return St(this,lt(this,e,t,!0))},find:function(e,t,n){var r=this.findEntry(e,t);return r?r[1]:n},forEach:function(e,t){return le(this.size),this.__iterate(t?e.bind(t):e)},join:function(e){le(this.size),e=void 0!==e?\"\"+e:\",\";var t=\"\",n=!0;return this.__iterate(function(r){n?n=!1:t+=e,t+=null!==r&&void 0!==r?r.toString():\"\"}),t},keys:function(){return this.__iterator(bn)},map:function(e,t){return St(this,ut(this,e,t))},reduce:function(e,t,n){le(this.size);var r,i;return arguments.length<2?i=!0:r=t,this.__iterate(function(t,o,a){i?(i=!1,r=t):r=e.call(n,r,t,o,a)}),r},reduceRight:function(e,t,n){var r=this.toKeyedSeq().reverse();return r.reduce.apply(r,arguments)},reverse:function(){return St(this,ct(this,!0))},slice:function(e,t){return St(this,ht(this,e,t,!0))},some:function(e,t){return!this.every(Qt(e),t)},sort:function(e){return St(this,bt(this,e))},values:function(){return this.__iterator(xn)},butLast:function(){return this.slice(0,-1)},isEmpty:function(){return void 0!==this.size?0===this.size:!this.some(function(){return!0})},count:function(e,t){return d(e?this.toSeq().filter(e,t):this)},countBy:function(e,t){return pt(this,e,t)},equals:function(e){return Y(this,e)},entrySeq:function(){var e=this;if(e._cache)return new I(e._cache);var t=e.toSeq().map(Zt).toIndexedSeq();return t.fromEntrySeq=function(){return e.toSeq()},t},filterNot:function(e,t){return this.filter(Qt(e),t)},findEntry:function(e,t,n){var r=n;return this.__iterate(function(n,i,o){if(e.call(t,n,i,o))return r=[i,n],!1}),r},findKey:function(e,t){var n=this.findEntry(e,t);return n&&n[0]},findLast:function(e,t,n){return this.toKeyedSeq().reverse().find(e,t,n)},findLastEntry:function(e,t,n){return this.toKeyedSeq().reverse().findEntry(e,t,n)},findLastKey:function(e,t){return this.toKeyedSeq().reverse().findKey(e,t)},first:function(){return this.find(v)},flatMap:function(e,t){return St(this,gt(this,e,t))},flatten:function(e){return St(this,yt(this,e,!0))},fromEntrySeq:function(){return new at(this)},get:function(e,t){return this.find(function(t,n){return X(n,e)},void 0,t)},getIn:function(e,t){for(var n,r=this,i=Ot(e);!(n=i.next()).done;){var o=n.value;if(r=r&&r.get?r.get(o,yn):yn,r===yn)return t}return r},groupBy:function(e,t){return ft(this,e,t)},has:function(e){return this.get(e,yn)!==yn},hasIn:function(e){return this.getIn(e,yn)!==yn},isSubset:function(e){return e=\"function\"==typeof e.includes?e:t(e),this.every(function(t){return e.includes(t)})},isSuperset:function(e){return e=\"function\"==typeof e.isSubset?e:t(e),e.isSubset(this)},keyOf:function(e){return this.findKey(function(t){return X(t,e)})},keySeq:function(){return this.toSeq().map($t).toIndexedSeq()},last:function(){return this.toSeq().reverse().first()},lastKeyOf:function(e){return this.toKeyedSeq().reverse().keyOf(e)},max:function(e){return xt(this,e)},maxBy:function(e,t){return xt(this,t,e)},min:function(e){return xt(this,e?en(e):rn)},minBy:function(e,t){return xt(this,t?en(t):rn,e)},rest:function(){return this.slice(1)},skip:function(e){return this.slice(Math.max(0,e))},skipLast:function(e){return St(this,this.toSeq().reverse().skip(e).reverse())},skipWhile:function(e,t){return St(this,mt(this,e,t,!0))},skipUntil:function(e,t){return this.skipWhile(Qt(e),t)},sortBy:function(e,t){return St(this,bt(this,t,e))},take:function(e){return this.slice(0,Math.max(0,e))},takeLast:function(e){return St(this,this.toSeq().reverse().take(e).reverse())},takeWhile:function(e,t){return St(this,dt(this,e,t))},takeUntil:function(e,t){return this.takeWhile(Qt(e),t)},valueSeq:function(){return this.toIndexedSeq()},hashCode:function(){return this.__hash||(this.__hash=on(this))}});var sr=t.prototype;sr[cn]=!0,sr[En]=sr.values,sr.__toJS=sr.toArray,sr.__toStringMapper=tn,sr.inspect=sr.toSource=function(){return this.toString()},sr.chain=sr.flatMap,sr.contains=sr.includes,Yt(n,{flip:function(){return St(this,st(this))},mapEntries:function(e,t){var n=this,r=0;return St(this,this.toSeq().map(function(i,o){return e.call(t,[o,i],r++,n)}).fromEntrySeq())},mapKeys:function(e,t){var n=this;return St(this,this.toSeq().flip().map(function(r,i){return e.call(t,r,i,n)}).flip())}});var ur=n.prototype;ur[ln]=!0,ur[En]=sr.entries,ur.__toJS=sr.toObject,ur.__toStringMapper=function(e,t){return JSON.stringify(t)+\": \"+tn(e)},Yt(r,{toKeyedSeq:function(){return new rt(this,!1)},filter:function(e,t){return St(this,lt(this,e,t,!1))},findIndex:function(e,t){var n=this.findEntry(e,t);return n?n[0]:-1},indexOf:function(e){var t=this.keyOf(e);return void 0===t?-1:t},lastIndexOf:function(e){var t=this.lastKeyOf(e);return void 0===t?-1:t},reverse:function(){return St(this,ct(this,!1))},slice:function(e,t){return St(this,ht(this,e,t,!1))},splice:function(e,t){var n=arguments.length;if(t=Math.max(0|t,0),0===n||2===n&&!t)return this;e=g(e,e<0?this.count():this.size);var r=this.slice(0,e);return St(this,1===n?r:r.concat(h(arguments,2),this.slice(e+t)))},findLastIndex:function(e,t){var n=this.findLastEntry(e,t);return n?n[0]:-1},first:function(){return this.get(0)},flatten:function(e){return St(this,yt(this,e,!1))},get:function(e,t){return e=m(this,e),e<0||this.size===1/0||void 0!==this.size&&e>this.size?t:this.find(function(t,n){return n===e},void 0,t)},has:function(e){return e=m(this,e),e>=0&&(void 0!==this.size?this.size===1/0||e<this.size:this.indexOf(e)!==-1)},interpose:function(e){return St(this,_t(this,e))},interleave:function(){var e=[this].concat(h(arguments)),t=kt(this.toSeq(),O.of,e),n=t.flatten(!0);return t.size&&(n.size=t.size*e.length),St(this,n)},keySeq:function(){return Q(0,this.size)},last:function(){return this.get(-1)},skipWhile:function(e,t){return St(this,mt(this,e,t,!1))},zip:function(){var e=[this].concat(h(arguments));return St(this,kt(this,nn,e))},zipWith:function(e){var t=h(arguments);return t[0]=this,St(this,kt(this,e,t))}}),r.prototype[pn]=!0,r.prototype[fn]=!0,Yt(i,{get:function(e,t){return this.has(e)?e:t},includes:function(e){return this.has(e)},keySeq:function(){return this.valueSeq()}}),i.prototype.has=sr.includes,i.prototype.contains=i.prototype.includes,Yt(M,n.prototype),Yt(O,r.prototype),Yt(P,i.prototype),Yt(te,n.prototype),Yt(ne,r.prototype),Yt(re,i.prototype);var cr={Iterable:t,Seq:D,Collection:ee,Map:pe,OrderedMap:Ze,List:Le,Stack:Ht,Set:Ft,OrderedSet:Ut,Record:Pt,Range:Q,Repeat:$,is:X,fromJS:V};return cr})},function(e,t,n){\"use strict\";function r(e){return e&&e.__esModule?e:{default:e}}Object.defineProperty(t,\"__esModule\",{value:!0}),t.combineReducers=void 0;var i=n(170),o=r(i);t.combineReducers=o.default},function(e,t,n){\"use strict\";function r(e){return e&&e.__esModule?e:{default:e}}Object.defineProperty(t,\"__esModule\",{value:!0});var i=n(168),o=r(i),a=n(171);t.default=function(e){var t=Object.keys(e);return function(){var n=arguments.length<=0||void 0===arguments[0]?o.default.Map():arguments[0],r=arguments[1];return n.withMutations(function(n){t.forEach(function(t){var i=e[t],o=n.get(t),s=i(o,r);(0,a.validateNextState)(s,t,r),n.set(t,s)})})}},e.exports=t.default},function(e,t,n){\"use strict\";\"create index\";function r(e){return e&&e.__esModule?e:{default:e}}Object.defineProperty(t,\"__esModule\",{value:!0}),t.validateNextState=t.getUnexpectedInvocationParameterMessage=t.getStateName=void 0;var i=n(172),o=r(i),a=n(173),s=r(a),u=n(174),c=r(u);t.getStateName=o.default,t.getUnexpectedInvocationParameterMessage=s.default,t.validateNextState=c.default},function(e,t){\"use strict\";Object.defineProperty(t,\"__esModule\",{value:!0}),t.default=function(e){return e&&\"@@redux/INIT\"===e.type?\"initialState argument passed to createStore\":\"previous state received by the reducer\"},e.exports=t.default},function(e,t,n){\"use strict\";function r(e){return e&&e.__esModule?e:{default:e}}Object.defineProperty(t,\"__esModule\",{value:!0});var i=n(168),o=r(i),a=n(172),s=r(a);t.default=function(e,t,n){var r=Object.keys(t);if(!r.length)return\"Store does not have a valid reducer. Make sure the argument passed to combineReducers is an object whose values are reducers.\";var i=(0,s.default)(n);if(!o.default.Iterable.isIterable(e))return\"The \"+i+' is of unexpected type. Expected argument to be an instance of Immutable.Iterable with the following properties: \"'+r.join('\", \"')+'\".';var a=e.keySeq().toArray().filter(function(e){return!t.hasOwnProperty(e)});return a.length>0?\"Unexpected \"+(1===a.length?\"property\":\"properties\")+' \"'+a.join('\", \"')+'\" found in '+i+'. Expected to find one of the known reducer property names instead: \"'+r.join('\", \"')+'\". Unexpected properties will be ignored.':null;\n},e.exports=t.default},function(e,t){\"use strict\";Object.defineProperty(t,\"__esModule\",{value:!0}),t.default=function(e,t,n){if(void 0===e)throw new Error('Reducer \"'+t+'\" returned undefined when handling \"'+n.type+'\" action. To ignore an action, you must explicitly return the previous state.');return null},e.exports=t.default},function(e,t){\"use strict\";function n(e,t){var r;return r=Array.isArray(e)?[]:{},t.push(e),Object.keys(e).forEach(function(i){var o=e[i];if(\"function\"!=typeof o)return o&&\"object\"==typeof o?t.indexOf(e[i])===-1?void(r[i]=n(e[i],t.slice(0))):void(r[i]=\"[Circular]\"):void(r[i]=o)}),r}e.exports=function(e){if(\"object\"==typeof e){var t=n(e,[]);return\"string\"==typeof e.name&&(t.name=e.name),\"string\"==typeof e.message&&(t.message=e.message),\"string\"==typeof e.stack&&(t.stack=e.stack),t}return\"function\"==typeof e?\"[Function: \"+(e.name||\"anonymous\")+\"]\":e}},function(e,t,n){\"use strict\";function r(e){return e&&e.__esModule?e:{default:e}}function i(e,t){return{type:p,payload:{action:t,error:(0,l.default)(e)}}}function o(e){return{type:f,payload:e}}function a(e){return{type:h,payload:e}}function s(e){return{type:d,payload:e}}function u(){var e=arguments.length>0&&void 0!==arguments[0]?arguments[0]:{};return{type:m,payload:e}}Object.defineProperty(t,\"__esModule\",{value:!0}),t.CLEAR=t.NEW_AUTH_ERR=t.NEW_SPEC_ERR=t.NEW_THROWN_ERR_BATCH=t.NEW_THROWN_ERR=void 0,t.newThrownErr=i,t.newThrownErrBatch=o,t.newSpecErr=a,t.newAuthErr=s,t.clear=u;var c=n(175),l=r(c),p=t.NEW_THROWN_ERR=\"err_new_thrown_err\",f=t.NEW_THROWN_ERR_BATCH=\"err_new_thrown_err_batch\",h=t.NEW_SPEC_ERR=\"err_new_spec_err\",d=t.NEW_AUTH_ERR=\"err_new_auth_err\",m=t.CLEAR=\"err_clear\"},function(e,t,n){\"use strict\";function r(e){return e&&e.__esModule?e:{default:e}}function i(){var e={location:{},history:{},open:function(){},close:function(){},File:function(){}};if(\"undefined\"==typeof window)return e;try{e=window;var t=[\"File\",\"Blob\",\"FormData\"],n=!0,r=!1,i=void 0;try{for(var o,s=(0,a.default)(t);!(n=(o=s.next()).done);n=!0){var u=o.value;u in window&&(e[u]=window[u])}}catch(e){r=!0,i=e}finally{try{!n&&s.return&&s.return()}finally{if(r)throw i}}}catch(e){console.error(e)}return e}var o=n(178),a=r(o);e.exports=i()},function(e,t,n){e.exports={default:n(179),__esModule:!0}},function(e,t,n){n(110),n(97),e.exports=n(180)},function(e,t,n){var r=n(86),i=n(181);e.exports=n(59).getIterator=function(e){var t=i(e);if(\"function\"!=typeof t)throw TypeError(e+\" is not iterable!\");return r(t.call(e))}},function(e,t,n){var r=n(182),i=n(108)(\"iterator\"),o=n(102);e.exports=n(59).getIteratorMethod=function(e){if(void 0!=e)return e[i]||e[\"@@iterator\"]||o[r(e)]}},function(e,t,n){var r=n(70),i=n(108)(\"toStringTag\"),o=\"Arguments\"==r(function(){return arguments}()),a=function(e,t){try{return e[t]}catch(e){}};e.exports=function(e){var t,n,s;return void 0===e?\"Undefined\":null===e?\"Null\":\"string\"==typeof(n=a(t=Object(e),i))?n:o?r(t):\"Object\"==(s=r(t))&&\"function\"==typeof t.callee?\"Arguments\":s}},function(e,t,n){(function(e){\"use strict\";function r(e){return e&&e.__esModule?e:{default:e}}function i(e){return l(e)?Q(e)?e.toObject():e:{}}function o(e){return e?e.toArray?e.toArray():u(e):[]}function a(e){return Q(e)?e:e instanceof $.default.File?e:l(e)?Array.isArray(e)?j.default.Seq(e).map(a).toList():j.default.Seq(e).map(a).toOrderedMap():e}function s(e,t){var n={};return(0,N.default)(e).filter(function(t){return\"function\"==typeof e[t]}).forEach(function(r){return n[r]=e[r].bind(null,t)}),n}function u(e){return Array.isArray(e)?e:[e]}function c(e){return\"function\"==typeof e}function l(e){return!!e&&\"object\"===(\"undefined\"==typeof e?\"undefined\":(0,P.default)(e))}function p(e){return\"function\"==typeof e}function f(e){return Array.isArray(e)}function h(e,t){return(0,N.default)(e).reduce(function(n,r){return n[r]=t(e[r],r),n},{})}function d(e,t){return(0,N.default)(e).reduce(function(n,r){var i=t(e[r],r);return i&&\"object\"===(\"undefined\"==typeof i?\"undefined\":(0,P.default)(i))&&(0,M.default)(n,i),n},{})}function m(e){return function(t){t.dispatch,t.getState;return function(t){return function(n){return\"function\"==typeof n?n(e()):t(n)}}}}function v(e){var t=e.keySeq();return t.contains(Z)?Z:t.filter(function(e){return\"2\"===(e+\"\")[0]}).sort().first()}function y(e,t){if(!j.default.Iterable.isIterable(e))return j.default.List();var n=e.getIn(Array.isArray(t)?t:[t]);return j.default.List.isList(n)?n:j.default.List()}function g(e){var t,n,r,i,o,a,s,u,c,l,p,f;for(l=/(>)(<)(\\/*)/g,f=/[ ]*(.*)[ ]+\\n/g,t=/(<.+>)(.+\\n)/g,e=e.replace(/\\r\\n/g,\"\\n\").replace(l,\"$1\\n$2$3\").replace(f,\"$1\\n\").replace(t,\"$1\\n$2\"),r=\"\",u=e.split(\"\\n\"),i=0,a=\"other\",p={\"single->single\":0,\"single->closing\":-1,\"single->opening\":0,\"single->other\":0,\"closing->single\":0,\"closing->closing\":-1,\"closing->opening\":0,\"closing->other\":0,\"opening->single\":1,\"opening->closing\":0,\"opening->opening\":1,\"opening->other\":1,\"other->single\":0,\"other->closing\":-1,\"other->opening\":0,\"other->other\":0},n=function(e){var t,n,o,s,u,c;u={single:Boolean(e.match(/<.+\\/>/)),closing:Boolean(e.match(/<\\/.+>/)),opening:Boolean(e.match(/<[^!?].*>/))},s=function(){var e;e=[];for(n in u)c=u[n],c&&e.push(n);return e}()[0],s=void 0===s?\"other\":s,t=a+\"->\"+s,a=s,o=\"\",i+=p[t],o=function(){var e,t,n,r;for(n=[],r=e=0,t=i;0<=t?e<t:e>t;r=0<=t?++e:--e)n.push(\"  \");return n}().join(\"\"),\"opening->closing\"===t?r=r.substr(0,r.length-1)+e+\"\\n\":r+=o+e+\"\\n\"},o=0,s=u.length;o<s;o++)c=u[o],n(c);return r}function _(e){var t=5e3,n=document,r=\"appendChild\",i=\"test\";if(!e)return\"\";if(e.textContent.length>t)return e.textContent;var o=function(e){for(var t,o,a,s,u,c=e.textContent,l=0,p=c[0],f=1,h=e.innerHTML=\"\",d=0;o=t,t=d<7&&\"\\\\\"==t?1:f;){if(f=p,p=c[++l],s=h.length>1,!f||d>8&&\"\\n\"==f||[/\\S/[i](f),1,1,!/[$\\w]/[i](f),(\"/\"==t||\"\\n\"==t)&&s,'\"'==t&&s,\"'\"==t&&s,c[l-4]+o+t==\"-->\",o+t==\"*/\"][d])for(h&&(e[r](u=n.createElement(\"span\")).setAttribute(\"style\",[\"color: #555; font-weight: bold;\",\"\",\"\",\"color: #555;\",\"\"][d?d<3?2:d>6?4:d>3?3:+/^(a(bstract|lias|nd|rguments|rray|s(m|sert)?|uto)|b(ase|egin|ool(ean)?|reak|yte)|c(ase|atch|har|hecked|lass|lone|ompl|onst|ontinue)|de(bugger|cimal|clare|f(ault|er)?|init|l(egate|ete)?)|do|double|e(cho|ls?if|lse(if)?|nd|nsure|num|vent|x(cept|ec|p(licit|ort)|te(nds|nsion|rn)))|f(allthrough|alse|inal(ly)?|ixed|loat|or(each)?|riend|rom|unc(tion)?)|global|goto|guard|i(f|mp(lements|licit|ort)|n(it|clude(_once)?|line|out|stanceof|t(erface|ernal)?)?|s)|l(ambda|et|ock|ong)|m(icrolight|odule|utable)|NaN|n(amespace|ative|ext|ew|il|ot|ull)|o(bject|perator|r|ut|verride)|p(ackage|arams|rivate|rotected|rotocol|ublic)|r(aise|e(adonly|do|f|gister|peat|quire(_once)?|scue|strict|try|turn))|s(byte|ealed|elf|hort|igned|izeof|tatic|tring|truct|ubscript|uper|ynchronized|witch)|t(emplate|hen|his|hrows?|ransient|rue|ry|ype(alias|def|id|name|of))|u(n(checked|def(ined)?|ion|less|signed|til)|se|sing)|v(ar|irtual|oid|olatile)|w(char_t|hen|here|hile|ith)|xor|yield)$/[i](h):0]),u[r](n.createTextNode(h))),a=d&&d<7?d:a,h=\"\",d=11;![1,/[\\/{}[(\\-+*=<>:;|\\\\.,?!&@~]/[i](f),/[\\])]/[i](f),/[$\\w]/[i](f),\"/\"==f&&a<2&&\"<\"!=t,'\"'==f,\"'\"==f,f+p+c[l+1]+c[l+2]==\"<!--\",f+p==\"/*\",f+p==\"//\",\"#\"==f][--d];);h+=f}};return o(e)}function b(e){var t=arguments.length>1&&void 0!==arguments[1]?arguments[1]:\"key\",n=arguments.length>2&&void 0!==arguments[2]?arguments[2]:j.default.Map();if(!j.default.Map.isMap(e)||!e.size)return j.default.List();if(Array.isArray(t)||(t=[t]),t.length<1)return e.merge(n);var r=j.default.List(),i=t[0],o=!0,a=!1,s=void 0;try{for(var u,c=(0,T.default)(e.entries());!(o=(u=c.next()).done);o=!0){var l=u.value,p=(0,C.default)(l,2),f=p[0],h=p[1],d=b(h,t.slice(1),n.set(i,f));r=j.default.List.isList(d)?r.concat(d):r.push(d)}}catch(e){a=!0,s=e}finally{try{!o&&c.return&&c.return()}finally{if(a)throw s}}return r}function x(e){return(0,z.default)((0,B.default)(e))}function w(e){return x(e.replace(/\\.[^.\\/]*$/,\"\"))}Object.defineProperty(t,\"__esModule\",{value:!0}),t.shallowEqualKeys=t.filterConfigs=t.buildFormData=t.sorters=t.btoa=t.parseSeach=t.getSampleSchema=t.validateParam=t.propChecker=t.errorLog=t.memoize=t.isImmutable=void 0;var k=n(57),S=r(k),E=n(184),C=r(E),A=n(178),T=r(A),D=n(141),M=r(D),O=n(94),P=r(O),I=n(60),N=r(I);t.objectify=i,t.arrayify=o,t.fromJSOrdered=a,t.bindToState=s,t.normalizeArray=u,t.isFn=c,t.isObject=l,t.isFunc=p,t.isArray=f,t.objMap=h,t.objReduce=d,t.systemThunkMiddleware=m,t.defaultStatusCode=v,t.getList=y,t.formatXml=g,t.highlight=_,t.mapToList=b,t.pascalCase=x,t.pascalCaseFilename=w;var R=n(168),j=r(R),F=n(188),B=r(F),L=n(195),z=r(L),q=n(212),U=r(q),W=n(245),K=r(W),V=n(314),H=r(V),J=n(234),G=r(J),X=n(322),Y=n(177),$=r(Y),Z=\"default\",Q=t.isImmutable=function(e){return j.default.Iterable.isIterable(e)},ee=(t.memoize=U.default,t.errorLog=function(e){return function(){return function(t){return function(n){try{t(n)}catch(t){e().errActions.newThrownErr(t,n)}}}}},t.propChecker=function(e,t){var n=arguments.length>2&&void 0!==arguments[2]?arguments[2]:[],r=arguments.length>3&&void 0!==arguments[3]?arguments[3]:[];return(0,N.default)(e).length!==(0,N.default)(t).length||((0,H.default)(e,function(e,n){if(r.includes(n))return!1;var i=t[n];return j.default.Iterable.isIterable(e)?!j.default.is(e,i):(\"object\"!==(\"undefined\"==typeof e?\"undefined\":(0,P.default)(e))||\"object\"!==(\"undefined\"==typeof i?\"undefined\":(0,P.default)(i)))&&e!==i})||n.some(function(n){return!(0,G.default)(e[n],t[n])}))},function(e){if(!/^-?\\d+(.?\\d+)?$/.test(e))return\"Value must be a number\"}),te=function(e){if(!/^-?\\d+$/.test(e))return\"Value must be integer\"};t.validateParam=function(e,t){var n=[],r=t&&\"body\"===e.get(\"in\")?e.get(\"value_xml\"):e.get(\"value\"),i=e.get(\"required\"),o=e.get(\"type\");if(i&&(!r||\"array\"===o&&Array.isArray(r)&&!r.length))return n.push(\"Required field is not provided\"),n;if(!r)return n;if(\"number\"===o){var a=ee(r);if(!a)return n;n.push(a)}else if(\"integer\"===o){var s=te(r);if(!s)return n;n.push(s)}else if(\"array\"===o){var u=void 0;if(!r.count())return n;u=e.getIn([\"items\",\"type\"]),r.forEach(function(e,t){var r=void 0;\"number\"===u?r=ee(e):\"integer\"===u&&(r=te(e)),r&&n.push({index:t,error:r})})}return n},t.getSampleSchema=function(e){var t=arguments.length>1&&void 0!==arguments[1]?arguments[1]:\"\",n=arguments.length>2&&void 0!==arguments[2]?arguments[2]:{};if(/xml/.test(t)){if(!e.xml||!e.xml.name){if(e.xml=e.xml||{},!e.$$ref)return e.type||e.items||e.properties||e.additionalProperties?'<?xml version=\"1.0\" encoding=\"UTF-8\"?>\\n<!-- XML example cannot be generated -->':null;var r=e.$$ref.match(/\\S*\\/(\\S+)$/);e.xml.name=r[1]}return(0,X.memoizedCreateXMLExample)(e,n)}return(0,S.default)((0,X.memoizedSampleFromSchema)(e,n),null,2)},t.parseSeach=function(){var e={},t=window.location.search;if(\"\"!=t){var n=t.substr(1).split(\"&\");for(var r in n)r=n[r].split(\"=\"),e[decodeURIComponent(r[0])]=decodeURIComponent(r[1])}return e},t.btoa=function(t){var n=void 0;return n=t instanceof e?t:new e(t.toString(),\"utf-8\"),n.toString(\"base64\")},t.sorters={operationsSorter:{alpha:function(e,t){return e.get(\"path\").localeCompare(t.get(\"path\"))},method:function(e,t){return e.get(\"method\").localeCompare(t.get(\"method\"))}}},t.buildFormData=function(e){var t=[];for(var n in e){var r=e[n];void 0!==r&&\"\"!==r&&t.push([n,\"=\",encodeURIComponent(r).replace(/%20/g,\"+\")].join(\"\"))}return t.join(\"&\")},t.filterConfigs=function(e,t){var n=void 0,r={};for(n in e)t.indexOf(n)!==-1&&(r[n]=e[n]);return r},t.shallowEqualKeys=function(e,t,n){return!!(0,K.default)(n,function(n){return(0,G.default)(e[n],t[n])})}}).call(t,n(132).Buffer)},function(e,t,n){\"use strict\";function r(e){return e&&e.__esModule?e:{default:e}}t.__esModule=!0;var i=n(185),o=r(i),a=n(178),s=r(a);t.default=function(){function e(e,t){var n=[],r=!0,i=!1,o=void 0;try{for(var a,u=(0,s.default)(e);!(r=(a=u.next()).done)&&(n.push(a.value),!t||n.length!==t);r=!0);}catch(e){i=!0,o=e}finally{try{!r&&u.return&&u.return()}finally{if(i)throw o}}return n}return function(t,n){if(Array.isArray(t))return t;if((0,o.default)(Object(t)))return e(t,n);throw new TypeError(\"Invalid attempt to destructure non-iterable instance\")}}()},function(e,t,n){e.exports={default:n(186),__esModule:!0}},function(e,t,n){n(110),n(97),e.exports=n(187)},function(e,t,n){var r=n(182),i=n(108)(\"iterator\"),o=n(102);e.exports=n(59).isIterable=function(e){var t=Object(e);return void 0!==t[i]||\"@@iterator\"in t||o.hasOwnProperty(r(t))}},function(e,t,n){var r=n(189),i=n(203),o=i(function(e,t,n){return t=t.toLowerCase(),e+(n?r(t):t)});e.exports=o},function(e,t,n){function r(e){return o(i(e).toLowerCase())}var i=n(190),o=n(195);e.exports=r},function(e,t,n){function r(e){return null==e?\"\":i(e)}var i=n(191);e.exports=r},function(e,t,n){function r(e){if(\"string\"==typeof e)return e;if(a(e))return o(e,r)+\"\";if(s(e))return l?l.call(e):\"\";var t=e+\"\";return\"0\"==t&&1/e==-u?\"-0\":t}var i=n(151),o=n(192),a=n(193),s=n(194),u=1/0,c=i?i.prototype:void 0,l=c?c.toString:void 0;e.exports=r},function(e,t){function n(e,t){for(var n=-1,r=null==e?0:e.length,i=Array(r);++n<r;)i[n]=t(e[n],n,e);return i}e.exports=n},function(e,t){var n=Array.isArray;e.exports=n},function(e,t,n){function r(e){return\"symbol\"==typeof e||o(e)&&i(e)==a}var i=n(150),o=n(158),a=\"[object Symbol]\";e.exports=r},function(e,t,n){var r=n(196),i=r(\"toUpperCase\");e.exports=i},function(e,t,n){function r(e){return function(t){t=s(t);var n=o(t)?a(t):void 0,r=n?n[0]:t.charAt(0),u=n?i(n,1).join(\"\"):t.slice(1);return r[e]()+u}}var i=n(197),o=n(199),a=n(200),s=n(190);e.exports=r},function(e,t,n){function r(e,t,n){var r=e.length;return n=void 0===n?r:n,!t&&n>=r?e:i(e,t,n)}var i=n(198);e.exports=r},function(e,t){function n(e,t,n){var r=-1,i=e.length;t<0&&(t=-t>i?0:i+t),n=n>i?i:n,n<0&&(n+=i),i=t>n?0:n-t>>>0,t>>>=0;for(var o=Array(i);++r<i;)o[r]=e[r+t];return o}e.exports=n},function(e,t){function n(e){return l.test(e)}var r=\"\\\\ud800-\\\\udfff\",i=\"\\\\u0300-\\\\u036f\",o=\"\\\\ufe20-\\\\ufe2f\",a=\"\\\\u20d0-\\\\u20ff\",s=i+o+a,u=\"\\\\ufe0e\\\\ufe0f\",c=\"\\\\u200d\",l=RegExp(\"[\"+c+r+s+u+\"]\");e.exports=n},function(e,t,n){function r(e){return o(e)?a(e):i(e)}var i=n(201),o=n(199),a=n(202);e.exports=r},function(e,t){function n(e){return e.split(\"\")}e.exports=n},function(e,t){function n(e){return e.match(w)||[]}var r=\"\\\\ud800-\\\\udfff\",i=\"\\\\u0300-\\\\u036f\",o=\"\\\\ufe20-\\\\ufe2f\",a=\"\\\\u20d0-\\\\u20ff\",s=i+o+a,u=\"\\\\ufe0e\\\\ufe0f\",c=\"[\"+r+\"]\",l=\"[\"+s+\"]\",p=\"\\\\ud83c[\\\\udffb-\\\\udfff]\",f=\"(?:\"+l+\"|\"+p+\")\",h=\"[^\"+r+\"]\",d=\"(?:\\\\ud83c[\\\\udde6-\\\\uddff]){2}\",m=\"[\\\\ud800-\\\\udbff][\\\\udc00-\\\\udfff]\",v=\"\\\\u200d\",y=f+\"?\",g=\"[\"+u+\"]?\",_=\"(?:\"+v+\"(?:\"+[h,d,m].join(\"|\")+\")\"+g+y+\")*\",b=g+y+_,x=\"(?:\"+[h+l+\"?\",l,d,m,c].join(\"|\")+\")\",w=RegExp(p+\"(?=\"+p+\")|\"+x+b,\"g\");e.exports=n},function(e,t,n){function r(e){return function(t){return i(a(o(t).replace(u,\"\")),e,\"\")}}var i=n(204),o=n(205),a=n(208),s=\"['’]\",u=RegExp(s,\"g\");e.exports=r},function(e,t){function n(e,t,n,r){var i=-1,o=null==e?0:e.length;for(r&&o&&(n=e[++i]);++i<o;)n=t(n,e[i],i,e);return n}e.exports=n},function(e,t,n){function r(e){return e=o(e),e&&e.replace(a,i).replace(f,\"\")}var i=n(206),o=n(190),a=/[\\xc0-\\xd6\\xd8-\\xf6\\xf8-\\xff\\u0100-\\u017f]/g,s=\"\\\\u0300-\\\\u036f\",u=\"\\\\ufe20-\\\\ufe2f\",c=\"\\\\u20d0-\\\\u20ff\",l=s+u+c,p=\"[\"+l+\"]\",f=RegExp(p,\"g\");e.exports=r},function(e,t,n){var r=n(207),i={\"À\":\"A\",\"Á\":\"A\",\"Â\":\"A\",\"Ã\":\"A\",\"Ä\":\"A\",\"Å\":\"A\",\"à\":\"a\",\"á\":\"a\",\"â\":\"a\",\"ã\":\"a\",\"ä\":\"a\",\"å\":\"a\",\"Ç\":\"C\",\"ç\":\"c\",\"Ð\":\"D\",\"ð\":\"d\",\"È\":\"E\",\"É\":\"E\",\"Ê\":\"E\",\"Ë\":\"E\",\"è\":\"e\",\"é\":\"e\",\"ê\":\"e\",\"ë\":\"e\",\"Ì\":\"I\",\"Í\":\"I\",\"Î\":\"I\",\"Ï\":\"I\",\"ì\":\"i\",\"í\":\"i\",\"î\":\"i\",\"ï\":\"i\",\"Ñ\":\"N\",\"ñ\":\"n\",\"Ò\":\"O\",\"Ó\":\"O\",\"Ô\":\"O\",\"Õ\":\"O\",\"Ö\":\"O\",\"Ø\":\"O\",\"ò\":\"o\",\"ó\":\"o\",\"ô\":\"o\",\"õ\":\"o\",\"ö\":\"o\",\"ø\":\"o\",\"Ù\":\"U\",\"Ú\":\"U\",\"Û\":\"U\",\"Ü\":\"U\",\"ù\":\"u\",\"ú\":\"u\",\"û\":\"u\",\"ü\":\"u\",\"Ý\":\"Y\",\"ý\":\"y\",\"ÿ\":\"y\",\"Æ\":\"Ae\",\"æ\":\"ae\",\"Þ\":\"Th\",\"þ\":\"th\",\"ß\":\"ss\",\"Ā\":\"A\",\"Ă\":\"A\",\"Ą\":\"A\",\"ā\":\"a\",\"ă\":\"a\",\"ą\":\"a\",\"Ć\":\"C\",\"Ĉ\":\"C\",\"Ċ\":\"C\",\"Č\":\"C\",\"ć\":\"c\",\"ĉ\":\"c\",\"ċ\":\"c\",\"č\":\"c\",\"Ď\":\"D\",\"Đ\":\"D\",\"ď\":\"d\",\"đ\":\"d\",\"Ē\":\"E\",\"Ĕ\":\"E\",\"Ė\":\"E\",\"Ę\":\"E\",\"Ě\":\"E\",\"ē\":\"e\",\"ĕ\":\"e\",\"ė\":\"e\",\"ę\":\"e\",\"ě\":\"e\",\"Ĝ\":\"G\",\"Ğ\":\"G\",\"Ġ\":\"G\",\"Ģ\":\"G\",\"ĝ\":\"g\",\"ğ\":\"g\",\"ġ\":\"g\",\"ģ\":\"g\",\"Ĥ\":\"H\",\"Ħ\":\"H\",\"ĥ\":\"h\",\"ħ\":\"h\",\"Ĩ\":\"I\",\"Ī\":\"I\",\"Ĭ\":\"I\",\"Į\":\"I\",\"İ\":\"I\",\"ĩ\":\"i\",\"ī\":\"i\",\"ĭ\":\"i\",\"į\":\"i\",\"ı\":\"i\",\"Ĵ\":\"J\",\"ĵ\":\"j\",\"Ķ\":\"K\",\"ķ\":\"k\",\"ĸ\":\"k\",\"Ĺ\":\"L\",\"Ļ\":\"L\",\"Ľ\":\"L\",\"Ŀ\":\"L\",\"Ł\":\"L\",\"ĺ\":\"l\",\"ļ\":\"l\",\"ľ\":\"l\",\"ŀ\":\"l\",\"ł\":\"l\",\"Ń\":\"N\",\"Ņ\":\"N\",\"Ň\":\"N\",\"Ŋ\":\"N\",\"ń\":\"n\",\"ņ\":\"n\",\"ň\":\"n\",\"ŋ\":\"n\",\"Ō\":\"O\",\"Ŏ\":\"O\",\"Ő\":\"O\",\"ō\":\"o\",\"ŏ\":\"o\",\"ő\":\"o\",\"Ŕ\":\"R\",\"Ŗ\":\"R\",\"Ř\":\"R\",\"ŕ\":\"r\",\"ŗ\":\"r\",\"ř\":\"r\",\"Ś\":\"S\",\"Ŝ\":\"S\",\"Ş\":\"S\",\"Š\":\"S\",\"ś\":\"s\",\"ŝ\":\"s\",\"ş\":\"s\",\"š\":\"s\",\"Ţ\":\"T\",\"Ť\":\"T\",\"Ŧ\":\"T\",\"ţ\":\"t\",\"ť\":\"t\",\"ŧ\":\"t\",\"Ũ\":\"U\",\"Ū\":\"U\",\"Ŭ\":\"U\",\"Ů\":\"U\",\"Ű\":\"U\",\"Ų\":\"U\",\"ũ\":\"u\",\"ū\":\"u\",\"ŭ\":\"u\",\"ů\":\"u\",\"ű\":\"u\",\"ų\":\"u\",\"Ŵ\":\"W\",\"ŵ\":\"w\",\"Ŷ\":\"Y\",\"ŷ\":\"y\",\"Ÿ\":\"Y\",\"Ź\":\"Z\",\"Ż\":\"Z\",\"Ž\":\"Z\",\"ź\":\"z\",\"ż\":\"z\",\"ž\":\"z\",\"Ĳ\":\"IJ\",\"ĳ\":\"ij\",\"Œ\":\"Oe\",\"œ\":\"oe\",\"ŉ\":\"'n\",\"ſ\":\"s\"},o=r(i);e.exports=o},function(e,t){function n(e){return function(t){return null==e?void 0:e[t]}}e.exports=n},function(e,t,n){function r(e,t,n){return e=a(e),t=n?void 0:t,void 0===t?o(e)?s(e):i(e):e.match(t)||[]}var i=n(209),o=n(210),a=n(190),s=n(211);e.exports=r},function(e,t){function n(e){return e.match(r)||[]}var r=/[^\\x00-\\x2f\\x3a-\\x40\\x5b-\\x60\\x7b-\\x7f]+/g;e.exports=n},function(e,t){function n(e){return r.test(e)}var r=/[a-z][A-Z]|[A-Z]{2,}[a-z]|[0-9][a-zA-Z]|[a-zA-Z][0-9]|[^a-zA-Z0-9 ]/;e.exports=n},function(e,t){function n(e){return e.match(U)||[]}var r=\"\\\\ud800-\\\\udfff\",i=\"\\\\u0300-\\\\u036f\",o=\"\\\\ufe20-\\\\ufe2f\",a=\"\\\\u20d0-\\\\u20ff\",s=i+o+a,u=\"\\\\u2700-\\\\u27bf\",c=\"a-z\\\\xdf-\\\\xf6\\\\xf8-\\\\xff\",l=\"\\\\xac\\\\xb1\\\\xd7\\\\xf7\",p=\"\\\\x00-\\\\x2f\\\\x3a-\\\\x40\\\\x5b-\\\\x60\\\\x7b-\\\\xbf\",f=\"\\\\u2000-\\\\u206f\",h=\" \\\\t\\\\x0b\\\\f\\\\xa0\\\\ufeff\\\\n\\\\r\\\\u2028\\\\u2029\\\\u1680\\\\u180e\\\\u2000\\\\u2001\\\\u2002\\\\u2003\\\\u2004\\\\u2005\\\\u2006\\\\u2007\\\\u2008\\\\u2009\\\\u200a\\\\u202f\\\\u205f\\\\u3000\",d=\"A-Z\\\\xc0-\\\\xd6\\\\xd8-\\\\xde\",m=\"\\\\ufe0e\\\\ufe0f\",v=l+p+f+h,y=\"['’]\",g=\"[\"+v+\"]\",_=\"[\"+s+\"]\",b=\"\\\\d+\",x=\"[\"+u+\"]\",w=\"[\"+c+\"]\",k=\"[^\"+r+v+b+u+c+d+\"]\",S=\"\\\\ud83c[\\\\udffb-\\\\udfff]\",E=\"(?:\"+_+\"|\"+S+\")\",C=\"[^\"+r+\"]\",A=\"(?:\\\\ud83c[\\\\udde6-\\\\uddff]){2}\",T=\"[\\\\ud800-\\\\udbff][\\\\udc00-\\\\udfff]\",D=\"[\"+d+\"]\",M=\"\\\\u200d\",O=\"(?:\"+w+\"|\"+k+\")\",P=\"(?:\"+D+\"|\"+k+\")\",I=\"(?:\"+y+\"(?:d|ll|m|re|s|t|ve))?\",N=\"(?:\"+y+\"(?:D|LL|M|RE|S|T|VE))?\",R=E+\"?\",j=\"[\"+m+\"]?\",F=\"(?:\"+M+\"(?:\"+[C,A,T].join(\"|\")+\")\"+j+R+\")*\",B=\"\\\\d*(?:(?:1st|2nd|3rd|(?![123])\\\\dth)\\\\b)\",L=\"\\\\d*(?:(?:1ST|2ND|3RD|(?![123])\\\\dTH)\\\\b)\",z=j+R+F,q=\"(?:\"+[x,A,T].join(\"|\")+\")\"+z,U=RegExp([D+\"?\"+w+\"+\"+I+\"(?=\"+[g,D,\"$\"].join(\"|\")+\")\",P+\"+\"+N+\"(?=\"+[g,D+O,\"$\"].join(\"|\")+\")\",D+\"?\"+O+\"+\"+I,D+\"+\"+N,L,B,b,q].join(\"|\"),\"g\");e.exports=n},function(e,t,n){function r(e,t){if(\"function\"!=typeof e||null!=t&&\"function\"!=typeof t)throw new TypeError(o);var n=function(){var r=arguments,i=t?t.apply(this,r):r[0],o=n.cache;if(o.has(i))return o.get(i);var a=e.apply(this,r);return n.cache=o.set(i,a)||o,a};return n.cache=new(r.Cache||i),n}var i=n(213),o=\"Expected a function\";r.Cache=i,e.exports=r},function(e,t,n){function r(e){var t=-1,n=null==e?0:e.length;for(this.clear();++t<n;){var r=e[t];this.set(r[0],r[1])}}var i=n(214),o=n(239),a=n(242),s=n(243),u=n(244);r.prototype.clear=i,r.prototype.delete=o,r.prototype.get=a,r.prototype.has=s,r.prototype.set=u,e.exports=r},[1180,215,230,238],function(e,t,n){function r(e){var t=-1,n=null==e?0:e.length;for(this.clear();++t<n;){var r=e[t];this.set(r[0],r[1])}}var i=n(216),o=n(226),a=n(227),s=n(228),u=n(229);r.prototype.clear=i,r.prototype.delete=o,r.prototype.get=a,r.prototype.has=s,r.prototype.set=u,e.exports=r},[1181,217],[1182,218],[1183,219,225],[1184,220,222,221,224],function(e,t,n){function r(e){if(!o(e))return!1;var t=i(e);return t==s||t==u||t==a||t==c}var i=n(150),o=n(221),a=\"[object AsyncFunction]\",s=\"[object Function]\",u=\"[object GeneratorFunction]\",c=\"[object Proxy]\";e.exports=r},function(e,t){function n(e){var t=typeof e;return null!=e&&(\"object\"==t||\"function\"==t)}e.exports=n},[1185,223],[1186,152],function(e,t){function n(e){if(null!=e){try{return i.call(e)}catch(e){}try{return e+\"\"}catch(e){}}return\"\"}var r=Function.prototype,i=r.toString;e.exports=n},function(e,t){function n(e,t){return null==e?void 0:e[t]}e.exports=n},function(e,t){function n(e){var t=this.has(e)&&delete this.__data__[e];return this.size-=t?1:0,t}e.exports=n},[1187,217],[1188,217],[1189,217],function(e,t,n){function r(e){var t=-1,n=null==e?0:e.length;for(this.clear();++t<n;){var r=e[t];this.set(r[0],r[1])}}var i=n(231),o=n(232),a=n(235),s=n(236),u=n(237);r.prototype.clear=i,r.prototype.delete=o,r.prototype.get=a,r.prototype.has=s,r.prototype.set=u,e.exports=r},function(e,t){function n(){this.__data__=[],this.size=0}e.exports=n},[1190,233],[1191,234],function(e,t){function n(e,t){return e===t||e!==e&&t!==t}e.exports=n},[1192,233],[1193,233],[1194,233],[1195,218,152],[1196,240],[1197,241],function(e,t){function n(e){var t=typeof e;return\"string\"==t||\"number\"==t||\"symbol\"==t||\"boolean\"==t?\"__proto__\"!==e:null===e}e.exports=n},[1198,240],[1199,240],[1200,240],function(e,t,n){var r=n(246),i=n(309),o=r(i);e.exports=o},[1201,247,285,269],[1202,248,294,305,193,306],[1203,249,291,293],function(e,t,n){function r(e,t,n,r){var u=n.length,c=u,l=!r;if(null==e)return!c;for(e=Object(e);u--;){var p=n[u];if(l&&p[2]?p[1]!==e[p[0]]:!(p[0]in e))return!1}for(;++u<c;){p=n[u];var f=p[0],h=e[f],d=p[1];if(l&&p[2]){if(void 0===h&&!(f in e))return!1}else{var m=new i;if(r)var v=r(h,d,f,e,t,m);if(!(void 0===v?o(d,h,a|s,r,m):v))return!1}}return!0}var i=n(250),o=n(256),a=1,s=2;e.exports=r},[1204,230,251,252,253,254,255],[1205,230],function(e,t){function n(e){var t=this.__data__,n=t.delete(e);return this.size=t.size,n}e.exports=n},function(e,t){function n(e){return this.__data__.get(e)}e.exports=n},function(e,t){function n(e){return this.__data__.has(e)}e.exports=n},[1206,230,238,213],function(e,t,n){function r(e,t,n,s,u){return e===t||(null==e||null==t||!o(e)&&!a(t)?e!==e&&t!==t:i(e,t,n,s,r,u))}var i=n(257),o=n(221),a=n(158);e.exports=r},function(e,t,n){function r(e,t,n,r,v,g){var _=c(e),b=c(t),x=d,w=d;_||(x=u(e),x=x==h?m:x),b||(w=u(t),w=w==h?m:w);var k=x==m,S=w==m,E=x==w;if(E&&l(e)){if(!l(t))return!1;_=!0,k=!1}if(E&&!k)return g||(g=new i),_||p(e)?o(e,t,n,r,v,g):a(e,t,x,n,r,v,g);if(!(n&f)){var C=k&&y.call(e,\"__wrapped__\"),A=S&&y.call(t,\"__wrapped__\");if(C||A){var T=C?e.value():e,D=A?t.value():t;return g||(g=new i),v(T,D,n,r,g)}}return!!E&&(g||(g=new i),s(e,t,n,r,v,g))}var i=n(250),o=n(258),a=n(264),s=n(268),u=n(286),c=n(193),l=n(274),p=n(277),f=1,h=\"[object Arguments]\",d=\"[object Array]\",m=\"[object Object]\",v=Object.prototype,y=v.hasOwnProperty;e.exports=r},function(e,t,n){function r(e,t,n,r,c,l){var p=n&s,f=e.length,h=t.length;if(f!=h&&!(p&&h>f))return!1;var d=l.get(e);if(d&&l.get(t))return d==t;var m=-1,v=!0,y=n&u?new i:void 0;for(l.set(e,t),l.set(t,e);++m<f;){var g=e[m],_=t[m];if(r)var b=p?r(_,g,m,t,e,l):r(g,_,m,e,t,l);if(void 0!==b){if(b)continue;v=!1;break}if(y){if(!o(t,function(e,t){if(!a(y,t)&&(g===e||c(g,e,n,r,l)))return y.push(t)})){v=!1;break}}else if(g!==_&&!c(g,_,n,r,l)){v=!1;break}}return l.delete(e),l.delete(t),v}var i=n(259),o=n(262),a=n(263),s=1,u=2;e.exports=r},function(e,t,n){function r(e){var t=-1,n=null==e?0:e.length;for(this.__data__=new i;++t<n;)this.add(e[t])}var i=n(213),o=n(260),a=n(261);r.prototype.add=r.prototype.push=o,r.prototype.has=a,e.exports=r},function(e,t){function n(e){return this.__data__.set(e,r),this}var r=\"__lodash_hash_undefined__\";e.exports=n},function(e,t){function n(e){return this.__data__.has(e)}e.exports=n},function(e,t){function n(e,t){for(var n=-1,r=null==e?0:e.length;++n<r;)if(t(e[n],n,e))return!0;return!1}e.exports=n},function(e,t){function n(e,t){return e.has(t)}e.exports=n},function(e,t,n){function r(e,t,n,r,i,k,E){switch(n){case w:if(e.byteLength!=t.byteLength||e.byteOffset!=t.byteOffset)return!1;e=e.buffer,t=t.buffer;case x:return!(e.byteLength!=t.byteLength||!k(new o(e),new o(t)));case f:case h:case v:return a(+e,+t);case d:return e.name==t.name&&e.message==t.message;case y:case _:return e==t+\"\";case m:var C=u;case g:var A=r&l;if(C||(C=c),e.size!=t.size&&!A)return!1;var T=E.get(e);if(T)return T==t;r|=p,E.set(e,t);var D=s(C(e),C(t),r,i,k,E);return E.delete(e),D;case b:if(S)return S.call(e)==S.call(t)}return!1}var i=n(151),o=n(265),a=n(234),s=n(258),u=n(266),c=n(267),l=1,p=2,f=\"[object Boolean]\",h=\"[object Date]\",d=\"[object Error]\",m=\"[object Map]\",v=\"[object Number]\",y=\"[object RegExp]\",g=\"[object Set]\",_=\"[object String]\",b=\"[object Symbol]\",x=\"[object ArrayBuffer]\",w=\"[object DataView]\",k=i?i.prototype:void 0,S=k?k.valueOf:void 0;e.exports=r},[1207,152],function(e,t){function n(e){var t=-1,n=Array(e.size);return e.forEach(function(e,r){n[++t]=[r,e]}),n}e.exports=n},function(e,t){function n(e){var t=-1,n=Array(e.size);return e.forEach(function(e){n[++t]=e}),n}e.exports=n},function(e,t,n){function r(e,t,n,r,a,u){var c=n&o,l=i(e),p=l.length,f=i(t),h=f.length;if(p!=h&&!c)return!1;for(var d=p;d--;){var m=l[d];if(!(c?m in t:s.call(t,m)))return!1}var v=u.get(e);if(v&&u.get(t))return v==t;var y=!0;u.set(e,t),u.set(t,e);for(var g=c;++d<p;){m=l[d];var _=e[m],b=t[m];if(r)var x=c?r(b,_,m,t,e,u):r(_,b,m,e,t,u);if(!(void 0===x?_===b||a(_,b,n,r,u):x)){y=!1;break}g||(g=\"constructor\"==m)}if(y&&!g){var w=e.constructor,k=t.constructor;w!=k&&\"constructor\"in e&&\"constructor\"in t&&!(\"function\"==typeof w&&w instanceof w&&\"function\"==typeof k&&k instanceof k)&&(y=!1)}return u.delete(e),u.delete(t),y}var i=n(269),o=1,a=Object.prototype,s=a.hasOwnProperty;e.exports=r},[1208,270,282,285],function(e,t,n){function r(e,t){var n=a(e),r=!n&&o(e),l=!n&&!r&&s(e),f=!n&&!r&&!l&&c(e),h=n||r||l||f,d=h?i(e.length,String):[],m=d.length;for(var v in e)!t&&!p.call(e,v)||h&&(\"length\"==v||l&&(\"offset\"==v||\"parent\"==v)||f&&(\"buffer\"==v||\"byteLength\"==v||\"byteOffset\"==v)||u(v,m))||d.push(v);return d}var i=n(271),o=n(272),a=n(193),s=n(274),u=n(276),c=n(277),l=Object.prototype,p=l.hasOwnProperty;e.exports=r},function(e,t){function n(e,t){for(var n=-1,r=Array(e);++n<e;)r[n]=t(n);return r}e.exports=n},function(e,t,n){var r=n(273),i=n(158),o=Object.prototype,a=o.hasOwnProperty,s=o.propertyIsEnumerable,u=r(function(){return arguments}())?r:function(e){return i(e)&&a.call(e,\"callee\")&&!s.call(e,\"callee\")};e.exports=u},function(e,t,n){function r(e){return o(e)&&i(e)==a}var i=n(150),o=n(158),a=\"[object Arguments]\";e.exports=r},[1209,152,275],function(e,t){function n(){return!1}e.exports=n},function(e,t){function n(e,t){return t=null==t?r:t,!!t&&(\"number\"==typeof e||i.test(e))&&e>-1&&e%1==0&&e<t}var r=9007199254740991,i=/^(?:0|[1-9]\\d*)$/;e.exports=n},[1210,278,280,281],function(e,t,n){function r(e){return a(e)&&o(e.length)&&!!O[i(e)]}var i=n(150),o=n(279),a=n(158),s=\"[object Arguments]\",u=\"[object Array]\",c=\"[object Boolean]\",l=\"[object Date]\",p=\"[object Error]\",f=\"[object Function]\",h=\"[object Map]\",d=\"[object Number]\",m=\"[object Object]\",v=\"[object RegExp]\",y=\"[object Set]\",g=\"[object String]\",_=\"[object WeakMap]\",b=\"[object ArrayBuffer]\",x=\"[object DataView]\",w=\"[object Float32Array]\",k=\"[object Float64Array]\",S=\"[object Int8Array]\",E=\"[object Int16Array]\",C=\"[object Int32Array]\",A=\"[object Uint8Array]\",T=\"[object Uint8ClampedArray]\",D=\"[object Uint16Array]\",M=\"[object Uint32Array]\",O={};O[w]=O[k]=O[S]=O[E]=O[C]=O[A]=O[T]=O[D]=O[M]=!0,O[s]=O[u]=O[b]=O[c]=O[x]=O[l]=O[p]=O[f]=O[h]=O[d]=O[m]=O[v]=O[y]=O[g]=O[_]=!1,e.exports=r},function(e,t){function n(e){return\"number\"==typeof e&&e>-1&&e%1==0&&e<=r}var r=9007199254740991;e.exports=n},function(e,t){function n(e){return function(t){return e(t)}}e.exports=n},function(e,t,n){(function(e){var r=n(153),i=\"object\"==typeof t&&t&&!t.nodeType&&t,o=i&&\"object\"==typeof e&&e&&!e.nodeType&&e,a=o&&o.exports===i,s=a&&r.process,u=function(){try{return s&&s.binding&&s.binding(\"util\")}catch(e){}}();e.exports=u}).call(t,n(161)(e))},[1211,283,284],function(e,t){function n(e){var t=e&&e.constructor,n=\"function\"==typeof t&&t.prototype||r;return e===n}var r=Object.prototype;e.exports=n},[1212,157],[1213,220,279],function(e,t,n){var r=n(287),i=n(238),o=n(288),a=n(289),s=n(290),u=n(150),c=n(224),l=\"[object Map]\",p=\"[object Object]\",f=\"[object Promise]\",h=\"[object Set]\",d=\"[object WeakMap]\",m=\"[object DataView]\",v=c(r),y=c(i),g=c(o),_=c(a),b=c(s),x=u;(r&&x(new r(new ArrayBuffer(1)))!=m||i&&x(new i)!=l||o&&x(o.resolve())!=f||a&&x(new a)!=h||s&&x(new s)!=d)&&(x=function(e){var t=u(e),n=t==p?e.constructor:void 0,r=n?c(n):\"\";if(r)switch(r){case v:return m;case y:return l;case g:return f;case _:return h;case b:return d}return t}),e.exports=x},[1214,218,152],[1215,218,152],[1216,218,152],[1217,218,152],[1218,292,269],[1219,221],function(e,t){function n(e,t){return function(n){return null!=n&&(n[e]===t&&(void 0!==t||e in Object(n)))}}e.exports=n},function(e,t,n){function r(e,t){return s(e)&&u(t)?c(l(e),t):function(n){var r=o(n,e);return void 0===r&&r===t?a(n,e):i(t,r,p|f)}}var i=n(256),o=n(295),a=n(302),s=n(298),u=n(292),c=n(293),l=n(301),p=1,f=2;e.exports=r},[1220,296],function(e,t,n){function r(e,t){t=i(t,e);for(var n=0,r=t.length;null!=e&&n<r;)e=e[o(t[n++])];return n&&n==r?e:void 0}var i=n(297),o=n(301);e.exports=r},function(e,t,n){function r(e,t){return i(e)?e:o(e,t)?[e]:a(s(e))}var i=n(193),o=n(298),a=n(299),s=n(190);e.exports=r},[1221,193,194],function(e,t,n){var r=n(300),i=/^\\./,o=/[^.[\\]]+|\\[(?:(-?\\d+(?:\\.\\d+)?)|([\"'])((?:(?!\\2)[^\\\\]|\\\\.)*?)\\2)\\]|(?=(?:\\.|\\[\\])(?:\\.|\\[\\]|$))/g,a=/\\\\(\\\\)?/g,s=r(function(e){var t=[];return i.test(e)&&t.push(\"\"),e.replace(o,function(e,n,r,i){t.push(r?i.replace(a,\"$1\"):n||e)}),t});e.exports=s},[1222,212],[1223,194],[1224,303,304],function(e,t){function n(e,t){return null!=e&&t in Object(e)}e.exports=n},function(e,t,n){function r(e,t,n){t=i(t,e);for(var r=-1,l=t.length,p=!1;++r<l;){var f=c(t[r]);if(!(p=null!=e&&n(e,f)))break;e=e[f]}return p||++r!=l?p:(l=null==e?0:e.length,!!l&&u(l)&&s(f,l)&&(a(e)||o(e)))}var i=n(297),o=n(272),a=n(193),s=n(276),u=n(279),c=n(301);e.exports=r},function(e,t){function n(e){return e}e.exports=n},[1225,307,308,298,301],function(e,t){function n(e){return function(t){return null==t?void 0:t[e]}}e.exports=n},[1226,296],function(e,t,n){function r(e,t,n){var r=null==e?0:e.length;if(!r)return-1;var u=null==n?0:a(n);return u<0&&(u=s(r+u,0)),i(e,o(t,3),u)}var i=n(310),o=n(247),a=n(311),s=Math.max;e.exports=r},function(e,t){function n(e,t,n,r){for(var i=e.length,o=n+(r?1:-1);r?o--:++o<i;)if(t(e[o],o,e))return o;return-1}e.exports=n},[1227,312],[1228,313],[1229,221,194],function(e,t,n){function r(e,t,n){var r=s(e)?i:a;return n&&u(e,t,n)&&(t=void 0),r(e,o(t,3))}var i=n(262),o=n(247),a=n(315),s=n(193),u=n(321);e.exports=r},function(e,t,n){function r(e,t){var n;return i(e,function(e,r,i){return n=t(e,r,i),!n}),!!n}var i=n(316);e.exports=r},function(e,t,n){var r=n(317),i=n(320),o=i(r);e.exports=o},function(e,t,n){function r(e,t){return e&&i(e,t,o)}var i=n(318),o=n(269);e.exports=r},function(e,t,n){var r=n(319),i=r();e.exports=i},function(e,t){function n(e){return function(t,n,r){for(var i=-1,o=Object(t),a=r(t),s=a.length;s--;){var u=a[e?s:++i];if(n(o[u],u,o)===!1)break}return t}}e.exports=n},function(e,t,n){function r(e,t){return function(n,r){if(null==n)return n;if(!i(n))return e(n,r);for(var o=n.length,a=t?o:-1,s=Object(n);(t?a--:++a<o)&&r(s[a],a,s)!==!1;);return n}}var i=n(285);e.exports=r},[1230,234,285,276,221],function(e,t,n){\"use strict\";function r(e){return e&&e.__esModule?e:{default:e}}function i(e,t){var n=h(e,t);if(n)return(0,s.default)(n,{declaration:!0,indent:\"\\t\"})}Object.defineProperty(t,\"__esModule\",{value:!0}),t.memoizedSampleFromSchema=t.memoizedCreateXMLExample=t.sampleXmlFromSchema=t.inferSchema=t.sampleFromSchema=void 0,t.createXMLExample=i;var o=n(183),a=n(323),s=r(a),u=n(350),c=r(u),l={string:function(){return\"string\"},string_email:function(){return\"user@example.com\"},\"string_date-time\":function(){return(new Date).toISOString()},number:function(){return 0},number_float:function(){return 0},integer:function(){return 0},boolean:function(){return!0}},p=function(e){e=(0,o.objectify)(e);var t=e,n=t.type,r=t.format,i=l[n+\"_\"+r]||l[n];return(0,o.isFunc)(i)?i(e):\"Unknown Type: \"+e.type},f=t.sampleFromSchema=function e(t){var n=arguments.length>1&&void 0!==arguments[1]?arguments[1]:{},r=(0,\no.objectify)(t),i=r.type,a=r.example,s=r.properties,u=r.additionalProperties,c=r.items,l=n.includeReadOnly;if(void 0!==a)return a;if(!i)if(s)i=\"object\";else{if(!c)return;i=\"array\"}if(\"object\"===i){var f=(0,o.objectify)(s),h={};for(var d in f)f[d].readOnly&&!l||(h[d]=e(f[d],{includeReadOnly:l}));if(u===!0)h.additionalProp1={};else if(u)for(var m=(0,o.objectify)(u),v=e(m,{includeReadOnly:l}),y=1;y<4;y++)h[\"additionalProp\"+y]=v;return h}return\"array\"===i?[e(c,{includeReadOnly:l})]:t.enum?t.default?t.default:(0,o.normalizeArray)(t.enum)[0]:p(t)},h=(t.inferSchema=function(e){return e.schema&&(e=e.schema),e.properties&&(e.type=\"object\"),e},t.sampleXmlFromSchema=function e(t){var n=arguments.length>1&&void 0!==arguments[1]?arguments[1]:{},r=(0,o.objectify)(t),i=r.type,a=r.properties,s=r.additionalProperties,u=r.items,c=r.example,l=n.includeReadOnly,f=r.default,h={},d={},m=t.xml,v=m.name,y=m.prefix,g=m.namespace,_=r.enum,b=void 0,x=void 0;if(!i)if(a||s)i=\"object\";else{if(!u)return;i=\"array\"}if(v=v||\"notagname\",b=(y?y+\":\":\"\")+v,g){var w=y?\"xmlns:\"+y:\"xmlns\";d[w]=g}if(\"array\"===i&&u){if(u.xml=u.xml||m||{},u.xml.name=u.xml.name||m.name,m.wrapped)return h[b]=[],Array.isArray(c)?c.forEach(function(t){u.example=t,h[b].push(e(u,n))}):Array.isArray(f)?f.forEach(function(t){u.default=t,h[b].push(e(u,n))}):h[b]=[e(u,n)],d&&h[b].push({_attr:d}),h;var k=[];return Array.isArray(c)?(c.forEach(function(t){u.example=t,k.push(e(u,n))}),k):Array.isArray(f)?(f.forEach(function(t){u.default=t,k.push(e(u,n))}),k):e(u,n)}if(\"object\"===i){var S=(0,o.objectify)(a);h[b]=[],c=c||{};for(var E in S)if(!S[E].readOnly||l)if(S[E].xml=S[E].xml||{},S[E].xml.attribute){var C=Array.isArray(S[E].enum)&&S[E].enum[0],A=S[E].example,T=S[E].default;d[S[E].xml.name||E]=void 0!==A&&A||void 0!==c[E]&&c[E]||void 0!==T&&T||C||p(S[E])}else{S[E].xml.name=S[E].xml.name||E,S[E].example=void 0!==S[E].example?S[E].example:c[E];var D=e(S[E]);Array.isArray(D)?h[b]=h[b].concat(D):h[b].push(D)}return s===!0?h[b].push({additionalProp:\"Anything can be here\"}):s&&h[b].push({additionalProp:p(s)}),d&&h[b].push({_attr:d}),h}return x=void 0!==c?c:void 0!==f?f:Array.isArray(_)?_[0]:p(t),h[b]=d?[{_attr:d},x]:x,h});t.memoizedCreateXMLExample=(0,c.default)(i),t.memoizedSampleFromSchema=(0,c.default)(f)},function(e,t,n){(function(t){function r(e,n){function r(e){v?t.nextTick(e):e()}function i(e,t){if(void 0!==t&&(h+=t),e&&!d&&(f=f||new l,d=!0),e&&d){var n=h;r(function(){f.emit(\"data\",n)}),h=\"\"}}function o(e,t){s(i,a(e,m,m?1:0),t)}function u(){if(f){var e=h;r(function(){f.emit(\"data\",e),f.emit(\"end\"),f.readable=!1,f.emit(\"close\")})}}function c(e){var t=e.encoding||\"UTF-8\",n={version:\"1.0\",encoding:t};e.standalone&&(n.standalone=e.standalone),o({\"?xml\":{_attr:n}}),h=h.replace(\"/>\",\"?>\")}\"object\"!=typeof n&&(n={indent:n});var f=n.stream?new l:null,h=\"\",d=!1,m=n.indent?n.indent===!0?p:n.indent:\"\",v=!0;return r(function(){v=!1}),n.declaration&&c(n.declaration),e&&e.forEach?e.forEach(function(t,n){var r;n+1===e.length&&(r=u),o(t,r)}):o(e,u),f?(f.readable=!0,f):h}function i(){var e=Array.prototype.slice.call(arguments),t={_elem:a(e)};return t.push=function(e){if(!this.append)throw new Error(\"not assigned to a parent!\");var t=this,n=this._elem.indent;s(this.append,a(e,n,this._elem.icount+(n?1:0)),function(){t.append(!0)})},t.close=function(e){void 0!==e&&this.push(e),this.end&&this.end()},t}function o(e,t){return new Array(t||0).join(e||\"\")}function a(e,t,n){function r(e){var t=Object.keys(e);t.forEach(function(t){d.push(u(t,e[t]))})}n=n||0;var i,s=o(t,n),l=e,p=!1;if(\"object\"==typeof e){var f=Object.keys(e);if(i=f[0],l=e[i],l&&l._elem)return l._elem.name=i,l._elem.icount=n,l._elem.indent=t,l._elem.indents=s,l._elem.interrupt=l,l._elem}var h,d=[],m=[];switch(typeof l){case\"object\":if(null===l)break;l._attr&&r(l._attr),l._cdata&&m.push((\"<![CDATA[\"+l._cdata).replace(/\\]\\]>/g,\"]]]]><![CDATA[>\")+\"]]>\"),l.forEach&&(h=!1,m.push(\"\"),l.forEach(function(e){if(\"object\"==typeof e){var i=Object.keys(e)[0];\"_attr\"==i?r(e._attr):m.push(a(e,t,n+1))}else m.pop(),h=!0,m.push(c(e))}),h||m.push(\"\"));break;default:m.push(c(l))}return{name:i,interrupt:p,attributes:d,content:m,icount:n,indents:s,indent:t}}function s(e,t,n){function r(){for(;t.content.length;){var r=t.content.shift();if(void 0!==r){if(i(r))return;s(e,r)}}e(!1,(o>1?t.indents:\"\")+(t.name?\"</\"+t.name+\">\":\"\")+(t.indent&&!n?\"\\n\":\"\")),n&&n()}function i(t){return!!t.interrupt&&(t.interrupt.append=e,t.interrupt.end=r,t.interrupt=!1,e(!0),!0)}if(\"object\"!=typeof t)return e(!1,t);var o=t.interrupt?1:t.content.length;return e(!1,t.indents+(t.name?\"<\"+t.name:\"\")+(t.attributes.length?\" \"+t.attributes.join(\" \"):\"\")+(o?t.name?\">\":\"\":t.name?\"/>\":\"\")+(t.indent&&o>1?\"\\n\":\"\")),o?void(i(t)||r()):e(!1,t.indent?\"\\n\":\"\")}function u(e,t){return e+'=\"'+c(t)+'\"'}var c=n(325),l=n(326).Stream,p=\"    \";e.exports=r,e.exports.element=e.exports.Element=i}).call(t,n(324))},function(e,t){function n(){throw new Error(\"setTimeout has not been defined\")}function r(){throw new Error(\"clearTimeout has not been defined\")}function i(e){if(l===setTimeout)return setTimeout(e,0);if((l===n||!l)&&setTimeout)return l=setTimeout,setTimeout(e,0);try{return l(e,0)}catch(t){try{return l.call(null,e,0)}catch(t){return l.call(this,e,0)}}}function o(e){if(p===clearTimeout)return clearTimeout(e);if((p===r||!p)&&clearTimeout)return p=clearTimeout,clearTimeout(e);try{return p(e)}catch(t){try{return p.call(null,e)}catch(t){return p.call(this,e)}}}function a(){m&&h&&(m=!1,h.length?d=h.concat(d):v=-1,d.length&&s())}function s(){if(!m){var e=i(a);m=!0;for(var t=d.length;t;){for(h=d,d=[];++v<t;)h&&h[v].run();v=-1,t=d.length}h=null,m=!1,o(e)}}function u(e,t){this.fun=e,this.array=t}function c(){}var l,p,f=e.exports={};!function(){try{l=\"function\"==typeof setTimeout?setTimeout:n}catch(e){l=n}try{p=\"function\"==typeof clearTimeout?clearTimeout:r}catch(e){p=r}}();var h,d=[],m=!1,v=-1;f.nextTick=function(e){var t=new Array(arguments.length-1);if(arguments.length>1)for(var n=1;n<arguments.length;n++)t[n-1]=arguments[n];d.push(new u(e,t)),1!==d.length||m||i(s)},u.prototype.run=function(){this.fun.apply(null,this.array)},f.title=\"browser\",f.browser=!0,f.env={},f.argv=[],f.version=\"\",f.versions={},f.on=c,f.addListener=c,f.once=c,f.off=c,f.removeListener=c,f.removeAllListeners=c,f.emit=c,f.prependListener=c,f.prependOnceListener=c,f.listeners=function(e){return[]},f.binding=function(e){throw new Error(\"process.binding is not supported\")},f.cwd=function(){return\"/\"},f.chdir=function(e){throw new Error(\"process.chdir is not supported\")},f.umask=function(){return 0}},function(e,t){function n(e){return e&&e.replace?e.replace(/([&\"<>'])/g,function(e,t){return r[t]}):e}var r={\"&\":\"&amp;\",'\"':\"&quot;\",\"'\":\"&apos;\",\"<\":\"&lt;\",\">\":\"&gt;\"};e.exports=n},function(e,t,n){function r(){i.call(this)}e.exports=r;var i=n(327).EventEmitter,o=n(328);o(r,i),r.Readable=n(329),r.Writable=n(346),r.Duplex=n(347),r.Transform=n(348),r.PassThrough=n(349),r.Stream=r,r.prototype.pipe=function(e,t){function n(t){e.writable&&!1===e.write(t)&&c.pause&&c.pause()}function r(){c.readable&&c.resume&&c.resume()}function o(){l||(l=!0,e.end())}function a(){l||(l=!0,\"function\"==typeof e.destroy&&e.destroy())}function s(e){if(u(),0===i.listenerCount(this,\"error\"))throw e}function u(){c.removeListener(\"data\",n),e.removeListener(\"drain\",r),c.removeListener(\"end\",o),c.removeListener(\"close\",a),c.removeListener(\"error\",s),e.removeListener(\"error\",s),c.removeListener(\"end\",u),c.removeListener(\"close\",u),e.removeListener(\"close\",u)}var c=this;c.on(\"data\",n),e.on(\"drain\",r),e._isStdio||t&&t.end===!1||(c.on(\"end\",o),c.on(\"close\",a));var l=!1;return c.on(\"error\",s),e.on(\"error\",s),c.on(\"end\",u),c.on(\"close\",u),e.on(\"close\",u),e.emit(\"pipe\",c),e}},function(e,t){function n(){this._events=this._events||{},this._maxListeners=this._maxListeners||void 0}function r(e){return\"function\"==typeof e}function i(e){return\"number\"==typeof e}function o(e){return\"object\"==typeof e&&null!==e}function a(e){return void 0===e}e.exports=n,n.EventEmitter=n,n.prototype._events=void 0,n.prototype._maxListeners=void 0,n.defaultMaxListeners=10,n.prototype.setMaxListeners=function(e){if(!i(e)||e<0||isNaN(e))throw TypeError(\"n must be a positive number\");return this._maxListeners=e,this},n.prototype.emit=function(e){var t,n,i,s,u,c;if(this._events||(this._events={}),\"error\"===e&&(!this._events.error||o(this._events.error)&&!this._events.error.length)){if(t=arguments[1],t instanceof Error)throw t;var l=new Error('Uncaught, unspecified \"error\" event. ('+t+\")\");throw l.context=t,l}if(n=this._events[e],a(n))return!1;if(r(n))switch(arguments.length){case 1:n.call(this);break;case 2:n.call(this,arguments[1]);break;case 3:n.call(this,arguments[1],arguments[2]);break;default:s=Array.prototype.slice.call(arguments,1),n.apply(this,s)}else if(o(n))for(s=Array.prototype.slice.call(arguments,1),c=n.slice(),i=c.length,u=0;u<i;u++)c[u].apply(this,s);return!0},n.prototype.addListener=function(e,t){var i;if(!r(t))throw TypeError(\"listener must be a function\");return this._events||(this._events={}),this._events.newListener&&this.emit(\"newListener\",e,r(t.listener)?t.listener:t),this._events[e]?o(this._events[e])?this._events[e].push(t):this._events[e]=[this._events[e],t]:this._events[e]=t,o(this._events[e])&&!this._events[e].warned&&(i=a(this._maxListeners)?n.defaultMaxListeners:this._maxListeners,i&&i>0&&this._events[e].length>i&&(this._events[e].warned=!0,console.error(\"(node) warning: possible EventEmitter memory leak detected. %d listeners added. Use emitter.setMaxListeners() to increase limit.\",this._events[e].length),\"function\"==typeof console.trace&&console.trace())),this},n.prototype.on=n.prototype.addListener,n.prototype.once=function(e,t){function n(){this.removeListener(e,n),i||(i=!0,t.apply(this,arguments))}if(!r(t))throw TypeError(\"listener must be a function\");var i=!1;return n.listener=t,this.on(e,n),this},n.prototype.removeListener=function(e,t){var n,i,a,s;if(!r(t))throw TypeError(\"listener must be a function\");if(!this._events||!this._events[e])return this;if(n=this._events[e],a=n.length,i=-1,n===t||r(n.listener)&&n.listener===t)delete this._events[e],this._events.removeListener&&this.emit(\"removeListener\",e,t);else if(o(n)){for(s=a;s-- >0;)if(n[s]===t||n[s].listener&&n[s].listener===t){i=s;break}if(i<0)return this;1===n.length?(n.length=0,delete this._events[e]):n.splice(i,1),this._events.removeListener&&this.emit(\"removeListener\",e,t)}return this},n.prototype.removeAllListeners=function(e){var t,n;if(!this._events)return this;if(!this._events.removeListener)return 0===arguments.length?this._events={}:this._events[e]&&delete this._events[e],this;if(0===arguments.length){for(t in this._events)\"removeListener\"!==t&&this.removeAllListeners(t);return this.removeAllListeners(\"removeListener\"),this._events={},this}if(n=this._events[e],r(n))this.removeListener(e,n);else if(n)for(;n.length;)this.removeListener(e,n[n.length-1]);return delete this._events[e],this},n.prototype.listeners=function(e){var t;return t=this._events&&this._events[e]?r(this._events[e])?[this._events[e]]:this._events[e].slice():[]},n.prototype.listenerCount=function(e){if(this._events){var t=this._events[e];if(r(t))return 1;if(t)return t.length}return 0},n.listenerCount=function(e,t){return e.listenerCount(t)}},function(e,t){\"function\"==typeof Object.create?e.exports=function(e,t){e.super_=t,e.prototype=Object.create(t.prototype,{constructor:{value:e,enumerable:!1,writable:!0,configurable:!0}})}:e.exports=function(e,t){e.super_=t;var n=function(){};n.prototype=t.prototype,e.prototype=new n,e.prototype.constructor=e}},function(e,t,n){t=e.exports=n(330),t.Stream=t,t.Readable=t,t.Writable=n(339),t.Duplex=n(338),t.Transform=n(344),t.PassThrough=n(345)},function(e,t,n){(function(t){\"use strict\";function r(e){return j.from(e)}function i(e){return\"[object Uint8Array]\"===Object.prototype.toString.call(e)||j.isBuffer(e)}function o(e,t,n){return\"function\"==typeof e.prependListener?e.prependListener(t,n):void(e._events&&e._events[t]?I(e._events[t])?e._events[t].unshift(n):e._events[t]=[n,e._events[t]]:e.on(t,n))}function a(e,t){P=P||n(338),e=e||{},this.objectMode=!!e.objectMode,t instanceof P&&(this.objectMode=this.objectMode||!!e.readableObjectMode);var r=e.highWaterMark,i=this.objectMode?16:16384;this.highWaterMark=r||0===r?r:i,this.highWaterMark=Math.floor(this.highWaterMark),this.buffer=new q,this.length=0,this.pipes=null,this.pipesCount=0,this.flowing=null,this.ended=!1,this.endEmitted=!1,this.reading=!1,this.sync=!0,this.needReadable=!1,this.emittedReadable=!1,this.readableListening=!1,this.resumeScheduled=!1,this.destroyed=!1,this.defaultEncoding=e.defaultEncoding||\"utf8\",this.awaitDrain=0,this.readingMore=!1,this.decoder=null,this.encoding=null,e.encoding&&(z||(z=n(343).StringDecoder),this.decoder=new z(e.encoding),this.encoding=e.encoding)}function s(e){return P=P||n(338),this instanceof s?(this._readableState=new a(e,this),this.readable=!0,e&&(\"function\"==typeof e.read&&(this._read=e.read),\"function\"==typeof e.destroy&&(this._destroy=e.destroy)),void R.call(this)):new s(e)}function u(e,t,n,i,o){var a=e._readableState;if(null===t)a.reading=!1,d(e,a);else{var s;o||(s=l(a,t)),s?e.emit(\"error\",s):a.objectMode||t&&t.length>0?(\"string\"==typeof t||Object.getPrototypeOf(t)===j.prototype||a.objectMode||(t=r(t)),i?a.endEmitted?e.emit(\"error\",new Error(\"stream.unshift() after end event\")):c(e,a,t,!0):a.ended?e.emit(\"error\",new Error(\"stream.push() after EOF\")):(a.reading=!1,a.decoder&&!n?(t=a.decoder.write(t),a.objectMode||0!==t.length?c(e,a,t,!1):y(e,a)):c(e,a,t,!1))):i||(a.reading=!1)}return p(a)}function c(e,t,n,r){t.flowing&&0===t.length&&!t.sync?(e.emit(\"data\",n),e.read(0)):(t.length+=t.objectMode?1:n.length,r?t.buffer.unshift(n):t.buffer.push(n),t.needReadable&&m(e)),y(e,t)}function l(e,t){var n;return i(t)||\"string\"==typeof t||void 0===t||e.objectMode||(n=new TypeError(\"Invalid non-string/buffer chunk\")),n}function p(e){return!e.ended&&(e.needReadable||e.length<e.highWaterMark||0===e.length)}function f(e){return e>=K?e=K:(e--,e|=e>>>1,e|=e>>>2,e|=e>>>4,e|=e>>>8,e|=e>>>16,e++),e}function h(e,t){return e<=0||0===t.length&&t.ended?0:t.objectMode?1:e!==e?t.flowing&&t.length?t.buffer.head.data.length:t.length:(e>t.highWaterMark&&(t.highWaterMark=f(e)),e<=t.length?e:t.ended?t.length:(t.needReadable=!0,0))}function d(e,t){if(!t.ended){if(t.decoder){var n=t.decoder.end();n&&n.length&&(t.buffer.push(n),t.length+=t.objectMode?1:n.length)}t.ended=!0,m(e)}}function m(e){var t=e._readableState;t.needReadable=!1,t.emittedReadable||(L(\"emitReadable\",t.flowing),t.emittedReadable=!0,t.sync?O(v,e):v(e))}function v(e){L(\"emit readable\"),e.emit(\"readable\"),k(e)}function y(e,t){t.readingMore||(t.readingMore=!0,O(g,e,t))}function g(e,t){for(var n=t.length;!t.reading&&!t.flowing&&!t.ended&&t.length<t.highWaterMark&&(L(\"maybeReadMore read 0\"),e.read(0),n!==t.length);)n=t.length;t.readingMore=!1}function _(e){return function(){var t=e._readableState;L(\"pipeOnDrain\",t.awaitDrain),t.awaitDrain&&t.awaitDrain--,0===t.awaitDrain&&N(e,\"data\")&&(t.flowing=!0,k(e))}}function b(e){L(\"readable nexttick read 0\"),e.read(0)}function x(e,t){t.resumeScheduled||(t.resumeScheduled=!0,O(w,e,t))}function w(e,t){t.reading||(L(\"resume read 0\"),e.read(0)),t.resumeScheduled=!1,t.awaitDrain=0,e.emit(\"resume\"),k(e),t.flowing&&!t.reading&&e.read(0)}function k(e){var t=e._readableState;for(L(\"flow\",t.flowing);t.flowing&&null!==e.read(););}function S(e,t){if(0===t.length)return null;var n;return t.objectMode?n=t.buffer.shift():!e||e>=t.length?(n=t.decoder?t.buffer.join(\"\"):1===t.buffer.length?t.buffer.head.data:t.buffer.concat(t.length),t.buffer.clear()):n=E(e,t.buffer,t.decoder),n}function E(e,t,n){var r;return e<t.head.data.length?(r=t.head.data.slice(0,e),t.head.data=t.head.data.slice(e)):r=e===t.head.data.length?t.shift():n?C(e,t):A(e,t),r}function C(e,t){var n=t.head,r=1,i=n.data;for(e-=i.length;n=n.next;){var o=n.data,a=e>o.length?o.length:e;if(i+=a===o.length?o:o.slice(0,e),e-=a,0===e){a===o.length?(++r,n.next?t.head=n.next:t.head=t.tail=null):(t.head=n,n.data=o.slice(a));break}++r}return t.length-=r,i}function A(e,t){var n=j.allocUnsafe(e),r=t.head,i=1;for(r.data.copy(n),e-=r.data.length;r=r.next;){var o=r.data,a=e>o.length?o.length:e;if(o.copy(n,n.length-e,0,a),e-=a,0===e){a===o.length?(++i,r.next?t.head=r.next:t.head=t.tail=null):(t.head=r,r.data=o.slice(a));break}++i}return t.length-=i,n}function T(e){var t=e._readableState;if(t.length>0)throw new Error('\"endReadable()\" called on non-empty stream');t.endEmitted||(t.ended=!0,O(D,t,e))}function D(e,t){e.endEmitted||0!==e.length||(e.endEmitted=!0,t.readable=!1,t.emit(\"end\"))}function M(e,t){for(var n=0,r=e.length;n<r;n++)if(e[n]===t)return n;return-1}var O=n(331);e.exports=s;var P,I=n(135);s.ReadableState=a;var N=(n(327).EventEmitter,function(e,t){return e.listeners(t).length}),R=n(332),j=n(333).Buffer,F=n(334);F.inherits=n(328);var B=n(335),L=void 0;L=B&&B.debuglog?B.debuglog(\"stream\"):function(){};var z,q=n(336),U=n(337);F.inherits(s,R);var W=[\"error\",\"close\",\"destroy\",\"pause\",\"resume\"];Object.defineProperty(s.prototype,\"destroyed\",{get:function(){return void 0!==this._readableState&&this._readableState.destroyed},set:function(e){this._readableState&&(this._readableState.destroyed=e)}}),s.prototype.destroy=U.destroy,s.prototype._undestroy=U.undestroy,s.prototype._destroy=function(e,t){this.push(null),t(e)},s.prototype.push=function(e,t){var n,r=this._readableState;return r.objectMode?n=!0:\"string\"==typeof e&&(t=t||r.defaultEncoding,t!==r.encoding&&(e=j.from(e,t),t=\"\"),n=!0),u(this,e,t,!1,n)},s.prototype.unshift=function(e){return u(this,e,null,!0,!1)},s.prototype.isPaused=function(){return this._readableState.flowing===!1},s.prototype.setEncoding=function(e){return z||(z=n(343).StringDecoder),this._readableState.decoder=new z(e),this._readableState.encoding=e,this};var K=8388608;s.prototype.read=function(e){L(\"read\",e),e=parseInt(e,10);var t=this._readableState,n=e;if(0!==e&&(t.emittedReadable=!1),0===e&&t.needReadable&&(t.length>=t.highWaterMark||t.ended))return L(\"read: emitReadable\",t.length,t.ended),0===t.length&&t.ended?T(this):m(this),null;if(e=h(e,t),0===e&&t.ended)return 0===t.length&&T(this),null;var r=t.needReadable;L(\"need readable\",r),(0===t.length||t.length-e<t.highWaterMark)&&(r=!0,L(\"length less than watermark\",r)),t.ended||t.reading?(r=!1,L(\"reading or ended\",r)):r&&(L(\"do read\"),t.reading=!0,t.sync=!0,0===t.length&&(t.needReadable=!0),this._read(t.highWaterMark),t.sync=!1,t.reading||(e=h(n,t)));var i;return i=e>0?S(e,t):null,null===i?(t.needReadable=!0,e=0):t.length-=e,0===t.length&&(t.ended||(t.needReadable=!0),n!==e&&t.ended&&T(this)),null!==i&&this.emit(\"data\",i),i},s.prototype._read=function(e){this.emit(\"error\",new Error(\"_read() is not implemented\"))},s.prototype.pipe=function(e,n){function r(e,t){L(\"onunpipe\"),e===f&&t&&t.hasUnpiped===!1&&(t.hasUnpiped=!0,a())}function i(){L(\"onend\"),e.end()}function a(){L(\"cleanup\"),e.removeListener(\"close\",c),e.removeListener(\"finish\",l),e.removeListener(\"drain\",v),e.removeListener(\"error\",u),e.removeListener(\"unpipe\",r),f.removeListener(\"end\",i),f.removeListener(\"end\",p),f.removeListener(\"data\",s),y=!0,!h.awaitDrain||e._writableState&&!e._writableState.needDrain||v()}function s(t){L(\"ondata\"),g=!1;var n=e.write(t);!1!==n||g||((1===h.pipesCount&&h.pipes===e||h.pipesCount>1&&M(h.pipes,e)!==-1)&&!y&&(L(\"false write response, pause\",f._readableState.awaitDrain),f._readableState.awaitDrain++,g=!0),f.pause())}function u(t){L(\"onerror\",t),p(),e.removeListener(\"error\",u),0===N(e,\"error\")&&e.emit(\"error\",t)}function c(){e.removeListener(\"finish\",l),p()}function l(){L(\"onfinish\"),e.removeListener(\"close\",c),p()}function p(){L(\"unpipe\"),f.unpipe(e)}var f=this,h=this._readableState;switch(h.pipesCount){case 0:h.pipes=e;break;case 1:h.pipes=[h.pipes,e];break;default:h.pipes.push(e)}h.pipesCount+=1,L(\"pipe count=%d opts=%j\",h.pipesCount,n);var d=(!n||n.end!==!1)&&e!==t.stdout&&e!==t.stderr,m=d?i:p;h.endEmitted?O(m):f.once(\"end\",m),e.on(\"unpipe\",r);var v=_(f);e.on(\"drain\",v);var y=!1,g=!1;return f.on(\"data\",s),o(e,\"error\",u),e.once(\"close\",c),e.once(\"finish\",l),e.emit(\"pipe\",f),h.flowing||(L(\"pipe resume\"),f.resume()),e},s.prototype.unpipe=function(e){var t=this._readableState,n={hasUnpiped:!1};if(0===t.pipesCount)return this;if(1===t.pipesCount)return e&&e!==t.pipes?this:(e||(e=t.pipes),t.pipes=null,t.pipesCount=0,t.flowing=!1,e&&e.emit(\"unpipe\",this,n),this);if(!e){var r=t.pipes,i=t.pipesCount;t.pipes=null,t.pipesCount=0,t.flowing=!1;for(var o=0;o<i;o++)r[o].emit(\"unpipe\",this,n);return this}var a=M(t.pipes,e);return a===-1?this:(t.pipes.splice(a,1),t.pipesCount-=1,1===t.pipesCount&&(t.pipes=t.pipes[0]),e.emit(\"unpipe\",this,n),this)},s.prototype.on=function(e,t){var n=R.prototype.on.call(this,e,t);if(\"data\"===e)this._readableState.flowing!==!1&&this.resume();else if(\"readable\"===e){var r=this._readableState;r.endEmitted||r.readableListening||(r.readableListening=r.needReadable=!0,r.emittedReadable=!1,r.reading?r.length&&m(this):O(b,this))}return n},s.prototype.addListener=s.prototype.on,s.prototype.resume=function(){var e=this._readableState;return e.flowing||(L(\"resume\"),e.flowing=!0,x(this,e)),this},s.prototype.pause=function(){return L(\"call pause flowing=%j\",this._readableState.flowing),!1!==this._readableState.flowing&&(L(\"pause\"),this._readableState.flowing=!1,this.emit(\"pause\")),this},s.prototype.wrap=function(e){var t=this._readableState,n=!1,r=this;e.on(\"end\",function(){if(L(\"wrapped end\"),t.decoder&&!t.ended){var e=t.decoder.end();e&&e.length&&r.push(e)}r.push(null)}),e.on(\"data\",function(i){if(L(\"wrapped data\"),t.decoder&&(i=t.decoder.write(i)),(!t.objectMode||null!==i&&void 0!==i)&&(t.objectMode||i&&i.length)){var o=r.push(i);o||(n=!0,e.pause())}});for(var i in e)void 0===this[i]&&\"function\"==typeof e[i]&&(this[i]=function(t){return function(){return e[t].apply(e,arguments)}}(i));for(var o=0;o<W.length;o++)e.on(W[o],r.emit.bind(r,W[o]));return r._read=function(t){L(\"wrapped _read\",t),n&&(n=!1,e.resume())},r},s._fromList=S}).call(t,n(324))},function(e,t,n){(function(t){\"use strict\";function n(e,n,r,i){if(\"function\"!=typeof e)throw new TypeError('\"callback\" argument must be a function');var o,a,s=arguments.length;switch(s){case 0:case 1:return t.nextTick(e);case 2:return t.nextTick(function(){e.call(null,n)});case 3:return t.nextTick(function(){e.call(null,n,r)});case 4:return t.nextTick(function(){e.call(null,n,r,i)});default:for(o=new Array(s-1),a=0;a<o.length;)o[a++]=arguments[a];return t.nextTick(function(){e.apply(null,o)})}}!t.version||0===t.version.indexOf(\"v0.\")||0===t.version.indexOf(\"v1.\")&&0!==t.version.indexOf(\"v1.8.\")?e.exports=n:e.exports=t.nextTick}).call(t,n(324))},function(e,t,n){e.exports=n(327).EventEmitter},function(e,t,n){function r(e,t){for(var n in e)t[n]=e[n]}function i(e,t,n){return a(e,t,n)}var o=n(132),a=o.Buffer;a.from&&a.alloc&&a.allocUnsafe&&a.allocUnsafeSlow?e.exports=o:(r(o,t),t.Buffer=i),r(a,i),i.from=function(e,t,n){if(\"number\"==typeof e)throw new TypeError(\"Argument must not be a number\");return a(e,t,n)},i.alloc=function(e,t,n){if(\"number\"!=typeof e)throw new TypeError(\"Argument must be a number\");var r=a(e);return void 0!==t?\"string\"==typeof n?r.fill(t,n):r.fill(t):r.fill(0),r},i.allocUnsafe=function(e){if(\"number\"!=typeof e)throw new TypeError(\"Argument must be a number\");return a(e)},i.allocUnsafeSlow=function(e){if(\"number\"!=typeof e)throw new TypeError(\"Argument must be a number\");return o.SlowBuffer(e)}},function(e,t,n){(function(e){function n(e){return Array.isArray?Array.isArray(e):\"[object Array]\"===v(e)}function r(e){return\"boolean\"==typeof e}function i(e){return null===e}function o(e){return null==e}function a(e){return\"number\"==typeof e}function s(e){return\"string\"==typeof e}function u(e){return\"symbol\"==typeof e}function c(e){return void 0===e}function l(e){return\"[object RegExp]\"===v(e)}function p(e){return\"object\"==typeof e&&null!==e}function f(e){return\"[object Date]\"===v(e)}function h(e){return\"[object Error]\"===v(e)||e instanceof Error}function d(e){return\"function\"==typeof e}function m(e){return null===e||\"boolean\"==typeof e||\"number\"==typeof e||\"string\"==typeof e||\"symbol\"==typeof e||\"undefined\"==typeof e}function v(e){return Object.prototype.toString.call(e)}t.isArray=n,t.isBoolean=r,t.isNull=i,t.isNullOrUndefined=o,t.isNumber=a,t.isString=s,t.isSymbol=u,t.isUndefined=c,t.isRegExp=l,t.isObject=p,t.isDate=f,t.isError=h,t.isFunction=d,t.isPrimitive=m,t.isBuffer=e.isBuffer}).call(t,n(132).Buffer)},function(e,t){},function(e,t,n){\"use strict\";function r(e,t){if(!(e instanceof t))throw new TypeError(\"Cannot call a class as a function\")}function i(e,t,n){e.copy(t,n)}var o=n(333).Buffer;e.exports=function(){function e(){r(this,e),this.head=null,this.tail=null,this.length=0}return e.prototype.push=function(e){var t={data:e,next:null};this.length>0?this.tail.next=t:this.head=t,this.tail=t,++this.length},e.prototype.unshift=function(e){var t={data:e,next:this.head};0===this.length&&(this.tail=t),this.head=t,++this.length},e.prototype.shift=function(){if(0!==this.length){var e=this.head.data;return 1===this.length?this.head=this.tail=null:this.head=this.head.next,--this.length,e}},e.prototype.clear=function(){this.head=this.tail=null,this.length=0},e.prototype.join=function(e){if(0===this.length)return\"\";for(var t=this.head,n=\"\"+t.data;t=t.next;)n+=e+t.data;return n},e.prototype.concat=function(e){if(0===this.length)return o.alloc(0);if(1===this.length)return this.head.data;for(var t=o.allocUnsafe(e>>>0),n=this.head,r=0;n;)i(n.data,t,r),r+=n.data.length,n=n.next;return t},e}()},function(e,t,n){\"use strict\";function r(e,t){var n=this,r=this._readableState&&this._readableState.destroyed,i=this._writableState&&this._writableState.destroyed;return r||i?void(t?t(e):!e||this._writableState&&this._writableState.errorEmitted||a(o,this,e)):(this._readableState&&(this._readableState.destroyed=!0),this._writableState&&(this._writableState.destroyed=!0),void this._destroy(e||null,function(e){!t&&e?(a(o,n,e),n._writableState&&(n._writableState.errorEmitted=!0)):t&&t(e)}))}function i(){this._readableState&&(this._readableState.destroyed=!1,this._readableState.reading=!1,this._readableState.ended=!1,this._readableState.endEmitted=!1),this._writableState&&(this._writableState.destroyed=!1,this._writableState.ended=!1,this._writableState.ending=!1,this._writableState.finished=!1,this._writableState.errorEmitted=!1)}function o(e,t){e.emit(\"error\",t)}var a=n(331);e.exports={destroy:r,undestroy:i}},function(e,t,n){\"use strict\";function r(e){return this instanceof r?(c.call(this,e),l.call(this,e),e&&e.readable===!1&&(this.readable=!1),e&&e.writable===!1&&(this.writable=!1),this.allowHalfOpen=!0,e&&e.allowHalfOpen===!1&&(this.allowHalfOpen=!1),void this.once(\"end\",i)):new r(e)}function i(){this.allowHalfOpen||this._writableState.ended||a(o,this)}function o(e){e.end()}var a=n(331),s=Object.keys||function(e){var t=[];for(var n in e)t.push(n);return t};e.exports=r;var u=n(334);u.inherits=n(328);var c=n(330),l=n(339);u.inherits(r,c);for(var p=s(l.prototype),f=0;f<p.length;f++){var h=p[f];r.prototype[h]||(r.prototype[h]=l.prototype[h])}Object.defineProperty(r.prototype,\"destroyed\",{get:function(){return void 0!==this._readableState&&void 0!==this._writableState&&(this._readableState.destroyed&&this._writableState.destroyed)},set:function(e){void 0!==this._readableState&&void 0!==this._writableState&&(this._readableState.destroyed=e,this._writableState.destroyed=e)}}),r.prototype._destroy=function(e,t){this.push(null),this.end(),a(t,e)}},function(e,t,n){(function(t,r){\"use strict\";function i(e){var t=this;this.next=null,this.entry=null,this.finish=function(){C(t,e)}}function o(e){return I.from(e)}function a(e){return\"[object Uint8Array]\"===Object.prototype.toString.call(e)||I.isBuffer(e)}function s(){}function u(e,t){T=T||n(338),e=e||{},this.objectMode=!!e.objectMode,t instanceof T&&(this.objectMode=this.objectMode||!!e.writableObjectMode);var r=e.highWaterMark,o=this.objectMode?16:16384;this.highWaterMark=r||0===r?r:o,this.highWaterMark=Math.floor(this.highWaterMark),this.finalCalled=!1,this.needDrain=!1,this.ending=!1,this.ended=!1,this.finished=!1,this.destroyed=!1;var a=e.decodeStrings===!1;this.decodeStrings=!a,this.defaultEncoding=e.defaultEncoding||\"utf8\",this.length=0,this.writing=!1,this.corked=0,this.sync=!0,this.bufferProcessing=!1,this.onwrite=function(e){y(t,e)},this.writecb=null,this.writelen=0,this.bufferedRequest=null,this.lastBufferedRequest=null,this.pendingcb=0,this.prefinished=!1,this.errorEmitted=!1,this.bufferedRequestCount=0,this.corkedRequestsFree=new i(this)}function c(e){return T=T||n(338),R.call(c,this)||this instanceof T?(this._writableState=new u(e,this),this.writable=!0,e&&(\"function\"==typeof e.write&&(this._write=e.write),\"function\"==typeof e.writev&&(this._writev=e.writev),\"function\"==typeof e.destroy&&(this._destroy=e.destroy),\"function\"==typeof e.final&&(this._final=e.final)),void P.call(this)):new c(e)}function l(e,t){var n=new Error(\"write after end\");e.emit(\"error\",n),A(t,n)}function p(e,t,n,r){var i=!0,o=!1;return null===n?o=new TypeError(\"May not write null values to stream\"):\"string\"==typeof n||void 0===n||t.objectMode||(o=new TypeError(\"Invalid non-string/buffer chunk\")),o&&(e.emit(\"error\",o),A(r,o),i=!1),i}function f(e,t,n){return e.objectMode||e.decodeStrings===!1||\"string\"!=typeof t||(t=I.from(t,n)),t}function h(e,t,n,r,i,o){if(!n){var a=f(t,r,i);r!==a&&(n=!0,i=\"buffer\",r=a)}var s=t.objectMode?1:r.length;t.length+=s;var u=t.length<t.highWaterMark;if(u||(t.needDrain=!0),t.writing||t.corked){var c=t.lastBufferedRequest;t.lastBufferedRequest={chunk:r,encoding:i,isBuf:n,callback:o,next:null},c?c.next=t.lastBufferedRequest:t.bufferedRequest=t.lastBufferedRequest,t.bufferedRequestCount+=1}else d(e,t,!1,s,r,i,o);return u}function d(e,t,n,r,i,o,a){t.writelen=r,t.writecb=a,t.writing=!0,t.sync=!0,n?e._writev(i,t.onwrite):e._write(i,o,t.onwrite),t.sync=!1}function m(e,t,n,r,i){--t.pendingcb,n?(A(i,r),A(S,e,t),e._writableState.errorEmitted=!0,e.emit(\"error\",r)):(i(r),e._writableState.errorEmitted=!0,e.emit(\"error\",r),S(e,t))}function v(e){e.writing=!1,e.writecb=null,e.length-=e.writelen,e.writelen=0}function y(e,t){var n=e._writableState,r=n.sync,i=n.writecb;if(v(n),t)m(e,n,r,t,i);else{var o=x(n);o||n.corked||n.bufferProcessing||!n.bufferedRequest||b(e,n),r?D(g,e,n,o,i):g(e,n,o,i)}}function g(e,t,n,r){n||_(e,t),t.pendingcb--,r(),S(e,t)}function _(e,t){0===t.length&&t.needDrain&&(t.needDrain=!1,e.emit(\"drain\"))}function b(e,t){t.bufferProcessing=!0;var n=t.bufferedRequest;if(e._writev&&n&&n.next){var r=t.bufferedRequestCount,o=new Array(r),a=t.corkedRequestsFree;a.entry=n;for(var s=0,u=!0;n;)o[s]=n,n.isBuf||(u=!1),n=n.next,s+=1;o.allBuffers=u,d(e,t,!0,t.length,o,\"\",a.finish),t.pendingcb++,t.lastBufferedRequest=null,a.next?(t.corkedRequestsFree=a.next,a.next=null):t.corkedRequestsFree=new i(t)}else{for(;n;){var c=n.chunk,l=n.encoding,p=n.callback,f=t.objectMode?1:c.length;if(d(e,t,!1,f,c,l,p),n=n.next,t.writing)break}null===n&&(t.lastBufferedRequest=null)}t.bufferedRequestCount=0,t.bufferedRequest=n,t.bufferProcessing=!1}function x(e){return e.ending&&0===e.length&&null===e.bufferedRequest&&!e.finished&&!e.writing}function w(e,t){e._final(function(n){t.pendingcb--,n&&e.emit(\"error\",n),t.prefinished=!0,e.emit(\"prefinish\"),S(e,t)})}function k(e,t){t.prefinished||t.finalCalled||(\"function\"==typeof e._final?(t.pendingcb++,t.finalCalled=!0,A(w,e,t)):(t.prefinished=!0,e.emit(\"prefinish\")))}function S(e,t){var n=x(t);return n&&(k(e,t),0===t.pendingcb&&(t.finished=!0,e.emit(\"finish\"))),n}function E(e,t,n){t.ending=!0,S(e,t),n&&(t.finished?A(n):e.once(\"finish\",n)),t.ended=!0,e.writable=!1}function C(e,t,n){var r=e.entry;for(e.entry=null;r;){var i=r.callback;t.pendingcb--,i(n),r=r.next}t.corkedRequestsFree?t.corkedRequestsFree.next=e:t.corkedRequestsFree=e}var A=n(331);e.exports=c;var T,D=!t.browser&&[\"v0.10\",\"v0.9.\"].indexOf(t.version.slice(0,5))>-1?r:A;\nc.WritableState=u;var M=n(334);M.inherits=n(328);var O={deprecate:n(342)},P=n(332),I=n(333).Buffer,N=n(337);M.inherits(c,P),u.prototype.getBuffer=function(){for(var e=this.bufferedRequest,t=[];e;)t.push(e),e=e.next;return t},function(){try{Object.defineProperty(u.prototype,\"buffer\",{get:O.deprecate(function(){return this.getBuffer()},\"_writableState.buffer is deprecated. Use _writableState.getBuffer instead.\",\"DEP0003\")})}catch(e){}}();var R;\"function\"==typeof Symbol&&Symbol.hasInstance&&\"function\"==typeof Function.prototype[Symbol.hasInstance]?(R=Function.prototype[Symbol.hasInstance],Object.defineProperty(c,Symbol.hasInstance,{value:function(e){return!!R.call(this,e)||e&&e._writableState instanceof u}})):R=function(e){return e instanceof this},c.prototype.pipe=function(){this.emit(\"error\",new Error(\"Cannot pipe, not readable\"))},c.prototype.write=function(e,t,n){var r=this._writableState,i=!1,u=a(e)&&!r.objectMode;return u&&!I.isBuffer(e)&&(e=o(e)),\"function\"==typeof t&&(n=t,t=null),u?t=\"buffer\":t||(t=r.defaultEncoding),\"function\"!=typeof n&&(n=s),r.ended?l(this,n):(u||p(this,r,e,n))&&(r.pendingcb++,i=h(this,r,u,e,t,n)),i},c.prototype.cork=function(){var e=this._writableState;e.corked++},c.prototype.uncork=function(){var e=this._writableState;e.corked&&(e.corked--,e.writing||e.corked||e.finished||e.bufferProcessing||!e.bufferedRequest||b(this,e))},c.prototype.setDefaultEncoding=function(e){if(\"string\"==typeof e&&(e=e.toLowerCase()),!([\"hex\",\"utf8\",\"utf-8\",\"ascii\",\"binary\",\"base64\",\"ucs2\",\"ucs-2\",\"utf16le\",\"utf-16le\",\"raw\"].indexOf((e+\"\").toLowerCase())>-1))throw new TypeError(\"Unknown encoding: \"+e);return this._writableState.defaultEncoding=e,this},c.prototype._write=function(e,t,n){n(new Error(\"_write() is not implemented\"))},c.prototype._writev=null,c.prototype.end=function(e,t,n){var r=this._writableState;\"function\"==typeof e?(n=e,e=null,t=null):\"function\"==typeof t&&(n=t,t=null),null!==e&&void 0!==e&&this.write(e,t),r.corked&&(r.corked=1,this.uncork()),r.ending||r.finished||E(this,r,n)},Object.defineProperty(c.prototype,\"destroyed\",{get:function(){return void 0!==this._writableState&&this._writableState.destroyed},set:function(e){this._writableState&&(this._writableState.destroyed=e)}}),c.prototype.destroy=N.destroy,c.prototype._undestroy=N.undestroy,c.prototype._destroy=function(e,t){this.end(),t(e)}}).call(t,n(324),n(340).setImmediate)},function(e,t,n){function r(e,t){this._id=e,this._clearFn=t}var i=Function.prototype.apply;t.setTimeout=function(){return new r(i.call(setTimeout,window,arguments),clearTimeout)},t.setInterval=function(){return new r(i.call(setInterval,window,arguments),clearInterval)},t.clearTimeout=t.clearInterval=function(e){e&&e.close()},r.prototype.unref=r.prototype.ref=function(){},r.prototype.close=function(){this._clearFn.call(window,this._id)},t.enroll=function(e,t){clearTimeout(e._idleTimeoutId),e._idleTimeout=t},t.unenroll=function(e){clearTimeout(e._idleTimeoutId),e._idleTimeout=-1},t._unrefActive=t.active=function(e){clearTimeout(e._idleTimeoutId);var t=e._idleTimeout;t>=0&&(e._idleTimeoutId=setTimeout(function(){e._onTimeout&&e._onTimeout()},t))},n(341),t.setImmediate=setImmediate,t.clearImmediate=clearImmediate},function(e,t,n){(function(e,t){!function(e,n){\"use strict\";function r(e){\"function\"!=typeof e&&(e=new Function(\"\"+e));for(var t=new Array(arguments.length-1),n=0;n<t.length;n++)t[n]=arguments[n+1];var r={callback:e,args:t};return m[d]=r,h(d),d++}function i(e){delete m[e]}function o(e){var t=e.callback,r=e.args;switch(r.length){case 0:t();break;case 1:t(r[0]);break;case 2:t(r[0],r[1]);break;case 3:t(r[0],r[1],r[2]);break;default:t.apply(n,r)}}function a(e){if(v)setTimeout(a,0,e);else{var t=m[e];if(t){v=!0;try{o(t)}finally{i(e),v=!1}}}}function s(){h=function(e){t.nextTick(function(){a(e)})}}function u(){if(e.postMessage&&!e.importScripts){var t=!0,n=e.onmessage;return e.onmessage=function(){t=!1},e.postMessage(\"\",\"*\"),e.onmessage=n,t}}function c(){var t=\"setImmediate$\"+Math.random()+\"$\",n=function(n){n.source===e&&\"string\"==typeof n.data&&0===n.data.indexOf(t)&&a(+n.data.slice(t.length))};e.addEventListener?e.addEventListener(\"message\",n,!1):e.attachEvent(\"onmessage\",n),h=function(n){e.postMessage(t+n,\"*\")}}function l(){var e=new MessageChannel;e.port1.onmessage=function(e){var t=e.data;a(t)},h=function(t){e.port2.postMessage(t)}}function p(){var e=y.documentElement;h=function(t){var n=y.createElement(\"script\");n.onreadystatechange=function(){a(t),n.onreadystatechange=null,e.removeChild(n),n=null},e.appendChild(n)}}function f(){h=function(e){setTimeout(a,0,e)}}if(!e.setImmediate){var h,d=1,m={},v=!1,y=e.document,g=Object.getPrototypeOf&&Object.getPrototypeOf(e);g=g&&g.setTimeout?g:e,\"[object process]\"==={}.toString.call(e.process)?s():u()?c():e.MessageChannel?l():y&&\"onreadystatechange\"in y.createElement(\"script\")?p():f(),g.setImmediate=r,g.clearImmediate=i}}(\"undefined\"==typeof self?\"undefined\"==typeof e?this:e:self)}).call(t,function(){return this}(),n(324))},function(e,t){(function(t){function n(e,t){function n(){if(!i){if(r(\"throwDeprecation\"))throw new Error(t);r(\"traceDeprecation\")?console.trace(t):console.warn(t),i=!0}return e.apply(this,arguments)}if(r(\"noDeprecation\"))return e;var i=!1;return n}function r(e){try{if(!t.localStorage)return!1}catch(e){return!1}var n=t.localStorage[e];return null!=n&&\"true\"===String(n).toLowerCase()}e.exports=n}).call(t,function(){return this}())},function(e,t,n){\"use strict\";function r(e){if(!e)return\"utf8\";for(var t;;)switch(e){case\"utf8\":case\"utf-8\":return\"utf8\";case\"ucs2\":case\"ucs-2\":case\"utf16le\":case\"utf-16le\":return\"utf16le\";case\"latin1\":case\"binary\":return\"latin1\";case\"base64\":case\"ascii\":case\"hex\":return e;default:if(t)return;e=(\"\"+e).toLowerCase(),t=!0}}function i(e){var t=r(e);if(\"string\"!=typeof t&&(g.isEncoding===_||!_(e)))throw new Error(\"Unknown encoding: \"+e);return t||e}function o(e){this.encoding=i(e);var t;switch(this.encoding){case\"utf16le\":this.text=f,this.end=h,t=4;break;case\"utf8\":this.fillLast=c,t=4;break;case\"base64\":this.text=d,this.end=m,t=3;break;default:return this.write=v,void(this.end=y)}this.lastNeed=0,this.lastTotal=0,this.lastChar=g.allocUnsafe(t)}function a(e){return e<=127?0:e>>5===6?2:e>>4===14?3:e>>3===30?4:-1}function s(e,t,n){var r=t.length-1;if(r<n)return 0;var i=a(t[r]);return i>=0?(i>0&&(e.lastNeed=i-1),i):--r<n?0:(i=a(t[r]),i>=0?(i>0&&(e.lastNeed=i-2),i):--r<n?0:(i=a(t[r]),i>=0?(i>0&&(2===i?i=0:e.lastNeed=i-3),i):0))}function u(e,t,n){if(128!==(192&t[0]))return e.lastNeed=0,\"�\".repeat(n);if(e.lastNeed>1&&t.length>1){if(128!==(192&t[1]))return e.lastNeed=1,\"�\".repeat(n+1);if(e.lastNeed>2&&t.length>2&&128!==(192&t[2]))return e.lastNeed=2,\"�\".repeat(n+2)}}function c(e){var t=this.lastTotal-this.lastNeed,n=u(this,e,t);return void 0!==n?n:this.lastNeed<=e.length?(e.copy(this.lastChar,t,0,this.lastNeed),this.lastChar.toString(this.encoding,0,this.lastTotal)):(e.copy(this.lastChar,t,0,e.length),void(this.lastNeed-=e.length))}function l(e,t){var n=s(this,e,t);if(!this.lastNeed)return e.toString(\"utf8\",t);this.lastTotal=n;var r=e.length-(n-this.lastNeed);return e.copy(this.lastChar,0,r),e.toString(\"utf8\",t,r)}function p(e){var t=e&&e.length?this.write(e):\"\";return this.lastNeed?t+\"�\".repeat(this.lastTotal-this.lastNeed):t}function f(e,t){if((e.length-t)%2===0){var n=e.toString(\"utf16le\",t);if(n){var r=n.charCodeAt(n.length-1);if(r>=55296&&r<=56319)return this.lastNeed=2,this.lastTotal=4,this.lastChar[0]=e[e.length-2],this.lastChar[1]=e[e.length-1],n.slice(0,-1)}return n}return this.lastNeed=1,this.lastTotal=2,this.lastChar[0]=e[e.length-1],e.toString(\"utf16le\",t,e.length-1)}function h(e){var t=e&&e.length?this.write(e):\"\";if(this.lastNeed){var n=this.lastTotal-this.lastNeed;return t+this.lastChar.toString(\"utf16le\",0,n)}return t}function d(e,t){var n=(e.length-t)%3;return 0===n?e.toString(\"base64\",t):(this.lastNeed=3-n,this.lastTotal=3,1===n?this.lastChar[0]=e[e.length-1]:(this.lastChar[0]=e[e.length-2],this.lastChar[1]=e[e.length-1]),e.toString(\"base64\",t,e.length-n))}function m(e){var t=e&&e.length?this.write(e):\"\";return this.lastNeed?t+this.lastChar.toString(\"base64\",0,3-this.lastNeed):t}function v(e){return e.toString(this.encoding)}function y(e){return e&&e.length?this.write(e):\"\"}var g=n(333).Buffer,_=g.isEncoding||function(e){switch(e=\"\"+e,e&&e.toLowerCase()){case\"hex\":case\"utf8\":case\"utf-8\":case\"ascii\":case\"binary\":case\"base64\":case\"ucs2\":case\"ucs-2\":case\"utf16le\":case\"utf-16le\":case\"raw\":return!0;default:return!1}};t.StringDecoder=o,o.prototype.write=function(e){if(0===e.length)return\"\";var t,n;if(this.lastNeed){if(t=this.fillLast(e),void 0===t)return\"\";n=this.lastNeed,this.lastNeed=0}else n=0;return n<e.length?t?t+this.text(e,n):this.text(e,n):t||\"\"},o.prototype.end=p,o.prototype.text=l,o.prototype.fillLast=function(e){return this.lastNeed<=e.length?(e.copy(this.lastChar,this.lastTotal-this.lastNeed,0,this.lastNeed),this.lastChar.toString(this.encoding,0,this.lastTotal)):(e.copy(this.lastChar,this.lastTotal-this.lastNeed,0,e.length),void(this.lastNeed-=e.length))}},function(e,t,n){\"use strict\";function r(e){this.afterTransform=function(t,n){return i(e,t,n)},this.needTransform=!1,this.transforming=!1,this.writecb=null,this.writechunk=null,this.writeencoding=null}function i(e,t,n){var r=e._transformState;r.transforming=!1;var i=r.writecb;if(!i)return e.emit(\"error\",new Error(\"write callback called multiple times\"));r.writechunk=null,r.writecb=null,null!==n&&void 0!==n&&e.push(n),i(t);var o=e._readableState;o.reading=!1,(o.needReadable||o.length<o.highWaterMark)&&e._read(o.highWaterMark)}function o(e){if(!(this instanceof o))return new o(e);s.call(this,e),this._transformState=new r(this);var t=this;this._readableState.needReadable=!0,this._readableState.sync=!1,e&&(\"function\"==typeof e.transform&&(this._transform=e.transform),\"function\"==typeof e.flush&&(this._flush=e.flush)),this.once(\"prefinish\",function(){\"function\"==typeof this._flush?this._flush(function(e,n){a(t,e,n)}):a(t)})}function a(e,t,n){if(t)return e.emit(\"error\",t);null!==n&&void 0!==n&&e.push(n);var r=e._writableState,i=e._transformState;if(r.length)throw new Error(\"Calling transform done when ws.length != 0\");if(i.transforming)throw new Error(\"Calling transform done when still transforming\");return e.push(null)}e.exports=o;var s=n(338),u=n(334);u.inherits=n(328),u.inherits(o,s),o.prototype.push=function(e,t){return this._transformState.needTransform=!1,s.prototype.push.call(this,e,t)},o.prototype._transform=function(e,t,n){throw new Error(\"_transform() is not implemented\")},o.prototype._write=function(e,t,n){var r=this._transformState;if(r.writecb=n,r.writechunk=e,r.writeencoding=t,!r.transforming){var i=this._readableState;(r.needTransform||i.needReadable||i.length<i.highWaterMark)&&this._read(i.highWaterMark)}},o.prototype._read=function(e){var t=this._transformState;null!==t.writechunk&&t.writecb&&!t.transforming?(t.transforming=!0,this._transform(t.writechunk,t.writeencoding,t.afterTransform)):t.needTransform=!0},o.prototype._destroy=function(e,t){var n=this;s.prototype._destroy.call(this,e,function(e){t(e),n.emit(\"close\")})}},function(e,t,n){\"use strict\";function r(e){return this instanceof r?void i.call(this,e):new r(e)}e.exports=r;var i=n(344),o=n(334);o.inherits=n(328),o.inherits(r,i),r.prototype._transform=function(e,t,n){n(null,e)}},function(e,t,n){e.exports=n(339)},function(e,t,n){e.exports=n(338)},function(e,t,n){e.exports=n(329).Transform},function(e,t,n){e.exports=n(329).PassThrough},function(e,t,n){\"use strict\";var r=n(351),i=n(352),o=n(358);e.exports=function(e){var t,a=r(arguments[1]);return a.normalizer||(t=a.length=i(a.length,e.length,a.async),0!==t&&(a.primitive?t===!1?a.normalizer=n(396):t>1&&(a.normalizer=n(397)(t)):t===!1?a.normalizer=n(398)():1===t?a.normalizer=n(400)():a.normalizer=n(401)(t))),a.async&&n(402),a.promise&&n(405),a.dispose&&n(407),a.maxAge&&n(408),a.max&&n(411),a.refCounter&&n(413),o(e,a)}},function(e,t){\"use strict\";var n=Array.prototype.forEach,r=Object.create,i=function(e,t){var n;for(n in e)t[n]=e[n]};e.exports=function(e){var t=r(null);return n.call(arguments,function(e){null!=e&&i(Object(e),t)}),t}},function(e,t,n){\"use strict\";var r=n(353);e.exports=function(e,t,n){var i;return isNaN(e)?(i=t,i>=0?n&&i?i-1:i:1):e!==!1&&r(e)}},function(e,t,n){\"use strict\";var r=n(354),i=Math.max;e.exports=function(e){return i(0,r(e))}},function(e,t,n){\"use strict\";var r=n(355),i=Math.abs,o=Math.floor;e.exports=function(e){return isNaN(e)?0:(e=Number(e),0!==e&&isFinite(e)?r(e)*o(i(e)):e)}},function(e,t,n){\"use strict\";e.exports=n(356)()?Math.sign:n(357)},function(e,t){\"use strict\";e.exports=function(){var e=Math.sign;return\"function\"==typeof e&&(1===e(10)&&e(-20)===-1)}},function(e,t){\"use strict\";e.exports=function(e){return e=Number(e),isNaN(e)||0===e?e:e>0?1:-1}},function(e,t,n){\"use strict\";var r=n(359),i=n(360),o=n(363),a=n(364),s=n(352),u=Object.prototype.hasOwnProperty;e.exports=function e(t){var n,c,l;if(r(t),n=Object(arguments[1]),n.async&&n.promise)throw new Error(\"Options 'async' and 'promise' cannot be used together\");return u.call(t,\"__memoized__\")&&!n.force?t:(c=s(n.length,t.length,n.async&&o.async),l=a(t,c,n),i(o,function(e,t){n[t]&&e(n[t],l,n)}),e.__profiler__&&e.__profiler__(l),l.updateEnv(),l.memoized)}},function(e,t){\"use strict\";e.exports=function(e){if(\"function\"!=typeof e)throw new TypeError(e+\" is not a function\");return e}},function(e,t,n){\"use strict\";e.exports=n(361)(\"forEach\")},function(e,t,n){\"use strict\";var r=n(359),i=n(362),o=Function.prototype.bind,a=Function.prototype.call,s=Object.keys,u=Object.prototype.propertyIsEnumerable;e.exports=function(e,t){return function(n,c){var l,p=arguments[2],f=arguments[3];return n=Object(i(n)),r(c),l=s(n),f&&l.sort(\"function\"==typeof f?o.call(f,n):void 0),\"function\"!=typeof e&&(e=l[e]),a.call(e,l,function(e,r){return u.call(n,e)?a.call(c,p,n[e],e,n,r):t})}}},function(e,t){\"use strict\";e.exports=function(e){if(null==e)throw new TypeError(\"Cannot use null or undefined\");return e}},function(e,t){\"use strict\"},function(e,t,n){\"use strict\";var r=n(365),i=n(373),o=n(375),a=n(380).methods,s=n(381),u=n(395),c=Function.prototype.apply,l=Function.prototype.call,p=Object.create,f=Object.prototype.hasOwnProperty,h=Object.defineProperties,d=a.on,m=a.emit;e.exports=function(e,t,n){var a,v,y,g,_,b,x,w,k,S,E,C,A,T=p(null);return v=t!==!1?t:isNaN(e.length)?1:e.length,n.normalizer&&(w=u(n.normalizer),y=w.get,g=w.set,_=w.delete,b=w.clear),null!=n.resolvers&&(A=s(n.resolvers)),C=y?i(function(t){var n,i,o=arguments;if(A&&(o=A(o)),n=y(o),null!==n&&f.call(T,n))return k&&a.emit(\"get\",n,o,this),T[n];if(i=1===o.length?l.call(e,this,o[0]):c.call(e,this,o),null===n){if(n=y(o),null!==n)throw r(\"Circular invocation\",\"CIRCULAR_INVOCATION\");n=g(o)}else if(f.call(T,n))throw r(\"Circular invocation\",\"CIRCULAR_INVOCATION\");return T[n]=i,S&&a.emit(\"set\",n,null,i),i},v):0===t?function(){var t;if(f.call(T,\"data\"))return k&&a.emit(\"get\",\"data\",arguments,this),T.data;if(t=arguments.length?c.call(e,this,arguments):l.call(e,this),f.call(T,\"data\"))throw r(\"Circular invocation\",\"CIRCULAR_INVOCATION\");return T.data=t,S&&a.emit(\"set\",\"data\",null,t),t}:function(t){var n,i,o=arguments;if(A&&(o=A(arguments)),i=String(o[0]),f.call(T,i))return k&&a.emit(\"get\",i,o,this),T[i];if(n=1===o.length?l.call(e,this,o[0]):c.call(e,this,o),f.call(T,i))throw r(\"Circular invocation\",\"CIRCULAR_INVOCATION\");return T[i]=n,S&&a.emit(\"set\",i,null,n),n},a={original:e,memoized:C,get:function(e){return A&&(e=A(e)),y?y(e):String(e[0])},has:function(e){return f.call(T,e)},delete:function(e){var t;f.call(T,e)&&(_&&_(e),t=T[e],delete T[e],E&&a.emit(\"delete\",e,t))},clear:function(){var e=T;b&&b(),T=p(null),a.emit(\"clear\",e)},on:function(e,t){return\"get\"===e?k=!0:\"set\"===e?S=!0:\"delete\"===e&&(E=!0),d.call(this,e,t)},emit:m,updateEnv:function(){e=a.original}},x=y?i(function(e){var t,n=arguments;A&&(n=A(n)),t=y(n),null!==t&&a.delete(t)},v):0===t?function(){return a.delete(\"data\")}:function(e){return A&&(e=A(arguments)[0]),a.delete(e)},h(C,{__memoized__:o(!0),delete:o(x),clear:o(a.clear)}),a}},function(e,t,n){\"use strict\";var r=n(366),i=n(372),o=Error.captureStackTrace;t=e.exports=function(e){var n=new Error(e),a=arguments[1],s=arguments[2];return null==s&&i(a)&&(s=a,a=null),null!=s&&r(n,s),null!=a&&(n.code=a),o&&o(n,t),n}},function(e,t,n){\"use strict\";e.exports=n(367)()?Object.assign:n(368)},function(e,t){\"use strict\";e.exports=function(){var e,t=Object.assign;return\"function\"==typeof t&&(e={foo:\"raz\"},t(e,{bar:\"dwa\"},{trzy:\"trzy\"}),e.foo+e.bar+e.trzy===\"razdwatrzy\")}},function(e,t,n){\"use strict\";var r=n(369),i=n(362),o=Math.max;e.exports=function(e,t){var n,a,s,u=o(arguments.length,2);for(e=Object(i(e)),s=function(r){try{e[r]=t[r]}catch(e){n||(n=e)}},a=1;a<u;++a)t=arguments[a],r(t).forEach(s);if(void 0!==n)throw n;return e}},function(e,t,n){\"use strict\";e.exports=n(370)()?Object.keys:n(371)},function(e,t){\"use strict\";e.exports=function(){try{return Object.keys(\"primitive\"),!0}catch(e){return!1}}},function(e,t){\"use strict\";var n=Object.keys;e.exports=function(e){return n(null==e?e:Object(e))}},function(e,t){\"use strict\";var n={function:!0,object:!0};e.exports=function(e){return null!=e&&n[typeof e]||!1}},function(e,t,n){\"use strict\";var r,i,o,a,s=n(353),u=function(e,t){};try{Object.defineProperty(u,\"length\",{configurable:!0,writable:!1,enumerable:!1,value:1})}catch(e){}1===u.length?(r={configurable:!0,writable:!1,enumerable:!1},i=Object.defineProperty,e.exports=function(e,t){return t=s(t),e.length===t?e:(r.value=t,i(e,\"length\",r))}):(a=n(374),o=function(){var e=[];return function(t){var n,r=0;if(e[t])return e[t];for(n=[];t--;)n.push(\"a\"+(++r).toString(36));return new Function(\"fn\",\"return function (\"+n.join(\", \")+\") { return fn.apply(this, arguments); };\")}}(),e.exports=function(e,t){var n;if(t=s(t),e.length===t)return e;n=o(t)(e);try{a(n,e)}catch(e){}return n})},function(e,t,n){\"use strict\";var r=n(362),i=Object.defineProperty,o=Object.getOwnPropertyDescriptor,a=Object.getOwnPropertyNames,s=Object.getOwnPropertySymbols;e.exports=function(e,t){var n,u=Object(r(t));if(e=Object(r(e)),a(u).forEach(function(r){try{i(e,r,o(t,r))}catch(e){n=e}}),\"function\"==typeof s&&s(u).forEach(function(r){try{i(e,r,o(t,r))}catch(e){n=e}}),void 0!==n)throw n;return e}},function(e,t,n){\"use strict\";var r,i=n(366),o=n(351),a=n(376),s=n(377);r=e.exports=function(e,t){var n,r,a,u,c;return arguments.length<2||\"string\"!=typeof e?(u=t,t=e,e=null):u=arguments[2],null==e?(n=a=!0,r=!1):(n=s.call(e,\"c\"),r=s.call(e,\"e\"),a=s.call(e,\"w\")),c={value:t,configurable:n,enumerable:r,writable:a},u?i(o(u),c):c},r.gs=function(e,t,n){var r,u,c,l;return\"string\"!=typeof e?(c=n,n=t,t=e,e=null):c=arguments[3],null==t?t=void 0:a(t)?null==n?n=void 0:a(n)||(c=n,n=void 0):(c=t,t=n=void 0),null==e?(r=!0,u=!1):(r=s.call(e,\"c\"),u=s.call(e,\"e\")),l={get:t,set:n,configurable:r,enumerable:u},c?i(o(c),l):l}},function(e,t){\"use strict\";e.exports=function(e){return\"function\"==typeof e}},function(e,t,n){\"use strict\";e.exports=n(378)()?String.prototype.contains:n(379)},function(e,t){\"use strict\";var n=\"razdwatrzy\";e.exports=function(){return\"function\"==typeof n.contains&&(n.contains(\"dwa\")===!0&&n.contains(\"foo\")===!1)}},function(e,t){\"use strict\";var n=String.prototype.indexOf;e.exports=function(e){return n.call(this,e,arguments[1])>-1}},function(e,t,n){\"use strict\";var r,i,o,a,s,u,c,l=n(375),p=n(359),f=Function.prototype.apply,h=Function.prototype.call,d=Object.create,m=Object.defineProperty,v=Object.defineProperties,y=Object.prototype.hasOwnProperty,g={configurable:!0,enumerable:!1,writable:!0};r=function(e,t){var n;return p(t),y.call(this,\"__ee__\")?n=this.__ee__:(n=g.value=d(null),m(this,\"__ee__\",g),g.value=null),n[e]?\"object\"==typeof n[e]?n[e].push(t):n[e]=[n[e],t]:n[e]=t,this},i=function(e,t){var n,i;return p(t),i=this,r.call(this,e,n=function(){o.call(i,e,n),f.call(t,this,arguments)}),n.__eeOnceListener__=t,this},o=function(e,t){var n,r,i,o;if(p(t),!y.call(this,\"__ee__\"))return this;if(n=this.__ee__,!n[e])return this;if(r=n[e],\"object\"==typeof r)for(o=0;i=r[o];++o)i!==t&&i.__eeOnceListener__!==t||(2===r.length?n[e]=r[o?0:1]:r.splice(o,1));else r!==t&&r.__eeOnceListener__!==t||delete n[e];return this},a=function(e){var t,n,r,i,o;if(y.call(this,\"__ee__\")&&(i=this.__ee__[e]))if(\"object\"==typeof i){for(n=arguments.length,o=new Array(n-1),t=1;t<n;++t)o[t-1]=arguments[t];for(i=i.slice(),t=0;r=i[t];++t)f.call(r,this,o)}else switch(arguments.length){case 1:h.call(i,this);break;case 2:h.call(i,this,arguments[1]);break;case 3:h.call(i,this,arguments[1],arguments[2]);break;default:for(n=arguments.length,o=new Array(n-1),t=1;t<n;++t)o[t-1]=arguments[t];f.call(i,this,o)}},s={on:r,once:i,off:o,emit:a},u={on:l(r),once:l(i),off:l(o),emit:l(a)},c=v({},u),e.exports=t=function(e){return null==e?d(c):v(Object(e),u)},t.methods=s},function(e,t,n){\"use strict\";var r,i=n(382),o=n(359),a=Array.prototype.slice;r=function(e){return this.map(function(t,n){return t?t(e[n]):e[n]}).concat(a.call(e,this.length))},e.exports=function(e){return e=i(e),e.forEach(function(e){null!=e&&o(e)}),r.bind(e)}},function(e,t,n){\"use strict\";var r=n(383),i=Array.isArray;e.exports=function(e){return i(e)?e:r(e)}},function(e,t,n){\"use strict\";e.exports=n(384)()?Array.from:n(385)},function(e,t){\"use strict\";e.exports=function(){var e,t,n=Array.from;return\"function\"==typeof n&&(e=[\"raz\",\"dwa\"],t=n(e),Boolean(t&&t!==e&&\"dwa\"===t[1]))}},function(e,t,n){\"use strict\";var r=n(386).iterator,i=n(391),o=n(392),a=n(353),s=n(359),u=n(362),c=n(394),l=Array.isArray,p=Function.prototype.call,f={configurable:!0,enumerable:!0,writable:!0,value:null},h=Object.defineProperty;e.exports=function(e){var t,n,d,m,v,y,g,_,b,x,w=arguments[1],k=arguments[2];if(e=Object(u(e)),null!=w&&s(w),this&&this!==Array&&o(this))t=this;else{if(!w){if(i(e))return v=e.length,1!==v?Array.apply(null,e):(m=new Array(1),m[0]=e[0],m);if(l(e)){for(m=new Array(v=e.length),n=0;n<v;++n)m[n]=e[n];return m}}m=[]}if(!l(e))if(void 0!==(b=e[r])){for(g=s(b).call(e),t&&(m=new t),_=g.next(),n=0;!_.done;)x=w?p.call(w,k,_.value,n):_.value,t?(f.value=x,h(m,n,f)):m[n]=x,_=g.next(),++n;v=n}else if(c(e)){for(v=e.length,t&&(m=new t),n=0,d=0;n<v;++n)x=e[n],n+1<v&&(y=x.charCodeAt(0),y>=55296&&y<=56319&&(x+=e[++n])),x=w?p.call(w,k,x,d):x,t?(f.value=x,h(m,d,f)):m[d]=x,++d;v=d}if(void 0===v)for(v=a(e.length),t&&(m=new t(v)),n=0;n<v;++n)x=w?p.call(w,k,e[n],n):e[n],t?(f.value=x,h(m,n,f)):m[n]=x;return t&&(f.value=null,m.length=v),m}},function(e,t,n){\"use strict\";e.exports=n(387)()?Symbol:n(388)},function(e,t){\"use strict\";var n={object:!0,symbol:!0};e.exports=function(){var e;if(\"function\"!=typeof Symbol)return!1;e=Symbol(\"test symbol\");try{String(e)}catch(e){return!1}return!!n[typeof Symbol.iterator]&&(!!n[typeof Symbol.toPrimitive]&&!!n[typeof Symbol.toStringTag])}},function(e,t,n){\"use strict\";var r,i,o,a,s=n(375),u=n(389),c=Object.create,l=Object.defineProperties,p=Object.defineProperty,f=Object.prototype,h=c(null);if(\"function\"==typeof Symbol){r=Symbol;try{String(r()),a=!0}catch(e){}}var d=function(){var e=c(null);return function(t){for(var n,r,i=0;e[t+(i||\"\")];)++i;return t+=i||\"\",e[t]=!0,n=\"@@\"+t,p(f,n,s.gs(null,function(e){r||(r=!0,p(this,n,s(e)),r=!1)})),n}}();o=function(e){if(this instanceof o)throw new TypeError(\"Symbol is not a constructor\");return i(e)},e.exports=i=function e(t){var n;if(this instanceof e)throw new TypeError(\"Symbol is not a constructor\");return a?r(t):(n=c(o.prototype),t=void 0===t?\"\":String(t),l(n,{__description__:s(\"\",t),__name__:s(\"\",d(t))}))},l(i,{for:s(function(e){return h[e]?h[e]:h[e]=i(String(e))}),keyFor:s(function(e){var t;u(e);for(t in h)if(h[t]===e)return t}),hasInstance:s(\"\",r&&r.hasInstance||i(\"hasInstance\")),isConcatSpreadable:s(\"\",r&&r.isConcatSpreadable||i(\"isConcatSpreadable\")),iterator:s(\"\",r&&r.iterator||i(\"iterator\")),match:s(\"\",r&&r.match||i(\"match\")),replace:s(\"\",r&&r.replace||i(\"replace\")),search:s(\"\",r&&r.search||i(\"search\")),species:s(\"\",r&&r.species||i(\"species\")),split:s(\"\",r&&r.split||i(\"split\")),toPrimitive:s(\"\",r&&r.toPrimitive||i(\"toPrimitive\")),toStringTag:s(\"\",r&&r.toStringTag||i(\"toStringTag\")),unscopables:s(\"\",r&&r.unscopables||i(\"unscopables\"))}),l(o.prototype,{constructor:s(i),toString:s(\"\",function(){return this.__name__})}),l(i.prototype,{toString:s(function(){return\"Symbol (\"+u(this).__description__+\")\"}),valueOf:s(function(){return u(this)})}),p(i.prototype,i.toPrimitive,s(\"\",function(){var e=u(this);return\"symbol\"==typeof e?e:e.toString()})),p(i.prototype,i.toStringTag,s(\"c\",\"Symbol\")),p(o.prototype,i.toStringTag,s(\"c\",i.prototype[i.toStringTag])),p(o.prototype,i.toPrimitive,s(\"c\",i.prototype[i.toPrimitive]))},function(e,t,n){\"use strict\";var r=n(390);e.exports=function(e){if(!r(e))throw new TypeError(e+\" is not a symbol\");return e}},function(e,t){\"use strict\";e.exports=function(e){return!!e&&(\"symbol\"==typeof e||!!e.constructor&&(\"Symbol\"===e.constructor.name&&\"Symbol\"===e[e.constructor.toStringTag]))}},function(e,t){\"use strict\";var n=Object.prototype.toString,r=n.call(function(){return arguments}());e.exports=function(e){return n.call(e)===r}},function(e,t,n){\"use strict\";var r=Object.prototype.toString,i=r.call(n(393));e.exports=function(e){return\"function\"==typeof e&&r.call(e)===i}},function(e,t){\"use strict\";e.exports=function(){}},function(e,t){\"use strict\";var n=Object.prototype.toString,r=n.call(\"\");e.exports=function(e){return\"string\"==typeof e||e&&\"object\"==typeof e&&(e instanceof String||n.call(e)===r)||!1}},function(e,t,n){\"use strict\";var r=n(359);e.exports=function(e){var t;return\"function\"==typeof e?{set:e,get:e}:(t={get:r(e.get)},void 0!==e.set?(t.set=r(e.set),t.delete=r(e.delete),t.clear=r(e.clear),t):(t.set=t.get,t))}},function(e,t){\"use strict\";e.exports=function(e){var t,n,r=e.length;if(!r)return\"\u0002\";for(t=String(e[n=0]);--r;)t+=\"\u0001\"+e[++n];return t}},function(e,t){\"use strict\";e.exports=function(e){return e?function(t){for(var n=String(t[0]),r=0,i=e;--i;)n+=\"\u0001\"+t[++r];return n}:function(){return\"\"}}},function(e,t,n){\"use strict\";var r=n(399),i=Object.create;e.exports=function(){var e=0,t=[],n=i(null);return{get:function(e){var n,i=0,o=t,a=e.length;if(0===a)return o[a]||null;if(o=o[a]){for(;i<a-1;){if(n=r.call(o[0],e[i]),n===-1)return null;o=o[1][n],++i}return n=r.call(o[0],e[i]),n===-1?null:o[1][n]||null}return null},set:function(i){var o,a=0,s=t,u=i.length;if(0===u)s[u]=++e;else{for(s[u]||(s[u]=[[],[]]),s=s[u];a<u-1;)o=r.call(s[0],i[a]),o===-1&&(o=s[0].push(i[a])-1,s[1].push([[],[]])),s=s[1][o],++a;o=r.call(s[0],i[a]),o===-1&&(o=s[0].push(i[a])-1),s[1][o]=++e}return n[e]=i,e},delete:function(e){var i,o=0,a=t,s=n[e],u=s.length,c=[];if(0===u)delete a[u];else if(a=a[u]){for(;o<u-1;){if(i=r.call(a[0],s[o]),i===-1)return;c.push(a,i),a=a[1][i],++o}if(i=r.call(a[0],s[o]),i===-1)return;for(e=a[1][i],a[0].splice(i,1),a[1].splice(i,1);!a[0].length&&c.length;)i=c.pop(),a=c.pop(),a[0].splice(i,1),a[1].splice(i,1)}delete n[e]},clear:function(){t=[],n=i(null)}}}},function(e,t,n){\"use strict\";var r=n(353),i=n(362),o=Array.prototype.indexOf,a=Object.prototype.hasOwnProperty,s=Math.abs,u=Math.floor;e.exports=function(e){var t,n,c,l;if(e===e)return o.apply(this,arguments);for(n=r(i(this).length),c=arguments[1],c=isNaN(c)?0:c>=0?u(c):r(this.length)-u(s(c)),t=c;t<n;++t)if(a.call(this,t)&&(l=this[t],l!==l))return t;return-1}},function(e,t,n){\"use strict\";var r=n(399);e.exports=function(){var e=0,t=[],n=[];return{get:function(e){var i=r.call(t,e[0]);return i===-1?null:n[i]},set:function(r){return t.push(r[0]),n.push(++e),e},delete:function(e){var i=r.call(n,e);i!==-1&&(t.splice(i,1),n.splice(i,1))},clear:function(){t=[],n=[]}}}},function(e,t,n){\"use strict\";var r=n(399),i=Object.create;e.exports=function(e){var t=0,n=[[],[]],o=i(null);return{get:function(t){for(var i,o=0,a=n;o<e-1;){if(i=r.call(a[0],t[o]),i===-1)return null;a=a[1][i],++o}return i=r.call(a[0],t[o]),i===-1?null:a[1][i]||null},set:function(i){for(var a,s=0,u=n;s<e-1;)a=r.call(u[0],i[s]),a===-1&&(a=u[0].push(i[s])-1,u[1].push([[],[]])),u=u[1][a],++s;return a=r.call(u[0],i[s]),a===-1&&(a=u[0].push(i[s])-1),u[1][a]=++t,o[t]=i,t},delete:function(t){for(var i,a=0,s=n,u=[],c=o[t];a<e-1;){if(i=r.call(s[0],c[a]),i===-1)return;u.push(s,i),s=s[1][i],++a}if(i=r.call(s[0],c[a]),i!==-1){for(t=s[1][i],s[0].splice(i,1),s[1].splice(i,1);!s[0].length&&u.length;)i=u.pop(),s=u.pop(),s[0].splice(i,1),s[1].splice(i,1);delete o[t]}},clear:function(){n=[[],[]],o=i(null)}}}},function(e,t,n){\"use strict\";var r=n(383),i=n(403),o=n(374),a=n(373),s=n(404),u=Array.prototype.slice,c=Function.prototype.apply,l=Object.create,p=Object.prototype.hasOwnProperty;n(363).async=function(e,t){var n,f,h,d=l(null),m=l(null),v=t.memoized,y=t.original;t.memoized=a(function(e){var t=arguments,r=t[t.length-1];return\"function\"==typeof r&&(n=r,t=u.call(t,0,-1)),v.apply(f=this,h=t)},v);try{o(t.memoized,v)}catch(e){}t.on(\"get\",function(e){var r,i,o;if(n){if(d[e])return\"function\"==typeof d[e]?d[e]=[d[e],n]:d[e].push(n),void(n=null);r=n,i=f,o=h,n=f=h=null,s(function(){var a;p.call(m,e)?(a=m[e],t.emit(\"getasync\",e,o,i),c.call(r,a.context,a.args)):(n=r,f=i,h=o,v.apply(i,o))})}}),t.original=function(){var e,i,o,a;return n?(e=r(arguments),i=function e(n){var i,o,u=e.id;return null==u?void s(c.bind(e,this,arguments)):(delete e.id,i=d[u],delete d[u],i?(o=r(arguments),t.has(u)&&(n?t.delete(u):(m[u]={context:this,args:o},t.emit(\"setasync\",u,\"function\"==typeof i?1:i.length))),\"function\"==typeof i?a=c.call(i,this,o):i.forEach(function(e){a=c.call(e,this,o)},this),a):void 0)},o=n,n=f=h=null,e.push(i),a=c.call(y,this,e),i.cb=o,n=i,a):c.call(y,this,arguments)},t.on(\"set\",function(e){return n?(d[e]?\"function\"==typeof d[e]?d[e]=[d[e],n.cb]:d[e].push(n.cb):d[e]=n.cb,delete n.cb,n.id=e,void(n=null)):void t.delete(e)}),t.on(\"delete\",function(e){var n;p.call(d,e)||m[e]&&(n=m[e],delete m[e],t.emit(\"deleteasync\",e,u.call(n.args,1)))}),t.on(\"clear\",function(){var e=m;m=l(null),t.emit(\"clearasync\",i(e,function(e){return u.call(e.args,1)}))})}},function(e,t,n){\"use strict\";var r=n(359),i=n(360),o=Function.prototype.call;e.exports=function(e,t){var n={},a=arguments[2];return r(t),i(e,function(e,r,i,s){n[r]=o.call(t,a,e,r,i,s)}),n}},function(e,t,n){(function(t,n){\"use strict\";var r,i;r=function(e){if(\"function\"!=typeof e)throw new TypeError(e+\" is not a function\");return e},i=function(e){var t,n,i=document.createTextNode(\"\"),o=0;return new e(function(){var e;if(t)n&&(t=n.concat(t));else{if(!n)return;t=n}if(n=t,t=null,\"function\"==typeof n)return e=n,n=null,void e();for(i.data=o=++o%2;n;)e=n.shift(),n.length||(n=null),e()}).observe(i,{characterData:!0}),function(e){return r(e),t?void(\"function\"==typeof t?t=[t,e]:t.push(e)):(t=e,void(i.data=o=++o%2))}},e.exports=function(){if(\"object\"==typeof t&&t&&\"function\"==typeof t.nextTick)return t.nextTick;if(\"object\"==typeof document&&document){if(\"function\"==typeof MutationObserver)return i(MutationObserver);if(\"function\"==typeof WebKitMutationObserver)return i(WebKitMutationObserver)}return\"function\"==typeof n?function(e){n(r(e))}:\"function\"==typeof setTimeout||\"object\"==typeof setTimeout?function(e){setTimeout(r(e),0)}:null}()}).call(t,n(324),n(340).setImmediate)},function(e,t,n){\"use strict\";var r=n(403),i=n(406),o=n(404),a=Object.create,s=Object.prototype.hasOwnProperty;n(363).promise=function(e,t){var n=a(null),u=a(null),c=a(null);t.on(\"set\",function(r,a,s){if(!i(s))return u[r]=s,void t.emit(\"setasync\",r,1);n[r]=1,c[r]=s;var l=function(e){var i=n[r];i&&(delete n[r],u[r]=e,t.emit(\"setasync\",r,i))},p=function(){n[r]&&(delete n[r],delete c[r],t.delete(r))};\"then\"!==e&&\"function\"==typeof s.done?\"done\"!==e&&\"function\"==typeof s.finally?(s.done(l),s.finally(p)):s.done(l,p):s.then(function(e){o(l.bind(this,e))},function(){o(p)})}),t.on(\"get\",function(e,r,a){var s;if(n[e])return void++n[e];s=c[e];var u=function(){t.emit(\"getasync\",e,r,a)};i(s)?\"function\"==typeof s.done?s.done(u):s.then(function(){o(u)}):u()}),t.on(\"delete\",function(e){if(delete c[e],n[e])return void delete n[e];\nif(s.call(u,e)){var r=u[e];delete u[e],t.emit(\"deleteasync\",e,[r])}}),t.on(\"clear\",function(){var e=u;u=a(null),n=a(null),c=a(null),t.emit(\"clearasync\",r(e,function(e){return[e]}))})}},function(e,t){function n(e){return!!e&&(\"object\"==typeof e||\"function\"==typeof e)&&\"function\"==typeof e.then}e.exports=n},function(e,t,n){\"use strict\";var r=n(359),i=n(360),o=n(363),a=Function.prototype.apply;o.dispose=function(e,t,n){var s;return r(e),n.async&&o.async||n.promise&&o.promise?(t.on(\"deleteasync\",s=function(t,n){a.call(e,null,n)}),void t.on(\"clearasync\",function(e){i(e,function(e,t){s(t,e)})})):(t.on(\"delete\",s=function(t,n){e(n)}),void t.on(\"clear\",function(e){i(e,function(e,t){s(t,e)})}))}},function(e,t,n){\"use strict\";var r=n(383),i=n(360),o=n(404),a=n(406),s=n(409),u=n(363),c=Function.prototype,l=Math.max,p=Math.min,f=Object.create;u.maxAge=function(e,t,n){var h,d,m,v;e=s(e),e&&(h=f(null),d=n.async&&u.async||n.promise&&u.promise?\"async\":\"\",t.on(\"set\"+d,function(n){h[n]=setTimeout(function(){t.delete(n)},e),v&&(v[n]&&\"nextTick\"!==v[n]&&clearTimeout(v[n]),v[n]=setTimeout(function(){delete v[n]},m))}),t.on(\"delete\"+d,function(e){clearTimeout(h[e]),delete h[e],v&&(\"nextTick\"!==v[e]&&clearTimeout(v[e]),delete v[e])}),n.preFetch&&(m=n.preFetch===!0||isNaN(n.preFetch)?.333:l(p(Number(n.preFetch),1),0),m&&(v={},m=(1-m)*e,t.on(\"get\"+d,function(e,i,s){v[e]||(v[e]=\"nextTick\",o(function(){var o;\"nextTick\"===v[e]&&(delete v[e],t.delete(e),n.async&&(i=r(i),i.push(c)),o=t.memoized.apply(s,i),n.promise&&a(o)&&(\"function\"==typeof o.done?o.done(c,c):o.then(c,c)))}))}))),t.on(\"clear\"+d,function(){i(h,function(e){clearTimeout(e)}),h={},v&&(i(v,function(e){\"nextTick\"!==e&&clearTimeout(e)}),v={})}))}},function(e,t,n){\"use strict\";var r=n(353),i=n(410);e.exports=function(e){if(e=r(e),e>i)throw new TypeError(e+\" exceeds maximum possible timeout\");return e}},function(e,t){\"use strict\";e.exports=2147483647},function(e,t,n){\"use strict\";var r=n(353),i=n(412),o=n(363);o.max=function(e,t,n){var a,s,u;e=r(e),e&&(s=i(e),a=n.async&&o.async||n.promise&&o.promise?\"async\":\"\",t.on(\"set\"+a,u=function(e){e=s.hit(e),void 0!==e&&t.delete(e)}),t.on(\"get\"+a,u),t.on(\"delete\"+a,s.delete),t.on(\"clear\"+a,s.clear))}},function(e,t,n){\"use strict\";var r=n(353),i=Object.create,o=Object.prototype.hasOwnProperty;e.exports=function(e){var t,n=0,a=1,s=i(null),u=i(null),c=0;return e=r(e),{hit:function(r){var i=u[r],l=++c;if(s[l]=r,u[r]=l,!i){if(++n,n<=e)return;return r=s[a],t(r),r}if(delete s[i],a===i)for(;!o.call(s,++a);)continue},delete:t=function(e){var t=u[e];if(t&&(delete s[t],delete u[e],--n,a===t)){if(!n)return c=0,void(a=1);for(;!o.call(s,++a);)continue}},clear:function(){n=0,a=1,s=i(null),u=i(null),c=0}}}},function(e,t,n){\"use strict\";var r=n(375),i=n(363),o=Object.create,a=Object.defineProperties;i.refCounter=function(e,t,n){var s,u;s=o(null),u=n.async&&i.async||n.promise&&i.promise?\"async\":\"\",t.on(\"set\"+u,function(e,t){s[e]=t||1}),t.on(\"get\"+u,function(e){++s[e]}),t.on(\"delete\"+u,function(e){delete s[e]}),t.on(\"clear\"+u,function(){s={}}),a(t.memoized,{deleteRef:r(function(){var e=t.get(arguments);return null===e?null:s[e]?!--s[e]&&(t.delete(e),!0):null}),getRefCount:r(function(){var e=t.get(arguments);return null===e?0:s[e]?s[e]:0})})}},function(e,t,n){\"use strict\";function r(e){return e&&e.__esModule?e:{default:e}}function i(){return[a.default]}Object.defineProperty(t,\"__esModule\",{value:!0}),t.default=i;var o=n(415),a=r(o)},function(e,t,n){\"use strict\";function r(e){if(e&&e.__esModule)return e;var t={};if(null!=e)for(var n in e)Object.prototype.hasOwnProperty.call(e,n)&&(t[n]=e[n]);return t.default=e,t}function i(e){return e&&e.__esModule?e:{default:e}}Object.defineProperty(t,\"__esModule\",{value:!0}),t.default=function(){var e={components:{App:M.default,authorizationPopup:P.default,authorizeBtn:N.default,authorizeOperationBtn:j.default,auths:B.default,authError:z.default,oauth2:H.default,apiKeyAuth:U.default,basicAuth:K.default,clear:G.default,liveResponse:Y.default,info:Ce.default,onlineValidatorBadge:Z.default,operations:ee.default,operation:ne.default,highlightCode:ie.default,responses:ae.default,response:ue.default,responseBody:le.default,parameters:fe.default,parameterRow:de.default,execute:ve.default,headers:ge.default,errors:be.default,contentType:we.default,overview:Se.default,footer:Te.default,ParamBody:Me.default,curl:Pe.default,schemes:Ne.default,modelExample:je.default,model:Be.default,models:ze.default,TryItOutButton:Ue.default,Markdown:Ke.default,BaseLayout:He.default}},t={components:Ge},n={components:Ye};return[S.default,v.default,f.default,l.default,a.default,u.default,d.default,e,t,b.default,n,w.default,g.default,C.default,T.default]};var o=n(416),a=i(o),s=n(431),u=i(s),c=n(443),l=i(c),p=n(484),f=i(p),h=n(726),d=i(h),m=n(727),v=i(m),y=n(728),g=i(y),_=n(762),b=i(_),x=n(954),w=i(x),k=n(959),S=i(k),E=n(961),C=i(E),A=n(1010),T=i(A),D=n(1011),M=i(D),O=n(1012),P=i(O),I=n(1013),N=i(I),R=n(1014),j=i(R),F=n(1016),B=i(F),L=n(1017),z=i(L),q=n(1018),U=i(q),W=n(1019),K=i(W),V=n(1020),H=i(V),J=n(1022),G=i(J),X=n(1023),Y=i(X),$=n(1024),Z=i($),Q=n(1025),ee=i(Q),te=n(1026),ne=i(te),re=n(1030),ie=i(re),oe=n(1031),ae=i(oe),se=n(1032),ue=i(se),ce=n(1033),le=i(ce),pe=n(1035),fe=i(pe),he=n(1036),de=i(he),me=n(1037),ve=i(me),ye=n(1038),ge=i(ye),_e=n(1039),be=i(_e),xe=n(1064),we=i(xe),ke=n(1065),Se=i(ke),Ee=n(1067),Ce=i(Ee),Ae=n(1068),Te=i(Ae),De=n(1069),Me=i(De),Oe=n(1070),Pe=i(Oe),Ie=n(1072),Ne=i(Ie),Re=n(1073),je=i(Re),Fe=n(1074),Be=i(Fe),Le=n(1075),ze=i(Le),qe=n(1076),Ue=i(qe),We=n(1077),Ke=i(We),Ve=n(1173),He=i(Ve),Je=n(1066),Ge=r(Je),Xe=n(1174),Ye=r(Xe)},function(e,t,n){\"use strict\";function r(e){if(e&&e.__esModule)return e;var t={};if(null!=e)for(var n in e)Object.prototype.hasOwnProperty.call(e,n)&&(t[n]=e[n]);return t.default=e,t}function i(e){return e&&e.__esModule?e:{default:e}}Object.defineProperty(t,\"__esModule\",{value:!0}),t.default=function(e){return{statePlugins:{err:{reducers:(0,a.default)(e),actions:u,selectors:l}}}};var o=n(417),a=i(o),s=n(176),u=r(s),c=n(429),l=r(c)},function(e,t,n){\"use strict\";function r(e){return e&&e.__esModule?e:{default:e}}Object.defineProperty(t,\"__esModule\",{value:!0});var i=n(137),o=r(i),a=n(141),s=r(a);t.default=function(e){var t;return t={},(0,o.default)(t,u.NEW_THROWN_ERR,function(t,n){var r=n.payload,i=(0,s.default)(m,r,{type:\"thrown\"});return t.update(\"errors\",function(e){return(e||(0,p.List)()).push((0,p.fromJS)(i))}).update(\"errors\",function(t){return(0,d.default)(t,e.getSystem())})}),(0,o.default)(t,u.NEW_THROWN_ERR_BATCH,function(t,n){var r=n.payload;return r=r.map(function(e){return(0,p.fromJS)((0,s.default)(m,e,{type:\"thrown\"}))}),t.update(\"errors\",function(e){return(e||(0,p.List)()).concat((0,p.fromJS)(r))}).update(\"errors\",function(t){return(0,d.default)(t,e.getSystem())})}),(0,o.default)(t,u.NEW_SPEC_ERR,function(t,n){var r=n.payload,i=(0,p.fromJS)(r);return i=i.set(\"type\",\"spec\"),t.update(\"errors\",function(e){return(e||(0,p.List)()).push((0,p.fromJS)(i)).sortBy(function(e){return e.get(\"line\")})}).update(\"errors\",function(t){return(0,d.default)(t,e.getSystem())})}),(0,o.default)(t,u.NEW_AUTH_ERR,function(t,n){var r=n.payload,i=(0,p.fromJS)((0,s.default)({},r));return i=i.set(\"type\",\"auth\"),t.update(\"errors\",function(e){return(e||(0,p.List)()).push((0,p.fromJS)(i))}).update(\"errors\",function(t){return(0,d.default)(t,e.getSystem())})}),(0,o.default)(t,u.CLEAR,function(e,t){var n=t.payload;if(n){var r=f.default.fromJS((0,l.default)((e.get(\"errors\")||(0,p.List)()).toJS(),n));return e.merge({errors:r})}}),t};var u=n(176),c=n(418),l=r(c),p=n(168),f=r(p),h=n(422),d=r(h),m={line:0,level:\"error\",message:\"Unknown error\"}},function(e,t,n){function r(e,t){var n=s(e)?i:o;return n(e,u(a(t,3)))}var i=n(419),o=n(420),a=n(247),s=n(193),u=n(421);e.exports=r},function(e,t){function n(e,t){for(var n=-1,r=null==e?0:e.length,i=0,o=[];++n<r;){var a=e[n];t(a,n,e)&&(o[i++]=a)}return o}e.exports=n},function(e,t,n){function r(e,t){var n=[];return i(e,function(e,r,i){t(e,r,i)&&n.push(e)}),n}var i=n(316);e.exports=r},function(e,t){function n(e){if(\"function\"!=typeof e)throw new TypeError(r);return function(){var t=arguments;switch(t.length){case 0:return!e.call(this);case 1:return!e.call(this,t[0]);case 2:return!e.call(this,t[0],t[1]);case 3:return!e.call(this,t[0],t[1],t[2])}return!e.apply(this,t)}}var r=\"Expected a function\";e.exports=n},function(e,t,n){\"use strict\";function r(e){return e&&e.__esModule?e:{default:e}}function i(e,t){var n={jsSpec:t.specSelectors.specJson().toJS()},r=(0,s.default)(c,function(e,t){try{var r=t.transform(e,n);return r.filter(function(e){return!!e})}catch(t){return console.error(\"Transformer error:\",t),e}},e);return r.filter(function(e){return!!e}).map(function(e){return!e.get(\"line\")&&e.get(\"path\"),e})}function o(e){return e.split(\"-\").map(function(e){return e[0].toUpperCase()+e.slice(1)}).join(\"\")}Object.defineProperty(t,\"__esModule\",{value:!0}),t.default=i;var a=n(423),s=r(a),u=n(425),c=[];u.keys().forEach(function(e){\"./hook.js\"!==e&&e.match(/js$/)&&(e.slice(2).indexOf(\"/\")>-1||c.push({name:o(e).replace(\".js\",\"\").replace(\"./\",\"\"),transform:u(e).transform}))})},function(e,t,n){function r(e,t,n){var r=u(e)?i:s,c=arguments.length<3;return r(e,a(t,4),n,c,o)}var i=n(204),o=n(316),a=n(247),s=n(424),u=n(193);e.exports=r},function(e,t){function n(e,t,n,r,i){return i(e,function(e,i,o){n=r?(r=!1,e):t(n,e,i,o)}),n}e.exports=n},function(e,t,n){function r(e){return n(i(e))}function i(e){return o[e]||function(){throw new Error(\"Cannot find module '\"+e+\"'.\")}()}var o={\"./not-of-type.js\":426,\"./parameter-oneof.js\":427,\"./strip-instance.js\":428};r.keys=function(){return Object.keys(o)},r.resolve=i,e.exports=r,r.id=425},function(e,t){\"use strict\";function n(e){return e.map(function(e){var t=\"is not of a type(s)\",n=e.get(\"message\").indexOf(t);if(n>-1){var i=e.get(\"message\").slice(n+t.length).split(\",\");return e.set(\"message\",e.get(\"message\").slice(0,n)+r(i))}return e})}function r(e){return e.reduce(function(e,t,n,r){return n===r.length-1&&r.length>1?e+\"or \"+t:r[n+1]&&r.length>2?e+t+\", \":r[n+1]?e+t+\" \":e+t},\"should be a\")}Object.defineProperty(t,\"__esModule\",{value:!0}),t.transform=n},function(e,t,n){\"use strict\";function r(e){return e&&e.__esModule?e:{default:e}}function i(e,t){t.jsSpec;return e}Object.defineProperty(t,\"__esModule\",{value:!0}),t.transform=i;var o=n(295);r(o),n(168)},function(e,t){\"use strict\";function n(e){return e.map(function(e){return e.set(\"message\",r(e.get(\"message\"),\"instance.\"))})}function r(e,t){return e.replace(new RegExp(t,\"g\"),\"\")}Object.defineProperty(t,\"__esModule\",{value:!0}),t.transform=n},function(e,t,n){\"use strict\";Object.defineProperty(t,\"__esModule\",{value:!0}),t.lastError=t.allErrors=void 0;var r=n(168),i=n(430),o=function(e){return e},a=t.allErrors=(0,i.createSelector)(o,function(e){return e.get(\"errors\",(0,r.List)())});t.lastError=(0,i.createSelector)(a,function(e){return e.last()})},function(e,t){\"use strict\";function n(e){if(Array.isArray(e)){for(var t=0,n=Array(e.length);t<e.length;t++)n[t]=e[t];return n}return Array.from(e)}function r(e,t){return e===t}function i(e){var t=arguments.length<=1||void 0===arguments[1]?r:arguments[1],n=null,i=null;return function(){for(var r=arguments.length,o=Array(r),a=0;a<r;a++)o[a]=arguments[a];return null!==n&&n.length===o.length&&o.every(function(e,r){return t(e,n[r])})?i:(i=e.apply(void 0,o),n=o,i)}}function o(e){var t=Array.isArray(e[0])?e[0]:e;if(!t.every(function(e){return\"function\"==typeof e})){var n=t.map(function(e){return typeof e}).join(\", \");throw new Error(\"Selector creators expect all input-selectors to be functions, \"+(\"instead received the following types: [\"+n+\"]\"))}return t}function a(e){for(var t=arguments.length,r=Array(t>1?t-1:0),i=1;i<t;i++)r[i-1]=arguments[i];return function(){for(var t=arguments.length,i=Array(t),a=0;a<t;a++)i[a]=arguments[a];var s=0,u=i.pop(),c=o(i),l=e.apply(void 0,[function(){return s++,u.apply(void 0,arguments)}].concat(r)),p=function(e,t){for(var r=arguments.length,i=Array(r>2?r-2:0),o=2;o<r;o++)i[o-2]=arguments[o];var a=c.map(function(n){return n.apply(void 0,[e,t].concat(i))});return l.apply(void 0,n(a))};return p.resultFunc=u,p.recomputations=function(){return s},p.resetRecomputations=function(){return s=0},p}}function s(){return a(i).apply(void 0,arguments)}function u(e){var t=arguments.length<=1||void 0===arguments[1]?s:arguments[1];if(\"object\"!=typeof e)throw new Error(\"createStructuredSelector expects first argument to be an object where each property is a selector, instead received a \"+typeof e);var n=Object.keys(e);return t(n.map(function(t){return e[t]}),function(){for(var e=arguments.length,t=Array(e),r=0;r<e;r++)t[r]=arguments[r];return t.reduce(function(e,t,r){return e[n[r]]=t,e},{})})}t.__esModule=!0,t.defaultMemoize=i,t.createSelectorCreator=a,t.createSelector=s,t.createStructuredSelector=u},function(e,t,n){\"use strict\";function r(e){if(e&&e.__esModule)return e;var t={};if(null!=e)for(var n in e)Object.prototype.hasOwnProperty.call(e,n)&&(t[n]=e[n]);return t.default=e,t}function i(e){return e&&e.__esModule?e:{default:e}}Object.defineProperty(t,\"__esModule\",{value:!0}),t.default=function(){return{statePlugins:{layout:{reducers:a.default,actions:u,selectors:l}}}};var o=n(432),a=i(o),s=n(433),u=r(s),c=n(434),l=r(c)},function(e,t,n){\"use strict\";function r(e){return e&&e.__esModule?e:{default:e}}Object.defineProperty(t,\"__esModule\",{value:!0});var i,o=n(137),a=r(o),s=n(433);t.default=(i={},(0,a.default)(i,s.UPDATE_LAYOUT,function(e,t){return e.set(\"layout\",t.payload)}),(0,a.default)(i,s.SHOW,function(e,t){var n=t.payload.thing,r=t.payload.shown;return e.setIn([\"shown\"].concat(n),r)}),(0,a.default)(i,s.UPDATE_MODE,function(e,t){var n=t.payload.thing,r=t.payload.mode;return e.setIn([\"modes\"].concat(n),(r||\"\")+\"\")}),i)},function(e,t,n){\"use strict\";function r(e){return{type:s,payload:e}}function i(e){var t=!(arguments.length>1&&void 0!==arguments[1])||arguments[1];return e=(0,a.normalizeArray)(e),{type:c,payload:{thing:e,shown:t}}}function o(e){var t=arguments.length>1&&void 0!==arguments[1]?arguments[1]:\"\";return e=(0,a.normalizeArray)(e),{type:u,payload:{thing:e,mode:t}}}Object.defineProperty(t,\"__esModule\",{value:!0}),t.SHOW=t.UPDATE_MODE=t.UPDATE_LAYOUT=void 0,t.updateLayout=r,t.show=i,t.changeMode=o;var a=n(183),s=t.UPDATE_LAYOUT=\"layout_update_layout\",u=t.UPDATE_MODE=\"layout_update_mode\",c=t.SHOW=\"layout_show\"},function(e,t,n){\"use strict\";function r(e){return e&&e.__esModule?e:{default:e}}Object.defineProperty(t,\"__esModule\",{value:!0}),t.showSummary=t.whatMode=t.isShown=t.current=void 0;var i=n(435),o=r(i),a=n(430),s=n(183),u=function(e){return e},c=(t.current=function(e){return e.get(\"layout\")},t.isShown=function(e,t,n){return t=(0,s.normalizeArray)(t),Boolean(e.getIn([\"shown\"].concat((0,o.default)(t)),n))});t.whatMode=function(e,t){var n=arguments.length>2&&void 0!==arguments[2]?arguments[2]:\"\";return t=(0,s.normalizeArray)(t),e.getIn([\"modes\"].concat((0,o.default)(t)),n)},t.showSummary=(0,a.createSelector)(u,function(e){return!c(e,\"editor\")})},function(e,t,n){\"use strict\";function r(e){return e&&e.__esModule?e:{default:e}}t.__esModule=!0;var i=n(436),o=r(i);t.default=function(e){if(Array.isArray(e)){for(var t=0,n=Array(e.length);t<e.length;t++)n[t]=e[t];return n}return(0,o.default)(e)}},function(e,t,n){e.exports={default:n(437),__esModule:!0}},function(e,t,n){n(97),n(438),e.exports=n(59).Array.from},function(e,t,n){\"use strict\";var r=n(82),i=n(81),o=n(63),a=n(439),s=n(440),u=n(72),c=n(441),l=n(181);i(i.S+i.F*!n(442)(function(e){Array.from(e)}),\"Array\",{from:function(e){var t,n,i,p,f=o(e),h=\"function\"==typeof this?this:Array,d=arguments.length,m=d>1?arguments[1]:void 0,v=void 0!==m,y=0,g=l(f);if(v&&(m=r(m,d>2?arguments[2]:void 0,2)),void 0==g||h==Array&&s(g))for(t=u(f.length),n=new h(t);t>y;y++)c(n,y,v?m(f[y],y):f[y]);else for(p=g.call(f),n=new h;!(i=p.next()).done;y++)c(n,y,v?a(p,m,[i.value,y],!0):i.value);return n.length=y,n}})},function(e,t,n){var r=n(86);e.exports=function(e,t,n,i){try{return i?t(r(n)[0],n[1]):t(n)}catch(t){var o=e.return;throw void 0!==o&&r(o.call(e)),t}}},function(e,t,n){var r=n(102),i=n(108)(\"iterator\"),o=Array.prototype;e.exports=function(e){return void 0!==e&&(r.Array===e||o[i]===e)}},function(e,t,n){\"use strict\";var r=n(85),i=n(93);e.exports=function(e,t,n){t in e?r.f(e,t,i(0,n)):e[t]=n}},function(e,t,n){var r=n(108)(\"iterator\"),i=!1;try{var o=[7][r]();o.return=function(){i=!0},Array.from(o,function(){throw 2})}catch(e){}e.exports=function(e,t){if(!t&&!i)return!1;var n=!1;try{var o=[7],a=o[r]();a.next=function(){return{done:n=!0}},o[r]=function(){return a},e(o)}catch(e){}return n}},function(e,t,n){\"use strict\";function r(e){if(e&&e.__esModule)return e;var t={};if(null!=e)for(var n in e)Object.prototype.hasOwnProperty.call(e,n)&&(t[n]=e[n]);return t.default=e,t}function i(e){return e&&e.__esModule?e:{default:e}}Object.defineProperty(t,\"__esModule\",{value:!0}),t.default=function(){return{statePlugins:{spec:{wrapActions:f,reducers:a.default,actions:u,selectors:l}}}};var o=n(444),a=i(o),s=n(445),u=r(s),c=n(482),l=r(c),p=n(483),f=r(p)},function(e,t,n){\"use strict\";function r(e){return e&&e.__esModule?e:{default:e}}Object.defineProperty(t,\"__esModule\",{value:!0});var i,o=n(137),a=r(o),s=n(141),u=r(s),c=n(435),l=r(c),p=n(168),f=n(183),h=n(177),d=r(h),m=n(445);t.default=(i={},(0,a.default)(i,m.UPDATE_SPEC,function(e,t){return\"string\"==typeof t.payload?e.set(\"spec\",t.payload):e}),(0,a.default)(i,m.UPDATE_URL,function(e,t){return e.set(\"url\",t.payload+\"\")}),(0,a.default)(i,m.UPDATE_JSON,function(e,t){return e.set(\"json\",(0,f.fromJSOrdered)(t.payload))}),(0,a.default)(i,m.UPDATE_RESOLVED,function(e,t){return e.setIn([\"resolved\"],(0,f.fromJSOrdered)(t.payload))}),(0,a.default)(i,m.UPDATE_PARAM,function(e,t){var n=t.payload,r=n.path,i=n.paramName,o=n.value,a=n.isXml;return e.updateIn([\"resolved\",\"paths\"].concat((0,l.default)(r),[\"parameters\"]),(0,p.fromJS)([]),function(e){var t=e.findIndex(function(e){return e.get(\"name\")===i});return o instanceof d.default.File||(o=(0,f.fromJSOrdered)(o)),e.setIn([t,a?\"value_xml\":\"value\"],o)})}),(0,a.default)(i,m.VALIDATE_PARAMS,function(e,t){var n=t.payload.pathMethod,r=e.getIn([\"resolved\",\"paths\"].concat((0,l.default)(n))),i=/xml/i.test(r.get(\"consumes_value\"));return e.updateIn([\"resolved\",\"paths\"].concat((0,l.default)(n),[\"parameters\"]),(0,p.fromJS)([]),function(e){return e.withMutations(function(e){for(var t=0,n=e.count();t<n;t++){var r=(0,f.validateParam)(e.get(t),i);e.setIn([t,\"errors\"],(0,p.fromJS)(r))}})})}),(0,a.default)(i,m.ClEAR_VALIDATE_PARAMS,function(e,t){var n=t.payload.pathMethod;return e.updateIn([\"resolved\",\"paths\"].concat((0,l.default)(n),[\"parameters\"]),(0,p.fromJS)([]),function(e){return e.withMutations(function(e){for(var t=0,n=e.count();t<n;t++)e.setIn([t,\"errors\"],(0,p.fromJS)({}))})})}),(0,a.default)(i,m.SET_RESPONSE,function(e,t){var n=t.payload,r=n.res,i=n.path,o=n.method,a=void 0;a=r.error?(0,u.default)({error:!0},r.err):r,a.headers=a.headers||{};var s=e.setIn([\"responses\",i,o],(0,f.fromJSOrdered)(a));return r.data instanceof d.default.Blob&&(s=s.setIn([\"responses\",i,o,\"text\"],r.data)),s}),(0,a.default)(i,m.SET_REQUEST,function(e,t){var n=t.payload,r=n.req,i=n.path,o=n.method;return e.setIn([\"requests\",i,o],(0,f.fromJSOrdered)(r))}),(0,a.default)(i,m.UPDATE_OPERATION_VALUE,function(e,t){var n=t.payload,r=n.path,i=n.value,o=n.key,a=[\"resolved\",\"paths\"].concat((0,l.default)(r));return e.getIn(a)?e.setIn([].concat((0,l.default)(a),[o]),(0,p.fromJS)(i)):e}),(0,a.default)(i,m.CLEAR_RESPONSE,function(e,t){var n=t.payload,r=n.path,i=n.method;return e.deleteIn([\"responses\",r,i])}),(0,a.default)(i,m.CLEAR_REQUEST,function(e,t){var n=t.payload,r=n.path,i=n.method;return e.deleteIn([\"requests\",r,i])}),(0,a.default)(i,m.SET_SCHEME,function(e,t){var n=t.payload,r=n.scheme,i=n.path,o=n.method;return i&&o?e.setIn([\"scheme\",i,o],r):i||o?void 0:e.setIn([\"scheme\",\"_defaultScheme\"],r)}),i)},function(e,t,n){\"use strict\";function r(e){return e&&e.__esModule?e:{default:e}}function i(e){return e instanceof Error?{type:M,error:!0,payload:e}:\"string\"==typeof e?{type:M,payload:e.replace(/\\t/g,\"  \")||\"\"}:{type:M,payload:\"\"}}function o(e){return{type:U,payload:e}}function a(e){return{type:O,payload:e}}function s(e){if(!e||\"object\"!==(\"undefined\"==typeof e?\"undefined\":(0,k.default)(e)))throw new Error(\"updateJson must only accept a simple JSON object\");return{type:P,payload:e}}function u(e,t,n,r){return{type:I,payload:{path:e,value:n,paramName:t,isXml:r}}}function c(e){return{type:N,payload:{pathMethod:e}}}function l(e){return{type:z,payload:{pathMethod:e}}}function p(e,t){return{type:q,payload:{path:e,value:t,key:\"consumes_value\"}}}function f(e,t){return{type:q,payload:{path:e,value:t,key:\"produces_value\"}}}function h(e,t){return{type:B,payload:{path:e,method:t}}}function d(e,t){return{type:L,payload:{path:e,method:t}}}function m(e,t,n){return{type:W,payload:{scheme:e,path:t,method:n}}}Object.defineProperty(t,\"__esModule\",{value:!0}),t.execute=t.executeRequest=t.logRequest=t.setRequest=t.setResponse=t.formatIntoYaml=t.resolveSpec=t.parseToJson=t.SET_SCHEME=t.UPDATE_RESOLVED=t.UPDATE_OPERATION_VALUE=t.ClEAR_VALIDATE_PARAMS=t.CLEAR_REQUEST=t.CLEAR_RESPONSE=t.LOG_REQUEST=t.SET_REQUEST=t.SET_RESPONSE=t.VALIDATE_PARAMS=t.UPDATE_PARAM=t.UPDATE_JSON=t.UPDATE_URL=t.UPDATE_SPEC=void 0;var v=n(446),y=r(v),g=n(447),_=r(g),b=n(141),x=r(b),w=n(94),k=r(w);t.updateSpec=i,t.updateResolved=o,t.updateUrl=a,t.updateJsonSpec=s,t.changeParam=u,t.validateParams=c,t.clearValidateParams=l,t.changeConsumesValue=p,t.changeProducesValue=f,t.clearResponse=h,t.clearRequest=d,t.setScheme=m;var S=n(448),E=r(S),C=n(479),A=r(C),T=n(175),D=r(T),M=t.UPDATE_SPEC=\"spec_update_spec\",O=t.UPDATE_URL=\"spec_update_url\",P=t.UPDATE_JSON=\"spec_update_json\",I=t.UPDATE_PARAM=\"spec_update_param\",N=t.VALIDATE_PARAMS=\"spec_validate_param\",R=t.SET_RESPONSE=\"spec_set_response\",j=t.SET_REQUEST=\"spec_set_request\",F=t.LOG_REQUEST=\"spec_log_request\",B=t.CLEAR_RESPONSE=\"spec_clear_response\",L=t.CLEAR_REQUEST=\"spec_clear_request\",z=t.ClEAR_VALIDATE_PARAMS=\"spec_clear_validate_param\",q=t.UPDATE_OPERATION_VALUE=\"spec_update_operation_value\",U=t.UPDATE_RESOLVED=\"spec_update_resolved\",W=t.SET_SCHEME=\"set_scheme\",K=(t.parseToJson=function(e){return function(t){var n=t.specActions,r=t.specSelectors,i=t.errActions,o=r.specStr,a=null;try{e=e||o(),i.clear({source:\"parser\"}),a=E.default.safeLoad(e)}catch(e){return console.error(e),i.newSpecErr({source:\"parser\",level:\"error\",message:e.reason,line:e.mark&&e.mark.line?e.mark.line+1:void 0})}return n.updateJsonSpec(a)}},t.resolveSpec=function(e,t){return function(n){var r=n.specActions,i=n.specSelectors,o=n.errActions,a=n.fn,s=a.fetch,u=a.resolve,c=a.AST,l=n.getConfigs,p=l(),f=p.modelPropertyMacro,h=p.parameterMacro;\"undefined\"==typeof e&&(e=i.specJson()),\"undefined\"==typeof t&&(t=i.url());var d=c.getLineNumberForPath,m=i.specStr();return u({fetch:s,spec:e,baseDoc:t,modelPropertyMacro:f,parameterMacro:h}).then(function(e){var t=e.spec,n=e.errors;if(o.clear({type:\"thrown\"}),n.length>0){var i=n.map(function(e){return console.error(e),e.line=e.fullPath?d(m,e.fullPath):null,e.path=e.fullPath?e.fullPath.join(\".\"):null,e.level=\"error\",e.type=\"thrown\",e.source=\"resolver\",Object.defineProperty(e,\"message\",{enumerable:!0,value:e.message}),e});o.newThrownErrBatch(i)}return r.updateResolved(t)})}},t.formatIntoYaml=function(){return function(e){var t=e.specActions,n=e.specSelectors,r=n.specStr,i=t.updateSpec;try{var o=E.default.safeDump(E.default.safeLoad(r()),{indent:2});i(o)}catch(e){i(e)}}},t.setResponse=function(e,t,n){return{payload:{path:e,method:t,res:n},type:R}},t.setRequest=function(e,t,n){return{payload:{path:e,method:t,req:n},type:j}},t.logRequest=function(e){return{payload:e,type:F}},t.executeRequest=function(e){return function(t){var n=t.fn,r=t.specActions,i=t.specSelectors,o=e.pathName,a=e.method,s=e.operation,u=s.toJS();e.contextUrl=(0,A.default)(i.url()).toString(),u&&u.operationId?e.operationId=u.operationId:u&&o&&a&&(e.operationId=n.opId(u,o,a));var c=(0,x.default)({},e);return c=n.buildRequest(c),r.setRequest(e.pathName,e.method,c),n.execute(e).then(function(t){return r.setResponse(e.pathName,e.method,t)}).catch(function(t){return r.setResponse(e.pathName,e.method,{error:!0,err:(0,D.default)(t)})})}},function(){var e=arguments.length>0&&void 0!==arguments[0]?arguments[0]:{},t=e.path,n=e.method,r=(0,_.default)(e,[\"path\",\"method\"]);return function(e){var i=e.fn.fetch,o=e.specSelectors,a=e.specActions,s=o.spec().toJS(),u=o.operationScheme(t,n),c=o.contentTypeValues([t,n]).toJS(),l=c.requestContentType,p=c.responseContentType,f=/xml/i.test(l),h=o.parameterValues([t,n],f).toJS();return a.executeRequest((0,y.default)({fetch:i,spec:s,pathName:t,method:n,parameters:h,requestContentType:l,scheme:u,responseContentType:p},r))}});t.execute=K},function(e,t,n){\"use strict\";function r(e){return e&&e.__esModule?e:{default:e}}t.__esModule=!0;var i=n(141),o=r(i);t.default=o.default||function(e){for(var t=1;t<arguments.length;t++){var n=arguments[t];for(var r in n)Object.prototype.hasOwnProperty.call(n,r)&&(e[r]=n[r])}return e}},function(e,t){\"use strict\";t.__esModule=!0,t.default=function(e,t){var n={};for(var r in e)t.indexOf(r)>=0||Object.prototype.hasOwnProperty.call(e,r)&&(n[r]=e[r]);return n}},function(e,t,n){\"use strict\";var r=n(449);e.exports=r},function(e,t,n){\"use strict\";function r(e){return function(){throw new Error(\"Function \"+e+\" is deprecated and cannot be used.\")}}var i=n(450),o=n(478);e.exports.Type=n(456),e.exports.Schema=n(455),e.exports.FAILSAFE_SCHEMA=n(459),e.exports.JSON_SCHEMA=n(458),e.exports.CORE_SCHEMA=n(457),e.exports.DEFAULT_SAFE_SCHEMA=n(454),e.exports.DEFAULT_FULL_SCHEMA=n(473),e.exports.load=i.load,e.exports.loadAll=i.loadAll,e.exports.safeLoad=i.safeLoad,e.exports.safeLoadAll=i.safeLoadAll,e.exports.dump=o.dump,e.exports.safeDump=o.safeDump,e.exports.YAMLException=n(452),e.exports.MINIMAL_SCHEMA=n(459),e.exports.SAFE_SCHEMA=n(454),e.exports.DEFAULT_SCHEMA=n(473),e.exports.scan=r(\"scan\"),e.exports.parse=r(\"parse\"),e.exports.compose=r(\"compose\"),e.exports.addConstructor=r(\"addConstructor\")},function(e,t,n){\"use strict\";function r(e){return 10===e||13===e}function i(e){return 9===e||32===e}function o(e){return 9===e||32===e||10===e||13===e}function a(e){return 44===e||91===e||93===e||123===e||125===e}function s(e){var t;return 48<=e&&e<=57?e-48:(t=32|e,97<=t&&t<=102?t-97+10:-1)}function u(e){return 120===e?2:117===e?4:85===e?8:0}function c(e){return 48<=e&&e<=57?e-48:-1}function l(e){return 48===e?\"\\0\":97===e?\"\u0007\":98===e?\"\\b\":116===e?\"\\t\":9===e?\"\\t\":110===e?\"\\n\":118===e?\"\\v\":102===e?\"\\f\":114===e?\"\\r\":101===e?\"\u001b\":32===e?\" \":34===e?'\"':47===e?\"/\":92===e?\"\\\\\":78===e?\"\":95===e?\" \":76===e?\"\\u2028\":80===e?\"\\u2029\":\"\"}function p(e){return e<=65535?String.fromCharCode(e):String.fromCharCode((e-65536>>10)+55296,(e-65536&1023)+56320)}function f(e,t){this.input=e,this.filename=t.filename||null,this.schema=t.schema||K,this.onWarning=t.onWarning||null,this.legacy=t.legacy||!1,this.json=t.json||!1,this.listener=t.listener||null,this.implicitTypes=this.schema.compiledImplicit,this.typeMap=this.schema.compiledTypeMap,this.length=e.length,this.position=0,this.line=0,this.lineStart=0,this.lineIndent=0,this.documents=[]}function h(e,t){return new q(t,new U(e.filename,e.input,e.position,e.line,e.position-e.lineStart))}function d(e,t){throw h(e,t)}function m(e,t){e.onWarning&&e.onWarning.call(null,h(e,t))}function v(e,t,n,r){var i,o,a,s;if(t<n){if(s=e.input.slice(t,n),r)for(i=0,o=s.length;i<o;i+=1)a=s.charCodeAt(i),9===a||32<=a&&a<=1114111||d(e,\"expected valid JSON character\");else Q.test(s)&&d(e,\"the stream contains non-printable characters\");e.result+=s}}function y(e,t,n,r){var i,o,a,s;for(z.isObject(n)||d(e,\"cannot merge mappings; the provided source object is unacceptable\"),i=Object.keys(n),a=0,s=i.length;a<s;a+=1)o=i[a],V.call(t,o)||(t[o]=n[o],r[o]=!0)}function g(e,t,n,r,i,o,a,s){var u,c;if(i=String(i),null===t&&(t={}),\"tag:yaml.org,2002:merge\"===r)if(Array.isArray(o))for(u=0,c=o.length;u<c;u+=1)y(e,t,o[u],n);else y(e,t,o,n);else e.json||V.call(n,i)||!V.call(t,i)||(e.line=a||e.line,e.position=s||e.position,d(e,\"duplicated mapping key\")),t[i]=o,delete n[i];return t}function _(e){var t;t=e.input.charCodeAt(e.position),10===t?e.position++:13===t?(e.position++,10===e.input.charCodeAt(e.position)&&e.position++):d(e,\"a line break is expected\"),e.line+=1,e.lineStart=e.position}function b(e,t,n){for(var o=0,a=e.input.charCodeAt(e.position);0!==a;){for(;i(a);)a=e.input.charCodeAt(++e.position);if(t&&35===a)do a=e.input.charCodeAt(++e.position);while(10!==a&&13!==a&&0!==a);if(!r(a))break;for(_(e),a=e.input.charCodeAt(e.position),o++,e.lineIndent=0;32===a;)e.lineIndent++,a=e.input.charCodeAt(++e.position)}return n!==-1&&0!==o&&e.lineIndent<n&&m(e,\"deficient indentation\"),o}function x(e){var t,n=e.position;return t=e.input.charCodeAt(n),!(45!==t&&46!==t||t!==e.input.charCodeAt(n+1)||t!==e.input.charCodeAt(n+2)||(n+=3,t=e.input.charCodeAt(n),0!==t&&!o(t)))}function w(e,t){1===t?e.result+=\" \":t>1&&(e.result+=z.repeat(\"\\n\",t-1))}function k(e,t,n){var s,u,c,l,p,f,h,d,m,y=e.kind,g=e.result;if(m=e.input.charCodeAt(e.position),o(m)||a(m)||35===m||38===m||42===m||33===m||124===m||62===m||39===m||34===m||37===m||64===m||96===m)return!1;if((63===m||45===m)&&(u=e.input.charCodeAt(e.position+1),o(u)||n&&a(u)))return!1;for(e.kind=\"scalar\",e.result=\"\",c=l=e.position,p=!1;0!==m;){if(58===m){if(u=e.input.charCodeAt(e.position+1),o(u)||n&&a(u))break}else if(35===m){if(s=e.input.charCodeAt(e.position-1),o(s))break}else{if(e.position===e.lineStart&&x(e)||n&&a(m))break;if(r(m)){if(f=e.line,h=e.lineStart,d=e.lineIndent,b(e,!1,-1),e.lineIndent>=t){p=!0,m=e.input.charCodeAt(e.position);continue}e.position=l,e.line=f,e.lineStart=h,e.lineIndent=d;break}}p&&(v(e,c,l,!1),w(e,e.line-f),c=l=e.position,p=!1),i(m)||(l=e.position+1),m=e.input.charCodeAt(++e.position)}return v(e,c,l,!1),!!e.result||(e.kind=y,e.result=g,!1)}function S(e,t){var n,i,o;if(n=e.input.charCodeAt(e.position),39!==n)return!1;for(e.kind=\"scalar\",e.result=\"\",e.position++,i=o=e.position;0!==(n=e.input.charCodeAt(e.position));)if(39===n){if(v(e,i,e.position,!0),n=e.input.charCodeAt(++e.position),39!==n)return!0;i=e.position,e.position++,o=e.position}else r(n)?(v(e,i,o,!0),w(e,b(e,!1,t)),i=o=e.position):e.position===e.lineStart&&x(e)?d(e,\"unexpected end of the document within a single quoted scalar\"):(e.position++,o=e.position);d(e,\"unexpected end of the stream within a single quoted scalar\")}function E(e,t){var n,i,o,a,c,l;if(l=e.input.charCodeAt(e.position),34!==l)return!1;for(e.kind=\"scalar\",e.result=\"\",e.position++,n=i=e.position;0!==(l=e.input.charCodeAt(e.position));){if(34===l)return v(e,n,e.position,!0),e.position++,!0;if(92===l){if(v(e,n,e.position,!0),l=e.input.charCodeAt(++e.position),r(l))b(e,!1,t);else if(l<256&&ie[l])e.result+=oe[l],e.position++;else if((c=u(l))>0){for(o=c,a=0;o>0;o--)l=e.input.charCodeAt(++e.position),(c=s(l))>=0?a=(a<<4)+c:d(e,\"expected hexadecimal character\");e.result+=p(a),e.position++}else d(e,\"unknown escape sequence\");n=i=e.position}else r(l)?(v(e,n,i,!0),w(e,b(e,!1,t)),n=i=e.position):e.position===e.lineStart&&x(e)?d(e,\"unexpected end of the document within a double quoted scalar\"):(e.position++,i=e.position)}d(e,\"unexpected end of the stream within a double quoted scalar\")}function C(e,t){var n,r,i,a,s,u,c,l,p,f,h,m=!0,v=e.tag,y=e.anchor,_={};if(h=e.input.charCodeAt(e.position),91===h)a=93,c=!1,r=[];else{if(123!==h)return!1;a=125,c=!0,r={}}for(null!==e.anchor&&(e.anchorMap[e.anchor]=r),h=e.input.charCodeAt(++e.position);0!==h;){if(b(e,!0,t),h=e.input.charCodeAt(e.position),h===a)return e.position++,e.tag=v,e.anchor=y,e.kind=c?\"mapping\":\"sequence\",e.result=r,!0;m||d(e,\"missed comma between flow collection entries\"),p=l=f=null,s=u=!1,63===h&&(i=e.input.charCodeAt(e.position+1),o(i)&&(s=u=!0,e.position++,b(e,!0,t))),n=e.line,I(e,t,H,!1,!0),p=e.tag,l=e.result,\nb(e,!0,t),h=e.input.charCodeAt(e.position),!u&&e.line!==n||58!==h||(s=!0,h=e.input.charCodeAt(++e.position),b(e,!0,t),I(e,t,H,!1,!0),f=e.result),c?g(e,r,_,p,l,f):s?r.push(g(e,null,_,p,l,f)):r.push(l),b(e,!0,t),h=e.input.charCodeAt(e.position),44===h?(m=!0,h=e.input.charCodeAt(++e.position)):m=!1}d(e,\"unexpected end of the stream within a flow collection\")}function A(e,t){var n,o,a,s,u=Y,l=!1,p=!1,f=t,h=0,m=!1;if(s=e.input.charCodeAt(e.position),124===s)o=!1;else{if(62!==s)return!1;o=!0}for(e.kind=\"scalar\",e.result=\"\";0!==s;)if(s=e.input.charCodeAt(++e.position),43===s||45===s)Y===u?u=43===s?Z:$:d(e,\"repeat of a chomping mode identifier\");else{if(!((a=c(s))>=0))break;0===a?d(e,\"bad explicit indentation width of a block scalar; it cannot be less than one\"):p?d(e,\"repeat of an indentation width identifier\"):(f=t+a-1,p=!0)}if(i(s)){do s=e.input.charCodeAt(++e.position);while(i(s));if(35===s)do s=e.input.charCodeAt(++e.position);while(!r(s)&&0!==s)}for(;0!==s;){for(_(e),e.lineIndent=0,s=e.input.charCodeAt(e.position);(!p||e.lineIndent<f)&&32===s;)e.lineIndent++,s=e.input.charCodeAt(++e.position);if(!p&&e.lineIndent>f&&(f=e.lineIndent),r(s))h++;else{if(e.lineIndent<f){u===Z?e.result+=z.repeat(\"\\n\",l?1+h:h):u===Y&&l&&(e.result+=\"\\n\");break}for(o?i(s)?(m=!0,e.result+=z.repeat(\"\\n\",l?1+h:h)):m?(m=!1,e.result+=z.repeat(\"\\n\",h+1)):0===h?l&&(e.result+=\" \"):e.result+=z.repeat(\"\\n\",h):e.result+=z.repeat(\"\\n\",l?1+h:h),l=!0,p=!0,h=0,n=e.position;!r(s)&&0!==s;)s=e.input.charCodeAt(++e.position);v(e,n,e.position,!1)}}return!0}function T(e,t){var n,r,i,a=e.tag,s=e.anchor,u=[],c=!1;for(null!==e.anchor&&(e.anchorMap[e.anchor]=u),i=e.input.charCodeAt(e.position);0!==i&&45===i&&(r=e.input.charCodeAt(e.position+1),o(r));)if(c=!0,e.position++,b(e,!0,-1)&&e.lineIndent<=t)u.push(null),i=e.input.charCodeAt(e.position);else if(n=e.line,I(e,t,G,!1,!0),u.push(e.result),b(e,!0,-1),i=e.input.charCodeAt(e.position),(e.line===n||e.lineIndent>t)&&0!==i)d(e,\"bad indentation of a sequence entry\");else if(e.lineIndent<t)break;return!!c&&(e.tag=a,e.anchor=s,e.kind=\"sequence\",e.result=u,!0)}function D(e,t,n){var r,a,s,u,c,l=e.tag,p=e.anchor,f={},h={},m=null,v=null,y=null,_=!1,x=!1;for(null!==e.anchor&&(e.anchorMap[e.anchor]=f),c=e.input.charCodeAt(e.position);0!==c;){if(r=e.input.charCodeAt(e.position+1),s=e.line,u=e.position,63!==c&&58!==c||!o(r)){if(!I(e,n,J,!1,!0))break;if(e.line===s){for(c=e.input.charCodeAt(e.position);i(c);)c=e.input.charCodeAt(++e.position);if(58===c)c=e.input.charCodeAt(++e.position),o(c)||d(e,\"a whitespace character is expected after the key-value separator within a block mapping\"),_&&(g(e,f,h,m,v,null),m=v=y=null),x=!0,_=!1,a=!1,m=e.tag,v=e.result;else{if(!x)return e.tag=l,e.anchor=p,!0;d(e,\"can not read an implicit mapping pair; a colon is missed\")}}else{if(!x)return e.tag=l,e.anchor=p,!0;d(e,\"can not read a block mapping entry; a multiline key may not be an implicit key\")}}else 63===c?(_&&(g(e,f,h,m,v,null),m=v=y=null),x=!0,_=!0,a=!0):_?(_=!1,a=!0):d(e,\"incomplete explicit mapping pair; a key node is missed\"),e.position+=1,c=r;if((e.line===s||e.lineIndent>t)&&(I(e,t,X,!0,a)&&(_?v=e.result:y=e.result),_||(g(e,f,h,m,v,y,s,u),m=v=y=null),b(e,!0,-1),c=e.input.charCodeAt(e.position)),e.lineIndent>t&&0!==c)d(e,\"bad indentation of a mapping entry\");else if(e.lineIndent<t)break}return _&&g(e,f,h,m,v,null),x&&(e.tag=l,e.anchor=p,e.kind=\"mapping\",e.result=f),x}function M(e){var t,n,r,i,a=!1,s=!1;if(i=e.input.charCodeAt(e.position),33!==i)return!1;if(null!==e.tag&&d(e,\"duplication of a tag property\"),i=e.input.charCodeAt(++e.position),60===i?(a=!0,i=e.input.charCodeAt(++e.position)):33===i?(s=!0,n=\"!!\",i=e.input.charCodeAt(++e.position)):n=\"!\",t=e.position,a){do i=e.input.charCodeAt(++e.position);while(0!==i&&62!==i);e.position<e.length?(r=e.input.slice(t,e.position),i=e.input.charCodeAt(++e.position)):d(e,\"unexpected end of the stream within a verbatim tag\")}else{for(;0!==i&&!o(i);)33===i&&(s?d(e,\"tag suffix cannot contain exclamation marks\"):(n=e.input.slice(t-1,e.position+1),ne.test(n)||d(e,\"named tag handle cannot contain such characters\"),s=!0,t=e.position+1)),i=e.input.charCodeAt(++e.position);r=e.input.slice(t,e.position),te.test(r)&&d(e,\"tag suffix cannot contain flow indicator characters\")}return r&&!re.test(r)&&d(e,\"tag name cannot contain such characters: \"+r),a?e.tag=r:V.call(e.tagMap,n)?e.tag=e.tagMap[n]+r:\"!\"===n?e.tag=\"!\"+r:\"!!\"===n?e.tag=\"tag:yaml.org,2002:\"+r:d(e,'undeclared tag handle \"'+n+'\"'),!0}function O(e){var t,n;if(n=e.input.charCodeAt(e.position),38!==n)return!1;for(null!==e.anchor&&d(e,\"duplication of an anchor property\"),n=e.input.charCodeAt(++e.position),t=e.position;0!==n&&!o(n)&&!a(n);)n=e.input.charCodeAt(++e.position);return e.position===t&&d(e,\"name of an anchor node must contain at least one character\"),e.anchor=e.input.slice(t,e.position),!0}function P(e){var t,n,r;if(r=e.input.charCodeAt(e.position),42!==r)return!1;for(r=e.input.charCodeAt(++e.position),t=e.position;0!==r&&!o(r)&&!a(r);)r=e.input.charCodeAt(++e.position);return e.position===t&&d(e,\"name of an alias node must contain at least one character\"),n=e.input.slice(t,e.position),e.anchorMap.hasOwnProperty(n)||d(e,'unidentified alias \"'+n+'\"'),e.result=e.anchorMap[n],b(e,!0,-1),!0}function I(e,t,n,r,i){var o,a,s,u,c,l,p,f,h=1,m=!1,v=!1;if(null!==e.listener&&e.listener(\"open\",e),e.tag=null,e.anchor=null,e.kind=null,e.result=null,o=a=s=X===n||G===n,r&&b(e,!0,-1)&&(m=!0,e.lineIndent>t?h=1:e.lineIndent===t?h=0:e.lineIndent<t&&(h=-1)),1===h)for(;M(e)||O(e);)b(e,!0,-1)?(m=!0,s=o,e.lineIndent>t?h=1:e.lineIndent===t?h=0:e.lineIndent<t&&(h=-1)):s=!1;if(s&&(s=m||i),1!==h&&X!==n||(p=H===n||J===n?t:t+1,f=e.position-e.lineStart,1===h?s&&(T(e,f)||D(e,f,p))||C(e,p)?v=!0:(a&&A(e,p)||S(e,p)||E(e,p)?v=!0:P(e)?(v=!0,null===e.tag&&null===e.anchor||d(e,\"alias node should not have any properties\")):k(e,p,H===n)&&(v=!0,null===e.tag&&(e.tag=\"?\")),null!==e.anchor&&(e.anchorMap[e.anchor]=e.result)):0===h&&(v=s&&T(e,f))),null!==e.tag&&\"!\"!==e.tag)if(\"?\"===e.tag){for(u=0,c=e.implicitTypes.length;u<c;u+=1)if(l=e.implicitTypes[u],l.resolve(e.result)){e.result=l.construct(e.result),e.tag=l.tag,null!==e.anchor&&(e.anchorMap[e.anchor]=e.result);break}}else V.call(e.typeMap[e.kind||\"fallback\"],e.tag)?(l=e.typeMap[e.kind||\"fallback\"][e.tag],null!==e.result&&l.kind!==e.kind&&d(e,\"unacceptable node kind for !<\"+e.tag+'> tag; it should be \"'+l.kind+'\", not \"'+e.kind+'\"'),l.resolve(e.result)?(e.result=l.construct(e.result),null!==e.anchor&&(e.anchorMap[e.anchor]=e.result)):d(e,\"cannot resolve a node with !<\"+e.tag+\"> explicit tag\")):d(e,\"unknown tag !<\"+e.tag+\">\");return null!==e.listener&&e.listener(\"close\",e),null!==e.tag||null!==e.anchor||v}function N(e){var t,n,a,s,u=e.position,c=!1;for(e.version=null,e.checkLineBreaks=e.legacy,e.tagMap={},e.anchorMap={};0!==(s=e.input.charCodeAt(e.position))&&(b(e,!0,-1),s=e.input.charCodeAt(e.position),!(e.lineIndent>0||37!==s));){for(c=!0,s=e.input.charCodeAt(++e.position),t=e.position;0!==s&&!o(s);)s=e.input.charCodeAt(++e.position);for(n=e.input.slice(t,e.position),a=[],n.length<1&&d(e,\"directive name must not be less than one character in length\");0!==s;){for(;i(s);)s=e.input.charCodeAt(++e.position);if(35===s){do s=e.input.charCodeAt(++e.position);while(0!==s&&!r(s));break}if(r(s))break;for(t=e.position;0!==s&&!o(s);)s=e.input.charCodeAt(++e.position);a.push(e.input.slice(t,e.position))}0!==s&&_(e),V.call(se,n)?se[n](e,n,a):m(e,'unknown document directive \"'+n+'\"')}return b(e,!0,-1),0===e.lineIndent&&45===e.input.charCodeAt(e.position)&&45===e.input.charCodeAt(e.position+1)&&45===e.input.charCodeAt(e.position+2)?(e.position+=3,b(e,!0,-1)):c&&d(e,\"directives end mark is expected\"),I(e,e.lineIndent-1,X,!1,!0),b(e,!0,-1),e.checkLineBreaks&&ee.test(e.input.slice(u,e.position))&&m(e,\"non-ASCII line breaks are interpreted as content\"),e.documents.push(e.result),e.position===e.lineStart&&x(e)?void(46===e.input.charCodeAt(e.position)&&(e.position+=3,b(e,!0,-1))):void(e.position<e.length-1&&d(e,\"end of the stream or a document separator is expected\"))}function R(e,t){e=String(e),t=t||{},0!==e.length&&(10!==e.charCodeAt(e.length-1)&&13!==e.charCodeAt(e.length-1)&&(e+=\"\\n\"),65279===e.charCodeAt(0)&&(e=e.slice(1)));var n=new f(e,t);for(n.input+=\"\\0\";32===n.input.charCodeAt(n.position);)n.lineIndent+=1,n.position+=1;for(;n.position<n.length-1;)N(n);return n.documents}function j(e,t,n){var r,i,o=R(e,n);for(r=0,i=o.length;r<i;r+=1)t(o[r])}function F(e,t){var n=R(e,t);if(0!==n.length){if(1===n.length)return n[0];throw new q(\"expected a single document in the stream, but found more\")}}function B(e,t,n){j(e,t,z.extend({schema:W},n))}function L(e,t){return F(e,z.extend({schema:W},t))}for(var z=n(451),q=n(452),U=n(453),W=n(454),K=n(473),V=Object.prototype.hasOwnProperty,H=1,J=2,G=3,X=4,Y=1,$=2,Z=3,Q=/[\\x00-\\x08\\x0B\\x0C\\x0E-\\x1F\\x7F-\\x84\\x86-\\x9F\\uFFFE\\uFFFF]|[\\uD800-\\uDBFF](?![\\uDC00-\\uDFFF])|(?:[^\\uD800-\\uDBFF]|^)[\\uDC00-\\uDFFF]/,ee=/[\\x85\\u2028\\u2029]/,te=/[,\\[\\]\\{\\}]/,ne=/^(?:!|!!|![a-z\\-]+!)$/i,re=/^(?:!|[^,\\[\\]\\{\\}])(?:%[0-9a-f]{2}|[0-9a-z\\-#;\\/\\?:@&=\\+\\$,_\\.!~\\*'\\(\\)\\[\\]])*$/i,ie=new Array(256),oe=new Array(256),ae=0;ae<256;ae++)ie[ae]=l(ae)?1:0,oe[ae]=l(ae);var se={YAML:function(e,t,n){var r,i,o;null!==e.version&&d(e,\"duplication of %YAML directive\"),1!==n.length&&d(e,\"YAML directive accepts exactly one argument\"),r=/^([0-9]+)\\.([0-9]+)$/.exec(n[0]),null===r&&d(e,\"ill-formed argument of the YAML directive\"),i=parseInt(r[1],10),o=parseInt(r[2],10),1!==i&&d(e,\"unacceptable YAML version of the document\"),e.version=n[0],e.checkLineBreaks=o<2,1!==o&&2!==o&&m(e,\"unsupported YAML version of the document\")},TAG:function(e,t,n){var r,i;2!==n.length&&d(e,\"TAG directive accepts exactly two arguments\"),r=n[0],i=n[1],ne.test(r)||d(e,\"ill-formed tag handle (first argument) of the TAG directive\"),V.call(e.tagMap,r)&&d(e,'there is a previously declared suffix for \"'+r+'\" tag handle'),re.test(i)||d(e,\"ill-formed tag prefix (second argument) of the TAG directive\"),e.tagMap[r]=i}};e.exports.loadAll=j,e.exports.load=F,e.exports.safeLoadAll=B,e.exports.safeLoad=L},function(e,t){\"use strict\";function n(e){return\"undefined\"==typeof e||null===e}function r(e){return\"object\"==typeof e&&null!==e}function i(e){return Array.isArray(e)?e:n(e)?[]:[e]}function o(e,t){var n,r,i,o;if(t)for(o=Object.keys(t),n=0,r=o.length;n<r;n+=1)i=o[n],e[i]=t[i];return e}function a(e,t){var n,r=\"\";for(n=0;n<t;n+=1)r+=e;return r}function s(e){return 0===e&&Number.NEGATIVE_INFINITY===1/e}e.exports.isNothing=n,e.exports.isObject=r,e.exports.toArray=i,e.exports.repeat=a,e.exports.isNegativeZero=s,e.exports.extend=o},function(e,t){\"use strict\";function n(e,t){Error.call(this),Error.captureStackTrace?Error.captureStackTrace(this,this.constructor):this.stack=(new Error).stack||\"\",this.name=\"YAMLException\",this.reason=e,this.mark=t,this.message=(this.reason||\"(unknown reason)\")+(this.mark?\" \"+this.mark.toString():\"\")}n.prototype=Object.create(Error.prototype),n.prototype.constructor=n,n.prototype.toString=function(e){var t=this.name+\": \";return t+=this.reason||\"(unknown reason)\",!e&&this.mark&&(t+=\" \"+this.mark.toString()),t},e.exports=n},function(e,t,n){\"use strict\";function r(e,t,n,r,i){this.name=e,this.buffer=t,this.position=n,this.line=r,this.column=i}var i=n(451);r.prototype.getSnippet=function(e,t){var n,r,o,a,s;if(!this.buffer)return null;for(e=e||4,t=t||75,n=\"\",r=this.position;r>0&&\"\\0\\r\\n\\u2028\\u2029\".indexOf(this.buffer.charAt(r-1))===-1;)if(r-=1,this.position-r>t/2-1){n=\" ... \",r+=5;break}for(o=\"\",a=this.position;a<this.buffer.length&&\"\\0\\r\\n\\u2028\\u2029\".indexOf(this.buffer.charAt(a))===-1;)if(a+=1,a-this.position>t/2-1){o=\" ... \",a-=5;break}return s=this.buffer.slice(r,a),i.repeat(\" \",e)+n+s+o+\"\\n\"+i.repeat(\" \",e+this.position-r+n.length)+\"^\"},r.prototype.toString=function(e){var t,n=\"\";return this.name&&(n+='in \"'+this.name+'\" '),n+=\"at line \"+(this.line+1)+\", column \"+(this.column+1),e||(t=this.getSnippet(),t&&(n+=\":\\n\"+t)),n},e.exports=r},function(e,t,n){\"use strict\";var r=n(455);e.exports=new r({include:[n(457)],implicit:[n(467),n(468)],explicit:[n(469),n(470),n(471),n(472)]})},function(e,t,n){\"use strict\";function r(e,t,n){var i=[];return e.include.forEach(function(e){n=r(e,t,n)}),e[t].forEach(function(e){n.forEach(function(t,n){t.tag===e.tag&&t.kind===e.kind&&i.push(n)}),n.push(e)}),n.filter(function(e,t){return i.indexOf(t)===-1})}function i(){function e(e){r[e.kind][e.tag]=r.fallback[e.tag]=e}var t,n,r={scalar:{},sequence:{},mapping:{},fallback:{}};for(t=0,n=arguments.length;t<n;t+=1)arguments[t].forEach(e);return r}function o(e){this.include=e.include||[],this.implicit=e.implicit||[],this.explicit=e.explicit||[],this.implicit.forEach(function(e){if(e.loadKind&&\"scalar\"!==e.loadKind)throw new s(\"There is a non-scalar type in the implicit list of a schema. Implicit resolving of such types is not supported.\")}),this.compiledImplicit=r(this,\"implicit\",[]),this.compiledExplicit=r(this,\"explicit\",[]),this.compiledTypeMap=i(this.compiledImplicit,this.compiledExplicit)}var a=n(451),s=n(452),u=n(456);o.DEFAULT=null,o.create=function(){var e,t;switch(arguments.length){case 1:e=o.DEFAULT,t=arguments[0];break;case 2:e=arguments[0],t=arguments[1];break;default:throw new s(\"Wrong number of arguments for Schema.create function\")}if(e=a.toArray(e),t=a.toArray(t),!e.every(function(e){return e instanceof o}))throw new s(\"Specified list of super schemas (or a single Schema object) contains a non-Schema object.\");if(!t.every(function(e){return e instanceof u}))throw new s(\"Specified list of YAML types (or a single Type object) contains a non-Type object.\");return new o({include:e,explicit:t})},e.exports=o},function(e,t,n){\"use strict\";function r(e){var t={};return null!==e&&Object.keys(e).forEach(function(n){e[n].forEach(function(e){t[String(e)]=n})}),t}function i(e,t){if(t=t||{},Object.keys(t).forEach(function(t){if(a.indexOf(t)===-1)throw new o('Unknown option \"'+t+'\" is met in definition of \"'+e+'\" YAML type.')}),this.tag=e,this.kind=t.kind||null,this.resolve=t.resolve||function(){return!0},this.construct=t.construct||function(e){return e},this.instanceOf=t.instanceOf||null,this.predicate=t.predicate||null,this.represent=t.represent||null,this.defaultStyle=t.defaultStyle||null,this.styleAliases=r(t.styleAliases||null),s.indexOf(this.kind)===-1)throw new o('Unknown kind \"'+this.kind+'\" is specified for \"'+e+'\" YAML type.')}var o=n(452),a=[\"kind\",\"resolve\",\"construct\",\"instanceOf\",\"predicate\",\"represent\",\"defaultStyle\",\"styleAliases\"],s=[\"scalar\",\"sequence\",\"mapping\"];e.exports=i},function(e,t,n){\"use strict\";var r=n(455);e.exports=new r({include:[n(458)]})},function(e,t,n){\"use strict\";var r=n(455);e.exports=new r({include:[n(459)],implicit:[n(463),n(464),n(465),n(466)]})},function(e,t,n){\"use strict\";var r=n(455);e.exports=new r({explicit:[n(460),n(461),n(462)]})},function(e,t,n){\"use strict\";var r=n(456);e.exports=new r(\"tag:yaml.org,2002:str\",{kind:\"scalar\",construct:function(e){return null!==e?e:\"\"}})},function(e,t,n){\"use strict\";var r=n(456);e.exports=new r(\"tag:yaml.org,2002:seq\",{kind:\"sequence\",construct:function(e){return null!==e?e:[]}})},function(e,t,n){\"use strict\";var r=n(456);e.exports=new r(\"tag:yaml.org,2002:map\",{kind:\"mapping\",construct:function(e){return null!==e?e:{}}})},function(e,t,n){\"use strict\";function r(e){if(null===e)return!0;var t=e.length;return 1===t&&\"~\"===e||4===t&&(\"null\"===e||\"Null\"===e||\"NULL\"===e)}function i(){return null}function o(e){return null===e}var a=n(456);e.exports=new a(\"tag:yaml.org,2002:null\",{kind:\"scalar\",resolve:r,construct:i,predicate:o,represent:{canonical:function(){return\"~\"},lowercase:function(){return\"null\"},uppercase:function(){return\"NULL\"},camelcase:function(){return\"Null\"}},defaultStyle:\"lowercase\"})},function(e,t,n){\"use strict\";function r(e){if(null===e)return!1;var t=e.length;return 4===t&&(\"true\"===e||\"True\"===e||\"TRUE\"===e)||5===t&&(\"false\"===e||\"False\"===e||\"FALSE\"===e)}function i(e){return\"true\"===e||\"True\"===e||\"TRUE\"===e}function o(e){return\"[object Boolean]\"===Object.prototype.toString.call(e)}var a=n(456);e.exports=new a(\"tag:yaml.org,2002:bool\",{kind:\"scalar\",resolve:r,construct:i,predicate:o,represent:{lowercase:function(e){return e?\"true\":\"false\"},uppercase:function(e){return e?\"TRUE\":\"FALSE\"},camelcase:function(e){return e?\"True\":\"False\"}},defaultStyle:\"lowercase\"})},function(e,t,n){\"use strict\";function r(e){return 48<=e&&e<=57||65<=e&&e<=70||97<=e&&e<=102}function i(e){return 48<=e&&e<=55}function o(e){return 48<=e&&e<=57}function a(e){if(null===e)return!1;var t,n=e.length,a=0,s=!1;if(!n)return!1;if(t=e[a],\"-\"!==t&&\"+\"!==t||(t=e[++a]),\"0\"===t){if(a+1===n)return!0;if(t=e[++a],\"b\"===t){for(a++;a<n;a++)if(t=e[a],\"_\"!==t){if(\"0\"!==t&&\"1\"!==t)return!1;s=!0}return s&&\"_\"!==t}if(\"x\"===t){for(a++;a<n;a++)if(t=e[a],\"_\"!==t){if(!r(e.charCodeAt(a)))return!1;s=!0}return s&&\"_\"!==t}for(;a<n;a++)if(t=e[a],\"_\"!==t){if(!i(e.charCodeAt(a)))return!1;s=!0}return s&&\"_\"!==t}if(\"_\"===t)return!1;for(;a<n;a++)if(t=e[a],\"_\"!==t){if(\":\"===t)break;if(!o(e.charCodeAt(a)))return!1;s=!0}return!(!s||\"_\"===t)&&(\":\"!==t||/^(:[0-5]?[0-9])+$/.test(e.slice(a)))}function s(e){var t,n,r=e,i=1,o=[];return r.indexOf(\"_\")!==-1&&(r=r.replace(/_/g,\"\")),t=r[0],\"-\"!==t&&\"+\"!==t||(\"-\"===t&&(i=-1),r=r.slice(1),t=r[0]),\"0\"===r?0:\"0\"===t?\"b\"===r[1]?i*parseInt(r.slice(2),2):\"x\"===r[1]?i*parseInt(r,16):i*parseInt(r,8):r.indexOf(\":\")!==-1?(r.split(\":\").forEach(function(e){o.unshift(parseInt(e,10))}),r=0,n=1,o.forEach(function(e){r+=e*n,n*=60}),i*r):i*parseInt(r,10)}function u(e){return\"[object Number]\"===Object.prototype.toString.call(e)&&e%1===0&&!c.isNegativeZero(e)}var c=n(451),l=n(456);e.exports=new l(\"tag:yaml.org,2002:int\",{kind:\"scalar\",resolve:a,construct:s,predicate:u,represent:{binary:function(e){return\"0b\"+e.toString(2)},octal:function(e){return\"0\"+e.toString(8)},decimal:function(e){return e.toString(10)},hexadecimal:function(e){return\"0x\"+e.toString(16).toUpperCase()}},defaultStyle:\"decimal\",styleAliases:{binary:[2,\"bin\"],octal:[8,\"oct\"],decimal:[10,\"dec\"],hexadecimal:[16,\"hex\"]}})},function(e,t,n){\"use strict\";function r(e){return null!==e&&!(!c.test(e)||\"_\"===e[e.length-1])}function i(e){var t,n,r,i;return t=e.replace(/_/g,\"\").toLowerCase(),n=\"-\"===t[0]?-1:1,i=[],\"+-\".indexOf(t[0])>=0&&(t=t.slice(1)),\".inf\"===t?1===n?Number.POSITIVE_INFINITY:Number.NEGATIVE_INFINITY:\".nan\"===t?NaN:t.indexOf(\":\")>=0?(t.split(\":\").forEach(function(e){i.unshift(parseFloat(e,10))}),t=0,r=1,i.forEach(function(e){t+=e*r,r*=60}),n*t):n*parseFloat(t,10)}function o(e,t){var n;if(isNaN(e))switch(t){case\"lowercase\":return\".nan\";case\"uppercase\":return\".NAN\";case\"camelcase\":return\".NaN\"}else if(Number.POSITIVE_INFINITY===e)switch(t){case\"lowercase\":return\".inf\";case\"uppercase\":return\".INF\";case\"camelcase\":return\".Inf\"}else if(Number.NEGATIVE_INFINITY===e)switch(t){case\"lowercase\":return\"-.inf\";case\"uppercase\":return\"-.INF\";case\"camelcase\":return\"-.Inf\"}else if(s.isNegativeZero(e))return\"-0.0\";return n=e.toString(10),l.test(n)?n.replace(\"e\",\".e\"):n}function a(e){return\"[object Number]\"===Object.prototype.toString.call(e)&&(e%1!==0||s.isNegativeZero(e))}var s=n(451),u=n(456),c=new RegExp(\"^(?:[-+]?(?:0|[1-9][0-9_]*)(?:\\\\.[0-9_]*)?(?:[eE][-+]?[0-9]+)?|\\\\.[0-9_]+(?:[eE][-+]?[0-9]+)?|[-+]?[0-9][0-9_]*(?::[0-5]?[0-9])+\\\\.[0-9_]*|[-+]?\\\\.(?:inf|Inf|INF)|\\\\.(?:nan|NaN|NAN))$\"),l=/^[-+]?[0-9]+e/;e.exports=new u(\"tag:yaml.org,2002:float\",{kind:\"scalar\",resolve:r,construct:i,predicate:a,represent:o,defaultStyle:\"lowercase\"})},function(e,t,n){\"use strict\";function r(e){return null!==e&&(null!==s.exec(e)||null!==u.exec(e))}function i(e){var t,n,r,i,o,a,c,l,p,f,h=0,d=null;if(t=s.exec(e),null===t&&(t=u.exec(e)),null===t)throw new Error(\"Date resolve error\");if(n=+t[1],r=+t[2]-1,i=+t[3],!t[4])return new Date(Date.UTC(n,r,i));if(o=+t[4],a=+t[5],c=+t[6],t[7]){for(h=t[7].slice(0,3);h.length<3;)h+=\"0\";h=+h}return t[9]&&(l=+t[10],p=+(t[11]||0),d=6e4*(60*l+p),\"-\"===t[9]&&(d=-d)),f=new Date(Date.UTC(n,r,i,o,a,c,h)),d&&f.setTime(f.getTime()-d),f}function o(e){return e.toISOString()}var a=n(456),s=new RegExp(\"^([0-9][0-9][0-9][0-9])-([0-9][0-9])-([0-9][0-9])$\"),u=new RegExp(\"^([0-9][0-9][0-9][0-9])-([0-9][0-9]?)-([0-9][0-9]?)(?:[Tt]|[ \\\\t]+)([0-9][0-9]?):([0-9][0-9]):([0-9][0-9])(?:\\\\.([0-9]*))?(?:[ \\\\t]*(Z|([-+])([0-9][0-9]?)(?::([0-9][0-9]))?))?$\");e.exports=new a(\"tag:yaml.org,2002:timestamp\",{kind:\"scalar\",resolve:r,construct:i,instanceOf:Date,represent:o})},function(e,t,n){\"use strict\";function r(e){return\"<<\"===e||null===e}var i=n(456);e.exports=new i(\"tag:yaml.org,2002:merge\",{kind:\"scalar\",resolve:r})},function(e,t,n){function r(e){if(null===e)return!1;var t,n,r=0,i=e.length,o=c;for(n=0;n<i;n++)if(t=o.indexOf(e.charAt(n)),!(t>64)){if(t<0)return!1;r+=6}return r%8===0}function i(e){var t,n,r=e.replace(/[\\r\\n=]/g,\"\"),i=r.length,o=c,a=0,u=[];for(t=0;t<i;t++)t%4===0&&t&&(u.push(a>>16&255),u.push(a>>8&255),u.push(255&a)),a=a<<6|o.indexOf(r.charAt(t));return n=i%4*6,0===n?(u.push(a>>16&255),u.push(a>>8&255),u.push(255&a)):18===n?(u.push(a>>10&255),u.push(a>>2&255)):12===n&&u.push(a>>4&255),s?s.from?s.from(u):new s(u):u}function o(e){var t,n,r=\"\",i=0,o=e.length,a=c;for(t=0;t<o;t++)t%3===0&&t&&(r+=a[i>>18&63],r+=a[i>>12&63],r+=a[i>>6&63],r+=a[63&i]),i=(i<<8)+e[t];return n=o%3,0===n?(r+=a[i>>18&63],r+=a[i>>12&63],r+=a[i>>6&63],r+=a[63&i]):2===n?(r+=a[i>>10&63],r+=a[i>>4&63],r+=a[i<<2&63],r+=a[64]):1===n&&(r+=a[i>>2&63],r+=a[i<<4&63],r+=a[64],r+=a[64]),r}function a(e){return s&&s.isBuffer(e)}var s;try{s=n(132).Buffer}catch(e){}var u=n(456),c=\"ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/=\\n\\r\";e.exports=new u(\"tag:yaml.org,2002:binary\",{kind:\"scalar\",resolve:r,construct:i,predicate:a,represent:o})},function(e,t,n){\"use strict\";function r(e){if(null===e)return!0;var t,n,r,i,o,u=[],c=e;for(t=0,n=c.length;t<n;t+=1){if(r=c[t],o=!1,\"[object Object]\"!==s.call(r))return!1;for(i in r)if(a.call(r,i)){if(o)return!1;o=!0}if(!o)return!1;if(u.indexOf(i)!==-1)return!1;u.push(i)}return!0}function i(e){return null!==e?e:[]}var o=n(456),a=Object.prototype.hasOwnProperty,s=Object.prototype.toString;e.exports=new o(\"tag:yaml.org,2002:omap\",{kind:\"sequence\",resolve:r,construct:i})},function(e,t,n){\"use strict\";function r(e){if(null===e)return!0;var t,n,r,i,o,s=e;for(o=new Array(s.length),t=0,n=s.length;t<n;t+=1){if(r=s[t],\"[object Object]\"!==a.call(r))return!1;if(i=Object.keys(r),1!==i.length)return!1;o[t]=[i[0],r[i[0]]]}return!0}function i(e){if(null===e)return[];var t,n,r,i,o,a=e;for(o=new Array(a.length),t=0,n=a.length;t<n;t+=1)r=a[t],i=Object.keys(r),o[t]=[i[0],r[i[0]]];return o}var o=n(456),a=Object.prototype.toString;e.exports=new o(\"tag:yaml.org,2002:pairs\",{kind:\"sequence\",resolve:r,construct:i})},function(e,t,n){\"use strict\";function r(e){if(null===e)return!0;var t,n=e;for(t in n)if(a.call(n,t)&&null!==n[t])return!1;return!0}function i(e){return null!==e?e:{}}var o=n(456),a=Object.prototype.hasOwnProperty;e.exports=new o(\"tag:yaml.org,2002:set\",{kind:\"mapping\",resolve:r,construct:i})},function(e,t,n){\"use strict\";var r=n(455);e.exports=r.DEFAULT=new r({include:[n(454)],explicit:[n(474),n(475),n(476)]})},function(e,t,n){\"use strict\";function r(){return!0}function i(){}function o(){return\"\"}function a(e){return\"undefined\"==typeof e}var s=n(456);e.exports=new s(\"tag:yaml.org,2002:js/undefined\",{kind:\"scalar\",resolve:r,construct:i,predicate:a,represent:o})},function(e,t,n){\"use strict\";function r(e){if(null===e)return!1;if(0===e.length)return!1;var t=e,n=/\\/([gim]*)$/.exec(e),r=\"\";if(\"/\"===t[0]){if(n&&(r=n[1]),r.length>3)return!1;if(\"/\"!==t[t.length-r.length-1])return!1}return!0}function i(e){var t=e,n=/\\/([gim]*)$/.exec(e),r=\"\";return\"/\"===t[0]&&(n&&(r=n[1]),t=t.slice(1,t.length-r.length-1)),new RegExp(t,r)}function o(e){var t=\"/\"+e.source+\"/\";return e.global&&(t+=\"g\"),e.multiline&&(t+=\"m\"),e.ignoreCase&&(t+=\"i\"),t}function a(e){return\"[object RegExp]\"===Object.prototype.toString.call(e)}var s=n(456);e.exports=new s(\"tag:yaml.org,2002:js/regexp\",{kind:\"scalar\",resolve:r,construct:i,predicate:a,represent:o})},function(e,t,n){function r(e){if(null===e)return!1;try{var t=\"(\"+e+\")\",n=s.parse(t,{range:!0});return\"Program\"===n.type&&1===n.body.length&&\"ExpressionStatement\"===n.body[0].type&&\"FunctionExpression\"===n.body[0].expression.type}catch(e){return!1}}function i(e){var t,n=\"(\"+e+\")\",r=s.parse(n,{range:!0}),i=[];if(\"Program\"!==r.type||1!==r.body.length||\"ExpressionStatement\"!==r.body[0].type||\"FunctionExpression\"!==r.body[0].expression.type)throw new Error(\"Failed to resolve function\");return r.body[0].expression.params.forEach(function(e){i.push(e.name)}),t=r.body[0].expression.body.range,new Function(i,n.slice(t[0]+1,t[1]-1))}function o(e){return e.toString()}function a(e){return\"[object Function]\"===Object.prototype.toString.call(e)}var s;try{s=n(477)}catch(e){\"undefined\"!=typeof window&&(s=window.esprima)}var u=n(456);e.exports=new u(\"tag:yaml.org,2002:js/function\",{kind:\"scalar\",resolve:r,construct:i,predicate:a,represent:o})},function(e,t,n){!function(t,n){e.exports=n()}(this,function(){return function(e){function t(r){if(n[r])return n[r].exports;var i=n[r]={exports:{},id:r,loaded:!1};return e[r].call(i.exports,i,i.exports,t),i.loaded=!0,i.exports}var n={};return t.m=e,t.c=n,t.p=\"\",t(0)}([function(e,t,n){\"use strict\";function r(e,t,n){var r=null,i=function(e,t){n&&n(e,t),r&&r.visit(e,t)},u=\"function\"==typeof n?i:null,c=!1;if(t){c=\"boolean\"==typeof t.comment&&t.comment;var l=\"boolean\"==typeof t.attachComment&&t.attachComment;(c||l)&&(r=new o.CommentHandler,r.attach=l,t.comment=!0,u=i)}var p;p=t&&\"boolean\"==typeof t.jsx&&t.jsx?new s.JSXParser(e,t,u):new a.Parser(e,t,u);var f=p.parseProgram();return c&&(f.comments=r.comments),p.config.tokens&&(f.tokens=p.tokens),p.config.tolerant&&(f.errors=p.errorHandler.errors),f}function i(e,t,n){var r,i=new u.Tokenizer(e,t);r=[];try{for(;;){var o=i.getNextToken();if(!o)break;n&&(o=n(o)),r.push(o)}}catch(e){i.errorHandler.tolerate(e)}return i.errorHandler.tolerant&&(r.errors=i.errors()),r}var o=n(1),a=n(3),s=n(11),u=n(15);t.parse=r,t.tokenize=i;var c=n(2);t.Syntax=c.Syntax,t.version=\"3.1.3\"},function(e,t,n){\"use strict\";var r=n(2),i=function(){function e(){this.attach=!1,this.comments=[],this.stack=[],this.leading=[],this.trailing=[]}return e.prototype.insertInnerComments=function(e,t){if(e.type===r.Syntax.BlockStatement&&0===e.body.length){for(var n=[],i=this.leading.length-1;i>=0;--i){var o=this.leading[i];t.end.offset>=o.start&&(n.unshift(o.comment),this.leading.splice(i,1),this.trailing.splice(i,1))}n.length&&(e.innerComments=n)}},e.prototype.findTrailingComments=function(e,t){var n=[];if(this.trailing.length>0){for(var r=this.trailing.length-1;r>=0;--r){var i=this.trailing[r];i.start>=t.end.offset&&n.unshift(i.comment)}return this.trailing.length=0,n}var o=this.stack[this.stack.length-1];if(o&&o.node.trailingComments){var a=o.node.trailingComments[0];a&&a.range[0]>=t.end.offset&&(n=o.node.trailingComments,delete o.node.trailingComments)}return n},e.prototype.findLeadingComments=function(e,t){for(var n,r=[];this.stack.length>0;){var i=this.stack[this.stack.length-1];if(!(i&&i.start>=t.start.offset))break;n=this.stack.pop().node}if(n){for(var o=n.leadingComments?n.leadingComments.length:0,a=o-1;a>=0;--a){var s=n.leadingComments[a];s.range[1]<=t.start.offset&&(r.unshift(s),n.leadingComments.splice(a,1))}return n.leadingComments&&0===n.leadingComments.length&&delete n.leadingComments,r}for(var a=this.leading.length-1;a>=0;--a){var i=this.leading[a];i.start<=t.start.offset&&(r.unshift(i.comment),this.leading.splice(a,1))}return r},e.prototype.visitNode=function(e,t){if(!(e.type===r.Syntax.Program&&e.body.length>0)){this.insertInnerComments(e,t);var n=this.findTrailingComments(e,t),i=this.findLeadingComments(e,t);i.length>0&&(e.leadingComments=i),n.length>0&&(e.trailingComments=n),this.stack.push({node:e,start:t.start.offset})}},e.prototype.visitComment=function(e,t){var n=\"L\"===e.type[0]?\"Line\":\"Block\",r={type:n,value:e.value};if(e.range&&(r.range=e.range),e.loc&&(r.loc=e.loc),this.comments.push(r),this.attach){var i={comment:{type:n,value:e.value,range:[t.start.offset,t.end.offset]},start:t.start.offset};e.loc&&(i.comment.loc=e.loc),e.type=n,this.leading.push(i),this.trailing.push(i)}},e.prototype.visit=function(e,t){\"LineComment\"===e.type?this.visitComment(e,t):\"BlockComment\"===e.type?this.visitComment(e,t):this.attach&&this.visitNode(e,t)},e}();t.CommentHandler=i},function(e,t){\"use strict\";t.Syntax={AssignmentExpression:\"AssignmentExpression\",AssignmentPattern:\"AssignmentPattern\",ArrayExpression:\"ArrayExpression\",ArrayPattern:\"ArrayPattern\",ArrowFunctionExpression:\"ArrowFunctionExpression\",BlockStatement:\"BlockStatement\",BinaryExpression:\"BinaryExpression\",BreakStatement:\"BreakStatement\",CallExpression:\"CallExpression\",CatchClause:\"CatchClause\",ClassBody:\"ClassBody\",ClassDeclaration:\"ClassDeclaration\",ClassExpression:\"ClassExpression\",ConditionalExpression:\"ConditionalExpression\",ContinueStatement:\"ContinueStatement\",DoWhileStatement:\"DoWhileStatement\",DebuggerStatement:\"DebuggerStatement\",EmptyStatement:\"EmptyStatement\",ExportAllDeclaration:\"ExportAllDeclaration\",ExportDefaultDeclaration:\"ExportDefaultDeclaration\",ExportNamedDeclaration:\"ExportNamedDeclaration\",ExportSpecifier:\"ExportSpecifier\",ExpressionStatement:\"ExpressionStatement\",ForStatement:\"ForStatement\",ForOfStatement:\"ForOfStatement\",ForInStatement:\"ForInStatement\",FunctionDeclaration:\"FunctionDeclaration\",FunctionExpression:\"FunctionExpression\",Identifier:\"Identifier\",IfStatement:\"IfStatement\",ImportDeclaration:\"ImportDeclaration\",ImportDefaultSpecifier:\"ImportDefaultSpecifier\",ImportNamespaceSpecifier:\"ImportNamespaceSpecifier\",ImportSpecifier:\"ImportSpecifier\",Literal:\"Literal\",LabeledStatement:\"LabeledStatement\",LogicalExpression:\"LogicalExpression\",MemberExpression:\"MemberExpression\",MetaProperty:\"MetaProperty\",MethodDefinition:\"MethodDefinition\",NewExpression:\"NewExpression\",ObjectExpression:\"ObjectExpression\",ObjectPattern:\"ObjectPattern\",Program:\"Program\",Property:\"Property\",RestElement:\"RestElement\",ReturnStatement:\"ReturnStatement\",SequenceExpression:\"SequenceExpression\",SpreadElement:\"SpreadElement\",Super:\"Super\",SwitchCase:\"SwitchCase\",SwitchStatement:\"SwitchStatement\",TaggedTemplateExpression:\"TaggedTemplateExpression\",TemplateElement:\"TemplateElement\",TemplateLiteral:\"TemplateLiteral\",ThisExpression:\"ThisExpression\",ThrowStatement:\"ThrowStatement\",TryStatement:\"TryStatement\",UnaryExpression:\"UnaryExpression\",UpdateExpression:\"UpdateExpression\",VariableDeclaration:\"VariableDeclaration\",VariableDeclarator:\"VariableDeclarator\",WhileStatement:\"WhileStatement\",WithStatement:\"WithStatement\",YieldExpression:\"YieldExpression\"}},function(e,t,n){\"use strict\";var r=n(4),i=n(5),o=n(6),a=n(7),s=n(8),u=n(2),c=n(10),l=\"ArrowParameterPlaceHolder\",p=function(){function e(e,t,n){void 0===t&&(t={}),this.config={range:\"boolean\"==typeof t.range&&t.range,loc:\"boolean\"==typeof t.loc&&t.loc,source:null,tokens:\"boolean\"==typeof t.tokens&&t.tokens,comment:\"boolean\"==typeof t.comment&&t.comment,tolerant:\"boolean\"==typeof t.tolerant&&t.tolerant},this.config.loc&&t.source&&null!==t.source&&(this.config.source=String(t.source)),this.delegate=n,this.errorHandler=new o.ErrorHandler,this.errorHandler.tolerant=this.config.tolerant,this.scanner=new s.Scanner(e,this.errorHandler),this.scanner.trackComment=this.config.comment,this.operatorPrecedence={\")\":0,\";\":0,\",\":0,\"=\":0,\"]\":0,\"||\":1,\"&&\":2,\"|\":3,\"^\":4,\"&\":5,\"==\":6,\"!=\":6,\"===\":6,\"!==\":6,\"<\":7,\">\":7,\"<=\":7,\">=\":7,\"<<\":8,\">>\":8,\">>>\":8,\"+\":9,\"-\":9,\"*\":11,\"/\":11,\"%\":11},this.sourceType=t&&\"module\"===t.sourceType?\"module\":\"script\",this.lookahead=null,this.hasLineTerminator=!1,this.context={allowIn:!0,allowYield:!0,firstCoverInitializedNameError:null,isAssignmentTarget:!1,isBindingElement:!1,inFunctionBody:!1,inIteration:!1,inSwitch:!1,labelSet:{},strict:\"module\"===this.sourceType},this.tokens=[],this.startMarker={index:0,lineNumber:this.scanner.lineNumber,\nlineStart:0},this.lastMarker={index:0,lineNumber:this.scanner.lineNumber,lineStart:0},this.nextToken(),this.lastMarker={index:this.scanner.index,lineNumber:this.scanner.lineNumber,lineStart:this.scanner.lineStart}}return e.prototype.throwError=function(e){for(var t=[],n=1;n<arguments.length;n++)t[n-1]=arguments[n];var i=Array.prototype.slice.call(arguments,1),o=e.replace(/%(\\d)/g,function(e,t){return r.assert(t<i.length,\"Message reference must be in range\"),i[t]}),a=this.lastMarker.index,s=this.lastMarker.lineNumber,u=this.lastMarker.index-this.lastMarker.lineStart+1;throw this.errorHandler.createError(a,s,u,o)},e.prototype.tolerateError=function(e){for(var t=[],n=1;n<arguments.length;n++)t[n-1]=arguments[n];var i=Array.prototype.slice.call(arguments,1),o=e.replace(/%(\\d)/g,function(e,t){return r.assert(t<i.length,\"Message reference must be in range\"),i[t]}),a=this.lastMarker.index,s=this.scanner.lineNumber,u=this.lastMarker.index-this.lastMarker.lineStart+1;this.errorHandler.tolerateError(a,s,u,o)},e.prototype.unexpectedTokenError=function(e,t){var n,r=t||i.Messages.UnexpectedToken;if(e?(t||(r=e.type===a.Token.EOF?i.Messages.UnexpectedEOS:e.type===a.Token.Identifier?i.Messages.UnexpectedIdentifier:e.type===a.Token.NumericLiteral?i.Messages.UnexpectedNumber:e.type===a.Token.StringLiteral?i.Messages.UnexpectedString:e.type===a.Token.Template?i.Messages.UnexpectedTemplate:i.Messages.UnexpectedToken,e.type===a.Token.Keyword&&(this.scanner.isFutureReservedWord(e.value)?r=i.Messages.UnexpectedReserved:this.context.strict&&this.scanner.isStrictModeReservedWord(e.value)&&(r=i.Messages.StrictReservedWord))),n=e.type===a.Token.Template?e.value.raw:e.value):n=\"ILLEGAL\",r=r.replace(\"%0\",n),e&&\"number\"==typeof e.lineNumber){var o=e.start,s=e.lineNumber,u=e.start-this.lastMarker.lineStart+1;return this.errorHandler.createError(o,s,u,r)}var o=this.lastMarker.index,s=this.lastMarker.lineNumber,u=o-this.lastMarker.lineStart+1;return this.errorHandler.createError(o,s,u,r)},e.prototype.throwUnexpectedToken=function(e,t){throw this.unexpectedTokenError(e,t)},e.prototype.tolerateUnexpectedToken=function(e,t){this.errorHandler.tolerate(this.unexpectedTokenError(e,t))},e.prototype.collectComments=function(){if(this.config.comment){var e=this.scanner.scanComments();if(e.length>0&&this.delegate)for(var t=0;t<e.length;++t){var n=e[t],r=void 0;r={type:n.multiLine?\"BlockComment\":\"LineComment\",value:this.scanner.source.slice(n.slice[0],n.slice[1])},this.config.range&&(r.range=n.range),this.config.loc&&(r.loc=n.loc);var i={start:{line:n.loc.start.line,column:n.loc.start.column,offset:n.range[0]},end:{line:n.loc.end.line,column:n.loc.end.column,offset:n.range[1]}};this.delegate(r,i)}}else this.scanner.scanComments()},e.prototype.getTokenRaw=function(e){return this.scanner.source.slice(e.start,e.end)},e.prototype.convertToken=function(e){var t;return t={type:a.TokenName[e.type],value:this.getTokenRaw(e)},this.config.range&&(t.range=[e.start,e.end]),this.config.loc&&(t.loc={start:{line:this.startMarker.lineNumber,column:this.startMarker.index-this.startMarker.lineStart},end:{line:this.scanner.lineNumber,column:this.scanner.index-this.scanner.lineStart}}),e.regex&&(t.regex=e.regex),t},e.prototype.nextToken=function(){var e=this.lookahead;this.lastMarker.index=this.scanner.index,this.lastMarker.lineNumber=this.scanner.lineNumber,this.lastMarker.lineStart=this.scanner.lineStart,this.collectComments(),this.startMarker.index=this.scanner.index,this.startMarker.lineNumber=this.scanner.lineNumber,this.startMarker.lineStart=this.scanner.lineStart;var t;return t=this.scanner.lex(),this.hasLineTerminator=!(!e||!t)&&e.lineNumber!==t.lineNumber,t&&this.context.strict&&t.type===a.Token.Identifier&&this.scanner.isStrictModeReservedWord(t.value)&&(t.type=a.Token.Keyword),this.lookahead=t,this.config.tokens&&t.type!==a.Token.EOF&&this.tokens.push(this.convertToken(t)),e},e.prototype.nextRegexToken=function(){this.collectComments();var e=this.scanner.scanRegExp();return this.config.tokens&&(this.tokens.pop(),this.tokens.push(this.convertToken(e))),this.lookahead=e,this.nextToken(),e},e.prototype.createNode=function(){return{index:this.startMarker.index,line:this.startMarker.lineNumber,column:this.startMarker.index-this.startMarker.lineStart}},e.prototype.startNode=function(e){return{index:e.start,line:e.lineNumber,column:e.start-e.lineStart}},e.prototype.finalize=function(e,t){if(this.config.range&&(t.range=[e.index,this.lastMarker.index]),this.config.loc&&(t.loc={start:{line:e.line,column:e.column},end:{line:this.lastMarker.lineNumber,column:this.lastMarker.index-this.lastMarker.lineStart}},this.config.source&&(t.loc.source=this.config.source)),this.delegate){var n={start:{line:e.line,column:e.column,offset:e.index},end:{line:this.lastMarker.lineNumber,column:this.lastMarker.index-this.lastMarker.lineStart,offset:this.lastMarker.index}};this.delegate(t,n)}return t},e.prototype.expect=function(e){var t=this.nextToken();t.type===a.Token.Punctuator&&t.value===e||this.throwUnexpectedToken(t)},e.prototype.expectCommaSeparator=function(){if(this.config.tolerant){var e=this.lookahead;e.type===a.Token.Punctuator&&\",\"===e.value?this.nextToken():e.type===a.Token.Punctuator&&\";\"===e.value?(this.nextToken(),this.tolerateUnexpectedToken(e)):this.tolerateUnexpectedToken(e,i.Messages.UnexpectedToken)}else this.expect(\",\")},e.prototype.expectKeyword=function(e){var t=this.nextToken();t.type===a.Token.Keyword&&t.value===e||this.throwUnexpectedToken(t)},e.prototype.match=function(e){return this.lookahead.type===a.Token.Punctuator&&this.lookahead.value===e},e.prototype.matchKeyword=function(e){return this.lookahead.type===a.Token.Keyword&&this.lookahead.value===e},e.prototype.matchContextualKeyword=function(e){return this.lookahead.type===a.Token.Identifier&&this.lookahead.value===e},e.prototype.matchAssign=function(){if(this.lookahead.type!==a.Token.Punctuator)return!1;var e=this.lookahead.value;return\"=\"===e||\"*=\"===e||\"**=\"===e||\"/=\"===e||\"%=\"===e||\"+=\"===e||\"-=\"===e||\"<<=\"===e||\">>=\"===e||\">>>=\"===e||\"&=\"===e||\"^=\"===e||\"|=\"===e},e.prototype.isolateCoverGrammar=function(e){var t=this.context.isBindingElement,n=this.context.isAssignmentTarget,r=this.context.firstCoverInitializedNameError;this.context.isBindingElement=!0,this.context.isAssignmentTarget=!0,this.context.firstCoverInitializedNameError=null;var i=e.call(this);return null!==this.context.firstCoverInitializedNameError&&this.throwUnexpectedToken(this.context.firstCoverInitializedNameError),this.context.isBindingElement=t,this.context.isAssignmentTarget=n,this.context.firstCoverInitializedNameError=r,i},e.prototype.inheritCoverGrammar=function(e){var t=this.context.isBindingElement,n=this.context.isAssignmentTarget,r=this.context.firstCoverInitializedNameError;this.context.isBindingElement=!0,this.context.isAssignmentTarget=!0,this.context.firstCoverInitializedNameError=null;var i=e.call(this);return this.context.isBindingElement=this.context.isBindingElement&&t,this.context.isAssignmentTarget=this.context.isAssignmentTarget&&n,this.context.firstCoverInitializedNameError=r||this.context.firstCoverInitializedNameError,i},e.prototype.consumeSemicolon=function(){this.match(\";\")?this.nextToken():this.hasLineTerminator||(this.lookahead.type===a.Token.EOF||this.match(\"}\")||this.throwUnexpectedToken(this.lookahead),this.lastMarker.index=this.startMarker.index,this.lastMarker.lineNumber=this.startMarker.lineNumber,this.lastMarker.lineStart=this.startMarker.lineStart)},e.prototype.parsePrimaryExpression=function(){var e,t,n,r,o=this.createNode();switch(this.lookahead.type){case a.Token.Identifier:\"module\"===this.sourceType&&\"await\"===this.lookahead.value&&this.tolerateUnexpectedToken(this.lookahead),e=this.finalize(o,new c.Identifier(this.nextToken().value));break;case a.Token.NumericLiteral:case a.Token.StringLiteral:this.context.strict&&this.lookahead.octal&&this.tolerateUnexpectedToken(this.lookahead,i.Messages.StrictOctalLiteral),this.context.isAssignmentTarget=!1,this.context.isBindingElement=!1,n=this.nextToken(),r=this.getTokenRaw(n),e=this.finalize(o,new c.Literal(n.value,r));break;case a.Token.BooleanLiteral:this.context.isAssignmentTarget=!1,this.context.isBindingElement=!1,n=this.nextToken(),n.value=\"true\"===n.value,r=this.getTokenRaw(n),e=this.finalize(o,new c.Literal(n.value,r));break;case a.Token.NullLiteral:this.context.isAssignmentTarget=!1,this.context.isBindingElement=!1,n=this.nextToken(),n.value=null,r=this.getTokenRaw(n),e=this.finalize(o,new c.Literal(n.value,r));break;case a.Token.Template:e=this.parseTemplateLiteral();break;case a.Token.Punctuator:switch(t=this.lookahead.value){case\"(\":this.context.isBindingElement=!1,e=this.inheritCoverGrammar(this.parseGroupExpression);break;case\"[\":e=this.inheritCoverGrammar(this.parseArrayInitializer);break;case\"{\":e=this.inheritCoverGrammar(this.parseObjectInitializer);break;case\"/\":case\"/=\":this.context.isAssignmentTarget=!1,this.context.isBindingElement=!1,this.scanner.index=this.startMarker.index,n=this.nextRegexToken(),r=this.getTokenRaw(n),e=this.finalize(o,new c.RegexLiteral(n.value,r,n.regex));break;default:this.throwUnexpectedToken(this.nextToken())}break;case a.Token.Keyword:!this.context.strict&&this.context.allowYield&&this.matchKeyword(\"yield\")?e=this.parseIdentifierName():!this.context.strict&&this.matchKeyword(\"let\")?e=this.finalize(o,new c.Identifier(this.nextToken().value)):(this.context.isAssignmentTarget=!1,this.context.isBindingElement=!1,this.matchKeyword(\"function\")?e=this.parseFunctionExpression():this.matchKeyword(\"this\")?(this.nextToken(),e=this.finalize(o,new c.ThisExpression)):this.matchKeyword(\"class\")?e=this.parseClassExpression():this.throwUnexpectedToken(this.nextToken()));break;default:this.throwUnexpectedToken(this.nextToken())}return e},e.prototype.parseSpreadElement=function(){var e=this.createNode();this.expect(\"...\");var t=this.inheritCoverGrammar(this.parseAssignmentExpression);return this.finalize(e,new c.SpreadElement(t))},e.prototype.parseArrayInitializer=function(){var e=this.createNode(),t=[];for(this.expect(\"[\");!this.match(\"]\");)if(this.match(\",\"))this.nextToken(),t.push(null);else if(this.match(\"...\")){var n=this.parseSpreadElement();this.match(\"]\")||(this.context.isAssignmentTarget=!1,this.context.isBindingElement=!1,this.expect(\",\")),t.push(n)}else t.push(this.inheritCoverGrammar(this.parseAssignmentExpression)),this.match(\"]\")||this.expect(\",\");return this.expect(\"]\"),this.finalize(e,new c.ArrayExpression(t))},e.prototype.parsePropertyMethod=function(e){this.context.isAssignmentTarget=!1,this.context.isBindingElement=!1;var t=this.context.strict,n=this.isolateCoverGrammar(this.parseFunctionSourceElements);return this.context.strict&&e.firstRestricted&&this.tolerateUnexpectedToken(e.firstRestricted,e.message),this.context.strict&&e.stricted&&this.tolerateUnexpectedToken(e.stricted,e.message),this.context.strict=t,n},e.prototype.parsePropertyMethodFunction=function(){var e=!1,t=this.createNode(),n=this.context.allowYield;this.context.allowYield=!1;var r=this.parseFormalParameters(),i=this.parsePropertyMethod(r);return this.context.allowYield=n,this.finalize(t,new c.FunctionExpression(null,r.params,i,e))},e.prototype.parseObjectPropertyKey=function(){var e=this.createNode(),t=this.nextToken(),n=null;switch(t.type){case a.Token.StringLiteral:case a.Token.NumericLiteral:this.context.strict&&t.octal&&this.tolerateUnexpectedToken(t,i.Messages.StrictOctalLiteral);var r=this.getTokenRaw(t);n=this.finalize(e,new c.Literal(t.value,r));break;case a.Token.Identifier:case a.Token.BooleanLiteral:case a.Token.NullLiteral:case a.Token.Keyword:n=this.finalize(e,new c.Identifier(t.value));break;case a.Token.Punctuator:\"[\"===t.value?(n=this.isolateCoverGrammar(this.parseAssignmentExpression),this.expect(\"]\")):this.throwUnexpectedToken(t);break;default:this.throwUnexpectedToken(t)}return n},e.prototype.isPropertyKey=function(e,t){return e.type===u.Syntax.Identifier&&e.name===t||e.type===u.Syntax.Literal&&e.value===t},e.prototype.parseObjectProperty=function(e){var t,n,r,o=this.createNode(),s=this.lookahead,u=!1,l=!1,p=!1;s.type===a.Token.Identifier?(this.nextToken(),n=this.finalize(o,new c.Identifier(s.value))):this.match(\"*\")?this.nextToken():(u=this.match(\"[\"),n=this.parseObjectPropertyKey());var f=this.qualifiedPropertyName(this.lookahead);if(s.type===a.Token.Identifier&&\"get\"===s.value&&f)t=\"get\",u=this.match(\"[\"),n=this.parseObjectPropertyKey(),this.context.allowYield=!1,r=this.parseGetterMethod();else if(s.type===a.Token.Identifier&&\"set\"===s.value&&f)t=\"set\",u=this.match(\"[\"),n=this.parseObjectPropertyKey(),r=this.parseSetterMethod();else if(s.type===a.Token.Punctuator&&\"*\"===s.value&&f)t=\"init\",u=this.match(\"[\"),n=this.parseObjectPropertyKey(),r=this.parseGeneratorMethod(),l=!0;else if(n||this.throwUnexpectedToken(this.lookahead),t=\"init\",this.match(\":\"))!u&&this.isPropertyKey(n,\"__proto__\")&&(e.value&&this.tolerateError(i.Messages.DuplicateProtoProperty),e.value=!0),this.nextToken(),r=this.inheritCoverGrammar(this.parseAssignmentExpression);else if(this.match(\"(\"))r=this.parsePropertyMethodFunction(),l=!0;else if(s.type===a.Token.Identifier){var h=this.finalize(o,new c.Identifier(s.value));if(this.match(\"=\")){this.context.firstCoverInitializedNameError=this.lookahead,this.nextToken(),p=!0;var d=this.isolateCoverGrammar(this.parseAssignmentExpression);r=this.finalize(o,new c.AssignmentPattern(h,d))}else p=!0,r=h}else this.throwUnexpectedToken(this.nextToken());return this.finalize(o,new c.Property(t,n,u,r,l,p))},e.prototype.parseObjectInitializer=function(){var e=this.createNode();this.expect(\"{\");for(var t=[],n={value:!1};!this.match(\"}\");)t.push(this.parseObjectProperty(n)),this.match(\"}\")||this.expectCommaSeparator();return this.expect(\"}\"),this.finalize(e,new c.ObjectExpression(t))},e.prototype.parseTemplateHead=function(){r.assert(this.lookahead.head,\"Template literal must start with a template head\");var e=this.createNode(),t=this.nextToken(),n={raw:t.value.raw,cooked:t.value.cooked};return this.finalize(e,new c.TemplateElement(n,t.tail))},e.prototype.parseTemplateElement=function(){this.lookahead.type!==a.Token.Template&&this.throwUnexpectedToken();var e=this.createNode(),t=this.nextToken(),n={raw:t.value.raw,cooked:t.value.cooked};return this.finalize(e,new c.TemplateElement(n,t.tail))},e.prototype.parseTemplateLiteral=function(){var e=this.createNode(),t=[],n=[],r=this.parseTemplateHead();for(n.push(r);!r.tail;)t.push(this.parseExpression()),r=this.parseTemplateElement(),n.push(r);return this.finalize(e,new c.TemplateLiteral(n,t))},e.prototype.reinterpretExpressionAsPattern=function(e){switch(e.type){case u.Syntax.Identifier:case u.Syntax.MemberExpression:case u.Syntax.RestElement:case u.Syntax.AssignmentPattern:break;case u.Syntax.SpreadElement:e.type=u.Syntax.RestElement,this.reinterpretExpressionAsPattern(e.argument);break;case u.Syntax.ArrayExpression:e.type=u.Syntax.ArrayPattern;for(var t=0;t<e.elements.length;t++)null!==e.elements[t]&&this.reinterpretExpressionAsPattern(e.elements[t]);break;case u.Syntax.ObjectExpression:e.type=u.Syntax.ObjectPattern;for(var t=0;t<e.properties.length;t++)this.reinterpretExpressionAsPattern(e.properties[t].value);break;case u.Syntax.AssignmentExpression:e.type=u.Syntax.AssignmentPattern,delete e.operator,this.reinterpretExpressionAsPattern(e.left)}},e.prototype.parseGroupExpression=function(){var e;if(this.expect(\"(\"),this.match(\")\"))this.nextToken(),this.match(\"=>\")||this.expect(\"=>\"),e={type:l,params:[]};else{var t=this.lookahead,n=[];if(this.match(\"...\"))e=this.parseRestElement(n),this.expect(\")\"),this.match(\"=>\")||this.expect(\"=>\"),e={type:l,params:[e]};else{var r=!1;if(this.context.isBindingElement=!0,e=this.inheritCoverGrammar(this.parseAssignmentExpression),this.match(\",\")){var i=[];for(this.context.isAssignmentTarget=!1,i.push(e);this.startMarker.index<this.scanner.length&&this.match(\",\");){if(this.nextToken(),this.match(\"...\")){this.context.isBindingElement||this.throwUnexpectedToken(this.lookahead),i.push(this.parseRestElement(n)),this.expect(\")\"),this.match(\"=>\")||this.expect(\"=>\"),this.context.isBindingElement=!1;for(var o=0;o<i.length;o++)this.reinterpretExpressionAsPattern(i[o]);r=!0,e={type:l,params:i}}else i.push(this.inheritCoverGrammar(this.parseAssignmentExpression));if(r)break}r||(e=this.finalize(this.startNode(t),new c.SequenceExpression(i)))}if(!r){if(this.expect(\")\"),this.match(\"=>\")&&(e.type===u.Syntax.Identifier&&\"yield\"===e.name&&(r=!0,e={type:l,params:[e]}),!r)){if(this.context.isBindingElement||this.throwUnexpectedToken(this.lookahead),e.type===u.Syntax.SequenceExpression)for(var o=0;o<e.expressions.length;o++)this.reinterpretExpressionAsPattern(e.expressions[o]);else this.reinterpretExpressionAsPattern(e);var a=e.type===u.Syntax.SequenceExpression?e.expressions:[e];e={type:l,params:a}}this.context.isBindingElement=!1}}}return e},e.prototype.parseArguments=function(){this.expect(\"(\");var e=[];if(!this.match(\")\"))for(;;){var t=this.match(\"...\")?this.parseSpreadElement():this.isolateCoverGrammar(this.parseAssignmentExpression);if(e.push(t),this.match(\")\"))break;this.expectCommaSeparator()}return this.expect(\")\"),e},e.prototype.isIdentifierName=function(e){return e.type===a.Token.Identifier||e.type===a.Token.Keyword||e.type===a.Token.BooleanLiteral||e.type===a.Token.NullLiteral},e.prototype.parseIdentifierName=function(){var e=this.createNode(),t=this.nextToken();return this.isIdentifierName(t)||this.throwUnexpectedToken(t),this.finalize(e,new c.Identifier(t.value))},e.prototype.parseNewExpression=function(){var e=this.createNode(),t=this.parseIdentifierName();r.assert(\"new\"===t.name,\"New expression must start with `new`\");var n;if(this.match(\".\"))if(this.nextToken(),this.lookahead.type===a.Token.Identifier&&this.context.inFunctionBody&&\"target\"===this.lookahead.value){var i=this.parseIdentifierName();n=new c.MetaProperty(t,i)}else this.throwUnexpectedToken(this.lookahead);else{var o=this.isolateCoverGrammar(this.parseLeftHandSideExpression),s=this.match(\"(\")?this.parseArguments():[];n=new c.NewExpression(o,s),this.context.isAssignmentTarget=!1,this.context.isBindingElement=!1}return this.finalize(e,n)},e.prototype.parseLeftHandSideExpressionAllowCall=function(){var e=this.lookahead,t=this.context.allowIn;this.context.allowIn=!0;var n;for(this.matchKeyword(\"super\")&&this.context.inFunctionBody?(n=this.createNode(),this.nextToken(),n=this.finalize(n,new c.Super),this.match(\"(\")||this.match(\".\")||this.match(\"[\")||this.throwUnexpectedToken(this.lookahead)):n=this.inheritCoverGrammar(this.matchKeyword(\"new\")?this.parseNewExpression:this.parsePrimaryExpression);;)if(this.match(\".\")){this.context.isBindingElement=!1,this.context.isAssignmentTarget=!0,this.expect(\".\");var r=this.parseIdentifierName();n=this.finalize(this.startNode(e),new c.StaticMemberExpression(n,r))}else if(this.match(\"(\")){this.context.isBindingElement=!1,this.context.isAssignmentTarget=!1;var i=this.parseArguments();n=this.finalize(this.startNode(e),new c.CallExpression(n,i))}else if(this.match(\"[\")){this.context.isBindingElement=!1,this.context.isAssignmentTarget=!0,this.expect(\"[\");var r=this.isolateCoverGrammar(this.parseExpression);this.expect(\"]\"),n=this.finalize(this.startNode(e),new c.ComputedMemberExpression(n,r))}else{if(this.lookahead.type!==a.Token.Template||!this.lookahead.head)break;var o=this.parseTemplateLiteral();n=this.finalize(this.startNode(e),new c.TaggedTemplateExpression(n,o))}return this.context.allowIn=t,n},e.prototype.parseSuper=function(){var e=this.createNode();return this.expectKeyword(\"super\"),this.match(\"[\")||this.match(\".\")||this.throwUnexpectedToken(this.lookahead),this.finalize(e,new c.Super)},e.prototype.parseLeftHandSideExpression=function(){r.assert(this.context.allowIn,\"callee of new expression always allow in keyword.\");for(var e=this.startNode(this.lookahead),t=this.matchKeyword(\"super\")&&this.context.inFunctionBody?this.parseSuper():this.inheritCoverGrammar(this.matchKeyword(\"new\")?this.parseNewExpression:this.parsePrimaryExpression);;)if(this.match(\"[\")){this.context.isBindingElement=!1,this.context.isAssignmentTarget=!0,this.expect(\"[\");var n=this.isolateCoverGrammar(this.parseExpression);this.expect(\"]\"),t=this.finalize(e,new c.ComputedMemberExpression(t,n))}else if(this.match(\".\")){this.context.isBindingElement=!1,this.context.isAssignmentTarget=!0,this.expect(\".\");var n=this.parseIdentifierName();t=this.finalize(e,new c.StaticMemberExpression(t,n))}else{if(this.lookahead.type!==a.Token.Template||!this.lookahead.head)break;var i=this.parseTemplateLiteral();t=this.finalize(e,new c.TaggedTemplateExpression(t,i))}return t},e.prototype.parseUpdateExpression=function(){var e,t=this.lookahead;if(this.match(\"++\")||this.match(\"--\")){var n=this.startNode(t),r=this.nextToken();e=this.inheritCoverGrammar(this.parseUnaryExpression),this.context.strict&&e.type===u.Syntax.Identifier&&this.scanner.isRestrictedWord(e.name)&&this.tolerateError(i.Messages.StrictLHSPrefix),this.context.isAssignmentTarget||this.tolerateError(i.Messages.InvalidLHSInAssignment);var o=!0;e=this.finalize(n,new c.UpdateExpression(r.value,e,o)),this.context.isAssignmentTarget=!1,this.context.isBindingElement=!1}else if(e=this.inheritCoverGrammar(this.parseLeftHandSideExpressionAllowCall),!this.hasLineTerminator&&this.lookahead.type===a.Token.Punctuator&&(this.match(\"++\")||this.match(\"--\"))){this.context.strict&&e.type===u.Syntax.Identifier&&this.scanner.isRestrictedWord(e.name)&&this.tolerateError(i.Messages.StrictLHSPostfix),this.context.isAssignmentTarget||this.tolerateError(i.Messages.InvalidLHSInAssignment),this.context.isAssignmentTarget=!1,this.context.isBindingElement=!1;var s=this.nextToken().value,o=!1;e=this.finalize(this.startNode(t),new c.UpdateExpression(s,e,o))}return e},e.prototype.parseUnaryExpression=function(){var e;if(this.match(\"+\")||this.match(\"-\")||this.match(\"~\")||this.match(\"!\")||this.matchKeyword(\"delete\")||this.matchKeyword(\"void\")||this.matchKeyword(\"typeof\")){var t=this.startNode(this.lookahead),n=this.nextToken();e=this.inheritCoverGrammar(this.parseUnaryExpression),e=this.finalize(t,new c.UnaryExpression(n.value,e)),this.context.strict&&\"delete\"===e.operator&&e.argument.type===u.Syntax.Identifier&&this.tolerateError(i.Messages.StrictDelete),this.context.isAssignmentTarget=!1,this.context.isBindingElement=!1}else e=this.parseUpdateExpression();return e},e.prototype.parseExponentiationExpression=function(){var e=this.lookahead,t=this.inheritCoverGrammar(this.parseUnaryExpression);if(t.type!==u.Syntax.UnaryExpression&&this.match(\"**\")){this.nextToken(),this.context.isAssignmentTarget=!1,this.context.isBindingElement=!1;var n=t,r=this.isolateCoverGrammar(this.parseExponentiationExpression);t=this.finalize(this.startNode(e),new c.BinaryExpression(\"**\",n,r))}return t},e.prototype.binaryPrecedence=function(e){var t,n=e.value;return t=e.type===a.Token.Punctuator?this.operatorPrecedence[n]||0:e.type===a.Token.Keyword&&(\"instanceof\"===n||this.context.allowIn&&\"in\"===n)?7:0},e.prototype.parseBinaryExpression=function(){var e=this.lookahead,t=this.inheritCoverGrammar(this.parseExponentiationExpression),n=this.lookahead,r=this.binaryPrecedence(n);if(r>0){this.nextToken(),n.prec=r,this.context.isAssignmentTarget=!1,this.context.isBindingElement=!1;for(var i=[e,this.lookahead],o=t,a=this.isolateCoverGrammar(this.parseExponentiationExpression),s=[o,n,a];;){if(r=this.binaryPrecedence(this.lookahead),r<=0)break;for(;s.length>2&&r<=s[s.length-2].prec;){a=s.pop();var u=s.pop().value;o=s.pop(),i.pop();var l=this.startNode(i[i.length-1]);s.push(this.finalize(l,new c.BinaryExpression(u,o,a)))}n=this.nextToken(),n.prec=r,s.push(n),i.push(this.lookahead),s.push(this.isolateCoverGrammar(this.parseExponentiationExpression))}var p=s.length-1;for(t=s[p],i.pop();p>1;){var l=this.startNode(i.pop());t=this.finalize(l,new c.BinaryExpression(s[p-1].value,s[p-2],t)),p-=2}}return t},e.prototype.parseConditionalExpression=function(){var e=this.lookahead,t=this.inheritCoverGrammar(this.parseBinaryExpression);if(this.match(\"?\")){this.nextToken();var n=this.context.allowIn;this.context.allowIn=!0;var r=this.isolateCoverGrammar(this.parseAssignmentExpression);this.context.allowIn=n,this.expect(\":\");var i=this.isolateCoverGrammar(this.parseAssignmentExpression);t=this.finalize(this.startNode(e),new c.ConditionalExpression(t,r,i)),this.context.isAssignmentTarget=!1,this.context.isBindingElement=!1}return t},e.prototype.checkPatternParam=function(e,t){switch(t.type){case u.Syntax.Identifier:this.validateParam(e,t,t.name);break;case u.Syntax.RestElement:this.checkPatternParam(e,t.argument);break;case u.Syntax.AssignmentPattern:this.checkPatternParam(e,t.left);break;case u.Syntax.ArrayPattern:for(var n=0;n<t.elements.length;n++)null!==t.elements[n]&&this.checkPatternParam(e,t.elements[n]);break;case u.Syntax.YieldExpression:break;default:r.assert(t.type===u.Syntax.ObjectPattern,\"Invalid type\");for(var n=0;n<t.properties.length;n++)this.checkPatternParam(e,t.properties[n].value)}},e.prototype.reinterpretAsCoverFormalsList=function(e){var t,n=[e];switch(e.type){case u.Syntax.Identifier:break;case l:n=e.params;break;default:return null}t={paramSet:{}};for(var r=0;r<n.length;++r){var o=n[r];o.type===u.Syntax.AssignmentPattern&&o.right.type===u.Syntax.YieldExpression&&(o.right.argument&&this.throwUnexpectedToken(this.lookahead),o.right.type=u.Syntax.Identifier,o.right.name=\"yield\",delete o.right.argument,delete o.right.delegate),this.checkPatternParam(t,o),n[r]=o}if(this.context.strict||!this.context.allowYield)for(var r=0;r<n.length;++r){var o=n[r];o.type===u.Syntax.YieldExpression&&this.throwUnexpectedToken(this.lookahead)}if(t.message===i.Messages.StrictParamDupe){var a=this.context.strict?t.stricted:t.firstRestricted;this.throwUnexpectedToken(a,t.message)}return{params:n,stricted:t.stricted,firstRestricted:t.firstRestricted,message:t.message}},e.prototype.parseAssignmentExpression=function(){var e;if(!this.context.allowYield&&this.matchKeyword(\"yield\"))e=this.parseYieldExpression();else{var t=this.lookahead,n=t;if(e=this.parseConditionalExpression(),e.type===l||this.match(\"=>\")){this.context.isAssignmentTarget=!1,this.context.isBindingElement=!1;var r=this.reinterpretAsCoverFormalsList(e);if(r){this.hasLineTerminator&&this.tolerateUnexpectedToken(this.lookahead),this.context.firstCoverInitializedNameError=null;var o=this.context.strict,a=this.context.allowYield;this.context.allowYield=!0;var s=this.startNode(t);this.expect(\"=>\");var p=this.match(\"{\")?this.parseFunctionSourceElements():this.isolateCoverGrammar(this.parseAssignmentExpression),f=p.type!==u.Syntax.BlockStatement;this.context.strict&&r.firstRestricted&&this.throwUnexpectedToken(r.firstRestricted,r.message),this.context.strict&&r.stricted&&this.tolerateUnexpectedToken(r.stricted,r.message),e=this.finalize(s,new c.ArrowFunctionExpression(r.params,p,f)),this.context.strict=o,this.context.allowYield=a}}else if(this.matchAssign()){if(this.context.isAssignmentTarget||this.tolerateError(i.Messages.InvalidLHSInAssignment),this.context.strict&&e.type===u.Syntax.Identifier){var h=e;this.scanner.isRestrictedWord(h.name)&&this.tolerateUnexpectedToken(n,i.Messages.StrictLHSAssignment),this.scanner.isStrictModeReservedWord(h.name)&&this.tolerateUnexpectedToken(n,i.Messages.StrictReservedWord)}this.match(\"=\")?this.reinterpretExpressionAsPattern(e):(this.context.isAssignmentTarget=!1,this.context.isBindingElement=!1),n=this.nextToken();var d=this.isolateCoverGrammar(this.parseAssignmentExpression);e=this.finalize(this.startNode(t),new c.AssignmentExpression(n.value,e,d)),this.context.firstCoverInitializedNameError=null}}return e},e.prototype.parseExpression=function(){var e=this.lookahead,t=this.isolateCoverGrammar(this.parseAssignmentExpression);if(this.match(\",\")){var n=[];for(n.push(t);this.startMarker.index<this.scanner.length&&this.match(\",\");)this.nextToken(),n.push(this.isolateCoverGrammar(this.parseAssignmentExpression));t=this.finalize(this.startNode(e),new c.SequenceExpression(n))}return t},e.prototype.parseStatementListItem=function(){var e=null;if(this.context.isAssignmentTarget=!0,this.context.isBindingElement=!0,this.lookahead.type===a.Token.Keyword)switch(this.lookahead.value){case\"export\":\"module\"!==this.sourceType&&this.tolerateUnexpectedToken(this.lookahead,i.Messages.IllegalExportDeclaration),e=this.parseExportDeclaration();break;case\"import\":\"module\"!==this.sourceType&&this.tolerateUnexpectedToken(this.lookahead,i.Messages.IllegalImportDeclaration),e=this.parseImportDeclaration();break;case\"const\":e=this.parseLexicalDeclaration({inFor:!1});break;case\"function\":e=this.parseFunctionDeclaration();break;case\"class\":e=this.parseClassDeclaration();break;case\"let\":e=this.isLexicalDeclaration()?this.parseLexicalDeclaration({inFor:!1}):this.parseStatement();break;default:e=this.parseStatement()}else e=this.parseStatement();return e},e.prototype.parseBlock=function(){var e=this.createNode();this.expect(\"{\");for(var t=[];;){if(this.match(\"}\"))break;t.push(this.parseStatementListItem())}return this.expect(\"}\"),this.finalize(e,new c.BlockStatement(t))},e.prototype.parseLexicalBinding=function(e,t){var n=this.createNode(),r=[],o=this.parsePattern(r,e);this.context.strict&&o.type===u.Syntax.Identifier&&this.scanner.isRestrictedWord(o.name)&&this.tolerateError(i.Messages.StrictVarName);var a=null;return\"const\"===e?this.matchKeyword(\"in\")||this.matchContextualKeyword(\"of\")||(this.expect(\"=\"),a=this.isolateCoverGrammar(this.parseAssignmentExpression)):(!t.inFor&&o.type!==u.Syntax.Identifier||this.match(\"=\"))&&(this.expect(\"=\"),a=this.isolateCoverGrammar(this.parseAssignmentExpression)),this.finalize(n,new c.VariableDeclarator(o,a))},e.prototype.parseBindingList=function(e,t){for(var n=[this.parseLexicalBinding(e,t)];this.match(\",\");)this.nextToken(),n.push(this.parseLexicalBinding(e,t));return n},e.prototype.isLexicalDeclaration=function(){var e=this.scanner.index,t=this.scanner.lineNumber,n=this.scanner.lineStart;this.collectComments();var r=this.scanner.lex();return this.scanner.index=e,this.scanner.lineNumber=t,this.scanner.lineStart=n,r.type===a.Token.Identifier||r.type===a.Token.Punctuator&&\"[\"===r.value||r.type===a.Token.Punctuator&&\"{\"===r.value||r.type===a.Token.Keyword&&\"let\"===r.value||r.type===a.Token.Keyword&&\"yield\"===r.value},e.prototype.parseLexicalDeclaration=function(e){var t=this.createNode(),n=this.nextToken().value;r.assert(\"let\"===n||\"const\"===n,\"Lexical declaration must be either let or const\");var i=this.parseBindingList(n,e);return this.consumeSemicolon(),this.finalize(t,new c.VariableDeclaration(i,n))},e.prototype.parseBindingRestElement=function(e,t){var n=this.createNode();this.expect(\"...\");var r=this.parsePattern(e,t);return this.finalize(n,new c.RestElement(r))},e.prototype.parseArrayPattern=function(e,t){var n=this.createNode();this.expect(\"[\");for(var r=[];!this.match(\"]\");)if(this.match(\",\"))this.nextToken(),r.push(null);else{if(this.match(\"...\")){r.push(this.parseBindingRestElement(e,t));break}r.push(this.parsePatternWithDefault(e,t)),this.match(\"]\")||this.expect(\",\")}return this.expect(\"]\"),this.finalize(n,new c.ArrayPattern(r))},e.prototype.parsePropertyPattern=function(e,t){var n,r,i=this.createNode(),o=!1,s=!1,u=!1;if(this.lookahead.type===a.Token.Identifier){var l=this.lookahead;n=this.parseVariableIdentifier();var p=this.finalize(i,new c.Identifier(l.value));if(this.match(\"=\")){e.push(l),s=!0,this.nextToken();var f=this.parseAssignmentExpression();r=this.finalize(this.startNode(l),new c.AssignmentPattern(p,f))}else this.match(\":\")?(this.expect(\":\"),r=this.parsePatternWithDefault(e,t)):(e.push(l),s=!0,r=p)}else o=this.match(\"[\"),n=this.parseObjectPropertyKey(),this.expect(\":\"),r=this.parsePatternWithDefault(e,t);return this.finalize(i,new c.Property(\"init\",n,o,r,u,s))},e.prototype.parseObjectPattern=function(e,t){var n=this.createNode(),r=[];for(this.expect(\"{\");!this.match(\"}\");)r.push(this.parsePropertyPattern(e,t)),\nthis.match(\"}\")||this.expect(\",\");return this.expect(\"}\"),this.finalize(n,new c.ObjectPattern(r))},e.prototype.parsePattern=function(e,t){var n;return this.match(\"[\")?n=this.parseArrayPattern(e,t):this.match(\"{\")?n=this.parseObjectPattern(e,t):(!this.matchKeyword(\"let\")||\"const\"!==t&&\"let\"!==t||this.tolerateUnexpectedToken(this.lookahead,i.Messages.UnexpectedToken),e.push(this.lookahead),n=this.parseVariableIdentifier(t)),n},e.prototype.parsePatternWithDefault=function(e,t){var n=this.lookahead,r=this.parsePattern(e,t);if(this.match(\"=\")){this.nextToken();var i=this.context.allowYield;this.context.allowYield=!0;var o=this.isolateCoverGrammar(this.parseAssignmentExpression);this.context.allowYield=i,r=this.finalize(this.startNode(n),new c.AssignmentPattern(r,o))}return r},e.prototype.parseVariableIdentifier=function(e){var t=this.createNode(),n=this.nextToken();return n.type===a.Token.Keyword&&\"yield\"===n.value?(this.context.strict&&this.tolerateUnexpectedToken(n,i.Messages.StrictReservedWord),this.context.allowYield||this.throwUnexpectedToken(n)):n.type!==a.Token.Identifier?this.context.strict&&n.type===a.Token.Keyword&&this.scanner.isStrictModeReservedWord(n.value)?this.tolerateUnexpectedToken(n,i.Messages.StrictReservedWord):(this.context.strict||\"let\"!==n.value||\"var\"!==e)&&this.throwUnexpectedToken(n):\"module\"===this.sourceType&&n.type===a.Token.Identifier&&\"await\"===n.value&&this.tolerateUnexpectedToken(n),this.finalize(t,new c.Identifier(n.value))},e.prototype.parseVariableDeclaration=function(e){var t=this.createNode(),n=[],r=this.parsePattern(n,\"var\");this.context.strict&&r.type===u.Syntax.Identifier&&this.scanner.isRestrictedWord(r.name)&&this.tolerateError(i.Messages.StrictVarName);var o=null;return this.match(\"=\")?(this.nextToken(),o=this.isolateCoverGrammar(this.parseAssignmentExpression)):r.type===u.Syntax.Identifier||e.inFor||this.expect(\"=\"),this.finalize(t,new c.VariableDeclarator(r,o))},e.prototype.parseVariableDeclarationList=function(e){var t={inFor:e.inFor},n=[];for(n.push(this.parseVariableDeclaration(t));this.match(\",\");)this.nextToken(),n.push(this.parseVariableDeclaration(t));return n},e.prototype.parseVariableStatement=function(){var e=this.createNode();this.expectKeyword(\"var\");var t=this.parseVariableDeclarationList({inFor:!1});return this.consumeSemicolon(),this.finalize(e,new c.VariableDeclaration(t,\"var\"))},e.prototype.parseEmptyStatement=function(){var e=this.createNode();return this.expect(\";\"),this.finalize(e,new c.EmptyStatement)},e.prototype.parseExpressionStatement=function(){var e=this.createNode(),t=this.parseExpression();return this.consumeSemicolon(),this.finalize(e,new c.ExpressionStatement(t))},e.prototype.parseIfStatement=function(){var e,t=this.createNode(),n=null;this.expectKeyword(\"if\"),this.expect(\"(\");var r=this.parseExpression();return!this.match(\")\")&&this.config.tolerant?(this.tolerateUnexpectedToken(this.nextToken()),e=this.finalize(this.createNode(),new c.EmptyStatement)):(this.expect(\")\"),e=this.parseStatement(),this.matchKeyword(\"else\")&&(this.nextToken(),n=this.parseStatement())),this.finalize(t,new c.IfStatement(r,e,n))},e.prototype.parseDoWhileStatement=function(){var e=this.createNode();this.expectKeyword(\"do\");var t=this.context.inIteration;this.context.inIteration=!0;var n=this.parseStatement();this.context.inIteration=t,this.expectKeyword(\"while\"),this.expect(\"(\");var r=this.parseExpression();return this.expect(\")\"),this.match(\";\")&&this.nextToken(),this.finalize(e,new c.DoWhileStatement(n,r))},e.prototype.parseWhileStatement=function(){var e,t=this.createNode();this.expectKeyword(\"while\"),this.expect(\"(\");var n=this.parseExpression();if(!this.match(\")\")&&this.config.tolerant)this.tolerateUnexpectedToken(this.nextToken()),e=this.finalize(this.createNode(),new c.EmptyStatement);else{this.expect(\")\");var r=this.context.inIteration;this.context.inIteration=!0,e=this.parseStatement(),this.context.inIteration=r}return this.finalize(t,new c.WhileStatement(n,e))},e.prototype.parseForStatement=function(){var e,t,n=null,r=null,o=null,a=!0,s=this.createNode();if(this.expectKeyword(\"for\"),this.expect(\"(\"),this.match(\";\"))this.nextToken();else if(this.matchKeyword(\"var\")){n=this.createNode(),this.nextToken();var l=this.context.allowIn;this.context.allowIn=!1;var p=this.parseVariableDeclarationList({inFor:!0});if(this.context.allowIn=l,1===p.length&&this.matchKeyword(\"in\")){var f=p[0];f.init&&(f.id.type===u.Syntax.ArrayPattern||f.id.type===u.Syntax.ObjectPattern||this.context.strict)&&this.tolerateError(i.Messages.ForInOfLoopInitializer,\"for-in\"),n=this.finalize(n,new c.VariableDeclaration(p,\"var\")),this.nextToken(),e=n,t=this.parseExpression(),n=null}else 1===p.length&&null===p[0].init&&this.matchContextualKeyword(\"of\")?(n=this.finalize(n,new c.VariableDeclaration(p,\"var\")),this.nextToken(),e=n,t=this.parseAssignmentExpression(),n=null,a=!1):(n=this.finalize(n,new c.VariableDeclaration(p,\"var\")),this.expect(\";\"))}else if(this.matchKeyword(\"const\")||this.matchKeyword(\"let\")){n=this.createNode();var h=this.nextToken().value;if(this.context.strict||\"in\"!==this.lookahead.value){var l=this.context.allowIn;this.context.allowIn=!1;var p=this.parseBindingList(h,{inFor:!0});this.context.allowIn=l,1===p.length&&null===p[0].init&&this.matchKeyword(\"in\")?(n=this.finalize(n,new c.VariableDeclaration(p,h)),this.nextToken(),e=n,t=this.parseExpression(),n=null):1===p.length&&null===p[0].init&&this.matchContextualKeyword(\"of\")?(n=this.finalize(n,new c.VariableDeclaration(p,h)),this.nextToken(),e=n,t=this.parseAssignmentExpression(),n=null,a=!1):(this.consumeSemicolon(),n=this.finalize(n,new c.VariableDeclaration(p,h)))}else n=this.finalize(n,new c.Identifier(h)),this.nextToken(),e=n,t=this.parseExpression(),n=null}else{var d=this.lookahead,l=this.context.allowIn;if(this.context.allowIn=!1,n=this.inheritCoverGrammar(this.parseAssignmentExpression),this.context.allowIn=l,this.matchKeyword(\"in\"))this.context.isAssignmentTarget&&n.type!==u.Syntax.AssignmentExpression||this.tolerateError(i.Messages.InvalidLHSInForIn),this.nextToken(),this.reinterpretExpressionAsPattern(n),e=n,t=this.parseExpression(),n=null;else if(this.matchContextualKeyword(\"of\"))this.context.isAssignmentTarget&&n.type!==u.Syntax.AssignmentExpression||this.tolerateError(i.Messages.InvalidLHSInForLoop),this.nextToken(),this.reinterpretExpressionAsPattern(n),e=n,t=this.parseAssignmentExpression(),n=null,a=!1;else{if(this.match(\",\")){for(var m=[n];this.match(\",\");)this.nextToken(),m.push(this.isolateCoverGrammar(this.parseAssignmentExpression));n=this.finalize(this.startNode(d),new c.SequenceExpression(m))}this.expect(\";\")}}\"undefined\"==typeof e&&(this.match(\";\")||(r=this.parseExpression()),this.expect(\";\"),this.match(\")\")||(o=this.parseExpression()));var v;if(!this.match(\")\")&&this.config.tolerant)this.tolerateUnexpectedToken(this.nextToken()),v=this.finalize(this.createNode(),new c.EmptyStatement);else{this.expect(\")\");var y=this.context.inIteration;this.context.inIteration=!0,v=this.isolateCoverGrammar(this.parseStatement),this.context.inIteration=y}return\"undefined\"==typeof e?this.finalize(s,new c.ForStatement(n,r,o,v)):a?this.finalize(s,new c.ForInStatement(e,t,v)):this.finalize(s,new c.ForOfStatement(e,t,v))},e.prototype.parseContinueStatement=function(){var e=this.createNode();this.expectKeyword(\"continue\");var t=null;if(this.lookahead.type===a.Token.Identifier&&!this.hasLineTerminator){t=this.parseVariableIdentifier();var n=\"$\"+t.name;Object.prototype.hasOwnProperty.call(this.context.labelSet,n)||this.throwError(i.Messages.UnknownLabel,t.name)}return this.consumeSemicolon(),null!==t||this.context.inIteration||this.throwError(i.Messages.IllegalContinue),this.finalize(e,new c.ContinueStatement(t))},e.prototype.parseBreakStatement=function(){var e=this.createNode();this.expectKeyword(\"break\");var t=null;if(this.lookahead.type===a.Token.Identifier&&!this.hasLineTerminator){t=this.parseVariableIdentifier();var n=\"$\"+t.name;Object.prototype.hasOwnProperty.call(this.context.labelSet,n)||this.throwError(i.Messages.UnknownLabel,t.name)}return this.consumeSemicolon(),null!==t||this.context.inIteration||this.context.inSwitch||this.throwError(i.Messages.IllegalBreak),this.finalize(e,new c.BreakStatement(t))},e.prototype.parseReturnStatement=function(){this.context.inFunctionBody||this.tolerateError(i.Messages.IllegalReturn);var e=this.createNode();this.expectKeyword(\"return\");var t=!this.match(\";\")&&!this.match(\"}\")&&!this.hasLineTerminator&&this.lookahead.type!==a.Token.EOF,n=t?this.parseExpression():null;return this.consumeSemicolon(),this.finalize(e,new c.ReturnStatement(n))},e.prototype.parseWithStatement=function(){this.context.strict&&this.tolerateError(i.Messages.StrictModeWith);var e=this.createNode();this.expectKeyword(\"with\"),this.expect(\"(\");var t=this.parseExpression();this.expect(\")\");var n=this.parseStatement();return this.finalize(e,new c.WithStatement(t,n))},e.prototype.parseSwitchCase=function(){var e,t=this.createNode();this.matchKeyword(\"default\")?(this.nextToken(),e=null):(this.expectKeyword(\"case\"),e=this.parseExpression()),this.expect(\":\");for(var n=[];;){if(this.match(\"}\")||this.matchKeyword(\"default\")||this.matchKeyword(\"case\"))break;n.push(this.parseStatementListItem())}return this.finalize(t,new c.SwitchCase(e,n))},e.prototype.parseSwitchStatement=function(){var e=this.createNode();this.expectKeyword(\"switch\"),this.expect(\"(\");var t=this.parseExpression();this.expect(\")\");var n=this.context.inSwitch;this.context.inSwitch=!0;var r=[],o=!1;for(this.expect(\"{\");;){if(this.match(\"}\"))break;var a=this.parseSwitchCase();null===a.test&&(o&&this.throwError(i.Messages.MultipleDefaultsInSwitch),o=!0),r.push(a)}return this.expect(\"}\"),this.context.inSwitch=n,this.finalize(e,new c.SwitchStatement(t,r))},e.prototype.parseLabelledStatement=function(){var e,t=this.createNode(),n=this.parseExpression();if(n.type===u.Syntax.Identifier&&this.match(\":\")){this.nextToken();var r=n,o=\"$\"+r.name;Object.prototype.hasOwnProperty.call(this.context.labelSet,o)&&this.throwError(i.Messages.Redeclaration,\"Label\",r.name),this.context.labelSet[o]=!0;var a=this.parseStatement();delete this.context.labelSet[o],e=new c.LabeledStatement(r,a)}else this.consumeSemicolon(),e=new c.ExpressionStatement(n);return this.finalize(t,e)},e.prototype.parseThrowStatement=function(){var e=this.createNode();this.expectKeyword(\"throw\"),this.hasLineTerminator&&this.throwError(i.Messages.NewlineAfterThrow);var t=this.parseExpression();return this.consumeSemicolon(),this.finalize(e,new c.ThrowStatement(t))},e.prototype.parseCatchClause=function(){var e=this.createNode();this.expectKeyword(\"catch\"),this.expect(\"(\"),this.match(\")\")&&this.throwUnexpectedToken(this.lookahead);for(var t=[],n=this.parsePattern(t),r={},o=0;o<t.length;o++){var a=\"$\"+t[o].value;Object.prototype.hasOwnProperty.call(r,a)&&this.tolerateError(i.Messages.DuplicateBinding,t[o].value),r[a]=!0}this.context.strict&&n.type===u.Syntax.Identifier&&this.scanner.isRestrictedWord(n.name)&&this.tolerateError(i.Messages.StrictCatchVariable),this.expect(\")\");var s=this.parseBlock();return this.finalize(e,new c.CatchClause(n,s))},e.prototype.parseFinallyClause=function(){return this.expectKeyword(\"finally\"),this.parseBlock()},e.prototype.parseTryStatement=function(){var e=this.createNode();this.expectKeyword(\"try\");var t=this.parseBlock(),n=this.matchKeyword(\"catch\")?this.parseCatchClause():null,r=this.matchKeyword(\"finally\")?this.parseFinallyClause():null;return n||r||this.throwError(i.Messages.NoCatchOrFinally),this.finalize(e,new c.TryStatement(t,n,r))},e.prototype.parseDebuggerStatement=function(){var e=this.createNode();return this.expectKeyword(\"debugger\"),this.consumeSemicolon(),this.finalize(e,new c.DebuggerStatement)},e.prototype.parseStatement=function(){var e=null;switch(this.lookahead.type){case a.Token.BooleanLiteral:case a.Token.NullLiteral:case a.Token.NumericLiteral:case a.Token.StringLiteral:case a.Token.Template:case a.Token.RegularExpression:e=this.parseExpressionStatement();break;case a.Token.Punctuator:var t=this.lookahead.value;e=\"{\"===t?this.parseBlock():\"(\"===t?this.parseExpressionStatement():\";\"===t?this.parseEmptyStatement():this.parseExpressionStatement();break;case a.Token.Identifier:e=this.parseLabelledStatement();break;case a.Token.Keyword:switch(this.lookahead.value){case\"break\":e=this.parseBreakStatement();break;case\"continue\":e=this.parseContinueStatement();break;case\"debugger\":e=this.parseDebuggerStatement();break;case\"do\":e=this.parseDoWhileStatement();break;case\"for\":e=this.parseForStatement();break;case\"function\":e=this.parseFunctionDeclaration();break;case\"if\":e=this.parseIfStatement();break;case\"return\":e=this.parseReturnStatement();break;case\"switch\":e=this.parseSwitchStatement();break;case\"throw\":e=this.parseThrowStatement();break;case\"try\":e=this.parseTryStatement();break;case\"var\":e=this.parseVariableStatement();break;case\"while\":e=this.parseWhileStatement();break;case\"with\":e=this.parseWithStatement();break;default:e=this.parseExpressionStatement()}break;default:this.throwUnexpectedToken(this.lookahead)}return e},e.prototype.parseFunctionSourceElements=function(){var e=this.createNode();this.expect(\"{\");var t=this.parseDirectivePrologues(),n=this.context.labelSet,r=this.context.inIteration,i=this.context.inSwitch,o=this.context.inFunctionBody;for(this.context.labelSet={},this.context.inIteration=!1,this.context.inSwitch=!1,this.context.inFunctionBody=!0;this.startMarker.index<this.scanner.length&&!this.match(\"}\");)t.push(this.parseStatementListItem());return this.expect(\"}\"),this.context.labelSet=n,this.context.inIteration=r,this.context.inSwitch=i,this.context.inFunctionBody=o,this.finalize(e,new c.BlockStatement(t))},e.prototype.validateParam=function(e,t,n){var r=\"$\"+n;this.context.strict?(this.scanner.isRestrictedWord(n)&&(e.stricted=t,e.message=i.Messages.StrictParamName),Object.prototype.hasOwnProperty.call(e.paramSet,r)&&(e.stricted=t,e.message=i.Messages.StrictParamDupe)):e.firstRestricted||(this.scanner.isRestrictedWord(n)?(e.firstRestricted=t,e.message=i.Messages.StrictParamName):this.scanner.isStrictModeReservedWord(n)?(e.firstRestricted=t,e.message=i.Messages.StrictReservedWord):Object.prototype.hasOwnProperty.call(e.paramSet,r)&&(e.stricted=t,e.message=i.Messages.StrictParamDupe)),\"function\"==typeof Object.defineProperty?Object.defineProperty(e.paramSet,r,{value:!0,enumerable:!0,writable:!0,configurable:!0}):e.paramSet[r]=!0},e.prototype.parseRestElement=function(e){var t=this.createNode();this.expect(\"...\");var n=this.parsePattern(e);return this.match(\"=\")&&this.throwError(i.Messages.DefaultRestParameter),this.match(\")\")||this.throwError(i.Messages.ParameterAfterRestParameter),this.finalize(t,new c.RestElement(n))},e.prototype.parseFormalParameter=function(e){for(var t=[],n=this.match(\"...\")?this.parseRestElement(t):this.parsePatternWithDefault(t),r=0;r<t.length;r++)this.validateParam(e,t[r],t[r].value);return e.params.push(n),!this.match(\")\")},e.prototype.parseFormalParameters=function(e){var t;if(t={params:[],firstRestricted:e},this.expect(\"(\"),!this.match(\")\"))for(t.paramSet={};this.startMarker.index<this.scanner.length&&this.parseFormalParameter(t);)this.expect(\",\");return this.expect(\")\"),{params:t.params,stricted:t.stricted,firstRestricted:t.firstRestricted,message:t.message}},e.prototype.parseFunctionDeclaration=function(e){var t=this.createNode();this.expectKeyword(\"function\");var n=this.match(\"*\");n&&this.nextToken();var r,o=null,a=null;if(!e||!this.match(\"(\")){var s=this.lookahead;o=this.parseVariableIdentifier(),this.context.strict?this.scanner.isRestrictedWord(s.value)&&this.tolerateUnexpectedToken(s,i.Messages.StrictFunctionName):this.scanner.isRestrictedWord(s.value)?(a=s,r=i.Messages.StrictFunctionName):this.scanner.isStrictModeReservedWord(s.value)&&(a=s,r=i.Messages.StrictReservedWord)}var u=this.context.allowYield;this.context.allowYield=!n;var l=this.parseFormalParameters(a),p=l.params,f=l.stricted;a=l.firstRestricted,l.message&&(r=l.message);var h=this.context.strict,d=this.parseFunctionSourceElements();return this.context.strict&&a&&this.throwUnexpectedToken(a,r),this.context.strict&&f&&this.tolerateUnexpectedToken(f,r),this.context.strict=h,this.context.allowYield=u,this.finalize(t,new c.FunctionDeclaration(o,p,d,n))},e.prototype.parseFunctionExpression=function(){var e=this.createNode();this.expectKeyword(\"function\");var t=this.match(\"*\");t&&this.nextToken();var n,r,o=null,a=this.context.allowYield;if(this.context.allowYield=!t,!this.match(\"(\")){var s=this.lookahead;o=this.context.strict||t||!this.matchKeyword(\"yield\")?this.parseVariableIdentifier():this.parseIdentifierName(),this.context.strict?this.scanner.isRestrictedWord(s.value)&&this.tolerateUnexpectedToken(s,i.Messages.StrictFunctionName):this.scanner.isRestrictedWord(s.value)?(r=s,n=i.Messages.StrictFunctionName):this.scanner.isStrictModeReservedWord(s.value)&&(r=s,n=i.Messages.StrictReservedWord)}var u=this.parseFormalParameters(r),l=u.params,p=u.stricted;r=u.firstRestricted,u.message&&(n=u.message);var f=this.context.strict,h=this.parseFunctionSourceElements();return this.context.strict&&r&&this.throwUnexpectedToken(r,n),this.context.strict&&p&&this.tolerateUnexpectedToken(p,n),this.context.strict=f,this.context.allowYield=a,this.finalize(e,new c.FunctionExpression(o,l,h,t))},e.prototype.parseDirective=function(){var e=this.lookahead,t=null,n=this.createNode(),r=this.parseExpression();return r.type===u.Syntax.Literal&&(t=this.getTokenRaw(e).slice(1,-1)),this.consumeSemicolon(),this.finalize(n,t?new c.Directive(r,t):new c.ExpressionStatement(r))},e.prototype.parseDirectivePrologues=function(){for(var e=null,t=[];;){var n=this.lookahead;if(n.type!==a.Token.StringLiteral)break;var r=this.parseDirective();t.push(r);var o=r.directive;if(\"string\"!=typeof o)break;\"use strict\"===o?(this.context.strict=!0,e&&this.tolerateUnexpectedToken(e,i.Messages.StrictOctalLiteral)):!e&&n.octal&&(e=n)}return t},e.prototype.qualifiedPropertyName=function(e){switch(e.type){case a.Token.Identifier:case a.Token.StringLiteral:case a.Token.BooleanLiteral:case a.Token.NullLiteral:case a.Token.NumericLiteral:case a.Token.Keyword:return!0;case a.Token.Punctuator:return\"[\"===e.value}return!1},e.prototype.parseGetterMethod=function(){var e=this.createNode();this.expect(\"(\"),this.expect(\")\");var t=!1,n={params:[],stricted:null,firstRestricted:null,message:null},r=this.context.allowYield;this.context.allowYield=!1;var i=this.parsePropertyMethod(n);return this.context.allowYield=r,this.finalize(e,new c.FunctionExpression(null,n.params,i,t))},e.prototype.parseSetterMethod=function(){var e=this.createNode(),t={params:[],firstRestricted:null,paramSet:{}},n=!1,r=this.context.allowYield;this.context.allowYield=!1,this.expect(\"(\"),this.match(\")\")?this.tolerateUnexpectedToken(this.lookahead):this.parseFormalParameter(t),this.expect(\")\");var i=this.parsePropertyMethod(t);return this.context.allowYield=r,this.finalize(e,new c.FunctionExpression(null,t.params,i,n))},e.prototype.parseGeneratorMethod=function(){var e=this.createNode(),t=!0,n=this.context.allowYield;this.context.allowYield=!0;var r=this.parseFormalParameters();this.context.allowYield=!1;var i=this.parsePropertyMethod(r);return this.context.allowYield=n,this.finalize(e,new c.FunctionExpression(null,r.params,i,t))},e.prototype.isStartOfExpression=function(){var e=!0,t=this.lookahead.value;switch(this.lookahead.type){case a.Token.Punctuator:e=\"[\"===t||\"(\"===t||\"{\"===t||\"+\"===t||\"-\"===t||\"!\"===t||\"~\"===t||\"++\"===t||\"--\"===t||\"/\"===t||\"/=\"===t;break;case a.Token.Keyword:e=\"class\"===t||\"delete\"===t||\"function\"===t||\"let\"===t||\"new\"===t||\"super\"===t||\"this\"===t||\"typeof\"===t||\"void\"===t||\"yield\"===t}return e},e.prototype.parseYieldExpression=function(){var e=this.createNode();this.expectKeyword(\"yield\");var t=null,n=!1;if(!this.hasLineTerminator){var r=this.context.allowYield;this.context.allowYield=!1,n=this.match(\"*\"),n?(this.nextToken(),t=this.parseAssignmentExpression()):this.isStartOfExpression()&&(t=this.parseAssignmentExpression()),this.context.allowYield=r}return this.finalize(e,new c.YieldExpression(t,n))},e.prototype.parseClassElement=function(e){var t,n,r,o=this.lookahead,s=this.createNode(),u=!1,l=!1,p=!1;if(this.match(\"*\"))this.nextToken();else{u=this.match(\"[\"),n=this.parseObjectPropertyKey();var f=n;\"static\"===f.name&&(this.qualifiedPropertyName(this.lookahead)||this.match(\"*\"))&&(o=this.lookahead,p=!0,u=this.match(\"[\"),this.match(\"*\")?this.nextToken():n=this.parseObjectPropertyKey())}var h=this.qualifiedPropertyName(this.lookahead);return o.type===a.Token.Identifier?\"get\"===o.value&&h?(t=\"get\",u=this.match(\"[\"),n=this.parseObjectPropertyKey(),this.context.allowYield=!1,r=this.parseGetterMethod()):\"set\"===o.value&&h&&(t=\"set\",u=this.match(\"[\"),n=this.parseObjectPropertyKey(),r=this.parseSetterMethod()):o.type===a.Token.Punctuator&&\"*\"===o.value&&h&&(t=\"init\",u=this.match(\"[\"),n=this.parseObjectPropertyKey(),r=this.parseGeneratorMethod(),l=!0),!t&&n&&this.match(\"(\")&&(t=\"init\",r=this.parsePropertyMethodFunction(),l=!0),t||this.throwUnexpectedToken(this.lookahead),\"init\"===t&&(t=\"method\"),u||(p&&this.isPropertyKey(n,\"prototype\")&&this.throwUnexpectedToken(o,i.Messages.StaticPrototype),!p&&this.isPropertyKey(n,\"constructor\")&&(\"method\"===t&&l&&!r.generator||this.throwUnexpectedToken(o,i.Messages.ConstructorSpecialMethod),e.value?this.throwUnexpectedToken(o,i.Messages.DuplicateConstructor):e.value=!0,t=\"constructor\")),this.finalize(s,new c.MethodDefinition(n,u,r,t,p))},e.prototype.parseClassElementList=function(){var e=[],t={value:!1};for(this.expect(\"{\");!this.match(\"}\");)this.match(\";\")?this.nextToken():e.push(this.parseClassElement(t));return this.expect(\"}\"),e},e.prototype.parseClassBody=function(){var e=this.createNode(),t=this.parseClassElementList();return this.finalize(e,new c.ClassBody(t))},e.prototype.parseClassDeclaration=function(e){var t=this.createNode(),n=this.context.strict;this.context.strict=!0,this.expectKeyword(\"class\");var r=e&&this.lookahead.type!==a.Token.Identifier?null:this.parseVariableIdentifier(),i=null;this.matchKeyword(\"extends\")&&(this.nextToken(),i=this.isolateCoverGrammar(this.parseLeftHandSideExpressionAllowCall));var o=this.parseClassBody();return this.context.strict=n,this.finalize(t,new c.ClassDeclaration(r,i,o))},e.prototype.parseClassExpression=function(){var e=this.createNode(),t=this.context.strict;this.context.strict=!0,this.expectKeyword(\"class\");var n=this.lookahead.type===a.Token.Identifier?this.parseVariableIdentifier():null,r=null;this.matchKeyword(\"extends\")&&(this.nextToken(),r=this.isolateCoverGrammar(this.parseLeftHandSideExpressionAllowCall));var i=this.parseClassBody();return this.context.strict=t,this.finalize(e,new c.ClassExpression(n,r,i))},e.prototype.parseProgram=function(){for(var e=this.createNode(),t=this.parseDirectivePrologues();this.startMarker.index<this.scanner.length;)t.push(this.parseStatementListItem());return this.finalize(e,new c.Program(t,this.sourceType))},e.prototype.parseModuleSpecifier=function(){var e=this.createNode();this.lookahead.type!==a.Token.StringLiteral&&this.throwError(i.Messages.InvalidModuleSpecifier);var t=this.nextToken(),n=this.getTokenRaw(t);return this.finalize(e,new c.Literal(t.value,n))},e.prototype.parseImportSpecifier=function(){var e,t,n=this.createNode();return this.lookahead.type===a.Token.Identifier?(e=this.parseVariableIdentifier(),t=e,this.matchContextualKeyword(\"as\")&&(this.nextToken(),t=this.parseVariableIdentifier())):(e=this.parseIdentifierName(),t=e,this.matchContextualKeyword(\"as\")?(this.nextToken(),t=this.parseVariableIdentifier()):this.throwUnexpectedToken(this.nextToken())),this.finalize(n,new c.ImportSpecifier(t,e))},e.prototype.parseNamedImports=function(){this.expect(\"{\");for(var e=[];!this.match(\"}\");)e.push(this.parseImportSpecifier()),this.match(\"}\")||this.expect(\",\");return this.expect(\"}\"),e},e.prototype.parseImportDefaultSpecifier=function(){var e=this.createNode(),t=this.parseIdentifierName();return this.finalize(e,new c.ImportDefaultSpecifier(t))},e.prototype.parseImportNamespaceSpecifier=function(){var e=this.createNode();this.expect(\"*\"),this.matchContextualKeyword(\"as\")||this.throwError(i.Messages.NoAsAfterImportNamespace),this.nextToken();var t=this.parseIdentifierName();return this.finalize(e,new c.ImportNamespaceSpecifier(t))},e.prototype.parseImportDeclaration=function(){this.context.inFunctionBody&&this.throwError(i.Messages.IllegalImportDeclaration);var e=this.createNode();this.expectKeyword(\"import\");var t,n=[];if(this.lookahead.type===a.Token.StringLiteral)t=this.parseModuleSpecifier();else{if(this.match(\"{\")?n=n.concat(this.parseNamedImports()):this.match(\"*\")?n.push(this.parseImportNamespaceSpecifier()):this.isIdentifierName(this.lookahead)&&!this.matchKeyword(\"default\")?(n.push(this.parseImportDefaultSpecifier()),this.match(\",\")&&(this.nextToken(),this.match(\"*\")?n.push(this.parseImportNamespaceSpecifier()):this.match(\"{\")?n=n.concat(this.parseNamedImports()):this.throwUnexpectedToken(this.lookahead))):this.throwUnexpectedToken(this.nextToken()),!this.matchContextualKeyword(\"from\")){var r=this.lookahead.value?i.Messages.UnexpectedToken:i.Messages.MissingFromClause;this.throwError(r,this.lookahead.value)}this.nextToken(),t=this.parseModuleSpecifier()}return this.consumeSemicolon(),this.finalize(e,new c.ImportDeclaration(n,t))},e.prototype.parseExportSpecifier=function(){var e=this.createNode(),t=this.parseIdentifierName(),n=t;return this.matchContextualKeyword(\"as\")&&(this.nextToken(),n=this.parseIdentifierName()),this.finalize(e,new c.ExportSpecifier(t,n))},e.prototype.parseExportDeclaration=function(){this.context.inFunctionBody&&this.throwError(i.Messages.IllegalExportDeclaration);var e=this.createNode();this.expectKeyword(\"export\");var t;if(this.matchKeyword(\"default\"))if(this.nextToken(),this.matchKeyword(\"function\")){var n=this.parseFunctionDeclaration(!0);t=this.finalize(e,new c.ExportDefaultDeclaration(n))}else if(this.matchKeyword(\"class\")){var n=this.parseClassDeclaration(!0);t=this.finalize(e,new c.ExportDefaultDeclaration(n))}else{this.matchContextualKeyword(\"from\")&&this.throwError(i.Messages.UnexpectedToken,this.lookahead.value);var n=this.match(\"{\")?this.parseObjectInitializer():this.match(\"[\")?this.parseArrayInitializer():this.parseAssignmentExpression();this.consumeSemicolon(),t=this.finalize(e,new c.ExportDefaultDeclaration(n))}else if(this.match(\"*\")){if(this.nextToken(),!this.matchContextualKeyword(\"from\")){var r=this.lookahead.value?i.Messages.UnexpectedToken:i.Messages.MissingFromClause;this.throwError(r,this.lookahead.value)}this.nextToken();var o=this.parseModuleSpecifier();this.consumeSemicolon(),t=this.finalize(e,new c.ExportAllDeclaration(o))}else if(this.lookahead.type===a.Token.Keyword){var n=void 0;switch(this.lookahead.value){case\"let\":case\"const\":n=this.parseLexicalDeclaration({inFor:!1});break;case\"var\":case\"class\":case\"function\":n=this.parseStatementListItem();break;default:this.throwUnexpectedToken(this.lookahead)}t=this.finalize(e,new c.ExportNamedDeclaration(n,[],null))}else{var s=[],u=null,l=!1;for(this.expect(\"{\");!this.match(\"}\");)l=l||this.matchKeyword(\"default\"),s.push(this.parseExportSpecifier()),this.match(\"}\")||this.expect(\",\");if(this.expect(\"}\"),this.matchContextualKeyword(\"from\"))this.nextToken(),u=this.parseModuleSpecifier(),this.consumeSemicolon();else if(l){var r=this.lookahead.value?i.Messages.UnexpectedToken:i.Messages.MissingFromClause;this.throwError(r,this.lookahead.value)}else this.consumeSemicolon();t=this.finalize(e,new c.ExportNamedDeclaration(null,s,u))}return t},e}();t.Parser=p},function(e,t){\"use strict\";function n(e,t){if(!e)throw new Error(\"ASSERT: \"+t)}t.assert=n},function(e,t){\"use strict\";t.Messages={UnexpectedToken:\"Unexpected token %0\",UnexpectedTokenIllegal:\"Unexpected token ILLEGAL\",UnexpectedNumber:\"Unexpected number\",UnexpectedString:\"Unexpected string\",UnexpectedIdentifier:\"Unexpected identifier\",UnexpectedReserved:\"Unexpected reserved word\",UnexpectedTemplate:\"Unexpected quasi %0\",UnexpectedEOS:\"Unexpected end of input\",NewlineAfterThrow:\"Illegal newline after throw\",InvalidRegExp:\"Invalid regular expression\",UnterminatedRegExp:\"Invalid regular expression: missing /\",InvalidLHSInAssignment:\"Invalid left-hand side in assignment\",InvalidLHSInForIn:\"Invalid left-hand side in for-in\",InvalidLHSInForLoop:\"Invalid left-hand side in for-loop\",MultipleDefaultsInSwitch:\"More than one default clause in switch statement\",NoCatchOrFinally:\"Missing catch or finally after try\",UnknownLabel:\"Undefined label '%0'\",Redeclaration:\"%0 '%1' has already been declared\",IllegalContinue:\"Illegal continue statement\",IllegalBreak:\"Illegal break statement\",IllegalReturn:\"Illegal return statement\",StrictModeWith:\"Strict mode code may not include a with statement\",StrictCatchVariable:\"Catch variable may not be eval or arguments in strict mode\",StrictVarName:\"Variable name may not be eval or arguments in strict mode\",StrictParamName:\"Parameter name eval or arguments is not allowed in strict mode\",StrictParamDupe:\"Strict mode function may not have duplicate parameter names\",StrictFunctionName:\"Function name may not be eval or arguments in strict mode\",StrictOctalLiteral:\"Octal literals are not allowed in strict mode.\",StrictDelete:\"Delete of an unqualified identifier in strict mode.\",StrictLHSAssignment:\"Assignment to eval or arguments is not allowed in strict mode\",StrictLHSPostfix:\"Postfix increment/decrement may not have eval or arguments operand in strict mode\",StrictLHSPrefix:\"Prefix increment/decrement may not have eval or arguments operand in strict mode\",StrictReservedWord:\"Use of future reserved word in strict mode\",TemplateOctalLiteral:\"Octal literals are not allowed in template strings.\",ParameterAfterRestParameter:\"Rest parameter must be last formal parameter\",DefaultRestParameter:\"Unexpected token =\",DuplicateProtoProperty:\"Duplicate __proto__ fields are not allowed in object literals\",ConstructorSpecialMethod:\"Class constructor may not be an accessor\",DuplicateConstructor:\"A class may only have one constructor\",StaticPrototype:\"Classes may not have static property named prototype\",MissingFromClause:\"Unexpected token\",NoAsAfterImportNamespace:\"Unexpected token\",InvalidModuleSpecifier:\"Unexpected token\",IllegalImportDeclaration:\"Unexpected token\",IllegalExportDeclaration:\"Unexpected token\",DuplicateBinding:\"Duplicate binding %0\",ForInOfLoopInitializer:\"%0 loop variable declaration may not have an initializer\"}},function(e,t){\"use strict\";var n=function(){function e(){this.errors=[],this.tolerant=!1}return e.prototype.recordError=function(e){this.errors.push(e)},e.prototype.tolerate=function(e){if(!this.tolerant)throw e;this.recordError(e)},e.prototype.constructError=function(e,t){var n=new Error(e);try{throw n}catch(e){Object.create&&Object.defineProperty&&(n=Object.create(e),Object.defineProperty(n,\"column\",{value:t}))}finally{return n}},e.prototype.createError=function(e,t,n,r){var i=\"Line \"+t+\": \"+r,o=this.constructError(i,n);return o.index=e,o.lineNumber=t,o.description=r,o},e.prototype.throwError=function(e,t,n,r){throw this.createError(e,t,n,r)},e.prototype.tolerateError=function(e,t,n,r){var i=this.createError(e,t,n,r);if(!this.tolerant)throw i;this.recordError(i)},e}();t.ErrorHandler=n},function(e,t){\"use strict\";!function(e){e[e.BooleanLiteral=1]=\"BooleanLiteral\",e[e.EOF=2]=\"EOF\",e[e.Identifier=3]=\"Identifier\",e[e.Keyword=4]=\"Keyword\",e[e.NullLiteral=5]=\"NullLiteral\",e[e.NumericLiteral=6]=\"NumericLiteral\",e[e.Punctuator=7]=\"Punctuator\",e[e.StringLiteral=8]=\"StringLiteral\",e[e.RegularExpression=9]=\"RegularExpression\",e[e.Template=10]=\"Template\"}(t.Token||(t.Token={}));var n=t.Token;t.TokenName={},t.TokenName[n.BooleanLiteral]=\"Boolean\",t.TokenName[n.EOF]=\"<end>\",t.TokenName[n.Identifier]=\"Identifier\",t.TokenName[n.Keyword]=\"Keyword\",t.TokenName[n.NullLiteral]=\"Null\",t.TokenName[n.NumericLiteral]=\"Numeric\",\nt.TokenName[n.Punctuator]=\"Punctuator\",t.TokenName[n.StringLiteral]=\"String\",t.TokenName[n.RegularExpression]=\"RegularExpression\",t.TokenName[n.Template]=\"Template\"},function(e,t,n){\"use strict\";function r(e){return\"0123456789abcdef\".indexOf(e.toLowerCase())}function i(e){return\"01234567\".indexOf(e)}var o=n(4),a=n(5),s=n(9),u=n(7),c=function(){function e(e,t){this.source=e,this.errorHandler=t,this.trackComment=!1,this.length=e.length,this.index=0,this.lineNumber=e.length>0?1:0,this.lineStart=0,this.curlyStack=[]}return e.prototype.eof=function(){return this.index>=this.length},e.prototype.throwUnexpectedToken=function(e){void 0===e&&(e=a.Messages.UnexpectedTokenIllegal),this.errorHandler.throwError(this.index,this.lineNumber,this.index-this.lineStart+1,e)},e.prototype.tolerateUnexpectedToken=function(){this.errorHandler.tolerateError(this.index,this.lineNumber,this.index-this.lineStart+1,a.Messages.UnexpectedTokenIllegal)},e.prototype.skipSingleLineComment=function(e){var t,n,r;for(this.trackComment&&(t=[],n=this.index-e,r={start:{line:this.lineNumber,column:this.index-this.lineStart-e},end:{}});!this.eof();){var i=this.source.charCodeAt(this.index);if(++this.index,s.Character.isLineTerminator(i)){if(this.trackComment){r.end={line:this.lineNumber,column:this.index-this.lineStart-1};var o={multiLine:!1,slice:[n+e,this.index-1],range:[n,this.index-1],loc:r};t.push(o)}return 13===i&&10===this.source.charCodeAt(this.index)&&++this.index,++this.lineNumber,this.lineStart=this.index,t}}if(this.trackComment){r.end={line:this.lineNumber,column:this.index-this.lineStart};var o={multiLine:!1,slice:[n+e,this.index],range:[n,this.index],loc:r};t.push(o)}return t},e.prototype.skipMultiLineComment=function(){var e,t,n;for(this.trackComment&&(e=[],t=this.index-2,n={start:{line:this.lineNumber,column:this.index-this.lineStart-2},end:{}});!this.eof();){var r=this.source.charCodeAt(this.index);if(s.Character.isLineTerminator(r))13===r&&10===this.source.charCodeAt(this.index+1)&&++this.index,++this.lineNumber,++this.index,this.lineStart=this.index;else if(42===r){if(47===this.source.charCodeAt(this.index+1)){if(this.index+=2,this.trackComment){n.end={line:this.lineNumber,column:this.index-this.lineStart};var i={multiLine:!0,slice:[t+2,this.index-2],range:[t,this.index],loc:n};e.push(i)}return e}++this.index}else++this.index}if(this.trackComment){n.end={line:this.lineNumber,column:this.index-this.lineStart};var i={multiLine:!0,slice:[t+2,this.index],range:[t,this.index],loc:n};e.push(i)}return this.tolerateUnexpectedToken(),e},e.prototype.scanComments=function(){var e;this.trackComment&&(e=[]);for(var t=0===this.index;!this.eof();){var n=this.source.charCodeAt(this.index);if(s.Character.isWhiteSpace(n))++this.index;else if(s.Character.isLineTerminator(n))++this.index,13===n&&10===this.source.charCodeAt(this.index)&&++this.index,++this.lineNumber,this.lineStart=this.index,t=!0;else if(47===n)if(n=this.source.charCodeAt(this.index+1),47===n){this.index+=2;var r=this.skipSingleLineComment(2);this.trackComment&&(e=e.concat(r)),t=!0}else{if(42!==n)break;this.index+=2;var r=this.skipMultiLineComment();this.trackComment&&(e=e.concat(r))}else if(t&&45===n){if(45!==this.source.charCodeAt(this.index+1)||62!==this.source.charCodeAt(this.index+2))break;this.index+=3;var r=this.skipSingleLineComment(3);this.trackComment&&(e=e.concat(r))}else{if(60!==n)break;if(\"!--\"!==this.source.slice(this.index+1,this.index+4))break;this.index+=4;var r=this.skipSingleLineComment(4);this.trackComment&&(e=e.concat(r))}}return e},e.prototype.isFutureReservedWord=function(e){switch(e){case\"enum\":case\"export\":case\"import\":case\"super\":return!0;default:return!1}},e.prototype.isStrictModeReservedWord=function(e){switch(e){case\"implements\":case\"interface\":case\"package\":case\"private\":case\"protected\":case\"public\":case\"static\":case\"yield\":case\"let\":return!0;default:return!1}},e.prototype.isRestrictedWord=function(e){return\"eval\"===e||\"arguments\"===e},e.prototype.isKeyword=function(e){switch(e.length){case 2:return\"if\"===e||\"in\"===e||\"do\"===e;case 3:return\"var\"===e||\"for\"===e||\"new\"===e||\"try\"===e||\"let\"===e;case 4:return\"this\"===e||\"else\"===e||\"case\"===e||\"void\"===e||\"with\"===e||\"enum\"===e;case 5:return\"while\"===e||\"break\"===e||\"catch\"===e||\"throw\"===e||\"const\"===e||\"yield\"===e||\"class\"===e||\"super\"===e;case 6:return\"return\"===e||\"typeof\"===e||\"delete\"===e||\"switch\"===e||\"export\"===e||\"import\"===e;case 7:return\"default\"===e||\"finally\"===e||\"extends\"===e;case 8:return\"function\"===e||\"continue\"===e||\"debugger\"===e;case 10:return\"instanceof\"===e;default:return!1}},e.prototype.codePointAt=function(e){var t=this.source.charCodeAt(e);if(t>=55296&&t<=56319){var n=this.source.charCodeAt(e+1);if(n>=56320&&n<=57343){var r=t;t=1024*(r-55296)+n-56320+65536}}return t},e.prototype.scanHexEscape=function(e){for(var t=\"u\"===e?4:2,n=0,i=0;i<t;++i){if(this.eof()||!s.Character.isHexDigit(this.source.charCodeAt(this.index)))return\"\";n=16*n+r(this.source[this.index++])}return String.fromCharCode(n)},e.prototype.scanUnicodeCodePointEscape=function(){var e=this.source[this.index],t=0;for(\"}\"===e&&this.throwUnexpectedToken();!this.eof()&&(e=this.source[this.index++],s.Character.isHexDigit(e.charCodeAt(0)));)t=16*t+r(e);return(t>1114111||\"}\"!==e)&&this.throwUnexpectedToken(),s.Character.fromCodePoint(t)},e.prototype.getIdentifier=function(){for(var e=this.index++;!this.eof();){var t=this.source.charCodeAt(this.index);if(92===t)return this.index=e,this.getComplexIdentifier();if(t>=55296&&t<57343)return this.index=e,this.getComplexIdentifier();if(!s.Character.isIdentifierPart(t))break;++this.index}return this.source.slice(e,this.index)},e.prototype.getComplexIdentifier=function(){var e=this.codePointAt(this.index),t=s.Character.fromCodePoint(e);this.index+=t.length;var n;for(92===e&&(117!==this.source.charCodeAt(this.index)&&this.throwUnexpectedToken(),++this.index,\"{\"===this.source[this.index]?(++this.index,n=this.scanUnicodeCodePointEscape()):(n=this.scanHexEscape(\"u\"),e=n.charCodeAt(0),n&&\"\\\\\"!==n&&s.Character.isIdentifierStart(e)||this.throwUnexpectedToken()),t=n);!this.eof()&&(e=this.codePointAt(this.index),s.Character.isIdentifierPart(e));)n=s.Character.fromCodePoint(e),t+=n,this.index+=n.length,92===e&&(t=t.substr(0,t.length-1),117!==this.source.charCodeAt(this.index)&&this.throwUnexpectedToken(),++this.index,\"{\"===this.source[this.index]?(++this.index,n=this.scanUnicodeCodePointEscape()):(n=this.scanHexEscape(\"u\"),e=n.charCodeAt(0),n&&\"\\\\\"!==n&&s.Character.isIdentifierPart(e)||this.throwUnexpectedToken()),t+=n);return t},e.prototype.octalToDecimal=function(e){var t=\"0\"!==e,n=i(e);return!this.eof()&&s.Character.isOctalDigit(this.source.charCodeAt(this.index))&&(t=!0,n=8*n+i(this.source[this.index++]),\"0123\".indexOf(e)>=0&&!this.eof()&&s.Character.isOctalDigit(this.source.charCodeAt(this.index))&&(n=8*n+i(this.source[this.index++]))),{code:n,octal:t}},e.prototype.scanIdentifier=function(){var e,t=this.index,n=92===this.source.charCodeAt(t)?this.getComplexIdentifier():this.getIdentifier();return e=1===n.length?u.Token.Identifier:this.isKeyword(n)?u.Token.Keyword:\"null\"===n?u.Token.NullLiteral:\"true\"===n||\"false\"===n?u.Token.BooleanLiteral:u.Token.Identifier,{type:e,value:n,lineNumber:this.lineNumber,lineStart:this.lineStart,start:t,end:this.index}},e.prototype.scanPunctuator=function(){var e={type:u.Token.Punctuator,value:\"\",lineNumber:this.lineNumber,lineStart:this.lineStart,start:this.index,end:this.index},t=this.source[this.index];switch(t){case\"(\":case\"{\":\"{\"===t&&this.curlyStack.push(\"{\"),++this.index;break;case\".\":++this.index,\".\"===this.source[this.index]&&\".\"===this.source[this.index+1]&&(this.index+=2,t=\"...\");break;case\"}\":++this.index,this.curlyStack.pop();break;case\")\":case\";\":case\",\":case\"[\":case\"]\":case\":\":case\"?\":case\"~\":++this.index;break;default:t=this.source.substr(this.index,4),\">>>=\"===t?this.index+=4:(t=t.substr(0,3),\"===\"===t||\"!==\"===t||\">>>\"===t||\"<<=\"===t||\">>=\"===t||\"**=\"===t?this.index+=3:(t=t.substr(0,2),\"&&\"===t||\"||\"===t||\"==\"===t||\"!=\"===t||\"+=\"===t||\"-=\"===t||\"*=\"===t||\"/=\"===t||\"++\"===t||\"--\"===t||\"<<\"===t||\">>\"===t||\"&=\"===t||\"|=\"===t||\"^=\"===t||\"%=\"===t||\"<=\"===t||\">=\"===t||\"=>\"===t||\"**\"===t?this.index+=2:(t=this.source[this.index],\"<>=!+-*%&|^/\".indexOf(t)>=0&&++this.index)))}return this.index===e.start&&this.throwUnexpectedToken(),e.end=this.index,e.value=t,e},e.prototype.scanHexLiteral=function(e){for(var t=\"\";!this.eof()&&s.Character.isHexDigit(this.source.charCodeAt(this.index));)t+=this.source[this.index++];return 0===t.length&&this.throwUnexpectedToken(),s.Character.isIdentifierStart(this.source.charCodeAt(this.index))&&this.throwUnexpectedToken(),{type:u.Token.NumericLiteral,value:parseInt(\"0x\"+t,16),lineNumber:this.lineNumber,lineStart:this.lineStart,start:e,end:this.index}},e.prototype.scanBinaryLiteral=function(e){for(var t,n=\"\";!this.eof()&&(t=this.source[this.index],\"0\"===t||\"1\"===t);)n+=this.source[this.index++];return 0===n.length&&this.throwUnexpectedToken(),this.eof()||(t=this.source.charCodeAt(this.index),(s.Character.isIdentifierStart(t)||s.Character.isDecimalDigit(t))&&this.throwUnexpectedToken()),{type:u.Token.NumericLiteral,value:parseInt(n,2),lineNumber:this.lineNumber,lineStart:this.lineStart,start:e,end:this.index}},e.prototype.scanOctalLiteral=function(e,t){var n=\"\",r=!1;for(s.Character.isOctalDigit(e.charCodeAt(0))?(r=!0,n=\"0\"+this.source[this.index++]):++this.index;!this.eof()&&s.Character.isOctalDigit(this.source.charCodeAt(this.index));)n+=this.source[this.index++];return r||0!==n.length||this.throwUnexpectedToken(),(s.Character.isIdentifierStart(this.source.charCodeAt(this.index))||s.Character.isDecimalDigit(this.source.charCodeAt(this.index)))&&this.throwUnexpectedToken(),{type:u.Token.NumericLiteral,value:parseInt(n,8),octal:r,lineNumber:this.lineNumber,lineStart:this.lineStart,start:t,end:this.index}},e.prototype.isImplicitOctalLiteral=function(){for(var e=this.index+1;e<this.length;++e){var t=this.source[e];if(\"8\"===t||\"9\"===t)return!1;if(!s.Character.isOctalDigit(t.charCodeAt(0)))return!0}return!0},e.prototype.scanNumericLiteral=function(){var e=this.index,t=this.source[e];o.assert(s.Character.isDecimalDigit(t.charCodeAt(0))||\".\"===t,\"Numeric literal must start with a decimal digit or a decimal point\");var n=\"\";if(\".\"!==t){if(n=this.source[this.index++],t=this.source[this.index],\"0\"===n){if(\"x\"===t||\"X\"===t)return++this.index,this.scanHexLiteral(e);if(\"b\"===t||\"B\"===t)return++this.index,this.scanBinaryLiteral(e);if(\"o\"===t||\"O\"===t)return this.scanOctalLiteral(t,e);if(t&&s.Character.isOctalDigit(t.charCodeAt(0))&&this.isImplicitOctalLiteral())return this.scanOctalLiteral(t,e)}for(;s.Character.isDecimalDigit(this.source.charCodeAt(this.index));)n+=this.source[this.index++];t=this.source[this.index]}if(\".\"===t){for(n+=this.source[this.index++];s.Character.isDecimalDigit(this.source.charCodeAt(this.index));)n+=this.source[this.index++];t=this.source[this.index]}if(\"e\"===t||\"E\"===t)if(n+=this.source[this.index++],t=this.source[this.index],\"+\"!==t&&\"-\"!==t||(n+=this.source[this.index++]),s.Character.isDecimalDigit(this.source.charCodeAt(this.index)))for(;s.Character.isDecimalDigit(this.source.charCodeAt(this.index));)n+=this.source[this.index++];else this.throwUnexpectedToken();return s.Character.isIdentifierStart(this.source.charCodeAt(this.index))&&this.throwUnexpectedToken(),{type:u.Token.NumericLiteral,value:parseFloat(n),lineNumber:this.lineNumber,lineStart:this.lineStart,start:e,end:this.index}},e.prototype.scanStringLiteral=function(){var e=this.index,t=this.source[e];o.assert(\"'\"===t||'\"'===t,\"String literal must starts with a quote\"),++this.index;for(var n=!1,r=\"\";!this.eof();){var i=this.source[this.index++];if(i===t){t=\"\";break}if(\"\\\\\"===i)if(i=this.source[this.index++],i&&s.Character.isLineTerminator(i.charCodeAt(0)))++this.lineNumber,\"\\r\"===i&&\"\\n\"===this.source[this.index]&&++this.index,this.lineStart=this.index;else switch(i){case\"u\":case\"x\":if(\"{\"===this.source[this.index])++this.index,r+=this.scanUnicodeCodePointEscape();else{var a=this.scanHexEscape(i);a||this.throwUnexpectedToken(),r+=a}break;case\"n\":r+=\"\\n\";break;case\"r\":r+=\"\\r\";break;case\"t\":r+=\"\\t\";break;case\"b\":r+=\"\\b\";break;case\"f\":r+=\"\\f\";break;case\"v\":r+=\"\\v\";break;case\"8\":case\"9\":r+=i,this.tolerateUnexpectedToken();break;default:if(i&&s.Character.isOctalDigit(i.charCodeAt(0))){var c=this.octalToDecimal(i);n=c.octal||n,r+=String.fromCharCode(c.code)}else r+=i}else{if(s.Character.isLineTerminator(i.charCodeAt(0)))break;r+=i}}return\"\"!==t&&(this.index=e,this.throwUnexpectedToken()),{type:u.Token.StringLiteral,value:r,octal:n,lineNumber:this.lineNumber,lineStart:this.lineStart,start:e,end:this.index}},e.prototype.scanTemplate=function(){var e=\"\",t=!1,n=this.index,r=\"`\"===this.source[n],i=!1,o=2;for(++this.index;!this.eof();){var c=this.source[this.index++];if(\"`\"===c){o=1,i=!0,t=!0;break}if(\"$\"===c){if(\"{\"===this.source[this.index]){this.curlyStack.push(\"${\"),++this.index,t=!0;break}e+=c}else if(\"\\\\\"===c)if(c=this.source[this.index++],s.Character.isLineTerminator(c.charCodeAt(0)))++this.lineNumber,\"\\r\"===c&&\"\\n\"===this.source[this.index]&&++this.index,this.lineStart=this.index;else switch(c){case\"n\":e+=\"\\n\";break;case\"r\":e+=\"\\r\";break;case\"t\":e+=\"\\t\";break;case\"u\":case\"x\":if(\"{\"===this.source[this.index])++this.index,e+=this.scanUnicodeCodePointEscape();else{var l=this.index,p=this.scanHexEscape(c);p?e+=p:(this.index=l,e+=c)}break;case\"b\":e+=\"\\b\";break;case\"f\":e+=\"\\f\";break;case\"v\":e+=\"\\v\";break;default:\"0\"===c?(s.Character.isDecimalDigit(this.source.charCodeAt(this.index))&&this.throwUnexpectedToken(a.Messages.TemplateOctalLiteral),e+=\"\\0\"):s.Character.isOctalDigit(c.charCodeAt(0))?this.throwUnexpectedToken(a.Messages.TemplateOctalLiteral):e+=c}else s.Character.isLineTerminator(c.charCodeAt(0))?(++this.lineNumber,\"\\r\"===c&&\"\\n\"===this.source[this.index]&&++this.index,this.lineStart=this.index,e+=\"\\n\"):e+=c}return t||this.throwUnexpectedToken(),r||this.curlyStack.pop(),{type:u.Token.Template,value:{cooked:e,raw:this.source.slice(n+1,this.index-o)},head:r,tail:i,lineNumber:this.lineNumber,lineStart:this.lineStart,start:n,end:this.index}},e.prototype.testRegExp=function(e,t){var n=\"￿\",r=e,i=this;t.indexOf(\"u\")>=0&&(r=r.replace(/\\\\u\\{([0-9a-fA-F]+)\\}|\\\\u([a-fA-F0-9]{4})/g,function(e,t,r){var o=parseInt(t||r,16);return o>1114111&&i.throwUnexpectedToken(a.Messages.InvalidRegExp),o<=65535?String.fromCharCode(o):n}).replace(/[\\uD800-\\uDBFF][\\uDC00-\\uDFFF]/g,n));try{RegExp(r)}catch(e){this.throwUnexpectedToken(a.Messages.InvalidRegExp)}try{return new RegExp(e,t)}catch(e){return null}},e.prototype.scanRegExpBody=function(){var e=this.source[this.index];o.assert(\"/\"===e,\"Regular expression literal must start with a slash\");for(var t=this.source[this.index++],n=!1,r=!1;!this.eof();)if(e=this.source[this.index++],t+=e,\"\\\\\"===e)e=this.source[this.index++],s.Character.isLineTerminator(e.charCodeAt(0))&&this.throwUnexpectedToken(a.Messages.UnterminatedRegExp),t+=e;else if(s.Character.isLineTerminator(e.charCodeAt(0)))this.throwUnexpectedToken(a.Messages.UnterminatedRegExp);else if(n)\"]\"===e&&(n=!1);else{if(\"/\"===e){r=!0;break}\"[\"===e&&(n=!0)}r||this.throwUnexpectedToken(a.Messages.UnterminatedRegExp);var i=t.substr(1,t.length-2);return{value:i,literal:t}},e.prototype.scanRegExpFlags=function(){for(var e=\"\",t=\"\";!this.eof();){var n=this.source[this.index];if(!s.Character.isIdentifierPart(n.charCodeAt(0)))break;if(++this.index,\"\\\\\"!==n||this.eof())t+=n,e+=n;else if(n=this.source[this.index],\"u\"===n){++this.index;var r=this.index;if(n=this.scanHexEscape(\"u\"))for(t+=n,e+=\"\\\\u\";r<this.index;++r)e+=this.source[r];else this.index=r,t+=\"u\",e+=\"\\\\u\";this.tolerateUnexpectedToken()}else e+=\"\\\\\",this.tolerateUnexpectedToken()}return{value:t,literal:e}},e.prototype.scanRegExp=function(){var e=this.index,t=this.scanRegExpBody(),n=this.scanRegExpFlags(),r=this.testRegExp(t.value,n.value);return{type:u.Token.RegularExpression,value:r,literal:t.literal+n.literal,regex:{pattern:t.value,flags:n.value},lineNumber:this.lineNumber,lineStart:this.lineStart,start:e,end:this.index}},e.prototype.lex=function(){if(this.eof())return{type:u.Token.EOF,lineNumber:this.lineNumber,lineStart:this.lineStart,start:this.index,end:this.index};var e=this.source.charCodeAt(this.index);return s.Character.isIdentifierStart(e)?this.scanIdentifier():40===e||41===e||59===e?this.scanPunctuator():39===e||34===e?this.scanStringLiteral():46===e?s.Character.isDecimalDigit(this.source.charCodeAt(this.index+1))?this.scanNumericLiteral():this.scanPunctuator():s.Character.isDecimalDigit(e)?this.scanNumericLiteral():96===e||125===e&&\"${\"===this.curlyStack[this.curlyStack.length-1]?this.scanTemplate():e>=55296&&e<57343&&s.Character.isIdentifierStart(this.codePointAt(this.index))?this.scanIdentifier():this.scanPunctuator()},e}();t.Scanner=c},function(e,t){\"use strict\";var n={NonAsciiIdentifierStart:/[\\xAA\\xB5\\xBA\\xC0-\\xD6\\xD8-\\xF6\\xF8-\\u02C1\\u02C6-\\u02D1\\u02E0-\\u02E4\\u02EC\\u02EE\\u0370-\\u0374\\u0376\\u0377\\u037A-\\u037D\\u037F\\u0386\\u0388-\\u038A\\u038C\\u038E-\\u03A1\\u03A3-\\u03F5\\u03F7-\\u0481\\u048A-\\u052F\\u0531-\\u0556\\u0559\\u0561-\\u0587\\u05D0-\\u05EA\\u05F0-\\u05F2\\u0620-\\u064A\\u066E\\u066F\\u0671-\\u06D3\\u06D5\\u06E5\\u06E6\\u06EE\\u06EF\\u06FA-\\u06FC\\u06FF\\u0710\\u0712-\\u072F\\u074D-\\u07A5\\u07B1\\u07CA-\\u07EA\\u07F4\\u07F5\\u07FA\\u0800-\\u0815\\u081A\\u0824\\u0828\\u0840-\\u0858\\u08A0-\\u08B4\\u0904-\\u0939\\u093D\\u0950\\u0958-\\u0961\\u0971-\\u0980\\u0985-\\u098C\\u098F\\u0990\\u0993-\\u09A8\\u09AA-\\u09B0\\u09B2\\u09B6-\\u09B9\\u09BD\\u09CE\\u09DC\\u09DD\\u09DF-\\u09E1\\u09F0\\u09F1\\u0A05-\\u0A0A\\u0A0F\\u0A10\\u0A13-\\u0A28\\u0A2A-\\u0A30\\u0A32\\u0A33\\u0A35\\u0A36\\u0A38\\u0A39\\u0A59-\\u0A5C\\u0A5E\\u0A72-\\u0A74\\u0A85-\\u0A8D\\u0A8F-\\u0A91\\u0A93-\\u0AA8\\u0AAA-\\u0AB0\\u0AB2\\u0AB3\\u0AB5-\\u0AB9\\u0ABD\\u0AD0\\u0AE0\\u0AE1\\u0AF9\\u0B05-\\u0B0C\\u0B0F\\u0B10\\u0B13-\\u0B28\\u0B2A-\\u0B30\\u0B32\\u0B33\\u0B35-\\u0B39\\u0B3D\\u0B5C\\u0B5D\\u0B5F-\\u0B61\\u0B71\\u0B83\\u0B85-\\u0B8A\\u0B8E-\\u0B90\\u0B92-\\u0B95\\u0B99\\u0B9A\\u0B9C\\u0B9E\\u0B9F\\u0BA3\\u0BA4\\u0BA8-\\u0BAA\\u0BAE-\\u0BB9\\u0BD0\\u0C05-\\u0C0C\\u0C0E-\\u0C10\\u0C12-\\u0C28\\u0C2A-\\u0C39\\u0C3D\\u0C58-\\u0C5A\\u0C60\\u0C61\\u0C85-\\u0C8C\\u0C8E-\\u0C90\\u0C92-\\u0CA8\\u0CAA-\\u0CB3\\u0CB5-\\u0CB9\\u0CBD\\u0CDE\\u0CE0\\u0CE1\\u0CF1\\u0CF2\\u0D05-\\u0D0C\\u0D0E-\\u0D10\\u0D12-\\u0D3A\\u0D3D\\u0D4E\\u0D5F-\\u0D61\\u0D7A-\\u0D7F\\u0D85-\\u0D96\\u0D9A-\\u0DB1\\u0DB3-\\u0DBB\\u0DBD\\u0DC0-\\u0DC6\\u0E01-\\u0E30\\u0E32\\u0E33\\u0E40-\\u0E46\\u0E81\\u0E82\\u0E84\\u0E87\\u0E88\\u0E8A\\u0E8D\\u0E94-\\u0E97\\u0E99-\\u0E9F\\u0EA1-\\u0EA3\\u0EA5\\u0EA7\\u0EAA\\u0EAB\\u0EAD-\\u0EB0\\u0EB2\\u0EB3\\u0EBD\\u0EC0-\\u0EC4\\u0EC6\\u0EDC-\\u0EDF\\u0F00\\u0F40-\\u0F47\\u0F49-\\u0F6C\\u0F88-\\u0F8C\\u1000-\\u102A\\u103F\\u1050-\\u1055\\u105A-\\u105D\\u1061\\u1065\\u1066\\u106E-\\u1070\\u1075-\\u1081\\u108E\\u10A0-\\u10C5\\u10C7\\u10CD\\u10D0-\\u10FA\\u10FC-\\u1248\\u124A-\\u124D\\u1250-\\u1256\\u1258\\u125A-\\u125D\\u1260-\\u1288\\u128A-\\u128D\\u1290-\\u12B0\\u12B2-\\u12B5\\u12B8-\\u12BE\\u12C0\\u12C2-\\u12C5\\u12C8-\\u12D6\\u12D8-\\u1310\\u1312-\\u1315\\u1318-\\u135A\\u1380-\\u138F\\u13A0-\\u13F5\\u13F8-\\u13FD\\u1401-\\u166C\\u166F-\\u167F\\u1681-\\u169A\\u16A0-\\u16EA\\u16EE-\\u16F8\\u1700-\\u170C\\u170E-\\u1711\\u1720-\\u1731\\u1740-\\u1751\\u1760-\\u176C\\u176E-\\u1770\\u1780-\\u17B3\\u17D7\\u17DC\\u1820-\\u1877\\u1880-\\u18A8\\u18AA\\u18B0-\\u18F5\\u1900-\\u191E\\u1950-\\u196D\\u1970-\\u1974\\u1980-\\u19AB\\u19B0-\\u19C9\\u1A00-\\u1A16\\u1A20-\\u1A54\\u1AA7\\u1B05-\\u1B33\\u1B45-\\u1B4B\\u1B83-\\u1BA0\\u1BAE\\u1BAF\\u1BBA-\\u1BE5\\u1C00-\\u1C23\\u1C4D-\\u1C4F\\u1C5A-\\u1C7D\\u1CE9-\\u1CEC\\u1CEE-\\u1CF1\\u1CF5\\u1CF6\\u1D00-\\u1DBF\\u1E00-\\u1F15\\u1F18-\\u1F1D\\u1F20-\\u1F45\\u1F48-\\u1F4D\\u1F50-\\u1F57\\u1F59\\u1F5B\\u1F5D\\u1F5F-\\u1F7D\\u1F80-\\u1FB4\\u1FB6-\\u1FBC\\u1FBE\\u1FC2-\\u1FC4\\u1FC6-\\u1FCC\\u1FD0-\\u1FD3\\u1FD6-\\u1FDB\\u1FE0-\\u1FEC\\u1FF2-\\u1FF4\\u1FF6-\\u1FFC\\u2071\\u207F\\u2090-\\u209C\\u2102\\u2107\\u210A-\\u2113\\u2115\\u2118-\\u211D\\u2124\\u2126\\u2128\\u212A-\\u2139\\u213C-\\u213F\\u2145-\\u2149\\u214E\\u2160-\\u2188\\u2C00-\\u2C2E\\u2C30-\\u2C5E\\u2C60-\\u2CE4\\u2CEB-\\u2CEE\\u2CF2\\u2CF3\\u2D00-\\u2D25\\u2D27\\u2D2D\\u2D30-\\u2D67\\u2D6F\\u2D80-\\u2D96\\u2DA0-\\u2DA6\\u2DA8-\\u2DAE\\u2DB0-\\u2DB6\\u2DB8-\\u2DBE\\u2DC0-\\u2DC6\\u2DC8-\\u2DCE\\u2DD0-\\u2DD6\\u2DD8-\\u2DDE\\u3005-\\u3007\\u3021-\\u3029\\u3031-\\u3035\\u3038-\\u303C\\u3041-\\u3096\\u309B-\\u309F\\u30A1-\\u30FA\\u30FC-\\u30FF\\u3105-\\u312D\\u3131-\\u318E\\u31A0-\\u31BA\\u31F0-\\u31FF\\u3400-\\u4DB5\\u4E00-\\u9FD5\\uA000-\\uA48C\\uA4D0-\\uA4FD\\uA500-\\uA60C\\uA610-\\uA61F\\uA62A\\uA62B\\uA640-\\uA66E\\uA67F-\\uA69D\\uA6A0-\\uA6EF\\uA717-\\uA71F\\uA722-\\uA788\\uA78B-\\uA7AD\\uA7B0-\\uA7B7\\uA7F7-\\uA801\\uA803-\\uA805\\uA807-\\uA80A\\uA80C-\\uA822\\uA840-\\uA873\\uA882-\\uA8B3\\uA8F2-\\uA8F7\\uA8FB\\uA8FD\\uA90A-\\uA925\\uA930-\\uA946\\uA960-\\uA97C\\uA984-\\uA9B2\\uA9CF\\uA9E0-\\uA9E4\\uA9E6-\\uA9EF\\uA9FA-\\uA9FE\\uAA00-\\uAA28\\uAA40-\\uAA42\\uAA44-\\uAA4B\\uAA60-\\uAA76\\uAA7A\\uAA7E-\\uAAAF\\uAAB1\\uAAB5\\uAAB6\\uAAB9-\\uAABD\\uAAC0\\uAAC2\\uAADB-\\uAADD\\uAAE0-\\uAAEA\\uAAF2-\\uAAF4\\uAB01-\\uAB06\\uAB09-\\uAB0E\\uAB11-\\uAB16\\uAB20-\\uAB26\\uAB28-\\uAB2E\\uAB30-\\uAB5A\\uAB5C-\\uAB65\\uAB70-\\uABE2\\uAC00-\\uD7A3\\uD7B0-\\uD7C6\\uD7CB-\\uD7FB\\uF900-\\uFA6D\\uFA70-\\uFAD9\\uFB00-\\uFB06\\uFB13-\\uFB17\\uFB1D\\uFB1F-\\uFB28\\uFB2A-\\uFB36\\uFB38-\\uFB3C\\uFB3E\\uFB40\\uFB41\\uFB43\\uFB44\\uFB46-\\uFBB1\\uFBD3-\\uFD3D\\uFD50-\\uFD8F\\uFD92-\\uFDC7\\uFDF0-\\uFDFB\\uFE70-\\uFE74\\uFE76-\\uFEFC\\uFF21-\\uFF3A\\uFF41-\\uFF5A\\uFF66-\\uFFBE\\uFFC2-\\uFFC7\\uFFCA-\\uFFCF\\uFFD2-\\uFFD7\\uFFDA-\\uFFDC]|\\uD800[\\uDC00-\\uDC0B\\uDC0D-\\uDC26\\uDC28-\\uDC3A\\uDC3C\\uDC3D\\uDC3F-\\uDC4D\\uDC50-\\uDC5D\\uDC80-\\uDCFA\\uDD40-\\uDD74\\uDE80-\\uDE9C\\uDEA0-\\uDED0\\uDF00-\\uDF1F\\uDF30-\\uDF4A\\uDF50-\\uDF75\\uDF80-\\uDF9D\\uDFA0-\\uDFC3\\uDFC8-\\uDFCF\\uDFD1-\\uDFD5]|\\uD801[\\uDC00-\\uDC9D\\uDD00-\\uDD27\\uDD30-\\uDD63\\uDE00-\\uDF36\\uDF40-\\uDF55\\uDF60-\\uDF67]|\\uD802[\\uDC00-\\uDC05\\uDC08\\uDC0A-\\uDC35\\uDC37\\uDC38\\uDC3C\\uDC3F-\\uDC55\\uDC60-\\uDC76\\uDC80-\\uDC9E\\uDCE0-\\uDCF2\\uDCF4\\uDCF5\\uDD00-\\uDD15\\uDD20-\\uDD39\\uDD80-\\uDDB7\\uDDBE\\uDDBF\\uDE00\\uDE10-\\uDE13\\uDE15-\\uDE17\\uDE19-\\uDE33\\uDE60-\\uDE7C\\uDE80-\\uDE9C\\uDEC0-\\uDEC7\\uDEC9-\\uDEE4\\uDF00-\\uDF35\\uDF40-\\uDF55\\uDF60-\\uDF72\\uDF80-\\uDF91]|\\uD803[\\uDC00-\\uDC48\\uDC80-\\uDCB2\\uDCC0-\\uDCF2]|\\uD804[\\uDC03-\\uDC37\\uDC83-\\uDCAF\\uDCD0-\\uDCE8\\uDD03-\\uDD26\\uDD50-\\uDD72\\uDD76\\uDD83-\\uDDB2\\uDDC1-\\uDDC4\\uDDDA\\uDDDC\\uDE00-\\uDE11\\uDE13-\\uDE2B\\uDE80-\\uDE86\\uDE88\\uDE8A-\\uDE8D\\uDE8F-\\uDE9D\\uDE9F-\\uDEA8\\uDEB0-\\uDEDE\\uDF05-\\uDF0C\\uDF0F\\uDF10\\uDF13-\\uDF28\\uDF2A-\\uDF30\\uDF32\\uDF33\\uDF35-\\uDF39\\uDF3D\\uDF50\\uDF5D-\\uDF61]|\\uD805[\\uDC80-\\uDCAF\\uDCC4\\uDCC5\\uDCC7\\uDD80-\\uDDAE\\uDDD8-\\uDDDB\\uDE00-\\uDE2F\\uDE44\\uDE80-\\uDEAA\\uDF00-\\uDF19]|\\uD806[\\uDCA0-\\uDCDF\\uDCFF\\uDEC0-\\uDEF8]|\\uD808[\\uDC00-\\uDF99]|\\uD809[\\uDC00-\\uDC6E\\uDC80-\\uDD43]|[\\uD80C\\uD840-\\uD868\\uD86A-\\uD86C\\uD86F-\\uD872][\\uDC00-\\uDFFF]|\\uD80D[\\uDC00-\\uDC2E]|\\uD811[\\uDC00-\\uDE46]|\\uD81A[\\uDC00-\\uDE38\\uDE40-\\uDE5E\\uDED0-\\uDEED\\uDF00-\\uDF2F\\uDF40-\\uDF43\\uDF63-\\uDF77\\uDF7D-\\uDF8F]|\\uD81B[\\uDF00-\\uDF44\\uDF50\\uDF93-\\uDF9F]|\\uD82C[\\uDC00\\uDC01]|\\uD82F[\\uDC00-\\uDC6A\\uDC70-\\uDC7C\\uDC80-\\uDC88\\uDC90-\\uDC99]|\\uD835[\\uDC00-\\uDC54\\uDC56-\\uDC9C\\uDC9E\\uDC9F\\uDCA2\\uDCA5\\uDCA6\\uDCA9-\\uDCAC\\uDCAE-\\uDCB9\\uDCBB\\uDCBD-\\uDCC3\\uDCC5-\\uDD05\\uDD07-\\uDD0A\\uDD0D-\\uDD14\\uDD16-\\uDD1C\\uDD1E-\\uDD39\\uDD3B-\\uDD3E\\uDD40-\\uDD44\\uDD46\\uDD4A-\\uDD50\\uDD52-\\uDEA5\\uDEA8-\\uDEC0\\uDEC2-\\uDEDA\\uDEDC-\\uDEFA\\uDEFC-\\uDF14\\uDF16-\\uDF34\\uDF36-\\uDF4E\\uDF50-\\uDF6E\\uDF70-\\uDF88\\uDF8A-\\uDFA8\\uDFAA-\\uDFC2\\uDFC4-\\uDFCB]|\\uD83A[\\uDC00-\\uDCC4]|\\uD83B[\\uDE00-\\uDE03\\uDE05-\\uDE1F\\uDE21\\uDE22\\uDE24\\uDE27\\uDE29-\\uDE32\\uDE34-\\uDE37\\uDE39\\uDE3B\\uDE42\\uDE47\\uDE49\\uDE4B\\uDE4D-\\uDE4F\\uDE51\\uDE52\\uDE54\\uDE57\\uDE59\\uDE5B\\uDE5D\\uDE5F\\uDE61\\uDE62\\uDE64\\uDE67-\\uDE6A\\uDE6C-\\uDE72\\uDE74-\\uDE77\\uDE79-\\uDE7C\\uDE7E\\uDE80-\\uDE89\\uDE8B-\\uDE9B\\uDEA1-\\uDEA3\\uDEA5-\\uDEA9\\uDEAB-\\uDEBB]|\\uD869[\\uDC00-\\uDED6\\uDF00-\\uDFFF]|\\uD86D[\\uDC00-\\uDF34\\uDF40-\\uDFFF]|\\uD86E[\\uDC00-\\uDC1D\\uDC20-\\uDFFF]|\\uD873[\\uDC00-\\uDEA1]|\\uD87E[\\uDC00-\\uDE1D]/,NonAsciiIdentifierPart:/[\\xAA\\xB5\\xB7\\xBA\\xC0-\\xD6\\xD8-\\xF6\\xF8-\\u02C1\\u02C6-\\u02D1\\u02E0-\\u02E4\\u02EC\\u02EE\\u0300-\\u0374\\u0376\\u0377\\u037A-\\u037D\\u037F\\u0386-\\u038A\\u038C\\u038E-\\u03A1\\u03A3-\\u03F5\\u03F7-\\u0481\\u0483-\\u0487\\u048A-\\u052F\\u0531-\\u0556\\u0559\\u0561-\\u0587\\u0591-\\u05BD\\u05BF\\u05C1\\u05C2\\u05C4\\u05C5\\u05C7\\u05D0-\\u05EA\\u05F0-\\u05F2\\u0610-\\u061A\\u0620-\\u0669\\u066E-\\u06D3\\u06D5-\\u06DC\\u06DF-\\u06E8\\u06EA-\\u06FC\\u06FF\\u0710-\\u074A\\u074D-\\u07B1\\u07C0-\\u07F5\\u07FA\\u0800-\\u082D\\u0840-\\u085B\\u08A0-\\u08B4\\u08E3-\\u0963\\u0966-\\u096F\\u0971-\\u0983\\u0985-\\u098C\\u098F\\u0990\\u0993-\\u09A8\\u09AA-\\u09B0\\u09B2\\u09B6-\\u09B9\\u09BC-\\u09C4\\u09C7\\u09C8\\u09CB-\\u09CE\\u09D7\\u09DC\\u09DD\\u09DF-\\u09E3\\u09E6-\\u09F1\\u0A01-\\u0A03\\u0A05-\\u0A0A\\u0A0F\\u0A10\\u0A13-\\u0A28\\u0A2A-\\u0A30\\u0A32\\u0A33\\u0A35\\u0A36\\u0A38\\u0A39\\u0A3C\\u0A3E-\\u0A42\\u0A47\\u0A48\\u0A4B-\\u0A4D\\u0A51\\u0A59-\\u0A5C\\u0A5E\\u0A66-\\u0A75\\u0A81-\\u0A83\\u0A85-\\u0A8D\\u0A8F-\\u0A91\\u0A93-\\u0AA8\\u0AAA-\\u0AB0\\u0AB2\\u0AB3\\u0AB5-\\u0AB9\\u0ABC-\\u0AC5\\u0AC7-\\u0AC9\\u0ACB-\\u0ACD\\u0AD0\\u0AE0-\\u0AE3\\u0AE6-\\u0AEF\\u0AF9\\u0B01-\\u0B03\\u0B05-\\u0B0C\\u0B0F\\u0B10\\u0B13-\\u0B28\\u0B2A-\\u0B30\\u0B32\\u0B33\\u0B35-\\u0B39\\u0B3C-\\u0B44\\u0B47\\u0B48\\u0B4B-\\u0B4D\\u0B56\\u0B57\\u0B5C\\u0B5D\\u0B5F-\\u0B63\\u0B66-\\u0B6F\\u0B71\\u0B82\\u0B83\\u0B85-\\u0B8A\\u0B8E-\\u0B90\\u0B92-\\u0B95\\u0B99\\u0B9A\\u0B9C\\u0B9E\\u0B9F\\u0BA3\\u0BA4\\u0BA8-\\u0BAA\\u0BAE-\\u0BB9\\u0BBE-\\u0BC2\\u0BC6-\\u0BC8\\u0BCA-\\u0BCD\\u0BD0\\u0BD7\\u0BE6-\\u0BEF\\u0C00-\\u0C03\\u0C05-\\u0C0C\\u0C0E-\\u0C10\\u0C12-\\u0C28\\u0C2A-\\u0C39\\u0C3D-\\u0C44\\u0C46-\\u0C48\\u0C4A-\\u0C4D\\u0C55\\u0C56\\u0C58-\\u0C5A\\u0C60-\\u0C63\\u0C66-\\u0C6F\\u0C81-\\u0C83\\u0C85-\\u0C8C\\u0C8E-\\u0C90\\u0C92-\\u0CA8\\u0CAA-\\u0CB3\\u0CB5-\\u0CB9\\u0CBC-\\u0CC4\\u0CC6-\\u0CC8\\u0CCA-\\u0CCD\\u0CD5\\u0CD6\\u0CDE\\u0CE0-\\u0CE3\\u0CE6-\\u0CEF\\u0CF1\\u0CF2\\u0D01-\\u0D03\\u0D05-\\u0D0C\\u0D0E-\\u0D10\\u0D12-\\u0D3A\\u0D3D-\\u0D44\\u0D46-\\u0D48\\u0D4A-\\u0D4E\\u0D57\\u0D5F-\\u0D63\\u0D66-\\u0D6F\\u0D7A-\\u0D7F\\u0D82\\u0D83\\u0D85-\\u0D96\\u0D9A-\\u0DB1\\u0DB3-\\u0DBB\\u0DBD\\u0DC0-\\u0DC6\\u0DCA\\u0DCF-\\u0DD4\\u0DD6\\u0DD8-\\u0DDF\\u0DE6-\\u0DEF\\u0DF2\\u0DF3\\u0E01-\\u0E3A\\u0E40-\\u0E4E\\u0E50-\\u0E59\\u0E81\\u0E82\\u0E84\\u0E87\\u0E88\\u0E8A\\u0E8D\\u0E94-\\u0E97\\u0E99-\\u0E9F\\u0EA1-\\u0EA3\\u0EA5\\u0EA7\\u0EAA\\u0EAB\\u0EAD-\\u0EB9\\u0EBB-\\u0EBD\\u0EC0-\\u0EC4\\u0EC6\\u0EC8-\\u0ECD\\u0ED0-\\u0ED9\\u0EDC-\\u0EDF\\u0F00\\u0F18\\u0F19\\u0F20-\\u0F29\\u0F35\\u0F37\\u0F39\\u0F3E-\\u0F47\\u0F49-\\u0F6C\\u0F71-\\u0F84\\u0F86-\\u0F97\\u0F99-\\u0FBC\\u0FC6\\u1000-\\u1049\\u1050-\\u109D\\u10A0-\\u10C5\\u10C7\\u10CD\\u10D0-\\u10FA\\u10FC-\\u1248\\u124A-\\u124D\\u1250-\\u1256\\u1258\\u125A-\\u125D\\u1260-\\u1288\\u128A-\\u128D\\u1290-\\u12B0\\u12B2-\\u12B5\\u12B8-\\u12BE\\u12C0\\u12C2-\\u12C5\\u12C8-\\u12D6\\u12D8-\\u1310\\u1312-\\u1315\\u1318-\\u135A\\u135D-\\u135F\\u1369-\\u1371\\u1380-\\u138F\\u13A0-\\u13F5\\u13F8-\\u13FD\\u1401-\\u166C\\u166F-\\u167F\\u1681-\\u169A\\u16A0-\\u16EA\\u16EE-\\u16F8\\u1700-\\u170C\\u170E-\\u1714\\u1720-\\u1734\\u1740-\\u1753\\u1760-\\u176C\\u176E-\\u1770\\u1772\\u1773\\u1780-\\u17D3\\u17D7\\u17DC\\u17DD\\u17E0-\\u17E9\\u180B-\\u180D\\u1810-\\u1819\\u1820-\\u1877\\u1880-\\u18AA\\u18B0-\\u18F5\\u1900-\\u191E\\u1920-\\u192B\\u1930-\\u193B\\u1946-\\u196D\\u1970-\\u1974\\u1980-\\u19AB\\u19B0-\\u19C9\\u19D0-\\u19DA\\u1A00-\\u1A1B\\u1A20-\\u1A5E\\u1A60-\\u1A7C\\u1A7F-\\u1A89\\u1A90-\\u1A99\\u1AA7\\u1AB0-\\u1ABD\\u1B00-\\u1B4B\\u1B50-\\u1B59\\u1B6B-\\u1B73\\u1B80-\\u1BF3\\u1C00-\\u1C37\\u1C40-\\u1C49\\u1C4D-\\u1C7D\\u1CD0-\\u1CD2\\u1CD4-\\u1CF6\\u1CF8\\u1CF9\\u1D00-\\u1DF5\\u1DFC-\\u1F15\\u1F18-\\u1F1D\\u1F20-\\u1F45\\u1F48-\\u1F4D\\u1F50-\\u1F57\\u1F59\\u1F5B\\u1F5D\\u1F5F-\\u1F7D\\u1F80-\\u1FB4\\u1FB6-\\u1FBC\\u1FBE\\u1FC2-\\u1FC4\\u1FC6-\\u1FCC\\u1FD0-\\u1FD3\\u1FD6-\\u1FDB\\u1FE0-\\u1FEC\\u1FF2-\\u1FF4\\u1FF6-\\u1FFC\\u200C\\u200D\\u203F\\u2040\\u2054\\u2071\\u207F\\u2090-\\u209C\\u20D0-\\u20DC\\u20E1\\u20E5-\\u20F0\\u2102\\u2107\\u210A-\\u2113\\u2115\\u2118-\\u211D\\u2124\\u2126\\u2128\\u212A-\\u2139\\u213C-\\u213F\\u2145-\\u2149\\u214E\\u2160-\\u2188\\u2C00-\\u2C2E\\u2C30-\\u2C5E\\u2C60-\\u2CE4\\u2CEB-\\u2CF3\\u2D00-\\u2D25\\u2D27\\u2D2D\\u2D30-\\u2D67\\u2D6F\\u2D7F-\\u2D96\\u2DA0-\\u2DA6\\u2DA8-\\u2DAE\\u2DB0-\\u2DB6\\u2DB8-\\u2DBE\\u2DC0-\\u2DC6\\u2DC8-\\u2DCE\\u2DD0-\\u2DD6\\u2DD8-\\u2DDE\\u2DE0-\\u2DFF\\u3005-\\u3007\\u3021-\\u302F\\u3031-\\u3035\\u3038-\\u303C\\u3041-\\u3096\\u3099-\\u309F\\u30A1-\\u30FA\\u30FC-\\u30FF\\u3105-\\u312D\\u3131-\\u318E\\u31A0-\\u31BA\\u31F0-\\u31FF\\u3400-\\u4DB5\\u4E00-\\u9FD5\\uA000-\\uA48C\\uA4D0-\\uA4FD\\uA500-\\uA60C\\uA610-\\uA62B\\uA640-\\uA66F\\uA674-\\uA67D\\uA67F-\\uA6F1\\uA717-\\uA71F\\uA722-\\uA788\\uA78B-\\uA7AD\\uA7B0-\\uA7B7\\uA7F7-\\uA827\\uA840-\\uA873\\uA880-\\uA8C4\\uA8D0-\\uA8D9\\uA8E0-\\uA8F7\\uA8FB\\uA8FD\\uA900-\\uA92D\\uA930-\\uA953\\uA960-\\uA97C\\uA980-\\uA9C0\\uA9CF-\\uA9D9\\uA9E0-\\uA9FE\\uAA00-\\uAA36\\uAA40-\\uAA4D\\uAA50-\\uAA59\\uAA60-\\uAA76\\uAA7A-\\uAAC2\\uAADB-\\uAADD\\uAAE0-\\uAAEF\\uAAF2-\\uAAF6\\uAB01-\\uAB06\\uAB09-\\uAB0E\\uAB11-\\uAB16\\uAB20-\\uAB26\\uAB28-\\uAB2E\\uAB30-\\uAB5A\\uAB5C-\\uAB65\\uAB70-\\uABEA\\uABEC\\uABED\\uABF0-\\uABF9\\uAC00-\\uD7A3\\uD7B0-\\uD7C6\\uD7CB-\\uD7FB\\uF900-\\uFA6D\\uFA70-\\uFAD9\\uFB00-\\uFB06\\uFB13-\\uFB17\\uFB1D-\\uFB28\\uFB2A-\\uFB36\\uFB38-\\uFB3C\\uFB3E\\uFB40\\uFB41\\uFB43\\uFB44\\uFB46-\\uFBB1\\uFBD3-\\uFD3D\\uFD50-\\uFD8F\\uFD92-\\uFDC7\\uFDF0-\\uFDFB\\uFE00-\\uFE0F\\uFE20-\\uFE2F\\uFE33\\uFE34\\uFE4D-\\uFE4F\\uFE70-\\uFE74\\uFE76-\\uFEFC\\uFF10-\\uFF19\\uFF21-\\uFF3A\\uFF3F\\uFF41-\\uFF5A\\uFF66-\\uFFBE\\uFFC2-\\uFFC7\\uFFCA-\\uFFCF\\uFFD2-\\uFFD7\\uFFDA-\\uFFDC]|\\uD800[\\uDC00-\\uDC0B\\uDC0D-\\uDC26\\uDC28-\\uDC3A\\uDC3C\\uDC3D\\uDC3F-\\uDC4D\\uDC50-\\uDC5D\\uDC80-\\uDCFA\\uDD40-\\uDD74\\uDDFD\\uDE80-\\uDE9C\\uDEA0-\\uDED0\\uDEE0\\uDF00-\\uDF1F\\uDF30-\\uDF4A\\uDF50-\\uDF7A\\uDF80-\\uDF9D\\uDFA0-\\uDFC3\\uDFC8-\\uDFCF\\uDFD1-\\uDFD5]|\\uD801[\\uDC00-\\uDC9D\\uDCA0-\\uDCA9\\uDD00-\\uDD27\\uDD30-\\uDD63\\uDE00-\\uDF36\\uDF40-\\uDF55\\uDF60-\\uDF67]|\\uD802[\\uDC00-\\uDC05\\uDC08\\uDC0A-\\uDC35\\uDC37\\uDC38\\uDC3C\\uDC3F-\\uDC55\\uDC60-\\uDC76\\uDC80-\\uDC9E\\uDCE0-\\uDCF2\\uDCF4\\uDCF5\\uDD00-\\uDD15\\uDD20-\\uDD39\\uDD80-\\uDDB7\\uDDBE\\uDDBF\\uDE00-\\uDE03\\uDE05\\uDE06\\uDE0C-\\uDE13\\uDE15-\\uDE17\\uDE19-\\uDE33\\uDE38-\\uDE3A\\uDE3F\\uDE60-\\uDE7C\\uDE80-\\uDE9C\\uDEC0-\\uDEC7\\uDEC9-\\uDEE6\\uDF00-\\uDF35\\uDF40-\\uDF55\\uDF60-\\uDF72\\uDF80-\\uDF91]|\\uD803[\\uDC00-\\uDC48\\uDC80-\\uDCB2\\uDCC0-\\uDCF2]|\\uD804[\\uDC00-\\uDC46\\uDC66-\\uDC6F\\uDC7F-\\uDCBA\\uDCD0-\\uDCE8\\uDCF0-\\uDCF9\\uDD00-\\uDD34\\uDD36-\\uDD3F\\uDD50-\\uDD73\\uDD76\\uDD80-\\uDDC4\\uDDCA-\\uDDCC\\uDDD0-\\uDDDA\\uDDDC\\uDE00-\\uDE11\\uDE13-\\uDE37\\uDE80-\\uDE86\\uDE88\\uDE8A-\\uDE8D\\uDE8F-\\uDE9D\\uDE9F-\\uDEA8\\uDEB0-\\uDEEA\\uDEF0-\\uDEF9\\uDF00-\\uDF03\\uDF05-\\uDF0C\\uDF0F\\uDF10\\uDF13-\\uDF28\\uDF2A-\\uDF30\\uDF32\\uDF33\\uDF35-\\uDF39\\uDF3C-\\uDF44\\uDF47\\uDF48\\uDF4B-\\uDF4D\\uDF50\\uDF57\\uDF5D-\\uDF63\\uDF66-\\uDF6C\\uDF70-\\uDF74]|\\uD805[\\uDC80-\\uDCC5\\uDCC7\\uDCD0-\\uDCD9\\uDD80-\\uDDB5\\uDDB8-\\uDDC0\\uDDD8-\\uDDDD\\uDE00-\\uDE40\\uDE44\\uDE50-\\uDE59\\uDE80-\\uDEB7\\uDEC0-\\uDEC9\\uDF00-\\uDF19\\uDF1D-\\uDF2B\\uDF30-\\uDF39]|\\uD806[\\uDCA0-\\uDCE9\\uDCFF\\uDEC0-\\uDEF8]|\\uD808[\\uDC00-\\uDF99]|\\uD809[\\uDC00-\\uDC6E\\uDC80-\\uDD43]|[\\uD80C\\uD840-\\uD868\\uD86A-\\uD86C\\uD86F-\\uD872][\\uDC00-\\uDFFF]|\\uD80D[\\uDC00-\\uDC2E]|\\uD811[\\uDC00-\\uDE46]|\\uD81A[\\uDC00-\\uDE38\\uDE40-\\uDE5E\\uDE60-\\uDE69\\uDED0-\\uDEED\\uDEF0-\\uDEF4\\uDF00-\\uDF36\\uDF40-\\uDF43\\uDF50-\\uDF59\\uDF63-\\uDF77\\uDF7D-\\uDF8F]|\\uD81B[\\uDF00-\\uDF44\\uDF50-\\uDF7E\\uDF8F-\\uDF9F]|\\uD82C[\\uDC00\\uDC01]|\\uD82F[\\uDC00-\\uDC6A\\uDC70-\\uDC7C\\uDC80-\\uDC88\\uDC90-\\uDC99\\uDC9D\\uDC9E]|\\uD834[\\uDD65-\\uDD69\\uDD6D-\\uDD72\\uDD7B-\\uDD82\\uDD85-\\uDD8B\\uDDAA-\\uDDAD\\uDE42-\\uDE44]|\\uD835[\\uDC00-\\uDC54\\uDC56-\\uDC9C\\uDC9E\\uDC9F\\uDCA2\\uDCA5\\uDCA6\\uDCA9-\\uDCAC\\uDCAE-\\uDCB9\\uDCBB\\uDCBD-\\uDCC3\\uDCC5-\\uDD05\\uDD07-\\uDD0A\\uDD0D-\\uDD14\\uDD16-\\uDD1C\\uDD1E-\\uDD39\\uDD3B-\\uDD3E\\uDD40-\\uDD44\\uDD46\\uDD4A-\\uDD50\\uDD52-\\uDEA5\\uDEA8-\\uDEC0\\uDEC2-\\uDEDA\\uDEDC-\\uDEFA\\uDEFC-\\uDF14\\uDF16-\\uDF34\\uDF36-\\uDF4E\\uDF50-\\uDF6E\\uDF70-\\uDF88\\uDF8A-\\uDFA8\\uDFAA-\\uDFC2\\uDFC4-\\uDFCB\\uDFCE-\\uDFFF]|\\uD836[\\uDE00-\\uDE36\\uDE3B-\\uDE6C\\uDE75\\uDE84\\uDE9B-\\uDE9F\\uDEA1-\\uDEAF]|\\uD83A[\\uDC00-\\uDCC4\\uDCD0-\\uDCD6]|\\uD83B[\\uDE00-\\uDE03\\uDE05-\\uDE1F\\uDE21\\uDE22\\uDE24\\uDE27\\uDE29-\\uDE32\\uDE34-\\uDE37\\uDE39\\uDE3B\\uDE42\\uDE47\\uDE49\\uDE4B\\uDE4D-\\uDE4F\\uDE51\\uDE52\\uDE54\\uDE57\\uDE59\\uDE5B\\uDE5D\\uDE5F\\uDE61\\uDE62\\uDE64\\uDE67-\\uDE6A\\uDE6C-\\uDE72\\uDE74-\\uDE77\\uDE79-\\uDE7C\\uDE7E\\uDE80-\\uDE89\\uDE8B-\\uDE9B\\uDEA1-\\uDEA3\\uDEA5-\\uDEA9\\uDEAB-\\uDEBB]|\\uD869[\\uDC00-\\uDED6\\uDF00-\\uDFFF]|\\uD86D[\\uDC00-\\uDF34\\uDF40-\\uDFFF]|\\uD86E[\\uDC00-\\uDC1D\\uDC20-\\uDFFF]|\\uD873[\\uDC00-\\uDEA1]|\\uD87E[\\uDC00-\\uDE1D]|\\uDB40[\\uDD00-\\uDDEF]/};t.Character={fromCodePoint:function(e){return e<65536?String.fromCharCode(e):String.fromCharCode(55296+(e-65536>>10))+String.fromCharCode(56320+(e-65536&1023))},isWhiteSpace:function(e){return 32===e||9===e||11===e||12===e||160===e||e>=5760&&[5760,8192,8193,8194,8195,8196,8197,8198,8199,8200,8201,8202,8239,8287,12288,65279].indexOf(e)>=0},isLineTerminator:function(e){return 10===e||13===e||8232===e||8233===e},isIdentifierStart:function(e){\nreturn 36===e||95===e||e>=65&&e<=90||e>=97&&e<=122||92===e||e>=128&&n.NonAsciiIdentifierStart.test(t.Character.fromCodePoint(e))},isIdentifierPart:function(e){return 36===e||95===e||e>=65&&e<=90||e>=97&&e<=122||e>=48&&e<=57||92===e||e>=128&&n.NonAsciiIdentifierPart.test(t.Character.fromCodePoint(e))},isDecimalDigit:function(e){return e>=48&&e<=57},isHexDigit:function(e){return e>=48&&e<=57||e>=65&&e<=70||e>=97&&e<=102},isOctalDigit:function(e){return e>=48&&e<=55}}},function(e,t,n){\"use strict\";var r=n(2),i=function(){function e(e){this.type=r.Syntax.ArrayExpression,this.elements=e}return e}();t.ArrayExpression=i;var o=function(){function e(e){this.type=r.Syntax.ArrayPattern,this.elements=e}return e}();t.ArrayPattern=o;var a=function(){function e(e,t,n){this.type=r.Syntax.ArrowFunctionExpression,this.id=null,this.params=e,this.body=t,this.generator=!1,this.expression=n}return e}();t.ArrowFunctionExpression=a;var s=function(){function e(e,t,n){this.type=r.Syntax.AssignmentExpression,this.operator=e,this.left=t,this.right=n}return e}();t.AssignmentExpression=s;var u=function(){function e(e,t){this.type=r.Syntax.AssignmentPattern,this.left=e,this.right=t}return e}();t.AssignmentPattern=u;var c=function(){function e(e,t,n){var i=\"||\"===e||\"&&\"===e;this.type=i?r.Syntax.LogicalExpression:r.Syntax.BinaryExpression,this.operator=e,this.left=t,this.right=n}return e}();t.BinaryExpression=c;var l=function(){function e(e){this.type=r.Syntax.BlockStatement,this.body=e}return e}();t.BlockStatement=l;var p=function(){function e(e){this.type=r.Syntax.BreakStatement,this.label=e}return e}();t.BreakStatement=p;var f=function(){function e(e,t){this.type=r.Syntax.CallExpression,this.callee=e,this.arguments=t}return e}();t.CallExpression=f;var h=function(){function e(e,t){this.type=r.Syntax.CatchClause,this.param=e,this.body=t}return e}();t.CatchClause=h;var d=function(){function e(e){this.type=r.Syntax.ClassBody,this.body=e}return e}();t.ClassBody=d;var m=function(){function e(e,t,n){this.type=r.Syntax.ClassDeclaration,this.id=e,this.superClass=t,this.body=n}return e}();t.ClassDeclaration=m;var v=function(){function e(e,t,n){this.type=r.Syntax.ClassExpression,this.id=e,this.superClass=t,this.body=n}return e}();t.ClassExpression=v;var y=function(){function e(e,t){this.type=r.Syntax.MemberExpression,this.computed=!0,this.object=e,this.property=t}return e}();t.ComputedMemberExpression=y;var g=function(){function e(e,t,n){this.type=r.Syntax.ConditionalExpression,this.test=e,this.consequent=t,this.alternate=n}return e}();t.ConditionalExpression=g;var _=function(){function e(e){this.type=r.Syntax.ContinueStatement,this.label=e}return e}();t.ContinueStatement=_;var b=function(){function e(){this.type=r.Syntax.DebuggerStatement}return e}();t.DebuggerStatement=b;var x=function(){function e(e,t){this.type=r.Syntax.ExpressionStatement,this.expression=e,this.directive=t}return e}();t.Directive=x;var w=function(){function e(e,t){this.type=r.Syntax.DoWhileStatement,this.body=e,this.test=t}return e}();t.DoWhileStatement=w;var k=function(){function e(){this.type=r.Syntax.EmptyStatement}return e}();t.EmptyStatement=k;var S=function(){function e(e){this.type=r.Syntax.ExportAllDeclaration,this.source=e}return e}();t.ExportAllDeclaration=S;var E=function(){function e(e){this.type=r.Syntax.ExportDefaultDeclaration,this.declaration=e}return e}();t.ExportDefaultDeclaration=E;var C=function(){function e(e,t,n){this.type=r.Syntax.ExportNamedDeclaration,this.declaration=e,this.specifiers=t,this.source=n}return e}();t.ExportNamedDeclaration=C;var A=function(){function e(e,t){this.type=r.Syntax.ExportSpecifier,this.exported=t,this.local=e}return e}();t.ExportSpecifier=A;var T=function(){function e(e){this.type=r.Syntax.ExpressionStatement,this.expression=e}return e}();t.ExpressionStatement=T;var D=function(){function e(e,t,n){this.type=r.Syntax.ForInStatement,this.left=e,this.right=t,this.body=n,this.each=!1}return e}();t.ForInStatement=D;var M=function(){function e(e,t,n){this.type=r.Syntax.ForOfStatement,this.left=e,this.right=t,this.body=n}return e}();t.ForOfStatement=M;var O=function(){function e(e,t,n,i){this.type=r.Syntax.ForStatement,this.init=e,this.test=t,this.update=n,this.body=i}return e}();t.ForStatement=O;var P=function(){function e(e,t,n,i){this.type=r.Syntax.FunctionDeclaration,this.id=e,this.params=t,this.body=n,this.generator=i,this.expression=!1}return e}();t.FunctionDeclaration=P;var I=function(){function e(e,t,n,i){this.type=r.Syntax.FunctionExpression,this.id=e,this.params=t,this.body=n,this.generator=i,this.expression=!1}return e}();t.FunctionExpression=I;var N=function(){function e(e){this.type=r.Syntax.Identifier,this.name=e}return e}();t.Identifier=N;var R=function(){function e(e,t,n){this.type=r.Syntax.IfStatement,this.test=e,this.consequent=t,this.alternate=n}return e}();t.IfStatement=R;var j=function(){function e(e,t){this.type=r.Syntax.ImportDeclaration,this.specifiers=e,this.source=t}return e}();t.ImportDeclaration=j;var F=function(){function e(e){this.type=r.Syntax.ImportDefaultSpecifier,this.local=e}return e}();t.ImportDefaultSpecifier=F;var B=function(){function e(e){this.type=r.Syntax.ImportNamespaceSpecifier,this.local=e}return e}();t.ImportNamespaceSpecifier=B;var L=function(){function e(e,t){this.type=r.Syntax.ImportSpecifier,this.local=e,this.imported=t}return e}();t.ImportSpecifier=L;var z=function(){function e(e,t){this.type=r.Syntax.LabeledStatement,this.label=e,this.body=t}return e}();t.LabeledStatement=z;var q=function(){function e(e,t){this.type=r.Syntax.Literal,this.value=e,this.raw=t}return e}();t.Literal=q;var U=function(){function e(e,t){this.type=r.Syntax.MetaProperty,this.meta=e,this.property=t}return e}();t.MetaProperty=U;var W=function(){function e(e,t,n,i,o){this.type=r.Syntax.MethodDefinition,this.key=e,this.computed=t,this.value=n,this.kind=i,this.static=o}return e}();t.MethodDefinition=W;var K=function(){function e(e,t){this.type=r.Syntax.NewExpression,this.callee=e,this.arguments=t}return e}();t.NewExpression=K;var V=function(){function e(e){this.type=r.Syntax.ObjectExpression,this.properties=e}return e}();t.ObjectExpression=V;var H=function(){function e(e){this.type=r.Syntax.ObjectPattern,this.properties=e}return e}();t.ObjectPattern=H;var J=function(){function e(e,t){this.type=r.Syntax.Program,this.body=e,this.sourceType=t}return e}();t.Program=J;var G=function(){function e(e,t,n,i,o,a){this.type=r.Syntax.Property,this.key=t,this.computed=n,this.value=i,this.kind=e,this.method=o,this.shorthand=a}return e}();t.Property=G;var X=function(){function e(e,t,n){this.type=r.Syntax.Literal,this.value=e,this.raw=t,this.regex=n}return e}();t.RegexLiteral=X;var Y=function(){function e(e){this.type=r.Syntax.RestElement,this.argument=e}return e}();t.RestElement=Y;var $=function(){function e(e){this.type=r.Syntax.ReturnStatement,this.argument=e}return e}();t.ReturnStatement=$;var Z=function(){function e(e){this.type=r.Syntax.SequenceExpression,this.expressions=e}return e}();t.SequenceExpression=Z;var Q=function(){function e(e){this.type=r.Syntax.SpreadElement,this.argument=e}return e}();t.SpreadElement=Q;var ee=function(){function e(e,t){this.type=r.Syntax.MemberExpression,this.computed=!1,this.object=e,this.property=t}return e}();t.StaticMemberExpression=ee;var te=function(){function e(){this.type=r.Syntax.Super}return e}();t.Super=te;var ne=function(){function e(e,t){this.type=r.Syntax.SwitchCase,this.test=e,this.consequent=t}return e}();t.SwitchCase=ne;var re=function(){function e(e,t){this.type=r.Syntax.SwitchStatement,this.discriminant=e,this.cases=t}return e}();t.SwitchStatement=re;var ie=function(){function e(e,t){this.type=r.Syntax.TaggedTemplateExpression,this.tag=e,this.quasi=t}return e}();t.TaggedTemplateExpression=ie;var oe=function(){function e(e,t){this.type=r.Syntax.TemplateElement,this.value=e,this.tail=t}return e}();t.TemplateElement=oe;var ae=function(){function e(e,t){this.type=r.Syntax.TemplateLiteral,this.quasis=e,this.expressions=t}return e}();t.TemplateLiteral=ae;var se=function(){function e(){this.type=r.Syntax.ThisExpression}return e}();t.ThisExpression=se;var ue=function(){function e(e){this.type=r.Syntax.ThrowStatement,this.argument=e}return e}();t.ThrowStatement=ue;var ce=function(){function e(e,t,n){this.type=r.Syntax.TryStatement,this.block=e,this.handler=t,this.finalizer=n}return e}();t.TryStatement=ce;var le=function(){function e(e,t){this.type=r.Syntax.UnaryExpression,this.operator=e,this.argument=t,this.prefix=!0}return e}();t.UnaryExpression=le;var pe=function(){function e(e,t,n){this.type=r.Syntax.UpdateExpression,this.operator=e,this.argument=t,this.prefix=n}return e}();t.UpdateExpression=pe;var fe=function(){function e(e,t){this.type=r.Syntax.VariableDeclaration,this.declarations=e,this.kind=t}return e}();t.VariableDeclaration=fe;var he=function(){function e(e,t){this.type=r.Syntax.VariableDeclarator,this.id=e,this.init=t}return e}();t.VariableDeclarator=he;var de=function(){function e(e,t){this.type=r.Syntax.WhileStatement,this.test=e,this.body=t}return e}();t.WhileStatement=de;var me=function(){function e(e,t){this.type=r.Syntax.WithStatement,this.object=e,this.body=t}return e}();t.WithStatement=me;var ve=function(){function e(e,t){this.type=r.Syntax.YieldExpression,this.argument=e,this.delegate=t}return e}();t.YieldExpression=ve},function(e,t,n){\"use strict\";function r(e){var t;switch(e.type){case l.JSXSyntax.JSXIdentifier:var n=e;t=n.name;break;case l.JSXSyntax.JSXNamespacedName:var i=e;t=r(i.namespace)+\":\"+r(i.name);break;case l.JSXSyntax.JSXMemberExpression:var o=e;t=r(o.object)+\".\"+r(o.property)}return t}var i,o=this&&this.__extends||function(e,t){function n(){this.constructor=e}for(var r in t)t.hasOwnProperty(r)&&(e[r]=t[r]);e.prototype=null===t?Object.create(t):(n.prototype=t.prototype,new n)},a=n(9),s=n(7),u=n(3),c=n(12),l=n(13),p=n(10),f=n(14);!function(e){e[e.Identifier=100]=\"Identifier\",e[e.Text=101]=\"Text\"}(i||(i={})),s.TokenName[i.Identifier]=\"JSXIdentifier\",s.TokenName[i.Text]=\"JSXText\";var h=function(e){function t(t,n,r){e.call(this,t,n,r)}return o(t,e),t.prototype.parsePrimaryExpression=function(){return this.match(\"<\")?this.parseJSXRoot():e.prototype.parsePrimaryExpression.call(this)},t.prototype.startJSX=function(){this.scanner.index=this.startMarker.index,this.scanner.lineNumber=this.startMarker.lineNumber,this.scanner.lineStart=this.startMarker.lineStart},t.prototype.finishJSX=function(){this.nextToken()},t.prototype.reenterJSX=function(){this.startJSX(),this.expectJSX(\"}\"),this.config.tokens&&this.tokens.pop()},t.prototype.createJSXNode=function(){return this.collectComments(),{index:this.scanner.index,line:this.scanner.lineNumber,column:this.scanner.index-this.scanner.lineStart}},t.prototype.createJSXChildNode=function(){return{index:this.scanner.index,line:this.scanner.lineNumber,column:this.scanner.index-this.scanner.lineStart}},t.prototype.scanXHTMLEntity=function(e){for(var t=\"&\",n=!0,r=!1,i=!1,o=!1;!this.scanner.eof()&&n&&!r;){var s=this.scanner.source[this.scanner.index];if(s===e)break;if(r=\";\"===s,t+=s,++this.scanner.index,!r)switch(t.length){case 2:i=\"#\"===s;break;case 3:i&&(o=\"x\"===s,n=o||a.Character.isDecimalDigit(s.charCodeAt(0)),i=i&&!o);break;default:n=n&&!(i&&!a.Character.isDecimalDigit(s.charCodeAt(0))),n=n&&!(o&&!a.Character.isHexDigit(s.charCodeAt(0)))}}if(n&&r&&t.length>2){var u=t.substr(1,t.length-2);i&&u.length>1?t=String.fromCharCode(parseInt(u.substr(1),10)):o&&u.length>2?t=String.fromCharCode(parseInt(\"0\"+u.substr(1),16)):i||o||!c.XHTMLEntities[u]||(t=c.XHTMLEntities[u])}return t},t.prototype.lexJSX=function(){var e=this.scanner.source.charCodeAt(this.scanner.index);if(60===e||62===e||47===e||58===e||61===e||123===e||125===e){var t=this.scanner.source[this.scanner.index++];return{type:s.Token.Punctuator,value:t,lineNumber:this.scanner.lineNumber,lineStart:this.scanner.lineStart,start:this.scanner.index-1,end:this.scanner.index}}if(34===e||39===e){for(var n=this.scanner.index,r=this.scanner.source[this.scanner.index++],o=\"\";!this.scanner.eof();){var u=this.scanner.source[this.scanner.index++];if(u===r)break;o+=\"&\"===u?this.scanXHTMLEntity(r):u}return{type:s.Token.StringLiteral,value:o,lineNumber:this.scanner.lineNumber,lineStart:this.scanner.lineStart,start:n,end:this.scanner.index}}if(46===e){var c=this.scanner.source.charCodeAt(this.scanner.index+1),l=this.scanner.source.charCodeAt(this.scanner.index+2),t=46===c&&46===l?\"...\":\".\",n=this.scanner.index;return this.scanner.index+=t.length,{type:s.Token.Punctuator,value:t,lineNumber:this.scanner.lineNumber,lineStart:this.scanner.lineStart,start:n,end:this.scanner.index}}if(96===e)return{type:s.Token.Template,lineNumber:this.scanner.lineNumber,lineStart:this.scanner.lineStart,start:this.scanner.index,end:this.scanner.index};if(a.Character.isIdentifierStart(e)&&92!==e){var n=this.scanner.index;for(++this.scanner.index;!this.scanner.eof();){var u=this.scanner.source.charCodeAt(this.scanner.index);if(a.Character.isIdentifierPart(u)&&92!==u)++this.scanner.index;else{if(45!==u)break;++this.scanner.index}}var p=this.scanner.source.slice(n,this.scanner.index);return{type:i.Identifier,value:p,lineNumber:this.scanner.lineNumber,lineStart:this.scanner.lineStart,start:n,end:this.scanner.index}}this.scanner.throwUnexpectedToken()},t.prototype.nextJSXToken=function(){this.collectComments(),this.startMarker.index=this.scanner.index,this.startMarker.lineNumber=this.scanner.lineNumber,this.startMarker.lineStart=this.scanner.lineStart;var e=this.lexJSX();return this.lastMarker.index=this.scanner.index,this.lastMarker.lineNumber=this.scanner.lineNumber,this.lastMarker.lineStart=this.scanner.lineStart,this.config.tokens&&this.tokens.push(this.convertToken(e)),e},t.prototype.nextJSXText=function(){this.startMarker.index=this.scanner.index,this.startMarker.lineNumber=this.scanner.lineNumber,this.startMarker.lineStart=this.scanner.lineStart;for(var e=this.scanner.index,t=\"\";!this.scanner.eof();){var n=this.scanner.source[this.scanner.index];if(\"{\"===n||\"<\"===n)break;++this.scanner.index,t+=n,a.Character.isLineTerminator(n.charCodeAt(0))&&(++this.scanner.lineNumber,\"\\r\"===n&&\"\\n\"===this.scanner.source[this.scanner.index]&&++this.scanner.index,this.scanner.lineStart=this.scanner.index)}this.lastMarker.index=this.scanner.index,this.lastMarker.lineNumber=this.scanner.lineNumber,this.lastMarker.lineStart=this.scanner.lineStart;var r={type:i.Text,value:t,lineNumber:this.scanner.lineNumber,lineStart:this.scanner.lineStart,start:e,end:this.scanner.index};return t.length>0&&this.config.tokens&&this.tokens.push(this.convertToken(r)),r},t.prototype.peekJSXToken=function(){var e=this.scanner.index,t=this.scanner.lineNumber,n=this.scanner.lineStart;this.scanner.scanComments();var r=this.lexJSX();return this.scanner.index=e,this.scanner.lineNumber=t,this.scanner.lineStart=n,r},t.prototype.expectJSX=function(e){var t=this.nextJSXToken();t.type===s.Token.Punctuator&&t.value===e||this.throwUnexpectedToken(t)},t.prototype.matchJSX=function(e){var t=this.peekJSXToken();return t.type===s.Token.Punctuator&&t.value===e},t.prototype.parseJSXIdentifier=function(){var e=this.createJSXNode(),t=this.nextJSXToken();return t.type!==i.Identifier&&this.throwUnexpectedToken(t),this.finalize(e,new f.JSXIdentifier(t.value))},t.prototype.parseJSXElementName=function(){var e=this.createJSXNode(),t=this.parseJSXIdentifier();if(this.matchJSX(\":\")){var n=t;this.expectJSX(\":\");var r=this.parseJSXIdentifier();t=this.finalize(e,new f.JSXNamespacedName(n,r))}else if(this.matchJSX(\".\"))for(;this.matchJSX(\".\");){var i=t;this.expectJSX(\".\");var o=this.parseJSXIdentifier();t=this.finalize(e,new f.JSXMemberExpression(i,o))}return t},t.prototype.parseJSXAttributeName=function(){var e,t=this.createJSXNode(),n=this.parseJSXIdentifier();if(this.matchJSX(\":\")){var r=n;this.expectJSX(\":\");var i=this.parseJSXIdentifier();e=this.finalize(t,new f.JSXNamespacedName(r,i))}else e=n;return e},t.prototype.parseJSXStringLiteralAttribute=function(){var e=this.createJSXNode(),t=this.nextJSXToken();t.type!==s.Token.StringLiteral&&this.throwUnexpectedToken(t);var n=this.getTokenRaw(t);return this.finalize(e,new p.Literal(t.value,n))},t.prototype.parseJSXExpressionAttribute=function(){var e=this.createJSXNode();this.expectJSX(\"{\"),this.finishJSX(),this.match(\"}\")&&this.tolerateError(\"JSX attributes must only be assigned a non-empty expression\");var t=this.parseAssignmentExpression();return this.reenterJSX(),this.finalize(e,new f.JSXExpressionContainer(t))},t.prototype.parseJSXAttributeValue=function(){return this.matchJSX(\"{\")?this.parseJSXExpressionAttribute():this.matchJSX(\"<\")?this.parseJSXElement():this.parseJSXStringLiteralAttribute()},t.prototype.parseJSXNameValueAttribute=function(){var e=this.createJSXNode(),t=this.parseJSXAttributeName(),n=null;return this.matchJSX(\"=\")&&(this.expectJSX(\"=\"),n=this.parseJSXAttributeValue()),this.finalize(e,new f.JSXAttribute(t,n))},t.prototype.parseJSXSpreadAttribute=function(){var e=this.createJSXNode();this.expectJSX(\"{\"),this.expectJSX(\"...\"),this.finishJSX();var t=this.parseAssignmentExpression();return this.reenterJSX(),this.finalize(e,new f.JSXSpreadAttribute(t))},t.prototype.parseJSXAttributes=function(){for(var e=[];!this.matchJSX(\"/\")&&!this.matchJSX(\">\");){var t=this.matchJSX(\"{\")?this.parseJSXSpreadAttribute():this.parseJSXNameValueAttribute();e.push(t)}return e},t.prototype.parseJSXOpeningElement=function(){var e=this.createJSXNode();this.expectJSX(\"<\");var t=this.parseJSXElementName(),n=this.parseJSXAttributes(),r=this.matchJSX(\"/\");return r&&this.expectJSX(\"/\"),this.expectJSX(\">\"),this.finalize(e,new f.JSXOpeningElement(t,r,n))},t.prototype.parseJSXBoundaryElement=function(){var e=this.createJSXNode();if(this.expectJSX(\"<\"),this.matchJSX(\"/\")){this.expectJSX(\"/\");var t=this.parseJSXElementName();return this.expectJSX(\">\"),this.finalize(e,new f.JSXClosingElement(t))}var n=this.parseJSXElementName(),r=this.parseJSXAttributes(),i=this.matchJSX(\"/\");return i&&this.expectJSX(\"/\"),this.expectJSX(\">\"),this.finalize(e,new f.JSXOpeningElement(n,i,r))},t.prototype.parseJSXEmptyExpression=function(){var e=this.createJSXChildNode();return this.collectComments(),this.lastMarker.index=this.scanner.index,this.lastMarker.lineNumber=this.scanner.lineNumber,this.lastMarker.lineStart=this.scanner.lineStart,this.finalize(e,new f.JSXEmptyExpression)},t.prototype.parseJSXExpressionContainer=function(){var e=this.createJSXNode();this.expectJSX(\"{\");var t;return this.matchJSX(\"}\")?(t=this.parseJSXEmptyExpression(),this.expectJSX(\"}\")):(this.finishJSX(),t=this.parseAssignmentExpression(),this.reenterJSX()),this.finalize(e,new f.JSXExpressionContainer(t))},t.prototype.parseJSXChildren=function(){for(var e=[];!this.scanner.eof();){var t=this.createJSXChildNode(),n=this.nextJSXText();if(n.start<n.end){var r=this.getTokenRaw(n),i=this.finalize(t,new f.JSXText(n.value,r));e.push(i)}if(\"{\"!==this.scanner.source[this.scanner.index])break;var o=this.parseJSXExpressionContainer();e.push(o)}return e},t.prototype.parseComplexJSXElement=function(e){for(var t=[];!this.scanner.eof();){e.children=e.children.concat(this.parseJSXChildren());var n=this.createJSXChildNode(),i=this.parseJSXBoundaryElement();if(i.type===l.JSXSyntax.JSXOpeningElement){var o=i;if(o.selfClosing){var a=this.finalize(n,new f.JSXElement(o,[],null));e.children.push(a)}else t.push(e),e={node:n,opening:o,closing:null,children:[]}}if(i.type===l.JSXSyntax.JSXClosingElement){e.closing=i;var s=r(e.opening.name),u=r(e.closing.name);if(s!==u&&this.tolerateError(\"Expected corresponding JSX closing tag for %0\",s),!(t.length>0))break;var a=this.finalize(e.node,new f.JSXElement(e.opening,e.children,e.closing));e=t.pop(),e.children.push(a)}}return e},t.prototype.parseJSXElement=function(){var e=this.createJSXNode(),t=this.parseJSXOpeningElement(),n=[],r=null;if(!t.selfClosing){var i=this.parseComplexJSXElement({node:e,opening:t,closing:r,children:n});n=i.children,r=i.closing}return this.finalize(e,new f.JSXElement(t,n,r))},t.prototype.parseJSXRoot=function(){this.config.tokens&&this.tokens.pop(),this.startJSX();var e=this.parseJSXElement();return this.finishJSX(),e},t}(u.Parser);t.JSXParser=h},function(e,t){\"use strict\";t.XHTMLEntities={quot:'\"',amp:\"&\",apos:\"'\",gt:\">\",nbsp:\" \",iexcl:\"¡\",cent:\"¢\",pound:\"£\",curren:\"¤\",yen:\"¥\",brvbar:\"¦\",sect:\"§\",uml:\"¨\",copy:\"©\",ordf:\"ª\",laquo:\"«\",not:\"¬\",shy:\"­\",reg:\"®\",macr:\"¯\",deg:\"°\",plusmn:\"±\",sup2:\"²\",sup3:\"³\",acute:\"´\",micro:\"µ\",para:\"¶\",middot:\"·\",cedil:\"¸\",sup1:\"¹\",ordm:\"º\",raquo:\"»\",frac14:\"¼\",frac12:\"½\",frac34:\"¾\",iquest:\"¿\",Agrave:\"À\",Aacute:\"Á\",Acirc:\"Â\",Atilde:\"Ã\",Auml:\"Ä\",Aring:\"Å\",AElig:\"Æ\",Ccedil:\"Ç\",Egrave:\"È\",Eacute:\"É\",Ecirc:\"Ê\",Euml:\"Ë\",Igrave:\"Ì\",Iacute:\"Í\",Icirc:\"Î\",Iuml:\"Ï\",ETH:\"Ð\",Ntilde:\"Ñ\",Ograve:\"Ò\",Oacute:\"Ó\",Ocirc:\"Ô\",Otilde:\"Õ\",Ouml:\"Ö\",times:\"×\",Oslash:\"Ø\",Ugrave:\"Ù\",Uacute:\"Ú\",Ucirc:\"Û\",Uuml:\"Ü\",Yacute:\"Ý\",THORN:\"Þ\",szlig:\"ß\",agrave:\"à\",aacute:\"á\",acirc:\"â\",atilde:\"ã\",auml:\"ä\",aring:\"å\",aelig:\"æ\",ccedil:\"ç\",egrave:\"è\",eacute:\"é\",ecirc:\"ê\",euml:\"ë\",igrave:\"ì\",iacute:\"í\",icirc:\"î\",iuml:\"ï\",eth:\"ð\",ntilde:\"ñ\",ograve:\"ò\",oacute:\"ó\",ocirc:\"ô\",otilde:\"õ\",ouml:\"ö\",divide:\"÷\",oslash:\"ø\",ugrave:\"ù\",uacute:\"ú\",ucirc:\"û\",uuml:\"ü\",yacute:\"ý\",thorn:\"þ\",yuml:\"ÿ\",OElig:\"Œ\",oelig:\"œ\",Scaron:\"Š\",scaron:\"š\",Yuml:\"Ÿ\",fnof:\"ƒ\",circ:\"ˆ\",tilde:\"˜\",Alpha:\"Α\",Beta:\"Β\",Gamma:\"Γ\",Delta:\"Δ\",Epsilon:\"Ε\",Zeta:\"Ζ\",Eta:\"Η\",Theta:\"Θ\",Iota:\"Ι\",Kappa:\"Κ\",Lambda:\"Λ\",Mu:\"Μ\",Nu:\"Ν\",Xi:\"Ξ\",Omicron:\"Ο\",Pi:\"Π\",Rho:\"Ρ\",Sigma:\"Σ\",Tau:\"Τ\",Upsilon:\"Υ\",Phi:\"Φ\",Chi:\"Χ\",Psi:\"Ψ\",Omega:\"Ω\",alpha:\"α\",beta:\"β\",gamma:\"γ\",delta:\"δ\",epsilon:\"ε\",zeta:\"ζ\",eta:\"η\",theta:\"θ\",iota:\"ι\",kappa:\"κ\",lambda:\"λ\",mu:\"μ\",nu:\"ν\",xi:\"ξ\",omicron:\"ο\",pi:\"π\",rho:\"ρ\",sigmaf:\"ς\",sigma:\"σ\",tau:\"τ\",upsilon:\"υ\",phi:\"φ\",chi:\"χ\",psi:\"ψ\",omega:\"ω\",thetasym:\"ϑ\",upsih:\"ϒ\",piv:\"ϖ\",ensp:\" \",emsp:\" \",thinsp:\" \",zwnj:\"‌\",zwj:\"‍\",lrm:\"‎\",rlm:\"‏\",ndash:\"–\",mdash:\"—\",lsquo:\"‘\",rsquo:\"’\",sbquo:\"‚\",ldquo:\"“\",rdquo:\"”\",bdquo:\"„\",dagger:\"†\",Dagger:\"‡\",bull:\"•\",hellip:\"…\",permil:\"‰\",prime:\"′\",Prime:\"″\",lsaquo:\"‹\",rsaquo:\"›\",oline:\"‾\",frasl:\"⁄\",euro:\"€\",image:\"ℑ\",weierp:\"℘\",real:\"ℜ\",trade:\"™\",alefsym:\"ℵ\",larr:\"←\",uarr:\"↑\",rarr:\"→\",darr:\"↓\",harr:\"↔\",crarr:\"↵\",lArr:\"⇐\",uArr:\"⇑\",rArr:\"⇒\",dArr:\"⇓\",hArr:\"⇔\",forall:\"∀\",part:\"∂\",exist:\"∃\",empty:\"∅\",nabla:\"∇\",isin:\"∈\",notin:\"∉\",ni:\"∋\",prod:\"∏\",sum:\"∑\",minus:\"−\",lowast:\"∗\",radic:\"√\",prop:\"∝\",infin:\"∞\",ang:\"∠\",and:\"∧\",or:\"∨\",cap:\"∩\",cup:\"∪\",int:\"∫\",there4:\"∴\",sim:\"∼\",cong:\"≅\",asymp:\"≈\",ne:\"≠\",equiv:\"≡\",le:\"≤\",ge:\"≥\",sub:\"⊂\",sup:\"⊃\",nsub:\"⊄\",sube:\"⊆\",supe:\"⊇\",oplus:\"⊕\",otimes:\"⊗\",perp:\"⊥\",sdot:\"⋅\",lceil:\"⌈\",rceil:\"⌉\",lfloor:\"⌊\",rfloor:\"⌋\",loz:\"◊\",spades:\"♠\",clubs:\"♣\",hearts:\"♥\",diams:\"♦\",lang:\"⟨\",rang:\"⟩\"}},function(e,t){\"use strict\";t.JSXSyntax={JSXAttribute:\"JSXAttribute\",JSXClosingElement:\"JSXClosingElement\",JSXElement:\"JSXElement\",JSXEmptyExpression:\"JSXEmptyExpression\",JSXExpressionContainer:\"JSXExpressionContainer\",JSXIdentifier:\"JSXIdentifier\",JSXMemberExpression:\"JSXMemberExpression\",JSXNamespacedName:\"JSXNamespacedName\",JSXOpeningElement:\"JSXOpeningElement\",JSXSpreadAttribute:\"JSXSpreadAttribute\",JSXText:\"JSXText\"}},function(e,t,n){\"use strict\";var r=n(13),i=function(){function e(e){this.type=r.JSXSyntax.JSXClosingElement,this.name=e}return e}();t.JSXClosingElement=i;var o=function(){function e(e,t,n){this.type=r.JSXSyntax.JSXElement,this.openingElement=e,this.children=t,this.closingElement=n}return e}();t.JSXElement=o;var a=function(){function e(){this.type=r.JSXSyntax.JSXEmptyExpression}return e}();t.JSXEmptyExpression=a;var s=function(){function e(e){this.type=r.JSXSyntax.JSXExpressionContainer,this.expression=e}return e}();t.JSXExpressionContainer=s;var u=function(){function e(e){this.type=r.JSXSyntax.JSXIdentifier,this.name=e}return e}();t.JSXIdentifier=u;var c=function(){function e(e,t){this.type=r.JSXSyntax.JSXMemberExpression,this.object=e,this.property=t}return e}();t.JSXMemberExpression=c;var l=function(){function e(e,t){this.type=r.JSXSyntax.JSXAttribute,this.name=e,this.value=t}return e}();t.JSXAttribute=l;var p=function(){function e(e,t){this.type=r.JSXSyntax.JSXNamespacedName,this.namespace=e,this.name=t}return e}();t.JSXNamespacedName=p;var f=function(){function e(e,t,n){this.type=r.JSXSyntax.JSXOpeningElement,this.name=e,this.selfClosing=t,this.attributes=n}return e}();t.JSXOpeningElement=f;var h=function(){function e(e){this.type=r.JSXSyntax.JSXSpreadAttribute,this.argument=e}return e}();t.JSXSpreadAttribute=h;var d=function(){function e(e,t){this.type=r.JSXSyntax.JSXText,this.value=e,this.raw=t}return e}();t.JSXText=d},function(e,t,n){\"use strict\";var r=n(8),i=n(6),o=n(7),a=function(){function e(){this.values=[],this.curly=this.paren=-1}return e.prototype.beforeFunctionExpression=function(e){return[\"(\",\"{\",\"[\",\"in\",\"typeof\",\"instanceof\",\"new\",\"return\",\"case\",\"delete\",\"throw\",\"void\",\"=\",\"+=\",\"-=\",\"*=\",\"**=\",\"/=\",\"%=\",\"<<=\",\">>=\",\">>>=\",\"&=\",\"|=\",\"^=\",\",\",\"+\",\"-\",\"*\",\"**\",\"/\",\"%\",\"++\",\"--\",\"<<\",\">>\",\">>>\",\"&\",\"|\",\"^\",\"!\",\"~\",\"&&\",\"||\",\"?\",\":\",\"===\",\"==\",\">=\",\"<=\",\"<\",\">\",\"!=\",\"!==\"].indexOf(e)>=0},e.prototype.isRegexStart=function(){var e=this.values[this.values.length-1],t=null!==e;switch(e){case\"this\":case\"]\":t=!1;break;case\")\":var n=this.values[this.paren-1];t=\"if\"===n||\"while\"===n||\"for\"===n||\"with\"===n;break;case\"}\":if(t=!1,\"function\"===this.values[this.curly-3]){var r=this.values[this.curly-4];t=!!r&&!this.beforeFunctionExpression(r)}else if(\"function\"===this.values[this.curly-4]){var i=this.values[this.curly-5];t=!i||!this.beforeFunctionExpression(i)}}return t},e.prototype.push=function(e){e.type===o.Token.Punctuator||e.type===o.Token.Keyword?(\"{\"===e.value?this.curly=this.values.length:\"(\"===e.value&&(this.paren=this.values.length),this.values.push(e.value)):this.values.push(null)},e}(),s=function(){function e(e,t){this.errorHandler=new i.ErrorHandler,this.errorHandler.tolerant=!!t&&(\"boolean\"==typeof t.tolerant&&t.tolerant),this.scanner=new r.Scanner(e,this.errorHandler),this.scanner.trackComment=!!t&&(\"boolean\"==typeof t.comment&&t.comment),this.trackRange=!!t&&(\"boolean\"==typeof t.range&&t.range),this.trackLoc=!!t&&(\"boolean\"==typeof t.loc&&t.loc),this.buffer=[],this.reader=new a}return e.prototype.errors=function(){return this.errorHandler.errors},e.prototype.getNextToken=function(){if(0===this.buffer.length){var e=this.scanner.scanComments();if(this.scanner.trackComment)for(var t=0;t<e.length;++t){var n=e[t],r=void 0,i=this.scanner.source.slice(n.slice[0],n.slice[1]);r={type:n.multiLine?\"BlockComment\":\"LineComment\",value:i},this.trackRange&&(r.range=n.range),this.trackLoc&&(r.loc=n.loc),this.buffer.push(r)}if(!this.scanner.eof()){var a=void 0;this.trackLoc&&(a={start:{line:this.scanner.lineNumber,column:this.scanner.index-this.scanner.lineStart},end:{}});var s=void 0;s=\"/\"===this.scanner.source[this.scanner.index]?this.reader.isRegexStart()?this.scanner.scanRegExp():this.scanner.scanPunctuator():this.scanner.lex(),this.reader.push(s);var u=void 0;u={type:o.TokenName[s.type],value:this.scanner.source.slice(s.start,s.end)},this.trackRange&&(u.range=[s.start,s.end]),this.trackLoc&&(a.end={line:this.scanner.lineNumber,column:this.scanner.index-this.scanner.lineStart},u.loc=a),s.regex&&(u.regex=s.regex),this.buffer.push(u)}}return this.buffer.shift()},e}();t.Tokenizer=s}])})},function(e,t,n){\"use strict\";function r(e,t){var n,r,i,o,a,s,u;if(null===t)return{};for(n={},r=Object.keys(t),i=0,o=r.length;i<o;i+=1)a=r[i],s=String(t[a]),\"!!\"===a.slice(0,2)&&(a=\"tag:yaml.org,2002:\"+a.slice(2)),u=e.compiledTypeMap.fallback[a],u&&R.call(u.styleAliases,s)&&(s=u.styleAliases[s]),n[a]=s;return n}function i(e){var t,n,r;if(t=e.toString(16).toUpperCase(),e<=255)n=\"x\",r=2;else if(e<=65535)n=\"u\",r=4;else{if(!(e<=4294967295))throw new O(\"code point within a string may not be greater than 0xFFFFFFFF\");n=\"U\",r=8}return\"\\\\\"+n+M.repeat(\"0\",r-t.length)+t}function o(e){this.schema=e.schema||P,this.indent=Math.max(1,e.indent||2),this.skipInvalid=e.skipInvalid||!1,this.flowLevel=M.isNothing(e.flowLevel)?-1:e.flowLevel,this.styleMap=r(this.schema,e.styles||null),this.sortKeys=e.sortKeys||!1,this.lineWidth=e.lineWidth||80,this.noRefs=e.noRefs||!1,this.noCompatMode=e.noCompatMode||!1,this.implicitTypes=this.schema.compiledImplicit,this.explicitTypes=this.schema.compiledExplicit,this.tag=null,this.result=\"\",this.duplicates=[],this.usedDuplicates=null}function a(e,t){for(var n,r=M.repeat(\" \",t),i=0,o=-1,a=\"\",s=e.length;i<s;)o=e.indexOf(\"\\n\",i),o===-1?(n=e.slice(i),i=s):(n=e.slice(i,o+1),i=o+1),n.length&&\"\\n\"!==n&&(a+=r),a+=n;return a}function s(e,t){return\"\\n\"+M.repeat(\" \",e.indent*t)}function u(e,t){var n,r,i;for(n=0,r=e.implicitTypes.length;n<r;n+=1)if(i=e.implicitTypes[n],i.resolve(t))return!0;return!1}function c(e){return e===B||e===j}function l(e){return 32<=e&&e<=126||161<=e&&e<=55295&&8232!==e&&8233!==e||57344<=e&&e<=65533&&65279!==e||65536<=e&&e<=1114111}function p(e){return l(e)&&65279!==e&&e!==H&&e!==Z&&e!==Q&&e!==te&&e!==re&&e!==G&&e!==q}function f(e){return l(e)&&65279!==e&&!c(e)&&e!==J&&e!==Y&&e!==G&&e!==H&&e!==Z&&e!==Q&&e!==te&&e!==re&&e!==q&&e!==W&&e!==V&&e!==L&&e!==ne&&e!==X&&e!==K&&e!==z&&e!==U&&e!==$&&e!==ee}function h(e,t,n,r,i){var o,a,s=!1,u=!1,h=r!==-1,d=-1,m=f(e.charCodeAt(0))&&!c(e.charCodeAt(e.length-1));if(t)for(o=0;o<e.length;o++){if(a=e.charCodeAt(o),!l(a))return le;m=m&&p(a)}else{for(o=0;o<e.length;o++){if(a=e.charCodeAt(o),a===F)s=!0,h&&(u=u||o-d-1>r&&\" \"!==e[d+1],d=o);else if(!l(a))return le;m=m&&p(a)}u=u||h&&o-d-1>r&&\" \"!==e[d+1]}return s||u?\" \"===e[0]&&n>9?le:u?ce:ue:m&&!i(e)?ae:se}function d(e,t,n,r){e.dump=function(){function i(t){return u(e,t)}if(0===t.length)return\"''\";if(!e.noCompatMode&&oe.indexOf(t)!==-1)return\"'\"+t+\"'\";var o=e.indent*Math.max(1,n),s=e.lineWidth===-1?-1:Math.max(Math.min(e.lineWidth,40),e.lineWidth-o),c=r||e.flowLevel>-1&&n>=e.flowLevel;switch(h(t,c,e.indent,s,i)){case ae:return t;case se:return\"'\"+t.replace(/'/g,\"''\")+\"'\";case ue:return\"|\"+m(t,e.indent)+v(a(t,o));case ce:return\">\"+m(t,e.indent)+v(a(y(t,s),o));case le:return'\"'+_(t,s)+'\"';default:throw new O(\"impossible error: invalid scalar style\")}}()}function m(e,t){var n=\" \"===e[0]?String(t):\"\",r=\"\\n\"===e[e.length-1],i=r&&(\"\\n\"===e[e.length-2]||\"\\n\"===e),o=i?\"+\":r?\"\":\"-\";return n+o+\"\\n\"}function v(e){return\"\\n\"===e[e.length-1]?e.slice(0,-1):e}function y(e,t){for(var n,r,i=/(\\n+)([^\\n]*)/g,o=function(){var n=e.indexOf(\"\\n\");return n=n!==-1?n:e.length,i.lastIndex=n,g(e.slice(0,n),t)}(),a=\"\\n\"===e[0]||\" \"===e[0];r=i.exec(e);){var s=r[1],u=r[2];n=\" \"===u[0],o+=s+(a||n||\"\"===u?\"\":\"\\n\")+g(u,t),a=n}return o}function g(e,t){if(\"\"===e||\" \"===e[0])return e;for(var n,r,i=/ [^ ]/g,o=0,a=0,s=0,u=\"\";n=i.exec(e);)s=n.index,s-o>t&&(r=a>o?a:s,u+=\"\\n\"+e.slice(o,r),o=r+1),a=s;return u+=\"\\n\",u+=e.length-o>t&&a>o?e.slice(o,a)+\"\\n\"+e.slice(a+1):e.slice(o),u.slice(1)}function _(e){for(var t,n,r=\"\",o=0;o<e.length;o++)t=e.charCodeAt(o),n=ie[t],r+=!n&&l(t)?e[o]:n||i(t);return r}function b(e,t,n){var r,i,o=\"\",a=e.tag;for(r=0,i=n.length;r<i;r+=1)E(e,t,n[r],!1,!1)&&(0!==r&&(o+=\", \"),o+=e.dump);e.tag=a,e.dump=\"[\"+o+\"]\"}function x(e,t,n,r){var i,o,a=\"\",u=e.tag;for(i=0,o=n.length;i<o;i+=1)E(e,t+1,n[i],!0,!0)&&(r&&0===i||(a+=s(e,t)),a+=e.dump&&F===e.dump.charCodeAt(0)?\"-\":\"- \",a+=e.dump);e.tag=u,e.dump=a||\"[]\"}function w(e,t,n){var r,i,o,a,s,u=\"\",c=e.tag,l=Object.keys(n);for(r=0,i=l.length;r<i;r+=1)s=\"\",0!==r&&(s+=\", \"),o=l[r],a=n[o],E(e,t,o,!1,!1)&&(e.dump.length>1024&&(s+=\"? \"),s+=e.dump+\": \",E(e,t,a,!1,!1)&&(s+=e.dump,u+=s));e.tag=c,e.dump=\"{\"+u+\"}\"}function k(e,t,n,r){var i,o,a,u,c,l,p=\"\",f=e.tag,h=Object.keys(n);if(e.sortKeys===!0)h.sort();else if(\"function\"==typeof e.sortKeys)h.sort(e.sortKeys);else if(e.sortKeys)throw new O(\"sortKeys must be a boolean or a function\");for(i=0,o=h.length;i<o;i+=1)l=\"\",r&&0===i||(l+=s(e,t)),a=h[i],u=n[a],E(e,t+1,a,!0,!0,!0)&&(c=null!==e.tag&&\"?\"!==e.tag||e.dump&&e.dump.length>1024,c&&(l+=e.dump&&F===e.dump.charCodeAt(0)?\"?\":\"? \"),l+=e.dump,c&&(l+=s(e,t)),E(e,t+1,u,!0,c)&&(l+=e.dump&&F===e.dump.charCodeAt(0)?\":\":\": \",l+=e.dump,p+=l));e.tag=f,\ne.dump=p||\"{}\"}function S(e,t,n){var r,i,o,a,s,u;for(i=n?e.explicitTypes:e.implicitTypes,o=0,a=i.length;o<a;o+=1)if(s=i[o],(s.instanceOf||s.predicate)&&(!s.instanceOf||\"object\"==typeof t&&t instanceof s.instanceOf)&&(!s.predicate||s.predicate(t))){if(e.tag=n?s.tag:\"?\",s.represent){if(u=e.styleMap[s.tag]||s.defaultStyle,\"[object Function]\"===N.call(s.represent))r=s.represent(t,u);else{if(!R.call(s.represent,u))throw new O(\"!<\"+s.tag+'> tag resolver accepts not \"'+u+'\" style');r=s.represent[u](t,u)}e.dump=r}return!0}return!1}function E(e,t,n,r,i,o){e.tag=null,e.dump=n,S(e,n,!1)||S(e,n,!0);var a=N.call(e.dump);r&&(r=e.flowLevel<0||e.flowLevel>t);var s,u,c=\"[object Object]\"===a||\"[object Array]\"===a;if(c&&(s=e.duplicates.indexOf(n),u=s!==-1),(null!==e.tag&&\"?\"!==e.tag||u||2!==e.indent&&t>0)&&(i=!1),u&&e.usedDuplicates[s])e.dump=\"*ref_\"+s;else{if(c&&u&&!e.usedDuplicates[s]&&(e.usedDuplicates[s]=!0),\"[object Object]\"===a)r&&0!==Object.keys(e.dump).length?(k(e,t,e.dump,i),u&&(e.dump=\"&ref_\"+s+e.dump)):(w(e,t,e.dump),u&&(e.dump=\"&ref_\"+s+\" \"+e.dump));else if(\"[object Array]\"===a)r&&0!==e.dump.length?(x(e,t,e.dump,i),u&&(e.dump=\"&ref_\"+s+e.dump)):(b(e,t,e.dump),u&&(e.dump=\"&ref_\"+s+\" \"+e.dump));else{if(\"[object String]\"!==a){if(e.skipInvalid)return!1;throw new O(\"unacceptable kind of an object to dump \"+a)}\"?\"!==e.tag&&d(e,e.dump,t,o)}null!==e.tag&&\"?\"!==e.tag&&(e.dump=\"!<\"+e.tag+\"> \"+e.dump)}return!0}function C(e,t){var n,r,i=[],o=[];for(A(e,i,o),n=0,r=o.length;n<r;n+=1)t.duplicates.push(i[o[n]]);t.usedDuplicates=new Array(r)}function A(e,t,n){var r,i,o;if(null!==e&&\"object\"==typeof e)if(i=t.indexOf(e),i!==-1)n.indexOf(i)===-1&&n.push(i);else if(t.push(e),Array.isArray(e))for(i=0,o=e.length;i<o;i+=1)A(e[i],t,n);else for(r=Object.keys(e),i=0,o=r.length;i<o;i+=1)A(e[r[i]],t,n)}function T(e,t){t=t||{};var n=new o(t);return n.noRefs||C(e,n),E(n,0,e,!0,!0)?n.dump+\"\\n\":\"\"}function D(e,t){return T(e,M.extend({schema:I},t))}var M=n(451),O=n(452),P=n(473),I=n(454),N=Object.prototype.toString,R=Object.prototype.hasOwnProperty,j=9,F=10,B=32,L=33,z=34,q=35,U=37,W=38,K=39,V=42,H=44,J=45,G=58,X=62,Y=63,$=64,Z=91,Q=93,ee=96,te=123,ne=124,re=125,ie={};ie[0]=\"\\\\0\",ie[7]=\"\\\\a\",ie[8]=\"\\\\b\",ie[9]=\"\\\\t\",ie[10]=\"\\\\n\",ie[11]=\"\\\\v\",ie[12]=\"\\\\f\",ie[13]=\"\\\\r\",ie[27]=\"\\\\e\",ie[34]='\\\\\"',ie[92]=\"\\\\\\\\\",ie[133]=\"\\\\N\",ie[160]=\"\\\\_\",ie[8232]=\"\\\\L\",ie[8233]=\"\\\\P\";var oe=[\"y\",\"Y\",\"yes\",\"Yes\",\"YES\",\"on\",\"On\",\"ON\",\"n\",\"N\",\"no\",\"No\",\"NO\",\"off\",\"Off\",\"OFF\"],ae=1,se=2,ue=3,ce=4,le=5;e.exports.dump=T,e.exports.safeDump=D},function(e,t,n){(function(t){\"use strict\";function r(e){e=e||t.location||{};var n,r={},i=typeof e;if(\"blob:\"===e.protocol)r=new a(unescape(e.pathname),{});else if(\"string\"===i){r=new a(e,{});for(n in d)delete r[n]}else if(\"object\"===i){for(n in e)n in d||(r[n]=e[n]);void 0===r.slashes&&(r.slashes=f.test(e.href))}return r}function i(e){var t=p.exec(e);return{protocol:t[1]?t[1].toLowerCase():\"\",slashes:!!t[2],rest:t[3]}}function o(e,t){for(var n=(t||\"/\").split(\"/\").slice(0,-1).concat(e.split(\"/\")),r=n.length,i=n[r-1],o=!1,a=0;r--;)\".\"===n[r]?n.splice(r,1):\"..\"===n[r]?(n.splice(r,1),a++):a&&(0===r&&(o=!0),n.splice(r,1),a--);return o&&n.unshift(\"\"),\".\"!==i&&\"..\"!==i||n.push(\"\"),n.join(\"/\")}function a(e,t,n){if(!(this instanceof a))return new a(e,t,n);var s,u,p,f,d,m,v=h.slice(),y=typeof t,g=this,_=0;for(\"object\"!==y&&\"string\"!==y&&(n=t,t=null),n&&\"function\"!=typeof n&&(n=l.parse),t=r(t),u=i(e||\"\"),s=!u.protocol&&!u.slashes,g.slashes=u.slashes||s&&t.slashes,g.protocol=u.protocol||t.protocol||\"\",e=u.rest,u.slashes||(v[2]=[/(.*)/,\"pathname\"]);_<v.length;_++)f=v[_],p=f[0],m=f[1],p!==p?g[m]=e:\"string\"==typeof p?~(d=e.indexOf(p))&&(\"number\"==typeof f[2]?(g[m]=e.slice(0,d),e=e.slice(d+f[2])):(g[m]=e.slice(d),e=e.slice(0,d))):(d=p.exec(e))&&(g[m]=d[1],e=e.slice(0,d.index)),g[m]=g[m]||(s&&f[3]?t[m]||\"\":\"\"),f[4]&&(g[m]=g[m].toLowerCase());n&&(g.query=n(g.query)),s&&t.slashes&&\"/\"!==g.pathname.charAt(0)&&(\"\"!==g.pathname||\"\"!==t.pathname)&&(g.pathname=o(g.pathname,t.pathname)),c(g.port,g.protocol)||(g.host=g.hostname,g.port=\"\"),g.username=g.password=\"\",g.auth&&(f=g.auth.split(\":\"),g.username=f[0]||\"\",g.password=f[1]||\"\"),g.origin=g.protocol&&g.host&&\"file:\"!==g.protocol?g.protocol+\"//\"+g.host:\"null\",g.href=g.toString()}function s(e,t,n){var r=this;switch(e){case\"query\":\"string\"==typeof t&&t.length&&(t=(n||l.parse)(t)),r[e]=t;break;case\"port\":r[e]=t,c(t,r.protocol)?t&&(r.host=r.hostname+\":\"+t):(r.host=r.hostname,r[e]=\"\");break;case\"hostname\":r[e]=t,r.port&&(t+=\":\"+r.port),r.host=t;break;case\"host\":r[e]=t,/:\\d+$/.test(t)?(t=t.split(\":\"),r.port=t.pop(),r.hostname=t.join(\":\")):(r.hostname=t,r.port=\"\");break;case\"protocol\":r.protocol=t.toLowerCase(),r.slashes=!n;break;case\"pathname\":r.pathname=t.length&&\"/\"!==t.charAt(0)?\"/\"+t:t;break;default:r[e]=t}for(var i=0;i<h.length;i++){var o=h[i];o[4]&&(r[o[1]]=r[o[1]].toLowerCase())}return r.origin=r.protocol&&r.host&&\"file:\"!==r.protocol?r.protocol+\"//\"+r.host:\"null\",r.href=r.toString(),r}function u(e){e&&\"function\"==typeof e||(e=l.stringify);var t,n=this,r=n.protocol;r&&\":\"!==r.charAt(r.length-1)&&(r+=\":\");var i=r+(n.slashes?\"//\":\"\");return n.username&&(i+=n.username,n.password&&(i+=\":\"+n.password),i+=\"@\"),i+=n.host+n.pathname,t=\"object\"==typeof n.query?e(n.query):n.query,t&&(i+=\"?\"!==t.charAt(0)?\"?\"+t:t),n.hash&&(i+=n.hash),i}var c=n(480),l=n(481),p=/^([a-z][a-z0-9.+-]*:)?(\\/\\/)?([\\S\\s]*)/i,f=/^[A-Za-z][A-Za-z0-9+-.]*:\\/\\//,h=[[\"#\",\"hash\"],[\"?\",\"query\"],[\"/\",\"pathname\"],[\"@\",\"auth\",1],[NaN,\"host\",void 0,1,1],[/:(\\d+)$/,\"port\",void 0,1],[NaN,\"hostname\",void 0,1,1]],d={hash:1,query:1};a.prototype={set:s,toString:u},a.extractProtocol=i,a.location=r,a.qs=l,e.exports=a}).call(t,function(){return this}())},function(e,t){\"use strict\";e.exports=function(e,t){if(t=t.split(\":\")[0],e=+e,!e)return!1;switch(t){case\"http\":case\"ws\":return 80!==e;case\"https\":case\"wss\":return 443!==e;case\"ftp\":return 21!==e;case\"gopher\":return 70!==e;case\"file\":return!1}return 0!==e}},function(e,t){\"use strict\";function n(e){return decodeURIComponent(e.replace(/\\+/g,\" \"))}function r(e){for(var t,r=/([^=?&]+)=?([^&]*)/g,i={};t=r.exec(e);i[n(t[1])]=n(t[2]));return i}function i(e,t){t=t||\"\";var n=[];\"string\"!=typeof t&&(t=\"?\");for(var r in e)o.call(e,r)&&n.push(encodeURIComponent(r)+\"=\"+encodeURIComponent(e[r]));return n.length?t+n.join(\"&\"):\"\"}var o=Object.prototype.hasOwnProperty;t.stringify=i,t.parse=r},function(e,t,n){\"use strict\";function r(e){return e&&e.__esModule?e:{default:e}}function i(e,t,n){var r=b(e).getIn([\"paths\"].concat((0,f.default)(t),[\"parameters\"]),(0,m.fromJS)([]));return r.filter(function(e){return m.Map.isMap(e)&&e.get(\"name\")===n}).first()}function o(e,t,n){var r=b(e).getIn([\"paths\"].concat((0,f.default)(t),[\"parameters\"]),(0,m.fromJS)([]));return r.reduce(function(e,t){var r=n&&\"body\"===t.get(\"in\")?t.get(\"value_xml\"):t.get(\"value\");return e.set(t.get(\"name\"),r)},(0,m.fromJS)({}))}function a(e){var t=arguments.length>1&&void 0!==arguments[1]?arguments[1]:\"\";if(m.List.isList(e))return e.some(function(e){return m.Map.isMap(e)&&e.get(\"in\")===t})}function s(e){var t=arguments.length>1&&void 0!==arguments[1]?arguments[1]:\"\";if(m.List.isList(e))return e.some(function(e){return m.Map.isMap(e)&&e.get(\"type\")===t})}function u(e,t){var n=b(e).getIn([\"paths\"].concat((0,f.default)(t)),(0,m.fromJS)({})),r=n.get(\"parameters\")||new m.List,i=s(r,\"file\")?\"multipart/form-data\":a(r,\"formData\")?\"application/x-www-form-urlencoded\":n.get(\"consumes_value\");return(0,m.fromJS)({requestContentType:i,responseContentType:n.get(\"produces_value\")})}function c(e,t){return b(e).getIn([\"paths\"].concat((0,f.default)(t),[\"consumes\"]),(0,m.fromJS)({}))}function l(e){return m.Map.isMap(e)?e:new m.Map}Object.defineProperty(t,\"__esModule\",{value:!0}),t.validateBeforeExecute=t.canExecuteScheme=t.operationScheme=t.hasHost=t.allowTryItOutFor=t.requestFor=t.responseFor=t.requests=t.responses=t.taggedOperations=t.operationsWithTags=t.tagDetails=t.tags=t.operationsWithRootInherited=t.schemes=t.host=t.basePath=t.definitions=t.findDefinition=t.securityDefinitions=t.security=t.produces=t.consumes=t.operations=t.paths=t.semver=t.version=t.externalDocs=t.info=t.spec=t.specResolved=t.specJson=t.specSource=t.specStr=t.url=t.lastError=void 0;var p=n(435),f=r(p);t.getParameter=i,t.parameterValues=o,t.parametersIncludeIn=a,t.parametersIncludeType=s,t.contentTypeValues=u,t.operationConsumes=c;var h=n(430),d=n(183),m=n(168),v=\"default\",y=[\"get\",\"put\",\"post\",\"delete\",\"options\",\"head\",\"patch\"],g=function(e){return e||(0,m.Map)()},_=(t.lastError=(0,h.createSelector)(g,function(e){return e.get(\"lastError\")}),t.url=(0,h.createSelector)(g,function(e){return e.get(\"url\")}),t.specStr=(0,h.createSelector)(g,function(e){return e.get(\"spec\")||\"\"}),t.specSource=(0,h.createSelector)(g,function(e){return e.get(\"specSource\")||\"not-editor\"}),t.specJson=(0,h.createSelector)(g,function(e){return e.get(\"json\",(0,m.Map)())}),t.specResolved=(0,h.createSelector)(g,function(e){return e.get(\"resolved\",(0,m.Map)())})),b=t.spec=function(e){var t=_(e);return t},x=t.info=(0,h.createSelector)(b,function(e){return l(e&&e.get(\"info\"))}),w=(t.externalDocs=(0,h.createSelector)(b,function(e){return l(e&&e.get(\"externalDocs\"))}),t.version=(0,h.createSelector)(x,function(e){return e&&e.get(\"version\")})),k=(t.semver=(0,h.createSelector)(w,function(e){return/v?([0-9]*)\\.([0-9]*)\\.([0-9]*)/i.exec(e).slice(1)}),t.paths=(0,h.createSelector)(b,function(e){return e.get(\"paths\")})),S=t.operations=(0,h.createSelector)(k,function(e){if(!e||e.size<1)return(0,m.List)();var t=(0,m.List)();return e&&e.forEach?(e.forEach(function(e,n){return e&&e.forEach?void e.forEach(function(e,r){y.indexOf(r)!==-1&&(t=t.push((0,m.fromJS)({path:n,method:r,operation:e,id:r+\"-\"+n})))}):{}}),t):(0,m.List)()}),E=t.consumes=(0,h.createSelector)(b,function(e){return(0,m.Set)(e.get(\"consumes\"))}),C=t.produces=(0,h.createSelector)(b,function(e){return(0,m.Set)(e.get(\"produces\"))}),A=(t.security=(0,h.createSelector)(b,function(e){return e.get(\"security\",(0,m.List)())}),t.securityDefinitions=(0,h.createSelector)(b,function(e){return e.get(\"securityDefinitions\")}),t.findDefinition=function(e,t){return _(e).getIn([\"definitions\",t],null)},t.definitions=(0,h.createSelector)(b,function(e){return e.get(\"definitions\")||(0,m.Map)()}),t.basePath=(0,h.createSelector)(b,function(e){return e.get(\"basePath\")}),t.host=(0,h.createSelector)(b,function(e){return e.get(\"host\")}),t.schemes=(0,h.createSelector)(b,function(e){return e.get(\"schemes\",(0,m.Map)())}),t.operationsWithRootInherited=(0,h.createSelector)(S,E,C,function(e,t,n){return e.map(function(e){return e.update(\"operation\",function(e){if(e){if(!m.Map.isMap(e))return;return e.withMutations(function(e){return e.get(\"consumes\")||e.update(\"consumes\",function(e){return(0,m.Set)(e).merge(t)}),e.get(\"produces\")||e.update(\"produces\",function(e){return(0,m.Set)(e).merge(n)}),e})}return(0,m.Map)()})})})),T=t.tags=(0,h.createSelector)(b,function(e){return e.get(\"tags\",(0,m.List)())}),D=t.tagDetails=function(e,t){var n=T(e)||(0,m.List)();return n.filter(m.Map.isMap).find(function(e){return e.get(\"name\")===t},(0,m.Map)())},M=t.operationsWithTags=(0,h.createSelector)(A,function(e){return e.reduce(function(e,t){var n=(0,m.Set)(t.getIn([\"operation\",\"tags\"]));return n.count()<1?e.update(v,(0,m.List)(),function(e){return e.push(t)}):n.reduce(function(e,n){return e.update(n,(0,m.List)(),function(e){return e.push(t)})},e)},(0,m.Map)())}),O=(t.taggedOperations=function(e){return function(t){var n=t.getConfigs,r=n(),i=r.operationsSorter;return M(e).map(function(t,n){var r=\"function\"==typeof i?i:d.sorters.operationsSorter[i],o=r?t.sort(r):t;return(0,m.Map)({tagDetails:D(e,n),operations:o})})}},t.responses=(0,h.createSelector)(g,function(e){return e.get(\"responses\",(0,m.Map)())})),P=t.requests=(0,h.createSelector)(g,function(e){return e.get(\"requests\",(0,m.Map)())}),I=(t.responseFor=function(e,t,n){return O(e).getIn([t,n],null)},t.requestFor=function(e,t,n){return P(e).getIn([t,n],null)},t.allowTryItOutFor=function(){return!0},t.hasHost=(0,h.createSelector)(b,function(e){var t=e.get(\"host\");return\"string\"==typeof t&&t.length>0&&\"/\"!==t[0]}),t.operationScheme=function(e,t,n){var r=e.get(\"url\"),i=r.match(/^([a-z][a-z0-9+\\-.]*):/),o=Array.isArray(i)?i[1]:null;return e.getIn([\"scheme\",t,n])||e.getIn([\"scheme\",\"_defaultScheme\"])||o||\"\"});t.canExecuteScheme=function(e,t,n){return[\"http\",\"https\"].indexOf(I(e,t,n))>-1},t.validateBeforeExecute=function(e,t){var n=b(e).getIn([\"paths\"].concat((0,f.default)(t),[\"parameters\"]),(0,m.fromJS)([])),r=!0;return n.forEach(function(e){var t=e.get(\"errors\");t&&t.count()&&(r=!1)}),r}},function(e,t){\"use strict\";Object.defineProperty(t,\"__esModule\",{value:!0});t.updateSpec=function(e,t){var n=t.specActions;return function(){e.apply(void 0,arguments),n.parseToJson.apply(n,arguments)}},t.updateJsonSpec=function(e,t){var n=t.specActions;return function(){e.apply(void 0,arguments),n.resolveSpec.apply(n,arguments)}},t.executeRequest=function(e,t){var n=t.specActions;return function(t){return n.logRequest(t),e(t)}}},function(e,t,n){\"use strict\";function r(e){if(e&&e.__esModule)return e;var t={};if(null!=e)for(var n in e)Object.prototype.hasOwnProperty.call(e,n)&&(t[n]=e[n]);return t.default=e,t}Object.defineProperty(t,\"__esModule\",{value:!0}),t.default=function(e){var t=e.getComponents,n=e.getStore,r=e.getSystem,i=o.getComponent,s=o.render,u=o.makeMappedContainer,c=(0,a.memoize)(i.bind(null,r,n,t)),l=(0,a.memoize)(u.bind(null,r,n,c,t));return{rootInjects:{getComponent:c,makeMappedContainer:l,render:s.bind(null,r,n,i,t)}}};var i=n(485),o=r(i),a=n(183)},function(e,t,n){\"use strict\";function r(e){return e&&e.__esModule?e:{default:e}}Object.defineProperty(t,\"__esModule\",{value:!0}),t.getComponent=t.render=t.makeMappedContainer=void 0;var i=n(94),o=r(i),a=n(60),s=r(a),u=n(446),c=r(u),l=n(486),p=r(l),f=n(145),h=r(f),d=n(146),m=r(d),v=n(489),y=r(v),g=n(490),_=r(g),b=n(498),x=r(b),w=n(528),k=r(w),S=n(666),E=n(677),C=r(E),A=function(e,t){return function(n){function r(){return(0,h.default)(this,r),(0,y.default)(this,(r.__proto__||(0,p.default)(r)).apply(this,arguments))}return(0,_.default)(r,n),(0,m.default)(r,[{key:\"render\",value:function(){return x.default.createElement(t,(0,c.default)({},e(),this.props,this.context))}}]),r}(b.Component)},T=function(e,t){return function(n){function r(){return(0,h.default)(this,r),(0,y.default)(this,(r.__proto__||(0,p.default)(r)).apply(this,arguments))}return(0,_.default)(r,n),(0,m.default)(r,[{key:\"render\",value:function(){return x.default.createElement(S.Provider,{store:e},x.default.createElement(t,(0,c.default)({},this.props,this.context)))}}]),r}(b.Component)},D=function(e,t,n){var r=A(e,t,n),i=(0,S.connect)(function(e){return{state:e}})(r);return n?T(n,i):i},M=function(e,t,n,r){for(var i in t){var o=t[i];\"function\"==typeof o&&o(n[i],r[i],e())}},O=(t.makeMappedContainer=function(e,t,n,r,i,o){return function(t){function r(t,n){(0,h.default)(this,r);var i=(0,y.default)(this,(r.__proto__||(0,p.default)(r)).call(this,t,n));return M(e,o,t,{}),i}return(0,_.default)(r,t),(0,m.default)(r,[{key:\"componentWillReceiveProps\",value:function(t){M(e,o,t,this.props)}},{key:\"render\",value:function(){var e=(0,C.default)(this.props,o?(0,s.default)(o):[]),t=n(i,\"root\");return x.default.createElement(t,e)}}]),r}(b.Component)},t.render=function(e,t,n,r,i){var o=document.querySelector(i),a=n(e,t,r,\"App\",\"root\");k.default.render(x.default.createElement(a,null),o)},function(e){return x.default.createClass({render:function(){return e(this.props)}})}),P=function(e){var t=e.name;return x.default.createElement(\"div\",{style:{padding:\"1em\",color:\"#aaa\"}},\"😱 \",x.default.createElement(\"i\",null,\"Could not render \",\"t\"===t?\"this component\":t,\", see the console.\"))},I=function(e){var t=function(e){return!(e.prototype&&e.prototype.isReactComponent)},n=t(e)?O(e):e,r=n.prototype.render;return n.prototype.render=function(){try{for(var e=arguments.length,t=Array(e),i=0;i<e;i++)t[i]=arguments[i];return r.apply(this,t)}catch(e){return console.error(e),x.default.createElement(P,{error:e,name:n.name})}},n};t.getComponent=function(e,t,n,r,i){if(\"string\"!=typeof r)throw new TypeError(\"Need a string, to fetch a component. Was given a \"+(\"undefined\"==typeof r?\"undefined\":(0,o.default)(r)));var a=n(r);return a?i?\"root\"===i?D(e,a,t()):D(e,a):I(a):(e().log.warn(\"Could not find component\",r),null)}},function(e,t,n){e.exports={default:n(487),__esModule:!0}},function(e,t,n){n(488),e.exports=n(59).Object.getPrototypeOf},function(e,t,n){var r=n(63),i=n(109);n(80)(\"getPrototypeOf\",function(){return function(e){return i(r(e))}})},function(e,t,n){\"use strict\";function r(e){return e&&e.__esModule?e:{default:e}}t.__esModule=!0;var i=n(94),o=r(i);t.default=function(e,t){if(!e)throw new ReferenceError(\"this hasn't been initialised - super() hasn't been called\");return!t||\"object\"!==(\"undefined\"==typeof t?\"undefined\":(0,o.default)(t))&&\"function\"!=typeof t?e:t}},function(e,t,n){\"use strict\";function r(e){return e&&e.__esModule?e:{default:e}}t.__esModule=!0;var i=n(491),o=r(i),a=n(495),s=r(a),u=n(94),c=r(u);t.default=function(e,t){if(\"function\"!=typeof t&&null!==t)throw new TypeError(\"Super expression must either be null or a function, not \"+(\"undefined\"==typeof t?\"undefined\":(0,c.default)(t)));e.prototype=(0,s.default)(t&&t.prototype,{constructor:{value:e,enumerable:!1,writable:!0,configurable:!0}}),t&&(o.default?(0,o.default)(e,t):e.__proto__=t)}},function(e,t,n){e.exports={default:n(492),__esModule:!0}},function(e,t,n){n(493),e.exports=n(59).Object.setPrototypeOf},function(e,t,n){var r=n(81);r(r.S,\"Object\",{setPrototypeOf:n(494).set})},function(e,t,n){var r=n(87),i=n(86),o=function(e,t){if(i(e),!r(t)&&null!==t)throw TypeError(t+\": can't set as prototype!\")};e.exports={set:Object.setPrototypeOf||(\"__proto__\"in{}?function(e,t,r){try{r=n(82)(Function.call,n(127).f(Object.prototype,\"__proto__\").set,2),r(e,[]),t=!(e instanceof Array)}catch(e){t=!0}return function(e,n){return o(e,n),t?e.__proto__=n:r(e,n),e}}({},!1):void 0),check:o}},function(e,t,n){e.exports={default:n(496),__esModule:!0}},function(e,t,n){n(497);var r=n(59).Object;e.exports=function(e,t){return r.create(e,t)}},function(e,t,n){var r=n(81);r(r.S,\"Object\",{create:n(104)})},function(e,t,n){\"use strict\";e.exports=n(499)},function(e,t,n){\"use strict\";var r=n(500),i=n(501),o=n(510),a=n(518),s=n(512),u=n(519),c=n(524),l=n(525),p=n(527),f=s.createElement,h=s.createFactory,d=s.cloneElement,m=r,v=function(e){return e},y={Children:{map:o.map,forEach:o.forEach,count:o.count,toArray:o.toArray,only:p},Component:i.Component,PureComponent:i.PureComponent,createElement:f,cloneElement:d,isValidElement:s.isValidElement,PropTypes:u,createClass:l,createFactory:h,createMixin:v,DOM:a,version:c,__spread:m};e.exports=y},function(e,t){/*\n\tobject-assign\n\t(c) Sindre Sorhus\n\t@license MIT\n\t*/\n\"use strict\";function n(e){if(null===e||void 0===e)throw new TypeError(\"Object.assign cannot be called with null or undefined\");return Object(e)}function r(){try{if(!Object.assign)return!1;var e=new String(\"abc\");if(e[5]=\"de\",\"5\"===Object.getOwnPropertyNames(e)[0])return!1;for(var t={},n=0;n<10;n++)t[\"_\"+String.fromCharCode(n)]=n;var r=Object.getOwnPropertyNames(t).map(function(e){return t[e]});if(\"0123456789\"!==r.join(\"\"))return!1;var i={};return\"abcdefghijklmnopqrst\".split(\"\").forEach(function(e){i[e]=e}),\"abcdefghijklmnopqrst\"===Object.keys(Object.assign({},i)).join(\"\")}catch(e){return!1}}var i=Object.getOwnPropertySymbols,o=Object.prototype.hasOwnProperty,a=Object.prototype.propertyIsEnumerable;e.exports=r()?Object.assign:function(e,t){for(var r,s,u=n(e),c=1;c<arguments.length;c++){r=Object(arguments[c]);for(var l in r)o.call(r,l)&&(u[l]=r[l]);if(i){s=i(r);for(var p=0;p<s.length;p++)a.call(r,s[p])&&(u[s[p]]=r[s[p]])}}return u}},function(e,t,n){\"use strict\";function r(e,t,n){this.props=e,this.context=t,this.refs=c,this.updater=n||u}function i(e,t,n){this.props=e,this.context=t,this.refs=c,this.updater=n||u}function o(){}var a=n(502),s=n(500),u=n(503),c=(n(506),n(507));n(508),n(509);r.prototype.isReactComponent={},r.prototype.setState=function(e,t){\"object\"!=typeof e&&\"function\"!=typeof e&&null!=e?a(\"85\"):void 0,this.updater.enqueueSetState(this,e),t&&this.updater.enqueueCallback(this,t,\"setState\")},r.prototype.forceUpdate=function(e){this.updater.enqueueForceUpdate(this),e&&this.updater.enqueueCallback(this,e,\"forceUpdate\")};o.prototype=r.prototype,i.prototype=new o,i.prototype.constructor=i,s(i.prototype,r.prototype),i.prototype.isPureReactComponent=!0,e.exports={Component:r,PureComponent:i}},function(e,t){\"use strict\";function n(e){for(var t=arguments.length-1,n=\"Minified React error #\"+e+\"; visit http://facebook.github.io/react/docs/error-decoder.html?invariant=\"+e,r=0;r<t;r++)n+=\"&args[]=\"+encodeURIComponent(arguments[r+1]);n+=\" for the full message or use the non-minified dev environment for full errors and additional helpful warnings.\";var i=new Error(n);throw i.name=\"Invariant Violation\",i.framesToPop=1,i}e.exports=n},function(e,t,n){\"use strict\";function r(e,t){}var i=(n(504),{isMounted:function(e){return!1},enqueueCallback:function(e,t){},enqueueForceUpdate:function(e){r(e,\"forceUpdate\")},enqueueReplaceState:function(e,t){r(e,\"replaceState\")},enqueueSetState:function(e,t){r(e,\"setState\")}});e.exports=i},function(e,t,n){\"use strict\";var r=n(505),i=r;e.exports=i},function(e,t){\"use strict\";function n(e){return function(){return e}}var r=function(){};r.thatReturns=n,r.thatReturnsFalse=n(!1),r.thatReturnsTrue=n(!0),r.thatReturnsNull=n(null),r.thatReturnsThis=function(){return this},r.thatReturnsArgument=function(e){return e},e.exports=r},function(e,t,n){\"use strict\";var r=!1;e.exports=r},function(e,t,n){\"use strict\";var r={};e.exports=r},function(e,t,n){\"use strict\";function r(e,t,n,r,o,a,s,u){if(i(t),!e){var c;if(void 0===t)c=new Error(\"Minified exception occurred; use the non-minified dev environment for the full error message and additional helpful warnings.\");else{var l=[n,r,o,a,s,u],p=0;c=new Error(t.replace(/%s/g,function(){return l[p++]})),c.name=\"Invariant Violation\"}throw c.framesToPop=1,c}}var i=function(e){};e.exports=r},function(e,t,n){\"use strict\";var r=function(){};e.exports=r},function(e,t,n){\"use strict\";function r(e){return(\"\"+e).replace(b,\"$&/\")}function i(e,t){this.func=e,this.context=t,this.count=0}function o(e,t,n){var r=e.func,i=e.context;r.call(i,t,e.count++)}function a(e,t,n){if(null==e)return e;var r=i.getPooled(t,n);y(e,o,r),i.release(r)}function s(e,t,n,r){this.result=e,this.keyPrefix=t,this.func=n,this.context=r,this.count=0}function u(e,t,n){var i=e.result,o=e.keyPrefix,a=e.func,s=e.context,u=a.call(s,t,e.count++);Array.isArray(u)?c(u,i,n,v.thatReturnsArgument):null!=u&&(m.isValidElement(u)&&(u=m.cloneAndReplaceKey(u,o+(!u.key||t&&t.key===u.key?\"\":r(u.key)+\"/\")+n)),i.push(u))}function c(e,t,n,i,o){var a=\"\";null!=n&&(a=r(n)+\"/\");var c=s.getPooled(t,a,i,o);y(e,u,c),s.release(c)}function l(e,t,n){if(null==e)return e;var r=[];return c(e,r,null,t,n),r}function p(e,t,n){return null}function f(e,t){return y(e,p,null)}function h(e){var t=[];return c(e,t,null,v.thatReturnsArgument),t}var d=n(511),m=n(512),v=n(505),y=n(515),g=d.twoArgumentPooler,_=d.fourArgumentPooler,b=/\\/+/g;i.prototype.destructor=function(){this.func=null,this.context=null,this.count=0},d.addPoolingTo(i,g),s.prototype.destructor=function(){this.result=null,this.keyPrefix=null,this.func=null,this.context=null,this.count=0},d.addPoolingTo(s,_);var x={forEach:a,map:l,mapIntoWithKeyPrefixInternal:c,count:f,toArray:h};e.exports=x},[1231,502],function(e,t,n){\"use strict\";function r(e){return void 0!==e.ref}function i(e){return void 0!==e.key}var o=n(500),a=n(513),s=(n(504),n(506),Object.prototype.hasOwnProperty),u=n(514),c={key:!0,ref:!0,__self:!0,__source:!0},l=function(e,t,n,r,i,o,a){var s={$$typeof:u,type:e,key:t,ref:n,props:a,_owner:o};return s};l.createElement=function(e,t,n){var o,u={},p=null,f=null,h=null,d=null;if(null!=t){r(t)&&(f=t.ref),i(t)&&(p=\"\"+t.key),h=void 0===t.__self?null:t.__self,d=void 0===t.__source?null:t.__source;for(o in t)s.call(t,o)&&!c.hasOwnProperty(o)&&(u[o]=t[o])}var m=arguments.length-2;if(1===m)u.children=n;else if(m>1){for(var v=Array(m),y=0;y<m;y++)v[y]=arguments[y+2];u.children=v}if(e&&e.defaultProps){var g=e.defaultProps;for(o in g)void 0===u[o]&&(u[o]=g[o])}return l(e,p,f,h,d,a.current,u)},l.createFactory=function(e){var t=l.createElement.bind(null,e);return t.type=e,t},l.cloneAndReplaceKey=function(e,t){var n=l(e.type,t,e.ref,e._self,e._source,e._owner,e.props);return n},l.cloneElement=function(e,t,n){var u,p=o({},e.props),f=e.key,h=e.ref,d=e._self,m=e._source,v=e._owner;if(null!=t){r(t)&&(h=t.ref,v=a.current),i(t)&&(f=\"\"+t.key);var y;e.type&&e.type.defaultProps&&(y=e.type.defaultProps);for(u in t)s.call(t,u)&&!c.hasOwnProperty(u)&&(void 0===t[u]&&void 0!==y?p[u]=y[u]:p[u]=t[u])}var g=arguments.length-2;if(1===g)p.children=n;else if(g>1){for(var _=Array(g),b=0;b<g;b++)_[b]=arguments[b+2];p.children=_}return l(e.type,f,h,d,m,v,p)},l.isValidElement=function(e){return\"object\"==typeof e&&null!==e&&e.$$typeof===u},e.exports=l},function(e,t){\"use strict\";var n={current:null};e.exports=n},function(e,t){\"use strict\";var n=\"function\"==typeof Symbol&&Symbol.for&&Symbol.for(\"react.element\")||60103;e.exports=n},function(e,t,n){\"use strict\";function r(e,t){return e&&\"object\"==typeof e&&null!=e.key?c.escape(e.key):t.toString(36)}function i(e,t,n,o){var f=typeof e;if(\"undefined\"!==f&&\"boolean\"!==f||(e=null),null===e||\"string\"===f||\"number\"===f||\"object\"===f&&e.$$typeof===s)return n(o,e,\"\"===t?l+r(e,0):t),1;var h,d,m=0,v=\"\"===t?l:t+p;if(Array.isArray(e))for(var y=0;y<e.length;y++)h=e[y],d=v+r(h,y),m+=i(h,d,n,o);else{var g=u(e);if(g){var _,b=g.call(e);if(g!==e.entries)for(var x=0;!(_=b.next()).done;)h=_.value,d=v+r(h,x++),m+=i(h,d,n,o);else for(;!(_=b.next()).done;){var w=_.value;w&&(h=w[1],d=v+c.escape(w[0])+p+r(h,0),m+=i(h,d,n,o))}}else if(\"object\"===f){var k=\"\",S=String(e);a(\"31\",\"[object Object]\"===S?\"object with keys {\"+Object.keys(e).join(\", \")+\"}\":S,k)}}return m}function o(e,t,n){return null==e?0:i(e,\"\",t,n)}var a=n(502),s=(n(513),n(514)),u=n(516),c=(n(508),n(517)),l=(n(504),\".\"),p=\":\";e.exports=o},function(e,t){\"use strict\";function n(e){var t=e&&(r&&e[r]||e[i]);if(\"function\"==typeof t)return t}var r=\"function\"==typeof Symbol&&Symbol.iterator,i=\"@@iterator\";e.exports=n},function(e,t){\"use strict\";function n(e){var t=/[=:]/g,n={\"=\":\"=0\",\":\":\"=2\"},r=(\"\"+e).replace(t,function(e){return n[e]});return\"$\"+r}function r(e){var t=/(=0|=2)/g,n={\"=0\":\"=\",\"=2\":\":\"},r=\".\"===e[0]&&\"$\"===e[1]?e.substring(2):e.substring(1);return(\"\"+r).replace(t,function(e){return n[e]})}var i={escape:n,unescape:r};e.exports=i},function(e,t,n){\"use strict\";var r=n(512),i=r.createFactory,o={a:i(\"a\"),abbr:i(\"abbr\"),address:i(\"address\"),area:i(\"area\"),article:i(\"article\"),aside:i(\"aside\"),audio:i(\"audio\"),b:i(\"b\"),base:i(\"base\"),bdi:i(\"bdi\"),bdo:i(\"bdo\"),big:i(\"big\"),blockquote:i(\"blockquote\"),body:i(\"body\"),br:i(\"br\"),button:i(\"button\"),canvas:i(\"canvas\"),caption:i(\"caption\"),cite:i(\"cite\"),code:i(\"code\"),col:i(\"col\"),colgroup:i(\"colgroup\"),data:i(\"data\"),datalist:i(\"datalist\"),dd:i(\"dd\"),del:i(\"del\"),details:i(\"details\"),dfn:i(\"dfn\"),dialog:i(\"dialog\"),div:i(\"div\"),dl:i(\"dl\"),dt:i(\"dt\"),em:i(\"em\"),embed:i(\"embed\"),fieldset:i(\"fieldset\"),figcaption:i(\"figcaption\"),figure:i(\"figure\"),footer:i(\"footer\"),form:i(\"form\"),h1:i(\"h1\"),h2:i(\"h2\"),h3:i(\"h3\"),h4:i(\"h4\"),h5:i(\"h5\"),h6:i(\"h6\"),head:i(\"head\"),header:i(\"header\"),hgroup:i(\"hgroup\"),hr:i(\"hr\"),html:i(\"html\"),i:i(\"i\"),iframe:i(\"iframe\"),img:i(\"img\"),input:i(\"input\"),ins:i(\"ins\"),kbd:i(\"kbd\"),keygen:i(\"keygen\"),label:i(\"label\"),legend:i(\"legend\"),li:i(\"li\"),link:i(\"link\"),main:i(\"main\"),map:i(\"map\"),mark:i(\"mark\"),menu:i(\"menu\"),menuitem:i(\"menuitem\"),meta:i(\"meta\"),meter:i(\"meter\"),nav:i(\"nav\"),noscript:i(\"noscript\"),object:i(\"object\"),ol:i(\"ol\"),optgroup:i(\"optgroup\"),option:i(\"option\"),output:i(\"output\"),p:i(\"p\"),param:i(\"param\"),picture:i(\"picture\"),pre:i(\"pre\"),progress:i(\"progress\"),q:i(\"q\"),rp:i(\"rp\"),rt:i(\"rt\"),ruby:i(\"ruby\"),s:i(\"s\"),samp:i(\"samp\"),script:i(\"script\"),section:i(\"section\"),select:i(\"select\"),small:i(\"small\"),source:i(\"source\"),span:i(\"span\"),strong:i(\"strong\"),style:i(\"style\"),sub:i(\"sub\"),summary:i(\"summary\"),sup:i(\"sup\"),table:i(\"table\"),tbody:i(\"tbody\"),td:i(\"td\"),textarea:i(\"textarea\"),tfoot:i(\"tfoot\"),th:i(\"th\"),thead:i(\"thead\"),time:i(\"time\"),title:i(\"title\"),tr:i(\"tr\"),track:i(\"track\"),u:i(\"u\"),ul:i(\"ul\"),var:i(\"var\"),video:i(\"video\"),wbr:i(\"wbr\"),circle:i(\"circle\"),clipPath:i(\"clipPath\"),defs:i(\"defs\"),ellipse:i(\"ellipse\"),g:i(\"g\"),image:i(\"image\"),line:i(\"line\"),linearGradient:i(\"linearGradient\"),mask:i(\"mask\"),path:i(\"path\"),pattern:i(\"pattern\"),polygon:i(\"polygon\"),polyline:i(\"polyline\"),radialGradient:i(\"radialGradient\"),rect:i(\"rect\"),stop:i(\"stop\"),svg:i(\"svg\"),text:i(\"text\"),tspan:i(\"tspan\")};e.exports=o},function(e,t,n){\"use strict\";var r=n(512),i=r.isValidElement,o=n(520);e.exports=o(i)},function(e,t,n){\"use strict\";var r=n(521);e.exports=function(e){var t=!1;return r(e,t)}},function(e,t,n){\"use strict\";var r=n(505),i=n(508),o=n(504),a=n(522),s=n(523);e.exports=function(e,t){function n(e){var t=e&&(A&&e[A]||e[T]);if(\"function\"==typeof t)return t}function u(e,t){return e===t?0!==e||1/e===1/t:e!==e&&t!==t}function c(e){this.message=e,this.stack=\"\"}function l(e){function n(n,r,o,s,u,l,p){if(s=s||D,l=l||o,p!==a)if(t)i(!1,\"Calling PropTypes validators directly is not supported by the `prop-types` package. Use `PropTypes.checkPropTypes()` to call them. Read more at http://fb.me/use-check-prop-types\");else;return null==r[o]?n?new c(null===r[o]?\"The \"+u+\" `\"+l+\"` is marked as required \"+(\"in `\"+s+\"`, but its value is `null`.\"):\"The \"+u+\" `\"+l+\"` is marked as required in \"+(\"`\"+s+\"`, but its value is `undefined`.\")):null:e(r,o,s,u,l)}var r=n.bind(null,!1);return r.isRequired=n.bind(null,!0),r}function p(e){function t(t,n,r,i,o,a){var s=t[n],u=k(s);if(u!==e){var l=S(s);return new c(\"Invalid \"+i+\" `\"+o+\"` of type \"+(\"`\"+l+\"` supplied to `\"+r+\"`, expected \")+(\"`\"+e+\"`.\"))}return null}return l(t)}function f(){return l(r.thatReturnsNull)}function h(e){function t(t,n,r,i,o){if(\"function\"!=typeof e)return new c(\"Property `\"+o+\"` of component `\"+r+\"` has invalid PropType notation inside arrayOf.\");var s=t[n];if(!Array.isArray(s)){var u=k(s);return new c(\"Invalid \"+i+\" `\"+o+\"` of type \"+(\"`\"+u+\"` supplied to `\"+r+\"`, expected an array.\"))}for(var l=0;l<s.length;l++){var p=e(s,l,r,i,o+\"[\"+l+\"]\",a);if(p instanceof Error)return p}return null}return l(t)}function d(){function t(t,n,r,i,o){var a=t[n];if(!e(a)){var s=k(a);return new c(\"Invalid \"+i+\" `\"+o+\"` of type \"+(\"`\"+s+\"` supplied to `\"+r+\"`, expected a single ReactElement.\"))}return null}return l(t)}function m(e){function t(t,n,r,i,o){if(!(t[n]instanceof e)){var a=e.name||D,s=C(t[n]);return new c(\"Invalid \"+i+\" `\"+o+\"` of type \"+(\"`\"+s+\"` supplied to `\"+r+\"`, expected \")+(\"instance of `\"+a+\"`.\"))}return null}return l(t)}function v(e){function t(t,n,r,i,o){for(var a=t[n],s=0;s<e.length;s++)if(u(a,e[s]))return null;var l=JSON.stringify(e);return new c(\"Invalid \"+i+\" `\"+o+\"` of value `\"+a+\"` \"+(\"supplied to `\"+r+\"`, expected one of \"+l+\".\"))}return Array.isArray(e)?l(t):r.thatReturnsNull}function y(e){function t(t,n,r,i,o){if(\"function\"!=typeof e)return new c(\"Property `\"+o+\"` of component `\"+r+\"` has invalid PropType notation inside objectOf.\");var s=t[n],u=k(s);if(\"object\"!==u)return new c(\"Invalid \"+i+\" `\"+o+\"` of type \"+(\"`\"+u+\"` supplied to `\"+r+\"`, expected an object.\"));for(var l in s)if(s.hasOwnProperty(l)){var p=e(s,l,r,i,o+\".\"+l,a);if(p instanceof Error)return p}return null}return l(t)}function g(e){function t(t,n,r,i,o){for(var s=0;s<e.length;s++){var u=e[s];if(null==u(t,n,r,i,o,a))return null}return new c(\"Invalid \"+i+\" `\"+o+\"` supplied to \"+(\"`\"+r+\"`.\"))}if(!Array.isArray(e))return r.thatReturnsNull;for(var n=0;n<e.length;n++){var i=e[n];if(\"function\"!=typeof i)return o(!1,\"Invalid argument supplid to oneOfType. Expected an array of check functions, but received %s at index %s.\",E(i),n),r.thatReturnsNull}return l(t)}function _(){function e(e,t,n,r,i){return x(e[t])?null:new c(\"Invalid \"+r+\" `\"+i+\"` supplied to \"+(\"`\"+n+\"`, expected a ReactNode.\"))}return l(e)}function b(e){function t(t,n,r,i,o){var s=t[n],u=k(s);if(\"object\"!==u)return new c(\"Invalid \"+i+\" `\"+o+\"` of type `\"+u+\"` \"+(\"supplied to `\"+r+\"`, expected `object`.\"));for(var l in e){var p=e[l];if(p){var f=p(s,l,r,i,o+\".\"+l,a);if(f)return f}}return null}return l(t)}function x(t){switch(typeof t){case\"number\":case\"string\":case\"undefined\":return!0;case\"boolean\":return!t;case\"object\":if(Array.isArray(t))return t.every(x);if(null===t||e(t))return!0;var r=n(t);if(!r)return!1;var i,o=r.call(t);if(r!==t.entries){for(;!(i=o.next()).done;)if(!x(i.value))return!1}else for(;!(i=o.next()).done;){var a=i.value;if(a&&!x(a[1]))return!1}return!0;default:return!1}}function w(e,t){return\"symbol\"===e||(\"Symbol\"===t[\"@@toStringTag\"]||\"function\"==typeof Symbol&&t instanceof Symbol)}function k(e){var t=typeof e;return Array.isArray(e)?\"array\":e instanceof RegExp?\"object\":w(t,e)?\"symbol\":t}function S(e){if(\"undefined\"==typeof e||null===e)return\"\"+e;var t=k(e);if(\"object\"===t){if(e instanceof Date)return\"date\";if(e instanceof RegExp)return\"regexp\"}return t}function E(e){var t=S(e);switch(t){case\"array\":case\"object\":return\"an \"+t;case\"boolean\":case\"date\":case\"regexp\":return\"a \"+t;default:return t}}function C(e){return e.constructor&&e.constructor.name?e.constructor.name:D}var A=\"function\"==typeof Symbol&&Symbol.iterator,T=\"@@iterator\",D=\"<<anonymous>>\",M={array:p(\"array\"),bool:p(\"boolean\"),func:p(\"function\"),number:p(\"number\"),object:p(\"object\"),string:p(\"string\"),symbol:p(\"symbol\"),any:f(),arrayOf:h,element:d(),instanceOf:m,node:_(),objectOf:y,oneOf:v,oneOfType:g,shape:b};return c.prototype=Error.prototype,M.checkPropTypes=s,M.PropTypes=M,M}},function(e,t){\"use strict\";var n=\"SECRET_DO_NOT_PASS_THIS_OR_YOU_WILL_BE_FIRED\";e.exports=n},function(e,t,n){\"use strict\";function r(e,t,n,r,i){}e.exports=r},function(e,t){\"use strict\";e.exports=\"15.6.1\"},function(e,t,n){\"use strict\";var r=n(501),i=r.Component,o=n(512),a=o.isValidElement,s=n(503),u=n(526);e.exports=u(i,a,s)},function(e,t,n){\"use strict\";function r(e){return e}function i(e,t,n){function i(e,t){var n=g.hasOwnProperty(t)?g[t]:null;w.hasOwnProperty(t)&&u(\"OVERRIDE_BASE\"===n,\"ReactClassInterface: You are attempting to override `%s` from your class specification. Ensure that your method names do not overlap with React methods.\",t),e&&u(\"DEFINE_MANY\"===n||\"DEFINE_MANY_MERGED\"===n,\"ReactClassInterface: You are attempting to define `%s` on your component more than once. This conflict may be due to a mixin.\",t)}function o(e,n){if(n){u(\"function\"!=typeof n,\"ReactClass: You're attempting to use a component class or function as a mixin. Instead, just use a regular object.\"),u(!t(n),\"ReactClass: You're attempting to use a component as a mixin. Instead, just use a regular object.\");var r=e.prototype,o=r.__reactAutoBindPairs;n.hasOwnProperty(c)&&_.mixins(e,n.mixins);for(var a in n)if(n.hasOwnProperty(a)&&a!==c){var s=n[a],l=r.hasOwnProperty(a);if(i(l,a),_.hasOwnProperty(a))_[a](e,s);else{var p=g.hasOwnProperty(a),d=\"function\"==typeof s,m=d&&!p&&!l&&n.autobind!==!1;if(m)o.push(a,s),r[a]=s;else if(l){var v=g[a];u(p&&(\"DEFINE_MANY_MERGED\"===v||\"DEFINE_MANY\"===v),\"ReactClass: Unexpected spec policy %s for key %s when mixing in component specs.\",v,a),\"DEFINE_MANY_MERGED\"===v?r[a]=f(r[a],s):\"DEFINE_MANY\"===v&&(r[a]=h(r[a],s))}else r[a]=s}}}else;}function l(e,t){if(t)for(var n in t){var r=t[n];if(t.hasOwnProperty(n)){var i=n in _;u(!i,'ReactClass: You are attempting to define a reserved property, `%s`, that shouldn\\'t be on the \"statics\" key. Define it as an instance property instead; it will still be accessible on the constructor.',n);var o=n in e;u(!o,\"ReactClass: You are attempting to define `%s` on your component more than once. This conflict may be due to a mixin.\",n),e[n]=r}}}function p(e,t){u(e&&t&&\"object\"==typeof e&&\"object\"==typeof t,\"mergeIntoWithNoDuplicateKeys(): Cannot merge non-objects.\");for(var n in t)t.hasOwnProperty(n)&&(u(void 0===e[n],\"mergeIntoWithNoDuplicateKeys(): Tried to merge two objects with the same key: `%s`. This conflict may be due to a mixin; in particular, this may be caused by two getInitialState() or getDefaultProps() methods returning objects with clashing keys.\",n),e[n]=t[n]);return e}function f(e,t){return function(){var n=e.apply(this,arguments),r=t.apply(this,arguments);if(null==n)return r;if(null==r)return n;var i={};return p(i,n),p(i,r),i}}function h(e,t){return function(){e.apply(this,arguments),t.apply(this,arguments)}}function d(e,t){var n=t.bind(e);return n}function m(e){for(var t=e.__reactAutoBindPairs,n=0;n<t.length;n+=2){var r=t[n],i=t[n+1];e[r]=d(e,i)}}function v(e){var t=r(function(e,r,i){this.__reactAutoBindPairs.length&&m(this),this.props=e,this.context=r,this.refs=s,this.updater=i||n,this.state=null;var o=this.getInitialState?this.getInitialState():null;u(\"object\"==typeof o&&!Array.isArray(o),\"%s.getInitialState(): must return an object or null\",t.displayName||\"ReactCompositeComponent\"),this.state=o});t.prototype=new k,t.prototype.constructor=t,t.prototype.__reactAutoBindPairs=[],y.forEach(o.bind(null,t)),o(t,b),o(t,e),o(t,x),t.getDefaultProps&&(t.defaultProps=t.getDefaultProps()),u(t.prototype.render,\"createClass(...): Class specification must implement a `render` method.\");for(var i in g)t.prototype[i]||(t.prototype[i]=null);return t}var y=[],g={mixins:\"DEFINE_MANY\",statics:\"DEFINE_MANY\",propTypes:\"DEFINE_MANY\",contextTypes:\"DEFINE_MANY\",childContextTypes:\"DEFINE_MANY\",getDefaultProps:\"DEFINE_MANY_MERGED\",getInitialState:\"DEFINE_MANY_MERGED\",getChildContext:\"DEFINE_MANY_MERGED\",render:\"DEFINE_ONCE\",componentWillMount:\"DEFINE_MANY\",componentDidMount:\"DEFINE_MANY\",componentWillReceiveProps:\"DEFINE_MANY\",shouldComponentUpdate:\"DEFINE_ONCE\",componentWillUpdate:\"DEFINE_MANY\",componentDidUpdate:\"DEFINE_MANY\",componentWillUnmount:\"DEFINE_MANY\",updateComponent:\"OVERRIDE_BASE\"},_={displayName:function(e,t){e.displayName=t},mixins:function(e,t){if(t)for(var n=0;n<t.length;n++)o(e,t[n])},childContextTypes:function(e,t){e.childContextTypes=a({},e.childContextTypes,t)},contextTypes:function(e,t){e.contextTypes=a({},e.contextTypes,t)},getDefaultProps:function(e,t){e.getDefaultProps?e.getDefaultProps=f(e.getDefaultProps,t):e.getDefaultProps=t},propTypes:function(e,t){e.propTypes=a({},e.propTypes,t)},statics:function(e,t){l(e,t)},autobind:function(){}},b={componentDidMount:function(){this.__isMounted=!0}},x={componentWillUnmount:function(){this.__isMounted=!1}},w={replaceState:function(e,t){this.updater.enqueueReplaceState(this,e,t)},isMounted:function(){return!!this.__isMounted}},k=function(){};return a(k.prototype,e.prototype,w),v}var o,a=n(500),s=n(507),u=n(508),c=\"mixins\";o={},e.exports=i},function(e,t,n){\"use strict\";function r(e){return o.isValidElement(e)?void 0:i(\"143\"),e}var i=n(502),o=n(512);n(508);e.exports=r},function(e,t,n){\"use strict\";e.exports=n(529)},function(e,t,n){\"use strict\";var r=n(530),i=n(534),o=n(657),a=n(555),s=n(552),u=n(662),c=n(663),l=n(664),p=n(665);n(504);i.inject();var f={findDOMNode:c,render:o.render,unmountComponentAtNode:o.unmountComponentAtNode,version:u,unstable_batchedUpdates:s.batchedUpdates,unstable_renderSubtreeIntoContainer:p};\"undefined\"!=typeof __REACT_DEVTOOLS_GLOBAL_HOOK__&&\"function\"==typeof __REACT_DEVTOOLS_GLOBAL_HOOK__.inject&&__REACT_DEVTOOLS_GLOBAL_HOOK__.inject({ComponentTree:{getClosestInstanceFromNode:r.getClosestInstanceFromNode,getNodeFromInstance:function(e){return e._renderedComponent&&(e=l(e)),e?r.getNodeFromInstance(e):null}},Mount:o,Reconciler:a});e.exports=f},function(e,t,n){\"use strict\";function r(e,t){return 1===e.nodeType&&e.getAttribute(d)===String(t)||8===e.nodeType&&e.nodeValue===\" react-text: \"+t+\" \"||8===e.nodeType&&e.nodeValue===\" react-empty: \"+t+\" \"}function i(e){for(var t;t=e._renderedComponent;)e=t;return e}function o(e,t){var n=i(e);n._hostNode=t,t[v]=n}function a(e){var t=e._hostNode;t&&(delete t[v],e._hostNode=null)}function s(e,t){if(!(e._flags&m.hasCachedChildNodes)){var n=e._renderedChildren,a=t.firstChild;e:for(var s in n)if(n.hasOwnProperty(s)){var u=n[s],c=i(u)._domID;if(0!==c){for(;null!==a;a=a.nextSibling)if(r(a,c)){o(u,a);continue e}p(\"32\",c)}}e._flags|=m.hasCachedChildNodes}}function u(e){if(e[v])return e[v];for(var t=[];!e[v];){if(t.push(e),!e.parentNode)return null;e=e.parentNode}for(var n,r;e&&(r=e[v]);e=t.pop())n=r,t.length&&s(r,e);return n}function c(e){var t=u(e);return null!=t&&t._hostNode===e?t:null}function l(e){if(void 0===e._hostNode?p(\"33\"):void 0,e._hostNode)return e._hostNode;for(var t=[];!e._hostNode;)t.push(e),e._hostParent?void 0:p(\"34\"),e=e._hostParent;for(;t.length;e=t.pop())s(e,e._hostNode);return e._hostNode}var p=n(531),f=n(532),h=n(533),d=(n(508),f.ID_ATTRIBUTE_NAME),m=h,v=\"__reactInternalInstance$\"+Math.random().toString(36).slice(2),y={getClosestInstanceFromNode:u,getInstanceFromNode:c,getNodeFromInstance:l,precacheChildNodes:s,precacheNode:o,uncacheNode:a};e.exports=y},502,function(e,t,n){\"use strict\";function r(e,t){return(e&t)===t}var i=n(531),o=(n(508),{MUST_USE_PROPERTY:1,HAS_BOOLEAN_VALUE:4,HAS_NUMERIC_VALUE:8,HAS_POSITIVE_NUMERIC_VALUE:24,HAS_OVERLOADED_BOOLEAN_VALUE:32,injectDOMPropertyConfig:function(e){var t=o,n=e.Properties||{},a=e.DOMAttributeNamespaces||{},u=e.DOMAttributeNames||{},c=e.DOMPropertyNames||{},l=e.DOMMutationMethods||{};e.isCustomAttribute&&s._isCustomAttributeFunctions.push(e.isCustomAttribute);for(var p in n){s.properties.hasOwnProperty(p)?i(\"48\",p):void 0;var f=p.toLowerCase(),h=n[p],d={attributeName:f,attributeNamespace:null,propertyName:p,mutationMethod:null,mustUseProperty:r(h,t.MUST_USE_PROPERTY),hasBooleanValue:r(h,t.HAS_BOOLEAN_VALUE),hasNumericValue:r(h,t.HAS_NUMERIC_VALUE),hasPositiveNumericValue:r(h,t.HAS_POSITIVE_NUMERIC_VALUE),hasOverloadedBooleanValue:r(h,t.HAS_OVERLOADED_BOOLEAN_VALUE)};if(d.hasBooleanValue+d.hasNumericValue+d.hasOverloadedBooleanValue<=1?void 0:i(\"50\",p),u.hasOwnProperty(p)){var m=u[p];d.attributeName=m}a.hasOwnProperty(p)&&(d.attributeNamespace=a[p]),c.hasOwnProperty(p)&&(d.propertyName=c[p]),l.hasOwnProperty(p)&&(d.mutationMethod=l[p]),s.properties[p]=d}}}),a=\":A-Z_a-z\\\\u00C0-\\\\u00D6\\\\u00D8-\\\\u00F6\\\\u00F8-\\\\u02FF\\\\u0370-\\\\u037D\\\\u037F-\\\\u1FFF\\\\u200C-\\\\u200D\\\\u2070-\\\\u218F\\\\u2C00-\\\\u2FEF\\\\u3001-\\\\uD7FF\\\\uF900-\\\\uFDCF\\\\uFDF0-\\\\uFFFD\",s={ID_ATTRIBUTE_NAME:\"data-reactid\",ROOT_ATTRIBUTE_NAME:\"data-reactroot\",ATTRIBUTE_NAME_START_CHAR:a,ATTRIBUTE_NAME_CHAR:a+\"\\\\-.0-9\\\\u00B7\\\\u0300-\\\\u036F\\\\u203F-\\\\u2040\",properties:{},getPossibleStandardName:null,_isCustomAttributeFunctions:[],isCustomAttribute:function(e){for(var t=0;t<s._isCustomAttributeFunctions.length;t++){var n=s._isCustomAttributeFunctions[t];if(n(e))return!0}return!1},injection:o};e.exports=s},function(e,t){\"use strict\";var n={hasCachedChildNodes:1};e.exports=n},function(e,t,n){\"use strict\";function r(){k||(k=!0,g.EventEmitter.injectReactEventListener(y),g.EventPluginHub.injectEventPluginOrder(s),g.EventPluginUtils.injectComponentTree(f),g.EventPluginUtils.injectTreeTraversal(d),g.EventPluginHub.injectEventPluginsByName({SimpleEventPlugin:w,EnterLeaveEventPlugin:u,ChangeEventPlugin:a,SelectEventPlugin:x,BeforeInputEventPlugin:o}),g.HostComponent.injectGenericComponentClass(p),g.HostComponent.injectTextComponentClass(m),g.DOMProperty.injectDOMPropertyConfig(i),g.DOMProperty.injectDOMPropertyConfig(c),g.DOMProperty.injectDOMPropertyConfig(b),g.EmptyComponent.injectEmptyComponentFactory(function(e){return new h(e)}),g.Updates.injectReconcileTransaction(_),g.Updates.injectBatchingStrategy(v),g.Component.injectEnvironment(l))}var i=n(535),o=n(536),a=n(551),s=n(564),u=n(565),c=n(570),l=n(571),p=n(584),f=n(530),h=n(628),d=n(629),m=n(630),v=n(631),y=n(632),g=n(635),_=n(636),b=n(644),x=n(645),w=n(646),k=!1;e.exports={inject:r}},function(e,t){\"use strict\";var n={Properties:{\"aria-current\":0,\"aria-details\":0,\"aria-disabled\":0,\"aria-hidden\":0,\"aria-invalid\":0,\"aria-keyshortcuts\":0,\"aria-label\":0,\"aria-roledescription\":0,\"aria-autocomplete\":0,\"aria-checked\":0,\"aria-expanded\":0,\"aria-haspopup\":0,\"aria-level\":0,\"aria-modal\":0,\"aria-multiline\":0,\"aria-multiselectable\":0,\"aria-orientation\":0,\"aria-placeholder\":0,\"aria-pressed\":0,\"aria-readonly\":0,\"aria-required\":0,\"aria-selected\":0,\"aria-sort\":0,\"aria-valuemax\":0,\"aria-valuemin\":0,\"aria-valuenow\":0,\"aria-valuetext\":0,\"aria-atomic\":0,\"aria-busy\":0,\"aria-live\":0,\"aria-relevant\":0,\"aria-dropeffect\":0,\"aria-grabbed\":0,\"aria-activedescendant\":0,\"aria-colcount\":0,\"aria-colindex\":0,\"aria-colspan\":0,\"aria-controls\":0,\"aria-describedby\":0,\"aria-errormessage\":0,\"aria-flowto\":0,\"aria-labelledby\":0,\"aria-owns\":0,\"aria-posinset\":0,\"aria-rowcount\":0,\"aria-rowindex\":0,\"aria-rowspan\":0,\"aria-setsize\":0},DOMAttributeNames:{},DOMPropertyNames:{}};e.exports=n},function(e,t,n){\"use strict\";function r(){var e=window.opera;return\"object\"==typeof e&&\"function\"==typeof e.version&&parseInt(e.version(),10)<=12}function i(e){return(e.ctrlKey||e.altKey||e.metaKey)&&!(e.ctrlKey&&e.altKey)}function o(e){switch(e){case\"topCompositionStart\":return C.compositionStart;case\"topCompositionEnd\":return C.compositionEnd;case\"topCompositionUpdate\":return C.compositionUpdate}}function a(e,t){return\"topKeyDown\"===e&&t.keyCode===_}function s(e,t){switch(e){case\"topKeyUp\":return g.indexOf(t.keyCode)!==-1;case\"topKeyDown\":return t.keyCode!==_;case\"topKeyPress\":case\"topMouseDown\":case\"topBlur\":return!0;default:return!1}}function u(e){var t=e.detail;return\"object\"==typeof t&&\"data\"in t?t.data:null}function c(e,t,n,r){var i,c;if(b?i=o(e):T?s(e,n)&&(i=C.compositionEnd):a(e,n)&&(i=C.compositionStart),!i)return null;k&&(T||i!==C.compositionStart?i===C.compositionEnd&&T&&(c=T.getData()):T=m.getPooled(r));var l=v.getPooled(i,t,n,r);if(c)l.data=c;else{var p=u(n);null!==p&&(l.data=p)}return h.accumulateTwoPhaseDispatches(l),l}function l(e,t){switch(e){case\"topCompositionEnd\":return u(t);case\"topKeyPress\":var n=t.which;return n!==S?null:(A=!0,E);case\"topTextInput\":var r=t.data;return r===E&&A?null:r;default:return null}}function p(e,t){if(T){if(\"topCompositionEnd\"===e||!b&&s(e,t)){var n=T.getData();return m.release(T),T=null,n}return null}switch(e){case\"topPaste\":return null;case\"topKeyPress\":return t.which&&!i(t)?String.fromCharCode(t.which):null;case\"topCompositionEnd\":return k?null:t.data;default:return null}}function f(e,t,n,r){var i;if(i=w?l(e,n):p(e,n),!i)return null;var o=y.getPooled(C.beforeInput,t,n,r);return o.data=i,h.accumulateTwoPhaseDispatches(o),o}var h=n(537),d=n(544),m=n(545),v=n(548),y=n(550),g=[9,13,27,32],_=229,b=d.canUseDOM&&\"CompositionEvent\"in window,x=null;d.canUseDOM&&\"documentMode\"in document&&(x=document.documentMode);var w=d.canUseDOM&&\"TextEvent\"in window&&!x&&!r(),k=d.canUseDOM&&(!b||x&&x>8&&x<=11),S=32,E=String.fromCharCode(S),C={beforeInput:{phasedRegistrationNames:{bubbled:\"onBeforeInput\",captured:\"onBeforeInputCapture\"},dependencies:[\"topCompositionEnd\",\"topKeyPress\",\"topTextInput\",\"topPaste\"]},compositionEnd:{phasedRegistrationNames:{bubbled:\"onCompositionEnd\",captured:\"onCompositionEndCapture\"},dependencies:[\"topBlur\",\"topCompositionEnd\",\"topKeyDown\",\"topKeyPress\",\"topKeyUp\",\"topMouseDown\"]},compositionStart:{phasedRegistrationNames:{bubbled:\"onCompositionStart\",captured:\"onCompositionStartCapture\"},dependencies:[\"topBlur\",\"topCompositionStart\",\"topKeyDown\",\"topKeyPress\",\"topKeyUp\",\"topMouseDown\"]},compositionUpdate:{phasedRegistrationNames:{bubbled:\"onCompositionUpdate\",captured:\"onCompositionUpdateCapture\"},dependencies:[\"topBlur\",\"topCompositionUpdate\",\"topKeyDown\",\"topKeyPress\",\"topKeyUp\",\"topMouseDown\"]}},A=!1,T=null,D={eventTypes:C,extractEvents:function(e,t,n,r){return[c(e,t,n,r),f(e,t,n,r)]}};e.exports=D},function(e,t,n){\"use strict\";function r(e,t,n){var r=t.dispatchConfig.phasedRegistrationNames[n];return y(e,r)}function i(e,t,n){var i=r(e,n,t);i&&(n._dispatchListeners=m(n._dispatchListeners,i),n._dispatchInstances=m(n._dispatchInstances,e))}function o(e){e&&e.dispatchConfig.phasedRegistrationNames&&d.traverseTwoPhase(e._targetInst,i,e)}function a(e){if(e&&e.dispatchConfig.phasedRegistrationNames){var t=e._targetInst,n=t?d.getParentInstance(t):null;d.traverseTwoPhase(n,i,e)}}function s(e,t,n){if(n&&n.dispatchConfig.registrationName){var r=n.dispatchConfig.registrationName,i=y(e,r);i&&(n._dispatchListeners=m(n._dispatchListeners,i),n._dispatchInstances=m(n._dispatchInstances,e))}}function u(e){e&&e.dispatchConfig.registrationName&&s(e._targetInst,null,e)}function c(e){v(e,o)}function l(e){v(e,a)}function p(e,t,n,r){d.traverseEnterLeave(n,r,s,e,t)}function f(e){v(e,u)}var h=n(538),d=n(540),m=n(542),v=n(543),y=(n(504),h.getListener),g={accumulateTwoPhaseDispatches:c,accumulateTwoPhaseDispatchesSkipTarget:l,accumulateDirectDispatches:f,accumulateEnterLeaveDispatches:p};e.exports=g},function(e,t,n){\"use strict\";function r(e){return\"button\"===e||\"input\"===e||\"select\"===e||\"textarea\"===e}function i(e,t,n){switch(e){case\"onClick\":case\"onClickCapture\":case\"onDoubleClick\":case\"onDoubleClickCapture\":case\"onMouseDown\":case\"onMouseDownCapture\":case\"onMouseMove\":case\"onMouseMoveCapture\":case\"onMouseUp\":case\"onMouseUpCapture\":return!(!n.disabled||!r(t));default:return!1}}var o=n(531),a=n(539),s=n(540),u=n(541),c=n(542),l=n(543),p=(n(508),{}),f=null,h=function(e,t){e&&(s.executeDispatchesInOrder(e,t),e.isPersistent()||e.constructor.release(e))},d=function(e){return h(e,!0)},m=function(e){return h(e,!1)},v=function(e){return\".\"+e._rootNodeID},y={injection:{injectEventPluginOrder:a.injectEventPluginOrder,injectEventPluginsByName:a.injectEventPluginsByName},putListener:function(e,t,n){\"function\"!=typeof n?o(\"94\",t,typeof n):void 0;var r=v(e),i=p[t]||(p[t]={});i[r]=n;var s=a.registrationNameModules[t];s&&s.didPutListener&&s.didPutListener(e,t,n)},getListener:function(e,t){var n=p[t];if(i(t,e._currentElement.type,e._currentElement.props))return null;var r=v(e);return n&&n[r]},deleteListener:function(e,t){var n=a.registrationNameModules[t];n&&n.willDeleteListener&&n.willDeleteListener(e,t);var r=p[t];if(r){var i=v(e);delete r[i]}},deleteAllListeners:function(e){var t=v(e);for(var n in p)if(p.hasOwnProperty(n)&&p[n][t]){var r=a.registrationNameModules[n];r&&r.willDeleteListener&&r.willDeleteListener(e,n),delete p[n][t]}},extractEvents:function(e,t,n,r){for(var i,o=a.plugins,s=0;s<o.length;s++){var u=o[s];if(u){var l=u.extractEvents(e,t,n,r);l&&(i=c(i,l))}}return i},enqueueEvents:function(e){e&&(f=c(f,e))},processEventQueue:function(e){var t=f;f=null,e?l(t,d):l(t,m),f?o(\"95\"):void 0,u.rethrowCaughtError()},__purge:function(){p={}},__getListenerBank:function(){return p}};e.exports=y},function(e,t,n){\"use strict\";function r(){if(s)for(var e in u){\nvar t=u[e],n=s.indexOf(e);if(n>-1?void 0:a(\"96\",e),!c.plugins[n]){t.extractEvents?void 0:a(\"97\",e),c.plugins[n]=t;var r=t.eventTypes;for(var o in r)i(r[o],t,o)?void 0:a(\"98\",o,e)}}}function i(e,t,n){c.eventNameDispatchConfigs.hasOwnProperty(n)?a(\"99\",n):void 0,c.eventNameDispatchConfigs[n]=e;var r=e.phasedRegistrationNames;if(r){for(var i in r)if(r.hasOwnProperty(i)){var s=r[i];o(s,t,n)}return!0}return!!e.registrationName&&(o(e.registrationName,t,n),!0)}function o(e,t,n){c.registrationNameModules[e]?a(\"100\",e):void 0,c.registrationNameModules[e]=t,c.registrationNameDependencies[e]=t.eventTypes[n].dependencies}var a=n(531),s=(n(508),null),u={},c={plugins:[],eventNameDispatchConfigs:{},registrationNameModules:{},registrationNameDependencies:{},possibleRegistrationNames:null,injectEventPluginOrder:function(e){s?a(\"101\"):void 0,s=Array.prototype.slice.call(e),r()},injectEventPluginsByName:function(e){var t=!1;for(var n in e)if(e.hasOwnProperty(n)){var i=e[n];u.hasOwnProperty(n)&&u[n]===i||(u[n]?a(\"102\",n):void 0,u[n]=i,t=!0)}t&&r()},getPluginModuleForEvent:function(e){var t=e.dispatchConfig;if(t.registrationName)return c.registrationNameModules[t.registrationName]||null;if(void 0!==t.phasedRegistrationNames){var n=t.phasedRegistrationNames;for(var r in n)if(n.hasOwnProperty(r)){var i=c.registrationNameModules[n[r]];if(i)return i}}return null},_resetEventPlugins:function(){s=null;for(var e in u)u.hasOwnProperty(e)&&delete u[e];c.plugins.length=0;var t=c.eventNameDispatchConfigs;for(var n in t)t.hasOwnProperty(n)&&delete t[n];var r=c.registrationNameModules;for(var i in r)r.hasOwnProperty(i)&&delete r[i]}};e.exports=c},function(e,t,n){\"use strict\";function r(e){return\"topMouseUp\"===e||\"topTouchEnd\"===e||\"topTouchCancel\"===e}function i(e){return\"topMouseMove\"===e||\"topTouchMove\"===e}function o(e){return\"topMouseDown\"===e||\"topTouchStart\"===e}function a(e,t,n,r){var i=e.type||\"unknown-event\";e.currentTarget=y.getNodeFromInstance(r),t?m.invokeGuardedCallbackWithCatch(i,n,e):m.invokeGuardedCallback(i,n,e),e.currentTarget=null}function s(e,t){var n=e._dispatchListeners,r=e._dispatchInstances;if(Array.isArray(n))for(var i=0;i<n.length&&!e.isPropagationStopped();i++)a(e,t,n[i],r[i]);else n&&a(e,t,n,r);e._dispatchListeners=null,e._dispatchInstances=null}function u(e){var t=e._dispatchListeners,n=e._dispatchInstances;if(Array.isArray(t)){for(var r=0;r<t.length&&!e.isPropagationStopped();r++)if(t[r](e,n[r]))return n[r]}else if(t&&t(e,n))return n;return null}function c(e){var t=u(e);return e._dispatchInstances=null,e._dispatchListeners=null,t}function l(e){var t=e._dispatchListeners,n=e._dispatchInstances;Array.isArray(t)?d(\"103\"):void 0,e.currentTarget=t?y.getNodeFromInstance(n):null;var r=t?t(e):null;return e.currentTarget=null,e._dispatchListeners=null,e._dispatchInstances=null,r}function p(e){return!!e._dispatchListeners}var f,h,d=n(531),m=n(541),v=(n(508),n(504),{injectComponentTree:function(e){f=e},injectTreeTraversal:function(e){h=e}}),y={isEndish:r,isMoveish:i,isStartish:o,executeDirectDispatch:l,executeDispatchesInOrder:s,executeDispatchesInOrderStopAtTrue:c,hasDispatches:p,getInstanceFromNode:function(e){return f.getInstanceFromNode(e)},getNodeFromInstance:function(e){return f.getNodeFromInstance(e)},isAncestor:function(e,t){return h.isAncestor(e,t)},getLowestCommonAncestor:function(e,t){return h.getLowestCommonAncestor(e,t)},getParentInstance:function(e){return h.getParentInstance(e)},traverseTwoPhase:function(e,t,n){return h.traverseTwoPhase(e,t,n)},traverseEnterLeave:function(e,t,n,r,i){return h.traverseEnterLeave(e,t,n,r,i)},injection:v};e.exports=y},function(e,t,n){\"use strict\";function r(e,t,n){try{t(n)}catch(e){null===i&&(i=e)}}var i=null,o={invokeGuardedCallback:r,invokeGuardedCallbackWithCatch:r,rethrowCaughtError:function(){if(i){var e=i;throw i=null,e}}};e.exports=o},function(e,t,n){\"use strict\";function r(e,t){return null==t?i(\"30\"):void 0,null==e?t:Array.isArray(e)?Array.isArray(t)?(e.push.apply(e,t),e):(e.push(t),e):Array.isArray(t)?[e].concat(t):[e,t]}var i=n(531);n(508);e.exports=r},function(e,t){\"use strict\";function n(e,t,n){Array.isArray(e)?e.forEach(t,n):e&&t.call(n,e)}e.exports=n},function(e,t){\"use strict\";var n=!(\"undefined\"==typeof window||!window.document||!window.document.createElement),r={canUseDOM:n,canUseWorkers:\"undefined\"!=typeof Worker,canUseEventListeners:n&&!(!window.addEventListener&&!window.attachEvent),canUseViewport:n&&!!window.screen,isInWorker:!n};e.exports=r},function(e,t,n){\"use strict\";function r(e){this._root=e,this._startText=this.getText(),this._fallbackText=null}var i=n(500),o=n(546),a=n(547);i(r.prototype,{destructor:function(){this._root=null,this._startText=null,this._fallbackText=null},getText:function(){return\"value\"in this._root?this._root.value:this._root[a()]},getData:function(){if(this._fallbackText)return this._fallbackText;var e,t,n=this._startText,r=n.length,i=this.getText(),o=i.length;for(e=0;e<r&&n[e]===i[e];e++);var a=r-e;for(t=1;t<=a&&n[r-t]===i[o-t];t++);var s=t>1?1-t:void 0;return this._fallbackText=i.slice(e,s),this._fallbackText}}),o.addPoolingTo(r),e.exports=r},[1231,531],function(e,t,n){\"use strict\";function r(){return!o&&i.canUseDOM&&(o=\"textContent\"in document.documentElement?\"textContent\":\"innerText\"),o}var i=n(544),o=null;e.exports=r},function(e,t,n){\"use strict\";function r(e,t,n,r){return i.call(this,e,t,n,r)}var i=n(549),o={data:null};i.augmentClass(r,o),e.exports=r},function(e,t,n){\"use strict\";function r(e,t,n,r){this.dispatchConfig=e,this._targetInst=t,this.nativeEvent=n;var i=this.constructor.Interface;for(var o in i)if(i.hasOwnProperty(o)){var s=i[o];s?this[o]=s(n):\"target\"===o?this.target=r:this[o]=n[o]}var u=null!=n.defaultPrevented?n.defaultPrevented:n.returnValue===!1;return u?this.isDefaultPrevented=a.thatReturnsTrue:this.isDefaultPrevented=a.thatReturnsFalse,this.isPropagationStopped=a.thatReturnsFalse,this}var i=n(500),o=n(546),a=n(505),s=(n(504),\"function\"==typeof Proxy,[\"dispatchConfig\",\"_targetInst\",\"nativeEvent\",\"isDefaultPrevented\",\"isPropagationStopped\",\"_dispatchListeners\",\"_dispatchInstances\"]),u={type:null,target:null,currentTarget:a.thatReturnsNull,eventPhase:null,bubbles:null,cancelable:null,timeStamp:function(e){return e.timeStamp||Date.now()},defaultPrevented:null,isTrusted:null};i(r.prototype,{preventDefault:function(){this.defaultPrevented=!0;var e=this.nativeEvent;e&&(e.preventDefault?e.preventDefault():\"unknown\"!=typeof e.returnValue&&(e.returnValue=!1),this.isDefaultPrevented=a.thatReturnsTrue)},stopPropagation:function(){var e=this.nativeEvent;e&&(e.stopPropagation?e.stopPropagation():\"unknown\"!=typeof e.cancelBubble&&(e.cancelBubble=!0),this.isPropagationStopped=a.thatReturnsTrue)},persist:function(){this.isPersistent=a.thatReturnsTrue},isPersistent:a.thatReturnsFalse,destructor:function(){var e=this.constructor.Interface;for(var t in e)this[t]=null;for(var n=0;n<s.length;n++)this[s[n]]=null}}),r.Interface=u,r.augmentClass=function(e,t){var n=this,r=function(){};r.prototype=n.prototype;var a=new r;i(a,e.prototype),e.prototype=a,e.prototype.constructor=e,e.Interface=i({},n.Interface,t),e.augmentClass=n.augmentClass,o.addPoolingTo(e,o.fourArgumentPooler)},o.addPoolingTo(r,o.fourArgumentPooler),e.exports=r},function(e,t,n){\"use strict\";function r(e,t,n,r){return i.call(this,e,t,n,r)}var i=n(549),o={data:null};i.augmentClass(r,o),e.exports=r},function(e,t,n){\"use strict\";function r(e,t,n){var r=C.getPooled(O.change,e,t,n);return r.type=\"change\",w.accumulateTwoPhaseDispatches(r),r}function i(e){var t=e.nodeName&&e.nodeName.toLowerCase();return\"select\"===t||\"input\"===t&&\"file\"===e.type}function o(e){var t=r(I,e,T(e));E.batchedUpdates(a,t)}function a(e){x.enqueueEvents(e),x.processEventQueue(!1)}function s(e,t){P=e,I=t,P.attachEvent(\"onchange\",o)}function u(){P&&(P.detachEvent(\"onchange\",o),P=null,I=null)}function c(e,t){var n=A.updateValueIfChanged(e),r=t.simulated===!0&&j._allowSimulatedPassThrough;if(n||r)return e}function l(e,t){if(\"topChange\"===e)return t}function p(e,t,n){\"topFocus\"===e?(u(),s(t,n)):\"topBlur\"===e&&u()}function f(e,t){P=e,I=t,P.attachEvent(\"onpropertychange\",d)}function h(){P&&(P.detachEvent(\"onpropertychange\",d),P=null,I=null)}function d(e){\"value\"===e.propertyName&&c(I,e)&&o(e)}function m(e,t,n){\"topFocus\"===e?(h(),f(t,n)):\"topBlur\"===e&&h()}function v(e,t,n){if(\"topSelectionChange\"===e||\"topKeyUp\"===e||\"topKeyDown\"===e)return c(I,n)}function y(e){var t=e.nodeName;return t&&\"input\"===t.toLowerCase()&&(\"checkbox\"===e.type||\"radio\"===e.type)}function g(e,t,n){if(\"topClick\"===e)return c(t,n)}function _(e,t,n){if(\"topInput\"===e||\"topChange\"===e)return c(t,n)}function b(e,t){if(null!=e){var n=e._wrapperState||t._wrapperState;if(n&&n.controlled&&\"number\"===t.type){var r=\"\"+t.value;t.getAttribute(\"value\")!==r&&t.setAttribute(\"value\",r)}}}var x=n(538),w=n(537),k=n(544),S=n(530),E=n(552),C=n(549),A=n(560),T=n(561),D=n(562),M=n(563),O={change:{phasedRegistrationNames:{bubbled:\"onChange\",captured:\"onChangeCapture\"},dependencies:[\"topBlur\",\"topChange\",\"topClick\",\"topFocus\",\"topInput\",\"topKeyDown\",\"topKeyUp\",\"topSelectionChange\"]}},P=null,I=null,N=!1;k.canUseDOM&&(N=D(\"change\")&&(!document.documentMode||document.documentMode>8));var R=!1;k.canUseDOM&&(R=D(\"input\")&&(!(\"documentMode\"in document)||document.documentMode>9));var j={eventTypes:O,_allowSimulatedPassThrough:!0,_isInputEventSupported:R,extractEvents:function(e,t,n,o){var a,s,u=t?S.getNodeFromInstance(t):window;if(i(u)?N?a=l:s=p:M(u)?R?a=_:(a=v,s=m):y(u)&&(a=g),a){var c=a(e,t,n);if(c){var f=r(c,n,o);return f}}s&&s(e,u,t),\"topBlur\"===e&&b(t,u)}};e.exports=j},function(e,t,n){\"use strict\";function r(){A.ReactReconcileTransaction&&x?void 0:l(\"123\")}function i(){this.reinitializeTransaction(),this.dirtyComponentsLength=null,this.callbackQueue=f.getPooled(),this.reconcileTransaction=A.ReactReconcileTransaction.getPooled(!0)}function o(e,t,n,i,o,a){return r(),x.batchedUpdates(e,t,n,i,o,a)}function a(e,t){return e._mountOrder-t._mountOrder}function s(e){var t=e.dirtyComponentsLength;t!==y.length?l(\"124\",t,y.length):void 0,y.sort(a),g++;for(var n=0;n<t;n++){var r=y[n],i=r._pendingCallbacks;r._pendingCallbacks=null;var o;if(d.logTopLevelRenders){var s=r;r._currentElement.type.isReactTopLevelWrapper&&(s=r._renderedComponent),o=\"React update: \"+s.getName(),console.time(o)}if(m.performUpdateIfNecessary(r,e.reconcileTransaction,g),o&&console.timeEnd(o),i)for(var u=0;u<i.length;u++)e.callbackQueue.enqueue(i[u],r.getPublicInstance())}}function u(e){return r(),x.isBatchingUpdates?(y.push(e),void(null==e._updateBatchNumber&&(e._updateBatchNumber=g+1))):void x.batchedUpdates(u,e)}function c(e,t){x.isBatchingUpdates?void 0:l(\"125\"),_.enqueue(e,t),b=!0}var l=n(531),p=n(500),f=n(553),h=n(546),d=n(554),m=n(555),v=n(559),y=(n(508),[]),g=0,_=f.getPooled(),b=!1,x=null,w={initialize:function(){this.dirtyComponentsLength=y.length},close:function(){this.dirtyComponentsLength!==y.length?(y.splice(0,this.dirtyComponentsLength),E()):y.length=0}},k={initialize:function(){this.callbackQueue.reset()},close:function(){this.callbackQueue.notifyAll()}},S=[w,k];p(i.prototype,v,{getTransactionWrappers:function(){return S},destructor:function(){this.dirtyComponentsLength=null,f.release(this.callbackQueue),this.callbackQueue=null,A.ReactReconcileTransaction.release(this.reconcileTransaction),this.reconcileTransaction=null},perform:function(e,t,n){return v.perform.call(this,this.reconcileTransaction.perform,this.reconcileTransaction,e,t,n)}}),h.addPoolingTo(i);var E=function(){for(;y.length||b;){if(y.length){var e=i.getPooled();e.perform(s,null,e),i.release(e)}if(b){b=!1;var t=_;_=f.getPooled(),t.notifyAll(),f.release(t)}}},C={injectReconcileTransaction:function(e){e?void 0:l(\"126\"),A.ReactReconcileTransaction=e},injectBatchingStrategy:function(e){e?void 0:l(\"127\"),\"function\"!=typeof e.batchedUpdates?l(\"128\"):void 0,\"boolean\"!=typeof e.isBatchingUpdates?l(\"129\"):void 0,x=e}},A={ReactReconcileTransaction:null,batchedUpdates:o,enqueueUpdate:u,flushBatchedUpdates:E,injection:C,asap:c};e.exports=A},function(e,t,n){\"use strict\";function r(e,t){if(!(e instanceof t))throw new TypeError(\"Cannot call a class as a function\")}var i=n(531),o=n(546),a=(n(508),function(){function e(t){r(this,e),this._callbacks=null,this._contexts=null,this._arg=t}return e.prototype.enqueue=function(e,t){this._callbacks=this._callbacks||[],this._callbacks.push(e),this._contexts=this._contexts||[],this._contexts.push(t)},e.prototype.notifyAll=function(){var e=this._callbacks,t=this._contexts,n=this._arg;if(e&&t){e.length!==t.length?i(\"24\"):void 0,this._callbacks=null,this._contexts=null;for(var r=0;r<e.length;r++)e[r].call(t[r],n);e.length=0,t.length=0}},e.prototype.checkpoint=function(){return this._callbacks?this._callbacks.length:0},e.prototype.rollback=function(e){this._callbacks&&this._contexts&&(this._callbacks.length=e,this._contexts.length=e)},e.prototype.reset=function(){this._callbacks=null,this._contexts=null},e.prototype.destructor=function(){this.reset()},e}());e.exports=o.addPoolingTo(a)},function(e,t){\"use strict\";var n={logTopLevelRenders:!1};e.exports=n},function(e,t,n){\"use strict\";function r(){i.attachRefs(this,this._currentElement)}var i=n(556),o=(n(558),n(504),{mountComponent:function(e,t,n,i,o,a){var s=e.mountComponent(t,n,i,o,a);return e._currentElement&&null!=e._currentElement.ref&&t.getReactMountReady().enqueue(r,e),s},getHostNode:function(e){return e.getHostNode()},unmountComponent:function(e,t){i.detachRefs(e,e._currentElement),e.unmountComponent(t)},receiveComponent:function(e,t,n,o){var a=e._currentElement;if(t!==a||o!==e._context){var s=i.shouldUpdateRefs(a,t);s&&i.detachRefs(e,a),e.receiveComponent(t,n,o),s&&e._currentElement&&null!=e._currentElement.ref&&n.getReactMountReady().enqueue(r,e)}},performUpdateIfNecessary:function(e,t,n){e._updateBatchNumber===n&&e.performUpdateIfNecessary(t)}});e.exports=o},function(e,t,n){\"use strict\";function r(e,t,n){\"function\"==typeof e?e(t.getPublicInstance()):o.addComponentAsRefTo(t,e,n)}function i(e,t,n){\"function\"==typeof e?e(null):o.removeComponentAsRefFrom(t,e,n)}var o=n(557),a={};a.attachRefs=function(e,t){if(null!==t&&\"object\"==typeof t){var n=t.ref;null!=n&&r(n,e,t._owner)}},a.shouldUpdateRefs=function(e,t){var n=null,r=null;null!==e&&\"object\"==typeof e&&(n=e.ref,r=e._owner);var i=null,o=null;return null!==t&&\"object\"==typeof t&&(i=t.ref,o=t._owner),n!==i||\"string\"==typeof i&&o!==r},a.detachRefs=function(e,t){if(null!==t&&\"object\"==typeof t){var n=t.ref;null!=n&&i(n,e,t._owner)}},e.exports=a},function(e,t,n){\"use strict\";function r(e){return!(!e||\"function\"!=typeof e.attachRef||\"function\"!=typeof e.detachRef)}var i=n(531),o=(n(508),{addComponentAsRefTo:function(e,t,n){r(n)?void 0:i(\"119\"),n.attachRef(t,e)},removeComponentAsRefFrom:function(e,t,n){r(n)?void 0:i(\"120\");var o=n.getPublicInstance();o&&o.refs[t]===e.getPublicInstance()&&n.detachRef(t)}});e.exports=o},function(e,t,n){\"use strict\";var r=null;e.exports={debugTool:r}},function(e,t,n){\"use strict\";var r=n(531),i=(n(508),{}),o={reinitializeTransaction:function(){this.transactionWrappers=this.getTransactionWrappers(),this.wrapperInitData?this.wrapperInitData.length=0:this.wrapperInitData=[],this._isInTransaction=!1},_isInTransaction:!1,getTransactionWrappers:null,isInTransaction:function(){return!!this._isInTransaction},perform:function(e,t,n,i,o,a,s,u){this.isInTransaction()?r(\"27\"):void 0;var c,l;try{this._isInTransaction=!0,c=!0,this.initializeAll(0),l=e.call(t,n,i,o,a,s,u),c=!1}finally{try{if(c)try{this.closeAll(0)}catch(e){}else this.closeAll(0)}finally{this._isInTransaction=!1}}return l},initializeAll:function(e){for(var t=this.transactionWrappers,n=e;n<t.length;n++){var r=t[n];try{this.wrapperInitData[n]=i,this.wrapperInitData[n]=r.initialize?r.initialize.call(this):null}finally{if(this.wrapperInitData[n]===i)try{this.initializeAll(n+1)}catch(e){}}}},closeAll:function(e){this.isInTransaction()?void 0:r(\"28\");for(var t=this.transactionWrappers,n=e;n<t.length;n++){var o,a=t[n],s=this.wrapperInitData[n];try{o=!0,s!==i&&a.close&&a.close.call(this,s),o=!1}finally{if(o)try{this.closeAll(n+1)}catch(e){}}}this.wrapperInitData.length=0}};e.exports=o},function(e,t,n){\"use strict\";function r(e){var t=e.type,n=e.nodeName;return n&&\"input\"===n.toLowerCase()&&(\"checkbox\"===t||\"radio\"===t)}function i(e){return e._wrapperState.valueTracker}function o(e,t){e._wrapperState.valueTracker=t}function a(e){delete e._wrapperState.valueTracker}function s(e){var t;return e&&(t=r(e)?\"\"+e.checked:e.value),t}var u=n(530),c={_getTrackerFromNode:function(e){return i(u.getInstanceFromNode(e))},track:function(e){if(!i(e)){var t=u.getNodeFromInstance(e),n=r(t)?\"checked\":\"value\",s=Object.getOwnPropertyDescriptor(t.constructor.prototype,n),c=\"\"+t[n];t.hasOwnProperty(n)||\"function\"!=typeof s.get||\"function\"!=typeof s.set||(Object.defineProperty(t,n,{enumerable:s.enumerable,configurable:!0,get:function(){return s.get.call(this)},set:function(e){c=\"\"+e,s.set.call(this,e)}}),o(e,{getValue:function(){return c},setValue:function(e){c=\"\"+e},stopTracking:function(){a(e),delete t[n]}}))}},updateValueIfChanged:function(e){if(!e)return!1;var t=i(e);if(!t)return c.track(e),!0;var n=t.getValue(),r=s(u.getNodeFromInstance(e));return r!==n&&(t.setValue(r),!0)},stopTracking:function(e){var t=i(e);t&&t.stopTracking()}};e.exports=c},function(e,t){\"use strict\";function n(e){var t=e.target||e.srcElement||window;return t.correspondingUseElement&&(t=t.correspondingUseElement),3===t.nodeType?t.parentNode:t}e.exports=n},function(e,t,n){\"use strict\";/**\n\t * Checks if an event is supported in the current execution environment.\n\t *\n\t * NOTE: This will not work correctly for non-generic events such as `change`,\n\t * `reset`, `load`, `error`, and `select`.\n\t *\n\t * Borrows from Modernizr.\n\t *\n\t * @param {string} eventNameSuffix Event name, e.g. \"click\".\n\t * @param {?boolean} capture Check if the capture phase is supported.\n\t * @return {boolean} True if the event is supported.\n\t * @internal\n\t * @license Modernizr 3.0.0pre (Custom Build) | MIT\n\t */\nfunction r(e,t){if(!o.canUseDOM||t&&!(\"addEventListener\"in document))return!1;var n=\"on\"+e,r=n in document;if(!r){var a=document.createElement(\"div\");a.setAttribute(n,\"return;\"),r=\"function\"==typeof a[n]}return!r&&i&&\"wheel\"===e&&(r=document.implementation.hasFeature(\"Events.wheel\",\"3.0\")),r}var i,o=n(544);o.canUseDOM&&(i=document.implementation&&document.implementation.hasFeature&&document.implementation.hasFeature(\"\",\"\")!==!0),e.exports=r},function(e,t){\"use strict\";function n(e){var t=e&&e.nodeName&&e.nodeName.toLowerCase();return\"input\"===t?!!r[e.type]:\"textarea\"===t}var r={color:!0,date:!0,datetime:!0,\"datetime-local\":!0,email:!0,month:!0,number:!0,password:!0,range:!0,search:!0,tel:!0,text:!0,time:!0,url:!0,week:!0};e.exports=n},function(e,t){\"use strict\";var n=[\"ResponderEventPlugin\",\"SimpleEventPlugin\",\"TapEventPlugin\",\"EnterLeaveEventPlugin\",\"ChangeEventPlugin\",\"SelectEventPlugin\",\"BeforeInputEventPlugin\"];e.exports=n},function(e,t,n){\"use strict\";var r=n(537),i=n(530),o=n(566),a={mouseEnter:{registrationName:\"onMouseEnter\",dependencies:[\"topMouseOut\",\"topMouseOver\"]},mouseLeave:{registrationName:\"onMouseLeave\",dependencies:[\"topMouseOut\",\"topMouseOver\"]}},s={eventTypes:a,extractEvents:function(e,t,n,s){if(\"topMouseOver\"===e&&(n.relatedTarget||n.fromElement))return null;if(\"topMouseOut\"!==e&&\"topMouseOver\"!==e)return null;var u;if(s.window===s)u=s;else{var c=s.ownerDocument;u=c?c.defaultView||c.parentWindow:window}var l,p;if(\"topMouseOut\"===e){l=t;var f=n.relatedTarget||n.toElement;p=f?i.getClosestInstanceFromNode(f):null}else l=null,p=t;if(l===p)return null;var h=null==l?u:i.getNodeFromInstance(l),d=null==p?u:i.getNodeFromInstance(p),m=o.getPooled(a.mouseLeave,l,n,s);m.type=\"mouseleave\",m.target=h,m.relatedTarget=d;var v=o.getPooled(a.mouseEnter,p,n,s);return v.type=\"mouseenter\",v.target=d,v.relatedTarget=h,r.accumulateEnterLeaveDispatches(m,v,l,p),[m,v]}};e.exports=s},function(e,t,n){\"use strict\";function r(e,t,n,r){return i.call(this,e,t,n,r)}var i=n(567),o=n(568),a=n(569),s={screenX:null,screenY:null,clientX:null,clientY:null,ctrlKey:null,shiftKey:null,altKey:null,metaKey:null,getModifierState:a,button:function(e){var t=e.button;return\"which\"in e?t:2===t?2:4===t?1:0},buttons:null,relatedTarget:function(e){return e.relatedTarget||(e.fromElement===e.srcElement?e.toElement:e.fromElement)},pageX:function(e){return\"pageX\"in e?e.pageX:e.clientX+o.currentScrollLeft},pageY:function(e){return\"pageY\"in e?e.pageY:e.clientY+o.currentScrollTop}};i.augmentClass(r,s),e.exports=r},function(e,t,n){\"use strict\";function r(e,t,n,r){return i.call(this,e,t,n,r)}var i=n(549),o=n(561),a={view:function(e){if(e.view)return e.view;var t=o(e);if(t.window===t)return t;var n=t.ownerDocument;return n?n.defaultView||n.parentWindow:window},detail:function(e){return e.detail||0}};i.augmentClass(r,a),e.exports=r},function(e,t){\"use strict\";var n={currentScrollLeft:0,currentScrollTop:0,refreshScrollValues:function(e){n.currentScrollLeft=e.x,n.currentScrollTop=e.y}};e.exports=n},function(e,t){\"use strict\";function n(e){var t=this,n=t.nativeEvent;if(n.getModifierState)return n.getModifierState(e);var r=i[e];return!!r&&!!n[r]}function r(e){return n}var i={Alt:\"altKey\",Control:\"ctrlKey\",Meta:\"metaKey\",Shift:\"shiftKey\"};e.exports=r},function(e,t,n){\"use strict\";var r=n(532),i=r.injection.MUST_USE_PROPERTY,o=r.injection.HAS_BOOLEAN_VALUE,a=r.injection.HAS_NUMERIC_VALUE,s=r.injection.HAS_POSITIVE_NUMERIC_VALUE,u=r.injection.HAS_OVERLOADED_BOOLEAN_VALUE,c={isCustomAttribute:RegExp.prototype.test.bind(new RegExp(\"^(data|aria)-[\"+r.ATTRIBUTE_NAME_CHAR+\"]*$\")),Properties:{accept:0,acceptCharset:0,accessKey:0,action:0,allowFullScreen:o,allowTransparency:0,alt:0,as:0,async:o,autoComplete:0,autoPlay:o,capture:o,cellPadding:0,cellSpacing:0,charSet:0,challenge:0,checked:i|o,cite:0,classID:0,className:0,cols:s,colSpan:0,content:0,contentEditable:0,contextMenu:0,controls:o,coords:0,crossOrigin:0,data:0,dateTime:0,default:o,defer:o,dir:0,disabled:o,download:u,draggable:0,encType:0,form:0,formAction:0,formEncType:0,formMethod:0,formNoValidate:o,formTarget:0,frameBorder:0,headers:0,height:0,hidden:o,high:0,href:0,hrefLang:0,htmlFor:0,httpEquiv:0,icon:0,id:0,inputMode:0,integrity:0,is:0,keyParams:0,keyType:0,kind:0,label:0,lang:0,list:0,loop:o,low:0,manifest:0,marginHeight:0,marginWidth:0,max:0,maxLength:0,media:0,mediaGroup:0,method:0,min:0,minLength:0,multiple:i|o,muted:i|o,name:0,nonce:0,noValidate:o,open:o,optimum:0,pattern:0,placeholder:0,playsInline:o,poster:0,preload:0,profile:0,radioGroup:0,readOnly:o,referrerPolicy:0,rel:0,required:o,reversed:o,role:0,rows:s,rowSpan:a,sandbox:0,scope:0,scoped:o,scrolling:0,seamless:o,selected:i|o,shape:0,size:s,sizes:0,span:s,spellCheck:0,src:0,srcDoc:0,srcLang:0,srcSet:0,start:a,step:0,style:0,summary:0,tabIndex:0,target:0,title:0,type:0,useMap:0,value:0,width:0,wmode:0,wrap:0,about:0,datatype:0,inlist:0,prefix:0,property:0,resource:0,typeof:0,vocab:0,autoCapitalize:0,autoCorrect:0,autoSave:0,color:0,itemProp:0,itemScope:o,itemType:0,itemID:0,itemRef:0,results:0,security:0,unselectable:0},DOMAttributeNames:{acceptCharset:\"accept-charset\",className:\"class\",htmlFor:\"for\",httpEquiv:\"http-equiv\"},DOMPropertyNames:{},DOMMutationMethods:{value:function(e,t){return null==t?e.removeAttribute(\"value\"):void(\"number\"!==e.type||e.hasAttribute(\"value\")===!1?e.setAttribute(\"value\",\"\"+t):e.validity&&!e.validity.badInput&&e.ownerDocument.activeElement!==e&&e.setAttribute(\"value\",\"\"+t))}}};e.exports=c},function(e,t,n){\"use strict\";var r=n(572),i=n(583),o={processChildrenUpdates:i.dangerouslyProcessChildrenUpdates,replaceNodeWithMarkup:r.dangerouslyReplaceNodeWithMarkup};e.exports=o},function(e,t,n){\"use strict\";function r(e,t){return Array.isArray(t)&&(t=t[1]),t?t.nextSibling:e.firstChild}function i(e,t,n){l.insertTreeBefore(e,t,n)}function o(e,t,n){Array.isArray(t)?s(e,t[0],t[1],n):m(e,t,n)}function a(e,t){if(Array.isArray(t)){var n=t[1];t=t[0],u(e,t,n),e.removeChild(n)}e.removeChild(t)}function s(e,t,n,r){for(var i=t;;){var o=i.nextSibling;if(m(e,i,r),i===n)break;i=o}}function u(e,t,n){for(;;){var r=t.nextSibling;if(r===n)break;e.removeChild(r)}}function c(e,t,n){var r=e.parentNode,i=e.nextSibling;i===t?n&&m(r,document.createTextNode(n),i):n?(d(i,n),u(r,i,t)):u(r,e,t)}var l=n(573),p=n(579),f=(n(530),n(558),n(576)),h=n(575),d=n(577),m=f(function(e,t,n){e.insertBefore(t,n)}),v=p.dangerouslyReplaceNodeWithMarkup,y={dangerouslyReplaceNodeWithMarkup:v,replaceDelimitedText:c,processUpdates:function(e,t){for(var n=0;n<t.length;n++){var s=t[n];switch(s.type){case\"INSERT_MARKUP\":i(e,s.content,r(e,s.afterNode));break;case\"MOVE_EXISTING\":o(e,s.fromNode,r(e,s.afterNode));break;case\"SET_MARKUP\":h(e,s.content);break;case\"TEXT_CONTENT\":d(e,s.content);break;case\"REMOVE_NODE\":a(e,s.fromNode)}}}};e.exports=y},function(e,t,n){\"use strict\";function r(e){if(v){var t=e.node,n=e.children;if(n.length)for(var r=0;r<n.length;r++)y(t,n[r],null);else null!=e.html?p(t,e.html):null!=e.text&&h(t,e.text)}}function i(e,t){e.parentNode.replaceChild(t.node,e),r(t)}function o(e,t){v?e.children.push(t):e.node.appendChild(t.node)}function a(e,t){v?e.html=t:p(e.node,t)}function s(e,t){v?e.text=t:h(e.node,t)}function u(){return this.node.nodeName}function c(e){return{node:e,children:[],html:null,text:null,toString:u}}var l=n(574),p=n(575),f=n(576),h=n(577),d=1,m=11,v=\"undefined\"!=typeof document&&\"number\"==typeof document.documentMode||\"undefined\"!=typeof navigator&&\"string\"==typeof navigator.userAgent&&/\\bEdge\\/\\d/.test(navigator.userAgent),y=f(function(e,t,n){t.node.nodeType===m||t.node.nodeType===d&&\"object\"===t.node.nodeName.toLowerCase()&&(null==t.node.namespaceURI||t.node.namespaceURI===l.html)?(r(t),e.insertBefore(t.node,n)):(e.insertBefore(t.node,n),r(t))});c.insertTreeBefore=y,c.replaceChildWithTree=i,c.queueChild=o,c.queueHTML=a,c.queueText=s,e.exports=c},function(e,t){\"use strict\";var n={html:\"http://www.w3.org/1999/xhtml\",mathml:\"http://www.w3.org/1998/Math/MathML\",svg:\"http://www.w3.org/2000/svg\"};e.exports=n},function(e,t,n){\"use strict\";var r,i=n(544),o=n(574),a=/^[ \\r\\n\\t\\f]/,s=/<(!--|link|noscript|meta|script|style)[ \\r\\n\\t\\f\\/>]/,u=n(576),c=u(function(e,t){if(e.namespaceURI!==o.svg||\"innerHTML\"in e)e.innerHTML=t;else{r=r||document.createElement(\"div\"),r.innerHTML=\"<svg>\"+t+\"</svg>\";for(var n=r.firstChild;n.firstChild;)e.appendChild(n.firstChild)}});if(i.canUseDOM){var l=document.createElement(\"div\");l.innerHTML=\" \",\"\"===l.innerHTML&&(c=function(e,t){if(e.parentNode&&e.parentNode.replaceChild(e,e),a.test(t)||\"<\"===t[0]&&s.test(t)){e.innerHTML=String.fromCharCode(65279)+t;var n=e.firstChild;1===n.data.length?e.removeChild(n):n.deleteData(0,1)}else e.innerHTML=t}),l=null}e.exports=c},function(e,t){\"use strict\";var n=function(e){return\"undefined\"!=typeof MSApp&&MSApp.execUnsafeLocalFunction?function(t,n,r,i){MSApp.execUnsafeLocalFunction(function(){return e(t,n,r,i)})}:e};e.exports=n},function(e,t,n){\"use strict\";var r=n(544),i=n(578),o=n(575),a=function(e,t){if(t){var n=e.firstChild;if(n&&n===e.lastChild&&3===n.nodeType)return void(n.nodeValue=t)}e.textContent=t};r.canUseDOM&&(\"textContent\"in document.documentElement||(a=function(e,t){return 3===e.nodeType?void(e.nodeValue=t):void o(e,i(t))})),e.exports=a},function(e,t){\"use strict\";function n(e){var t=\"\"+e,n=i.exec(t);if(!n)return t;var r,o=\"\",a=0,s=0;for(a=n.index;a<t.length;a++){switch(t.charCodeAt(a)){case 34:r=\"&quot;\";break;case 38:r=\"&amp;\";break;case 39:r=\"&#x27;\";break;case 60:r=\"&lt;\";break;case 62:r=\"&gt;\";break;default:continue}s!==a&&(o+=t.substring(s,a)),s=a+1,o+=r}return s!==a?o+t.substring(s,a):o}function r(e){return\"boolean\"==typeof e||\"number\"==typeof e?\"\"+e:n(e)}var i=/[\"'&<>]/;e.exports=r},function(e,t,n){\"use strict\";var r=n(531),i=n(573),o=n(544),a=n(580),s=n(505),u=(n(508),{dangerouslyReplaceNodeWithMarkup:function(e,t){if(o.canUseDOM?void 0:r(\"56\"),t?void 0:r(\"57\"),\"HTML\"===e.nodeName?r(\"58\"):void 0,\"string\"==typeof t){var n=a(t,s)[0];e.parentNode.replaceChild(n,e)}else i.replaceChildWithTree(e,t)}});e.exports=u},function(e,t,n){\"use strict\";function r(e){var t=e.match(l);return t&&t[1].toLowerCase()}function i(e,t){var n=c;c?void 0:u(!1);var i=r(e),o=i&&s(i);if(o){n.innerHTML=o[1]+e+o[2];for(var l=o[0];l--;)n=n.lastChild}else n.innerHTML=e;var p=n.getElementsByTagName(\"script\");p.length&&(t?void 0:u(!1),a(p).forEach(t));for(var f=Array.from(n.childNodes);n.lastChild;)n.removeChild(n.lastChild);return f}var o=n(544),a=n(581),s=n(582),u=n(508),c=o.canUseDOM?document.createElement(\"div\"):null,l=/^\\s*<(\\w+)/;e.exports=i},function(e,t,n){\"use strict\";function r(e){var t=e.length;if(Array.isArray(e)||\"object\"!=typeof e&&\"function\"!=typeof e?a(!1):void 0,\"number\"!=typeof t?a(!1):void 0,0===t||t-1 in e?void 0:a(!1),\"function\"==typeof e.callee?a(!1):void 0,e.hasOwnProperty)try{return Array.prototype.slice.call(e)}catch(e){}for(var n=Array(t),r=0;r<t;r++)n[r]=e[r];return n}function i(e){return!!e&&(\"object\"==typeof e||\"function\"==typeof e)&&\"length\"in e&&!(\"setInterval\"in e)&&\"number\"!=typeof e.nodeType&&(Array.isArray(e)||\"callee\"in e||\"item\"in e)}function o(e){return i(e)?Array.isArray(e)?e.slice():r(e):[e]}var a=n(508);e.exports=o},function(e,t,n){\"use strict\";function r(e){return a?void 0:o(!1),f.hasOwnProperty(e)||(e=\"*\"),s.hasOwnProperty(e)||(\"*\"===e?a.innerHTML=\"<link />\":a.innerHTML=\"<\"+e+\"></\"+e+\">\",s[e]=!a.firstChild),s[e]?f[e]:null}var i=n(544),o=n(508),a=i.canUseDOM?document.createElement(\"div\"):null,s={},u=[1,'<select multiple=\"true\">',\"</select>\"],c=[1,\"<table>\",\"</table>\"],l=[3,\"<table><tbody><tr>\",\"</tr></tbody></table>\"],p=[1,'<svg xmlns=\"http://www.w3.org/2000/svg\">',\"</svg>\"],f={\"*\":[1,\"?<div>\",\"</div>\"],area:[1,\"<map>\",\"</map>\"],col:[2,\"<table><tbody></tbody><colgroup>\",\"</colgroup></table>\"],legend:[1,\"<fieldset>\",\"</fieldset>\"],param:[1,\"<object>\",\"</object>\"],tr:[2,\"<table><tbody>\",\"</tbody></table>\"],optgroup:u,option:u,caption:c,colgroup:c,tbody:c,tfoot:c,thead:c,td:l,th:l},h=[\"circle\",\"clipPath\",\"defs\",\"ellipse\",\"g\",\"image\",\"line\",\"linearGradient\",\"mask\",\"path\",\"pattern\",\"polygon\",\"polyline\",\"radialGradient\",\"rect\",\"stop\",\"text\",\"tspan\"];h.forEach(function(e){f[e]=p,s[e]=!0}),e.exports=r},function(e,t,n){\"use strict\";var r=n(572),i=n(530),o={dangerouslyProcessChildrenUpdates:function(e,t){var n=i.getNodeFromInstance(e);r.processUpdates(n,t)}};e.exports=o},function(e,t,n){\"use strict\";function r(e){if(e){var t=e._currentElement._owner||null;if(t){var n=t.getName();if(n)return\" This DOM node was rendered by `\"+n+\"`.\"}}return\"\"}function i(e,t){t&&(Y[e._tag]&&(null!=t.children||null!=t.dangerouslySetInnerHTML?v(\"137\",e._tag,e._currentElement._owner?\" Check the render method of \"+e._currentElement._owner.getName()+\".\":\"\"):void 0),null!=t.dangerouslySetInnerHTML&&(null!=t.children?v(\"60\"):void 0,\"object\"==typeof t.dangerouslySetInnerHTML&&K in t.dangerouslySetInnerHTML?void 0:v(\"61\")),null!=t.style&&\"object\"!=typeof t.style?v(\"62\",r(e)):void 0)}function o(e,t,n,r){if(!(r instanceof N)){var i=e._hostContainerInfo,o=i._node&&i._node.nodeType===H,s=o?i._node:i._ownerDocument;z(t,s),r.getReactMountReady().enqueue(a,{inst:e,registrationName:t,listener:n})}}function a(){var e=this;S.putListener(e.inst,e.registrationName,e.listener)}function s(){var e=this;D.postMountWrapper(e)}function u(){var e=this;P.postMountWrapper(e)}function c(){var e=this;M.postMountWrapper(e)}function l(){j.track(this)}function p(){var e=this;e._rootNodeID?void 0:v(\"63\");var t=L(e);switch(t?void 0:v(\"64\"),e._tag){case\"iframe\":case\"object\":e._wrapperState.listeners=[C.trapBubbledEvent(\"topLoad\",\"load\",t)];break;case\"video\":case\"audio\":e._wrapperState.listeners=[];for(var n in J)J.hasOwnProperty(n)&&e._wrapperState.listeners.push(C.trapBubbledEvent(n,J[n],t));break;case\"source\":e._wrapperState.listeners=[C.trapBubbledEvent(\"topError\",\"error\",t)];break;case\"img\":e._wrapperState.listeners=[C.trapBubbledEvent(\"topError\",\"error\",t),C.trapBubbledEvent(\"topLoad\",\"load\",t)];break;case\"form\":e._wrapperState.listeners=[C.trapBubbledEvent(\"topReset\",\"reset\",t),C.trapBubbledEvent(\"topSubmit\",\"submit\",t)];break;case\"input\":case\"select\":case\"textarea\":e._wrapperState.listeners=[C.trapBubbledEvent(\"topInvalid\",\"invalid\",t)]}}function f(){O.postUpdateWrapper(this)}function h(e){Q.call(Z,e)||($.test(e)?void 0:v(\"65\",e),Z[e]=!0)}function d(e,t){return e.indexOf(\"-\")>=0||null!=t.is}function m(e){var t=e.type;h(t),this._currentElement=e,this._tag=t.toLowerCase(),this._namespaceURI=null,this._renderedChildren=null,this._previousStyle=null,this._previousStyleCopy=null,this._hostNode=null,this._hostParent=null,this._rootNodeID=0,this._domID=0,this._hostContainerInfo=null,this._wrapperState=null,this._topLevelWrapper=null,this._flags=0}var v=n(531),y=n(500),g=n(585),_=n(587),b=n(573),x=n(574),w=n(532),k=n(595),S=n(538),E=n(539),C=n(597),A=n(533),T=n(530),D=n(600),M=n(603),O=n(604),P=n(605),I=(n(558),n(606)),N=n(624),R=(n(505),n(578)),j=(n(508),n(562),n(613),n(560)),F=(n(627),n(504),A),B=S.deleteListener,L=T.getNodeFromInstance,z=C.listenTo,q=E.registrationNameModules,U={string:!0,number:!0},W=\"style\",K=\"__html\",V={children:null,dangerouslySetInnerHTML:null,suppressContentEditableWarning:null},H=11,J={topAbort:\"abort\",topCanPlay:\"canplay\",topCanPlayThrough:\"canplaythrough\",topDurationChange:\"durationchange\",topEmptied:\"emptied\",topEncrypted:\"encrypted\",topEnded:\"ended\",topError:\"error\",topLoadedData:\"loadeddata\",topLoadedMetadata:\"loadedmetadata\",topLoadStart:\"loadstart\",topPause:\"pause\",topPlay:\"play\",topPlaying:\"playing\",topProgress:\"progress\",topRateChange:\"ratechange\",topSeeked:\"seeked\",topSeeking:\"seeking\",topStalled:\"stalled\",topSuspend:\"suspend\",topTimeUpdate:\"timeupdate\",topVolumeChange:\"volumechange\",topWaiting:\"waiting\"},G={area:!0,base:!0,br:!0,col:!0,embed:!0,hr:!0,img:!0,input:!0,keygen:!0,link:!0,meta:!0,param:!0,source:!0,track:!0,wbr:!0},X={listing:!0,pre:!0,textarea:!0},Y=y({menuitem:!0},G),$=/^[a-zA-Z][a-zA-Z:_\\.\\-\\d]*$/,Z={},Q={}.hasOwnProperty,ee=1;m.displayName=\"ReactDOMComponent\",m.Mixin={mountComponent:function(e,t,n,r){this._rootNodeID=ee++,this._domID=n._idCounter++,this._hostParent=t,this._hostContainerInfo=n;var o=this._currentElement.props;switch(this._tag){case\"audio\":case\"form\":case\"iframe\":case\"img\":case\"link\":case\"object\":case\"source\":case\"video\":this._wrapperState={listeners:null},e.getReactMountReady().enqueue(p,this);break;case\"input\":D.mountWrapper(this,o,t),o=D.getHostProps(this,o),e.getReactMountReady().enqueue(l,this),e.getReactMountReady().enqueue(p,this);break;case\"option\":M.mountWrapper(this,o,t),o=M.getHostProps(this,o);break;case\"select\":O.mountWrapper(this,o,t),o=O.getHostProps(this,o),e.getReactMountReady().enqueue(p,this);break;case\"textarea\":P.mountWrapper(this,o,t),o=P.getHostProps(this,o),e.getReactMountReady().enqueue(l,this),e.getReactMountReady().enqueue(p,this)}i(this,o);var a,f;null!=t?(a=t._namespaceURI,f=t._tag):n._tag&&(a=n._namespaceURI,f=n._tag),(null==a||a===x.svg&&\"foreignobject\"===f)&&(a=x.html),a===x.html&&(\"svg\"===this._tag?a=x.svg:\"math\"===this._tag&&(a=x.mathml)),this._namespaceURI=a;var h;if(e.useCreateElement){var d,m=n._ownerDocument;if(a===x.html)if(\"script\"===this._tag){var v=m.createElement(\"div\"),y=this._currentElement.type;v.innerHTML=\"<\"+y+\"></\"+y+\">\",d=v.removeChild(v.firstChild)}else d=o.is?m.createElement(this._currentElement.type,o.is):m.createElement(this._currentElement.type);else d=m.createElementNS(a,this._currentElement.type);T.precacheNode(this,d),this._flags|=F.hasCachedChildNodes,this._hostParent||k.setAttributeForRoot(d),this._updateDOMProperties(null,o,e);var _=b(d);this._createInitialChildren(e,o,r,_),h=_}else{var w=this._createOpenTagMarkupAndPutListeners(e,o),S=this._createContentMarkup(e,o,r);h=!S&&G[this._tag]?w+\"/>\":w+\">\"+S+\"</\"+this._currentElement.type+\">\"}switch(this._tag){case\"input\":e.getReactMountReady().enqueue(s,this),o.autoFocus&&e.getReactMountReady().enqueue(g.focusDOMComponent,this);break;case\"textarea\":e.getReactMountReady().enqueue(u,this),o.autoFocus&&e.getReactMountReady().enqueue(g.focusDOMComponent,this);break;case\"select\":o.autoFocus&&e.getReactMountReady().enqueue(g.focusDOMComponent,this);break;case\"button\":o.autoFocus&&e.getReactMountReady().enqueue(g.focusDOMComponent,this);break;case\"option\":e.getReactMountReady().enqueue(c,this)}return h},_createOpenTagMarkupAndPutListeners:function(e,t){var n=\"<\"+this._currentElement.type;for(var r in t)if(t.hasOwnProperty(r)){var i=t[r];if(null!=i)if(q.hasOwnProperty(r))i&&o(this,r,i,e);else{r===W&&(i&&(i=this._previousStyleCopy=y({},t.style)),i=_.createMarkupForStyles(i,this));var a=null;null!=this._tag&&d(this._tag,t)?V.hasOwnProperty(r)||(a=k.createMarkupForCustomAttribute(r,i)):a=k.createMarkupForProperty(r,i),a&&(n+=\" \"+a)}}return e.renderToStaticMarkup?n:(this._hostParent||(n+=\" \"+k.createMarkupForRoot()),n+=\" \"+k.createMarkupForID(this._domID))},_createContentMarkup:function(e,t,n){var r=\"\",i=t.dangerouslySetInnerHTML;if(null!=i)null!=i.__html&&(r=i.__html);else{var o=U[typeof t.children]?t.children:null,a=null!=o?null:t.children;if(null!=o)r=R(o);else if(null!=a){var s=this.mountChildren(a,e,n);r=s.join(\"\")}}return X[this._tag]&&\"\\n\"===r.charAt(0)?\"\\n\"+r:r},_createInitialChildren:function(e,t,n,r){var i=t.dangerouslySetInnerHTML;if(null!=i)null!=i.__html&&b.queueHTML(r,i.__html);else{var o=U[typeof t.children]?t.children:null,a=null!=o?null:t.children;if(null!=o)\"\"!==o&&b.queueText(r,o);else if(null!=a)for(var s=this.mountChildren(a,e,n),u=0;u<s.length;u++)b.queueChild(r,s[u])}},receiveComponent:function(e,t,n){var r=this._currentElement;this._currentElement=e,this.updateComponent(t,r,e,n)},updateComponent:function(e,t,n,r){var o=t.props,a=this._currentElement.props;switch(this._tag){case\"input\":o=D.getHostProps(this,o),a=D.getHostProps(this,a);break;case\"option\":o=M.getHostProps(this,o),a=M.getHostProps(this,a);break;case\"select\":o=O.getHostProps(this,o),a=O.getHostProps(this,a);break;case\"textarea\":o=P.getHostProps(this,o),a=P.getHostProps(this,a)}switch(i(this,a),this._updateDOMProperties(o,a,e),this._updateDOMChildren(o,a,e,r),this._tag){case\"input\":D.updateWrapper(this);break;case\"textarea\":P.updateWrapper(this);break;case\"select\":e.getReactMountReady().enqueue(f,this)}},_updateDOMProperties:function(e,t,n){var r,i,a;for(r in e)if(!t.hasOwnProperty(r)&&e.hasOwnProperty(r)&&null!=e[r])if(r===W){var s=this._previousStyleCopy;for(i in s)s.hasOwnProperty(i)&&(a=a||{},a[i]=\"\");this._previousStyleCopy=null}else q.hasOwnProperty(r)?e[r]&&B(this,r):d(this._tag,e)?V.hasOwnProperty(r)||k.deleteValueForAttribute(L(this),r):(w.properties[r]||w.isCustomAttribute(r))&&k.deleteValueForProperty(L(this),r);for(r in t){var u=t[r],c=r===W?this._previousStyleCopy:null!=e?e[r]:void 0;if(t.hasOwnProperty(r)&&u!==c&&(null!=u||null!=c))if(r===W)if(u?u=this._previousStyleCopy=y({},u):this._previousStyleCopy=null,c){for(i in c)!c.hasOwnProperty(i)||u&&u.hasOwnProperty(i)||(a=a||{},a[i]=\"\");for(i in u)u.hasOwnProperty(i)&&c[i]!==u[i]&&(a=a||{},a[i]=u[i])}else a=u;else if(q.hasOwnProperty(r))u?o(this,r,u,n):c&&B(this,r);else if(d(this._tag,t))V.hasOwnProperty(r)||k.setValueForAttribute(L(this),r,u);else if(w.properties[r]||w.isCustomAttribute(r)){var l=L(this);null!=u?k.setValueForProperty(l,r,u):k.deleteValueForProperty(l,r)}}a&&_.setValueForStyles(L(this),a,this)},_updateDOMChildren:function(e,t,n,r){var i=U[typeof e.children]?e.children:null,o=U[typeof t.children]?t.children:null,a=e.dangerouslySetInnerHTML&&e.dangerouslySetInnerHTML.__html,s=t.dangerouslySetInnerHTML&&t.dangerouslySetInnerHTML.__html,u=null!=i?null:e.children,c=null!=o?null:t.children,l=null!=i||null!=a,p=null!=o||null!=s;null!=u&&null==c?this.updateChildren(null,n,r):l&&!p&&this.updateTextContent(\"\"),null!=o?i!==o&&this.updateTextContent(\"\"+o):null!=s?a!==s&&this.updateMarkup(\"\"+s):null!=c&&this.updateChildren(c,n,r)},getHostNode:function(){return L(this)},unmountComponent:function(e){switch(this._tag){case\"audio\":case\"form\":case\"iframe\":case\"img\":case\"link\":case\"object\":case\"source\":case\"video\":var t=this._wrapperState.listeners;if(t)for(var n=0;n<t.length;n++)t[n].remove();break;case\"input\":case\"textarea\":j.stopTracking(this);break;case\"html\":case\"head\":case\"body\":v(\"66\",this._tag)}this.unmountChildren(e),T.uncacheNode(this),S.deleteAllListeners(this),this._rootNodeID=0,this._domID=0,this._wrapperState=null},getPublicInstance:function(){return L(this)}},y(m.prototype,m.Mixin,I.Mixin),e.exports=m},function(e,t,n){\"use strict\";var r=n(530),i=n(586),o={focusDOMComponent:function(){i(r.getNodeFromInstance(this))}};e.exports=o},function(e,t){\"use strict\";function n(e){try{e.focus()}catch(e){}}e.exports=n},function(e,t,n){\"use strict\";var r=n(588),i=n(544),o=(n(558),n(589),n(591)),a=n(592),s=n(594),u=(n(504),s(function(e){return a(e)})),c=!1,l=\"cssFloat\";if(i.canUseDOM){var p=document.createElement(\"div\").style;try{p.font=\"\"}catch(e){c=!0}void 0===document.documentElement.style.cssFloat&&(l=\"styleFloat\")}var f={createMarkupForStyles:function(e,t){var n=\"\";for(var r in e)if(e.hasOwnProperty(r)){var i=0===r.indexOf(\"--\"),a=e[r];null!=a&&(n+=u(r)+\":\",n+=o(r,a,t,i)+\";\")}return n||null},setValueForStyles:function(e,t,n){var i=e.style;for(var a in t)if(t.hasOwnProperty(a)){var s=0===a.indexOf(\"--\"),u=o(a,t[a],n,s);if(\"float\"!==a&&\"cssFloat\"!==a||(a=l),s)i.setProperty(a,u);else if(u)i[a]=u;else{var p=c&&r.shorthandPropertyExpansions[a];if(p)for(var f in p)i[f]=\"\";else i[a]=\"\"}}}};e.exports=f},function(e,t){\"use strict\";function n(e,t){return e+t.charAt(0).toUpperCase()+t.substring(1)}var r={animationIterationCount:!0,borderImageOutset:!0,borderImageSlice:!0,borderImageWidth:!0,boxFlex:!0,boxFlexGroup:!0,boxOrdinalGroup:!0,columnCount:!0,flex:!0,flexGrow:!0,flexPositive:!0,flexShrink:!0,flexNegative:!0,flexOrder:!0,gridRow:!0,gridRowEnd:!0,gridRowSpan:!0,gridRowStart:!0,gridColumn:!0,gridColumnEnd:!0,gridColumnSpan:!0,gridColumnStart:!0,fontWeight:!0,lineClamp:!0,lineHeight:!0,opacity:!0,order:!0,orphans:!0,tabSize:!0,widows:!0,zIndex:!0,zoom:!0,fillOpacity:!0,floodOpacity:!0,stopOpacity:!0,strokeDasharray:!0,strokeDashoffset:!0,strokeMiterlimit:!0,strokeOpacity:!0,strokeWidth:!0},i=[\"Webkit\",\"ms\",\"Moz\",\"O\"];Object.keys(r).forEach(function(e){i.forEach(function(t){r[n(t,e)]=r[e]})});var o={background:{backgroundAttachment:!0,backgroundColor:!0,backgroundImage:!0,backgroundPositionX:!0,backgroundPositionY:!0,backgroundRepeat:!0},backgroundPosition:{backgroundPositionX:!0,backgroundPositionY:!0},border:{borderWidth:!0,borderStyle:!0,borderColor:!0},borderBottom:{borderBottomWidth:!0,borderBottomStyle:!0,borderBottomColor:!0},borderLeft:{borderLeftWidth:!0,borderLeftStyle:!0,borderLeftColor:!0},borderRight:{borderRightWidth:!0,borderRightStyle:!0,borderRightColor:!0},borderTop:{borderTopWidth:!0,borderTopStyle:!0,borderTopColor:!0},font:{fontStyle:!0,fontVariant:!0,fontWeight:!0,fontSize:!0,lineHeight:!0,fontFamily:!0},outline:{outlineWidth:!0,outlineStyle:!0,outlineColor:!0}},a={isUnitlessNumber:r,shorthandPropertyExpansions:o};e.exports=a},function(e,t,n){\"use strict\";function r(e){return i(e.replace(o,\"ms-\"))}var i=n(590),o=/^-ms-/;e.exports=r},function(e,t){\"use strict\";function n(e){return e.replace(r,function(e,t){return t.toUpperCase()})}var r=/-(.)/g;e.exports=n},function(e,t,n){\"use strict\";function r(e,t,n,r){var i=null==t||\"boolean\"==typeof t||\"\"===t;if(i)return\"\";var a=isNaN(t);if(r||a||0===t||o.hasOwnProperty(e)&&o[e])return\"\"+t;if(\"string\"==typeof t){t=t.trim()}return t+\"px\"}var i=n(588),o=(n(504),i.isUnitlessNumber);e.exports=r},function(e,t,n){\"use strict\";function r(e){return i(e).replace(o,\"-ms-\")}var i=n(593),o=/^ms-/;e.exports=r},function(e,t){\"use strict\";function n(e){return e.replace(r,\"-$1\").toLowerCase()}var r=/([A-Z])/g;e.exports=n},function(e,t){\"use strict\";function n(e){var t={};return function(n){return t.hasOwnProperty(n)||(t[n]=e.call(this,n)),t[n]}}e.exports=n},function(e,t,n){\"use strict\";function r(e){return!!c.hasOwnProperty(e)||!u.hasOwnProperty(e)&&(s.test(e)?(c[e]=!0,!0):(u[e]=!0,!1))}function i(e,t){return null==t||e.hasBooleanValue&&!t||e.hasNumericValue&&isNaN(t)||e.hasPositiveNumericValue&&t<1||e.hasOverloadedBooleanValue&&t===!1}var o=n(532),a=(n(530),n(558),n(596)),s=(n(504),new RegExp(\"^[\"+o.ATTRIBUTE_NAME_START_CHAR+\"][\"+o.ATTRIBUTE_NAME_CHAR+\"]*$\")),u={},c={},l={createMarkupForID:function(e){return o.ID_ATTRIBUTE_NAME+\"=\"+a(e)},setAttributeForID:function(e,t){e.setAttribute(o.ID_ATTRIBUTE_NAME,t)},createMarkupForRoot:function(){return o.ROOT_ATTRIBUTE_NAME+'=\"\"'},setAttributeForRoot:function(e){e.setAttribute(o.ROOT_ATTRIBUTE_NAME,\"\")},createMarkupForProperty:function(e,t){var n=o.properties.hasOwnProperty(e)?o.properties[e]:null;if(n){if(i(n,t))return\"\";var r=n.attributeName;return n.hasBooleanValue||n.hasOverloadedBooleanValue&&t===!0?r+'=\"\"':r+\"=\"+a(t)}return o.isCustomAttribute(e)?null==t?\"\":e+\"=\"+a(t):null},createMarkupForCustomAttribute:function(e,t){return r(e)&&null!=t?e+\"=\"+a(t):\"\"},setValueForProperty:function(e,t,n){var r=o.properties.hasOwnProperty(t)?o.properties[t]:null;if(r){var a=r.mutationMethod;if(a)a(e,n);else{if(i(r,n))return void this.deleteValueForProperty(e,t);if(r.mustUseProperty)e[r.propertyName]=n;else{var s=r.attributeName,u=r.attributeNamespace;u?e.setAttributeNS(u,s,\"\"+n):r.hasBooleanValue||r.hasOverloadedBooleanValue&&n===!0?e.setAttribute(s,\"\"):e.setAttribute(s,\"\"+n)}}}else if(o.isCustomAttribute(t))return void l.setValueForAttribute(e,t,n)},setValueForAttribute:function(e,t,n){if(r(t)){null==n?e.removeAttribute(t):e.setAttribute(t,\"\"+n)}},deleteValueForAttribute:function(e,t){e.removeAttribute(t)},deleteValueForProperty:function(e,t){var n=o.properties.hasOwnProperty(t)?o.properties[t]:null;if(n){var r=n.mutationMethod;if(r)r(e,void 0);else if(n.mustUseProperty){var i=n.propertyName;n.hasBooleanValue?e[i]=!1:e[i]=\"\"}else e.removeAttribute(n.attributeName)}else o.isCustomAttribute(t)&&e.removeAttribute(t)}};e.exports=l},function(e,t,n){\"use strict\";function r(e){return'\"'+i(e)+'\"'}var i=n(578);e.exports=r},function(e,t,n){\"use strict\";function r(e){return Object.prototype.hasOwnProperty.call(e,m)||(e[m]=h++,p[e[m]]={}),p[e[m]]}var i,o=n(500),a=n(539),s=n(598),u=n(568),c=n(599),l=n(562),p={},f=!1,h=0,d={topAbort:\"abort\",topAnimationEnd:c(\"animationend\")||\"animationend\",topAnimationIteration:c(\"animationiteration\")||\"animationiteration\",topAnimationStart:c(\"animationstart\")||\"animationstart\",topBlur:\"blur\",topCanPlay:\"canplay\",topCanPlayThrough:\"canplaythrough\",topChange:\"change\",topClick:\"click\",topCompositionEnd:\"compositionend\",topCompositionStart:\"compositionstart\",topCompositionUpdate:\"compositionupdate\",topContextMenu:\"contextmenu\",topCopy:\"copy\",topCut:\"cut\",topDoubleClick:\"dblclick\",topDrag:\"drag\",topDragEnd:\"dragend\",topDragEnter:\"dragenter\",topDragExit:\"dragexit\",topDragLeave:\"dragleave\",topDragOver:\"dragover\",topDragStart:\"dragstart\",topDrop:\"drop\",topDurationChange:\"durationchange\",topEmptied:\"emptied\",topEncrypted:\"encrypted\",topEnded:\"ended\",topError:\"error\",topFocus:\"focus\",topInput:\"input\",topKeyDown:\"keydown\",topKeyPress:\"keypress\",topKeyUp:\"keyup\",topLoadedData:\"loadeddata\",topLoadedMetadata:\"loadedmetadata\",topLoadStart:\"loadstart\",topMouseDown:\"mousedown\",topMouseMove:\"mousemove\",topMouseOut:\"mouseout\",topMouseOver:\"mouseover\",topMouseUp:\"mouseup\",topPaste:\"paste\",topPause:\"pause\",topPlay:\"play\",topPlaying:\"playing\",topProgress:\"progress\",topRateChange:\"ratechange\",topScroll:\"scroll\",topSeeked:\"seeked\",topSeeking:\"seeking\",topSelectionChange:\"selectionchange\",topStalled:\"stalled\",topSuspend:\"suspend\",topTextInput:\"textInput\",topTimeUpdate:\"timeupdate\",topTouchCancel:\"touchcancel\",topTouchEnd:\"touchend\",topTouchMove:\"touchmove\",topTouchStart:\"touchstart\",topTransitionEnd:c(\"transitionend\")||\"transitionend\",topVolumeChange:\"volumechange\",topWaiting:\"waiting\",topWheel:\"wheel\"},m=\"_reactListenersID\"+String(Math.random()).slice(2),v=o({},s,{ReactEventListener:null,injection:{injectReactEventListener:function(e){e.setHandleTopLevel(v.handleTopLevel),v.ReactEventListener=e}},setEnabled:function(e){v.ReactEventListener&&v.ReactEventListener.setEnabled(e)},isEnabled:function(){return!(!v.ReactEventListener||!v.ReactEventListener.isEnabled())},listenTo:function(e,t){for(var n=t,i=r(n),o=a.registrationNameDependencies[e],s=0;s<o.length;s++){var u=o[s];i.hasOwnProperty(u)&&i[u]||(\"topWheel\"===u?l(\"wheel\")?v.ReactEventListener.trapBubbledEvent(\"topWheel\",\"wheel\",n):l(\"mousewheel\")?v.ReactEventListener.trapBubbledEvent(\"topWheel\",\"mousewheel\",n):v.ReactEventListener.trapBubbledEvent(\"topWheel\",\"DOMMouseScroll\",n):\"topScroll\"===u?l(\"scroll\",!0)?v.ReactEventListener.trapCapturedEvent(\"topScroll\",\"scroll\",n):v.ReactEventListener.trapBubbledEvent(\"topScroll\",\"scroll\",v.ReactEventListener.WINDOW_HANDLE):\"topFocus\"===u||\"topBlur\"===u?(l(\"focus\",!0)?(v.ReactEventListener.trapCapturedEvent(\"topFocus\",\"focus\",n),v.ReactEventListener.trapCapturedEvent(\"topBlur\",\"blur\",n)):l(\"focusin\")&&(v.ReactEventListener.trapBubbledEvent(\"topFocus\",\"focusin\",n),v.ReactEventListener.trapBubbledEvent(\"topBlur\",\"focusout\",n)),i.topBlur=!0,i.topFocus=!0):d.hasOwnProperty(u)&&v.ReactEventListener.trapBubbledEvent(u,d[u],n),i[u]=!0)}},trapBubbledEvent:function(e,t,n){return v.ReactEventListener.trapBubbledEvent(e,t,n)},trapCapturedEvent:function(e,t,n){return v.ReactEventListener.trapCapturedEvent(e,t,n)},supportsEventPageXY:function(){if(!document.createEvent)return!1;var e=document.createEvent(\"MouseEvent\");return null!=e&&\"pageX\"in e},ensureScrollValueMonitoring:function(){if(void 0===i&&(i=v.supportsEventPageXY()),!i&&!f){var e=u.refreshScrollValues;v.ReactEventListener.monitorScrollValue(e),f=!0}}});e.exports=v},function(e,t,n){\"use strict\";function r(e){i.enqueueEvents(e),i.processEventQueue(!1)}var i=n(538),o={handleTopLevel:function(e,t,n,o){var a=i.extractEvents(e,t,n,o);r(a)}};e.exports=o},function(e,t,n){\"use strict\";function r(e,t){var n={};return n[e.toLowerCase()]=t.toLowerCase(),n[\"Webkit\"+e]=\"webkit\"+t,n[\"Moz\"+e]=\"moz\"+t,n[\"ms\"+e]=\"MS\"+t,\nn[\"O\"+e]=\"o\"+t.toLowerCase(),n}function i(e){if(s[e])return s[e];if(!a[e])return e;var t=a[e];for(var n in t)if(t.hasOwnProperty(n)&&n in u)return s[e]=t[n];return\"\"}var o=n(544),a={animationend:r(\"Animation\",\"AnimationEnd\"),animationiteration:r(\"Animation\",\"AnimationIteration\"),animationstart:r(\"Animation\",\"AnimationStart\"),transitionend:r(\"Transition\",\"TransitionEnd\")},s={},u={};o.canUseDOM&&(u=document.createElement(\"div\").style,\"AnimationEvent\"in window||(delete a.animationend.animation,delete a.animationiteration.animation,delete a.animationstart.animation),\"TransitionEvent\"in window||delete a.transitionend.transition),e.exports=i},function(e,t,n){\"use strict\";function r(){this._rootNodeID&&f.updateWrapper(this)}function i(e){var t=\"checkbox\"===e.type||\"radio\"===e.type;return t?null!=e.checked:null!=e.value}function o(e){var t=this._currentElement.props,n=c.executeOnChange(t,e);p.asap(r,this);var i=t.name;if(\"radio\"===t.type&&null!=i){for(var o=l.getNodeFromInstance(this),s=o;s.parentNode;)s=s.parentNode;for(var u=s.querySelectorAll(\"input[name=\"+JSON.stringify(\"\"+i)+'][type=\"radio\"]'),f=0;f<u.length;f++){var h=u[f];if(h!==o&&h.form===o.form){var d=l.getInstanceFromNode(h);d?void 0:a(\"90\"),p.asap(r,d)}}}return n}var a=n(531),s=n(500),u=n(595),c=n(601),l=n(530),p=n(552),f=(n(508),n(504),{getHostProps:function(e,t){var n=c.getValue(t),r=c.getChecked(t),i=s({type:void 0,step:void 0,min:void 0,max:void 0},t,{defaultChecked:void 0,defaultValue:void 0,value:null!=n?n:e._wrapperState.initialValue,checked:null!=r?r:e._wrapperState.initialChecked,onChange:e._wrapperState.onChange});return i},mountWrapper:function(e,t){var n=t.defaultValue;e._wrapperState={initialChecked:null!=t.checked?t.checked:t.defaultChecked,initialValue:null!=t.value?t.value:n,listeners:null,onChange:o.bind(e),controlled:i(t)}},updateWrapper:function(e){var t=e._currentElement.props,n=t.checked;null!=n&&u.setValueForProperty(l.getNodeFromInstance(e),\"checked\",n||!1);var r=l.getNodeFromInstance(e),i=c.getValue(t);if(null!=i)if(0===i&&\"\"===r.value)r.value=\"0\";else if(\"number\"===t.type){var o=parseFloat(r.value,10)||0;(i!=o||i==o&&r.value!=i)&&(r.value=\"\"+i)}else r.value!==\"\"+i&&(r.value=\"\"+i);else null==t.value&&null!=t.defaultValue&&r.defaultValue!==\"\"+t.defaultValue&&(r.defaultValue=\"\"+t.defaultValue),null==t.checked&&null!=t.defaultChecked&&(r.defaultChecked=!!t.defaultChecked)},postMountWrapper:function(e){var t=e._currentElement.props,n=l.getNodeFromInstance(e);switch(t.type){case\"submit\":case\"reset\":break;case\"color\":case\"date\":case\"datetime\":case\"datetime-local\":case\"month\":case\"time\":case\"week\":n.value=\"\",n.value=n.defaultValue;break;default:n.value=n.value}var r=n.name;\"\"!==r&&(n.name=\"\"),n.defaultChecked=!n.defaultChecked,n.defaultChecked=!n.defaultChecked,\"\"!==r&&(n.name=r)}});e.exports=f},function(e,t,n){\"use strict\";function r(e){null!=e.checkedLink&&null!=e.valueLink?s(\"87\"):void 0}function i(e){r(e),null!=e.value||null!=e.onChange?s(\"88\"):void 0}function o(e){r(e),null!=e.checked||null!=e.onChange?s(\"89\"):void 0}function a(e){if(e){var t=e.getName();if(t)return\" Check the render method of `\"+t+\"`.\"}return\"\"}var s=n(531),u=n(602),c=n(520),l=n(499),p=c(l.isValidElement),f=(n(508),n(504),{button:!0,checkbox:!0,image:!0,hidden:!0,radio:!0,reset:!0,submit:!0}),h={value:function(e,t,n){return!e[t]||f[e.type]||e.onChange||e.readOnly||e.disabled?null:new Error(\"You provided a `value` prop to a form field without an `onChange` handler. This will render a read-only field. If the field should be mutable use `defaultValue`. Otherwise, set either `onChange` or `readOnly`.\")},checked:function(e,t,n){return!e[t]||e.onChange||e.readOnly||e.disabled?null:new Error(\"You provided a `checked` prop to a form field without an `onChange` handler. This will render a read-only field. If the field should be mutable use `defaultChecked`. Otherwise, set either `onChange` or `readOnly`.\")},onChange:p.func},d={},m={checkPropTypes:function(e,t,n){for(var r in h){if(h.hasOwnProperty(r))var i=h[r](t,r,e,\"prop\",null,u);if(i instanceof Error&&!(i.message in d)){d[i.message]=!0;a(n)}}},getValue:function(e){return e.valueLink?(i(e),e.valueLink.value):e.value},getChecked:function(e){return e.checkedLink?(o(e),e.checkedLink.value):e.checked},executeOnChange:function(e,t){return e.valueLink?(i(e),e.valueLink.requestChange(t.target.value)):e.checkedLink?(o(e),e.checkedLink.requestChange(t.target.checked)):e.onChange?e.onChange.call(void 0,t):void 0}};e.exports=m},function(e,t){\"use strict\";var n=\"SECRET_DO_NOT_PASS_THIS_OR_YOU_WILL_BE_FIRED\";e.exports=n},function(e,t,n){\"use strict\";function r(e){var t=\"\";return o.Children.forEach(e,function(e){null!=e&&(\"string\"==typeof e||\"number\"==typeof e?t+=e:u||(u=!0))}),t}var i=n(500),o=n(499),a=n(530),s=n(604),u=(n(504),!1),c={mountWrapper:function(e,t,n){var i=null;if(null!=n){var o=n;\"optgroup\"===o._tag&&(o=o._hostParent),null!=o&&\"select\"===o._tag&&(i=s.getSelectValueContext(o))}var a=null;if(null!=i){var u;if(u=null!=t.value?t.value+\"\":r(t.children),a=!1,Array.isArray(i)){for(var c=0;c<i.length;c++)if(\"\"+i[c]===u){a=!0;break}}else a=\"\"+i===u}e._wrapperState={selected:a}},postMountWrapper:function(e){var t=e._currentElement.props;if(null!=t.value){var n=a.getNodeFromInstance(e);n.setAttribute(\"value\",t.value)}},getHostProps:function(e,t){var n=i({selected:void 0,children:void 0},t);null!=e._wrapperState.selected&&(n.selected=e._wrapperState.selected);var o=r(t.children);return o&&(n.children=o),n}};e.exports=c},function(e,t,n){\"use strict\";function r(){if(this._rootNodeID&&this._wrapperState.pendingUpdate){this._wrapperState.pendingUpdate=!1;var e=this._currentElement.props,t=s.getValue(e);null!=t&&i(this,Boolean(e.multiple),t)}}function i(e,t,n){var r,i,o=u.getNodeFromInstance(e).options;if(t){for(r={},i=0;i<n.length;i++)r[\"\"+n[i]]=!0;for(i=0;i<o.length;i++){var a=r.hasOwnProperty(o[i].value);o[i].selected!==a&&(o[i].selected=a)}}else{for(r=\"\"+n,i=0;i<o.length;i++)if(o[i].value===r)return void(o[i].selected=!0);o.length&&(o[0].selected=!0)}}function o(e){var t=this._currentElement.props,n=s.executeOnChange(t,e);return this._rootNodeID&&(this._wrapperState.pendingUpdate=!0),c.asap(r,this),n}var a=n(500),s=n(601),u=n(530),c=n(552),l=(n(504),!1),p={getHostProps:function(e,t){return a({},t,{onChange:e._wrapperState.onChange,value:void 0})},mountWrapper:function(e,t){var n=s.getValue(t);e._wrapperState={pendingUpdate:!1,initialValue:null!=n?n:t.defaultValue,listeners:null,onChange:o.bind(e),wasMultiple:Boolean(t.multiple)},void 0===t.value||void 0===t.defaultValue||l||(l=!0)},getSelectValueContext:function(e){return e._wrapperState.initialValue},postUpdateWrapper:function(e){var t=e._currentElement.props;e._wrapperState.initialValue=void 0;var n=e._wrapperState.wasMultiple;e._wrapperState.wasMultiple=Boolean(t.multiple);var r=s.getValue(t);null!=r?(e._wrapperState.pendingUpdate=!1,i(e,Boolean(t.multiple),r)):n!==Boolean(t.multiple)&&(null!=t.defaultValue?i(e,Boolean(t.multiple),t.defaultValue):i(e,Boolean(t.multiple),t.multiple?[]:\"\"))}};e.exports=p},function(e,t,n){\"use strict\";function r(){this._rootNodeID&&l.updateWrapper(this)}function i(e){var t=this._currentElement.props,n=s.executeOnChange(t,e);return c.asap(r,this),n}var o=n(531),a=n(500),s=n(601),u=n(530),c=n(552),l=(n(508),n(504),{getHostProps:function(e,t){null!=t.dangerouslySetInnerHTML?o(\"91\"):void 0;var n=a({},t,{value:void 0,defaultValue:void 0,children:\"\"+e._wrapperState.initialValue,onChange:e._wrapperState.onChange});return n},mountWrapper:function(e,t){var n=s.getValue(t),r=n;if(null==n){var a=t.defaultValue,u=t.children;null!=u&&(null!=a?o(\"92\"):void 0,Array.isArray(u)&&(u.length<=1?void 0:o(\"93\"),u=u[0]),a=\"\"+u),null==a&&(a=\"\"),r=a}e._wrapperState={initialValue:\"\"+r,listeners:null,onChange:i.bind(e)}},updateWrapper:function(e){var t=e._currentElement.props,n=u.getNodeFromInstance(e),r=s.getValue(t);if(null!=r){var i=\"\"+r;i!==n.value&&(n.value=i),null==t.defaultValue&&(n.defaultValue=i)}null!=t.defaultValue&&(n.defaultValue=t.defaultValue)},postMountWrapper:function(e){var t=u.getNodeFromInstance(e),n=t.textContent;n===e._wrapperState.initialValue&&(t.value=n)}});e.exports=l},function(e,t,n){\"use strict\";function r(e,t,n){return{type:\"INSERT_MARKUP\",content:e,fromIndex:null,fromNode:null,toIndex:n,afterNode:t}}function i(e,t,n){return{type:\"MOVE_EXISTING\",content:null,fromIndex:e._mountIndex,fromNode:f.getHostNode(e),toIndex:n,afterNode:t}}function o(e,t){return{type:\"REMOVE_NODE\",content:null,fromIndex:e._mountIndex,fromNode:t,toIndex:null,afterNode:null}}function a(e){return{type:\"SET_MARKUP\",content:e,fromIndex:null,fromNode:null,toIndex:null,afterNode:null}}function s(e){return{type:\"TEXT_CONTENT\",content:e,fromIndex:null,fromNode:null,toIndex:null,afterNode:null}}function u(e,t){return t&&(e=e||[],e.push(t)),e}function c(e,t){p.processChildrenUpdates(e,t)}var l=n(531),p=n(607),f=(n(608),n(558),n(513),n(555)),h=n(609),d=(n(505),n(623)),m=(n(508),{Mixin:{_reconcilerInstantiateChildren:function(e,t,n){return h.instantiateChildren(e,t,n)},_reconcilerUpdateChildren:function(e,t,n,r,i,o){var a,s=0;return a=d(t,s),h.updateChildren(e,a,n,r,i,this,this._hostContainerInfo,o,s),a},mountChildren:function(e,t,n){var r=this._reconcilerInstantiateChildren(e,t,n);this._renderedChildren=r;var i=[],o=0;for(var a in r)if(r.hasOwnProperty(a)){var s=r[a],u=0,c=f.mountComponent(s,t,this,this._hostContainerInfo,n,u);s._mountIndex=o++,i.push(c)}return i},updateTextContent:function(e){var t=this._renderedChildren;h.unmountChildren(t,!1);for(var n in t)t.hasOwnProperty(n)&&l(\"118\");var r=[s(e)];c(this,r)},updateMarkup:function(e){var t=this._renderedChildren;h.unmountChildren(t,!1);for(var n in t)t.hasOwnProperty(n)&&l(\"118\");var r=[a(e)];c(this,r)},updateChildren:function(e,t,n){this._updateChildren(e,t,n)},_updateChildren:function(e,t,n){var r=this._renderedChildren,i={},o=[],a=this._reconcilerUpdateChildren(r,e,o,i,t,n);if(a||r){var s,l=null,p=0,h=0,d=0,m=null;for(s in a)if(a.hasOwnProperty(s)){var v=r&&r[s],y=a[s];v===y?(l=u(l,this.moveChild(v,m,p,h)),h=Math.max(v._mountIndex,h),v._mountIndex=p):(v&&(h=Math.max(v._mountIndex,h)),l=u(l,this._mountChildAtIndex(y,o[d],m,p,t,n)),d++),p++,m=f.getHostNode(y)}for(s in i)i.hasOwnProperty(s)&&(l=u(l,this._unmountChild(r[s],i[s])));l&&c(this,l),this._renderedChildren=a}},unmountChildren:function(e){var t=this._renderedChildren;h.unmountChildren(t,e),this._renderedChildren=null},moveChild:function(e,t,n,r){if(e._mountIndex<r)return i(e,t,n)},createChild:function(e,t,n){return r(n,t,e._mountIndex)},removeChild:function(e,t){return o(e,t)},_mountChildAtIndex:function(e,t,n,r,i,o){return e._mountIndex=r,this.createChild(e,n,t)},_unmountChild:function(e,t){var n=this.removeChild(e,t);return e._mountIndex=null,n}}});e.exports=m},function(e,t,n){\"use strict\";var r=n(531),i=(n(508),!1),o={replaceNodeWithMarkup:null,processChildrenUpdates:null,injection:{injectEnvironment:function(e){i?r(\"104\"):void 0,o.replaceNodeWithMarkup=e.replaceNodeWithMarkup,o.processChildrenUpdates=e.processChildrenUpdates,i=!0}}};e.exports=o},function(e,t){\"use strict\";var n={remove:function(e){e._reactInternalInstance=void 0},get:function(e){return e._reactInternalInstance},has:function(e){return void 0!==e._reactInternalInstance},set:function(e,t){e._reactInternalInstance=t}};e.exports=n},function(e,t,n){(function(t){\"use strict\";function r(e,t,n,r){var i=void 0===e[n];null!=t&&i&&(e[n]=o(t,!0))}var i=n(555),o=n(610),a=(n(618),n(614)),s=n(619),u=(n(504),{instantiateChildren:function(e,t,n,i){if(null==e)return null;var o={};return s(e,r,o),o},updateChildren:function(e,t,n,r,s,u,c,l,p){if(t||e){var f,h;for(f in t)if(t.hasOwnProperty(f)){h=e&&e[f];var d=h&&h._currentElement,m=t[f];if(null!=h&&a(d,m))i.receiveComponent(h,m,s,l),t[f]=h;else{h&&(r[f]=i.getHostNode(h),i.unmountComponent(h,!1));var v=o(m,!0);t[f]=v;var y=i.mountComponent(v,s,u,c,l,p);n.push(y)}}for(f in e)!e.hasOwnProperty(f)||t&&t.hasOwnProperty(f)||(h=e[f],r[f]=i.getHostNode(h),i.unmountComponent(h,!1))}},unmountChildren:function(e,t){for(var n in e)if(e.hasOwnProperty(n)){var r=e[n];i.unmountComponent(r,t)}}});e.exports=u}).call(t,n(324))},function(e,t,n){\"use strict\";function r(e){if(e){var t=e.getName();if(t)return\" Check the render method of `\"+t+\"`.\"}return\"\"}function i(e){return\"function\"==typeof e&&\"undefined\"!=typeof e.prototype&&\"function\"==typeof e.prototype.mountComponent&&\"function\"==typeof e.prototype.receiveComponent}function o(e,t){var n;if(null===e||e===!1)n=c.create(o);else if(\"object\"==typeof e){var s=e,u=s.type;if(\"function\"!=typeof u&&\"string\"!=typeof u){var f=\"\";f+=r(s._owner),a(\"130\",null==u?u:typeof u,f)}\"string\"==typeof s.type?n=l.createInternalComponent(s):i(s.type)?(n=new s.type(s),n.getHostNode||(n.getHostNode=n.getNativeNode)):n=new p(s)}else\"string\"==typeof e||\"number\"==typeof e?n=l.createInstanceForText(e):a(\"131\",typeof e);return n._mountIndex=0,n._mountImage=null,n}var a=n(531),s=n(500),u=n(611),c=n(615),l=n(616),p=(n(617),n(508),n(504),function(e){this.construct(e)});s(p.prototype,u,{_instantiateReactComponent:o}),e.exports=o},function(e,t,n){\"use strict\";function r(e){}function i(e,t){}function o(e){return!(!e.prototype||!e.prototype.isReactComponent)}function a(e){return!(!e.prototype||!e.prototype.isPureReactComponent)}var s=n(531),u=n(500),c=n(499),l=n(607),p=n(513),f=n(541),h=n(608),d=(n(558),n(612)),m=n(555),v=n(507),y=(n(508),n(613)),g=n(614),_=(n(504),{ImpureClass:0,PureClass:1,StatelessFunctional:2});r.prototype.render=function(){var e=h.get(this)._currentElement.type,t=e(this.props,this.context,this.updater);return i(e,t),t};var b=1,x={construct:function(e){this._currentElement=e,this._rootNodeID=0,this._compositeType=null,this._instance=null,this._hostParent=null,this._hostContainerInfo=null,this._updateBatchNumber=null,this._pendingElement=null,this._pendingStateQueue=null,this._pendingReplaceState=!1,this._pendingForceUpdate=!1,this._renderedNodeType=null,this._renderedComponent=null,this._context=null,this._mountOrder=0,this._topLevelWrapper=null,this._pendingCallbacks=null,this._calledComponentWillUnmount=!1},mountComponent:function(e,t,n,u){this._context=u,this._mountOrder=b++,this._hostParent=t,this._hostContainerInfo=n;var l,p=this._currentElement.props,f=this._processContext(u),d=this._currentElement.type,m=e.getUpdateQueue(),y=o(d),g=this._constructComponent(y,p,f,m);y||null!=g&&null!=g.render?a(d)?this._compositeType=_.PureClass:this._compositeType=_.ImpureClass:(l=g,i(d,l),null===g||g===!1||c.isValidElement(g)?void 0:s(\"105\",d.displayName||d.name||\"Component\"),g=new r(d),this._compositeType=_.StatelessFunctional);g.props=p,g.context=f,g.refs=v,g.updater=m,this._instance=g,h.set(g,this);var x=g.state;void 0===x&&(g.state=x=null),\"object\"!=typeof x||Array.isArray(x)?s(\"106\",this.getName()||\"ReactCompositeComponent\"):void 0,this._pendingStateQueue=null,this._pendingReplaceState=!1,this._pendingForceUpdate=!1;var w;return w=g.unstable_handleError?this.performInitialMountWithErrorHandling(l,t,n,e,u):this.performInitialMount(l,t,n,e,u),g.componentDidMount&&e.getReactMountReady().enqueue(g.componentDidMount,g),w},_constructComponent:function(e,t,n,r){return this._constructComponentWithoutOwner(e,t,n,r)},_constructComponentWithoutOwner:function(e,t,n,r){var i=this._currentElement.type;return e?new i(t,n,r):i(t,n,r)},performInitialMountWithErrorHandling:function(e,t,n,r,i){var o,a=r.checkpoint();try{o=this.performInitialMount(e,t,n,r,i)}catch(s){r.rollback(a),this._instance.unstable_handleError(s),this._pendingStateQueue&&(this._instance.state=this._processPendingState(this._instance.props,this._instance.context)),a=r.checkpoint(),this._renderedComponent.unmountComponent(!0),r.rollback(a),o=this.performInitialMount(e,t,n,r,i)}return o},performInitialMount:function(e,t,n,r,i){var o=this._instance,a=0;o.componentWillMount&&(o.componentWillMount(),this._pendingStateQueue&&(o.state=this._processPendingState(o.props,o.context))),void 0===e&&(e=this._renderValidatedComponent());var s=d.getType(e);this._renderedNodeType=s;var u=this._instantiateReactComponent(e,s!==d.EMPTY);this._renderedComponent=u;var c=m.mountComponent(u,r,t,n,this._processChildContext(i),a);return c},getHostNode:function(){return m.getHostNode(this._renderedComponent)},unmountComponent:function(e){if(this._renderedComponent){var t=this._instance;if(t.componentWillUnmount&&!t._calledComponentWillUnmount)if(t._calledComponentWillUnmount=!0,e){var n=this.getName()+\".componentWillUnmount()\";f.invokeGuardedCallback(n,t.componentWillUnmount.bind(t))}else t.componentWillUnmount();this._renderedComponent&&(m.unmountComponent(this._renderedComponent,e),this._renderedNodeType=null,this._renderedComponent=null,this._instance=null),this._pendingStateQueue=null,this._pendingReplaceState=!1,this._pendingForceUpdate=!1,this._pendingCallbacks=null,this._pendingElement=null,this._context=null,this._rootNodeID=0,this._topLevelWrapper=null,h.remove(t)}},_maskContext:function(e){var t=this._currentElement.type,n=t.contextTypes;if(!n)return v;var r={};for(var i in n)r[i]=e[i];return r},_processContext:function(e){var t=this._maskContext(e);return t},_processChildContext:function(e){var t,n=this._currentElement.type,r=this._instance;if(r.getChildContext&&(t=r.getChildContext()),t){\"object\"!=typeof n.childContextTypes?s(\"107\",this.getName()||\"ReactCompositeComponent\"):void 0;for(var i in t)i in n.childContextTypes?void 0:s(\"108\",this.getName()||\"ReactCompositeComponent\",i);return u({},e,t)}return e},_checkContextTypes:function(e,t,n){},receiveComponent:function(e,t,n){var r=this._currentElement,i=this._context;this._pendingElement=null,this.updateComponent(t,r,e,i,n)},performUpdateIfNecessary:function(e){null!=this._pendingElement?m.receiveComponent(this,this._pendingElement,e,this._context):null!==this._pendingStateQueue||this._pendingForceUpdate?this.updateComponent(e,this._currentElement,this._currentElement,this._context,this._context):this._updateBatchNumber=null},updateComponent:function(e,t,n,r,i){var o=this._instance;null==o?s(\"136\",this.getName()||\"ReactCompositeComponent\"):void 0;var a,u=!1;this._context===i?a=o.context:(a=this._processContext(i),u=!0);var c=t.props,l=n.props;t!==n&&(u=!0),u&&o.componentWillReceiveProps&&o.componentWillReceiveProps(l,a);var p=this._processPendingState(l,a),f=!0;this._pendingForceUpdate||(o.shouldComponentUpdate?f=o.shouldComponentUpdate(l,p,a):this._compositeType===_.PureClass&&(f=!y(c,l)||!y(o.state,p))),this._updateBatchNumber=null,f?(this._pendingForceUpdate=!1,this._performComponentUpdate(n,l,p,a,e,i)):(this._currentElement=n,this._context=i,o.props=l,o.state=p,o.context=a)},_processPendingState:function(e,t){var n=this._instance,r=this._pendingStateQueue,i=this._pendingReplaceState;if(this._pendingReplaceState=!1,this._pendingStateQueue=null,!r)return n.state;if(i&&1===r.length)return r[0];for(var o=u({},i?r[0]:n.state),a=i?1:0;a<r.length;a++){var s=r[a];u(o,\"function\"==typeof s?s.call(n,o,e,t):s)}return o},_performComponentUpdate:function(e,t,n,r,i,o){var a,s,u,c=this._instance,l=Boolean(c.componentDidUpdate);l&&(a=c.props,s=c.state,u=c.context),c.componentWillUpdate&&c.componentWillUpdate(t,n,r),this._currentElement=e,this._context=o,c.props=t,c.state=n,c.context=r,this._updateRenderedComponent(i,o),l&&i.getReactMountReady().enqueue(c.componentDidUpdate.bind(c,a,s,u),c)},_updateRenderedComponent:function(e,t){var n=this._renderedComponent,r=n._currentElement,i=this._renderValidatedComponent(),o=0;if(g(r,i))m.receiveComponent(n,i,e,this._processChildContext(t));else{var a=m.getHostNode(n);m.unmountComponent(n,!1);var s=d.getType(i);this._renderedNodeType=s;var u=this._instantiateReactComponent(i,s!==d.EMPTY);this._renderedComponent=u;var c=m.mountComponent(u,e,this._hostParent,this._hostContainerInfo,this._processChildContext(t),o);this._replaceNodeWithMarkup(a,c,n)}},_replaceNodeWithMarkup:function(e,t,n){l.replaceNodeWithMarkup(e,t,n)},_renderValidatedComponentWithoutOwnerOrContext:function(){var e,t=this._instance;return e=t.render()},_renderValidatedComponent:function(){var e;if(this._compositeType!==_.StatelessFunctional){p.current=this;try{e=this._renderValidatedComponentWithoutOwnerOrContext()}finally{p.current=null}}else e=this._renderValidatedComponentWithoutOwnerOrContext();return null===e||e===!1||c.isValidElement(e)?void 0:s(\"109\",this.getName()||\"ReactCompositeComponent\"),e},attachRef:function(e,t){var n=this.getPublicInstance();null==n?s(\"110\"):void 0;var r=t.getPublicInstance(),i=n.refs===v?n.refs={}:n.refs;i[e]=r},detachRef:function(e){var t=this.getPublicInstance().refs;delete t[e]},getName:function(){var e=this._currentElement.type,t=this._instance&&this._instance.constructor;return e.displayName||t&&t.displayName||e.name||t&&t.name||null},getPublicInstance:function(){var e=this._instance;return this._compositeType===_.StatelessFunctional?null:e},_instantiateReactComponent:null};e.exports=x},function(e,t,n){\"use strict\";var r=n(531),i=n(499),o=(n(508),{HOST:0,COMPOSITE:1,EMPTY:2,getType:function(e){return null===e||e===!1?o.EMPTY:i.isValidElement(e)?\"function\"==typeof e.type?o.COMPOSITE:o.HOST:void r(\"26\",e)}});e.exports=o},function(e,t){\"use strict\";function n(e,t){return e===t?0!==e||0!==t||1/e===1/t:e!==e&&t!==t}function r(e,t){if(n(e,t))return!0;if(\"object\"!=typeof e||null===e||\"object\"!=typeof t||null===t)return!1;var r=Object.keys(e),o=Object.keys(t);if(r.length!==o.length)return!1;for(var a=0;a<r.length;a++)if(!i.call(t,r[a])||!n(e[r[a]],t[r[a]]))return!1;return!0}var i=Object.prototype.hasOwnProperty;e.exports=r},function(e,t){\"use strict\";function n(e,t){var n=null===e||e===!1,r=null===t||t===!1;if(n||r)return n===r;var i=typeof e,o=typeof t;return\"string\"===i||\"number\"===i?\"string\"===o||\"number\"===o:\"object\"===o&&e.type===t.type&&e.key===t.key}e.exports=n},function(e,t){\"use strict\";var n,r={injectEmptyComponentFactory:function(e){n=e}},i={create:function(e){return n(e)}};i.injection=r,e.exports=i},function(e,t,n){\"use strict\";function r(e){return s?void 0:a(\"111\",e.type),new s(e)}function i(e){return new u(e)}function o(e){return e instanceof u}var a=n(531),s=(n(508),null),u=null,c={injectGenericComponentClass:function(e){s=e},injectTextComponentClass:function(e){u=e}},l={createInternalComponent:r,createInstanceForText:i,isTextComponent:o,injection:c};e.exports=l},function(e,t){\"use strict\";function n(){return r++}var r=1;e.exports=n},517,function(e,t,n){\"use strict\";function r(e,t){return e&&\"object\"==typeof e&&null!=e.key?c.escape(e.key):t.toString(36)}function i(e,t,n,o){var f=typeof e;if(\"undefined\"!==f&&\"boolean\"!==f||(e=null),null===e||\"string\"===f||\"number\"===f||\"object\"===f&&e.$$typeof===s)return n(o,e,\"\"===t?l+r(e,0):t),1;var h,d,m=0,v=\"\"===t?l:t+p;if(Array.isArray(e))for(var y=0;y<e.length;y++)h=e[y],d=v+r(h,y),m+=i(h,d,n,o);else{var g=u(e);if(g){var _,b=g.call(e);if(g!==e.entries)for(var x=0;!(_=b.next()).done;)h=_.value,d=v+r(h,x++),m+=i(h,d,n,o);else for(;!(_=b.next()).done;){var w=_.value;w&&(h=w[1],d=v+c.escape(w[0])+p+r(h,0),m+=i(h,d,n,o))}}else if(\"object\"===f){var k=\"\",S=String(e);a(\"31\",\"[object Object]\"===S?\"object with keys {\"+Object.keys(e).join(\", \")+\"}\":S,k)}}return m}function o(e,t,n){return null==e?0:i(e,\"\",t,n)}var a=n(531),s=(n(513),n(620)),u=n(621),c=(n(508),n(618)),l=(n(504),\".\"),p=\":\";e.exports=o},514,516,function(e,t,n){\"use strict\";function r(e){var t=Function.prototype.toString,n=Object.prototype.hasOwnProperty,r=RegExp(\"^\"+t.call(n).replace(/[\\\\^$.*+?()[\\]{}|]/g,\"\\\\$&\").replace(/hasOwnProperty|(function).*?(?=\\\\\\()| for .+?(?=\\\\\\])/g,\"$1.*?\")+\"$\");try{var i=t.call(e);return r.test(i)}catch(e){return!1}}function i(e){var t=c(e);if(t){var n=t.childIDs;l(e),n.forEach(i)}}function o(e,t,n){return\"\\n    in \"+(e||\"Unknown\")+(t?\" (at \"+t.fileName.replace(/^.*[\\\\\\/]/,\"\")+\":\"+t.lineNumber+\")\":n?\" (created by \"+n+\")\":\"\")}function a(e){return null==e?\"#empty\":\"string\"==typeof e||\"number\"==typeof e?\"#text\":\"string\"==typeof e.type?e.type:e.type.displayName||e.type.name||\"Unknown\"}function s(e){var t,n=E.getDisplayName(e),r=E.getElement(e),i=E.getOwnerID(e);return i&&(t=E.getDisplayName(i)),o(n,r&&r._source,t)}var u,c,l,p,f,h,d,m=n(502),v=n(513),y=(n(508),n(504),\"function\"==typeof Array.from&&\"function\"==typeof Map&&r(Map)&&null!=Map.prototype&&\"function\"==typeof Map.prototype.keys&&r(Map.prototype.keys)&&\"function\"==typeof Set&&r(Set)&&null!=Set.prototype&&\"function\"==typeof Set.prototype.keys&&r(Set.prototype.keys));if(y){var g=new Map,_=new Set;u=function(e,t){g.set(e,t)},c=function(e){return g.get(e)},l=function(e){g.delete(e)},p=function(){return Array.from(g.keys())},f=function(e){_.add(e)},h=function(e){_.delete(e)},d=function(){return Array.from(_.keys())}}else{var b={},x={},w=function(e){return\".\"+e},k=function(e){return parseInt(e.substr(1),10)};u=function(e,t){var n=w(e);b[n]=t},c=function(e){var t=w(e);return b[t]},l=function(e){var t=w(e);delete b[t]},p=function(){return Object.keys(b).map(k)},f=function(e){var t=w(e);x[t]=!0},h=function(e){var t=w(e);delete x[t]},d=function(){return Object.keys(x).map(k)}}var S=[],E={onSetChildren:function(e,t){var n=c(e);n?void 0:m(\"144\"),n.childIDs=t;for(var r=0;r<t.length;r++){var i=t[r],o=c(i);o?void 0:m(\"140\"),null==o.childIDs&&\"object\"==typeof o.element&&null!=o.element?m(\"141\"):void 0,o.isMounted?void 0:m(\"71\"),null==o.parentID&&(o.parentID=e),o.parentID!==e?m(\"142\",i,o.parentID,e):void 0}},onBeforeMountComponent:function(e,t,n){var r={element:t,parentID:n,text:null,childIDs:[],isMounted:!1,updateCount:0};u(e,r)},onBeforeUpdateComponent:function(e,t){var n=c(e);n&&n.isMounted&&(n.element=t)},onMountComponent:function(e){var t=c(e);t?void 0:m(\"144\"),t.isMounted=!0;var n=0===t.parentID;n&&f(e)},onUpdateComponent:function(e){var t=c(e);t&&t.isMounted&&t.updateCount++},onUnmountComponent:function(e){var t=c(e);if(t){t.isMounted=!1;var n=0===t.parentID;n&&h(e)}S.push(e)},purgeUnmountedComponents:function(){if(!E._preventPurging){for(var e=0;e<S.length;e++){var t=S[e];i(t)}S.length=0}},isMounted:function(e){var t=c(e);return!!t&&t.isMounted},getCurrentStackAddendum:function(e){var t=\"\";if(e){var n=a(e),r=e._owner;t+=o(n,e._source,r&&r.getName())}var i=v.current,s=i&&i._debugID;return t+=E.getStackAddendumByID(s)},getStackAddendumByID:function(e){for(var t=\"\";e;)t+=s(e),e=E.getParentID(e);return t},getChildIDs:function(e){var t=c(e);return t?t.childIDs:[]},getDisplayName:function(e){var t=E.getElement(e);return t?a(t):null},getElement:function(e){var t=c(e);return t?t.element:null},getOwnerID:function(e){var t=E.getElement(e);return t&&t._owner?t._owner._debugID:null},getParentID:function(e){var t=c(e);return t?t.parentID:null},getSource:function(e){var t=c(e),n=t?t.element:null,r=null!=n?n._source:null;return r},getText:function(e){var t=E.getElement(e);return\"string\"==typeof t?t:\"number\"==typeof t?\"\"+t:null},getUpdateCount:function(e){var t=c(e);return t?t.updateCount:0},getRootIDs:d,getRegisteredIDs:p,pushNonStandardWarningStack:function(e,t){if(\"function\"==typeof console.reactStack){var n=[],r=v.current,i=r&&r._debugID;try{for(e&&n.push({name:i?E.getDisplayName(i):null,fileName:t?t.fileName:null,lineNumber:t?t.lineNumber:null});i;){var o=E.getElement(i),a=E.getParentID(i),s=E.getOwnerID(i),u=s?E.getDisplayName(s):null,c=o&&o._source;n.push({name:u,fileName:c?c.fileName:null,lineNumber:c?c.lineNumber:null}),i=a}}catch(e){}console.reactStack(n)}},popNonStandardWarningStack:function(){\"function\"==typeof console.reactStackEnd&&console.reactStackEnd()}};e.exports=E},function(e,t,n){(function(t){\"use strict\";function r(e,t,n,r){if(e&&\"object\"==typeof e){var i=e,o=void 0===i[n];o&&null!=t&&(i[n]=t)}}function i(e,t){if(null==e)return e;var n={};return o(e,r,n),n}var o=(n(618),n(619));n(504);e.exports=i}).call(t,n(324))},function(e,t,n){\"use strict\";function r(e){this.reinitializeTransaction(),this.renderToStaticMarkup=e,this.useCreateElement=!1,this.updateQueue=new s(this)}var i=n(500),o=n(546),a=n(559),s=(n(558),n(625)),u=[],c={enqueue:function(){}},l={getTransactionWrappers:function(){return u},getReactMountReady:function(){return c},getUpdateQueue:function(){return this.updateQueue},destructor:function(){},checkpoint:function(){},rollback:function(){}};i(r.prototype,a,l),o.addPoolingTo(r),e.exports=r},function(e,t,n){\"use strict\";function r(e,t){if(!(e instanceof t))throw new TypeError(\"Cannot call a class as a function\")}function i(e,t){}var o=n(626),a=(n(504),function(){function e(t){r(this,e),this.transaction=t}return e.prototype.isMounted=function(e){return!1},e.prototype.enqueueCallback=function(e,t,n){this.transaction.isInTransaction()&&o.enqueueCallback(e,t,n)},e.prototype.enqueueForceUpdate=function(e){this.transaction.isInTransaction()?o.enqueueForceUpdate(e):i(e,\"forceUpdate\")},e.prototype.enqueueReplaceState=function(e,t){this.transaction.isInTransaction()?o.enqueueReplaceState(e,t):i(e,\"replaceState\")},e.prototype.enqueueSetState=function(e,t){this.transaction.isInTransaction()?o.enqueueSetState(e,t):i(e,\"setState\")},e}());e.exports=a},function(e,t,n){\"use strict\";function r(e){u.enqueueUpdate(e)}function i(e){var t=typeof e;if(\"object\"!==t)return t;var n=e.constructor&&e.constructor.name||t,r=Object.keys(e);return r.length>0&&r.length<20?n+\" (keys: \"+r.join(\", \")+\")\":n}function o(e,t){var n=s.get(e);if(!n){return null}return n}var a=n(531),s=(n(513),n(608)),u=(n(558),n(552)),c=(n(508),n(504),{isMounted:function(e){var t=s.get(e);return!!t&&!!t._renderedComponent},enqueueCallback:function(e,t,n){c.validateCallback(t,n);var i=o(e);return i?(i._pendingCallbacks?i._pendingCallbacks.push(t):i._pendingCallbacks=[t],void r(i)):null},enqueueCallbackInternal:function(e,t){e._pendingCallbacks?e._pendingCallbacks.push(t):e._pendingCallbacks=[t],r(e)},enqueueForceUpdate:function(e){var t=o(e,\"forceUpdate\");t&&(t._pendingForceUpdate=!0,r(t))},enqueueReplaceState:function(e,t,n){var i=o(e,\"replaceState\");i&&(i._pendingStateQueue=[t],i._pendingReplaceState=!0,void 0!==n&&null!==n&&(c.validateCallback(n,\"replaceState\"),i._pendingCallbacks?i._pendingCallbacks.push(n):i._pendingCallbacks=[n]),r(i))},enqueueSetState:function(e,t){var n=o(e,\"setState\");if(n){var i=n._pendingStateQueue||(n._pendingStateQueue=[]);i.push(t),r(n)}},enqueueElementInternal:function(e,t,n){e._pendingElement=t,e._context=n,r(e)},validateCallback:function(e,t){e&&\"function\"!=typeof e?a(\"122\",t,i(e)):void 0}});e.exports=c},function(e,t,n){\"use strict\";var r=(n(500),n(505)),i=(n(504),r);e.exports=i},function(e,t,n){\"use strict\";var r=n(500),i=n(573),o=n(530),a=function(e){this._currentElement=null,this._hostNode=null,this._hostParent=null,this._hostContainerInfo=null,this._domID=0};r(a.prototype,{mountComponent:function(e,t,n,r){var a=n._idCounter++;this._domID=a,this._hostParent=t,this._hostContainerInfo=n;var s=\" react-empty: \"+this._domID+\" \";if(e.useCreateElement){var u=n._ownerDocument,c=u.createComment(s);return o.precacheNode(this,c),i(c)}return e.renderToStaticMarkup?\"\":\"<!--\"+s+\"-->\"},receiveComponent:function(){},getHostNode:function(){return o.getNodeFromInstance(this)},unmountComponent:function(){o.uncacheNode(this)}}),e.exports=a},function(e,t,n){\"use strict\";function r(e,t){\"_hostNode\"in e?void 0:u(\"33\"),\"_hostNode\"in t?void 0:u(\"33\");for(var n=0,r=e;r;r=r._hostParent)n++;for(var i=0,o=t;o;o=o._hostParent)i++;for(;n-i>0;)e=e._hostParent,n--;for(;i-n>0;)t=t._hostParent,i--;for(var a=n;a--;){if(e===t)return e;e=e._hostParent,t=t._hostParent}return null}function i(e,t){\"_hostNode\"in e?void 0:u(\"35\"),\"_hostNode\"in t?void 0:u(\"35\");for(;t;){if(t===e)return!0;t=t._hostParent}return!1}function o(e){return\"_hostNode\"in e?void 0:u(\"36\"),e._hostParent}function a(e,t,n){for(var r=[];e;)r.push(e),e=e._hostParent;var i;for(i=r.length;i-- >0;)t(r[i],\"captured\",n);for(i=0;i<r.length;i++)t(r[i],\"bubbled\",n)}function s(e,t,n,i,o){for(var a=e&&t?r(e,t):null,s=[];e&&e!==a;)s.push(e),e=e._hostParent;for(var u=[];t&&t!==a;)u.push(t),t=t._hostParent;var c;for(c=0;c<s.length;c++)n(s[c],\"bubbled\",i);\nfor(c=u.length;c-- >0;)n(u[c],\"captured\",o)}var u=n(531);n(508);e.exports={isAncestor:i,getLowestCommonAncestor:r,getParentInstance:o,traverseTwoPhase:a,traverseEnterLeave:s}},function(e,t,n){\"use strict\";var r=n(531),i=n(500),o=n(572),a=n(573),s=n(530),u=n(578),c=(n(508),n(627),function(e){this._currentElement=e,this._stringText=\"\"+e,this._hostNode=null,this._hostParent=null,this._domID=0,this._mountIndex=0,this._closingComment=null,this._commentNodes=null});i(c.prototype,{mountComponent:function(e,t,n,r){var i=n._idCounter++,o=\" react-text: \"+i+\" \",c=\" /react-text \";if(this._domID=i,this._hostParent=t,e.useCreateElement){var l=n._ownerDocument,p=l.createComment(o),f=l.createComment(c),h=a(l.createDocumentFragment());return a.queueChild(h,a(p)),this._stringText&&a.queueChild(h,a(l.createTextNode(this._stringText))),a.queueChild(h,a(f)),s.precacheNode(this,p),this._closingComment=f,h}var d=u(this._stringText);return e.renderToStaticMarkup?d:\"<!--\"+o+\"-->\"+d+\"<!--\"+c+\"-->\"},receiveComponent:function(e,t){if(e!==this._currentElement){this._currentElement=e;var n=\"\"+e;if(n!==this._stringText){this._stringText=n;var r=this.getHostNode();o.replaceDelimitedText(r[0],r[1],n)}}},getHostNode:function(){var e=this._commentNodes;if(e)return e;if(!this._closingComment)for(var t=s.getNodeFromInstance(this),n=t.nextSibling;;){if(null==n?r(\"67\",this._domID):void 0,8===n.nodeType&&\" /react-text \"===n.nodeValue){this._closingComment=n;break}n=n.nextSibling}return e=[this._hostNode,this._closingComment],this._commentNodes=e,e},unmountComponent:function(){this._closingComment=null,this._commentNodes=null,s.uncacheNode(this)}}),e.exports=c},function(e,t,n){\"use strict\";function r(){this.reinitializeTransaction()}var i=n(500),o=n(552),a=n(559),s=n(505),u={initialize:s,close:function(){f.isBatchingUpdates=!1}},c={initialize:s,close:o.flushBatchedUpdates.bind(o)},l=[c,u];i(r.prototype,a,{getTransactionWrappers:function(){return l}});var p=new r,f={isBatchingUpdates:!1,batchedUpdates:function(e,t,n,r,i,o){var a=f.isBatchingUpdates;return f.isBatchingUpdates=!0,a?e(t,n,r,i,o):p.perform(e,null,t,n,r,i,o)}};e.exports=f},function(e,t,n){\"use strict\";function r(e){for(;e._hostParent;)e=e._hostParent;var t=p.getNodeFromInstance(e),n=t.parentNode;return p.getClosestInstanceFromNode(n)}function i(e,t){this.topLevelType=e,this.nativeEvent=t,this.ancestors=[]}function o(e){var t=h(e.nativeEvent),n=p.getClosestInstanceFromNode(t),i=n;do e.ancestors.push(i),i=i&&r(i);while(i);for(var o=0;o<e.ancestors.length;o++)n=e.ancestors[o],m._handleTopLevel(e.topLevelType,n,e.nativeEvent,h(e.nativeEvent))}function a(e){var t=d(window);e(t)}var s=n(500),u=n(633),c=n(544),l=n(546),p=n(530),f=n(552),h=n(561),d=n(634);s(i.prototype,{destructor:function(){this.topLevelType=null,this.nativeEvent=null,this.ancestors.length=0}}),l.addPoolingTo(i,l.twoArgumentPooler);var m={_enabled:!0,_handleTopLevel:null,WINDOW_HANDLE:c.canUseDOM?window:null,setHandleTopLevel:function(e){m._handleTopLevel=e},setEnabled:function(e){m._enabled=!!e},isEnabled:function(){return m._enabled},trapBubbledEvent:function(e,t,n){return n?u.listen(n,t,m.dispatchEvent.bind(null,e)):null},trapCapturedEvent:function(e,t,n){return n?u.capture(n,t,m.dispatchEvent.bind(null,e)):null},monitorScrollValue:function(e){var t=a.bind(null,e);u.listen(window,\"scroll\",t)},dispatchEvent:function(e,t){if(m._enabled){var n=i.getPooled(e,t);try{f.batchedUpdates(o,n)}finally{i.release(n)}}}};e.exports=m},function(e,t,n){\"use strict\";var r=n(505),i={listen:function(e,t,n){return e.addEventListener?(e.addEventListener(t,n,!1),{remove:function(){e.removeEventListener(t,n,!1)}}):e.attachEvent?(e.attachEvent(\"on\"+t,n),{remove:function(){e.detachEvent(\"on\"+t,n)}}):void 0},capture:function(e,t,n){return e.addEventListener?(e.addEventListener(t,n,!0),{remove:function(){e.removeEventListener(t,n,!0)}}):{remove:r}},registerDefault:function(){}};e.exports=i},function(e,t){\"use strict\";function n(e){return e.Window&&e instanceof e.Window?{x:e.pageXOffset||e.document.documentElement.scrollLeft,y:e.pageYOffset||e.document.documentElement.scrollTop}:{x:e.scrollLeft,y:e.scrollTop}}e.exports=n},function(e,t,n){\"use strict\";var r=n(532),i=n(538),o=n(540),a=n(607),s=n(615),u=n(597),c=n(616),l=n(552),p={Component:a.injection,DOMProperty:r.injection,EmptyComponent:s.injection,EventPluginHub:i.injection,EventPluginUtils:o.injection,EventEmitter:u.injection,HostComponent:c.injection,Updates:l.injection};e.exports=p},function(e,t,n){\"use strict\";function r(e){this.reinitializeTransaction(),this.renderToStaticMarkup=!1,this.reactMountReady=o.getPooled(null),this.useCreateElement=e}var i=n(500),o=n(553),a=n(546),s=n(597),u=n(637),c=(n(558),n(559)),l=n(626),p={initialize:u.getSelectionInformation,close:u.restoreSelection},f={initialize:function(){var e=s.isEnabled();return s.setEnabled(!1),e},close:function(e){s.setEnabled(e)}},h={initialize:function(){this.reactMountReady.reset()},close:function(){this.reactMountReady.notifyAll()}},d=[p,f,h],m={getTransactionWrappers:function(){return d},getReactMountReady:function(){return this.reactMountReady},getUpdateQueue:function(){return l},checkpoint:function(){return this.reactMountReady.checkpoint()},rollback:function(e){this.reactMountReady.rollback(e)},destructor:function(){o.release(this.reactMountReady),this.reactMountReady=null}};i(r.prototype,c,m),a.addPoolingTo(r),e.exports=r},function(e,t,n){\"use strict\";function r(e){return o(document.documentElement,e)}var i=n(638),o=n(640),a=n(586),s=n(643),u={hasSelectionCapabilities:function(e){var t=e&&e.nodeName&&e.nodeName.toLowerCase();return t&&(\"input\"===t&&\"text\"===e.type||\"textarea\"===t||\"true\"===e.contentEditable)},getSelectionInformation:function(){var e=s();return{focusedElem:e,selectionRange:u.hasSelectionCapabilities(e)?u.getSelection(e):null}},restoreSelection:function(e){var t=s(),n=e.focusedElem,i=e.selectionRange;t!==n&&r(n)&&(u.hasSelectionCapabilities(n)&&u.setSelection(n,i),a(n))},getSelection:function(e){var t;if(\"selectionStart\"in e)t={start:e.selectionStart,end:e.selectionEnd};else if(document.selection&&e.nodeName&&\"input\"===e.nodeName.toLowerCase()){var n=document.selection.createRange();n.parentElement()===e&&(t={start:-n.moveStart(\"character\",-e.value.length),end:-n.moveEnd(\"character\",-e.value.length)})}else t=i.getOffsets(e);return t||{start:0,end:0}},setSelection:function(e,t){var n=t.start,r=t.end;if(void 0===r&&(r=n),\"selectionStart\"in e)e.selectionStart=n,e.selectionEnd=Math.min(r,e.value.length);else if(document.selection&&e.nodeName&&\"input\"===e.nodeName.toLowerCase()){var o=e.createTextRange();o.collapse(!0),o.moveStart(\"character\",n),o.moveEnd(\"character\",r-n),o.select()}else i.setOffsets(e,t)}};e.exports=u},function(e,t,n){\"use strict\";function r(e,t,n,r){return e===n&&t===r}function i(e){var t=document.selection,n=t.createRange(),r=n.text.length,i=n.duplicate();i.moveToElementText(e),i.setEndPoint(\"EndToStart\",n);var o=i.text.length,a=o+r;return{start:o,end:a}}function o(e){var t=window.getSelection&&window.getSelection();if(!t||0===t.rangeCount)return null;var n=t.anchorNode,i=t.anchorOffset,o=t.focusNode,a=t.focusOffset,s=t.getRangeAt(0);try{s.startContainer.nodeType,s.endContainer.nodeType}catch(e){return null}var u=r(t.anchorNode,t.anchorOffset,t.focusNode,t.focusOffset),c=u?0:s.toString().length,l=s.cloneRange();l.selectNodeContents(e),l.setEnd(s.startContainer,s.startOffset);var p=r(l.startContainer,l.startOffset,l.endContainer,l.endOffset),f=p?0:l.toString().length,h=f+c,d=document.createRange();d.setStart(n,i),d.setEnd(o,a);var m=d.collapsed;return{start:m?h:f,end:m?f:h}}function a(e,t){var n,r,i=document.selection.createRange().duplicate();void 0===t.end?(n=t.start,r=n):t.start>t.end?(n=t.end,r=t.start):(n=t.start,r=t.end),i.moveToElementText(e),i.moveStart(\"character\",n),i.setEndPoint(\"EndToStart\",i),i.moveEnd(\"character\",r-n),i.select()}function s(e,t){if(window.getSelection){var n=window.getSelection(),r=e[l()].length,i=Math.min(t.start,r),o=void 0===t.end?i:Math.min(t.end,r);if(!n.extend&&i>o){var a=o;o=i,i=a}var s=c(e,i),u=c(e,o);if(s&&u){var p=document.createRange();p.setStart(s.node,s.offset),n.removeAllRanges(),i>o?(n.addRange(p),n.extend(u.node,u.offset)):(p.setEnd(u.node,u.offset),n.addRange(p))}}}var u=n(544),c=n(639),l=n(547),p=u.canUseDOM&&\"selection\"in document&&!(\"getSelection\"in window),f={getOffsets:p?i:o,setOffsets:p?a:s};e.exports=f},function(e,t){\"use strict\";function n(e){for(;e&&e.firstChild;)e=e.firstChild;return e}function r(e){for(;e;){if(e.nextSibling)return e.nextSibling;e=e.parentNode}}function i(e,t){for(var i=n(e),o=0,a=0;i;){if(3===i.nodeType){if(a=o+i.textContent.length,o<=t&&a>=t)return{node:i,offset:t-o};o=a}i=n(r(i))}}e.exports=i},function(e,t,n){\"use strict\";function r(e,t){return!(!e||!t)&&(e===t||!i(e)&&(i(t)?r(e,t.parentNode):\"contains\"in e?e.contains(t):!!e.compareDocumentPosition&&!!(16&e.compareDocumentPosition(t))))}var i=n(641);e.exports=r},function(e,t,n){\"use strict\";function r(e){return i(e)&&3==e.nodeType}var i=n(642);e.exports=r},function(e,t){\"use strict\";function n(e){var t=e?e.ownerDocument||e:document,n=t.defaultView||window;return!(!e||!(\"function\"==typeof n.Node?e instanceof n.Node:\"object\"==typeof e&&\"number\"==typeof e.nodeType&&\"string\"==typeof e.nodeName))}e.exports=n},function(e,t){\"use strict\";function n(e){if(e=e||(\"undefined\"!=typeof document?document:void 0),\"undefined\"==typeof e)return null;try{return e.activeElement||e.body}catch(t){return e.body}}e.exports=n},function(e,t){\"use strict\";var n={xlink:\"http://www.w3.org/1999/xlink\",xml:\"http://www.w3.org/XML/1998/namespace\"},r={accentHeight:\"accent-height\",accumulate:0,additive:0,alignmentBaseline:\"alignment-baseline\",allowReorder:\"allowReorder\",alphabetic:0,amplitude:0,arabicForm:\"arabic-form\",ascent:0,attributeName:\"attributeName\",attributeType:\"attributeType\",autoReverse:\"autoReverse\",azimuth:0,baseFrequency:\"baseFrequency\",baseProfile:\"baseProfile\",baselineShift:\"baseline-shift\",bbox:0,begin:0,bias:0,by:0,calcMode:\"calcMode\",capHeight:\"cap-height\",clip:0,clipPath:\"clip-path\",clipRule:\"clip-rule\",clipPathUnits:\"clipPathUnits\",colorInterpolation:\"color-interpolation\",colorInterpolationFilters:\"color-interpolation-filters\",colorProfile:\"color-profile\",colorRendering:\"color-rendering\",contentScriptType:\"contentScriptType\",contentStyleType:\"contentStyleType\",cursor:0,cx:0,cy:0,d:0,decelerate:0,descent:0,diffuseConstant:\"diffuseConstant\",direction:0,display:0,divisor:0,dominantBaseline:\"dominant-baseline\",dur:0,dx:0,dy:0,edgeMode:\"edgeMode\",elevation:0,enableBackground:\"enable-background\",end:0,exponent:0,externalResourcesRequired:\"externalResourcesRequired\",fill:0,fillOpacity:\"fill-opacity\",fillRule:\"fill-rule\",filter:0,filterRes:\"filterRes\",filterUnits:\"filterUnits\",floodColor:\"flood-color\",floodOpacity:\"flood-opacity\",focusable:0,fontFamily:\"font-family\",fontSize:\"font-size\",fontSizeAdjust:\"font-size-adjust\",fontStretch:\"font-stretch\",fontStyle:\"font-style\",fontVariant:\"font-variant\",fontWeight:\"font-weight\",format:0,from:0,fx:0,fy:0,g1:0,g2:0,glyphName:\"glyph-name\",glyphOrientationHorizontal:\"glyph-orientation-horizontal\",glyphOrientationVertical:\"glyph-orientation-vertical\",glyphRef:\"glyphRef\",gradientTransform:\"gradientTransform\",gradientUnits:\"gradientUnits\",hanging:0,horizAdvX:\"horiz-adv-x\",horizOriginX:\"horiz-origin-x\",ideographic:0,imageRendering:\"image-rendering\",in:0,in2:0,intercept:0,k:0,k1:0,k2:0,k3:0,k4:0,kernelMatrix:\"kernelMatrix\",kernelUnitLength:\"kernelUnitLength\",kerning:0,keyPoints:\"keyPoints\",keySplines:\"keySplines\",keyTimes:\"keyTimes\",lengthAdjust:\"lengthAdjust\",letterSpacing:\"letter-spacing\",lightingColor:\"lighting-color\",limitingConeAngle:\"limitingConeAngle\",local:0,markerEnd:\"marker-end\",markerMid:\"marker-mid\",markerStart:\"marker-start\",markerHeight:\"markerHeight\",markerUnits:\"markerUnits\",markerWidth:\"markerWidth\",mask:0,maskContentUnits:\"maskContentUnits\",maskUnits:\"maskUnits\",mathematical:0,mode:0,numOctaves:\"numOctaves\",offset:0,opacity:0,operator:0,order:0,orient:0,orientation:0,origin:0,overflow:0,overlinePosition:\"overline-position\",overlineThickness:\"overline-thickness\",paintOrder:\"paint-order\",panose1:\"panose-1\",pathLength:\"pathLength\",patternContentUnits:\"patternContentUnits\",patternTransform:\"patternTransform\",patternUnits:\"patternUnits\",pointerEvents:\"pointer-events\",points:0,pointsAtX:\"pointsAtX\",pointsAtY:\"pointsAtY\",pointsAtZ:\"pointsAtZ\",preserveAlpha:\"preserveAlpha\",preserveAspectRatio:\"preserveAspectRatio\",primitiveUnits:\"primitiveUnits\",r:0,radius:0,refX:\"refX\",refY:\"refY\",renderingIntent:\"rendering-intent\",repeatCount:\"repeatCount\",repeatDur:\"repeatDur\",requiredExtensions:\"requiredExtensions\",requiredFeatures:\"requiredFeatures\",restart:0,result:0,rotate:0,rx:0,ry:0,scale:0,seed:0,shapeRendering:\"shape-rendering\",slope:0,spacing:0,specularConstant:\"specularConstant\",specularExponent:\"specularExponent\",speed:0,spreadMethod:\"spreadMethod\",startOffset:\"startOffset\",stdDeviation:\"stdDeviation\",stemh:0,stemv:0,stitchTiles:\"stitchTiles\",stopColor:\"stop-color\",stopOpacity:\"stop-opacity\",strikethroughPosition:\"strikethrough-position\",strikethroughThickness:\"strikethrough-thickness\",string:0,stroke:0,strokeDasharray:\"stroke-dasharray\",strokeDashoffset:\"stroke-dashoffset\",strokeLinecap:\"stroke-linecap\",strokeLinejoin:\"stroke-linejoin\",strokeMiterlimit:\"stroke-miterlimit\",strokeOpacity:\"stroke-opacity\",strokeWidth:\"stroke-width\",surfaceScale:\"surfaceScale\",systemLanguage:\"systemLanguage\",tableValues:\"tableValues\",targetX:\"targetX\",targetY:\"targetY\",textAnchor:\"text-anchor\",textDecoration:\"text-decoration\",textRendering:\"text-rendering\",textLength:\"textLength\",to:0,transform:0,u1:0,u2:0,underlinePosition:\"underline-position\",underlineThickness:\"underline-thickness\",unicode:0,unicodeBidi:\"unicode-bidi\",unicodeRange:\"unicode-range\",unitsPerEm:\"units-per-em\",vAlphabetic:\"v-alphabetic\",vHanging:\"v-hanging\",vIdeographic:\"v-ideographic\",vMathematical:\"v-mathematical\",values:0,vectorEffect:\"vector-effect\",version:0,vertAdvY:\"vert-adv-y\",vertOriginX:\"vert-origin-x\",vertOriginY:\"vert-origin-y\",viewBox:\"viewBox\",viewTarget:\"viewTarget\",visibility:0,widths:0,wordSpacing:\"word-spacing\",writingMode:\"writing-mode\",x:0,xHeight:\"x-height\",x1:0,x2:0,xChannelSelector:\"xChannelSelector\",xlinkActuate:\"xlink:actuate\",xlinkArcrole:\"xlink:arcrole\",xlinkHref:\"xlink:href\",xlinkRole:\"xlink:role\",xlinkShow:\"xlink:show\",xlinkTitle:\"xlink:title\",xlinkType:\"xlink:type\",xmlBase:\"xml:base\",xmlns:0,xmlnsXlink:\"xmlns:xlink\",xmlLang:\"xml:lang\",xmlSpace:\"xml:space\",y:0,y1:0,y2:0,yChannelSelector:\"yChannelSelector\",z:0,zoomAndPan:\"zoomAndPan\"},i={Properties:{},DOMAttributeNamespaces:{xlinkActuate:n.xlink,xlinkArcrole:n.xlink,xlinkHref:n.xlink,xlinkRole:n.xlink,xlinkShow:n.xlink,xlinkTitle:n.xlink,xlinkType:n.xlink,xmlBase:n.xml,xmlLang:n.xml,xmlSpace:n.xml},DOMAttributeNames:{}};Object.keys(r).forEach(function(e){i.Properties[e]=0,r[e]&&(i.DOMAttributeNames[e]=r[e])}),e.exports=i},function(e,t,n){\"use strict\";function r(e){if(\"selectionStart\"in e&&u.hasSelectionCapabilities(e))return{start:e.selectionStart,end:e.selectionEnd};if(window.getSelection){var t=window.getSelection();return{anchorNode:t.anchorNode,anchorOffset:t.anchorOffset,focusNode:t.focusNode,focusOffset:t.focusOffset}}if(document.selection){var n=document.selection.createRange();return{parentElement:n.parentElement(),text:n.text,top:n.boundingTop,left:n.boundingLeft}}}function i(e,t){if(g||null==m||m!==l())return null;var n=r(m);if(!y||!f(y,n)){y=n;var i=c.getPooled(d.select,v,e,t);return i.type=\"select\",i.target=m,o.accumulateTwoPhaseDispatches(i),i}return null}var o=n(537),a=n(544),s=n(530),u=n(637),c=n(549),l=n(643),p=n(563),f=n(613),h=a.canUseDOM&&\"documentMode\"in document&&document.documentMode<=11,d={select:{phasedRegistrationNames:{bubbled:\"onSelect\",captured:\"onSelectCapture\"},dependencies:[\"topBlur\",\"topContextMenu\",\"topFocus\",\"topKeyDown\",\"topKeyUp\",\"topMouseDown\",\"topMouseUp\",\"topSelectionChange\"]}},m=null,v=null,y=null,g=!1,_=!1,b={eventTypes:d,extractEvents:function(e,t,n,r){if(!_)return null;var o=t?s.getNodeFromInstance(t):window;switch(e){case\"topFocus\":(p(o)||\"true\"===o.contentEditable)&&(m=o,v=t,y=null);break;case\"topBlur\":m=null,v=null,y=null;break;case\"topMouseDown\":g=!0;break;case\"topContextMenu\":case\"topMouseUp\":return g=!1,i(n,r);case\"topSelectionChange\":if(h)break;case\"topKeyDown\":case\"topKeyUp\":return i(n,r)}return null},didPutListener:function(e,t,n){\"onSelect\"===t&&(_=!0)}};e.exports=b},function(e,t,n){\"use strict\";function r(e){return\".\"+e._rootNodeID}function i(e){return\"button\"===e||\"input\"===e||\"select\"===e||\"textarea\"===e}var o=n(531),a=n(633),s=n(537),u=n(530),c=n(647),l=n(648),p=n(549),f=n(649),h=n(650),d=n(566),m=n(653),v=n(654),y=n(655),g=n(567),_=n(656),b=n(505),x=n(651),w=(n(508),{}),k={};[\"abort\",\"animationEnd\",\"animationIteration\",\"animationStart\",\"blur\",\"canPlay\",\"canPlayThrough\",\"click\",\"contextMenu\",\"copy\",\"cut\",\"doubleClick\",\"drag\",\"dragEnd\",\"dragEnter\",\"dragExit\",\"dragLeave\",\"dragOver\",\"dragStart\",\"drop\",\"durationChange\",\"emptied\",\"encrypted\",\"ended\",\"error\",\"focus\",\"input\",\"invalid\",\"keyDown\",\"keyPress\",\"keyUp\",\"load\",\"loadedData\",\"loadedMetadata\",\"loadStart\",\"mouseDown\",\"mouseMove\",\"mouseOut\",\"mouseOver\",\"mouseUp\",\"paste\",\"pause\",\"play\",\"playing\",\"progress\",\"rateChange\",\"reset\",\"scroll\",\"seeked\",\"seeking\",\"stalled\",\"submit\",\"suspend\",\"timeUpdate\",\"touchCancel\",\"touchEnd\",\"touchMove\",\"touchStart\",\"transitionEnd\",\"volumeChange\",\"waiting\",\"wheel\"].forEach(function(e){var t=e[0].toUpperCase()+e.slice(1),n=\"on\"+t,r=\"top\"+t,i={phasedRegistrationNames:{bubbled:n,captured:n+\"Capture\"},dependencies:[r]};w[e]=i,k[r]=i});var S={},E={eventTypes:w,extractEvents:function(e,t,n,r){var i=k[e];if(!i)return null;var a;switch(e){case\"topAbort\":case\"topCanPlay\":case\"topCanPlayThrough\":case\"topDurationChange\":case\"topEmptied\":case\"topEncrypted\":case\"topEnded\":case\"topError\":case\"topInput\":case\"topInvalid\":case\"topLoad\":case\"topLoadedData\":case\"topLoadedMetadata\":case\"topLoadStart\":case\"topPause\":case\"topPlay\":case\"topPlaying\":case\"topProgress\":case\"topRateChange\":case\"topReset\":case\"topSeeked\":case\"topSeeking\":case\"topStalled\":case\"topSubmit\":case\"topSuspend\":case\"topTimeUpdate\":case\"topVolumeChange\":case\"topWaiting\":a=p;break;case\"topKeyPress\":if(0===x(n))return null;case\"topKeyDown\":case\"topKeyUp\":a=h;break;case\"topBlur\":case\"topFocus\":a=f;break;case\"topClick\":if(2===n.button)return null;case\"topDoubleClick\":case\"topMouseDown\":case\"topMouseMove\":case\"topMouseUp\":case\"topMouseOut\":case\"topMouseOver\":case\"topContextMenu\":a=d;break;case\"topDrag\":case\"topDragEnd\":case\"topDragEnter\":case\"topDragExit\":case\"topDragLeave\":case\"topDragOver\":case\"topDragStart\":case\"topDrop\":a=m;break;case\"topTouchCancel\":case\"topTouchEnd\":case\"topTouchMove\":case\"topTouchStart\":a=v;break;case\"topAnimationEnd\":case\"topAnimationIteration\":case\"topAnimationStart\":a=c;break;case\"topTransitionEnd\":a=y;break;case\"topScroll\":a=g;break;case\"topWheel\":a=_;break;case\"topCopy\":case\"topCut\":case\"topPaste\":a=l}a?void 0:o(\"86\",e);var u=a.getPooled(i,t,n,r);return s.accumulateTwoPhaseDispatches(u),u},didPutListener:function(e,t,n){if(\"onClick\"===t&&!i(e._tag)){var o=r(e),s=u.getNodeFromInstance(e);S[o]||(S[o]=a.listen(s,\"click\",b))}},willDeleteListener:function(e,t){if(\"onClick\"===t&&!i(e._tag)){var n=r(e);S[n].remove(),delete S[n]}}};e.exports=E},function(e,t,n){\"use strict\";function r(e,t,n,r){return i.call(this,e,t,n,r)}var i=n(549),o={animationName:null,elapsedTime:null,pseudoElement:null};i.augmentClass(r,o),e.exports=r},function(e,t,n){\"use strict\";function r(e,t,n,r){return i.call(this,e,t,n,r)}var i=n(549),o={clipboardData:function(e){return\"clipboardData\"in e?e.clipboardData:window.clipboardData}};i.augmentClass(r,o),e.exports=r},function(e,t,n){\"use strict\";function r(e,t,n,r){return i.call(this,e,t,n,r)}var i=n(567),o={relatedTarget:null};i.augmentClass(r,o),e.exports=r},function(e,t,n){\"use strict\";function r(e,t,n,r){return i.call(this,e,t,n,r)}var i=n(567),o=n(651),a=n(652),s=n(569),u={key:a,location:null,ctrlKey:null,shiftKey:null,altKey:null,metaKey:null,repeat:null,locale:null,getModifierState:s,charCode:function(e){return\"keypress\"===e.type?o(e):0},keyCode:function(e){return\"keydown\"===e.type||\"keyup\"===e.type?e.keyCode:0},which:function(e){return\"keypress\"===e.type?o(e):\"keydown\"===e.type||\"keyup\"===e.type?e.keyCode:0}};i.augmentClass(r,u),e.exports=r},function(e,t){\"use strict\";function n(e){var t,n=e.keyCode;return\"charCode\"in e?(t=e.charCode,0===t&&13===n&&(t=13)):t=n,t>=32||13===t?t:0}e.exports=n},function(e,t,n){\"use strict\";function r(e){if(e.key){var t=o[e.key]||e.key;if(\"Unidentified\"!==t)return t}if(\"keypress\"===e.type){var n=i(e);return 13===n?\"Enter\":String.fromCharCode(n)}return\"keydown\"===e.type||\"keyup\"===e.type?a[e.keyCode]||\"Unidentified\":\"\"}var i=n(651),o={Esc:\"Escape\",Spacebar:\" \",Left:\"ArrowLeft\",Up:\"ArrowUp\",Right:\"ArrowRight\",Down:\"ArrowDown\",Del:\"Delete\",Win:\"OS\",Menu:\"ContextMenu\",Apps:\"ContextMenu\",Scroll:\"ScrollLock\",MozPrintableKey:\"Unidentified\"},a={8:\"Backspace\",9:\"Tab\",12:\"Clear\",13:\"Enter\",16:\"Shift\",17:\"Control\",18:\"Alt\",19:\"Pause\",20:\"CapsLock\",27:\"Escape\",32:\" \",33:\"PageUp\",34:\"PageDown\",35:\"End\",36:\"Home\",37:\"ArrowLeft\",38:\"ArrowUp\",39:\"ArrowRight\",40:\"ArrowDown\",45:\"Insert\",46:\"Delete\",112:\"F1\",113:\"F2\",114:\"F3\",115:\"F4\",116:\"F5\",117:\"F6\",118:\"F7\",119:\"F8\",120:\"F9\",121:\"F10\",122:\"F11\",123:\"F12\",144:\"NumLock\",145:\"ScrollLock\",224:\"Meta\"};e.exports=r},function(e,t,n){\"use strict\";function r(e,t,n,r){return i.call(this,e,t,n,r)}var i=n(566),o={dataTransfer:null};i.augmentClass(r,o),e.exports=r},function(e,t,n){\"use strict\";function r(e,t,n,r){return i.call(this,e,t,n,r)}var i=n(567),o=n(569),a={touches:null,targetTouches:null,changedTouches:null,altKey:null,metaKey:null,ctrlKey:null,shiftKey:null,getModifierState:o};i.augmentClass(r,a),e.exports=r},function(e,t,n){\"use strict\";function r(e,t,n,r){return i.call(this,e,t,n,r)}var i=n(549),o={propertyName:null,elapsedTime:null,pseudoElement:null};i.augmentClass(r,o),e.exports=r},function(e,t,n){\"use strict\";function r(e,t,n,r){return i.call(this,e,t,n,r)}var i=n(566),o={deltaX:function(e){return\"deltaX\"in e?e.deltaX:\"wheelDeltaX\"in e?-e.wheelDeltaX:0},deltaY:function(e){return\"deltaY\"in e?e.deltaY:\"wheelDeltaY\"in e?-e.wheelDeltaY:\"wheelDelta\"in e?-e.wheelDelta:0},deltaZ:null,deltaMode:null};i.augmentClass(r,o),e.exports=r},function(e,t,n){\"use strict\";function r(e,t){for(var n=Math.min(e.length,t.length),r=0;r<n;r++)if(e.charAt(r)!==t.charAt(r))return r;return e.length===t.length?-1:n}function i(e){return e?e.nodeType===N?e.documentElement:e.firstChild:null}function o(e){return e.getAttribute&&e.getAttribute(O)||\"\"}function a(e,t,n,r,i){var o;if(x.logTopLevelRenders){var a=e._currentElement.props.child,s=a.type;o=\"React mount: \"+(\"string\"==typeof s?s:s.displayName||s.name),console.time(o)}var u=S.mountComponent(e,n,null,_(e,t),i,0);o&&console.timeEnd(o),e._renderedComponent._topLevelWrapper=e,L._mountImageIntoNode(u,t,e,r,n)}function s(e,t,n,r){var i=C.ReactReconcileTransaction.getPooled(!n&&b.useCreateElement);i.perform(a,null,e,t,i,n,r),C.ReactReconcileTransaction.release(i)}function u(e,t,n){for(S.unmountComponent(e,n),t.nodeType===N&&(t=t.documentElement);t.lastChild;)t.removeChild(t.lastChild)}function c(e){var t=i(e);if(t){var n=g.getInstanceFromNode(t);return!(!n||!n._hostParent)}}function l(e){return!(!e||e.nodeType!==I&&e.nodeType!==N&&e.nodeType!==R)}function p(e){var t=i(e),n=t&&g.getInstanceFromNode(t);return n&&!n._hostParent?n:null}function f(e){var t=p(e);return t?t._hostContainerInfo._topLevelWrapper:null}var h=n(531),d=n(573),m=n(532),v=n(499),y=n(597),g=(n(513),n(530)),_=n(658),b=n(659),x=n(554),w=n(608),k=(n(558),n(660)),S=n(555),E=n(626),C=n(552),A=n(507),T=n(610),D=(n(508),n(575)),M=n(614),O=(n(504),m.ID_ATTRIBUTE_NAME),P=m.ROOT_ATTRIBUTE_NAME,I=1,N=9,R=11,j={},F=1,B=function(){this.rootID=F++};B.prototype.isReactComponent={},B.prototype.render=function(){return this.props.child},B.isReactTopLevelWrapper=!0;var L={TopLevelWrapper:B,_instancesByReactRootID:j,scrollMonitor:function(e,t){t()},_updateRootComponent:function(e,t,n,r,i){return L.scrollMonitor(r,function(){E.enqueueElementInternal(e,t,n),i&&E.enqueueCallbackInternal(e,i)}),e},_renderNewRootComponent:function(e,t,n,r){l(t)?void 0:h(\"37\"),y.ensureScrollValueMonitoring();var i=T(e,!1);C.batchedUpdates(s,i,t,n,r);var o=i._instance.rootID;return j[o]=i,i},renderSubtreeIntoContainer:function(e,t,n,r){return null!=e&&w.has(e)?void 0:h(\"38\"),L._renderSubtreeIntoContainer(e,t,n,r)},_renderSubtreeIntoContainer:function(e,t,n,r){E.validateCallback(r,\"ReactDOM.render\"),v.isValidElement(t)?void 0:h(\"39\",\"string\"==typeof t?\" Instead of passing a string like 'div', pass React.createElement('div') or <div />.\":\"function\"==typeof t?\" Instead of passing a class like Foo, pass React.createElement(Foo) or <Foo />.\":null!=t&&void 0!==t.props?\" This may be caused by unintentionally loading two independent copies of React.\":\"\");var a,s=v.createElement(B,{child:t});if(e){var u=w.get(e);a=u._processChildContext(u._context)}else a=A;var l=f(n);if(l){var p=l._currentElement,d=p.props.child;if(M(d,t)){var m=l._renderedComponent.getPublicInstance(),y=r&&function(){r.call(m)};return L._updateRootComponent(l,s,a,n,y),m}L.unmountComponentAtNode(n)}var g=i(n),_=g&&!!o(g),b=c(n),x=_&&!l&&!b,k=L._renderNewRootComponent(s,n,x,a)._renderedComponent.getPublicInstance();return r&&r.call(k),k},render:function(e,t,n){return L._renderSubtreeIntoContainer(null,e,t,n)},unmountComponentAtNode:function(e){l(e)?void 0:h(\"40\");var t=f(e);if(!t){c(e),1===e.nodeType&&e.hasAttribute(P);return!1}return delete j[t._instance.rootID],C.batchedUpdates(u,t,e,!1),!0},_mountImageIntoNode:function(e,t,n,o,a){if(l(t)?void 0:h(\"41\"),o){var s=i(t);if(k.canReuseMarkup(e,s))return void g.precacheNode(n,s);var u=s.getAttribute(k.CHECKSUM_ATTR_NAME);s.removeAttribute(k.CHECKSUM_ATTR_NAME);var c=s.outerHTML;s.setAttribute(k.CHECKSUM_ATTR_NAME,u);var p=e,f=r(p,c),m=\" (client) \"+p.substring(f-20,f+20)+\"\\n (server) \"+c.substring(f-20,f+20);t.nodeType===N?h(\"42\",m):void 0}if(t.nodeType===N?h(\"43\"):void 0,a.useCreateElement){for(;t.lastChild;)t.removeChild(t.lastChild);d.insertTreeBefore(t,e,null)}else D(t,e),g.precacheNode(n,t.firstChild)}};e.exports=L},function(e,t,n){\"use strict\";function r(e,t){var n={_topLevelWrapper:e,_idCounter:1,_ownerDocument:t?t.nodeType===i?t:t.ownerDocument:null,_node:t,_tag:t?t.nodeName.toLowerCase():null,_namespaceURI:t?t.namespaceURI:null};return n}var i=(n(627),9);e.exports=r},function(e,t){\"use strict\";var n={useCreateElement:!0,useFiber:!1};e.exports=n},function(e,t,n){\"use strict\";var r=n(661),i=/\\/?>/,o=/^<\\!\\-\\-/,a={CHECKSUM_ATTR_NAME:\"data-react-checksum\",addChecksumToMarkup:function(e){var t=r(e);return o.test(e)?e:e.replace(i,\" \"+a.CHECKSUM_ATTR_NAME+'=\"'+t+'\"$&')},canReuseMarkup:function(e,t){var n=t.getAttribute(a.CHECKSUM_ATTR_NAME);n=n&&parseInt(n,10);var i=r(e);return i===n}};e.exports=a},function(e,t){\"use strict\";function n(e){for(var t=1,n=0,i=0,o=e.length,a=o&-4;i<a;){for(var s=Math.min(i+4096,a);i<s;i+=4)n+=(t+=e.charCodeAt(i))+(t+=e.charCodeAt(i+1))+(t+=e.charCodeAt(i+2))+(t+=e.charCodeAt(i+3));t%=r,n%=r}for(;i<o;i++)n+=t+=e.charCodeAt(i);return t%=r,n%=r,t|n<<16}var r=65521;e.exports=n},524,function(e,t,n){\"use strict\";function r(e){if(null==e)return null;if(1===e.nodeType)return e;var t=a.get(e);return t?(t=s(t),t?o.getNodeFromInstance(t):null):void(\"function\"==typeof e.render?i(\"44\"):i(\"45\",Object.keys(e)))}var i=n(531),o=(n(513),n(530)),a=n(608),s=n(664);n(508),n(504);e.exports=r},function(e,t,n){\"use strict\";function r(e){for(var t;(t=e._renderedNodeType)===i.COMPOSITE;)e=e._renderedComponent;return t===i.HOST?e._renderedComponent:t===i.EMPTY?null:void 0}var i=n(612);e.exports=r},function(e,t,n){\"use strict\";var r=n(657);e.exports=r.renderSubtreeIntoContainer},function(e,t,n){\"use strict\";function r(e){return e&&e.__esModule?e:{default:e}}t.__esModule=!0,t.connect=t.Provider=void 0;var i=n(667),o=r(i),a=n(672),s=r(a);t.Provider=o.default,t.connect=s.default},function(e,t,n){\"use strict\";function r(e){return e&&e.__esModule?e:{default:e}}function i(e,t){if(!(e instanceof t))throw new TypeError(\"Cannot call a class as a function\")}function o(e,t){if(!e)throw new ReferenceError(\"this hasn't been initialised - super() hasn't been called\");return!t||\"object\"!=typeof t&&\"function\"!=typeof t?e:t}function a(e,t){if(\"function\"!=typeof t&&null!==t)throw new TypeError(\"Super expression must either be null or a function, not \"+typeof t);e.prototype=Object.create(t&&t.prototype,{constructor:{value:e,enumerable:!1,writable:!0,configurable:!0}}),t&&(Object.setPrototypeOf?Object.setPrototypeOf(e,t):e.__proto__=t)}t.__esModule=!0,t.default=void 0;var s=n(498),u=n(668),c=r(u),l=n(670),p=r(l),f=n(671),h=(r(f),function(e){function t(n,r){i(this,t);var a=o(this,e.call(this,n,r));return a.store=n.store,a}return a(t,e),t.prototype.getChildContext=function(){return{store:this.store}},t.prototype.render=function(){return s.Children.only(this.props.children)},t}(s.Component));t.default=h,h.propTypes={store:p.default.isRequired,children:c.default.element.isRequired},h.childContextTypes={store:p.default.isRequired}},[1232,669],function(e,t,n){\"use strict\";var r=n(505),i=n(508),o=n(522);e.exports=function(){function e(e,t,n,r,a,s){s!==o&&i(!1,\"Calling PropTypes validators directly is not supported by the `prop-types` package. Use PropTypes.checkPropTypes() to call them. Read more at http://fb.me/use-check-prop-types\")}function t(){return e}e.isRequired=e;var n={array:e,bool:e,func:e,number:e,object:e,string:e,symbol:e,any:e,arrayOf:t,element:e,instanceOf:t,node:e,objectOf:t,oneOf:t,oneOfType:t,shape:t};return n.checkPropTypes=r,n.PropTypes=n,n}},function(e,t,n){\"use strict\";function r(e){return e&&e.__esModule?e:{default:e}}t.__esModule=!0;var i=n(668),o=r(i);t.default=o.default.shape({subscribe:o.default.func.isRequired,dispatch:o.default.func.isRequired,getState:o.default.func.isRequired})},function(e,t){\"use strict\";function n(e){\"undefined\"!=typeof console&&\"function\"==typeof console.error&&console.error(e);try{throw new Error(e)}catch(e){}}t.__esModule=!0,t.default=n},function(e,t,n){\"use strict\";function r(e){return e&&e.__esModule?e:{default:e}}function i(e,t){if(!(e instanceof t))throw new TypeError(\"Cannot call a class as a function\")}function o(e,t){if(!e)throw new ReferenceError(\"this hasn't been initialised - super() hasn't been called\");return!t||\"object\"!=typeof t&&\"function\"!=typeof t?e:t}function a(e,t){if(\"function\"!=typeof t&&null!==t)throw new TypeError(\"Super expression must either be null or a function, not \"+typeof t);e.prototype=Object.create(t&&t.prototype,{constructor:{value:e,enumerable:!1,writable:!0,configurable:!0}}),t&&(Object.setPrototypeOf?Object.setPrototypeOf(e,t):e.__proto__=t)}function s(e){return e.displayName||e.name||\"Component\"}function u(e,t){try{return e.apply(t)}catch(e){return A.value=e,A}}function c(e,t,n){var r=arguments.length>3&&void 0!==arguments[3]?arguments[3]:{},c=Boolean(e),f=e||S,d=void 0;d=\"function\"==typeof t?t:t?(0,y.default)(t):E;var v=n||C,g=r.pure,_=void 0===g||g,b=r.withRef,w=void 0!==b&&b,D=_&&v!==C,M=T++;return function(e){function t(e,t,n){var r=v(e,t,n);return r}var n=\"Connect(\"+s(e)+\")\",r=function(r){function s(e,t){i(this,s);var a=o(this,r.call(this,e,t));a.version=M,a.store=e.store||t.store,(0,k.default)(a.store,'Could not find \"store\" in either the context or '+('props of \"'+n+'\". ')+\"Either wrap the root component in a <Provider>, \"+('or explicitly pass \"store\" as a prop to \"'+n+'\".'));var u=a.store.getState();return a.state={storeState:u},a.clearCache(),a}return a(s,r),s.prototype.shouldComponentUpdate=function(){return!_||this.haveOwnPropsChanged||this.hasStoreStateChanged},s.prototype.computeStateProps=function(e,t){if(!this.finalMapStateToProps)return this.configureFinalMapState(e,t);var n=e.getState(),r=this.doStatePropsDependOnOwnProps?this.finalMapStateToProps(n,t):this.finalMapStateToProps(n);\nreturn r},s.prototype.configureFinalMapState=function(e,t){var n=f(e.getState(),t),r=\"function\"==typeof n;return this.finalMapStateToProps=r?n:f,this.doStatePropsDependOnOwnProps=1!==this.finalMapStateToProps.length,r?this.computeStateProps(e,t):n},s.prototype.computeDispatchProps=function(e,t){if(!this.finalMapDispatchToProps)return this.configureFinalMapDispatch(e,t);var n=e.dispatch,r=this.doDispatchPropsDependOnOwnProps?this.finalMapDispatchToProps(n,t):this.finalMapDispatchToProps(n);return r},s.prototype.configureFinalMapDispatch=function(e,t){var n=d(e.dispatch,t),r=\"function\"==typeof n;return this.finalMapDispatchToProps=r?n:d,this.doDispatchPropsDependOnOwnProps=1!==this.finalMapDispatchToProps.length,r?this.computeDispatchProps(e,t):n},s.prototype.updateStatePropsIfNeeded=function(){var e=this.computeStateProps(this.store,this.props);return(!this.stateProps||!(0,m.default)(e,this.stateProps))&&(this.stateProps=e,!0)},s.prototype.updateDispatchPropsIfNeeded=function(){var e=this.computeDispatchProps(this.store,this.props);return(!this.dispatchProps||!(0,m.default)(e,this.dispatchProps))&&(this.dispatchProps=e,!0)},s.prototype.updateMergedPropsIfNeeded=function(){var e=t(this.stateProps,this.dispatchProps,this.props);return!(this.mergedProps&&D&&(0,m.default)(e,this.mergedProps))&&(this.mergedProps=e,!0)},s.prototype.isSubscribed=function(){return\"function\"==typeof this.unsubscribe},s.prototype.trySubscribe=function(){c&&!this.unsubscribe&&(this.unsubscribe=this.store.subscribe(this.handleChange.bind(this)),this.handleChange())},s.prototype.tryUnsubscribe=function(){this.unsubscribe&&(this.unsubscribe(),this.unsubscribe=null)},s.prototype.componentDidMount=function(){this.trySubscribe()},s.prototype.componentWillReceiveProps=function(e){_&&(0,m.default)(e,this.props)||(this.haveOwnPropsChanged=!0)},s.prototype.componentWillUnmount=function(){this.tryUnsubscribe(),this.clearCache()},s.prototype.clearCache=function(){this.dispatchProps=null,this.stateProps=null,this.mergedProps=null,this.haveOwnPropsChanged=!0,this.hasStoreStateChanged=!0,this.haveStatePropsBeenPrecalculated=!1,this.statePropsPrecalculationError=null,this.renderedElement=null,this.finalMapDispatchToProps=null,this.finalMapStateToProps=null},s.prototype.handleChange=function(){if(this.unsubscribe){var e=this.store.getState(),t=this.state.storeState;if(!_||t!==e){if(_&&!this.doStatePropsDependOnOwnProps){var n=u(this.updateStatePropsIfNeeded,this);if(!n)return;n===A&&(this.statePropsPrecalculationError=A.value),this.haveStatePropsBeenPrecalculated=!0}this.hasStoreStateChanged=!0,this.setState({storeState:e})}}},s.prototype.getWrappedInstance=function(){return(0,k.default)(w,\"To access the wrapped instance, you need to specify { withRef: true } as the fourth argument of the connect() call.\"),this.refs.wrappedInstance},s.prototype.render=function(){var t=this.haveOwnPropsChanged,n=this.hasStoreStateChanged,r=this.haveStatePropsBeenPrecalculated,i=this.statePropsPrecalculationError,o=this.renderedElement;if(this.haveOwnPropsChanged=!1,this.hasStoreStateChanged=!1,this.haveStatePropsBeenPrecalculated=!1,this.statePropsPrecalculationError=null,i)throw i;var a=!0,s=!0;_&&o&&(a=n||t&&this.doStatePropsDependOnOwnProps,s=t&&this.doDispatchPropsDependOnOwnProps);var u=!1,c=!1;r?u=!0:a&&(u=this.updateStatePropsIfNeeded()),s&&(c=this.updateDispatchPropsIfNeeded());var f=!0;return f=!!(u||c||t)&&this.updateMergedPropsIfNeeded(),!f&&o?o:(w?this.renderedElement=(0,p.createElement)(e,l({},this.mergedProps,{ref:\"wrappedInstance\"})):this.renderedElement=(0,p.createElement)(e,this.mergedProps),this.renderedElement)},s}(p.Component);return r.displayName=n,r.WrappedComponent=e,r.contextTypes={store:h.default},r.propTypes={store:h.default},(0,x.default)(r,e)}}t.__esModule=!0;var l=Object.assign||function(e){for(var t=1;t<arguments.length;t++){var n=arguments[t];for(var r in n)Object.prototype.hasOwnProperty.call(n,r)&&(e[r]=n[r])}return e};t.default=c;var p=n(498),f=n(670),h=r(f),d=n(673),m=r(d),v=n(674),y=r(v),g=n(671),_=(r(g),n(149)),b=(r(_),n(675)),x=r(b),w=n(676),k=r(w),S=function(e){return{}},E=function(e){return{dispatch:e}},C=function(e,t,n){return l({},n,e,t)},A={value:null},T=0},function(e,t){\"use strict\";function n(e,t){if(e===t)return!0;var n=Object.keys(e),r=Object.keys(t);if(n.length!==r.length)return!1;for(var i=Object.prototype.hasOwnProperty,o=0;o<n.length;o++)if(!i.call(t,n[o])||e[n[o]]!==t[n[o]])return!1;return!0}t.__esModule=!0,t.default=n},function(e,t,n){\"use strict\";function r(e){return function(t){return(0,i.bindActionCreators)(e,t)}}t.__esModule=!0,t.default=r;var i=n(147)},function(e,t){\"use strict\";var n={childContextTypes:!0,contextTypes:!0,defaultProps:!0,displayName:!0,getDefaultProps:!0,mixins:!0,propTypes:!0,type:!0},r={name:!0,length:!0,prototype:!0,caller:!0,arguments:!0,arity:!0},i=\"function\"==typeof Object.getOwnPropertySymbols;e.exports=function(e,t,o){if(\"string\"!=typeof t){var a=Object.getOwnPropertyNames(t);i&&(a=a.concat(Object.getOwnPropertySymbols(t)));for(var s=0;s<a.length;++s)if(!(n[a[s]]||r[a[s]]||o&&o[a[s]]))try{e[a[s]]=t[a[s]]}catch(e){}}return e}},function(e,t,n){\"use strict\";var r=function(e,t,n,r,i,o,a,s){if(!e){var u;if(void 0===t)u=new Error(\"Minified exception occurred; use the non-minified dev environment for the full error message and additional helpful warnings.\");else{var c=[n,r,i,o,a,s],l=0;u=new Error(t.replace(/%s/g,function(){return c[l++]})),u.name=\"Invariant Violation\"}throw u.framesToPop=1,u}};e.exports=r},function(e,t,n){var r=n(192),i=n(678),o=n(713),a=n(297),s=n(684),u=n(716),c=n(699),l=1,p=2,f=4,h=u(function(e,t){var n={};if(null==e)return n;var u=!1;t=r(t,function(t){return t=a(t,e),u||(u=t.length>1),t}),s(e,c(e),n),u&&(n=i(n,l|p|f));for(var h=t.length;h--;)o(n,t[h]);return n});e.exports=h},function(e,t,n){function r(e,t,n,A,T,D){var M,I=t&k,N=t&S,j=t&E;if(n&&(M=T?n(e,A,T,D):n(e)),void 0!==M)return M;if(!x(e))return e;var F=_(e);if(F){if(M=v(e),!I)return l(e,M)}else{var B=m(e),L=B==O||B==P;if(b(e))return c(e,I);if(B==R||B==C||L&&!T){if(M=N||L?{}:g(e),!I)return N?f(e,u(M,e)):p(e,s(M,e))}else{if(!Z[B])return T?e:{};M=y(e,B,r,I)}}D||(D=new i);var z=D.get(e);if(z)return z;D.set(e,M);var q=j?N?d:h:N?keysIn:w,U=F?void 0:q(e);return o(U||e,function(i,o){U&&(o=i,i=e[o]),a(M,o,r(i,t,n,o,e,D))}),M}var i=n(250),o=n(679),a=n(680),s=n(683),u=n(685),c=n(689),l=n(690),p=n(691),f=n(694),h=n(697),d=n(699),m=n(286),v=n(700),y=n(701),g=n(711),_=n(193),b=n(274),x=n(221),w=n(269),k=1,S=2,E=4,C=\"[object Arguments]\",A=\"[object Array]\",T=\"[object Boolean]\",D=\"[object Date]\",M=\"[object Error]\",O=\"[object Function]\",P=\"[object GeneratorFunction]\",I=\"[object Map]\",N=\"[object Number]\",R=\"[object Object]\",j=\"[object RegExp]\",F=\"[object Set]\",B=\"[object String]\",L=\"[object Symbol]\",z=\"[object WeakMap]\",q=\"[object ArrayBuffer]\",U=\"[object DataView]\",W=\"[object Float32Array]\",K=\"[object Float64Array]\",V=\"[object Int8Array]\",H=\"[object Int16Array]\",J=\"[object Int32Array]\",G=\"[object Uint8Array]\",X=\"[object Uint8ClampedArray]\",Y=\"[object Uint16Array]\",$=\"[object Uint32Array]\",Z={};Z[C]=Z[A]=Z[q]=Z[U]=Z[T]=Z[D]=Z[W]=Z[K]=Z[V]=Z[H]=Z[J]=Z[I]=Z[N]=Z[R]=Z[j]=Z[F]=Z[B]=Z[L]=Z[G]=Z[X]=Z[Y]=Z[$]=!0,Z[M]=Z[O]=Z[z]=!1,e.exports=r},function(e,t){function n(e,t){for(var n=-1,r=null==e?0:e.length;++n<r&&t(e[n],n,e)!==!1;);return e}e.exports=n},[1233,681,234],function(e,t,n){function r(e,t,n){\"__proto__\"==t&&i?i(e,t,{configurable:!0,enumerable:!0,value:n,writable:!0}):e[t]=n}var i=n(682);e.exports=r},function(e,t,n){var r=n(218),i=function(){try{var e=r(Object,\"defineProperty\");return e({},\"\",{}),e}catch(e){}}();e.exports=i},[1234,684,269],[1235,680,681],function(e,t,n){function r(e,t){return e&&i(t,o(t),e)}var i=n(684),o=n(686);e.exports=r},function(e,t,n){function r(e){return a(e)?i(e,!0):o(e)}var i=n(270),o=n(687),a=n(285);e.exports=r},function(e,t,n){function r(e){if(!i(e))return a(e);var t=o(e),n=[];for(var r in e)(\"constructor\"!=r||!t&&u.call(e,r))&&n.push(r);return n}var i=n(221),o=n(283),a=n(688),s=Object.prototype,u=s.hasOwnProperty;e.exports=r},function(e,t){function n(e){var t=[];if(null!=e)for(var n in Object(e))t.push(n);return t}e.exports=n},[1236,152],function(e,t){function n(e,t){var n=-1,r=e.length;for(t||(t=Array(r));++n<r;)t[n]=e[n];return t}e.exports=n},function(e,t,n){function r(e,t){return i(e,o(e),t)}var i=n(684),o=n(692);e.exports=r},function(e,t,n){var r=n(157),i=n(693),o=Object.getOwnPropertySymbols,a=o?r(o,Object):i;e.exports=a},function(e,t){function n(){return[]}e.exports=n},function(e,t,n){function r(e,t){return i(e,o(e),t)}var i=n(684),o=n(695);e.exports=r},function(e,t,n){var r=n(696),i=n(156),o=n(692),a=n(693),s=Object.getOwnPropertySymbols,u=s?function(e){for(var t=[];e;)r(t,o(e)),e=i(e);return t}:a;e.exports=u},function(e,t){function n(e,t){for(var n=-1,r=t.length,i=e.length;++n<r;)e[i+n]=t[n];return e}e.exports=n},[1237,698,692,269],[1238,696,193],function(e,t,n){function r(e){return i(e,a,o)}var i=n(698),o=n(695),a=n(686);e.exports=r},function(e,t){function n(e){var t=e.length,n=e.constructor(t);return t&&\"string\"==typeof e[0]&&i.call(e,\"index\")&&(n.index=e.index,n.input=e.input),n}var r=Object.prototype,i=r.hasOwnProperty;e.exports=n},[1239,702,703,704,706,707,709,710],[1240,265],[1241,702],function(e,t,n){function r(e,t,n){var r=t?n(a(e),s):a(e);return o(r,i,new e.constructor)}var i=n(705),o=n(204),a=n(266),s=1;e.exports=r},function(e,t){function n(e,t){return e.set(t[0],t[1]),e}e.exports=n},function(e,t){function n(e){var t=new e.constructor(e.source,r.exec(e));return t.lastIndex=e.lastIndex,t}var r=/\\w*$/;e.exports=n},function(e,t,n){function r(e,t,n){var r=t?n(a(e),s):a(e);return o(r,i,new e.constructor)}var i=n(708),o=n(204),a=n(267),s=1;e.exports=r},function(e,t){function n(e,t){return e.add(t),e}e.exports=n},[1242,151],[1243,702],[1244,712,156,283],function(e,t,n){var r=n(221),i=Object.create,o=function(){function e(){}return function(t){if(!r(t))return{};if(i)return i(t);e.prototype=t;var n=new e;return e.prototype=void 0,n}}();e.exports=o},function(e,t,n){function r(e,t){return t=i(t,e),e=a(e,t),null==e||delete e[s(o(t))]}var i=n(297),o=n(714),a=n(715),s=n(301);e.exports=r},function(e,t){function n(e){var t=null==e?0:e.length;return t?e[t-1]:void 0}e.exports=n},function(e,t,n){function r(e,t){return t.length<2?e:i(e,o(t,0,-1))}var i=n(296),o=n(198);e.exports=r},[1245,717,720,722],function(e,t,n){function r(e){var t=null==e?0:e.length;return t?i(e,1):[]}var i=n(718);e.exports=r},[1246,696,719],[1247,151,272,193],[1248,721],function(e,t){function n(e,t,n){switch(n.length){case 0:return e.call(t);case 1:return e.call(t,n[0]);case 2:return e.call(t,n[0],n[1]);case 3:return e.call(t,n[0],n[1],n[2])}return e.apply(t,n)}e.exports=n},[1249,723,725],function(e,t,n){var r=n(724),i=n(682),o=n(305),a=i?function(e,t){return i(e,\"toString\",{configurable:!0,enumerable:!1,value:r(t),writable:!0})}:o;e.exports=a},function(e,t){function n(e){return function(){return e}}e.exports=n},function(e,t){function n(e){var t=0,n=0;return function(){var a=o(),s=i-(a-n);if(n=a,s>0){if(++t>=r)return arguments[0]}else t=0;return e.apply(void 0,arguments)}}var r=800,i=16,o=Date.now;e.exports=n},function(e,t,n){\"use strict\";function r(e){if(e&&e.__esModule)return e;var t={};if(null!=e)for(var n in e)Object.prototype.hasOwnProperty.call(e,n)&&(t[n]=e[n]);return t.default=e,t}Object.defineProperty(t,\"__esModule\",{value:!0}),t.default=function(){return{fn:o}};var i=n(322),o=r(i)},function(e,t){\"use strict\";Object.defineProperty(t,\"__esModule\",{value:!0}),t.default=function(e){function t(e){for(var t,n=arguments.length,r=Array(n>1?n-1:0),o=1;o<n;o++)r[o-1]=arguments[o];i(e)>=a&&(t=console)[e].apply(t,r)}var n=e.configs,r={debug:0,info:1,log:2,warn:3,error:4},i=function(e){return r[e]||-1},o=n.logLevel,a=i(o);return t.warn=t.bind(null,\"warn\"),t.error=t.bind(null,\"error\"),t.info=t.bind(null,\"info\"),t.debug=t.bind(null,\"debug\"),{rootInjects:{log:t}}}},function(e,t,n){\"use strict\";function r(e){return e&&e.__esModule?e:{default:e}}function i(e){if(e&&e.__esModule)return e;var t={};if(null!=e)for(var n in e)Object.prototype.hasOwnProperty.call(e,n)&&(t[n]=e[n]);return t.default=e,t}Object.defineProperty(t,\"__esModule\",{value:!0}),t.default=function(){return{fn:{AST:a},components:{JumpToPath:u.default}}};var o=n(729),a=i(o),s=n(761),u=r(s)},function(e,t,n){\"use strict\";function r(e){return e&&e.__esModule?e:{default:e}}function i(e,t){function n(e,t,i){if(!e)return i&&i.start_mark?i.start_mark.line:0;if(t.length&&e.tag===b)for(r=0;r<e.value.length;r++){var o=e.value[r],a=o[0],s=o[1];if(a.value===t[0])return n(s,t.slice(1),e);if(a.value===t[0].replace(/\\[.*/,\"\")){var u=parseInt(t[0].match(/\\[(.*)\\]/)[1]);if(1===s.value.length&&0!==u&&u)var c=(0,y.default)(s.value[0],{value:u.toString()});else var c=s.value[u];return n(c,t.slice(1),s.value)}}if(t.length&&e.tag===x){var l=e.value[t[0]];if(l&&l.tag)return n(l,t.slice(1),e.value)}return e.tag!==b||Array.isArray(i)?e.start_mark.line+1:e.start_mark.line}if(\"string\"!=typeof e)throw new TypeError(\"yaml should be a string\");if(!(0,m.default)(t))throw new TypeError(\"path should be an array of strings\");var r=0,i=_(e);return n(i,t)}function o(e,t){function n(e){if(e.tag===b)for(i=0;i<e.value.length;i++){var o=e.value[i],a=o[0],s=o[1];if(a.value===t[0])return t.shift(),n(s)}if(e.tag===x){var u=e.value[t[0]];if(u&&u.tag)return t.shift(),n(u)}return t.length?r:{start:{line:e.start_mark.line,column:e.start_mark.column},end:{line:e.end_mark.line,column:e.end_mark.column}}}if(\"string\"!=typeof e)throw new TypeError(\"yaml should be a string\");if(!(0,m.default)(t))throw new TypeError(\"path should be an array of strings\");var r={start:{line:-1,column:-1},end:{line:-1,column:-1}},i=0,o=_(e);return n(o)}function a(e,t){function n(e){function r(e){return e.start_mark.line===e.end_mark.line?t.line===e.start_mark.line&&e.start_mark.column<=t.column&&e.end_mark.column>=t.column:t.line===e.start_mark.line?t.column>=e.start_mark.column:t.line===e.end_mark.line?t.column<=e.end_mark.column:e.start_mark.line<t.line&&e.end_mark.line>t.line}var o=0;if(!e||[b,x].indexOf(e.tag)===-1)return i;if(e.tag===b)for(o=0;o<e.value.length;o++){var a=e.value[o],s=a[0],u=a[1];if(r(s))return i;if(r(u))return i.push(s.value),n(u)}if(e.tag===x)for(o=0;o<e.value.length;o++){var c=e.value[o];if(r(c))return i.push(o.toString()),n(c)}return i}if(\"string\"!=typeof e)throw new TypeError(\"yaml should be a string\");if(\"object\"!==(\"undefined\"==typeof t?\"undefined\":(0,p.default)(t))||\"number\"!=typeof t.line||\"number\"!=typeof t.column)throw new TypeError(\"position should be an object with line and column properties\");try{var r=_(e)}catch(n){return console.error(\"Error composing AST\",n),console.error(\"Problem area:\\n\",e.split(\"\\n\").slice(t.line-5,t.line+5).join(\"\\n\")),null}var i=[];return n(r)}function s(e){return function(){for(var t=arguments.length,n=Array(t),r=0;r<t;r++)n[r]=arguments[r];return new c.default(function(t){return t(e.apply(void 0,n))})}}Object.defineProperty(t,\"__esModule\",{value:!0}),t.getLineNumberForPathAsync=t.positionRangeForPathAsync=t.pathForPositionAsync=void 0;var u=n(730),c=r(u),l=n(94),p=r(l);t.getLineNumberForPath=i,t.positionRangeForPath=o,t.pathForPosition=a;var f=n(741),h=r(f),d=n(193),m=r(d),v=n(245),y=r(v),g=n(183),_=(0,g.memoize)(h.default.compose),b=\"tag:yaml.org,2002:map\",x=\"tag:yaml.org,2002:seq\";t.pathForPositionAsync=s(a),t.positionRangeForPathAsync=s(o),t.getLineNumberForPathAsync=s(i)},function(e,t,n){e.exports={default:n(731),__esModule:!0}},function(e,t,n){n(128),n(97),n(110),n(732),e.exports=n(59).Promise},function(e,t,n){\"use strict\";var r,i,o,a=n(100),s=n(77),u=n(82),c=n(182),l=n(81),p=n(87),f=n(83),h=n(733),d=n(734),m=n(735),v=n(736).set,y=n(738)(),g=\"Promise\",_=s.TypeError,b=s.process,x=s[g],b=s.process,w=\"process\"==c(b),k=function(){},S=!!function(){try{var e=x.resolve(1),t=(e.constructor={})[n(108)(\"species\")]=function(e){e(k,k)};return(w||\"function\"==typeof PromiseRejectionEvent)&&e.then(k)instanceof t}catch(e){}}(),E=function(e,t){return e===t||e===x&&t===o},C=function(e){var t;return!(!p(e)||\"function\"!=typeof(t=e.then))&&t},A=function(e){return E(x,e)?new T(e):new i(e)},T=i=function(e){var t,n;this.promise=new e(function(e,r){if(void 0!==t||void 0!==n)throw _(\"Bad Promise constructor\");t=e,n=r}),this.resolve=f(t),this.reject=f(n)},D=function(e){try{e()}catch(e){return{error:e}}},M=function(e,t){if(!e._n){e._n=!0;var n=e._c;y(function(){for(var r=e._v,i=1==e._s,o=0,a=function(t){var n,o,a=i?t.ok:t.fail,s=t.resolve,u=t.reject,c=t.domain;try{a?(i||(2==e._h&&I(e),e._h=1),a===!0?n=r:(c&&c.enter(),n=a(r),c&&c.exit()),n===t.promise?u(_(\"Promise-chain cycle\")):(o=C(n))?o.call(n,s,u):s(n)):u(r)}catch(e){u(e)}};n.length>o;)a(n[o++]);e._c=[],e._n=!1,t&&!e._h&&O(e)})}},O=function(e){v.call(s,function(){var t,n,r,i=e._v;if(P(e)&&(t=D(function(){w?b.emit(\"unhandledRejection\",i,e):(n=s.onunhandledrejection)?n({promise:e,reason:i}):(r=s.console)&&r.error&&r.error(\"Unhandled promise rejection\",i)}),e._h=w||P(e)?2:1),e._a=void 0,t)throw t.error})},P=function(e){if(1==e._h)return!1;for(var t,n=e._a||e._c,r=0;n.length>r;)if(t=n[r++],t.fail||!P(t.promise))return!1;return!0},I=function(e){v.call(s,function(){var t;w?b.emit(\"rejectionHandled\",e):(t=s.onrejectionhandled)&&t({promise:e,reason:e._v})})},N=function(e){var t=this;t._d||(t._d=!0,t=t._w||t,t._v=e,t._s=2,t._a||(t._a=t._c.slice()),M(t,!0))},R=function(e){var t,n=this;if(!n._d){n._d=!0,n=n._w||n;try{if(n===e)throw _(\"Promise can't be resolved itself\");(t=C(e))?y(function(){var r={_w:n,_d:!1};try{t.call(e,u(R,r,1),u(N,r,1))}catch(e){N.call(r,e)}}):(n._v=e,n._s=1,M(n,!1))}catch(e){N.call({_w:n,_d:!1},e)}}};S||(x=function(e){h(this,x,g,\"_h\"),f(e),r.call(this);try{e(u(R,this,1),u(N,this,1))}catch(e){N.call(this,e)}},r=function(e){this._c=[],this._a=void 0,this._s=0,this._d=!1,this._v=void 0,this._h=0,this._n=!1},r.prototype=n(739)(x.prototype,{then:function(e,t){var n=A(m(this,x));return n.ok=\"function\"!=typeof e||e,n.fail=\"function\"==typeof t&&t,n.domain=w?b.domain:void 0,this._c.push(n),this._a&&this._a.push(n),this._s&&M(this,!1),n.promise},catch:function(e){return this.then(void 0,e)}}),T=function(){var e=new r;this.promise=e,this.resolve=u(R,e,1),this.reject=u(N,e,1)}),l(l.G+l.W+l.F*!S,{Promise:x}),n(107)(x,g),n(740)(g),o=n(59)[g],l(l.S+l.F*!S,g,{reject:function(e){var t=A(this),n=t.reject;return n(e),t.promise}}),l(l.S+l.F*(a||!S),g,{resolve:function(e){if(e instanceof x&&E(e.constructor,this))return e;var t=A(this),n=t.resolve;return n(e),t.promise}}),l(l.S+l.F*!(S&&n(442)(function(e){x.all(e).catch(k)})),g,{all:function(e){var t=this,n=A(t),r=n.resolve,i=n.reject,o=D(function(){var n=[],o=0,a=1;d(e,!1,function(e){var s=o++,u=!1;n.push(void 0),a++,t.resolve(e).then(function(e){u||(u=!0,n[s]=e,--a||r(n))},i)}),--a||r(n)});return o&&i(o.error),n.promise},race:function(e){var t=this,n=A(t),r=n.reject,i=D(function(){d(e,!1,function(e){t.resolve(e).then(n.resolve,r)})});return i&&r(i.error),n.promise}})},function(e,t){e.exports=function(e,t,n,r){if(!(e instanceof t)||void 0!==r&&r in e)throw TypeError(n+\": incorrect invocation!\");return e}},function(e,t,n){var r=n(82),i=n(439),o=n(440),a=n(86),s=n(72),u=n(181),c={},l={},t=e.exports=function(e,t,n,p,f){var h,d,m,v,y=f?function(){return e}:u(e),g=r(n,p,t?2:1),_=0;if(\"function\"!=typeof y)throw TypeError(e+\" is not iterable!\");if(o(y)){for(h=s(e.length);h>_;_++)if(v=t?g(a(d=e[_])[0],d[1]):g(e[_]),v===c||v===l)return v}else for(m=y.call(e);!(d=m.next()).done;)if(v=i(m,g,d.value,t),v===c||v===l)return v};t.BREAK=c,t.RETURN=l},function(e,t,n){var r=n(86),i=n(83),o=n(108)(\"species\");e.exports=function(e,t){var n,a=r(e).constructor;return void 0===a||void 0==(n=r(a)[o])?t:i(n)}},function(e,t,n){var r,i,o,a=n(82),s=n(737),u=n(106),c=n(91),l=n(77),p=l.process,f=l.setImmediate,h=l.clearImmediate,d=l.MessageChannel,m=0,v={},y=\"onreadystatechange\",g=function(){var e=+this;if(v.hasOwnProperty(e)){var t=v[e];delete v[e],t()}},_=function(e){g.call(e.data)};f&&h||(f=function(e){for(var t=[],n=1;arguments.length>n;)t.push(arguments[n++]);return v[++m]=function(){s(\"function\"==typeof e?e:Function(e),t)},r(m),m},h=function(e){delete v[e]},\"process\"==n(70)(p)?r=function(e){p.nextTick(a(g,e,1))}:d?(i=new d,o=i.port2,i.port1.onmessage=_,r=a(o.postMessage,o,1)):l.addEventListener&&\"function\"==typeof postMessage&&!l.importScripts?(r=function(e){l.postMessage(e+\"\",\"*\")},l.addEventListener(\"message\",_,!1)):r=y in c(\"script\")?function(e){u.appendChild(c(\"script\"))[y]=function(){u.removeChild(this),g.call(e)}}:function(e){setTimeout(a(g,e,1),0)}),e.exports={set:f,clear:h}},50,function(e,t,n){var r=n(77),i=n(736).set,o=r.MutationObserver||r.WebKitMutationObserver,a=r.process,s=r.Promise,u=\"process\"==n(70)(a);e.exports=function(){var e,t,n,c=function(){var r,i;for(u&&(r=a.domain)&&r.exit();e;){i=e.fn,e=e.next;try{i()}catch(r){throw e?n():t=void 0,r}}t=void 0,r&&r.enter()};if(u)n=function(){a.nextTick(c)};else if(o){var l=!0,p=document.createTextNode(\"\");new o(c).observe(p,{characterData:!0}),n=function(){p.data=l=!l}}else if(s&&s.resolve){var f=s.resolve();n=function(){f.then(c)}}else n=function(){i.call(r,c)};return function(r){var i={fn:r,next:void 0};t&&(t.next=i),e||(e=i,n()),t=i}}},function(e,t,n){var r=n(84);e.exports=function(e,t,n){for(var i in t)n&&e[i]?e[i]=t[i]:r(e,i,t[i]);return e}},function(e,t,n){\"use strict\";var r=n(77),i=n(59),o=n(85),a=n(89),s=n(108)(\"species\");e.exports=function(e){var t=\"function\"==typeof i[e]?i[e]:r[e];a&&t&&!t[s]&&o.f(t,s,{configurable:!0,get:function(){return this}})}},function(e,t,n){(function(){var e,r,i,o,a,s,u,c,l,p,f,h,d;e=this.composer=n(742),r=this.constructor=n(746),i=this.dumper=n(751),o=this.errors=n(744),a=this.events=n(743),s=this.loader=n(756),u=this.nodes=n(745),c=this.parser=n(760),l=this.reader=n(757),p=this.resolver=n(755),f=this.scanner=n(758),h=this.tokens=n(759),d=n(747),this.scan=function(e,t){var n,r;for(null==t&&(t=s.Loader),n=new t(e),r=[];n.check_token();)r.push(n.get_token());return r},this.parse=function(e,t){var n,r;for(null==t&&(t=s.Loader),n=new t(e),r=[];n.check_event();)r.push(n.get_event());return r},this.compose=function(e,t){var n;return null==t&&(t=s.Loader),n=new t(e),n.get_single_node()},this.compose_all=function(e,t){var n,r;for(null==t&&(t=s.Loader),n=new t(e),r=[];n.check_node();)r.push(n.get_node());return r},this.load=function(e,t){var n;return null==t&&(t=s.Loader),n=new t(e),n.get_single_data()},this.load_all=function(e,t){var n,r;for(null==t&&(t=s.Loader),n=new t(e),r=[];n.check_data();)r.push(n.get_data());return r},this.emit=function(e,t,n,r){var o,a,s,u,c;null==n&&(n=i.Dumper),null==r&&(r={}),a=t||new d.StringStream,o=new n(a,r);try{for(u=0,c=e.length;u<c;u++)s=e[u],o.emit(s)}finally{o.dispose()}return t||a.string},this.serialize=function(e,n,r,o){return null==r&&(r=i.Dumper),null==o&&(o={}),t.serialize_all([e],n,r,o)},this.serialize_all=function(e,t,n,r){var o,a,s,u,c;null==n&&(n=i.Dumper),null==r&&(r={}),a=t||new d.StringStream,o=new n(a,r);try{for(o.open(),s=0,u=e.length;s<u;s++)c=e[s],o.serialize(c);o.close()}finally{o.dispose()}return t||a.string},this.dump=function(e,n,r,o){return null==r&&(r=i.Dumper),null==o&&(o={}),t.dump_all([e],n,r,o)},this.dump_all=function(e,t,n,r){var o,a,s,u,c;null==n&&(n=i.Dumper),null==r&&(r={}),a=t||new d.StringStream,o=new n(a,r);try{for(o.open(),u=0,c=e.length;u<c;u++)s=e[u],o.represent(s);o.close()}finally{o.dispose()}return t||a.string}}).call(this)},function(e,t,n){(function(){var e,r,i,o=function(e,t){function n(){this.constructor=e}for(var r in t)a.call(t,r)&&(e[r]=t[r]);return n.prototype=t.prototype,e.prototype=new n,e.__super__=t.prototype,e},a={}.hasOwnProperty;r=n(743),e=n(744).MarkedYAMLError,i=n(745),this.ComposerError=function(e){function t(){return t.__super__.constructor.apply(this,arguments)}return o(t,e),t}(e),this.Composer=function(){function e(){this.anchors={}}return e.prototype.check_node=function(){return this.check_event(r.StreamStartEvent)&&this.get_event(),!this.check_event(r.StreamEndEvent)},e.prototype.get_node=function(){if(!this.check_event(r.StreamEndEvent))return this.compose_document()},e.prototype.get_single_node=function(){var e,n;if(this.get_event(),e=null,this.check_event(r.StreamEndEvent)||(e=this.compose_document()),!this.check_event(r.StreamEndEvent))throw n=this.get_event(),new t.ComposerError(\"expected a single document in the stream\",e.start_mark,\"but found another document\",n.start_mark);return this.get_event(),e},e.prototype.compose_document=function(){var e;return this.get_event(),e=this.compose_node(),this.get_event(),this.anchors={},e},e.prototype.compose_node=function(e,n){var i,o,a;if(this.check_event(r.AliasEvent)){if(o=this.get_event(),i=o.anchor,!(i in this.anchors))throw new t.ComposerError(null,null,\"found undefined alias \"+i,o.start_mark);return this.anchors[i]}if(o=this.peek_event(),i=o.anchor,null!==i&&i in this.anchors)throw new t.ComposerError(\"found duplicate anchor \"+i+\"; first occurence\",this.anchors[i].start_mark,\"second occurrence\",o.start_mark);return this.descend_resolver(e,n),this.check_event(r.ScalarEvent)?a=this.compose_scalar_node(i):this.check_event(r.SequenceStartEvent)?a=this.compose_sequence_node(i):this.check_event(r.MappingStartEvent)&&(a=this.compose_mapping_node(i)),this.ascend_resolver(),a},e.prototype.compose_scalar_node=function(e){var t,n,r;return t=this.get_event(),r=t.tag,null!==r&&\"!\"!==r||(r=this.resolve(i.ScalarNode,t.value,t.implicit)),n=new i.ScalarNode(r,t.value,t.start_mark,t.end_mark,t.style),null!==e&&(this.anchors[e]=n),n},e.prototype.compose_sequence_node=function(e){var t,n,o,a,s;for(a=this.get_event(),s=a.tag,null!==s&&\"!\"!==s||(s=this.resolve(i.SequenceNode,null,a.implicit)),o=new i.SequenceNode(s,[],a.start_mark,null,a.flow_style),null!==e&&(this.anchors[e]=o),n=0;!this.check_event(r.SequenceEndEvent);)o.value.push(this.compose_node(o,n)),n++;return t=this.get_event(),o.end_mark=t.end_mark,o},e.prototype.compose_mapping_node=function(e){var t,n,o,a,s,u;for(s=this.get_event(),u=s.tag,null!==u&&\"!\"!==u||(u=this.resolve(i.MappingNode,null,s.implicit)),a=new i.MappingNode(u,[],s.start_mark,null,s.flow_style),null!==e&&(this.anchors[e]=a);!this.check_event(r.MappingEndEvent);)n=this.compose_node(a),o=this.compose_node(a,n),a.value.push([n,o]);return t=this.get_event(),a.end_mark=t.end_mark,a},e}()}).call(this)},function(e,t){(function(){var e=function(e,n){function r(){this.constructor=e}for(var i in n)t.call(n,i)&&(e[i]=n[i]);return r.prototype=n.prototype,e.prototype=new r,e.__super__=n.prototype,e},t={}.hasOwnProperty;this.Event=function(){function e(e,t){this.start_mark=e,this.end_mark=t}return e}(),this.NodeEvent=function(t){function n(e,t,n){this.anchor=e,this.start_mark=t,this.end_mark=n}return e(n,t),n}(this.Event),this.CollectionStartEvent=function(t){function n(e,t,n,r,i,o){this.anchor=e,this.tag=t,this.implicit=n,this.start_mark=r,this.end_mark=i,this.flow_style=o}return e(n,t),n}(this.NodeEvent),this.CollectionEndEvent=function(t){function n(){return n.__super__.constructor.apply(this,arguments)}return e(n,t),n}(this.Event),this.StreamStartEvent=function(t){function n(e,t,n){this.start_mark=e,this.end_mark=t,this.encoding=n}return e(n,t),n}(this.Event),this.StreamEndEvent=function(t){function n(){return n.__super__.constructor.apply(this,arguments)}return e(n,t),n}(this.Event),this.DocumentStartEvent=function(t){function n(e,t,n,r,i){this.start_mark=e,this.end_mark=t,this.explicit=n,this.version=r,this.tags=i}return e(n,t),n}(this.Event),this.DocumentEndEvent=function(t){function n(e,t,n){this.start_mark=e,this.end_mark=t,this.explicit=n}return e(n,t),n}(this.Event),this.AliasEvent=function(t){function n(){return n.__super__.constructor.apply(this,arguments)}return e(n,t),n}(this.NodeEvent),this.ScalarEvent=function(t){function n(e,t,n,r,i,o,a){this.anchor=e,this.tag=t,this.implicit=n,this.value=r,this.start_mark=i,this.end_mark=o,this.style=a}return e(n,t),n}(this.NodeEvent),this.SequenceStartEvent=function(t){function n(){return n.__super__.constructor.apply(this,arguments)}return e(n,t),n}(this.CollectionStartEvent),this.SequenceEndEvent=function(t){function n(){return n.__super__.constructor.apply(this,arguments)}return e(n,t),n}(this.CollectionEndEvent),this.MappingStartEvent=function(t){function n(){return n.__super__.constructor.apply(this,arguments)}return e(n,t),n}(this.CollectionStartEvent),this.MappingEndEvent=function(t){function n(){return n.__super__.constructor.apply(this,arguments)}return e(n,t),n}(this.CollectionEndEvent)}).call(this)},function(e,t){(function(){var e=[].indexOf||function(e){for(var t=0,n=this.length;t<n;t++)if(t in this&&this[t]===e)return t;return-1},t=function(e,t){function r(){this.constructor=e}for(var i in t)n.call(t,i)&&(e[i]=t[i]);return r.prototype=t.prototype,e.prototype=new r,e.__super__=t.prototype,e},n={}.hasOwnProperty;this.Mark=function(){function t(e,t,n,r){this.line=e,this.column=t,this.buffer=n,this.pointer=r}return t.prototype.get_snippet=function(t,n){var r,i,o,a,s,u,c;if(null==t&&(t=4),null==n&&(n=75),null==this.buffer)return null;for(r=\"\\0\\r\\n\\u2028\\u2029\",o=\"\",u=this.pointer;u>0&&(a=this.buffer[u-1],e.call(r,a)<0);)if(u--,this.pointer-u>n/2-1){o=\" ... \",u+=5;break}for(c=\"\",i=this.pointer;i<this.buffer.length&&(s=this.buffer[i],e.call(r,s)<0);)if(i++,i-this.pointer>n/2-1){c=\" ... \",i-=5;break}return\"\"+new Array(t).join(\" \")+o+this.buffer.slice(u,i)+c+\"\\n\"+new Array(t+this.pointer-u+o.length).join(\" \")+\"^\"},t.prototype.toString=function(){var e,t;return e=this.get_snippet(),t=\"  on line \"+(this.line+1)+\", column \"+(this.column+1),e?t:t+\":\\n\"+e},t}(),this.YAMLError=function(e){function n(e){this.message=e,n.__super__.constructor.call(this),this.stack=this.toString()+\"\\n\"+(new Error).stack.split(\"\\n\").slice(1).join(\"\\n\")}return t(n,e),n.prototype.toString=function(){return this.message},n}(Error),this.MarkedYAMLError=function(e){function n(e,t,r,i,o){this.context=e,this.context_mark=t,this.problem=r,this.problem_mark=i,this.note=o,n.__super__.constructor.call(this)}return t(n,e),n.prototype.toString=function(){var e;return e=[],null!=this.context&&e.push(this.context),null==this.context_mark||null!=this.problem&&null!=this.problem_mark&&this.context_mark.line===this.problem_mark.line&&this.context_mark.column===this.problem_mark.column||e.push(this.context_mark.toString()),null!=this.problem&&e.push(this.problem),null!=this.problem_mark&&e.push(this.problem_mark.toString()),null!=this.note&&e.push(this.note),e.join(\"\\n\")},n}(this.YAMLError)}).call(this)},function(e,t){(function(){var e,t=function(e,t){function r(){this.constructor=e}for(var i in t)n.call(t,i)&&(e[i]=t[i]);return r.prototype=t.prototype,e.prototype=new r,e.__super__=t.prototype,e},n={}.hasOwnProperty;e=0,this.Node=function(){function t(t,n,r,i){this.tag=t,this.value=n,this.start_mark=r,this.end_mark=i,this.unique_id=\"node_\"+e++}return t}(),this.ScalarNode=function(e){function n(e,t,r,i,o){this.tag=e,this.value=t,this.start_mark=r,this.end_mark=i,this.style=o,n.__super__.constructor.apply(this,arguments)}return t(n,e),n.prototype.id=\"scalar\",n}(this.Node),this.CollectionNode=function(e){function n(e,t,r,i,o){this.tag=e,this.value=t,this.start_mark=r,this.end_mark=i,this.flow_style=o,n.__super__.constructor.apply(this,arguments)}return t(n,e),n}(this.Node),this.SequenceNode=function(e){function n(){return n.__super__.constructor.apply(this,arguments)}return t(n,e),n.prototype.id=\"sequence\",n}(this.CollectionNode),this.MappingNode=function(e){function n(){return n.__super__.constructor.apply(this,arguments)}return t(n,e),n.prototype.id=\"mapping\",n}(this.CollectionNode)}).call(this)},function(e,t,n){(function(e){(function(){var r,i,o,a=function(e,t){function n(){this.constructor=e}for(var r in t)s.call(t,r)&&(e[r]=t[r]);return n.prototype=t.prototype,e.prototype=new n,e.__super__=t.prototype,e},s={}.hasOwnProperty,u=[].indexOf||function(e){for(var t=0,n=this.length;t<n;t++)if(t in this&&this[t]===e)return t;\nreturn-1};r=n(744).MarkedYAMLError,i=n(745),o=n(747),this.ConstructorError=function(e){function t(){return t.__super__.constructor.apply(this,arguments)}return a(t,e),t}(r),this.BaseConstructor=function(){function e(){this.constructed_objects={},this.constructing_nodes=[],this.deferred_constructors=[]}return e.prototype.yaml_constructors={},e.prototype.yaml_multi_constructors={},e.add_constructor=function(e,t){return this.prototype.hasOwnProperty(\"yaml_constructors\")||(this.prototype.yaml_constructors=o.extend({},this.prototype.yaml_constructors)),this.prototype.yaml_constructors[e]=t},e.add_multi_constructor=function(e,t){return this.prototype.hasOwnProperty(\"yaml_multi_constructors\")||(this.prototype.yaml_multi_constructors=o.extend({},this.prototype.yaml_multi_constructors)),this.prototype.yaml_multi_constructors[e]=t},e.prototype.check_data=function(){return this.check_node()},e.prototype.get_data=function(){if(this.check_node())return this.construct_document(this.get_node())},e.prototype.get_single_data=function(){var e;return e=this.get_single_node(),null!=e?this.construct_document(e):null},e.prototype.construct_document=function(e){var t;for(t=this.construct_object(e);!o.is_empty(this.deferred_constructors);)this.deferred_constructors.pop()();return t},e.prototype.defer=function(e){return this.deferred_constructors.push(e)},e.prototype.construct_object=function(e){var n,r,o,a,s;if(e.unique_id in this.constructed_objects)return this.constructed_objects[e.unique_id];if(o=e.unique_id,u.call(this.constructing_nodes,o)>=0)throw new t.ConstructorError(null,null,\"found unconstructable recursive node\",e.start_mark);if(this.constructing_nodes.push(e.unique_id),n=null,s=null,e.tag in this.yaml_constructors)n=this.yaml_constructors[e.tag];else{for(a in this.yaml_multi_constructors)if(e.tag.indexOf(0===a)){s=e.tag.slice(a.length),n=this.yaml_multi_constructors[a];break}null==n&&(null in this.yaml_multi_constructors?(s=e.tag,n=this.yaml_multi_constructors[null]):null in this.yaml_constructors?n=this.yaml_constructors[null]:e instanceof i.ScalarNode?n=this.construct_scalar:e instanceof i.SequenceNode?n=this.construct_sequence:e instanceof i.MappingNode&&(n=this.construct_mapping))}return r=n.call(this,null!=s?s:e,e),this.constructed_objects[e.unique_id]=r,this.constructing_nodes.pop(),r},e.prototype.construct_scalar=function(e){if(!(e instanceof i.ScalarNode))throw new t.ConstructorError(null,null,\"expected a scalar node but found \"+e.id,e.start_mark);return e.value},e.prototype.construct_sequence=function(e){var n,r,o,a,s;if(!(e instanceof i.SequenceNode))throw new t.ConstructorError(null,null,\"expected a sequence node but found \"+e.id,e.start_mark);for(a=e.value,s=[],r=0,o=a.length;r<o;r++)n=a[r],s.push(this.construct_object(n));return s},e.prototype.construct_mapping=function(e){var n,r,o,a,s,u,c,l,p;if(!(e instanceof i.MappingNode))throw new ConstructorError(null,null,\"expected a mapping node but found \"+e.id,e.start_mark);for(s={},u=e.value,n=0,a=u.length;n<a;n++){if(c=u[n],o=c[0],p=c[1],r=this.construct_object(o),\"object\"==typeof r)throw new t.ConstructorError(\"while constructing a mapping\",e.start_mark,\"found unhashable key\",o.start_mark);l=this.construct_object(p),s[r]=l}return s},e.prototype.construct_pairs=function(e){var n,r,o,a,s,u,c,l,p;if(!(e instanceof i.MappingNode))throw new t.ConstructorError(null,null,\"expected a mapping node but found \"+e.id,e.start_mark);for(s=[],u=e.value,n=0,a=u.length;n<a;n++)c=u[n],o=c[0],p=c[1],r=this.construct_object(o),l=this.construct_object(p),s.push([r,l]);return s},e}(),this.Constructor=function(n){function r(){return r.__super__.constructor.apply(this,arguments)}var o,s,c;return a(r,n),o={on:!0,off:!1,true:!0,false:!1,yes:!0,no:!1},c=/^([0-9][0-9][0-9][0-9])-([0-9][0-9]?)-([0-9][0-9]?)(?:(?:[Tt]|[\\x20\\t]+)([0-9][0-9]?):([0-9][0-9]):([0-9][0-9])(?:\\.([0-9]*))?(?:[\\x20\\t]*(Z|([-+])([0-9][0-9]?)(?::([0-9][0-9]))?))?)?$/,s={year:1,month:2,day:3,hour:4,minute:5,second:6,fraction:7,tz:8,tz_sign:9,tz_hour:10,tz_minute:11},r.prototype.construct_scalar=function(e){var t,n,o,a,s,u;if(e instanceof i.MappingNode)for(a=e.value,t=0,o=a.length;t<o;t++)if(s=a[t],n=s[0],u=s[1],\"tag:yaml.org,2002:value\"===n.tag)return this.construct_scalar(u);return r.__super__.construct_scalar.call(this,e)},r.prototype.flatten_mapping=function(e){var n,r,o,a,s,u,c,l,p,f,h,d,m;for(c=[],r=0;r<e.value.length;)if(l=e.value[r],a=l[0],m=l[1],\"tag:yaml.org,2002:merge\"===a.tag)if(e.value.splice(r,1),m instanceof i.MappingNode)this.flatten_mapping(m),c=c.concat(m.value);else{if(!(m instanceof i.SequenceNode))throw new t.ConstructorError(\"while constructing a mapping\",e.start_mark,\"expected a mapping or list of mappings for merging but found \"+m.id,m.start_mark);for(f=[],p=m.value,n=0,s=p.length;n<s;n++){if(h=p[n],!(h instanceof i.MappingNode))throw new t.ConstructorError(\"while constructing a mapping\",e.start_mark,\"expected a mapping for merging, but found \"+h.id,h.start_mark);this.flatten_mapping(h),f.push(h.value)}for(f.reverse(),o=0,u=f.length;o<u;o++)d=f[o],c=c.concat(d)}else\"tag:yaml.org,2002:value\"===a.tag?(a.tag=\"tag:yaml.org,2002:str\",r++):r++;if(c.length)return e.value=c.concat(e.value)},r.prototype.construct_mapping=function(e){return e instanceof i.MappingNode&&this.flatten_mapping(e),r.__super__.construct_mapping.call(this,e)},r.prototype.construct_yaml_null=function(e){return this.construct_scalar(e),null},r.prototype.construct_yaml_bool=function(e){var t;return t=this.construct_scalar(e),o[t.toLowerCase()]},r.prototype.construct_yaml_int=function(e){var t,n,r,i,o,a,s,c,l;if(l=this.construct_scalar(e),l=l.replace(/_/g,\"\"),c=\"-\"===l[0]?-1:1,s=l[0],u.call(\"+-\",s)>=0&&(l=l.slice(1)),\"0\"===l)return 0;if(0===l.indexOf(\"0b\"))return c*parseInt(l.slice(2),2);if(0===l.indexOf(\"0x\"))return c*parseInt(l.slice(2),16);if(0===l.indexOf(\"0o\"))return c*parseInt(l.slice(2),8);if(\"0\"===l[0])return c*parseInt(l,8);if(u.call(l,\":\")>=0){for(r=function(){var e,t,n,r;for(n=l.split(/:/g),r=[],e=0,t=n.length;e<t;e++)a=n[e],r.push(parseInt(a));return r}(),r.reverse(),t=1,l=0,i=0,o=r.length;i<o;i++)n=r[i],l+=n*t,t*=60;return c*l}return c*parseInt(l)},r.prototype.construct_yaml_float=function(e){var t,n,r,i,o,a,s,c,l;if(l=this.construct_scalar(e),l=l.replace(/_/g,\"\").toLowerCase(),c=\"-\"===l[0]?-1:1,s=l[0],u.call(\"+-\",s)>=0&&(l=l.slice(1)),\".inf\"===l)return Infinity*c;if(\".nan\"===l)return NaN;if(u.call(l,\":\")>=0){for(r=function(){var e,t,n,r;for(n=l.split(/:/g),r=[],e=0,t=n.length;e<t;e++)a=n[e],r.push(parseFloat(a));return r}(),r.reverse(),t=1,l=0,i=0,o=r.length;i<o;i++)n=r[i],l+=n*t,t*=60;return c*l}return c*parseFloat(l)},r.prototype.construct_yaml_binary=function(n){var r,i;i=this.construct_scalar(n);try{return\"undefined\"!=typeof window&&null!==window?atob(i):new e(i,\"base64\").toString(\"ascii\")}catch(e){throw r=e,new t.ConstructorError(null,null,\"failed to decode base64 data: \"+r,n.start_mark)}},r.prototype.construct_yaml_timestamp=function(e){var t,n,r,i,o,a,u,l,p,f,h,d,m,v,y,g,_;y=this.construct_scalar(e),u=e.value.match(c),g={};for(a in s)o=s[a],g[a]=u[o];if(_=parseInt(g.year),f=parseInt(g.month)-1,n=parseInt(g.day),!g.hour)return new Date(Date.UTC(_,f,n));if(i=parseInt(g.hour),p=parseInt(g.minute),h=parseInt(g.second),l=0,g.fraction){for(r=g.fraction.slice(0,6);r.length<6;)r+=\"0\";r=parseInt(r),l=Math.round(r/1e3)}return g.tz_sign&&(v=\"-\"===g.tz_sign?1:-1,(d=parseInt(g.tz_hour))&&(i+=v*d),(m=parseInt(g.tz_minute))&&(p+=v*m)),t=new Date(Date.UTC(_,f,n,i,p,h,l))},r.prototype.construct_yaml_pair_list=function(e,n){var r;if(r=[],!(n instanceof i.SequenceNode))throw new t.ConstructorError(\"while constructing \"+e,n.start_mark,\"expected a sequence but found \"+n.id,n.start_mark);return this.defer(function(o){return function(){var a,s,u,c,l,p,f,h,d,m;for(l=n.value,f=[],a=0,c=l.length;a<c;a++){if(h=l[a],!(h instanceof i.MappingNode))throw new t.ConstructorError(\"while constructing \"+e,n.start_mark,\"expected a mapping of length 1 but found \"+h.id,h.start_mark);if(1!==h.value.length)throw new t.ConstructorError(\"while constructing \"+e,n.start_mark,\"expected a mapping of length 1 but found \"+h.id,h.start_mark);p=h.value[0],u=p[0],m=p[1],s=o.construct_object(u),d=o.construct_object(m),f.push(r.push([s,d]))}return f}}(this)),r},r.prototype.construct_yaml_omap=function(e){return this.construct_yaml_pair_list(\"an ordered map\",e)},r.prototype.construct_yaml_pairs=function(e){return this.construct_yaml_pair_list(\"pairs\",e)},r.prototype.construct_yaml_set=function(e){var t;return t=[],this.defer(function(n){return function(){var r,i;i=[];for(r in n.construct_mapping(e))i.push(t.push(r));return i}}(this)),t},r.prototype.construct_yaml_str=function(e){return this.construct_scalar(e)},r.prototype.construct_yaml_seq=function(e){var t;return t=[],this.defer(function(n){return function(){var r,i,o,a,s;for(a=n.construct_sequence(e),s=[],r=0,o=a.length;r<o;r++)i=a[r],s.push(t.push(i));return s}}(this)),t},r.prototype.construct_yaml_map=function(e){var t;return t={},this.defer(function(n){return function(){var r,i,o,a;i=n.construct_mapping(e),o=[];for(r in i)a=i[r],o.push(t[r]=a);return o}}(this)),t},r.prototype.construct_yaml_object=function(e,t){var n;return n=new t,this.defer(function(t){return function(){var r,i,o,a;i=t.construct_mapping(e,!0),o=[];for(r in i)a=i[r],o.push(n[r]=a);return o}}(this)),n},r.prototype.construct_undefined=function(e){throw new t.ConstructorError(null,null,\"could not determine a constructor for the tag \"+e.tag,e.start_mark)},r}(this.BaseConstructor),this.Constructor.add_constructor(\"tag:yaml.org,2002:null\",this.Constructor.prototype.construct_yaml_null),this.Constructor.add_constructor(\"tag:yaml.org,2002:bool\",this.Constructor.prototype.construct_yaml_bool),this.Constructor.add_constructor(\"tag:yaml.org,2002:int\",this.Constructor.prototype.construct_yaml_int),this.Constructor.add_constructor(\"tag:yaml.org,2002:float\",this.Constructor.prototype.construct_yaml_float),this.Constructor.add_constructor(\"tag:yaml.org,2002:binary\",this.Constructor.prototype.construct_yaml_binary),this.Constructor.add_constructor(\"tag:yaml.org,2002:timestamp\",this.Constructor.prototype.construct_yaml_timestamp),this.Constructor.add_constructor(\"tag:yaml.org,2002:omap\",this.Constructor.prototype.construct_yaml_omap),this.Constructor.add_constructor(\"tag:yaml.org,2002:pairs\",this.Constructor.prototype.construct_yaml_pairs),this.Constructor.add_constructor(\"tag:yaml.org,2002:set\",this.Constructor.prototype.construct_yaml_set),this.Constructor.add_constructor(\"tag:yaml.org,2002:str\",this.Constructor.prototype.construct_yaml_str),this.Constructor.add_constructor(\"tag:yaml.org,2002:seq\",this.Constructor.prototype.construct_yaml_seq),this.Constructor.add_constructor(\"tag:yaml.org,2002:map\",this.Constructor.prototype.construct_yaml_map),this.Constructor.add_constructor(null,this.Constructor.prototype.construct_undefined)}).call(this)}).call(t,n(132).Buffer)},function(e,t,n){(function(e){(function(){var t,r,i,o=[].slice,a={}.hasOwnProperty;this.StringStream=function(){function e(){this.string=\"\"}return e.prototype.write=function(e){return this.string+=e},e}(),this.clone=function(e){return function(t){return e.extend({},t)}}(this),this.extend=function(){var e,t,n,r,i,a,s;for(e=arguments[0],a=2<=arguments.length?o.call(arguments,1):[],t=0,r=a.length;t<r;t++){i=a[t];for(n in i)s=i[n],e[n]=s}return e},this.is_empty=function(e){var t;if(Array.isArray(e)||\"string\"==typeof e)return 0===e.length;for(t in e)if(a.call(e,t))return!1;return!0},this.inspect=null!=(t=null!=(r=null!=(i=n(748))?i.inspect:void 0)?r:e.inspect)?t:function(e){return\"\"+e},this.pad_left=function(e,t,n){return e=String(e),e.length>=n?e:e.length+1===n?\"\"+t+e:\"\"+new Array(n-e.length+1).join(t)+e},this.to_hex=function(e){return\"string\"==typeof e&&(e=e.charCodeAt(0)),e.toString(16)}}).call(this)}).call(t,function(){return this}())},function(e,t,n){(function(e,r){function i(e,n){var r={seen:[],stylize:a};return arguments.length>=3&&(r.depth=arguments[2]),arguments.length>=4&&(r.colors=arguments[3]),m(n)?r.showHidden=n:n&&t._extend(r,n),x(r.showHidden)&&(r.showHidden=!1),x(r.depth)&&(r.depth=2),x(r.colors)&&(r.colors=!1),x(r.customInspect)&&(r.customInspect=!0),r.colors&&(r.stylize=o),u(r,e,r.depth)}function o(e,t){var n=i.styles[t];return n?\"\u001b[\"+i.colors[n][0]+\"m\"+e+\"\u001b[\"+i.colors[n][1]+\"m\":e}function a(e,t){return e}function s(e){var t={};return e.forEach(function(e,n){t[e]=!0}),t}function u(e,n,r){if(e.customInspect&&n&&C(n.inspect)&&n.inspect!==t.inspect&&(!n.constructor||n.constructor.prototype!==n)){var i=n.inspect(r,e);return _(i)||(i=u(e,i,r)),i}var o=c(e,n);if(o)return o;var a=Object.keys(n),m=s(a);if(e.showHidden&&(a=Object.getOwnPropertyNames(n)),E(n)&&(a.indexOf(\"message\")>=0||a.indexOf(\"description\")>=0))return l(n);if(0===a.length){if(C(n)){var v=n.name?\": \"+n.name:\"\";return e.stylize(\"[Function\"+v+\"]\",\"special\")}if(w(n))return e.stylize(RegExp.prototype.toString.call(n),\"regexp\");if(S(n))return e.stylize(Date.prototype.toString.call(n),\"date\");if(E(n))return l(n)}var y=\"\",g=!1,b=[\"{\",\"}\"];if(d(n)&&(g=!0,b=[\"[\",\"]\"]),C(n)){var x=n.name?\": \"+n.name:\"\";y=\" [Function\"+x+\"]\"}if(w(n)&&(y=\" \"+RegExp.prototype.toString.call(n)),S(n)&&(y=\" \"+Date.prototype.toUTCString.call(n)),E(n)&&(y=\" \"+l(n)),0===a.length&&(!g||0==n.length))return b[0]+y+b[1];if(r<0)return w(n)?e.stylize(RegExp.prototype.toString.call(n),\"regexp\"):e.stylize(\"[Object]\",\"special\");e.seen.push(n);var k;return k=g?p(e,n,r,m,a):a.map(function(t){return f(e,n,r,m,t,g)}),e.seen.pop(),h(k,y,b)}function c(e,t){if(x(t))return e.stylize(\"undefined\",\"undefined\");if(_(t)){var n=\"'\"+JSON.stringify(t).replace(/^\"|\"$/g,\"\").replace(/'/g,\"\\\\'\").replace(/\\\\\"/g,'\"')+\"'\";return e.stylize(n,\"string\")}return g(t)?e.stylize(\"\"+t,\"number\"):m(t)?e.stylize(\"\"+t,\"boolean\"):v(t)?e.stylize(\"null\",\"null\"):void 0}function l(e){return\"[\"+Error.prototype.toString.call(e)+\"]\"}function p(e,t,n,r,i){for(var o=[],a=0,s=t.length;a<s;++a)O(t,String(a))?o.push(f(e,t,n,r,String(a),!0)):o.push(\"\");return i.forEach(function(i){i.match(/^\\d+$/)||o.push(f(e,t,n,r,i,!0))}),o}function f(e,t,n,r,i,o){var a,s,c;if(c=Object.getOwnPropertyDescriptor(t,i)||{value:t[i]},c.get?s=c.set?e.stylize(\"[Getter/Setter]\",\"special\"):e.stylize(\"[Getter]\",\"special\"):c.set&&(s=e.stylize(\"[Setter]\",\"special\")),O(r,i)||(a=\"[\"+i+\"]\"),s||(e.seen.indexOf(c.value)<0?(s=v(n)?u(e,c.value,null):u(e,c.value,n-1),s.indexOf(\"\\n\")>-1&&(s=o?s.split(\"\\n\").map(function(e){return\"  \"+e}).join(\"\\n\").substr(2):\"\\n\"+s.split(\"\\n\").map(function(e){return\"   \"+e}).join(\"\\n\"))):s=e.stylize(\"[Circular]\",\"special\")),x(a)){if(o&&i.match(/^\\d+$/))return s;a=JSON.stringify(\"\"+i),a.match(/^\"([a-zA-Z_][a-zA-Z_0-9]*)\"$/)?(a=a.substr(1,a.length-2),a=e.stylize(a,\"name\")):(a=a.replace(/'/g,\"\\\\'\").replace(/\\\\\"/g,'\"').replace(/(^\"|\"$)/g,\"'\"),a=e.stylize(a,\"string\"))}return a+\": \"+s}function h(e,t,n){var r=0,i=e.reduce(function(e,t){return r++,t.indexOf(\"\\n\")>=0&&r++,e+t.replace(/\\u001b\\[\\d\\d?m/g,\"\").length+1},0);return i>60?n[0]+(\"\"===t?\"\":t+\"\\n \")+\" \"+e.join(\",\\n  \")+\" \"+n[1]:n[0]+t+\" \"+e.join(\", \")+\" \"+n[1]}function d(e){return Array.isArray(e)}function m(e){return\"boolean\"==typeof e}function v(e){return null===e}function y(e){return null==e}function g(e){return\"number\"==typeof e}function _(e){return\"string\"==typeof e}function b(e){return\"symbol\"==typeof e}function x(e){return void 0===e}function w(e){return k(e)&&\"[object RegExp]\"===T(e)}function k(e){return\"object\"==typeof e&&null!==e}function S(e){return k(e)&&\"[object Date]\"===T(e)}function E(e){return k(e)&&(\"[object Error]\"===T(e)||e instanceof Error)}function C(e){return\"function\"==typeof e}function A(e){return null===e||\"boolean\"==typeof e||\"number\"==typeof e||\"string\"==typeof e||\"symbol\"==typeof e||\"undefined\"==typeof e}function T(e){return Object.prototype.toString.call(e)}function D(e){return e<10?\"0\"+e.toString(10):e.toString(10)}function M(){var e=new Date,t=[D(e.getHours()),D(e.getMinutes()),D(e.getSeconds())].join(\":\");return[e.getDate(),R[e.getMonth()],t].join(\" \")}function O(e,t){return Object.prototype.hasOwnProperty.call(e,t)}var P=/%[sdj%]/g;t.format=function(e){if(!_(e)){for(var t=[],n=0;n<arguments.length;n++)t.push(i(arguments[n]));return t.join(\" \")}for(var n=1,r=arguments,o=r.length,a=String(e).replace(P,function(e){if(\"%%\"===e)return\"%\";if(n>=o)return e;switch(e){case\"%s\":return String(r[n++]);case\"%d\":return Number(r[n++]);case\"%j\":try{return JSON.stringify(r[n++])}catch(e){return\"[Circular]\"}default:return e}}),s=r[n];n<o;s=r[++n])a+=v(s)||!k(s)?\" \"+s:\" \"+i(s);return a},t.deprecate=function(n,i){function o(){if(!a){if(r.throwDeprecation)throw new Error(i);r.traceDeprecation?console.trace(i):console.error(i),a=!0}return n.apply(this,arguments)}if(x(e.process))return function(){return t.deprecate(n,i).apply(this,arguments)};if(r.noDeprecation===!0)return n;var a=!1;return o};var I,N={};t.debuglog=function(e){if(x(I)&&(I={NODE_ENV:\"production\",WEBPACK_INLINE_STYLES:!0}.NODE_DEBUG||\"\"),e=e.toUpperCase(),!N[e])if(new RegExp(\"\\\\b\"+e+\"\\\\b\",\"i\").test(I)){var n=r.pid;N[e]=function(){var r=t.format.apply(t,arguments);console.error(\"%s %d: %s\",e,n,r)}}else N[e]=function(){};return N[e]},t.inspect=i,i.colors={bold:[1,22],italic:[3,23],underline:[4,24],inverse:[7,27],white:[37,39],grey:[90,39],black:[30,39],blue:[34,39],cyan:[36,39],green:[32,39],magenta:[35,39],red:[31,39],yellow:[33,39]},i.styles={special:\"cyan\",number:\"yellow\",boolean:\"yellow\",undefined:\"grey\",null:\"bold\",string:\"green\",date:\"magenta\",regexp:\"red\"},t.isArray=d,t.isBoolean=m,t.isNull=v,t.isNullOrUndefined=y,t.isNumber=g,t.isString=_,t.isSymbol=b,t.isUndefined=x,t.isRegExp=w,t.isObject=k,t.isDate=S,t.isError=E,t.isFunction=C,t.isPrimitive=A,t.isBuffer=n(749);var R=[\"Jan\",\"Feb\",\"Mar\",\"Apr\",\"May\",\"Jun\",\"Jul\",\"Aug\",\"Sep\",\"Oct\",\"Nov\",\"Dec\"];t.log=function(){console.log(\"%s - %s\",M(),t.format.apply(t,arguments))},t.inherits=n(750),t._extend=function(e,t){if(!t||!k(t))return e;for(var n=Object.keys(t),r=n.length;r--;)e[n[r]]=t[n[r]];return e}}).call(t,function(){return this}(),n(324))},function(e,t){e.exports=function(e){return e&&\"object\"==typeof e&&\"function\"==typeof e.copy&&\"function\"==typeof e.fill&&\"function\"==typeof e.readUInt8}},328,function(e,t,n){(function(){var e,t,r,i,o,a=[].slice;o=n(747),e=n(752),i=n(753),t=n(754),r=n(755),this.make_dumper=function(n,s,u,c){var l,p;return null==n&&(n=e.Emitter),null==s&&(s=i.Serializer),null==u&&(u=t.Representer),null==c&&(c=r.Resolver),p=[n,s,u,c],l=function(){function e(e,n){var r,i,o;for(null==n&&(n={}),p[0].call(this,e,n),o=p.slice(1),r=0,i=o.length;r<i;r++)t=o[r],t.call(this,n)}var t;return o.extend.apply(o,[e.prototype].concat(a.call(function(){var e,n,r;for(r=[],e=0,n=p.length;e<n;e++)t=p[e],r.push(t.prototype);return r}()))),e}()},this.Dumper=this.make_dumper()}).call(this)},function(e,t,n){(function(){var e,r,i,o,a=function(e,t){function n(){this.constructor=e}for(var r in t)s.call(t,r)&&(e[r]=t[r]);return n.prototype=t.prototype,e.prototype=new n,e.__super__=t.prototype,e},s={}.hasOwnProperty,u=[].indexOf||function(e){for(var t=0,n=this.length;t<n;t++)if(t in this&&this[t]===e)return t;return-1};i=n(743),o=n(747),r=n(744).YAMLError,this.EmitterError=function(e){function t(){return t.__super__.constructor.apply(this,arguments)}return a(t,e),t}(r),this.Emitter=function(){function n(e,t){var n;this.stream=e,this.encoding=null,this.states=[],this.state=this.expect_stream_start,this.events=[],this.event=null,this.indents=[],this.indent=null,this.flow_level=0,this.root_context=!1,this.sequence_context=!1,this.mapping_context=!1,this.simple_key_context=!1,this.line=0,this.column=0,this.whitespace=!0,this.indentation=!0,this.open_ended=!1,this.canonical=t.canonical,this.allow_unicode=t.allow_unicode,null==this.canonical&&(this.canonical=!1),null==this.allow_unicode&&(this.allow_unicode=!0),this.best_indent=1<t.indent&&t.indent<10?t.indent:2,this.best_width=t.width>2*this.indent?t.width:80,this.best_line_break=\"\\r\"===(n=t.line_break)||\"\\n\"===n||\"\\r\\n\"===n?t.line_break:\"\\n\",this.tag_prefixes=null,this.prepared_anchor=null,this.prepared_tag=null,this.analysis=null,this.style=null}var r,a,c;return r=\"\\0 \\t\\r\\n\\u2028\\u2029\",a={\"!\":\"!\",\"tag:yaml.org,2002:\":\"!!\"},c={\"\\0\":\"0\",\"\u0007\":\"a\",\"\\b\":\"b\",\"\\t\":\"t\",\"\\n\":\"n\",\"\\v\":\"v\",\"\\f\":\"f\",\"\\r\":\"r\",\"\u001b\":\"e\",'\"':'\"',\"\\\\\":\"\\\\\",\"\":\"N\",\" \":\"_\",\"\\u2028\":\"L\",\"\\u2029\":\"P\"},n.prototype.dispose=function(){return this.states=[],this.state=null},n.prototype.emit=function(e){var t;for(this.events.push(e),t=[];!this.need_more_events();)this.event=this.events.shift(),this.state(),t.push(this.event=null);return t},n.prototype.need_more_events=function(){var e;return 0===this.events.length||(e=this.events[0],e instanceof i.DocumentStartEvent?this.need_events(1):e instanceof i.SequenceStartEvent?this.need_events(2):e instanceof i.MappingStartEvent&&this.need_events(3))},n.prototype.need_events=function(e){var t,n,r,o,a;for(o=0,a=this.events.slice(1),n=0,r=a.length;n<r;n++)if(t=a[n],t instanceof i.DocumentStartEvent||t instanceof i.CollectionStartEvent?o++:t instanceof i.DocumentEndEvent||t instanceof i.CollectionEndEvent?o--:t instanceof i.StreamEndEvent&&(o=-1),o<0)return!1;return this.events.length<e+1},n.prototype.increase_indent=function(e){return null==e&&(e={}),this.indents.push(this.indent),null==this.indent?this.indent=e.flow?this.best_indent:0:e.indentless?void 0:this.indent+=this.best_indent},n.prototype.expect_stream_start=function(){return this.event instanceof i.StreamStartEvent?(!this.event.encoding||\"encoding\"in this.stream||(this.encoding=this.event.encoding),this.write_stream_start(),this.state=this.expect_first_document_start):this.error(\"expected StreamStartEvent, but got\",this.event)},n.prototype.expect_nothing=function(){return this.error(\"expected nothing, but got\",this.event)},n.prototype.expect_first_document_start=function(){return this.expect_document_start(!0)},n.prototype.expect_document_start=function(e){var t,n,r,u,c,l,p;if(null==e&&(e=!1),this.event instanceof i.DocumentStartEvent){if((this.event.version||this.event.tags)&&this.open_ended&&(this.write_indicator(\"...\",!0),this.write_indent()),this.event.version&&this.write_version_directive(this.prepare_version(this.event.version)),this.tag_prefixes=o.clone(a),this.event.tags)for(p=function(){var e,t;e=this.event.tags,t=[];for(u in e)s.call(e,u)&&t.push(u);return t}.call(this).sort(),r=0,c=p.length;r<c;r++)n=p[r],l=this.event.tags[n],this.tag_prefixes[l]=n,this.write_tag_directive(this.prepare_tag_handle(n),this.prepare_tag_prefix(l));return t=!e||this.event.explicit||this.canonical||this.event.version||this.event.tags||this.check_empty_document(),t&&(this.write_indent(),this.write_indicator(\"---\",!0),this.canonical&&this.write_indent()),this.state=this.expect_document_root}return this.event instanceof i.StreamEndEvent?(this.open_ended&&(this.write_indicator(\"...\",!0),this.write_indent()),this.write_stream_end(),this.state=this.expect_nothing):this.error(\"expected DocumentStartEvent, but got\",this.event)},n.prototype.expect_document_end=function(){return this.event instanceof i.DocumentEndEvent?(this.write_indent(),this.event.explicit&&(this.write_indicator(\"...\",!0),this.write_indent()),this.flush_stream(),this.state=this.expect_document_start):this.error(\"expected DocumentEndEvent, but got\",this.event)},n.prototype.expect_document_root=function(){return this.states.push(this.expect_document_end),this.expect_node({root:!0})},n.prototype.expect_node=function(e){return null==e&&(e={}),this.root_context=!!e.root,this.sequence_context=!!e.sequence,this.mapping_context=!!e.mapping,this.simple_key_context=!!e.simple_key,this.event instanceof i.AliasEvent?this.expect_alias():this.event instanceof i.ScalarEvent||this.event instanceof i.CollectionStartEvent?(this.process_anchor(\"&\"),this.process_tag(),this.event instanceof i.ScalarEvent?this.expect_scalar():this.event instanceof i.SequenceStartEvent?this.flow_level||this.canonical||this.event.flow_style||this.check_empty_sequence()?this.expect_flow_sequence():this.expect_block_sequence():this.event instanceof i.MappingStartEvent?this.flow_level||this.canonical||this.event.flow_style||this.check_empty_mapping()?this.expect_flow_mapping():this.expect_block_mapping():void 0):this.error(\"expected NodeEvent, but got\",this.event)},n.prototype.expect_alias=function(){return this.event.anchor||this.error(\"anchor is not specified for alias\"),this.process_anchor(\"*\"),this.state=this.states.pop()},n.prototype.expect_scalar=function(){return this.increase_indent({flow:!0}),this.process_scalar(),this.indent=this.indents.pop(),this.state=this.states.pop()},n.prototype.expect_flow_sequence=function(){return this.write_indicator(\"[\",!0,{whitespace:!0}),this.flow_level++,this.increase_indent({flow:!0}),this.state=this.expect_first_flow_sequence_item},n.prototype.expect_first_flow_sequence_item=function(){return this.event instanceof i.SequenceEndEvent?(this.indent=this.indents.pop(),this.flow_level--,this.write_indicator(\"]\",!1),this.state=this.states.pop()):((this.canonical||this.column>this.best_width)&&this.write_indent(),this.states.push(this.expect_flow_sequence_item),this.expect_node({sequence:!0}))},n.prototype.expect_flow_sequence_item=function(){return this.event instanceof i.SequenceEndEvent?(this.indent=this.indents.pop(),this.flow_level--,this.canonical&&(this.write_indicator(\",\",!1),this.write_indent()),this.write_indicator(\"]\",!1),this.state=this.states.pop()):(this.write_indicator(\",\",!1),(this.canonical||this.column>this.best_width)&&this.write_indent(),this.states.push(this.expect_flow_sequence_item),this.expect_node({sequence:!0}))},n.prototype.expect_flow_mapping=function(){return this.write_indicator(\"{\",!0,{whitespace:!0}),this.flow_level++,this.increase_indent({flow:!0}),this.state=this.expect_first_flow_mapping_key},n.prototype.expect_first_flow_mapping_key=function(){return this.event instanceof i.MappingEndEvent?(this.indent=this.indents.pop(),this.flow_level--,this.write_indicator(\"}\",!1),this.state=this.states.pop()):((this.canonical||this.column>this.best_width)&&this.write_indent(),!this.canonical&&this.check_simple_key()?(this.states.push(this.expect_flow_mapping_simple_value),this.expect_node({mapping:!0,simple_key:!0})):(this.write_indicator(\"?\",!0),this.states.push(this.expect_flow_mapping_value),this.expect_node({mapping:!0})))},n.prototype.expect_flow_mapping_key=function(){return this.event instanceof i.MappingEndEvent?(this.indent=this.indents.pop(),this.flow_level--,this.canonical&&(this.write_indicator(\",\",!1),this.write_indent()),this.write_indicator(\"}\",!1),this.state=this.states.pop()):(this.write_indicator(\",\",!1),(this.canonical||this.column>this.best_width)&&this.write_indent(),!this.canonical&&this.check_simple_key()?(this.states.push(this.expect_flow_mapping_simple_value),this.expect_node({mapping:!0,simple_key:!0})):(this.write_indicator(\"?\",!0),this.states.push(this.expect_flow_mapping_value),this.expect_node({mapping:!0})))},n.prototype.expect_flow_mapping_simple_value=function(){return this.write_indicator(\":\",!1),this.states.push(this.expect_flow_mapping_key),this.expect_node({mapping:!0})},n.prototype.expect_flow_mapping_value=function(){return(this.canonical||this.column>this.best_width)&&this.write_indent(),this.write_indicator(\":\",!0),this.states.push(this.expect_flow_mapping_key),this.expect_node({mapping:!0})},n.prototype.expect_block_sequence=function(){var e;return e=this.mapping_context&&!this.indentation,this.increase_indent({indentless:e}),this.state=this.expect_first_block_sequence_item},n.prototype.expect_first_block_sequence_item=function(){return this.expect_block_sequence_item(!0)},n.prototype.expect_block_sequence_item=function(e){return null==e&&(e=!1),!e&&this.event instanceof i.SequenceEndEvent?(this.indent=this.indents.pop(),this.state=this.states.pop()):(this.write_indent(),this.write_indicator(\"-\",!0,{indentation:!0}),this.states.push(this.expect_block_sequence_item),this.expect_node({sequence:!0}))},n.prototype.expect_block_mapping=function(){return this.increase_indent(),this.state=this.expect_first_block_mapping_key},n.prototype.expect_first_block_mapping_key=function(){return this.expect_block_mapping_key(!0)},n.prototype.expect_block_mapping_key=function(e){return null==e&&(e=!1),!e&&this.event instanceof i.MappingEndEvent?(this.indent=this.indents.pop(),this.state=this.states.pop()):(this.write_indent(),this.check_simple_key()?(this.states.push(this.expect_block_mapping_simple_value),this.expect_node({mapping:!0,simple_key:!0})):(this.write_indicator(\"?\",!0,{indentation:!0}),this.states.push(this.expect_block_mapping_value),this.expect_node({mapping:!0})))},n.prototype.expect_block_mapping_simple_value=function(){return this.write_indicator(\":\",!1),this.states.push(this.expect_block_mapping_key),this.expect_node({mapping:!0})},n.prototype.expect_block_mapping_value=function(){return this.write_indent(),this.write_indicator(\":\",!0,{indentation:!0}),this.states.push(this.expect_block_mapping_key),this.expect_node({mapping:!0})},n.prototype.check_empty_document=function(){var e;return this.event instanceof i.DocumentStartEvent&&0!==this.events.length&&(e=this.events[0],e instanceof i.ScalarEvent&&null==e.anchor&&null==e.tag&&e.implicit&&\"\"===e.value)},n.prototype.check_empty_sequence=function(){return this.event instanceof i.SequenceStartEvent&&this.events[0]instanceof i.SequenceEndEvent},n.prototype.check_empty_mapping=function(){return this.event instanceof i.MappingStartEvent&&this.events[0]instanceof i.MappingEndEvent},n.prototype.check_simple_key=function(){var e;return e=0,this.event instanceof i.NodeEvent&&null!=this.event.anchor&&(null==this.prepared_anchor&&(this.prepared_anchor=this.prepare_anchor(this.event.anchor)),e+=this.prepared_anchor.length),null!=this.event.tag&&(this.event instanceof i.ScalarEvent||this.event instanceof i.CollectionStartEvent)&&(null==this.prepared_tag&&(this.prepared_tag=this.prepare_tag(this.event.tag)),e+=this.prepared_tag.length),this.event instanceof i.ScalarEvent&&(null==this.analysis&&(this.analysis=this.analyze_scalar(this.event.value)),e+=this.analysis.scalar.length),e<128&&(this.event instanceof i.AliasEvent||this.event instanceof i.ScalarEvent&&!this.analysis.empty&&!this.analysis.multiline||this.check_empty_sequence()||this.check_empty_mapping())},n.prototype.process_anchor=function(e){return null==this.event.anchor?void(this.prepared_anchor=null):(null==this.prepared_anchor&&(this.prepared_anchor=this.prepare_anchor(this.event.anchor)),this.prepared_anchor&&this.write_indicator(\"\"+e+this.prepared_anchor,!0),this.prepared_anchor=null)},n.prototype.process_tag=function(){var e;if(e=this.event.tag,this.event instanceof i.ScalarEvent){if(null==this.style&&(this.style=this.choose_scalar_style()),(!this.canonical||null==e)&&(\"\"===this.style&&this.event.implicit[0]||\"\"!==this.style&&this.event.implicit[1]))return void(this.prepared_tag=null);this.event.implicit[0]&&null==e&&(e=\"!\",this.prepared_tag=null)}else if((!this.canonical||null==e)&&this.event.implicit)return void(this.prepared_tag=null);return null==e&&this.error(\"tag is not specified\"),null==this.prepared_tag&&(this.prepared_tag=this.prepare_tag(e)),this.write_indicator(this.prepared_tag,!0),this.prepared_tag=null},n.prototype.process_scalar=function(){var e;switch(null==this.analysis&&(this.analysis=this.analyze_scalar(this.event.value)),null==this.style&&(this.style=this.choose_scalar_style()),e=!this.simple_key_context,this.style){case'\"':this.write_double_quoted(this.analysis.scalar,e);break;case\"'\":this.write_single_quoted(this.analysis.scalar,e);break;case\">\":this.write_folded(this.analysis.scalar);break;case\"|\":this.write_literal(this.analysis.scalar);break;default:this.write_plain(this.analysis.scalar,e)}return this.analysis=null,this.style=null},n.prototype.choose_scalar_style=function(){var e;return null==this.analysis&&(this.analysis=this.analyze_scalar(this.event.value)),'\"'===this.event.style||this.canonical?'\"':this.event.style||!this.event.implicit[0]||this.simple_key_context&&(this.analysis.empty||this.analysis.multiline)||!(this.flow_level&&this.analysis.allow_flow_plain||!this.flow_level&&this.analysis.allow_block_plain)?this.event.style&&(e=this.event.style,\nu.call(\"|>\",e)>=0)&&!this.flow_level&&!this.simple_key_context&&this.analysis.allow_block?this.event.style:this.event.style&&\"'\"!==this.event.style||!this.analysis.allow_single_quoted||this.simple_key_context&&this.analysis.multiline?'\"':\"'\":\"\"},n.prototype.prepare_version=function(e){var t,n,r;return t=e[0],n=e[1],r=t+\".\"+n,1===t?r:this.error(\"unsupported YAML version\",r)},n.prototype.prepare_tag_handle=function(e){var t,n,r,i;for(e||this.error(\"tag handle must not be empty\"),\"!\"===e[0]&&\"!\"===e.slice(-1)||this.error(\"tag handle must start and end with '!':\",e),i=e.slice(1,-1),n=0,r=i.length;n<r;n++)t=i[n],\"0\"<=t&&t<=\"9\"||\"A\"<=t&&t<=\"Z\"||\"a\"<=t&&t<=\"z\"||u.call(\"-_\",t)>=0||this.error(\"invalid character '\"+t+\"' in the tag handle:\",e);return e},n.prototype.prepare_tag_prefix=function(e){var t,n,r,i;for(e||this.error(\"tag prefix must not be empty\"),n=[],i=0,r=+(\"!\"===e[0]);r<e.length;)t=e[r],\"0\"<=t&&t<=\"9\"||\"A\"<=t&&t<=\"Z\"||\"a\"<=t&&t<=\"z\"||u.call(\"-;/?!:@&=+$,_.~*'()[]\",t)>=0?r++:(i<r&&n.push(e.slice(i,r)),i=r+=1,n.push(t));return i<r&&n.push(e.slice(i,r)),n.join(\"\")},n.prototype.prepare_tag=function(e){var t,n,r,i,o,a,c,l,p,f,h,d;if(e||this.error(\"tag must not be empty\"),\"!\"===e)return e;for(i=null,h=e,p=function(){var e,t;e=this.tag_prefixes,t=[];for(a in e)s.call(e,a)&&t.push(a);return t}.call(this).sort(),o=0,c=p.length;o<c;o++)l=p[o],0===e.indexOf(l)&&(\"!\"===l||l.length<e.length)&&(i=this.tag_prefixes[l],h=e.slice(l.length));for(n=[],f=r=0;r<h.length;)t=h[r],\"0\"<=t&&t<=\"9\"||\"A\"<=t&&t<=\"Z\"||\"a\"<=t&&t<=\"z\"||u.call(\"-;/?!:@&=+$,_.~*'()[]\",t)>=0||\"!\"===t&&\"!\"!==i?r++:(f<r&&n.push(h.slice(f,r)),f=r+=1,n.push(t));return f<r&&n.push(h.slice(f,r)),d=n.join(\"\"),i?\"\"+i+d:\"!<\"+d+\">\"},n.prototype.prepare_anchor=function(e){var t,n,r;for(e||this.error(\"anchor must not be empty\"),n=0,r=e.length;n<r;n++)t=e[n],\"0\"<=t&&t<=\"9\"||\"A\"<=t&&t<=\"Z\"||\"a\"<=t&&t<=\"z\"||u.call(\"-_\",t)>=0||this.error(\"invalid character '\"+t+\"' in the anchor:\",e);return e},n.prototype.analyze_scalar=function(t){var n,i,o,a,s,c,l,p,f,h,d,m,v,y,g,_,b,x,w,k,S,E,C,A,T,D;for(t||new e(t,!0,!1,!1,!0,!0,!0,!1),c=!1,f=!1,_=!1,C=!1,D=!1,y=!1,v=!1,T=!1,A=!1,l=!1,E=!1,0!==t.indexOf(\"---\")&&0!==t.indexOf(\"...\")||(c=!0,f=!0),b=!0,h=1===t.length||(k=t[1],u.call(\"\\0 \\t\\r\\n\\u2028\\u2029\",k)>=0),w=!1,x=!1,m=0,m=d=0,g=t.length;d<g;m=++d)p=t[m],0===m?u.call(\"#,[]{}&*!|>'\\\"%@`\",p)>=0||\"-\"===p&&h?(f=!0,c=!0):u.call(\"?:\",p)>=0&&(f=!0,h&&(c=!0)):u.call(\",?[]{}\",p)>=0?f=!0:\":\"===p?(f=!0,h&&(c=!0)):\"#\"===p&&b&&(f=!0,c=!0),u.call(\"\\n\\u2028\\u2029\",p)>=0&&(_=!0),\"\\n\"===p||\" \"<=p&&p<=\"~\"||(\"\\ufeff\"!==p&&(\"\"===p||\" \"<=p&&p<=\"퟿\"||\"\"<=p&&p<=\"�\")?(D=!0,this.allow_unicode||(C=!0)):C=!0),\" \"===p?(0===m&&(y=!0),m===t.length-1&&(T=!0),x&&(l=!0),x=!1,w=!0):u.call(\"\\n\\u2028\\u2029\",p)>=0?(0===m&&(v=!0),m===t.length-1&&(A=!0),w&&(E=!0),x=!0,w=!1):(x=!1,w=!1),b=u.call(r,p)>=0,h=m+2>=t.length||(S=t[m+2],u.call(r,S)>=0);return a=!0,i=!0,s=!0,o=!0,n=!0,(y||v||T||A)&&(a=i=!1),T&&(n=!1),l&&(a=i=s=!1),(E||C)&&(a=i=s=n=!1),_&&(a=i=!1),f&&(a=!1),c&&(i=!1),new e(t,!1,_,a,i,s,o,n)},n.prototype.write_stream_start=function(){if(this.encoding&&0===this.encoding.indexOf(\"utf-16\"))return this.stream.write(\"\\ufeff\",this.encoding)},n.prototype.write_stream_end=function(){return this.flush_stream()},n.prototype.write_indicator=function(e,t,n){var r;return null==n&&(n={}),r=this.whitespace||!t?e:\" \"+e,this.whitespace=!!n.whitespace,this.indentation&&(this.indentation=!!n.indentation),this.column+=r.length,this.open_ended=!1,this.stream.write(r,this.encoding)},n.prototype.write_indent=function(){var e,t,n;if(t=null!=(n=this.indent)?n:0,(!this.indentation||this.column>t||this.column===t&&!this.whitespace)&&this.write_line_break(),this.column<t)return this.whitespace=!0,e=new Array(t-this.column+1).join(\" \"),this.column=t,this.stream.write(e,this.encoding)},n.prototype.write_line_break=function(e){return this.whitespace=!0,this.indentation=!0,this.line+=1,this.column=0,this.stream.write(null!=e?e:this.best_line_break,this.encoding)},n.prototype.write_version_directive=function(e){return this.stream.write(\"%YAML \"+e,this.encoding),this.write_line_break()},n.prototype.write_tag_directive=function(e,t){return this.stream.write(\"%TAG \"+e+\" \"+t,this.encoding),this.write_line_break()},n.prototype.write_single_quoted=function(e,t){var n,r,i,o,a,s,c,l,p,f;for(null==t&&(t=!0),this.write_indicator(\"'\",!0),p=!1,r=!1,f=a=0;a<=e.length;){if(i=e[a],p)null!=i&&\" \"===i||(f+1===a&&this.column>this.best_width&&t&&0!==f&&a!==e.length?this.write_indent():(o=e.slice(f,a),this.column+=o.length,this.stream.write(o,this.encoding)),f=a);else if(r){if(null==i||u.call(\"\\n\\u2028\\u2029\",i)<0){for(\"\\n\"===e[f]&&this.write_line_break(),l=e.slice(f,a),s=0,c=l.length;s<c;s++)n=l[s],\"\\n\"===n?this.write_line_break():this.write_line_break(n);this.write_indent(),f=a}}else(null==i||u.call(\" \\n\\u2028\\u2029\",i)>=0||\"'\"===i)&&f<a&&(o=e.slice(f,a),this.column+=o.length,this.stream.write(o,this.encoding),f=a);\"'\"===i&&(this.column+=2,this.stream.write(\"''\",this.encoding),f=a+1),null!=i&&(p=\" \"===i,r=u.call(\"\\n\\u2028\\u2029\",i)>=0),a++}return this.write_indicator(\"'\",!1)},n.prototype.write_double_quoted=function(e,t){var n,r,i,a;for(null==t&&(t=!0),this.write_indicator('\"',!0),a=i=0;i<=e.length;)n=e[i],(null==n||u.call('\"\\\\\\u2028\\u2029\\ufeff',n)>=0||!(\" \"<=n&&n<=\"~\"||this.allow_unicode&&(\" \"<=n&&n<=\"퟿\"||\"\"<=n&&n<=\"�\")))&&(a<i&&(r=e.slice(a,i),this.column+=r.length,this.stream.write(r,this.encoding),a=i),null!=n&&(r=n in c?\"\\\\\"+c[n]:n<=\"ÿ\"?\"\\\\x\"+o.pad_left(o.to_hex(n),\"0\",2):n<=\"￿\"?\"\\\\u\"+o.pad_left(o.to_hex(n),\"0\",4):\"\\\\U\"+o.pad_left(o.to_hex(n),\"0\",16),this.column+=r.length,this.stream.write(r,this.encoding),a=i+1)),t&&0<i&&i<e.length-1&&(\" \"===n||a>=i)&&this.column+(i-a)>this.best_width&&(r=e.slice(a,i)+\"\\\\\",a<i&&(a=i),this.column+=r.length,this.stream.write(r,this.encoding),this.write_indent(),this.whitespace=!1,this.indentation=!1,\" \"===e[a]&&(r=\"\\\\\",this.column+=r.length,this.stream.write(r,this.encoding))),i++;return this.write_indicator('\"',!1)},n.prototype.write_folded=function(e){var t,n,r,i,o,a,s,c,l,p,f,h,d;for(a=this.determine_block_hints(e),this.write_indicator(\">\"+a,!0),\"+\"===a.slice(-1)&&(this.open_ended=!0),this.write_line_break(),c=!0,n=!0,h=!1,d=o=0,f=[];o<=e.length;){if(r=e[o],n){if(null==r||u.call(\"\\n\\u2028\\u2029\",r)<0){for(c||null==r||\" \"===r||\"\\n\"!==e[d]||this.write_line_break(),c=\" \"===r,p=e.slice(d,o),s=0,l=p.length;s<l;s++)t=p[s],\"\\n\"===t?this.write_line_break():this.write_line_break(t);null!=r&&this.write_indent(),d=o}}else h?\" \"!==r&&(d+1===o&&this.column>this.best_width?this.write_indent():(i=e.slice(d,o),this.column+=i.length,this.stream.write(i,this.encoding)),d=o):(null==r||u.call(\" \\n\\u2028\\u2029\",r)>=0)&&(i=e.slice(d,o),this.column+=i.length,this.stream.write(i,this.encoding),null==r&&this.write_line_break(),d=o);null!=r&&(n=u.call(\"\\n\\u2028\\u2029\",r)>=0,h=\" \"===r),f.push(o++)}return f},n.prototype.write_literal=function(e){var t,n,r,i,o,a,s,c,l,p,f;for(a=this.determine_block_hints(e),this.write_indicator(\"|\"+a,!0),\"+\"===a.slice(-1)&&(this.open_ended=!0),this.write_line_break(),n=!0,f=o=0,p=[];o<=e.length;){if(r=e[o],n){if(null==r||u.call(\"\\n\\u2028\\u2029\",r)<0){for(l=e.slice(f,o),s=0,c=l.length;s<c;s++)t=l[s],\"\\n\"===t?this.write_line_break():this.write_line_break(t);null!=r&&this.write_indent(),f=o}}else(null==r||u.call(\"\\n\\u2028\\u2029\",r)>=0)&&(i=e.slice(f,o),this.stream.write(i,this.encoding),null==r&&this.write_line_break(),f=o);null!=r&&(n=u.call(\"\\n\\u2028\\u2029\",r)>=0),p.push(o++)}return p},n.prototype.write_plain=function(e,t){var n,r,i,o,a,s,c,l,p,f,h;if(null==t&&(t=!0),e){for(this.root_context&&(this.open_ended=!0),this.whitespace||(o=\" \",this.column+=o.length,this.stream.write(o,this.encoding)),this.whitespace=!1,this.indentation=!1,f=!1,r=!1,h=a=0,p=[];a<=e.length;){if(i=e[a],f)\" \"!==i&&(h+1===a&&this.column>this.best_width&&t?(this.write_indent(),this.whitespace=!1,this.indentation=!1):(o=e.slice(h,a),this.column+=o.length,this.stream.write(o,this.encoding)),h=a);else if(r){if(u.call(\"\\n\\u2028\\u2029\",i)<0){for(\"\\n\"===e[h]&&this.write_line_break(),l=e.slice(h,a),s=0,c=l.length;s<c;s++)n=l[s],\"\\n\"===n?this.write_line_break():this.write_line_break(n);this.write_indent(),this.whitespace=!1,this.indentation=!1,h=a}}else(null==i||u.call(\" \\n\\u2028\\u2029\",i)>=0)&&(o=e.slice(h,a),this.column+=o.length,this.stream.write(o,this.encoding),h=a);null!=i&&(f=\" \"===i,r=u.call(\"\\n\\u2028\\u2029\",i)>=0),p.push(a++)}return p}},n.prototype.determine_block_hints=function(e){var t,n,r,i,o;return n=\"\",t=e[0],r=e.length-2,o=e[r++],i=e[r++],u.call(\" \\n\\u2028\\u2029\",t)>=0&&(n+=this.best_indent),u.call(\"\\n\\u2028\\u2029\",i)<0?n+=\"-\":(1===e.length||u.call(\"\\n\\u2028\\u2029\",o)>=0)&&(n+=\"+\"),n},n.prototype.flush_stream=function(){var e;return\"function\"==typeof(e=this.stream).flush?e.flush():void 0},n.prototype.error=function(e,n){var r,i;throw n&&(n=null!=(r=null!=n&&null!=(i=n.constructor)?i.name:void 0)?r:o.inspect(n)),new t.EmitterError(\"\"+e+(n?\" \"+n:\"\"))},n}(),e=function(){function e(e,t,n,r,i,o,a,s){this.scalar=e,this.empty=t,this.multiline=n,this.allow_flow_plain=r,this.allow_block_plain=i,this.allow_single_quoted=o,this.allow_double_quoted=a,this.allow_block=s}return e}()}).call(this)},function(e,t,n){(function(){var e,t,r,i,o=function(e,t){function n(){this.constructor=e}for(var r in t)a.call(t,r)&&(e[r]=t[r]);return n.prototype=t.prototype,e.prototype=new n,e.__super__=t.prototype,e},a={}.hasOwnProperty;t=n(743),r=n(745),i=n(747),e=n(744).YAMLError,this.SerializerError=function(e){function t(){return t.__super__.constructor.apply(this,arguments)}return o(t,e),t}(e),this.Serializer=function(){function e(e){var t;t=null!=e?e:{},this.encoding=t.encoding,this.explicit_start=t.explicit_start,this.explicit_end=t.explicit_end,this.version=t.version,this.tags=t.tags,this.serialized_nodes={},this.anchors={},this.last_anchor_id=0,this.closed=null}return e.prototype.open=function(){if(null===this.closed)return this.emit(new t.StreamStartEvent(this.encoding)),this.closed=!1;throw this.closed?new SerializerError(\"serializer is closed\"):new SerializerError(\"serializer is already open\")},e.prototype.close=function(){if(null===this.closed)throw new SerializerError(\"serializer is not opened\");if(!this.closed)return this.emit(new t.StreamEndEvent),this.closed=!0},e.prototype.serialize=function(e){if(null===this.closed)throw new SerializerError(\"serializer is not opened\");if(this.closed)throw new SerializerError(\"serializer is closed\");return null!=e&&(this.emit(new t.DocumentStartEvent(void 0,void 0,this.explicit_start,this.version,this.tags)),this.anchor_node(e),this.serialize_node(e),this.emit(new t.DocumentEndEvent(void 0,void 0,this.explicit_end))),this.serialized_nodes={},this.anchors={},this.last_anchor_id=0},e.prototype.anchor_node=function(e){var t,n,i,o,a,s,u,c,l,p,f,h,d,m;if(e.unique_id in this.anchors)return null!=(t=this.anchors)[c=e.unique_id]?t[c]:t[c]=this.generate_anchor(e);if(this.anchors[e.unique_id]=null,e instanceof r.SequenceNode){for(l=e.value,h=[],n=0,s=l.length;n<s;n++)i=l[n],h.push(this.anchor_node(i));return h}if(e instanceof r.MappingNode){for(p=e.value,d=[],o=0,u=p.length;o<u;o++)f=p[o],a=f[0],m=f[1],this.anchor_node(a),d.push(this.anchor_node(m));return d}},e.prototype.generate_anchor=function(e){return\"id\"+i.pad_left(++this.last_anchor_id,\"0\",4)},e.prototype.serialize_node=function(e,n,i){var o,a,s,u,c,l,p,f,h,d,m,v,y,g;if(o=this.anchors[e.unique_id],e.unique_id in this.serialized_nodes)return this.emit(new t.AliasEvent(o));if(this.serialized_nodes[e.unique_id]=!0,this.descend_resolver(n,i),e instanceof r.ScalarNode)s=this.resolve(r.ScalarNode,e.value,[!0,!1]),a=this.resolve(r.ScalarNode,e.value,[!1,!0]),c=[e.tag===s,e.tag===a],this.emit(new t.ScalarEvent(o,e.tag,c,e.value,void 0,void 0,e.style));else if(e instanceof r.SequenceNode){for(c=e.tag===this.resolve(r.SequenceNode,e.value,!0),this.emit(new t.SequenceStartEvent(o,e.tag,c,void 0,void 0,e.flow_style)),m=e.value,i=u=0,h=m.length;u<h;i=++u)l=m[i],this.serialize_node(l,e,i);this.emit(new t.SequenceEndEvent)}else if(e instanceof r.MappingNode){for(c=e.tag===this.resolve(r.MappingNode,e.value,!0),this.emit(new t.MappingStartEvent(o,e.tag,c,void 0,void 0,e.flow_style)),v=e.value,p=0,d=v.length;p<d;p++)y=v[p],f=y[0],g=y[1],this.serialize_node(f,e,null),this.serialize_node(g,e,f);this.emit(new t.MappingEndEvent)}return this.ascend_resolver()},e}()}).call(this)},function(e,t,n){(function(){var e,r,i=function(e,t){function n(){this.constructor=e}for(var r in t)o.call(t,r)&&(e[r]=t[r]);return n.prototype=t.prototype,e.prototype=new n,e.__super__=t.prototype,e},o={}.hasOwnProperty;r=n(745),e=n(744).YAMLError,this.RepresenterError=function(e){function t(){return t.__super__.constructor.apply(this,arguments)}return i(t,e),t}(e),this.BaseRepresenter=function(){function e(e){var t;t=null!=e?e:{},this.default_style=t.default_style,this.default_flow_style=t.default_flow_style,this.represented_objects={},this.object_keeper=[],this.alias_key=null}return e.prototype.yaml_representers_types=[],e.prototype.yaml_representers_handlers=[],e.prototype.yaml_multi_representers_types=[],e.prototype.yaml_multi_representers_handlers=[],e.add_representer=function(e,t){return this.prototype.hasOwnProperty(\"yaml_representers_types\")||(this.prototype.yaml_representers_types=[].concat(this.prototype.yaml_representers_types)),this.prototype.hasOwnProperty(\"yaml_representers_handlers\")||(this.prototype.yaml_representers_handlers=[].concat(this.prototype.yaml_representers_handlers)),this.prototype.yaml_representers_types.push(e),this.prototype.yaml_representers_handlers.push(t)},e.add_multi_representer=function(e,t){return this.prototype.hasOwnProperty(\"yaml_multi_representers_types\")||(this.prototype.yaml_multi_representers_types=[].concat(this.prototype.yaml_multi_representers_types)),this.prototype.hasOwnProperty(\"yaml_multi_representers_handlers\")||(this.prototype.yaml_multi_representers_handlers=[].concat(this.prototype.yaml_multi_representers_handlers)),this.prototype.yaml_multi_representers_types.push(e),this.prototype.yaml_multi_representers_handlers.push(t)},e.prototype.represent=function(e){var t;return t=this.represent_data(e),this.serialize(t),this.represented_objects={},this.object_keeper=[],this.alias_key=null},e.prototype.represent_data=function(e){var t,n,i,o,a,s,u;if(this.ignore_aliases(e))this.alias_key=null;else if((n=this.object_keeper.indexOf(e))!==-1){if(this.alias_key=n,this.alias_key in this.represented_objects)return this.represented_objects[this.alias_key]}else this.alias_key=this.object_keeper.length,this.object_keeper.push(e);if(s=null,t=null===e?\"null\":typeof e,\"object\"===t&&(t=e.constructor),(n=this.yaml_representers_types.lastIndexOf(t))!==-1&&(s=this.yaml_representers_handlers[n]),null==s)for(a=this.yaml_multi_representers_types,n=i=0,o=a.length;i<o;n=++i)if(u=a[n],e instanceof u){s=this.yaml_multi_representers_handlers[n];break}return null==s&&((n=this.yaml_multi_representers_types.lastIndexOf(void 0))!==-1?s=this.yaml_multi_representers_handlers[n]:(n=this.yaml_representers_types.lastIndexOf(void 0))!==-1&&(s=this.yaml_representers_handlers[n])),null!=s?s.call(this,e):new r.ScalarNode(null,\"\"+e)},e.prototype.represent_scalar=function(e,t,n){var i;return null==n&&(n=this.default_style),i=new r.ScalarNode(e,t,null,null,n),null!=this.alias_key&&(this.represented_objects[this.alias_key]=i),i},e.prototype.represent_sequence=function(e,t,n){var i,o,a,s,u,c,l,p;for(p=[],u=new r.SequenceNode(e,p,null,null,n),null!=this.alias_key&&(this.represented_objects[this.alias_key]=u),i=!0,a=0,s=t.length;a<s;a++)o=t[a],c=this.represent_data(o),c instanceof r.ScalarNode||c.style||(i=!1),p.push(c);return null==n&&(u.flow_style=null!=(l=this.default_flow_style)?l:i),u},e.prototype.represent_mapping=function(e,t,n){var i,a,s,u,c,l,p,f;f=[],u=new r.MappingNode(e,f,n),this.alias_key&&(this.represented_objects[this.alias_key]=u),i=!0;for(a in t)o.call(t,a)&&(s=t[a],c=this.represent_data(a),l=this.represent_data(s),c instanceof r.ScalarNode||c.style||(i=!1),l instanceof r.ScalarNode||l.style||(i=!1),f.push([c,l]));return n||(u.flow_style=null!=(p=this.default_flow_style)?p:i),u},e.prototype.ignore_aliases=function(e){return!1},e}(),this.Representer=function(e){function n(){return n.__super__.constructor.apply(this,arguments)}return i(n,e),n.prototype.represent_boolean=function(e){return this.represent_scalar(\"tag:yaml.org,2002:bool\",e?\"true\":\"false\")},n.prototype.represent_null=function(e){return this.represent_scalar(\"tag:yaml.org,2002:null\",\"null\")},n.prototype.represent_number=function(e){var t,n;return t=\"tag:yaml.org,2002:\"+(e%1===0?\"int\":\"float\"),n=e!==e?\".nan\":Infinity===e?\".inf\":-Infinity===e?\"-.inf\":e.toString(),this.represent_scalar(t,n)},n.prototype.represent_string=function(e){return this.represent_scalar(\"tag:yaml.org,2002:str\",e)},n.prototype.represent_array=function(e){return this.represent_sequence(\"tag:yaml.org,2002:seq\",e)},n.prototype.represent_date=function(e){return this.represent_scalar(\"tag:yaml.org,2002:timestamp\",e.toISOString())},n.prototype.represent_object=function(e){return this.represent_mapping(\"tag:yaml.org,2002:map\",e)},n.prototype.represent_undefined=function(e){throw new t.RepresenterError(\"cannot represent an onbject: \"+e)},n.prototype.ignore_aliases=function(e){var t;return null==e||(\"boolean\"==(t=typeof e)||\"number\"===t||\"string\"===t)},n}(this.BaseRepresenter),this.Representer.add_representer(\"boolean\",this.Representer.prototype.represent_boolean),this.Representer.add_representer(\"null\",this.Representer.prototype.represent_null),this.Representer.add_representer(\"number\",this.Representer.prototype.represent_number),this.Representer.add_representer(\"string\",this.Representer.prototype.represent_string),this.Representer.add_representer(Array,this.Representer.prototype.represent_array),this.Representer.add_representer(Date,this.Representer.prototype.represent_date),this.Representer.add_representer(Object,this.Representer.prototype.represent_object),this.Representer.add_representer(null,this.Representer.prototype.represent_undefined)}).call(this)},function(e,t,n){(function(){var e,t,r,i=function(e,t){function n(){this.constructor=e}for(var r in t)o.call(t,r)&&(e[r]=t[r]);return n.prototype=t.prototype,e.prototype=new n,e.__super__=t.prototype,e},o={}.hasOwnProperty,a=[].indexOf||function(e){for(var t=0,n=this.length;t<n;t++)if(t in this&&this[t]===e)return t;return-1};t=n(745),r=n(747),e=n(744).YAMLError,this.ResolverError=function(e){function t(){return t.__super__.constructor.apply(this,arguments)}return i(t,e),t}(e),this.BaseResolver=function(){function e(){this.resolver_exact_paths=[],this.resolver_prefix_paths=[]}var n,i,o;return i=\"tag:yaml.org,2002:str\",o=\"tag:yaml.org,2002:seq\",n=\"tag:yaml.org,2002:map\",e.prototype.yaml_implicit_resolvers={},e.prototype.yaml_path_resolvers={},e.add_implicit_resolver=function(e,t,n){var i,o,a,s,u;for(null==n&&(n=[null]),this.prototype.hasOwnProperty(\"yaml_implicit_resolvers\")||(this.prototype.yaml_implicit_resolvers=r.extend({},this.prototype.yaml_implicit_resolvers)),u=[],a=0,s=n.length;a<s;a++)o=n[a],u.push((null!=(i=this.prototype.yaml_implicit_resolvers)[o]?i[o]:i[o]=[]).push([e,t]));return u},e.prototype.descend_resolver=function(e,t){var n,i,o,a,s,u,c,l,p,f,h,d,m;if(!r.is_empty(this.yaml_path_resolvers)){if(i={},p=[],e)for(n=this.resolver_prefix_paths.length,f=this.resolver_prefix_paths.slice(-1)[0],o=0,u=f.length;o<u;o++)h=f[o],l=h[0],s=h[1],this.check_resolver_prefix(n,l,s,e,t)&&(l.length>n?p.push([l,s]):i[s]=this.yaml_path_resolvers[l][s]);else for(d=this.yaml_path_resolvers,a=0,c=d.length;a<c;a++)m=d[a],l=m[0],s=m[1],l?p.push([l,s]):i[s]=this.yaml_path_resolvers[l][s];return this.resolver_exact_paths.push(i),this.resolver_prefix_paths.push(p)}},e.prototype.ascend_resolver=function(){if(!r.is_empty(this.yaml_path_resolvers))return this.resolver_exact_paths.pop(),this.resolver_prefix_paths.pop()},e.prototype.check_resolver_prefix=function(e,n,r,i,o){var a,s,u;if(u=n[e-1],s=u[0],a=u[1],\"string\"==typeof s){if(i.tag!==s)return}else if(null!==s&&!(i instanceof s))return;if((a!==!0||null===o)&&(a!==!1&&null!==a||null!==o)){if(\"string\"==typeof a){if(!(o instanceof t.ScalarNode)&&a===o.value)return}else if(\"number\"==typeof a&&a!==o)return;return!0}},e.prototype.resolve=function(e,r,s){var u,c,l,p,f,h,d,m,v,y,g,_;if(e===t.ScalarNode&&s[0]){for(g=\"\"===r?null!=(h=this.yaml_implicit_resolvers[\"\"])?h:[]:null!=(d=this.yaml_implicit_resolvers[r[0]])?d:[],g=g.concat(null!=(m=this.yaml_implicit_resolvers[null])?m:[]),l=0,f=g.length;l<f;l++)if(v=g[l],_=v[0],y=v[1],r.match(y))return _;s=s[1]}u=!0;for(p in this.yaml_path_resolvers)null=={}[p]&&(u=!1);if(!u){if(c=this.resolver_exact_paths.slice(-1)[0],a.call(c,e)>=0)return c[e];if(a.call(c,null)>=0)return c[null]}return e===t.ScalarNode?i:e===t.SequenceNode?o:e===t.MappingNode?n:void 0},e}(),this.Resolver=function(e){function t(){return t.__super__.constructor.apply(this,arguments)}return i(t,e),t}(this.BaseResolver),this.Resolver.add_implicit_resolver(\"tag:yaml.org,2002:bool\",/^(?:yes|Yes|YES|true|True|TRUE|on|On|ON|no|No|NO|false|False|FALSE|off|Off|OFF)$/,\"yYnNtTfFoO\"),this.Resolver.add_implicit_resolver(\"tag:yaml.org,2002:float\",/^(?:[-+]?(?:[0-9][0-9_]*)\\.[0-9_]*(?:[eE][-+][0-9]+)?|\\.[0-9_]+(?:[eE][-+][0-9]+)?|[-+]?[0-9][0-9_]*(?::[0-5]?[0-9])+\\.[0-9_]*|[-+]?\\.(?:inf|Inf|INF)|\\.(?:nan|NaN|NAN))$/,\"-+0123456789.\"),this.Resolver.add_implicit_resolver(\"tag:yaml.org,2002:int\",/^(?:[-+]?0b[01_]+|[-+]?0[0-7_]+|[-+]?(?:0|[1-9][0-9_]*)|[-+]?0x[0-9a-fA-F_]+|[-+]?0o[0-7_]+|[-+]?[1-9][0-9_]*(?::[0-5]?[0-9])+)$/,\"-+0123456789\"),this.Resolver.add_implicit_resolver(\"tag:yaml.org,2002:merge\",/^(?:<<)$/,\"<\"),this.Resolver.add_implicit_resolver(\"tag:yaml.org,2002:null\",/^(?:~|null|Null|NULL|)$/,[\"~\",\"n\",\"N\",\"\"]),this.Resolver.add_implicit_resolver(\"tag:yaml.org,2002:timestamp\",/^(?:[0-9][0-9][0-9][0-9]-[0-9][0-9]-[0-9][0-9]|[0-9][0-9][0-9][0-9]-[0-9][0-9]?-[0-9][0-9]?(?:[Tt]|[\\x20\\t]+)[0-9][0-9]?:[0-9][0-9]:[0-9][0-9](?:\\.[0-9]*)?(?:[\\x20\\t]*(?:Z|[-+][0-9][0-9]?(?::[0-9][0-9])?))?)$/,\"0123456789\"),this.Resolver.add_implicit_resolver(\"tag:yaml.org,2002:value\",/^(?:=)$/,\"=\"),this.Resolver.add_implicit_resolver(\"tag:yaml.org,2002:yaml\",/^(?:!|&|\\*)$/,\"!&*\")}).call(this)},function(e,t,n){(function(){var e,t,r,i,o,a,s,u=[].slice;s=n(747),i=n(757),a=n(758),r=n(760),e=n(742),o=n(755),t=n(746),this.make_loader=function(n,c,l,p,f,h){var d,m;return null==n&&(n=i.Reader),null==c&&(c=a.Scanner),null==l&&(l=r.Parser),null==p&&(p=e.Composer),null==f&&(f=o.Resolver),null==h&&(h=t.Constructor),m=[n,c,l,p,f,h],d=function(){function e(e){var n,r,i;for(m[0].call(this,e),i=m.slice(1),n=0,r=i.length;n<r;n++)t=i[n],t.call(this)}var t;return s.extend.apply(s,[e.prototype].concat(u.call(function(){var e,n,r;for(r=[],e=0,n=m.length;e<n;e++)t=m[e],r.push(t.prototype);return r}()))),e}()},this.Loader=this.make_loader()}).call(this)},function(e,t,n){(function(){var e,r,i,o=function(e,t){function n(){this.constructor=e}for(var r in t)a.call(t,r)&&(e[r]=t[r]);return n.prototype=t.prototype,e.prototype=new n,e.__super__=t.prototype,e},a={}.hasOwnProperty,s=[].indexOf||function(e){for(var t=0,n=this.length;t<n;t++)if(t in this&&this[t]===e)return t;return-1};i=n(744),e=i.Mark,r=i.YAMLError,this.ReaderError=function(e){function t(e,n,r){this.position=e,this.character=n,this.reason=r,t.__super__.constructor.call(this)}return o(t,e),t.prototype.toString=function(){return\"unacceptable character #\"+this.character.charCodeAt(0).toString(16)+\": \"+this.reason+\"\\n  position \"+this.position},t}(r),this.Reader=function(){function n(e){this.string=e,this.line=0,this.column=0,this.index=0,this.check_printable(),this.string+=\"\\0\"}var r;return r=/[^\\x09\\x0A\\x0D\\x20-\\x7E\\x85\\xA0-\\uFFFD]|[\\uD800-\\uDBFF](?![\\uDC00-\\uDFFF])|(?:[^\\uD800-\\uDBFF]|^)[\\uDC00-\\uDFFF]/,n.prototype.peek=function(e){return null==e&&(e=0),this.string[this.index+e]},n.prototype.prefix=function(e){return null==e&&(e=1),this.string.slice(this.index,this.index+e)},n.prototype.forward=function(e){var t,n;for(null==e&&(e=1),n=[];e;)t=this.string[this.index],this.index++,s.call(\"\\n₂\\u2029\",t)>=0||\"\\r\"===t&&\"\\n\"!==this.string[this.index]?(this.line++,this.column=0):this.column++,n.push(e--);return n},n.prototype.get_mark=function(){return new e(this.line,this.column,this.string,this.index)},n.prototype.check_printable=function(){var e,n,i;if(n=r.exec(this.string))throw e=n[0],i=this.string.length-this.index+n.index,new t.ReaderError(i,e,\"special characters are not allowed\")},n}()}).call(this)},function(e,t,n){(function(){var e,r,i,o,a=function(e,t){function n(){this.constructor=e}for(var r in t)s.call(t,r)&&(e[r]=t[r]);return n.prototype=t.prototype,e.prototype=new n,e.__super__=t.prototype,e},s={}.hasOwnProperty,u=[].slice,c=[].indexOf||function(e){for(var t=0,n=this.length;t<n;t++)if(t in this&&this[t]===e)return t;return-1};e=n(744).MarkedYAMLError,i=n(759),o=n(747),this.ScannerError=function(e){function t(){return t.__super__.constructor.apply(this,arguments)}return a(t,e),t}(e),r=function(){function e(e,t,n,r,i,o){this.token_number=e,this.required=t,this.index=n,this.line=r,this.column=i,this.mark=o}return e}(),this.Scanner=function(){function e(){this.done=!1,this.flow_level=0,this.tokens=[],this.fetch_stream_start(),this.tokens_taken=0,this.indent=-1,this.indents=[],this.allow_simple_key=!0,this.possible_simple_keys={}}var n,a,l,p,f;return n=\"\\r\\n\\u2028\\u2029\",l=\"\\t \",a=\"0123456789\",f={0:\"\\0\",a:\"\u0007\",b:\"\\b\",t:\"\\t\",\"\\t\":\"\\t\",n:\"\\n\",v:\"\\v\",f:\"\\f\",r:\"\\r\",e:\"\u001b\",\" \":\" \",'\"':'\"',\"\\\\\":\"\\\\\",N:\"\",_:\" \",L:\"\\u2028\",P:\"\\u2029\"},p={x:2,u:4,U:8},e.prototype.check_token=function(){var e,t,n,r;for(t=1<=arguments.length?u.call(arguments,0):[];this.need_more_tokens();)this.fetch_more_tokens();if(0!==this.tokens.length){if(0===t.length)return!0;for(n=0,r=t.length;n<r;n++)if(e=t[n],this.tokens[0]instanceof e)return!0}return!1},e.prototype.peek_token=function(){for(;this.need_more_tokens();)this.fetch_more_tokens();if(0!==this.tokens.length)return this.tokens[0]},e.prototype.get_token=function(){for(;this.need_more_tokens();)this.fetch_more_tokens();if(0!==this.tokens.length)return this.tokens_taken++,this.tokens.shift()},e.prototype.need_more_tokens=function(){return!this.done&&(0===this.tokens.length||(this.stale_possible_simple_keys(),this.next_possible_simple_key()===this.tokens_taken))},e.prototype.fetch_more_tokens=function(){var e;if(this.scan_to_next_token(),this.stale_possible_simple_keys(),this.unwind_indent(this.column),e=this.peek(),\"\\0\"===e)return this.fetch_stream_end();if(\"%\"===e&&this.check_directive())return this.fetch_directive();if(\"-\"===e&&this.check_document_start())return this.fetch_document_start();if(\".\"===e&&this.check_document_end())return this.fetch_document_end();if(\"[\"===e)return this.fetch_flow_sequence_start();if(\"{\"===e)return this.fetch_flow_mapping_start();if(\"]\"===e)return this.fetch_flow_sequence_end();if(\"}\"===e)return this.fetch_flow_mapping_end();if(\",\"===e)return this.fetch_flow_entry();if(\"-\"===e&&this.check_block_entry())return this.fetch_block_entry();if(\"?\"===e&&this.check_key())return this.fetch_key();if(\":\"===e&&this.check_value())return this.fetch_value();if(\"*\"===e)return this.fetch_alias();if(\"&\"===e)return this.fetch_anchor();if(\"!\"===e)return this.fetch_tag();if(\"|\"===e&&0===this.flow_level)return this.fetch_literal();if(\">\"===e&&0===this.flow_level)return this.fetch_folded();if(\"'\"===e)return this.fetch_single();if('\"'===e)return this.fetch_double();if(this.check_plain())return this.fetch_plain();throw new t.ScannerError(\"while scanning for the next token\",null,\"found character \"+e+\" that cannot start any token\",this.get_mark())},e.prototype.next_possible_simple_key=function(){var e,t,n,r;n=null,r=this.possible_simple_keys;for(t in r)s.call(r,t)&&(e=r[t],(null===n||e.token_number<n)&&(n=e.token_number));return n},e.prototype.stale_possible_simple_keys=function(){var e,n,r,i;r=this.possible_simple_keys,i=[];for(n in r)if(s.call(r,n)&&(e=r[n],!(e.line===this.line&&this.index-e.index<=1024))){if(e.required)throw new t.ScannerError(\"while scanning a simple key\",e.mark,\"could not find expected ':'\",this.get_mark());i.push(delete this.possible_simple_keys[n])}return i},e.prototype.save_possible_simple_key=function(){var e,t;if(e=0===this.flow_level&&this.indent===this.column,e&&!this.allow_simple_key)throw new Error(\"logic failure\");if(this.allow_simple_key)return this.remove_possible_simple_key(),t=this.tokens_taken+this.tokens.length,this.possible_simple_keys[this.flow_level]=new r(t,e,this.index,this.line,this.column,this.get_mark())},e.prototype.remove_possible_simple_key=function(){var e;if(e=this.possible_simple_keys[this.flow_level]){if(e.required)throw new t.ScannerError(\"while scanning a simple key\",e.mark,\"could not find expected ':'\",this.get_mark());return delete this.possible_simple_keys[this.flow_level]}},e.prototype.unwind_indent=function(e){var t,n;if(0===this.flow_level){for(n=[];this.indent>e;)t=this.get_mark(),this.indent=this.indents.pop(),n.push(this.tokens.push(new i.BlockEndToken(t,t)));return n}},e.prototype.add_indent=function(e){return e>this.indent&&(this.indents.push(this.indent),this.indent=e,!0)},e.prototype.fetch_stream_start=function(){var e;return e=this.get_mark(),this.tokens.push(new i.StreamStartToken(e,e,this.encoding))},e.prototype.fetch_stream_end=function(){var e;return this.unwind_indent(-1),this.remove_possible_simple_key(),this.allow_possible_simple_key=!1,this.possible_simple_keys={},e=this.get_mark(),this.tokens.push(new i.StreamEndToken(e,e)),this.done=!0},e.prototype.fetch_directive=function(){return this.unwind_indent(-1),this.remove_possible_simple_key(),this.allow_simple_key=!1,this.tokens.push(this.scan_directive())},e.prototype.fetch_document_start=function(){return this.fetch_document_indicator(i.DocumentStartToken)},e.prototype.fetch_document_end=function(){return this.fetch_document_indicator(i.DocumentEndToken)},e.prototype.fetch_document_indicator=function(e){var t;return this.unwind_indent(-1),this.remove_possible_simple_key(),this.allow_simple_key=!1,t=this.get_mark(),this.forward(3),this.tokens.push(new e(t,this.get_mark()))},e.prototype.fetch_flow_sequence_start=function(){return this.fetch_flow_collection_start(i.FlowSequenceStartToken)},e.prototype.fetch_flow_mapping_start=function(){return this.fetch_flow_collection_start(i.FlowMappingStartToken)},e.prototype.fetch_flow_collection_start=function(e){var t;return this.save_possible_simple_key(),this.flow_level++,this.allow_simple_key=!0,t=this.get_mark(),this.forward(),this.tokens.push(new e(t,this.get_mark()))},e.prototype.fetch_flow_sequence_end=function(){return this.fetch_flow_collection_end(i.FlowSequenceEndToken)},e.prototype.fetch_flow_mapping_end=function(){return this.fetch_flow_collection_end(i.FlowMappingEndToken)},e.prototype.fetch_flow_collection_end=function(e){var t;return this.remove_possible_simple_key(),this.flow_level--,this.allow_simple_key=!1,t=this.get_mark(),this.forward(),this.tokens.push(new e(t,this.get_mark()))},e.prototype.fetch_flow_entry=function(){var e;return this.allow_simple_key=!0,this.remove_possible_simple_key(),e=this.get_mark(),this.forward(),this.tokens.push(new i.FlowEntryToken(e,this.get_mark()))},e.prototype.fetch_block_entry=function(){var e,n;if(0===this.flow_level){if(!this.allow_simple_key)throw new t.ScannerError(null,null,\"sequence entries are not allowed here\",this.get_mark());this.add_indent(this.column)&&(e=this.get_mark(),this.tokens.push(new i.BlockSequenceStartToken(e,e)))}return this.allow_simple_key=!0,this.remove_possible_simple_key(),n=this.get_mark(),this.forward(),this.tokens.push(new i.BlockEntryToken(n,this.get_mark()))},e.prototype.fetch_key=function(){var e,n;if(0===this.flow_level){if(!this.allow_simple_key)throw new t.ScannerError(null,null,\"mapping keys are not allowed here\",this.get_mark());this.add_indent(this.column)&&(e=this.get_mark(),\nthis.tokens.push(new i.BlockMappingStartToken(e,e)))}return this.allow_simple_key=!this.flow_level,this.remove_possible_simple_key(),n=this.get_mark(),this.forward(),this.tokens.push(new i.KeyToken(n,this.get_mark()))},e.prototype.fetch_value=function(){var e,n,r;if(e=this.possible_simple_keys[this.flow_level])delete this.possible_simple_keys[this.flow_level],this.tokens.splice(e.token_number-this.tokens_taken,0,new i.KeyToken(e.mark,e.mark)),0===this.flow_level&&this.add_indent(e.column)&&this.tokens.splice(e.token_number-this.tokens_taken,0,new i.BlockMappingStartToken(e.mark,e.mark)),this.allow_simple_key=!1;else{if(0===this.flow_level){if(!this.allow_simple_key)throw new t.ScannerError(null,null,\"mapping values are not allowed here\",this.get_mark());this.add_indent(this.column)&&(n=this.get_mark(),this.tokens.push(new i.BlockMappingStartToken(n,n)))}this.allow_simple_key=!this.flow_level,this.remove_possible_simple_key()}return r=this.get_mark(),this.forward(),this.tokens.push(new i.ValueToken(r,this.get_mark()))},e.prototype.fetch_alias=function(){return this.save_possible_simple_key(),this.allow_simple_key=!1,this.tokens.push(this.scan_anchor(i.AliasToken))},e.prototype.fetch_anchor=function(){return this.save_possible_simple_key(),this.allow_simple_key=!1,this.tokens.push(this.scan_anchor(i.AnchorToken))},e.prototype.fetch_tag=function(){return this.save_possible_simple_key(),this.allow_simple_key=!1,this.tokens.push(this.scan_tag())},e.prototype.fetch_literal=function(){return this.fetch_block_scalar(\"|\")},e.prototype.fetch_folded=function(){return this.fetch_block_scalar(\">\")},e.prototype.fetch_block_scalar=function(e){return this.allow_simple_key=!0,this.remove_possible_simple_key(),this.tokens.push(this.scan_block_scalar(e))},e.prototype.fetch_single=function(){return this.fetch_flow_scalar(\"'\")},e.prototype.fetch_double=function(){return this.fetch_flow_scalar('\"')},e.prototype.fetch_flow_scalar=function(e){return this.save_possible_simple_key(),this.allow_simple_key=!1,this.tokens.push(this.scan_flow_scalar(e))},e.prototype.fetch_plain=function(){return this.save_possible_simple_key(),this.allow_simple_key=!1,this.tokens.push(this.scan_plain())},e.prototype.check_directive=function(){return 0===this.column},e.prototype.check_document_start=function(){var e;return 0===this.column&&\"---\"===this.prefix(3)&&(e=this.peek(3),c.call(n+l+\"\\0\",e)>=0)},e.prototype.check_document_end=function(){var e;return 0===this.column&&\"...\"===this.prefix(3)&&(e=this.peek(3),c.call(n+l+\"\\0\",e)>=0)},e.prototype.check_block_entry=function(){var e;return e=this.peek(1),c.call(n+l+\"\\0\",e)>=0},e.prototype.check_key=function(){var e;return 0!==this.flow_level||(e=this.peek(1),c.call(n+l+\"\\0\",e)>=0)},e.prototype.check_value=function(){var e;return 0!==this.flow_level||(e=this.peek(1),c.call(n+l+\"\\0\",e)>=0)},e.prototype.check_plain=function(){var e,t;return e=this.peek(),c.call(n+l+\"\\0-?:,[]{}#&*!|>'\\\"%@`\",e)<0||(t=this.peek(1),c.call(n+l+\"\\0\",t)<0&&(\"-\"===e||0===this.flow_level&&c.call(\"?:\",e)>=0))},e.prototype.scan_to_next_token=function(){var e,t,r;for(0===this.index&&\"\\ufeff\"===this.peek()&&this.forward(),e=!1,r=[];!e;){for(;\" \"===this.peek();)this.forward();if(\"#\"===this.peek())for(;t=this.peek(),c.call(n+\"\\0\",t)<0;)this.forward();this.scan_line_break()?0===this.flow_level?r.push(this.allow_simple_key=!0):r.push(void 0):r.push(e=!0)}return r},e.prototype.scan_directive=function(){var e,t,r,o,a;if(o=this.get_mark(),this.forward(),t=this.scan_directive_name(o),a=null,\"YAML\"===t)a=this.scan_yaml_directive_value(o),e=this.get_mark();else if(\"TAG\"===t)a=this.scan_tag_directive_value(o),e=this.get_mark();else for(e=this.get_mark();r=this.peek(),c.call(n+\"\\0\",r)<0;)this.forward();return this.scan_directive_ignored_line(o),new i.DirectiveToken(t,a,o,e)},e.prototype.scan_directive_name=function(e){var r,i,o;for(i=0,r=this.peek(i);\"0\"<=r&&r<=\"9\"||\"A\"<=r&&r<=\"Z\"||\"a\"<=r&&r<=\"z\"||c.call(\"-_\",r)>=0;)i++,r=this.peek(i);if(0===i)throw new t.ScannerError(\"while scanning a directive\",e,\"expected alphanumeric or numeric character but found \"+r,this.get_mark());if(o=this.prefix(i),this.forward(i),r=this.peek(),c.call(n+\"\\0 \",r)<0)throw new t.ScannerError(\"while scanning a directive\",e,\"expected alphanumeric or numeric character but found \"+r,this.get_mark());return o},e.prototype.scan_yaml_directive_value=function(e){for(var r,i,o;\" \"===this.peek();)this.forward();if(r=this.scan_yaml_directive_number(e),\".\"!==this.peek())throw new t.ScannerError(\"while scanning a directive\",e,\"expected a digit or '.' but found \"+this.peek(),this.get_mark());if(this.forward(),i=this.scan_yaml_directive_number(e),o=this.peek(),c.call(n+\"\\0 \",o)<0)throw new t.ScannerError(\"while scanning a directive\",e,\"expected a digit or ' ' but found \"+this.peek(),this.get_mark());return[r,i]},e.prototype.scan_yaml_directive_number=function(e){var n,r,i,o;if(n=this.peek(),!(\"0\"<=n&&n<=\"9\"))throw new t.ScannerError(\"while scanning a directive\",e,\"expected a digit but found \"+n,this.get_mark());for(r=0;\"0\"<=(i=this.peek(r))&&i<=\"9\";)r++;return o=parseInt(this.prefix(r)),this.forward(r),o},e.prototype.scan_tag_directive_value=function(e){for(var t,n;\" \"===this.peek();)this.forward();for(t=this.scan_tag_directive_handle(e);\" \"===this.peek();)this.forward();return n=this.scan_tag_directive_prefix(e),[t,n]},e.prototype.scan_tag_directive_handle=function(e){var n,r;if(r=this.scan_tag_handle(\"directive\",e),n=this.peek(),\" \"!==n)throw new t.ScannerError(\"while scanning a directive\",e,\"expected ' ' but found \"+n,this.get_mark());return r},e.prototype.scan_tag_directive_prefix=function(e){var r,i;if(i=this.scan_tag_uri(\"directive\",e),r=this.peek(),c.call(n+\"\\0 \",r)<0)throw new t.ScannerError(\"while scanning a directive\",e,\"expected ' ' but found \"+r,this.get_mark());return i},e.prototype.scan_directive_ignored_line=function(e){for(var r,i;\" \"===this.peek();)this.forward();if(\"#\"===this.peek())for(;i=this.peek(),c.call(n+\"\\0\",i)<0;)this.forward();if(r=this.peek(),c.call(n+\"\\0\",r)<0)throw new t.ScannerError(\"while scanning a directive\",e,\"expected a comment or a line break but found \"+r,this.get_mark());return this.scan_line_break()},e.prototype.scan_anchor=function(e){var r,i,o,a,s,u;for(s=this.get_mark(),i=this.peek(),a=\"*\"===i?\"alias\":\"anchor\",this.forward(),o=0,r=this.peek(o);\"0\"<=r&&r<=\"9\"||\"A\"<=r&&r<=\"Z\"||\"a\"<=r&&r<=\"z\"||c.call(\"-_\",r)>=0;)o++,r=this.peek(o);if(0===o)throw new t.ScannerError(\"while scanning an \"+a,s,\"expected alphabetic or numeric character but found '\"+r+\"'\",this.get_mark());if(u=this.prefix(o),this.forward(o),r=this.peek(),c.call(n+l+\"\\0?:,]}%@`\",r)<0)throw new t.ScannerError(\"while scanning an \"+a,s,\"expected alphabetic or numeric character but found '\"+r+\"'\",this.get_mark());return new e(u,s,this.get_mark())},e.prototype.scan_tag=function(){var e,r,o,a,s,u;if(a=this.get_mark(),e=this.peek(1),\"<\"===e){if(r=null,this.forward(2),s=this.scan_tag_uri(\"tag\",a),\">\"!==this.peek())throw new t.ScannerError(\"while parsing a tag\",a,\"expected '>' but found \"+this.peek(),this.get_mark());this.forward()}else if(c.call(n+l+\"\\0\",e)>=0)r=null,s=\"!\",this.forward();else{for(o=1,u=!1;c.call(n+\"\\0 \",e)<0;){if(\"!\"===e){u=!0;break}o++,e=this.peek(o)}u?r=this.scan_tag_handle(\"tag\",a):(r=\"!\",this.forward()),s=this.scan_tag_uri(\"tag\",a)}if(e=this.peek(),c.call(n+\"\\0 \",e)<0)throw new t.ScannerError(\"while scanning a tag\",a,\"expected ' ' but found \"+e,this.get_mark());return new i.TagToken([r,s],a,this.get_mark())},e.prototype.scan_block_scalar=function(e){var t,r,a,s,u,l,p,f,h,d,m,v,y,g,_,b,x,w,k,S;for(u=\">\"===e,a=[],S=this.get_mark(),this.forward(),y=this.scan_block_scalar_indicators(S),r=y[0],l=y[1],this.scan_block_scalar_ignored_line(S),v=this.indent+1,v<1&&(v=1),null==l?(g=this.scan_block_scalar_indentation(),t=g[0],m=g[1],s=g[2],p=Math.max(v,m)):(p=v+l-1,_=this.scan_block_scalar_breaks(p),t=_[0],s=_[1]),d=\"\";this.column===p&&\"\\0\"!==this.peek();){for(a=a.concat(t),b=this.peek(),f=c.call(\" \\t\",b)<0,h=0;x=this.peek(h),c.call(n+\"\\0\",x)<0;)h++;if(a.push(this.prefix(h)),this.forward(h),d=this.scan_line_break(),w=this.scan_block_scalar_breaks(p),t=w[0],s=w[1],this.column!==p||\"\\0\"===this.peek())break;u&&\"\\n\"===d&&f&&(k=this.peek(),c.call(\" \\t\",k)<0)?o.is_empty(t)&&a.push(\" \"):a.push(d)}return r!==!1&&a.push(d),r===!0&&(a=a.concat(t)),new i.ScalarToken(a.join(\"\"),!1,S,s,e)},e.prototype.scan_block_scalar_indicators=function(e){var r,i,o;if(i=null,o=null,r=this.peek(),c.call(\"+-\",r)>=0){if(i=\"+\"===r,this.forward(),r=this.peek(),c.call(a,r)>=0){if(o=parseInt(r),0===o)throw new t.ScannerError(\"while scanning a block scalar\",e,\"expected indentation indicator in the range 1-9 but found 0\",this.get_mark());this.forward()}}else if(c.call(a,r)>=0){if(o=parseInt(r),0===o)throw new t.ScannerError(\"while scanning a block scalar\",e,\"expected indentation indicator in the range 1-9 but found 0\",this.get_mark());this.forward(),r=this.peek(),c.call(\"+-\",r)>=0&&(i=\"+\"===r,this.forward())}if(r=this.peek(),c.call(n+\"\\0 \",r)<0)throw new t.ScannerError(\"while scanning a block scalar\",e,\"expected chomping or indentation indicators, but found \"+r,this.get_mark());return[i,o]},e.prototype.scan_block_scalar_ignored_line=function(e){for(var r,i;\" \"===this.peek();)this.forward();if(\"#\"===this.peek())for(;i=this.peek(),c.call(n+\"\\0\",i)<0;)this.forward();if(r=this.peek(),c.call(n+\"\\0\",r)<0)throw new t.ScannerError(\"while scanning a block scalar\",e,\"expected a comment or a line break but found \"+r,this.get_mark());return this.scan_line_break()},e.prototype.scan_block_scalar_indentation=function(){var e,t,r,i;for(e=[],r=0,t=this.get_mark();i=this.peek(),c.call(n+\" \",i)>=0;)\" \"!==this.peek()?(e.push(this.scan_line_break()),t=this.get_mark()):(this.forward(),this.column>r&&(r=this.column));return[e,r,t]},e.prototype.scan_block_scalar_breaks=function(e){var t,r,i;for(t=[],r=this.get_mark();this.column<e&&\" \"===this.peek();)this.forward();for(;i=this.peek(),c.call(n,i)>=0;)for(t.push(this.scan_line_break()),r=this.get_mark();this.column<e&&\" \"===this.peek();)this.forward();return[t,r]},e.prototype.scan_flow_scalar=function(e){var t,n,r,o;for(n='\"'===e,t=[],o=this.get_mark(),r=this.peek(),this.forward(),t=t.concat(this.scan_flow_scalar_non_spaces(n,o));this.peek()!==r;)t=t.concat(this.scan_flow_scalar_spaces(n,o)),t=t.concat(this.scan_flow_scalar_non_spaces(n,o));return this.forward(),new i.ScalarToken(t.join(\"\"),!1,o,this.get_mark(),e)},e.prototype.scan_flow_scalar_non_spaces=function(e,r){var i,o,s,u,h,d,m,v,y;for(o=[];;){for(d=0;m=this.peek(d),c.call(n+l+\"'\\\"\\\\\\0\",m)<0;)d++;if(0!==d&&(o.push(this.prefix(d)),this.forward(d)),i=this.peek(),e||\"'\"!==i||\"'\"!==this.peek(1))if(e&&\"'\"===i||!e&&c.call('\"\\\\',i)>=0)o.push(i),this.forward();else{if(!e||\"\\\\\"!==i)return o;if(this.forward(),i=this.peek(),i in f)o.push(f[i]),this.forward();else if(i in p){for(d=p[i],this.forward(),h=u=0,v=d;0<=v?u<v:u>v;h=0<=v?++u:--u)if(y=this.peek(h),c.call(a+\"ABCDEFabcdef\",y)<0)throw new t.ScannerError(\"while scanning a double-quoted scalar\",r,\"expected escape sequence of \"+d+\" hexadecimal numbers, but found \"+this.peek(h),this.get_mark());s=parseInt(this.prefix(d),16),o.push(String.fromCharCode(s)),this.forward(d)}else{if(!(c.call(n,i)>=0))throw new t.ScannerError(\"while scanning a double-quoted scalar\",r,\"found unknown escape character \"+i,this.get_mark());this.scan_line_break(),o=o.concat(this.scan_flow_scalar_breaks(e,r))}}else o.push(\"'\"),this.forward(2)}},e.prototype.scan_flow_scalar_spaces=function(e,r){var i,o,a,s,u,p,f;for(a=[],s=0;p=this.peek(s),c.call(l,p)>=0;)s++;if(f=this.prefix(s),this.forward(s),o=this.peek(),\"\\0\"===o)throw new t.ScannerError(\"while scanning a quoted scalar\",r,\"found unexpected end of stream\",this.get_mark());return c.call(n,o)>=0?(u=this.scan_line_break(),i=this.scan_flow_scalar_breaks(e,r),\"\\n\"!==u?a.push(u):0===i.length&&a.push(\" \"),a=a.concat(i)):a.push(f),a},e.prototype.scan_flow_scalar_breaks=function(e,r){var i,o,a,s,u;for(i=[];;){if(o=this.prefix(3),\"---\"===o||\"...\"===o&&(a=this.peek(3),c.call(n+l+\"\\0\",a)>=0))throw new t.ScannerError(\"while scanning a quoted scalar\",r,\"found unexpected document separator\",this.get_mark());for(;s=this.peek(),c.call(l,s)>=0;)this.forward();if(u=this.peek(),!(c.call(n,u)>=0))return i;i.push(this.scan_line_break())}},e.prototype.scan_plain=function(){var e,r,o,a,s,u,p,f,h;for(r=[],h=o=this.get_mark(),a=this.indent+1,f=[];;){if(s=0,\"#\"===this.peek())break;for(;;){if(e=this.peek(s),c.call(n+l+\"\\0\",e)>=0||0===this.flow_level&&\":\"===e&&(u=this.peek(s+1),c.call(n+l+\"\\0\",u)>=0)||0!==this.flow_level&&c.call(\",:?[]{}\",e)>=0)break;s++}if(0!==this.flow_level&&\":\"===e&&(p=this.peek(s+1),c.call(n+l+\"\\0,[]{}\",p)<0))throw this.forward(s),new t.ScannerError(\"while scanning a plain scalar\",h,\"found unexpected ':'\",this.get_mark(),\"Please check http://pyyaml.org/wiki/YAMLColonInFlowContext\");if(0===s)break;if(this.allow_simple_key=!1,r=r.concat(f),r.push(this.prefix(s)),this.forward(s),o=this.get_mark(),f=this.scan_plain_spaces(a,h),null==f||0===f.length||\"#\"===this.peek()||0===this.flow_level&&this.column<a)break}return new i.ScalarToken(r.join(\"\"),!0,h,o)},e.prototype.scan_plain_spaces=function(e,t){var r,i,o,a,s,u,p,f,h,d,m;for(o=[],a=0;p=this.peek(a),c.call(\" \",p)>=0;)a++;if(m=this.prefix(a),this.forward(a),i=this.peek(),c.call(n,i)>=0){if(s=this.scan_line_break(),this.allow_simple_key=!0,u=this.prefix(3),\"---\"===u||\"...\"===u&&(f=this.peek(3),c.call(n+l+\"\\0\",f)>=0))return;for(r=[];d=this.peek(),c.call(n+\" \",d)>=0;)if(\" \"===this.peek())this.forward();else if(r.push(this.scan_line_break()),u=this.prefix(3),\"---\"===u||\"...\"===u&&(h=this.peek(3),c.call(n+l+\"\\0\",h)>=0))return;\"\\n\"!==s?o.push(s):0===r.length&&o.push(\" \"),o=o.concat(r)}else m&&o.push(m);return o},e.prototype.scan_tag_handle=function(e,n){var r,i,o;if(r=this.peek(),\"!\"!==r)throw new t.ScannerError(\"while scanning a \"+e,n,\"expected '!' but found \"+r,this.get_mark());if(i=1,r=this.peek(i),\" \"!==r){for(;\"0\"<=r&&r<=\"9\"||\"A\"<=r&&r<=\"Z\"||\"a\"<=r&&r<=\"z\"||c.call(\"-_\",r)>=0;)i++,r=this.peek(i);if(\"!\"!==r)throw this.forward(i),new t.ScannerError(\"while scanning a \"+e,n,\"expected '!' but found \"+r,this.get_mark());i++}return o=this.prefix(i),this.forward(i),o},e.prototype.scan_tag_uri=function(e,n){var r,i,o;for(i=[],o=0,r=this.peek(o);\"0\"<=r&&r<=\"9\"||\"A\"<=r&&r<=\"Z\"||\"a\"<=r&&r<=\"z\"||c.call(\"-;/?:@&=+$,_.!~*'()[]%\",r)>=0;)\"%\"===r?(i.push(this.prefix(o)),this.forward(o),o=0,i.push(this.scan_uri_escapes(e,n))):o++,r=this.peek(o);if(0!==o&&(i.push(this.prefix(o)),this.forward(o),o=0),0===i.length)throw new t.ScannerError(\"while parsing a \"+e,n,\"expected URI but found \"+r,this.get_mark());return i.join(\"\")},e.prototype.scan_uri_escapes=function(e,n){var r,i,o,a;for(r=[],a=this.get_mark();\"%\"===this.peek();){for(this.forward(),o=i=0;i<=2;o=++i)throw new t.ScannerError(\"while scanning a \"+e,n,\"expected URI escape sequence of 2 hexadecimal numbers but found \"+this.peek(o),this.get_mark());r.push(String.fromCharCode(parseInt(this.prefix(2),16))),this.forward(2)}return r.join(\"\")},e.prototype.scan_line_break=function(){var e;return e=this.peek(),c.call(\"\\r\\n\",e)>=0?(\"\\r\\n\"===this.prefix(2)?this.forward(2):this.forward(),\"\\n\"):c.call(\"\\u2028\\u2029\",e)>=0?(this.forward(),e):\"\"},e}()}).call(this)},function(e,t){(function(){var e=function(e,n){function r(){this.constructor=e}for(var i in n)t.call(n,i)&&(e[i]=n[i]);return r.prototype=n.prototype,e.prototype=new r,e.__super__=n.prototype,e},t={}.hasOwnProperty;this.Token=function(){function e(e,t){this.start_mark=e,this.end_mark=t}return e}(),this.DirectiveToken=function(t){function n(e,t,n,r){this.name=e,this.value=t,this.start_mark=n,this.end_mark=r}return e(n,t),n.prototype.id=\"<directive>\",n}(this.Token),this.DocumentStartToken=function(t){function n(){return n.__super__.constructor.apply(this,arguments)}return e(n,t),n.prototype.id=\"<document start>\",n}(this.Token),this.DocumentEndToken=function(t){function n(){return n.__super__.constructor.apply(this,arguments)}return e(n,t),n.prototype.id=\"<document end>\",n}(this.Token),this.StreamStartToken=function(t){function n(e,t,n){this.start_mark=e,this.end_mark=t,this.encoding=n}return e(n,t),n.prototype.id=\"<stream start>\",n}(this.Token),this.StreamEndToken=function(t){function n(){return n.__super__.constructor.apply(this,arguments)}return e(n,t),n.prototype.id=\"<stream end>\",n}(this.Token),this.BlockSequenceStartToken=function(t){function n(){return n.__super__.constructor.apply(this,arguments)}return e(n,t),n.prototype.id=\"<block sequence start>\",n}(this.Token),this.BlockMappingStartToken=function(t){function n(){return n.__super__.constructor.apply(this,arguments)}return e(n,t),n.prototype.id=\"<block mapping end>\",n}(this.Token),this.BlockEndToken=function(t){function n(){return n.__super__.constructor.apply(this,arguments)}return e(n,t),n.prototype.id=\"<block end>\",n}(this.Token),this.FlowSequenceStartToken=function(t){function n(){return n.__super__.constructor.apply(this,arguments)}return e(n,t),n.prototype.id=\"[\",n}(this.Token),this.FlowMappingStartToken=function(t){function n(){return n.__super__.constructor.apply(this,arguments)}return e(n,t),n.prototype.id=\"{\",n}(this.Token),this.FlowSequenceEndToken=function(t){function n(){return n.__super__.constructor.apply(this,arguments)}return e(n,t),n.prototype.id=\"]\",n}(this.Token),this.FlowMappingEndToken=function(t){function n(){return n.__super__.constructor.apply(this,arguments)}return e(n,t),n.prototype.id=\"}\",n}(this.Token),this.KeyToken=function(t){function n(){return n.__super__.constructor.apply(this,arguments)}return e(n,t),n.prototype.id=\"?\",n}(this.Token),this.ValueToken=function(t){function n(){return n.__super__.constructor.apply(this,arguments)}return e(n,t),n.prototype.id=\":\",n}(this.Token),this.BlockEntryToken=function(t){function n(){return n.__super__.constructor.apply(this,arguments)}return e(n,t),n.prototype.id=\"-\",n}(this.Token),this.FlowEntryToken=function(t){function n(){return n.__super__.constructor.apply(this,arguments)}return e(n,t),n.prototype.id=\",\",n}(this.Token),this.AliasToken=function(t){function n(e,t,n){this.value=e,this.start_mark=t,this.end_mark=n}return e(n,t),n.prototype.id=\"<alias>\",n}(this.Token),this.AnchorToken=function(t){function n(e,t,n){this.value=e,this.start_mark=t,this.end_mark=n}return e(n,t),n.prototype.id=\"<anchor>\",n}(this.Token),this.TagToken=function(t){function n(e,t,n){this.value=e,this.start_mark=t,this.end_mark=n}return e(n,t),n.prototype.id=\"<tag>\",n}(this.Token),this.ScalarToken=function(t){function n(e,t,n,r,i){this.value=e,this.plain=t,this.start_mark=n,this.end_mark=r,this.style=i}return e(n,t),n.prototype.id=\"<scalar>\",n}(this.Token)}).call(this)},function(e,t,n){(function(){var e,r,i,o=function(e,t){function n(){this.constructor=e}for(var r in t)a.call(t,r)&&(e[r]=t[r]);return n.prototype=t.prototype,e.prototype=new n,e.__super__=t.prototype,e},a={}.hasOwnProperty,s=[].slice;r=n(743),e=n(744).MarkedYAMLError,i=n(759),this.ParserError=function(e){function t(){return t.__super__.constructor.apply(this,arguments)}return o(t,e),t}(e),this.Parser=function(){function e(){this.current_event=null,this.yaml_version=null,this.tag_handles={},this.states=[],this.marks=[],this.state=\"parse_stream_start\"}var n;return n={\"!\":\"!\",\"!!\":\"tag:yaml.org,2002:\"},e.prototype.dispose=function(){return this.states=[],this.state=null},e.prototype.check_event=function(){var e,t,n,r;if(t=1<=arguments.length?s.call(arguments,0):[],null===this.current_event&&null!=this.state&&(this.current_event=this[this.state]()),null!==this.current_event){if(0===t.length)return!0;for(n=0,r=t.length;n<r;n++)if(e=t[n],this.current_event instanceof e)return!0}return!1},e.prototype.peek_event=function(){return null===this.current_event&&null!=this.state&&(this.current_event=this[this.state]()),this.current_event},e.prototype.get_event=function(){var e;return null===this.current_event&&null!=this.state&&(this.current_event=this[this.state]()),e=this.current_event,this.current_event=null,e},e.prototype.parse_stream_start=function(){var e,t;return t=this.get_token(),e=new r.StreamStartEvent(t.start_mark,t.end_mark),this.state=\"parse_implicit_document_start\",e},e.prototype.parse_implicit_document_start=function(){var e,t,o,a;return this.check_token(i.DirectiveToken,i.DocumentStartToken,i.StreamEndToken)?this.parse_document_start():(this.tag_handles=n,a=this.peek_token(),o=e=a.start_mark,t=new r.DocumentStartEvent(o,e,!1),this.states.push(\"parse_document_end\"),this.state=\"parse_block_node\",t)},e.prototype.parse_document_start=function(){for(var e,n,o,a,s,u,c;this.check_token(i.DocumentEndToken);)this.get_token();if(this.check_token(i.StreamEndToken)){if(u=this.get_token(),n=new r.StreamEndEvent(u.start_mark,u.end_mark),0!==this.states.length)throw new Error(\"assertion error, states should be empty\");if(0!==this.marks.length)throw new Error(\"assertion error, marks should be empty\");this.state=null}else{if(a=this.peek_token().start_mark,o=this.process_directives(),c=o[0],s=o[1],!this.check_token(i.DocumentStartToken))throw new t.ParserError(\"expected '<document start>', but found \"+this.peek_token().id,this.peek_token().start_mark);u=this.get_token(),e=u.end_mark,n=new r.DocumentStartEvent(a,e,!0,c,s),this.states.push(\"parse_document_end\"),this.state=\"parse_document_content\"}return n},e.prototype.parse_document_end=function(){var e,t,n,o,a;return a=this.peek_token(),o=e=a.start_mark,n=!1,this.check_token(i.DocumentEndToken)&&(a=this.get_token(),e=a.end_mark,n=!0),t=new r.DocumentEndEvent(o,e,n),this.state=\"parse_document_start\",t},e.prototype.parse_document_content=function(){var e;return this.check_token(i.DirectiveToken,i.DocumentStartToken,i.DocumentEndToken,i.StreamEndToken)?(e=this.process_empty_scalar(this.peek_token().start_mark),this.state=this.states.pop(),e):this.parse_block_node()},e.prototype.process_directives=function(){var e,r,o,s,u,c,l,p,f,h;for(this.yaml_version=null,this.tag_handles={};this.check_token(i.DirectiveToken);)if(f=this.get_token(),\"YAML\"===f.name){if(null!==this.yaml_version)throw new t.ParserError(null,null,\"found duplicate YAML directive\",f.start_mark);if(u=f.value,r=u[0],o=u[1],1!==r)throw new t.ParserError(null,null,\"found incompatible YAML document (version 1.* is required)\",f.start_mark);this.yaml_version=f.value}else if(\"TAG\"===f.name){if(c=f.value,e=c[0],s=c[1],e in this.tag_handles)throw new t.ParserError(null,null,\"duplicate tag handle \"+e,f.start_mark);this.tag_handles[e]=s}p=null,l=this.tag_handles;for(e in l)a.call(l,e)&&(s=l[e],null==p&&(p={}),p[e]=s);h=[this.yaml_version,p];for(e in n)a.call(n,e)&&(s=n[e],s in this.tag_handles||(this.tag_handles[e]=s));return h},e.prototype.parse_block_node=function(){return this.parse_node(!0)},e.prototype.parse_flow_node=function(){return this.parse_node()},e.prototype.parse_block_node_or_indentless_sequence=function(){return this.parse_node(!0,!0)},e.prototype.parse_node=function(e,n){var o,a,s,u,c,l,p,f,h,d,m;if(null==e&&(e=!1),null==n&&(n=!1),this.check_token(i.AliasToken))m=this.get_token(),s=new r.AliasEvent(m.value,m.start_mark,m.end_mark),this.state=this.states.pop();else{if(o=null,h=null,p=a=d=null,this.check_token(i.AnchorToken)?(m=this.get_token(),p=m.start_mark,a=m.end_mark,o=m.value,this.check_token(i.TagToken)&&(m=this.get_token(),d=m.start_mark,a=m.end_mark,h=m.value)):this.check_token(i.TagToken)&&(m=this.get_token(),p=d=m.start_mark,a=m.end_mark,h=m.value,this.check_token(i.AnchorToken)&&(m=this.get_token(),a=m.end_mark,o=m.value)),null!==h)if(u=h[0],f=h[1],null!==u){if(!(u in this.tag_handles))throw new t.ParserError(\"while parsing a node\",p,\"found undefined tag handle \"+u,d);h=this.tag_handles[u]+f}else h=f;if(null===p&&(p=a=this.peek_token().start_mark),s=null,c=null===h||\"!\"===h,n&&this.check_token(i.BlockEntryToken))a=this.peek_token().end_mark,s=new r.SequenceStartEvent(o,h,c,p,a),this.state=\"parse_indentless_sequence_entry\";else if(this.check_token(i.ScalarToken))m=this.get_token(),a=m.end_mark,c=m.plain&&null===h||\"!\"===h?[!0,!1]:null===h?[!1,!0]:[!1,!1],s=new r.ScalarEvent(o,h,c,m.value,p,a,m.style),this.state=this.states.pop();else if(this.check_token(i.FlowSequenceStartToken))a=this.peek_token().end_mark,s=new r.SequenceStartEvent(o,h,c,p,a,!0),this.state=\"parse_flow_sequence_first_entry\";else if(this.check_token(i.FlowMappingStartToken))a=this.peek_token().end_mark,s=new r.MappingStartEvent(o,h,c,p,a,!0),this.state=\"parse_flow_mapping_first_key\";else if(e&&this.check_token(i.BlockSequenceStartToken))a=this.peek_token().end_mark,s=new r.SequenceStartEvent(o,h,c,p,a,!1),this.state=\"parse_block_sequence_first_entry\";else if(e&&this.check_token(i.BlockMappingStartToken))a=this.peek_token().end_mark,s=new r.MappingStartEvent(o,h,c,p,a,!1),this.state=\"parse_block_mapping_first_key\";else{if(null===o&&null===h)throw l=e?\"block\":\"flow\",m=this.peek_token(),new t.ParserError(\"while parsing a \"+l+\" node\",p,\"expected the node content, but found \"+m.id,m.start_mark);s=new r.ScalarEvent(o,h,[c,!1],\"\",p,a),this.state=this.states.pop()}}return s},e.prototype.parse_block_sequence_first_entry=function(){var e;return e=this.get_token(),this.marks.push(e.start_mark),this.parse_block_sequence_entry()},e.prototype.parse_block_sequence_entry=function(){var e,n;if(this.check_token(i.BlockEntryToken))return n=this.get_token(),this.check_token(i.BlockEntryToken,i.BlockEndToken)?(this.state=\"parse_block_sequence_entry\",this.process_empty_scalar(n.end_mark)):(this.states.push(\"parse_block_sequence_entry\"),this.parse_block_node());if(!this.check_token(i.BlockEndToken))throw n=this.peek_token(),new t.ParserError(\"while parsing a block collection\",this.marks.slice(-1)[0],\"expected <block end>, but found \"+n.id,n.start_mark);return n=this.get_token(),e=new r.SequenceEndEvent(n.start_mark,n.end_mark),this.state=this.states.pop(),this.marks.pop(),e},e.prototype.parse_indentless_sequence_entry=function(){var e,t;return this.check_token(i.BlockEntryToken)?(t=this.get_token(),this.check_token(i.BlockEntryToken,i.KeyToken,i.ValueToken,i.BlockEndToken)?(this.state=\"parse_indentless_sequence_entry\",this.process_empty_scalar(t.end_mark)):(this.states.push(\"parse_indentless_sequence_entry\"),this.parse_block_node())):(t=this.peek_token(),e=new r.SequenceEndEvent(t.start_mark,t.start_mark),this.state=this.states.pop(),e)},e.prototype.parse_block_mapping_first_key=function(){var e;return e=this.get_token(),this.marks.push(e.start_mark),this.parse_block_mapping_key()},e.prototype.parse_block_mapping_key=function(){var e,n;if(this.check_token(i.KeyToken))return n=this.get_token(),this.check_token(i.KeyToken,i.ValueToken,i.BlockEndToken)?(this.state=\"parse_block_mapping_value\",this.process_empty_scalar(n.end_mark)):(this.states.push(\"parse_block_mapping_value\"),this.parse_block_node_or_indentless_sequence());if(!this.check_token(i.BlockEndToken))throw n=this.peek_token(),new t.ParserError(\"while parsing a block mapping\",this.marks.slice(-1)[0],\"expected <block end>, but found \"+n.id,n.start_mark);return n=this.get_token(),e=new r.MappingEndEvent(n.start_mark,n.end_mark),this.state=this.states.pop(),this.marks.pop(),e},e.prototype.parse_block_mapping_value=function(){var e;return this.check_token(i.ValueToken)?(e=this.get_token(),this.check_token(i.KeyToken,i.ValueToken,i.BlockEndToken)?(this.state=\"parse_block_mapping_key\",this.process_empty_scalar(e.end_mark)):(this.states.push(\"parse_block_mapping_key\"),this.parse_block_node_or_indentless_sequence())):(this.state=\"parse_block_mapping_key\",e=this.peek_token(),this.process_empty_scalar(e.start_mark))},e.prototype.parse_flow_sequence_first_entry=function(){var e;return e=this.get_token(),this.marks.push(e.start_mark),this.parse_flow_sequence_entry(!0)},e.prototype.parse_flow_sequence_entry=function(e){var n,o;if(null==e&&(e=!1),!this.check_token(i.FlowSequenceEndToken)){if(!e){if(!this.check_token(i.FlowEntryToken))throw o=this.peek_token(),new t.ParserError(\"while parsing a flow sequence\",this.marks.slice(-1)[0],\"expected ',' or ']', but got \"+o.id,o.start_mark);this.get_token()}if(this.check_token(i.KeyToken))return o=this.peek_token(),n=new r.MappingStartEvent(null,null,!0,o.start_mark,o.end_mark,!0),this.state=\"parse_flow_sequence_entry_mapping_key\",n;if(!this.check_token(i.FlowSequenceEndToken))return this.states.push(\"parse_flow_sequence_entry\"),this.parse_flow_node()}return o=this.get_token(),n=new r.SequenceEndEvent(o.start_mark,o.end_mark),this.state=this.states.pop(),this.marks.pop(),n},e.prototype.parse_flow_sequence_entry_mapping_key=function(){var e;return e=this.get_token(),this.check_token(i.ValueToken,i.FlowEntryToken,i.FlowSequenceEndToken)?(this.state=\"parse_flow_sequence_entry_mapping_value\",this.process_empty_scalar(e.end_mark)):(this.states.push(\"parse_flow_sequence_entry_mapping_value\"),this.parse_flow_node())},e.prototype.parse_flow_sequence_entry_mapping_value=function(){var e;return this.check_token(i.ValueToken)?(e=this.get_token(),this.check_token(i.FlowEntryToken,i.FlowSequenceEndToken)?(this.state=\"parse_flow_sequence_entry_mapping_end\",this.process_empty_scalar(e.end_mark)):(this.states.push(\"parse_flow_sequence_entry_mapping_end\"),this.parse_flow_node())):(this.state=\"parse_flow_sequence_entry_mapping_end\",e=this.peek_token(),this.process_empty_scalar(e.start_mark))},e.prototype.parse_flow_sequence_entry_mapping_end=function(){var e;return this.state=\"parse_flow_sequence_entry\",e=this.peek_token(),new r.MappingEndEvent(e.start_mark,e.start_mark)},e.prototype.parse_flow_mapping_first_key=function(){var e;return e=this.get_token(),this.marks.push(e.start_mark),this.parse_flow_mapping_key(!0)},e.prototype.parse_flow_mapping_key=function(e){var n,o;if(null==e&&(e=!1),!this.check_token(i.FlowMappingEndToken)){if(!e){if(!this.check_token(i.FlowEntryToken))throw o=this.peek_token(),new t.ParserError(\"while parsing a flow mapping\",this.marks.slice(-1)[0],\"expected ',' or '}', but got \"+o.id,o.start_mark);this.get_token()}if(this.check_token(i.KeyToken))return o=this.get_token(),this.check_token(i.ValueToken,i.FlowEntryToken,i.FlowMappingEndToken)?(this.state=\"parse_flow_mapping_value\",this.process_empty_scalar(o.end_mark)):(this.states.push(\"parse_flow_mapping_value\"),this.parse_flow_node());if(!this.check_token(i.FlowMappingEndToken))return this.states.push(\"parse_flow_mapping_empty_value\"),this.parse_flow_node()}return o=this.get_token(),n=new r.MappingEndEvent(o.start_mark,o.end_mark),this.state=this.states.pop(),this.marks.pop(),n},e.prototype.parse_flow_mapping_value=function(){var e;return this.check_token(i.ValueToken)?(e=this.get_token(),this.check_token(i.FlowEntryToken,i.FlowMappingEndToken)?(this.state=\"parse_flow_mapping_key\",this.process_empty_scalar(e.end_mark)):(this.states.push(\"parse_flow_mapping_key\"),this.parse_flow_node())):(this.state=\"parse_flow_mapping_key\",e=this.peek_token(),this.process_empty_scalar(e.start_mark))},e.prototype.parse_flow_mapping_empty_value=function(){return this.state=\"parse_flow_mapping_key\",this.process_empty_scalar(this.peek_token().start_mark)},e.prototype.process_empty_scalar=function(e){return new r.ScalarEvent(null,null,[!0,!1],\"\",e,e)},e}()}).call(this)},function(e,t,n){\"use strict\";function r(e){return e&&e.__esModule?e:{default:e}}Object.defineProperty(t,\"__esModule\",{value:!0});var i=n(486),o=r(i),a=n(145),s=r(a),u=n(146),c=r(u),l=n(489),p=r(l),f=n(490),h=r(f),d=n(498),m=r(d),v=function(e){function t(){return(0,s.default)(this,t),(0,p.default)(this,(t.__proto__||(0,o.default)(t)).apply(this,arguments))}return(0,h.default)(t,e),(0,c.default)(t,[{key:\"render\",value:function(){return null}}]),t}(m.default.Component);t.default=v},function(e,t,n){\"use strict\";function r(e){return e&&e.__esModule?e:{default:e}}var i=n(763),o=r(i);e.exports=function(e){var t=e.configs;return{fn:{fetch:o.default.makeHttp(t.preFetch,t.postFetch),buildRequest:o.default.buildRequest,execute:o.default.execute,resolve:o.default.resolve,serializeRes:o.default.serializeRes,opId:o.default.helpers.opId}}}},function(e,t,n){\ne.exports=function(e){function t(r){if(n[r])return n[r].exports;var i=n[r]={i:r,l:!1,exports:{}};return e[r].call(i.exports,i,i.exports,t),i.l=!0,i.exports}var n={};return t.m=e,t.c=n,t.i=function(e){return e},t.d=function(e,n,r){t.o(e,n)||Object.defineProperty(e,n,{configurable:!1,enumerable:!0,get:r})},t.n=function(e){var n=e&&e.__esModule?function(){return e.default}:function(){return e};return t.d(n,\"a\",n),n},t.o=function(e,t){return Object.prototype.hasOwnProperty.call(e,t)},t.p=\"\",t(t.s=46)}([function(e,t){e.exports=n(60)},function(e,t){e.exports=n(141)},function(e,t,n){\"use strict\";function r(e){return e&&e.__esModule?e:{default:e}}function i(e,t){var n=arguments.length>2&&void 0!==arguments[2]?arguments[2]:\"\";return(e.operationId||\"\").replace(/\\s/g,\"\").length?b(e.operationId):o(t,n)}function o(e,t){return\"\"+_(t)+b(e)}function a(e,t){return _(t)+\"-\"+e}function s(e,t){return e&&e.paths?u(e,function(e){var n=e.pathName,r=e.method,o=e.operation;if(!o||\"object\"!==(void 0===o?\"undefined\":(0,v.default)(o)))return!1;var s=o.operationId;return[i(o,n,r),a(n,r),s].some(function(e){return e&&e===t})}):null}function u(e,t){return c(e,t,!0)||null}function c(e,t,n){if(!e||\"object\"!==(void 0===e?\"undefined\":(0,v.default)(e))||!e.paths||\"object\"!==(0,v.default)(e.paths))return null;var r=e.paths;for(var i in r)for(var o in r[i])if(\"PARAMETERS\"!==o.toUpperCase()){var a=r[i][o];if(a&&\"object\"===(void 0===a?\"undefined\":(0,v.default)(a))){var s={spec:e,pathName:i,method:o.toUpperCase(),operation:a},u=t(s);if(n&&u)return s}}}function l(e){var t=e.spec,n=t.paths,r={};if(!n)return e;for(var o in n){var a=n[o];if((0,g.default)(a)){var s=a.parameters;for(var u in a)!function(e){var n=a[e];if(!(0,g.default)(n))return\"continue\";var u=i(n,o,e);if(u&&(r[u]?r[u].push(n):r[u]=[n],(0,d.default)(r).forEach(function(e){if(r[e].length>1)r[e].forEach(function(t,n){t.__originalOperationId=t.__originalOperationId||t.operationId,t.operationId=\"\"+e+(n+1)});else if(void 0!==n.operationId){var t=r[e][0];t.__originalOperationId=t.__originalOperationId||n.operationId,t.operationId=e}})),\"parameters\"!==e){var c=[],l={};for(var p in t)\"produces\"!==p&&\"consumes\"!==p&&\"security\"!==p||(l[p]=t[p],c.push(l));if(s&&(l.parameters=s,c.push(l)),c.length){var h=!0,m=!1,v=void 0;try{for(var y,_=(0,f.default)(c);!(h=(y=_.next()).done);h=!0){var b=y.value;for(var x in b)if(n[x]){if(\"parameters\"===x){var w=!0,k=!1,S=void 0;try{for(var E,C=(0,f.default)(b[x]);!(w=(E=C.next()).done);w=!0)!function(){var e=E.value;n[x].some(function(t){return t.name===e.name})||n[x].push(e)}()}catch(e){k=!0,S=e}finally{try{!w&&C.return&&C.return()}finally{if(k)throw S}}}}else n[x]=b[x]}}catch(e){m=!0,v=e}finally{try{!h&&_.return&&_.return()}finally{if(m)throw v}}}}}(u)}}return e}Object.defineProperty(t,\"__esModule\",{value:!0});var p=n(11),f=r(p),h=n(0),d=r(h),m=n(5),v=r(m);t.opId=i,t.idFromPathMethod=o,t.legacyIdFromPathMethod=a,t.getOperationRaw=s,t.findOperation=u,t.eachOperation=c,t.normalizeSwagger=l;var y=n(41),g=r(y),_=function(e){return String.prototype.toLowerCase.call(e)},b=function(e){return e.replace(/[^\\w]/gi,\"_\")}},function(e,t,n){\"use strict\";function r(e){return e&&e.__esModule?e:{default:e}}function i(e,t,n){if(n=n||{},t=(0,q.default)({},t,{path:t.path&&o(t.path)}),\"merge\"===t.op){var r=s(t.path);W.default.apply(e,[r]),(0,q.default)(r.value,t.value)}else if(\"mergeDeep\"===t.op){var i=s(t.path);W.default.apply(e,[i]),(0,J.default)(i.value,t.value)}else if(W.default.apply(e,[t]),n.allowMetaPatches&&t.meta&&O(t)&&(Array.isArray(t.value)||S(t.value))){var a=s(t.path);W.default.apply(e,[a]),(0,q.default)(a.value,t.meta)}return e}function o(e){return Array.isArray(e)?e.length<1?\"\":\"/\"+e.map(function(e){return(e+\"\").replace(/~/g,\"~0\").replace(/\\//g,\"~1\")}).join(\"/\"):e}function a(e,t){return{op:\"add\",path:e,value:t}}function s(e){return{op:\"_get\",path:e}}function u(e,t,n){return{op:\"replace\",path:e,value:t,meta:n}}function c(e,t){return{op:\"remove\",path:e}}function l(e,t){return{type:\"mutation\",op:\"merge\",path:e,value:t}}function p(e,t){return{type:\"mutation\",op:\"mergeDeep\",path:e,value:t}}function f(e,t){return{type:\"context\",path:e,value:t}}function h(e,t){try{return m(e,y,t)}catch(e){return e}}function d(e,t){try{return m(e,v,t)}catch(e){return e}}function m(e,t,n){return k(w(e.filter(O).map(function(e){return t(e.value,n,e.path)})||[]))}function v(e,t,n){return n=n||[],Array.isArray(e)?e.map(function(e,r){return v(e,t,n.concat(r))}):S(e)?(0,L.default)(e).map(function(r){return v(e[r],t,n.concat(r))}):t(e,n[n.length-1],n)}function y(e,t,n){n=n||[];var r=[];if(n.length>0){var i=t(e,n[n.length-1],n);i&&(r=r.concat(i))}if(Array.isArray(e)){var o=e.map(function(e,r){return y(e,t,n.concat(r))});o&&(r=r.concat(o))}else if(S(e)){var a=(0,L.default)(e).map(function(r){return y(e[r],t,n.concat(r))});a&&(r=r.concat(a))}return r=w(r)}function g(e,t){if(!Array.isArray(t))return!1;for(var n=0,r=t.length;n<r;n++)if(t[n]!==e[n])return!1;return!0}function _(e,t){return t.reduce(function(e,t){return void 0!==t&&e?e[t]:e},e)}function b(e){return k(w(x(e)))}function x(e){return Array.isArray(e)?e:[e]}function w(e){var t;return(t=[]).concat.apply(t,(0,F.default)(e.map(function(e){return Array.isArray(e)?w(e):e})))}function k(e){return e.filter(function(e){return void 0!==e})}function S(e){return e&&\"object\"===(void 0===e?\"undefined\":(0,R.default)(e))}function E(e){return S(e)&&C(e.then)}function C(e){return e&&\"function\"==typeof e}function A(e){return e instanceof Error}function T(e){if(I(e)){var t=e.op;return\"add\"===t||\"remove\"===t||\"replace\"===t}return!1}function D(e){return V.default.isGeneratorFunction(e)}function M(e){return T(e)||I(e)&&\"mutation\"===e.type}function O(e){return M(e)&&(\"add\"===e.op||\"replace\"===e.op||\"merge\"===e.op||\"mergeDeep\"===e.op)}function P(e){return I(e)&&\"context\"===e.type}function I(e){return e&&\"object\"===(void 0===e?\"undefined\":(0,R.default)(e))}Object.defineProperty(t,\"__esModule\",{value:!0});var N=n(5),R=r(N),j=n(31),F=r(j),B=n(0),L=r(B),z=n(1),q=r(z),U=n(34),W=r(U),K=n(15),V=r(K),H=n(33),J=r(H);t.default={add:a,replace:u,remove:c,merge:l,mergeDeep:p,context:f,getIn:_,applyPatch:i,parentPathMatch:g,flatten:w,fullyNormalizeArray:b,normalizeArray:x,isPromise:E,forEachNew:h,forEachNewPrimitive:d,isJsonPatch:T,isContextPatch:P,isPatch:I,isMutation:M,isAdditiveMutation:O,isGenerator:D,isFunction:C,isObject:S,isError:A}},function(e,t){e.exports=n(446)},function(e,t){e.exports=n(94)},function(e,t,n){\"use strict\";function r(e){return e&&e.__esModule?e:{default:e}}function i(e){var t=arguments.length>1&&void 0!==arguments[1]?arguments[1]:{};return\"object\"===(void 0===e?\"undefined\":(0,b.default)(e))&&(t=e,e=t.url),t.headers=t.headers||{},T.mergeInQueryOrForm(t),t.requestInterceptor&&(t=t.requestInterceptor(t)||t),/multipart\\/form-data/i.test(t.headers[\"content-type\"]||t.headers[\"Content-Type\"])&&(delete t.headers[\"content-type\"],delete t.headers[\"Content-Type\"]),fetch(t.url,t).then(function(n){var r=T.serializeRes(n,e,t).then(function(e){return t.responseInterceptor&&(e=t.responseInterceptor(e)||e),e});if(!n.ok){var i=new Error(n.statusText);return i.statusCode=i.status=n.status,r.then(function(e){throw i.response=e,i},function(e){throw i.responseError=e,i})}return r})}function o(e){return/json/.test(e)||/xml/.test(e)||/yaml/.test(e)||/text/.test(e)}function a(e,t){var n=arguments.length>2&&void 0!==arguments[2]?arguments[2]:{},r=n.loadSpec,i=void 0!==r&&r,a={ok:e.ok,url:e.url||t,status:e.status,statusText:e.statusText,headers:s(e.headers)},u=i||o(a.headers[\"content-type\"]);return(u?e.text:e.blob||e.buffer).call(e).then(function(e){if(a.text=e,a.data=e,u)try{var t=S.default.safeLoad(e);a.body=t,a.obj=t}catch(e){a.parseError=e}return a})}function s(){var e=arguments.length>0&&void 0!==arguments[0]?arguments[0]:{},t={};return\"function\"==typeof e.forEach?(e.forEach(function(e,n){void 0!==t[n]?(t[n]=Array.isArray(t[n])?t[n]:[t[n]],t[n].push(e)):t[n]=e}),t):t}function u(e){return\"undefined\"!=typeof File?e instanceof File:null!==e&&\"object\"===(void 0===e?\"undefined\":(0,b.default)(e))&&\"function\"==typeof e.pipe}function c(e,t){var n=e.value,r=e.collectionFormat,i=e.allowEmptyValue,o={csv:\",\",ssv:\"%20\",tsv:\"%09\",pipes:\"|\"};if(void 0===n&&i)return\"\";if(u(n))return n;var a=encodeURIComponent;return t&&(a=(0,A.default)(n)?function(e){return e}:function(e){return(0,g.default)(e)}),n&&!Array.isArray(n)?a(n):Array.isArray(n)&&!r?n.map(a).join(\",\"):\"multi\"===r?n.map(a):n.map(a).join(o[r])}function l(e){var t=(0,v.default)(e).reduce(function(t,n){var r=e[n],i=encodeURIComponent(n),o=function(e){return e&&\"object\"===(void 0===e?\"undefined\":(0,b.default)(e))}(r)&&!Array.isArray(r);return t[i]=c(o?r:{value:r}),t},{});return w.default.stringify(t,{encode:!1,indices:!1})||\"\"}function p(){var e=arguments.length>0&&void 0!==arguments[0]?arguments[0]:{},t=e.url,r=void 0===t?\"\":t,i=e.query,o=e.form;if(o){var a=(0,v.default)(o).some(function(e){return u(o[e].value)}),s=e.headers[\"content-type\"]||e.headers[\"Content-Type\"];if(a||/multipart\\/form-data/i.test(s)){var p=n(35);e.body=new p,(0,v.default)(o).forEach(function(t){e.body.append(t,c(o[t],!0))})}else e.body=l(o);delete e.form}if(i){var f=r.split(\"?\"),h=(0,d.default)(f,2),m=h[0],y=h[1],g=\"\";if(y){var _=w.default.parse(y);(0,v.default)(i).forEach(function(e){return delete _[e]}),g=w.default.stringify(_,{encode:!0})}var b=function(){for(var e=arguments.length,t=Array(e),n=0;n<e;n++)t[n]=arguments[n];var r=t.filter(function(e){return e}).join(\"&\");return r?\"?\"+r:\"\"}(g,l(i));e.url=m+b,delete e.query}return e}function f(e,t,n){return n=n||function(e){return e},t=t||function(e){return e},function(r){return\"string\"==typeof r&&(r={url:r}),T.mergeInQueryOrForm(r),r=t(r),n(e(r))}}Object.defineProperty(t,\"__esModule\",{value:!0}),t.self=void 0;var h=n(30),d=r(h),m=n(0),v=r(m),y=n(7),g=r(y),_=n(5),b=r(_);t.default=i,t.serializeRes=a,t.serializeHeaders=s,t.encodeFormOrQuery=l,t.mergeInQueryOrForm=p,t.makeHttp=f,n(16);var x=n(45),w=r(x),k=n(36),S=r(k),E=n(8),C=(r(E),n(43)),A=r(C),T=t.self={serializeRes:a,mergeInQueryOrForm:p}},function(e,t){e.exports=n(57)},function(e,t){e.exports=n(764)},function(e,t){e.exports=n(804)},function(e,t,n){\"use strict\";function r(e,t){function n(){Error.captureStackTrace?Error.captureStackTrace(this,this.constructor):this.stack=(new Error).stack;for(var e=arguments.length,n=Array(e),r=0;r<e;r++)n[r]=arguments[r];this.message=n[0],t&&t.apply(this,n)}return n.prototype=new Error,n.prototype.name=e,n.prototype.constructor=n,n}Object.defineProperty(t,\"__esModule\",{value:!0}),t.default=r},function(e,t){e.exports=n(178)},function(e,t){e.exports=n(730)},function(e,t){e.exports=n(145)},function(e,t){e.exports=n(146)},function(e,t){e.exports=n(810)},function(e,t){e.exports=n(813)},function(e,t,n){\"use strict\";function r(e){return e&&e.__esModule?e:{default:e}}function i(e){var t=this,n=arguments.length>1&&void 0!==arguments[1]?arguments[1]:{};if(\"string\"==typeof e?n.url=e:n=e,!(this instanceof i))return new i(n);(0,c.default)(this,n);var r=this.resolve().then(function(){return t.disableInterfaces||(0,c.default)(t,i.makeApisTagOperation(t)),t});return r.client=this,r}var o=n(4),a=r(o),s=n(37),u=(r(s),n(8)),c=r(u),l=n(6),p=r(l),f=n(20),h=r(f),d=n(9),m=r(d),v=n(19),y=n(18),g=n(2);i.http=p.default,i.makeHttp=l.makeHttp.bind(null,i.http),i.resolve=h.default,i.execute=y.execute,i.serializeRes=l.serializeRes,i.serializeHeaders=l.serializeHeaders,i.clearCache=f.clearCache,i.parameterBuilders=y.PARAMETER_BUILDERS,i.makeApisTagOperation=v.makeApisTagOperation,i.buildRequest=y.buildRequest,i.helpers={opId:g.opId},e.exports=i,i.prototype={http:p.default,execute:function(e){return this.applyDefaults(),i.execute((0,a.default)({spec:this.spec,http:this.http.bind(this),securities:{authorized:this.authorizations}},e))},resolve:function(){var e=this;return i.resolve({spec:this.spec,url:this.url,allowMetaPatches:this.allowMetaPatches}).then(function(t){return e.originalSpec=e.spec,e.spec=t.spec,e.errors=t.errors,e})}},i.prototype.applyDefaults=function(){var e=this.spec,t=this.url;if(t&&t.startsWith(\"http\")){var n=m.default.parse(t);e.host||(e.host=n.host),e.schemes||(e.schemes=[n.protocol.replace(\":\",\"\")]),e.basePath||(e.basePath=\"/\")}}},function(e,t,n){\"use strict\";function r(e){return e&&e.__esModule?e:{default:e}}function i(e){var t=e.http,n=e.fetch,r=e.spec,i=e.operationId,o=e.pathName,a=e.method,s=e.parameters,u=e.securities,c=(0,b.default)(e,[\"http\",\"fetch\",\"spec\",\"operationId\",\"pathName\",\"method\",\"parameters\",\"securities\"]);t=t||n||R.default,o&&a&&!i&&(i=(0,j.legacyIdFromPathMethod)(o,a));var l=q.buildRequest((0,g.default)({spec:r,operationId:i,parameters:s,securities:u},c));return l.body&&((0,A.default)(l.body)||(0,D.default)(l.body))&&(l.body=(0,v.default)(l.body)),t(l)}function o(e){var t=e.spec,n=e.operationId,r=e.parameters,i=e.securities,o=e.requestContentType,a=e.responseContentType,s=e.parameterBuilders,u=e.scheme,c=e.requestInterceptor,l=e.responseInterceptor,h=e.contextUrl;s=s||U;var d={url:p({spec:t,scheme:u,contextUrl:h}),credentials:\"same-origin\",headers:{}};if(c&&(d.requestInterceptor=c),l&&(d.responseInterceptor=l),!n)return d;var m=(0,j.getOperationRaw)(t,n);if(!m)throw new z(\"Operation \"+n+\" not found\");var v=m.operation,y=void 0===v?{}:v,g=m.method,_=m.pathName;d.url+=_,d.method=(\"\"+g).toUpperCase(),r=r||{};var b=t.paths[_]||{};return a&&(d.headers.accept=a),L(y.parameters).concat(L(b.parameters)).forEach(function(e){var n=s[e.in],i=void 0;if(\"body\"===e.in&&e.schema&&e.schema.properties&&(i=r),i=e&&e.name&&r[e.name],void 0!==e.default&&void 0===i&&(i=e.default),void 0===i&&e.required&&!e.allowEmptyValue)throw new Error(\"Required parameter \"+e.name+\" is not provided\");n&&n({req:d,parameter:e,value:i,operation:y,spec:t})}),d=f({request:d,securities:i,operation:y,spec:t}),(d.body||d.form)&&(o?d.headers[\"content-type\"]=o:Array.isArray(y.consumes)?d.headers[\"content-type\"]=y.consumes[0]:Array.isArray(t.consumes)?d.headers[\"content-type\"]=t.consumes[0]:y.parameters.filter(function(e){return\"file\"===e.type}).length?d.headers[\"content-type\"]=\"multipart/form-data\":y.parameters.filter(function(e){return\"formData\"===e.in}).length&&(d.headers[\"content-type\"]=\"application/x-www-form-urlencoded\")),(0,N.mergeInQueryOrForm)(d),d}function a(e){var t=e.req,n=e.value;t.body=n}function s(e){var t=e.req,n=e.value,r=e.parameter;t.form=t.form||{},(n||r.allowEmptyValue)&&(t.form[r.name]={value:n,allowEmptyValue:r.allowEmptyValue,collectionFormat:r.collectionFormat})}function u(e){var t=e.req,n=e.parameter,r=e.value;t.headers=t.headers||{},void 0!==r&&(t.headers[n.name]=r)}function c(e){var t=e.req,n=e.value,r=e.parameter;t.url=t.url.replace(\"{\"+r.name+\"}\",encodeURIComponent(n))}function l(e){var t=e.req,n=e.value,r=e.parameter;if(t.query=t.query||{},!1===n&&\"boolean\"===r.type&&(n=\"false\"),n)t.query[r.name]={collectionFormat:r.collectionFormat,value:n};else if(r.allowEmptyValue){var i=r.name;t.query[i]=t.query[i]||{},t.query[i].allowEmptyValue=!0}}function p(e){var t=e.spec,n=e.scheme,r=e.contextUrl,i=void 0===r?\"\":r,o=I.default.parse(i),a=Array.isArray(t.schemes)?t.schemes[0]:null,s=n||a||W(o.protocol)||\"http\",u=t.host||o.host||\"\",c=t.basePath||\"\";if(s&&u){var l=s+\"://\"+(u+c);return\"/\"===l[l.length-1]?l.slice(0,-1):l}return\"\"}function f(e){var t=e.request,n=e.securities,r=void 0===n?{}:n,i=e.operation,o=void 0===i?{}:i,a=e.spec,s=(0,S.default)({},t),u=r.authorized,c=void 0===u?{}:u,l=r.specSecurity,p=void 0===l?[]:l,f=o.security||p,h=c&&!!(0,d.default)(c).length,m=a.securityDefinitions;return s.headers=s.headers||{},s.query=s.query||{},(0,d.default)(r).length&&h&&f&&(!Array.isArray(o.security)||o.security.length)?(f.forEach(function(e,t){for(var n in e){var r=c[n];if(r){var i=r.token,o=r.value||r,a=m[n],u=a.type,l=i&&i.access_token,p=i&&i.token_type;if(r)if(\"apiKey\"===u){var f=\"query\"===a.in?\"query\":\"headers\";s[f]=s[f]||{},s[f][a.name]=o}else\"basic\"===u?o.header?s.headers.authorization=o.header:(o.base64=(0,O.default)(o.username+\":\"+o.password),s.headers.authorization=\"Basic \"+o.base64):\"oauth2\"===u&&(s.headers.authorization=(p||\"Bearer\")+\" \"+l)}}}),s):t}Object.defineProperty(t,\"__esModule\",{value:!0}),t.PARAMETER_BUILDERS=t.self=void 0;var h=n(0),d=r(h),m=n(7),v=r(m),y=n(4),g=r(y),_=n(29),b=r(_),x=n(1),w=r(x);t.execute=i,t.buildRequest=o,t.bodyBuilder=a,t.formDataBuilder=s,t.headerBuilder=u,t.pathBuilder=c,t.queryBuilder=l,t.baseUrl=p,t.applySecurities=f;var k=n(8),S=r(k),E=n(39),C=(r(E),n(42)),A=r(C),T=n(40),D=r(T),M=n(32),O=r(M),P=n(9),I=r(P),N=n(6),R=r(N),j=n(2),F=n(10),B=r(F),L=function(e){return Array.isArray(e)?e:[]},z=(0,B.default)(\"OperationNotFoundError\",function(e,t,n){this.originalError=n,(0,w.default)(this,t||{})}),q=t.self={buildRequest:o},U=t.PARAMETER_BUILDERS={body:a,header:u,query:l,path:c,formData:s},W=function(e){return e?e.replace(/\\W/g,\"\"):null}},function(e,t,n){\"use strict\";function r(e){return e&&e.__esModule?e:{default:e}}function i(){var e=arguments.length>0&&void 0!==arguments[0]?arguments[0]:{};return function(t){var n=t.pathName,r=t.method,i=t.operationId;return function(t){var o=arguments.length>1&&void 0!==arguments[1]?arguments[1]:{};return e.execute((0,c.default)({spec:e.spec},(0,p.default)(e,\"requestInterceptor\",\"responseInterceptor\"),{pathName:n,method:r,parameters:t,operationId:i},o))}}}function o(){var e=arguments.length>0&&void 0!==arguments[0]?arguments[0]:{},t=m.makeExecute(e),n=m.mapTagOperations({spec:e.spec,cb:t}),r={};for(var i in n){r[i]={operations:{}};for(var o in n[i])r[i].operations[o]={execute:n[i][o]}}return{apis:r}}function a(){var e=arguments.length>0&&void 0!==arguments[0]?arguments[0]:{},t=m.makeExecute(e);return{apis:m.mapTagOperations({spec:e.spec,cb:t})}}function s(e){var t=e.spec,n=e.cb,r=void 0===n?h:n,i=e.defaultTag,o=void 0===i?\"default\":i,a={},s={};return(0,f.eachOperation)(t,function(e){var n=e.pathName,i=e.method,u=e.operation;(u.tags?d(u.tags):[o]).forEach(function(e){if(\"string\"==typeof e){var o=s[e]=s[e]||{},c=(0,f.opId)(u,n,i),l=r({spec:t,pathName:n,method:i,operation:u,operationId:c});if(a[c])a[c]=a[c]+1,o[\"\"+c+a[c]]=l;else if(void 0!==o[c]){var p=a[c]||1;a[c]=p+1,o[\"\"+c+a[c]]=l;var h=o[c];delete o[c],o[\"\"+c+p]=h}else o[c]=l}})}),s}Object.defineProperty(t,\"__esModule\",{value:!0}),t.self=void 0;var u=n(4),c=r(u);t.makeExecute=i,t.makeApisTagOperationsOperationExecute=o,t.makeApisTagOperation=a,t.mapTagOperations=s;var l=n(44),p=r(l),f=n(2),h=function(){return null},d=function(e){return Array.isArray(e)?e:[e]},m=t.self={mapTagOperations:s,makeExecute:i}},function(e,t,n){\"use strict\";function r(e){return e&&e.__esModule?e:{default:e}}function i(e){return function(t){return e({url:t,loadSpec:!0,headers:{Accept:\"application/json\"},credentials:\"same-origin\"}).then(function(e){return e.body})}}function o(){c.plugins.refs.clearCache()}function a(e){function t(e){s&&(c.plugins.refs.docCache[s]=e),c.plugins.refs.fetchJSON=i(n);var t=[c.plugins.refs];return\"function\"==typeof v&&t.push(c.plugins.parameters),\"function\"==typeof m&&t.push(c.plugins.properties),\"strict\"!==f&&t.push(c.plugins.allOf),(0,l.default)({spec:e,context:{baseDoc:s},plugins:t,allowMetaPatches:d,parameterMacro:v,modelPropertyMacro:m}).then(p.normalizeSwagger)}var n=e.http,r=e.fetch,o=e.spec,a=e.url,s=e.baseDoc,f=e.mode,h=e.allowMetaPatches,d=void 0===h||h,m=e.modelPropertyMacro,v=e.parameterMacro;return s=s||a,n=r||n||u.default,o?t(o):i(n)(s).then(t)}Object.defineProperty(t,\"__esModule\",{value:!0}),t.makeFetchJSON=i,t.clearCache=o,t.default=a;var s=n(6),u=r(s),c=n(21),l=r(c),p=n(2)},function(e,t,n){\"use strict\";function r(e){return e&&e.__esModule?e:{default:e}}function i(e){return new F(e).dispatch()}Object.defineProperty(t,\"__esModule\",{value:!0}),t.plugins=t.SpecMap=void 0;var o=n(7),a=r(o),s=n(12),u=r(s),c=n(15),l=r(c),p=n(0),f=r(p),h=n(11),d=r(h),m=n(27),v=r(m),y=n(1),g=r(y),_=n(13),b=r(_),x=n(14),w=r(x);t.default=i;var k=n(38),S=r(k),E=n(3),C=r(E),A=n(26),T=r(A),D=n(22),M=r(D),O=n(24),P=r(O),I=n(25),N=r(I),R=n(23),j=r(R),F=function(){function e(t){(0,b.default)(this,e),(0,g.default)(this,{spec:\"\",debugLevel:\"info\",plugins:[],pluginHistory:{},errors:[],mutations:[],promisedPatches:[],state:{},patches:[],context:{},contextTree:new j.default,showDebug:!1,allPatches:[],pluginProp:\"specMap\",libMethods:(0,g.default)((0,v.default)(this),C.default),allowMetaPatches:!1},t),this.get=this._get.bind(this),this.getContext=this._getContext.bind(this),this.hasRun=this._hasRun.bind(this),this.wrappedPlugins=this.plugins.map(this.wrapPlugin.bind(this)).filter(C.default.isFunction),this.patches.push(C.default.add([],this.spec)),this.patches.push(C.default.context([],this.context)),this.updatePatches(this.patches)}return(0,w.default)(e,[{key:\"debug\",value:function(e){if(this.debugLevel===e){for(var t,n=arguments.length,r=Array(n>1?n-1:0),i=1;i<n;i++)r[i-1]=arguments[i];(t=console).log.apply(t,r)}}},{key:\"verbose\",value:function(e){if(\"verbose\"===this.debugLevel){for(var t,n=arguments.length,r=Array(n>1?n-1:0),i=1;i<n;i++)r[i-1]=arguments[i];(t=console).log.apply(t,[\"[\"+e+\"]   \"].concat(r))}}},{key:\"wrapPlugin\",value:function(e,t){var n=null,r=void 0;return e[this.pluginProp]?(n=e,r=e[this.pluginProp]):C.default.isFunction(e)?r=e:C.default.isObject(e)&&(r=function(e){return l.default.mark(function t(n,r){var i,o,a,s,u,c,p,h;return l.default.wrap(function(t){for(;;)switch(t.prev=t.next){case 0:h=function t(n,o,a){var s,u,c,p,h,m,v,y,g;return l.default.wrap(function(i){for(;;)switch(i.prev=i.next){case 0:if(C.default.isObject(n)){i.next=6;break}if(e.key!==o[o.length-1]){i.next=4;break}return i.next=4,e.plugin(n,e.key,o,r);case 4:i.next=38;break;case 6:s=o[o.length-1],u=!0,c=!1,p=void 0,i.prev=10,h=(0,d.default)((0,f.default)(n));case 12:if(u=(m=h.next()).done){i.next=24;break}if(v=m.value,y=n[v],g=o.concat(v),!C.default.isObject(y)){i.next=18;break}return i.delegateYield(t(y,g,a),\"t0\",18);case 18:if(\"properties\"===s||v!==e.key){i.next=21;break}return i.next=21,e.plugin(y,v,g,r,a);case 21:u=!0,i.next=12;break;case 24:i.next=30;break;case 26:i.prev=26,i.t1=i.catch(10),c=!0,p=i.t1;case 30:i.prev=30,i.prev=31,!u&&h.return&&h.return();case 33:if(i.prev=33,!c){i.next=36;break}throw p;case 36:return i.finish(33);case 37:return i.finish(30);case 38:case\"end\":return i.stop()}},i[0],this,[[10,26,30,38],[31,,33,37]])},i=[h].map(l.default.mark),o=!0,a=!1,s=void 0,t.prev=5,u=(0,d.default)(n.filter(C.default.isAdditiveMutation));case 7:if(o=(c=u.next()).done){t.next=13;break}return p=c.value,t.delegateYield(h(p.value,p.path,p),\"t0\",10);case 10:o=!0,t.next=7;break;case 13:t.next=19;break;case 15:t.prev=15,t.t1=t.catch(5),a=!0,s=t.t1;case 19:t.prev=19,t.prev=20,!o&&u.return&&u.return();case 22:if(t.prev=22,!a){t.next=25;break}throw s;case 25:return t.finish(22);case 26:return t.finish(19);case 27:case\"end\":return t.stop()}},t,this,[[5,15,19,27],[20,,22,26]])})}(e)),(0,g.default)(r.bind(n),{pluginName:e.name||t,isGenerator:C.default.isGenerator(r)})}},{key:\"nextPlugin\",value:function(){var e=this;return(0,S.default)(this.wrappedPlugins,function(t){return e.getMutationsForPlugin(t).length>0})}},{key:\"nextPromisedPatch\",value:function(){if(this.promisedPatches.length>0)return u.default.race(this.promisedPatches.map(function(e){return e.value}))}},{key:\"getPluginHistory\",value:function(e){var t=this.getPluginName(e);return this.pluginHistory[t]||[]}},{key:\"getPluginRunCount\",value:function(e){return this.getPluginHistory(e).length}},{key:\"getPluginHistoryTip\",value:function(e){var t=this.getPluginHistory(e);return t&&t[t.length-1]||{}}},{key:\"getPluginMutationIndex\",value:function(e){var t=this.getPluginHistoryTip(e).mutationIndex;return\"number\"!=typeof t?-1:t}},{key:\"getPluginName\",value:function(e){return e.pluginName}},{key:\"updatePluginHistory\",value:function(e,t){var n=this.getPluginName(e);(this.pluginHistory[n]=this.pluginHistory[n]||[]).push(t)}},{key:\"updatePatches\",value:function(e,t){var n=this;C.default.normalizeArray(e).forEach(function(e){if(e instanceof Error)return void n.errors.push(e);try{if(!C.default.isObject(e))return void n.debug(\"updatePatches\",\"Got a non-object patch\",e);if(n.showDebug&&n.allPatches.push(e),C.default.isPromise(e.value))return n.promisedPatches.push(e),void n.promisedPatchThen(e);if(C.default.isContextPatch(e))return void n.setContext(e.path,e.value);if(C.default.isMutation(e))return void n.updateMutations(e)}catch(e){n.errors.push(e)}})}},{key:\"updateMutations\",value:function(e){C.default.applyPatch(this.state,e,{allowMetaPatches:this.allowMetaPatches})&&this.mutations.push(e)}},{key:\"removePromisedPatch\",value:function(e){var t=this.promisedPatches.indexOf(e);return t<0?void this.debug(\"Tried to remove a promisedPatch that isn't there!\"):void this.promisedPatches.splice(t,1)}},{key:\"promisedPatchThen\",value:function(e){var t=this;return e.value=e.value.then(function(n){var r=(0,g.default)({},e,{value:n});t.removePromisedPatch(e),t.updatePatches(r)}).catch(function(n){t.removePromisedPatch(e),t.updatePatches(n)})}},{key:\"getMutations\",value:function(e,t){return e=e||0,\"number\"!=typeof t&&(t=this.mutations.length),this.mutations.slice(e,t)}},{key:\"getCurrentMutations\",value:function(){return this.getMutationsForPlugin(this.getCurrentPlugin())}},{key:\"getMutationsForPlugin\",value:function(e){var t=this.getPluginMutationIndex(e);return this.getMutations(t+1)}},{key:\"getCurrentPlugin\",value:function(){return this.currentPlugin}},{key:\"getPatchesOfType\",value:function(e,t){return e.filter(t)}},{key:\"getLib\",value:function(){return this.libMethods}},{key:\"_get\",value:function(e){return C.default.getIn(this.state,e)}},{key:\"_getContext\",value:function(e){return this.contextTree.get(e)}},{key:\"setContext\",value:function(e,t){return this.contextTree.set(e,t)}},{key:\"_hasRun\",value:function(e){return this.getPluginRunCount(this.getCurrentPlugin())>(e||0)}},{key:\"_clone\",value:function(e){return JSON.parse((0,a.default)(e))}},{key:\"dispatch\",value:function(){function e(e){e&&(e=C.default.fullyNormalizeArray(e),n.updatePatches(e,r))}var t=this,n=this,r=this.nextPlugin();if(!r){var i=this.nextPromisedPatch();if(i)return i.then(function(){return t.dispatch()}).catch(function(){return t.dispatch()});var o={spec:this.state,errors:this.errors};return this.showDebug&&(o.patches=this.allPatches),u.default.resolve(o)}if(n.pluginCount=n.pluginCount||{},n.pluginCount[r]=(n.pluginCount[r]||0)+1,n.pluginCount[r]>100)return u.default.resolve({spec:n.state,errors:n.errors.concat(new Error(\"We've reached a hard limit of 100 plugin runs\"))});if(r!==this.currentPlugin&&this.promisedPatches.length){var a=this.promisedPatches.map(function(e){return e.value});return u.default.all(a.map(function(e){return e.then(Function,Function)})).then(function(){return t.dispatch()})}return function(){n.currentPlugin=r;var t=n.getCurrentMutations(),i=n.mutations.length-1;try{if(r.isGenerator){var o=!0,a=!1,s=void 0;try{for(var u,c=(0,d.default)(r(t,n.getLib()));!(o=(u=c.next()).done);o=!0)e(u.value)}catch(e){a=!0,s=e}finally{try{!o&&c.return&&c.return()}finally{if(a)throw s}}}else e(r(t,n.getLib()))}catch(t){e([(0,g.default)((0,v.default)(t),{plugin:r})])}finally{n.updatePluginHistory(r,{mutationIndex:i})}return n.dispatch()}()}}]),e}(),B={refs:T.default,allOf:M.default,parameters:P.default,properties:N.default};t.SpecMap=F,t.plugins=B},function(e,t,n){\"use strict\";Object.defineProperty(t,\"__esModule\",{value:!0}),t.default={key:\"allOf\",plugin:function(e,t,n,r,i){if(!i.meta||!i.meta.$$ref){if(!Array.isArray(e)){var o=new TypeError(\"allOf must be an array\");return o.fullPath=n,o}var a=n.slice(0,-1),s=!1;return[r.replace(a,{})].concat(e.map(function(e,t){if(!r.isObject(e)){if(s)return null;s=!0;var i=new TypeError(\"Elements in allOf must be objects\");return i.fullPath=n,i}return r.mergeDeep(a,e)}))}}}},function(e,t,n){\"use strict\";function r(e){return e&&e.__esModule?e:{default:e}}function i(e,t){return o({children:{}},e,t)}function o(e,t,n){return e.value=t||{},e.protoValue=n?(0,c.default)({},n.protoValue,e.value):e.value,(0,s.default)(e.children).forEach(function(t){var n=e.children[t];e.children[t]=o(n,n.value,e)}),e}Object.defineProperty(t,\"__esModule\",{value:!0});var a=n(0),s=r(a),u=n(4),c=r(u),l=n(13),p=r(l),f=n(14),h=r(f),d=function(){function e(t){(0,p.default)(this,e),this.root=i(t||{})}return(0,h.default)(e,[{key:\"set\",value:function(e,t){var n=this.getParent(e,!0);if(!n)return void o(this.root,t,null);var r=e[e.length-1],a=n.children;return a[r]?void o(a[r],t,n):void(a[r]=i(t,n))}},{key:\"get\",value:function(e){if(e=e||[],e.length<1)return this.root.value;for(var t=this.root,n=void 0,r=void 0,i=0;i<e.length&&(r=e[i],n=t.children,n[r]);i++)t=n[r];return t&&t.protoValue}},{key:\"getParent\",value:function(e,t){return!e||e.length<1?null:e.length<2?this.root:e.slice(0,-1).reduce(function(e,n){if(!e)return e;var r=e.children;return!r[n]&&t&&(r[n]=i(null,e)),r[n]},this.root)}}]),e}();t.default=d},function(e,t,n){\"use strict\";function r(e){return e&&e.__esModule?e:{default:e}}Object.defineProperty(t,\"__esModule\",{value:!0});var i=n(1),o=r(i),a=n(3),s=r(a);t.default={key:\"parameters\",plugin:function(e,t,n,r,i){if(Array.isArray(e)&&e.length){var a=(0,o.default)([],e),u=n.slice(0,-1),c=(0,o.default)({},s.default.getIn(r.spec,u));return e.forEach(function(e,t){try{a[t].default=r.parameterMacro(c,e)}catch(e){var i=new Error(e);return i.fullPath=n,i}}),s.default.replace(n,a)}return s.default.replace(n,e)}}},function(e,t,n){\"use strict\";function r(e){return e&&e.__esModule?e:{default:e}}Object.defineProperty(t,\"__esModule\",{value:!0});var i=n(1),o=r(i),a=n(3),s=r(a);t.default={key:\"properties\",plugin:function(e,t,n,r){var i=(0,o.default)({},e);for(var a in e)try{i[a].default=r.modelPropertyMacro(i[a])}catch(e){var u=new Error(e);return u.fullPath=n,u}return s.default.replace(n,i)}}},function(e,t,n){\"use strict\";function r(e){return e&&e.__esModule?e:{default:e}}function i(e,t){if(!F.test(e)){if(!t)throw new B(\"Tried to resolve a relative URL, without having a basePath. path: '\"+e+\"' basePath: '\"+t+\"'\");return P.default.resolve(t,e)}return e}function o(e,t){return new B(\"Could not resolve reference because of: \"+e.message,t,e)}function a(e){return(e+\"\").split(\"#\")}function s(e,t){var n=L[e];if(n&&!N.default.isPromise(n))try{var r=p(t,n);return(0,T.default)(S.default.resolve(r),{__value:r})}catch(e){return S.default.reject(e)}return c(e).then(function(e){return p(t,e)})}function u(e){void 0!==e?delete L[e]:(0,w.default)(L).forEach(function(e){delete L[e]})}function c(e){var t=L[e];return t?N.default.isPromise(t)?t:S.default.resolve(t):(L[e]=U.fetchJSON(e).then(function(t){return L[e]=t,t}),L[e])}function l(e){return(0,M.default)(e,{headers:{Accept:\"application/json\"},loadSpec:!0}).then(function(e){return e.json()})}function p(e,t){var n=f(e);if(n.length<1)return t;var r=N.default.getIn(t,n);if(void 0===r)throw new B(\"Could not resolve pointer: \"+e+\" does not exist in document\",{pointer:e});return r}function f(e){if(\"string\"!=typeof e)throw new TypeError(\"Expected a string, got a \"+(void 0===e?\"undefined\":(0,b.default)(e)));return\"/\"===e[0]&&(e=e.substr(1)),\"\"===e?[]:e.split(\"/\").map(h)}function h(e){return\"string\"!=typeof e?e:e.replace(/~1/g,\"/\").replace(/~0/g,\"~\")}function d(e){return e.replace(/~/g,\"~0\").replace(/\\//g,\"~1\")}function m(e){return 0===e.length?\"\":\"/\"+e.map(d).join(\"/\")}function v(e,t){if(W(t))return!0;var n=e.charAt(t.length);return 0===e.indexOf(t)&&(!n||\"/\"===n||\"#\"===n)}function y(e,t,n,r){var i=z.get(r);i||(i={},z.set(r,i));var o=m(n),a=(t||\"<specmap-base>\")+\"#\"+e;if(t==r.contextTree.get([]).baseDoc&&v(o,e))return!0;var s=\"\";return!!n.some(function(e){return s=s+\"/\"+d(e),i[s]&&i[s].some(function(e){return v(e,a)||v(a,e)})})||void(i[o]=(i[o]||[]).concat(a))}function g(e,t){function n(e){return N.default.isObject(e)&&(r.indexOf(e)>=0||(0,w.default)(e).some(function(t){return n(e[t])}))}var r=[e];return t.path.reduce(function(e,t){return r.push(e[t]),e[t]},e),n(t.value)}Object.defineProperty(t,\"__esModule\",{value:!0});var _=n(5),b=r(_),x=n(0),w=r(x),k=n(12),S=r(k),E=n(28),C=r(E),A=n(1),T=r(A),D=n(16),M=r(D),O=n(9),P=r(O),I=n(3),N=r(I),R=n(10),j=r(R),F=new RegExp(\"^([a-z]+://|//)\",\"i\"),B=(0,\nj.default)(\"JSONRefError\",function(e,t,n){this.originalError=n,(0,T.default)(this,t||{})}),L={},z=new C.default,q={key:\"$ref\",plugin:function(e,t,n,r){var u=n.slice(0,-1),c=r.getContext(n).baseDoc;if(\"string\"!=typeof e)return new B(\"$ref: must be a string (JSON-Ref)\",{$ref:e,baseDoc:c,fullPath:n});var l=a(e),p=l[0],h=l[1]||\"\",d=void 0;try{d=c||p?i(p,c):null}catch(t){return o(t,{pointer:h,$ref:e,basePath:d,fullPath:n})}var m=void 0,v=void 0;if(!y(h,d,u,r)){if(null==d?(v=f(h),void 0===(m=r.get(v))&&(m=new B(\"Could not resolve reference: \"+e,{pointer:h,$ref:e,baseDoc:c,fullPath:n}))):(m=s(d,h),m=null!=m.__value?m.__value:m.catch(function(t){throw o(t,{pointer:h,$ref:e,baseDoc:c,fullPath:n})})),m instanceof Error)return[N.default.remove(n),m];var _=N.default.replace(u,m,{$$ref:e});return d&&d!==c?[_,N.default.context(u,{baseDoc:d})]:g(r.state,_)?void 0:_}}},U=(0,T.default)(q,{docCache:L,absoluteify:i,clearCache:u,JSONRefError:B,wrapError:o,getDoc:c,split:a,extractFromDoc:s,fetchJSON:l,extract:p,jsonPointerToArray:f,unescapeJsonPointerToken:h});t.default=U;var W=function(e){return!e||\"/\"===e||\"#\"===e}},function(e,t){e.exports=n(495)},function(e,t){e.exports=n(815)},function(e,t){e.exports=n(447)},function(e,t){e.exports=n(184)},function(e,t){e.exports=n(435)},function(e,t){e.exports=n(823)},function(e,t){e.exports=n(131)},function(e,t){e.exports=n(824)},function(e,t){e.exports=n(825)},function(e,t){e.exports=n(448)},function(e,t){e.exports=n(826)},function(e,t){e.exports=n(894)},function(e,t){e.exports=n(917)},function(e,t){e.exports=n(800)},function(e,t){e.exports=n(781)},function(e,t){e.exports=n(939)},function(e,t){e.exports=n(940)},function(e,t){e.exports=n(941)},function(e,t){e.exports=n(949)},function(e,t,n){e.exports=n(17)}])},function(e,t,n){var r=n(765),i=n(768),o=n(769),a=n(790),s=n(793),u=n(794),c=Object.prototype,l=c.hasOwnProperty,p=o(function(e,t){if(s(t)||a(t))return void i(t,u(t),e);for(var n in t)l.call(t,n)&&r(e,n,t[n])});e.exports=p},[1233,766,767],function(e,t){function n(e,t,n){\"__proto__\"==t&&r?r(e,t,{configurable:!0,enumerable:!0,value:n,writable:!0}):e[t]=n}var r=Object.defineProperty;e.exports=n},234,[1235,765,766],function(e,t,n){function r(e){return i(function(t,n){var r=-1,i=n.length,a=i>1?n[i-1]:void 0,s=i>2?n[2]:void 0;for(a=e.length>3&&\"function\"==typeof a?(i--,a):void 0,s&&o(n[0],n[1],s)&&(a=i<3?void 0:a,i=1),t=Object(t);++r<i;){var u=n[r];u&&e(t,u,r,a)}return t})}var i=n(770),o=n(789);e.exports=r},function(e,t,n){function r(e,t){return a(o(e,t,i),e+\"\")}var i=n(771),o=n(772),a=n(774);e.exports=r},305,[1248,773],721,[1249,775,788],function(e,t,n){var r=n(776),i=n(771),o=n(777),a=o?function(e,t){return o(e,\"toString\",{configurable:!0,enumerable:!1,value:r(t),writable:!0})}:i;e.exports=a},724,function(e,t,n){var r=n(778),i=r(Object,\"defineProperty\");e.exports=i},[1183,779,787],[1184,780,782,781,786],function(e,t,n){function r(e){var t=i(e)?u.call(e):\"\";return t==o||t==a}var i=n(781),o=\"[object Function]\",a=\"[object GeneratorFunction]\",s=Object.prototype,u=s.toString;e.exports=r},221,[1185,783],[1186,784],[1178,785],153,function(e,t){function n(e){if(null!=e){try{return i.call(e)}catch(e){}try{return e+\"\"}catch(e){}}return\"\"}var r=Function.prototype,i=r.toString;e.exports=n},225,function(e,t){function n(e){var t=0,n=0;return function(){var a=o(),s=i-(a-n);if(n=a,s>0){if(++t>=r)return arguments[0]}else t=0;return e.apply(void 0,arguments)}}var r=500,i=16,o=Date.now;e.exports=n},[1230,767,790,792,781],[1213,780,791],279,276,283,[1208,795,801,790],function(e,t,n){function r(e,t){var n=a(e)||o(e)?i(e.length,String):[],r=n.length,u=!!r;for(var l in e)!t&&!c.call(e,l)||u&&(\"length\"==l||s(l,r))||n.push(l);return n}var i=n(796),o=n(797),a=n(800),s=n(792),u=Object.prototype,c=u.hasOwnProperty;e.exports=r},271,function(e,t,n){function r(e){return i(e)&&s.call(e,\"callee\")&&(!c.call(e,\"callee\")||u.call(e)==o)}var i=n(798),o=\"[object Arguments]\",a=Object.prototype,s=a.hasOwnProperty,u=a.toString,c=a.propertyIsEnumerable;e.exports=r},function(e,t,n){function r(e){return o(e)&&i(e)}var i=n(790),o=n(799);e.exports=r},158,193,[1211,793,802],[1212,803],157,function(e,t,n){\"use strict\";function r(){this.protocol=null,this.slashes=null,this.auth=null,this.host=null,this.port=null,this.hostname=null,this.hash=null,this.search=null,this.query=null,this.pathname=null,this.path=null,this.href=null}function i(e,t,n){if(e&&c.isObject(e)&&e instanceof r)return e;var i=new r;return i.parse(e,t,n),i}function o(e){return c.isString(e)&&(e=i(e)),e instanceof r?e.format():r.prototype.format.call(e)}function a(e,t){return i(e,!1,!0).resolve(t)}function s(e,t){return e?i(e,!1,!0).resolveObject(t):t}var u=n(805),c=n(806);t.parse=i,t.resolve=a,t.resolveObject=s,t.format=o,t.Url=r;var l=/^([a-z0-9.+-]+:)/i,p=/:[0-9]*$/,f=/^(\\/\\/?(?!\\/)[^\\?\\s]*)(\\?[^\\s]*)?$/,h=[\"<\",\">\",'\"',\"`\",\" \",\"\\r\",\"\\n\",\"\\t\"],d=[\"{\",\"}\",\"|\",\"\\\\\",\"^\",\"`\"].concat(h),m=[\"'\"].concat(d),v=[\"%\",\"/\",\"?\",\";\",\"#\"].concat(m),y=[\"/\",\"?\",\"#\"],g=255,_=/^[+a-z0-9A-Z_-]{0,63}$/,b=/^([+a-z0-9A-Z_-]{0,63})(.*)$/,x={javascript:!0,\"javascript:\":!0},w={javascript:!0,\"javascript:\":!0},k={http:!0,https:!0,ftp:!0,gopher:!0,file:!0,\"http:\":!0,\"https:\":!0,\"ftp:\":!0,\"gopher:\":!0,\"file:\":!0},S=n(807);r.prototype.parse=function(e,t,n){if(!c.isString(e))throw new TypeError(\"Parameter 'url' must be a string, not \"+typeof e);var r=e.indexOf(\"?\"),i=r!==-1&&r<e.indexOf(\"#\")?\"?\":\"#\",o=e.split(i),a=/\\\\/g;o[0]=o[0].replace(a,\"/\"),e=o.join(i);var s=e;if(s=s.trim(),!n&&1===e.split(\"#\").length){var p=f.exec(s);if(p)return this.path=s,this.href=s,this.pathname=p[1],p[2]?(this.search=p[2],t?this.query=S.parse(this.search.substr(1)):this.query=this.search.substr(1)):t&&(this.search=\"\",this.query={}),this}var h=l.exec(s);if(h){h=h[0];var d=h.toLowerCase();this.protocol=d,s=s.substr(h.length)}if(n||h||s.match(/^\\/\\/[^@\\/]+@[^@\\/]+/)){var E=\"//\"===s.substr(0,2);!E||h&&w[h]||(s=s.substr(2),this.slashes=!0)}if(!w[h]&&(E||h&&!k[h])){for(var C=-1,A=0;A<y.length;A++){var T=s.indexOf(y[A]);T!==-1&&(C===-1||T<C)&&(C=T)}var D,M;M=C===-1?s.lastIndexOf(\"@\"):s.lastIndexOf(\"@\",C),M!==-1&&(D=s.slice(0,M),s=s.slice(M+1),this.auth=decodeURIComponent(D)),C=-1;for(var A=0;A<v.length;A++){var T=s.indexOf(v[A]);T!==-1&&(C===-1||T<C)&&(C=T)}C===-1&&(C=s.length),this.host=s.slice(0,C),s=s.slice(C),this.parseHost(),this.hostname=this.hostname||\"\";var O=\"[\"===this.hostname[0]&&\"]\"===this.hostname[this.hostname.length-1];if(!O)for(var P=this.hostname.split(/\\./),A=0,I=P.length;A<I;A++){var N=P[A];if(N&&!N.match(_)){for(var R=\"\",j=0,F=N.length;j<F;j++)R+=N.charCodeAt(j)>127?\"x\":N[j];if(!R.match(_)){var B=P.slice(0,A),L=P.slice(A+1),z=N.match(b);z&&(B.push(z[1]),L.unshift(z[2])),L.length&&(s=\"/\"+L.join(\".\")+s),this.hostname=B.join(\".\");break}}}this.hostname.length>g?this.hostname=\"\":this.hostname=this.hostname.toLowerCase(),O||(this.hostname=u.toASCII(this.hostname));var q=this.port?\":\"+this.port:\"\",U=this.hostname||\"\";this.host=U+q,this.href+=this.host,O&&(this.hostname=this.hostname.substr(1,this.hostname.length-2),\"/\"!==s[0]&&(s=\"/\"+s))}if(!x[d])for(var A=0,I=m.length;A<I;A++){var W=m[A];if(s.indexOf(W)!==-1){var K=encodeURIComponent(W);K===W&&(K=escape(W)),s=s.split(W).join(K)}}var V=s.indexOf(\"#\");V!==-1&&(this.hash=s.substr(V),s=s.slice(0,V));var H=s.indexOf(\"?\");if(H!==-1?(this.search=s.substr(H),this.query=s.substr(H+1),t&&(this.query=S.parse(this.query)),s=s.slice(0,H)):t&&(this.search=\"\",this.query={}),s&&(this.pathname=s),k[d]&&this.hostname&&!this.pathname&&(this.pathname=\"/\"),this.pathname||this.search){var q=this.pathname||\"\",J=this.search||\"\";this.path=q+J}return this.href=this.format(),this},r.prototype.format=function(){var e=this.auth||\"\";e&&(e=encodeURIComponent(e),e=e.replace(/%3A/i,\":\"),e+=\"@\");var t=this.protocol||\"\",n=this.pathname||\"\",r=this.hash||\"\",i=!1,o=\"\";this.host?i=e+this.host:this.hostname&&(i=e+(this.hostname.indexOf(\":\")===-1?this.hostname:\"[\"+this.hostname+\"]\"),this.port&&(i+=\":\"+this.port)),this.query&&c.isObject(this.query)&&Object.keys(this.query).length&&(o=S.stringify(this.query));var a=this.search||o&&\"?\"+o||\"\";return t&&\":\"!==t.substr(-1)&&(t+=\":\"),this.slashes||(!t||k[t])&&i!==!1?(i=\"//\"+(i||\"\"),n&&\"/\"!==n.charAt(0)&&(n=\"/\"+n)):i||(i=\"\"),r&&\"#\"!==r.charAt(0)&&(r=\"#\"+r),a&&\"?\"!==a.charAt(0)&&(a=\"?\"+a),n=n.replace(/[?#]/g,function(e){return encodeURIComponent(e)}),a=a.replace(\"#\",\"%23\"),t+i+n+a+r},r.prototype.resolve=function(e){return this.resolveObject(i(e,!1,!0)).format()},r.prototype.resolveObject=function(e){if(c.isString(e)){var t=new r;t.parse(e,!1,!0),e=t}for(var n=new r,i=Object.keys(this),o=0;o<i.length;o++){var a=i[o];n[a]=this[a]}if(n.hash=e.hash,\"\"===e.href)return n.href=n.format(),n;if(e.slashes&&!e.protocol){for(var s=Object.keys(e),u=0;u<s.length;u++){var l=s[u];\"protocol\"!==l&&(n[l]=e[l])}return k[n.protocol]&&n.hostname&&!n.pathname&&(n.path=n.pathname=\"/\"),n.href=n.format(),n}if(e.protocol&&e.protocol!==n.protocol){if(!k[e.protocol]){for(var p=Object.keys(e),f=0;f<p.length;f++){var h=p[f];n[h]=e[h]}return n.href=n.format(),n}if(n.protocol=e.protocol,e.host||w[e.protocol])n.pathname=e.pathname;else{for(var d=(e.pathname||\"\").split(\"/\");d.length&&!(e.host=d.shift()););e.host||(e.host=\"\"),e.hostname||(e.hostname=\"\"),\"\"!==d[0]&&d.unshift(\"\"),d.length<2&&d.unshift(\"\"),n.pathname=d.join(\"/\")}if(n.search=e.search,n.query=e.query,n.host=e.host||\"\",n.auth=e.auth,n.hostname=e.hostname||e.host,n.port=e.port,n.pathname||n.search){var m=n.pathname||\"\",v=n.search||\"\";n.path=m+v}return n.slashes=n.slashes||e.slashes,n.href=n.format(),n}var y=n.pathname&&\"/\"===n.pathname.charAt(0),g=e.host||e.pathname&&\"/\"===e.pathname.charAt(0),_=g||y||n.host&&e.pathname,b=_,x=n.pathname&&n.pathname.split(\"/\")||[],d=e.pathname&&e.pathname.split(\"/\")||[],S=n.protocol&&!k[n.protocol];if(S&&(n.hostname=\"\",n.port=null,n.host&&(\"\"===x[0]?x[0]=n.host:x.unshift(n.host)),n.host=\"\",e.protocol&&(e.hostname=null,e.port=null,e.host&&(\"\"===d[0]?d[0]=e.host:d.unshift(e.host)),e.host=null),_=_&&(\"\"===d[0]||\"\"===x[0])),g)n.host=e.host||\"\"===e.host?e.host:n.host,n.hostname=e.hostname||\"\"===e.hostname?e.hostname:n.hostname,n.search=e.search,n.query=e.query,x=d;else if(d.length)x||(x=[]),x.pop(),x=x.concat(d),n.search=e.search,n.query=e.query;else if(!c.isNullOrUndefined(e.search)){if(S){n.hostname=n.host=x.shift();var E=!!(n.host&&n.host.indexOf(\"@\")>0)&&n.host.split(\"@\");E&&(n.auth=E.shift(),n.host=n.hostname=E.shift())}return n.search=e.search,n.query=e.query,c.isNull(n.pathname)&&c.isNull(n.search)||(n.path=(n.pathname?n.pathname:\"\")+(n.search?n.search:\"\")),n.href=n.format(),n}if(!x.length)return n.pathname=null,n.search?n.path=\"/\"+n.search:n.path=null,n.href=n.format(),n;for(var C=x.slice(-1)[0],A=(n.host||e.host||x.length>1)&&(\".\"===C||\"..\"===C)||\"\"===C,T=0,D=x.length;D>=0;D--)C=x[D],\".\"===C?x.splice(D,1):\"..\"===C?(x.splice(D,1),T++):T&&(x.splice(D,1),T--);if(!_&&!b)for(;T--;T)x.unshift(\"..\");!_||\"\"===x[0]||x[0]&&\"/\"===x[0].charAt(0)||x.unshift(\"\"),A&&\"/\"!==x.join(\"/\").substr(-1)&&x.push(\"\");var M=\"\"===x[0]||x[0]&&\"/\"===x[0].charAt(0);if(S){n.hostname=n.host=M?\"\":x.length?x.shift():\"\";var E=!!(n.host&&n.host.indexOf(\"@\")>0)&&n.host.split(\"@\");E&&(n.auth=E.shift(),n.host=n.hostname=E.shift())}return _=_||n.host&&x.length,_&&!M&&x.unshift(\"\"),x.length?n.pathname=x.join(\"/\"):(n.pathname=null,n.path=null),c.isNull(n.pathname)&&c.isNull(n.search)||(n.path=(n.pathname?n.pathname:\"\")+(n.search?n.search:\"\")),n.auth=e.auth||n.auth,n.slashes=n.slashes||e.slashes,n.href=n.format(),n},r.prototype.parseHost=function(){var e=this.host,t=p.exec(e);t&&(t=t[0],\":\"!==t&&(this.port=t.substr(1)),e=e.substr(0,e.length-t.length)),e&&(this.hostname=e)}},function(e,t,n){var r;(function(e,i){!function(o){function a(e){throw RangeError(P[e])}function s(e,t){for(var n=e.length,r=[];n--;)r[n]=t(e[n]);return r}function u(e,t){var n=e.split(\"@\"),r=\"\";n.length>1&&(r=n[0]+\"@\",e=n[1]),e=e.replace(O,\".\");var i=e.split(\".\"),o=s(i,t).join(\".\");return r+o}function c(e){for(var t,n,r=[],i=0,o=e.length;i<o;)t=e.charCodeAt(i++),t>=55296&&t<=56319&&i<o?(n=e.charCodeAt(i++),56320==(64512&n)?r.push(((1023&t)<<10)+(1023&n)+65536):(r.push(t),i--)):r.push(t);return r}function l(e){return s(e,function(e){var t=\"\";return e>65535&&(e-=65536,t+=R(e>>>10&1023|55296),e=56320|1023&e),t+=R(e)}).join(\"\")}function p(e){return e-48<10?e-22:e-65<26?e-65:e-97<26?e-97:x}function f(e,t){return e+22+75*(e<26)-((0!=t)<<5)}function h(e,t,n){var r=0;for(e=n?N(e/E):e>>1,e+=N(e/t);e>I*k>>1;r+=x)e=N(e/I);return N(r+(I+1)*e/(e+S))}function d(e){var t,n,r,i,o,s,u,c,f,d,m=[],v=e.length,y=0,g=A,_=C;for(n=e.lastIndexOf(T),n<0&&(n=0),r=0;r<n;++r)e.charCodeAt(r)>=128&&a(\"not-basic\"),m.push(e.charCodeAt(r));for(i=n>0?n+1:0;i<v;){for(o=y,s=1,u=x;i>=v&&a(\"invalid-input\"),c=p(e.charCodeAt(i++)),(c>=x||c>N((b-y)/s))&&a(\"overflow\"),y+=c*s,f=u<=_?w:u>=_+k?k:u-_,!(c<f);u+=x)d=x-f,s>N(b/d)&&a(\"overflow\"),s*=d;t=m.length+1,_=h(y-o,t,0==o),N(y/t)>b-g&&a(\"overflow\"),g+=N(y/t),y%=t,m.splice(y++,0,g)}return l(m)}function m(e){var t,n,r,i,o,s,u,l,p,d,m,v,y,g,_,S=[];for(e=c(e),v=e.length,t=A,n=0,o=C,s=0;s<v;++s)m=e[s],m<128&&S.push(R(m));for(r=i=S.length,i&&S.push(T);r<v;){for(u=b,s=0;s<v;++s)m=e[s],m>=t&&m<u&&(u=m);for(y=r+1,u-t>N((b-n)/y)&&a(\"overflow\"),n+=(u-t)*y,t=u,s=0;s<v;++s)if(m=e[s],m<t&&++n>b&&a(\"overflow\"),m==t){for(l=n,p=x;d=p<=o?w:p>=o+k?k:p-o,!(l<d);p+=x)_=l-d,g=x-d,S.push(R(f(d+_%g,0))),l=N(_/g);S.push(R(f(l,0))),o=h(n,y,r==i),n=0,++r}++n,++t}return S.join(\"\")}function v(e){return u(e,function(e){return D.test(e)?d(e.slice(4).toLowerCase()):e})}function y(e){return u(e,function(e){return M.test(e)?\"xn--\"+m(e):e})}var g=(\"object\"==typeof t&&t&&!t.nodeType&&t,\"object\"==typeof e&&e&&!e.nodeType&&e,\"object\"==typeof i&&i);g.global!==g&&g.window!==g&&g.self!==g||(o=g);var _,b=2147483647,x=36,w=1,k=26,S=38,E=700,C=72,A=128,T=\"-\",D=/^xn--/,M=/[^\\x20-\\x7E]/,O=/[\\x2E\\u3002\\uFF0E\\uFF61]/g,P={overflow:\"Overflow: input needs wider integers to process\",\"not-basic\":\"Illegal input >= 0x80 (not a basic code point)\",\"invalid-input\":\"Invalid input\"},I=x-w,N=Math.floor,R=String.fromCharCode;_={version:\"1.3.2\",ucs2:{decode:c,encode:l},decode:d,encode:m,toASCII:y,toUnicode:v},r=function(){return _}.call(t,n,t,e),!(void 0!==r&&(e.exports=r))}(this)}).call(t,n(161)(e),function(){return this}())},function(e,t){\"use strict\";e.exports={isString:function(e){return\"string\"==typeof e},isObject:function(e){return\"object\"==typeof e&&null!==e},isNull:function(e){return null===e},isNullOrUndefined:function(e){return null==e}}},function(e,t,n){\"use strict\";t.decode=t.parse=n(808),t.encode=t.stringify=n(809)},function(e,t){\"use strict\";function n(e,t){return Object.prototype.hasOwnProperty.call(e,t)}e.exports=function(e,t,r,i){t=t||\"&\",r=r||\"=\";var o={};if(\"string\"!=typeof e||0===e.length)return o;var a=/\\+/g;e=e.split(t);var s=1e3;i&&\"number\"==typeof i.maxKeys&&(s=i.maxKeys);var u=e.length;s>0&&u>s&&(u=s);for(var c=0;c<u;++c){var l,p,f,h,d=e[c].replace(a,\"%20\"),m=d.indexOf(r);m>=0?(l=d.substr(0,m),p=d.substr(m+1)):(l=d,p=\"\"),f=decodeURIComponent(l),h=decodeURIComponent(p),n(o,f)?Array.isArray(o[f])?o[f].push(h):o[f]=[o[f],h]:o[f]=h}return o}},function(e,t){\"use strict\";var n=function(e){switch(typeof e){case\"string\":return e;case\"boolean\":return e?\"true\":\"false\";case\"number\":return isFinite(e)?e:\"\";default:return\"\"}};e.exports=function(e,t,r,i){return t=t||\"&\",r=r||\"=\",null===e&&(e=void 0),\"object\"==typeof e?Object.keys(e).map(function(i){var o=encodeURIComponent(n(i))+r;return Array.isArray(e[i])?e[i].map(function(e){return o+encodeURIComponent(n(e))}).join(t):o+encodeURIComponent(n(e[i]))}).join(t):i?encodeURIComponent(n(i))+r+encodeURIComponent(n(e)):\"\"}},function(e,t,n){e.exports=n(811)},function(e,t,n){(function(t){var r=\"object\"==typeof t?t:\"object\"==typeof window?window:\"object\"==typeof self?self:this,i=r.regeneratorRuntime&&Object.getOwnPropertyNames(r).indexOf(\"regeneratorRuntime\")>=0,o=i&&r.regeneratorRuntime;if(r.regeneratorRuntime=void 0,e.exports=n(812),i)r.regeneratorRuntime=o;else try{delete r.regeneratorRuntime}catch(e){r.regeneratorRuntime=void 0}}).call(t,function(){return this}())},function(e,t){(function(t){!function(t){\"use strict\";function n(e,t,n,r){var o=t&&t.prototype instanceof i?t:i,a=Object.create(o.prototype),s=new h(r||[]);return a._invoke=c(e,n,s),a}function r(e,t,n){try{return{type:\"normal\",arg:e.call(t,n)}}catch(e){return{type:\"throw\",arg:e}}}function i(){}function o(){}function a(){}function s(e){[\"next\",\"throw\",\"return\"].forEach(function(t){e[t]=function(e){return this._invoke(t,e)}})}function u(e){function n(t,i,o,a){var s=r(e[t],e,i);if(\"throw\"!==s.type){var u=s.arg,c=u.value;return c&&\"object\"==typeof c&&g.call(c,\"__await\")?Promise.resolve(c.__await).then(function(e){n(\"next\",e,o,a)},function(e){n(\"throw\",e,o,a)}):Promise.resolve(c).then(function(e){u.value=e,o(u)},a)}a(s.arg)}function i(e,t){function r(){return new Promise(function(r,i){n(e,t,r,i)})}return o=o?o.then(r,r):r()}\"object\"==typeof t.process&&t.process.domain&&(n=t.process.domain.bind(n));var o;this._invoke=i}function c(e,t,n){var i=E;return function(o,a){if(i===A)throw new Error(\"Generator is already running\");if(i===T){if(\"throw\"===o)throw a;return m()}for(n.method=o,n.arg=a;;){var s=n.delegate;if(s){var u=l(s,n);if(u){if(u===D)continue;return u}}if(\"next\"===n.method)n.sent=n._sent=n.arg;else if(\"throw\"===n.method){if(i===E)throw i=T,n.arg;n.dispatchException(n.arg)}else\"return\"===n.method&&n.abrupt(\"return\",n.arg);i=A;var c=r(e,t,n);if(\"normal\"===c.type){if(i=n.done?T:C,c.arg===D)continue;return{value:c.arg,done:n.done}}\"throw\"===c.type&&(i=T,n.method=\"throw\",n.arg=c.arg)}}}function l(e,t){var n=e.iterator[t.method];if(n===v){if(t.delegate=null,\"throw\"===t.method){if(e.iterator.return&&(t.method=\"return\",t.arg=v,l(e,t),\"throw\"===t.method))return D;t.method=\"throw\",t.arg=new TypeError(\"The iterator does not provide a 'throw' method\")}return D}var i=r(n,e.iterator,t.arg);if(\"throw\"===i.type)return t.method=\"throw\",t.arg=i.arg,t.delegate=null,D;var o=i.arg;return o?o.done?(t[e.resultName]=o.value,t.next=e.nextLoc,\"return\"!==t.method&&(t.method=\"next\",t.arg=v),t.delegate=null,D):o:(t.method=\"throw\",t.arg=new TypeError(\"iterator result is not an object\"),t.delegate=null,D)}function p(e){var t={tryLoc:e[0]};1 in e&&(t.catchLoc=e[1]),2 in e&&(t.finallyLoc=e[2],t.afterLoc=e[3]),this.tryEntries.push(t)}function f(e){var t=e.completion||{};t.type=\"normal\",delete t.arg,e.completion=t}function h(e){this.tryEntries=[{tryLoc:\"root\"}],e.forEach(p,this),this.reset(!0)}function d(e){if(e){var t=e[b];if(t)return t.call(e);if(\"function\"==typeof e.next)return e;if(!isNaN(e.length)){var n=-1,r=function t(){for(;++n<e.length;)if(g.call(e,n))return t.value=e[n],t.done=!1,t;return t.value=v,t.done=!0,t};return r.next=r}}return{next:m}}function m(){return{value:v,done:!0}}var v,y=Object.prototype,g=y.hasOwnProperty,_=\"function\"==typeof Symbol?Symbol:{},b=_.iterator||\"@@iterator\",x=_.asyncIterator||\"@@asyncIterator\",w=_.toStringTag||\"@@toStringTag\",k=\"object\"==typeof e,S=t.regeneratorRuntime;if(S)return void(k&&(e.exports=S));S=t.regeneratorRuntime=k?e.exports:{},S.wrap=n;var E=\"suspendedStart\",C=\"suspendedYield\",A=\"executing\",T=\"completed\",D={},M={};M[b]=function(){return this};var O=Object.getPrototypeOf,P=O&&O(O(d([])));P&&P!==y&&g.call(P,b)&&(M=P);var I=a.prototype=i.prototype=Object.create(M);o.prototype=I.constructor=a,a.constructor=o,a[w]=o.displayName=\"GeneratorFunction\",S.isGeneratorFunction=function(e){var t=\"function\"==typeof e&&e.constructor;return!!t&&(t===o||\"GeneratorFunction\"===(t.displayName||t.name))},S.mark=function(e){return Object.setPrototypeOf?Object.setPrototypeOf(e,a):(e.__proto__=a,w in e||(e[w]=\"GeneratorFunction\")),e.prototype=Object.create(I),e},S.awrap=function(e){return{__await:e}},s(u.prototype),u.prototype[x]=function(){return this},S.AsyncIterator=u,S.async=function(e,t,r,i){var o=new u(n(e,t,r,i));return S.isGeneratorFunction(t)?o:o.next().then(function(e){return e.done?e.value:o.next()})},s(I),I[w]=\"Generator\",I[b]=function(){return this},I.toString=function(){return\"[object Generator]\"},S.keys=function(e){var t=[];for(var n in e)t.push(n);return t.reverse(),function n(){for(;t.length;){var r=t.pop();if(r in e)return n.value=r,n.done=!1,n}return n.done=!0,n}},S.values=d,h.prototype={constructor:h,reset:function(e){if(this.prev=0,this.next=0,this.sent=this._sent=v,this.done=!1,this.delegate=null,this.method=\"next\",this.arg=v,this.tryEntries.forEach(f),!e)for(var t in this)\"t\"===t.charAt(0)&&g.call(this,t)&&!isNaN(+t.slice(1))&&(this[t]=v)},stop:function(){this.done=!0;var e=this.tryEntries[0],t=e.completion;if(\"throw\"===t.type)throw t.arg;return this.rval},dispatchException:function(e){function t(t,r){return o.type=\"throw\",o.arg=e,n.next=t,r&&(n.method=\"next\",n.arg=v),!!r}if(this.done)throw e;for(var n=this,r=this.tryEntries.length-1;r>=0;--r){var i=this.tryEntries[r],o=i.completion;if(\"root\"===i.tryLoc)return t(\"end\");if(i.tryLoc<=this.prev){var a=g.call(i,\"catchLoc\"),s=g.call(i,\"finallyLoc\");if(a&&s){if(this.prev<i.catchLoc)return t(i.catchLoc,!0);if(this.prev<i.finallyLoc)return t(i.finallyLoc)}else if(a){if(this.prev<i.catchLoc)return t(i.catchLoc,!0)}else{if(!s)throw new Error(\"try statement without catch or finally\");if(this.prev<i.finallyLoc)return t(i.finallyLoc)}}}},abrupt:function(e,t){for(var n=this.tryEntries.length-1;n>=0;--n){var r=this.tryEntries[n];if(r.tryLoc<=this.prev&&g.call(r,\"finallyLoc\")&&this.prev<r.finallyLoc){var i=r;break}}i&&(\"break\"===e||\"continue\"===e)&&i.tryLoc<=t&&t<=i.finallyLoc&&(i=null);var o=i?i.completion:{};return o.type=e,o.arg=t,i?(this.method=\"next\",this.next=i.finallyLoc,D):this.complete(o)},complete:function(e,t){if(\"throw\"===e.type)throw e.arg;return\"break\"===e.type||\"continue\"===e.type?this.next=e.arg:\"return\"===e.type?(this.rval=this.arg=e.arg,this.method=\"return\",this.next=\"end\"):\"normal\"===e.type&&t&&(this.next=t),D},finish:function(e){for(var t=this.tryEntries.length-1;t>=0;--t){var n=this.tryEntries[t];if(n.finallyLoc===e)return this.complete(n.completion,n.afterLoc),f(n),D}},catch:function(e){for(var t=this.tryEntries.length-1;t>=0;--t){var n=this.tryEntries[t];if(n.tryLoc===e){var r=n.completion;if(\"throw\"===r.type){var i=r.arg;f(n)}return i}}throw new Error(\"illegal catch attempt\")},delegateYield:function(e,t,n){return this.delegate={iterator:d(e),resultName:t,nextLoc:n},\"next\"===this.method&&(this.arg=v),D}}}(\"object\"==typeof t?t:\"object\"==typeof window?window:\"object\"==typeof self?self:this)}).call(t,function(){return this}())},function(e,t,n){n(814),e.exports=self.fetch.bind(self)},function(e,t){!function(e){\"use strict\";function t(e){if(\"string\"!=typeof e&&(e=String(e)),/[^a-z0-9\\-#$%&'*+.\\^_`|~]/i.test(e))throw new TypeError(\"Invalid character in header field name\");return e.toLowerCase()}function n(e){return\"string\"!=typeof e&&(e=String(e)),e}function r(e){this.map={},e instanceof r?e.forEach(function(e,t){this.append(t,e)},this):e&&Object.getOwnPropertyNames(e).forEach(function(t){this.append(t,e[t])},this)}function i(e){return e.bodyUsed?Promise.reject(new TypeError(\"Already read\")):void(e.bodyUsed=!0)}function o(e){return new Promise(function(t,n){e.onload=function(){t(e.result)},e.onerror=function(){n(e.error)}})}function a(e){var t=new FileReader;return t.readAsArrayBuffer(e),o(t)}function s(e){var t=new FileReader;return t.readAsText(e),o(t)}function u(){return this.bodyUsed=!1,this._initBody=function(e){if(this._bodyInit=e,\"string\"==typeof e)this._bodyText=e;else if(d.blob&&Blob.prototype.isPrototypeOf(e))this._bodyBlob=e;else if(d.formData&&FormData.prototype.isPrototypeOf(e))this._bodyFormData=e;else if(e){if(!d.arrayBuffer||!ArrayBuffer.prototype.isPrototypeOf(e))throw new Error(\"unsupported BodyInit type\")}else this._bodyText=\"\";this.headers.get(\"content-type\")||(\"string\"==typeof e?this.headers.set(\"content-type\",\"text/plain;charset=UTF-8\"):this._bodyBlob&&this._bodyBlob.type&&this.headers.set(\"content-type\",this._bodyBlob.type))},d.blob?(this.blob=function(){var e=i(this);if(e)return e;if(this._bodyBlob)return Promise.resolve(this._bodyBlob);if(this._bodyFormData)throw new Error(\"could not read FormData body as blob\");return Promise.resolve(new Blob([this._bodyText]))},this.arrayBuffer=function(){return this.blob().then(a)},this.text=function(){var e=i(this);if(e)return e;if(this._bodyBlob)return s(this._bodyBlob);if(this._bodyFormData)throw new Error(\"could not read FormData body as text\");return Promise.resolve(this._bodyText)}):this.text=function(){var e=i(this);return e?e:Promise.resolve(this._bodyText)},d.formData&&(this.formData=function(){return this.text().then(p)}),this.json=function(){return this.text().then(JSON.parse)},this}function c(e){var t=e.toUpperCase();return m.indexOf(t)>-1?t:e}function l(e,t){t=t||{};var n=t.body;if(l.prototype.isPrototypeOf(e)){if(e.bodyUsed)throw new TypeError(\"Already read\");this.url=e.url,this.credentials=e.credentials,t.headers||(this.headers=new r(e.headers)),this.method=e.method,this.mode=e.mode,n||(n=e._bodyInit,e.bodyUsed=!0)}else this.url=e;if(this.credentials=t.credentials||this.credentials||\"omit\",!t.headers&&this.headers||(this.headers=new r(t.headers)),this.method=c(t.method||this.method||\"GET\"),this.mode=t.mode||this.mode||null,this.referrer=null,(\"GET\"===this.method||\"HEAD\"===this.method)&&n)throw new TypeError(\"Body not allowed for GET or HEAD requests\");this._initBody(n)}function p(e){var t=new FormData;return e.trim().split(\"&\").forEach(function(e){if(e){var n=e.split(\"=\"),r=n.shift().replace(/\\+/g,\" \"),i=n.join(\"=\").replace(/\\+/g,\" \");t.append(decodeURIComponent(r),decodeURIComponent(i))}}),t}function f(e){var t=new r,n=(e.getAllResponseHeaders()||\"\").trim().split(\"\\n\");return n.forEach(function(e){var n=e.trim().split(\":\"),r=n.shift().trim(),i=n.join(\":\").trim();t.append(r,i)}),t}function h(e,t){t||(t={}),this.type=\"default\",this.status=t.status,this.ok=this.status>=200&&this.status<300,this.statusText=t.statusText,this.headers=t.headers instanceof r?t.headers:new r(t.headers),this.url=t.url||\"\",this._initBody(e)}if(!e.fetch){r.prototype.append=function(e,r){e=t(e),r=n(r);var i=this.map[e];i||(i=[],this.map[e]=i),i.push(r)},r.prototype.delete=function(e){delete this.map[t(e)]},r.prototype.get=function(e){var n=this.map[t(e)];return n?n[0]:null},r.prototype.getAll=function(e){return this.map[t(e)]||[]},r.prototype.has=function(e){return this.map.hasOwnProperty(t(e))},r.prototype.set=function(e,r){this.map[t(e)]=[n(r)]},r.prototype.forEach=function(e,t){Object.getOwnPropertyNames(this.map).forEach(function(n){this.map[n].forEach(function(r){e.call(t,r,n,this)},this)},this)};var d={blob:\"FileReader\"in e&&\"Blob\"in e&&function(){try{return new Blob,!0}catch(e){return!1}}(),formData:\"FormData\"in e,arrayBuffer:\"ArrayBuffer\"in e},m=[\"DELETE\",\"GET\",\"HEAD\",\"OPTIONS\",\"POST\",\"PUT\"];l.prototype.clone=function(){return new l(this)},u.call(l.prototype),u.call(h.prototype),h.prototype.clone=function(){return new h(this._bodyInit,{status:this.status,statusText:this.statusText,headers:new r(this.headers),url:this.url})},h.error=function(){var e=new h(null,{status:0,statusText:\"\"});return e.type=\"error\",e};var v=[301,302,303,307,308];h.redirect=function(e,t){if(v.indexOf(t)===-1)throw new RangeError(\"Invalid status code\");return new h(null,{status:t,headers:{location:e}})},e.Headers=r,e.Request=l,e.Response=h,e.fetch=function(e,t){return new Promise(function(n,r){function i(){return\"responseURL\"in a?a.responseURL:/^X-Request-URL:/m.test(a.getAllResponseHeaders())?a.getResponseHeader(\"X-Request-URL\"):void 0}var o;o=l.prototype.isPrototypeOf(e)&&!t?e:new l(e,t);var a=new XMLHttpRequest;a.onload=function(){var e=1223===a.status?204:a.status;if(e<100||e>599)return void r(new TypeError(\"Network request failed\"));var t={status:e,statusText:a.statusText,headers:f(a),url:i()},o=\"response\"in a?a.response:a.responseText;n(new h(o,t))},a.onerror=function(){r(new TypeError(\"Network request failed\"))},a.ontimeout=function(){r(new TypeError(\"Network request failed\"))},a.open(o.method,o.url,!0),\"include\"===o.credentials&&(a.withCredentials=!0),\"responseType\"in a&&d.blob&&(a.responseType=\"blob\"),o.headers.forEach(function(e,t){a.setRequestHeader(t,e)}),a.send(\"undefined\"==typeof o._bodyInit?null:o._bodyInit)})},e.fetch.polyfill=!0}}(\"undefined\"!=typeof self?self:this)},function(e,t,n){e.exports={default:n(816),__esModule:!0}},function(e,t,n){n(128),n(110),n(817),e.exports=n(59).WeakMap},function(e,t,n){\"use strict\";var r,i=n(818)(0),o=n(101),a=n(118),s=n(144),u=n(821),c=n(87),l=a.getWeak,p=Object.isExtensible,f=u.ufstore,h={},d=function(e){return function(){return e(this,arguments.length>0?arguments[0]:void 0)}},m={get:function(e){if(c(e)){var t=l(e);return t===!0?f(this).get(e):t?t[this._i]:void 0}},set:function(e,t){return u.def(this,e,t)}},v=e.exports=n(822)(\"WeakMap\",d,m,u,!0,!0);7!=(new v).set((Object.freeze||Object)(h),7).get(h)&&(r=u.getConstructor(d),s(r.prototype,m),a.NEED=!0,i([\"delete\",\"has\",\"get\",\"set\"],function(e){var t=v.prototype,n=t[e];o(t,e,function(t,i){if(c(t)&&!p(t)){this._f||(this._f=new r);var o=this._f[e](t,i);return\"set\"==e?this:o}return n.call(this,t,i)})}))},function(e,t,n){var r=n(82),i=n(69),o=n(63),a=n(72),s=n(819);e.exports=function(e,t){var n=1==e,u=2==e,c=3==e,l=4==e,p=6==e,f=5==e||p,h=t||s;return function(t,s,d){for(var m,v,y=o(t),g=i(y),_=r(s,d,3),b=a(g.length),x=0,w=n?h(t,b):u?h(t,0):void 0;b>x;x++)if((f||x in g)&&(m=g[x],v=_(m,x,y),e))if(n)w[x]=v;else if(v)switch(e){case 3:return!0;case 5:return m;case 6:return x;case 2:w.push(m)}else if(l)return!1;return p?-1:c||l?l:w}}},function(e,t,n){var r=n(820);e.exports=function(e,t){return new(r(e))(t)}},function(e,t,n){var r=n(87),i=n(124),o=n(108)(\"species\");e.exports=function(e){var t;return i(e)&&(t=e.constructor,\"function\"!=typeof t||t!==Array&&!i(t.prototype)||(t=void 0),r(t)&&(t=t[o],null===t&&(t=void 0))),void 0===t?Array:t}},function(e,t,n){\"use strict\";var r=n(739),i=n(118).getWeak,o=n(86),a=n(87),s=n(733),u=n(734),c=n(818),l=n(67),p=c(5),f=c(6),h=0,d=function(e){return e._l||(e._l=new m)},m=function(){this.a=[]},v=function(e,t){return p(e.a,function(e){return e[0]===t})};m.prototype={get:function(e){var t=v(this,e);if(t)return t[1]},has:function(e){return!!v(this,e)},set:function(e,t){var n=v(this,e);n?n[1]=t:this.a.push([e,t])},delete:function(e){var t=f(this.a,function(t){return t[0]===e});return~t&&this.a.splice(t,1),!!~t}},e.exports={getConstructor:function(e,t,n,o){var c=e(function(e,r){s(e,c,t,\"_i\"),e._i=h++,e._l=void 0,void 0!=r&&u(r,n,e[o],e)});return r(c.prototype,{delete:function(e){if(!a(e))return!1;var t=i(e);return t===!0?d(this).delete(e):t&&l(t,this._i)&&delete t[this._i]},has:function(e){if(!a(e))return!1;var t=i(e);return t===!0?d(this).has(e):t&&l(t,this._i)}}),c},def:function(e,t,n){var r=i(o(t),!0);return r===!0?d(e).set(t,n):r[e._i]=n,e},ufstore:d}},function(e,t,n){\"use strict\";var r=n(77),i=n(81),o=n(118),a=n(90),s=n(84),u=n(739),c=n(734),l=n(733),p=n(87),f=n(107),h=n(85).f,d=n(818)(0),m=n(89);e.exports=function(e,t,n,v,y,g){var _=r[e],b=_,x=y?\"set\":\"add\",w=b&&b.prototype,k={};return m&&\"function\"==typeof b&&(g||w.forEach&&!a(function(){(new b).entries().next()}))?(b=t(function(t,n){l(t,b,e,\"_c\"),t._c=new _,void 0!=n&&c(n,y,t[x],t)}),d(\"add,clear,delete,forEach,get,has,set,keys,values,entries,toJSON\".split(\",\"),function(e){var t=\"add\"==e||\"set\"==e;e in w&&(!g||\"clear\"!=e)&&s(b.prototype,e,function(n,r){if(l(this,b,e),!t&&g&&!p(n))return\"get\"==e&&void 0;var i=this._c[e](0===n?0:n,r);return t?this:i})}),\"size\"in w&&h(b.prototype,\"size\",{get:function(){return this._c.size}})):(b=v.getConstructor(t,e,y,x),u(b.prototype,n),o.NEED=!0),f(b,e),k[e]=b,i(i.G+i.W+i.F,k),g||v.setStrong(b,e,y),b}},function(e,t,n){(function(t){!function(){\"use strict\";function n(e){var n;return n=e instanceof t?e:new t(e.toString(),\"binary\"),n.toString(\"base64\")}e.exports=n}()}).call(t,n(132).Buffer)},function(e,t,n){/*!\n\t * https://github.com/Starcounter-Jack/JSON-Patch\n\t * json-patch-duplex.js version: 1.1.10\n\t * (c) 2013 Joachim Wester\n\t * MIT license\n\t */\nvar r;!function(e){function t(e,n){switch(typeof e){case\"undefined\":case\"boolean\":case\"string\":case\"number\":return e===n;case\"object\":if(null===e)return null===n;if(E(e)){if(!E(n)||e.length!==n.length)return!1;for(var r=0,i=e.length;r<i;r++)if(!t(e[r],n[r]))return!1;return!0}var o=g(n),a=o.length;if(g(e).length!==a)return!1;for(var r=0;r<a;r++)if(!t(e[r],n[r]))return!1;return!0;default:return!1}}function n(e){return e.indexOf(\"/\")===-1&&e.indexOf(\"~\")===-1?e:e.replace(/~/g,\"~0\").replace(/\\//g,\"~1\")}function r(e){for(var t=0,n=w.length;t<n;t++)if(w[t].obj===e)return w[t]}function i(e,t){for(var n=0,r=e.observers.length;n<r;n++)if(e.observers[n].callback===t)return e.observers[n].observer}function o(e,t){for(var n=0,r=e.observers.length;n<r;n++)if(e.observers[n].observer===t)return void e.observers.splice(n,1)}function a(e,t){t.unobserve()}function s(e){switch(typeof e){case\"object\":return JSON.parse(JSON.stringify(e));case\"undefined\":return null;default:return e}}function u(e,t){var n,a=[],u=r(e);if(u?n=i(u,t):(u=new k(e),w.push(u)),n)return n;if(n={},u.value=s(e),t){n.callback=t,n.next=null;var l=function(){c(n)},p=function(){clearTimeout(n.next),n.next=setTimeout(l)};\"undefined\"!=typeof window&&(window.addEventListener?(window.addEventListener(\"mouseup\",p),window.addEventListener(\"keyup\",p),window.addEventListener(\"mousedown\",p),window.addEventListener(\"keydown\",p),window.addEventListener(\"change\",p)):(document.documentElement.attachEvent(\"onmouseup\",p),document.documentElement.attachEvent(\"onkeyup\",p),document.documentElement.attachEvent(\"onmousedown\",p),document.documentElement.attachEvent(\"onkeydown\",p),document.documentElement.attachEvent(\"onchange\",p)))}return n.patches=a,n.object=e,n.unobserve=function(){c(n),clearTimeout(n.next),o(u,n),\"undefined\"!=typeof window&&(window.removeEventListener?(window.removeEventListener(\"mouseup\",p),window.removeEventListener(\"keyup\",p),window.removeEventListener(\"mousedown\",p),window.removeEventListener(\"keydown\",p)):(document.documentElement.detachEvent(\"onmouseup\",p),document.documentElement.detachEvent(\"onkeyup\",p),document.documentElement.detachEvent(\"onmousedown\",p),document.documentElement.detachEvent(\"onkeydown\",p)))},u.observers.push(new S(t,n)),n}function c(e){for(var t,n=0,r=w.length;n<r;n++)if(w[n].obj===e.object){t=w[n];break}l(t.value,e.object,e.patches,\"\"),e.patches.length&&f(t.value,e.patches);var i=e.patches;return i.length>0&&(e.patches=[],e.callback&&e.callback(i)),i}function l(e,t,r,i){if(t!==e){\"function\"==typeof t.toJSON&&(t=t.toJSON());for(var o=g(t),a=g(e),u=!1,c=!1,p=a.length-1;p>=0;p--){var f=a[p],h=e[f];if(!t.hasOwnProperty(f)||void 0===t[f]&&void 0!==h&&E(t)===!1)r.push({op:\"remove\",path:i+\"/\"+n(f)}),c=!0;else{var d=t[f];\"object\"==typeof h&&null!=h&&\"object\"==typeof d&&null!=d?l(h,d,r,i+\"/\"+n(f)):h!==d&&(u=!0,r.push({op:\"replace\",path:i+\"/\"+n(f),value:s(d)}))}}if(c||o.length!=a.length)for(var p=0;p<o.length;p++){var f=o[p];e.hasOwnProperty(f)||void 0===t[f]||r.push({op:\"add\",path:i+\"/\"+n(f),value:s(t[f])})}}}function p(e){for(var t,n=0,r=e.length;n<r;){t=e.charCodeAt(n);{if(!(t>=48&&t<=57))return!1;n++}}return!0}function f(e,t,n){for(var r,i,o=[],a=0,s=t.length;a<s;){r=t[a],a++;for(var u=r.path||\"\",c=u.split(\"/\"),l=e,f=1,h=c.length,d=void 0;;){if(i=c[f],n&&void 0===d&&(void 0===l[i]?d=c.slice(0,f).join(\"/\"):f==h-1&&(d=r.path),void 0!==d&&this.validator(r,a-1,e,d)),f++,void 0===i&&f>=h){o.push(x[r.op].call(r,l,i,e));break}if(E(l)){if(\"-\"===i)i=l.length;else{if(n&&!p(i))throw new C(\"Expected an unsigned base-10 integer value, making the new referenced value the array element with the zero-based index\",\"OPERATION_PATH_ILLEGAL_ARRAY_INDEX\",a-1,r.path,r);i=parseInt(i,10)}if(f>=h){if(n&&\"add\"===r.op&&i>l.length)throw new C(\"The specified index MUST NOT be greater than the number of elements in the array\",\"OPERATION_VALUE_OUT_OF_BOUNDS\",a-1,r.path,r);o.push(b[r.op].call(r,l,i,e));break}}else if(i&&i.indexOf(\"~\")!=-1&&(i=i.replace(/~1/g,\"/\").replace(/~0/g,\"~\")),f>=h){o.push(_[r.op].call(r,l,i,e));break}l=l[i]}}return o}function h(e,t){var n=[];return l(e,t,n,\"\"),n}function d(e,t){function n(){this.constructor=e}for(var r in t)t.hasOwnProperty(r)&&(e[r]=t[r]);e.prototype=null===t?Object.create(t):(n.prototype=t.prototype,new n)}function m(e){if(void 0===e)return!0;if(e)if(E(e)){for(var t=0,n=e.length;t<n;t++)if(m(e[t]))return!0}else if(\"object\"==typeof e)for(var r=g(e),i=r.length,t=0;t<i;t++)if(m(e[r[t]]))return!0;return!1}function v(t,n,r,i){if(\"object\"!=typeof t||null===t||E(t))throw new C(\"Operation is not an object\",\"OPERATION_NOT_AN_OBJECT\",n,t,r);if(!_[t.op])throw new C(\"Operation `op` property is not one of operations defined in RFC-6902\",\"OPERATION_OP_INVALID\",n,t,r);if(\"string\"!=typeof t.path)throw new C(\"Operation `path` property is not a string\",\"OPERATION_PATH_INVALID\",n,t,r);if(0!==t.path.indexOf(\"/\")&&t.path.length>0)throw new C('Operation `path` property must start with \"/\"',\"OPERATION_PATH_INVALID\",n,t,r);if((\"move\"===t.op||\"copy\"===t.op)&&\"string\"!=typeof t.from)throw new C(\"Operation `from` property is not present (applicable in `move` and `copy` operations)\",\"OPERATION_FROM_REQUIRED\",n,t,r);if((\"add\"===t.op||\"replace\"===t.op||\"test\"===t.op)&&void 0===t.value)throw new C(\"Operation `value` property is not present (applicable in `add`, `replace` and `test` operations)\",\"OPERATION_VALUE_REQUIRED\",n,t,r);if((\"add\"===t.op||\"replace\"===t.op||\"test\"===t.op)&&m(t.value))throw new C(\"Operation `value` property is not present (applicable in `add`, `replace` and `test` operations)\",\"OPERATION_VALUE_CANNOT_CONTAIN_UNDEFINED\",n,t,r);if(r)if(\"add\"==t.op){var o=t.path.split(\"/\").length,a=i.split(\"/\").length;if(o!==a+1&&o!==a)throw new C(\"Cannot perform an `add` operation at the desired path\",\"OPERATION_PATH_CANNOT_ADD\",n,t,r)}else if(\"replace\"===t.op||\"remove\"===t.op||\"_get\"===t.op){if(t.path!==i)throw new C(\"Cannot perform the operation at a path that does not exist\",\"OPERATION_PATH_UNRESOLVABLE\",n,t,r)}else if(\"move\"===t.op||\"copy\"===t.op){var s={op:\"_get\",path:t.from,value:void 0},u=e.validate([s],r);if(u&&\"OPERATION_PATH_UNRESOLVABLE\"===u.name)throw new C(\"Cannot perform the operation from a path that does not exist\",\"OPERATION_FROM_UNRESOLVABLE\",n,t,r)}}function y(e,t){try{if(!E(e))throw new C(\"Patch sequence must be an array\",\"SEQUENCE_NOT_AN_ARRAY\");if(t)t=JSON.parse(JSON.stringify(t)),f.call(this,t,e,!0);else for(var n=0;n<e.length;n++)this.validator(e[n],n)}catch(e){if(e instanceof C)return e;throw e}}var g=function(e){if(E(e)){for(var t=new Array(e.length),n=0;n<t.length;n++)t[n]=\"\"+n;return t}if(Object.keys)return Object.keys(e);var t=[];for(var r in e)e.hasOwnProperty(r)&&t.push(r);return t},_={add:function(e,t){e[t]=this.value},remove:function(e,t){var n=e[t];return delete e[t],n},replace:function(e,t){var n=e[t];return e[t]=this.value,n},move:function(e,t,n){var r={op:\"_get\",path:this.path};f(n,[r]);var i=void 0===r.value?void 0:JSON.parse(JSON.stringify(r.value)),o={op:\"_get\",path:this.from};return f(n,[o]),f(n,[{op:\"remove\",path:this.from}]),f(n,[{op:\"add\",path:this.path,value:o.value}]),i},copy:function(e,t,n){var r={op:\"_get\",path:this.from};f(n,[r]),f(n,[{op:\"add\",path:this.path,value:r.value}])},test:function(e,n){return t(e[n],this.value)},_get:function(e,t){this.value=e[t]}},b={add:function(e,t){return e.splice(t,0,this.value),t},remove:function(e,t){var n=e.splice(t,1);return n[0]},replace:function(e,t){var n=e[t];return e[t]=this.value,n},move:_.move,copy:_.copy,test:_.test,_get:_._get},x={add:function(e){x.remove.call(this,e);for(var t in this.value)this.value.hasOwnProperty(t)&&(e[t]=this.value[t])},remove:function(e){var t={};for(var n in e)e.hasOwnProperty(n)&&(t[n]=e[n],_.remove.call(this,e,n));return t},replace:function(e){var t=f(e,[{op:\"remove\",path:this.path}]);return f(e,[{op:\"add\",path:this.path,value:this.value}]),t[0]},move:_.move,copy:_.copy,test:function(e){return JSON.stringify(e)===JSON.stringify(this.value)},_get:function(e){this.value=e}},w=[],k=function(){function e(e){this.observers=[],this.obj=e}return e}(),S=function(){function e(e,t){this.callback=e,this.observer=t}return e}();e.unobserve=a,e.observe=u,e.generate=c;var E;E=Array.isArray?Array.isArray:function(e){return e.push&&\"number\"==typeof e.length},e.apply=f,e.compare=h;var C=function(e){function t(t,n,r,i,o){e.call(this,t),this.message=t,this.name=n,this.index=r,this.operation=i,this.tree=o}return d(t,e),t}(Error);e.JsonPatchError=C,e.validator=v,e.validate=y}(r||(r={}));var t,i;t.apply=r.apply,t.observe=r.observe,t.unobserve=r.unobserve,t.generate=r.generate,t.compare=r.compare,t.validate=r.validate,t.validator=r.validator,t.JsonPatchError=r.JsonPatchError,Object.defineProperty(t,\"__esModule\",{value:!0}),t.default=r,i&&(t=void 0)},function(e,t){e.exports=FormData},function(e,t,n){function r(e){return i(e,!0,!0)}var i=n(827);e.exports=r},function(e,t,n){function r(e,t,n,x,w,k,S){var A;if(x&&(A=k?x(e,w,k,S):x(e)),void 0!==A)return A;if(!g(e))return e;var T=v(e);if(T){if(A=h(e),!t)return c(e,A)}else{var M=f(e),O=M==E||M==C;if(y(e))return u(e,t);if(M==D||M==b||O&&!k){if(A=m(O?{}:e),!t)return l(e,s(A,e))}else{if(!H[M])return k?e:{};A=d(e,M,r,t)}}S||(S=new i);var P=S.get(e);if(P)return P;if(S.set(e,A),!T)var I=n?p(e):_(e);return o(I||e,function(i,o){I&&(o=i,i=e[o]),a(A,o,r(i,t,n,x,o,e,S))}),A}var i=n(828),o=n(857),a=n(765),s=n(858),u=n(859),c=n(860),l=n(861),p=n(864),f=n(867),h=n(873),d=n(874),m=n(889),v=n(800),y=n(892),g=n(781),_=n(794),b=\"[object Arguments]\",x=\"[object Array]\",w=\"[object Boolean]\",k=\"[object Date]\",S=\"[object Error]\",E=\"[object Function]\",C=\"[object GeneratorFunction]\",A=\"[object Map]\",T=\"[object Number]\",D=\"[object Object]\",M=\"[object RegExp]\",O=\"[object Set]\",P=\"[object String]\",I=\"[object Symbol]\",N=\"[object WeakMap]\",R=\"[object ArrayBuffer]\",j=\"[object DataView]\",F=\"[object Float32Array]\",B=\"[object Float64Array]\",L=\"[object Int8Array]\",z=\"[object Int16Array]\",q=\"[object Int32Array]\",U=\"[object Uint8Array]\",W=\"[object Uint8ClampedArray]\",K=\"[object Uint16Array]\",V=\"[object Uint32Array]\",H={};H[b]=H[x]=H[R]=H[j]=H[w]=H[k]=H[F]=H[B]=H[L]=H[z]=H[q]=H[A]=H[T]=H[D]=H[M]=H[O]=H[P]=H[I]=H[U]=H[W]=H[K]=H[V]=!0,H[S]=H[E]=H[N]=!1,e.exports=r},[1204,829,836,837,838,839,840],function(e,t,n){function r(e){var t=-1,n=e?e.length:0;for(this.clear();++t<n;){var r=e[t];this.set(r[0],r[1])}}var i=n(830),o=n(831),a=n(833),s=n(834),u=n(835);r.prototype.clear=i,r.prototype.delete=o,r.prototype.get=a,r.prototype.has=s,r.prototype.set=u,e.exports=r},231,[1190,832],[1191,767],[1192,832],[1193,832],[1194,832],[1205,829],252,253,254,[1206,829,841,842],[1195,778,784],function(e,t,n){function r(e){var t=-1,n=e?e.length:0;for(this.clear();++t<n;){var r=e[t];this.set(r[0],r[1])}}var i=n(843),o=n(851),a=n(854),s=n(855),u=n(856);r.prototype.clear=i,r.prototype.delete=o,r.prototype.get=a,r.prototype.has=s,r.prototype.set=u,e.exports=r},[1180,844,829,841],function(e,t,n){function r(e){var t=-1,n=e?e.length:0;for(this.clear();++t<n;){var r=e[t];this.set(r[0],r[1])}}var i=n(845),o=n(847),a=n(848),s=n(849),u=n(850);r.prototype.clear=i,r.prototype.delete=o,r.prototype.get=a,r.prototype.has=s,r.prototype.set=u,e.exports=r},[1181,846],[1182,778],226,[1187,846],[1188,846],[1189,846],[1196,852],[1197,853],241,[1198,852],[1199,852],[1200,852],function(e,t){function n(e,t){for(var n=-1,r=e?e.length:0;++n<r&&t(e[n],n,e)!==!1;);return e}e.exports=n},[1234,768,794],[1236,784],690,function(e,t,n){function r(e,t){return i(e,o(e),t)}var i=n(768),o=n(862);e.exports=r},function(e,t,n){var r=n(803),i=n(863),o=Object.getOwnPropertySymbols,a=o?r(o,Object):i;e.exports=a},693,[1237,865,862,794],[1238,866,800],696,function(e,t,n){var r=n(868),i=n(841),o=n(869),a=n(870),s=n(871),u=n(872),c=n(786),l=\"[object Map]\",p=\"[object Object]\",f=\"[object Promise]\",h=\"[object Set]\",d=\"[object WeakMap]\",m=\"[object DataView]\",v=Object.prototype,y=v.toString,g=c(r),_=c(i),b=c(o),x=c(a),w=c(s),k=u;(r&&k(new r(new ArrayBuffer(1)))!=m||i&&k(new i)!=l||o&&k(o.resolve())!=f||a&&k(new a)!=h||s&&k(new s)!=d)&&(k=function(e){var t=y.call(e),n=t==p?e.constructor:void 0,r=n?c(n):void 0;if(r)switch(r){case g:return m;case _:return l;case b:return f;case x:return h;case w:return d}return t}),e.exports=k},[1214,778,784],[1215,778,784],[1216,778,784],[1217,778,784],function(e,t){function n(e){return i.call(e)}var r=Object.prototype,i=r.toString;e.exports=n},700,[1239,875,877,878,882,883,886,888],[1240,876],[1207,784],[1241,875],function(e,t,n){function r(e,t,n){var r=t?n(a(e),!0):a(e);return o(r,i,new e.constructor)}var i=n(879),o=n(880),a=n(881);e.exports=r},705,function(e,t){function n(e,t,n,r){var i=-1,o=e?e.length:0;for(r&&o&&(n=e[++i]);++i<o;)n=t(n,e[i],i,e);return n}e.exports=n},266,706,function(e,t,n){function r(e,t,n){var r=t?n(a(e),!0):a(e);return o(r,i,new e.constructor)}var i=n(884),o=n(880),a=n(885);e.exports=r},708,267,[1242,887],[1177,784],[1243,875],[1244,890,891,793],function(e,t,n){var r=n(781),i=Object.create,o=function(){function e(){}return function(t){if(!r(t))return{};if(i)return i(t);e.prototype=prototype;var n=new e;return e.prototype=void 0,n}}();e.exports=o},[1179,803],[1209,784,893],275,function(e,t,n){var r=n(895),i=n(934),o=r(i);e.exports=o},[1201,896,790,794],[1202,897,916,771,800,931],[1203,898,913,915],function(e,t,n){function r(e,t,n,r){var u=n.length,c=u,l=!r;if(null==e)return!c;for(e=Object(e);u--;){var p=n[u];if(l&&p[2]?p[1]!==e[p[0]]:!(p[0]in e))return!1}for(;++u<c;){p=n[u];var f=p[0],h=e[f],d=p[1];if(l&&p[2]){if(void 0===h&&!(f in e))return!1}else{var m=new i;if(r)var v=r(h,d,f,e,t,m);if(!(void 0===v?o(d,h,r,a|s,m):v))return!1}}return!0}var i=n(828),o=n(899),a=1,s=2;e.exports=r},function(e,t,n){function r(e,t,n,s,u){return e===t||(null==e||null==t||!o(e)&&!a(t)?e!==e&&t!==t:i(e,t,r,n,s,u))}var i=n(900),o=n(781),a=n(799);e.exports=r},function(e,t,n){function r(e,t,n,r,m,y){var g=c(e),_=c(t),b=h,x=h;g||(b=u(e),b=b==f?d:b),_||(x=u(t),x=x==f?d:x);var w=b==d,k=x==d,S=b==x;if(S&&!w)return y||(y=new i),g||l(e)?o(e,t,n,r,m,y):a(e,t,b,n,r,m,y);if(!(m&p)){var E=w&&v.call(e,\"__wrapped__\"),C=k&&v.call(t,\"__wrapped__\");if(E||C){var A=E?e.value():e,T=C?t.value():t;return y||(y=new i),n(A,T,r,m,y)}}return!!S&&(y||(y=new i),s(e,t,n,r,m,y))}var i=n(828),o=n(901),a=n(907),s=n(908),u=n(867),c=n(800),l=n(909),p=2,f=\"[object Arguments]\",h=\"[object Array]\",d=\"[object Object]\",m=Object.prototype,v=m.hasOwnProperty;e.exports=r},function(e,t,n){function r(e,t,n,r,c,l){var p=c&u,f=e.length,h=t.length;if(f!=h&&!(p&&h>f))return!1;var d=l.get(e);if(d&&l.get(t))return d==t;var m=-1,v=!0,y=c&s?new i:void 0;for(l.set(e,t),l.set(t,e);++m<f;){var g=e[m],_=t[m];if(r)var b=p?r(_,g,m,t,e,l):r(g,_,m,e,t,l);if(void 0!==b){if(b)continue;v=!1;break}if(y){if(!o(t,function(e,t){if(!a(y,t)&&(g===e||n(g,e,r,c,l)))return y.push(t)})){v=!1;break}}else if(g!==_&&!n(g,_,r,c,l)){v=!1;break}}return l.delete(e),l.delete(t),v}var i=n(902),o=n(905),a=n(906),s=1,u=2;e.exports=r},function(e,t,n){function r(e){var t=-1,n=e?e.length:0;for(this.__data__=new i;++t<n;)this.add(e[t])}var i=n(842),o=n(903),a=n(904);r.prototype.add=r.prototype.push=o,r.prototype.has=a,e.exports=r},260,261,function(e,t){function n(e,t){for(var n=-1,r=e?e.length:0;++n<r;)if(t(e[n],n,e))return!0;return!1}e.exports=n},263,function(e,t,n){function r(e,t,n,r,i,k,E){switch(n){case w:if(e.byteLength!=t.byteLength||e.byteOffset!=t.byteOffset)return!1;e=e.buffer,t=t.buffer;case x:return!(e.byteLength!=t.byteLength||!r(new o(e),new o(t)));case f:case h:case v:return a(+e,+t);case d:return e.name==t.name&&e.message==t.message;case y:case _:return e==t+\"\";case m:var C=u;case g:var A=k&p;if(C||(C=c),e.size!=t.size&&!A)return!1;var T=E.get(e);if(T)return T==t;k|=l,E.set(e,t);var D=s(C(e),C(t),r,i,k,E);return E.delete(e),D;case b:if(S)return S.call(e)==S.call(t)}return!1}var i=n(887),o=n(876),a=n(767),s=n(901),u=n(881),c=n(885),l=1,p=2,f=\"[object Boolean]\",h=\"[object Date]\",d=\"[object Error]\",m=\"[object Map]\",v=\"[object Number]\",y=\"[object RegExp]\",g=\"[object Set]\",_=\"[object String]\",b=\"[object Symbol]\",x=\"[object ArrayBuffer]\",w=\"[object DataView]\",k=i?i.prototype:void 0,S=k?k.valueOf:void 0;e.exports=r},function(e,t,n){function r(e,t,n,r,a,u){var c=a&o,l=i(e),p=l.length,f=i(t),h=f.length;if(p!=h&&!c)return!1;for(var d=p;d--;){var m=l[d];if(!(c?m in t:s.call(t,m)))return!1}var v=u.get(e);if(v&&u.get(t))return v==t;var y=!0;u.set(e,t),u.set(t,e);for(var g=c;++d<p;){m=l[d];var _=e[m],b=t[m];if(r)var x=c?r(b,_,m,t,e,u):r(_,b,m,e,t,u);if(!(void 0===x?_===b||n(_,b,r,a,u):x)){y=!1;break}g||(g=\"constructor\"==m)}if(y&&!g){var w=e.constructor,k=t.constructor;w!=k&&\"constructor\"in e&&\"constructor\"in t&&!(\"function\"==typeof w&&w instanceof w&&\"function\"==typeof k&&k instanceof k)&&(y=!1)}return u.delete(e),u.delete(t),y}var i=n(794),o=2,a=Object.prototype,s=a.hasOwnProperty;e.exports=r},[1210,910,911,912],function(e,t,n){function r(e){return o(e)&&i(e.length)&&!!M[P.call(e)]}var i=n(791),o=n(799),a=\"[object Arguments]\",s=\"[object Array]\",u=\"[object Boolean]\",c=\"[object Date]\",l=\"[object Error]\",p=\"[object Function]\",f=\"[object Map]\",h=\"[object Number]\",d=\"[object Object]\",m=\"[object RegExp]\",v=\"[object Set]\",y=\"[object String]\",g=\"[object WeakMap]\",_=\"[object ArrayBuffer]\",b=\"[object DataView]\",x=\"[object Float32Array]\",w=\"[object Float64Array]\",k=\"[object Int8Array]\",S=\"[object Int16Array]\",E=\"[object Int32Array]\",C=\"[object Uint8Array]\",A=\"[object Uint8ClampedArray]\",T=\"[object Uint16Array]\",D=\"[object Uint32Array]\",M={};M[x]=M[w]=M[k]=M[S]=M[E]=M[C]=M[A]=M[T]=M[D]=!0,M[a]=M[s]=M[_]=M[u]=M[b]=M[c]=M[l]=M[p]=M[f]=M[h]=M[d]=M[m]=M[v]=M[y]=M[g]=!1;var O=Object.prototype,P=O.toString;e.exports=r},280,function(e,t,n){(function(e){var r=n(785),i=\"object\"==typeof t&&t&&!t.nodeType&&t,o=i&&\"object\"==typeof e&&e&&!e.nodeType&&e,a=o&&o.exports===i,s=a&&r.process,u=function(){try{return s&&s.binding(\"util\")}catch(e){}}();e.exports=u}).call(t,n(161)(e))},[1218,914,794],[1219,781],293,function(e,t,n){function r(e,t){return s(e)&&u(t)?c(l(e),t):function(n){var r=o(n,e);return void 0===r&&r===t?a(n,e):i(t,r,void 0,p|f)}}var i=n(899),o=n(917),a=n(928),s=n(926),u=n(914),c=n(915),l=n(927),p=1,f=2;e.exports=r},[1220,918],function(e,t,n){function r(e,t){t=o(t,e)?[t]:i(t);for(var n=0,r=t.length;null!=e&&n<r;)e=e[a(t[n++])];return n&&n==r?e:void 0}var i=n(919),o=n(926),a=n(927);e.exports=r},function(e,t,n){function r(e){return i(e)?e:o(e)}var i=n(800),o=n(920);e.exports=r},function(e,t,n){var r=n(921),i=n(923),o=/^\\./,a=/[^.[\\]]+|\\[(?:(-?\\d+(?:\\.\\d+)?)|([\"'])((?:(?!\\2)[^\\\\]|\\\\.)*?)\\2)\\]|(?=(?:\\.|\\[\\])(?:\\.|\\[\\]|$))/g,s=/\\\\(\\\\)?/g,u=r(function(e){e=i(e);var t=[];return o.test(e)&&t.push(\"\"),e.replace(a,function(e,n,r,i){t.push(r?i.replace(s,\"$1\"):n||e)}),t});e.exports=u},[1222,922],function(e,t,n){function r(e,t){if(\"function\"!=typeof e||t&&\"function\"!=typeof t)throw new TypeError(o);var n=function(){var r=arguments,i=t?t.apply(this,r):r[0],o=n.cache;if(o.has(i))return o.get(i);var a=e.apply(this,r);return n.cache=o.set(i,a)||o,a};return n.cache=new(r.Cache||i),n}var i=n(842),o=\"Expected a function\";r.Cache=i,e.exports=r},function(e,t,n){function r(e){return null==e?\"\":i(e)}var i=n(924);e.exports=r},function(e,t,n){function r(e){if(\"string\"==typeof e)return e;if(o(e))return u?u.call(e):\"\";var t=e+\"\";return\"0\"==t&&1/e==-a?\"-0\":t}var i=n(887),o=n(925),a=1/0,s=i?i.prototype:void 0,u=s?s.toString:void 0;e.exports=r},function(e,t,n){function r(e){return\"symbol\"==typeof e||i(e)&&s.call(e)==o}var i=n(799),o=\"[object Symbol]\",a=Object.prototype,s=a.toString;e.exports=r},[1221,800,925],[1223,925],[1224,929,930],303,function(e,t,n){function r(e,t,n){t=u(t,e)?[t]:i(t);for(var r=-1,p=t.length,f=!1;++r<p;){var h=l(t[r]);if(!(f=null!=e&&n(e,h)))break;e=e[h]}return f||++r!=p?f:(p=e?e.length:0,!!p&&c(p)&&s(h,p)&&(a(e)||o(e)))}var i=n(919),o=n(797),a=n(800),s=n(792),u=n(926),c=n(791),l=n(927);e.exports=r},[1225,932,933,926,927],307,[1226,918],function(e,t,n){function r(e,t,n){var r=e?e.length:0;if(!r)return-1;var u=null==n?0:a(n);return u<0&&(u=s(r+u,0)),i(e,o(t,3),u)}var i=n(935),o=n(896),a=n(936),s=Math.max;e.exports=r},310,[1227,937],[1228,938],[1229,781,925],function(e,t,n){function r(e){if(!o(e)||f.call(e)!=a)return!1;var t=i(e);if(null===t)return!0;var n=l.call(t,\"constructor\")&&t.constructor;return\"function\"==typeof n&&n instanceof n&&c.call(n)==p}var i=n(891),o=n(799),a=\"[object Object]\",s=Function.prototype,u=Object.prototype,c=s.toString,l=u.hasOwnProperty,p=c.call(Object),f=u.toString;e.exports=r},function(e,t,n){function r(e){return\"string\"==typeof e||!i(e)&&o(e)&&u.call(e)==a}var i=n(800),o=n(799),a=\"[object String]\",s=Object.prototype,u=s.toString;e.exports=r},function(e,t,n){var r=n(942),i=n(943),o=n(945),a=n(927),s=o(function(e,t){return null==e?{}:i(e,r(t,a))});e.exports=s},function(e,t){function n(e,t){for(var n=-1,r=e?e.length:0,i=Array(r);++n<r;)i[n]=t(e[n],n,e);return i}e.exports=n},function(e,t,n){function r(e,t){return e=Object(e),i(e,t,function(t,n){return n in e})}var i=n(944);e.exports=r},function(e,t,n){function r(e,t,n){for(var r=-1,o=t.length,a={};++r<o;){var s=t[r],u=e[s];n(u,s)&&i(a,s,u)}return a}var i=n(766);e.exports=r},[1245,946,772,774],function(e,t,n){function r(e){var t=e?e.length:0;return t?i(e,1):[]}var i=n(947);e.exports=r},[1246,866,948],[1247,887,797,800],function(e,t,n){\"use strict\";var r=n(950),i=n(953),o=n(952);e.exports={formats:o,parse:i,stringify:r}},function(e,t,n){\"use strict\";var r=n(951),i=n(952),o={brackets:function(e){return e+\"[]\"},indices:function(e,t){return e+\"[\"+t+\"]\"},repeat:function(e){return e}},a=Date.prototype.toISOString,s={delimiter:\"&\",encode:!0,encoder:r.encode,encodeValuesOnly:!1,serializeDate:function(e){return a.call(e)},skipNulls:!1,strictNullHandling:!1},u=function e(t,n,i,o,a,s,u,c,l,p,f,h){var d=t;if(\"function\"==typeof u)d=u(n,d);else if(d instanceof Date)d=p(d);else if(null===d){if(o)return s&&!h?s(n):n;d=\"\"}if(\"string\"==typeof d||\"number\"==typeof d||\"boolean\"==typeof d||r.isBuffer(d)){if(s){var m=h?n:s(n);return[f(m)+\"=\"+f(s(d))]}return[f(n)+\"=\"+f(String(d))]}var v=[];if(\"undefined\"==typeof d)return v;var y;if(Array.isArray(u))y=u;else{var g=Object.keys(d);y=c?g.sort(c):g}for(var _=0;_<y.length;++_){var b=y[_];a&&null===d[b]||(v=Array.isArray(d)?v.concat(e(d[b],i(n,b),i,o,a,s,u,c,l,p,f,h)):v.concat(e(d[b],n+(l?\".\"+b:\"[\"+b+\"]\"),i,o,a,s,u,c,l,p,f,h)))}return v};e.exports=function(e,t){var n=e,r=t||{};if(null!==r.encoder&&void 0!==r.encoder&&\"function\"!=typeof r.encoder)throw new TypeError(\"Encoder has to be a function.\");var a=\"undefined\"==typeof r.delimiter?s.delimiter:r.delimiter,c=\"boolean\"==typeof r.strictNullHandling?r.strictNullHandling:s.strictNullHandling,l=\"boolean\"==typeof r.skipNulls?r.skipNulls:s.skipNulls,p=\"boolean\"==typeof r.encode?r.encode:s.encode,f=\"function\"==typeof r.encoder?r.encoder:s.encoder,h=\"function\"==typeof r.sort?r.sort:null,d=\"undefined\"!=typeof r.allowDots&&r.allowDots,m=\"function\"==typeof r.serializeDate?r.serializeDate:s.serializeDate,v=\"boolean\"==typeof r.encodeValuesOnly?r.encodeValuesOnly:s.encodeValuesOnly;if(\"undefined\"==typeof r.format)r.format=i.default;else if(!Object.prototype.hasOwnProperty.call(i.formatters,r.format))throw new TypeError(\"Unknown format option provided.\");var y,g,_=i.formatters[r.format];\"function\"==typeof r.filter?(g=r.filter,n=g(\"\",n)):Array.isArray(r.filter)&&(g=r.filter,y=g);var b=[];if(\"object\"!=typeof n||null===n)return\"\";var x;x=r.arrayFormat in o?r.arrayFormat:\"indices\"in r?r.indices?\"indices\":\"repeat\":\"indices\";var w=o[x];y||(y=Object.keys(n)),h&&y.sort(h);for(var k=0;k<y.length;++k){var S=y[k];l&&null===n[S]||(b=b.concat(u(n[S],S,w,c,l,p?f:null,g,h,d,m,_,v)))}return b.join(a)}},function(e,t){\"use strict\";var n=Object.prototype.hasOwnProperty,r=function(){for(var e=[],t=0;t<256;++t)e.push(\"%\"+((t<16?\"0\":\"\")+t.toString(16)).toUpperCase());return e}();t.arrayToObject=function(e,t){for(var n=t&&t.plainObjects?Object.create(null):{},r=0;r<e.length;++r)\"undefined\"!=typeof e[r]&&(n[r]=e[r]);return n},t.merge=function(e,r,i){if(!r)return e;if(\"object\"!=typeof r){if(Array.isArray(e))e.push(r);else{if(\"object\"!=typeof e)return[e,r];(i.plainObjects||i.allowPrototypes||!n.call(Object.prototype,r))&&(e[r]=!0)}return e}if(\"object\"!=typeof e)return[e].concat(r);var o=e;return Array.isArray(e)&&!Array.isArray(r)&&(o=t.arrayToObject(e,i)),Array.isArray(e)&&Array.isArray(r)?(r.forEach(function(r,o){n.call(e,o)?e[o]&&\"object\"==typeof e[o]?e[o]=t.merge(e[o],r,i):e.push(r):e[o]=r}),e):Object.keys(r).reduce(function(e,n){var o=r[n];return Object.prototype.hasOwnProperty.call(e,n)?e[n]=t.merge(e[n],o,i):e[n]=o,e},o)},t.decode=function(e){try{return decodeURIComponent(e.replace(/\\+/g,\" \"))}catch(t){return e}},t.encode=function(e){if(0===e.length)return e;for(var t=\"string\"==typeof e?e:String(e),n=\"\",i=0;i<t.length;++i){var o=t.charCodeAt(i);45===o||46===o||95===o||126===o||o>=48&&o<=57||o>=65&&o<=90||o>=97&&o<=122?n+=t.charAt(i):o<128?n+=r[o]:o<2048?n+=r[192|o>>6]+r[128|63&o]:o<55296||o>=57344?n+=r[224|o>>12]+r[128|o>>6&63]+r[128|63&o]:(i+=1,o=65536+((1023&o)<<10|1023&t.charCodeAt(i)),n+=r[240|o>>18]+r[128|o>>12&63]+r[128|o>>6&63]+r[128|63&o])}return n},t.compact=function(e,n){if(\"object\"!=typeof e||null===e)return e;var r=n||[],i=r.indexOf(e);if(i!==-1)return r[i];if(r.push(e),Array.isArray(e)){for(var o=[],a=0;a<e.length;++a)e[a]&&\"object\"==typeof e[a]?o.push(t.compact(e[a],r)):\"undefined\"!=typeof e[a]&&o.push(e[a]);return o}var s=Object.keys(e);return s.forEach(function(n){e[n]=t.compact(e[n],r)}),e},t.isRegExp=function(e){return\"[object RegExp]\"===Object.prototype.toString.call(e)},t.isBuffer=function(e){return null!==e&&\"undefined\"!=typeof e&&!!(e.constructor&&e.constructor.isBuffer&&e.constructor.isBuffer(e))}},function(e,t){\"use strict\";var n=String.prototype.replace,r=/%20/g;e.exports={default:\"RFC3986\",formatters:{RFC1738:function(e){return n.call(e,r,\"+\")},RFC3986:function(e){return e}},RFC1738:\"RFC1738\",RFC3986:\"RFC3986\"}},function(e,t,n){\"use strict\";var r=n(951),i=Object.prototype.hasOwnProperty,o={allowDots:!1,allowPrototypes:!1,arrayLimit:20,decoder:r.decode,delimiter:\"&\",depth:5,parameterLimit:1e3,plainObjects:!1,strictNullHandling:!1},a=function(e,t){for(var n={},r=e.split(t.delimiter,t.parameterLimit===1/0?void 0:t.parameterLimit),o=0;o<r.length;++o){var a,s,u=r[o],c=u.indexOf(\"]=\")===-1?u.indexOf(\"=\"):u.indexOf(\"]=\")+1;c===-1?(a=t.decoder(u),s=t.strictNullHandling?null:\"\"):(a=t.decoder(u.slice(0,c)),s=t.decoder(u.slice(c+1))),i.call(n,a)?n[a]=[].concat(n[a]).concat(s):n[a]=s}return n},s=function(e,t,n){if(!e.length)return t;var r,i=e.shift();if(\"[]\"===i)r=[],r=r.concat(s(e,t,n));else{r=n.plainObjects?Object.create(null):{};var o=\"[\"===i.charAt(0)&&\"]\"===i.charAt(i.length-1)?i.slice(1,-1):i,a=parseInt(o,10);!isNaN(a)&&i!==o&&String(a)===o&&a>=0&&n.parseArrays&&a<=n.arrayLimit?(r=[],r[a]=s(e,t,n)):r[o]=s(e,t,n)}return r},u=function(e,t,n){if(e){var r=n.allowDots?e.replace(/\\.([^.[]+)/g,\"[$1]\"):e,o=/(\\[[^[\\]]*])/,a=/(\\[[^[\\]]*])/g,u=o.exec(r),c=u?r.slice(0,u.index):r,l=[];if(c){if(!n.plainObjects&&i.call(Object.prototype,c)&&!n.allowPrototypes)return;l.push(c)}for(var p=0;null!==(u=a.exec(r))&&p<n.depth;){if(p+=1,!n.plainObjects&&i.call(Object.prototype,u[1].slice(1,-1))&&!n.allowPrototypes)return;l.push(u[1])}return u&&l.push(\"[\"+r.slice(u.index)+\"]\"),s(l,t,n)}};e.exports=function(e,t){var n=t||{};if(null!==n.decoder&&void 0!==n.decoder&&\"function\"!=typeof n.decoder)throw new TypeError(\"Decoder has to be a function.\");if(n.delimiter=\"string\"==typeof n.delimiter||r.isRegExp(n.delimiter)?n.delimiter:o.delimiter,n.depth=\"number\"==typeof n.depth?n.depth:o.depth,n.arrayLimit=\"number\"==typeof n.arrayLimit?n.arrayLimit:o.arrayLimit,n.parseArrays=n.parseArrays!==!1,n.decoder=\"function\"==typeof n.decoder?n.decoder:o.decoder,n.allowDots=\"boolean\"==typeof n.allowDots?n.allowDots:o.allowDots,n.plainObjects=\"boolean\"==typeof n.plainObjects?n.plainObjects:o.plainObjects,n.allowPrototypes=\"boolean\"==typeof n.allowPrototypes?n.allowPrototypes:o.allowPrototypes,n.parameterLimit=\"number\"==typeof n.parameterLimit?n.parameterLimit:o.parameterLimit,n.strictNullHandling=\"boolean\"==typeof n.strictNullHandling?n.strictNullHandling:o.strictNullHandling,\"\"===e||null===e||\"undefined\"==typeof e)return n.plainObjects?Object.create(null):{};for(var i=\"string\"==typeof e?a(e,n):e,s=n.plainObjects?Object.create(null):{},c=Object.keys(i),l=0;l<c.length;++l){var p=c[l],f=u(p,i[p],n);s=r.merge(s,f,n)}return r.compact(s)}},function(e,t,n){\"use strict\";function r(e){if(e&&e.__esModule)return e;var t={};if(null!=e)for(var n in e)Object.prototype.hasOwnProperty.call(e,n)&&(t[n]=e[n]);return t.default=e,t}function i(e){return e&&e.__esModule?e:{default:e}}Object.defineProperty(t,\"__esModule\",{value:!0}),t.default=function(){return{statePlugins:{auth:{reducers:a.default,actions:u,selectors:l},spec:{wrapActions:f}}}};var o=n(955),a=i(o),s=n(956),u=r(s),c=n(957),l=r(c),p=n(958),f=r(p)},function(e,t,n){\"use strict\";function r(e){return e&&e.__esModule?e:{default:e}}Object.defineProperty(t,\"__esModule\",{value:!0});var i,o=n(137),a=r(o),s=n(184),u=r(s),c=n(168),l=n(183),p=n(956);t.default=(i={},(0,a.default)(i,p.SHOW_AUTH_POPUP,function(e,t){var n=t.payload;return e.set(\"showDefinitions\",n)}),(0,a.default)(i,p.AUTHORIZE,function(e,t){var n=t.payload,r=(0,c.fromJS)(n),i=e.get(\"authorized\")||(0,c.Map)();return r.entrySeq().forEach(function(e){var t=(0,u.default)(e,2),n=t[0],r=t[1],o=r.getIn([\"schema\",\"type\"]);if(\"apiKey\"===o)i=i.set(n,r);else if(\"basic\"===o){var a=r.getIn([\"value\",\"username\"]),s=r.getIn([\"value\",\"password\"]);i=i.setIn([n,\"value\"],{username:a,header:\"Basic \"+(0,l.btoa)(a+\":\"+s)}),i=i.setIn([n,\"schema\"],r.get(\"schema\"))}}),e.set(\"authorized\",i)}),(0,a.default)(i,p.AUTHORIZE_OAUTH2,function(e,t){var n=t.payload,r=n.auth,i=n.token,o=void 0;return r.token=i,o=(0,c.fromJS)(r),e.setIn([\"authorized\",o.get(\"name\")],o)}),(0,a.default)(i,p.LOGOUT,function(e,t){var n=t.payload,r=e.get(\"authorized\").withMutations(function(e){n.forEach(function(t){e.delete(t)})});return e.set(\"authorized\",r)}),(0,a.default)(i,p.CONFIGURE_AUTH,function(e,t){var n=t.payload;return e.set(\"configs\",n)}),i)},function(e,t,n){\"use strict\";function r(e){return e&&e.__esModule?e:{default:e}}function i(e){return{type:v,payload:e}}function o(e){return{type:y,payload:e}}function a(e){return{type:g,payload:e}}function s(e){return{type:_,payload:e}}function u(e){return{type:b,payload:e}}Object.defineProperty(t,\"__esModule\",{value:!0}),t.authorizeRequest=t.authorizeAccessCode=t.authorizeApplication=t.authorizePassword=t.preAuthorizeImplicit=t.CONFIGURE_AUTH=t.VALIDATE=t.AUTHORIZE_OAUTH2=t.PRE_AUTHORIZE_OAUTH2=t.LOGOUT=t.AUTHORIZE=t.SHOW_AUTH_POPUP=void 0;var c=n(141),l=r(c),p=n(57),f=r(p);t.showDefinitions=i,t.authorize=o,t.logout=a,t.authorizeOauth2=s,t.configureAuth=u;var h=n(177),d=r(h),m=n(183),v=t.SHOW_AUTH_POPUP=\"show_popup\",y=t.AUTHORIZE=\"authorize\",g=t.LOGOUT=\"logout\",_=(t.PRE_AUTHORIZE_OAUTH2=\"pre_authorize_oauth2\",t.AUTHORIZE_OAUTH2=\"authorize_oauth2\"),b=(t.VALIDATE=\"validate\",t.CONFIGURE_AUTH=\"configure_auth\"),x=\" \";t.preAuthorizeImplicit=function(e){return function(t){var n=t.authActions,r=t.errActions,i=e.auth,o=e.token,a=e.isValid,s=i.schema,u=i.name,c=s.get(\"flow\");return delete d.default.swaggerUIRedirectOauth2,\"accessCode\"===c||a||r.newAuthErr({authId:u,source:\"auth\",level:\"warning\",message:\"Authorization may be unsafe, passed state was changed in server Passed state wasn't returned from auth server\"}),o.error?void r.newAuthErr({authId:u,source:\"auth\",level:\"error\",message:(0,f.default)(o)}):void n.authorizeOauth2({auth:i,token:o})}},t.authorizePassword=function(e){return function(t){var n=t.authActions,r=e.schema,i=e.name,o=e.username,a=e.password,s=e.passwordType,u=e.clientId,c=e.clientSecret,p={grant_type:\"password\",scopes:encodeURIComponent(e.scopes.join(x))},f={},h={};return\"basic\"===s?h.Authorization=\"Basic \"+(0,m.btoa)(o+\":\"+a):((0,l.default)(p,{username:o},{password:a}),\"query\"===s?(u&&(f.client_id=u),c&&(f.client_secret=c)):h.Authorization=\"Basic \"+(0,\nm.btoa)(u+\":\"+c)),n.authorizeRequest({body:(0,m.buildFormData)(p),url:r.get(\"tokenUrl\"),name:i,headers:h,query:f,auth:e})}},t.authorizeApplication=function(e){return function(t){var n=t.authActions,r=e.schema,i=e.scopes,o=e.name,a=e.clientId,s=e.clientSecret,u={Authorization:\"Basic \"+(0,m.btoa)(a+\":\"+s)},c={grant_type:\"client_credentials\",scope:i.join(x)};return n.authorizeRequest({body:(0,m.buildFormData)(c),name:o,url:r.get(\"tokenUrl\"),auth:e,headers:u})}},t.authorizeAccessCode=function(e){var t=e.auth,n=e.redirectUrl;return function(e){var r=e.authActions,i=t.schema,o=t.name,a=t.clientId,s=t.clientSecret,u={grant_type:\"authorization_code\",code:t.code,client_id:a,client_secret:s,redirect_uri:n};return r.authorizeRequest({body:(0,m.buildFormData)(u),name:o,url:i.get(\"tokenUrl\"),auth:t})}},t.authorizeRequest=function(e){return function(t){var n=t.fn,r=t.authActions,i=t.errActions,o=t.authSelectors,a=e.body,s=e.query,u=void 0===s?{}:s,c=e.headers,p=void 0===c?{}:c,h=e.name,d=e.url,m=e.auth,v=o.getConfigs()||{},y=v.additionalQueryStringParams,g=d;for(var _ in y)d+=\"&\"+_+\"=\"+encodeURIComponent(y[_]);var b=(0,l.default)({Accept:\"application/json, text/plain, */*\",\"Access-Control-Allow-Origin\":\"*\",\"Content-Type\":\"application/x-www-form-urlencoded\"},p);n.fetch({url:g,method:\"post\",headers:b,query:u,body:a}).then(function(e){var t=JSON.parse(e.data),n=t&&(t.error||\"\"),o=t&&(t.parseError||\"\");return e.ok?n||o?void i.newAuthErr({authId:h,level:\"error\",source:\"auth\",message:(0,f.default)(t)}):void r.authorizeOauth2({auth:m,token:t}):void i.newAuthErr({authId:h,level:\"error\",source:\"auth\",message:e.statusText})}).catch(function(e){var t=new Error(e);i.newAuthErr({authId:h,level:\"error\",source:\"auth\",message:t.message})})}}},function(e,t,n){\"use strict\";function r(e){return e&&e.__esModule?e:{default:e}}Object.defineProperty(t,\"__esModule\",{value:!0}),t.getConfigs=t.isAuthorized=t.authorized=t.getDefinitionsByNames=t.definitionsToAuthorize=t.shownDefinitions=void 0;var i=n(60),o=r(i),a=n(184),s=r(a),u=n(430),c=n(168),l=function(e){return e};t.shownDefinitions=(0,u.createSelector)(l,function(e){return e.get(\"showDefinitions\")}),t.definitionsToAuthorize=(0,u.createSelector)(l,function(){return function(e){var t=e.specSelectors,n=t.securityDefinitions(),r=(0,c.List)();return n.entrySeq().forEach(function(e){var t=(0,s.default)(e,2),n=t[0],i=t[1],o=(0,c.Map)();o=o.set(n,i),r=r.push(o)}),r}}),t.getDefinitionsByNames=function(e,t){return function(e){var n=e.specSelectors,r=n.securityDefinitions(),i=(0,c.List)();return t.valueSeq().forEach(function(e){var t=(0,c.Map)();e.entrySeq().forEach(function(e){var n=(0,s.default)(e,2),i=n[0],o=n[1],a=r.get(i),u=void 0;\"oauth2\"===a.get(\"type\")&&o.size&&(u=a.get(\"scopes\"),u.keySeq().forEach(function(e){o.contains(e)||(u=u.delete(e))}),a=a.set(\"allowedScopes\",u)),t=t.set(i,a)}),i=i.push(t)}),i}},t.authorized=(0,u.createSelector)(l,function(e){return e.get(\"authorized\")||(0,c.Map)()}),t.isAuthorized=function(e,t){return function(e){var n=e.authSelectors,r=n.authorized();return c.List.isList(t)?!!t.toJS().filter(function(e){var t=!0;return(0,o.default)(e).map(function(e){return!t||!!r.get(e)}).indexOf(!1)===-1}).length:null}},t.getConfigs=(0,u.createSelector)(l,function(e){return e.get(\"configs\")})},function(e,t,n){\"use strict\";function r(e){return e&&e.__esModule?e:{default:e}}Object.defineProperty(t,\"__esModule\",{value:!0}),t.execute=void 0;var i=n(446),o=r(i);t.execute=function(e,t){var n=t.authSelectors,r=t.specSelectors;return function(t){var i=t.path,a=t.method,s=t.operation,u=t.extras,c={authorized:n.authorized()&&n.authorized().toJS(),definitions:r.securityDefinitions()&&r.securityDefinitions().toJS(),specSecurity:r.security()&&r.security().toJS()};return e((0,o.default)({path:i,method:a,operation:s,securities:c},u))}}},function(e,t,n){\"use strict\";Object.defineProperty(t,\"__esModule\",{value:!0}),t.default=function(){return{fn:{shallowEqualKeys:r.shallowEqualKeys,transformPathToArray:i.transformPathToArray}}};var r=n(183),i=n(960)},function(e,t,n){\"use strict\";function r(e){return e&&e.__esModule?e:{default:e}}function i(e,t){if(\"instance.\"===e.slice(0,9))var n=e.slice(9);else var n=e;var r=[];return n.split(\".\").map(function(e){if(e.includes(\"[\")){var t=parseInt(e.match(/\\[(.*)\\]/)[1]),n=e.slice(0,e.indexOf(\"[\"));return[n,t.toString()]}return e}).reduce(function(e,t){return e.concat(t)},[]).concat([\"\"]).reduce(function(e,n){var i=r.length?(0,s.default)(t,r):t;return(0,s.default)(i,o(e,n))?(e.length&&r.push(e),n.length&&r.push(n),\"\"):\"\"+e+(e.length?\".\":\"\")+n},\"\"),\"undefined\"!=typeof(0,s.default)(t,r)?r:null}function o(e,t){var n=[];return e.length&&n.push(e),t.length&&n.push(t),n}Object.defineProperty(t,\"__esModule\",{value:!0}),t.transformPathToArray=i;var a=n(295),s=r(a)},function(e,t,n){\"use strict\";function r(e){if(e&&e.__esModule)return e;var t={};if(null!=e)for(var n in e)Object.prototype.hasOwnProperty.call(e,n)&&(t[n]=e[n]);return t.default=e,t}function i(){return{components:a}}Object.defineProperty(t,\"__esModule\",{value:!0}),t.default=i;var o=n(962),a=r(o)},function(e,t,n){\"use strict\";var r=n(183),i=n(963);i.keys().forEach(function(t){if(\"./index.js\"!==t){var n=i(t);e.exports[(0,r.pascalCaseFilename)(t)]=n.default?n.default:n}})},function(e,t,n){function r(e){return n(i(e))}function i(e){return o[e]||function(){throw new Error(\"Cannot find module '\"+e+\"'.\")}()}var o={\"./index.js\":962,\"./split-pane-mode.jsx\":964};r.keys=function(){return Object.keys(o)},r.resolve=i,e.exports=r,r.id=963},function(e,t,n){\"use strict\";function r(e){return e&&e.__esModule?e:{default:e}}Object.defineProperty(t,\"__esModule\",{value:!0});var i=n(486),o=r(i),a=n(145),s=r(a),u=n(146),c=r(u),l=n(489),p=r(l),f=n(490),h=r(f),d=n(498),m=r(d),v=n(965),y=r(v);n(1006);var g=[\"split-pane-mode\"],_=\"left\",b=\"right\",x=\"both\",w=function(e){function t(){var e,n,r,i;(0,s.default)(this,t);for(var a=arguments.length,u=Array(a),c=0;c<a;c++)u[c]=arguments[c];return n=r=(0,p.default)(this,(e=t.__proto__||(0,o.default)(t)).call.apply(e,[this].concat(u))),r.onDragFinished=function(){var e=r.props,t=e.threshold,n=e.layoutActions,i=r.refs.splitPane.state,o=i.position,a=i.draggedSize;r.draggedSize=a;var s=o<=t,u=a<=t;n.changeMode(g,s?b:u?_:x)},r.sizeFromMode=function(e,t){return e===_?(r.draggedSize=null,\"0px\"):e===b?(r.draggedSize=null,\"100%\"):r.draggedSize||t},i=n,(0,p.default)(r,i)}return(0,h.default)(t,e),(0,c.default)(t,[{key:\"render\",value:function(){var e=this.props,t=e.children,n=e.layoutSelectors,r=n.whatMode(g),i=r===b?m.default.createElement(\"noscript\",null):t[0],o=r===_?m.default.createElement(\"noscript\",null):t[1],a=this.sizeFromMode(r,\"50%\");return m.default.createElement(y.default,{disabledClass:\"\",ref:\"splitPane\",split:\"vertical\",defaultSize:\"50%\",primary:\"second\",minSize:0,size:a,onDragFinished:this.onDragFinished,allowResize:r!==_&&r!==b,resizerStyle:{flex:\"0 0 auto\",position:\"relative\"}},i,o)}}]),t}(m.default.Component);w.propTypes={threshold:d.PropTypes.number,children:d.PropTypes.array,layoutSelectors:d.PropTypes.object.isRequired,layoutActions:d.PropTypes.object.isRequired},w.defaultProps={threshold:100,children:[]},t.default=w},function(e,t,n){var r=n(966);e.exports=r},function(e,t,n){\"use strict\";function r(e){return e&&e.__esModule?e:{default:e}}function i(e,t){if(!(e instanceof t))throw new TypeError(\"Cannot call a class as a function\")}function o(e,t){if(!e)throw new ReferenceError(\"this hasn't been initialised - super() hasn't been called\");return!t||\"object\"!=typeof t&&\"function\"!=typeof t?e:t}function a(e,t){if(\"function\"!=typeof t&&null!==t)throw new TypeError(\"Super expression must either be null or a function, not \"+typeof t);e.prototype=Object.create(t&&t.prototype,{constructor:{value:e,enumerable:!1,writable:!0,configurable:!0}}),t&&(Object.setPrototypeOf?Object.setPrototypeOf(e,t):e.__proto__=t)}function s(e,t){if(e.selection)e.selection.empty();else try{t.getSelection().removeAllRanges()}catch(e){}}Object.defineProperty(t,\"__esModule\",{value:!0});var u=Object.assign||function(e){for(var t=1;t<arguments.length;t++){var n=arguments[t];for(var r in n)Object.prototype.hasOwnProperty.call(n,r)&&(e[r]=n[r])}return e},c=function(){function e(e,t){for(var n=0;n<t.length;n++){var r=t[n];r.enumerable=r.enumerable||!1,r.configurable=!0,\"value\"in r&&(r.writable=!0),Object.defineProperty(e,r.key,r)}}return function(t,n,r){return n&&e(t.prototype,n),r&&e(t,r),t}}(),l=n(498),p=r(l),f=n(528),h=r(f),d=n(967),m=r(d),v=n(1002),y=r(v),g=n(1004),_=r(g),b=n(1005),x=r(b),w=\"Mozilla/5.0 (Windows NT 6.1) AppleWebKit/537.2 (KHTML, like Gecko) Safari/537.2\",k=function(e){function t(){var e;i(this,t);for(var n=arguments.length,r=Array(n),a=0;a<n;a++)r[a]=arguments[a];var s=o(this,(e=t.__proto__||Object.getPrototypeOf(t)).call.apply(e,[this].concat(r)));return s.onMouseDown=s.onMouseDown.bind(s),s.onTouchStart=s.onTouchStart.bind(s),s.onMouseMove=s.onMouseMove.bind(s),s.onTouchMove=s.onTouchMove.bind(s),s.onMouseUp=s.onMouseUp.bind(s),s.state={active:!1,resized:!1},s}return a(t,e),c(t,[{key:\"componentDidMount\",value:function(){this.setSize(this.props,this.state),document.addEventListener(\"mouseup\",this.onMouseUp),document.addEventListener(\"mousemove\",this.onMouseMove),document.addEventListener(\"touchmove\",this.onTouchMove)}},{key:\"componentWillReceiveProps\",value:function(e){this.setSize(e,this.state)}},{key:\"componentWillUnmount\",value:function(){document.removeEventListener(\"mouseup\",this.onMouseUp),document.removeEventListener(\"mousemove\",this.onMouseMove),document.removeEventListener(\"touchmove\",this.onTouchMove)}},{key:\"onMouseDown\",value:function(e){var t=u({},e,{touches:[{clientX:e.clientX,clientY:e.clientY}]});this.onTouchStart(t)}},{key:\"onTouchStart\",value:function(e){if(this.props.allowResize){s(document,window);var t=\"vertical\"===this.props.split?e.touches[0].clientX:e.touches[0].clientY;\"function\"==typeof this.props.onDragStarted&&this.props.onDragStarted(),this.setState({active:!0,position:t})}}},{key:\"onMouseMove\",value:function(e){var t=u({},e,{touches:[{clientX:e.clientX,clientY:e.clientY}]});this.onTouchMove(t)}},{key:\"onTouchMove\",value:function(e){if(this.props.allowResize&&this.state.active){s(document,window);var t=\"first\"===this.props.primary,n=t?this.pane1:this.pane2;if(n){var r=h.default.findDOMNode(n);if(r.getBoundingClientRect){var i=r.getBoundingClientRect().width,o=r.getBoundingClientRect().height,a=\"vertical\"===this.props.split?e.touches[0].clientX:e.touches[0].clientY,u=\"vertical\"===this.props.split?i:o,c=this.state.position,l=t?c-a:a-c,p=this.props.maxSize;if(void 0!==this.props.maxSize&&this.props.maxSize<=0){var f=this.splitPane;p=\"vertical\"===this.props.split?f.getBoundingClientRect().width+this.props.maxSize:f.getBoundingClientRect().height+this.props.maxSize}var d=u-l;d<this.props.minSize?d=this.props.minSize:void 0!==this.props.maxSize&&d>p?d=p:this.setState({position:a,resized:!0}),this.props.onChange&&this.props.onChange(d),this.setState({draggedSize:d}),n.setState({size:d})}}}}},{key:\"onMouseUp\",value:function(){this.props.allowResize&&this.state.active&&(\"function\"==typeof this.props.onDragFinished&&this.props.onDragFinished(this.state.draggedSize),this.setState({active:!1}))}},{key:\"setSize\",value:function(e,t){var n=\"first\"===this.props.primary?this.pane1:this.pane2,r=void 0;n&&(r=e.size||t&&t.draggedSize||e.defaultSize||e.minSize,n.setState({size:r}),e.size!==t.draggedSize&&this.setState({draggedSize:r}))}},{key:\"render\",value:function(){var e=this,t=this.props,n=t.split,r=t.allowResize,i=r?\"\":\"disabled\",o=u({},this.props.style||{},{display:\"flex\",flex:1,position:\"relative\",outline:\"none\",overflow:\"hidden\",MozUserSelect:\"text\",WebkitUserSelect:\"text\",msUserSelect:\"text\",userSelect:\"text\"});\"vertical\"===n?u(o,{flexDirection:\"row\",height:\"100%\",position:\"absolute\",left:0,right:0}):u(o,{flexDirection:\"column\",height:\"100%\",minHeight:\"100%\",position:\"absolute\",top:0,bottom:0,width:\"100%\"});var a=this.props.children,s=[\"SplitPane\",this.props.className,n,i],c=this.props.prefixer.prefix(u({},this.props.paneStyle||{},this.props.pane1Style||{})),l=this.props.prefixer.prefix(u({},this.props.paneStyle||{},this.props.pane2Style||{}));return p.default.createElement(\"div\",{className:s.join(\" \"),style:this.props.prefixer.prefix(o),ref:function(t){e.splitPane=t}},p.default.createElement(_.default,{ref:function(t){e.pane1=t},key:\"pane1\",className:\"Pane1\",style:c,split:n,size:\"first\"===this.props.primary?this.props.size||this.props.defaultSize||this.props.minSize:void 0},a[0]),p.default.createElement(x.default,{ref:function(t){e.resizer=t},key:\"resizer\",className:i,resizerClassName:this.props.resizerClassName,onMouseDown:this.onMouseDown,onTouchStart:this.onTouchStart,onTouchEnd:this.onMouseUp,style:this.props.resizerStyle||{},split:n}),p.default.createElement(_.default,{ref:function(t){e.pane2=t},key:\"pane2\",className:\"Pane2\",style:l,split:n,size:\"second\"===this.props.primary?this.props.size||this.props.defaultSize||this.props.minSize:void 0},a[1]))}}]),t}(l.Component);k.propTypes={primary:l.PropTypes.oneOf([\"first\",\"second\"]),minSize:l.PropTypes.oneOfType([p.default.PropTypes.string,p.default.PropTypes.number]),maxSize:l.PropTypes.oneOfType([p.default.PropTypes.string,p.default.PropTypes.number]),defaultSize:l.PropTypes.oneOfType([p.default.PropTypes.string,p.default.PropTypes.number]),size:l.PropTypes.oneOfType([p.default.PropTypes.string,p.default.PropTypes.number]),allowResize:l.PropTypes.bool,split:l.PropTypes.oneOf([\"vertical\",\"horizontal\"]),onDragStarted:l.PropTypes.func,onDragFinished:l.PropTypes.func,onChange:l.PropTypes.func,prefixer:l.PropTypes.instanceOf(m.default).isRequired,style:y.default,resizerStyle:y.default,paneStyle:y.default,pane1Style:y.default,pane2Style:y.default,className:l.PropTypes.string,resizerClassName:l.PropTypes.string,children:l.PropTypes.arrayOf(l.PropTypes.node).isRequired},k.defaultProps={split:\"vertical\",minSize:50,allowResize:!0,prefixer:new m.default({userAgent:w}),primary:\"first\"},t.default=k,e.exports=t.default},function(e,t,n){\"use strict\";function r(e){return e&&e.__esModule?e:{default:e}}function i(e,t){if(!(e instanceof t))throw new TypeError(\"Cannot call a class as a function\")}function o(e){var t=arguments.length<=1||void 0===arguments[1]?{}:arguments[1],n=arguments[2],r=arguments[3];Object.keys(t).forEach(function(i){var o=e[i];Array.isArray(o)?[].concat(t[i]).forEach(function(t){e[i].indexOf(t)===-1&&e[i].splice(o.indexOf(n),r?0:1,t)}):e[i]=t[i]})}Object.defineProperty(t,\"__esModule\",{value:!0});var a=function(){function e(e,t){for(var n=0;n<t.length;n++){var r=t[n];r.enumerable=r.enumerable||!1,r.configurable=!0,\"value\"in r&&(r.writable=!0),Object.defineProperty(e,r.key,r)}}return function(t,n,r){return n&&e(t.prototype,n),r&&e(t,r),t}}(),s=n(968),u=r(s),c=n(985),l=r(c),p=n(988),f=r(p),h=n(970),d=r(h),m=n(971),v=r(m),y=n(989),g=r(y),_=n(990),b=r(_),x=n(992),w=r(x),k=n(993),S=r(k),E=n(994),C=r(E),A=n(995),T=r(A),D=n(996),M=r(D),O=n(997),P=r(O),I=n(998),N=r(I),R=n(1e3),j=r(R),F=n(1001),B=r(F),L=[b.default,w.default,S.default,C.default,M.default,P.default,N.default,j.default,B.default,T.default],z=function(){function e(){var t=this,n=arguments.length<=0||void 0===arguments[0]?{}:arguments[0];i(this,e);var r=\"undefined\"!=typeof navigator?navigator.userAgent:void 0;if(this._userAgent=n.userAgent||r,this._keepUnprefixed=n.keepUnprefixed||!1,this._browserInfo=(0,l.default)(this._userAgent),!this._browserInfo||!this._browserInfo.prefix)return this._usePrefixAllFallback=!0,!1;this.cssPrefix=this._browserInfo.prefix.css,this.jsPrefix=this._browserInfo.prefix.inline,this.prefixedKeyframes=(0,f.default)(this._browserInfo);var o=this._browserInfo.browser&&g.default[this._browserInfo.browser];o?(this._requiresPrefix=Object.keys(o).filter(function(e){return o[e]>=t._browserInfo.version}).reduce(function(e,t){return e[t]=!0,e},{}),this._hasPropsRequiringPrefix=Object.keys(this._requiresPrefix).length>0):this._usePrefixAllFallback=!0}return a(e,[{key:\"prefix\",value:function(e){var t=this;return this._usePrefixAllFallback?(0,u.default)(e):this._hasPropsRequiringPrefix?(Object.keys(e).forEach(function(n){var r=e[n];r instanceof Object&&!Array.isArray(r)?e[n]=t.prefix(r):t._requiresPrefix[n]&&(e[t.jsPrefix+(0,d.default)(n)]=r,t._keepUnprefixed||delete e[n])}),Object.keys(e).forEach(function(n){[].concat(e[n]).forEach(function(r){L.forEach(function(i){o(e,i({property:n,value:r,styles:e,browserInfo:t._browserInfo,prefix:{js:t.jsPrefix,css:t.cssPrefix,keyframes:t.prefixedKeyframes},keepUnprefixed:t._keepUnprefixed,requiresPrefix:t._requiresPrefix}),r,t._keepUnprefixed)})})}),(0,v.default)(e)):e}}],[{key:\"prefixAll\",value:function(e){return(0,u.default)(e)}}]),e}();t.default=z,e.exports=t.default},function(e,t,n){\"use strict\";function r(e){return e&&e.__esModule?e:{default:e}}function i(e){return Object.keys(e).forEach(function(t){var n=e[t];n instanceof Object&&!Array.isArray(n)?e[t]=i(n):Object.keys(s.default).forEach(function(r){var i=s.default[r];i[t]&&(e[r+(0,c.default)(t)]=n)})}),Object.keys(e).forEach(function(t){[].concat(e[t]).forEach(function(n,r){M.forEach(function(r){return o(e,r(t,n))})})}),(0,p.default)(e)}function o(e){var t=arguments.length<=1||void 0===arguments[1]?{}:arguments[1];Object.keys(t).forEach(function(n){var r=e[n];Array.isArray(r)?[].concat(t[n]).forEach(function(t){var i=r.indexOf(t);i>-1&&e[n].splice(i,1),e[n].push(t)}):e[n]=t[n]})}Object.defineProperty(t,\"__esModule\",{value:!0}),t.default=i;var a=n(969),s=r(a),u=n(970),c=r(u),l=n(971),p=r(l),f=n(973),h=r(f),d=n(974),m=r(d),v=n(977),y=r(v),g=n(978),_=r(g),b=n(979),x=r(b),w=n(980),k=r(w),S=n(981),E=r(S),C=n(983),A=r(C),T=n(984),D=r(T),M=[h.default,m.default,y.default,x.default,k.default,E.default,A.default,D.default,_.default];e.exports=t.default},function(e,t){\"use strict\";Object.defineProperty(t,\"__esModule\",{value:!0}),t.default={Webkit:{transform:!0,transformOrigin:!0,transformOriginX:!0,transformOriginY:!0,backfaceVisibility:!0,perspective:!0,perspectiveOrigin:!0,transformStyle:!0,transformOriginZ:!0,animation:!0,animationDelay:!0,animationDirection:!0,animationFillMode:!0,animationDuration:!0,animationIterationCount:!0,animationName:!0,animationPlayState:!0,animationTimingFunction:!0,appearance:!0,userSelect:!0,fontKerning:!0,textEmphasisPosition:!0,textEmphasis:!0,textEmphasisStyle:!0,textEmphasisColor:!0,boxDecorationBreak:!0,clipPath:!0,maskImage:!0,maskMode:!0,maskRepeat:!0,maskPosition:!0,maskClip:!0,maskOrigin:!0,maskSize:!0,maskComposite:!0,mask:!0,maskBorderSource:!0,maskBorderMode:!0,maskBorderSlice:!0,maskBorderWidth:!0,maskBorderOutset:!0,maskBorderRepeat:!0,maskBorder:!0,maskType:!0,textDecorationStyle:!0,textDecorationSkip:!0,textDecorationLine:!0,textDecorationColor:!0,filter:!0,fontFeatureSettings:!0,breakAfter:!0,breakBefore:!0,breakInside:!0,columnCount:!0,columnFill:!0,columnGap:!0,columnRule:!0,columnRuleColor:!0,columnRuleStyle:!0,columnRuleWidth:!0,columns:!0,columnSpan:!0,columnWidth:!0,flex:!0,flexBasis:!0,flexDirection:!0,flexGrow:!0,flexFlow:!0,flexShrink:!0,flexWrap:!0,alignContent:!0,alignItems:!0,alignSelf:!0,justifyContent:!0,order:!0,transition:!0,transitionDelay:!0,transitionDuration:!0,transitionProperty:!0,transitionTimingFunction:!0,backdropFilter:!0,scrollSnapType:!0,scrollSnapPointsX:!0,scrollSnapPointsY:!0,scrollSnapDestination:!0,scrollSnapCoordinate:!0,shapeImageThreshold:!0,shapeImageMargin:!0,shapeImageOutside:!0,hyphens:!0,flowInto:!0,flowFrom:!0,regionFragment:!0,textSizeAdjust:!0},Moz:{appearance:!0,userSelect:!0,boxSizing:!0,textAlignLast:!0,textDecorationStyle:!0,textDecorationSkip:!0,textDecorationLine:!0,textDecorationColor:!0,tabSize:!0,hyphens:!0,fontFeatureSettings:!0,breakAfter:!0,breakBefore:!0,breakInside:!0,columnCount:!0,columnFill:!0,columnGap:!0,columnRule:!0,columnRuleColor:!0,columnRuleStyle:!0,columnRuleWidth:!0,columns:!0,columnSpan:!0,columnWidth:!0},ms:{flex:!0,flexBasis:!1,flexDirection:!0,flexGrow:!1,flexFlow:!0,flexShrink:!1,flexWrap:!0,alignContent:!1,alignItems:!1,alignSelf:!1,justifyContent:!1,order:!1,transform:!0,transformOrigin:!0,transformOriginX:!0,transformOriginY:!0,userSelect:!0,wrapFlow:!0,wrapThrough:!0,wrapMargin:!0,scrollSnapType:!0,scrollSnapPointsX:!0,scrollSnapPointsY:!0,scrollSnapDestination:!0,scrollSnapCoordinate:!0,touchAction:!0,hyphens:!0,flowInto:!0,flowFrom:!0,breakBefore:!0,breakAfter:!0,breakInside:!0,regionFragment:!0,gridTemplateColumns:!0,gridTemplateRows:!0,gridTemplateAreas:!0,gridTemplate:!0,gridAutoColumns:!0,gridAutoRows:!0,gridAutoFlow:!0,grid:!0,gridRowStart:!0,gridColumnStart:!0,gridRowEnd:!0,gridRow:!0,gridColumn:!0,gridColumnEnd:!0,gridColumnGap:!0,gridRowGap:!0,gridArea:!0,gridGap:!0,textSizeAdjust:!0}},e.exports=t.default},function(e,t){\"use strict\";Object.defineProperty(t,\"__esModule\",{value:!0}),t.default=function(e){return e.charAt(0).toUpperCase()+e.slice(1)},e.exports=t.default},function(e,t,n){\"use strict\";function r(e){return e&&e.__esModule?e:{default:e}}function i(e){return Object.keys(e).sort(function(e,t){return(0,a.default)(e)&&!(0,a.default)(t)?-1:!(0,a.default)(e)&&(0,a.default)(t)?1:0}).reduce(function(t,n){return t[n]=e[n],t},{})}Object.defineProperty(t,\"__esModule\",{value:!0}),t.default=i;var o=n(972),a=r(o);e.exports=t.default},function(e,t){\"use strict\";Object.defineProperty(t,\"__esModule\",{value:!0}),t.default=function(e){return null!==e.match(/^(Webkit|Moz|O|ms)/)},e.exports=t.default},function(e,t){\"use strict\";function n(e,t){if(\"position\"===e&&\"sticky\"===t)return{position:[\"-webkit-sticky\",\"sticky\"]}}Object.defineProperty(t,\"__esModule\",{value:!0}),t.default=n,e.exports=t.default},function(e,t,n){\"use strict\";function r(e){return e&&e.__esModule?e:{default:e}}function i(e,t){if(\"string\"==typeof t&&!(0,u.default)(t)&&t.indexOf(\"calc(\")>-1)return(0,a.default)(e,t,function(e,t){return t.replace(/calc\\(/g,e+\"calc(\")})}Object.defineProperty(t,\"__esModule\",{value:!0}),t.default=i;var o=n(975),a=r(o),s=n(976),u=r(s);e.exports=t.default},function(e,t){\"use strict\";function n(e,t,n){return t in e?Object.defineProperty(e,t,{value:n,enumerable:!0,configurable:!0,writable:!0}):e[t]=n,e}Object.defineProperty(t,\"__esModule\",{value:!0}),t.default=function(e,t){var r=arguments.length<=2||void 0===arguments[2]?function(e,t){return e+t}:arguments[2];return n({},e,[\"-webkit-\",\"-moz-\",\"\"].map(function(e){return r(e,t)}))},e.exports=t.default},function(e,t){\"use strict\";Object.defineProperty(t,\"__esModule\",{value:!0}),t.default=function(e){return Array.isArray(e)&&(e=e.join(\",\")),null!==e.match(/-webkit-|-moz-|-ms-/)},e.exports=t.default},function(e,t,n){\"use strict\";function r(e){return e&&e.__esModule?e:{default:e}}function i(e,t){if(\"cursor\"===e&&s[t])return(0,a.default)(e,t)}Object.defineProperty(t,\"__esModule\",{value:!0}),t.default=i;var o=n(975),a=r(o),s={\"zoom-in\":!0,\"zoom-out\":!0,grab:!0,grabbing:!0};e.exports=t.default},function(e,t){\"use strict\";function n(e,t){if(\"display\"===e&&r[t])return{display:[\"-webkit-box\",\"-moz-box\",\"-ms-\"+t+\"box\",\"-webkit-\"+t,t]}}Object.defineProperty(t,\"__esModule\",{value:!0}),t.default=n;var r={flex:!0,\"inline-flex\":!0};e.exports=t.default},function(e,t,n){\"use strict\";function r(e){return e&&e.__esModule?e:{default:e}}function i(e,t){if(s[e]&&u[t])return(0,a.default)(e,t)}Object.defineProperty(t,\"__esModule\",{value:!0}),t.default=i;var o=n(975),a=r(o),s={maxHeight:!0,maxWidth:!0,width:!0,height:!0,columnWidth:!0,minWidth:!0,minHeight:!0},u={\"min-content\":!0,\"max-content\":!0,\"fill-available\":!0,\"fit-content\":!0,\"contain-floats\":!0};e.exports=t.default},function(e,t,n){\"use strict\";function r(e){return e&&e.__esModule?e:{default:e}}function i(e,t){if(\"string\"==typeof t&&!(0,u.default)(t)&&null!==t.match(c))return(0,a.default)(e,t)}Object.defineProperty(t,\"__esModule\",{value:!0}),t.default=i;var o=n(975),a=r(o),s=n(976),u=r(s),c=/linear-gradient|radial-gradient|repeating-linear-gradient|repeating-radial-gradient/;e.exports=t.default},function(e,t,n){\"use strict\";function r(e){return e&&e.__esModule?e:{default:e}}function i(e,t,n){return t in e?Object.defineProperty(e,t,{value:n,enumerable:!0,configurable:!0,writable:!0}):e[t]=n,e}function o(e,t){if(\"string\"==typeof t&&m[e]){var n,r=a(t),o=r.split(/,(?![^()]*(?:\\([^()]*\\))?\\))/g).filter(function(e){return null===e.match(/-moz-|-ms-/)}).join(\",\");return e.indexOf(\"Webkit\")>-1?i({},e,o):(n={},i(n,\"Webkit\"+(0,l.default)(e),o),i(n,e,r),n)}}function a(e){if((0,f.default)(e))return e;var t=e.split(/,(?![^()]*(?:\\([^()]*\\))?\\))/g);return t.forEach(function(e,n){t[n]=Object.keys(d.default).reduce(function(t,n){var r=\"-\"+n.toLowerCase()+\"-\";return Object.keys(d.default[n]).forEach(function(n){var i=(0,u.default)(n);e.indexOf(i)>-1&&\"order\"!==i&&(t=e.replace(i,r+i)+\",\"+t)}),t},e)}),t.join(\",\")}Object.defineProperty(t,\"__esModule\",{value:!0}),t.default=o;var s=n(982),u=r(s),c=n(970),l=r(c),p=n(976),f=r(p),h=n(969),d=r(h),m={transition:!0,transitionProperty:!0,WebkitTransition:!0,WebkitTransitionProperty:!0};e.exports=t.default},function(e,t){\"use strict\";function n(e){return e in o?o[e]:o[e]=e.replace(r,\"-$&\").toLowerCase().replace(i,\"-ms-\")}var r=/[A-Z]/g,i=/^ms-/,o={};e.exports=n},function(e,t){\"use strict\";function n(e,t,n){return t in e?Object.defineProperty(e,t,{value:n,enumerable:!0,configurable:!0,writable:!0}):e[t]=n,e}function r(e,t){if(o[e])return n({},o[e],i[t]||t)}Object.defineProperty(t,\"__esModule\",{value:!0}),t.default=r;var i={\"space-around\":\"distribute\",\"space-between\":\"justify\",\"flex-start\":\"start\",\"flex-end\":\"end\"},o={alignContent:\"msFlexLinePack\",alignSelf:\"msFlexItemAlign\",alignItems:\"msFlexAlign\",justifyContent:\"msFlexPack\",order:\"msFlexOrder\",flexGrow:\"msFlexPositive\",flexShrink:\"msFlexNegative\",flexBasis:\"msPreferredSize\"};e.exports=t.default},function(e,t){\"use strict\";function n(e,t,n){return t in e?Object.defineProperty(e,t,{value:n,enumerable:!0,configurable:!0,writable:!0}):e[t]=n,e}function r(e,t){return\"flexDirection\"===e&&\"string\"==typeof t?{WebkitBoxOrient:t.indexOf(\"column\")>-1?\"vertical\":\"horizontal\",WebkitBoxDirection:t.indexOf(\"reverse\")>-1?\"reverse\":\"normal\"}:o[e]?n({},o[e],i[t]||t):void 0}Object.defineProperty(t,\"__esModule\",{value:!0}),t.default=r;var i={\"space-around\":\"justify\",\"space-between\":\"justify\",\"flex-start\":\"start\",\"flex-end\":\"end\",\"wrap-reverse\":\"multiple\",wrap:\"multiple\"},o={alignItems:\"WebkitBoxAlign\",justifyContent:\"WebkitBoxPack\",flexWrap:\"WebkitBoxLines\"};e.exports=t.default},function(e,t,n){\"use strict\";function r(e){return e&&e.__esModule?e:{default:e}}Object.defineProperty(t,\"__esModule\",{value:!0});var i=n(986),o=r(i),a={Webkit:[\"chrome\",\"safari\",\"ios\",\"android\",\"phantom\",\"opera\",\"webos\",\"blackberry\",\"bada\",\"tizen\",\"chromium\",\"vivaldi\"],Moz:[\"firefox\",\"seamonkey\",\"sailfish\"],ms:[\"msie\",\"msedge\"]},s={chrome:[[\"chrome\"],[\"chromium\"]],safari:[[\"safari\"]],firefox:[[\"firefox\"]],edge:[[\"msedge\"]],opera:[[\"opera\"],[\"vivaldi\"]],ios_saf:[[\"ios\",\"mobile\"],[\"ios\",\"tablet\"]],ie:[[\"msie\"]],op_mini:[[\"opera\",\"mobile\"],[\"opera\",\"tablet\"]],and_uc:[[\"android\",\"mobile\"],[\"android\",\"tablet\"]],android:[[\"android\",\"mobile\"],[\"android\",\"tablet\"]]},u=function(e){if(e.firefox)return\"firefox\";var t=\"\";return Object.keys(s).forEach(function(n){s[n].forEach(function(r){var i=0;r.forEach(function(t){e[t]&&(i+=1)}),r.length===i&&(t=n)})}),t};t.default=function(e){if(!e)return!1;var t=o.default._detect(e);return Object.keys(a).forEach(function(e){a[e].forEach(function(n){t[n]&&(t.prefix={inline:e,css:\"-\"+e.toLowerCase()+\"-\"})})}),t.browser=u(t),t.version=t.version?parseFloat(t.version):parseInt(parseFloat(t.osversion),10),t.osversion=parseFloat(t.osversion),\"ios_saf\"===t.browser&&t.version>t.osversion&&(t.version=t.osversion,t.safari=!0),\"android\"===t.browser&&t.chrome&&t.version>37&&(t.browser=\"and_chr\"),\"android\"===t.browser&&t.osversion<5&&(t.version=t.osversion),t},e.exports=t.default},function(e,t,n){/*!\n\t * Bowser - a browser detector\n\t * https://github.com/ded/bowser\n\t * MIT License | (c) Dustin Diaz 2015\n\t */\n!function(t,r,i){\"undefined\"!=typeof e&&e.exports?e.exports=i():n(987)(r,i)}(this,\"bowser\",function(){function e(e){function t(t){var n=e.match(t);return n&&n.length>1&&n[1]||\"\"}function n(t){var n=e.match(t);return n&&n.length>1&&n[2]||\"\"}function r(e){switch(e){case\"NT\":return\"NT\";case\"XP\":return\"XP\";case\"NT 5.0\":return\"2000\";case\"NT 5.1\":return\"XP\";case\"NT 5.2\":return\"2003\";case\"NT 6.0\":return\"Vista\";case\"NT 6.1\":return\"7\";case\"NT 6.2\":return\"8\";case\"NT 6.3\":return\"8.1\";case\"NT 10.0\":return\"10\";default:return}}var i,o=t(/(ipod|iphone|ipad)/i).toLowerCase(),s=/like android/i.test(e),u=!s&&/android/i.test(e),c=/nexus\\s*[0-6]\\s*/i.test(e),l=!c&&/nexus\\s*[0-9]+/i.test(e),p=/CrOS/.test(e),f=/silk/i.test(e),h=/sailfish/i.test(e),d=/tizen/i.test(e),m=/(web|hpw)os/i.test(e),v=/windows phone/i.test(e),y=(/SamsungBrowser/i.test(e),!v&&/windows/i.test(e)),g=!o&&!f&&/macintosh/i.test(e),_=!u&&!h&&!d&&!m&&/linux/i.test(e),b=t(/edge\\/(\\d+(\\.\\d+)?)/i),x=t(/version\\/(\\d+(\\.\\d+)?)/i),w=/tablet/i.test(e),k=!w&&/[^-]mobi/i.test(e),S=/xbox/i.test(e);/opera/i.test(e)?i={name:\"Opera\",opera:a,version:x||t(/(?:opera|opr|opios)[\\s\\/](\\d+(\\.\\d+)?)/i)}:/opr|opios/i.test(e)?i={name:\"Opera\",opera:a,version:t(/(?:opr|opios)[\\s\\/](\\d+(\\.\\d+)?)/i)||x}:/SamsungBrowser/i.test(e)?i={name:\"Samsung Internet for Android\",samsungBrowser:a,version:x||t(/(?:SamsungBrowser)[\\s\\/](\\d+(\\.\\d+)?)/i)}:/coast/i.test(e)?i={name:\"Opera Coast\",coast:a,version:x||t(/(?:coast)[\\s\\/](\\d+(\\.\\d+)?)/i)}:/yabrowser/i.test(e)?i={name:\"Yandex Browser\",yandexbrowser:a,version:x||t(/(?:yabrowser)[\\s\\/](\\d+(\\.\\d+)?)/i)}:/ucbrowser/i.test(e)?i={name:\"UC Browser\",ucbrowser:a,version:t(/(?:ucbrowser)[\\s\\/](\\d+(?:\\.\\d+)+)/i)}:/mxios/i.test(e)?i={name:\"Maxthon\",maxthon:a,version:t(/(?:mxios)[\\s\\/](\\d+(?:\\.\\d+)+)/i)}:/epiphany/i.test(e)?i={name:\"Epiphany\",epiphany:a,version:t(/(?:epiphany)[\\s\\/](\\d+(?:\\.\\d+)+)/i)}:/puffin/i.test(e)?i={name:\"Puffin\",puffin:a,version:t(/(?:puffin)[\\s\\/](\\d+(?:\\.\\d+)?)/i)}:/sleipnir/i.test(e)?i={name:\"Sleipnir\",sleipnir:a,version:t(/(?:sleipnir)[\\s\\/](\\d+(?:\\.\\d+)+)/i)}:/k-meleon/i.test(e)?i={name:\"K-Meleon\",kMeleon:a,version:t(/(?:k-meleon)[\\s\\/](\\d+(?:\\.\\d+)+)/i)}:v?(i={name:\"Windows Phone\",windowsphone:a},b?(i.msedge=a,i.version=b):(i.msie=a,i.version=t(/iemobile\\/(\\d+(\\.\\d+)?)/i))):/msie|trident/i.test(e)?i={name:\"Internet Explorer\",msie:a,version:t(/(?:msie |rv:)(\\d+(\\.\\d+)?)/i)}:p?i={name:\"Chrome\",chromeos:a,chromeBook:a,chrome:a,version:t(/(?:chrome|crios|crmo)\\/(\\d+(\\.\\d+)?)/i)}:/chrome.+? edge/i.test(e)?i={name:\"Microsoft Edge\",msedge:a,version:b}:/vivaldi/i.test(e)?i={name:\"Vivaldi\",vivaldi:a,version:t(/vivaldi\\/(\\d+(\\.\\d+)?)/i)||x}:h?i={name:\"Sailfish\",sailfish:a,version:t(/sailfish\\s?browser\\/(\\d+(\\.\\d+)?)/i)}:/seamonkey\\//i.test(e)?i={name:\"SeaMonkey\",seamonkey:a,version:t(/seamonkey\\/(\\d+(\\.\\d+)?)/i)}:/firefox|iceweasel|fxios/i.test(e)?(i={name:\"Firefox\",firefox:a,version:t(/(?:firefox|iceweasel|fxios)[ \\/](\\d+(\\.\\d+)?)/i)},/\\((mobile|tablet);[^\\)]*rv:[\\d\\.]+\\)/i.test(e)&&(i.firefoxos=a)):f?i={name:\"Amazon Silk\",silk:a,version:t(/silk\\/(\\d+(\\.\\d+)?)/i)}:/phantom/i.test(e)?i={name:\"PhantomJS\",phantom:a,version:t(/phantomjs\\/(\\d+(\\.\\d+)?)/i)}:/slimerjs/i.test(e)?i={name:\"SlimerJS\",slimer:a,version:t(/slimerjs\\/(\\d+(\\.\\d+)?)/i)}:/blackberry|\\bbb\\d+/i.test(e)||/rim\\stablet/i.test(e)?i={name:\"BlackBerry\",blackberry:a,version:x||t(/blackberry[\\d]+\\/(\\d+(\\.\\d+)?)/i)}:m?(i={name:\"WebOS\",webos:a,version:x||t(/w(?:eb)?osbrowser\\/(\\d+(\\.\\d+)?)/i)},/touchpad\\//i.test(e)&&(i.touchpad=a)):/bada/i.test(e)?i={name:\"Bada\",bada:a,version:t(/dolfin\\/(\\d+(\\.\\d+)?)/i)}:d?i={name:\"Tizen\",tizen:a,version:t(/(?:tizen\\s?)?browser\\/(\\d+(\\.\\d+)?)/i)||x}:/qupzilla/i.test(e)?i={name:\"QupZilla\",qupzilla:a,version:t(/(?:qupzilla)[\\s\\/](\\d+(?:\\.\\d+)+)/i)||x}:/chromium/i.test(e)?i={name:\"Chromium\",chromium:a,version:t(/(?:chromium)[\\s\\/](\\d+(?:\\.\\d+)?)/i)||x}:/chrome|crios|crmo/i.test(e)?i={name:\"Chrome\",chrome:a,version:t(/(?:chrome|crios|crmo)\\/(\\d+(\\.\\d+)?)/i)}:u?i={name:\"Android\",version:x}:/safari|applewebkit/i.test(e)?(i={name:\"Safari\",safari:a},x&&(i.version=x)):o?(i={name:\"iphone\"==o?\"iPhone\":\"ipad\"==o?\"iPad\":\"iPod\"},x&&(i.version=x)):i=/googlebot/i.test(e)?{name:\"Googlebot\",googlebot:a,version:t(/googlebot\\/(\\d+(\\.\\d+))/i)||x}:{name:t(/^(.*)\\/(.*) /),version:n(/^(.*)\\/(.*) /)},!i.msedge&&/(apple)?webkit/i.test(e)?(/(apple)?webkit\\/537\\.36/i.test(e)?(i.name=i.name||\"Blink\",i.blink=a):(i.name=i.name||\"Webkit\",i.webkit=a),!i.version&&x&&(i.version=x)):!i.opera&&/gecko\\//i.test(e)&&(i.name=i.name||\"Gecko\",i.gecko=a,i.version=i.version||t(/gecko\\/(\\d+(\\.\\d+)?)/i)),i.windowsphone||i.msedge||!u&&!i.silk?i.windowsphone||i.msedge||!o?g?i.mac=a:S?i.xbox=a:y?i.windows=a:_&&(i.linux=a):(i[o]=a,i.ios=a):i.android=a;var E=\"\";i.windows?E=r(t(/Windows ((NT|XP)( \\d\\d?.\\d)?)/i)):i.windowsphone?E=t(/windows phone (?:os)?\\s?(\\d+(\\.\\d+)*)/i):i.mac?(E=t(/Mac OS X (\\d+([_\\.\\s]\\d+)*)/i),E=E.replace(/[_\\s]/g,\".\")):o?(E=t(/os (\\d+([_\\s]\\d+)*) like mac os x/i),E=E.replace(/[_\\s]/g,\".\")):u?E=t(/android[ \\/-](\\d+(\\.\\d+)*)/i):i.webos?E=t(/(?:web|hpw)os\\/(\\d+(\\.\\d+)*)/i):i.blackberry?E=t(/rim\\stablet\\sos\\s(\\d+(\\.\\d+)*)/i):i.bada?E=t(/bada\\/(\\d+(\\.\\d+)*)/i):i.tizen&&(E=t(/tizen[\\/\\s](\\d+(\\.\\d+)*)/i)),E&&(i.osversion=E);var C=!i.windows&&E.split(\".\")[0];return w||l||\"ipad\"==o||u&&(3==C||C>=4&&!k)||i.silk?i.tablet=a:(k||\"iphone\"==o||\"ipod\"==o||u||c||i.blackberry||i.webos||i.bada)&&(i.mobile=a),i.msedge||i.msie&&i.version>=10||i.yandexbrowser&&i.version>=15||i.vivaldi&&i.version>=1||i.chrome&&i.version>=20||i.samsungBrowser&&i.version>=4||i.firefox&&i.version>=20||i.safari&&i.version>=6||i.opera&&i.version>=10||i.ios&&i.osversion&&i.osversion.split(\".\")[0]>=6||i.blackberry&&i.version>=10.1||i.chromium&&i.version>=20?i.a=a:i.msie&&i.version<10||i.chrome&&i.version<20||i.firefox&&i.version<20||i.safari&&i.version<6||i.opera&&i.version<10||i.ios&&i.osversion&&i.osversion.split(\".\")[0]<6||i.chromium&&i.version<20?i.c=a:i.x=a,i}function t(e){return e.split(\".\").length}function n(e,t){var n,r=[];if(Array.prototype.map)return Array.prototype.map.call(e,t);for(n=0;n<e.length;n++)r.push(t(e[n]));return r}function r(e){for(var r=Math.max(t(e[0]),t(e[1])),i=n(e,function(e){var i=r-t(e);return e+=new Array(i+1).join(\".0\"),n(e.split(\".\"),function(e){return new Array(20-e.length).join(\"0\")+e}).reverse()});--r>=0;){if(i[0][r]>i[1][r])return 1;if(i[0][r]!==i[1][r])return-1;if(0===r)return 0}}function i(t,n,i){var o=s;\"string\"==typeof n&&(i=n,n=void 0),void 0===n&&(n=!1),i&&(o=e(i));var a=\"\"+o.version;for(var u in t)if(t.hasOwnProperty(u)&&o[u]){if(\"string\"!=typeof t[u])throw new Error(\"Browser version in the minVersion map should be a string: \"+u+\": \"+String(t));return r([a,t[u]])<0}return n}function o(e,t,n){return!i(e,t,n)}var a=!0,s=e(\"undefined\"!=typeof navigator?navigator.userAgent||\"\":\"\");return s.test=function(e){for(var t=0;t<e.length;++t){var n=e[t];if(\"string\"==typeof n&&n in s)return!0}return!1},s.isUnsupportedBrowser=i,s.compareVersions=r,s.check=o,s._detect=e,s})},function(e,t){e.exports=function(){throw new Error(\"define cannot be used indirect\")}},function(e,t){\"use strict\";Object.defineProperty(t,\"__esModule\",{value:!0}),t.default=function(e){var t=e.browser,n=e.version,r=e.prefix,i=\"keyframes\";return(\"chrome\"===t&&n<43||(\"safari\"===t||\"ios_saf\"===t)&&n<9||\"opera\"===t&&n<30||\"android\"===t&&n<=4.4||\"and_uc\"===t)&&(i=r.css+i),i},e.exports=t.default},function(e,t){\"use strict\";Object.defineProperty(t,\"__esModule\",{value:!0}),t.default={chrome:{transform:35,transformOrigin:35,transformOriginX:35,transformOriginY:35,backfaceVisibility:35,perspective:35,perspectiveOrigin:35,transformStyle:35,transformOriginZ:35,animation:42,animationDelay:42,animationDirection:42,animationFillMode:42,animationDuration:42,animationIterationCount:42,animationName:42,animationPlayState:42,animationTimingFunction:42,appearance:55,userSelect:55,fontKerning:32,textEmphasisPosition:55,textEmphasis:55,textEmphasisStyle:55,textEmphasisColor:55,boxDecorationBreak:55,clipPath:55,maskImage:55,maskMode:55,maskRepeat:55,maskPosition:55,maskClip:55,maskOrigin:55,maskSize:55,maskComposite:55,mask:55,maskBorderSource:55,maskBorderMode:55,maskBorderSlice:55,maskBorderWidth:55,maskBorderOutset:55,maskBorderRepeat:55,maskBorder:55,maskType:55,textDecorationStyle:55,textDecorationSkip:55,textDecorationLine:55,textDecorationColor:55,filter:52,fontFeatureSettings:47,breakAfter:49,breakBefore:49,breakInside:49,columnCount:49,columnFill:49,columnGap:49,columnRule:49,columnRuleColor:49,columnRuleStyle:49,columnRuleWidth:49,columns:49,columnSpan:49,columnWidth:49},safari:{flex:8,flexBasis:8,flexDirection:8,flexGrow:8,flexFlow:8,flexShrink:8,flexWrap:8,alignContent:8,alignItems:8,alignSelf:8,justifyContent:8,order:8,transition:6,transitionDelay:6,transitionDuration:6,transitionProperty:6,transitionTimingFunction:6,transform:8,transformOrigin:8,transformOriginX:8,transformOriginY:8,backfaceVisibility:8,perspective:8,perspectiveOrigin:8,transformStyle:8,transformOriginZ:8,animation:8,animationDelay:8,animationDirection:8,animationFillMode:8,animationDuration:8,animationIterationCount:8,animationName:8,animationPlayState:8,animationTimingFunction:8,appearance:10,userSelect:10,backdropFilter:10,fontKerning:9,scrollSnapType:10,scrollSnapPointsX:10,scrollSnapPointsY:10,scrollSnapDestination:10,scrollSnapCoordinate:10,textEmphasisPosition:7,textEmphasis:7,textEmphasisStyle:7,textEmphasisColor:7,boxDecorationBreak:10,clipPath:10,maskImage:10,maskMode:10,maskRepeat:10,maskPosition:10,maskClip:10,maskOrigin:10,maskSize:10,maskComposite:10,mask:10,maskBorderSource:10,maskBorderMode:10,maskBorderSlice:10,maskBorderWidth:10,maskBorderOutset:10,maskBorderRepeat:10,maskBorder:10,maskType:10,textDecorationStyle:10,textDecorationSkip:10,textDecorationLine:10,textDecorationColor:10,shapeImageThreshold:10,shapeImageMargin:10,shapeImageOutside:10,filter:9,hyphens:10,flowInto:10,flowFrom:10,breakBefore:8,breakAfter:8,breakInside:8,regionFragment:10,columnCount:8,columnFill:8,columnGap:8,columnRule:8,columnRuleColor:8,columnRuleStyle:8,columnRuleWidth:8,columns:8,columnSpan:8,columnWidth:8},firefox:{appearance:51,userSelect:51,boxSizing:28,textAlignLast:48,textDecorationStyle:35,textDecorationSkip:35,textDecorationLine:35,textDecorationColor:35,tabSize:51,hyphens:42,fontFeatureSettings:33,breakAfter:51,breakBefore:51,breakInside:51,columnCount:51,columnFill:51,columnGap:51,columnRule:51,columnRuleColor:51,columnRuleStyle:51,columnRuleWidth:51,columns:51,columnSpan:51,columnWidth:51},opera:{flex:16,flexBasis:16,flexDirection:16,flexGrow:16,flexFlow:16,flexShrink:16,flexWrap:16,alignContent:16,alignItems:16,alignSelf:16,justifyContent:16,order:16,transform:22,transformOrigin:22,transformOriginX:22,transformOriginY:22,backfaceVisibility:22,perspective:22,perspectiveOrigin:22,transformStyle:22,transformOriginZ:22,animation:29,animationDelay:29,animationDirection:29,animationFillMode:29,animationDuration:29,animationIterationCount:29,animationName:29,animationPlayState:29,animationTimingFunction:29,appearance:41,userSelect:41,fontKerning:19,textEmphasisPosition:41,textEmphasis:41,textEmphasisStyle:41,textEmphasisColor:41,boxDecorationBreak:41,clipPath:41,maskImage:41,maskMode:41,maskRepeat:41,maskPosition:41,maskClip:41,maskOrigin:41,maskSize:41,maskComposite:41,mask:41,maskBorderSource:41,maskBorderMode:41,maskBorderSlice:41,maskBorderWidth:41,maskBorderOutset:41,maskBorderRepeat:41,maskBorder:41,maskType:41,textDecorationStyle:41,textDecorationSkip:41,textDecorationLine:41,textDecorationColor:41,filter:39,fontFeatureSettings:34,breakAfter:36,breakBefore:36,breakInside:36,columnCount:36,columnFill:36,columnGap:36,columnRule:36,columnRuleColor:36,columnRuleStyle:36,columnRuleWidth:36,columns:36,columnSpan:36,columnWidth:36},ie:{flex:10,flexDirection:10,flexFlow:10,flexWrap:10,transform:9,transformOrigin:9,transformOriginX:9,transformOriginY:9,userSelect:11,wrapFlow:11,wrapThrough:11,wrapMargin:11,scrollSnapType:11,scrollSnapPointsX:11,scrollSnapPointsY:11,scrollSnapDestination:11,scrollSnapCoordinate:11,touchAction:10,hyphens:11,flowInto:11,flowFrom:11,breakBefore:11,breakAfter:11,breakInside:11,regionFragment:11,gridTemplateColumns:11,gridTemplateRows:11,gridTemplateAreas:11,gridTemplate:11,gridAutoColumns:11,gridAutoRows:11,gridAutoFlow:11,grid:11,gridRowStart:11,gridColumnStart:11,gridRowEnd:11,gridRow:11,gridColumn:11,gridColumnEnd:11,gridColumnGap:11,gridRowGap:11,gridArea:11,gridGap:11,textSizeAdjust:11},edge:{userSelect:14,wrapFlow:14,wrapThrough:14,wrapMargin:14,scrollSnapType:14,scrollSnapPointsX:14,scrollSnapPointsY:14,scrollSnapDestination:14,scrollSnapCoordinate:14,hyphens:14,flowInto:14,flowFrom:14,breakBefore:14,breakAfter:14,breakInside:14,regionFragment:14,gridTemplateColumns:14,gridTemplateRows:14,gridTemplateAreas:14,gridTemplate:14,gridAutoColumns:14,gridAutoRows:14,gridAutoFlow:14,grid:14,gridRowStart:14,gridColumnStart:14,gridRowEnd:14,gridRow:14,gridColumn:14,gridColumnEnd:14,gridColumnGap:14,gridRowGap:14,gridArea:14,gridGap:14},ios_saf:{flex:8.1,flexBasis:8.1,flexDirection:8.1,flexGrow:8.1,flexFlow:8.1,flexShrink:8.1,flexWrap:8.1,alignContent:8.1,alignItems:8.1,alignSelf:8.1,justifyContent:8.1,order:8.1,transition:6,transitionDelay:6,transitionDuration:6,transitionProperty:6,transitionTimingFunction:6,transform:8.1,transformOrigin:8.1,transformOriginX:8.1,transformOriginY:8.1,backfaceVisibility:8.1,perspective:8.1,perspectiveOrigin:8.1,transformStyle:8.1,transformOriginZ:8.1,animation:8.1,animationDelay:8.1,animationDirection:8.1,animationFillMode:8.1,animationDuration:8.1,animationIterationCount:8.1,animationName:8.1,animationPlayState:8.1,animationTimingFunction:8.1,appearance:9.3,userSelect:9.3,backdropFilter:9.3,fontKerning:9.3,scrollSnapType:9.3,scrollSnapPointsX:9.3,scrollSnapPointsY:9.3,scrollSnapDestination:9.3,scrollSnapCoordinate:9.3,boxDecorationBreak:9.3,clipPath:9.3,maskImage:9.3,maskMode:9.3,maskRepeat:9.3,maskPosition:9.3,maskClip:9.3,maskOrigin:9.3,maskSize:9.3,maskComposite:9.3,mask:9.3,maskBorderSource:9.3,maskBorderMode:9.3,maskBorderSlice:9.3,maskBorderWidth:9.3,maskBorderOutset:9.3,maskBorderRepeat:9.3,maskBorder:9.3,maskType:9.3,textSizeAdjust:9.3,textDecorationStyle:9.3,textDecorationSkip:9.3,textDecorationLine:9.3,textDecorationColor:9.3,shapeImageThreshold:9.3,shapeImageMargin:9.3,shapeImageOutside:9.3,filter:9,hyphens:9.3,flowInto:9.3,flowFrom:9.3,breakBefore:8.1,breakAfter:8.1,breakInside:8.1,regionFragment:9.3,columnCount:8.1,columnFill:8.1,columnGap:8.1,columnRule:8.1,columnRuleColor:8.1,columnRuleStyle:8.1,columnRuleWidth:8.1,columns:8.1,columnSpan:8.1,columnWidth:8.1},android:{flex:4.2,flexBasis:4.2,flexDirection:4.2,flexGrow:4.2,flexFlow:4.2,flexShrink:4.2,flexWrap:4.2,alignContent:4.2,alignItems:4.2,alignSelf:4.2,justifyContent:4.2,order:4.2,transition:4.2,transitionDelay:4.2,transitionDuration:4.2,transitionProperty:4.2,transitionTimingFunction:4.2,transform:4.4,transformOrigin:4.4,transformOriginX:4.4,transformOriginY:4.4,backfaceVisibility:4.4,perspective:4.4,perspectiveOrigin:4.4,transformStyle:4.4,transformOriginZ:4.4,animation:4.4,animationDelay:4.4,animationDirection:4.4,animationFillMode:4.4,animationDuration:4.4,animationIterationCount:4.4,animationName:4.4,animationPlayState:4.4,animationTimingFunction:4.4,appearance:51,userSelect:51,fontKerning:4.4,textEmphasisPosition:51,textEmphasis:51,textEmphasisStyle:51,textEmphasisColor:51,boxDecorationBreak:51,clipPath:51,maskImage:51,maskMode:51,maskRepeat:51,maskPosition:51,maskClip:51,maskOrigin:51,maskSize:51,maskComposite:51,mask:51,maskBorderSource:51,maskBorderMode:51,maskBorderSlice:51,maskBorderWidth:51,maskBorderOutset:51,maskBorderRepeat:51,maskBorder:51,maskType:51,filter:51,fontFeatureSettings:4.4,breakAfter:51,breakBefore:51,breakInside:51,columnCount:51,columnFill:51,columnGap:51,columnRule:51,columnRuleColor:51,columnRuleStyle:51,columnRuleWidth:51,columns:51,columnSpan:51,columnWidth:51},and_chr:{appearance:51,userSelect:51,textEmphasisPosition:51,textEmphasis:51,textEmphasisStyle:51,textEmphasisColor:51,boxDecorationBreak:51,clipPath:51,maskImage:51,maskMode:51,maskRepeat:51,maskPosition:51,maskClip:51,maskOrigin:51,maskSize:51,maskComposite:51,mask:51,maskBorderSource:51,maskBorderMode:51,maskBorderSlice:51,maskBorderWidth:51,maskBorderOutset:51,maskBorderRepeat:51,maskBorder:51,maskType:51,textDecorationStyle:51,textDecorationSkip:51,textDecorationLine:51,textDecorationColor:51,filter:51},and_uc:{flex:9.9,flexBasis:9.9,flexDirection:9.9,flexGrow:9.9,flexFlow:9.9,flexShrink:9.9,flexWrap:9.9,alignContent:9.9,alignItems:9.9,alignSelf:9.9,justifyContent:9.9,order:9.9,transition:9.9,transitionDelay:9.9,transitionDuration:9.9,transitionProperty:9.9,transitionTimingFunction:9.9,transform:9.9,transformOrigin:9.9,transformOriginX:9.9,transformOriginY:9.9,backfaceVisibility:9.9,perspective:9.9,perspectiveOrigin:9.9,transformStyle:9.9,transformOriginZ:9.9,animation:9.9,animationDelay:9.9,animationDirection:9.9,animationFillMode:9.9,animationDuration:9.9,animationIterationCount:9.9,animationName:9.9,animationPlayState:9.9,animationTimingFunction:9.9,appearance:9.9,userSelect:9.9,fontKerning:9.9,textEmphasisPosition:9.9,textEmphasis:9.9,textEmphasisStyle:9.9,textEmphasisColor:9.9,maskImage:9.9,maskMode:9.9,maskRepeat:9.9,maskPosition:9.9,maskClip:9.9,maskOrigin:9.9,maskSize:9.9,maskComposite:9.9,mask:9.9,maskBorderSource:9.9,maskBorderMode:9.9,maskBorderSlice:9.9,maskBorderWidth:9.9,maskBorderOutset:9.9,maskBorderRepeat:9.9,maskBorder:9.9,maskType:9.9,textSizeAdjust:9.9,filter:9.9,hyphens:9.9,flowInto:9.9,flowFrom:9.9,breakBefore:9.9,breakAfter:9.9,breakInside:9.9,regionFragment:9.9,fontFeatureSettings:9.9,columnCount:9.9,columnFill:9.9,columnGap:9.9,columnRule:9.9,columnRuleColor:9.9,columnRuleStyle:9.9,columnRuleWidth:9.9,columns:9.9,columnSpan:9.9,columnWidth:9.9},op_mini:{}},e.exports=t.default},function(e,t,n){\"use strict\";function r(e){return e&&e.__esModule?e:{default:e}}function i(e,t,n){return t in e?Object.defineProperty(e,t,{value:n,enumerable:!0,configurable:!0,writable:!0}):e[t]=n,e}function o(e){var t=e.property,n=e.value,r=e.browserInfo.browser,o=e.prefix.css,a=e.keepUnprefixed;if(\"position\"===t&&\"sticky\"===n&&(\"safari\"===r||\"ios_saf\"===r))return i({},t,(0,s.default)(o+n,n,a))}Object.defineProperty(t,\"__esModule\",{value:!0}),t.default=o;var a=n(991),s=r(a);e.exports=t.default},function(e,t){\"use strict\";Object.defineProperty(t,\"__esModule\",{value:!0}),t.default=function(e,t,n){return n?[e,t]:e},e.exports=t.default},function(e,t,n){\"use strict\";function r(e){return e&&e.__esModule?e:{default:e}}function i(e,t,n){return t in e?Object.defineProperty(e,t,{value:n,enumerable:!0,configurable:!0,writable:!0}):e[t]=n,e}function o(e){var t=e.property,n=e.value,r=e.browserInfo,o=r.browser,a=r.version,u=e.prefix.css,c=e.keepUnprefixed;if(\"string\"==typeof n&&n.indexOf(\"calc(\")>-1&&(\"firefox\"===o&&a<15||\"chrome\"===o&&a<25||\"safari\"===o&&a<6.1||\"ios_saf\"===o&&a<7))return i({},t,(0,s.default)(n.replace(/calc\\(/g,u+\"calc(\"),n,c))}Object.defineProperty(t,\"__esModule\",{value:!0}),t.default=o;var a=n(991),s=r(a);e.exports=t.default},function(e,t,n){\"use strict\";function r(e){return e&&e.__esModule?e:{default:e}}function i(e){var t=e.property,n=e.value,r=e.browserInfo,i=r.browser,o=r.version,u=e.prefix.css,c=e.keepUnprefixed;if(\"cursor\"===t&&s[n]&&(\"firefox\"===i&&o<24||\"chrome\"===i&&o<37||\"safari\"===i&&o<9||\"opera\"===i&&o<24))return{cursor:(0,a.default)(u+n,n,c)}}Object.defineProperty(t,\"__esModule\",{value:!0}),t.default=i;var o=n(991),a=r(o),s={\"zoom-in\":!0,\"zoom-out\":!0};e.exports=t.default},function(e,t,n){\"use strict\";function r(e){return e&&e.__esModule?e:{default:e}}function i(e){var t=e.property,n=e.value,r=e.browserInfo.browser,i=e.prefix.css,o=e.keepUnprefixed;if(\"cursor\"===t&&s[n]&&(\"firefox\"===r||\"chrome\"===r||\"safari\"===r||\"opera\"===r))return{cursor:(0,a.default)(i+n,n,o)}}Object.defineProperty(t,\"__esModule\",{value:!0}),t.default=i;var o=n(991),a=r(o),s={grab:!0,grabbing:!0};e.exports=t.default},function(e,t,n){\"use strict\";function r(e){return e&&e.__esModule?e:{default:e}}function i(e){var t=e.property,n=e.value,r=e.browserInfo,i=r.browser,o=r.version,u=e.prefix.css,c=e.keepUnprefixed;if(\"display\"===t&&s[n]&&(\"chrome\"===i&&o<29&&o>20||(\"safari\"===i||\"ios_saf\"===i)&&o<9&&o>6||\"opera\"===i&&(15==o||16==o)))return{display:(0,a.default)(u+n,n,c)}}Object.defineProperty(t,\"__esModule\",{value:!0}),t.default=i;var o=n(991),a=r(o),s={flex:!0,\"inline-flex\":!0};e.exports=t.default},function(e,t,n){\"use strict\";function r(e){return e&&e.__esModule?e:{default:e}}function i(e,t,n){return t in e?Object.defineProperty(e,t,{value:n,enumerable:!0,configurable:!0,writable:!0}):e[t]=n,e}function o(e){var t=e.property,n=e.value,r=e.prefix.css,o=e.keepUnprefixed;if(u[t]&&c[n])return i({},t,(0,s.default)(r+n,n,o))}Object.defineProperty(t,\"__esModule\",{value:!0}),t.default=o;var a=n(991),s=r(a),u={maxHeight:!0,maxWidth:!0,width:!0,height:!0,columnWidth:!0,minWidth:!0,minHeight:!0},c={\"min-content\":!0,\"max-content\":!0,\"fill-available\":!0,\"fit-content\":!0,\"contain-floats\":!0};e.exports=t.default},function(e,t,n){\"use strict\";function r(e){return e&&e.__esModule?e:{default:e}}function i(e,t,n){return t in e?Object.defineProperty(e,t,{value:n,enumerable:!0,configurable:!0,writable:!0}):e[t]=n,e}function o(e){var t=e.property,n=e.value,r=e.browserInfo,o=r.browser,a=r.version,c=e.prefix.css,l=e.keepUnprefixed;if(\"string\"==typeof n&&null!==n.match(u)&&(\"firefox\"===o&&a<16||\"chrome\"===o&&a<26||(\"safari\"===o||\"ios_saf\"===o)&&a<7||(\"opera\"===o||\"op_mini\"===o)&&a<12.1||\"android\"===o&&a<4.4||\"and_uc\"===o))return i({},t,(0,s.default)(c+n,n,l))}Object.defineProperty(t,\"__esModule\",{value:!0}),t.default=o;var a=n(991),s=r(a),u=/linear-gradient|radial-gradient|repeating-linear-gradient|repeating-radial-gradient/;e.exports=t.default},function(e,t,n){\"use strict\";function r(e){return e&&e.__esModule?e:{default:e}}function i(e,t,n){return t in e?Object.defineProperty(e,t,{value:n,enumerable:!0,configurable:!0,writable:!0}):e[t]=n,e}function o(e){var t=e.property,n=e.value,r=e.prefix.css,o=e.requiresPrefix,s=e.keepUnprefixed,c=(0,l.default)(t);if(\"string\"==typeof n&&p[c]){var f=function(){var e=Object.keys(o).map(function(e){return(0,u.default)(e)}),a=n.split(/,(?![^()]*(?:\\([^()]*\\))?\\))/g);return e.forEach(function(e){a.forEach(function(t,n){t.indexOf(e)>-1&&\"order\"!==e&&(a[n]=t.replace(e,r+e)+(s?\",\"+t:\"\"))})}),{v:i({},t,a.join(\",\"))}}();if(\"object\"===(\"undefined\"==typeof f?\"undefined\":a(f)))return f.v}}Object.defineProperty(t,\"__esModule\",{value:!0});var a=\"function\"==typeof Symbol&&\"symbol\"==typeof Symbol.iterator?function(e){return typeof e}:function(e){return e&&\"function\"==typeof Symbol&&e.constructor===Symbol?\"symbol\":typeof e};t.default=o;var s=n(982),u=r(s),c=n(999),l=r(c),p={transition:!0,transitionProperty:!0};e.exports=t.default},function(e,t){\"use strict\";Object.defineProperty(t,\"__esModule\",{value:!0}),t.default=function(e){var t=e.replace(/^(ms|Webkit|Moz|O)/,\"\");return t.charAt(0).toLowerCase()+t.slice(1)},e.exports=t.default},function(e,t,n){\"use strict\";function r(e){return e&&e.__esModule?e:{default:e}}function i(e,t,n){return t in e?Object.defineProperty(e,t,{value:n,enumerable:!0,configurable:!0,writable:!0}):e[t]=n,e}function o(e){var t=e.property,n=e.value,r=e.styles,o=e.browserInfo,a=o.browser,l=o.version,p=e.prefix.css,f=e.keepUnprefixed;if((c[t]||\"display\"===t&&\"string\"==typeof n&&n.indexOf(\"flex\")>-1)&&(\"ie_mob\"===a||\"ie\"===a)&&10==l){if(f||Array.isArray(r[t])||delete r[t],\"display\"===t&&u[n])return{display:(0,s.default)(p+u[n],n,f)};if(c[t])return i({},c[t],u[n]||n)}}Object.defineProperty(t,\"__esModule\",{value:!0}),t.default=o;var a=n(991),s=r(a),u={\"space-around\":\"distribute\",\"space-between\":\"justify\",\"flex-start\":\"start\",\"flex-end\":\"end\",flex:\"flexbox\",\"inline-flex\":\"inline-flexbox\"},c={alignContent:\"msFlexLinePack\",alignSelf:\"msFlexItemAlign\",alignItems:\"msFlexAlign\",justifyContent:\"msFlexPack\",order:\"msFlexOrder\",flexGrow:\"msFlexPositive\",flexShrink:\"msFlexNegative\",flexBasis:\"msPreferredSize\"};e.exports=t.default},function(e,t,n){\"use strict\";function r(e){return e&&e.__esModule?e:{default:e}}function i(e,t,n){return t in e?Object.defineProperty(e,t,{value:n,enumerable:!0,configurable:!0,writable:!0}):e[t]=n,e}function o(e){var t=e.property,n=e.value,r=e.styles,o=e.browserInfo,a=o.browser,l=o.version,f=e.prefix.css,h=e.keepUnprefixed;if((p.indexOf(t)>-1||\"display\"===t&&\"string\"==typeof n&&n.indexOf(\"flex\")>-1)&&(\"firefox\"===a&&l<22||\"chrome\"===a&&l<21||(\"safari\"===a||\"ios_saf\"===a)&&l<=6.1||\"android\"===a&&l<4.4||\"and_uc\"===a)){if(h||Array.isArray(r[t])||delete r[t],\"flexDirection\"===t&&\"string\"==typeof n)return{WebkitBoxOrient:n.indexOf(\"column\")>-1?\"vertical\":\"horizontal\",WebkitBoxDirection:n.indexOf(\"reverse\")>-1?\"reverse\":\"normal\"};if(\"display\"===t&&u[n])return{display:(0,s.default)(f+u[n],n,h)};if(c[t])return i({},c[t],u[n]||n)}}Object.defineProperty(t,\"__esModule\",{value:!0}),t.default=o;var a=n(991),s=r(a),u={\"space-around\":\"justify\",\"space-between\":\"justify\",\"flex-start\":\"start\",\"flex-end\":\"end\",\"wrap-reverse\":\"multiple\",wrap:\"multiple\",flex:\"box\",\"inline-flex\":\"inline-box\"},c={alignItems:\"WebkitBoxAlign\",justifyContent:\"WebkitBoxPack\",flexWrap:\"WebkitBoxLines\"},l=[\"alignContent\",\"alignSelf\",\"order\",\"flexGrow\",\"flexShrink\",\"flexBasis\",\"flexDirection\"],p=Object.keys(c).concat(l);e.exports=t.default},function(e,t,n){var r=n(1003),i=n(498);e.exports=function(e,t,n){var i=e[t];if(i){var o=[];if(Object.keys(i).forEach(function(e){r.indexOf(e)===-1&&o.push(e)}),o.length)throw new Error(\"Prop \"+t+\" passed to \"+n+\". Has invalid keys \"+o.join(\", \"))}},e.exports.isRequired=function(t,n,r){if(!t[n])throw new Error(\"Prop \"+n+\" passed to \"+r+\" is required\");return e.exports(t,n,r)},e.exports.supportingArrays=i.PropTypes.oneOfType([i.PropTypes.arrayOf(e.exports),e.exports])},function(e,t){e.exports=[\"alignContent\",\"MozAlignContent\",\"WebKitAlignContent\",\"MSAlignContent\",\"OAlignContent\",\"alignItems\",\"MozAlignItems\",\"WebKitAlignItems\",\"MSAlignItems\",\"OAlignItems\",\"alignSelf\",\"MozAlignSelf\",\"WebKitAlignSelf\",\"MSAlignSelf\",\"OAlignSelf\",\"all\",\"MozAll\",\"WebKitAll\",\"MSAll\",\"OAll\",\"animation\",\"MozAnimation\",\"WebKitAnimation\",\"MSAnimation\",\"OAnimation\",\"animationDelay\",\"MozAnimationDelay\",\"WebKitAnimationDelay\",\"MSAnimationDelay\",\"OAnimationDelay\",\"animationDirection\",\"MozAnimationDirection\",\"WebKitAnimationDirection\",\"MSAnimationDirection\",\"OAnimationDirection\",\"animationDuration\",\"MozAnimationDuration\",\"WebKitAnimationDuration\",\"MSAnimationDuration\",\"OAnimationDuration\",\"animationFillMode\",\"MozAnimationFillMode\",\"WebKitAnimationFillMode\",\"MSAnimationFillMode\",\"OAnimationFillMode\",\"animationIterationCount\",\"MozAnimationIterationCount\",\"WebKitAnimationIterationCount\",\"MSAnimationIterationCount\",\"OAnimationIterationCount\",\"animationName\",\"MozAnimationName\",\"WebKitAnimationName\",\"MSAnimationName\",\"OAnimationName\",\"animationPlayState\",\"MozAnimationPlayState\",\"WebKitAnimationPlayState\",\"MSAnimationPlayState\",\"OAnimationPlayState\",\"animationTimingFunction\",\"MozAnimationTimingFunction\",\"WebKitAnimationTimingFunction\",\"MSAnimationTimingFunction\",\"OAnimationTimingFunction\",\"backfaceVisibility\",\"MozBackfaceVisibility\",\"WebKitBackfaceVisibility\",\"MSBackfaceVisibility\",\"OBackfaceVisibility\",\"background\",\"MozBackground\",\"WebKitBackground\",\"MSBackground\",\"OBackground\",\"backgroundAttachment\",\"MozBackgroundAttachment\",\"WebKitBackgroundAttachment\",\"MSBackgroundAttachment\",\"OBackgroundAttachment\",\"backgroundBlendMode\",\"MozBackgroundBlendMode\",\"WebKitBackgroundBlendMode\",\"MSBackgroundBlendMode\",\"OBackgroundBlendMode\",\"backgroundClip\",\"MozBackgroundClip\",\"WebKitBackgroundClip\",\"MSBackgroundClip\",\"OBackgroundClip\",\"backgroundColor\",\"MozBackgroundColor\",\"WebKitBackgroundColor\",\"MSBackgroundColor\",\"OBackgroundColor\",\"backgroundImage\",\"MozBackgroundImage\",\"WebKitBackgroundImage\",\"MSBackgroundImage\",\"OBackgroundImage\",\"backgroundOrigin\",\"MozBackgroundOrigin\",\"WebKitBackgroundOrigin\",\"MSBackgroundOrigin\",\"OBackgroundOrigin\",\"backgroundPosition\",\"MozBackgroundPosition\",\"WebKitBackgroundPosition\",\"MSBackgroundPosition\",\"OBackgroundPosition\",\"backgroundRepeat\",\"MozBackgroundRepeat\",\"WebKitBackgroundRepeat\",\"MSBackgroundRepeat\",\"OBackgroundRepeat\",\"backgroundSize\",\"MozBackgroundSize\",\"WebKitBackgroundSize\",\"MSBackgroundSize\",\"OBackgroundSize\",\"blockSize\",\"MozBlockSize\",\"WebKitBlockSize\",\"MSBlockSize\",\"OBlockSize\",\"border\",\"MozBorder\",\"WebKitBorder\",\"MSBorder\",\"OBorder\",\"borderBlockEnd\",\"MozBorderBlockEnd\",\"WebKitBorderBlockEnd\",\"MSBorderBlockEnd\",\"OBorderBlockEnd\",\"borderBlockEndColor\",\"MozBorderBlockEndColor\",\"WebKitBorderBlockEndColor\",\"MSBorderBlockEndColor\",\"OBorderBlockEndColor\",\"borderBlockEndStyle\",\"MozBorderBlockEndStyle\",\"WebKitBorderBlockEndStyle\",\"MSBorderBlockEndStyle\",\"OBorderBlockEndStyle\",\"borderBlockEndWidth\",\"MozBorderBlockEndWidth\",\"WebKitBorderBlockEndWidth\",\"MSBorderBlockEndWidth\",\"OBorderBlockEndWidth\",\"borderBlockStart\",\"MozBorderBlockStart\",\"WebKitBorderBlockStart\",\"MSBorderBlockStart\",\"OBorderBlockStart\",\"borderBlockStartColor\",\"MozBorderBlockStartColor\",\"WebKitBorderBlockStartColor\",\"MSBorderBlockStartColor\",\"OBorderBlockStartColor\",\"borderBlockStartStyle\",\"MozBorderBlockStartStyle\",\"WebKitBorderBlockStartStyle\",\"MSBorderBlockStartStyle\",\"OBorderBlockStartStyle\",\"borderBlockStartWidth\",\"MozBorderBlockStartWidth\",\"WebKitBorderBlockStartWidth\",\"MSBorderBlockStartWidth\",\"OBorderBlockStartWidth\",\"borderBottom\",\"MozBorderBottom\",\"WebKitBorderBottom\",\"MSBorderBottom\",\"OBorderBottom\",\"borderBottomColor\",\"MozBorderBottomColor\",\"WebKitBorderBottomColor\",\"MSBorderBottomColor\",\"OBorderBottomColor\",\"borderBottomLeftRadius\",\"MozBorderBottomLeftRadius\",\"WebKitBorderBottomLeftRadius\",\"MSBorderBottomLeftRadius\",\"OBorderBottomLeftRadius\",\"borderBottomRightRadius\",\"MozBorderBottomRightRadius\",\"WebKitBorderBottomRightRadius\",\"MSBorderBottomRightRadius\",\"OBorderBottomRightRadius\",\"borderBottomStyle\",\"MozBorderBottomStyle\",\"WebKitBorderBottomStyle\",\"MSBorderBottomStyle\",\"OBorderBottomStyle\",\"borderBottomWidth\",\"MozBorderBottomWidth\",\"WebKitBorderBottomWidth\",\"MSBorderBottomWidth\",\"OBorderBottomWidth\",\"borderCollapse\",\"MozBorderCollapse\",\"WebKitBorderCollapse\",\"MSBorderCollapse\",\"OBorderCollapse\",\"borderColor\",\"MozBorderColor\",\"WebKitBorderColor\",\"MSBorderColor\",\"OBorderColor\",\"borderImage\",\"MozBorderImage\",\"WebKitBorderImage\",\"MSBorderImage\",\"OBorderImage\",\"borderImageOutset\",\"MozBorderImageOutset\",\"WebKitBorderImageOutset\",\"MSBorderImageOutset\",\"OBorderImageOutset\",\"borderImageRepeat\",\"MozBorderImageRepeat\",\"WebKitBorderImageRepeat\",\"MSBorderImageRepeat\",\"OBorderImageRepeat\",\"borderImageSlice\",\"MozBorderImageSlice\",\"WebKitBorderImageSlice\",\"MSBorderImageSlice\",\"OBorderImageSlice\",\"borderImageSource\",\"MozBorderImageSource\",\"WebKitBorderImageSource\",\"MSBorderImageSource\",\"OBorderImageSource\",\"borderImageWidth\",\"MozBorderImageWidth\",\"WebKitBorderImageWidth\",\"MSBorderImageWidth\",\"OBorderImageWidth\",\"borderInlineEnd\",\"MozBorderInlineEnd\",\"WebKitBorderInlineEnd\",\"MSBorderInlineEnd\",\"OBorderInlineEnd\",\"borderInlineEndColor\",\"MozBorderInlineEndColor\",\"WebKitBorderInlineEndColor\",\"MSBorderInlineEndColor\",\"OBorderInlineEndColor\",\"borderInlineEndStyle\",\"MozBorderInlineEndStyle\",\"WebKitBorderInlineEndStyle\",\"MSBorderInlineEndStyle\",\"OBorderInlineEndStyle\",\"borderInlineEndWidth\",\"MozBorderInlineEndWidth\",\"WebKitBorderInlineEndWidth\",\"MSBorderInlineEndWidth\",\"OBorderInlineEndWidth\",\"borderInlineStart\",\"MozBorderInlineStart\",\"WebKitBorderInlineStart\",\"MSBorderInlineStart\",\"OBorderInlineStart\",\"borderInlineStartColor\",\"MozBorderInlineStartColor\",\"WebKitBorderInlineStartColor\",\"MSBorderInlineStartColor\",\"OBorderInlineStartColor\",\"borderInlineStartStyle\",\"MozBorderInlineStartStyle\",\"WebKitBorderInlineStartStyle\",\"MSBorderInlineStartStyle\",\"OBorderInlineStartStyle\",\"borderInlineStartWidth\",\"MozBorderInlineStartWidth\",\"WebKitBorderInlineStartWidth\",\"MSBorderInlineStartWidth\",\"OBorderInlineStartWidth\",\"borderLeft\",\"MozBorderLeft\",\"WebKitBorderLeft\",\"MSBorderLeft\",\"OBorderLeft\",\"borderLeftColor\",\"MozBorderLeftColor\",\"WebKitBorderLeftColor\",\"MSBorderLeftColor\",\"OBorderLeftColor\",\"borderLeftStyle\",\"MozBorderLeftStyle\",\"WebKitBorderLeftStyle\",\"MSBorderLeftStyle\",\"OBorderLeftStyle\",\"borderLeftWidth\",\"MozBorderLeftWidth\",\"WebKitBorderLeftWidth\",\"MSBorderLeftWidth\",\"OBorderLeftWidth\",\"borderRadius\",\"MozBorderRadius\",\"WebKitBorderRadius\",\"MSBorderRadius\",\"OBorderRadius\",\"borderRight\",\"MozBorderRight\",\"WebKitBorderRight\",\"MSBorderRight\",\"OBorderRight\",\"borderRightColor\",\"MozBorderRightColor\",\"WebKitBorderRightColor\",\"MSBorderRightColor\",\"OBorderRightColor\",\"borderRightStyle\",\"MozBorderRightStyle\",\"WebKitBorderRightStyle\",\"MSBorderRightStyle\",\"OBorderRightStyle\",\"borderRightWidth\",\"MozBorderRightWidth\",\"WebKitBorderRightWidth\",\"MSBorderRightWidth\",\"OBorderRightWidth\",\"borderSpacing\",\"MozBorderSpacing\",\"WebKitBorderSpacing\",\"MSBorderSpacing\",\"OBorderSpacing\",\"borderStyle\",\"MozBorderStyle\",\"WebKitBorderStyle\",\"MSBorderStyle\",\"OBorderStyle\",\"borderTop\",\"MozBorderTop\",\"WebKitBorderTop\",\"MSBorderTop\",\"OBorderTop\",\"borderTopColor\",\"MozBorderTopColor\",\"WebKitBorderTopColor\",\"MSBorderTopColor\",\"OBorderTopColor\",\"borderTopLeftRadius\",\"MozBorderTopLeftRadius\",\"WebKitBorderTopLeftRadius\",\"MSBorderTopLeftRadius\",\"OBorderTopLeftRadius\",\"borderTopRightRadius\",\"MozBorderTopRightRadius\",\"WebKitBorderTopRightRadius\",\"MSBorderTopRightRadius\",\"OBorderTopRightRadius\",\"borderTopStyle\",\"MozBorderTopStyle\",\"WebKitBorderTopStyle\",\"MSBorderTopStyle\",\"OBorderTopStyle\",\"borderTopWidth\",\"MozBorderTopWidth\",\"WebKitBorderTopWidth\",\"MSBorderTopWidth\",\"OBorderTopWidth\",\"borderWidth\",\"MozBorderWidth\",\"WebKitBorderWidth\",\"MSBorderWidth\",\"OBorderWidth\",\"bottom\",\"MozBottom\",\"WebKitBottom\",\"MSBottom\",\"OBottom\",\"boxDecorationBreak\",\"MozBoxDecorationBreak\",\"WebKitBoxDecorationBreak\",\"MSBoxDecorationBreak\",\"OBoxDecorationBreak\",\"boxShadow\",\"MozBoxShadow\",\"WebKitBoxShadow\",\"MSBoxShadow\",\"OBoxShadow\",\"boxSizing\",\"MozBoxSizing\",\"WebKitBoxSizing\",\"MSBoxSizing\",\"OBoxSizing\",\"breakAfter\",\"MozBreakAfter\",\"WebKitBreakAfter\",\"MSBreakAfter\",\"OBreakAfter\",\"breakBefore\",\"MozBreakBefore\",\"WebKitBreakBefore\",\"MSBreakBefore\",\"OBreakBefore\",\"breakInside\",\"MozBreakInside\",\"WebKitBreakInside\",\"MSBreakInside\",\"OBreakInside\",\"captionSide\",\"MozCaptionSide\",\"WebKitCaptionSide\",\"MSCaptionSide\",\"OCaptionSide\",\"ch\",\"MozCh\",\"WebKitCh\",\"MSCh\",\"OCh\",\"clear\",\"MozClear\",\"WebKitClear\",\"MSClear\",\"OClear\",\"clip\",\"MozClip\",\"WebKitClip\",\"MSClip\",\"OClip\",\"clipPath\",\"MozClipPath\",\"WebKitClipPath\",\"MSClipPath\",\"OClipPath\",\"cm\",\"MozCm\",\"WebKitCm\",\"MSCm\",\"OCm\",\"color\",\"MozColor\",\"WebKitColor\",\"MSColor\",\"OColor\",\"columnCount\",\"MozColumnCount\",\"WebKitColumnCount\",\"MSColumnCount\",\"OColumnCount\",\"columnFill\",\"MozColumnFill\",\"WebKitColumnFill\",\"MSColumnFill\",\"OColumnFill\",\"columnGap\",\"MozColumnGap\",\"WebKitColumnGap\",\"MSColumnGap\",\"OColumnGap\",\"columnRule\",\"MozColumnRule\",\"WebKitColumnRule\",\"MSColumnRule\",\"OColumnRule\",\"columnRuleColor\",\"MozColumnRuleColor\",\"WebKitColumnRuleColor\",\"MSColumnRuleColor\",\"OColumnRuleColor\",\"columnRuleStyle\",\"MozColumnRuleStyle\",\"WebKitColumnRuleStyle\",\"MSColumnRuleStyle\",\"OColumnRuleStyle\",\"columnRuleWidth\",\"MozColumnRuleWidth\",\"WebKitColumnRuleWidth\",\"MSColumnRuleWidth\",\"OColumnRuleWidth\",\"columnSpan\",\"MozColumnSpan\",\"WebKitColumnSpan\",\"MSColumnSpan\",\"OColumnSpan\",\"columnWidth\",\"MozColumnWidth\",\"WebKitColumnWidth\",\"MSColumnWidth\",\"OColumnWidth\",\"columns\",\"MozColumns\",\"WebKitColumns\",\"MSColumns\",\"OColumns\",\"content\",\"MozContent\",\"WebKitContent\",\"MSContent\",\"OContent\",\"counterIncrement\",\"MozCounterIncrement\",\"WebKitCounterIncrement\",\"MSCounterIncrement\",\"OCounterIncrement\",\"counterReset\",\"MozCounterReset\",\"WebKitCounterReset\",\"MSCounterReset\",\"OCounterReset\",\"cursor\",\"MozCursor\",\"WebKitCursor\",\"MSCursor\",\"OCursor\",\"deg\",\"MozDeg\",\"WebKitDeg\",\"MSDeg\",\"ODeg\",\"direction\",\"MozDirection\",\"WebKitDirection\",\"MSDirection\",\"ODirection\",\"display\",\"MozDisplay\",\"WebKitDisplay\",\"MSDisplay\",\"ODisplay\",\"dpcm\",\"MozDpcm\",\"WebKitDpcm\",\"MSDpcm\",\"ODpcm\",\"dpi\",\"MozDpi\",\"WebKitDpi\",\"MSDpi\",\"ODpi\",\"dppx\",\"MozDppx\",\"WebKitDppx\",\"MSDppx\",\"ODppx\",\"em\",\"MozEm\",\"WebKitEm\",\"MSEm\",\"OEm\",\"emptyCells\",\"MozEmptyCells\",\"WebKitEmptyCells\",\"MSEmptyCells\",\"OEmptyCells\",\"ex\",\"MozEx\",\"WebKitEx\",\"MSEx\",\"OEx\",\"filter\",\"MozFilter\",\"WebKitFilter\",\"MSFilter\",\"OFilter\",\"flex\",\"MozFlex\",\"WebKitFlex\",\"MSFlex\",\"OFlex\",\"flexBasis\",\"MozFlexBasis\",\"WebKitFlexBasis\",\"MSFlexBasis\",\"OFlexBasis\",\"flexDirection\",\"MozFlexDirection\",\"WebKitFlexDirection\",\"MSFlexDirection\",\"OFlexDirection\",\"flexFlow\",\"MozFlexFlow\",\"WebKitFlexFlow\",\"MSFlexFlow\",\"OFlexFlow\",\"flexGrow\",\"MozFlexGrow\",\"WebKitFlexGrow\",\"MSFlexGrow\",\"OFlexGrow\",\"flexShrink\",\"MozFlexShrink\",\"WebKitFlexShrink\",\"MSFlexShrink\",\"OFlexShrink\",\"flexWrap\",\"MozFlexWrap\",\"WebKitFlexWrap\",\"MSFlexWrap\",\"OFlexWrap\",\"float\",\"MozFloat\",\"WebKitFloat\",\"MSFloat\",\"OFloat\",\"font\",\"MozFont\",\"WebKitFont\",\"MSFont\",\"OFont\",\"fontFamily\",\"MozFontFamily\",\"WebKitFontFamily\",\"MSFontFamily\",\"OFontFamily\",\"fontFeatureSettings\",\"MozFontFeatureSettings\",\"WebKitFontFeatureSettings\",\"MSFontFeatureSettings\",\"OFontFeatureSettings\",\"fontKerning\",\"MozFontKerning\",\"WebKitFontKerning\",\"MSFontKerning\",\"OFontKerning\",\"fontLanguageOverride\",\"MozFontLanguageOverride\",\"WebKitFontLanguageOverride\",\"MSFontLanguageOverride\",\"OFontLanguageOverride\",\"fontSize\",\"MozFontSize\",\"WebKitFontSize\",\"MSFontSize\",\"OFontSize\",\"fontSizeAdjust\",\"MozFontSizeAdjust\",\"WebKitFontSizeAdjust\",\"MSFontSizeAdjust\",\"OFontSizeAdjust\",\"fontStretch\",\"MozFontStretch\",\"WebKitFontStretch\",\"MSFontStretch\",\"OFontStretch\",\"fontStyle\",\"MozFontStyle\",\"WebKitFontStyle\",\"MSFontStyle\",\"OFontStyle\",\"fontSynthesis\",\"MozFontSynthesis\",\"WebKitFontSynthesis\",\"MSFontSynthesis\",\"OFontSynthesis\",\"fontVariant\",\"MozFontVariant\",\"WebKitFontVariant\",\"MSFontVariant\",\"OFontVariant\",\"fontVariantAlternates\",\"MozFontVariantAlternates\",\"WebKitFontVariantAlternates\",\"MSFontVariantAlternates\",\"OFontVariantAlternates\",\"fontVariantCaps\",\"MozFontVariantCaps\",\"WebKitFontVariantCaps\",\"MSFontVariantCaps\",\"OFontVariantCaps\",\"fontVariantEastAsian\",\"MozFontVariantEastAsian\",\"WebKitFontVariantEastAsian\",\"MSFontVariantEastAsian\",\"OFontVariantEastAsian\",\"fontVariantLigatures\",\"MozFontVariantLigatures\",\"WebKitFontVariantLigatures\",\"MSFontVariantLigatures\",\"OFontVariantLigatures\",\"fontVariantNumeric\",\"MozFontVariantNumeric\",\"WebKitFontVariantNumeric\",\"MSFontVariantNumeric\",\"OFontVariantNumeric\",\"fontVariantPosition\",\"MozFontVariantPosition\",\"WebKitFontVariantPosition\",\"MSFontVariantPosition\",\"OFontVariantPosition\",\"fontWeight\",\"MozFontWeight\",\"WebKitFontWeight\",\"MSFontWeight\",\"OFontWeight\",\"grad\",\"MozGrad\",\"WebKitGrad\",\"MSGrad\",\"OGrad\",\"grid\",\"MozGrid\",\"WebKitGrid\",\"MSGrid\",\"OGrid\",\"gridArea\",\"MozGridArea\",\"WebKitGridArea\",\"MSGridArea\",\"OGridArea\",\"gridAutoColumns\",\"MozGridAutoColumns\",\"WebKitGridAutoColumns\",\"MSGridAutoColumns\",\"OGridAutoColumns\",\"gridAutoFlow\",\"MozGridAutoFlow\",\"WebKitGridAutoFlow\",\"MSGridAutoFlow\",\"OGridAutoFlow\",\"gridAutoRows\",\"MozGridAutoRows\",\"WebKitGridAutoRows\",\"MSGridAutoRows\",\"OGridAutoRows\",\"gridColumn\",\"MozGridColumn\",\"WebKitGridColumn\",\"MSGridColumn\",\"OGridColumn\",\"gridColumnEnd\",\"MozGridColumnEnd\",\"WebKitGridColumnEnd\",\"MSGridColumnEnd\",\"OGridColumnEnd\",\"gridColumnGap\",\"MozGridColumnGap\",\"WebKitGridColumnGap\",\"MSGridColumnGap\",\"OGridColumnGap\",\"gridColumnStart\",\"MozGridColumnStart\",\"WebKitGridColumnStart\",\"MSGridColumnStart\",\"OGridColumnStart\",\"gridGap\",\"MozGridGap\",\"WebKitGridGap\",\"MSGridGap\",\"OGridGap\",\"gridRow\",\"MozGridRow\",\"WebKitGridRow\",\"MSGridRow\",\"OGridRow\",\"gridRowEnd\",\"MozGridRowEnd\",\"WebKitGridRowEnd\",\"MSGridRowEnd\",\"OGridRowEnd\",\"gridRowGap\",\"MozGridRowGap\",\"WebKitGridRowGap\",\"MSGridRowGap\",\"OGridRowGap\",\"gridRowStart\",\"MozGridRowStart\",\"WebKitGridRowStart\",\"MSGridRowStart\",\"OGridRowStart\",\"gridTemplate\",\"MozGridTemplate\",\"WebKitGridTemplate\",\"MSGridTemplate\",\"OGridTemplate\",\"gridTemplateAreas\",\"MozGridTemplateAreas\",\"WebKitGridTemplateAreas\",\"MSGridTemplateAreas\",\"OGridTemplateAreas\",\"gridTemplateColumns\",\"MozGridTemplateColumns\",\"WebKitGridTemplateColumns\",\"MSGridTemplateColumns\",\"OGridTemplateColumns\",\"gridTemplateRows\",\"MozGridTemplateRows\",\"WebKitGridTemplateRows\",\"MSGridTemplateRows\",\"OGridTemplateRows\",\"height\",\"MozHeight\",\"WebKitHeight\",\"MSHeight\",\"OHeight\",\"hyphens\",\"MozHyphens\",\"WebKitHyphens\",\"MSHyphens\",\"OHyphens\",\"hz\",\"MozHz\",\"WebKitHz\",\"MSHz\",\"OHz\",\"imageOrientation\",\"MozImageOrientation\",\"WebKitImageOrientation\",\"MSImageOrientation\",\"OImageOrientation\",\"imageRendering\",\"MozImageRendering\",\"WebKitImageRendering\",\"MSImageRendering\",\"OImageRendering\",\"imageResolution\",\"MozImageResolution\",\"WebKitImageResolution\",\"MSImageResolution\",\"OImageResolution\",\"imeMode\",\"MozImeMode\",\"WebKitImeMode\",\"MSImeMode\",\"OImeMode\",\"in\",\"MozIn\",\"WebKitIn\",\"MSIn\",\"OIn\",\"inherit\",\"MozInherit\",\"WebKitInherit\",\"MSInherit\",\"OInherit\",\"initial\",\"MozInitial\",\"WebKitInitial\",\"MSInitial\",\"OInitial\",\"inlineSize\",\"MozInlineSize\",\"WebKitInlineSize\",\"MSInlineSize\",\"OInlineSize\",\"isolation\",\"MozIsolation\",\"WebKitIsolation\",\"MSIsolation\",\"OIsolation\",\"justifyContent\",\"MozJustifyContent\",\"WebKitJustifyContent\",\"MSJustifyContent\",\"OJustifyContent\",\"khz\",\"MozKhz\",\"WebKitKhz\",\"MSKhz\",\"OKhz\",\"left\",\"MozLeft\",\"WebKitLeft\",\"MSLeft\",\"OLeft\",\"letterSpacing\",\"MozLetterSpacing\",\"WebKitLetterSpacing\",\"MSLetterSpacing\",\"OLetterSpacing\",\"lineBreak\",\"MozLineBreak\",\"WebKitLineBreak\",\"MSLineBreak\",\"OLineBreak\",\"lineHeight\",\"MozLineHeight\",\"WebKitLineHeight\",\"MSLineHeight\",\"OLineHeight\",\"listStyle\",\"MozListStyle\",\"WebKitListStyle\",\"MSListStyle\",\"OListStyle\",\"listStyleImage\",\"MozListStyleImage\",\"WebKitListStyleImage\",\"MSListStyleImage\",\"OListStyleImage\",\"listStylePosition\",\"MozListStylePosition\",\"WebKitListStylePosition\",\"MSListStylePosition\",\"OListStylePosition\",\"listStyleType\",\"MozListStyleType\",\"WebKitListStyleType\",\"MSListStyleType\",\"OListStyleType\",\"margin\",\"MozMargin\",\"WebKitMargin\",\"MSMargin\",\"OMargin\",\"marginBlockEnd\",\"MozMarginBlockEnd\",\"WebKitMarginBlockEnd\",\"MSMarginBlockEnd\",\"OMarginBlockEnd\",\"marginBlockStart\",\"MozMarginBlockStart\",\"WebKitMarginBlockStart\",\"MSMarginBlockStart\",\"OMarginBlockStart\",\"marginBottom\",\"MozMarginBottom\",\"WebKitMarginBottom\",\"MSMarginBottom\",\"OMarginBottom\",\"marginInlineEnd\",\"MozMarginInlineEnd\",\"WebKitMarginInlineEnd\",\"MSMarginInlineEnd\",\"OMarginInlineEnd\",\"marginInlineStart\",\"MozMarginInlineStart\",\"WebKitMarginInlineStart\",\"MSMarginInlineStart\",\"OMarginInlineStart\",\"marginLeft\",\"MozMarginLeft\",\"WebKitMarginLeft\",\"MSMarginLeft\",\"OMarginLeft\",\"marginRight\",\"MozMarginRight\",\"WebKitMarginRight\",\"MSMarginRight\",\"OMarginRight\",\"marginTop\",\"MozMarginTop\",\"WebKitMarginTop\",\"MSMarginTop\",\"OMarginTop\",\"mask\",\"MozMask\",\"WebKitMask\",\"MSMask\",\"OMask\",\"maskClip\",\"MozMaskClip\",\"WebKitMaskClip\",\"MSMaskClip\",\"OMaskClip\",\"maskComposite\",\"MozMaskComposite\",\"WebKitMaskComposite\",\"MSMaskComposite\",\"OMaskComposite\",\"maskImage\",\"MozMaskImage\",\"WebKitMaskImage\",\"MSMaskImage\",\"OMaskImage\",\"maskMode\",\"MozMaskMode\",\"WebKitMaskMode\",\"MSMaskMode\",\"OMaskMode\",\"maskOrigin\",\"MozMaskOrigin\",\"WebKitMaskOrigin\",\"MSMaskOrigin\",\"OMaskOrigin\",\"maskPosition\",\"MozMaskPosition\",\"WebKitMaskPosition\",\"MSMaskPosition\",\"OMaskPosition\",\"maskRepeat\",\"MozMaskRepeat\",\"WebKitMaskRepeat\",\"MSMaskRepeat\",\"OMaskRepeat\",\"maskSize\",\"MozMaskSize\",\"WebKitMaskSize\",\"MSMaskSize\",\"OMaskSize\",\"maskType\",\"MozMaskType\",\"WebKitMaskType\",\"MSMaskType\",\"OMaskType\",\"maxBlockSize\",\"MozMaxBlockSize\",\"WebKitMaxBlockSize\",\"MSMaxBlockSize\",\"OMaxBlockSize\",\"maxHeight\",\"MozMaxHeight\",\"WebKitMaxHeight\",\"MSMaxHeight\",\"OMaxHeight\",\"maxInlineSize\",\"MozMaxInlineSize\",\"WebKitMaxInlineSize\",\"MSMaxInlineSize\",\"OMaxInlineSize\",\"maxWidth\",\"MozMaxWidth\",\"WebKitMaxWidth\",\"MSMaxWidth\",\"OMaxWidth\",\"minBlockSize\",\"MozMinBlockSize\",\"WebKitMinBlockSize\",\"MSMinBlockSize\",\"OMinBlockSize\",\"minHeight\",\"MozMinHeight\",\"WebKitMinHeight\",\"MSMinHeight\",\"OMinHeight\",\"minInlineSize\",\"MozMinInlineSize\",\"WebKitMinInlineSize\",\"MSMinInlineSize\",\"OMinInlineSize\",\"minWidth\",\"MozMinWidth\",\"WebKitMinWidth\",\"MSMinWidth\",\"OMinWidth\",\"mixBlendMode\",\"MozMixBlendMode\",\"WebKitMixBlendMode\",\"MSMixBlendMode\",\"OMixBlendMode\",\"mm\",\"MozMm\",\"WebKitMm\",\"MSMm\",\"OMm\",\"ms\",\"MozMs\",\"WebKitMs\",\"MSMs\",\"OMs\",\"objectFit\",\"MozObjectFit\",\"WebKitObjectFit\",\"MSObjectFit\",\"OObjectFit\",\"objectPosition\",\"MozObjectPosition\",\"WebKitObjectPosition\",\"MSObjectPosition\",\"OObjectPosition\",\"offsetBlockEnd\",\"MozOffsetBlockEnd\",\"WebKitOffsetBlockEnd\",\"MSOffsetBlockEnd\",\"OOffsetBlockEnd\",\"offsetBlockStart\",\"MozOffsetBlockStart\",\"WebKitOffsetBlockStart\",\"MSOffsetBlockStart\",\"OOffsetBlockStart\",\"offsetInlineEnd\",\"MozOffsetInlineEnd\",\"WebKitOffsetInlineEnd\",\"MSOffsetInlineEnd\",\"OOffsetInlineEnd\",\"offsetInlineStart\",\"MozOffsetInlineStart\",\"WebKitOffsetInlineStart\",\"MSOffsetInlineStart\",\"OOffsetInlineStart\",\"opacity\",\"MozOpacity\",\"WebKitOpacity\",\"MSOpacity\",\"OOpacity\",\"order\",\"MozOrder\",\"WebKitOrder\",\"MSOrder\",\"OOrder\",\"orphans\",\"MozOrphans\",\"WebKitOrphans\",\"MSOrphans\",\"OOrphans\",\"outline\",\"MozOutline\",\"WebKitOutline\",\"MSOutline\",\"OOutline\",\"outlineColor\",\"MozOutlineColor\",\"WebKitOutlineColor\",\"MSOutlineColor\",\"OOutlineColor\",\"outlineOffset\",\"MozOutlineOffset\",\"WebKitOutlineOffset\",\"MSOutlineOffset\",\"OOutlineOffset\",\"outlineStyle\",\"MozOutlineStyle\",\"WebKitOutlineStyle\",\"MSOutlineStyle\",\"OOutlineStyle\",\"outlineWidth\",\"MozOutlineWidth\",\"WebKitOutlineWidth\",\"MSOutlineWidth\",\"OOutlineWidth\",\"overflow\",\"MozOverflow\",\"WebKitOverflow\",\"MSOverflow\",\"OOverflow\",\"overflowWrap\",\"MozOverflowWrap\",\"WebKitOverflowWrap\",\"MSOverflowWrap\",\"OOverflowWrap\",\"overflowX\",\"MozOverflowX\",\"WebKitOverflowX\",\"MSOverflowX\",\"OOverflowX\",\"overflowY\",\"MozOverflowY\",\"WebKitOverflowY\",\"MSOverflowY\",\"OOverflowY\",\"padding\",\"MozPadding\",\"WebKitPadding\",\"MSPadding\",\"OPadding\",\"paddingBlockEnd\",\"MozPaddingBlockEnd\",\"WebKitPaddingBlockEnd\",\"MSPaddingBlockEnd\",\"OPaddingBlockEnd\",\"paddingBlockStart\",\"MozPaddingBlockStart\",\"WebKitPaddingBlockStart\",\"MSPaddingBlockStart\",\"OPaddingBlockStart\",\"paddingBottom\",\"MozPaddingBottom\",\"WebKitPaddingBottom\",\"MSPaddingBottom\",\"OPaddingBottom\",\"paddingInlineEnd\",\"MozPaddingInlineEnd\",\"WebKitPaddingInlineEnd\",\"MSPaddingInlineEnd\",\"OPaddingInlineEnd\",\"paddingInlineStart\",\"MozPaddingInlineStart\",\"WebKitPaddingInlineStart\",\"MSPaddingInlineStart\",\"OPaddingInlineStart\",\"paddingLeft\",\"MozPaddingLeft\",\"WebKitPaddingLeft\",\"MSPaddingLeft\",\"OPaddingLeft\",\"paddingRight\",\"MozPaddingRight\",\"WebKitPaddingRight\",\"MSPaddingRight\",\"OPaddingRight\",\"paddingTop\",\"MozPaddingTop\",\"WebKitPaddingTop\",\"MSPaddingTop\",\"OPaddingTop\",\"pageBreakAfter\",\"MozPageBreakAfter\",\"WebKitPageBreakAfter\",\"MSPageBreakAfter\",\"OPageBreakAfter\",\"pageBreakBefore\",\"MozPageBreakBefore\",\"WebKitPageBreakBefore\",\"MSPageBreakBefore\",\"OPageBreakBefore\",\"pageBreakInside\",\"MozPageBreakInside\",\"WebKitPageBreakInside\",\"MSPageBreakInside\",\"OPageBreakInside\",\"pc\",\"MozPc\",\"WebKitPc\",\"MSPc\",\"OPc\",\"perspective\",\"MozPerspective\",\"WebKitPerspective\",\"MSPerspective\",\"OPerspective\",\"perspectiveOrigin\",\"MozPerspectiveOrigin\",\"WebKitPerspectiveOrigin\",\"MSPerspectiveOrigin\",\"OPerspectiveOrigin\",\"pointerEvents\",\"MozPointerEvents\",\"WebKitPointerEvents\",\"MSPointerEvents\",\"OPointerEvents\",\"position\",\"MozPosition\",\"WebKitPosition\",\"MSPosition\",\"OPosition\",\"pt\",\"MozPt\",\"WebKitPt\",\"MSPt\",\"OPt\",\"px\",\"MozPx\",\"WebKitPx\",\"MSPx\",\"OPx\",\"q\",\"MozQ\",\"WebKitQ\",\"MSQ\",\"OQ\",\"quotes\",\"MozQuotes\",\"WebKitQuotes\",\"MSQuotes\",\"OQuotes\",\"rad\",\"MozRad\",\"WebKitRad\",\"MSRad\",\"ORad\",\"rem\",\"MozRem\",\"WebKitRem\",\"MSRem\",\"ORem\",\"resize\",\"MozResize\",\"WebKitResize\",\"MSResize\",\"OResize\",\"revert\",\"MozRevert\",\"WebKitRevert\",\"MSRevert\",\"ORevert\",\"right\",\"MozRight\",\"WebKitRight\",\"MSRight\",\"ORight\",\"rubyAlign\",\"MozRubyAlign\",\"WebKitRubyAlign\",\"MSRubyAlign\",\"ORubyAlign\",\"rubyMerge\",\"MozRubyMerge\",\"WebKitRubyMerge\",\"MSRubyMerge\",\"ORubyMerge\",\"rubyPosition\",\"MozRubyPosition\",\"WebKitRubyPosition\",\"MSRubyPosition\",\"ORubyPosition\",\"s\",\"MozS\",\"WebKitS\",\"MSS\",\"OS\",\"scrollBehavior\",\"MozScrollBehavior\",\"WebKitScrollBehavior\",\"MSScrollBehavior\",\"OScrollBehavior\",\"scrollSnapCoordinate\",\"MozScrollSnapCoordinate\",\"WebKitScrollSnapCoordinate\",\"MSScrollSnapCoordinate\",\"OScrollSnapCoordinate\",\"scrollSnapDestination\",\"MozScrollSnapDestination\",\"WebKitScrollSnapDestination\",\"MSScrollSnapDestination\",\"OScrollSnapDestination\",\"scrollSnapType\",\"MozScrollSnapType\",\"WebKitScrollSnapType\",\"MSScrollSnapType\",\"OScrollSnapType\",\"shapeImageThreshold\",\"MozShapeImageThreshold\",\"WebKitShapeImageThreshold\",\"MSShapeImageThreshold\",\"OShapeImageThreshold\",\"shapeMargin\",\"MozShapeMargin\",\"WebKitShapeMargin\",\"MSShapeMargin\",\"OShapeMargin\",\"shapeOutside\",\"MozShapeOutside\",\"WebKitShapeOutside\",\"MSShapeOutside\",\"OShapeOutside\",\"tabSize\",\"MozTabSize\",\"WebKitTabSize\",\"MSTabSize\",\"OTabSize\",\"tableLayout\",\"MozTableLayout\",\"WebKitTableLayout\",\"MSTableLayout\",\"OTableLayout\",\"textAlign\",\"MozTextAlign\",\"WebKitTextAlign\",\"MSTextAlign\",\"OTextAlign\",\"textAlignLast\",\"MozTextAlignLast\",\"WebKitTextAlignLast\",\"MSTextAlignLast\",\"OTextAlignLast\",\"textCombineUpright\",\"MozTextCombineUpright\",\"WebKitTextCombineUpright\",\"MSTextCombineUpright\",\"OTextCombineUpright\",\"textDecoration\",\"MozTextDecoration\",\"WebKitTextDecoration\",\"MSTextDecoration\",\"OTextDecoration\",\"textDecorationColor\",\"MozTextDecorationColor\",\"WebKitTextDecorationColor\",\"MSTextDecorationColor\",\"OTextDecorationColor\",\"textDecorationLine\",\"MozTextDecorationLine\",\"WebKitTextDecorationLine\",\"MSTextDecorationLine\",\"OTextDecorationLine\",\"textDecorationStyle\",\"MozTextDecorationStyle\",\"WebKitTextDecorationStyle\",\"MSTextDecorationStyle\",\"OTextDecorationStyle\",\"textEmphasis\",\"MozTextEmphasis\",\"WebKitTextEmphasis\",\"MSTextEmphasis\",\"OTextEmphasis\",\"textEmphasisColor\",\"MozTextEmphasisColor\",\"WebKitTextEmphasisColor\",\"MSTextEmphasisColor\",\"OTextEmphasisColor\",\"textEmphasisPosition\",\"MozTextEmphasisPosition\",\"WebKitTextEmphasisPosition\",\"MSTextEmphasisPosition\",\"OTextEmphasisPosition\",\"textEmphasisStyle\",\"MozTextEmphasisStyle\",\"WebKitTextEmphasisStyle\",\"MSTextEmphasisStyle\",\"OTextEmphasisStyle\",\"textIndent\",\"MozTextIndent\",\"WebKitTextIndent\",\"MSTextIndent\",\"OTextIndent\",\"textOrientation\",\"MozTextOrientation\",\"WebKitTextOrientation\",\"MSTextOrientation\",\"OTextOrientation\",\"textOverflow\",\"MozTextOverflow\",\"WebKitTextOverflow\",\"MSTextOverflow\",\"OTextOverflow\",\"textRendering\",\"MozTextRendering\",\"WebKitTextRendering\",\"MSTextRendering\",\"OTextRendering\",\"textShadow\",\"MozTextShadow\",\"WebKitTextShadow\",\"MSTextShadow\",\"OTextShadow\",\"textTransform\",\"MozTextTransform\",\"WebKitTextTransform\",\"MSTextTransform\",\"OTextTransform\",\"textUnderlinePosition\",\"MozTextUnderlinePosition\",\"WebKitTextUnderlinePosition\",\"MSTextUnderlinePosition\",\"OTextUnderlinePosition\",\"top\",\"MozTop\",\"WebKitTop\",\"MSTop\",\"OTop\",\"touchAction\",\"MozTouchAction\",\"WebKitTouchAction\",\"MSTouchAction\",\"OTouchAction\",\"transform\",\"MozTransform\",\"WebKitTransform\",\"MSTransform\",\"OTransform\",\"transformBox\",\"MozTransformBox\",\"WebKitTransformBox\",\"MSTransformBox\",\"OTransformBox\",\"transformOrigin\",\"MozTransformOrigin\",\"WebKitTransformOrigin\",\"MSTransformOrigin\",\"OTransformOrigin\",\"transformStyle\",\"MozTransformStyle\",\"WebKitTransformStyle\",\"MSTransformStyle\",\"OTransformStyle\",\"transition\",\"MozTransition\",\"WebKitTransition\",\"MSTransition\",\"OTransition\",\"transitionDelay\",\"MozTransitionDelay\",\"WebKitTransitionDelay\",\"MSTransitionDelay\",\"OTransitionDelay\",\"transitionDuration\",\"MozTransitionDuration\",\"WebKitTransitionDuration\",\"MSTransitionDuration\",\"OTransitionDuration\",\"transitionProperty\",\"MozTransitionProperty\",\"WebKitTransitionProperty\",\"MSTransitionProperty\",\"OTransitionProperty\",\"transitionTimingFunction\",\"MozTransitionTimingFunction\",\"WebKitTransitionTimingFunction\",\"MSTransitionTimingFunction\",\"OTransitionTimingFunction\",\"turn\",\"MozTurn\",\"WebKitTurn\",\"MSTurn\",\"OTurn\",\"unicodeBidi\",\"MozUnicodeBidi\",\"WebKitUnicodeBidi\",\"MSUnicodeBidi\",\"OUnicodeBidi\",\"unset\",\"MozUnset\",\"WebKitUnset\",\"MSUnset\",\"OUnset\",\"verticalAlign\",\"MozVerticalAlign\",\"WebKitVerticalAlign\",\"MSVerticalAlign\",\"OVerticalAlign\",\"vh\",\"MozVh\",\"WebKitVh\",\"MSVh\",\"OVh\",\"visibility\",\"MozVisibility\",\"WebKitVisibility\",\"MSVisibility\",\"OVisibility\",\"vmax\",\"MozVmax\",\"WebKitVmax\",\"MSVmax\",\"OVmax\",\"vmin\",\"MozVmin\",\"WebKitVmin\",\"MSVmin\",\"OVmin\",\"vw\",\"MozVw\",\"WebKitVw\",\"MSVw\",\"OVw\",\"whiteSpace\",\"MozWhiteSpace\",\"WebKitWhiteSpace\",\"MSWhiteSpace\",\"OWhiteSpace\",\"widows\",\"MozWidows\",\"WebKitWidows\",\"MSWidows\",\"OWidows\",\"width\",\"MozWidth\",\"WebKitWidth\",\"MSWidth\",\"OWidth\",\"willChange\",\"MozWillChange\",\"WebKitWillChange\",\"MSWillChange\",\"OWillChange\",\"wordBreak\",\"MozWordBreak\",\"WebKitWordBreak\",\"MSWordBreak\",\"OWordBreak\",\"wordSpacing\",\"MozWordSpacing\",\"WebKitWordSpacing\",\"MSWordSpacing\",\"OWordSpacing\",\"wordWrap\",\"MozWordWrap\",\"WebKitWordWrap\",\"MSWordWrap\",\"OWordWrap\",\"writingMode\",\"MozWritingMode\",\"WebKitWritingMode\",\"MSWritingMode\",\"OWritingMode\",\"zIndex\",\"MozZIndex\",\"WebKitZIndex\",\"MSZIndex\",\"OZIndex\",\"fontSize\",\"MozFontSize\",\"WebKitFontSize\",\"MSFontSize\",\"OFontSize\"];\n},function(e,t,n){\"use strict\";function r(e){return e&&e.__esModule?e:{default:e}}function i(e,t){if(!(e instanceof t))throw new TypeError(\"Cannot call a class as a function\")}function o(e,t){if(!e)throw new ReferenceError(\"this hasn't been initialised - super() hasn't been called\");return!t||\"object\"!=typeof t&&\"function\"!=typeof t?e:t}function a(e,t){if(\"function\"!=typeof t&&null!==t)throw new TypeError(\"Super expression must either be null or a function, not \"+typeof t);e.prototype=Object.create(t&&t.prototype,{constructor:{value:e,enumerable:!1,writable:!0,configurable:!0}}),t&&(Object.setPrototypeOf?Object.setPrototypeOf(e,t):e.__proto__=t)}Object.defineProperty(t,\"__esModule\",{value:!0});var s=Object.assign||function(e){for(var t=1;t<arguments.length;t++){var n=arguments[t];for(var r in n)Object.prototype.hasOwnProperty.call(n,r)&&(e[r]=n[r])}return e},u=function(){function e(e,t){for(var n=0;n<t.length;n++){var r=t[n];r.enumerable=r.enumerable||!1,r.configurable=!0,\"value\"in r&&(r.writable=!0),Object.defineProperty(e,r.key,r)}}return function(t,n,r){return n&&e(t.prototype,n),r&&e(t,r),t}}(),c=n(498),l=r(c),p=n(967),f=r(p),h=n(1002),d=r(h),m=\"Mozilla/5.0 (Windows NT 6.1) AppleWebKit/537.2 (KHTML, like Gecko) Safari/537.2\",v=function(e){function t(){var e;i(this,t);for(var n=arguments.length,r=Array(n),a=0;a<n;a++)r[a]=arguments[a];var s=o(this,(e=t.__proto__||Object.getPrototypeOf(t)).call.apply(e,[this].concat(r)));return s.state={size:s.props.size},s}return a(t,e),u(t,[{key:\"render\",value:function(){var e=this.props.split,t=[\"Pane\",e,this.props.className],n=s({},this.props.style||{},{flex:1,position:\"relative\",outline:\"none\"});return void 0!==this.state.size&&(\"vertical\"===e?n.width=this.state.size:(n.height=this.state.size,n.display=\"flex\"),n.flex=\"none\"),l.default.createElement(\"div\",{className:t.join(\" \"),style:this.props.prefixer.prefix(n)},this.props.children)}}]),t}(c.Component);v.propTypes={split:c.PropTypes.oneOf([\"vertical\",\"horizontal\"]),className:c.PropTypes.string.isRequired,children:c.PropTypes.node.isRequired,prefixer:c.PropTypes.instanceOf(f.default).isRequired,style:d.default,size:c.PropTypes.oneOfType([l.default.PropTypes.string,l.default.PropTypes.number])},v.defaultProps={prefixer:new f.default({userAgent:m})},t.default=v,e.exports=t.default},function(e,t,n){\"use strict\";function r(e){return e&&e.__esModule?e:{default:e}}function i(e,t){if(!(e instanceof t))throw new TypeError(\"Cannot call a class as a function\")}function o(e,t){if(!e)throw new ReferenceError(\"this hasn't been initialised - super() hasn't been called\");return!t||\"object\"!=typeof t&&\"function\"!=typeof t?e:t}function a(e,t){if(\"function\"!=typeof t&&null!==t)throw new TypeError(\"Super expression must either be null or a function, not \"+typeof t);e.prototype=Object.create(t&&t.prototype,{constructor:{value:e,enumerable:!1,writable:!0,configurable:!0}}),t&&(Object.setPrototypeOf?Object.setPrototypeOf(e,t):e.__proto__=t)}Object.defineProperty(t,\"__esModule\",{value:!0});var s=function(){function e(e,t){for(var n=0;n<t.length;n++){var r=t[n];r.enumerable=r.enumerable||!1,r.configurable=!0,\"value\"in r&&(r.writable=!0),Object.defineProperty(e,r.key,r)}}return function(t,n,r){return n&&e(t.prototype,n),r&&e(t,r),t}}(),u=n(498),c=r(u),l=n(967),p=r(l),f=n(1002),h=r(f),d=\"Mozilla/5.0 (Windows NT 6.1) AppleWebKit/537.2 (KHTML, like Gecko) Safari/537.2\",m=function(e){function t(){return i(this,t),o(this,(t.__proto__||Object.getPrototypeOf(t)).apply(this,arguments))}return a(t,e),s(t,[{key:\"render\",value:function(){var e=this,t=this.props,n=t.split,r=t.className,i=t.resizerClassName,o=[i,n,r];return c.default.createElement(\"span\",{className:o.join(\" \"),style:this.props.prefixer.prefix(this.props.style)||{},onMouseDown:function(t){e.props.onMouseDown(t)},onTouchStart:function(t){t.preventDefault(),e.props.onTouchStart(t)},onTouchEnd:function(t){t.preventDefault(),e.props.onTouchEnd(t)}})}}]),t}(u.Component);m.propTypes={onMouseDown:u.PropTypes.func.isRequired,onTouchStart:u.PropTypes.func.isRequired,onTouchEnd:u.PropTypes.func.isRequired,prefixer:u.PropTypes.instanceOf(p.default).isRequired,split:u.PropTypes.oneOf([\"vertical\",\"horizontal\"]),className:u.PropTypes.string.isRequired,resizerClassName:u.PropTypes.string.isRequired,style:h.default},m.defaultProps={prefixer:new p.default({userAgent:d}),resizerClassName:\"Resizer\"},t.default=m,e.exports=t.default},function(e,t,n){var r=n(1007);\"string\"==typeof r&&(r=[[e.id,r,\"\"]]);n(1009)(r,{});r.locals&&(e.exports=r.locals)},function(e,t,n){t=e.exports=n(1008)(),t.push([e.id,\".swagger-ui .Resizer.vertical.disabled{display:none}\",\"\"])},function(e,t){e.exports=function(){var e=[];return e.toString=function(){for(var e=[],t=0;t<this.length;t++){var n=this[t];n[2]?e.push(\"@media \"+n[2]+\"{\"+n[1]+\"}\"):e.push(n[1])}return e.join(\"\")},e.i=function(t,n){\"string\"==typeof t&&(t=[[null,t,\"\"]]);for(var r={},i=0;i<this.length;i++){var o=this[i][0];\"number\"==typeof o&&(r[o]=!0)}for(i=0;i<t.length;i++){var a=t[i];\"number\"==typeof a[0]&&r[a[0]]||(n&&!a[2]?a[2]=n:n&&(a[2]=\"(\"+a[2]+\") and (\"+n+\")\"),e.push(a))}},e}},function(e,t,n){function r(e,t){for(var n=0;n<e.length;n++){var r=e[n],i=h[r.id];if(i){i.refs++;for(var o=0;o<i.parts.length;o++)i.parts[o](r.parts[o]);for(;o<r.parts.length;o++)i.parts.push(c(r.parts[o],t))}else{for(var a=[],o=0;o<r.parts.length;o++)a.push(c(r.parts[o],t));h[r.id]={id:r.id,refs:1,parts:a}}}}function i(e){for(var t=[],n={},r=0;r<e.length;r++){var i=e[r],o=i[0],a=i[1],s=i[2],u=i[3],c={css:a,media:s,sourceMap:u};n[o]?n[o].parts.push(c):t.push(n[o]={id:o,parts:[c]})}return t}function o(e,t){var n=v(),r=_[_.length-1];if(\"top\"===e.insertAt)r?r.nextSibling?n.insertBefore(t,r.nextSibling):n.appendChild(t):n.insertBefore(t,n.firstChild),_.push(t);else{if(\"bottom\"!==e.insertAt)throw new Error(\"Invalid value for parameter 'insertAt'. Must be 'top' or 'bottom'.\");n.appendChild(t)}}function a(e){e.parentNode.removeChild(e);var t=_.indexOf(e);t>=0&&_.splice(t,1)}function s(e){var t=document.createElement(\"style\");return t.type=\"text/css\",o(e,t),t}function u(e){var t=document.createElement(\"link\");return t.rel=\"stylesheet\",o(e,t),t}function c(e,t){var n,r,i;if(t.singleton){var o=g++;n=y||(y=s(t)),r=l.bind(null,n,o,!1),i=l.bind(null,n,o,!0)}else e.sourceMap&&\"function\"==typeof URL&&\"function\"==typeof URL.createObjectURL&&\"function\"==typeof URL.revokeObjectURL&&\"function\"==typeof Blob&&\"function\"==typeof btoa?(n=u(t),r=f.bind(null,n),i=function(){a(n),n.href&&URL.revokeObjectURL(n.href)}):(n=s(t),r=p.bind(null,n),i=function(){a(n)});return r(e),function(t){if(t){if(t.css===e.css&&t.media===e.media&&t.sourceMap===e.sourceMap)return;r(e=t)}else i()}}function l(e,t,n,r){var i=n?\"\":r.css;if(e.styleSheet)e.styleSheet.cssText=b(t,i);else{var o=document.createTextNode(i),a=e.childNodes;a[t]&&e.removeChild(a[t]),a.length?e.insertBefore(o,a[t]):e.appendChild(o)}}function p(e,t){var n=t.css,r=t.media;t.sourceMap;if(r&&e.setAttribute(\"media\",r),e.styleSheet)e.styleSheet.cssText=n;else{for(;e.firstChild;)e.removeChild(e.firstChild);e.appendChild(document.createTextNode(n))}}function f(e,t){var n=t.css,r=(t.media,t.sourceMap);r&&(n+=\"\\n/*# sourceMappingURL=data:application/json;base64,\"+btoa(unescape(encodeURIComponent(JSON.stringify(r))))+\" */\");var i=new Blob([n],{type:\"text/css\"}),o=e.href;e.href=URL.createObjectURL(i),o&&URL.revokeObjectURL(o)}var h={},d=function(e){var t;return function(){return\"undefined\"==typeof t&&(t=e.apply(this,arguments)),t}},m=d(function(){return/msie [6-9]\\b/.test(window.navigator.userAgent.toLowerCase())}),v=d(function(){return document.head||document.getElementsByTagName(\"head\")[0]}),y=null,g=0,_=[];e.exports=function(e,t){t=t||{},\"undefined\"==typeof t.singleton&&(t.singleton=m()),\"undefined\"==typeof t.insertAt&&(t.insertAt=\"bottom\");var n=i(e);return r(n,t),function(e){for(var o=[],a=0;a<n.length;a++){var s=n[a],u=h[s.id];u.refs--,o.push(u)}if(e){var c=i(e);r(c,t)}for(var a=0;a<o.length;a++){var u=o[a];if(0===u.refs){for(var l=0;l<u.parts.length;l++)u.parts[l]();delete h[u.id]}}}};var b=function(){var e=[];return function(t,n){return e[t]=n,e.filter(Boolean).join(\"\\n\")}}()},function(e,t,n){\"use strict\";function r(e){return e&&e.__esModule?e:{default:e}}function i(e){var t=e.fn,n={download:function(e){return function(n){function r(t){return t instanceof Error||t.status>=400?(a.updateLoadingStatus(\"failed\"),i.newThrownErr(new Error(t.statusText+\" \"+e))):(a.updateLoadingStatus(\"success\"),a.updateSpec(t.text),void a.updateUrl(e))}var i=n.errActions,o=n.specSelectors,a=n.specActions,s=t.fetch;e=e||o.url(),a.updateLoadingStatus(\"loading\"),s({url:e,loadSpec:!0,credentials:\"same-origin\",headers:{Accept:\"application/json,*/*\"}}).then(r,r)}},updateLoadingStatus:function(e){var t=[null,\"loading\",\"failed\",\"success\",\"failedConfig\"];return t.indexOf(e)===-1&&console.error(\"Error: \"+e+\" is not one of \"+(0,a.default)(t)),{type:\"spec_update_loading_status\",payload:e}}},r={spec_update_loading_status:function(e,t){return\"string\"==typeof t.payload?e.set(\"loadingStatus\",t.payload):e}},i={loadingStatus:(0,s.createSelector)(function(e){return e||(0,u.Map)()},function(e){return e.get(\"loadingStatus\")||null})};return{statePlugins:{spec:{actions:n,reducers:r,selectors:i}}}}Object.defineProperty(t,\"__esModule\",{value:!0});var o=n(57),a=r(o);t.default=i;var s=n(430),u=n(168)},function(e,t,n){\"use strict\";function r(e){return e&&e.__esModule?e:{default:e}}Object.defineProperty(t,\"__esModule\",{value:!0});var i=n(486),o=r(i),a=n(145),s=r(a),u=n(146),c=r(u),l=n(489),p=r(l),f=n(490),h=r(f),d=n(498),m=r(d),v=function(e){function t(){return(0,s.default)(this,t),(0,p.default)(this,(t.__proto__||(0,o.default)(t)).apply(this,arguments))}return(0,h.default)(t,e),(0,c.default)(t,[{key:\"getLayout\",value:function(){var e=this.props,t=e.getComponent,n=e.layoutSelectors,r=n.current(),i=t(r,!0);return i?i:function(){return m.default.createElement(\"h1\",null,' No layout defined for \"',r,'\" ')}}},{key:\"render\",value:function(){var e=this.getLayout();return m.default.createElement(e,null)}}]),t}(m.default.Component);t.default=v,v.propTypes={getComponent:d.PropTypes.func.isRequired,layoutSelectors:d.PropTypes.object.isRequired},v.defaultProps={}},function(e,t,n){\"use strict\";function r(e){return e&&e.__esModule?e:{default:e}}Object.defineProperty(t,\"__esModule\",{value:!0});var i=n(486),o=r(i),a=n(145),s=r(a),u=n(146),c=r(u),l=n(489),p=r(l),f=n(490),h=r(f),d=n(498),m=r(d),v=function(e){function t(){var e,n,r,i;(0,s.default)(this,t);for(var a=arguments.length,u=Array(a),c=0;c<a;c++)u[c]=arguments[c];return n=r=(0,p.default)(this,(e=t.__proto__||(0,o.default)(t)).call.apply(e,[this].concat(u))),r.close=function(){var e=r.props.authActions;e.showDefinitions(!1)},i=n,(0,p.default)(r,i)}return(0,h.default)(t,e),(0,c.default)(t,[{key:\"render\",value:function(){var e=this.props,t=e.authSelectors,n=e.authActions,r=e.getComponent,i=e.errSelectors,o=e.specSelectors,a=e.fn.AST,s=t.shownDefinitions(),u=r(\"auths\");return m.default.createElement(\"div\",{className:\"dialog-ux\"},m.default.createElement(\"div\",{className:\"backdrop-ux\"}),m.default.createElement(\"div\",{className:\"modal-ux\"},m.default.createElement(\"div\",{className:\"modal-dialog-ux\"},m.default.createElement(\"div\",{className:\"modal-ux-inner\"},m.default.createElement(\"div\",{className:\"modal-ux-header\"},m.default.createElement(\"h3\",null,\"Available authorizations\"),m.default.createElement(\"button\",{type:\"button\",className:\"close-modal\",onClick:this.close},m.default.createElement(\"svg\",{width:\"20\",height:\"20\"},m.default.createElement(\"use\",{xlinkHref:\"#close\"})))),m.default.createElement(\"div\",{className:\"modal-ux-content\"},s.valueSeq().map(function(e,s){return m.default.createElement(u,{key:s,AST:a,definitions:e,getComponent:r,errSelectors:i,authSelectors:t,authActions:n,specSelectors:o})}))))))}}]),t}(m.default.Component);v.propTypes={fn:d.PropTypes.object.isRequired,getComponent:d.PropTypes.func.isRequired,authSelectors:d.PropTypes.object.isRequired,specSelectors:d.PropTypes.object.isRequired,errSelectors:d.PropTypes.object.isRequired,authActions:d.PropTypes.object.isRequired},t.default=v},function(e,t,n){\"use strict\";function r(e){return e&&e.__esModule?e:{default:e}}Object.defineProperty(t,\"__esModule\",{value:!0});var i=n(486),o=r(i),a=n(145),s=r(a),u=n(146),c=r(u),l=n(489),p=r(l),f=n(490),h=r(f),d=n(498),m=r(d),v=function(e){function t(){var e,n,r,i;(0,s.default)(this,t);for(var a=arguments.length,u=Array(a),c=0;c<a;c++)u[c]=arguments[c];return n=r=(0,p.default)(this,(e=t.__proto__||(0,o.default)(t)).call.apply(e,[this].concat(u))),r.onClick=function(){var e=r.props,t=e.authActions,n=e.authSelectors,i=n.definitionsToAuthorize();t.showDefinitions(i)},i=n,(0,p.default)(r,i)}return(0,h.default)(t,e),(0,c.default)(t,[{key:\"render\",value:function(){var e=this.props,t=e.authSelectors,n=e.getComponent,r=n(\"authorizationPopup\",!0),i=!!t.shownDefinitions(),o=!!t.authorized().size;return m.default.createElement(\"div\",{className:\"auth-wrapper\"},m.default.createElement(\"button\",{className:o?\"btn authorize locked\":\"btn authorize unlocked\",onClick:this.onClick},m.default.createElement(\"span\",null,\"Authorize\"),m.default.createElement(\"svg\",{width:\"20\",height:\"20\"},m.default.createElement(\"use\",{xlinkHref:o?\"#locked\":\"#unlocked\"}))),i&&m.default.createElement(r,null))}}]),t}(m.default.Component);v.propTypes={className:d.PropTypes.string},v.propTypes={getComponent:d.PropTypes.func.isRequired,authSelectors:d.PropTypes.object.isRequired,errActions:d.PropTypes.object.isRequired,authActions:d.PropTypes.object.isRequired},t.default=v},function(e,t,n){\"use strict\";function r(e){return e&&e.__esModule?e:{default:e}}Object.defineProperty(t,\"__esModule\",{value:!0});var i=n(486),o=r(i),a=n(145),s=r(a),u=n(146),c=r(u),l=n(489),p=r(l),f=n(490),h=r(f),d=n(498),m=r(d),v=n(1015),y=r(v),g=function(e){function t(){var e,n,r,i;(0,s.default)(this,t);for(var a=arguments.length,u=Array(a),c=0;c<a;c++)u[c]=arguments[c];return n=r=(0,p.default)(this,(e=t.__proto__||(0,o.default)(t)).call.apply(e,[this].concat(u))),r.onClick=function(e){e.stopPropagation();var t=r.props,n=t.security,i=t.authActions,o=t.authSelectors,a=o.getDefinitionsByNames(n);i.showDefinitions(a)},i=n,(0,p.default)(r,i)}return(0,h.default)(t,e),(0,c.default)(t,[{key:\"render\",value:function(){var e=this.props,t=e.security,n=e.authSelectors,r=n.isAuthorized(t);return null===r?null:m.default.createElement(\"button\",{className:r?\"authorization__btn locked\":\"authorization__btn unlocked\",onClick:this.onClick},m.default.createElement(\"svg\",{width:\"20\",height:\"20\"},m.default.createElement(\"use\",{xlinkHref:r?\"#locked\":\"#unlocked\"})))}}]),t}(m.default.Component);g.propTypes={authSelectors:d.PropTypes.object.isRequired,authActions:d.PropTypes.object.isRequired,security:y.default.iterable.isRequired},t.default=g},function(e,t,n){\"use strict\";function r(e){var t=typeof e;return Array.isArray(e)?\"array\":e instanceof RegExp?\"object\":e instanceof b.Iterable?\"Immutable.\"+e.toSource().split(\" \")[0]:t}function i(e){function t(t,n,r,i,o,a){for(var s=arguments.length,u=Array(s>6?s-6:0),c=6;c<s;c++)u[c-6]=arguments[c];if(a=a||r,i=i||x,null!=n[r])return e.apply(void 0,[n,r,i,o,a].concat(u));var l=o;return t?new Error(\"Required \"+l+\" `\"+a+\"` was not specified in \"+(\"`\"+i+\"`.\")):void 0}var n=t.bind(null,!1);return n.isRequired=t.bind(null,!0),n}function o(e,t){function n(n,i,o,a,s){var u=n[i];if(!t(u)){var c=r(u);return new Error(\"Invalid \"+a+\" `\"+s+\"` of type `\"+c+\"` \"+(\"supplied to `\"+o+\"`, expected `\"+e+\"`.\"))}return null}return i(n)}function a(e,t,n){function o(i,o,a,s,u){for(var c=arguments.length,l=Array(c>5?c-5:0),p=5;p<c;p++)l[p-5]=arguments[p];var f=i[o];if(!n(f)){var h=s,d=r(f);return new Error(\"Invalid \"+h+\" `\"+u+\"` of type \"+(\"`\"+d+\"` supplied to `\"+a+\"`, expected an Immutable.js \"+t+\".\"))}if(\"function\"!=typeof e)return new Error(\"Invalid typeChecker supplied to `\"+a+\"` \"+(\"for propType `\"+u+\"`, expected a function.\"));for(var m=f.toArray(),v=0,y=m.length;v<y;v++){var g=e.apply(void 0,[m,v,a,s,\"\"+u+\"[\"+v+\"]\"].concat(l));if(g instanceof Error)return g}}return i(o)}function s(e){function t(t,n,r,i,o){for(var a=arguments.length,s=Array(a>5?a-5:0),u=5;u<a;u++)s[u-5]=arguments[u];var c=t[n];if(\"function\"!=typeof e)return new Error(\"Invalid keysTypeChecker (optional second argument) supplied to `\"+r+\"` \"+(\"for propType `\"+o+\"`, expected a function.\"));for(var l=c.keySeq().toArray(),p=0,f=l.length;p<f;p++){var h=e.apply(void 0,[l,p,r,i,\"\"+o+\" -> key(\"+l[p]+\")\"].concat(s));if(h instanceof Error)return h}}return i(t)}function u(e){return a(e,\"List\",b.List.isList)}function c(e,t,n,r){function o(){for(var i=arguments.length,o=Array(i),u=0;u<i;u++)o[u]=arguments[u];return a(e,n,r).apply(void 0,o)||t&&s(t).apply(void 0,o)}return i(o)}function l(e,t){return c(e,t,\"Map\",b.Map.isMap)}function p(e,t){return c(e,t,\"OrderedMap\",b.OrderedMap.isOrderedMap)}function f(e){return a(e,\"Set\",b.Set.isSet)}function h(e){return a(e,\"OrderedSet\",b.OrderedSet.isOrderedSet)}function d(e){return a(e,\"Stack\",b.Stack.isStack)}function m(e){return a(e,\"Iterable\",b.Iterable.isIterable)}function v(e){function t(t,n,i,o,a){for(var s=arguments.length,u=Array(s>5?s-5:0),c=5;c<s;c++)u[c-5]=arguments[c];var l=t[n];if(!(l instanceof b.Record)){var p=r(l),f=o;return new Error(\"Invalid \"+f+\" `\"+a+\"` of type `\"+p+\"` \"+(\"supplied to `\"+i+\"`, expected an Immutable.js Record.\"))}for(var h in e){var d=e[h];if(d){var m=l.toObject(),v=d.apply(void 0,[m,h,i,o,\"\"+a+\".\"+h].concat(u));if(v)return v}}}return i(t)}function y(e){function t(t,i,a,s,u){for(var c=arguments.length,l=Array(c>5?c-5:0),p=5;p<c;p++)l[p-5]=arguments[p];var f=t[i];if(!o(f)){var h=r(f),d=s;return new Error(\"Invalid \"+d+\" `\"+u+\"` of type `\"+h+\"` \"+(\"supplied to `\"+a+\"`, expected an Immutable.js \"+n+\".\"))}var m=f.toObject();for(var v in e){var y=e[v];if(y){var g=y.apply(void 0,[m,v,a,s,\"\"+u+\".\"+v].concat(l));if(g)return g}}}var n=void 0===arguments[1]?\"Iterable\":arguments[1],o=void 0===arguments[2]?b.Iterable.isIterable:arguments[2];return i(t)}function g(e){return y(e)}function _(e){return y(e,\"Map\",b.Map.isMap)}var b=n(168),x=\"<<anonymous>>\",w={listOf:u,mapOf:l,orderedMapOf:p,setOf:f,orderedSetOf:h,stackOf:d,iterableOf:m,recordOf:v,shape:g,contains:g,mapContains:_,list:o(\"List\",b.List.isList),map:o(\"Map\",b.Map.isMap),orderedMap:o(\"OrderedMap\",b.OrderedMap.isOrderedMap),set:o(\"Set\",b.Set.isSet),orderedSet:o(\"OrderedSet\",b.OrderedSet.isOrderedSet),stack:o(\"Stack\",b.Stack.isStack),seq:o(\"Seq\",b.Seq.isSeq),record:o(\"Record\",function(e){return e instanceof b.Record}),iterable:o(\"Iterable\",b.Iterable.isIterable)};e.exports=w},function(e,t,n){\"use strict\";function r(e){return e&&e.__esModule?e:{default:e}}Object.defineProperty(t,\"__esModule\",{value:!0});var i=n(137),o=r(i),a=n(486),s=r(a),u=n(145),c=r(u),l=n(146),p=r(l),f=n(489),h=r(f),d=n(490),m=r(d),v=n(498),y=r(v),g=n(1015),_=r(g),b=function(e){function t(e,n){(0,c.default)(this,t);var r=(0,h.default)(this,(t.__proto__||(0,s.default)(t)).call(this,e,n));return r.onAuthChange=function(e){var t=e.name;r.setState((0,o.default)({},t,e))},r.submitAuth=function(e){e.preventDefault();var t=r.props.authActions;t.authorize(r.state)},r.logoutClick=function(e){e.preventDefault();var t=r.props,n=t.authActions,i=t.definitions,o=i.map(function(e,t){return t}).toArray();n.logout(o)},r.state={},r}return(0,m.default)(t,e),(0,p.default)(t,[{key:\"render\",value:function(){var e=this,t=this.props,n=t.definitions,r=t.getComponent,i=t.authSelectors,o=t.errSelectors,a=r(\"apiKeyAuth\"),s=r(\"basicAuth\"),u=r(\"oauth2\",!0),c=r(\"Button\"),l=i.authorized(),p=n.filter(function(e,t){return!!l.get(t)}),f=n.filter(function(e){return\"oauth2\"!==e.get(\"type\")}),h=n.filter(function(e){return\"oauth2\"===e.get(\"type\")});return y.default.createElement(\"div\",{className:\"auth-container\"},!!f.size&&y.default.createElement(\"form\",{onSubmit:this.submitAuth},f.map(function(t,n){var i=t.get(\"type\"),u=void 0;switch(i){case\"apiKey\":u=y.default.createElement(a,{key:n,schema:t,name:n,errSelectors:o,authorized:l,getComponent:r,onChange:e.onAuthChange});break;case\"basic\":u=y.default.createElement(s,{key:n,schema:t,name:n,errSelectors:o,authorized:l,getComponent:r,onChange:e.onAuthChange});break;default:u=y.default.createElement(\"div\",{key:n},\"Unknown security definition type \",i)}return y.default.createElement(\"div\",{key:n+\"-jump\"},u)}).toArray(),y.default.createElement(\"div\",{className:\"auth-btn-wrapper\"},f.size===p.size?y.default.createElement(c,{className:\"btn modal-btn auth\",onClick:this.logoutClick},\"Logout\"):y.default.createElement(c,{type:\"submit\",className:\"btn modal-btn auth authorize\"},\"Authorize\"))),h&&h.size?y.default.createElement(\"div\",null,y.default.createElement(\"div\",{className:\"scope-def\"},y.default.createElement(\"p\",null,\"Scopes are used to grant an application different levels of access to data on behalf of the end user. Each API may declare one or more scopes.\"),y.default.createElement(\"p\",null,\"API requires the following scopes. Select which ones you want to grant to Swagger UI.\")),n.filter(function(e){return\"oauth2\"===e.get(\"type\")}).map(function(e,t){return y.default.createElement(\"div\",{key:t},y.default.createElement(u,{authorized:l,schema:e,name:t}))}).toArray()):null)}}]),t}(y.default.Component);b.propTypes={definitions:v.PropTypes.object.isRequired,getComponent:v.PropTypes.func.isRequired,authSelectors:v.PropTypes.object.isRequired,authActions:v.PropTypes.object.isRequired,specSelectors:v.PropTypes.object.isRequired},b.propTypes={errSelectors:v.PropTypes.object.isRequired,getComponent:v.PropTypes.func.isRequired,authSelectors:v.PropTypes.object.isRequired,specSelectors:v.PropTypes.object.isRequired,authActions:v.PropTypes.object.isRequired,definitions:_.default.iterable.isRequired},t.default=b},function(e,t,n){\"use strict\";function r(e){return e&&e.__esModule?e:{default:e}}Object.defineProperty(t,\"__esModule\",{value:!0});var i=n(486),o=r(i),a=n(145),s=r(a),u=n(146),c=r(u),l=n(489),p=r(l),f=n(490),h=r(f),d=n(498),m=r(d),v=function(e){function t(){return(0,s.default)(this,t),(0,p.default)(this,(t.__proto__||(0,o.default)(t)).apply(this,arguments))}return(0,h.default)(t,e),(0,c.default)(t,[{key:\"render\",value:function(){var e=this.props.error,t=e.get(\"level\"),n=e.get(\"message\"),r=e.get(\"source\");return m.default.createElement(\"div\",{className:\"errors\",style:{backgroundColor:\"#ffeeee\",color:\"red\",margin:\"1em\"}},m.default.createElement(\"b\",{style:{textTransform:\"capitalize\",marginRight:\"1em\"}},r,\" \",t),m.default.createElement(\"span\",null,n))}}]),t}(m.default.Component);v.propTypes={error:d.PropTypes.object.isRequired},t.default=v},function(e,t,n){\"use strict\";function r(e){return e&&e.__esModule?e:{default:e}}Object.defineProperty(t,\"__esModule\",{value:!0});var i=n(141),o=r(i),a=n(486),s=r(a),u=n(145),c=r(u),l=n(146),p=r(l),f=n(489),h=r(f),d=n(490),m=r(d),v=n(498),y=r(v),g=function(e){function t(e,n){(0,c.default)(this,t);var r=(0,h.default)(this,(t.__proto__||(0,s.default)(t)).call(this,e,n));_.call(r);var i=r.props,o=i.name,a=i.schema,u=r.getValue();return r.state={name:o,schema:a,value:u},r}return(0,m.default)(t,e),(0,p.default)(t,[{key:\"getValue\",value:function(){var e=this.props,t=e.name,n=e.authorized;return n&&n.getIn([t,\"value\"])}},{key:\"render\",value:function(){var e=this.props,t=e.schema,n=e.getComponent,r=e.errSelectors,i=e.name,o=n(\"Input\"),a=n(\"Row\"),s=n(\"Col\"),u=n(\"authError\"),c=n(\"Markdown\"),l=n(\"JumpToPath\",!0),p=this.getValue(),f=r.allErrors().filter(function(e){return e.get(\"authId\")===i});return y.default.createElement(\"div\",null,y.default.createElement(\"h4\",null,\"Api key authorization\",y.default.createElement(l,{path:[\"securityDefinitions\",i]})),p&&y.default.createElement(\"h6\",null,\"Authorized\"),y.default.createElement(a,null,y.default.createElement(c,{source:t.get(\"description\")})),y.default.createElement(a,null,y.default.createElement(\"p\",null,\"Name: \",y.default.createElement(\"code\",null,t.get(\"name\")))),y.default.createElement(a,null,y.default.createElement(\"p\",null,\"In: \",y.default.createElement(\"code\",null,t.get(\"in\")))),y.default.createElement(a,null,y.default.createElement(\"label\",null,\"Value:\"),p?y.default.createElement(\"code\",null,\" ****** \"):y.default.createElement(s,null,y.default.createElement(o,{type:\"text\",onChange:this.onChange}))),f.valueSeq().map(function(e,t){return y.default.createElement(u,{error:e,key:t})}))}}]),t}(y.default.Component);g.propTypes={authorized:v.PropTypes.object,getComponent:v.PropTypes.func.isRequired,errSelectors:v.PropTypes.object.isRequired,schema:v.PropTypes.object.isRequired,name:v.PropTypes.string.isRequired,onChange:v.PropTypes.func};var _=function(){var e=this;this.onChange=function(t){var n=e.props.onChange,r=t.target.value,i=(0,o.default)({},e.state,{value:r});e.setState(i),n(i)}};t.default=g},function(e,t,n){\"use strict\";function r(e){return e&&e.__esModule?e:{default:e}}Object.defineProperty(t,\"__esModule\",{value:!0});var i=n(486),o=r(i),a=n(145),s=r(a),u=n(146),c=r(u),l=n(489),p=r(l),f=n(490),h=r(f),d=n(498),m=r(d),v=n(1015),y=r(v),g=function(e){function t(e,n){(0,s.default)(this,t);var r=(0,p.default)(this,(t.__proto__||(0,o.default)(t)).call(this,e,n));_.call(r);var i=r.props,a=i.schema,u=i.name,c=r.getValue(),l=c.username;return r.state={name:u,schema:a,value:l?{username:l}:{}},r}return(0,h.default)(t,e),(0,c.default)(t,[{key:\"getValue\",value:function(){var e=this.props,t=e.authorized,n=e.name;return t&&t.getIn([n,\"value\"])||{}}},{key:\"render\",value:function(){var e=this.props,t=e.schema,n=e.getComponent,r=e.name,i=e.errSelectors,o=n(\"Input\"),a=n(\"Row\"),s=n(\"Col\"),u=n(\"authError\"),c=n(\"JumpToPath\",!0),l=n(\"Markdown\"),p=this.getValue().username,f=i.allErrors().filter(function(e){return e.get(\"authId\")===r});return m.default.createElement(\"div\",null,m.default.createElement(\"h4\",null,\"Basic authorization\",m.default.createElement(c,{path:[\"securityDefinitions\",r]})),p&&m.default.createElement(\"h6\",null,\"Authorized\"),m.default.createElement(a,null,m.default.createElement(l,{source:t.get(\"description\")})),m.default.createElement(a,null,m.default.createElement(\"label\",null,\"Username:\"),p?m.default.createElement(\"code\",null,\" \",p,\" \"):m.default.createElement(s,null,m.default.createElement(o,{type:\"text\",required:\"required\",name:\"username\",onChange:this.onChange}))),m.default.createElement(a,null,m.default.createElement(\"label\",null,\"Password:\"),p?m.default.createElement(\"code\",null,\" ****** \"):m.default.createElement(s,null,m.default.createElement(o,{required:\"required\",autoComplete:\"new-password\",name:\"password\",type:\"password\",onChange:this.onChange}))),f.valueSeq().map(function(e,t){return m.default.createElement(u,{error:e,key:t})}))}}]),t}(m.default.Component);g.propTypes={authorized:d.PropTypes.object,getComponent:d.PropTypes.func.isRequired,schema:d.PropTypes.object.isRequired,onChange:d.PropTypes.func.isRequired},g.propTypes={name:d.PropTypes.string.isRequired,errSelectors:d.PropTypes.object.isRequired,getComponent:d.PropTypes.func.isRequired,onChange:d.PropTypes.func,schema:y.default.map,authorized:y.default.map};var _=function(){var e=this;this.onChange=function(t){var n=e.props.onChange,r=t.target,i=r.value,o=r.name,a=e.state.value;a[o]=i,e.setState({value:a}),n(e.state)}};t.default=g},function(e,t,n){\"use strict\";function r(e){return e&&e.__esModule?e:{default:e}}Object.defineProperty(t,\"__esModule\",{value:!0});var i=n(137),o=r(i),a=n(486),s=r(a),u=n(145),c=r(u),l=n(146),p=r(l),f=n(489),h=r(f),d=n(490),m=r(d),v=n(498),y=r(v),g=n(1021),_=r(g),b=\"implicit\",x=\"accessCode\",w=\"password\",k=\"application\",S=function(e){function t(e,n){(0,c.default)(this,t);var r=(0,h.default)(this,(t.__proto__||(0,s.default)(t)).call(this,e,n));E.call(r);var i=r.props,o=i.name,a=i.schema,u=i.authorized,l=i.authSelectors,p=u&&u.get(o),f=l.getConfigs()||{},d=p&&p.get(\"username\")||\"\",m=p&&p.get(\"clientId\")||f.clientId||\"\",v=p&&p.get(\"clientSecret\")||f.clientSecret||\"\",y=p&&p.get(\"passwordType\")||\"request-body\";return r.state={appName:f.appName,name:o,schema:a,scopes:[],clientId:m,clientSecret:v,username:d,password:\"\",passwordType:y},r}return(0,m.default)(t,e),(0,p.default)(t,[{key:\"render\",value:function(){var e=this,t=this.props,n=t.schema,r=t.getComponent,i=t.authSelectors,o=t.errSelectors,a=t.name,s=r(\"Input\"),u=r(\"Row\"),c=r(\"Col\"),l=r(\"Button\"),p=r(\"authError\"),f=r(\"JumpToPath\",!0),h=r(\"Markdown\"),d=n.get(\"flow\"),m=n.get(\"allowedScopes\")||n.get(\"scopes\"),v=i.authorized().get(a),g=!!v,_=o.allErrors().filter(function(e){return e.get(\"authId\")===a}),S=!_.filter(function(e){return\"validation\"===e.get(\"source\")}).size,E=n.get(\"description\");return y.default.createElement(\"div\",null,y.default.createElement(\"h4\",null,\"OAuth2.0 \",y.default.createElement(f,{path:[\"securityDefinitions\",a]})),this.state.appName?y.default.createElement(\"h5\",null,\"Application: \",this.state.appName,\" \"):null,E&&y.default.createElement(h,{source:n.get(\"description\")}),g&&y.default.createElement(\"h6\",null,\"Authorized\"),(d===b||d===x)&&y.default.createElement(\"p\",null,\"Authorization URL: \",y.default.createElement(\"code\",null,n.get(\"authorizationUrl\"))),(d===w||d===x||d===k)&&y.default.createElement(\"p\",null,\"Token URL:\",y.default.createElement(\"code\",null,\" \",n.get(\"tokenUrl\"))),y.default.createElement(\"p\",{className:\"flow\"},\"Flow: \",y.default.createElement(\"code\",null,n.get(\"flow\"))),d!==w?null:y.default.createElement(u,null,y.default.createElement(u,null,y.default.createElement(\"label\",{htmlFor:\"oauth_username\"},\"username:\"),g?y.default.createElement(\"code\",null,\" \",this.state.username,\" \"):y.default.createElement(c,{tablet:10,desktop:10},y.default.createElement(\"input\",{id:\"oauth_username\",type:\"text\",\"data-name\":\"username\",onChange:this.onInputChange}))),y.default.createElement(u,null,y.default.createElement(\"label\",{htmlFor:\"oauth_password\"},\"password:\"),g?y.default.createElement(\"code\",null,\" ****** \"):y.default.createElement(c,{tablet:10,desktop:10},y.default.createElement(\"input\",{id:\"oauth_password\",type:\"password\",\"data-name\":\"password\",onChange:this.onInputChange}))),y.default.createElement(u,null,y.default.createElement(\"label\",{htmlFor:\"password_type\"},\"type:\"),g?y.default.createElement(\"code\",null,\" \",this.state.passwordType,\" \"):y.default.createElement(c,{tablet:10,desktop:10},y.default.createElement(\"select\",{id:\"password_type\",\"data-name\":\"passwordType\",onChange:this.onInputChange},y.default.createElement(\"option\",{value:\"request-body\"},\"Request body\"),y.default.createElement(\"option\",{value:\"basic\"},\"Basic auth\"),y.default.createElement(\"option\",{value:\"query\"},\"Query parameters\"))))),(d===k||d===b||d===x||d===w&&\"basic\"!==this.state.passwordType)&&(!g||g&&this.state.clientId)&&y.default.createElement(u,null,y.default.createElement(\"label\",{htmlFor:\"client_id\"},\"client_id:\"),g?y.default.createElement(\"code\",null,\" ****** \"):y.default.createElement(c,{tablet:10,desktop:10},y.default.createElement(\"input\",{id:\"client_id\",type:\"text\",required:d===w,value:this.state.clientId,\"data-name\":\"clientId\",onChange:this.onInputChange}))),(d===k||d===x||d===w&&\"basic\"!==this.state.passwordType)&&y.default.createElement(u,null,y.default.createElement(\"label\",{htmlFor:\"client_secret\"},\"client_secret:\"),g?y.default.createElement(\"code\",null,\" ****** \"):y.default.createElement(c,{tablet:10,desktop:10},y.default.createElement(\"input\",{id:\"client_secret\",value:this.state.clientSecret,type:\"text\",\"data-name\":\"clientSecret\",onChange:this.onInputChange}))),!g&&m&&m.size?y.default.createElement(\"div\",{className:\"scopes\"},y.default.createElement(\"h2\",null,\"Scopes:\"),m.map(function(t,n){return y.default.createElement(u,{key:n},y.default.createElement(\"div\",{className:\"checkbox\"},y.default.createElement(s,{\"data-value\":n,id:n+\"-checkbox-\"+e.state.name,disabled:g,type:\"checkbox\",onChange:e.onScopeChange}),y.default.createElement(\"label\",{htmlFor:n+\"-checkbox-\"+e.state.name},y.default.createElement(\"span\",{className:\"item\"}),y.default.createElement(\"div\",{className:\"text\"},y.default.createElement(\"p\",{className:\"name\"\n},n),y.default.createElement(\"p\",{className:\"description\"},t)))))}).toArray()):null,_.valueSeq().map(function(e,t){return y.default.createElement(p,{error:e,key:t})}),y.default.createElement(\"div\",{className:\"auth-btn-wrapper\"},S&&(g?y.default.createElement(l,{className:\"btn modal-btn auth authorize\",onClick:this.logout},\"Logout\"):y.default.createElement(l,{className:\"btn modal-btn auth authorize\",onClick:this.authorize},\"Authorize\"))))}}]),t}(y.default.Component);S.propTypes={name:v.PropTypes.string,authorized:v.PropTypes.object,getComponent:v.PropTypes.func.isRequired,schema:v.PropTypes.object.isRequired,authSelectors:v.PropTypes.object.isRequired,authActions:v.PropTypes.object.isRequired,errSelectors:v.PropTypes.object.isRequired,errActions:v.PropTypes.object.isRequired,getConfigs:v.PropTypes.any};var E=function(){var e=this;this.authorize=function(){var t=e.props,n=t.authActions,r=t.errActions,i=t.getConfigs,o=t.authSelectors,a=i(),s=o.getConfigs();r.clear({authId:name,type:\"auth\",source:\"auth\"}),(0,_.default)({auth:e.state,authActions:n,errActions:r,configs:a,authConfigs:s})},this.onScopeChange=function(t){var n=t.target,r=n.checked,i=n.dataset.value;if(r&&e.state.scopes.indexOf(i)===-1){var o=e.state.scopes.concat([i]);e.setState({scopes:o})}else!r&&e.state.scopes.indexOf(i)>-1&&e.setState({scopes:e.state.scopes.filter(function(e){return e!==i})})},this.onInputChange=function(t){var n=t.target,r=n.dataset.name,i=n.value,a=(0,o.default)({},r,i);e.setState(a)},this.logout=function(t){t.preventDefault();var n=e.props,r=n.authActions,i=n.errActions,o=n.name;i.clear({authId:o,type:\"auth\",source:\"auth\"}),r.logout([o])}};t.default=S},function(e,t,n){\"use strict\";function r(e){return e&&e.__esModule?e:{default:e}}function i(e){var t=e.auth,n=e.authActions,r=e.errActions,i=e.configs,o=e.authConfigs,u=void 0===o?{}:o,c=t.schema,l=t.scopes,p=t.name,f=t.clientId,h=c.get(\"flow\"),d=[];switch(h){case\"password\":return void n.authorizePassword(t);case\"application\":return void n.authorizeApplication(t);case\"accessCode\":d.push(\"response_type=code\");break;case\"implicit\":d.push(\"response_type=token\")}\"string\"==typeof f&&d.push(\"client_id=\"+encodeURIComponent(f));var m=i.oauth2RedirectUrl;if(\"undefined\"==typeof m)return void r.newAuthErr({authId:p,source:\"validation\",level:\"error\",message:\"oauth2RedirectUri configuration is not passed. Oauth2 authorization cannot be performed.\"});if(d.push(\"redirect_uri=\"+encodeURIComponent(m)),Array.isArray(l)&&0<l.length){var v=u.scopeSeparator||\" \";d.push(\"scope=\"+encodeURIComponent(l.join(v)))}var y=(0,s.btoa)(new Date);d.push(\"state=\"+encodeURIComponent(y)),\"undefined\"!=typeof u.realm&&d.push(\"realm=\"+encodeURIComponent(u.realm));var g=u.additionalQueryStringParams;for(var _ in g)\"undefined\"!=typeof g[_]&&d.push([_,g[_]].map(encodeURIComponent).join(\"=\"));var b=[c.get(\"authorizationUrl\"),d.join(\"&\")].join(\"?\");a.default.swaggerUIRedirectOauth2={auth:t,state:y,redirectUrl:m,callback:\"implicit\"===h?n.preAuthorizeImplicit:n.authorizeAccessCode,errCb:r.newAuthErr},a.default.open(b)}Object.defineProperty(t,\"__esModule\",{value:!0}),t.default=i;var o=n(177),a=r(o),s=n(183)},function(e,t,n){\"use strict\";function r(e){return e&&e.__esModule?e:{default:e}}Object.defineProperty(t,\"__esModule\",{value:!0});var i=n(486),o=r(i),a=n(145),s=r(a),u=n(146),c=r(u),l=n(489),p=r(l),f=n(490),h=r(f),d=n(498),m=r(d),v=function(e){function t(){var e,n,r,i;(0,s.default)(this,t);for(var a=arguments.length,u=Array(a),c=0;c<a;c++)u[c]=arguments[c];return n=r=(0,p.default)(this,(e=t.__proto__||(0,o.default)(t)).call.apply(e,[this].concat(u))),r.onClick=function(){var e=r.props,t=e.specActions,n=e.path,i=e.method;t.clearResponse(n,i),t.clearRequest(n,i)},i=n,(0,p.default)(r,i)}return(0,h.default)(t,e),(0,c.default)(t,[{key:\"render\",value:function(){return m.default.createElement(\"button\",{className:\"btn btn-clear opblock-control__btn\",onClick:this.onClick},\"Clear\")}}]),t}(d.Component);v.propTypes={specActions:d.PropTypes.object.isRequired,path:d.PropTypes.string.isRequired,method:d.PropTypes.string.isRequired},t.default=v},function(e,t,n){\"use strict\";function r(e){return e&&e.__esModule?e:{default:e}}Object.defineProperty(t,\"__esModule\",{value:!0});var i=n(60),o=r(i),a=n(486),s=r(a),u=n(145),c=r(u),l=n(146),p=r(l),f=n(489),h=r(f),d=n(490),m=r(d),v=n(498),y=r(v),g=n(1015),_=r(g),b=function(e){var t=e.headers;return y.default.createElement(\"div\",null,y.default.createElement(\"h5\",null,\"Response headers\"),y.default.createElement(\"pre\",null,t))};b.propTypes={headers:v.PropTypes.array.isRequired};var x=function(e){function t(){return(0,c.default)(this,t),(0,h.default)(this,(t.__proto__||(0,s.default)(t)).apply(this,arguments))}return(0,m.default)(t,e),(0,p.default)(t,[{key:\"render\",value:function(){var e=this.props,t=e.request,n=e.response,r=e.getComponent,i=n.get(\"status\"),a=n.get(\"url\"),s=n.get(\"headers\").toJS(),u=n.get(\"notDocumented\"),c=n.get(\"error\"),l=c?n.get(\"response\").get(\"text\"):n.get(\"text\"),p=(0,o.default)(s),f=s[\"content-type\"],h=r(\"curl\"),d=r(\"responseBody\"),m=p.map(function(e){return y.default.createElement(\"span\",{className:\"headerline\",key:e},\" \",e,\": \",s[e],\" \")}),v=0!==m.length;return y.default.createElement(\"div\",null,t&&y.default.createElement(h,{request:t}),y.default.createElement(\"h4\",null,\"Server response\"),y.default.createElement(\"table\",{className:\"responses-table\"},y.default.createElement(\"thead\",null,y.default.createElement(\"tr\",{className:\"responses-header\"},y.default.createElement(\"td\",{className:\"col col_header response-col_status\"},\"Code\"),y.default.createElement(\"td\",{className:\"col col_header response-col_description\"},\"Details\"))),y.default.createElement(\"tbody\",null,y.default.createElement(\"tr\",{className:\"response\"},y.default.createElement(\"td\",{className:\"col response-col_status\"},i,u?y.default.createElement(\"div\",{className:\"response-undocumented\"},y.default.createElement(\"i\",null,\" Undocumented \")):null),y.default.createElement(\"td\",{className:\"col response-col_description\"},c?y.default.createElement(\"span\",null,n.get(\"name\")+\": \"+n.get(\"message\")):null,l?y.default.createElement(d,{content:l,contentType:f,url:a,headers:s,getComponent:r}):null,v?y.default.createElement(b,{headers:m}):null)))))}}]),t}(y.default.Component);x.propTypes={response:v.PropTypes.object.isRequired,getComponent:v.PropTypes.func.isRequired},x.propTypes={getComponent:v.PropTypes.func.isRequired,request:_.default.map,response:_.default.map},t.default=x},function(e,t,n){\"use strict\";function r(e){return e&&e.__esModule?e:{default:e}}Object.defineProperty(t,\"__esModule\",{value:!0});var i=n(60),o=r(i),a=n(94),s=r(a),u=n(486),c=r(u),l=n(145),p=r(l),f=n(146),h=r(f),d=n(489),m=r(d),v=n(490),y=r(v),g=n(498),_=r(g),b=function(e){function t(e,n){(0,p.default)(this,t);var r=(0,m.default)(this,(t.__proto__||(0,c.default)(t)).call(this,e,n)),i=e.specSelectors,o=e.getConfigs,a=o(),s=a.validatorUrl;return r.state={url:i.url(),validatorUrl:void 0===s?\"https://online.swagger.io/validator\":s},r}return(0,y.default)(t,e),(0,h.default)(t,[{key:\"componentWillReceiveProps\",value:function(e){var t=e.specSelectors,n=e.getConfigs,r=n(),i=r.validatorUrl;this.setState({url:t.url(),validatorUrl:void 0===i?\"https://online.swagger.io/validator\":i})}},{key:\"render\",value:function(){var e=this.props.getConfigs,t=e(),n=t.spec;return\"object\"===(\"undefined\"==typeof n?\"undefined\":(0,s.default)(n))&&(0,o.default)(n).length?null:!this.state.url||!this.state.validatorUrl||this.state.url.indexOf(\"localhost\")>=0||this.state.url.indexOf(\"127.0.0.1\")>=0?null:_.default.createElement(\"span\",{style:{float:\"right\"}},_.default.createElement(\"a\",{target:\"_blank\",href:this.state.validatorUrl+\"/debug?url=\"+this.state.url},_.default.createElement(x,{src:this.state.validatorUrl+\"?url=\"+this.state.url,alt:\"Online validator badge\"})))}}]),t}(_.default.Component);b.propTypes={getComponent:g.PropTypes.func.isRequired,getConfigs:g.PropTypes.func.isRequired,specSelectors:g.PropTypes.object.isRequired},t.default=b;var x=function(e){function t(e){(0,p.default)(this,t);var n=(0,m.default)(this,(t.__proto__||(0,c.default)(t)).call(this,e));return n.state={loaded:!1,error:!1},n}return(0,y.default)(t,e),(0,h.default)(t,[{key:\"componentDidMount\",value:function(){var e=this,t=new Image;t.onload=function(){e.setState({loaded:!0})},t.onerror=function(){e.setState({error:!0})},t.src=this.props.src}},{key:\"componentWillReceiveProps\",value:function(e){var t=this;if(e.src!==this.props.src){var n=new Image;n.onload=function(){t.setState({loaded:!0})},n.onerror=function(){t.setState({error:!0})},n.src=e.src}}},{key:\"render\",value:function(){return this.state.error?_.default.createElement(\"img\",{alt:\"Error\"}):this.state.loaded?_.default.createElement(\"img\",{src:this.props.src,alt:this.props.alt}):_.default.createElement(\"img\",{alt:\"Loading...\"})}}]),t}(_.default.Component);x.propTypes={src:g.PropTypes.string,alt:g.PropTypes.string}},function(e,t,n){\"use strict\";function r(e){return e&&e.__esModule?e:{default:e}}Object.defineProperty(t,\"__esModule\",{value:!0});var i=n(446),o=r(i),a=n(486),s=r(a),u=n(145),c=r(u),l=n(146),p=r(l),f=n(489),h=r(f),d=n(490),m=r(d),v=n(498),y=r(v),g=function(e){function t(){return(0,c.default)(this,t),(0,h.default)(this,(t.__proto__||(0,s.default)(t)).apply(this,arguments))}return(0,m.default)(t,e),(0,p.default)(t,[{key:\"render\",value:function(){var e=this.props,t=e.specSelectors,n=e.specActions,r=e.getComponent,i=e.layoutSelectors,a=e.layoutActions,s=e.authActions,u=e.authSelectors,c=e.getConfigs,l=e.fn,p=t.taggedOperations(),f=r(\"operation\"),h=r(\"Collapse\"),d=i.showSummary(),m=c(),v=m.docExpansion,g=m.displayOperationId;return y.default.createElement(\"div\",null,p.map(function(e,p){var m=e.get(\"operations\"),_=e.getIn([\"tagDetails\",\"description\"],null),b=[\"operations-tag\",p],x=i.isShown(b,\"full\"===v||\"list\"===v);return y.default.createElement(\"div\",{className:x?\"opblock-tag-section is-open\":\"opblock-tag-section\",key:\"operation-\"+p},y.default.createElement(\"h4\",{onClick:function(){return a.show(b,!x)},className:_?\"opblock-tag\":\"opblock-tag no-desc\"},y.default.createElement(\"span\",null,p),_?y.default.createElement(\"small\",null,_):null,y.default.createElement(\"button\",{className:\"expand-operation\",title:\"Expand operation\",onClick:function(){return a.show(b,!x)}},y.default.createElement(\"svg\",{className:\"arrow\",width:\"20\",height:\"20\"},y.default.createElement(\"use\",{xlinkHref:x?\"#large-arrow-down\":\"#large-arrow\"})))),y.default.createElement(h,{isOpened:x},m.map(function(e){var h=[\"operations\",e.get(\"id\"),p],m=e.get(\"path\",\"\"),v=e.get(\"method\",\"\"),_=\"paths.\"+m+\".\"+v,b=t.allowTryItOutFor(e.get(\"path\"),e.get(\"method\")),x=t.responseFor(e.get(\"path\"),e.get(\"method\")),w=t.requestFor(e.get(\"path\"),e.get(\"method\"));return y.default.createElement(f,(0,o.default)({},e.toObject(),{isShownKey:h,jumpToKey:_,showSummary:d,key:h,response:x,request:w,allowTryItOut:b,displayOperationId:g,specActions:n,specSelectors:t,layoutActions:a,layoutSelectors:i,authActions:s,authSelectors:u,getComponent:r,fn:l,getConfigs:c}))}).toArray()))}).toArray(),p.size<1?y.default.createElement(\"h3\",null,\" No operations defined in spec! \"):null)}}]),t}(y.default.Component);g.propTypes={specSelectors:v.PropTypes.object.isRequired,specActions:v.PropTypes.object.isRequired,getComponent:v.PropTypes.func.isRequired,layoutSelectors:v.PropTypes.object.isRequired,layoutActions:v.PropTypes.object.isRequired,authActions:v.PropTypes.object.isRequired,authSelectors:v.PropTypes.object.isRequired,getConfigs:v.PropTypes.func.isRequired},t.default=g,g.propTypes={layoutActions:v.PropTypes.object.isRequired,specSelectors:v.PropTypes.object.isRequired,specActions:v.PropTypes.object.isRequired,layoutSelectors:v.PropTypes.object.isRequired,getComponent:v.PropTypes.func.isRequired,fn:v.PropTypes.object.isRequired}},function(e,t,n){\"use strict\";function r(e){if(e&&e.__esModule)return e;var t={};if(null!=e)for(var n in e)Object.prototype.hasOwnProperty.call(e,n)&&(t[n]=e[n]);return t.default=e,t}function i(e){return e&&e.__esModule?e:{default:e}}Object.defineProperty(t,\"__esModule\",{value:!0});var o=n(486),a=i(o),s=n(145),u=i(s),c=n(146),l=i(c),p=n(489),f=i(p),h=n(490),d=i(h),m=n(498),v=i(m),y=n(1027),g=i(y),_=n(183),b=n(1029),x=r(b),w=function(e){function t(e,n){(0,u.default)(this,t);var r=(0,f.default)(this,(t.__proto__||(0,a.default)(t)).call(this,e,n));return r.toggleShown=function(){var e=r.props,t=e.layoutActions,n=e.isShownKey;t.show(n,!r.isShown())},r.isShown=function(){var e=r.props,t=e.layoutSelectors,n=e.isShownKey,i=e.getConfigs,o=i(),a=o.docExpansion;return t.isShown(n,\"full\"===a)},r.onTryoutClick=function(){r.setState({tryItOutEnabled:!r.state.tryItOutEnabled})},r.onCancelClick=function(){var e=r.props,t=e.specActions,n=e.path,i=e.method;r.setState({tryItOutEnabled:!r.state.tryItOutEnabled}),t.clearValidateParams([n,i])},r.onExecute=function(){r.setState({executeInProgress:!0})},r.state={tryItOutEnabled:!1},r}return(0,d.default)(t,e),(0,l.default)(t,[{key:\"componentWillReceiveProps\",value:function(e){var t=\"application/json\",n=e.specActions,r=e.path,i=e.method,o=e.operation,a=o.get(\"produces_value\"),s=o.get(\"produces\"),u=o.get(\"consumes\"),c=o.get(\"consumes_value\");e.response!==this.props.response&&this.setState({executeInProgress:!1}),void 0===a&&(a=s&&s.size?s.first():t,n.changeProducesValue([r,i],a)),void 0===c&&(c=u&&u.size?u.first():t,n.changeConsumesValue([r,i],c))}},{key:\"shouldComponentUpdate\",value:function(e,t){return(0,g.default)(this,e,t)}},{key:\"render\",value:function(){var e=this.props,t=e.isShownKey,n=e.jumpToKey,r=e.path,i=e.method,o=e.operation,a=e.showSummary,s=e.response,u=e.request,c=e.allowTryItOut,l=e.displayOperationId,p=e.fn,f=e.getComponent,h=e.specActions,d=e.specSelectors,m=e.authActions,y=e.authSelectors,g=o.get(\"summary\"),b=o.get(\"description\"),x=o.get(\"deprecated\"),w=o.get(\"externalDocs\"),k=o.get(\"responses\"),S=o.get(\"security\")||d.security(),E=o.get(\"produces\"),C=o.get(\"schemes\"),A=(0,_.getList)(o,[\"parameters\"]),T=o.get(\"__originalOperationId\"),D=f(\"responses\"),M=f(\"parameters\"),O=f(\"execute\"),P=f(\"clear\"),I=f(\"authorizeOperationBtn\"),N=f(\"JumpToPath\",!0),R=f(\"Collapse\"),j=f(\"Markdown\"),F=f(\"schemes\");if(s&&s.size>0){var B=!k.get(String(s.get(\"status\")));s=s.set(\"notDocumented\",B)}var L=this.state.tryItOutEnabled,z=this.isShown(),q=[r,i];return v.default.createElement(\"div\",{className:x?\"opblock opblock-deprecated\":z?\"opblock opblock-\"+i+\" is-open\":\"opblock opblock-\"+i,id:t},v.default.createElement(\"div\",{className:\"opblock-summary opblock-summary-\"+i,onClick:this.toggleShown},v.default.createElement(\"span\",{className:\"opblock-summary-method\"},i.toUpperCase()),v.default.createElement(\"span\",{className:x?\"opblock-summary-path__deprecated\":\"opblock-summary-path\"},v.default.createElement(\"span\",null,r),v.default.createElement(N,{path:n})),a?v.default.createElement(\"div\",{className:\"opblock-summary-description\"},g):null,l&&T?v.default.createElement(\"span\",{className:\"opblock-summary-operation-id\"},T):null,S&&S.count()?v.default.createElement(I,{authActions:m,security:S,authSelectors:y}):null),v.default.createElement(R,{isOpened:z,animated:!0},v.default.createElement(\"div\",{className:\"opblock-body\"},x&&v.default.createElement(\"h4\",{className:\"opblock-title_normal\"},\" Warning: Deprecated\"),b&&v.default.createElement(\"div\",{className:\"opblock-description-wrapper\"},v.default.createElement(\"div\",{className:\"opblock-description\"},v.default.createElement(j,{source:b}))),w&&w.get(\"url\")?v.default.createElement(\"div\",{className:\"opblock-external-docs-wrapper\"},v.default.createElement(\"h4\",{className:\"opblock-title_normal\"},\"Find more details\"),v.default.createElement(\"div\",{className:\"opblock-external-docs\"},v.default.createElement(\"span\",{className:\"opblock-external-docs__description\"},w.get(\"description\")),v.default.createElement(\"a\",{className:\"opblock-external-docs__link\",href:w.get(\"url\")},w.get(\"url\")))):null,v.default.createElement(M,{parameters:A,onChangeKey:q,onTryoutClick:this.onTryoutClick,onCancelClick:this.onCancelClick,tryItOutEnabled:L,allowTryItOut:c,fn:p,getComponent:f,specActions:h,specSelectors:d,pathMethod:[r,i]}),L&&c&&C&&C.size?v.default.createElement(\"div\",{className:\"opblock-schemes\"},v.default.createElement(F,{schemes:C,path:r,method:i,specActions:h})):null,v.default.createElement(\"div\",{className:L&&s&&c?\"btn-group\":\"execute-wrapper\"},L&&c?v.default.createElement(O,{getComponent:f,operation:o,specActions:h,specSelectors:d,path:r,method:i,onExecute:this.onExecute}):null,L&&s&&c?v.default.createElement(P,{onClick:this.onClearClick,specActions:h,path:r,method:i}):null),this.state.executeInProgress?v.default.createElement(\"div\",{className:\"loading-container\"},v.default.createElement(\"div\",{className:\"loading\"})):null,k?v.default.createElement(D,{responses:k,request:u,tryItOutResponse:s,getComponent:f,specSelectors:d,specActions:h,produces:E,producesValue:o.get(\"produces_value\"),pathMethod:[r,i],fn:p}):null)))}}]),t}(v.default.Component);w.propTypes={path:m.PropTypes.string.isRequired,method:m.PropTypes.string.isRequired,operation:m.PropTypes.object.isRequired,showSummary:m.PropTypes.bool,isShownKey:x.arrayOrString.isRequired,jumpToKey:x.arrayOrString.isRequired,allowTryItOut:m.PropTypes.bool,displayOperationId:m.PropTypes.bool,response:m.PropTypes.object,request:m.PropTypes.object,getComponent:m.PropTypes.func.isRequired,authActions:m.PropTypes.object,authSelectors:m.PropTypes.object,specActions:m.PropTypes.object.isRequired,specSelectors:m.PropTypes.object.isRequired,layoutActions:m.PropTypes.object.isRequired,layoutSelectors:m.PropTypes.object.isRequired,fn:m.PropTypes.object.isRequired,getConfigs:m.PropTypes.func.isRequired},w.defaultProps={showSummary:!0,response:null,allowTryItOut:!0,displayOperationId:!1},t.default=w},function(e,t,n){e.exports=n(1028)},function(e,t,n){\"use strict\";function r(e,t,n){return!i(e.props,t)||!i(e.state,n)}var i=n(613);e.exports=r},function(e,t,n){\"use strict\";Object.defineProperty(t,\"__esModule\",{value:!0}),t.objectWithFuncs=t.arrayOrString=void 0;var r=n(498),i=function(e,t){return r.PropTypes.shape(e.reduce(function(e,n){return e[n]=t,e},{}))};t.arrayOrString=r.PropTypes.oneOfType([r.PropTypes.arrayOf(r.PropTypes.string),r.PropTypes.string]),t.objectWithFuncs=function(e){return i(e,r.PropTypes.func.isRequired)}},function(e,t,n){\"use strict\";function r(e){return e&&e.__esModule?e:{default:e}}Object.defineProperty(t,\"__esModule\",{value:!0});var i=n(486),o=r(i),a=n(145),s=r(a),u=n(146),c=r(u),l=n(489),p=r(l),f=n(490),h=r(f),d=n(498),m=r(d),v=n(183),y=function(e){function t(){return(0,s.default)(this,t),(0,p.default)(this,(t.__proto__||(0,o.default)(t)).apply(this,arguments))}return(0,h.default)(t,e),(0,c.default)(t,[{key:\"componentDidMount\",value:function(){(0,v.highlight)(this.refs.el)}},{key:\"componentDidUpdate\",value:function(){(0,v.highlight)(this.refs.el)}},{key:\"render\",value:function(){var e=this.props,t=e.value,n=e.className;return n=n||\"\",m.default.createElement(\"pre\",{ref:\"el\",className:n+\" microlight\"},t)}}]),t}(d.Component);y.propTypes={value:d.PropTypes.string.isRequired,className:d.PropTypes.string},t.default=y},function(e,t,n){\"use strict\";function r(e){return e&&e.__esModule?e:{default:e}}Object.defineProperty(t,\"__esModule\",{value:!0});var i=n(184),o=r(i),a=n(486),s=r(a),u=n(145),c=r(u),l=n(146),p=r(l),f=n(489),h=r(f),d=n(490),m=r(d),v=n(498),y=r(v),g=n(168),_=n(183),b=function(e){function t(){var e,n,r,i;(0,c.default)(this,t);for(var o=arguments.length,a=Array(o),u=0;u<o;u++)a[u]=arguments[u];return n=r=(0,h.default)(this,(e=t.__proto__||(0,s.default)(t)).call.apply(e,[this].concat(a))),r.onChangeProducesWrapper=function(e){return r.props.specActions.changeProducesValue(r.props.pathMethod,e)},i=n,(0,h.default)(r,i)}return(0,m.default)(t,e),(0,p.default)(t,[{key:\"render\",value:function(){var e=this.props,n=e.responses,r=e.request,i=e.tryItOutResponse,a=e.getComponent,s=e.specSelectors,u=e.fn,c=e.producesValue,l=(0,_.defaultStatusCode)(n),p=a(\"contentType\"),f=a(\"liveResponse\"),h=a(\"response\"),d=this.props.produces&&this.props.produces.size?this.props.produces:t.defaultProps.produces;return y.default.createElement(\"div\",{className:\"responses-wrapper\"},y.default.createElement(\"div\",{className:\"opblock-section-header\"},y.default.createElement(\"h4\",null,\"Responses\"),y.default.createElement(\"label\",null,y.default.createElement(\"span\",null,\"Response content type\"),y.default.createElement(p,{value:c,onChange:this.onChangeProducesWrapper,contentTypes:d,className:\"execute-content-type\"}))),y.default.createElement(\"div\",{className:\"responses-inner\"},i?y.default.createElement(\"div\",null,y.default.createElement(f,{request:r,response:i,getComponent:a}),y.default.createElement(\"h4\",null,\"Responses\")):null,y.default.createElement(\"table\",{className:\"responses-table\"},y.default.createElement(\"thead\",null,y.default.createElement(\"tr\",{className:\"responses-header\"},y.default.createElement(\"td\",{className:\"col col_header response-col_status\"},\"Code\"),y.default.createElement(\"td\",{className:\"col col_header response-col_description\"},\"Description\"))),y.default.createElement(\"tbody\",null,n.entrySeq().map(function(e){var t=(0,o.default)(e,2),n=t[0],r=t[1],p=i&&i.get(\"status\")==n?\"response_current\":\"\";return y.default.createElement(h,{key:n,isDefault:l===n,fn:u,className:p,code:n,response:r,specSelectors:s,contentType:c,getComponent:a})}).toArray()))))}}]),t}(y.default.Component);b.propTypes={request:v.PropTypes.object,tryItOutResponse:v.PropTypes.object,responses:v.PropTypes.object.isRequired,produces:v.PropTypes.object,producesValue:v.PropTypes.any,getComponent:v.PropTypes.func.isRequired,specSelectors:v.PropTypes.object.isRequired,specActions:v.PropTypes.object.isRequired,pathMethod:v.PropTypes.array.isRequired,fn:v.PropTypes.object.isRequired},b.defaultProps={request:null,tryItOutResponse:null,produces:(0,g.fromJS)([\"application/json\"])},t.default=b},function(e,t,n){\"use strict\";function r(e){return e&&e.__esModule?e:{default:e}}Object.defineProperty(t,\"__esModule\",{value:!0});var i=n(486),o=r(i),a=n(145),s=r(a),u=n(146),c=r(u),l=n(489),p=r(l),f=n(490),h=r(f),d=n(57),m=r(d),v=n(184),y=r(v),g=n(498),_=r(g),b=n(168),x=n(183),w=function(e,t,n){return t&&t.size?t.entrySeq().map(function(e){var t=(0,y.default)(e,2),r=t[0],i=t[1],o=void 0;try{o=i&&i.toJS?i.toJS():i,o=(0,m.default)(o,null,2)}catch(e){o=String(i)}return _.default.createElement(\"div\",{key:r},_.default.createElement(\"h5\",null,r),_.default.createElement(n,{className:\"example\",value:o}))}).toArray():e?_.default.createElement(\"div\",null,_.default.createElement(n,{className:\"example\",value:e})):null},k=function(e){function t(){return(0,s.default)(this,t),(0,p.default)(this,(t.__proto__||(0,o.default)(t)).apply(this,arguments))}return(0,h.default)(t,e),(0,c.default)(t,[{key:\"render\",value:function(){var e=this.props,t=e.code,n=e.response,r=e.className,i=e.fn,o=e.getComponent,a=e.specSelectors,s=e.contentType,u=i.inferSchema,c=u(n.toJS()),l=n.get(\"headers\"),p=n.get(\"examples\"),f=o(\"headers\"),h=o(\"highlightCode\"),d=o(\"modelExample\"),m=o(\"Markdown\"),v=c?(0,x.getSampleSchema)(c,s,{includeReadOnly:!0}):null,y=w(v,p,h);return _.default.createElement(\"tr\",{className:\"response \"+(r||\"\")},_.default.createElement(\"td\",{className:\"col response-col_status\"},t),_.default.createElement(\"td\",{className:\"col response-col_description\"},_.default.createElement(\"div\",{className:\"response-col_description__inner\"},_.default.createElement(m,{source:n.get(\"description\")})),y?_.default.createElement(d,{getComponent:o,specSelectors:a,schema:(0,b.fromJS)(c),example:y}):null,l?_.default.createElement(f,{headers:l}):null))}}]),t}(_.default.Component);k.propTypes={code:g.PropTypes.string.isRequired,response:g.PropTypes.object,className:g.PropTypes.string,getComponent:g.PropTypes.func.isRequired,specSelectors:g.PropTypes.object.isRequired,fn:g.PropTypes.object.isRequired,contentType:g.PropTypes.string},k.defaultProps={response:(0,b.fromJS)({})},t.default=k},function(e,t,n){\"use strict\";function r(e){return e&&e.__esModule?e:{default:e}}Object.defineProperty(t,\"__esModule\",{value:!0});var i=n(57),o=r(i),a=n(486),s=r(a),u=n(145),c=r(u),l=n(146),p=r(l),f=n(489),h=r(f),d=n(490),m=r(d),v=n(498),y=r(v),g=n(183),_=n(1034),b=r(_),x=function(e){function t(){return(0,c.default)(this,t),(0,h.default)(this,(t.__proto__||(0,s.default)(t)).apply(this,arguments))}return(0,m.default)(t,e),(0,p.default)(t,[{key:\"render\",value:function(){var e=this.props,t=e.content,n=e.contentType,r=e.url,i=e.headers,a=void 0===i?{}:i,s=e.getComponent,u=s(\"highlightCode\"),c=void 0,l=void 0;if(r=r||\"\",/json/i.test(n)){try{c=(0,o.default)(JSON.parse(t),null,\"  \")}catch(e){c=\"can't parse JSON.  Raw result:\\n\\n\"+t}l=y.default.createElement(u,{value:c})}else if(/xml/i.test(n))c=(0,g.formatXml)(t),l=y.default.createElement(u,{value:c});else if(\"text/html\"===(0,b.default)(n)||/text\\/plain/.test(n))l=y.default.createElement(u,{value:t});else if(/^image\\//i.test(n))l=y.default.createElement(\"img\",{src:r});else if(/^audio\\//i.test(n))l=y.default.createElement(\"pre\",null,y.default.createElement(\"audio\",{controls:!0},y.default.createElement(\"source\",{src:r,type:n})));else if(/^application\\/octet-stream/i.test(n)||a[\"Content-Disposition\"]&&/attachment/i.test(a[\"Content-Disposition\"])||a[\"content-disposition\"]&&/attachment/i.test(a[\"content-disposition\"])||a[\"Content-Description\"]&&/File Transfer/i.test(a[\"Content-Description\"])||a[\"content-description\"]&&/File Transfer/i.test(a[\"content-description\"])){var p=a[\"content-length\"]||a[\"Content-Length\"];if(!+p)return null;var f=/^((?!chrome|android).)*safari/i.test(navigator.userAgent);if(!f&&\"Blob\"in window){var h=n||\"text/html\",d=t instanceof Blob?t:new Blob([t],{type:h}),m=window.URL.createObjectURL(d),v=r.substr(r.lastIndexOf(\"/\")+1),_=[h,v,m].join(\":\"),x=a[\"content-disposition\"]||a[\"Content-Disposition\"];if(\"undefined\"!=typeof x){var w=/filename=([^;]*);?/i.exec(x);null!==w&&w.length>1&&(_=w[1])}l=y.default.createElement(\"div\",null,y.default.createElement(\"a\",{href:m,download:_},\"Download file\"))}else l=y.default.createElement(\"pre\",null,\"Download headers detected but your browser does not support downloading binary via XHR (Blob).\")}else l=\"string\"==typeof t?y.default.createElement(u,{value:t}):y.default.createElement(\"div\",null,\"Unknown response type\");return l?y.default.createElement(\"div\",null,y.default.createElement(\"h5\",null,\"Response body\"),l):null}}]),t}(y.default.Component);x.propTypes={content:v.PropTypes.any.isRequired,contentType:v.PropTypes.string.isRequired,getComponent:v.PropTypes.func.isRequired,headers:v.PropTypes.object,url:v.PropTypes.string},t.default=x},function(e,t,n){var r=n(203),i=r(function(e,t,n){return e+(n?\" \":\"\")+t.toLowerCase()});e.exports=i},function(e,t,n){\"use strict\";function r(e){return e&&e.__esModule?e:{default:e}}Object.defineProperty(t,\"__esModule\",{value:!0});var i=n(486),o=r(i),a=n(145),s=r(a),u=n(146),c=r(u),l=n(489),p=r(l),f=n(490),h=r(f),d=n(498),m=r(d),v=n(1015),y=r(v),g=n(168),_=r(g),b=function(e,t){return e.valueSeq().filter(_.default.Map.isMap).map(t)},x=function(e){function t(){var e,n,r,i;(0,s.default)(this,t);for(var a=arguments.length,u=Array(a),c=0;c<a;c++)u[c]=arguments[c];return n=r=(0,p.default)(this,(e=t.__proto__||(0,o.default)(t)).call.apply(e,[this].concat(u))),r.onChange=function(e,t,n){var i=r.props,o=i.specActions.changeParam,a=i.onChangeKey;o(a,e.get(\"name\"),t,n)},r.onChangeConsumesWrapper=function(e){var t=r.props,n=t.specActions.changeConsumesValue,i=t.onChangeKey;n(i,e)},i=n,(0,p.default)(r,i)}return(0,h.default)(t,e),(0,c.default)(t,[{key:\"render\",value:function(){var e=this,t=this.props,n=t.onTryoutClick,r=t.onCancelClick,i=t.parameters,o=t.allowTryItOut,a=t.tryItOutEnabled,s=t.fn,u=t.getComponent,c=t.specSelectors,l=t.pathMethod,p=u(\"parameterRow\"),f=u(\"TryItOutButton\"),h=a&&o;return m.default.createElement(\"div\",{className:\"opblock-section\"},m.default.createElement(\"div\",{className:\"opblock-section-header\"},m.default.createElement(\"h4\",{className:\"opblock-title\"},\"Parameters\"),o?m.default.createElement(f,{enabled:a,onCancelClick:r,onTryoutClick:n}):null),i.count()?m.default.createElement(\"div\",{className:\"table-container\"},m.default.createElement(\"table\",{className:\"parameters\"},m.default.createElement(\"thead\",null,m.default.createElement(\"tr\",null,m.default.createElement(\"th\",{className:\"col col_header parameters-col_name\"},\"Name\"),m.default.createElement(\"th\",{className:\"col col_header parameters-col_description\"},\"Description\"))),m.default.createElement(\"tbody\",null,b(i,function(t){return m.default.createElement(p,{fn:s,getComponent:u,param:t,key:t.get(\"name\"),onChange:e.onChange,onChangeConsumes:e.onChangeConsumesWrapper,specSelectors:c,pathMethod:l,isExecute:h})}).toArray()))):m.default.createElement(\"div\",{className:\"opblock-description-wrapper\"},m.default.createElement(\"p\",null,\"No parameters\")))}}]),t}(d.Component);x.propTypes={parameters:y.default.list.isRequired,specActions:d.PropTypes.object.isRequired,getComponent:d.PropTypes.func.isRequired,specSelectors:d.PropTypes.object.isRequired,fn:d.PropTypes.object.isRequired,tryItOutEnabled:d.PropTypes.bool,allowTryItOut:d.PropTypes.bool,onTryoutClick:d.PropTypes.func,onCancelClick:d.PropTypes.func,onChangeKey:d.PropTypes.array,pathMethod:d.PropTypes.array.isRequired},x.defaultProps={onTryoutClick:Function.prototype,onCancelClick:Function.prototype,tryItOutEnabled:!1,allowTryItOut:!0,onChangeKey:[]},t.default=x},function(e,t,n){\"use strict\";function r(e){return e&&e.__esModule?e:{default:e}}Object.defineProperty(t,\"__esModule\",{value:!0});var i=n(486),o=r(i),a=n(145),s=r(a),u=n(146),c=r(u),l=n(489),p=r(l),f=n(490),h=r(f),d=n(498),m=r(d),v=n(177),y=r(v),g=function(e){function t(e,n){(0,s.default)(this,t);var r=(0,p.default)(this,(t.__proto__||(0,o.default)(t)).call(this,e,n));_.call(r);var i=e.specSelectors,a=e.pathMethod,u=e.param,c=u.get(\"default\"),l=i.getParameter(a,u.get(\"name\")),f=l?l.get(\"value\"):\"\";return void 0!==c&&void 0===f&&r.onChangeWrapper(c),r}return(0,h.default)(t,e),(0,c.default)(t,[{key:\"componentWillReceiveProps\",value:function(e){var t=e.specSelectors,n=e.pathMethod,r=e.param,i=r.get(\"example\"),o=r.get(\"default\"),a=t.getParameter(n,r.get(\"name\")),s=a?a.get(\"value\"):void 0,u=a?a.get(\"enum\"):void 0,c=void 0;void 0!==s?c=s:void 0!==i?c=i:void 0!==o?c=o:r.get(\"required\")&&u&&u.size&&(c=u.first()),void 0!==c&&this.onChangeWrapper(c)}},{key:\"render\",value:function(){var e=this.props,t=e.param,n=e.onChange,r=e.getComponent,i=e.isExecute,o=e.fn,a=e.onChangeConsumes,s=e.specSelectors,u=e.pathMethod,c=r(\"JsonSchemaForm\"),l=r(\"ParamBody\"),p=t.get(\"in\"),f=\"body\"!==p?null:m.default.createElement(l,{getComponent:r,fn:o,param:t,consumes:s.operationConsumes(u),consumesValue:s.contentTypeValues(u).get(\"requestContentType\"),onChange:n,onChangeConsumes:a,isExecute:i,specSelectors:s,pathMethod:u}),h=r(\"modelExample\"),d=r(\"Markdown\"),v=t.get(\"schema\"),g=\"formData\"===p,_=\"FormData\"in y.default,b=t.get(\"required\"),x=t.getIn([\"items\",\"type\"]),w=s.getParameter(u,t.get(\"name\")),k=w?w.get(\"value\"):\"\";return m.default.createElement(\"tr\",null,m.default.createElement(\"td\",{className:\"col parameters-col_name\"},m.default.createElement(\"div\",{className:b?\"parameter__name required\":\"parameter__name\"},t.get(\"name\"),b?m.default.createElement(\"span\",{style:{color:\"red\"}},\" *\"):null),m.default.createElement(\"div\",{className:\"parаmeter__type\"},t.get(\"type\"),\" \",x&&\"[\"+x+\"]\"),m.default.createElement(\"div\",{className:\"parameter__in\"},\"(\",t.get(\"in\"),\")\")),m.default.createElement(\"td\",{className:\"col parameters-col_description\"},m.default.createElement(d,{source:t.get(\"description\")}),g&&!_&&m.default.createElement(\"div\",null,\"Error: your browser does not support FormData\"),f||!i?null:m.default.createElement(c,{fn:o,getComponent:r,value:k,required:b,description:t.get(\"description\")?t.get(\"name\")+\" - \"+t.get(\"description\"):\"\"+t.get(\"name\"),onChange:this.onChangeWrapper,schema:t}),f&&v?m.default.createElement(h,{\ngetComponent:r,isExecute:i,specSelectors:s,schema:v,example:f}):null))}}]),t}(d.Component);g.propTypes={onChange:d.PropTypes.func.isRequired,param:d.PropTypes.object.isRequired,getComponent:d.PropTypes.func.isRequired,fn:d.PropTypes.object.isRequired,isExecute:d.PropTypes.bool,onChangeConsumes:d.PropTypes.func.isRequired,specSelectors:d.PropTypes.object.isRequired,pathMethod:d.PropTypes.array.isRequired};var _=function(){var e=this;this.onChangeWrapper=function(t){var n=e.props,r=n.onChange,i=n.param;return r(i,t)}};t.default=g},function(e,t,n){\"use strict\";function r(e){return e&&e.__esModule?e:{default:e}}Object.defineProperty(t,\"__esModule\",{value:!0});var i=n(486),o=r(i),a=n(145),s=r(a),u=n(146),c=r(u),l=n(489),p=r(l),f=n(490),h=r(f),d=n(498),m=r(d),v=function(e){function t(){var e,n,r,i;(0,s.default)(this,t);for(var a=arguments.length,u=Array(a),c=0;c<a;c++)u[c]=arguments[c];return n=r=(0,p.default)(this,(e=t.__proto__||(0,o.default)(t)).call.apply(e,[this].concat(u))),r.onClick=function(){var e=r.props,t=e.specSelectors,n=e.specActions,i=e.operation,o=e.path,a=e.method;n.validateParams([o,a]),t.validateBeforeExecute([o,a])&&(r.props.onExecute&&r.props.onExecute(),n.execute({operation:i,path:o,method:a}))},r.onChangeProducesWrapper=function(e){return r.props.specActions.changeProducesValue([r.props.path,r.props.method],e)},i=n,(0,p.default)(r,i)}return(0,h.default)(t,e),(0,c.default)(t,[{key:\"render\",value:function(){return m.default.createElement(\"button\",{className:\"btn execute opblock-control__btn\",onClick:this.onClick},\"Execute\")}}]),t}(d.Component);v.propTypes={specSelectors:d.PropTypes.object.isRequired,specActions:d.PropTypes.object.isRequired,operation:d.PropTypes.object.isRequired,path:d.PropTypes.string.isRequired,getComponent:d.PropTypes.func.isRequired,method:d.PropTypes.string.isRequired,onExecute:d.PropTypes.func},t.default=v},function(e,t,n){\"use strict\";function r(e){return e&&e.__esModule?e:{default:e}}Object.defineProperty(t,\"__esModule\",{value:!0});var i=n(184),o=r(i),a=n(486),s=r(a),u=n(145),c=r(u),l=n(146),p=r(l),f=n(489),h=r(f),d=n(490),m=r(d),v=n(498),y=r(v),g=n(168),_=r(g),b=function(e){function t(){return(0,c.default)(this,t),(0,h.default)(this,(t.__proto__||(0,s.default)(t)).apply(this,arguments))}return(0,m.default)(t,e),(0,p.default)(t,[{key:\"render\",value:function(){var e=this.props.headers;return e&&e.size?y.default.createElement(\"div\",{className:\"headers-wrapper\"},y.default.createElement(\"h4\",{className:\"headers__title\"},\"Headers:\"),y.default.createElement(\"table\",{className:\"headers\"},y.default.createElement(\"thead\",null,y.default.createElement(\"tr\",{className:\"header-row\"},y.default.createElement(\"th\",{className:\"header-col\"},\"Name\"),y.default.createElement(\"th\",{className:\"header-col\"},\"Description\"),y.default.createElement(\"th\",{className:\"header-col\"},\"Type\"))),y.default.createElement(\"tbody\",null,e.entrySeq().map(function(e){var t=(0,o.default)(e,2),n=t[0],r=t[1];return _.default.Map.isMap(r)?y.default.createElement(\"tr\",{key:n},y.default.createElement(\"td\",{className:\"header-col\"},n),y.default.createElement(\"td\",{className:\"header-col\"},r.get(\"description\")),y.default.createElement(\"td\",{className:\"header-col\"},r.get(\"type\"))):null}).toArray()))):null}}]),t}(y.default.Component);b.propTypes={headers:v.PropTypes.object.isRequired},t.default=b},function(e,t,n){\"use strict\";function r(e){return e&&e.__esModule?e:{default:e}}function i(e){return e.split(\" \").map(function(e){return e[0].toUpperCase()+e.slice(1)}).join(\" \")}Object.defineProperty(t,\"__esModule\",{value:!0});var o=n(486),a=r(o),s=n(145),u=r(s),c=n(146),l=r(c),p=n(489),f=r(p),h=n(490),d=r(h),m=n(498),v=r(m),y=n(168),g=n(1040),_=r(g),b=function(e){function t(){return(0,u.default)(this,t),(0,f.default)(this,(t.__proto__||(0,a.default)(t)).apply(this,arguments))}return(0,d.default)(t,e),(0,l.default)(t,[{key:\"render\",value:function(){var e=this.props,t=e.editorActions,n=e.errSelectors,r=e.layoutSelectors,i=e.layoutActions;if(t&&t.jumpToLine)var o=t.jumpToLine;var a=n.allErrors(),s=a.filter(function(e){return\"thrown\"===e.get(\"type\")||\"error\"===e.get(\"level\")});if(!s||s.count()<1)return null;var u=r.isShown([\"errorPane\"],!0),c=function(){return i.show([\"errorPane\"],!u)},l=s.sortBy(function(e){return e.get(\"line\")});return v.default.createElement(\"pre\",{className:\"errors-wrapper\"},v.default.createElement(\"hgroup\",{className:\"error\"},v.default.createElement(\"h4\",{className:\"errors__title\"},\"Errors\"),v.default.createElement(\"button\",{className:\"btn errors__clear-btn\",onClick:c},u?\"Hide\":\"Show\")),v.default.createElement(_.default,{isOpened:u,animated:!0},v.default.createElement(\"div\",{className:\"errors\"},l.map(function(e,t){var n=e.get(\"type\");return\"thrown\"===n||\"auth\"===n?v.default.createElement(x,{key:t,error:e.get(\"error\")||e,jumpToLine:o}):\"spec\"===n?v.default.createElement(w,{key:t,error:e,jumpToLine:o}):void 0}))))}}]),t}(v.default.Component);b.propTypes={editorActions:m.PropTypes.object,errSelectors:m.PropTypes.object.isRequired,layoutSelectors:m.PropTypes.object.isRequired,layoutActions:m.PropTypes.object.isRequired},t.default=b;var x=function(e){var t=e.error,n=e.jumpToLine;if(!t)return null;var r=t.get(\"line\");return v.default.createElement(\"div\",{className:\"error-wrapper\"},t?v.default.createElement(\"div\",null,v.default.createElement(\"h4\",null,t.get(\"source\")&&t.get(\"level\")?i(t.get(\"source\"))+\" \"+t.get(\"level\"):\"\",t.get(\"path\")?v.default.createElement(\"small\",null,\" at \",t.get(\"path\")):null),v.default.createElement(\"span\",{style:{whiteSpace:\"pre-line\",maxWidth:\"100%\"}},t.get(\"message\")),v.default.createElement(\"div\",null,r&&n?v.default.createElement(\"a\",{onClick:n.bind(null,r)},\"Jump to line \",r):null)):null)},w=function(e){var t=e.error,n=e.jumpToLine,r=null;return t.get(\"path\")?r=y.List.isList(t.get(\"path\"))?v.default.createElement(\"small\",null,\"at \",t.get(\"path\").join(\".\")):v.default.createElement(\"small\",null,\"at \",t.get(\"path\")):t.get(\"line\")&&!n&&(r=v.default.createElement(\"small\",null,\"on line \",t.get(\"line\"))),v.default.createElement(\"div\",{className:\"error-wrapper\"},t?v.default.createElement(\"div\",null,v.default.createElement(\"h4\",null,i(t.get(\"source\"))+\" \"+t.get(\"level\"),\" \",r),v.default.createElement(\"span\",{style:{whiteSpace:\"pre-line\"}},t.get(\"message\")),v.default.createElement(\"div\",{style:{\"text-decoration\":\"underline\",cursor:\"pointer\"}},n?v.default.createElement(\"a\",{onClick:n.bind(null,t.get(\"line\"))},\"Jump to line \",t.get(\"line\")):null)):null)};x.propTypes={error:m.PropTypes.object.isRequired,jumpToLine:m.PropTypes.func},x.defaultProps={jumpToLine:null},w.propTypes={error:m.PropTypes.object.isRequired,jumpToLine:m.PropTypes.func}},function(e,t,n){\"use strict\";var r=n(1041).default;e.exports=r},function(e,t,n){\"use strict\";function r(e){return e&&e.__esModule?e:{default:e}}function i(e,t){var n={};for(var r in e)t.indexOf(r)>=0||Object.prototype.hasOwnProperty.call(e,r)&&(n[r]=e[r]);return n}Object.defineProperty(t,\"__esModule\",{value:!0});var o=Object.assign||function(e){for(var t=1;t<arguments.length;t++){var n=arguments[t];for(var r in n)Object.prototype.hasOwnProperty.call(n,r)&&(e[r]=n[r])}return e},a=n(498),s=r(a),u=n(1042),c=n(1043),l=n(1058),p=r(l),f=.5,h=function(e){return Math.max(0,parseFloat(e)).toFixed(1)},d=s.default.createClass({displayName:\"Collapse\",propTypes:{isOpened:s.default.PropTypes.bool.isRequired,children:s.default.PropTypes.node.isRequired,fixedHeight:s.default.PropTypes.number,style:s.default.PropTypes.object,springConfig:s.default.PropTypes.objectOf(s.default.PropTypes.number),keepCollapsedContent:s.default.PropTypes.bool,onRest:s.default.PropTypes.func,onHeightReady:s.default.PropTypes.func},getDefaultProps:function(){return{fixedHeight:-1,style:{},keepCollapsedContent:!1,onHeightReady:function(){}}},getInitialState:function(){return{height:-1,isOpenedChanged:!1}},componentWillMount:function(){this.height=h(0),this.renderStatic=!0},componentWillReceiveProps:function(e){var t=e.isOpened;this.setState({isOpenedChanged:t!==this.props.isOpened})},shouldComponentUpdate:u.shouldComponentUpdate,componentDidUpdate:function(e){var t=e.isOpened;if(t!==this.props.isOpened){var n=this.props.isOpened?this.state.height:0;this.props.onHeightReady(n)}},onHeightReady:function e(t){var n=this.props,r=n.isOpened,i=n.keepCollapsedContent,e=n.onHeightReady;this.renderStatic&&r&&(this.height=h(t)),i?this.setState({height:t}):this.setState({height:r||!this.renderStatic?t:0});var o=r?t:0;this.state.height!==o&&e(o)},getMotionHeight:function(e){var t=this.props,n=t.isOpened,r=t.springConfig,i=this.state.isOpenedChanged,a=n?Math.max(0,parseFloat(e)).toFixed(1):h(0),s=!i&&!n||this.height===a,u=(0,c.spring)(n?Math.max(0,e):0,o({precision:f},r)),l=n?Math.max(0,e):0;return s?l:u},renderFixed:function(){var e=this,t=this.props,n=(t.springConfig,t.onHeightReady,t.onRest,t.isOpened),r=t.style,a=t.children,u=t.fixedHeight,l=t.keepCollapsedContent,p=i(t,[\"springConfig\",\"onHeightReady\",\"onRest\",\"isOpened\",\"style\",\"children\",\"fixedHeight\",\"keepCollapsedContent\"]);if(this.renderStatic){this.renderStatic=!1;var f={overflow:\"hidden\",height:n?u:0};return l||n?(this.height=h(u),s.default.createElement(\"div\",o({style:o({},f,r)},p),a)):null}return s.default.createElement(c.Motion,{defaultStyle:{height:n?0:u},style:{height:this.getMotionHeight(u)}},function(t){var i=t.height;if(e.height=h(i),!l&&!n&&e.height===h(0))return null;var u={overflow:\"hidden\",height:i};return s.default.createElement(\"div\",o({style:o({},u,r)},p),a)})},render:function(){var e=this,t=this.props,n=(t.springConfig,t.onHeightReady,t.isOpened),r=t.style,a=t.children,u=t.fixedHeight,l=t.keepCollapsedContent,f=t.onRest,d=i(t,[\"springConfig\",\"onHeightReady\",\"isOpened\",\"style\",\"children\",\"fixedHeight\",\"keepCollapsedContent\",\"onRest\"]);if(u>-1)return this.renderFixed();var m=this.renderStatic,v=this.state.height,y=parseFloat(v).toFixed(1);v>-1&&m&&(this.renderStatic=!1);var g=s.default.createElement(p.default,{onHeightReady:this.onHeightReady},a);if(m){var _=n?{height:\"auto\"}:{overflow:\"hidden\",height:0};return!n&&v>-1?l?s.default.createElement(\"div\",o({style:o({height:0,overflow:\"hidden\"},r)},d),g):null:s.default.createElement(\"div\",o({style:o({},_,r)},d),g)}return s.default.createElement(c.Motion,{defaultStyle:{height:Math.max(0,v)},onRest:f,style:{height:this.getMotionHeight(v)}},function(t){if(e.height=h(t.height),!n&&\"0.0\"===e.height)return l?s.default.createElement(\"div\",o({style:o({height:0,overflow:\"hidden\"},r)},d),g):null;var i=n&&e.height===y?{height:\"auto\"}:{height:t.height,overflow:\"hidden\"};return s.default.createElement(\"div\",o({style:o({},i,r)},d),g)})}});t.default=d},function(e,t,n){\"use strict\";var r=n(1028),i={shouldComponentUpdate:function(e,t){return r(this,e,t)}};e.exports=i},function(e,t,n){\"use strict\";function r(e){return e&&e.__esModule?e.default:e}t.__esModule=!0;var i=n(1044);t.Motion=r(i);var o=n(1052);t.StaggeredMotion=r(o);var a=n(1053);t.TransitionMotion=r(a);var s=n(1055);t.spring=r(s);var u=n(1056);t.presets=r(u);var c=n(1057);t.reorderKeys=r(c)},function(e,t,n){\"use strict\";function r(e){return e&&e.__esModule?e:{default:e}}t.__esModule=!0;var i=Object.assign||function(e){for(var t=1;t<arguments.length;t++){var n=arguments[t];for(var r in n)Object.prototype.hasOwnProperty.call(n,r)&&(e[r]=n[r])}return e},o=n(1045),a=r(o),s=n(1046),u=r(s),c=n(1047),l=r(c),p=n(1048),f=r(p),h=n(1049),d=r(h),m=n(1051),v=r(m),y=n(498),g=r(y),_=1e3/60,b=g.default.createClass({displayName:\"Motion\",propTypes:{defaultStyle:y.PropTypes.objectOf(y.PropTypes.number),style:y.PropTypes.objectOf(y.PropTypes.oneOfType([y.PropTypes.number,y.PropTypes.object])).isRequired,children:y.PropTypes.func.isRequired,onRest:y.PropTypes.func},getInitialState:function(){var e=this.props,t=e.defaultStyle,n=e.style,r=t||u.default(n),i=a.default(r);return{currentStyle:r,currentVelocity:i,lastIdealStyle:r,lastIdealVelocity:i}},wasAnimating:!1,animationID:null,prevTime:0,accumulatedTime:0,unreadPropStyle:null,clearUnreadPropStyle:function(e){var t=!1,n=this.state,r=n.currentStyle,o=n.currentVelocity,a=n.lastIdealStyle,s=n.lastIdealVelocity;for(var u in e)if(e.hasOwnProperty(u)){var c=e[u];\"number\"==typeof c&&(t||(t=!0,r=i({},r),o=i({},o),a=i({},a),s=i({},s)),r[u]=c,o[u]=0,a[u]=c,s[u]=0)}t&&this.setState({currentStyle:r,currentVelocity:o,lastIdealStyle:a,lastIdealVelocity:s})},startAnimationIfNecessary:function(){var e=this;this.animationID=d.default(function(){var t=e.props.style;if(v.default(e.state.currentStyle,t,e.state.currentVelocity))return e.wasAnimating&&e.props.onRest&&e.props.onRest(),e.animationID=null,e.wasAnimating=!1,void(e.accumulatedTime=0);e.wasAnimating=!0;var n=f.default(),r=n-e.prevTime;if(e.prevTime=n,e.accumulatedTime=e.accumulatedTime+r,e.accumulatedTime>10*_&&(e.accumulatedTime=0),0===e.accumulatedTime)return e.animationID=null,void e.startAnimationIfNecessary();var i=(e.accumulatedTime-Math.floor(e.accumulatedTime/_)*_)/_,o=Math.floor(e.accumulatedTime/_),a={},s={},u={},c={};for(var p in t)if(t.hasOwnProperty(p)){var h=t[p];if(\"number\"==typeof h)u[p]=h,c[p]=0,a[p]=h,s[p]=0;else{for(var d=e.state.lastIdealStyle[p],m=e.state.lastIdealVelocity[p],y=0;y<o;y++){var g=l.default(_/1e3,d,m,h.val,h.stiffness,h.damping,h.precision);d=g[0],m=g[1]}var b=l.default(_/1e3,d,m,h.val,h.stiffness,h.damping,h.precision),x=b[0],w=b[1];u[p]=d+(x-d)*i,c[p]=m+(w-m)*i,a[p]=d,s[p]=m}}e.animationID=null,e.accumulatedTime-=o*_,e.setState({currentStyle:u,currentVelocity:c,lastIdealStyle:a,lastIdealVelocity:s}),e.unreadPropStyle=null,e.startAnimationIfNecessary()})},componentDidMount:function(){this.prevTime=f.default(),this.startAnimationIfNecessary()},componentWillReceiveProps:function(e){null!=this.unreadPropStyle&&this.clearUnreadPropStyle(this.unreadPropStyle),this.unreadPropStyle=e.style,null==this.animationID&&(this.prevTime=f.default(),this.startAnimationIfNecessary())},componentWillUnmount:function(){null!=this.animationID&&(d.default.cancel(this.animationID),this.animationID=null)},render:function(){var e=this.props.children(this.state.currentStyle);return e&&g.default.Children.only(e)}});t.default=b,e.exports=t.default},function(e,t){\"use strict\";function n(e){var t={};for(var n in e)e.hasOwnProperty(n)&&(t[n]=0);return t}t.__esModule=!0,t.default=n,e.exports=t.default},function(e,t){\"use strict\";function n(e){var t={};for(var n in e)e.hasOwnProperty(n)&&(t[n]=\"number\"==typeof e[n]?e[n]:e[n].val);return t}t.__esModule=!0,t.default=n,e.exports=t.default},function(e,t){\"use strict\";function n(e,t,n,i,o,a,s){var u=-o*(t-i),c=-a*n,l=u+c,p=n+l*e,f=t+p*e;return Math.abs(p)<s&&Math.abs(f-i)<s?(r[0]=i,r[1]=0,r):(r[0]=f,r[1]=p,r)}t.__esModule=!0,t.default=n;var r=[];e.exports=t.default},function(e,t,n){(function(t){(function(){var n,r,i;\"undefined\"!=typeof performance&&null!==performance&&performance.now?e.exports=function(){return performance.now()}:\"undefined\"!=typeof t&&null!==t&&t.hrtime?(e.exports=function(){return(n()-i)/1e6},r=t.hrtime,n=function(){var e;return e=r(),1e9*e[0]+e[1]},i=n()):Date.now?(e.exports=function(){return Date.now()-i},i=Date.now()):(e.exports=function(){return(new Date).getTime()-i},i=(new Date).getTime())}).call(this)}).call(t,n(324))},function(e,t,n){(function(t){for(var r=n(1050),i=\"undefined\"==typeof window?t:window,o=[\"moz\",\"webkit\"],a=\"AnimationFrame\",s=i[\"request\"+a],u=i[\"cancel\"+a]||i[\"cancelRequest\"+a],c=0;!s&&c<o.length;c++)s=i[o[c]+\"Request\"+a],u=i[o[c]+\"Cancel\"+a]||i[o[c]+\"CancelRequest\"+a];if(!s||!u){var l=0,p=0,f=[],h=1e3/60;s=function(e){if(0===f.length){var t=r(),n=Math.max(0,h-(t-l));l=n+t,setTimeout(function(){var e=f.slice(0);f.length=0;for(var t=0;t<e.length;t++)if(!e[t].cancelled)try{e[t].callback(l)}catch(e){setTimeout(function(){throw e},0)}},Math.round(n))}return f.push({handle:++p,callback:e,cancelled:!1}),p},u=function(e){for(var t=0;t<f.length;t++)f[t].handle===e&&(f[t].cancelled=!0)}}e.exports=function(e){return s.call(i,e)},e.exports.cancel=function(){u.apply(i,arguments)},e.exports.polyfill=function(){i.requestAnimationFrame=s,i.cancelAnimationFrame=u}}).call(t,function(){return this}())},function(e,t,n){(function(t){(function(){var n,r,i,o,a,s;\"undefined\"!=typeof performance&&null!==performance&&performance.now?e.exports=function(){return performance.now()}:\"undefined\"!=typeof t&&null!==t&&t.hrtime?(e.exports=function(){return(n()-a)/1e6},r=t.hrtime,n=function(){var e;return e=r(),1e9*e[0]+e[1]},o=n(),s=1e9*t.uptime(),a=o-s):Date.now?(e.exports=function(){return Date.now()-i},i=Date.now()):(e.exports=function(){return(new Date).getTime()-i},i=(new Date).getTime())}).call(this)}).call(t,n(324))},function(e,t){\"use strict\";function n(e,t,n){for(var r in t)if(t.hasOwnProperty(r)){if(0!==n[r])return!1;var i=\"number\"==typeof t[r]?t[r]:t[r].val;if(e[r]!==i)return!1}return!0}t.__esModule=!0,t.default=n,e.exports=t.default},function(e,t,n){\"use strict\";function r(e){return e&&e.__esModule?e:{default:e}}function i(e,t,n){for(var r=0;r<e.length;r++)if(!y.default(e[r],t[r],n[r]))return!1;return!0}t.__esModule=!0;var o=Object.assign||function(e){for(var t=1;t<arguments.length;t++){var n=arguments[t];for(var r in n)Object.prototype.hasOwnProperty.call(n,r)&&(e[r]=n[r])}return e},a=n(1045),s=r(a),u=n(1046),c=r(u),l=n(1047),p=r(l),f=n(1048),h=r(f),d=n(1049),m=r(d),v=n(1051),y=r(v),g=n(498),_=r(g),b=1e3/60,x=_.default.createClass({displayName:\"StaggeredMotion\",propTypes:{defaultStyles:g.PropTypes.arrayOf(g.PropTypes.objectOf(g.PropTypes.number)),styles:g.PropTypes.func.isRequired,children:g.PropTypes.func.isRequired},getInitialState:function(){var e=this.props,t=e.defaultStyles,n=e.styles,r=t||n().map(c.default),i=r.map(function(e){return s.default(e)});return{currentStyles:r,currentVelocities:i,lastIdealStyles:r,lastIdealVelocities:i}},animationID:null,prevTime:0,accumulatedTime:0,unreadPropStyles:null,clearUnreadPropStyle:function(e){for(var t=this.state,n=t.currentStyles,r=t.currentVelocities,i=t.lastIdealStyles,a=t.lastIdealVelocities,s=!1,u=0;u<e.length;u++){var c=e[u],l=!1;for(var p in c)if(c.hasOwnProperty(p)){var f=c[p];\"number\"==typeof f&&(l||(l=!0,s=!0,n[u]=o({},n[u]),r[u]=o({},r[u]),i[u]=o({},i[u]),a[u]=o({},a[u])),n[u][p]=f,r[u][p]=0,i[u][p]=f,a[u][p]=0)}}s&&this.setState({currentStyles:n,currentVelocities:r,lastIdealStyles:i,lastIdealVelocities:a})},startAnimationIfNecessary:function(){var e=this;this.animationID=m.default(function(){var t=e.props.styles(e.state.lastIdealStyles);if(i(e.state.currentStyles,t,e.state.currentVelocities))return e.animationID=null,void(e.accumulatedTime=0);var n=h.default(),r=n-e.prevTime;if(e.prevTime=n,e.accumulatedTime=e.accumulatedTime+r,e.accumulatedTime>10*b&&(e.accumulatedTime=0),0===e.accumulatedTime)return e.animationID=null,void e.startAnimationIfNecessary();for(var o=(e.accumulatedTime-Math.floor(e.accumulatedTime/b)*b)/b,a=Math.floor(e.accumulatedTime/b),s=[],u=[],c=[],l=[],f=0;f<t.length;f++){var d=t[f],m={},v={},y={},g={};for(var _ in d)if(d.hasOwnProperty(_)){var x=d[_];if(\"number\"==typeof x)m[_]=x,v[_]=0,y[_]=x,g[_]=0;else{for(var w=e.state.lastIdealStyles[f][_],k=e.state.lastIdealVelocities[f][_],S=0;S<a;S++){var E=p.default(b/1e3,w,k,x.val,x.stiffness,x.damping,x.precision);w=E[0],k=E[1]}var C=p.default(b/1e3,w,k,x.val,x.stiffness,x.damping,x.precision),A=C[0],T=C[1];m[_]=w+(A-w)*o,v[_]=k+(T-k)*o,y[_]=w,g[_]=k}}c[f]=m,l[f]=v,s[f]=y,u[f]=g}e.animationID=null,e.accumulatedTime-=a*b,e.setState({currentStyles:c,currentVelocities:l,lastIdealStyles:s,lastIdealVelocities:u}),e.unreadPropStyles=null,e.startAnimationIfNecessary()})},componentDidMount:function(){this.prevTime=h.default(),this.startAnimationIfNecessary()},componentWillReceiveProps:function(e){null!=this.unreadPropStyles&&this.clearUnreadPropStyle(this.unreadPropStyles),this.unreadPropStyles=e.styles(this.state.lastIdealStyles),null==this.animationID&&(this.prevTime=h.default(),this.startAnimationIfNecessary())},componentWillUnmount:function(){null!=this.animationID&&(m.default.cancel(this.animationID),this.animationID=null)},render:function(){var e=this.props.children(this.state.currentStyles);return e&&_.default.Children.only(e)}});t.default=x,e.exports=t.default},function(e,t,n){\"use strict\";function r(e){return e&&e.__esModule?e:{default:e}}function i(e,t,n){return null==t?e.map(function(e,t){return{key:e.key,data:e.data,style:n[t]}}):e.map(function(e,r){for(var i=0;i<t.length;i++)if(t[i].key===e.key)return{key:t[i].key,data:t[i].data,style:n[r]};return{key:e.key,data:e.data,style:n[r]}})}function o(e,t,n,r){if(r.length!==t.length)return!1;for(var i=0;i<r.length;i++)if(r[i].key!==t[i].key)return!1;for(var i=0;i<r.length;i++)if(!x.default(e[i],t[i].style,n[i]))return!1;return!0}function a(e,t,n,r,i,o,a,s){for(var u=m.default(n,r,function(e,n){var r=t(n);return null==r?null:x.default(i[e],r,o[e])?null:{key:n.key,data:n.data,style:r}}),l=[],p=[],f=[],h=[],d=0;d<u.length;d++){for(var v=u[d],y=null,g=0;g<n.length;g++)if(n[g].key===v.key){y=g;break}if(null==y){var _=e(v);l[d]=_,f[d]=_;var b=c.default(v.style);p[d]=b,h[d]=b}else l[d]=i[y],f[d]=a[y],p[d]=o[y],h[d]=s[y]}return[u,l,p,f,h]}t.__esModule=!0;var s=Object.assign||function(e){for(var t=1;t<arguments.length;t++){var n=arguments[t];for(var r in n)Object.prototype.hasOwnProperty.call(n,r)&&(e[r]=n[r])}return e},u=n(1045),c=r(u),l=n(1046),p=r(l),f=n(1047),h=r(f),d=n(1054),m=r(d),v=n(1048),y=r(v),g=n(1049),_=r(g),b=n(1051),x=r(b),w=n(498),k=r(w),S=1e3/60,E=k.default.createClass({displayName:\"TransitionMotion\",propTypes:{defaultStyles:w.PropTypes.arrayOf(w.PropTypes.shape({key:w.PropTypes.string.isRequired,data:w.PropTypes.any,style:w.PropTypes.objectOf(w.PropTypes.number).isRequired})),styles:w.PropTypes.oneOfType([w.PropTypes.func,w.PropTypes.arrayOf(w.PropTypes.shape({key:w.PropTypes.string.isRequired,data:w.PropTypes.any,style:w.PropTypes.objectOf(w.PropTypes.oneOfType([w.PropTypes.number,w.PropTypes.object])).isRequired}))]).isRequired,children:w.PropTypes.func.isRequired,willLeave:w.PropTypes.func,willEnter:w.PropTypes.func},getDefaultProps:function(){return{willEnter:function(e){return p.default(e.style)},willLeave:function(){return null}}},getInitialState:function(){var e=this.props,t=e.defaultStyles,n=e.styles,r=e.willEnter,i=e.willLeave,o=\"function\"==typeof n?n(t):n,s=void 0;s=null==t?o:t.map(function(e){for(var t=0;t<o.length;t++)if(o[t].key===e.key)return o[t];return e});var u=null==t?o.map(function(e){return p.default(e.style)}):t.map(function(e){return p.default(e.style)}),l=null==t?o.map(function(e){return c.default(e.style)}):t.map(function(e){return c.default(e.style)}),f=a(r,i,s,o,u,l,u,l),h=f[0],d=f[1],m=f[2],v=f[3],y=f[4];return{currentStyles:d,currentVelocities:m,lastIdealStyles:v,lastIdealVelocities:y,mergedPropsStyles:h}},animationID:null,prevTime:0,accumulatedTime:0,unreadPropStyles:null,clearUnreadPropStyle:function(e){for(var t=a(this.props.willEnter,this.props.willLeave,this.state.mergedPropsStyles,e,this.state.currentStyles,this.state.currentVelocities,this.state.lastIdealStyles,this.state.lastIdealVelocities),n=t[0],r=t[1],i=t[2],o=t[3],u=t[4],c=0;c<e.length;c++){var l=e[c].style,p=!1;for(var f in l)if(l.hasOwnProperty(f)){var h=l[f];\"number\"==typeof h&&(p||(p=!0,r[c]=s({},r[c]),i[c]=s({},i[c]),o[c]=s({},o[c]),u[c]=s({},u[c]),n[c]={key:n[c].key,data:n[c].data,style:s({},n[c].style)}),r[c][f]=h,i[c][f]=0,o[c][f]=h,u[c][f]=0,n[c].style[f]=h)}}this.setState({currentStyles:r,currentVelocities:i,mergedPropsStyles:n,lastIdealStyles:o,lastIdealVelocities:u})},startAnimationIfNecessary:function(){var e=this;this.animationID=_.default(function(){var t=e.props.styles,n=\"function\"==typeof t?t(i(e.state.mergedPropsStyles,e.unreadPropStyles,e.state.lastIdealStyles)):t;if(o(e.state.currentStyles,n,e.state.currentVelocities,e.state.mergedPropsStyles))return e.animationID=null,void(e.accumulatedTime=0);var r=y.default(),s=r-e.prevTime;if(e.prevTime=r,e.accumulatedTime=e.accumulatedTime+s,e.accumulatedTime>10*S&&(e.accumulatedTime=0),0===e.accumulatedTime)return e.animationID=null,void e.startAnimationIfNecessary();for(var u=(e.accumulatedTime-Math.floor(e.accumulatedTime/S)*S)/S,c=Math.floor(e.accumulatedTime/S),l=a(e.props.willEnter,e.props.willLeave,e.state.mergedPropsStyles,n,e.state.currentStyles,e.state.currentVelocities,e.state.lastIdealStyles,e.state.lastIdealVelocities),p=l[0],f=l[1],d=l[2],m=l[3],v=l[4],g=0;g<p.length;g++){var _=p[g].style,b={},x={},w={},k={};for(var E in _)if(_.hasOwnProperty(E)){var C=_[E];if(\"number\"==typeof C)b[E]=C,x[E]=0,w[E]=C,k[E]=0;else{for(var A=m[g][E],T=v[g][E],D=0;D<c;D++){var M=h.default(S/1e3,A,T,C.val,C.stiffness,C.damping,C.precision);A=M[0],T=M[1]}var O=h.default(S/1e3,A,T,C.val,C.stiffness,C.damping,C.precision),P=O[0],I=O[1];b[E]=A+(P-A)*u,x[E]=T+(I-T)*u,w[E]=A,k[E]=T}}m[g]=w,v[g]=k,f[g]=b,d[g]=x}e.animationID=null,e.accumulatedTime-=c*S,e.setState({currentStyles:f,currentVelocities:d,lastIdealStyles:m,lastIdealVelocities:v,mergedPropsStyles:p}),e.unreadPropStyles=null,e.startAnimationIfNecessary()})},componentDidMount:function(){this.prevTime=y.default(),this.startAnimationIfNecessary()},componentWillReceiveProps:function(e){this.unreadPropStyles&&this.clearUnreadPropStyle(this.unreadPropStyles),\"function\"==typeof e.styles?this.unreadPropStyles=e.styles(i(this.state.mergedPropsStyles,this.unreadPropStyles,this.state.lastIdealStyles)):this.unreadPropStyles=e.styles,null==this.animationID&&(this.prevTime=y.default(),this.startAnimationIfNecessary())},componentWillUnmount:function(){null!=this.animationID&&(_.default.cancel(this.animationID),this.animationID=null)},render:function(){var e=i(this.state.mergedPropsStyles,this.unreadPropStyles,this.state.currentStyles),t=this.props.children(e);return t&&k.default.Children.only(t)}});t.default=E,e.exports=t.default},function(e,t){\"use strict\";function n(e,t,n){for(var r={},i=0;i<e.length;i++)r[e[i].key]=i;for(var o={},i=0;i<t.length;i++)o[t[i].key]=i;for(var a=[],i=0;i<t.length;i++)a[i]=t[i];for(var i=0;i<e.length;i++)if(!o.hasOwnProperty(e[i].key)){var s=n(i,e[i]);null!=s&&a.push(s)}return a.sort(function(e,n){var i=o[e.key],a=o[n.key],s=r[e.key],u=r[n.key];if(null!=i&&null!=a)return o[e.key]-o[n.key];if(null!=s&&null!=u)return r[e.key]-r[n.key];if(null!=i){for(var c=0;c<t.length;c++){var l=t[c].key;if(r.hasOwnProperty(l)){if(i<o[l]&&u>r[l])return-1;if(i>o[l]&&u<r[l])return 1}}return 1}for(var c=0;c<t.length;c++){var l=t[c].key;if(r.hasOwnProperty(l)){if(a<o[l]&&s>r[l])return 1;if(a>o[l]&&s<r[l])return-1}}return-1})}t.__esModule=!0,t.default=n,e.exports=t.default},function(e,t,n){\"use strict\";function r(e){return e&&e.__esModule?e:{default:e}}function i(e,t){return o({},u,t,{val:e})}t.__esModule=!0;var o=Object.assign||function(e){for(var t=1;t<arguments.length;t++){var n=arguments[t];for(var r in n)Object.prototype.hasOwnProperty.call(n,r)&&(e[r]=n[r])}return e};t.default=i;var a=n(1056),s=r(a),u=o({},s.default.noWobble,{precision:.01});e.exports=t.default},function(e,t){\"use strict\";t.__esModule=!0,t.default={noWobble:{stiffness:170,damping:26},gentle:{stiffness:120,damping:14},wobbly:{stiffness:180,damping:12},stiff:{stiffness:210,damping:20}},e.exports=t.default},function(e,t,n){\"use strict\";function r(){}t.__esModule=!0,t.default=r;e.exports=t.default},function(e,t,n){\"use strict\";var r=n(1059).default;e.exports=r},function(e,t,n){\"use strict\";function r(e){return e&&e.__esModule?e:{default:e}}function i(e,t){var n={};for(var r in e)t.indexOf(r)>=0||Object.prototype.hasOwnProperty.call(e,r)&&(n[r]=e[r]);return n}Object.defineProperty(t,\"__esModule\",{value:!0});var o=Object.assign||function(e){for(var t=1;t<arguments.length;t++){var n=arguments[t];for(var r in n)Object.prototype.hasOwnProperty.call(n,r)&&(e[r]=n[r])}return e},a=n(498),s=r(a),u=n(1060),c=r(u),l=n(1062),p=r(l),f=n(1042),h=function(e){return e.clientHeight},d=(0,p.default)({propTypes:{children:c.default.node.isRequired,onHeightReady:c.default.func.isRequired,hidden:c.default.bool,dirty:c.default.bool,getElementHeight:c.default.func},getDefaultProps:function(){return{hidden:!1,dirty:!0,getElementHeight:h}},getInitialState:function(){return{height:0,dirty:this.props.dirty}},componentDidMount:function(){var e=this,t=this.props.getElementHeight(this.wrapper),n=!1;this.setState({height:t,dirty:n},function(){return e.props.onHeightReady(e.state.height)})},componentWillReceiveProps:function(e){var t=e.children,n=e.dirty;(t!==this.props.children||n)&&this.setState({dirty:!0})},shouldComponentUpdate:f.shouldComponentUpdate,componentDidUpdate:function(){var e=this,t=this.props.getElementHeight(this.wrapper),n=!1;t===this.state.height?this.setState({dirty:n}):this.setState({height:t,dirty:n},function(){return e.props.onHeightReady(e.state.height)})},setWrapperRef:function(e){this.wrapper=e},render:function(){var e=this.props,t=(e.onHeightReady,e.getElementHeight,e.dirty,e.hidden),n=e.children,r=i(e,[\"onHeightReady\",\"getElementHeight\",\"dirty\",\"hidden\",\"children\"]),a=this.state.dirty;return t&&!a?null:t?s.default.createElement(\"div\",{style:{height:0,overflow:\"hidden\"}},s.default.createElement(\"div\",o({ref:this.setWrapperRef},r),n)):s.default.createElement(\"div\",o({ref:this.setWrapperRef},r),n)}});t.default=d},[1232,1061],function(e,t,n){\"use strict\";var r=n(505),i=n(508);e.exports=function(){function e(){i(!1,\"Calling PropTypes validators directly is not supported by the `prop-types` package. Use PropTypes.checkPropTypes() to call them. Read more at http://fb.me/use-check-prop-types\")}function t(){return e}e.isRequired=e;var n={array:e,bool:e,func:e,number:e,object:e,string:e,symbol:e,any:e,arrayOf:t,element:e,instanceOf:t,node:e,objectOf:t,oneOf:t,oneOfType:t,shape:t};return n.checkPropTypes=r,n.PropTypes=n,n}},function(e,t,n){\"use strict\";var r=n(498),i=n(1063),o=(new r.Component).updater;e.exports=i(r.Component,r.isValidElement,o)},function(e,t,n){\"use strict\";function r(e){return e}function i(e,t,n){function i(e,t){var n=g.hasOwnProperty(t)?g[t]:null;x.hasOwnProperty(t)&&u(\"OVERRIDE_BASE\"===n,\"ReactClassInterface: You are attempting to override `%s` from your class specification. Ensure that your method names do not overlap with React methods.\",t),e&&u(\"DEFINE_MANY\"===n||\"DEFINE_MANY_MERGED\"===n,\"ReactClassInterface: You are attempting to define `%s` on your component more than once. This conflict may be due to a mixin.\",t)}function o(e,n){if(n){u(\"function\"!=typeof n,\"ReactClass: You're attempting to use a component class or function as a mixin. Instead, just use a regular object.\"),u(!t(n),\"ReactClass: You're attempting to use a component as a mixin. Instead, just use a regular object.\");var r=e.prototype,o=r.__reactAutoBindPairs;n.hasOwnProperty(c)&&_.mixins(e,n.mixins);for(var a in n)if(n.hasOwnProperty(a)&&a!==c){var s=n[a],l=r.hasOwnProperty(a);if(i(l,a),_.hasOwnProperty(a))_[a](e,s);else{var p=g.hasOwnProperty(a),d=\"function\"==typeof s,m=d&&!p&&!l&&n.autobind!==!1;if(m)o.push(a,s),r[a]=s;else if(l){var v=g[a];u(p&&(\"DEFINE_MANY_MERGED\"===v||\"DEFINE_MANY\"===v),\"ReactClass: Unexpected spec policy %s for key %s when mixing in component specs.\",v,a),\"DEFINE_MANY_MERGED\"===v?r[a]=f(r[a],s):\"DEFINE_MANY\"===v&&(r[a]=h(r[a],s))}else r[a]=s}}}else;}function l(e,t){if(t)for(var n in t){var r=t[n];if(t.hasOwnProperty(n)){var i=n in _;u(!i,'ReactClass: You are attempting to define a reserved property, `%s`, that shouldn\\'t be on the \"statics\" key. Define it as an instance property instead; it will still be accessible on the constructor.',n);var o=n in e;u(!o,\"ReactClass: You are attempting to define `%s` on your component more than once. This conflict may be due to a mixin.\",n),e[n]=r}}}function p(e,t){u(e&&t&&\"object\"==typeof e&&\"object\"==typeof t,\"mergeIntoWithNoDuplicateKeys(): Cannot merge non-objects.\");for(var n in t)t.hasOwnProperty(n)&&(u(void 0===e[n],\"mergeIntoWithNoDuplicateKeys(): Tried to merge two objects with the same key: `%s`. This conflict may be due to a mixin; in particular, this may be caused by two getInitialState() or getDefaultProps() methods returning objects with clashing keys.\",n),\ne[n]=t[n]);return e}function f(e,t){return function(){var n=e.apply(this,arguments),r=t.apply(this,arguments);if(null==n)return r;if(null==r)return n;var i={};return p(i,n),p(i,r),i}}function h(e,t){return function(){e.apply(this,arguments),t.apply(this,arguments)}}function d(e,t){var n=t.bind(e);return n}function m(e){for(var t=e.__reactAutoBindPairs,n=0;n<t.length;n+=2){var r=t[n],i=t[n+1];e[r]=d(e,i)}}function v(e){var t=r(function(e,r,i){this.__reactAutoBindPairs.length&&m(this),this.props=e,this.context=r,this.refs=s,this.updater=i||n,this.state=null;var o=this.getInitialState?this.getInitialState():null;u(\"object\"==typeof o&&!Array.isArray(o),\"%s.getInitialState(): must return an object or null\",t.displayName||\"ReactCompositeComponent\"),this.state=o});t.prototype=new w,t.prototype.constructor=t,t.prototype.__reactAutoBindPairs=[],y.forEach(o.bind(null,t)),o(t,b),o(t,e),t.getDefaultProps&&(t.defaultProps=t.getDefaultProps()),u(t.prototype.render,\"createClass(...): Class specification must implement a `render` method.\");for(var i in g)t.prototype[i]||(t.prototype[i]=null);return t}var y=[],g={mixins:\"DEFINE_MANY\",statics:\"DEFINE_MANY\",propTypes:\"DEFINE_MANY\",contextTypes:\"DEFINE_MANY\",childContextTypes:\"DEFINE_MANY\",getDefaultProps:\"DEFINE_MANY_MERGED\",getInitialState:\"DEFINE_MANY_MERGED\",getChildContext:\"DEFINE_MANY_MERGED\",render:\"DEFINE_ONCE\",componentWillMount:\"DEFINE_MANY\",componentDidMount:\"DEFINE_MANY\",componentWillReceiveProps:\"DEFINE_MANY\",shouldComponentUpdate:\"DEFINE_ONCE\",componentWillUpdate:\"DEFINE_MANY\",componentDidUpdate:\"DEFINE_MANY\",componentWillUnmount:\"DEFINE_MANY\",updateComponent:\"OVERRIDE_BASE\"},_={displayName:function(e,t){e.displayName=t},mixins:function(e,t){if(t)for(var n=0;n<t.length;n++)o(e,t[n])},childContextTypes:function(e,t){e.childContextTypes=a({},e.childContextTypes,t)},contextTypes:function(e,t){e.contextTypes=a({},e.contextTypes,t)},getDefaultProps:function(e,t){e.getDefaultProps?e.getDefaultProps=f(e.getDefaultProps,t):e.getDefaultProps=t},propTypes:function(e,t){e.propTypes=a({},e.propTypes,t)},statics:function(e,t){l(e,t)},autobind:function(){}},b={componentDidMount:function(){this.__isMounted=!0},componentWillUnmount:function(){this.__isMounted=!1}},x={replaceState:function(e,t){this.updater.enqueueReplaceState(this,e,t)},isMounted:function(){return!!this.__isMounted}},w=function(){};return a(w.prototype,e.prototype,x),v}var o,a=n(500),s=n(507),u=n(508),c=\"mixins\";o={},e.exports=i},function(e,t,n){\"use strict\";function r(e){return e&&e.__esModule?e:{default:e}}Object.defineProperty(t,\"__esModule\",{value:!0});var i=n(486),o=r(i),a=n(145),s=r(a),u=n(146),c=r(u),l=n(489),p=r(l),f=n(490),h=r(f),d=n(498),m=r(d),v=n(1015),y=r(v),g=n(168),_=function(){},b=function(e){function t(){var e,n,r,i;(0,s.default)(this,t);for(var a=arguments.length,u=Array(a),c=0;c<a;c++)u[c]=arguments[c];return n=r=(0,p.default)(this,(e=t.__proto__||(0,o.default)(t)).call.apply(e,[this].concat(u))),r.onChangeWrapper=function(e){return r.props.onChange(e.target.value)},i=n,(0,p.default)(r,i)}return(0,h.default)(t,e),(0,c.default)(t,[{key:\"componentDidMount\",value:function(){this.props.onChange(this.props.contentTypes.first())}},{key:\"render\",value:function(){var e=this.props,t=e.contentTypes,n=e.className,r=e.value;return t&&t.size?m.default.createElement(\"div\",{className:\"content-type-wrapper \"+(n||\"\")},m.default.createElement(\"select\",{className:\"content-type\",value:r,onChange:this.onChangeWrapper},t.map(function(e){return m.default.createElement(\"option\",{key:e,value:e},e)}).toArray())):null}}]),t}(m.default.Component);b.propTypes={contentTypes:d.PropTypes.oneOfType([y.default.list,y.default.set]),value:d.PropTypes.string,onChange:d.PropTypes.func,className:d.PropTypes.string},b.defaultProps={onChange:_,value:null,contentTypes:(0,g.fromJS)([\"application/json\"])},t.default=b},function(e,t,n){\"use strict\";function r(e){return e&&e.__esModule?e:{default:e}}Object.defineProperty(t,\"__esModule\",{value:!0}),t.OperationLink=void 0;var i=n(486),o=r(i),a=n(145),s=r(a),u=n(146),c=r(u),l=n(489),p=r(l),f=n(490),h=r(f),d=n(498),m=r(d),v=n(1066),y=function(e){function t(){var e;(0,s.default)(this,t);for(var n=arguments.length,r=Array(n),i=0;i<n;i++)r[i]=arguments[i];var a=(0,p.default)(this,(e=t.__proto__||(0,o.default)(t)).call.apply(e,[this].concat(r)));return a.setTagShown=a._setTagShown.bind(a),a}return(0,h.default)(t,e),(0,c.default)(t,[{key:\"_setTagShown\",value:function(e,t){this.props.layoutActions.show(e,t)}},{key:\"showOp\",value:function(e,t){var n=this.props.layoutActions;n.show(e,t)}},{key:\"render\",value:function(){var e=this.props,t=e.specSelectors,n=e.layoutSelectors,r=e.layoutActions,i=e.getComponent,o=t.taggedOperations(),a=i(\"Collapse\");return m.default.createElement(\"div\",null,m.default.createElement(\"h4\",{className:\"overview-title\"},\"Overview\"),o.map(function(e,t){var i=e.get(\"operations\"),o=[\"overview-tags\",t],s=n.isShown(o,!0),u=function(){return r.show(o,!s)};return m.default.createElement(\"div\",{key:\"overview-\"+t},m.default.createElement(\"h4\",{onClick:u,className:\"link overview-tag\"},\" \",s?\"-\":\"+\",t),m.default.createElement(a,{isOpened:s,animated:!0},i.map(function(e){var t=e.toObject(),i=t.path,o=t.method,a=t.id,s=\"operations\",u=a,c=n.isShown([s,u]);return m.default.createElement(g,{key:a,path:i,method:o,id:i+\"-\"+o,shown:c,showOpId:u,showOpIdPrefix:s,href:\"#operation-\"+u,onClick:r.show})}).toArray()))}).toArray(),o.size<1&&m.default.createElement(\"h3\",null,\" No operations defined in spec! \"))}}]),t}(m.default.Component);t.default=y,y.propTypes={layoutSelectors:d.PropTypes.object.isRequired,specSelectors:d.PropTypes.object.isRequired,layoutActions:d.PropTypes.object.isRequired,getComponent:d.PropTypes.func.isRequired};var g=t.OperationLink=function(e){function t(e){(0,s.default)(this,t);var n=(0,p.default)(this,(t.__proto__||(0,o.default)(t)).call(this,e));return n.onClick=n._onClick.bind(n),n}return(0,h.default)(t,e),(0,c.default)(t,[{key:\"_onClick\",value:function(){var e=this.props,t=e.showOpId,n=e.showOpIdPrefix,r=e.onClick,i=e.shown;r([n,t],!i)}},{key:\"render\",value:function(){var e=this.props,t=e.id,n=e.method,r=e.shown,i=e.href;return m.default.createElement(v.Link,{href:i,style:{fontWeight:r?\"bold\":\"normal\"},onClick:this.onClick,className:\"block opblock-link\"},m.default.createElement(\"div\",null,m.default.createElement(\"small\",{className:\"bold-label-\"+n},n.toUpperCase()),m.default.createElement(\"span\",{className:\"bold-label\"},t)))}}]),t}(m.default.Component);g.propTypes={href:d.PropTypes.string,onClick:d.PropTypes.func,id:d.PropTypes.string.isRequired,method:d.PropTypes.string.isRequired,shown:d.PropTypes.bool.isRequired,showOpId:d.PropTypes.string.isRequired,showOpIdPrefix:d.PropTypes.string.isRequired}},function(e,t,n){\"use strict\";function r(e){return e&&e.__esModule?e:{default:e}}function i(){for(var e=arguments.length,t=Array(e),n=0;n<e;n++)t[n]=arguments[n];return t.filter(function(e){return!!e}).join(\" \").trim()}Object.defineProperty(t,\"__esModule\",{value:!0}),t.Collapse=t.Link=t.Select=t.Input=t.TextArea=t.Button=t.Row=t.Col=t.Container=void 0;var o=n(446),a=r(o),s=n(447),u=r(s),c=n(486),l=r(c),p=n(145),f=r(p),h=n(146),d=r(h),m=n(489),v=r(m),y=n(490),g=r(y),_=n(498),b=r(_),x=n(1040),w=r(x),k=t.Container=function(e){function t(){return(0,f.default)(this,t),(0,v.default)(this,(t.__proto__||(0,l.default)(t)).apply(this,arguments))}return(0,g.default)(t,e),(0,d.default)(t,[{key:\"render\",value:function(){var e=this.props,t=e.fullscreen,n=e.full,r=(0,u.default)(e,[\"fullscreen\",\"full\"]);if(t)return b.default.createElement(\"section\",r);var o=\"swagger-container\"+(n?\"-full\":\"\");return b.default.createElement(\"section\",(0,a.default)({},r,{className:i(r.className,o)}))}}]),t}(b.default.Component);k.propTypes={fullscreen:_.PropTypes.bool,full:_.PropTypes.bool,className:_.PropTypes.string};var S={mobile:\"\",tablet:\"-tablet\",desktop:\"-desktop\",large:\"-hd\"},E=t.Col=function(e){function t(){return(0,f.default)(this,t),(0,v.default)(this,(t.__proto__||(0,l.default)(t)).apply(this,arguments))}return(0,g.default)(t,e),(0,d.default)(t,[{key:\"render\",value:function(){var e=this.props,t=e.hide,n=e.keepContents,r=(e.mobile,e.tablet,e.desktop,e.large,(0,u.default)(e,[\"hide\",\"keepContents\",\"mobile\",\"tablet\",\"desktop\",\"large\"]));if(t&&!n)return b.default.createElement(\"span\",null);var o=[];for(var s in S){var c=S[s];if(s in this.props){var l=this.props[s];if(l<1){o.push(\"none\"+c);continue}o.push(\"block\"+c),o.push(\"col-\"+l+c)}}var p=i.apply(void 0,[r.className].concat(o));return b.default.createElement(\"section\",(0,a.default)({},r,{style:{display:t?\"none\":null},className:p}))}}]),t}(b.default.Component);E.propTypes={hide:_.PropTypes.bool,keepContents:_.PropTypes.bool,mobile:_.PropTypes.number,tablet:_.PropTypes.number,desktop:_.PropTypes.number,large:_.PropTypes.number,className:_.PropTypes.string};var C=t.Row=function(e){function t(){return(0,f.default)(this,t),(0,v.default)(this,(t.__proto__||(0,l.default)(t)).apply(this,arguments))}return(0,g.default)(t,e),(0,d.default)(t,[{key:\"render\",value:function(){return b.default.createElement(\"div\",(0,a.default)({},this.props,{className:i(this.props.className,\"wrapper\")}))}}]),t}(b.default.Component);C.propTypes={className:_.PropTypes.string};var A=t.Button=function(e){function t(){return(0,f.default)(this,t),(0,v.default)(this,(t.__proto__||(0,l.default)(t)).apply(this,arguments))}return(0,g.default)(t,e),(0,d.default)(t,[{key:\"render\",value:function(){return b.default.createElement(\"button\",(0,a.default)({},this.props,{className:i(this.props.className,\"button\")}))}}]),t}(b.default.Component);A.propTypes={className:_.PropTypes.string},A.defaultProps={className:\"\"};var T=(t.TextArea=function(e){return b.default.createElement(\"textarea\",e)},t.Input=function(e){return b.default.createElement(\"input\",e)},t.Select=function(e){function t(e,n){(0,f.default)(this,t);var r=(0,v.default)(this,(t.__proto__||(0,l.default)(t)).call(this,e,n));D.call(r);var i=void 0;return i=void 0!==e.value?e.value:e.multiple?[\"\"]:\"\",r.state={value:i},r}return(0,g.default)(t,e),(0,d.default)(t,[{key:\"render\",value:function(){var e=this.props,t=e.allowedValues,n=e.multiple,r=e.allowEmptyValue,i=this.state.value.toJS?this.state.value.toJS():this.state.value;return b.default.createElement(\"select\",{multiple:n,value:i,onChange:this.onChange},r?b.default.createElement(\"option\",{value:\"\"},\"--\"):null,t.map(function(e,t){return b.default.createElement(\"option\",{key:t,value:String(e)},e)}))}}]),t}(b.default.Component));T.propTypes={allowedValues:_.PropTypes.array,value:_.PropTypes.any,onChange:_.PropTypes.func,multiple:_.PropTypes.bool,allowEmptyValue:_.PropTypes.bool},T.defaultProps={multiple:!1,allowEmptyValue:!0};var D=function(){var e=this;this.onChange=function(t){var n=e.props,r=n.onChange,i=n.multiple,o=[].slice.call(t.target.options),a=void 0;a=i?o.filter(function(e){return e.selected}).map(function(e){return e.value}):t.target.value,e.setState({value:a}),r&&r(a)}},M=t.Link=function(e){function t(){return(0,f.default)(this,t),(0,v.default)(this,(t.__proto__||(0,l.default)(t)).apply(this,arguments))}return(0,g.default)(t,e),(0,d.default)(t,[{key:\"render\",value:function(){return b.default.createElement(\"a\",(0,a.default)({},this.props,{className:i(this.props.className,\"link\")}))}}]),t}(b.default.Component);M.propTypes={className:_.PropTypes.string};var O=function(e){var t=e.children;return b.default.createElement(\"div\",{style:{height:\"auto\",border:\"none\",margin:0,padding:0}},\" \",t,\" \")};O.propTypes={children:_.PropTypes.node};var P=t.Collapse=function(e){function t(){return(0,f.default)(this,t),(0,v.default)(this,(t.__proto__||(0,l.default)(t)).apply(this,arguments))}return(0,g.default)(t,e),(0,d.default)(t,[{key:\"renderNotAnimated\",value:function(){return this.props.isOpened?b.default.createElement(O,null,this.props.children):b.default.createElement(\"noscript\",null)}},{key:\"render\",value:function(){var e=this.props,t=e.animated,n=e.isOpened,r=e.children;return t?(r=n?r:null,b.default.createElement(w.default,{isOpened:n},b.default.createElement(O,null,r))):this.renderNotAnimated()}}]),t}(b.default.Component);P.propTypes={isOpened:_.PropTypes.bool,children:_.PropTypes.node.isRequired,animated:_.PropTypes.bool},P.defaultProps={isOpened:!1,animated:!1}},function(e,t,n){\"use strict\";function r(e){return e&&e.__esModule?e:{default:e}}Object.defineProperty(t,\"__esModule\",{value:!0});var i=n(486),o=r(i),a=n(145),s=r(a),u=n(146),c=r(u),l=n(489),p=r(l),f=n(490),h=r(f),d=n(498),m=r(d),v=n(168),y=n(1015),g=r(y),_=function(e){function t(){return(0,s.default)(this,t),(0,p.default)(this,(t.__proto__||(0,o.default)(t)).apply(this,arguments))}return(0,h.default)(t,e),(0,c.default)(t,[{key:\"render\",value:function(){var e=this.props,t=e.host,n=e.basePath;return m.default.createElement(\"pre\",{className:\"base-url\"},\"[ Base url: \",t,n,\"]\")}}]),t}(m.default.Component);_.propTypes={host:d.PropTypes.string,basePath:d.PropTypes.string};var b=function(e){function t(){return(0,s.default)(this,t),(0,p.default)(this,(t.__proto__||(0,o.default)(t)).apply(this,arguments))}return(0,h.default)(t,e),(0,c.default)(t,[{key:\"render\",value:function(){var e=this.props.data,t=e.get(\"name\")||\"the developer\",n=e.get(\"url\"),r=e.get(\"email\");return m.default.createElement(\"div\",null,n&&m.default.createElement(\"div\",null,m.default.createElement(\"a\",{href:n,target:\"_blank\"},t,\" - Website\")),r&&m.default.createElement(\"a\",{href:\"mailto:\"+r},n?\"Send email to \"+t:\"Contact \"+t))}}]),t}(m.default.Component);b.propTypes={data:d.PropTypes.object};var x=function(e){function t(){return(0,s.default)(this,t),(0,p.default)(this,(t.__proto__||(0,o.default)(t)).apply(this,arguments))}return(0,h.default)(t,e),(0,c.default)(t,[{key:\"render\",value:function(){var e=this.props.license,t=e.get(\"name\")||\"License\",n=e.get(\"url\");return m.default.createElement(\"div\",null,n?m.default.createElement(\"a\",{target:\"_blank\",href:n},t):m.default.createElement(\"span\",null,t))}}]),t}(m.default.Component);x.propTypes={license:d.PropTypes.object};var w=function(e){function t(){return(0,s.default)(this,t),(0,p.default)(this,(t.__proto__||(0,o.default)(t)).apply(this,arguments))}return(0,h.default)(t,e),(0,c.default)(t,[{key:\"render\",value:function(){var e=this.props,t=e.info,n=e.url,r=e.host,i=e.basePath,o=e.getComponent,a=e.externalDocs,s=t.get(\"version\"),u=t.get(\"description\"),c=t.get(\"title\"),l=t.get(\"termsOfService\"),p=t.get(\"contact\"),f=t.get(\"license\"),h=(a||(0,v.fromJS)({})).toJS(),d=h.url,y=h.description,g=o(\"Markdown\");return m.default.createElement(\"div\",{className:\"info\"},m.default.createElement(\"hgroup\",{className:\"main\"},m.default.createElement(\"h2\",{className:\"title\"},c,s&&m.default.createElement(\"small\",null,m.default.createElement(\"pre\",{className:\"version\"},\" \",s,\" \"))),r||i?m.default.createElement(_,{host:r,basePath:i}):null,n&&m.default.createElement(\"a\",{target:\"_blank\",href:n},m.default.createElement(\"span\",{className:\"url\"},\" \",n,\" \"))),m.default.createElement(\"div\",{className:\"description\"},m.default.createElement(g,{source:u})),l&&m.default.createElement(\"div\",null,m.default.createElement(\"a\",{target:\"_blank\",href:l},\"Terms of service\")),p&&p.size?m.default.createElement(b,{data:p}):null,f&&f.size?m.default.createElement(x,{license:f}):null,d?m.default.createElement(\"a\",{target:\"_blank\",href:d},y||d):null)}}]),t}(m.default.Component);w.propTypes={info:d.PropTypes.object,url:d.PropTypes.string,host:d.PropTypes.string,basePath:d.PropTypes.string,externalDocs:g.default.map,getComponent:d.PropTypes.func.isRequired},t.default=w,w.propTypes={title:d.PropTypes.any,description:d.PropTypes.any,version:d.PropTypes.any,url:d.PropTypes.string}},function(e,t,n){\"use strict\";function r(e){return e&&e.__esModule?e:{default:e}}Object.defineProperty(t,\"__esModule\",{value:!0});var i=n(486),o=r(i),a=n(145),s=r(a),u=n(146),c=r(u),l=n(489),p=r(l),f=n(490),h=r(f),d=n(498),m=r(d),v=function(e){function t(){return(0,s.default)(this,t),(0,p.default)(this,(t.__proto__||(0,o.default)(t)).apply(this,arguments))}return(0,h.default)(t,e),(0,c.default)(t,[{key:\"render\",value:function(){return m.default.createElement(\"div\",{className:\"footer\"})}}]),t}(m.default.Component);t.default=v},function(e,t,n){\"use strict\";function r(e){return e&&e.__esModule?e:{default:e}}Object.defineProperty(t,\"__esModule\",{value:!0});var i=n(486),o=r(i),a=n(145),s=r(a),u=n(146),c=r(u),l=n(489),p=r(l),f=n(490),h=r(f),d=n(498),m=r(d),v=n(1027),y=r(v),g=n(168),_=n(183),b=Function.prototype,x=function(e){function t(e,n){(0,s.default)(this,t);var r=(0,p.default)(this,(t.__proto__||(0,o.default)(t)).call(this,e,n));return w.call(r),r.state={isEditBox:!1,value:\"\"},r}return(0,h.default)(t,e),(0,c.default)(t,[{key:\"componentDidMount\",value:function(){this.updateValues.call(this,this.props)}},{key:\"shouldComponentUpdate\",value:function(e,t){return(0,y.default)(this,e,t)}},{key:\"componentWillReceiveProps\",value:function(e){this.updateValues.call(this,e)}},{key:\"render\",value:function(){var e=this.props,n=e.onChangeConsumes,r=e.param,i=e.isExecute,o=e.specSelectors,a=e.pathMethod,s=e.getComponent,u=s(\"Button\"),c=s(\"TextArea\"),l=s(\"highlightCode\"),p=s(\"contentType\"),f=o?o.getParameter(a,r.get(\"name\")):r,h=f.get(\"errors\",(0,g.List)()),d=o.contentTypeValues(a).get(\"requestContentType\"),v=this.props.consumes&&this.props.consumes.size?this.props.consumes:t.defaultProp.consumes,y=this.state,_=y.value,b=y.isEditBox;return m.default.createElement(\"div\",{className:\"body-param\"},b&&i?m.default.createElement(c,{className:\"body-param__text\"+(h.count()?\" invalid\":\"\"),value:_,onChange:this.handleOnChange}):_&&m.default.createElement(l,{className:\"body-param__example\",value:_}),m.default.createElement(\"div\",{className:\"body-param-options\"},i?m.default.createElement(\"div\",{className:\"body-param-edit\"},m.default.createElement(u,{className:b?\"btn cancel body-param__example-edit\":\"btn edit body-param__example-edit\",onClick:this.toggleIsEditBox},b?\"Cancel\":\"Edit\")):null,m.default.createElement(\"label\",{htmlFor:\"\"},m.default.createElement(\"span\",null,\"Parameter content type\"),m.default.createElement(p,{value:d,contentTypes:v,onChange:n,className:\"body-param-content-type\"}))))}}]),t}(d.Component);x.propTypes={param:d.PropTypes.object,onChange:d.PropTypes.func,onChangeConsumes:d.PropTypes.func,consumes:d.PropTypes.object,consumesValue:d.PropTypes.string,fn:d.PropTypes.object.isRequired,getComponent:d.PropTypes.func.isRequired,isExecute:d.PropTypes.bool,specSelectors:d.PropTypes.object.isRequired,pathMethod:d.PropTypes.array.isRequired},x.defaultProp={consumes:(0,g.fromJS)([\"application/json\"]),param:(0,g.fromJS)({}),onChange:b,onChangeConsumes:b};var w=function(){var e=this;this.updateValues=function(t){var n=t.specSelectors,r=t.pathMethod,i=t.param,o=t.isExecute,a=t.consumesValue,s=void 0===a?\"\":a,u=n?n.getParameter(r,i.get(\"name\")):{},c=/xml/i.test(s),l=c?u.get(\"value_xml\"):u.get(\"value\");if(void 0!==l){var p=l||c?l:\"{}\";e.setState({value:p}),e.onChange(p,{isXml:c,isEditBox:o})}else c?e.onChange(e.sample(\"xml\"),{isXml:c,isEditBox:o}):e.onChange(e.sample(),{isEditBox:o})},this.sample=function(t){var n=e.props,r=n.param,i=n.fn.inferSchema,o=i(r.toJS());return(0,_.getSampleSchema)(o,t)},this.onChange=function(t,n){var r=n.isEditBox,i=n.isXml;e.setState({value:t,isEditBox:r}),e._onChange(t,i)},this._onChange=function(t,n){(e.props.onChange||b)(e.props.param,t,n)},this.handleOnChange=function(t){var n=e.props.consumesValue;e.onChange(t.target.value.trim(),{isXml:/xml/i.test(n)})},this.toggleIsEditBox=function(){return e.setState(function(e){return{isEditBox:!e.isEditBox}})}};t.default=x},function(e,t,n){\"use strict\";function r(e){return e&&e.__esModule?e:{default:e}}Object.defineProperty(t,\"__esModule\",{value:!0});var i=n(486),o=r(i),a=n(145),s=r(a),u=n(146),c=r(u),l=n(489),p=r(l),f=n(490),h=r(f),d=n(498),m=r(d),v=n(1071),y=r(v),g=function(e){function t(){return(0,s.default)(this,t),(0,p.default)(this,(t.__proto__||(0,o.default)(t)).apply(this,arguments))}return(0,h.default)(t,e),(0,c.default)(t,[{key:\"handleFocus\",value:function(e){e.target.select(),document.execCommand(\"copy\")}},{key:\"render\",value:function(){var e=this.props.request,t=(0,y.default)(e);return m.default.createElement(\"div\",null,m.default.createElement(\"h4\",null,\"Curl\"),m.default.createElement(\"div\",{className:\"copy-paste\"},m.default.createElement(\"textarea\",{onFocus:this.handleFocus,readOnly:\"true\",className:\"curl\",style:{whiteSpace:\"normal\"},value:t})))}}]),t}(m.default.Component);g.propTypes={request:d.PropTypes.object.isRequired},t.default=g},function(e,t,n){\"use strict\";function r(e){return e&&e.__esModule?e:{default:e}}function i(e){var t=[],n=\"\",r=e.get(\"headers\");if(t.push(\"curl\"),t.push(\"-X\",e.get(\"method\")),t.push('\"'+e.get(\"url\")+'\"'),r&&r.size){var i=!0,o=!1,s=void 0;try{for(var c,p=(0,l.default)(e.get(\"headers\").entries());!(i=(c=p.next()).done);i=!0){var h=c.value,d=(0,u.default)(h,2),m=d[0],v=d[1];n=v,t.push(\"-H \"),t.push('\"'+m+\": \"+v+'\"')}}catch(e){o=!0,s=e}finally{try{!i&&p.return&&p.return()}finally{if(o)throw s}}}if(e.get(\"body\"))if(\"multipart/form-data\"===n&&\"POST\"===e.get(\"method\")){var y=!0,g=!1,_=void 0;try{for(var b,x=(0,l.default)(e.get(\"body\").values());!(y=(b=x.next()).done);y=!0){var w=(0,u.default)(b.value,2),k=w[0],v=w[1];t.push(\"-F\"),v instanceof f.default.File?t.push('\"'+k+\"=@\"+v.name+\";type=\"+v.type+'\"'):t.push('\"'+k+\"=\"+v+'\"')}}catch(e){g=!0,_=e}finally{try{!y&&x.return&&x.return()}finally{if(g)throw _}}}else t.push(\"-d\"),t.push((0,a.default)(e.get(\"body\")).replace(/\\\\n/g,\"\"));return t.join(\" \")}Object.defineProperty(t,\"__esModule\",{value:!0});var o=n(57),a=r(o),s=n(184),u=r(s),c=n(178),l=r(c);t.default=i;var p=n(177),f=r(p)},function(e,t,n){\"use strict\";function r(e){return e&&e.__esModule?e:{default:e}}Object.defineProperty(t,\"__esModule\",{value:!0});var i=n(486),o=r(i),a=n(145),s=r(a),u=n(146),c=r(u),l=n(489),p=r(l),f=n(490),h=r(f),d=n(498),m=r(d),v=function(e){function t(){var e,n,r,i;(0,s.default)(this,t);for(var a=arguments.length,u=Array(a),c=0;c<a;c++)u[c]=arguments[c];return n=r=(0,p.default)(this,(e=t.__proto__||(0,o.default)(t)).call.apply(e,[this].concat(u))),r.onChange=function(e){r.setScheme(e.target.value)},r.setScheme=function(e){var t=r.props,n=t.path,i=t.method,o=t.specActions;o.setScheme(e,n,i)},i=n,(0,p.default)(r,i)}return(0,h.default)(t,e),(0,c.default)(t,[{key:\"componentWillMount\",value:function(){var e=this.props.schemes;this.setScheme(e.first())}},{key:\"render\",value:function(){var e=this.props.schemes;return m.default.createElement(\"label\",{htmlFor:\"schemes\"},m.default.createElement(\"span\",{className:\"schemes-title\"},\"Schemes\"),m.default.createElement(\"select\",{onChange:this.onChange},e.valueSeq().map(function(e){return m.default.createElement(\"option\",{value:e,key:e},e)}).toArray()))}}]),t}(m.default.Component);v.propTypes={specActions:d.PropTypes.object.isRequired,schemes:d.PropTypes.object.isRequired,path:d.PropTypes.string,method:d.PropTypes.string},t.default=v},function(e,t,n){\"use strict\";function r(e){return e&&e.__esModule?e:{default:e}}Object.defineProperty(t,\"__esModule\",{value:!0});var i=n(486),o=r(i),a=n(145),s=r(a),u=n(146),c=r(u),l=n(489),p=r(l),f=n(490),h=r(f),d=n(498),m=r(d),v=function(e){function t(e,n){(0,s.default)(this,t);var r=(0,p.default)(this,(t.__proto__||(0,o.default)(t)).call(this,e,n));return r.activeTab=function(e){var t=e.target.dataset.name;r.setState({activeTab:t})},r.state={activeTab:\"example\"},r}return(0,h.default)(t,e),(0,c.default)(t,[{key:\"render\",value:function(){var e=this.props,t=e.getComponent,n=e.specSelectors,r=e.schema,i=e.example,o=e.isExecute,a=t(\"model\");return m.default.createElement(\"div\",null,m.default.createElement(\"ul\",{className:\"tab\"},m.default.createElement(\"li\",{className:\"tabitem\"+(o||\"example\"===this.state.activeTab?\" active\":\"\")},m.default.createElement(\"a\",{className:\"tablinks\",\"data-name\":\"example\",onClick:this.activeTab},\"Example Value\")),m.default.createElement(\"li\",{className:\"tabitem\"+(o||\"model\"!==this.state.activeTab?\"\":\" active\")},m.default.createElement(\"a\",{className:\"tablinks\"+(o?\" inactive\":\"\"),\"data-name\":\"model\",onClick:this.activeTab},\"Model\"))),m.default.createElement(\"div\",null,(o||\"example\"===this.state.activeTab)&&i,!o&&\"model\"===this.state.activeTab&&m.default.createElement(a,{schema:r,getComponent:t,specSelectors:n,expandDepth:1})))}}]),t}(m.default.Component);v.propTypes={getComponent:d.PropTypes.func.isRequired,specSelectors:d.PropTypes.object.isRequired,schema:d.PropTypes.object.isRequired,example:d.PropTypes.any.isRequired,isExecute:d.PropTypes.bool},t.default=v},function(e,t,n){\"use strict\";function r(e){return e&&e.__esModule?e:{default:e}}Object.defineProperty(t,\"__esModule\",{value:!0});var i=n(446),o=r(i),a=n(184),s=r(a),u=n(447),c=r(u),l=n(486),p=r(l),f=n(145),h=r(f),d=n(146),m=r(d),v=n(489),y=r(v),g=n(490),_=r(g),b=n(498),x=r(b),w=n(1015),k=r(w),S=n(168),E=\"{\",C=\"}\",A={color:\"#999\",fontStyle:\"italic\"},T=function(e){var t=e.value,n=x.default.createElement(\"span\",null,\"Array [ \",t.count(),\" ]\");return x.default.createElement(\"span\",{className:\"prop-enum\"},\"Enum:\",x.default.createElement(\"br\",null),x.default.createElement(N,{collapsedContent:n},\"[ \",t.join(\", \"),\" ]\"))};T.propTypes={value:k.default.iterable};var D=function(e){function t(){return(0,h.default)(this,t),(0,y.default)(this,(t.__proto__||(0,p.default)(t)).apply(this,arguments))}return(0,_.default)(t,e),(0,m.default)(t,[{key:\"render\",value:function(){var e=this.props,t=e.schema,n=e.name,r=e.isRef,i=e.getComponent,a=e.depth,u=(0,c.default)(e,[\"schema\",\"name\",\"isRef\",\"getComponent\",\"depth\"]),l=this.props.expandDepth,p=i(\"JumpToPath\",!0),f=t.get(\"description\"),h=t.get(\"properties\"),d=t.get(\"additionalProperties\"),m=t.get(\"title\")||n,v=t.get(\"required\"),y=i(\"Markdown\"),g=function(e){var t=e.name;return x.default.createElement(\"span\",{className:\"model-jump-to-path\"},x.default.createElement(p,{path:\"definitions.\"+t}))},_=x.default.createElement(\"span\",null,x.default.createElement(\"span\",null,E),\"...\",x.default.createElement(\"span\",null,C),r?x.default.createElement(g,{name:n}):\"\");return x.default.createElement(\"span\",{className:\"model\"},m&&x.default.createElement(\"span\",{className:\"model-title\"},r&&t.get(\"$$ref\")&&x.default.createElement(\"span\",{className:\"model-hint\"},t.get(\"$$ref\")),x.default.createElement(\"span\",{className:\"model-title__text\"},m)),x.default.createElement(N,{collapsed:a>l,collapsedContent:_},x.default.createElement(\"span\",{className:\"brace-open object\"},E),r?x.default.createElement(g,{name:n}):null,x.default.createElement(\"span\",{className:\"inner-object\"},x.default.createElement(\"table\",{className:\"model\",style:{marginLeft:\"2em\"}},x.default.createElement(\"tbody\",null,f?x.default.createElement(\"tr\",{style:{color:\"#999\",fontStyle:\"italic\"}},x.default.createElement(\"td\",null,\"description:\"),x.default.createElement(\"td\",null,x.default.createElement(y,{source:f}))):null,h&&h.size?h.entrySeq().map(function(e){var t=(0,s.default)(e,2),r=t[0],c=t[1],l=S.List.isList(v)&&v.contains(r),p={verticalAlign:\"top\",paddingRight:\"0.2em\"};return l&&(p.fontWeight=\"bold\"),x.default.createElement(\"tr\",{key:r},x.default.createElement(\"td\",{style:p},r,\":\"),x.default.createElement(\"td\",{style:{verticalAlign:\"top\"}},x.default.createElement(P,(0,o.default)({key:\"object-\"+n+\"-\"+r+\"_\"+c},u,{required:l,getComponent:i,schema:c,depth:a+1}))))}).toArray():null,d&&d.size?x.default.createElement(\"tr\",null,x.default.createElement(\"td\",null,\"< * >:\"),x.default.createElement(\"td\",null,x.default.createElement(P,(0,o.default)({},u,{required:!1,getComponent:i,schema:d,depth:a+1})))):null))),x.default.createElement(\"span\",{className:\"brace-close\"},C)))}}]),t}(b.Component);D.propTypes={schema:b.PropTypes.object.isRequired,getComponent:b.PropTypes.func.isRequired,specSelectors:b.PropTypes.object.isRequired,name:b.PropTypes.string,isRef:b.PropTypes.bool,expandDepth:b.PropTypes.number,depth:b.PropTypes.number};var M=function(e){function t(){return(0,h.default)(this,t),(0,y.default)(this,(t.__proto__||(0,p.default)(t)).apply(this,arguments))}return(0,_.default)(t,e),(0,m.default)(t,[{key:\"render\",value:function(){var e=this.props,t=e.schema,n=e.getComponent,r=e.required;if(!t||!t.get)return x.default.createElement(\"div\",null);var i=t.get(\"type\"),o=t.get(\"format\"),a=t.get(\"xml\"),u=t.get(\"enum\"),c=t.get(\"description\"),l=t.filter(function(e,t){return[\"enum\",\"type\",\"format\",\"description\",\"$$ref\"].indexOf(t)===-1}),p=r?{fontWeight:\"bold\"}:{},f=n(\"Markdown\");return x.default.createElement(\"span\",{className:\"prop\"},x.default.createElement(\"span\",{className:\"prop-type\",style:p},i),\" \",r&&x.default.createElement(\"span\",{style:{color:\"red\"}},\"*\"),o&&x.default.createElement(\"span\",{className:\"prop-format\"},\"($\",o,\")\"),l.size?l.entrySeq().map(function(e){var t=(0,s.default)(e,2),n=t[0],r=t[1];return x.default.createElement(\"span\",{key:n+\"-\"+r,style:A},x.default.createElement(\"br\",null),n,\": \",String(r))}):null,c?x.default.createElement(f,{source:c}):null,a&&a.size?x.default.createElement(\"span\",null,x.default.createElement(\"br\",null),x.default.createElement(\"span\",{style:A},\"xml:\"),a.entrySeq().map(function(e){var t=(0,s.default)(e,2),n=t[0],r=t[1];return x.default.createElement(\"span\",{key:n+\"-\"+r,style:A},x.default.createElement(\"br\",null),\"   \",n,\": \",String(r))}).toArray()):null,u&&x.default.createElement(T,{value:u}))}}]),t}(b.Component);M.propTypes={schema:b.PropTypes.object.isRequired,getComponent:b.PropTypes.func.isRequired,required:b.PropTypes.bool};var O=function(e){function t(){return(0,h.default)(this,t),(0,y.default)(this,(t.__proto__||(0,p.default)(t)).apply(this,arguments))}return(0,_.default)(t,e),(0,m.default)(t,[{key:\"render\",value:function(){var e=this.props,t=e.required,n=e.schema,r=e.depth,i=e.expandDepth,a=n.get(\"items\"),u=n.filter(function(e,t){return[\"type\",\"items\",\"$$ref\"].indexOf(t)===-1});return x.default.createElement(\"span\",{className:\"model\"},x.default.createElement(\"span\",{className:\"model-title\"},x.default.createElement(\"span\",{className:\"model-title__text\"},n.get(\"title\"))),x.default.createElement(N,{collapsed:r>i,collapsedContent:\"[...]\"},\"[\",x.default.createElement(\"span\",null,x.default.createElement(P,(0,o.default)({},this.props,{schema:a,required:!1}))),\"]\",u.size?x.default.createElement(\"span\",null,u.entrySeq().map(function(e){var t=(0,s.default)(e,2),n=t[0],r=t[1];return x.default.createElement(\"span\",{key:n+\"-\"+r,style:A},x.default.createElement(\"br\",null),n+\":\",String(r))}),x.default.createElement(\"br\",null)):null),t&&x.default.createElement(\"span\",{style:{color:\"red\"}},\"*\"))}}]),t}(b.Component);O.propTypes={schema:b.PropTypes.object.isRequired,getComponent:b.PropTypes.func.isRequired,specSelectors:b.PropTypes.object.isRequired,name:b.PropTypes.string,required:b.PropTypes.bool,expandDepth:b.PropTypes.number,depth:b.PropTypes.number};var P=function(e){function t(){var e,n,r,i;(0,h.default)(this,t);for(var o=arguments.length,a=Array(o),s=0;s<o;s++)a[s]=arguments[s];return n=r=(0,y.default)(this,(e=t.__proto__||(0,p.default)(t)).call.apply(e,[this].concat(a))),r.getModelName=function(e){if(e.indexOf(\"#/definitions/\")!==-1)return e.replace(/^.*#\\/definitions\\//,\"\")},r.getRefSchema=function(e){var t=r.props.specSelectors;return t.findDefinition(e)},i=n,(0,y.default)(r,i)}return(0,_.default)(t,e),(0,m.default)(t,[{key:\"render\",value:function(){var e=this.props,t=e.schema,n=e.getComponent,r=e.required,i=e.name,a=e.isRef,s=t&&t.get(\"$$ref\"),u=s&&this.getModelName(s),c=void 0,l=void 0;switch(t&&(t.get(\"type\")||t.get(\"properties\"))?c=t:s&&(c=this.getRefSchema(u)),l=c&&c.get(\"type\"),!l&&c&&c.get(\"properties\")&&(l=\"object\"),l){case\"object\":return x.default.createElement(D,(0,o.default)({className:\"object\"},this.props,{schema:c,name:i||u,isRef:void 0!==a?a:!!s}));case\"array\":return x.default.createElement(O,(0,o.default)({className:\"array\"},this.props,{schema:c,required:r}));case\"string\":case\"number\":case\"integer\":case\"boolean\":default:return x.default.createElement(M,{\ngetComponent:n,schema:c,required:r})}}}]),t}(b.Component);P.propTypes={schema:b.PropTypes.object.isRequired,getComponent:b.PropTypes.func.isRequired,specSelectors:b.PropTypes.object.isRequired,name:b.PropTypes.string,isRef:b.PropTypes.bool,required:b.PropTypes.bool,expandDepth:b.PropTypes.number,depth:b.PropTypes.number};var I=function(e){function t(){return(0,h.default)(this,t),(0,y.default)(this,(t.__proto__||(0,p.default)(t)).apply(this,arguments))}return(0,_.default)(t,e),(0,m.default)(t,[{key:\"render\",value:function(){return x.default.createElement(\"div\",{className:\"model-box\"},x.default.createElement(P,(0,o.default)({},this.props,{depth:1,expandDepth:this.props.expandDepth||0})))}}]),t}(b.Component);I.propTypes={schema:b.PropTypes.object.isRequired,name:b.PropTypes.string,getComponent:b.PropTypes.func.isRequired,specSelectors:b.PropTypes.object.isRequired,expandDepth:b.PropTypes.number},t.default=I;var N=function(e){function t(e,n){(0,h.default)(this,t);var r=(0,y.default)(this,(t.__proto__||(0,p.default)(t)).call(this,e,n));r.toggleCollapsed=function(){r.setState({collapsed:!r.state.collapsed})};var i=r.props,o=i.collapsed,a=i.collapsedContent;return r.state={collapsed:void 0!==o?o:t.defaultProps.collapsed,collapsedContent:a||t.defaultProps.collapsedContent},r}return(0,_.default)(t,e),(0,m.default)(t,[{key:\"render\",value:function(){return x.default.createElement(\"span\",null,x.default.createElement(\"span\",{onClick:this.toggleCollapsed,style:{cursor:\"pointer\"}},x.default.createElement(\"span\",{className:\"model-toggle\"+(this.state.collapsed?\" collapsed\":\"\")})),this.state.collapsed?this.state.collapsedContent:this.props.children)}}]),t}(b.Component);N.propTypes={collapsedContent:b.PropTypes.any,collapsed:b.PropTypes.bool,children:b.PropTypes.any},N.defaultProps={collapsedContent:\"{...}\",collapsed:!0}},function(e,t,n){\"use strict\";function r(e){return e&&e.__esModule?e:{default:e}}Object.defineProperty(t,\"__esModule\",{value:!0});var i=n(184),o=r(i),a=n(486),s=r(a),u=n(145),c=r(u),l=n(146),p=r(l),f=n(489),h=r(f),d=n(490),m=r(d),v=n(498),y=r(v),g=function(e){function t(){return(0,c.default)(this,t),(0,h.default)(this,(t.__proto__||(0,s.default)(t)).apply(this,arguments))}return(0,m.default)(t,e),(0,p.default)(t,[{key:\"render\",value:function(){var e=this.props,t=e.specSelectors,n=e.getComponent,r=e.layoutSelectors,i=e.layoutActions,a=e.getConfigs,s=t.definitions(),u=a(),c=u.docExpansion,l=r.isShown(\"models\",\"full\"===c||\"list\"===c),p=n(\"model\"),f=n(\"Collapse\");return s.size?y.default.createElement(\"section\",{className:l?\"models is-open\":\"models\"},y.default.createElement(\"h4\",{onClick:function(){return i.show(\"models\",!l)}},y.default.createElement(\"span\",null,\"Models\"),y.default.createElement(\"svg\",{width:\"20\",height:\"20\"},y.default.createElement(\"use\",{xlinkHref:\"#large-arrow\"}))),y.default.createElement(f,{isOpened:l,animated:!0},s.entrySeq().map(function(e){var r=(0,o.default)(e,2),i=r[0],a=r[1];return y.default.createElement(\"div\",{className:\"model-container\",key:\"models-section-\"+i},y.default.createElement(p,{name:i,schema:a,isRef:!0,getComponent:n,specSelectors:t}))}).toArray())):null}}]),t}(v.Component);g.propTypes={getComponent:v.PropTypes.func,specSelectors:v.PropTypes.object,layoutSelectors:v.PropTypes.object,layoutActions:v.PropTypes.object,getConfigs:v.PropTypes.func.isRequired},t.default=g},function(e,t,n){\"use strict\";function r(e){return e&&e.__esModule?e:{default:e}}Object.defineProperty(t,\"__esModule\",{value:!0});var i=n(486),o=r(i),a=n(145),s=r(a),u=n(146),c=r(u),l=n(489),p=r(l),f=n(490),h=r(f),d=n(498),m=r(d),v=function(e){function t(){return(0,s.default)(this,t),(0,p.default)(this,(t.__proto__||(0,o.default)(t)).apply(this,arguments))}return(0,h.default)(t,e),(0,c.default)(t,[{key:\"render\",value:function(){var e=this.props,t=e.onTryoutClick,n=e.onCancelClick,r=e.enabled;return m.default.createElement(\"div\",{className:\"try-out\"},r?m.default.createElement(\"button\",{className:\"btn try-out__btn cancel\",onClick:t},\"Cancel\"):m.default.createElement(\"button\",{className:\"btn try-out__btn\",onClick:n},\"Try it out \"))}}]),t}(m.default.Component);v.propTypes={onTryoutClick:d.PropTypes.func,onCancelClick:d.PropTypes.func,enabled:d.PropTypes.bool},v.defaultProps={onTryoutClick:Function.prototype,onCancelClick:Function.prototype,enabled:!1},t.default=v},function(e,t,n){\"use strict\";function r(e){return e&&e.__esModule?e:{default:e}}function i(e){var t=e.source,n=(0,l.default)(t,p);return t&&n&&\"undefined\"!==n?a.default.createElement(u.default,{options:{html:!0,typographer:!0,linkify:!0,linkTarget:\"_blank\"},source:n}):null}Object.defineProperty(t,\"__esModule\",{value:!0});var o=n(498),a=r(o),s=n(1078),u=r(s),c=n(1140),l=r(c),p={textFilter:function(e){return e.replace(/&quot;/g,'\"')}};i.propTypes={source:o.PropTypes.string.isRequired},t.default=i},function(e,t,n){\"use strict\";var r=function(e){return e&&e.__esModule?e:{default:e}};Object.defineProperty(t,\"__esModule\",{value:!0});var i=n(498),o=r(i),a=n(1079),s=r(a),u=o.default.createClass({displayName:\"Remarkable\",getDefaultProps:function(){return{container:\"div\",options:{}}},render:function(){var e=this.props.container;return o.default.createElement(e,null,this.content())},componentWillUpdate:function(e,t){e.options!==this.props.options&&(this.md=new s.default(e.options))},content:function(){var e=this;return this.props.source?o.default.createElement(\"span\",{dangerouslySetInnerHTML:{__html:this.renderMarkdown(this.props.source)}}):o.default.Children.map(this.props.children,function(t){return\"string\"==typeof t?o.default.createElement(\"span\",{dangerouslySetInnerHTML:{__html:e.renderMarkdown(t)}}):t})},renderMarkdown:function(e){return this.md||(this.md=new s.default(this.props.options)),this.md.render(e)}});t.default=u,e.exports=t.default},function(e,t,n){\"use strict\";e.exports=n(1080)},function(e,t,n){\"use strict\";function r(e,t,n){this.src=t,this.env=n,this.options=e.options,this.tokens=[],this.inlineMode=!1,this.inline=e.inline,this.block=e.block,this.renderer=e.renderer,this.typographer=e.typographer}function i(e,t){\"string\"!=typeof e&&(t=e,e=\"default\"),this.inline=new c,this.block=new u,this.core=new s,this.renderer=new a,this.ruler=new l,this.options={},this.configure(p[e]),this.set(t||{})}var o=n(1081).assign,a=n(1083),s=n(1085),u=n(1103),c=n(1118),l=n(1086),p={default:n(1137),full:n(1138),commonmark:n(1139)};i.prototype.set=function(e){o(this.options,e)},i.prototype.configure=function(e){var t=this;if(!e)throw new Error(\"Wrong `remarkable` preset, check name/content\");e.options&&t.set(e.options),e.components&&Object.keys(e.components).forEach(function(n){e.components[n].rules&&t[n].ruler.enable(e.components[n].rules,!0)})},i.prototype.use=function(e,t){return e(this,t),this},i.prototype.parse=function(e,t){var n=new r(this,e,t);return this.core.process(n),n.tokens},i.prototype.render=function(e,t){return t=t||{},this.renderer.render(this.parse(e,t),this.options,t)},i.prototype.parseInline=function(e,t){var n=new r(this,e,t);return n.inlineMode=!0,this.core.process(n),n.tokens},i.prototype.renderInline=function(e,t){return t=t||{},this.renderer.render(this.parseInline(e,t),this.options,t)},e.exports=i,e.exports.utils=n(1081)},function(e,t,n){\"use strict\";function r(e){return Object.prototype.toString.call(e)}function i(e){return\"[object String]\"===r(e)}function o(e,t){return!!e&&d.call(e,t)}function a(e){var t=[].slice.call(arguments,1);return t.forEach(function(t){if(t){if(\"object\"!=typeof t)throw new TypeError(t+\"must be object\");Object.keys(t).forEach(function(n){e[n]=t[n]})}}),e}function s(e){return e.indexOf(\"\\\\\")<0?e:e.replace(m,\"$1\")}function u(e){return!(e>=55296&&e<=57343)&&(!(e>=64976&&e<=65007)&&(65535!==(65535&e)&&65534!==(65535&e)&&(!(e>=0&&e<=8)&&(11!==e&&(!(e>=14&&e<=31)&&(!(e>=127&&e<=159)&&!(e>1114111)))))))}function c(e){if(e>65535){e-=65536;var t=55296+(e>>10),n=56320+(1023&e);return String.fromCharCode(t,n)}return String.fromCharCode(e)}function l(e,t){var n=0;return o(g,t)?g[t]:35===t.charCodeAt(0)&&y.test(t)&&(n=\"x\"===t[1].toLowerCase()?parseInt(t.slice(2),16):parseInt(t.slice(1),10),u(n))?c(n):e}function p(e){return e.indexOf(\"&\")<0?e:e.replace(v,l)}function f(e){return x[e]}function h(e){return _.test(e)?e.replace(b,f):e}var d=Object.prototype.hasOwnProperty,m=/\\\\([\\\\!\"#$%&'()*+,.\\/:;<=>?@[\\]^_`{|}~-])/g,v=/&([a-z#][a-z0-9]{1,31});/gi,y=/^#((?:x[a-f0-9]{1,8}|[0-9]{1,8}))/i,g=n(1082),_=/[&<>\"]/,b=/[&<>\"]/g,x={\"&\":\"&amp;\",\"<\":\"&lt;\",\">\":\"&gt;\",'\"':\"&quot;\"};t.assign=a,t.isString=i,t.has=o,t.unescapeMd=s,t.isValidEntityCode=u,t.fromCodePoint=c,t.replaceEntities=p,t.escapeHtml=h},function(e,t){\"use strict\";e.exports={Aacute:\"Á\",aacute:\"á\",Abreve:\"Ă\",abreve:\"ă\",ac:\"∾\",acd:\"∿\",acE:\"∾̳\",Acirc:\"Â\",acirc:\"â\",acute:\"´\",Acy:\"А\",acy:\"а\",AElig:\"Æ\",aelig:\"æ\",af:\"⁡\",Afr:\"𝔄\",afr:\"𝔞\",Agrave:\"À\",agrave:\"à\",alefsym:\"ℵ\",aleph:\"ℵ\",Alpha:\"Α\",alpha:\"α\",Amacr:\"Ā\",amacr:\"ā\",amalg:\"⨿\",AMP:\"&\",amp:\"&\",And:\"⩓\",and:\"∧\",andand:\"⩕\",andd:\"⩜\",andslope:\"⩘\",andv:\"⩚\",ang:\"∠\",ange:\"⦤\",angle:\"∠\",angmsd:\"∡\",angmsdaa:\"⦨\",angmsdab:\"⦩\",angmsdac:\"⦪\",angmsdad:\"⦫\",angmsdae:\"⦬\",angmsdaf:\"⦭\",angmsdag:\"⦮\",angmsdah:\"⦯\",angrt:\"∟\",angrtvb:\"⊾\",angrtvbd:\"⦝\",angsph:\"∢\",angst:\"Å\",angzarr:\"⍼\",Aogon:\"Ą\",aogon:\"ą\",Aopf:\"𝔸\",aopf:\"𝕒\",ap:\"≈\",apacir:\"⩯\",apE:\"⩰\",ape:\"≊\",apid:\"≋\",apos:\"'\",ApplyFunction:\"⁡\",approx:\"≈\",approxeq:\"≊\",Aring:\"Å\",aring:\"å\",Ascr:\"𝒜\",ascr:\"𝒶\",Assign:\"≔\",ast:\"*\",asymp:\"≈\",asympeq:\"≍\",Atilde:\"Ã\",atilde:\"ã\",Auml:\"Ä\",auml:\"ä\",awconint:\"∳\",awint:\"⨑\",backcong:\"≌\",backepsilon:\"϶\",backprime:\"‵\",backsim:\"∽\",backsimeq:\"⋍\",Backslash:\"∖\",Barv:\"⫧\",barvee:\"⊽\",Barwed:\"⌆\",barwed:\"⌅\",barwedge:\"⌅\",bbrk:\"⎵\",bbrktbrk:\"⎶\",bcong:\"≌\",Bcy:\"Б\",bcy:\"б\",bdquo:\"„\",becaus:\"∵\",Because:\"∵\",because:\"∵\",bemptyv:\"⦰\",bepsi:\"϶\",bernou:\"ℬ\",Bernoullis:\"ℬ\",Beta:\"Β\",beta:\"β\",beth:\"ℶ\",between:\"≬\",Bfr:\"𝔅\",bfr:\"𝔟\",bigcap:\"⋂\",bigcirc:\"◯\",bigcup:\"⋃\",bigodot:\"⨀\",bigoplus:\"⨁\",bigotimes:\"⨂\",bigsqcup:\"⨆\",bigstar:\"★\",bigtriangledown:\"▽\",bigtriangleup:\"△\",biguplus:\"⨄\",bigvee:\"⋁\",bigwedge:\"⋀\",bkarow:\"⤍\",blacklozenge:\"⧫\",blacksquare:\"▪\",blacktriangle:\"▴\",blacktriangledown:\"▾\",blacktriangleleft:\"◂\",blacktriangleright:\"▸\",blank:\"␣\",blk12:\"▒\",blk14:\"░\",blk34:\"▓\",block:\"█\",bne:\"=⃥\",bnequiv:\"≡⃥\",bNot:\"⫭\",bnot:\"⌐\",Bopf:\"𝔹\",bopf:\"𝕓\",bot:\"⊥\",bottom:\"⊥\",bowtie:\"⋈\",boxbox:\"⧉\",boxDL:\"╗\",boxDl:\"╖\",boxdL:\"╕\",boxdl:\"┐\",boxDR:\"╔\",boxDr:\"╓\",boxdR:\"╒\",boxdr:\"┌\",boxH:\"═\",boxh:\"─\",boxHD:\"╦\",boxHd:\"╤\",boxhD:\"╥\",boxhd:\"┬\",boxHU:\"╩\",boxHu:\"╧\",boxhU:\"╨\",boxhu:\"┴\",boxminus:\"⊟\",boxplus:\"⊞\",boxtimes:\"⊠\",boxUL:\"╝\",boxUl:\"╜\",boxuL:\"╛\",boxul:\"┘\",boxUR:\"╚\",boxUr:\"╙\",boxuR:\"╘\",boxur:\"└\",boxV:\"║\",boxv:\"│\",boxVH:\"╬\",boxVh:\"╫\",boxvH:\"╪\",boxvh:\"┼\",boxVL:\"╣\",boxVl:\"╢\",boxvL:\"╡\",boxvl:\"┤\",boxVR:\"╠\",boxVr:\"╟\",boxvR:\"╞\",boxvr:\"├\",bprime:\"‵\",Breve:\"˘\",breve:\"˘\",brvbar:\"¦\",Bscr:\"ℬ\",bscr:\"𝒷\",bsemi:\"⁏\",bsim:\"∽\",bsime:\"⋍\",bsol:\"\\\\\",bsolb:\"⧅\",bsolhsub:\"⟈\",bull:\"•\",bullet:\"•\",bump:\"≎\",bumpE:\"⪮\",bumpe:\"≏\",Bumpeq:\"≎\",bumpeq:\"≏\",Cacute:\"Ć\",cacute:\"ć\",Cap:\"⋒\",cap:\"∩\",capand:\"⩄\",capbrcup:\"⩉\",capcap:\"⩋\",capcup:\"⩇\",capdot:\"⩀\",CapitalDifferentialD:\"ⅅ\",caps:\"∩︀\",caret:\"⁁\",caron:\"ˇ\",Cayleys:\"ℭ\",ccaps:\"⩍\",Ccaron:\"Č\",ccaron:\"č\",Ccedil:\"Ç\",ccedil:\"ç\",Ccirc:\"Ĉ\",ccirc:\"ĉ\",Cconint:\"∰\",ccups:\"⩌\",ccupssm:\"⩐\",Cdot:\"Ċ\",cdot:\"ċ\",cedil:\"¸\",Cedilla:\"¸\",cemptyv:\"⦲\",cent:\"¢\",CenterDot:\"·\",centerdot:\"·\",Cfr:\"ℭ\",cfr:\"𝔠\",CHcy:\"Ч\",chcy:\"ч\",check:\"✓\",checkmark:\"✓\",Chi:\"Χ\",chi:\"χ\",cir:\"○\",circ:\"ˆ\",circeq:\"≗\",circlearrowleft:\"↺\",circlearrowright:\"↻\",circledast:\"⊛\",circledcirc:\"⊚\",circleddash:\"⊝\",CircleDot:\"⊙\",circledR:\"®\",circledS:\"Ⓢ\",CircleMinus:\"⊖\",CirclePlus:\"⊕\",CircleTimes:\"⊗\",cirE:\"⧃\",cire:\"≗\",cirfnint:\"⨐\",cirmid:\"⫯\",cirscir:\"⧂\",ClockwiseContourIntegral:\"∲\",CloseCurlyDoubleQuote:\"”\",CloseCurlyQuote:\"’\",clubs:\"♣\",clubsuit:\"♣\",Colon:\"∷\",colon:\":\",Colone:\"⩴\",colone:\"≔\",coloneq:\"≔\",comma:\",\",commat:\"@\",comp:\"∁\",compfn:\"∘\",complement:\"∁\",complexes:\"ℂ\",cong:\"≅\",congdot:\"⩭\",Congruent:\"≡\",Conint:\"∯\",conint:\"∮\",ContourIntegral:\"∮\",Copf:\"ℂ\",copf:\"𝕔\",coprod:\"∐\",Coproduct:\"∐\",COPY:\"©\",copy:\"©\",copysr:\"℗\",CounterClockwiseContourIntegral:\"∳\",crarr:\"↵\",Cross:\"⨯\",cross:\"✗\",Cscr:\"𝒞\",cscr:\"𝒸\",csub:\"⫏\",csube:\"⫑\",csup:\"⫐\",csupe:\"⫒\",ctdot:\"⋯\",cudarrl:\"⤸\",cudarrr:\"⤵\",cuepr:\"⋞\",cuesc:\"⋟\",cularr:\"↶\",cularrp:\"⤽\",Cup:\"⋓\",cup:\"∪\",cupbrcap:\"⩈\",CupCap:\"≍\",cupcap:\"⩆\",cupcup:\"⩊\",cupdot:\"⊍\",cupor:\"⩅\",cups:\"∪︀\",curarr:\"↷\",curarrm:\"⤼\",curlyeqprec:\"⋞\",curlyeqsucc:\"⋟\",curlyvee:\"⋎\",curlywedge:\"⋏\",curren:\"¤\",curvearrowleft:\"↶\",curvearrowright:\"↷\",cuvee:\"⋎\",cuwed:\"⋏\",cwconint:\"∲\",cwint:\"∱\",cylcty:\"⌭\",Dagger:\"‡\",dagger:\"†\",daleth:\"ℸ\",Darr:\"↡\",dArr:\"⇓\",darr:\"↓\",dash:\"‐\",Dashv:\"⫤\",dashv:\"⊣\",dbkarow:\"⤏\",dblac:\"˝\",Dcaron:\"Ď\",dcaron:\"ď\",Dcy:\"Д\",dcy:\"д\",DD:\"ⅅ\",dd:\"ⅆ\",ddagger:\"‡\",ddarr:\"⇊\",DDotrahd:\"⤑\",ddotseq:\"⩷\",deg:\"°\",Del:\"∇\",Delta:\"Δ\",delta:\"δ\",demptyv:\"⦱\",dfisht:\"⥿\",Dfr:\"𝔇\",dfr:\"𝔡\",dHar:\"⥥\",dharl:\"⇃\",dharr:\"⇂\",DiacriticalAcute:\"´\",DiacriticalDot:\"˙\",DiacriticalDoubleAcute:\"˝\",DiacriticalGrave:\"`\",DiacriticalTilde:\"˜\",diam:\"⋄\",Diamond:\"⋄\",diamond:\"⋄\",diamondsuit:\"♦\",diams:\"♦\",die:\"¨\",DifferentialD:\"ⅆ\",digamma:\"ϝ\",disin:\"⋲\",div:\"÷\",divide:\"÷\",divideontimes:\"⋇\",divonx:\"⋇\",DJcy:\"Ђ\",djcy:\"ђ\",dlcorn:\"⌞\",dlcrop:\"⌍\",dollar:\"$\",Dopf:\"𝔻\",dopf:\"𝕕\",Dot:\"¨\",dot:\"˙\",DotDot:\"⃜\",doteq:\"≐\",doteqdot:\"≑\",DotEqual:\"≐\",dotminus:\"∸\",dotplus:\"∔\",dotsquare:\"⊡\",doublebarwedge:\"⌆\",DoubleContourIntegral:\"∯\",DoubleDot:\"¨\",DoubleDownArrow:\"⇓\",DoubleLeftArrow:\"⇐\",DoubleLeftRightArrow:\"⇔\",DoubleLeftTee:\"⫤\",DoubleLongLeftArrow:\"⟸\",DoubleLongLeftRightArrow:\"⟺\",DoubleLongRightArrow:\"⟹\",DoubleRightArrow:\"⇒\",DoubleRightTee:\"⊨\",DoubleUpArrow:\"⇑\",DoubleUpDownArrow:\"⇕\",DoubleVerticalBar:\"∥\",DownArrow:\"↓\",Downarrow:\"⇓\",downarrow:\"↓\",DownArrowBar:\"⤓\",DownArrowUpArrow:\"⇵\",DownBreve:\"̑\",downdownarrows:\"⇊\",downharpoonleft:\"⇃\",downharpoonright:\"⇂\",DownLeftRightVector:\"⥐\",DownLeftTeeVector:\"⥞\",DownLeftVector:\"↽\",DownLeftVectorBar:\"⥖\",DownRightTeeVector:\"⥟\",DownRightVector:\"⇁\",DownRightVectorBar:\"⥗\",DownTee:\"⊤\",DownTeeArrow:\"↧\",drbkarow:\"⤐\",drcorn:\"⌟\",drcrop:\"⌌\",Dscr:\"𝒟\",dscr:\"𝒹\",DScy:\"Ѕ\",dscy:\"ѕ\",dsol:\"⧶\",Dstrok:\"Đ\",dstrok:\"đ\",dtdot:\"⋱\",dtri:\"▿\",dtrif:\"▾\",duarr:\"⇵\",duhar:\"⥯\",dwangle:\"⦦\",DZcy:\"Џ\",dzcy:\"џ\",dzigrarr:\"⟿\",Eacute:\"É\",eacute:\"é\",easter:\"⩮\",Ecaron:\"Ě\",ecaron:\"ě\",ecir:\"≖\",Ecirc:\"Ê\",ecirc:\"ê\",ecolon:\"≕\",Ecy:\"Э\",ecy:\"э\",eDDot:\"⩷\",Edot:\"Ė\",eDot:\"≑\",edot:\"ė\",ee:\"ⅇ\",efDot:\"≒\",Efr:\"𝔈\",efr:\"𝔢\",eg:\"⪚\",Egrave:\"È\",egrave:\"è\",egs:\"⪖\",egsdot:\"⪘\",el:\"⪙\",Element:\"∈\",elinters:\"⏧\",ell:\"ℓ\",els:\"⪕\",elsdot:\"⪗\",Emacr:\"Ē\",emacr:\"ē\",empty:\"∅\",emptyset:\"∅\",EmptySmallSquare:\"◻\",emptyv:\"∅\",EmptyVerySmallSquare:\"▫\",emsp:\" \",emsp13:\" \",emsp14:\" \",ENG:\"Ŋ\",eng:\"ŋ\",ensp:\" \",Eogon:\"Ę\",eogon:\"ę\",Eopf:\"𝔼\",eopf:\"𝕖\",epar:\"⋕\",eparsl:\"⧣\",eplus:\"⩱\",epsi:\"ε\",Epsilon:\"Ε\",epsilon:\"ε\",epsiv:\"ϵ\",eqcirc:\"≖\",eqcolon:\"≕\",eqsim:\"≂\",eqslantgtr:\"⪖\",eqslantless:\"⪕\",Equal:\"⩵\",equals:\"=\",EqualTilde:\"≂\",equest:\"≟\",Equilibrium:\"⇌\",equiv:\"≡\",equivDD:\"⩸\",eqvparsl:\"⧥\",erarr:\"⥱\",erDot:\"≓\",Escr:\"ℰ\",escr:\"ℯ\",esdot:\"≐\",Esim:\"⩳\",esim:\"≂\",Eta:\"Η\",eta:\"η\",ETH:\"Ð\",eth:\"ð\",Euml:\"Ë\",euml:\"ë\",euro:\"€\",excl:\"!\",exist:\"∃\",Exists:\"∃\",expectation:\"ℰ\",ExponentialE:\"ⅇ\",exponentiale:\"ⅇ\",fallingdotseq:\"≒\",Fcy:\"Ф\",fcy:\"ф\",female:\"♀\",ffilig:\"ﬃ\",fflig:\"ﬀ\",ffllig:\"ﬄ\",Ffr:\"𝔉\",ffr:\"𝔣\",filig:\"ﬁ\",FilledSmallSquare:\"◼\",FilledVerySmallSquare:\"▪\",fjlig:\"fj\",flat:\"♭\",fllig:\"ﬂ\",fltns:\"▱\",fnof:\"ƒ\",Fopf:\"𝔽\",fopf:\"𝕗\",ForAll:\"∀\",forall:\"∀\",fork:\"⋔\",forkv:\"⫙\",Fouriertrf:\"ℱ\",fpartint:\"⨍\",frac12:\"½\",frac13:\"⅓\",frac14:\"¼\",frac15:\"⅕\",frac16:\"⅙\",frac18:\"⅛\",frac23:\"⅔\",frac25:\"⅖\",frac34:\"¾\",frac35:\"⅗\",frac38:\"⅜\",frac45:\"⅘\",frac56:\"⅚\",frac58:\"⅝\",frac78:\"⅞\",frasl:\"⁄\",frown:\"⌢\",Fscr:\"ℱ\",fscr:\"𝒻\",gacute:\"ǵ\",Gamma:\"Γ\",gamma:\"γ\",Gammad:\"Ϝ\",gammad:\"ϝ\",gap:\"⪆\",Gbreve:\"Ğ\",gbreve:\"ğ\",Gcedil:\"Ģ\",Gcirc:\"Ĝ\",gcirc:\"ĝ\",Gcy:\"Г\",gcy:\"г\",Gdot:\"Ġ\",gdot:\"ġ\",gE:\"≧\",ge:\"≥\",gEl:\"⪌\",gel:\"⋛\",geq:\"≥\",geqq:\"≧\",geqslant:\"⩾\",ges:\"⩾\",gescc:\"⪩\",gesdot:\"⪀\",gesdoto:\"⪂\",gesdotol:\"⪄\",gesl:\"⋛︀\",gesles:\"⪔\",Gfr:\"𝔊\",gfr:\"𝔤\",Gg:\"⋙\",gg:\"≫\",ggg:\"⋙\",gimel:\"ℷ\",GJcy:\"Ѓ\",gjcy:\"ѓ\",gl:\"≷\",gla:\"⪥\",glE:\"⪒\",glj:\"⪤\",gnap:\"⪊\",gnapprox:\"⪊\",gnE:\"≩\",gne:\"⪈\",gneq:\"⪈\",gneqq:\"≩\",gnsim:\"⋧\",Gopf:\"𝔾\",gopf:\"𝕘\",grave:\"`\",GreaterEqual:\"≥\",GreaterEqualLess:\"⋛\",GreaterFullEqual:\"≧\",GreaterGreater:\"⪢\",GreaterLess:\"≷\",GreaterSlantEqual:\"⩾\",GreaterTilde:\"≳\",Gscr:\"𝒢\",gscr:\"ℊ\",gsim:\"≳\",gsime:\"⪎\",gsiml:\"⪐\",GT:\">\",Gt:\"≫\",gt:\">\",gtcc:\"⪧\",gtcir:\"⩺\",gtdot:\"⋗\",gtlPar:\"⦕\",gtquest:\"⩼\",gtrapprox:\"⪆\",gtrarr:\"⥸\",gtrdot:\"⋗\",gtreqless:\"⋛\",gtreqqless:\"⪌\",gtrless:\"≷\",gtrsim:\"≳\",gvertneqq:\"≩︀\",gvnE:\"≩︀\",Hacek:\"ˇ\",hairsp:\" \",half:\"½\",hamilt:\"ℋ\",HARDcy:\"Ъ\",hardcy:\"ъ\",hArr:\"⇔\",harr:\"↔\",harrcir:\"⥈\",harrw:\"↭\",Hat:\"^\",hbar:\"ℏ\",Hcirc:\"Ĥ\",hcirc:\"ĥ\",hearts:\"♥\",heartsuit:\"♥\",hellip:\"…\",hercon:\"⊹\",Hfr:\"ℌ\",hfr:\"𝔥\",HilbertSpace:\"ℋ\",hksearow:\"⤥\",hkswarow:\"⤦\",hoarr:\"⇿\",homtht:\"∻\",hookleftarrow:\"↩\",hookrightarrow:\"↪\",Hopf:\"ℍ\",hopf:\"𝕙\",horbar:\"―\",HorizontalLine:\"─\",Hscr:\"ℋ\",hscr:\"𝒽\",hslash:\"ℏ\",Hstrok:\"Ħ\",hstrok:\"ħ\",HumpDownHump:\"≎\",HumpEqual:\"≏\",hybull:\"⁃\",hyphen:\"‐\",Iacute:\"Í\",iacute:\"í\",ic:\"⁣\",Icirc:\"Î\",icirc:\"î\",Icy:\"И\",icy:\"и\",Idot:\"İ\",IEcy:\"Е\",iecy:\"е\",iexcl:\"¡\",iff:\"⇔\",Ifr:\"ℑ\",ifr:\"𝔦\",Igrave:\"Ì\",igrave:\"ì\",ii:\"ⅈ\",iiiint:\"⨌\",iiint:\"∭\",iinfin:\"⧜\",iiota:\"℩\",IJlig:\"Ĳ\",ijlig:\"ĳ\",Im:\"ℑ\",Imacr:\"Ī\",imacr:\"ī\",image:\"ℑ\",ImaginaryI:\"ⅈ\",imagline:\"ℐ\",imagpart:\"ℑ\",imath:\"ı\",imof:\"⊷\",imped:\"Ƶ\",Implies:\"⇒\",in:\"∈\",incare:\"℅\",infin:\"∞\",infintie:\"⧝\",inodot:\"ı\",Int:\"∬\",int:\"∫\",intcal:\"⊺\",integers:\"ℤ\",Integral:\"∫\",intercal:\"⊺\",Intersection:\"⋂\",intlarhk:\"⨗\",intprod:\"⨼\",InvisibleComma:\"⁣\",InvisibleTimes:\"⁢\",IOcy:\"Ё\",iocy:\"ё\",Iogon:\"Į\",iogon:\"į\",Iopf:\"𝕀\",iopf:\"𝕚\",Iota:\"Ι\",iota:\"ι\",iprod:\"⨼\",iquest:\"¿\",Iscr:\"ℐ\",iscr:\"𝒾\",isin:\"∈\",isindot:\"⋵\",isinE:\"⋹\",isins:\"⋴\",isinsv:\"⋳\",isinv:\"∈\",it:\"⁢\",Itilde:\"Ĩ\",itilde:\"ĩ\",Iukcy:\"І\",iukcy:\"і\",Iuml:\"Ï\",iuml:\"ï\",Jcirc:\"Ĵ\",jcirc:\"ĵ\",Jcy:\"Й\",jcy:\"й\",Jfr:\"𝔍\",jfr:\"𝔧\",jmath:\"ȷ\",Jopf:\"𝕁\",jopf:\"𝕛\",Jscr:\"𝒥\",jscr:\"𝒿\",Jsercy:\"Ј\",jsercy:\"ј\",Jukcy:\"Є\",jukcy:\"є\",Kappa:\"Κ\",kappa:\"κ\",kappav:\"ϰ\",Kcedil:\"Ķ\",kcedil:\"ķ\",Kcy:\"К\",kcy:\"к\",Kfr:\"𝔎\",kfr:\"𝔨\",kgreen:\"ĸ\",KHcy:\"Х\",khcy:\"х\",KJcy:\"Ќ\",kjcy:\"ќ\",Kopf:\"𝕂\",kopf:\"𝕜\",Kscr:\"𝒦\",kscr:\"𝓀\",lAarr:\"⇚\",Lacute:\"Ĺ\",lacute:\"ĺ\",laemptyv:\"⦴\",lagran:\"ℒ\",Lambda:\"Λ\",lambda:\"λ\",Lang:\"⟪\",lang:\"⟨\",langd:\"⦑\",langle:\"⟨\",lap:\"⪅\",Laplacetrf:\"ℒ\",laquo:\"«\",Larr:\"↞\",lArr:\"⇐\",larr:\"←\",larrb:\"⇤\",larrbfs:\"⤟\",larrfs:\"⤝\",larrhk:\"↩\",larrlp:\"↫\",larrpl:\"⤹\",larrsim:\"⥳\",larrtl:\"↢\",lat:\"⪫\",lAtail:\"⤛\",latail:\"⤙\",late:\"⪭\",lates:\"⪭︀\",lBarr:\"⤎\",lbarr:\"⤌\",lbbrk:\"❲\",lbrace:\"{\",lbrack:\"[\",lbrke:\"⦋\",lbrksld:\"⦏\",lbrkslu:\"⦍\",Lcaron:\"Ľ\",lcaron:\"ľ\",Lcedil:\"Ļ\",lcedil:\"ļ\",lceil:\"⌈\",lcub:\"{\",Lcy:\"Л\",lcy:\"л\",ldca:\"⤶\",ldquo:\"“\",ldquor:\"„\",ldrdhar:\"⥧\",ldrushar:\"⥋\",ldsh:\"↲\",lE:\"≦\",le:\"≤\",LeftAngleBracket:\"⟨\",LeftArrow:\"←\",Leftarrow:\"⇐\",leftarrow:\"←\",LeftArrowBar:\"⇤\",LeftArrowRightArrow:\"⇆\",leftarrowtail:\"↢\",LeftCeiling:\"⌈\",LeftDoubleBracket:\"⟦\",LeftDownTeeVector:\"⥡\",LeftDownVector:\"⇃\",LeftDownVectorBar:\"⥙\",LeftFloor:\"⌊\",leftharpoondown:\"↽\",leftharpoonup:\"↼\",leftleftarrows:\"⇇\",LeftRightArrow:\"↔\",Leftrightarrow:\"⇔\",leftrightarrow:\"↔\",leftrightarrows:\"⇆\",leftrightharpoons:\"⇋\",leftrightsquigarrow:\"↭\",LeftRightVector:\"⥎\",LeftTee:\"⊣\",LeftTeeArrow:\"↤\",LeftTeeVector:\"⥚\",leftthreetimes:\"⋋\",LeftTriangle:\"⊲\",LeftTriangleBar:\"⧏\",LeftTriangleEqual:\"⊴\",LeftUpDownVector:\"⥑\",LeftUpTeeVector:\"⥠\",LeftUpVector:\"↿\",LeftUpVectorBar:\"⥘\",LeftVector:\"↼\",LeftVectorBar:\"⥒\",lEg:\"⪋\",leg:\"⋚\",leq:\"≤\",leqq:\"≦\",leqslant:\"⩽\",les:\"⩽\",lescc:\"⪨\",lesdot:\"⩿\",lesdoto:\"⪁\",lesdotor:\"⪃\",lesg:\"⋚︀\",lesges:\"⪓\",lessapprox:\"⪅\",lessdot:\"⋖\",lesseqgtr:\"⋚\",lesseqqgtr:\"⪋\",LessEqualGreater:\"⋚\",LessFullEqual:\"≦\",LessGreater:\"≶\",lessgtr:\"≶\",LessLess:\"⪡\",lesssim:\"≲\",LessSlantEqual:\"⩽\",LessTilde:\"≲\",lfisht:\"⥼\",lfloor:\"⌊\",Lfr:\"𝔏\",lfr:\"𝔩\",lg:\"≶\",lgE:\"⪑\",lHar:\"⥢\",lhard:\"↽\",lharu:\"↼\",lharul:\"⥪\",lhblk:\"▄\",LJcy:\"Љ\",ljcy:\"љ\",Ll:\"⋘\",ll:\"≪\",llarr:\"⇇\",llcorner:\"⌞\",Lleftarrow:\"⇚\",llhard:\"⥫\",lltri:\"◺\",Lmidot:\"Ŀ\",lmidot:\"ŀ\",lmoust:\"⎰\",lmoustache:\"⎰\",lnap:\"⪉\",lnapprox:\"⪉\",lnE:\"≨\",lne:\"⪇\",lneq:\"⪇\",lneqq:\"≨\",lnsim:\"⋦\",loang:\"⟬\",loarr:\"⇽\",lobrk:\"⟦\",LongLeftArrow:\"⟵\",Longleftarrow:\"⟸\",longleftarrow:\"⟵\",LongLeftRightArrow:\"⟷\",Longleftrightarrow:\"⟺\",longleftrightarrow:\"⟷\",longmapsto:\"⟼\",LongRightArrow:\"⟶\",Longrightarrow:\"⟹\",longrightarrow:\"⟶\",looparrowleft:\"↫\",looparrowright:\"↬\",lopar:\"⦅\",Lopf:\"𝕃\",lopf:\"𝕝\",loplus:\"⨭\",lotimes:\"⨴\",lowast:\"∗\",lowbar:\"_\",LowerLeftArrow:\"↙\",LowerRightArrow:\"↘\",loz:\"◊\",lozenge:\"◊\",lozf:\"⧫\",lpar:\"(\",lparlt:\"⦓\",lrarr:\"⇆\",lrcorner:\"⌟\",lrhar:\"⇋\",lrhard:\"⥭\",lrm:\"‎\",lrtri:\"⊿\",lsaquo:\"‹\",Lscr:\"ℒ\",lscr:\"𝓁\",Lsh:\"↰\",lsh:\"↰\",lsim:\"≲\",lsime:\"⪍\",lsimg:\"⪏\",lsqb:\"[\",lsquo:\"‘\",lsquor:\"‚\",Lstrok:\"Ł\",lstrok:\"ł\",LT:\"<\",Lt:\"≪\",lt:\"<\",ltcc:\"⪦\",ltcir:\"⩹\",ltdot:\"⋖\",lthree:\"⋋\",ltimes:\"⋉\",ltlarr:\"⥶\",ltquest:\"⩻\",ltri:\"◃\",ltrie:\"⊴\",ltrif:\"◂\",ltrPar:\"⦖\",lurdshar:\"⥊\",luruhar:\"⥦\",lvertneqq:\"≨︀\",lvnE:\"≨︀\",macr:\"¯\",male:\"♂\",malt:\"✠\",maltese:\"✠\",Map:\"⤅\",map:\"↦\",mapsto:\"↦\",mapstodown:\"↧\",mapstoleft:\"↤\",mapstoup:\"↥\",marker:\"▮\",mcomma:\"⨩\",Mcy:\"М\",mcy:\"м\",mdash:\"—\",mDDot:\"∺\",measuredangle:\"∡\",MediumSpace:\" \",Mellintrf:\"ℳ\",Mfr:\"𝔐\",mfr:\"𝔪\",mho:\"℧\",micro:\"µ\",mid:\"∣\",midast:\"*\",midcir:\"⫰\",middot:\"·\",minus:\"−\",minusb:\"⊟\",minusd:\"∸\",minusdu:\"⨪\",MinusPlus:\"∓\",mlcp:\"⫛\",mldr:\"…\",mnplus:\"∓\",models:\"⊧\",Mopf:\"𝕄\",mopf:\"𝕞\",mp:\"∓\",Mscr:\"ℳ\",mscr:\"𝓂\",mstpos:\"∾\",Mu:\"Μ\",mu:\"μ\",multimap:\"⊸\",mumap:\"⊸\",nabla:\"∇\",Nacute:\"Ń\",nacute:\"ń\",nang:\"∠⃒\",nap:\"≉\",napE:\"⩰̸\",napid:\"≋̸\",napos:\"ŉ\",napprox:\"≉\",natur:\"♮\",natural:\"♮\",naturals:\"ℕ\",nbsp:\" \",nbump:\"≎̸\",nbumpe:\"≏̸\",ncap:\"⩃\",Ncaron:\"Ň\",ncaron:\"ň\",Ncedil:\"Ņ\",ncedil:\"ņ\",ncong:\"≇\",ncongdot:\"⩭̸\",ncup:\"⩂\",Ncy:\"Н\",ncy:\"н\",ndash:\"–\",ne:\"≠\",nearhk:\"⤤\",neArr:\"⇗\",nearr:\"↗\",nearrow:\"↗\",nedot:\"≐̸\",NegativeMediumSpace:\"​\",NegativeThickSpace:\"​\",NegativeThinSpace:\"​\",NegativeVeryThinSpace:\"​\",nequiv:\"≢\",nesear:\"⤨\",nesim:\"≂̸\",NestedGreaterGreater:\"≫\",NestedLessLess:\"≪\",NewLine:\"\\n\",nexist:\"∄\",nexists:\"∄\",Nfr:\"𝔑\",nfr:\"𝔫\",ngE:\"≧̸\",nge:\"≱\",ngeq:\"≱\",ngeqq:\"≧̸\",ngeqslant:\"⩾̸\",nges:\"⩾̸\",nGg:\"⋙̸\",ngsim:\"≵\",nGt:\"≫⃒\",ngt:\"≯\",ngtr:\"≯\",nGtv:\"≫̸\",nhArr:\"⇎\",nharr:\"↮\",nhpar:\"⫲\",ni:\"∋\",nis:\"⋼\",nisd:\"⋺\",niv:\"∋\",NJcy:\"Њ\",njcy:\"њ\",nlArr:\"⇍\",nlarr:\"↚\",nldr:\"‥\",nlE:\"≦̸\",nle:\"≰\",nLeftarrow:\"⇍\",nleftarrow:\"↚\",nLeftrightarrow:\"⇎\",nleftrightarrow:\"↮\",nleq:\"≰\",nleqq:\"≦̸\",nleqslant:\"⩽̸\",nles:\"⩽̸\",nless:\"≮\",nLl:\"⋘̸\",nlsim:\"≴\",nLt:\"≪⃒\",nlt:\"≮\",nltri:\"⋪\",nltrie:\"⋬\",nLtv:\"≪̸\",nmid:\"∤\",NoBreak:\"⁠\",NonBreakingSpace:\" \",Nopf:\"ℕ\",nopf:\"𝕟\",Not:\"⫬\",not:\"¬\",NotCongruent:\"≢\",NotCupCap:\"≭\",NotDoubleVerticalBar:\"∦\",NotElement:\"∉\",NotEqual:\"≠\",NotEqualTilde:\"≂̸\",NotExists:\"∄\",NotGreater:\"≯\",NotGreaterEqual:\"≱\",NotGreaterFullEqual:\"≧̸\",NotGreaterGreater:\"≫̸\",NotGreaterLess:\"≹\",NotGreaterSlantEqual:\"⩾̸\",NotGreaterTilde:\"≵\",NotHumpDownHump:\"≎̸\",NotHumpEqual:\"≏̸\",notin:\"∉\",notindot:\"⋵̸\",notinE:\"⋹̸\",notinva:\"∉\",notinvb:\"⋷\",notinvc:\"⋶\",NotLeftTriangle:\"⋪\",NotLeftTriangleBar:\"⧏̸\",NotLeftTriangleEqual:\"⋬\",NotLess:\"≮\",NotLessEqual:\"≰\",NotLessGreater:\"≸\",NotLessLess:\"≪̸\",NotLessSlantEqual:\"⩽̸\",NotLessTilde:\"≴\",NotNestedGreaterGreater:\"⪢̸\",NotNestedLessLess:\"⪡̸\",notni:\"∌\",notniva:\"∌\",notnivb:\"⋾\",notnivc:\"⋽\",NotPrecedes:\"⊀\",NotPrecedesEqual:\"⪯̸\",NotPrecedesSlantEqual:\"⋠\",NotReverseElement:\"∌\",NotRightTriangle:\"⋫\",NotRightTriangleBar:\"⧐̸\",NotRightTriangleEqual:\"⋭\",NotSquareSubset:\"⊏̸\",NotSquareSubsetEqual:\"⋢\",NotSquareSuperset:\"⊐̸\",NotSquareSupersetEqual:\"⋣\",NotSubset:\"⊂⃒\",NotSubsetEqual:\"⊈\",NotSucceeds:\"⊁\",NotSucceedsEqual:\"⪰̸\",NotSucceedsSlantEqual:\"⋡\",NotSucceedsTilde:\"≿̸\",NotSuperset:\"⊃⃒\",NotSupersetEqual:\"⊉\",NotTilde:\"≁\",NotTildeEqual:\"≄\",NotTildeFullEqual:\"≇\",NotTildeTilde:\"≉\",NotVerticalBar:\"∤\",npar:\"∦\",nparallel:\"∦\",nparsl:\"⫽⃥\",npart:\"∂̸\",npolint:\"⨔\",npr:\"⊀\",nprcue:\"⋠\",npre:\"⪯̸\",nprec:\"⊀\",npreceq:\"⪯̸\",nrArr:\"⇏\",nrarr:\"↛\",nrarrc:\"⤳̸\",nrarrw:\"↝̸\",nRightarrow:\"⇏\",nrightarrow:\"↛\",nrtri:\"⋫\",nrtrie:\"⋭\",nsc:\"⊁\",nsccue:\"⋡\",nsce:\"⪰̸\",Nscr:\"𝒩\",nscr:\"𝓃\",nshortmid:\"∤\",nshortparallel:\"∦\",nsim:\"≁\",nsime:\"≄\",nsimeq:\"≄\",nsmid:\"∤\",nspar:\"∦\",nsqsube:\"⋢\",nsqsupe:\"⋣\",nsub:\"⊄\",nsubE:\"⫅̸\",nsube:\"⊈\",nsubset:\"⊂⃒\",nsubseteq:\"⊈\",nsubseteqq:\"⫅̸\",nsucc:\"⊁\",nsucceq:\"⪰̸\",nsup:\"⊅\",nsupE:\"⫆̸\",nsupe:\"⊉\",nsupset:\"⊃⃒\",nsupseteq:\"⊉\",nsupseteqq:\"⫆̸\",ntgl:\"≹\",Ntilde:\"Ñ\",ntilde:\"ñ\",ntlg:\"≸\",ntriangleleft:\"⋪\",ntrianglelefteq:\"⋬\",ntriangleright:\"⋫\",ntrianglerighteq:\"⋭\",Nu:\"Ν\",nu:\"ν\",num:\"#\",numero:\"№\",numsp:\" \",nvap:\"≍⃒\",nVDash:\"⊯\",nVdash:\"⊮\",nvDash:\"⊭\",nvdash:\"⊬\",nvge:\"≥⃒\",nvgt:\">⃒\",nvHarr:\"⤄\",nvinfin:\"⧞\",nvlArr:\"⤂\",nvle:\"≤⃒\",nvlt:\"<⃒\",nvltrie:\"⊴⃒\",nvrArr:\"⤃\",nvrtrie:\"⊵⃒\",nvsim:\"∼⃒\",nwarhk:\"⤣\",nwArr:\"⇖\",nwarr:\"↖\",nwarrow:\"↖\",nwnear:\"⤧\",Oacute:\"Ó\",oacute:\"ó\",oast:\"⊛\",ocir:\"⊚\",Ocirc:\"Ô\",ocirc:\"ô\",Ocy:\"О\",ocy:\"о\",odash:\"⊝\",Odblac:\"Ő\",odblac:\"ő\",odiv:\"⨸\",odot:\"⊙\",odsold:\"⦼\",OElig:\"Œ\",oelig:\"œ\",ofcir:\"⦿\",Ofr:\"𝔒\",ofr:\"𝔬\",ogon:\"˛\",Ograve:\"Ò\",ograve:\"ò\",ogt:\"⧁\",ohbar:\"⦵\",ohm:\"Ω\",oint:\"∮\",olarr:\"↺\",olcir:\"⦾\",olcross:\"⦻\",oline:\"‾\",olt:\"⧀\",Omacr:\"Ō\",omacr:\"ō\",Omega:\"Ω\",omega:\"ω\",Omicron:\"Ο\",omicron:\"ο\",omid:\"⦶\",ominus:\"⊖\",Oopf:\"𝕆\",oopf:\"𝕠\",opar:\"⦷\",OpenCurlyDoubleQuote:\"“\",OpenCurlyQuote:\"‘\",operp:\"⦹\",oplus:\"⊕\",Or:\"⩔\",or:\"∨\",orarr:\"↻\",ord:\"⩝\",order:\"ℴ\",orderof:\"ℴ\",ordf:\"ª\",ordm:\"º\",origof:\"⊶\",oror:\"⩖\",orslope:\"⩗\",orv:\"⩛\",oS:\"Ⓢ\",Oscr:\"𝒪\",oscr:\"ℴ\",Oslash:\"Ø\",oslash:\"ø\",osol:\"⊘\",Otilde:\"Õ\",otilde:\"õ\",Otimes:\"⨷\",otimes:\"⊗\",otimesas:\"⨶\",Ouml:\"Ö\",ouml:\"ö\",ovbar:\"⌽\",OverBar:\"‾\",OverBrace:\"⏞\",OverBracket:\"⎴\",OverParenthesis:\"⏜\",par:\"∥\",para:\"¶\",parallel:\"∥\",parsim:\"⫳\",parsl:\"⫽\",part:\"∂\",PartialD:\"∂\",Pcy:\"П\",pcy:\"п\",percnt:\"%\",period:\".\",permil:\"‰\",perp:\"⊥\",pertenk:\"‱\",Pfr:\"𝔓\",pfr:\"𝔭\",Phi:\"Φ\",phi:\"φ\",phiv:\"ϕ\",phmmat:\"ℳ\",phone:\"☎\",Pi:\"Π\",pi:\"π\",pitchfork:\"⋔\",piv:\"ϖ\",planck:\"ℏ\",planckh:\"ℎ\",plankv:\"ℏ\",plus:\"+\",plusacir:\"⨣\",plusb:\"⊞\",pluscir:\"⨢\",plusdo:\"∔\",plusdu:\"⨥\",pluse:\"⩲\",PlusMinus:\"±\",plusmn:\"±\",plussim:\"⨦\",plustwo:\"⨧\",pm:\"±\",Poincareplane:\"ℌ\",pointint:\"⨕\",Popf:\"ℙ\",popf:\"𝕡\",pound:\"£\",Pr:\"⪻\",pr:\"≺\",prap:\"⪷\",prcue:\"≼\",prE:\"⪳\",pre:\"⪯\",prec:\"≺\",precapprox:\"⪷\",preccurlyeq:\"≼\",Precedes:\"≺\",PrecedesEqual:\"⪯\",PrecedesSlantEqual:\"≼\",PrecedesTilde:\"≾\",preceq:\"⪯\",precnapprox:\"⪹\",precneqq:\"⪵\",precnsim:\"⋨\",precsim:\"≾\",Prime:\"″\",prime:\"′\",primes:\"ℙ\",prnap:\"⪹\",prnE:\"⪵\",prnsim:\"⋨\",prod:\"∏\",Product:\"∏\",profalar:\"⌮\",profline:\"⌒\",profsurf:\"⌓\",prop:\"∝\",Proportion:\"∷\",Proportional:\"∝\",propto:\"∝\",prsim:\"≾\",prurel:\"⊰\",Pscr:\"𝒫\",pscr:\"𝓅\",Psi:\"Ψ\",psi:\"ψ\",puncsp:\" \",Qfr:\"𝔔\",qfr:\"𝔮\",qint:\"⨌\",Qopf:\"ℚ\",qopf:\"𝕢\",qprime:\"⁗\",Qscr:\"𝒬\",qscr:\"𝓆\",quaternions:\"ℍ\",quatint:\"⨖\",quest:\"?\",questeq:\"≟\",QUOT:'\"',quot:'\"',rAarr:\"⇛\",race:\"∽̱\",Racute:\"Ŕ\",racute:\"ŕ\",radic:\"√\",raemptyv:\"⦳\",Rang:\"⟫\",rang:\"⟩\",rangd:\"⦒\",range:\"⦥\",rangle:\"⟩\",raquo:\"»\",Rarr:\"↠\",rArr:\"⇒\",rarr:\"→\",rarrap:\"⥵\",rarrb:\"⇥\",rarrbfs:\"⤠\",rarrc:\"⤳\",rarrfs:\"⤞\",rarrhk:\"↪\",rarrlp:\"↬\",rarrpl:\"⥅\",rarrsim:\"⥴\",Rarrtl:\"⤖\",rarrtl:\"↣\",rarrw:\"↝\",rAtail:\"⤜\",ratail:\"⤚\",ratio:\"∶\",rationals:\"ℚ\",RBarr:\"⤐\",rBarr:\"⤏\",rbarr:\"⤍\",rbbrk:\"❳\",rbrace:\"}\",rbrack:\"]\",rbrke:\"⦌\",rbrksld:\"⦎\",rbrkslu:\"⦐\",Rcaron:\"Ř\",rcaron:\"ř\",Rcedil:\"Ŗ\",rcedil:\"ŗ\",rceil:\"⌉\",rcub:\"}\",Rcy:\"Р\",rcy:\"р\",rdca:\"⤷\",rdldhar:\"⥩\",rdquo:\"”\",rdquor:\"”\",rdsh:\"↳\",Re:\"ℜ\",real:\"ℜ\",realine:\"ℛ\",realpart:\"ℜ\",reals:\"ℝ\",rect:\"▭\",REG:\"®\",reg:\"®\",ReverseElement:\"∋\",ReverseEquilibrium:\"⇋\",ReverseUpEquilibrium:\"⥯\",rfisht:\"⥽\",rfloor:\"⌋\",Rfr:\"ℜ\",rfr:\"𝔯\",rHar:\"⥤\",rhard:\"⇁\",rharu:\"⇀\",rharul:\"⥬\",Rho:\"Ρ\",rho:\"ρ\",rhov:\"ϱ\",RightAngleBracket:\"⟩\",RightArrow:\"→\",Rightarrow:\"⇒\",rightarrow:\"→\",RightArrowBar:\"⇥\",RightArrowLeftArrow:\"⇄\",rightarrowtail:\"↣\",RightCeiling:\"⌉\",RightDoubleBracket:\"⟧\",RightDownTeeVector:\"⥝\",RightDownVector:\"⇂\",RightDownVectorBar:\"⥕\",RightFloor:\"⌋\",rightharpoondown:\"⇁\",rightharpoonup:\"⇀\",rightleftarrows:\"⇄\",rightleftharpoons:\"⇌\",rightrightarrows:\"⇉\",rightsquigarrow:\"↝\",RightTee:\"⊢\",RightTeeArrow:\"↦\",RightTeeVector:\"⥛\",rightthreetimes:\"⋌\",RightTriangle:\"⊳\",RightTriangleBar:\"⧐\",RightTriangleEqual:\"⊵\",RightUpDownVector:\"⥏\",RightUpTeeVector:\"⥜\",RightUpVector:\"↾\",RightUpVectorBar:\"⥔\",RightVector:\"⇀\",RightVectorBar:\"⥓\",ring:\"˚\",risingdotseq:\"≓\",rlarr:\"⇄\",rlhar:\"⇌\",rlm:\"‏\",rmoust:\"⎱\",rmoustache:\"⎱\",rnmid:\"⫮\",roang:\"⟭\",roarr:\"⇾\",robrk:\"⟧\",ropar:\"⦆\",Ropf:\"ℝ\",ropf:\"𝕣\",roplus:\"⨮\",rotimes:\"⨵\",RoundImplies:\"⥰\",rpar:\")\",rpargt:\"⦔\",rppolint:\"⨒\",rrarr:\"⇉\",Rrightarrow:\"⇛\",rsaquo:\"›\",Rscr:\"ℛ\",rscr:\"𝓇\",Rsh:\"↱\",rsh:\"↱\",rsqb:\"]\",rsquo:\"’\",rsquor:\"’\",rthree:\"⋌\",rtimes:\"⋊\",rtri:\"▹\",rtrie:\"⊵\",rtrif:\"▸\",rtriltri:\"⧎\",RuleDelayed:\"⧴\",ruluhar:\"⥨\",rx:\"℞\",Sacute:\"Ś\",sacute:\"ś\",sbquo:\"‚\",Sc:\"⪼\",sc:\"≻\",scap:\"⪸\",Scaron:\"Š\",scaron:\"š\",sccue:\"≽\",scE:\"⪴\",sce:\"⪰\",Scedil:\"Ş\",scedil:\"ş\",Scirc:\"Ŝ\",scirc:\"ŝ\",scnap:\"⪺\",scnE:\"⪶\",scnsim:\"⋩\",scpolint:\"⨓\",scsim:\"≿\",Scy:\"С\",scy:\"с\",sdot:\"⋅\",sdotb:\"⊡\",sdote:\"⩦\",searhk:\"⤥\",seArr:\"⇘\",searr:\"↘\",searrow:\"↘\",sect:\"§\",semi:\";\",seswar:\"⤩\",setminus:\"∖\",setmn:\"∖\",sext:\"✶\",Sfr:\"𝔖\",sfr:\"𝔰\",sfrown:\"⌢\",sharp:\"♯\",SHCHcy:\"Щ\",shchcy:\"щ\",SHcy:\"Ш\",shcy:\"ш\",ShortDownArrow:\"↓\",ShortLeftArrow:\"←\",shortmid:\"∣\",shortparallel:\"∥\",ShortRightArrow:\"→\",ShortUpArrow:\"↑\",shy:\"­\",Sigma:\"Σ\",sigma:\"σ\",sigmaf:\"ς\",sigmav:\"ς\",sim:\"∼\",simdot:\"⩪\",sime:\"≃\",simeq:\"≃\",simg:\"⪞\",simgE:\"⪠\",siml:\"⪝\",simlE:\"⪟\",simne:\"≆\",simplus:\"⨤\",simrarr:\"⥲\",slarr:\"←\",SmallCircle:\"∘\",smallsetminus:\"∖\",smashp:\"⨳\",smeparsl:\"⧤\",smid:\"∣\",smile:\"⌣\",smt:\"⪪\",smte:\"⪬\",smtes:\"⪬︀\",SOFTcy:\"Ь\",softcy:\"ь\",sol:\"/\",solb:\"⧄\",solbar:\"⌿\",Sopf:\"𝕊\",sopf:\"𝕤\",spades:\"♠\",spadesuit:\"♠\",spar:\"∥\",sqcap:\"⊓\",sqcaps:\"⊓︀\",sqcup:\"⊔\",sqcups:\"⊔︀\",Sqrt:\"√\",sqsub:\"⊏\",sqsube:\"⊑\",sqsubset:\"⊏\",sqsubseteq:\"⊑\",sqsup:\"⊐\",sqsupe:\"⊒\",sqsupset:\"⊐\",sqsupseteq:\"⊒\",squ:\"□\",Square:\"□\",square:\"□\",SquareIntersection:\"⊓\",SquareSubset:\"⊏\",SquareSubsetEqual:\"⊑\",SquareSuperset:\"⊐\",SquareSupersetEqual:\"⊒\",SquareUnion:\"⊔\",squarf:\"▪\",squf:\"▪\",srarr:\"→\",Sscr:\"𝒮\",sscr:\"𝓈\",ssetmn:\"∖\",ssmile:\"⌣\",sstarf:\"⋆\",Star:\"⋆\",star:\"☆\",starf:\"★\",straightepsilon:\"ϵ\",straightphi:\"ϕ\",strns:\"¯\",Sub:\"⋐\",sub:\"⊂\",subdot:\"⪽\",subE:\"⫅\",sube:\"⊆\",subedot:\"⫃\",submult:\"⫁\",subnE:\"⫋\",subne:\"⊊\",subplus:\"⪿\",subrarr:\"⥹\",Subset:\"⋐\",subset:\"⊂\",subseteq:\"⊆\",subseteqq:\"⫅\",SubsetEqual:\"⊆\",subsetneq:\"⊊\",subsetneqq:\"⫋\",subsim:\"⫇\",subsub:\"⫕\",subsup:\"⫓\",succ:\"≻\",succapprox:\"⪸\",succcurlyeq:\"≽\",Succeeds:\"≻\",SucceedsEqual:\"⪰\",SucceedsSlantEqual:\"≽\",SucceedsTilde:\"≿\",succeq:\"⪰\",succnapprox:\"⪺\",succneqq:\"⪶\",succnsim:\"⋩\",succsim:\"≿\",SuchThat:\"∋\",Sum:\"∑\",sum:\"∑\",sung:\"♪\",Sup:\"⋑\",sup:\"⊃\",sup1:\"¹\",sup2:\"²\",sup3:\"³\",supdot:\"⪾\",supdsub:\"⫘\",supE:\"⫆\",supe:\"⊇\",supedot:\"⫄\",Superset:\"⊃\",SupersetEqual:\"⊇\",suphsol:\"⟉\",suphsub:\"⫗\",suplarr:\"⥻\",supmult:\"⫂\",supnE:\"⫌\",supne:\"⊋\",supplus:\"⫀\",Supset:\"⋑\",supset:\"⊃\",supseteq:\"⊇\",supseteqq:\"⫆\",supsetneq:\"⊋\",supsetneqq:\"⫌\",supsim:\"⫈\",supsub:\"⫔\",supsup:\"⫖\",swarhk:\"⤦\",swArr:\"⇙\",swarr:\"↙\",swarrow:\"↙\",swnwar:\"⤪\",szlig:\"ß\",Tab:\"\\t\",target:\"⌖\",Tau:\"Τ\",tau:\"τ\",tbrk:\"⎴\",Tcaron:\"Ť\",tcaron:\"ť\",Tcedil:\"Ţ\",tcedil:\"ţ\",Tcy:\"Т\",tcy:\"т\",tdot:\"⃛\",telrec:\"⌕\",Tfr:\"𝔗\",tfr:\"𝔱\",there4:\"∴\",Therefore:\"∴\",therefore:\"∴\",Theta:\"Θ\",theta:\"θ\",thetasym:\"ϑ\",thetav:\"ϑ\",thickapprox:\"≈\",thicksim:\"∼\",ThickSpace:\"  \",thinsp:\" \",ThinSpace:\" \",thkap:\"≈\",thksim:\"∼\",THORN:\"Þ\",thorn:\"þ\",Tilde:\"∼\",tilde:\"˜\",TildeEqual:\"≃\",TildeFullEqual:\"≅\",TildeTilde:\"≈\",times:\"×\",timesb:\"⊠\",timesbar:\"⨱\",timesd:\"⨰\",tint:\"∭\",toea:\"⤨\",top:\"⊤\",topbot:\"⌶\",topcir:\"⫱\",Topf:\"𝕋\",topf:\"𝕥\",topfork:\"⫚\",tosa:\"⤩\",tprime:\"‴\",TRADE:\"™\",trade:\"™\",triangle:\"▵\",triangledown:\"▿\",triangleleft:\"◃\",trianglelefteq:\"⊴\",triangleq:\"≜\",triangleright:\"▹\",trianglerighteq:\"⊵\",tridot:\"◬\",trie:\"≜\",triminus:\"⨺\",TripleDot:\"⃛\",triplus:\"⨹\",trisb:\"⧍\",tritime:\"⨻\",trpezium:\"⏢\",Tscr:\"𝒯\",tscr:\"𝓉\",TScy:\"Ц\",tscy:\"ц\",TSHcy:\"Ћ\",tshcy:\"ћ\",Tstrok:\"Ŧ\",tstrok:\"ŧ\",twixt:\"≬\",twoheadleftarrow:\"↞\",twoheadrightarrow:\"↠\",Uacute:\"Ú\",uacute:\"ú\",Uarr:\"↟\",uArr:\"⇑\",uarr:\"↑\",Uarrocir:\"⥉\",Ubrcy:\"Ў\",ubrcy:\"ў\",Ubreve:\"Ŭ\",ubreve:\"ŭ\",Ucirc:\"Û\",ucirc:\"û\",Ucy:\"У\",ucy:\"у\",udarr:\"⇅\",Udblac:\"Ű\",udblac:\"ű\",udhar:\"⥮\",ufisht:\"⥾\",Ufr:\"𝔘\",ufr:\"𝔲\",Ugrave:\"Ù\",ugrave:\"ù\",uHar:\"⥣\",uharl:\"↿\",uharr:\"↾\",uhblk:\"▀\",ulcorn:\"⌜\",ulcorner:\"⌜\",ulcrop:\"⌏\",ultri:\"◸\",Umacr:\"Ū\",umacr:\"ū\",uml:\"¨\",UnderBar:\"_\",UnderBrace:\"⏟\",UnderBracket:\"⎵\",UnderParenthesis:\"⏝\",Union:\"⋃\",UnionPlus:\"⊎\",Uogon:\"Ų\",uogon:\"ų\",Uopf:\"𝕌\",uopf:\"𝕦\",UpArrow:\"↑\",Uparrow:\"⇑\",uparrow:\"↑\",UpArrowBar:\"⤒\",UpArrowDownArrow:\"⇅\",UpDownArrow:\"↕\",Updownarrow:\"⇕\",updownarrow:\"↕\",UpEquilibrium:\"⥮\",upharpoonleft:\"↿\",upharpoonright:\"↾\",uplus:\"⊎\",UpperLeftArrow:\"↖\",UpperRightArrow:\"↗\",Upsi:\"ϒ\",upsi:\"υ\",upsih:\"ϒ\",Upsilon:\"Υ\",upsilon:\"υ\",UpTee:\"⊥\",UpTeeArrow:\"↥\",upuparrows:\"⇈\",urcorn:\"⌝\",urcorner:\"⌝\",urcrop:\"⌎\",Uring:\"Ů\",uring:\"ů\",urtri:\"◹\",Uscr:\"𝒰\",uscr:\"𝓊\",utdot:\"⋰\",Utilde:\"Ũ\",utilde:\"ũ\",utri:\"▵\",utrif:\"▴\",uuarr:\"⇈\",Uuml:\"Ü\",uuml:\"ü\",uwangle:\"⦧\",vangrt:\"⦜\",varepsilon:\"ϵ\",varkappa:\"ϰ\",varnothing:\"∅\",\nvarphi:\"ϕ\",varpi:\"ϖ\",varpropto:\"∝\",vArr:\"⇕\",varr:\"↕\",varrho:\"ϱ\",varsigma:\"ς\",varsubsetneq:\"⊊︀\",varsubsetneqq:\"⫋︀\",varsupsetneq:\"⊋︀\",varsupsetneqq:\"⫌︀\",vartheta:\"ϑ\",vartriangleleft:\"⊲\",vartriangleright:\"⊳\",Vbar:\"⫫\",vBar:\"⫨\",vBarv:\"⫩\",Vcy:\"В\",vcy:\"в\",VDash:\"⊫\",Vdash:\"⊩\",vDash:\"⊨\",vdash:\"⊢\",Vdashl:\"⫦\",Vee:\"⋁\",vee:\"∨\",veebar:\"⊻\",veeeq:\"≚\",vellip:\"⋮\",Verbar:\"‖\",verbar:\"|\",Vert:\"‖\",vert:\"|\",VerticalBar:\"∣\",VerticalLine:\"|\",VerticalSeparator:\"❘\",VerticalTilde:\"≀\",VeryThinSpace:\" \",Vfr:\"𝔙\",vfr:\"𝔳\",vltri:\"⊲\",vnsub:\"⊂⃒\",vnsup:\"⊃⃒\",Vopf:\"𝕍\",vopf:\"𝕧\",vprop:\"∝\",vrtri:\"⊳\",Vscr:\"𝒱\",vscr:\"𝓋\",vsubnE:\"⫋︀\",vsubne:\"⊊︀\",vsupnE:\"⫌︀\",vsupne:\"⊋︀\",Vvdash:\"⊪\",vzigzag:\"⦚\",Wcirc:\"Ŵ\",wcirc:\"ŵ\",wedbar:\"⩟\",Wedge:\"⋀\",wedge:\"∧\",wedgeq:\"≙\",weierp:\"℘\",Wfr:\"𝔚\",wfr:\"𝔴\",Wopf:\"𝕎\",wopf:\"𝕨\",wp:\"℘\",wr:\"≀\",wreath:\"≀\",Wscr:\"𝒲\",wscr:\"𝓌\",xcap:\"⋂\",xcirc:\"◯\",xcup:\"⋃\",xdtri:\"▽\",Xfr:\"𝔛\",xfr:\"𝔵\",xhArr:\"⟺\",xharr:\"⟷\",Xi:\"Ξ\",xi:\"ξ\",xlArr:\"⟸\",xlarr:\"⟵\",xmap:\"⟼\",xnis:\"⋻\",xodot:\"⨀\",Xopf:\"𝕏\",xopf:\"𝕩\",xoplus:\"⨁\",xotime:\"⨂\",xrArr:\"⟹\",xrarr:\"⟶\",Xscr:\"𝒳\",xscr:\"𝓍\",xsqcup:\"⨆\",xuplus:\"⨄\",xutri:\"△\",xvee:\"⋁\",xwedge:\"⋀\",Yacute:\"Ý\",yacute:\"ý\",YAcy:\"Я\",yacy:\"я\",Ycirc:\"Ŷ\",ycirc:\"ŷ\",Ycy:\"Ы\",ycy:\"ы\",yen:\"¥\",Yfr:\"𝔜\",yfr:\"𝔶\",YIcy:\"Ї\",yicy:\"ї\",Yopf:\"𝕐\",yopf:\"𝕪\",Yscr:\"𝒴\",yscr:\"𝓎\",YUcy:\"Ю\",yucy:\"ю\",Yuml:\"Ÿ\",yuml:\"ÿ\",Zacute:\"Ź\",zacute:\"ź\",Zcaron:\"Ž\",zcaron:\"ž\",Zcy:\"З\",zcy:\"з\",Zdot:\"Ż\",zdot:\"ż\",zeetrf:\"ℨ\",ZeroWidthSpace:\"​\",Zeta:\"Ζ\",zeta:\"ζ\",Zfr:\"ℨ\",zfr:\"𝔷\",ZHcy:\"Ж\",zhcy:\"ж\",zigrarr:\"⇝\",Zopf:\"ℤ\",zopf:\"𝕫\",Zscr:\"𝒵\",zscr:\"𝓏\",zwj:\"‍\",zwnj:\"‌\"}},function(e,t,n){\"use strict\";function r(){this.rules=i.assign({},o),this.getBreak=o.getBreak}var i=n(1081),o=n(1084);e.exports=r,r.prototype.renderInline=function(e,t,n){for(var r=this.rules,i=e.length,o=0,a=\"\";i--;)a+=r[e[o].type](e,o++,t,n,this);return a},r.prototype.render=function(e,t,n){for(var r=this.rules,i=e.length,o=-1,a=\"\";++o<i;)a+=\"inline\"===e[o].type?this.renderInline(e[o].children,t,n):r[e[o].type](e,o,t,n,this);return a}},function(e,t,n){\"use strict\";function r(e,t){return++t>=e.length-2?t:\"paragraph_open\"===e[t].type&&e[t].tight&&\"inline\"===e[t+1].type&&0===e[t+1].content.length&&\"paragraph_close\"===e[t+2].type&&e[t+2].tight?r(e,t+2):t}var i=n(1081).has,o=n(1081).unescapeMd,a=n(1081).replaceEntities,s=n(1081).escapeHtml,u={};u.blockquote_open=function(){return\"<blockquote>\\n\"},u.blockquote_close=function(e,t){return\"</blockquote>\"+c(e,t)},u.code=function(e,t){return e[t].block?\"<pre><code>\"+s(e[t].content)+\"</code></pre>\"+c(e,t):\"<code>\"+s(e[t].content)+\"</code>\"},u.fence=function(e,t,n,r,u){var l,p,f,h=e[t],d=\"\",m=n.langPrefix,v=\"\";if(h.params){if(l=h.params.split(/\\s+/g),p=l.join(\" \"),i(u.rules.fence_custom,l[0]))return u.rules.fence_custom[l[0]](e,t,n,r,u);v=s(a(o(p))),d=' class=\"'+m+v+'\"'}return f=n.highlight?n.highlight.apply(n.highlight,[h.content].concat(l))||s(h.content):s(h.content),\"<pre><code\"+d+\">\"+f+\"</code></pre>\"+c(e,t)},u.fence_custom={},u.heading_open=function(e,t){return\"<h\"+e[t].hLevel+\">\"},u.heading_close=function(e,t){return\"</h\"+e[t].hLevel+\">\\n\"},u.hr=function(e,t,n){return(n.xhtmlOut?\"<hr />\":\"<hr>\")+c(e,t)},u.bullet_list_open=function(){return\"<ul>\\n\"},u.bullet_list_close=function(e,t){return\"</ul>\"+c(e,t)},u.list_item_open=function(){return\"<li>\"},u.list_item_close=function(){return\"</li>\\n\"},u.ordered_list_open=function(e,t){var n=e[t],r=n.order>1?' start=\"'+n.order+'\"':\"\";return\"<ol\"+r+\">\\n\"},u.ordered_list_close=function(e,t){return\"</ol>\"+c(e,t)},u.paragraph_open=function(e,t){return e[t].tight?\"\":\"<p>\"},u.paragraph_close=function(e,t){var n=!(e[t].tight&&t&&\"inline\"===e[t-1].type&&!e[t-1].content);return(e[t].tight?\"\":\"</p>\")+(n?c(e,t):\"\")},u.link_open=function(e,t,n){var r=e[t].title?' title=\"'+s(a(e[t].title))+'\"':\"\",i=n.linkTarget?' target=\"'+n.linkTarget+'\"':\"\";return'<a href=\"'+s(e[t].href)+'\"'+r+i+\">\"},u.link_close=function(){return\"</a>\"},u.image=function(e,t,n){var r=' src=\"'+s(e[t].src)+'\"',i=e[t].title?' title=\"'+s(a(e[t].title))+'\"':\"\",u=' alt=\"'+(e[t].alt?s(a(o(e[t].alt))):\"\")+'\"',c=n.xhtmlOut?\" /\":\"\";return\"<img\"+r+u+i+c+\">\"},u.table_open=function(){return\"<table>\\n\"},u.table_close=function(){return\"</table>\\n\"},u.thead_open=function(){return\"<thead>\\n\"},u.thead_close=function(){return\"</thead>\\n\"},u.tbody_open=function(){return\"<tbody>\\n\"},u.tbody_close=function(){return\"</tbody>\\n\"},u.tr_open=function(){return\"<tr>\"},u.tr_close=function(){return\"</tr>\\n\"},u.th_open=function(e,t){var n=e[t];return\"<th\"+(n.align?' style=\"text-align:'+n.align+'\"':\"\")+\">\"},u.th_close=function(){return\"</th>\"},u.td_open=function(e,t){var n=e[t];return\"<td\"+(n.align?' style=\"text-align:'+n.align+'\"':\"\")+\">\"},u.td_close=function(){return\"</td>\"},u.strong_open=function(){return\"<strong>\"},u.strong_close=function(){return\"</strong>\"},u.em_open=function(){return\"<em>\"},u.em_close=function(){return\"</em>\"},u.del_open=function(){return\"<del>\"},u.del_close=function(){return\"</del>\"},u.ins_open=function(){return\"<ins>\"},u.ins_close=function(){return\"</ins>\"},u.mark_open=function(){return\"<mark>\"},u.mark_close=function(){return\"</mark>\"},u.sub=function(e,t){return\"<sub>\"+s(e[t].content)+\"</sub>\"},u.sup=function(e,t){return\"<sup>\"+s(e[t].content)+\"</sup>\"},u.hardbreak=function(e,t,n){return n.xhtmlOut?\"<br />\\n\":\"<br>\\n\"},u.softbreak=function(e,t,n){return n.breaks?n.xhtmlOut?\"<br />\\n\":\"<br>\\n\":\"\\n\"},u.text=function(e,t){return s(e[t].content)},u.htmlblock=function(e,t){return e[t].content},u.htmltag=function(e,t){return e[t].content},u.abbr_open=function(e,t){return'<abbr title=\"'+s(a(e[t].title))+'\">'},u.abbr_close=function(){return\"</abbr>\"},u.footnote_ref=function(e,t){var n=Number(e[t].id+1).toString(),r=\"fnref\"+n;return e[t].subId>0&&(r+=\":\"+e[t].subId),'<sup class=\"footnote-ref\"><a href=\"#fn'+n+'\" id=\"'+r+'\">['+n+\"]</a></sup>\"},u.footnote_block_open=function(e,t,n){var r=n.xhtmlOut?'<hr class=\"footnotes-sep\" />\\n':'<hr class=\"footnotes-sep\">\\n';return r+'<section class=\"footnotes\">\\n<ol class=\"footnotes-list\">\\n'},u.footnote_block_close=function(){return\"</ol>\\n</section>\\n\"},u.footnote_open=function(e,t){var n=Number(e[t].id+1).toString();return'<li id=\"fn'+n+'\"  class=\"footnote-item\">'},u.footnote_close=function(){return\"</li>\\n\"},u.footnote_anchor=function(e,t){var n=Number(e[t].id+1).toString(),r=\"fnref\"+n;return e[t].subId>0&&(r+=\":\"+e[t].subId),' <a href=\"#'+r+'\" class=\"footnote-backref\">↩</a>'},u.dl_open=function(){return\"<dl>\\n\"},u.dt_open=function(){return\"<dt>\"},u.dd_open=function(){return\"<dd>\"},u.dl_close=function(){return\"</dl>\\n\"},u.dt_close=function(){return\"</dt>\\n\"},u.dd_close=function(){return\"</dd>\\n\"};var c=u.getBreak=function(e,t){return t=r(e,t),t<e.length&&\"list_item_close\"===e[t].type?\"\":\"\\n\"};e.exports=u},function(e,t,n){\"use strict\";function r(){this.options={},this.ruler=new i;for(var e=0;e<o.length;e++)this.ruler.push(o[e][0],o[e][1])}var i=n(1086),o=[[\"block\",n(1087)],[\"abbr\",n(1088)],[\"references\",n(1091)],[\"inline\",n(1096)],[\"footnote_tail\",n(1097)],[\"abbr2\",n(1098)],[\"replacements\",n(1099)],[\"smartquotes\",n(1100)],[\"linkify\",n(1101)]];r.prototype.process=function(e){var t,n,r;for(r=this.ruler.getRules(\"\"),t=0,n=r.length;t<n;t++)r[t](e)},e.exports=r},function(e,t){\"use strict\";function n(){this.__rules__=[],this.__cache__=null}n.prototype.__find__=function(e){for(var t=this.__rules__.length,n=-1;t--;)if(this.__rules__[++n].name===e)return n;return-1},n.prototype.__compile__=function(){var e=this,t=[\"\"];e.__rules__.forEach(function(e){e.enabled&&e.alt.forEach(function(e){t.indexOf(e)<0&&t.push(e)})}),e.__cache__={},t.forEach(function(t){e.__cache__[t]=[],e.__rules__.forEach(function(n){n.enabled&&(t&&n.alt.indexOf(t)<0||e.__cache__[t].push(n.fn))})})},n.prototype.at=function(e,t,n){var r=this.__find__(e),i=n||{};if(r===-1)throw new Error(\"Parser rule not found: \"+e);this.__rules__[r].fn=t,this.__rules__[r].alt=i.alt||[],this.__cache__=null},n.prototype.before=function(e,t,n,r){var i=this.__find__(e),o=r||{};if(i===-1)throw new Error(\"Parser rule not found: \"+e);this.__rules__.splice(i,0,{name:t,enabled:!0,fn:n,alt:o.alt||[]}),this.__cache__=null},n.prototype.after=function(e,t,n,r){var i=this.__find__(e),o=r||{};if(i===-1)throw new Error(\"Parser rule not found: \"+e);this.__rules__.splice(i+1,0,{name:t,enabled:!0,fn:n,alt:o.alt||[]}),this.__cache__=null},n.prototype.push=function(e,t,n){var r=n||{};this.__rules__.push({name:e,enabled:!0,fn:t,alt:r.alt||[]}),this.__cache__=null},n.prototype.enable=function(e,t){e=Array.isArray(e)?e:[e],t&&this.__rules__.forEach(function(e){e.enabled=!1}),e.forEach(function(e){var t=this.__find__(e);if(t<0)throw new Error(\"Rules manager: invalid rule name \"+e);this.__rules__[t].enabled=!0},this),this.__cache__=null},n.prototype.disable=function(e){e=Array.isArray(e)?e:[e],e.forEach(function(e){var t=this.__find__(e);if(t<0)throw new Error(\"Rules manager: invalid rule name \"+e);this.__rules__[t].enabled=!1},this),this.__cache__=null},n.prototype.getRules=function(e){return null===this.__cache__&&this.__compile__(),this.__cache__[e]||[]},e.exports=n},function(e,t){\"use strict\";e.exports=function(e){e.inlineMode?e.tokens.push({type:\"inline\",content:e.src.replace(/\\n/g,\" \").trim(),level:0,lines:[0,1],children:[]}):e.block.parse(e.src,e.options,e.env,e.tokens)}},function(e,t,n){\"use strict\";function r(e,t,n,r){var a,s,u,c,l,p;if(42!==e.charCodeAt(0))return-1;if(91!==e.charCodeAt(1))return-1;if(e.indexOf(\"]:\")===-1)return-1;if(a=new i(e,t,n,r,[]),s=o(a,1),s<0||58!==e.charCodeAt(s+1))return-1;for(c=a.posMax,u=s+2;u<c&&10!==a.src.charCodeAt(u);u++);return l=e.slice(2,s),p=e.slice(s+2,u).trim(),0===p.length?-1:(r.abbreviations||(r.abbreviations={}),\"undefined\"==typeof r.abbreviations[\":\"+l]&&(r.abbreviations[\":\"+l]=p),u)}var i=n(1089),o=n(1090);e.exports=function(e){var t,n,i,o,a=e.tokens;if(!e.inlineMode)for(t=1,n=a.length-1;t<n;t++)if(\"paragraph_open\"===a[t-1].type&&\"inline\"===a[t].type&&\"paragraph_close\"===a[t+1].type){for(i=a[t].content;i.length&&(o=r(i,e.inline,e.options,e.env),!(o<0));)i=i.slice(o).trim();a[t].content=i,i.length||(a[t-1].tight=!0,a[t+1].tight=!0)}}},function(e,t){\"use strict\";function n(e,t,n,r,i){this.src=e,this.env=r,this.options=n,this.parser=t,this.tokens=i,this.pos=0,this.posMax=this.src.length,this.level=0,this.pending=\"\",this.pendingLevel=0,this.cache=[],this.isInLabel=!1,this.linkLevel=0,this.linkContent=\"\",this.labelUnmatchedScopes=0}n.prototype.pushPending=function(){this.tokens.push({type:\"text\",content:this.pending,level:this.pendingLevel}),this.pending=\"\"},n.prototype.push=function(e){this.pending&&this.pushPending(),this.tokens.push(e),this.pendingLevel=this.level},n.prototype.cacheSet=function(e,t){for(var n=this.cache.length;n<=e;n++)this.cache.push(0);this.cache[e]=t},n.prototype.cacheGet=function(e){return e<this.cache.length?this.cache[e]:0},e.exports=n},function(e,t){\"use strict\";e.exports=function(e,t){var n,r,i,o=-1,a=e.posMax,s=e.pos,u=e.isInLabel;if(e.isInLabel)return-1;if(e.labelUnmatchedScopes)return e.labelUnmatchedScopes--,-1;for(e.pos=t+1,e.isInLabel=!0,n=1;e.pos<a;){if(i=e.src.charCodeAt(e.pos),91===i)n++;else if(93===i&&(n--,0===n)){r=!0;break}e.parser.skipToken(e)}return r?(o=e.pos,e.labelUnmatchedScopes=0):e.labelUnmatchedScopes=n-1,e.pos=s,e.isInLabel=u,o}},function(e,t,n){\"use strict\";function r(e,t,n,r){var c,l,p,f,h,d,m,v,y;if(91!==e.charCodeAt(0))return-1;if(e.indexOf(\"]:\")===-1)return-1;if(c=new i(e,t,n,r,[]),l=o(c,0),l<0||58!==e.charCodeAt(l+1))return-1;for(f=c.posMax,p=l+2;p<f&&(h=c.src.charCodeAt(p),32===h||10===h);p++);if(!a(c,p))return-1;for(m=c.linkContent,p=c.pos,d=p,p+=1;p<f&&(h=c.src.charCodeAt(p),32===h||10===h);p++);for(p<f&&d!==p&&s(c,p)?(v=c.linkContent,p=c.pos):(v=\"\",p=d);p<f&&32===c.src.charCodeAt(p);)p++;return p<f&&10!==c.src.charCodeAt(p)?-1:(y=u(e.slice(1,l)),\"undefined\"==typeof r.references[y]&&(r.references[y]={title:v,href:m}),p)}var i=n(1089),o=n(1090),a=n(1092),s=n(1094),u=n(1095);e.exports=function(e){var t,n,i,o,a=e.tokens;if(e.env.references=e.env.references||{},!e.inlineMode)for(t=1,n=a.length-1;t<n;t++)if(\"inline\"===a[t].type&&\"paragraph_open\"===a[t-1].type&&\"paragraph_close\"===a[t+1].type){for(i=a[t].content;i.length&&(o=r(i,e.inline,e.options,e.env),!(o<0));)i=i.slice(o).trim();a[t].content=i,i.length||(a[t-1].tight=!0,a[t+1].tight=!0)}}},function(e,t,n){\"use strict\";var r=n(1093),i=n(1081).unescapeMd;e.exports=function(e,t){var n,o,a,s=t,u=e.posMax;if(60===e.src.charCodeAt(t)){for(t++;t<u;){if(n=e.src.charCodeAt(t),10===n)return!1;if(62===n)return a=r(i(e.src.slice(s+1,t))),!!e.parser.validateLink(a)&&(e.pos=t+1,e.linkContent=a,!0);92===n&&t+1<u?t+=2:t++}return!1}for(o=0;t<u&&(n=e.src.charCodeAt(t),32!==n)&&!(n>8&&n<14);)if(92===n&&t+1<u)t+=2;else{if(40===n&&(o++,o>1))break;if(41===n&&(o--,o<0))break;t++}return s!==t&&(a=i(e.src.slice(s,t)),!!e.parser.validateLink(a)&&(e.linkContent=a,e.pos=t,!0))}},function(e,t,n){\"use strict\";var r=n(1081).replaceEntities;e.exports=function(e){var t=r(e);try{t=decodeURI(t)}catch(e){}return encodeURI(t)}},function(e,t,n){\"use strict\";var r=n(1081).unescapeMd;e.exports=function(e,t){var n,i=t,o=e.posMax,a=e.src.charCodeAt(t);if(34!==a&&39!==a&&40!==a)return!1;for(t++,40===a&&(a=41);t<o;){if(n=e.src.charCodeAt(t),n===a)return e.pos=t+1,e.linkContent=r(e.src.slice(i+1,t)),!0;92===n&&t+1<o?t+=2:t++}return!1}},function(e,t){\"use strict\";e.exports=function(e){return e.trim().replace(/\\s+/g,\" \").toUpperCase()}},function(e,t){\"use strict\";e.exports=function(e){var t,n,r,i=e.tokens;for(n=0,r=i.length;n<r;n++)t=i[n],\"inline\"===t.type&&e.inline.parse(t.content,e.options,e.env,t.children)}},function(e,t){\"use strict\";e.exports=function(e){var t,n,r,i,o,a,s,u,c,l=0,p=!1,f={};if(e.env.footnotes&&(e.tokens=e.tokens.filter(function(e){return\"footnote_reference_open\"===e.type?(p=!0,u=[],c=e.label,!1):\"footnote_reference_close\"===e.type?(p=!1,f[\":\"+c]=u,!1):(p&&u.push(e),!p)}),e.env.footnotes.list)){for(a=e.env.footnotes.list,e.tokens.push({type:\"footnote_block_open\",level:l++}),t=0,n=a.length;t<n;t++){for(e.tokens.push({type:\"footnote_open\",id:t,level:l++}),a[t].tokens?(s=[],s.push({type:\"paragraph_open\",tight:!1,level:l++}),s.push({type:\"inline\",content:\"\",level:l,children:a[t].tokens}),s.push({type:\"paragraph_close\",tight:!1,level:--l})):a[t].label&&(s=f[\":\"+a[t].label]),e.tokens=e.tokens.concat(s),o=\"paragraph_close\"===e.tokens[e.tokens.length-1].type?e.tokens.pop():null,i=a[t].count>0?a[t].count:1,r=0;r<i;r++)e.tokens.push({type:\"footnote_anchor\",id:t,subId:r,level:l});o&&e.tokens.push(o),e.tokens.push({type:\"footnote_close\",level:--l})}e.tokens.push({type:\"footnote_block_close\",level:--l})}}},function(e,t){\"use strict\";function n(e){return e.replace(/([-()\\[\\]{}+?*.$\\^|,:#<!\\\\])/g,\"\\\\$1\")}var r=\" \\n()[]'\\\".,!?-\";e.exports=function(e){var t,i,o,a,s,u,c,l,p,f,h,d,m=e.tokens;if(e.env.abbreviations)for(e.env.abbrRegExp||(d=\"(^|[\"+r.split(\"\").map(n).join(\"\")+\"])(\"+Object.keys(e.env.abbreviations).map(function(e){return e.substr(1)}).sort(function(e,t){return t.length-e.length}).map(n).join(\"|\")+\")($|[\"+r.split(\"\").map(n).join(\"\")+\"])\",e.env.abbrRegExp=new RegExp(d,\"g\")),f=e.env.abbrRegExp,i=0,o=m.length;i<o;i++)if(\"inline\"===m[i].type)for(a=m[i].children,t=a.length-1;t>=0;t--)if(s=a[t],\"text\"===s.type){for(l=0,u=s.content,f.lastIndex=0,p=s.level,c=[];h=f.exec(u);)f.lastIndex>l&&c.push({type:\"text\",content:u.slice(l,h.index+h[1].length),level:p}),c.push({type:\"abbr_open\",title:e.env.abbreviations[\":\"+h[2]],level:p++}),c.push({type:\"text\",content:h[2],level:p}),c.push({type:\"abbr_close\",level:--p}),l=f.lastIndex-h[3].length;c.length&&(l<u.length&&c.push({type:\"text\",content:u.slice(l),level:p}),m[i].children=a=[].concat(a.slice(0,t),c,a.slice(t+1)))}}},function(e,t){\"use strict\";function n(e){return e.indexOf(\"(\")<0?e:e.replace(i,function(e,t){return o[t.toLowerCase()]})}var r=/\\+-|\\.\\.|\\?\\?\\?\\?|!!!!|,,|--/,i=/\\((c|tm|r|p)\\)/gi,o={c:\"©\",r:\"®\",p:\"§\",tm:\"™\"};e.exports=function(e){var t,i,o,a,s;if(e.options.typographer)for(s=e.tokens.length-1;s>=0;s--)if(\"inline\"===e.tokens[s].type)for(a=e.tokens[s].children,t=a.length-1;t>=0;t--)i=a[t],\"text\"===i.type&&(o=i.content,o=n(o),r.test(o)&&(o=o.replace(/\\+-/g,\"±\").replace(/\\.{2,}/g,\"…\").replace(/([?!])…/g,\"$1..\").replace(/([?!]){4,}/g,\"$1$1$1\").replace(/,{2,}/g,\",\").replace(/(^|[^-])---([^-]|$)/gm,\"$1—$2\").replace(/(^|\\s)--(\\s|$)/gm,\"$1–$2\").replace(/(^|[^-\\s])--([^-\\s]|$)/gm,\"$1–$2\")),i.content=o)}},function(e,t){\"use strict\";function n(e,t){return!(t<0||t>=e.length)&&!a.test(e[t])}function r(e,t,n){return e.substr(0,t)+n+e.substr(t+1)}var i=/['\"]/,o=/['\"]/g,a=/[-\\s()\\[\\]]/,s=\"’\";e.exports=function(e){var t,a,u,c,l,p,f,h,d,m,v,y,g,_,b,x,w;if(e.options.typographer)for(w=[],b=e.tokens.length-1;b>=0;b--)if(\"inline\"===e.tokens[b].type)for(x=e.tokens[b].children,w.length=0,t=0;t<x.length;t++)if(a=x[t],\"text\"===a.type&&!i.test(a.text)){for(f=x[t].level,g=w.length-1;g>=0&&!(w[g].level<=f);g--);w.length=g+1,u=a.content,l=0,p=u.length;e:for(;l<p&&(o.lastIndex=l,c=o.exec(u));)if(h=!n(u,c.index-1),l=c.index+1,_=\"'\"===c[0],d=!n(u,l),d||h){if(v=!d,y=!h)for(g=w.length-1;g>=0&&(m=w[g],!(w[g].level<f));g--)if(m.single===_&&w[g].level===f){m=w[g],_?(x[m.token].content=r(x[m.token].content,m.pos,e.options.quotes[2]),a.content=r(a.content,c.index,e.options.quotes[3])):(x[m.token].content=r(x[m.token].content,m.pos,e.options.quotes[0]),a.content=r(a.content,c.index,e.options.quotes[1])),w.length=g;continue e}v?w.push({token:t,pos:c.index,single:_,level:f}):y&&_&&(a.content=r(a.content,c.index,s))}else _&&(a.content=r(a.content,c.index,s))}}},function(e,t,n){\"use strict\";function r(e){return/^<a[>\\s]/i.test(e)}function i(e){return/^<\\/a\\s*>/i.test(e)}function o(){var e=[],t=new a({stripPrefix:!1,url:!0,email:!0,twitter:!1,replaceFn:function(t,n){switch(n.getType()){case\"url\":e.push({text:n.matchedText,url:n.getUrl()});break;case\"email\":e.push({text:n.matchedText,url:\"mailto:\"+n.getEmail().replace(/^mailto:/i,\"\")})}return!1}});return{links:e,autolinker:t}}var a=n(1102),s=/www|@|\\:\\/\\//;e.exports=function(e){var t,n,a,u,c,l,p,f,h,d,m,v,y,g=e.tokens,_=null;if(e.options.linkify)for(n=0,a=g.length;n<a;n++)if(\"inline\"===g[n].type)for(u=g[n].children,m=0,t=u.length-1;t>=0;t--)if(c=u[t],\"link_close\"!==c.type){if(\"htmltag\"===c.type&&(r(c.content)&&m>0&&m--,i(c.content)&&m++),!(m>0)&&\"text\"===c.type&&s.test(c.content)){if(_||(_=o(),v=_.links,y=_.autolinker),l=c.content,v.length=0,y.link(l),!v.length)continue;for(p=[],d=c.level,f=0;f<v.length;f++)e.inline.validateLink(v[f].url)&&(h=l.indexOf(v[f].text),h&&(d=d,p.push({type:\"text\",content:l.slice(0,h),level:d})),p.push({type:\"link_open\",href:v[f].url,title:\"\",level:d++}),p.push({type:\"text\",content:v[f].text,level:d}),p.push({type:\"link_close\",level:--d}),l=l.slice(h+v[f].text.length));l.length&&p.push({type:\"text\",content:l,level:d}),g[n].children=u=[].concat(u.slice(0,t),p,u.slice(t+1))}}else for(t--;u[t].level!==c.level&&\"link_open\"!==u[t].type;)t--}},function(e,t,n){var r,i;!function(n,o){r=[],i=function(){return n.Autolinker=o()}.apply(t,r),!(void 0!==i&&(e.exports=i))}(this,function(){/*!\n\t * Autolinker.js\n\t * 0.15.3\n\t *\n\t * Copyright(c) 2015 Gregory Jacobs <greg@greg-jacobs.com>\n\t * MIT Licensed. http://www.opensource.org/licenses/mit-license.php\n\t *\n\t * https://github.com/gregjacobs/Autolinker.js\n\t */\nvar e=function(t){e.Util.assign(this,t)};return e.prototype={constructor:e,urls:!0,email:!0,twitter:!0,newWindow:!0,stripPrefix:!0,truncate:void 0,className:\"\",htmlParser:void 0,matchParser:void 0,tagBuilder:void 0,link:function(e){for(var t=this.getHtmlParser(),n=t.parse(e),r=0,i=[],o=0,a=n.length;o<a;o++){var s=n[o],u=s.getType(),c=s.getText();if(\"element\"===u)\"a\"===s.getTagName()&&(s.isClosing()?r=Math.max(r-1,0):r++),i.push(c);else if(\"entity\"===u)i.push(c);else if(0===r){var l=this.linkifyStr(c);i.push(l)}else i.push(c)}return i.join(\"\")},linkifyStr:function(e){return this.getMatchParser().replace(e,this.createMatchReturnVal,this)},createMatchReturnVal:function(t){var n;if(this.replaceFn&&(n=this.replaceFn.call(this,this,t)),\"string\"==typeof n)return n;if(n===!1)return t.getMatchedText();if(n instanceof e.HtmlTag)return n.toString();var r=this.getTagBuilder(),i=r.build(t);return i.toString()},getHtmlParser:function(){var t=this.htmlParser;return t||(t=this.htmlParser=new e.htmlParser.HtmlParser),t},getMatchParser:function(){var t=this.matchParser;return t||(t=this.matchParser=new e.matchParser.MatchParser({urls:this.urls,email:this.email,twitter:this.twitter,stripPrefix:this.stripPrefix})),t},getTagBuilder:function(){var t=this.tagBuilder;return t||(t=this.tagBuilder=new e.AnchorTagBuilder({newWindow:this.newWindow,truncate:this.truncate,className:this.className})),t}},e.link=function(t,n){var r=new e(n);return r.link(t)},e.match={},e.htmlParser={},e.matchParser={},e.Util={abstractMethod:function(){throw\"abstract\"},assign:function(e,t){for(var n in t)t.hasOwnProperty(n)&&(e[n]=t[n]);return e},extend:function(t,n){var r=t.prototype,i=function(){};i.prototype=r;var o;o=n.hasOwnProperty(\"constructor\")?n.constructor:function(){r.constructor.apply(this,arguments)};var a=o.prototype=new i;return a.constructor=o,a.superclass=r,delete n.constructor,e.Util.assign(a,n),o},ellipsis:function(e,t,n){return e.length>t&&(n=null==n?\"..\":n,e=e.substring(0,t-n.length)+n),e},indexOf:function(e,t){if(Array.prototype.indexOf)return e.indexOf(t);for(var n=0,r=e.length;n<r;n++)if(e[n]===t)return n;return-1},splitAndCapture:function(e,t){if(!t.global)throw new Error(\"`splitRegex` must have the 'g' flag set\");for(var n,r=[],i=0;n=t.exec(e);)r.push(e.substring(i,n.index)),r.push(n[0]),i=n.index+n[0].length;return r.push(e.substring(i)),r}},e.HtmlTag=e.Util.extend(Object,{whitespaceRegex:/\\s+/,constructor:function(t){e.Util.assign(this,t),this.innerHtml=this.innerHtml||this.innerHTML},setTagName:function(e){return this.tagName=e,this},getTagName:function(){return this.tagName||\"\"},setAttr:function(e,t){var n=this.getAttrs();return n[e]=t,this},getAttr:function(e){return this.getAttrs()[e]},setAttrs:function(t){var n=this.getAttrs();return e.Util.assign(n,t),this},getAttrs:function(){return this.attrs||(this.attrs={})},setClass:function(e){return this.setAttr(\"class\",e)},addClass:function(t){for(var n,r=this.getClass(),i=this.whitespaceRegex,o=e.Util.indexOf,a=r?r.split(i):[],s=t.split(i);n=s.shift();)o(a,n)===-1&&a.push(n);return this.getAttrs().class=a.join(\" \"),this},removeClass:function(t){for(var n,r=this.getClass(),i=this.whitespaceRegex,o=e.Util.indexOf,a=r?r.split(i):[],s=t.split(i);a.length&&(n=s.shift());){var u=o(a,n);u!==-1&&a.splice(u,1)}return this.getAttrs().class=a.join(\" \"),this},getClass:function(){return this.getAttrs().class||\"\"},hasClass:function(e){return(\" \"+this.getClass()+\" \").indexOf(\" \"+e+\" \")!==-1},setInnerHtml:function(e){return this.innerHtml=e,this},getInnerHtml:function(){return this.innerHtml||\"\"},toString:function(){var e=this.getTagName(),t=this.buildAttrsStr();return t=t?\" \"+t:\"\",[\"<\",e,t,\">\",this.getInnerHtml(),\"</\",e,\">\"].join(\"\")},buildAttrsStr:function(){if(!this.attrs)return\"\";var e=this.getAttrs(),t=[];for(var n in e)e.hasOwnProperty(n)&&t.push(n+'=\"'+e[n]+'\"');return t.join(\" \")}}),e.AnchorTagBuilder=e.Util.extend(Object,{constructor:function(t){e.Util.assign(this,t)},build:function(t){var n=new e.HtmlTag({tagName:\"a\",attrs:this.createAttrs(t.getType(),t.getAnchorHref()),innerHtml:this.processAnchorText(t.getAnchorText())});return n},createAttrs:function(e,t){var n={href:t},r=this.createCssClass(e);return r&&(n.class=r),this.newWindow&&(n.target=\"_blank\"),n},createCssClass:function(e){var t=this.className;return t?t+\" \"+t+\"-\"+e:\"\"},processAnchorText:function(e){return e=this.doTruncate(e)},doTruncate:function(t){return e.Util.ellipsis(t,this.truncate||Number.POSITIVE_INFINITY)}}),e.htmlParser.HtmlParser=e.Util.extend(Object,{htmlRegex:function(){var e=/[0-9a-zA-Z][0-9a-zA-Z:]*/,t=/[^\\s\\0\"'>\\/=\\x01-\\x1F\\x7F]+/,n=/(?:\"[^\"]*?\"|'[^']*?'|[^'\"=<>`\\s]+)/,r=t.source+\"(?:\\\\s*=\\\\s*\"+n.source+\")?\";return new RegExp([\"(?:\",\"<(!DOCTYPE)\",\"(?:\",\"\\\\s+\",\"(?:\",r,\"|\",n.source+\")\",\")*\",\">\",\")\",\"|\",\"(?:\",\"<(/)?\",\"(\"+e.source+\")\",\"(?:\",\"\\\\s+\",r,\")*\",\"\\\\s*/?\",\">\",\")\"].join(\"\"),\"gi\")}(),htmlCharacterEntitiesRegex:/(&nbsp;|&#160;|&lt;|&#60;|&gt;|&#62;|&quot;|&#34;|&#39;)/gi,parse:function(e){for(var t,n,r=this.htmlRegex,i=0,o=[];null!==(t=r.exec(e));){var a=t[0],s=t[1]||t[3],u=!!t[2],c=e.substring(i,t.index);c&&(n=this.parseTextAndEntityNodes(c),o.push.apply(o,n)),o.push(this.createElementNode(a,s,u)),i=t.index+a.length}if(i<e.length){var l=e.substring(i);l&&(n=this.parseTextAndEntityNodes(l),o.push.apply(o,n))}return o},parseTextAndEntityNodes:function(t){for(var n=[],r=e.Util.splitAndCapture(t,this.htmlCharacterEntitiesRegex),i=0,o=r.length;i<o;i+=2){var a=r[i],s=r[i+1];a&&n.push(this.createTextNode(a)),s&&n.push(this.createEntityNode(s))}return n},createElementNode:function(t,n,r){return new e.htmlParser.ElementNode({text:t,tagName:n.toLowerCase(),closing:r})},createEntityNode:function(t){return new e.htmlParser.EntityNode({text:t})},createTextNode:function(t){return new e.htmlParser.TextNode({text:t})}}),e.htmlParser.HtmlNode=e.Util.extend(Object,{text:\"\",constructor:function(t){e.Util.assign(this,t)},getType:e.Util.abstractMethod,getText:function(){return this.text}}),e.htmlParser.ElementNode=e.Util.extend(e.htmlParser.HtmlNode,{tagName:\"\",closing:!1,getType:function(){return\"element\"},getTagName:function(){return this.tagName},isClosing:function(){return this.closing}}),e.htmlParser.EntityNode=e.Util.extend(e.htmlParser.HtmlNode,{getType:function(){return\"entity\"}}),e.htmlParser.TextNode=e.Util.extend(e.htmlParser.HtmlNode,{getType:function(){return\"text\"}}),e.matchParser.MatchParser=e.Util.extend(Object,{urls:!0,email:!0,twitter:!0,stripPrefix:!0,matcherRegex:function(){var e=/(^|[^\\w])@(\\w{1,15})/,t=/(?:[\\-;:&=\\+\\$,\\w\\.]+@)/,n=/(?:[A-Za-z][-.+A-Za-z0-9]+:(?![A-Za-z][-.+A-Za-z0-9]+:\\/\\/)(?!\\d+\\/?)(?:\\/\\/)?)/,r=/(?:www\\.)/,i=/[A-Za-z0-9\\.\\-]*[A-Za-z0-9\\-]/,o=/\\.(?:international|construction|contractors|enterprises|photography|productions|foundation|immobilien|industries|management|properties|technology|christmas|community|directory|education|equipment|institute|marketing|solutions|vacations|bargains|boutique|builders|catering|cleaning|clothing|computer|democrat|diamonds|graphics|holdings|lighting|partners|plumbing|supplies|training|ventures|academy|careers|company|cruises|domains|exposed|flights|florist|gallery|guitars|holiday|kitchen|neustar|okinawa|recipes|rentals|reviews|shiksha|singles|support|systems|agency|berlin|camera|center|coffee|condos|dating|estate|events|expert|futbol|kaufen|luxury|maison|monash|museum|nagoya|photos|repair|report|social|supply|tattoo|tienda|travel|viajes|villas|vision|voting|voyage|actor|build|cards|cheap|codes|dance|email|glass|house|mango|ninja|parts|photo|shoes|solar|today|tokyo|tools|watch|works|aero|arpa|asia|best|bike|blue|buzz|camp|club|cool|coop|farm|fish|gift|guru|info|jobs|kiwi|kred|land|limo|link|menu|mobi|moda|name|pics|pink|post|qpon|rich|ruhr|sexy|tips|vote|voto|wang|wien|wiki|zone|bar|bid|biz|cab|cat|ceo|com|edu|gov|int|kim|mil|net|onl|org|pro|pub|red|tel|uno|wed|xxx|xyz|ac|ad|ae|af|ag|ai|al|am|an|ao|aq|ar|as|at|au|aw|ax|az|ba|bb|bd|be|bf|bg|bh|bi|bj|bm|bn|bo|br|bs|bt|bv|bw|by|bz|ca|cc|cd|cf|cg|ch|ci|ck|cl|cm|cn|co|cr|cu|cv|cw|cx|cy|cz|de|dj|dk|dm|do|dz|ec|ee|eg|er|es|et|eu|fi|fj|fk|fm|fo|fr|ga|gb|gd|ge|gf|gg|gh|gi|gl|gm|gn|gp|gq|gr|gs|gt|gu|gw|gy|hk|hm|hn|hr|ht|hu|id|ie|il|im|in|io|iq|ir|is|it|je|jm|jo|jp|ke|kg|kh|ki|km|kn|kp|kr|kw|ky|kz|la|lb|lc|li|lk|lr|ls|lt|lu|lv|ly|ma|mc|md|me|mg|mh|mk|ml|mm|mn|mo|mp|mq|mr|ms|mt|mu|mv|mw|mx|my|mz|na|nc|ne|nf|ng|ni|nl|no|np|nr|nu|nz|om|pa|pe|pf|pg|ph|pk|pl|pm|pn|pr|ps|pt|pw|py|qa|re|ro|rs|ru|rw|sa|sb|sc|sd|se|sg|sh|si|sj|sk|sl|sm|sn|so|sr|st|su|sv|sx|sy|sz|tc|td|tf|tg|th|tj|tk|tl|tm|tn|to|tp|tr|tt|tv|tw|tz|ua|ug|uk|us|uy|uz|va|vc|ve|vg|vi|vn|vu|wf|ws|ye|yt|za|zm|zw)\\b/,a=/[\\-A-Za-z0-9+&@#\\/%=~_()|'$*\\[\\]?!:,.;]*[\\-A-Za-z0-9+&@#\\/%=~_()|'$*\\[\\]]/;return new RegExp([\"(\",e.source,\")\",\"|\",\"(\",t.source,i.source,o.source,\")\",\"|\",\"(\",\"(?:\",\"(\",n.source,i.source,\")\",\"|\",\"(?:\",\"(.?//)?\",r.source,i.source,\")\",\"|\",\"(?:\",\"(.?//)?\",i.source,o.source,\")\",\")\",\"(?:\"+a.source+\")?\",\")\"].join(\"\"),\"gi\")}(),charBeforeProtocolRelMatchRegex:/^(.)?\\/\\//,constructor:function(t){e.Util.assign(this,t),this.matchValidator=new e.MatchValidator},replace:function(e,t,n){var r=this;return e.replace(this.matcherRegex,function(e,i,o,a,s,u,c,l,p){var f=r.processCandidateMatch(e,i,o,a,s,u,c,l,p);if(f){var h=t.call(n,f.match);return f.prefixStr+h+f.suffixStr}return e})},processCandidateMatch:function(t,n,r,i,o,a,s,u,c){var l,p=u||c,f=\"\",h=\"\";if(n&&!this.twitter||o&&!this.email||a&&!this.urls||!this.matchValidator.isValidMatch(a,s,p))return null;if(this.matchHasUnbalancedClosingParen(t)&&(t=t.substr(0,t.length-1),h=\")\"),o)l=new e.match.Email({matchedText:t,email:o});else if(n)r&&(f=r,t=t.slice(1)),l=new e.match.Twitter({matchedText:t,twitterHandle:i});else{if(p){var d=p.match(this.charBeforeProtocolRelMatchRegex)[1]||\"\";d&&(f=d,t=t.slice(1))}l=new e.match.Url({matchedText:t,url:t,protocolUrlMatch:!!s,protocolRelativeMatch:!!p,stripPrefix:this.stripPrefix})}return{prefixStr:f,suffixStr:h,match:l}},matchHasUnbalancedClosingParen:function(e){var t=e.charAt(e.length-1);if(\")\"===t){var n=e.match(/\\(/g),r=e.match(/\\)/g),i=n&&n.length||0,o=r&&r.length||0;if(i<o)return!0}return!1}}),e.MatchValidator=e.Util.extend(Object,{invalidProtocolRelMatchRegex:/^[\\w]\\/\\//,hasFullProtocolRegex:/^[A-Za-z][-.+A-Za-z0-9]+:\\/\\//,uriSchemeRegex:/^[A-Za-z][-.+A-Za-z0-9]+:/,hasWordCharAfterProtocolRegex:/:[^\\s]*?[A-Za-z]/,isValidMatch:function(e,t,n){return!(t&&!this.isValidUriScheme(t)||this.urlMatchDoesNotHaveProtocolOrDot(e,t)||this.urlMatchDoesNotHaveAtLeastOneWordChar(e,t)||this.isInvalidProtocolRelativeMatch(n))},isValidUriScheme:function(e){var t=e.match(this.uriSchemeRegex)[0].toLowerCase();return\"javascript:\"!==t&&\"vbscript:\"!==t},urlMatchDoesNotHaveProtocolOrDot:function(e,t){return!(!e||t&&this.hasFullProtocolRegex.test(t)||e.indexOf(\".\")!==-1)},urlMatchDoesNotHaveAtLeastOneWordChar:function(e,t){return!(!e||!t)&&!this.hasWordCharAfterProtocolRegex.test(e)},isInvalidProtocolRelativeMatch:function(e){return!!e&&this.invalidProtocolRelMatchRegex.test(e)}}),e.match.Match=e.Util.extend(Object,{constructor:function(t){e.Util.assign(this,t)},getType:e.Util.abstractMethod,getMatchedText:function(){return this.matchedText},getAnchorHref:e.Util.abstractMethod,getAnchorText:e.Util.abstractMethod}),e.match.Email=e.Util.extend(e.match.Match,{getType:function(){return\"email\"},getEmail:function(){return this.email},getAnchorHref:function(){return\"mailto:\"+this.email},getAnchorText:function(){return this.email}}),e.match.Twitter=e.Util.extend(e.match.Match,{getType:function(){return\"twitter\"},getTwitterHandle:function(){return this.twitterHandle},getAnchorHref:function(){return\"https://twitter.com/\"+this.twitterHandle},getAnchorText:function(){return\"@\"+this.twitterHandle}}),e.match.Url=e.Util.extend(e.match.Match,{urlPrefixRegex:/^(https?:\\/\\/)?(www\\.)?/i,protocolRelativeRegex:/^\\/\\//,protocolPrepended:!1,getType:function(){return\"url\"},getUrl:function(){var e=this.url;return this.protocolRelativeMatch||this.protocolUrlMatch||this.protocolPrepended||(e=this.url=\"http://\"+e,this.protocolPrepended=!0),e},getAnchorHref:function(){var e=this.getUrl();return e.replace(/&amp;/g,\"&\")},getAnchorText:function(){var e=this.getUrl();return this.protocolRelativeMatch&&(e=this.stripProtocolRelativePrefix(e)),this.stripPrefix&&(e=this.stripUrlPrefix(e)),e=this.removeTrailingSlash(e)},stripUrlPrefix:function(e){return e.replace(this.urlPrefixRegex,\"\")},stripProtocolRelativePrefix:function(e){return e.replace(this.protocolRelativeRegex,\"\")},removeTrailingSlash:function(e){return\"/\"===e.charAt(e.length-1)&&(e=e.slice(0,-1)),e}}),e})},function(e,t,n){\"use strict\";function r(){this.ruler=new i;for(var e=0;e<a.length;e++)this.ruler.push(a[e][0],a[e][1],{alt:(a[e][2]||[]).slice()})}var i=n(1086),o=n(1104),a=[[\"code\",n(1105)],[\"fences\",n(1106),[\"paragraph\",\"blockquote\",\"list\"]],[\"blockquote\",n(1107),[\"paragraph\",\"blockquote\",\"list\"]],[\"hr\",n(1108),[\"paragraph\",\"blockquote\",\"list\"]],[\"list\",n(1109),[\"paragraph\",\"blockquote\"]],[\"footnote\",n(1110),[\"paragraph\"]],[\"heading\",n(1111),[\"paragraph\",\"blockquote\"]],[\"lheading\",n(1112)],[\"htmlblock\",n(1113),[\"paragraph\",\"blockquote\"]],[\"table\",n(1115),[\"paragraph\"]],[\"deflist\",n(1116),[\"paragraph\"]],[\"paragraph\",n(1117)]];r.prototype.tokenize=function(e,t,n){for(var r,i,o=this.ruler.getRules(\"\"),a=o.length,s=t,u=!1;s<n&&(e.line=s=e.skipEmptyLines(s),!(s>=n))&&!(e.tShift[s]<e.blkIndent);){for(i=0;i<a&&!(r=o[i](e,s,n,!1));i++);if(e.tight=!u,e.isEmpty(e.line-1)&&(u=!0),s=e.line,s<n&&e.isEmpty(s)){if(u=!0,s++,s<n&&\"list\"===e.parentType&&e.isEmpty(s))break;e.line=s}}};var s=/[\\n\\t]/g,u=/\\r[\\n\\u0085]|[\\u2424\\u2028\\u0085]/g,c=/\\u00a0/g;r.prototype.parse=function(e,t,n,r){var i,a=0,l=0;return e?(e=e.replace(c,\" \"),e=e.replace(u,\"\\n\"),e.indexOf(\"\\t\")>=0&&(e=e.replace(s,function(t,n){var r;return 10===e.charCodeAt(n)?(a=n+1,l=0,t):(r=\"    \".slice((n-a-l)%4),l=n-a+1,r)})),i=new o(e,this,t,n,r),void this.tokenize(i,i.line,i.lineMax)):[]},e.exports=r},function(e,t){\"use strict\";function n(e,t,n,r,i){var o,a,s,u,c,l,p;for(this.src=e,this.parser=t,this.options=n,this.env=r,this.tokens=i,this.bMarks=[],this.eMarks=[],this.tShift=[],this.blkIndent=0,this.line=0,this.lineMax=0,this.tight=!1,this.parentType=\"root\",this.ddIndent=-1,this.level=0,this.result=\"\",a=this.src,l=0,p=!1,s=u=l=0,c=a.length;u<c;u++){if(o=a.charCodeAt(u),!p){if(32===o){l++;continue}p=!0}10!==o&&u!==c-1||(10!==o&&u++,this.bMarks.push(s),this.eMarks.push(u),this.tShift.push(l),p=!1,l=0,s=u+1)}this.bMarks.push(a.length),this.eMarks.push(a.length),this.tShift.push(0),this.lineMax=this.bMarks.length-1}n.prototype.isEmpty=function(e){return this.bMarks[e]+this.tShift[e]>=this.eMarks[e]},n.prototype.skipEmptyLines=function(e){for(var t=this.lineMax;e<t&&!(this.bMarks[e]+this.tShift[e]<this.eMarks[e]);e++);return e},n.prototype.skipSpaces=function(e){for(var t=this.src.length;e<t&&32===this.src.charCodeAt(e);e++);return e},n.prototype.skipChars=function(e,t){for(var n=this.src.length;e<n&&this.src.charCodeAt(e)===t;e++);return e},n.prototype.skipCharsBack=function(e,t,n){if(e<=n)return e;for(;e>n;)if(t!==this.src.charCodeAt(--e))return e+1;return e},n.prototype.getLines=function(e,t,n,r){var i,o,a,s,u,c=e;if(e>=t)return\"\";if(c+1===t)return o=this.bMarks[c]+Math.min(this.tShift[c],n),a=r?this.eMarks[c]+1:this.eMarks[c],this.src.slice(o,a);for(s=new Array(t-e),i=0;c<t;c++,i++)u=this.tShift[c],u>n&&(u=n),u<0&&(u=0),o=this.bMarks[c]+u,a=c+1<t||r?this.eMarks[c]+1:this.eMarks[c],s[i]=this.src.slice(o,a);return s.join(\"\")},e.exports=n},function(e,t){\"use strict\";e.exports=function(e,t,n){var r,i;if(e.tShift[t]-e.blkIndent<4)return!1;for(i=r=t+1;r<n;)if(e.isEmpty(r))r++;else{if(!(e.tShift[r]-e.blkIndent>=4))break;r++,i=r}return e.line=r,e.tokens.push({type:\"code\",content:e.getLines(t,i,4+e.blkIndent,!0),block:!0,lines:[t,e.line],level:e.level}),!0}},function(e,t){\"use strict\";e.exports=function(e,t,n,r){var i,o,a,s,u,c=!1,l=e.bMarks[t]+e.tShift[t],p=e.eMarks[t];if(l+3>p)return!1;if(i=e.src.charCodeAt(l),126!==i&&96!==i)return!1;if(u=l,l=e.skipChars(l,i),o=l-u,o<3)return!1;if(a=e.src.slice(l,p).trim(),a.indexOf(\"`\")>=0)return!1;if(r)return!0;for(s=t;(s++,!(s>=n))&&(l=u=e.bMarks[s]+e.tShift[s],p=e.eMarks[s],!(l<p&&e.tShift[s]<e.blkIndent));)if(e.src.charCodeAt(l)===i&&!(e.tShift[s]-e.blkIndent>=4||(l=e.skipChars(l,i),l-u<o||(l=e.skipSpaces(l),l<p)))){c=!0;break}return o=e.tShift[t],e.line=s+(c?1:0),e.tokens.push({type:\"fence\",params:a,content:e.getLines(t+1,s,o,!0),lines:[t,e.line],level:e.level}),!0}},function(e,t){\"use strict\";e.exports=function(e,t,n,r){var i,o,a,s,u,c,l,p,f,h,d,m=e.bMarks[t]+e.tShift[t],v=e.eMarks[t];if(m>v)return!1;if(62!==e.src.charCodeAt(m++))return!1;if(e.level>=e.options.maxNesting)return!1;if(r)return!0;for(32===e.src.charCodeAt(m)&&m++,u=e.blkIndent,e.blkIndent=0,s=[e.bMarks[t]],e.bMarks[t]=m,m=m<v?e.skipSpaces(m):m,o=m>=v,a=[e.tShift[t]],e.tShift[t]=m-e.bMarks[t],p=e.parser.ruler.getRules(\"blockquote\"),i=t+1;i<n&&(m=e.bMarks[i]+e.tShift[i],v=e.eMarks[i],!(m>=v));i++)if(62!==e.src.charCodeAt(m++)){if(o)break;for(d=!1,f=0,h=p.length;f<h;f++)if(p[f](e,i,n,!0)){d=!0;break}if(d)break;s.push(e.bMarks[i]),a.push(e.tShift[i]),e.tShift[i]=-1337}else 32===e.src.charCodeAt(m)&&m++,s.push(e.bMarks[i]),e.bMarks[i]=m,m=m<v?e.skipSpaces(m):m,o=m>=v,a.push(e.tShift[i]),e.tShift[i]=m-e.bMarks[i];for(c=e.parentType,e.parentType=\"blockquote\",e.tokens.push({type:\"blockquote_open\",lines:l=[t,0],level:e.level++}),e.parser.tokenize(e,t,i),e.tokens.push({type:\"blockquote_close\",level:--e.level}),e.parentType=c,l[1]=e.line,f=0;f<a.length;f++)e.bMarks[f+t]=s[f],e.tShift[f+t]=a[f];return e.blkIndent=u,!0}},function(e,t){\"use strict\";e.exports=function(e,t,n,r){var i,o,a,s=e.bMarks[t],u=e.eMarks[t];if(s+=e.tShift[t],s>u)return!1;if(i=e.src.charCodeAt(s++),42!==i&&45!==i&&95!==i)return!1;for(o=1;s<u;){if(a=e.src.charCodeAt(s++),a!==i&&32!==a)return!1;a===i&&o++}return!(o<3)&&(!!r||(e.line=t+1,e.tokens.push({type:\"hr\",lines:[t,e.line],level:e.level}),!0))}},function(e,t){\"use strict\";function n(e,t){var n,r,i;return r=e.bMarks[t]+e.tShift[t],i=e.eMarks[t],r>=i?-1:(n=e.src.charCodeAt(r++),42!==n&&45!==n&&43!==n?-1:r<i&&32!==e.src.charCodeAt(r)?-1:r)}function r(e,t){var n,r=e.bMarks[t]+e.tShift[t],i=e.eMarks[t];if(r+1>=i)return-1;if(n=e.src.charCodeAt(r++),n<48||n>57)return-1;for(;;){if(r>=i)return-1;if(n=e.src.charCodeAt(r++),!(n>=48&&n<=57)){if(41===n||46===n)break;return-1}}return r<i&&32!==e.src.charCodeAt(r)?-1:r}function i(e,t){var n,r,i=e.level+2;for(n=t+2,r=e.tokens.length-2;n<r;n++)e.tokens[n].level===i&&\"paragraph_open\"===e.tokens[n].type&&(e.tokens[n+2].tight=!0,e.tokens[n].tight=!0,n+=2)}e.exports=function(e,t,o,a){var s,u,c,l,p,f,h,d,m,v,y,g,_,b,x,w,k,S,E,C,A,T,D=!0;if((d=r(e,t))>=0)_=!0;else{if(!((d=n(e,t))>=0))return!1;_=!1}if(e.level>=e.options.maxNesting)return!1;if(g=e.src.charCodeAt(d-1),a)return!0;for(x=e.tokens.length,_?(h=e.bMarks[t]+e.tShift[t],y=Number(e.src.substr(h,d-h-1)),e.tokens.push({type:\"ordered_list_open\",order:y,lines:k=[t,0],level:e.level++})):e.tokens.push({type:\"bullet_list_open\",lines:k=[t,0],level:e.level++}),s=t,w=!1,E=e.parser.ruler.getRules(\"list\");!(!(s<o)||(b=e.skipSpaces(d),m=e.eMarks[s],v=b>=m?1:b-d,v>4&&(v=1),v<1&&(v=1),u=d-e.bMarks[s]+v,e.tokens.push({type:\"list_item_open\",lines:S=[t,0],level:e.level++}),l=e.blkIndent,p=e.tight,c=e.tShift[t],f=e.parentType,e.tShift[t]=b-e.bMarks[t],e.blkIndent=u,e.tight=!0,e.parentType=\"list\",e.parser.tokenize(e,t,o,!0),e.tight&&!w||(D=!1),w=e.line-t>1&&e.isEmpty(e.line-1),e.blkIndent=l,e.tShift[t]=c,e.tight=p,e.parentType=f,e.tokens.push({type:\"list_item_close\",level:--e.level}),s=t=e.line,S[1]=s,b=e.bMarks[t],s>=o)||e.isEmpty(s)||e.tShift[s]<e.blkIndent);){for(T=!1,C=0,A=E.length;C<A;C++)if(E[C](e,s,o,!0)){T=!0;break}if(T)break;if(_){if(d=r(e,s),d<0)break}else if(d=n(e,s),d<0)break;if(g!==e.src.charCodeAt(d-1))break}return e.tokens.push({type:_?\"ordered_list_close\":\"bullet_list_close\",level:--e.level}),k[1]=s,e.line=s,D&&i(e,x),!0}},function(e,t){\"use strict\";e.exports=function(e,t,n,r){var i,o,a,s,u,c=e.bMarks[t]+e.tShift[t],l=e.eMarks[t];if(c+4>l)return!1;if(91!==e.src.charCodeAt(c))return!1;if(94!==e.src.charCodeAt(c+1))return!1;if(e.level>=e.options.maxNesting)return!1;for(s=c+2;s<l;s++){if(32===e.src.charCodeAt(s))return!1;if(93===e.src.charCodeAt(s))break}return s!==c+2&&(!(s+1>=l||58!==e.src.charCodeAt(++s))&&(!!r||(s++,e.env.footnotes||(e.env.footnotes={}),e.env.footnotes.refs||(e.env.footnotes.refs={}),u=e.src.slice(c+2,s-2),e.env.footnotes.refs[\":\"+u]=-1,e.tokens.push({type:\"footnote_reference_open\",label:u,level:e.level++}),i=e.bMarks[t],o=e.tShift[t],a=e.parentType,e.tShift[t]=e.skipSpaces(s)-s,e.bMarks[t]=s,e.blkIndent+=4,e.parentType=\"footnote\",e.tShift[t]<e.blkIndent&&(e.tShift[t]+=e.blkIndent,e.bMarks[t]-=e.blkIndent),e.parser.tokenize(e,t,n,!0),e.parentType=a,e.blkIndent-=4,e.tShift[t]=o,e.bMarks[t]=i,e.tokens.push({type:\"footnote_reference_close\",level:--e.level}),!0)))}},function(e,t){\"use strict\";e.exports=function(e,t,n,r){var i,o,a,s=e.bMarks[t]+e.tShift[t],u=e.eMarks[t];if(s>=u)return!1;if(i=e.src.charCodeAt(s),35!==i||s>=u)return!1;for(o=1,i=e.src.charCodeAt(++s);35===i&&s<u&&o<=6;)o++,i=e.src.charCodeAt(++s);return!(o>6||s<u&&32!==i)&&(!!r||(u=e.skipCharsBack(u,32,s),a=e.skipCharsBack(u,35,s),a>s&&32===e.src.charCodeAt(a-1)&&(u=a),e.line=t+1,e.tokens.push({type:\"heading_open\",hLevel:o,lines:[t,e.line],level:e.level}),s<u&&e.tokens.push({type:\"inline\",content:e.src.slice(s,u).trim(),level:e.level+1,lines:[t,e.line],children:[]}),e.tokens.push({type:\"heading_close\",hLevel:o,level:e.level}),!0))}},function(e,t){\"use strict\";e.exports=function(e,t,n){var r,i,o,a=t+1;return!(a>=n)&&(!(e.tShift[a]<e.blkIndent)&&(!(e.tShift[a]-e.blkIndent>3)&&(i=e.bMarks[a]+e.tShift[a],o=e.eMarks[a],!(i>=o)&&(r=e.src.charCodeAt(i),(45===r||61===r)&&(i=e.skipChars(i,r),i=e.skipSpaces(i),!(i<o)&&(i=e.bMarks[t]+e.tShift[t],e.line=a+1,e.tokens.push({type:\"heading_open\",hLevel:61===r?1:2,lines:[t,e.line],level:e.level}),e.tokens.push({type:\"inline\",content:e.src.slice(i,e.eMarks[t]).trim(),level:e.level+1,lines:[t,e.line-1],children:[]}),e.tokens.push({type:\"heading_close\",hLevel:61===r?1:2,level:e.level}),!0))))))}},function(e,t,n){\"use strict\";function r(e){var t=32|e;return t>=97&&t<=122}var i=n(1114),o=/^<([a-zA-Z]{1,15})[\\s\\/>]/,a=/^<\\/([a-zA-Z]{1,15})[\\s>]/;e.exports=function(e,t,n,s){var u,c,l,p=e.bMarks[t],f=e.eMarks[t],h=e.tShift[t];if(p+=h,!e.options.html)return!1;if(h>3||p+2>=f)return!1;if(60!==e.src.charCodeAt(p))return!1;if(u=e.src.charCodeAt(p+1),33===u||63===u){if(s)return!0}else{if(47!==u&&!r(u))return!1;if(47===u){if(c=e.src.slice(p,f).match(a),!c)return!1}else if(c=e.src.slice(p,f).match(o),!c)return!1;if(i[c[1].toLowerCase()]!==!0)return!1;if(s)return!0}for(l=t+1;l<e.lineMax&&!e.isEmpty(l);)l++;return e.line=l,e.tokens.push({type:\"htmlblock\",level:e.level,lines:[t,e.line],content:e.getLines(t,l,0,!0)}),!0}},function(e,t){\"use strict\";var n={};[\"article\",\"aside\",\"button\",\"blockquote\",\"body\",\"canvas\",\"caption\",\"col\",\"colgroup\",\"dd\",\"div\",\"dl\",\"dt\",\"embed\",\"fieldset\",\"figcaption\",\"figure\",\"footer\",\"form\",\"h1\",\"h2\",\"h3\",\"h4\",\"h5\",\"h6\",\"header\",\"hgroup\",\"hr\",\"iframe\",\"li\",\"map\",\"object\",\"ol\",\"output\",\"p\",\"pre\",\"progress\",\"script\",\"section\",\"style\",\"table\",\"tbody\",\"td\",\"textarea\",\"tfoot\",\"th\",\"tr\",\"thead\",\"ul\",\"video\"].forEach(function(e){n[e]=!0}),e.exports=n},function(e,t){\"use strict\";function n(e,t){var n=e.bMarks[t]+e.blkIndent,r=e.eMarks[t];return e.src.substr(n,r-n)}e.exports=function(e,t,r,i){var o,a,s,u,c,l,p,f,h,d,m;if(t+2>r)return!1;if(c=t+1,e.tShift[c]<e.blkIndent)return!1;if(s=e.bMarks[c]+e.tShift[c],s>=e.eMarks[c])return!1;if(o=e.src.charCodeAt(s),124!==o&&45!==o&&58!==o)return!1;if(a=n(e,t+1),!/^[-:| ]+$/.test(a))return!1;if(l=a.split(\"|\"),l<=2)return!1;for(f=[],u=0;u<l.length;u++){if(h=l[u].trim(),!h){if(0===u||u===l.length-1)continue;return!1}if(!/^:?-+:?$/.test(h))return!1;58===h.charCodeAt(h.length-1)?f.push(58===h.charCodeAt(0)?\"center\":\"right\"):58===h.charCodeAt(0)?f.push(\"left\"):f.push(\"\")}if(a=n(e,t).trim(),a.indexOf(\"|\")===-1)return!1;if(l=a.replace(/^\\||\\|$/g,\"\").split(\"|\"),f.length!==l.length)return!1;if(i)return!0;for(e.tokens.push({type:\"table_open\",lines:d=[t,0],level:e.level++}),e.tokens.push({type:\"thead_open\",lines:[t,t+1],level:e.level++}),e.tokens.push({type:\"tr_open\",lines:[t,t+1],level:e.level++}),u=0;u<l.length;u++)e.tokens.push({type:\"th_open\",align:f[u],lines:[t,t+1],level:e.level++}),e.tokens.push({type:\"inline\",content:l[u].trim(),lines:[t,t+1],level:e.level,children:[]}),e.tokens.push({type:\"th_close\",level:--e.level});for(e.tokens.push({type:\"tr_close\",level:--e.level}),e.tokens.push({type:\"thead_close\",level:--e.level}),e.tokens.push({type:\"tbody_open\",lines:m=[t+2,0],level:e.level++}),c=t+2;c<r&&!(e.tShift[c]<e.blkIndent)&&(a=n(e,c).trim(),a.indexOf(\"|\")!==-1);c++){for(l=a.replace(/^\\||\\|$/g,\"\").split(\"|\"),e.tokens.push({type:\"tr_open\",level:e.level++}),u=0;u<l.length;u++)e.tokens.push({type:\"td_open\",align:f[u],level:e.level++}),p=l[u].substring(124===l[u].charCodeAt(0)?1:0,124===l[u].charCodeAt(l[u].length-1)?l[u].length-1:l[u].length).trim(),e.tokens.push({type:\"inline\",content:p,level:e.level,children:[]}),e.tokens.push({type:\"td_close\",level:--e.level});e.tokens.push({type:\"tr_close\",level:--e.level})}return e.tokens.push({type:\"tbody_close\",level:--e.level}),e.tokens.push({type:\"table_close\",level:--e.level}),d[1]=m[1]=c,e.line=c,!0}},function(e,t){\"use strict\";function n(e,t){var n,r,i=e.bMarks[t]+e.tShift[t],o=e.eMarks[t];return i>=o?-1:(r=e.src.charCodeAt(i++),126!==r&&58!==r?-1:(n=e.skipSpaces(i),i===n?-1:n>=o?-1:n))}function r(e,t){var n,r,i=e.level+2;for(n=t+2,r=e.tokens.length-2;n<r;n++)e.tokens[n].level===i&&\"paragraph_open\"===e.tokens[n].type&&(e.tokens[n+2].tight=!0,e.tokens[n].tight=!0,n+=2)}e.exports=function(e,t,i,o){var a,s,u,c,l,p,f,h,d,m,v,y,g,_;if(o)return!(e.ddIndent<0)&&n(e,t)>=0;if(f=t+1,e.isEmpty(f)&&++f>i)return!1;if(e.tShift[f]<e.blkIndent)return!1;if(a=n(e,f),a<0)return!1;if(e.level>=e.options.maxNesting)return!1;p=e.tokens.length,e.tokens.push({type:\"dl_open\",lines:l=[t,0],level:e.level++}),u=t,s=f;e:for(;;){for(_=!0,g=!1,e.tokens.push({type:\"dt_open\",lines:[u,u],level:e.level++}),e.tokens.push({type:\"inline\",content:e.getLines(u,u+1,e.blkIndent,!1).trim(),level:e.level+1,lines:[u,u],children:[]}),e.tokens.push({type:\"dt_close\",level:--e.level});;){if(e.tokens.push({type:\"dd_open\",lines:c=[f,0],level:e.level++}),y=e.tight,d=e.ddIndent,h=e.blkIndent,v=e.tShift[s],m=e.parentType,e.blkIndent=e.ddIndent=e.tShift[s]+2,e.tShift[s]=a-e.bMarks[s],e.tight=!0,e.parentType=\"deflist\",e.parser.tokenize(e,s,i,!0),e.tight&&!g||(_=!1),g=e.line-s>1&&e.isEmpty(e.line-1),e.tShift[s]=v,e.tight=y,e.parentType=m,e.blkIndent=h,e.ddIndent=d,e.tokens.push({type:\"dd_close\",level:--e.level}),c[1]=f=e.line,f>=i)break e;if(e.tShift[f]<e.blkIndent)break e;if(a=n(e,f),a<0)break;s=f}if(f>=i)break;if(u=f,e.isEmpty(u))break;if(e.tShift[u]<e.blkIndent)break;if(s=u+1,s>=i)break;if(e.isEmpty(s)&&s++,s>=i)break;if(e.tShift[s]<e.blkIndent)break;if(a=n(e,s),a<0)break}return e.tokens.push({type:\"dl_close\",level:--e.level}),l[1]=f,e.line=f,_&&r(e,p),!0}},function(e,t){\"use strict\";e.exports=function(e,t){var n,r,i,o,a,s,u=t+1;if(n=e.lineMax,u<n&&!e.isEmpty(u))for(s=e.parser.ruler.getRules(\"paragraph\");u<n&&!e.isEmpty(u);u++)if(!(e.tShift[u]-e.blkIndent>3)){for(i=!1,o=0,a=s.length;o<a;o++)if(s[o](e,u,n,!0)){i=!0;break}if(i)break}return r=e.getLines(t,u,e.blkIndent,!1).trim(),e.line=u,r.length&&(e.tokens.push({type:\"paragraph_open\",tight:!1,lines:[t,e.line],level:e.level}),e.tokens.push({type:\"inline\",content:r,level:e.level+1,lines:[t,e.line],children:[]}),e.tokens.push({type:\"paragraph_close\",tight:!1,level:e.level})),!0}},function(e,t,n){\"use strict\";function r(){this.ruler=new o;for(var e=0;e<u.length;e++)this.ruler.push(u[e][0],u[e][1]);this.validateLink=i}function i(e){var t=[\"vbscript\",\"javascript\",\"file\",\"data\"],n=e.trim().toLowerCase();return n=s.replaceEntities(n),n.indexOf(\":\")===-1||t.indexOf(n.split(\":\")[0])===-1}var o=n(1086),a=n(1089),s=n(1081),u=[[\"text\",n(1119)],[\"newline\",n(1120)],[\"escape\",n(1121)],[\"backticks\",n(1122)],[\"del\",n(1123)],[\"ins\",n(1124)],[\"mark\",n(1125)],[\"emphasis\",n(1126)],[\"sub\",n(1127)],[\"sup\",n(1128)],[\"links\",n(1129)],[\"footnote_inline\",n(1130)],[\"footnote_ref\",n(1131)],[\"autolink\",n(1132)],[\"htmltag\",n(1134)],[\"entity\",n(1136)]];r.prototype.skipToken=function(e){var t,n,r=this.ruler.getRules(\"\"),i=r.length,o=e.pos;if((n=e.cacheGet(o))>0)return void(e.pos=n);for(t=0;t<i;t++)if(r[t](e,!0))return void e.cacheSet(o,e.pos);e.pos++,e.cacheSet(o,e.pos)},r.prototype.tokenize=function(e){for(var t,n,r=this.ruler.getRules(\"\"),i=r.length,o=e.posMax;e.pos<o;){for(n=0;n<i&&!(t=r[n](e,!1));n++);if(t){if(e.pos>=o)break}else e.pending+=e.src[e.pos++]}e.pending&&e.pushPending()},r.prototype.parse=function(e,t,n,r){var i=new a(e,this,t,n,r);this.tokenize(i)},e.exports=r},function(e,t){\"use strict\";function n(e){switch(e){case 10:case 92:case 96:case 42:case 95:case 94:case 91:case 93:case 33:case 38:case 60:case 62:case 123:case 125:case 36:case 37:case 64:case 126:case 43:case 61:case 58:return!0;default:return!1}}e.exports=function(e,t){for(var r=e.pos;r<e.posMax&&!n(e.src.charCodeAt(r));)r++;return r!==e.pos&&(t||(e.pending+=e.src.slice(e.pos,r)),e.pos=r,!0)}},function(e,t){\"use strict\";e.exports=function(e,t){var n,r,i=e.pos;if(10!==e.src.charCodeAt(i))return!1;if(n=e.pending.length-1,r=e.posMax,!t)if(n>=0&&32===e.pending.charCodeAt(n))if(n>=1&&32===e.pending.charCodeAt(n-1)){for(var o=n-2;o>=0;o--)if(32!==e.pending.charCodeAt(o)){e.pending=e.pending.substring(0,o+1);break}e.push({type:\"hardbreak\",level:e.level})}else e.pending=e.pending.slice(0,-1),e.push({type:\"softbreak\",level:e.level});else e.push({type:\"softbreak\",level:e.level});for(i++;i<r&&32===e.src.charCodeAt(i);)i++;return e.pos=i,!0}},function(e,t){\"use strict\";for(var n=[],r=0;r<256;r++)n.push(0);\"\\\\!\\\"#$%&'()*+,./:;<=>?@[]^_`{|}~-\".split(\"\").forEach(function(e){n[e.charCodeAt(0)]=1}),e.exports=function(e,t){var r,i=e.pos,o=e.posMax;if(92!==e.src.charCodeAt(i))return!1;if(i++,i<o){if(r=e.src.charCodeAt(i),r<256&&0!==n[r])return t||(e.pending+=e.src[i]),e.pos+=2,!0;if(10===r){for(t||e.push({type:\"hardbreak\",level:e.level}),i++;i<o&&32===e.src.charCodeAt(i);)i++;return e.pos=i,!0}}return t||(e.pending+=\"\\\\\"),e.pos++,!0}},function(e,t){\"use strict\";e.exports=function(e,t){var n,r,i,o,a,s=e.pos,u=e.src.charCodeAt(s);if(96!==u)return!1;for(n=s,s++,r=e.posMax;s<r&&96===e.src.charCodeAt(s);)s++;for(i=e.src.slice(n,s),o=a=s;(o=e.src.indexOf(\"`\",a))!==-1;){for(a=o+1;a<r&&96===e.src.charCodeAt(a);)a++;if(a-o===i.length)return t||e.push({type:\"code\",content:e.src.slice(s,o).replace(/[ \\n]+/g,\" \").trim(),block:!1,level:e.level}),e.pos=a,!0}return t||(e.pending+=i),e.pos+=i.length,!0}},function(e,t){\"use strict\";e.exports=function(e,t){var n,r,i,o,a,s=e.posMax,u=e.pos;if(126!==e.src.charCodeAt(u))return!1;if(t)return!1;if(u+4>=s)return!1;if(126!==e.src.charCodeAt(u+1))return!1;if(e.level>=e.options.maxNesting)return!1;if(o=u>0?e.src.charCodeAt(u-1):-1,a=e.src.charCodeAt(u+2),126===o)return!1;if(126===a)return!1;if(32===a||10===a)return!1;for(r=u+2;r<s&&126===e.src.charCodeAt(r);)r++;if(r>u+3)return e.pos+=r-u,t||(e.pending+=e.src.slice(u,r)),!0;for(e.pos=u+2,i=1;e.pos+1<s;){if(126===e.src.charCodeAt(e.pos)&&126===e.src.charCodeAt(e.pos+1)&&(o=e.src.charCodeAt(e.pos-1),a=e.pos+2<s?e.src.charCodeAt(e.pos+2):-1,126!==a&&126!==o&&(32!==o&&10!==o?i--:32!==a&&10!==a&&i++,i<=0))){n=!0;break}e.parser.skipToken(e)}return n?(e.posMax=e.pos,e.pos=u+2,t||(e.push({type:\"del_open\",level:e.level++}),e.parser.tokenize(e),e.push({type:\"del_close\",level:--e.level})),e.pos=e.posMax+2,e.posMax=s,!0):(e.pos=u,!1)}},function(e,t){\"use strict\";e.exports=function(e,t){var n,r,i,o,a,s=e.posMax,u=e.pos;if(43!==e.src.charCodeAt(u))return!1;if(t)return!1;if(u+4>=s)return!1;if(43!==e.src.charCodeAt(u+1))return!1;if(e.level>=e.options.maxNesting)return!1;\nif(o=u>0?e.src.charCodeAt(u-1):-1,a=e.src.charCodeAt(u+2),43===o)return!1;if(43===a)return!1;if(32===a||10===a)return!1;for(r=u+2;r<s&&43===e.src.charCodeAt(r);)r++;if(r!==u+2)return e.pos+=r-u,t||(e.pending+=e.src.slice(u,r)),!0;for(e.pos=u+2,i=1;e.pos+1<s;){if(43===e.src.charCodeAt(e.pos)&&43===e.src.charCodeAt(e.pos+1)&&(o=e.src.charCodeAt(e.pos-1),a=e.pos+2<s?e.src.charCodeAt(e.pos+2):-1,43!==a&&43!==o&&(32!==o&&10!==o?i--:32!==a&&10!==a&&i++,i<=0))){n=!0;break}e.parser.skipToken(e)}return n?(e.posMax=e.pos,e.pos=u+2,t||(e.push({type:\"ins_open\",level:e.level++}),e.parser.tokenize(e),e.push({type:\"ins_close\",level:--e.level})),e.pos=e.posMax+2,e.posMax=s,!0):(e.pos=u,!1)}},function(e,t){\"use strict\";e.exports=function(e,t){var n,r,i,o,a,s=e.posMax,u=e.pos;if(61!==e.src.charCodeAt(u))return!1;if(t)return!1;if(u+4>=s)return!1;if(61!==e.src.charCodeAt(u+1))return!1;if(e.level>=e.options.maxNesting)return!1;if(o=u>0?e.src.charCodeAt(u-1):-1,a=e.src.charCodeAt(u+2),61===o)return!1;if(61===a)return!1;if(32===a||10===a)return!1;for(r=u+2;r<s&&61===e.src.charCodeAt(r);)r++;if(r!==u+2)return e.pos+=r-u,t||(e.pending+=e.src.slice(u,r)),!0;for(e.pos=u+2,i=1;e.pos+1<s;){if(61===e.src.charCodeAt(e.pos)&&61===e.src.charCodeAt(e.pos+1)&&(o=e.src.charCodeAt(e.pos-1),a=e.pos+2<s?e.src.charCodeAt(e.pos+2):-1,61!==a&&61!==o&&(32!==o&&10!==o?i--:32!==a&&10!==a&&i++,i<=0))){n=!0;break}e.parser.skipToken(e)}return n?(e.posMax=e.pos,e.pos=u+2,t||(e.push({type:\"mark_open\",level:e.level++}),e.parser.tokenize(e),e.push({type:\"mark_close\",level:--e.level})),e.pos=e.posMax+2,e.posMax=s,!0):(e.pos=u,!1)}},function(e,t){\"use strict\";function n(e){return e>=48&&e<=57||e>=65&&e<=90||e>=97&&e<=122}function r(e,t){var r,i,o,a=t,s=!0,u=!0,c=e.posMax,l=e.src.charCodeAt(t);for(r=t>0?e.src.charCodeAt(t-1):-1;a<c&&e.src.charCodeAt(a)===l;)a++;return a>=c&&(s=!1),o=a-t,o>=4?s=u=!1:(i=a<c?e.src.charCodeAt(a):-1,32!==i&&10!==i||(s=!1),32!==r&&10!==r||(u=!1),95===l&&(n(r)&&(s=!1),n(i)&&(u=!1))),{can_open:s,can_close:u,delims:o}}e.exports=function(e,t){var n,i,o,a,s,u,c,l=e.posMax,p=e.pos,f=e.src.charCodeAt(p);if(95!==f&&42!==f)return!1;if(t)return!1;if(c=r(e,p),n=c.delims,!c.can_open)return e.pos+=n,t||(e.pending+=e.src.slice(p,e.pos)),!0;if(e.level>=e.options.maxNesting)return!1;for(e.pos=p+n,u=[n];e.pos<l;)if(e.src.charCodeAt(e.pos)!==f)e.parser.skipToken(e);else{if(c=r(e,e.pos),i=c.delims,c.can_close){for(a=u.pop(),s=i;a!==s;){if(s<a){u.push(a-s);break}if(s-=a,0===u.length)break;e.pos+=a,a=u.pop()}if(0===u.length){n=a,o=!0;break}e.pos+=i;continue}c.can_open&&u.push(i),e.pos+=i}return o?(e.posMax=e.pos,e.pos=p+n,t||(2!==n&&3!==n||e.push({type:\"strong_open\",level:e.level++}),1!==n&&3!==n||e.push({type:\"em_open\",level:e.level++}),e.parser.tokenize(e),1!==n&&3!==n||e.push({type:\"em_close\",level:--e.level}),2!==n&&3!==n||e.push({type:\"strong_close\",level:--e.level})),e.pos=e.posMax+n,e.posMax=l,!0):(e.pos=p,!1)}},function(e,t){\"use strict\";var n=/\\\\([ \\\\!\"#$%&'()*+,.\\/:;<=>?@[\\]^_`{|}~-])/g;e.exports=function(e,t){var r,i,o=e.posMax,a=e.pos;if(126!==e.src.charCodeAt(a))return!1;if(t)return!1;if(a+2>=o)return!1;if(e.level>=e.options.maxNesting)return!1;for(e.pos=a+1;e.pos<o;){if(126===e.src.charCodeAt(e.pos)){r=!0;break}e.parser.skipToken(e)}return r&&a+1!==e.pos?(i=e.src.slice(a+1,e.pos),i.match(/(^|[^\\\\])(\\\\\\\\)*\\s/)?(e.pos=a,!1):(e.posMax=e.pos,e.pos=a+1,t||e.push({type:\"sub\",level:e.level,content:i.replace(n,\"$1\")}),e.pos=e.posMax+1,e.posMax=o,!0)):(e.pos=a,!1)}},function(e,t){\"use strict\";var n=/\\\\([ \\\\!\"#$%&'()*+,.\\/:;<=>?@[\\]^_`{|}~-])/g;e.exports=function(e,t){var r,i,o=e.posMax,a=e.pos;if(94!==e.src.charCodeAt(a))return!1;if(t)return!1;if(a+2>=o)return!1;if(e.level>=e.options.maxNesting)return!1;for(e.pos=a+1;e.pos<o;){if(94===e.src.charCodeAt(e.pos)){r=!0;break}e.parser.skipToken(e)}return r&&a+1!==e.pos?(i=e.src.slice(a+1,e.pos),i.match(/(^|[^\\\\])(\\\\\\\\)*\\s/)?(e.pos=a,!1):(e.posMax=e.pos,e.pos=a+1,t||e.push({type:\"sup\",level:e.level,content:i.replace(n,\"$1\")}),e.pos=e.posMax+1,e.posMax=o,!0)):(e.pos=a,!1)}},function(e,t,n){\"use strict\";var r=n(1090),i=n(1092),o=n(1094),a=n(1095);e.exports=function(e,t){var n,s,u,c,l,p,f,h,d=!1,m=e.pos,v=e.posMax,y=e.pos,g=e.src.charCodeAt(y);if(33===g&&(d=!0,g=e.src.charCodeAt(++y)),91!==g)return!1;if(e.level>=e.options.maxNesting)return!1;if(n=y+1,s=r(e,y),s<0)return!1;if(p=s+1,p<v&&40===e.src.charCodeAt(p)){for(p++;p<v&&(h=e.src.charCodeAt(p),32===h||10===h);p++);if(p>=v)return!1;for(y=p,i(e,p)?(c=e.linkContent,p=e.pos):c=\"\",y=p;p<v&&(h=e.src.charCodeAt(p),32===h||10===h);p++);if(p<v&&y!==p&&o(e,p))for(l=e.linkContent,p=e.pos;p<v&&(h=e.src.charCodeAt(p),32===h||10===h);p++);else l=\"\";if(p>=v||41!==e.src.charCodeAt(p))return e.pos=m,!1;p++}else{if(e.linkLevel>0)return!1;for(;p<v&&(h=e.src.charCodeAt(p),32===h||10===h);p++);if(p<v&&91===e.src.charCodeAt(p)&&(y=p+1,p=r(e,p),p>=0?u=e.src.slice(y,p++):p=y-1),u||(\"undefined\"==typeof u&&(p=s+1),u=e.src.slice(n,s)),f=e.env.references[a(u)],!f)return e.pos=m,!1;c=f.href,l=f.title}return t||(e.pos=n,e.posMax=s,d?e.push({type:\"image\",src:c,title:l,alt:e.src.substr(n,s-n),level:e.level}):(e.push({type:\"link_open\",href:c,title:l,level:e.level++}),e.linkLevel++,e.parser.tokenize(e),e.linkLevel--,e.push({type:\"link_close\",level:--e.level}))),e.pos=p,e.posMax=v,!0}},function(e,t,n){\"use strict\";var r=n(1090);e.exports=function(e,t){var n,i,o,a,s=e.posMax,u=e.pos;return!(u+2>=s)&&(94===e.src.charCodeAt(u)&&(91===e.src.charCodeAt(u+1)&&(!(e.level>=e.options.maxNesting)&&(n=u+2,i=r(e,u+1),!(i<0)&&(t||(e.env.footnotes||(e.env.footnotes={}),e.env.footnotes.list||(e.env.footnotes.list=[]),o=e.env.footnotes.list.length,e.pos=n,e.posMax=i,e.push({type:\"footnote_ref\",id:o,level:e.level}),e.linkLevel++,a=e.tokens.length,e.parser.tokenize(e),e.env.footnotes.list[o]={tokens:e.tokens.splice(a)},e.linkLevel--),e.pos=i+1,e.posMax=s,!0)))))}},function(e,t){\"use strict\";e.exports=function(e,t){var n,r,i,o,a=e.posMax,s=e.pos;if(s+3>a)return!1;if(!e.env.footnotes||!e.env.footnotes.refs)return!1;if(91!==e.src.charCodeAt(s))return!1;if(94!==e.src.charCodeAt(s+1))return!1;if(e.level>=e.options.maxNesting)return!1;for(r=s+2;r<a;r++){if(32===e.src.charCodeAt(r))return!1;if(10===e.src.charCodeAt(r))return!1;if(93===e.src.charCodeAt(r))break}return r!==s+2&&(!(r>=a)&&(r++,n=e.src.slice(s+2,r-1),\"undefined\"!=typeof e.env.footnotes.refs[\":\"+n]&&(t||(e.env.footnotes.list||(e.env.footnotes.list=[]),e.env.footnotes.refs[\":\"+n]<0?(i=e.env.footnotes.list.length,e.env.footnotes.list[i]={label:n,count:0},e.env.footnotes.refs[\":\"+n]=i):i=e.env.footnotes.refs[\":\"+n],o=e.env.footnotes.list[i].count,e.env.footnotes.list[i].count++,e.push({type:\"footnote_ref\",id:i,subId:o,level:e.level})),e.pos=r,e.posMax=a,!0)))}},function(e,t,n){\"use strict\";var r=n(1133),i=n(1093),o=/^<([a-zA-Z0-9.!#$%&'*+\\/=?^_`{|}~-]+@[a-zA-Z0-9](?:[a-zA-Z0-9-]{0,61}[a-zA-Z0-9])?(?:\\.[a-zA-Z0-9](?:[a-zA-Z0-9-]{0,61}[a-zA-Z0-9])?)*)>/,a=/^<([a-zA-Z.\\-]{1,25}):([^<>\\x00-\\x20]*)>/;e.exports=function(e,t){var n,s,u,c,l,p=e.pos;return 60===e.src.charCodeAt(p)&&(n=e.src.slice(p),!(n.indexOf(\">\")<0)&&((s=n.match(a))?!(r.indexOf(s[1].toLowerCase())<0)&&(c=s[0].slice(1,-1),l=i(c),!!e.parser.validateLink(c)&&(t||(e.push({type:\"link_open\",href:l,level:e.level}),e.push({type:\"text\",content:c,level:e.level+1}),e.push({type:\"link_close\",level:e.level})),e.pos+=s[0].length,!0)):(u=n.match(o),!!u&&(c=u[0].slice(1,-1),l=i(\"mailto:\"+c),!!e.parser.validateLink(l)&&(t||(e.push({type:\"link_open\",href:l,level:e.level}),e.push({type:\"text\",content:c,level:e.level+1}),e.push({type:\"link_close\",level:e.level})),e.pos+=u[0].length,!0)))))}},function(e,t){\"use strict\";e.exports=[\"coap\",\"doi\",\"javascript\",\"aaa\",\"aaas\",\"about\",\"acap\",\"cap\",\"cid\",\"crid\",\"data\",\"dav\",\"dict\",\"dns\",\"file\",\"ftp\",\"geo\",\"go\",\"gopher\",\"h323\",\"http\",\"https\",\"iax\",\"icap\",\"im\",\"imap\",\"info\",\"ipp\",\"iris\",\"iris.beep\",\"iris.xpc\",\"iris.xpcs\",\"iris.lwz\",\"ldap\",\"mailto\",\"mid\",\"msrp\",\"msrps\",\"mtqp\",\"mupdate\",\"news\",\"nfs\",\"ni\",\"nih\",\"nntp\",\"opaquelocktoken\",\"pop\",\"pres\",\"rtsp\",\"service\",\"session\",\"shttp\",\"sieve\",\"sip\",\"sips\",\"sms\",\"snmp\",\"soap.beep\",\"soap.beeps\",\"tag\",\"tel\",\"telnet\",\"tftp\",\"thismessage\",\"tn3270\",\"tip\",\"tv\",\"urn\",\"vemmi\",\"ws\",\"wss\",\"xcon\",\"xcon-userid\",\"xmlrpc.beep\",\"xmlrpc.beeps\",\"xmpp\",\"z39.50r\",\"z39.50s\",\"adiumxtra\",\"afp\",\"afs\",\"aim\",\"apt\",\"attachment\",\"aw\",\"beshare\",\"bitcoin\",\"bolo\",\"callto\",\"chrome\",\"chrome-extension\",\"com-eventbrite-attendee\",\"content\",\"cvs\",\"dlna-playsingle\",\"dlna-playcontainer\",\"dtn\",\"dvb\",\"ed2k\",\"facetime\",\"feed\",\"finger\",\"fish\",\"gg\",\"git\",\"gizmoproject\",\"gtalk\",\"hcp\",\"icon\",\"ipn\",\"irc\",\"irc6\",\"ircs\",\"itms\",\"jar\",\"jms\",\"keyparc\",\"lastfm\",\"ldaps\",\"magnet\",\"maps\",\"market\",\"message\",\"mms\",\"ms-help\",\"msnim\",\"mumble\",\"mvn\",\"notes\",\"oid\",\"palm\",\"paparazzi\",\"platform\",\"proxy\",\"psyc\",\"query\",\"res\",\"resource\",\"rmi\",\"rsync\",\"rtmp\",\"secondlife\",\"sftp\",\"sgn\",\"skype\",\"smb\",\"soldat\",\"spotify\",\"ssh\",\"steam\",\"svn\",\"teamspeak\",\"things\",\"udp\",\"unreal\",\"ut2004\",\"ventrilo\",\"view-source\",\"webcal\",\"wtai\",\"wyciwyg\",\"xfire\",\"xri\",\"ymsgr\"]},function(e,t,n){\"use strict\";function r(e){var t=32|e;return t>=97&&t<=122}var i=n(1135).HTML_TAG_RE;e.exports=function(e,t){var n,o,a,s=e.pos;return!!e.options.html&&(a=e.posMax,!(60!==e.src.charCodeAt(s)||s+2>=a)&&(n=e.src.charCodeAt(s+1),!(33!==n&&63!==n&&47!==n&&!r(n))&&(!!(o=e.src.slice(s).match(i))&&(t||e.push({type:\"htmltag\",content:e.src.slice(s,s+o[0].length),level:e.level}),e.pos+=o[0].length,!0))))}},function(e,t){\"use strict\";function n(e,t){return e=e.source,t=t||\"\",function n(r,i){return r?(i=i.source||i,e=e.replace(r,i),n):new RegExp(e,t)}}var r=/[a-zA-Z_:][a-zA-Z0-9:._-]*/,i=/[^\"'=<>`\\x00-\\x20]+/,o=/'[^']*'/,a=/\"[^\"]*\"/,s=n(/(?:unquoted|single_quoted|double_quoted)/)(\"unquoted\",i)(\"single_quoted\",o)(\"double_quoted\",a)(),u=n(/(?:\\s+attr_name(?:\\s*=\\s*attr_value)?)/)(\"attr_name\",r)(\"attr_value\",s)(),c=n(/<[A-Za-z][A-Za-z0-9]*attribute*\\s*\\/?>/)(\"attribute\",u)(),l=/<\\/[A-Za-z][A-Za-z0-9]*\\s*>/,p=/<!--([^-]+|[-][^-]+)*-->/,f=/<[?].*?[?]>/,h=/<![A-Z]+\\s+[^>]*>/,d=/<!\\[CDATA\\[([^\\]]+|\\][^\\]]|\\]\\][^>])*\\]\\]>/,m=n(/^(?:open_tag|close_tag|comment|processing|declaration|cdata)/)(\"open_tag\",c)(\"close_tag\",l)(\"comment\",p)(\"processing\",f)(\"declaration\",h)(\"cdata\",d)();e.exports.HTML_TAG_RE=m},function(e,t,n){\"use strict\";var r=n(1082),i=n(1081).has,o=n(1081).isValidEntityCode,a=n(1081).fromCodePoint,s=/^&#((?:x[a-f0-9]{1,8}|[0-9]{1,8}));/i,u=/^&([a-z][a-z0-9]{1,31});/i;e.exports=function(e,t){var n,c,l,p=e.pos,f=e.posMax;if(38!==e.src.charCodeAt(p))return!1;if(p+1<f)if(n=e.src.charCodeAt(p+1),35===n){if(l=e.src.slice(p).match(s))return t||(c=\"x\"===l[1][0].toLowerCase()?parseInt(l[1].slice(1),16):parseInt(l[1],10),e.pending+=a(o(c)?c:65533)),e.pos+=l[0].length,!0}else if(l=e.src.slice(p).match(u),l&&i(r,l[1]))return t||(e.pending+=r[l[1]]),e.pos+=l[0].length,!0;return t||(e.pending+=\"&\"),e.pos++,!0}},function(e,t){\"use strict\";e.exports={options:{html:!1,xhtmlOut:!1,breaks:!1,langPrefix:\"language-\",linkify:!1,linkTarget:\"\",typographer:!1,quotes:\"“”‘’\",highlight:null,maxNesting:20},components:{core:{rules:[\"block\",\"inline\",\"references\",\"replacements\",\"linkify\",\"smartquotes\",\"references\",\"abbr2\",\"footnote_tail\"]},block:{rules:[\"blockquote\",\"code\",\"fences\",\"footnote\",\"heading\",\"hr\",\"htmlblock\",\"lheading\",\"list\",\"paragraph\",\"table\"]},inline:{rules:[\"autolink\",\"backticks\",\"del\",\"emphasis\",\"entity\",\"escape\",\"footnote_ref\",\"htmltag\",\"links\",\"newline\",\"text\"]}}}},function(e,t){\"use strict\";e.exports={options:{html:!1,xhtmlOut:!1,breaks:!1,langPrefix:\"language-\",linkify:!1,linkTarget:\"\",typographer:!1,quotes:\"“”‘’\",highlight:null,maxNesting:20},components:{core:{},block:{},inline:{}}}},function(e,t){\"use strict\";e.exports={options:{html:!0,xhtmlOut:!0,breaks:!1,langPrefix:\"language-\",linkify:!1,linkTarget:\"\",typographer:!1,quotes:\"“”‘’\",highlight:null,maxNesting:20},components:{core:{rules:[\"block\",\"inline\",\"references\",\"abbr2\"]},block:{rules:[\"blockquote\",\"code\",\"fences\",\"heading\",\"hr\",\"htmlblock\",\"lheading\",\"list\",\"paragraph\"]},inline:{rules:[\"autolink\",\"backticks\",\"emphasis\",\"entity\",\"escape\",\"htmltag\",\"links\",\"newline\",\"text\"]}}}},function(e,t,n){function r(e,t){e&&Object.keys(e).forEach(function(n){t(e[n],n)})}function i(e,t){return{}.hasOwnProperty.call(e,t)}function o(e,t,n){function l(e,t){var n=this;this.tag=e,this.attribs=t||{},this.tagPosition=d.length,this.text=\"\",this.updateParentNodeText=function(){if(w.length){var e=w[w.length-1];e.text+=n.text}}}function p(e){return\"string\"!=typeof e&&(e+=\"\"),e.replace(/\\&/g,\"&amp;\").replace(/</g,\"&lt;\").replace(/\\>/g,\"&gt;\").replace(/\\\"/g,\"&quot;\")}function f(e,n){n=n.replace(/[\\x00-\\x20]+/g,\"\"),n=n.replace(/<\\!\\-\\-.*?\\-\\-\\>/g,\"\");var r=n.match(/^([a-zA-Z]+)\\:/);if(!r)return!!n.match(/^\\/\\//)&&!t.allowProtocolRelative;var o=r[1].toLowerCase();return i(t.allowedSchemesByTag,e)?t.allowedSchemesByTag[e].indexOf(o)===-1:!t.allowedSchemes||t.allowedSchemes.indexOf(o)===-1}function h(e,t){return t?(e=e.split(/\\s+/),e.filter(function(e){return t.indexOf(e)!==-1}).join(\" \")):e}var d=\"\";t?(t=s(o.defaults,t),t.parser?t.parser=s(c,t.parser):t.parser=c):(t=o.defaults,t.parser=c);var m,v,y=t.nonTextTags||[\"script\",\"style\",\"textarea\"];t.allowedAttributes&&(m={},v={},r(t.allowedAttributes,function(e,t){m[t]=[];var n=[];e.forEach(function(e){e.indexOf(\"*\")>=0?n.push(u(e).replace(/\\\\\\*/g,\".*\")):m[t].push(e)}),v[t]=new RegExp(\"^(\"+n.join(\"|\")+\")$\")}));var g={};r(t.allowedClasses,function(e,t){m&&(i(m,t)||(m[t]=[]),m[t].push(\"class\")),g[t]=e});var _,b={};r(t.transformTags,function(e,t){var n;\"function\"==typeof e?n=e:\"string\"==typeof e&&(n=o.simpleTransform(e)),\"*\"===t?_=n:b[t]=n});var x=0,w=[],k={},S={},E=!1,C=0,A=new a.Parser({onopentag:function(e,n){if(E)return void C++;var o=new l(e,n);w.push(o);var a,s=!1,u=!!o.text;i(b,e)&&(a=b[e](e,n),o.attribs=n=a.attribs,void 0!==a.text&&(o.innerText=a.text),e!==a.tagName&&(o.name=e=a.tagName,S[x]=a.tagName)),_&&(a=_(e,n),o.attribs=n=a.attribs,e!==a.tagName&&(o.name=e=a.tagName,S[x]=a.tagName)),t.allowedTags&&t.allowedTags.indexOf(e)===-1&&(s=!0,y.indexOf(e)!==-1&&(E=!0,C=1),k[x]=!0),x++,s||(d+=\"<\"+e,(!m||i(m,e)||m[\"*\"])&&r(n,function(t,n){if(!m||i(m,e)&&m[e].indexOf(n)!==-1||m[\"*\"]&&m[\"*\"].indexOf(n)!==-1||i(v,e)&&v[e].test(n)||v[\"*\"]&&v[\"*\"].test(n)){if((\"href\"===n||\"src\"===n)&&f(e,t))return void delete o.attribs[n];if(\"class\"===n&&(t=h(t,g[e]),!t.length))return void delete o.attribs[n];d+=\" \"+n,t.length&&(d+='=\"'+p(t)+'\"')}else delete o.attribs[n]}),t.selfClosing.indexOf(e)!==-1?d+=\" />\":(d+=\">\",!o.innerText||u||t.textFilter||(d+=o.innerText)))},ontext:function(e){if(!E){var n,r=w[w.length-1];if(r&&(n=r.tag,e=void 0!==r.innerText?r.innerText:e),\"script\"===n||\"style\"===n)d+=e;else{var i=p(e);d+=t.textFilter?t.textFilter(i):i}if(w.length){var o=w[w.length-1];o.text+=e}}},onclosetag:function(e){if(E){if(C--,C)return;E=!1}var n=w.pop();if(n){if(E=!1,x--,k[x])return delete k[x],void n.updateParentNodeText();if(S[x]&&(e=S[x],delete S[x]),t.exclusiveFilter&&t.exclusiveFilter(n))return void(d=d.substr(0,n.tagPosition));n.updateParentNodeText(),t.selfClosing.indexOf(e)===-1&&(d+=\"</\"+e+\">\")}}},t.parser);return A.write(e),A.end(),d}var a=n(1141),s=n(1171),u=n(1172);e.exports=o;var c={decodeEntities:!0};o.defaults={allowedTags:[\"h3\",\"h4\",\"h5\",\"h6\",\"blockquote\",\"p\",\"a\",\"ul\",\"ol\",\"nl\",\"li\",\"b\",\"i\",\"strong\",\"em\",\"strike\",\"code\",\"hr\",\"br\",\"div\",\"table\",\"thead\",\"caption\",\"tbody\",\"tr\",\"th\",\"td\",\"pre\"],allowedAttributes:{a:[\"href\",\"name\",\"target\"],img:[\"src\"]},selfClosing:[\"img\",\"br\",\"hr\",\"area\",\"base\",\"basefont\",\"input\",\"link\",\"meta\"],allowedSchemes:[\"http\",\"https\",\"ftp\",\"mailto\"],allowedSchemesByTag:{},allowProtocolRelative:!0},o.simpleTransform=function(e,t,n){return n=void 0===n||n,t=t||{},function(r,i){var o;if(n)for(o in t)i[o]=t[o];else i=t;return{tagName:e,attribs:i}}}},function(e,t,n){function r(t,n){return delete e.exports[t],e.exports[t]=n,n}var i=n(1142),o=n(1149);e.exports={Parser:i,Tokenizer:n(1143),ElementType:n(1150),DomHandler:o,get FeedHandler(){return r(\"FeedHandler\",n(1153))},get Stream(){return r(\"Stream\",n(1154))},get WritableStream(){return r(\"WritableStream\",n(1155))},get ProxyHandler(){return r(\"ProxyHandler\",n(1157))},get DomUtils(){return r(\"DomUtils\",n(1158))},get CollectingHandler(){return r(\"CollectingHandler\",n(1170))},DefaultHandler:o,get RssHandler(){return r(\"RssHandler\",this.FeedHandler)},parseDOM:function(e,t){var n=new o(t);return new i(n,t).end(e),n.dom},parseFeed:function(t,n){var r=new e.exports.FeedHandler(n);return new i(r,n).end(t),r.dom},createDomStream:function(e,t,n){var r=new o(e,t,n);return new i(r,t)},EVENTS:{attribute:2,cdatastart:0,cdataend:0,text:1,processinginstruction:2,comment:1,commentend:0,closetag:1,opentag:2,opentagname:1,error:1,end:0}}},function(e,t,n){function r(e,t){this._options=t||{},this._cbs=e||{},this._tagname=\"\",this._attribname=\"\",this._attribvalue=\"\",this._attribs=null,this._stack=[],this.startIndex=0,this.endIndex=null,this._lowerCaseTagNames=\"lowerCaseTags\"in this._options?!!this._options.lowerCaseTags:!this._options.xmlMode,this._lowerCaseAttributeNames=\"lowerCaseAttributeNames\"in this._options?!!this._options.lowerCaseAttributeNames:!this._options.xmlMode,this._options.Tokenizer&&(i=this._options.Tokenizer),this._tokenizer=new i(this._options,this),this._cbs.onparserinit&&this._cbs.onparserinit(this)}var i=n(1143),o={input:!0,option:!0,optgroup:!0,select:!0,button:!0,datalist:!0,textarea:!0},a={tr:{tr:!0,th:!0,td:!0},th:{th:!0},td:{thead:!0,th:!0,td:!0},body:{head:!0,link:!0,script:!0},li:{li:!0},p:{p:!0},h1:{p:!0},h2:{p:!0},h3:{p:!0},h4:{p:!0},h5:{p:!0},h6:{p:!0},select:o,input:o,output:o,button:o,datalist:o,textarea:o,option:{option:!0},optgroup:{optgroup:!0}},s={__proto__:null,area:!0,base:!0,basefont:!0,br:!0,col:!0,command:!0,embed:!0,frame:!0,hr:!0,img:!0,input:!0,isindex:!0,keygen:!0,link:!0,meta:!0,param:!0,source:!0,track:!0,wbr:!0,path:!0,circle:!0,ellipse:!0,line:!0,rect:!0,use:!0,stop:!0,polyline:!0,polygon:!0},u=/\\s|\\//;n(328)(r,n(327).EventEmitter),r.prototype._updatePosition=function(e){null===this.endIndex?this._tokenizer._sectionStart<=e?this.startIndex=0:this.startIndex=this._tokenizer._sectionStart-e:this.startIndex=this.endIndex+1,this.endIndex=this._tokenizer.getAbsoluteIndex()},r.prototype.ontext=function(e){this._updatePosition(1),this.endIndex--,this._cbs.ontext&&this._cbs.ontext(e)},r.prototype.onopentagname=function(e){if(this._lowerCaseTagNames&&(e=e.toLowerCase()),this._tagname=e,!this._options.xmlMode&&e in a)for(var t;(t=this._stack[this._stack.length-1])in a[e];this.onclosetag(t));!this._options.xmlMode&&e in s||this._stack.push(e),this._cbs.onopentagname&&this._cbs.onopentagname(e),this._cbs.onopentag&&(this._attribs={})},r.prototype.onopentagend=function(){this._updatePosition(1),this._attribs&&(this._cbs.onopentag&&this._cbs.onopentag(this._tagname,this._attribs),this._attribs=null),!this._options.xmlMode&&this._cbs.onclosetag&&this._tagname in s&&this._cbs.onclosetag(this._tagname),this._tagname=\"\"},r.prototype.onclosetag=function(e){if(this._updatePosition(1),this._lowerCaseTagNames&&(e=e.toLowerCase()),!this._stack.length||e in s&&!this._options.xmlMode)this._options.xmlMode||\"br\"!==e&&\"p\"!==e||(this.onopentagname(e),this._closeCurrentTag());else{var t=this._stack.lastIndexOf(e);if(t!==-1)if(this._cbs.onclosetag)for(t=this._stack.length-t;t--;)this._cbs.onclosetag(this._stack.pop());else this._stack.length=t;else\"p\"!==e||this._options.xmlMode||(this.onopentagname(e),this._closeCurrentTag())}},r.prototype.onselfclosingtag=function(){this._options.xmlMode||this._options.recognizeSelfClosing?this._closeCurrentTag():this.onopentagend()},r.prototype._closeCurrentTag=function(){var e=this._tagname;this.onopentagend(),this._stack[this._stack.length-1]===e&&(this._cbs.onclosetag&&this._cbs.onclosetag(e),this._stack.pop())},r.prototype.onattribname=function(e){this._lowerCaseAttributeNames&&(e=e.toLowerCase()),this._attribname=e},r.prototype.onattribdata=function(e){this._attribvalue+=e},r.prototype.onattribend=function(){this._cbs.onattribute&&this._cbs.onattribute(this._attribname,this._attribvalue),this._attribs&&!Object.prototype.hasOwnProperty.call(this._attribs,this._attribname)&&(this._attribs[this._attribname]=this._attribvalue),this._attribname=\"\",this._attribvalue=\"\"},r.prototype._getInstructionName=function(e){var t=e.search(u),n=t<0?e:e.substr(0,t);return this._lowerCaseTagNames&&(n=n.toLowerCase()),n},r.prototype.ondeclaration=function(e){if(this._cbs.onprocessinginstruction){var t=this._getInstructionName(e);this._cbs.onprocessinginstruction(\"!\"+t,\"!\"+e)}},r.prototype.onprocessinginstruction=function(e){if(this._cbs.onprocessinginstruction){var t=this._getInstructionName(e);this._cbs.onprocessinginstruction(\"?\"+t,\"?\"+e)}},r.prototype.oncomment=function(e){this._updatePosition(4),this._cbs.oncomment&&this._cbs.oncomment(e),this._cbs.oncommentend&&this._cbs.oncommentend()},r.prototype.oncdata=function(e){this._updatePosition(1),this._options.xmlMode||this._options.recognizeCDATA?(this._cbs.oncdatastart&&this._cbs.oncdatastart(),this._cbs.ontext&&this._cbs.ontext(e),this._cbs.oncdataend&&this._cbs.oncdataend()):this.oncomment(\"[CDATA[\"+e+\"]]\")},r.prototype.onerror=function(e){this._cbs.onerror&&this._cbs.onerror(e)},r.prototype.onend=function(){if(this._cbs.onclosetag)for(var e=this._stack.length;e>0;this._cbs.onclosetag(this._stack[--e]));this._cbs.onend&&this._cbs.onend()},r.prototype.reset=function(){this._cbs.onreset&&this._cbs.onreset(),this._tokenizer.reset(),this._tagname=\"\",this._attribname=\"\",this._attribs=null,this._stack=[],this._cbs.onparserinit&&this._cbs.onparserinit(this)},r.prototype.parseComplete=function(e){this.reset(),this.end(e)},r.prototype.write=function(e){this._tokenizer.write(e)},r.prototype.end=function(e){this._tokenizer.end(e)},r.prototype.pause=function(){this._tokenizer.pause()},r.prototype.resume=function(){this._tokenizer.resume()},r.prototype.parseChunk=r.prototype.write,r.prototype.done=r.prototype.end,e.exports=r},function(e,t,n){function r(e){return\" \"===e||\"\\n\"===e||\"\\t\"===e||\"\\f\"===e||\"\\r\"===e}function i(e,t){return function(n){n===e&&(this._state=t)}}function o(e,t,n){var r=e.toLowerCase();return e===r?function(e){e===r?this._state=t:(this._state=n,this._index--)}:function(i){i===r||i===e?this._state=t:(this._state=n,this._index--)}}function a(e,t){var n=e.toLowerCase();return function(r){r===n||r===e?this._state=t:(this._state=m,this._index--)}}function s(e,t){this._state=h,this._buffer=\"\",this._sectionStart=0,this._index=0,this._bufferOffset=0,this._baseState=h,this._special=me,this._cbs=t,this._running=!0,this._ended=!1,this._xmlMode=!(!e||!e.xmlMode),this._decodeEntities=!(!e||!e.decodeEntities)}e.exports=s;var u=n(1144),c=n(1146),l=n(1147),p=n(1148),f=0,h=f++,d=f++,m=f++,v=f++,y=f++,g=f++,_=f++,b=f++,x=f++,w=f++,k=f++,S=f++,E=f++,C=f++,A=f++,T=f++,D=f++,M=f++,O=f++,P=f++,I=f++,N=f++,R=f++,j=f++,F=f++,B=f++,L=f++,z=f++,q=f++,U=f++,W=f++,K=f++,V=f++,H=f++,J=f++,G=f++,X=f++,Y=f++,$=f++,Z=f++,Q=f++,ee=f++,te=f++,ne=f++,re=f++,ie=f++,oe=f++,ae=f++,se=f++,ue=f++,ce=f++,le=f++,pe=f++,fe=f++,he=f++,de=0,me=de++,ve=de++,ye=de++;s.prototype._stateText=function(e){\"<\"===e?(this._index>this._sectionStart&&this._cbs.ontext(this._getSection()),this._state=d,this._sectionStart=this._index):this._decodeEntities&&this._special===me&&\"&\"===e&&(this._index>this._sectionStart&&this._cbs.ontext(this._getSection()),this._baseState=h,this._state=ce,this._sectionStart=this._index)},s.prototype._stateBeforeTagName=function(e){\"/\"===e?this._state=y:\"<\"===e?(this._cbs.ontext(this._getSection()),this._sectionStart=this._index):\">\"===e||this._special!==me||r(e)?this._state=h:\"!\"===e?(this._state=A,this._sectionStart=this._index+1):\"?\"===e?(this._state=D,this._sectionStart=this._index+1):(this._state=this._xmlMode||\"s\"!==e&&\"S\"!==e?m:W,this._sectionStart=this._index)},s.prototype._stateInTagName=function(e){(\"/\"===e||\">\"===e||r(e))&&(this._emitToken(\"onopentagname\"),this._state=b,this._index--)},s.prototype._stateBeforeCloseingTagName=function(e){r(e)||(\">\"===e?this._state=h:this._special!==me?\"s\"===e||\"S\"===e?this._state=K:(this._state=h,this._index--):(this._state=g,this._sectionStart=this._index))},s.prototype._stateInCloseingTagName=function(e){(\">\"===e||r(e))&&(this._emitToken(\"onclosetag\"),this._state=_,this._index--)},s.prototype._stateAfterCloseingTagName=function(e){\">\"===e&&(this._state=h,this._sectionStart=this._index+1)},s.prototype._stateBeforeAttributeName=function(e){\">\"===e?(this._cbs.onopentagend(),this._state=h,this._sectionStart=this._index+1):\"/\"===e?this._state=v:r(e)||(this._state=x,this._sectionStart=this._index)},s.prototype._stateInSelfClosingTag=function(e){\">\"===e?(this._cbs.onselfclosingtag(),this._state=h,this._sectionStart=this._index+1):r(e)||(this._state=b,this._index--)},s.prototype._stateInAttributeName=function(e){(\"=\"===e||\"/\"===e||\">\"===e||r(e))&&(this._cbs.onattribname(this._getSection()),this._sectionStart=-1,this._state=w,this._index--)},s.prototype._stateAfterAttributeName=function(e){\"=\"===e?this._state=k:\"/\"===e||\">\"===e?(this._cbs.onattribend(),this._state=b,this._index--):r(e)||(this._cbs.onattribend(),this._state=x,this._sectionStart=this._index)},s.prototype._stateBeforeAttributeValue=function(e){'\"'===e?(this._state=S,this._sectionStart=this._index+1):\"'\"===e?(this._state=E,this._sectionStart=this._index+1):r(e)||(this._state=C,this._sectionStart=this._index,this._index--)},s.prototype._stateInAttributeValueDoubleQuotes=function(e){'\"'===e?(this._emitToken(\"onattribdata\"),this._cbs.onattribend(),this._state=b):this._decodeEntities&&\"&\"===e&&(this._emitToken(\"onattribdata\"),this._baseState=this._state,this._state=ce,this._sectionStart=this._index)},s.prototype._stateInAttributeValueSingleQuotes=function(e){\"'\"===e?(this._emitToken(\"onattribdata\"),this._cbs.onattribend(),this._state=b):this._decodeEntities&&\"&\"===e&&(this._emitToken(\"onattribdata\"),this._baseState=this._state,this._state=ce,this._sectionStart=this._index)},s.prototype._stateInAttributeValueNoQuotes=function(e){r(e)||\">\"===e?(this._emitToken(\"onattribdata\"),this._cbs.onattribend(),this._state=b,this._index--):this._decodeEntities&&\"&\"===e&&(this._emitToken(\"onattribdata\"),this._baseState=this._state,this._state=ce,this._sectionStart=this._index)},s.prototype._stateBeforeDeclaration=function(e){this._state=\"[\"===e?N:\"-\"===e?M:T},s.prototype._stateInDeclaration=function(e){\">\"===e&&(this._cbs.ondeclaration(this._getSection()),this._state=h,this._sectionStart=this._index+1)},s.prototype._stateInProcessingInstruction=function(e){\">\"===e&&(this._cbs.onprocessinginstruction(this._getSection()),this._state=h,this._sectionStart=this._index+1)},s.prototype._stateBeforeComment=function(e){\"-\"===e?(this._state=O,this._sectionStart=this._index+1):this._state=T},s.prototype._stateInComment=function(e){\"-\"===e&&(this._state=P)},s.prototype._stateAfterComment1=function(e){\"-\"===e?this._state=I:this._state=O},s.prototype._stateAfterComment2=function(e){\">\"===e?(this._cbs.oncomment(this._buffer.substring(this._sectionStart,this._index-2)),this._state=h,this._sectionStart=this._index+1):\"-\"!==e&&(this._state=O)},s.prototype._stateBeforeCdata1=o(\"C\",R,T),s.prototype._stateBeforeCdata2=o(\"D\",j,T),s.prototype._stateBeforeCdata3=o(\"A\",F,T),s.prototype._stateBeforeCdata4=o(\"T\",B,T),s.prototype._stateBeforeCdata5=o(\"A\",L,T),s.prototype._stateBeforeCdata6=function(e){\"[\"===e?(this._state=z,this._sectionStart=this._index+1):(this._state=T,this._index--)},s.prototype._stateInCdata=function(e){\"]\"===e&&(this._state=q)},s.prototype._stateAfterCdata1=i(\"]\",U),s.prototype._stateAfterCdata2=function(e){\">\"===e?(this._cbs.oncdata(this._buffer.substring(this._sectionStart,this._index-2)),this._state=h,this._sectionStart=this._index+1):\"]\"!==e&&(this._state=z)},s.prototype._stateBeforeSpecial=function(e){\"c\"===e||\"C\"===e?this._state=V:\"t\"===e||\"T\"===e?this._state=te:(this._state=m,this._index--)},s.prototype._stateBeforeSpecialEnd=function(e){this._special!==ve||\"c\"!==e&&\"C\"!==e?this._special!==ye||\"t\"!==e&&\"T\"!==e?this._state=h:this._state=oe:this._state=Y},s.prototype._stateBeforeScript1=a(\"R\",H),s.prototype._stateBeforeScript2=a(\"I\",J),s.prototype._stateBeforeScript3=a(\"P\",G),s.prototype._stateBeforeScript4=a(\"T\",X),s.prototype._stateBeforeScript5=function(e){(\"/\"===e||\">\"===e||r(e))&&(this._special=ve),this._state=m,this._index--},s.prototype._stateAfterScript1=o(\"R\",$,h),s.prototype._stateAfterScript2=o(\"I\",Z,h),s.prototype._stateAfterScript3=o(\"P\",Q,h),s.prototype._stateAfterScript4=o(\"T\",ee,h),s.prototype._stateAfterScript5=function(e){\">\"===e||r(e)?(this._special=me,this._state=g,this._sectionStart=this._index-6,this._index--):this._state=h},s.prototype._stateBeforeStyle1=a(\"Y\",ne),s.prototype._stateBeforeStyle2=a(\"L\",re),s.prototype._stateBeforeStyle3=a(\"E\",ie),s.prototype._stateBeforeStyle4=function(e){(\"/\"===e||\">\"===e||r(e))&&(this._special=ye),this._state=m,this._index--},s.prototype._stateAfterStyle1=o(\"Y\",ae,h),s.prototype._stateAfterStyle2=o(\"L\",se,h),s.prototype._stateAfterStyle3=o(\"E\",ue,h),s.prototype._stateAfterStyle4=function(e){\">\"===e||r(e)?(this._special=me,this._state=g,this._sectionStart=this._index-5,this._index--):this._state=h},s.prototype._stateBeforeEntity=o(\"#\",le,pe),s.prototype._stateBeforeNumericEntity=o(\"X\",he,fe),s.prototype._parseNamedEntityStrict=function(){if(this._sectionStart+1<this._index){var e=this._buffer.substring(this._sectionStart+1,this._index),t=this._xmlMode?p:c;t.hasOwnProperty(e)&&(this._emitPartial(t[e]),this._sectionStart=this._index+1)}},s.prototype._parseLegacyEntity=function(){var e=this._sectionStart+1,t=this._index-e;for(t>6&&(t=6);t>=2;){var n=this._buffer.substr(e,t);if(l.hasOwnProperty(n))return this._emitPartial(l[n]),void(this._sectionStart+=t+1);t--}},s.prototype._stateInNamedEntity=function(e){\";\"===e?(this._parseNamedEntityStrict(),this._sectionStart+1<this._index&&!this._xmlMode&&this._parseLegacyEntity(),this._state=this._baseState):(e<\"a\"||e>\"z\")&&(e<\"A\"||e>\"Z\")&&(e<\"0\"||e>\"9\")&&(this._xmlMode||this._sectionStart+1===this._index||(this._baseState!==h?\"=\"!==e&&this._parseNamedEntityStrict():this._parseLegacyEntity()),this._state=this._baseState,this._index--)},s.prototype._decodeNumericEntity=function(e,t){var n=this._sectionStart+e;if(n!==this._index){var r=this._buffer.substring(n,this._index),i=parseInt(r,t);this._emitPartial(u(i)),this._sectionStart=this._index}else this._sectionStart--;this._state=this._baseState},s.prototype._stateInNumericEntity=function(e){\";\"===e?(this._decodeNumericEntity(2,10),this._sectionStart++):(e<\"0\"||e>\"9\")&&(this._xmlMode?this._state=this._baseState:this._decodeNumericEntity(2,10),this._index--)},s.prototype._stateInHexEntity=function(e){\";\"===e?(this._decodeNumericEntity(3,16),this._sectionStart++):(e<\"a\"||e>\"f\")&&(e<\"A\"||e>\"F\")&&(e<\"0\"||e>\"9\")&&(this._xmlMode?this._state=this._baseState:this._decodeNumericEntity(3,16),this._index--)},s.prototype._cleanup=function(){this._sectionStart<0?(this._buffer=\"\",this._bufferOffset+=this._index,this._index=0):this._running&&(this._state===h?(this._sectionStart!==this._index&&this._cbs.ontext(this._buffer.substr(this._sectionStart)),this._buffer=\"\",this._bufferOffset+=this._index,this._index=0):this._sectionStart===this._index?(this._buffer=\"\",this._bufferOffset+=this._index,this._index=0):(this._buffer=this._buffer.substr(this._sectionStart),this._index-=this._sectionStart,this._bufferOffset+=this._sectionStart),this._sectionStart=0)},s.prototype.write=function(e){this._ended&&this._cbs.onerror(Error(\".write() after done!\")),this._buffer+=e,this._parse()},s.prototype._parse=function(){for(;this._index<this._buffer.length&&this._running;){var e=this._buffer.charAt(this._index);this._state===h?this._stateText(e):this._state===d?this._stateBeforeTagName(e):this._state===m?this._stateInTagName(e):this._state===y?this._stateBeforeCloseingTagName(e):this._state===g?this._stateInCloseingTagName(e):this._state===_?this._stateAfterCloseingTagName(e):this._state===v?this._stateInSelfClosingTag(e):this._state===b?this._stateBeforeAttributeName(e):this._state===x?this._stateInAttributeName(e):this._state===w?this._stateAfterAttributeName(e):this._state===k?this._stateBeforeAttributeValue(e):this._state===S?this._stateInAttributeValueDoubleQuotes(e):this._state===E?this._stateInAttributeValueSingleQuotes(e):this._state===C?this._stateInAttributeValueNoQuotes(e):this._state===A?this._stateBeforeDeclaration(e):this._state===T?this._stateInDeclaration(e):this._state===D?this._stateInProcessingInstruction(e):this._state===M?this._stateBeforeComment(e):this._state===O?this._stateInComment(e):this._state===P?this._stateAfterComment1(e):this._state===I?this._stateAfterComment2(e):this._state===N?this._stateBeforeCdata1(e):this._state===R?this._stateBeforeCdata2(e):this._state===j?this._stateBeforeCdata3(e):this._state===F?this._stateBeforeCdata4(e):this._state===B?this._stateBeforeCdata5(e):this._state===L?this._stateBeforeCdata6(e):this._state===z?this._stateInCdata(e):this._state===q?this._stateAfterCdata1(e):this._state===U?this._stateAfterCdata2(e):this._state===W?this._stateBeforeSpecial(e):this._state===K?this._stateBeforeSpecialEnd(e):this._state===V?this._stateBeforeScript1(e):this._state===H?this._stateBeforeScript2(e):this._state===J?this._stateBeforeScript3(e):this._state===G?this._stateBeforeScript4(e):this._state===X?this._stateBeforeScript5(e):this._state===Y?this._stateAfterScript1(e):this._state===$?this._stateAfterScript2(e):this._state===Z?this._stateAfterScript3(e):this._state===Q?this._stateAfterScript4(e):this._state===ee?this._stateAfterScript5(e):this._state===te?this._stateBeforeStyle1(e):this._state===ne?this._stateBeforeStyle2(e):this._state===re?this._stateBeforeStyle3(e):this._state===ie?this._stateBeforeStyle4(e):this._state===oe?this._stateAfterStyle1(e):this._state===ae?this._stateAfterStyle2(e):this._state===se?this._stateAfterStyle3(e):this._state===ue?this._stateAfterStyle4(e):this._state===ce?this._stateBeforeEntity(e):this._state===le?this._stateBeforeNumericEntity(e):this._state===pe?this._stateInNamedEntity(e):this._state===fe?this._stateInNumericEntity(e):this._state===he?this._stateInHexEntity(e):this._cbs.onerror(Error(\"unknown _state\"),this._state),\nthis._index++}this._cleanup()},s.prototype.pause=function(){this._running=!1},s.prototype.resume=function(){this._running=!0,this._index<this._buffer.length&&this._parse(),this._ended&&this._finish()},s.prototype.end=function(e){this._ended&&this._cbs.onerror(Error(\".end() after done!\")),e&&this.write(e),this._ended=!0,this._running&&this._finish()},s.prototype._finish=function(){this._sectionStart<this._index&&this._handleTrailingData(),this._cbs.onend()},s.prototype._handleTrailingData=function(){var e=this._buffer.substr(this._sectionStart);this._state===z||this._state===q||this._state===U?this._cbs.oncdata(e):this._state===O||this._state===P||this._state===I?this._cbs.oncomment(e):this._state!==pe||this._xmlMode?this._state!==fe||this._xmlMode?this._state!==he||this._xmlMode?this._state!==m&&this._state!==b&&this._state!==k&&this._state!==w&&this._state!==x&&this._state!==E&&this._state!==S&&this._state!==C&&this._state!==g&&this._cbs.ontext(e):(this._decodeNumericEntity(3,16),this._sectionStart<this._index&&(this._state=this._baseState,this._handleTrailingData())):(this._decodeNumericEntity(2,10),this._sectionStart<this._index&&(this._state=this._baseState,this._handleTrailingData())):(this._parseLegacyEntity(),this._sectionStart<this._index&&(this._state=this._baseState,this._handleTrailingData()))},s.prototype.reset=function(){s.call(this,{xmlMode:this._xmlMode,decodeEntities:this._decodeEntities},this._cbs)},s.prototype.getAbsoluteIndex=function(){return this._bufferOffset+this._index},s.prototype._getSection=function(){return this._buffer.substring(this._sectionStart,this._index)},s.prototype._emitToken=function(e){this._cbs[e](this._getSection()),this._sectionStart=-1},s.prototype._emitPartial=function(e){this._baseState!==h?this._cbs.onattribdata(e):this._cbs.ontext(e)}},function(e,t,n){function r(e){if(e>=55296&&e<=57343||e>1114111)return\"�\";e in i&&(e=i[e]);var t=\"\";return e>65535&&(e-=65536,t+=String.fromCharCode(e>>>10&1023|55296),e=56320|1023&e),t+=String.fromCharCode(e)}var i=n(1145);e.exports=r},function(e,t){e.exports={0:65533,128:8364,130:8218,131:402,132:8222,133:8230,134:8224,135:8225,136:710,137:8240,138:352,139:8249,140:338,142:381,145:8216,146:8217,147:8220,148:8221,149:8226,150:8211,151:8212,152:732,153:8482,154:353,155:8250,156:339,158:382,159:376}},function(e,t){e.exports={Aacute:\"Á\",aacute:\"á\",Abreve:\"Ă\",abreve:\"ă\",ac:\"∾\",acd:\"∿\",acE:\"∾̳\",Acirc:\"Â\",acirc:\"â\",acute:\"´\",Acy:\"А\",acy:\"а\",AElig:\"Æ\",aelig:\"æ\",af:\"⁡\",Afr:\"𝔄\",afr:\"𝔞\",Agrave:\"À\",agrave:\"à\",alefsym:\"ℵ\",aleph:\"ℵ\",Alpha:\"Α\",alpha:\"α\",Amacr:\"Ā\",amacr:\"ā\",amalg:\"⨿\",amp:\"&\",AMP:\"&\",andand:\"⩕\",And:\"⩓\",and:\"∧\",andd:\"⩜\",andslope:\"⩘\",andv:\"⩚\",ang:\"∠\",ange:\"⦤\",angle:\"∠\",angmsdaa:\"⦨\",angmsdab:\"⦩\",angmsdac:\"⦪\",angmsdad:\"⦫\",angmsdae:\"⦬\",angmsdaf:\"⦭\",angmsdag:\"⦮\",angmsdah:\"⦯\",angmsd:\"∡\",angrt:\"∟\",angrtvb:\"⊾\",angrtvbd:\"⦝\",angsph:\"∢\",angst:\"Å\",angzarr:\"⍼\",Aogon:\"Ą\",aogon:\"ą\",Aopf:\"𝔸\",aopf:\"𝕒\",apacir:\"⩯\",ap:\"≈\",apE:\"⩰\",ape:\"≊\",apid:\"≋\",apos:\"'\",ApplyFunction:\"⁡\",approx:\"≈\",approxeq:\"≊\",Aring:\"Å\",aring:\"å\",Ascr:\"𝒜\",ascr:\"𝒶\",Assign:\"≔\",ast:\"*\",asymp:\"≈\",asympeq:\"≍\",Atilde:\"Ã\",atilde:\"ã\",Auml:\"Ä\",auml:\"ä\",awconint:\"∳\",awint:\"⨑\",backcong:\"≌\",backepsilon:\"϶\",backprime:\"‵\",backsim:\"∽\",backsimeq:\"⋍\",Backslash:\"∖\",Barv:\"⫧\",barvee:\"⊽\",barwed:\"⌅\",Barwed:\"⌆\",barwedge:\"⌅\",bbrk:\"⎵\",bbrktbrk:\"⎶\",bcong:\"≌\",Bcy:\"Б\",bcy:\"б\",bdquo:\"„\",becaus:\"∵\",because:\"∵\",Because:\"∵\",bemptyv:\"⦰\",bepsi:\"϶\",bernou:\"ℬ\",Bernoullis:\"ℬ\",Beta:\"Β\",beta:\"β\",beth:\"ℶ\",between:\"≬\",Bfr:\"𝔅\",bfr:\"𝔟\",bigcap:\"⋂\",bigcirc:\"◯\",bigcup:\"⋃\",bigodot:\"⨀\",bigoplus:\"⨁\",bigotimes:\"⨂\",bigsqcup:\"⨆\",bigstar:\"★\",bigtriangledown:\"▽\",bigtriangleup:\"△\",biguplus:\"⨄\",bigvee:\"⋁\",bigwedge:\"⋀\",bkarow:\"⤍\",blacklozenge:\"⧫\",blacksquare:\"▪\",blacktriangle:\"▴\",blacktriangledown:\"▾\",blacktriangleleft:\"◂\",blacktriangleright:\"▸\",blank:\"␣\",blk12:\"▒\",blk14:\"░\",blk34:\"▓\",block:\"█\",bne:\"=⃥\",bnequiv:\"≡⃥\",bNot:\"⫭\",bnot:\"⌐\",Bopf:\"𝔹\",bopf:\"𝕓\",bot:\"⊥\",bottom:\"⊥\",bowtie:\"⋈\",boxbox:\"⧉\",boxdl:\"┐\",boxdL:\"╕\",boxDl:\"╖\",boxDL:\"╗\",boxdr:\"┌\",boxdR:\"╒\",boxDr:\"╓\",boxDR:\"╔\",boxh:\"─\",boxH:\"═\",boxhd:\"┬\",boxHd:\"╤\",boxhD:\"╥\",boxHD:\"╦\",boxhu:\"┴\",boxHu:\"╧\",boxhU:\"╨\",boxHU:\"╩\",boxminus:\"⊟\",boxplus:\"⊞\",boxtimes:\"⊠\",boxul:\"┘\",boxuL:\"╛\",boxUl:\"╜\",boxUL:\"╝\",boxur:\"└\",boxuR:\"╘\",boxUr:\"╙\",boxUR:\"╚\",boxv:\"│\",boxV:\"║\",boxvh:\"┼\",boxvH:\"╪\",boxVh:\"╫\",boxVH:\"╬\",boxvl:\"┤\",boxvL:\"╡\",boxVl:\"╢\",boxVL:\"╣\",boxvr:\"├\",boxvR:\"╞\",boxVr:\"╟\",boxVR:\"╠\",bprime:\"‵\",breve:\"˘\",Breve:\"˘\",brvbar:\"¦\",bscr:\"𝒷\",Bscr:\"ℬ\",bsemi:\"⁏\",bsim:\"∽\",bsime:\"⋍\",bsolb:\"⧅\",bsol:\"\\\\\",bsolhsub:\"⟈\",bull:\"•\",bullet:\"•\",bump:\"≎\",bumpE:\"⪮\",bumpe:\"≏\",Bumpeq:\"≎\",bumpeq:\"≏\",Cacute:\"Ć\",cacute:\"ć\",capand:\"⩄\",capbrcup:\"⩉\",capcap:\"⩋\",cap:\"∩\",Cap:\"⋒\",capcup:\"⩇\",capdot:\"⩀\",CapitalDifferentialD:\"ⅅ\",caps:\"∩︀\",caret:\"⁁\",caron:\"ˇ\",Cayleys:\"ℭ\",ccaps:\"⩍\",Ccaron:\"Č\",ccaron:\"č\",Ccedil:\"Ç\",ccedil:\"ç\",Ccirc:\"Ĉ\",ccirc:\"ĉ\",Cconint:\"∰\",ccups:\"⩌\",ccupssm:\"⩐\",Cdot:\"Ċ\",cdot:\"ċ\",cedil:\"¸\",Cedilla:\"¸\",cemptyv:\"⦲\",cent:\"¢\",centerdot:\"·\",CenterDot:\"·\",cfr:\"𝔠\",Cfr:\"ℭ\",CHcy:\"Ч\",chcy:\"ч\",check:\"✓\",checkmark:\"✓\",Chi:\"Χ\",chi:\"χ\",circ:\"ˆ\",circeq:\"≗\",circlearrowleft:\"↺\",circlearrowright:\"↻\",circledast:\"⊛\",circledcirc:\"⊚\",circleddash:\"⊝\",CircleDot:\"⊙\",circledR:\"®\",circledS:\"Ⓢ\",CircleMinus:\"⊖\",CirclePlus:\"⊕\",CircleTimes:\"⊗\",cir:\"○\",cirE:\"⧃\",cire:\"≗\",cirfnint:\"⨐\",cirmid:\"⫯\",cirscir:\"⧂\",ClockwiseContourIntegral:\"∲\",CloseCurlyDoubleQuote:\"”\",CloseCurlyQuote:\"’\",clubs:\"♣\",clubsuit:\"♣\",colon:\":\",Colon:\"∷\",Colone:\"⩴\",colone:\"≔\",coloneq:\"≔\",comma:\",\",commat:\"@\",comp:\"∁\",compfn:\"∘\",complement:\"∁\",complexes:\"ℂ\",cong:\"≅\",congdot:\"⩭\",Congruent:\"≡\",conint:\"∮\",Conint:\"∯\",ContourIntegral:\"∮\",copf:\"𝕔\",Copf:\"ℂ\",coprod:\"∐\",Coproduct:\"∐\",copy:\"©\",COPY:\"©\",copysr:\"℗\",CounterClockwiseContourIntegral:\"∳\",crarr:\"↵\",cross:\"✗\",Cross:\"⨯\",Cscr:\"𝒞\",cscr:\"𝒸\",csub:\"⫏\",csube:\"⫑\",csup:\"⫐\",csupe:\"⫒\",ctdot:\"⋯\",cudarrl:\"⤸\",cudarrr:\"⤵\",cuepr:\"⋞\",cuesc:\"⋟\",cularr:\"↶\",cularrp:\"⤽\",cupbrcap:\"⩈\",cupcap:\"⩆\",CupCap:\"≍\",cup:\"∪\",Cup:\"⋓\",cupcup:\"⩊\",cupdot:\"⊍\",cupor:\"⩅\",cups:\"∪︀\",curarr:\"↷\",curarrm:\"⤼\",curlyeqprec:\"⋞\",curlyeqsucc:\"⋟\",curlyvee:\"⋎\",curlywedge:\"⋏\",curren:\"¤\",curvearrowleft:\"↶\",curvearrowright:\"↷\",cuvee:\"⋎\",cuwed:\"⋏\",cwconint:\"∲\",cwint:\"∱\",cylcty:\"⌭\",dagger:\"†\",Dagger:\"‡\",daleth:\"ℸ\",darr:\"↓\",Darr:\"↡\",dArr:\"⇓\",dash:\"‐\",Dashv:\"⫤\",dashv:\"⊣\",dbkarow:\"⤏\",dblac:\"˝\",Dcaron:\"Ď\",dcaron:\"ď\",Dcy:\"Д\",dcy:\"д\",ddagger:\"‡\",ddarr:\"⇊\",DD:\"ⅅ\",dd:\"ⅆ\",DDotrahd:\"⤑\",ddotseq:\"⩷\",deg:\"°\",Del:\"∇\",Delta:\"Δ\",delta:\"δ\",demptyv:\"⦱\",dfisht:\"⥿\",Dfr:\"𝔇\",dfr:\"𝔡\",dHar:\"⥥\",dharl:\"⇃\",dharr:\"⇂\",DiacriticalAcute:\"´\",DiacriticalDot:\"˙\",DiacriticalDoubleAcute:\"˝\",DiacriticalGrave:\"`\",DiacriticalTilde:\"˜\",diam:\"⋄\",diamond:\"⋄\",Diamond:\"⋄\",diamondsuit:\"♦\",diams:\"♦\",die:\"¨\",DifferentialD:\"ⅆ\",digamma:\"ϝ\",disin:\"⋲\",div:\"÷\",divide:\"÷\",divideontimes:\"⋇\",divonx:\"⋇\",DJcy:\"Ђ\",djcy:\"ђ\",dlcorn:\"⌞\",dlcrop:\"⌍\",dollar:\"$\",Dopf:\"𝔻\",dopf:\"𝕕\",Dot:\"¨\",dot:\"˙\",DotDot:\"⃜\",doteq:\"≐\",doteqdot:\"≑\",DotEqual:\"≐\",dotminus:\"∸\",dotplus:\"∔\",dotsquare:\"⊡\",doublebarwedge:\"⌆\",DoubleContourIntegral:\"∯\",DoubleDot:\"¨\",DoubleDownArrow:\"⇓\",DoubleLeftArrow:\"⇐\",DoubleLeftRightArrow:\"⇔\",DoubleLeftTee:\"⫤\",DoubleLongLeftArrow:\"⟸\",DoubleLongLeftRightArrow:\"⟺\",DoubleLongRightArrow:\"⟹\",DoubleRightArrow:\"⇒\",DoubleRightTee:\"⊨\",DoubleUpArrow:\"⇑\",DoubleUpDownArrow:\"⇕\",DoubleVerticalBar:\"∥\",DownArrowBar:\"⤓\",downarrow:\"↓\",DownArrow:\"↓\",Downarrow:\"⇓\",DownArrowUpArrow:\"⇵\",DownBreve:\"̑\",downdownarrows:\"⇊\",downharpoonleft:\"⇃\",downharpoonright:\"⇂\",DownLeftRightVector:\"⥐\",DownLeftTeeVector:\"⥞\",DownLeftVectorBar:\"⥖\",DownLeftVector:\"↽\",DownRightTeeVector:\"⥟\",DownRightVectorBar:\"⥗\",DownRightVector:\"⇁\",DownTeeArrow:\"↧\",DownTee:\"⊤\",drbkarow:\"⤐\",drcorn:\"⌟\",drcrop:\"⌌\",Dscr:\"𝒟\",dscr:\"𝒹\",DScy:\"Ѕ\",dscy:\"ѕ\",dsol:\"⧶\",Dstrok:\"Đ\",dstrok:\"đ\",dtdot:\"⋱\",dtri:\"▿\",dtrif:\"▾\",duarr:\"⇵\",duhar:\"⥯\",dwangle:\"⦦\",DZcy:\"Џ\",dzcy:\"џ\",dzigrarr:\"⟿\",Eacute:\"É\",eacute:\"é\",easter:\"⩮\",Ecaron:\"Ě\",ecaron:\"ě\",Ecirc:\"Ê\",ecirc:\"ê\",ecir:\"≖\",ecolon:\"≕\",Ecy:\"Э\",ecy:\"э\",eDDot:\"⩷\",Edot:\"Ė\",edot:\"ė\",eDot:\"≑\",ee:\"ⅇ\",efDot:\"≒\",Efr:\"𝔈\",efr:\"𝔢\",eg:\"⪚\",Egrave:\"È\",egrave:\"è\",egs:\"⪖\",egsdot:\"⪘\",el:\"⪙\",Element:\"∈\",elinters:\"⏧\",ell:\"ℓ\",els:\"⪕\",elsdot:\"⪗\",Emacr:\"Ē\",emacr:\"ē\",empty:\"∅\",emptyset:\"∅\",EmptySmallSquare:\"◻\",emptyv:\"∅\",EmptyVerySmallSquare:\"▫\",emsp13:\" \",emsp14:\" \",emsp:\" \",ENG:\"Ŋ\",eng:\"ŋ\",ensp:\" \",Eogon:\"Ę\",eogon:\"ę\",Eopf:\"𝔼\",eopf:\"𝕖\",epar:\"⋕\",eparsl:\"⧣\",eplus:\"⩱\",epsi:\"ε\",Epsilon:\"Ε\",epsilon:\"ε\",epsiv:\"ϵ\",eqcirc:\"≖\",eqcolon:\"≕\",eqsim:\"≂\",eqslantgtr:\"⪖\",eqslantless:\"⪕\",Equal:\"⩵\",equals:\"=\",EqualTilde:\"≂\",equest:\"≟\",Equilibrium:\"⇌\",equiv:\"≡\",equivDD:\"⩸\",eqvparsl:\"⧥\",erarr:\"⥱\",erDot:\"≓\",escr:\"ℯ\",Escr:\"ℰ\",esdot:\"≐\",Esim:\"⩳\",esim:\"≂\",Eta:\"Η\",eta:\"η\",ETH:\"Ð\",eth:\"ð\",Euml:\"Ë\",euml:\"ë\",euro:\"€\",excl:\"!\",exist:\"∃\",Exists:\"∃\",expectation:\"ℰ\",exponentiale:\"ⅇ\",ExponentialE:\"ⅇ\",fallingdotseq:\"≒\",Fcy:\"Ф\",fcy:\"ф\",female:\"♀\",ffilig:\"ﬃ\",fflig:\"ﬀ\",ffllig:\"ﬄ\",Ffr:\"𝔉\",ffr:\"𝔣\",filig:\"ﬁ\",FilledSmallSquare:\"◼\",FilledVerySmallSquare:\"▪\",fjlig:\"fj\",flat:\"♭\",fllig:\"ﬂ\",fltns:\"▱\",fnof:\"ƒ\",Fopf:\"𝔽\",fopf:\"𝕗\",forall:\"∀\",ForAll:\"∀\",fork:\"⋔\",forkv:\"⫙\",Fouriertrf:\"ℱ\",fpartint:\"⨍\",frac12:\"½\",frac13:\"⅓\",frac14:\"¼\",frac15:\"⅕\",frac16:\"⅙\",frac18:\"⅛\",frac23:\"⅔\",frac25:\"⅖\",frac34:\"¾\",frac35:\"⅗\",frac38:\"⅜\",frac45:\"⅘\",frac56:\"⅚\",frac58:\"⅝\",frac78:\"⅞\",frasl:\"⁄\",frown:\"⌢\",fscr:\"𝒻\",Fscr:\"ℱ\",gacute:\"ǵ\",Gamma:\"Γ\",gamma:\"γ\",Gammad:\"Ϝ\",gammad:\"ϝ\",gap:\"⪆\",Gbreve:\"Ğ\",gbreve:\"ğ\",Gcedil:\"Ģ\",Gcirc:\"Ĝ\",gcirc:\"ĝ\",Gcy:\"Г\",gcy:\"г\",Gdot:\"Ġ\",gdot:\"ġ\",ge:\"≥\",gE:\"≧\",gEl:\"⪌\",gel:\"⋛\",geq:\"≥\",geqq:\"≧\",geqslant:\"⩾\",gescc:\"⪩\",ges:\"⩾\",gesdot:\"⪀\",gesdoto:\"⪂\",gesdotol:\"⪄\",gesl:\"⋛︀\",gesles:\"⪔\",Gfr:\"𝔊\",gfr:\"𝔤\",gg:\"≫\",Gg:\"⋙\",ggg:\"⋙\",gimel:\"ℷ\",GJcy:\"Ѓ\",gjcy:\"ѓ\",gla:\"⪥\",gl:\"≷\",glE:\"⪒\",glj:\"⪤\",gnap:\"⪊\",gnapprox:\"⪊\",gne:\"⪈\",gnE:\"≩\",gneq:\"⪈\",gneqq:\"≩\",gnsim:\"⋧\",Gopf:\"𝔾\",gopf:\"𝕘\",grave:\"`\",GreaterEqual:\"≥\",GreaterEqualLess:\"⋛\",GreaterFullEqual:\"≧\",GreaterGreater:\"⪢\",GreaterLess:\"≷\",GreaterSlantEqual:\"⩾\",GreaterTilde:\"≳\",Gscr:\"𝒢\",gscr:\"ℊ\",gsim:\"≳\",gsime:\"⪎\",gsiml:\"⪐\",gtcc:\"⪧\",gtcir:\"⩺\",gt:\">\",GT:\">\",Gt:\"≫\",gtdot:\"⋗\",gtlPar:\"⦕\",gtquest:\"⩼\",gtrapprox:\"⪆\",gtrarr:\"⥸\",gtrdot:\"⋗\",gtreqless:\"⋛\",gtreqqless:\"⪌\",gtrless:\"≷\",gtrsim:\"≳\",gvertneqq:\"≩︀\",gvnE:\"≩︀\",Hacek:\"ˇ\",hairsp:\" \",half:\"½\",hamilt:\"ℋ\",HARDcy:\"Ъ\",hardcy:\"ъ\",harrcir:\"⥈\",harr:\"↔\",hArr:\"⇔\",harrw:\"↭\",Hat:\"^\",hbar:\"ℏ\",Hcirc:\"Ĥ\",hcirc:\"ĥ\",hearts:\"♥\",heartsuit:\"♥\",hellip:\"…\",hercon:\"⊹\",hfr:\"𝔥\",Hfr:\"ℌ\",HilbertSpace:\"ℋ\",hksearow:\"⤥\",hkswarow:\"⤦\",hoarr:\"⇿\",homtht:\"∻\",hookleftarrow:\"↩\",hookrightarrow:\"↪\",hopf:\"𝕙\",Hopf:\"ℍ\",horbar:\"―\",HorizontalLine:\"─\",hscr:\"𝒽\",Hscr:\"ℋ\",hslash:\"ℏ\",Hstrok:\"Ħ\",hstrok:\"ħ\",HumpDownHump:\"≎\",HumpEqual:\"≏\",hybull:\"⁃\",hyphen:\"‐\",Iacute:\"Í\",iacute:\"í\",ic:\"⁣\",Icirc:\"Î\",icirc:\"î\",Icy:\"И\",icy:\"и\",Idot:\"İ\",IEcy:\"Е\",iecy:\"е\",iexcl:\"¡\",iff:\"⇔\",ifr:\"𝔦\",Ifr:\"ℑ\",Igrave:\"Ì\",igrave:\"ì\",ii:\"ⅈ\",iiiint:\"⨌\",iiint:\"∭\",iinfin:\"⧜\",iiota:\"℩\",IJlig:\"Ĳ\",ijlig:\"ĳ\",Imacr:\"Ī\",imacr:\"ī\",image:\"ℑ\",ImaginaryI:\"ⅈ\",imagline:\"ℐ\",imagpart:\"ℑ\",imath:\"ı\",Im:\"ℑ\",imof:\"⊷\",imped:\"Ƶ\",Implies:\"⇒\",incare:\"℅\",in:\"∈\",infin:\"∞\",infintie:\"⧝\",inodot:\"ı\",intcal:\"⊺\",int:\"∫\",Int:\"∬\",integers:\"ℤ\",Integral:\"∫\",intercal:\"⊺\",Intersection:\"⋂\",intlarhk:\"⨗\",intprod:\"⨼\",InvisibleComma:\"⁣\",InvisibleTimes:\"⁢\",IOcy:\"Ё\",iocy:\"ё\",Iogon:\"Į\",iogon:\"į\",Iopf:\"𝕀\",iopf:\"𝕚\",Iota:\"Ι\",iota:\"ι\",iprod:\"⨼\",iquest:\"¿\",iscr:\"𝒾\",Iscr:\"ℐ\",isin:\"∈\",isindot:\"⋵\",isinE:\"⋹\",isins:\"⋴\",isinsv:\"⋳\",isinv:\"∈\",it:\"⁢\",Itilde:\"Ĩ\",itilde:\"ĩ\",Iukcy:\"І\",iukcy:\"і\",Iuml:\"Ï\",iuml:\"ï\",Jcirc:\"Ĵ\",jcirc:\"ĵ\",Jcy:\"Й\",jcy:\"й\",Jfr:\"𝔍\",jfr:\"𝔧\",jmath:\"ȷ\",Jopf:\"𝕁\",jopf:\"𝕛\",Jscr:\"𝒥\",jscr:\"𝒿\",Jsercy:\"Ј\",jsercy:\"ј\",Jukcy:\"Є\",jukcy:\"є\",Kappa:\"Κ\",kappa:\"κ\",kappav:\"ϰ\",Kcedil:\"Ķ\",kcedil:\"ķ\",Kcy:\"К\",kcy:\"к\",Kfr:\"𝔎\",kfr:\"𝔨\",kgreen:\"ĸ\",KHcy:\"Х\",khcy:\"х\",KJcy:\"Ќ\",kjcy:\"ќ\",Kopf:\"𝕂\",kopf:\"𝕜\",Kscr:\"𝒦\",kscr:\"𝓀\",lAarr:\"⇚\",Lacute:\"Ĺ\",lacute:\"ĺ\",laemptyv:\"⦴\",lagran:\"ℒ\",Lambda:\"Λ\",lambda:\"λ\",lang:\"⟨\",Lang:\"⟪\",langd:\"⦑\",langle:\"⟨\",lap:\"⪅\",Laplacetrf:\"ℒ\",laquo:\"«\",larrb:\"⇤\",larrbfs:\"⤟\",larr:\"←\",Larr:\"↞\",lArr:\"⇐\",larrfs:\"⤝\",larrhk:\"↩\",larrlp:\"↫\",larrpl:\"⤹\",larrsim:\"⥳\",larrtl:\"↢\",latail:\"⤙\",lAtail:\"⤛\",lat:\"⪫\",late:\"⪭\",lates:\"⪭︀\",lbarr:\"⤌\",lBarr:\"⤎\",lbbrk:\"❲\",lbrace:\"{\",lbrack:\"[\",lbrke:\"⦋\",lbrksld:\"⦏\",lbrkslu:\"⦍\",Lcaron:\"Ľ\",lcaron:\"ľ\",Lcedil:\"Ļ\",lcedil:\"ļ\",lceil:\"⌈\",lcub:\"{\",Lcy:\"Л\",lcy:\"л\",ldca:\"⤶\",ldquo:\"“\",ldquor:\"„\",ldrdhar:\"⥧\",ldrushar:\"⥋\",ldsh:\"↲\",le:\"≤\",lE:\"≦\",LeftAngleBracket:\"⟨\",LeftArrowBar:\"⇤\",leftarrow:\"←\",LeftArrow:\"←\",Leftarrow:\"⇐\",LeftArrowRightArrow:\"⇆\",leftarrowtail:\"↢\",LeftCeiling:\"⌈\",LeftDoubleBracket:\"⟦\",LeftDownTeeVector:\"⥡\",LeftDownVectorBar:\"⥙\",LeftDownVector:\"⇃\",LeftFloor:\"⌊\",leftharpoondown:\"↽\",leftharpoonup:\"↼\",leftleftarrows:\"⇇\",leftrightarrow:\"↔\",LeftRightArrow:\"↔\",Leftrightarrow:\"⇔\",leftrightarrows:\"⇆\",leftrightharpoons:\"⇋\",leftrightsquigarrow:\"↭\",LeftRightVector:\"⥎\",LeftTeeArrow:\"↤\",LeftTee:\"⊣\",LeftTeeVector:\"⥚\",leftthreetimes:\"⋋\",LeftTriangleBar:\"⧏\",LeftTriangle:\"⊲\",LeftTriangleEqual:\"⊴\",LeftUpDownVector:\"⥑\",LeftUpTeeVector:\"⥠\",LeftUpVectorBar:\"⥘\",LeftUpVector:\"↿\",LeftVectorBar:\"⥒\",LeftVector:\"↼\",lEg:\"⪋\",leg:\"⋚\",leq:\"≤\",leqq:\"≦\",leqslant:\"⩽\",lescc:\"⪨\",les:\"⩽\",lesdot:\"⩿\",lesdoto:\"⪁\",lesdotor:\"⪃\",lesg:\"⋚︀\",lesges:\"⪓\",lessapprox:\"⪅\",lessdot:\"⋖\",lesseqgtr:\"⋚\",lesseqqgtr:\"⪋\",LessEqualGreater:\"⋚\",LessFullEqual:\"≦\",LessGreater:\"≶\",lessgtr:\"≶\",LessLess:\"⪡\",lesssim:\"≲\",LessSlantEqual:\"⩽\",LessTilde:\"≲\",lfisht:\"⥼\",lfloor:\"⌊\",Lfr:\"𝔏\",lfr:\"𝔩\",lg:\"≶\",lgE:\"⪑\",lHar:\"⥢\",lhard:\"↽\",lharu:\"↼\",lharul:\"⥪\",lhblk:\"▄\",LJcy:\"Љ\",ljcy:\"љ\",llarr:\"⇇\",ll:\"≪\",Ll:\"⋘\",llcorner:\"⌞\",Lleftarrow:\"⇚\",llhard:\"⥫\",lltri:\"◺\",Lmidot:\"Ŀ\",lmidot:\"ŀ\",lmoustache:\"⎰\",lmoust:\"⎰\",lnap:\"⪉\",lnapprox:\"⪉\",lne:\"⪇\",lnE:\"≨\",lneq:\"⪇\",lneqq:\"≨\",lnsim:\"⋦\",loang:\"⟬\",loarr:\"⇽\",lobrk:\"⟦\",longleftarrow:\"⟵\",LongLeftArrow:\"⟵\",Longleftarrow:\"⟸\",longleftrightarrow:\"⟷\",LongLeftRightArrow:\"⟷\",Longleftrightarrow:\"⟺\",longmapsto:\"⟼\",longrightarrow:\"⟶\",LongRightArrow:\"⟶\",Longrightarrow:\"⟹\",looparrowleft:\"↫\",looparrowright:\"↬\",lopar:\"⦅\",Lopf:\"𝕃\",lopf:\"𝕝\",loplus:\"⨭\",lotimes:\"⨴\",lowast:\"∗\",lowbar:\"_\",LowerLeftArrow:\"↙\",LowerRightArrow:\"↘\",loz:\"◊\",lozenge:\"◊\",lozf:\"⧫\",lpar:\"(\",lparlt:\"⦓\",lrarr:\"⇆\",lrcorner:\"⌟\",lrhar:\"⇋\",lrhard:\"⥭\",lrm:\"‎\",lrtri:\"⊿\",lsaquo:\"‹\",lscr:\"𝓁\",Lscr:\"ℒ\",lsh:\"↰\",Lsh:\"↰\",lsim:\"≲\",lsime:\"⪍\",lsimg:\"⪏\",lsqb:\"[\",lsquo:\"‘\",lsquor:\"‚\",Lstrok:\"Ł\",lstrok:\"ł\",ltcc:\"⪦\",ltcir:\"⩹\",lt:\"<\",LT:\"<\",Lt:\"≪\",ltdot:\"⋖\",lthree:\"⋋\",ltimes:\"⋉\",ltlarr:\"⥶\",ltquest:\"⩻\",ltri:\"◃\",ltrie:\"⊴\",ltrif:\"◂\",ltrPar:\"⦖\",lurdshar:\"⥊\",luruhar:\"⥦\",lvertneqq:\"≨︀\",lvnE:\"≨︀\",macr:\"¯\",male:\"♂\",malt:\"✠\",maltese:\"✠\",Map:\"⤅\",map:\"↦\",mapsto:\"↦\",mapstodown:\"↧\",mapstoleft:\"↤\",mapstoup:\"↥\",marker:\"▮\",mcomma:\"⨩\",Mcy:\"М\",mcy:\"м\",mdash:\"—\",mDDot:\"∺\",measuredangle:\"∡\",MediumSpace:\" \",Mellintrf:\"ℳ\",Mfr:\"𝔐\",mfr:\"𝔪\",mho:\"℧\",micro:\"µ\",midast:\"*\",midcir:\"⫰\",mid:\"∣\",middot:\"·\",minusb:\"⊟\",minus:\"−\",minusd:\"∸\",minusdu:\"⨪\",MinusPlus:\"∓\",mlcp:\"⫛\",mldr:\"…\",mnplus:\"∓\",models:\"⊧\",Mopf:\"𝕄\",mopf:\"𝕞\",mp:\"∓\",mscr:\"𝓂\",Mscr:\"ℳ\",mstpos:\"∾\",Mu:\"Μ\",mu:\"μ\",multimap:\"⊸\",mumap:\"⊸\",nabla:\"∇\",Nacute:\"Ń\",nacute:\"ń\",nang:\"∠⃒\",nap:\"≉\",napE:\"⩰̸\",napid:\"≋̸\",napos:\"ŉ\",napprox:\"≉\",natural:\"♮\",naturals:\"ℕ\",natur:\"♮\",nbsp:\" \",nbump:\"≎̸\",nbumpe:\"≏̸\",ncap:\"⩃\",Ncaron:\"Ň\",ncaron:\"ň\",Ncedil:\"Ņ\",ncedil:\"ņ\",ncong:\"≇\",ncongdot:\"⩭̸\",ncup:\"⩂\",Ncy:\"Н\",ncy:\"н\",ndash:\"–\",nearhk:\"⤤\",nearr:\"↗\",neArr:\"⇗\",nearrow:\"↗\",ne:\"≠\",nedot:\"≐̸\",NegativeMediumSpace:\"​\",NegativeThickSpace:\"​\",NegativeThinSpace:\"​\",NegativeVeryThinSpace:\"​\",nequiv:\"≢\",nesear:\"⤨\",nesim:\"≂̸\",NestedGreaterGreater:\"≫\",NestedLessLess:\"≪\",NewLine:\"\\n\",nexist:\"∄\",nexists:\"∄\",Nfr:\"𝔑\",nfr:\"𝔫\",ngE:\"≧̸\",nge:\"≱\",ngeq:\"≱\",ngeqq:\"≧̸\",ngeqslant:\"⩾̸\",nges:\"⩾̸\",nGg:\"⋙̸\",ngsim:\"≵\",nGt:\"≫⃒\",ngt:\"≯\",ngtr:\"≯\",nGtv:\"≫̸\",nharr:\"↮\",nhArr:\"⇎\",nhpar:\"⫲\",ni:\"∋\",nis:\"⋼\",nisd:\"⋺\",niv:\"∋\",NJcy:\"Њ\",njcy:\"њ\",nlarr:\"↚\",nlArr:\"⇍\",nldr:\"‥\",nlE:\"≦̸\",nle:\"≰\",nleftarrow:\"↚\",nLeftarrow:\"⇍\",nleftrightarrow:\"↮\",nLeftrightarrow:\"⇎\",nleq:\"≰\",nleqq:\"≦̸\",nleqslant:\"⩽̸\",nles:\"⩽̸\",nless:\"≮\",nLl:\"⋘̸\",nlsim:\"≴\",nLt:\"≪⃒\",nlt:\"≮\",nltri:\"⋪\",nltrie:\"⋬\",nLtv:\"≪̸\",nmid:\"∤\",NoBreak:\"⁠\",NonBreakingSpace:\" \",nopf:\"𝕟\",Nopf:\"ℕ\",Not:\"⫬\",not:\"¬\",NotCongruent:\"≢\",NotCupCap:\"≭\",NotDoubleVerticalBar:\"∦\",NotElement:\"∉\",NotEqual:\"≠\",NotEqualTilde:\"≂̸\",NotExists:\"∄\",NotGreater:\"≯\",NotGreaterEqual:\"≱\",NotGreaterFullEqual:\"≧̸\",NotGreaterGreater:\"≫̸\",NotGreaterLess:\"≹\",NotGreaterSlantEqual:\"⩾̸\",NotGreaterTilde:\"≵\",NotHumpDownHump:\"≎̸\",NotHumpEqual:\"≏̸\",notin:\"∉\",notindot:\"⋵̸\",notinE:\"⋹̸\",notinva:\"∉\",notinvb:\"⋷\",notinvc:\"⋶\",NotLeftTriangleBar:\"⧏̸\",NotLeftTriangle:\"⋪\",NotLeftTriangleEqual:\"⋬\",NotLess:\"≮\",NotLessEqual:\"≰\",NotLessGreater:\"≸\",NotLessLess:\"≪̸\",NotLessSlantEqual:\"⩽̸\",NotLessTilde:\"≴\",NotNestedGreaterGreater:\"⪢̸\",NotNestedLessLess:\"⪡̸\",notni:\"∌\",notniva:\"∌\",notnivb:\"⋾\",notnivc:\"⋽\",NotPrecedes:\"⊀\",NotPrecedesEqual:\"⪯̸\",NotPrecedesSlantEqual:\"⋠\",NotReverseElement:\"∌\",NotRightTriangleBar:\"⧐̸\",NotRightTriangle:\"⋫\",NotRightTriangleEqual:\"⋭\",NotSquareSubset:\"⊏̸\",NotSquareSubsetEqual:\"⋢\",NotSquareSuperset:\"⊐̸\",NotSquareSupersetEqual:\"⋣\",NotSubset:\"⊂⃒\",NotSubsetEqual:\"⊈\",NotSucceeds:\"⊁\",NotSucceedsEqual:\"⪰̸\",NotSucceedsSlantEqual:\"⋡\",NotSucceedsTilde:\"≿̸\",NotSuperset:\"⊃⃒\",NotSupersetEqual:\"⊉\",NotTilde:\"≁\",NotTildeEqual:\"≄\",NotTildeFullEqual:\"≇\",NotTildeTilde:\"≉\",NotVerticalBar:\"∤\",nparallel:\"∦\",npar:\"∦\",nparsl:\"⫽⃥\",npart:\"∂̸\",npolint:\"⨔\",npr:\"⊀\",nprcue:\"⋠\",nprec:\"⊀\",npreceq:\"⪯̸\",npre:\"⪯̸\",nrarrc:\"⤳̸\",nrarr:\"↛\",nrArr:\"⇏\",nrarrw:\"↝̸\",nrightarrow:\"↛\",nRightarrow:\"⇏\",nrtri:\"⋫\",nrtrie:\"⋭\",nsc:\"⊁\",nsccue:\"⋡\",nsce:\"⪰̸\",Nscr:\"𝒩\",nscr:\"𝓃\",nshortmid:\"∤\",nshortparallel:\"∦\",nsim:\"≁\",nsime:\"≄\",nsimeq:\"≄\",nsmid:\"∤\",nspar:\"∦\",nsqsube:\"⋢\",nsqsupe:\"⋣\",nsub:\"⊄\",nsubE:\"⫅̸\",nsube:\"⊈\",nsubset:\"⊂⃒\",nsubseteq:\"⊈\",nsubseteqq:\"⫅̸\",nsucc:\"⊁\",nsucceq:\"⪰̸\",nsup:\"⊅\",nsupE:\"⫆̸\",nsupe:\"⊉\",nsupset:\"⊃⃒\",nsupseteq:\"⊉\",nsupseteqq:\"⫆̸\",ntgl:\"≹\",Ntilde:\"Ñ\",ntilde:\"ñ\",ntlg:\"≸\",ntriangleleft:\"⋪\",ntrianglelefteq:\"⋬\",ntriangleright:\"⋫\",ntrianglerighteq:\"⋭\",Nu:\"Ν\",nu:\"ν\",num:\"#\",numero:\"№\",numsp:\" \",nvap:\"≍⃒\",nvdash:\"⊬\",nvDash:\"⊭\",nVdash:\"⊮\",nVDash:\"⊯\",nvge:\"≥⃒\",nvgt:\">⃒\",nvHarr:\"⤄\",nvinfin:\"⧞\",nvlArr:\"⤂\",nvle:\"≤⃒\",nvlt:\"<⃒\",nvltrie:\"⊴⃒\",nvrArr:\"⤃\",nvrtrie:\"⊵⃒\",nvsim:\"∼⃒\",nwarhk:\"⤣\",nwarr:\"↖\",nwArr:\"⇖\",nwarrow:\"↖\",nwnear:\"⤧\",Oacute:\"Ó\",oacute:\"ó\",oast:\"⊛\",Ocirc:\"Ô\",ocirc:\"ô\",ocir:\"⊚\",Ocy:\"О\",ocy:\"о\",odash:\"⊝\",Odblac:\"Ő\",odblac:\"ő\",odiv:\"⨸\",odot:\"⊙\",odsold:\"⦼\",OElig:\"Œ\",oelig:\"œ\",ofcir:\"⦿\",Ofr:\"𝔒\",ofr:\"𝔬\",ogon:\"˛\",Ograve:\"Ò\",ograve:\"ò\",ogt:\"⧁\",ohbar:\"⦵\",ohm:\"Ω\",oint:\"∮\",olarr:\"↺\",olcir:\"⦾\",olcross:\"⦻\",oline:\"‾\",olt:\"⧀\",Omacr:\"Ō\",omacr:\"ō\",Omega:\"Ω\",omega:\"ω\",Omicron:\"Ο\",omicron:\"ο\",omid:\"⦶\",ominus:\"⊖\",Oopf:\"𝕆\",oopf:\"𝕠\",opar:\"⦷\",OpenCurlyDoubleQuote:\"“\",OpenCurlyQuote:\"‘\",operp:\"⦹\",oplus:\"⊕\",orarr:\"↻\",Or:\"⩔\",or:\"∨\",ord:\"⩝\",order:\"ℴ\",orderof:\"ℴ\",ordf:\"ª\",ordm:\"º\",origof:\"⊶\",oror:\"⩖\",orslope:\"⩗\",orv:\"⩛\",oS:\"Ⓢ\",Oscr:\"𝒪\",oscr:\"ℴ\",Oslash:\"Ø\",oslash:\"ø\",osol:\"⊘\",Otilde:\"Õ\",otilde:\"õ\",otimesas:\"⨶\",Otimes:\"⨷\",otimes:\"⊗\",Ouml:\"Ö\",ouml:\"ö\",ovbar:\"⌽\",OverBar:\"‾\",OverBrace:\"⏞\",OverBracket:\"⎴\",OverParenthesis:\"⏜\",para:\"¶\",parallel:\"∥\",par:\"∥\",parsim:\"⫳\",parsl:\"⫽\",part:\"∂\",PartialD:\"∂\",Pcy:\"П\",pcy:\"п\",percnt:\"%\",period:\".\",permil:\"‰\",perp:\"⊥\",pertenk:\"‱\",Pfr:\"𝔓\",pfr:\"𝔭\",Phi:\"Φ\",phi:\"φ\",phiv:\"ϕ\",phmmat:\"ℳ\",phone:\"☎\",Pi:\"Π\",pi:\"π\",pitchfork:\"⋔\",piv:\"ϖ\",planck:\"ℏ\",planckh:\"ℎ\",plankv:\"ℏ\",plusacir:\"⨣\",plusb:\"⊞\",pluscir:\"⨢\",plus:\"+\",plusdo:\"∔\",plusdu:\"⨥\",pluse:\"⩲\",PlusMinus:\"±\",plusmn:\"±\",plussim:\"⨦\",plustwo:\"⨧\",pm:\"±\",Poincareplane:\"ℌ\",pointint:\"⨕\",popf:\"𝕡\",Popf:\"ℙ\",pound:\"£\",prap:\"⪷\",Pr:\"⪻\",pr:\"≺\",prcue:\"≼\",precapprox:\"⪷\",prec:\"≺\",preccurlyeq:\"≼\",Precedes:\"≺\",PrecedesEqual:\"⪯\",PrecedesSlantEqual:\"≼\",PrecedesTilde:\"≾\",preceq:\"⪯\",precnapprox:\"⪹\",precneqq:\"⪵\",precnsim:\"⋨\",pre:\"⪯\",prE:\"⪳\",precsim:\"≾\",prime:\"′\",Prime:\"″\",primes:\"ℙ\",prnap:\"⪹\",prnE:\"⪵\",prnsim:\"⋨\",prod:\"∏\",Product:\"∏\",profalar:\"⌮\",profline:\"⌒\",profsurf:\"⌓\",prop:\"∝\",Proportional:\"∝\",Proportion:\"∷\",propto:\"∝\",prsim:\"≾\",prurel:\"⊰\",Pscr:\"𝒫\",pscr:\"𝓅\",Psi:\"Ψ\",psi:\"ψ\",puncsp:\" \",Qfr:\"𝔔\",qfr:\"𝔮\",qint:\"⨌\",qopf:\"𝕢\",Qopf:\"ℚ\",qprime:\"⁗\",Qscr:\"𝒬\",qscr:\"𝓆\",quaternions:\"ℍ\",quatint:\"⨖\",quest:\"?\",questeq:\"≟\",quot:'\"',QUOT:'\"',rAarr:\"⇛\",race:\"∽̱\",Racute:\"Ŕ\",racute:\"ŕ\",radic:\"√\",raemptyv:\"⦳\",rang:\"⟩\",Rang:\"⟫\",rangd:\"⦒\",range:\"⦥\",rangle:\"⟩\",raquo:\"»\",rarrap:\"⥵\",rarrb:\"⇥\",rarrbfs:\"⤠\",rarrc:\"⤳\",rarr:\"→\",Rarr:\"↠\",rArr:\"⇒\",rarrfs:\"⤞\",rarrhk:\"↪\",rarrlp:\"↬\",rarrpl:\"⥅\",rarrsim:\"⥴\",Rarrtl:\"⤖\",rarrtl:\"↣\",rarrw:\"↝\",ratail:\"⤚\",rAtail:\"⤜\",ratio:\"∶\",rationals:\"ℚ\",rbarr:\"⤍\",rBarr:\"⤏\",RBarr:\"⤐\",rbbrk:\"❳\",rbrace:\"}\",rbrack:\"]\",rbrke:\"⦌\",rbrksld:\"⦎\",rbrkslu:\"⦐\",Rcaron:\"Ř\",rcaron:\"ř\",Rcedil:\"Ŗ\",rcedil:\"ŗ\",rceil:\"⌉\",rcub:\"}\",Rcy:\"Р\",rcy:\"р\",rdca:\"⤷\",rdldhar:\"⥩\",rdquo:\"”\",rdquor:\"”\",rdsh:\"↳\",real:\"ℜ\",realine:\"ℛ\",realpart:\"ℜ\",reals:\"ℝ\",Re:\"ℜ\",rect:\"▭\",reg:\"®\",REG:\"®\",ReverseElement:\"∋\",ReverseEquilibrium:\"⇋\",ReverseUpEquilibrium:\"⥯\",rfisht:\"⥽\",rfloor:\"⌋\",rfr:\"𝔯\",Rfr:\"ℜ\",rHar:\"⥤\",rhard:\"⇁\",rharu:\"⇀\",rharul:\"⥬\",Rho:\"Ρ\",rho:\"ρ\",rhov:\"ϱ\",RightAngleBracket:\"⟩\",RightArrowBar:\"⇥\",rightarrow:\"→\",RightArrow:\"→\",Rightarrow:\"⇒\",RightArrowLeftArrow:\"⇄\",rightarrowtail:\"↣\",RightCeiling:\"⌉\",RightDoubleBracket:\"⟧\",RightDownTeeVector:\"⥝\",RightDownVectorBar:\"⥕\",RightDownVector:\"⇂\",RightFloor:\"⌋\",rightharpoondown:\"⇁\",rightharpoonup:\"⇀\",rightleftarrows:\"⇄\",rightleftharpoons:\"⇌\",rightrightarrows:\"⇉\",rightsquigarrow:\"↝\",RightTeeArrow:\"↦\",RightTee:\"⊢\",RightTeeVector:\"⥛\",rightthreetimes:\"⋌\",RightTriangleBar:\"⧐\",RightTriangle:\"⊳\",RightTriangleEqual:\"⊵\",RightUpDownVector:\"⥏\",RightUpTeeVector:\"⥜\",RightUpVectorBar:\"⥔\",RightUpVector:\"↾\",RightVectorBar:\"⥓\",RightVector:\"⇀\",ring:\"˚\",risingdotseq:\"≓\",rlarr:\"⇄\",rlhar:\"⇌\",rlm:\"‏\",rmoustache:\"⎱\",rmoust:\"⎱\",rnmid:\"⫮\",roang:\"⟭\",roarr:\"⇾\",robrk:\"⟧\",ropar:\"⦆\",ropf:\"𝕣\",Ropf:\"ℝ\",roplus:\"⨮\",rotimes:\"⨵\",RoundImplies:\"⥰\",rpar:\")\",rpargt:\"⦔\",rppolint:\"⨒\",rrarr:\"⇉\",Rrightarrow:\"⇛\",rsaquo:\"›\",rscr:\"𝓇\",Rscr:\"ℛ\",rsh:\"↱\",Rsh:\"↱\",rsqb:\"]\",rsquo:\"’\",rsquor:\"’\",rthree:\"⋌\",rtimes:\"⋊\",rtri:\"▹\",rtrie:\"⊵\",rtrif:\"▸\",rtriltri:\"⧎\",RuleDelayed:\"⧴\",ruluhar:\"⥨\",rx:\"℞\",Sacute:\"Ś\",sacute:\"ś\",sbquo:\"‚\",scap:\"⪸\",Scaron:\"Š\",scaron:\"š\",Sc:\"⪼\",sc:\"≻\",sccue:\"≽\",sce:\"⪰\",scE:\"⪴\",Scedil:\"Ş\",scedil:\"ş\",Scirc:\"Ŝ\",scirc:\"ŝ\",scnap:\"⪺\",scnE:\"⪶\",scnsim:\"⋩\",scpolint:\"⨓\",scsim:\"≿\",Scy:\"С\",scy:\"с\",sdotb:\"⊡\",sdot:\"⋅\",sdote:\"⩦\",searhk:\"⤥\",searr:\"↘\",seArr:\"⇘\",searrow:\"↘\",sect:\"§\",semi:\";\",seswar:\"⤩\",setminus:\"∖\",setmn:\"∖\",sext:\"✶\",Sfr:\"𝔖\",sfr:\"𝔰\",sfrown:\"⌢\",sharp:\"♯\",SHCHcy:\"Щ\",shchcy:\"щ\",SHcy:\"Ш\",shcy:\"ш\",ShortDownArrow:\"↓\",ShortLeftArrow:\"←\",shortmid:\"∣\",shortparallel:\"∥\",ShortRightArrow:\"→\",ShortUpArrow:\"↑\",shy:\"­\",Sigma:\"Σ\",sigma:\"σ\",sigmaf:\"ς\",sigmav:\"ς\",sim:\"∼\",simdot:\"⩪\",sime:\"≃\",simeq:\"≃\",simg:\"⪞\",simgE:\"⪠\",siml:\"⪝\",simlE:\"⪟\",simne:\"≆\",simplus:\"⨤\",simrarr:\"⥲\",slarr:\"←\",SmallCircle:\"∘\",smallsetminus:\"∖\",smashp:\"⨳\",smeparsl:\"⧤\",smid:\"∣\",smile:\"⌣\",smt:\"⪪\",smte:\"⪬\",smtes:\"⪬︀\",SOFTcy:\"Ь\",softcy:\"ь\",solbar:\"⌿\",solb:\"⧄\",sol:\"/\",Sopf:\"𝕊\",sopf:\"𝕤\",spades:\"♠\",spadesuit:\"♠\",spar:\"∥\",sqcap:\"⊓\",sqcaps:\"⊓︀\",sqcup:\"⊔\",sqcups:\"⊔︀\",Sqrt:\"√\",sqsub:\"⊏\",sqsube:\"⊑\",sqsubset:\"⊏\",sqsubseteq:\"⊑\",sqsup:\"⊐\",sqsupe:\"⊒\",sqsupset:\"⊐\",sqsupseteq:\"⊒\",square:\"□\",Square:\"□\",SquareIntersection:\"⊓\",SquareSubset:\"⊏\",SquareSubsetEqual:\"⊑\",SquareSuperset:\"⊐\",SquareSupersetEqual:\"⊒\",SquareUnion:\"⊔\",squarf:\"▪\",squ:\"□\",squf:\"▪\",srarr:\"→\",Sscr:\"𝒮\",sscr:\"𝓈\",ssetmn:\"∖\",ssmile:\"⌣\",sstarf:\"⋆\",Star:\"⋆\",star:\"☆\",starf:\"★\",straightepsilon:\"ϵ\",straightphi:\"ϕ\",strns:\"¯\",sub:\"⊂\",Sub:\"⋐\",subdot:\"⪽\",subE:\"⫅\",sube:\"⊆\",subedot:\"⫃\",submult:\"⫁\",subnE:\"⫋\",subne:\"⊊\",subplus:\"⪿\",subrarr:\"⥹\",subset:\"⊂\",Subset:\"⋐\",subseteq:\"⊆\",subseteqq:\"⫅\",SubsetEqual:\"⊆\",subsetneq:\"⊊\",subsetneqq:\"⫋\",subsim:\"⫇\",subsub:\"⫕\",subsup:\"⫓\",succapprox:\"⪸\",succ:\"≻\",succcurlyeq:\"≽\",Succeeds:\"≻\",SucceedsEqual:\"⪰\",SucceedsSlantEqual:\"≽\",SucceedsTilde:\"≿\",succeq:\"⪰\",succnapprox:\"⪺\",succneqq:\"⪶\",succnsim:\"⋩\",succsim:\"≿\",SuchThat:\"∋\",sum:\"∑\",Sum:\"∑\",sung:\"♪\",sup1:\"¹\",sup2:\"²\",sup3:\"³\",sup:\"⊃\",Sup:\"⋑\",supdot:\"⪾\",supdsub:\"⫘\",supE:\"⫆\",supe:\"⊇\",supedot:\"⫄\",Superset:\"⊃\",SupersetEqual:\"⊇\",suphsol:\"⟉\",suphsub:\"⫗\",suplarr:\"⥻\",supmult:\"⫂\",supnE:\"⫌\",supne:\"⊋\",supplus:\"⫀\",supset:\"⊃\",Supset:\"⋑\",supseteq:\"⊇\",supseteqq:\"⫆\",supsetneq:\"⊋\",supsetneqq:\"⫌\",supsim:\"⫈\",supsub:\"⫔\",supsup:\"⫖\",swarhk:\"⤦\",swarr:\"↙\",swArr:\"⇙\",swarrow:\"↙\",swnwar:\"⤪\",szlig:\"ß\",Tab:\"\\t\",target:\"⌖\",Tau:\"Τ\",tau:\"τ\",tbrk:\"⎴\",Tcaron:\"Ť\",tcaron:\"ť\",Tcedil:\"Ţ\",tcedil:\"ţ\",Tcy:\"Т\",tcy:\"т\",tdot:\"⃛\",telrec:\"⌕\",Tfr:\"𝔗\",tfr:\"𝔱\",there4:\"∴\",therefore:\"∴\",Therefore:\"∴\",Theta:\"Θ\",theta:\"θ\",thetasym:\"ϑ\",thetav:\"ϑ\",thickapprox:\"≈\",thicksim:\"∼\",ThickSpace:\"  \",ThinSpace:\" \",thinsp:\" \",thkap:\"≈\",thksim:\"∼\",THORN:\"Þ\",thorn:\"þ\",tilde:\"˜\",Tilde:\"∼\",TildeEqual:\"≃\",TildeFullEqual:\"≅\",TildeTilde:\"≈\",timesbar:\"⨱\",timesb:\"⊠\",times:\"×\",timesd:\"⨰\",tint:\"∭\",toea:\"⤨\",topbot:\"⌶\",topcir:\"⫱\",top:\"⊤\",Topf:\"𝕋\",topf:\"𝕥\",topfork:\"⫚\",tosa:\"⤩\",tprime:\"‴\",trade:\"™\",TRADE:\"™\",triangle:\"▵\",triangledown:\"▿\",triangleleft:\"◃\",trianglelefteq:\"⊴\",triangleq:\"≜\",triangleright:\"▹\",trianglerighteq:\"⊵\",tridot:\"◬\",trie:\"≜\",triminus:\"⨺\",TripleDot:\"⃛\",triplus:\"⨹\",trisb:\"⧍\",tritime:\"⨻\",trpezium:\"⏢\",Tscr:\"𝒯\",tscr:\"𝓉\",TScy:\"Ц\",tscy:\"ц\",TSHcy:\"Ћ\",tshcy:\"ћ\",Tstrok:\"Ŧ\",tstrok:\"ŧ\",twixt:\"≬\",twoheadleftarrow:\"↞\",twoheadrightarrow:\"↠\",Uacute:\"Ú\",uacute:\"ú\",uarr:\"↑\",Uarr:\"↟\",uArr:\"⇑\",Uarrocir:\"⥉\",Ubrcy:\"Ў\",ubrcy:\"ў\",Ubreve:\"Ŭ\",ubreve:\"ŭ\",Ucirc:\"Û\",ucirc:\"û\",Ucy:\"У\",ucy:\"у\",udarr:\"⇅\",Udblac:\"Ű\",udblac:\"ű\",udhar:\"⥮\",ufisht:\"⥾\",Ufr:\"𝔘\",ufr:\"𝔲\",Ugrave:\"Ù\",ugrave:\"ù\",uHar:\"⥣\",uharl:\"↿\",uharr:\"↾\",uhblk:\"▀\",ulcorn:\"⌜\",ulcorner:\"⌜\",ulcrop:\"⌏\",ultri:\"◸\",Umacr:\"Ū\",umacr:\"ū\",uml:\"¨\",UnderBar:\"_\",UnderBrace:\"⏟\",UnderBracket:\"⎵\",UnderParenthesis:\"⏝\",Union:\"⋃\",UnionPlus:\"⊎\",Uogon:\"Ų\",uogon:\"ų\",Uopf:\"𝕌\",uopf:\"𝕦\",UpArrowBar:\"⤒\",uparrow:\"↑\",UpArrow:\"↑\",Uparrow:\"⇑\",UpArrowDownArrow:\"⇅\",updownarrow:\"↕\",UpDownArrow:\"↕\",Updownarrow:\"⇕\",UpEquilibrium:\"⥮\",upharpoonleft:\"↿\",upharpoonright:\"↾\",uplus:\"⊎\",UpperLeftArrow:\"↖\",UpperRightArrow:\"↗\",upsi:\"υ\",Upsi:\"ϒ\",upsih:\"ϒ\",Upsilon:\"Υ\",upsilon:\"υ\",UpTeeArrow:\"↥\",UpTee:\"⊥\",upuparrows:\"⇈\",urcorn:\"⌝\",urcorner:\"⌝\",urcrop:\"⌎\",Uring:\"Ů\",uring:\"ů\",urtri:\"◹\",Uscr:\"𝒰\",uscr:\"𝓊\",utdot:\"⋰\",Utilde:\"Ũ\",utilde:\"ũ\",utri:\"▵\",utrif:\"▴\",uuarr:\"⇈\",Uuml:\"Ü\",uuml:\"ü\",uwangle:\"⦧\",vangrt:\"⦜\",varepsilon:\"ϵ\",varkappa:\"ϰ\",varnothing:\"∅\",varphi:\"ϕ\",varpi:\"ϖ\",varpropto:\"∝\",varr:\"↕\",vArr:\"⇕\",varrho:\"ϱ\",varsigma:\"ς\",varsubsetneq:\"⊊︀\",varsubsetneqq:\"⫋︀\",varsupsetneq:\"⊋︀\",varsupsetneqq:\"⫌︀\",vartheta:\"ϑ\",vartriangleleft:\"⊲\",vartriangleright:\"⊳\",vBar:\"⫨\",Vbar:\"⫫\",vBarv:\"⫩\",Vcy:\"В\",vcy:\"в\",vdash:\"⊢\",vDash:\"⊨\",Vdash:\"⊩\",VDash:\"⊫\",Vdashl:\"⫦\",veebar:\"⊻\",vee:\"∨\",Vee:\"⋁\",veeeq:\"≚\",vellip:\"⋮\",verbar:\"|\",Verbar:\"‖\",vert:\"|\",Vert:\"‖\",VerticalBar:\"∣\",VerticalLine:\"|\",VerticalSeparator:\"❘\",VerticalTilde:\"≀\",VeryThinSpace:\" \",Vfr:\"𝔙\",vfr:\"𝔳\",vltri:\"⊲\",vnsub:\"⊂⃒\",vnsup:\"⊃⃒\",Vopf:\"𝕍\",vopf:\"𝕧\",vprop:\"∝\",vrtri:\"⊳\",Vscr:\"𝒱\",vscr:\"𝓋\",vsubnE:\"⫋︀\",vsubne:\"⊊︀\",vsupnE:\"⫌︀\",vsupne:\"⊋︀\",Vvdash:\"⊪\",vzigzag:\"⦚\",Wcirc:\"Ŵ\",wcirc:\"ŵ\",wedbar:\"⩟\",wedge:\"∧\",Wedge:\"⋀\",wedgeq:\"≙\",weierp:\"℘\",Wfr:\"𝔚\",wfr:\"𝔴\",Wopf:\"𝕎\",wopf:\"𝕨\",wp:\"℘\",wr:\"≀\",wreath:\"≀\",Wscr:\"𝒲\",wscr:\"𝓌\",xcap:\"⋂\",xcirc:\"◯\",xcup:\"⋃\",xdtri:\"▽\",Xfr:\"𝔛\",xfr:\"𝔵\",xharr:\"⟷\",xhArr:\"⟺\",Xi:\"Ξ\",xi:\"ξ\",xlarr:\"⟵\",xlArr:\"⟸\",xmap:\"⟼\",xnis:\"⋻\",xodot:\"⨀\",Xopf:\"𝕏\",xopf:\"𝕩\",xoplus:\"⨁\",xotime:\"⨂\",xrarr:\"⟶\",xrArr:\"⟹\",Xscr:\"𝒳\",xscr:\"𝓍\",xsqcup:\"⨆\",xuplus:\"⨄\",xutri:\"△\",xvee:\"⋁\",xwedge:\"⋀\",Yacute:\"Ý\",yacute:\"ý\",YAcy:\"Я\",yacy:\"я\",Ycirc:\"Ŷ\",ycirc:\"ŷ\",Ycy:\"Ы\",ycy:\"ы\",yen:\"¥\",Yfr:\"𝔜\",yfr:\"𝔶\",YIcy:\"Ї\",yicy:\"ї\",Yopf:\"𝕐\",yopf:\"𝕪\",Yscr:\"𝒴\",yscr:\"𝓎\",YUcy:\"Ю\",yucy:\"ю\",yuml:\"ÿ\",Yuml:\"Ÿ\",Zacute:\"Ź\",zacute:\"ź\",Zcaron:\"Ž\",zcaron:\"ž\",Zcy:\"З\",zcy:\"з\",Zdot:\"Ż\",zdot:\"ż\",zeetrf:\"ℨ\",ZeroWidthSpace:\"​\",Zeta:\"Ζ\",zeta:\"ζ\",zfr:\"𝔷\",Zfr:\"ℨ\",ZHcy:\"Ж\",zhcy:\"ж\",zigrarr:\"⇝\",zopf:\"𝕫\",Zopf:\"ℤ\",Zscr:\"𝒵\",zscr:\"𝓏\",zwj:\"‍\",zwnj:\"‌\"}},function(e,t){e.exports={Aacute:\"Á\",aacute:\"á\",Acirc:\"Â\",acirc:\"â\",acute:\"´\",AElig:\"Æ\",aelig:\"æ\",Agrave:\"À\",agrave:\"à\",amp:\"&\",AMP:\"&\",Aring:\"Å\",aring:\"å\",Atilde:\"Ã\",atilde:\"ã\",Auml:\"Ä\",auml:\"ä\",brvbar:\"¦\",Ccedil:\"Ç\",ccedil:\"ç\",cedil:\"¸\",cent:\"¢\",copy:\"©\",COPY:\"©\",curren:\"¤\",deg:\"°\",divide:\"÷\",Eacute:\"É\",eacute:\"é\",Ecirc:\"Ê\",ecirc:\"ê\",Egrave:\"È\",egrave:\"è\",ETH:\"Ð\",eth:\"ð\",Euml:\"Ë\",euml:\"ë\",frac12:\"½\",frac14:\"¼\",frac34:\"¾\",gt:\">\",GT:\">\",Iacute:\"Í\",iacute:\"í\",Icirc:\"Î\",icirc:\"î\",iexcl:\"¡\",Igrave:\"Ì\",igrave:\"ì\",iquest:\"¿\",Iuml:\"Ï\",iuml:\"ï\",laquo:\"«\",lt:\"<\",LT:\"<\",macr:\"¯\",micro:\"µ\",middot:\"·\",nbsp:\" \",not:\"¬\",Ntilde:\"Ñ\",ntilde:\"ñ\",Oacute:\"Ó\",oacute:\"ó\",Ocirc:\"Ô\",ocirc:\"ô\",Ograve:\"Ò\",ograve:\"ò\",ordf:\"ª\",ordm:\"º\",Oslash:\"Ø\",oslash:\"ø\",Otilde:\"Õ\",otilde:\"õ\",Ouml:\"Ö\",ouml:\"ö\",para:\"¶\",plusmn:\"±\",pound:\"£\",quot:'\"',QUOT:'\"',raquo:\"»\",reg:\"®\",REG:\"®\",sect:\"§\",shy:\"­\",sup1:\"¹\",sup2:\"²\",sup3:\"³\",szlig:\"ß\",THORN:\"Þ\",thorn:\"þ\",times:\"×\",Uacute:\"Ú\",uacute:\"ú\",Ucirc:\"Û\",ucirc:\"û\",Ugrave:\"Ù\",ugrave:\"ù\",uml:\"¨\",Uuml:\"Ü\",uuml:\"ü\",Yacute:\"Ý\",yacute:\"ý\",yen:\"¥\",yuml:\"ÿ\"}},function(e,t){e.exports={amp:\"&\",apos:\"'\",gt:\">\",lt:\"<\",quot:'\"'}},function(e,t,n){function r(e,t,n){\"object\"==typeof e?(n=t,t=e,e=null):\"function\"==typeof t&&(n=t,t=u),this._callback=e,this._options=t||u,this._elementCB=n,this.dom=[],this._done=!1,this._tagStack=[],this._parser=this._parser||null}var i=n(1150),o=/\\s+/g,a=n(1151),s=n(1152),u={normalizeWhitespace:!1,withStartIndices:!1,withEndIndices:!1};r.prototype.onparserinit=function(e){this._parser=e},r.prototype.onreset=function(){r.call(this,this._callback,this._options,this._elementCB)},r.prototype.onend=function(){this._done||(this._done=!0,this._parser=null,this._handleCallback(null))},r.prototype._handleCallback=r.prototype.onerror=function(e){if(\"function\"==typeof this._callback)this._callback(e,this.dom);else if(e)throw e},r.prototype.onclosetag=function(){var e=this._tagStack.pop();this._options.withEndIndices&&(e.endIndex=this._parser.endIndex),this._elementCB&&this._elementCB(e)},r.prototype._createDomElement=function(e){if(!this._options.withDomLvl1)return e;var t;t=\"tag\"===e.type?Object.create(s):Object.create(a);for(var n in e)e.hasOwnProperty(n)&&(t[n]=e[n]);return t},r.prototype._addDomElement=function(e){var t=this._tagStack[this._tagStack.length-1],n=t?t.children:this.dom,r=n[n.length-1];e.next=null,this._options.withStartIndices&&(e.startIndex=this._parser.startIndex),this._options.withEndIndices&&(e.endIndex=this._parser.endIndex),r?(e.prev=r,r.next=e):e.prev=null,n.push(e),e.parent=t||null},r.prototype.onopentag=function(e,t){var n={type:\"script\"===e?i.Script:\"style\"===e?i.Style:i.Tag,name:e,attribs:t,children:[]},r=this._createDomElement(n);this._addDomElement(r),this._tagStack.push(r)},r.prototype.ontext=function(e){var t,n=this._options.normalizeWhitespace||this._options.ignoreWhitespace;if(!this._tagStack.length&&this.dom.length&&(t=this.dom[this.dom.length-1]).type===i.Text)n?t.data=(t.data+e).replace(o,\" \"):t.data+=e;else if(this._tagStack.length&&(t=this._tagStack[this._tagStack.length-1])&&(t=t.children[t.children.length-1])&&t.type===i.Text)n?t.data=(t.data+e).replace(o,\" \"):t.data+=e;else{n&&(e=e.replace(o,\" \"));var r=this._createDomElement({data:e,type:i.Text});this._addDomElement(r)}},r.prototype.oncomment=function(e){var t=this._tagStack[this._tagStack.length-1];if(t&&t.type===i.Comment)return void(t.data+=e);var n={data:e,type:i.Comment},r=this._createDomElement(n);this._addDomElement(r),this._tagStack.push(r)},r.prototype.oncdatastart=function(){var e={children:[{data:\"\",type:i.Text}],type:i.CDATA},t=this._createDomElement(e);this._addDomElement(t),this._tagStack.push(t)},r.prototype.oncommentend=r.prototype.oncdataend=function(){this._tagStack.pop()},r.prototype.onprocessinginstruction=function(e,t){var n=this._createDomElement({name:e,data:t,type:i.Directive});this._addDomElement(n)},e.exports=r},function(e,t){e.exports={Text:\"text\",Directive:\"directive\",Comment:\"comment\",Script:\"script\",Style:\"style\",Tag:\"tag\",CDATA:\"cdata\",Doctype:\"doctype\",isTag:function(e){return\"tag\"===e.type||\"script\"===e.type||\"style\"===e.type}}},function(e,t){var n=e.exports={get firstChild(){var e=this.children;return e&&e[0]||null},get lastChild(){var e=this.children;return e&&e[e.length-1]||null},get nodeType(){return i[this.type]||i.element}},r={tagName:\"name\",childNodes:\"children\",parentNode:\"parent\",previousSibling:\"prev\",nextSibling:\"next\",nodeValue:\"data\"},i={element:1,text:3,cdata:4,comment:8};Object.keys(r).forEach(function(e){var t=r[e];Object.defineProperty(n,e,{get:function(){return this[t]||null},set:function(e){return this[t]=e,e}})})},function(e,t,n){var r=n(1151),i=e.exports=Object.create(r),o={tagName:\"name\"};Object.keys(o).forEach(function(e){var t=o[e];Object.defineProperty(i,e,{\nget:function(){return this[t]||null},set:function(e){return this[t]=e,e}})})},function(e,t,n){function r(e,t){this.init(e,t)}function i(e,t){return l.getElementsByTagName(e,t,!0)}function o(e,t){return l.getElementsByTagName(e,t,!0,1)[0]}function a(e,t,n){return l.getText(l.getElementsByTagName(e,t,n,1)).trim()}function s(e,t,n,r,i){var o=a(n,r,i);o&&(e[t]=o)}var u=n(1141),c=u.DomHandler,l=u.DomUtils;n(328)(r,c),r.prototype.init=c;var p=function(e){return\"rss\"===e||\"feed\"===e||\"rdf:RDF\"===e};r.prototype.onend=function(){var e,t,n={},r=o(p,this.dom);r&&(\"feed\"===r.name?(t=r.children,n.type=\"atom\",s(n,\"id\",\"id\",t),s(n,\"title\",\"title\",t),(e=o(\"link\",t))&&(e=e.attribs)&&(e=e.href)&&(n.link=e),s(n,\"description\",\"subtitle\",t),(e=a(\"updated\",t))&&(n.updated=new Date(e)),s(n,\"author\",\"email\",t,!0),n.items=i(\"entry\",t).map(function(e){var t,n={};return e=e.children,s(n,\"id\",\"id\",e),s(n,\"title\",\"title\",e),(t=o(\"link\",e))&&(t=t.attribs)&&(t=t.href)&&(n.link=t),(t=a(\"summary\",e)||a(\"content\",e))&&(n.description=t),(t=a(\"updated\",e))&&(n.pubDate=new Date(t)),n})):(t=o(\"channel\",r.children).children,n.type=r.name.substr(0,3),n.id=\"\",s(n,\"title\",\"title\",t),s(n,\"link\",\"link\",t),s(n,\"description\",\"description\",t),(e=a(\"lastBuildDate\",t))&&(n.updated=new Date(e)),s(n,\"author\",\"managingEditor\",t,!0),n.items=i(\"item\",r.children).map(function(e){var t,n={};return e=e.children,s(n,\"id\",\"guid\",e),s(n,\"title\",\"title\",e),s(n,\"link\",\"link\",e),s(n,\"description\",\"description\",e),(t=a(\"pubDate\",e))&&(n.pubDate=new Date(t)),n}))),this.dom=n,c.prototype._handleCallback.call(this,r?null:Error(\"couldn't find root of feed\"))},e.exports=r},function(e,t,n){function r(e){o.call(this,new i(this),e)}function i(e){this.scope=e}e.exports=r;var o=n(1155);n(328)(r,o),r.prototype.readable=!0;var a=n(1141).EVENTS;Object.keys(a).forEach(function(e){if(0===a[e])i.prototype[\"on\"+e]=function(){this.scope.emit(e)};else if(1===a[e])i.prototype[\"on\"+e]=function(t){this.scope.emit(e,t)};else{if(2!==a[e])throw Error(\"wrong number of arguments!\");i.prototype[\"on\"+e]=function(t,n){this.scope.emit(e,t,n)}}})},function(e,t,n){function r(e,t){var n=this._parser=new i(e,t),r=this._decoder=new a;o.call(this,{decodeStrings:!1}),this.once(\"finish\",function(){n.end(r.end())})}e.exports=r;var i=n(1142),o=n(326).Writable||n(1156).Writable,a=n(343).StringDecoder,s=n(132).Buffer;n(328)(r,o),o.prototype._write=function(e,t,n){e instanceof s&&(e=this._decoder.write(e)),this._parser.write(e),n()}},335,function(e,t,n){function r(e){this._cbs=e||{}}e.exports=r;var i=n(1141).EVENTS;Object.keys(i).forEach(function(e){if(0===i[e])e=\"on\"+e,r.prototype[e]=function(){this._cbs[e]&&this._cbs[e]()};else if(1===i[e])e=\"on\"+e,r.prototype[e]=function(t){this._cbs[e]&&this._cbs[e](t)};else{if(2!==i[e])throw Error(\"wrong number of arguments\");e=\"on\"+e,r.prototype[e]=function(t,n){this._cbs[e]&&this._cbs[e](t,n)}}})},function(e,t,n){var r=e.exports;[n(1159),n(1165),n(1166),n(1167),n(1168),n(1169)].forEach(function(e){Object.keys(e).forEach(function(t){r[t]=e[t].bind(r)})})},function(e,t,n){function r(e,t){return e.children?e.children.map(function(e){return a(e,t)}).join(\"\"):\"\"}function i(e){return Array.isArray(e)?e.map(i).join(\"\"):s(e)?\"br\"===e.name?\"\\n\":i(e.children):e.type===o.CDATA?i(e.children):e.type===o.Text?e.data:\"\"}var o=n(1150),a=n(1160),s=o.isTag;e.exports={getInnerHTML:r,getOuterHTML:a,getText:i}},function(e,t,n){function r(e,t){if(e){var n,r=\"\";for(var i in e)n=e[i],r&&(r+=\" \"),r+=!n&&p[i]?i:i+'=\"'+(t.decodeEntities?l.encodeXML(n):n)+'\"';return r}}function i(e,t){\"svg\"===e.name&&(t={decodeEntities:t.decodeEntities,xmlMode:!0});var n=\"<\"+e.name,i=r(e.attribs,t);return i&&(n+=\" \"+i),!t.xmlMode||e.children&&0!==e.children.length?(n+=\">\",e.children&&(n+=d(e.children,t)),h[e.name]&&!t.xmlMode||(n+=\"</\"+e.name+\">\")):n+=\"/>\",n}function o(e){return\"<\"+e.data+\">\"}function a(e,t){var n=e.data||\"\";return!t.decodeEntities||e.parent&&e.parent.name in f||(n=l.encodeXML(n)),n}function s(e){return\"<![CDATA[\"+e.children[0].data+\"]]>\"}function u(e){return\"<!--\"+e.data+\"-->\"}var c=n(1161),l=n(1162),p={__proto__:null,allowfullscreen:!0,async:!0,autofocus:!0,autoplay:!0,checked:!0,controls:!0,default:!0,defer:!0,disabled:!0,hidden:!0,ismap:!0,loop:!0,multiple:!0,muted:!0,open:!0,readonly:!0,required:!0,reversed:!0,scoped:!0,seamless:!0,selected:!0,typemustmatch:!0},f={__proto__:null,style:!0,script:!0,xmp:!0,iframe:!0,noembed:!0,noframes:!0,plaintext:!0,noscript:!0},h={__proto__:null,area:!0,base:!0,basefont:!0,br:!0,col:!0,command:!0,embed:!0,frame:!0,hr:!0,img:!0,input:!0,isindex:!0,keygen:!0,link:!0,meta:!0,param:!0,source:!0,track:!0,wbr:!0},d=e.exports=function(e,t){Array.isArray(e)||e.cheerio||(e=[e]),t=t||{};for(var n=\"\",r=0;r<e.length;r++){var l=e[r];n+=\"root\"===l.type?d(l.children,t):c.isTag(l)?i(l,t):l.type===c.Directive?o(l):l.type===c.Comment?u(l):l.type===c.CDATA?s(l):a(l,t)}return n}},function(e,t){e.exports={Text:\"text\",Directive:\"directive\",Comment:\"comment\",Script:\"script\",Style:\"style\",Tag:\"tag\",CDATA:\"cdata\",isTag:function(e){return\"tag\"===e.type||\"script\"===e.type||\"style\"===e.type}}},function(e,t,n){var r=n(1163),i=n(1164);t.decode=function(e,t){return(!t||t<=0?i.XML:i.HTML)(e)},t.decodeStrict=function(e,t){return(!t||t<=0?i.XML:i.HTMLStrict)(e)},t.encode=function(e,t){return(!t||t<=0?r.XML:r.HTML)(e)},t.encodeXML=r.XML,t.encodeHTML4=t.encodeHTML5=t.encodeHTML=r.HTML,t.decodeXML=t.decodeXMLStrict=i.XML,t.decodeHTML4=t.decodeHTML5=t.decodeHTML=i.HTML,t.decodeHTML4Strict=t.decodeHTML5Strict=t.decodeHTMLStrict=i.HTMLStrict,t.escape=r.escape},function(e,t,n){function r(e){return Object.keys(e).sort().reduce(function(t,n){return t[e[n]]=\"&\"+n+\";\",t},{})}function i(e){var t=[],n=[];return Object.keys(e).forEach(function(e){1===e.length?t.push(\"\\\\\"+e):n.push(e)}),n.unshift(\"[\"+t.join(\"\")+\"]\"),new RegExp(n.join(\"|\"),\"g\")}function o(e){return\"&#x\"+e.charCodeAt(0).toString(16).toUpperCase()+\";\"}function a(e){var t=e.charCodeAt(0),n=e.charCodeAt(1),r=1024*(t-55296)+n-56320+65536;return\"&#x\"+r.toString(16).toUpperCase()+\";\"}function s(e,t){function n(t){return e[t]}return function(e){return e.replace(t,n).replace(d,a).replace(h,o)}}function u(e){return e.replace(m,o).replace(d,a).replace(h,o)}var c=r(n(1148)),l=i(c);t.XML=s(c,l);var p=r(n(1146)),f=i(p);t.HTML=s(p,f);var h=/[^\\0-\\x7F]/g,d=/[\\uD800-\\uDBFF][\\uDC00-\\uDFFF]/g,m=i(c);t.escape=u},function(e,t,n){function r(e){var t=Object.keys(e).join(\"|\"),n=o(e);t+=\"|#[xX][\\\\da-fA-F]+|#\\\\d+\";var r=new RegExp(\"&(?:\"+t+\");\",\"g\");return function(e){return String(e).replace(r,n)}}function i(e,t){return e<t?1:-1}function o(e){return function(t){return\"#\"===t.charAt(1)?c(\"X\"===t.charAt(2)||\"x\"===t.charAt(2)?parseInt(t.substr(3),16):parseInt(t.substr(2),10)):e[t.slice(1,-1)]}}var a=n(1146),s=n(1147),u=n(1148),c=n(1144),l=r(u),p=r(a),f=function(){function e(e){return\";\"!==e.substr(-1)&&(e+=\";\"),l(e)}for(var t=Object.keys(s).sort(i),n=Object.keys(a).sort(i),r=0,u=0;r<n.length;r++)t[u]===n[r]?(n[r]+=\";?\",u++):n[r]+=\";\";var c=new RegExp(\"&(?:\"+n.join(\"|\")+\"|#[xX][\\\\da-fA-F]+;?|#\\\\d+;?)\",\"g\"),l=o(a);return function(t){return String(t).replace(c,e)}}();e.exports={XML:l,HTML:f,HTMLStrict:p}},function(e,t){var n=t.getChildren=function(e){return e.children},r=t.getParent=function(e){return e.parent};t.getSiblings=function(e){var t=r(e);return t?n(t):[e]},t.getAttributeValue=function(e,t){return e.attribs&&e.attribs[t]},t.hasAttrib=function(e,t){return!!e.attribs&&hasOwnProperty.call(e.attribs,t)},t.getName=function(e){return e.name}},function(e,t){t.removeElement=function(e){if(e.prev&&(e.prev.next=e.next),e.next&&(e.next.prev=e.prev),e.parent){var t=e.parent.children;t.splice(t.lastIndexOf(e),1)}},t.replaceElement=function(e,t){var n=t.prev=e.prev;n&&(n.next=t);var r=t.next=e.next;r&&(r.prev=t);var i=t.parent=e.parent;if(i){var o=i.children;o[o.lastIndexOf(e)]=t}},t.appendChild=function(e,t){if(t.parent=e,1!==e.children.push(t)){var n=e.children[e.children.length-2];n.next=t,t.prev=n,t.next=null}},t.append=function(e,t){var n=e.parent,r=e.next;if(t.next=r,t.prev=e,e.next=t,t.parent=n,r){if(r.prev=t,n){var i=n.children;i.splice(i.lastIndexOf(r),0,t)}}else n&&n.children.push(t)},t.prepend=function(e,t){var n=e.parent;if(n){var r=n.children;r.splice(r.lastIndexOf(e),0,t)}e.prev&&(e.prev.next=t),t.parent=n,t.prev=e.prev,t.next=e,e.prev=t}},function(e,t,n){function r(e,t,n,r){return Array.isArray(t)||(t=[t]),\"number\"==typeof r&&isFinite(r)||(r=1/0),i(e,t,n!==!1,r)}function i(e,t,n,r){for(var o,a=[],s=0,u=t.length;s<u&&!(e(t[s])&&(a.push(t[s]),--r<=0))&&(o=t[s].children,!(n&&o&&o.length>0&&(o=i(e,o,n,r),a=a.concat(o),r-=o.length,r<=0)));s++);return a}function o(e,t){for(var n=0,r=t.length;n<r;n++)if(e(t[n]))return t[n];return null}function a(e,t){for(var n=null,r=0,i=t.length;r<i&&!n;r++)c(t[r])&&(e(t[r])?n=t[r]:t[r].children.length>0&&(n=a(e,t[r].children)));return n}function s(e,t){for(var n=0,r=t.length;n<r;n++)if(c(t[n])&&(e(t[n])||t[n].children.length>0&&s(e,t[n].children)))return!0;return!1}function u(e,t){for(var n=[],r=[t];r.length;){for(var i=r.pop(),o=0,a=i.length;o<a;o++)c(i[o])&&e(i[o])&&n.push(i[o]);for(;a-- >0;)i[a].children&&i[a].children.length>0&&r.push(i[a].children)}return n}var c=n(1150).isTag;e.exports={filter:r,find:i,findOneChild:o,findOne:a,existsOne:s,findAll:u}},function(e,t,n){function r(e,t){return\"function\"==typeof t?function(n){return n.attribs&&t(n.attribs[e])}:function(n){return n.attribs&&n.attribs[e]===t}}function i(e,t){return function(n){return e(n)||t(n)}}var o=n(1150),a=t.isTag=o.isTag;t.testElement=function(e,t){for(var n in e)if(e.hasOwnProperty(n)){if(\"tag_name\"===n){if(!a(t)||!e.tag_name(t.name))return!1}else if(\"tag_type\"===n){if(!e.tag_type(t.type))return!1}else if(\"tag_contains\"===n){if(a(t)||!e.tag_contains(t.data))return!1}else if(!t.attribs||!e[n](t.attribs[n]))return!1}else;return!0};var s={tag_name:function(e){return\"function\"==typeof e?function(t){return a(t)&&e(t.name)}:\"*\"===e?a:function(t){return a(t)&&t.name===e}},tag_type:function(e){return\"function\"==typeof e?function(t){return e(t.type)}:function(t){return t.type===e}},tag_contains:function(e){return\"function\"==typeof e?function(t){return!a(t)&&e(t.data)}:function(t){return!a(t)&&t.data===e}}};t.getElements=function(e,t,n,o){var a=Object.keys(e).map(function(t){var n=e[t];return t in s?s[t](n):r(t,n)});return 0===a.length?[]:this.filter(a.reduce(i),t,n,o)},t.getElementById=function(e,t,n){return Array.isArray(t)||(t=[t]),this.findOne(r(\"id\",e),t,n!==!1)},t.getElementsByTagName=function(e,t,n,r){return this.filter(s.tag_name(e),t,n,r)},t.getElementsByTagType=function(e,t,n,r){return this.filter(s.tag_type(e),t,n,r)}},function(e,t){t.removeSubsets=function(e){for(var t,n,r,i=e.length;--i>-1;){for(t=n=e[i],e[i]=null,r=!0;n;){if(e.indexOf(n)>-1){r=!1,e.splice(i,1);break}n=n.parent}r&&(e[i]=t)}return e};var n={DISCONNECTED:1,PRECEDING:2,FOLLOWING:4,CONTAINS:8,CONTAINED_BY:16},r=t.compareDocumentPosition=function(e,t){var r,i,o,a,s,u,c=[],l=[];if(e===t)return 0;for(r=e;r;)c.unshift(r),r=r.parent;for(r=t;r;)l.unshift(r),r=r.parent;for(u=0;c[u]===l[u];)u++;return 0===u?n.DISCONNECTED:(i=c[u-1],o=i.children,a=c[u],s=l[u],o.indexOf(a)>o.indexOf(s)?i===t?n.FOLLOWING|n.CONTAINED_BY:n.FOLLOWING:i===e?n.PRECEDING|n.CONTAINS:n.PRECEDING)};t.uniqueSort=function(e){var t,i,o=e.length;for(e=e.slice();--o>-1;)t=e[o],i=e.indexOf(t),i>-1&&i<o&&e.splice(o,1);return e.sort(function(e,t){var i=r(e,t);return i&n.PRECEDING?-1:i&n.FOLLOWING?1:0}),e}},function(e,t,n){function r(e){this._cbs=e||{},this.events=[]}e.exports=r;var i=n(1141).EVENTS;Object.keys(i).forEach(function(e){if(0===i[e])e=\"on\"+e,r.prototype[e]=function(){this.events.push([e]),this._cbs[e]&&this._cbs[e]()};else if(1===i[e])e=\"on\"+e,r.prototype[e]=function(t){this.events.push([e,t]),this._cbs[e]&&this._cbs[e](t)};else{if(2!==i[e])throw Error(\"wrong number of arguments\");e=\"on\"+e,r.prototype[e]=function(t,n){this.events.push([e,t,n]),this._cbs[e]&&this._cbs[e](t,n)}}}),r.prototype.onreset=function(){this.events=[],this._cbs.onreset&&this._cbs.onreset()},r.prototype.restart=function(){this._cbs.onreset&&this._cbs.onreset();for(var e=0,t=this.events.length;e<t;e++)if(this._cbs[this.events[e][0]]){var n=this.events[e].length;1===n?this._cbs[this.events[e][0]]():2===n?this._cbs[this.events[e][0]](this.events[e][1]):this._cbs[this.events[e][0]](this.events[e][1],this.events[e][2])}}},function(e,t){function n(){for(var e={},t=0;t<arguments.length;t++){var n=arguments[t];for(var i in n)r.call(n,i)&&(e[i]=n[i])}return e}e.exports=n;var r=Object.prototype.hasOwnProperty},function(e,t){e.exports=function(e){return e.replace(/[-\\\\^$*+?.()|[\\]{}]/g,\"\\\\$&\")}},function(e,t,n){\"use strict\";function r(e){return e&&e.__esModule?e:{default:e}}Object.defineProperty(t,\"__esModule\",{value:!0});var i=n(486),o=r(i),a=n(145),s=r(a),u=n(146),c=r(u),l=n(489),p=r(l),f=n(490),h=r(f),d=n(498),m=r(d),v=function(e){function t(){return(0,s.default)(this,t),(0,p.default)(this,(t.__proto__||(0,o.default)(t)).apply(this,arguments))}return(0,h.default)(t,e),(0,c.default)(t,[{key:\"render\",value:function(){var e=this.props,t=e.specSelectors,n=e.specActions,r=e.getComponent,i=t.info(),o=t.url(),a=t.basePath(),s=t.host(),u=t.securityDefinitions(),c=t.externalDocs(),l=t.schemes(),p=r(\"info\"),f=r(\"operations\",!0),h=r(\"models\",!0),d=r(\"authorizeBtn\",!0),v=r(\"Row\"),y=r(\"Col\"),g=r(\"errors\",!0),_=r(\"schemes\"),b=!t.specStr();return b?m.default.createElement(\"h4\",null,\"No spec provided.\"):m.default.createElement(\"div\",{className:\"swagger-ui\"},m.default.createElement(\"div\",null,m.default.createElement(g,null),m.default.createElement(v,{className:\"information-container\"},m.default.createElement(y,{mobile:12},i.count()?m.default.createElement(p,{info:i,url:o,host:s,basePath:a,externalDocs:c,getComponent:r}):null)),l&&l.size||u?m.default.createElement(\"div\",{className:\"scheme-container\"},m.default.createElement(y,{className:\"schemes wrapper\",mobile:12},l&&l.size?m.default.createElement(_,{schemes:l,specActions:n}):null,u?m.default.createElement(d,null):null)):null,m.default.createElement(v,null,m.default.createElement(y,{mobile:12,desktop:12},m.default.createElement(f,null))),m.default.createElement(v,null,m.default.createElement(y,{mobile:12,desktop:12},m.default.createElement(h,null)))))}}]),t}(m.default.Component);v.propTypes={errSelectors:d.PropTypes.object.isRequired,errActions:d.PropTypes.object.isRequired,specActions:d.PropTypes.object.isRequired,specSelectors:d.PropTypes.object.isRequired,layoutSelectors:d.PropTypes.object.isRequired,layoutActions:d.PropTypes.object.isRequired,getComponent:d.PropTypes.func.isRequired},t.default=v},function(e,t,n){\"use strict\";function r(e){return e&&e.__esModule?e:{default:e}}Object.defineProperty(t,\"__esModule\",{value:!0}),t.JsonSchema_boolean=t.JsonSchema_array=t.JsonSchema_string=t.JsonSchemaForm=void 0;var i=n(141),o=r(i),a=n(446),s=r(a),u=n(486),c=r(u),l=n(145),p=r(l),f=n(146),h=r(f),d=n(489),m=r(d),v=n(490),y=r(v),g=n(498),_=r(g),b=n(1027),x=r(b),w=n(168),k=function(){},S={getComponent:g.PropTypes.func.isRequired,value:g.PropTypes.any,onChange:g.PropTypes.func,keyName:g.PropTypes.any,fn:g.PropTypes.object.isRequired,schema:g.PropTypes.object,required:g.PropTypes.bool,description:g.PropTypes.any},E={value:\"\",onChange:k,schema:{},keyName:\"\",required:!1},C=t.JsonSchemaForm=function(e){function t(){return(0,p.default)(this,t),(0,m.default)(this,(t.__proto__||(0,c.default)(t)).apply(this,arguments))}return(0,y.default)(t,e),(0,h.default)(t,[{key:\"render\",value:function(){var e=this.props,t=e.schema,n=e.value,r=e.onChange,i=e.getComponent,o=e.fn;t.toJS&&(t=t.toJS());var a=t,u=a.type,c=a.format,l=void 0===c?\"\":c,p=i(\"JsonSchema_\"+u+\"_\"+l)||i(\"JsonSchema_\"+u)||i(\"JsonSchema_string\");return _.default.createElement(p,(0,s.default)({},this.props,{fn:o,getComponent:i,value:n,onChange:r,schema:t}))}}]),t}(g.Component);C.propTypes=S,C.defaultProps=E;var A=t.JsonSchema_string=function(e){function t(){var e,n,r,i;(0,p.default)(this,t);for(var o=arguments.length,a=Array(o),s=0;s<o;s++)a[s]=arguments[s];return n=r=(0,m.default)(this,(e=t.__proto__||(0,c.default)(t)).call.apply(e,[this].concat(a))),r.onChange=function(e){var t=\"file\"===r.props.schema.type?e.target.files[0]:e.target.value;r.props.onChange(t,r.props.keyName)},r.onEnumChange=function(e){return r.props.onChange(e)},i=n,(0,m.default)(r,i)}return(0,y.default)(t,e),(0,h.default)(t,[{key:\"render\",value:function(){var e=this.props,t=e.getComponent,n=e.value,r=e.schema,i=e.required,o=e.description,a=r.enum,s=r.errors||[];if(a){var u=t(\"Select\");return _.default.createElement(u,{allowedValues:a,value:n,allowEmptyValue:!i,onChange:this.onEnumChange})}var c=\"formData\"===r.in&&!(\"FormData\"in window),l=t(\"Input\");return\"file\"===r.type?_.default.createElement(l,{type:\"file\",className:s.length?\"invalid\":\"\",onChange:this.onChange,disabled:c}):_.default.createElement(l,{type:\"password\"===r.format?\"password\":\"text\",className:s.length?\"invalid\":\"\",value:n,placeholder:o,onChange:this.onChange,disabled:c})}}]),t}(g.Component);A.propTypes=S,A.defaultProps=E;var T=t.JsonSchema_array=function(e){function t(e,n){(0,p.default)(this,t);var r=(0,m.default)(this,(t.__proto__||(0,c.default)(t)).call(this,e,n));return r.onChange=function(){return r.props.onChange(r.state.value)},r.onItemChange=function(e,t){r.setState(function(n){return{value:n.value.set(t,e)}},r.onChange)},r.removeItem=function(e){r.setState(function(t){return{value:t.value.remove(e)}},r.onChange)},r.addItem=function(){r.setState(function(e){return e.value=e.value||(0,w.List)(),{value:e.value.push(\"\")}},r.onChange)},r.onEnumChange=function(e){r.setState(function(){return{value:e}},r.onChange)},r.state={value:e.value},r}return(0,y.default)(t,e),(0,h.default)(t,[{key:\"componentWillReceiveProps\",value:function(e){e.value!==this.state.value&&this.setState({value:e.value})}},{key:\"shouldComponentUpdate\",value:function(e,t){return(0,x.default)(this,e,t)}},{key:\"render\",value:function(){var e=this,t=this.props,n=t.getComponent,r=t.required,i=t.schema,a=t.fn,s=a.inferSchema(i.items),u=n(\"JsonSchemaForm\"),c=n(\"Button\"),l=s.enum,p=this.state.value;if(l){var f=n(\"Select\");return _.default.createElement(f,{multiple:!0,value:p,allowedValues:l,allowEmptyValue:!r,onChange:this.onEnumChange})}var h=i.errors||[];return _.default.createElement(\"div\",null,!p||p.count()<1?h.length?_.default.createElement(\"span\",{style:{color:\"red\",fortWeight:\"bold\"}},h[0]):null:p.map(function(t,r){var i=(0,o.default)({},s);if(h.length){var l=h.filter(function(e){return e.index===r});l.length&&(i.errors=[l[0].error+r])}return _.default.createElement(\"div\",{key:r,className:\"json-schema-form-item\"},_.default.createElement(u,{fn:a,getComponent:n,value:t,onChange:function(t){return e.onItemChange(t,r)},schema:i}),_.default.createElement(c,{className:\"json-schema-form-item-remove\",onClick:function(){return e.removeItem(r)}},\" - \"))}).toArray(),_.default.createElement(c,{className:\"json-schema-form-item-add\",onClick:this.addItem},\" Add item \"))}}]),t}(g.Component);T.propTypes=S,T.defaultProps=E;var D=t.JsonSchema_boolean=function(e){function t(){var e,n,r,i;(0,p.default)(this,t);for(var o=arguments.length,a=Array(o),s=0;s<o;s++)a[s]=arguments[s];return n=r=(0,m.default)(this,(e=t.__proto__||(0,c.default)(t)).call.apply(e,[this].concat(a))),r.onEnumChange=function(e){return r.props.onChange(e)},i=n,(0,m.default)(r,i)}return(0,y.default)(t,e),(0,h.default)(t,[{key:\"render\",value:function(){var e=this.props,t=e.getComponent,n=e.required,r=e.value,i=t(\"Select\");return _.default.createElement(i,{value:String(r),allowedValues:(0,w.fromJS)([\"true\",\"false\"]),allowEmptyValue:!n,onChange:this.onEnumChange})}}]),t}(g.Component);D.propTypes=S,D.defaultProps=E},function(e,t,n){\"use strict\";var r=n(183),i=n(1176);i.keys().forEach(function(t){if(\"./index.js\"!==t){var n=i(t);e.exports[(0,r.pascalCaseFilename)(t)]=n.default?n.default:n}})},function(e,t,n){function r(e){return n(i(e))}function i(e){return o[e]||function(){throw new Error(\"Cannot find module '\"+e+\"'.\")}()}var o={\"./all.js\":1175,\"./ast/ast.js\":729,\"./ast/index.js\":728,\"./ast/jump-to-path.jsx\":761,\"./auth/actions.js\":956,\"./auth/index.js\":954,\"./auth/reducers.js\":955,\"./auth/selectors.js\":957,\"./auth/spec-wrap-actions.js\":958,\"./download-url.js\":1010,\"./err/actions.js\":176,\"./err/error-transformers/hook.js\":422,\"./err/error-transformers/transformers/not-of-type.js\":426,\"./err/error-transformers/transformers/parameter-oneof.js\":427,\"./err/error-transformers/transformers/strip-instance.js\":428,\"./err/index.js\":416,\"./err/reducers.js\":417,\"./err/selectors.js\":429,\"./layout/actions.js\":433,\"./layout/index.js\":431,\"./layout/reducers.js\":432,\"./layout/selectors.js\":434,\"./logs/index.js\":727,\"./samples/fn.js\":322,\"./samples/index.js\":726,\"./spec/actions.js\":445,\"./spec/index.js\":443,\"./spec/reducers.js\":444,\"./spec/selectors.js\":482,\"./spec/wrap-actions.js\":483,\"./split-pane-mode/components/index.js\":962,\"./split-pane-mode/components/split-pane-mode.jsx\":964,\"./split-pane-mode/index.js\":961,\"./swagger-js/index.js\":762,\"./util/index.js\":959,\"./view/index.js\":484,\"./view/root-injects.js\":485};r.keys=function(){return Object.keys(o)},r.resolve=i,e.exports=r,r.id=1176},function(e,t,n,r){var i=n(r),o=i.Symbol;e.exports=o},function(e,t,n,r){var i=n(r),o=\"object\"==typeof self&&self&&self.Object===Object&&self,a=i||o||Function(\"return this\")();e.exports=a},function(e,t,n,r){var i=n(r),o=i(Object.getPrototypeOf,Object);e.exports=o},function(e,t,n,r,i,o){function a(){this.size=0,this.__data__={hash:new s,map:new(c||u),string:new s}}var s=n(r),u=n(i),c=n(o);e.exports=a},function(e,t,n,r){function i(){this.__data__=o?o(null):{},this.size=0}var o=n(r);e.exports=i},function(e,t,n,r){var i=n(r),o=i(Object,\"create\");e.exports=o},function(e,t,n,r,i){function o(e,t){var n=s(e,t);return a(n)?n:void 0}var a=n(r),s=n(i);e.exports=o},function(e,t,n,r,i,o,a){function s(e){if(!l(e)||c(e))return!1;var t=u(e)?g:h;return t.test(p(e))}var u=n(r),c=n(i),l=n(o),p=n(a),f=/[\\\\^$.*+?()[\\]{}|]/g,h=/^\\[object .+?Constructor\\]$/,d=Function.prototype,m=Object.prototype,v=d.toString,y=m.hasOwnProperty,g=RegExp(\"^\"+v.call(y).replace(f,\"\\\\$&\").replace(/hasOwnProperty|(function).*?(?=\\\\\\()| for .+?(?=\\\\\\])/g,\"$1.*?\")+\"$\");e.exports=s},function(e,t,n,r){function i(e){return!!a&&a in e}var o=n(r),a=function(){var e=/[^.]+$/.exec(o&&o.keys&&o.keys.IE_PROTO||\"\");return e?\"Symbol(src)_1.\"+e:\"\"}();e.exports=i},function(e,t,n,r){var i=n(r),o=i[\"__core-js_shared__\"];e.exports=o},function(e,t,n,r){function i(e){var t=this.__data__;if(o){var n=t[e];return n===a?void 0:n}return u.call(t,e)?t[e]:void 0}var o=n(r),a=\"__lodash_hash_undefined__\",s=Object.prototype,u=s.hasOwnProperty;e.exports=i},function(e,t,n,r){function i(e){var t=this.__data__;return o?void 0!==t[e]:s.call(t,e)}var o=n(r),a=Object.prototype,s=a.hasOwnProperty;e.exports=i},function(e,t,n,r){function i(e,t){var n=this.__data__;return this.size+=this.has(e)?0:1,n[e]=o&&void 0===t?a:t,this}var o=n(r),a=\"__lodash_hash_undefined__\";e.exports=i},function(e,t,n,r){function i(e){var t=this.__data__,n=o(t,e);if(n<0)return!1;var r=t.length-1;return n==r?t.pop():s.call(t,n,1),--this.size,!0}var o=n(r),a=Array.prototype,s=a.splice;e.exports=i},function(e,t,n,r){function i(e,t){for(var n=e.length;n--;)if(o(e[n][0],t))return n;return-1}var o=n(r);e.exports=i},function(e,t,n,r){function i(e){var t=this.__data__,n=o(t,e);return n<0?void 0:t[n][1]}var o=n(r);e.exports=i},function(e,t,n,r){function i(e){return o(this.__data__,e)>-1}var o=n(r);e.exports=i},function(e,t,n,r){function i(e,t){var n=this.__data__,r=o(n,e);return r<0?(++this.size,n.push([e,t])):n[r][1]=t,this}var o=n(r);e.exports=i},function(e,t,n,r,i){var o=n(r),a=n(i),s=o(a,\"Map\");e.exports=s},function(e,t,n,r){function i(e){var t=o(this,e).delete(e);return this.size-=t?1:0,t}var o=n(r);e.exports=i},function(e,t,n,r){function i(e,t){var n=e.__data__;return o(t)?n[\"string\"==typeof t?\"string\":\"hash\"]:n.map}var o=n(r);e.exports=i},function(e,t,n,r){function i(e){return o(this,e).get(e)}var o=n(r);e.exports=i},function(e,t,n,r){function i(e){return o(this,e).has(e)}var o=n(r);e.exports=i},function(e,t,n,r){function i(e,t){var n=o(this,e),r=n.size;return n.set(e,t),this.size+=n.size==r?0:1,this}var o=n(r);e.exports=i},function(e,t,n,r,i,o){function a(e){return function(t,n,r){var i=Object(t);if(!u(t)){var o=s(n,3);t=c(t),n=function(e){return o(i[e],e,i)}}var a=e(t,n,r);return a>-1?i[o?t[a]:a]:void 0}}var s=n(r),u=n(i),c=n(o);e.exports=a},function(e,t,n,r,i,o,a,s){function u(e){return\"function\"==typeof e?e:null==e?p:\"object\"==typeof e?f(e)?l(e[0],e[1]):c(e):h(e)}var c=n(r),l=n(i),p=n(o),f=n(a),h=n(s);e.exports=u},function(e,t,n,r,i,o){function a(e){var t=u(e);return 1==t.length&&t[0][2]?c(t[0][0],t[0][1]):function(n){return n===e||s(n,e,t)}}var s=n(r),u=n(i),c=n(o);e.exports=a},function(e,t,n,r,i,o,a,s,u){function c(e){var t=this.__data__=new l(e);this.size=t.size}var l=n(r),p=n(i),f=n(o),h=n(a),d=n(s),m=n(u);c.prototype.clear=p,c.prototype.delete=f,c.prototype.get=h,c.prototype.has=d,c.prototype.set=m,e.exports=c},function(e,t,n,r){function i(){this.__data__=new o,this.size=0}var o=n(r);e.exports=i},function(e,t,n,r,i,o){function a(e,t){var n=this.__data__;if(n instanceof s){var r=n.__data__;if(!u||r.length<l-1)return r.push([e,t]),this.size=++n.size,this;n=this.__data__=new c(r)}return n.set(e,t),this.size=n.size,this}var s=n(r),u=n(i),c=n(o),l=200;e.exports=a},function(e,t,n,r){var i=n(r),o=i.Uint8Array;e.exports=o},function(e,t,n,r,i,o){function a(e){return c(e)?s(e):u(e)}var s=n(r),u=n(i),c=n(o);e.exports=a},function(e,t,n,r,i){(function(e){var o=n(r),a=n(i),s=\"object\"==typeof t&&t&&!t.nodeType&&t,u=s&&\"object\"==typeof e&&e&&!e.nodeType&&e,c=u&&u.exports===s,l=c?o.Buffer:void 0,p=l?l.isBuffer:void 0,f=p||a;e.exports=f}).call(t,n(161)(e))},function(e,t,n,r,i,o){var a=n(r),s=n(i),u=n(o),c=u&&u.isTypedArray,l=c?s(c):a;e.exports=l},function(e,t,n,r,i){function o(e){if(!a(e))return s(e);var t=[];for(var n in Object(e))c.call(e,n)&&\"constructor\"!=n&&t.push(n);return t}var a=n(r),s=n(i),u=Object.prototype,c=u.hasOwnProperty;e.exports=o},function(e,t,n,r){var i=n(r),o=i(Object.keys,Object);e.exports=o},function(e,t,n,r,i){function o(e){return null!=e&&s(e.length)&&!a(e)}var a=n(r),s=n(i);e.exports=o},function(e,t,n,r,i){var o=n(r),a=n(i),s=o(a,\"DataView\");e.exports=s},function(e,t,n,r,i){var o=n(r),a=n(i),s=o(a,\"Promise\");e.exports=s},function(e,t,n,r,i){var o=n(r),a=n(i),s=o(a,\"Set\");e.exports=s},function(e,t,n,r,i){var o=n(r),a=n(i),s=o(a,\"WeakMap\");e.exports=s},function(e,t,n,r,i){function o(e){for(var t=s(e),n=t.length;n--;){var r=t[n],i=e[r];t[n]=[r,i,a(i)]}return t}var a=n(r),s=n(i);e.exports=o},function(e,t,n,r){function i(e){return e===e&&!o(e)}var o=n(r);e.exports=i},function(e,t,n,r){function i(e,t,n){var r=null==e?void 0:o(e,t);return void 0===r?n:r}var o=n(r);e.exports=i},function(e,t,n,r,i){function o(e,t){if(a(e))return!1;var n=typeof e;return!(\"number\"!=n&&\"symbol\"!=n&&\"boolean\"!=n&&null!=e&&!s(e))||(c.test(e)||!u.test(e)||null!=t&&e in Object(t))}var a=n(r),s=n(i),u=/\\.|\\[(?:[^[\\]]*|([\"'])(?:(?!\\1)[^\\\\]|\\\\.)*?\\1)\\]/,c=/^\\w*$/;e.exports=o},function(e,t,n,r){function i(e){var t=o(e,function(e){return n.size===a&&n.clear(),e}),n=t.cache;return t}var o=n(r),a=500;e.exports=i},function(e,t,n,r){function i(e){if(\"string\"==typeof e||o(e))return e;var t=e+\"\";return\"0\"==t&&1/e==-a?\"-0\":t}var o=n(r),a=1/0;e.exports=i},function(e,t,n,r,i){function o(e,t){return null!=e&&s(e,t,a)}var a=n(r),s=n(i);e.exports=o},function(e,t,n,r,i,o,a){function s(e){return l(e)?u(p(e)):c(e)}var u=n(r),c=n(i),l=n(o),p=n(a);e.exports=s},function(e,t,n,r){function i(e){return function(t){return o(t,e)}}var o=n(r);e.exports=i},function(e,t,n,r){function i(e){var t=o(e),n=t%1;return t===t?n?t-n:t:0}var o=n(r);e.exports=i},function(e,t,n,r){function i(e){if(!e)return 0===e?e:0;if(e=o(e),e===a||e===-a){var t=e<0?-1:1;return t*s}return e===e?e:0}var o=n(r),a=1/0,s=1.7976931348623157e308;e.exports=i},function(e,t,n,r,i){function o(e){if(\"number\"==typeof e)return e;if(s(e))return u;if(a(e)){var t=\"function\"==typeof e.valueOf?e.valueOf():e;e=a(t)?t+\"\":t}if(\"string\"!=typeof e)return 0===e?e:+e;e=e.replace(c,\"\");var n=p.test(e);return n||f.test(e)?h(e.slice(2),n?2:8):l.test(e)?u:+e}var a=n(r),s=n(i),u=NaN,c=/^\\s+|\\s+$/g,l=/^[-+]0x[0-9a-f]+$/i,p=/^0b[01]+$/i,f=/^0o[0-7]+$/i,h=parseInt;e.exports=o},function(e,t,n,r,i,o,a){function s(e,t,n){if(!p(n))return!1;var r=typeof t;return!!(\"number\"==r?c(n)&&l(t,n.length):\"string\"==r&&t in n)&&u(n[t],e)}var u=n(r),c=n(i),l=n(o),p=n(a);e.exports=s},function(e,t,n,r){\"use strict\";var i=n(r),o=(n(508),function(e){var t=this;if(t.instancePool.length){var n=t.instancePool.pop();return t.call(n,e),n}return new t(e)}),a=function(e,t){var n=this;if(n.instancePool.length){var r=n.instancePool.pop();return n.call(r,e,t),r}return new n(e,t)},s=function(e,t,n){var r=this;if(r.instancePool.length){var i=r.instancePool.pop();return r.call(i,e,t,n),i}return new r(e,t,n)},u=function(e,t,n,r){var i=this;if(i.instancePool.length){var o=i.instancePool.pop();return i.call(o,e,t,n,r),o}return new i(e,t,n,r)},c=function(e){var t=this;e instanceof t?void 0:i(\"25\"),e.destructor(),t.instancePool.length<t.poolSize&&t.instancePool.push(e)},l=10,p=o,f=function(e,t){var n=e;return n.instancePool=[],n.getPooled=t||p,n.poolSize||(n.poolSize=l),n.release=c,n},h={addPoolingTo:f,oneArgumentPooler:o,twoArgumentPooler:a,threeArgumentPooler:s,fourArgumentPooler:u};e.exports=h},function(e,t,n,r){e.exports=n(r)()},function(e,t,n,r,i){function o(e,t,n){var r=e[t];c.call(e,t)&&s(r,n)&&(void 0!==n||t in e)||a(e,t,n)}var a=n(r),s=n(i),u=Object.prototype,c=u.hasOwnProperty;e.exports=o},function(e,t,n,r,i){function o(e,t){return e&&a(t,s(t),e)}var a=n(r),s=n(i);e.exports=o},function(e,t,n,r,i){function o(e,t,n,r){var i=!n;n||(n={});for(var o=-1,u=t.length;++o<u;){var c=t[o],l=r?r(n[c],e[c],c,n,e):void 0;void 0===l&&(l=e[c]),i?s(n,c,l):a(n,c,l)}return n}var a=n(r),s=n(i);e.exports=o},function(e,t,n,r){(function(e){function i(e,t){if(t)return e.slice();var n=e.length,r=l?l(n):new e.constructor(n);return e.copy(r),r}var o=n(r),a=\"object\"==typeof t&&t&&!t.nodeType&&t,s=a&&\"object\"==typeof e&&e&&!e.nodeType&&e,u=s&&s.exports===a,c=u?o.Buffer:void 0,l=c?c.allocUnsafe:void 0;e.exports=i}).call(t,n(161)(e))},function(e,t,n,r,i,o){function a(e){return s(e,c,u)}var s=n(r),u=n(i),c=n(o);e.exports=a},function(e,t,n,r,i){function o(e,t,n){var r=t(e);return s(e)?r:a(r,n(e))}var a=n(r),s=n(i);e.exports=o},function(e,t,n,r,i,o,a,s,u,c){function l(e,t,n,r){var i=e.constructor;switch(t){case C:return p(e);case g:case _:return new i(+e);case A:return f(e,r);case T:case D:case M:case O:case P:case I:case N:case R:case j:return y(e,r);case b:return h(e,r,n);case x:case S:return new i(e);case w:return d(e);case k:return m(e,r,n);case E:return v(e)}}var p=n(r),f=n(i),h=n(o),d=n(a),m=n(s),v=n(u),y=n(c),g=\"[object Boolean]\",_=\"[object Date]\",b=\"[object Map]\",x=\"[object Number]\",w=\"[object RegExp]\",k=\"[object Set]\",S=\"[object String]\",E=\"[object Symbol]\",C=\"[object ArrayBuffer]\",A=\"[object DataView]\",T=\"[object Float32Array]\",D=\"[object Float64Array]\",M=\"[object Int8Array]\",O=\"[object Int16Array]\",P=\"[object Int32Array]\",I=\"[object Uint8Array]\",N=\"[object Uint8ClampedArray]\",R=\"[object Uint16Array]\",j=\"[object Uint32Array]\";e.exports=l},function(e,t,n,r){function i(e){var t=new e.constructor(e.byteLength);return new o(t).set(new o(e)),t}var o=n(r);e.exports=i},function(e,t,n,r){function i(e,t){var n=t?o(e.buffer):e.buffer;return new e.constructor(n,e.byteOffset,e.byteLength)}var o=n(r);e.exports=i},function(e,t,n,r){function i(e){return s?Object(s.call(e)):{}}var o=n(r),a=o?o.prototype:void 0,s=a?a.valueOf:void 0;e.exports=i},function(e,t,n,r){function i(e,t){var n=t?o(e.buffer):e.buffer;return new e.constructor(n,e.byteOffset,e.length)}var o=n(r);e.exports=i},function(e,t,n,r,i,o){function a(e){return\"function\"!=typeof e.constructor||c(e)?{}:s(u(e));\n}var s=n(r),u=n(i),c=n(o);e.exports=a},function(e,t,n,r,i,o){function a(e){return c(u(e,void 0,s),e+\"\")}var s=n(r),u=n(i),c=n(o);e.exports=a},function(e,t,n,r,i){function o(e,t,n,r,i){var u=-1,c=e.length;for(n||(n=s),i||(i=[]);++u<c;){var l=e[u];t>0&&n(l)?t>1?o(l,t-1,n,r,i):a(i,l):r||(i[i.length]=l)}return i}var a=n(r),s=n(i);e.exports=o},function(e,t,n,r,i,o){function a(e){return c(e)||u(e)||!!(l&&e&&e[l])}var s=n(r),u=n(i),c=n(o),l=s?s.isConcatSpreadable:void 0;e.exports=a},function(e,t,n,r){function i(e,t,n){return t=a(void 0===t?e.length-1:t,0),function(){for(var r=arguments,i=-1,s=a(r.length-t,0),u=Array(s);++i<s;)u[i]=r[t+i];i=-1;for(var c=Array(t+1);++i<t;)c[i]=r[i];return c[t]=n(u),o(e,this,c)}}var o=n(r),a=Math.max;e.exports=i},function(e,t,n,r,i){var o=n(r),a=n(i),s=a(o);e.exports=s}]))});\n//# sourceMappingURL=swagger-ui-bundle.js.map"
  },
  {
    "path": "src/main/resources/static/swagger/swagger-ui-standalone-preset.js",
    "content": "!function(e,t){\"object\"==typeof exports&&\"object\"==typeof module?module.exports=t():\"function\"==typeof define&&define.amd?define([],t):\"object\"==typeof exports?exports.SwaggerUIStandalonePreset=t():e.SwaggerUIStandalonePreset=t()}(this,function(){return function(e){function t(r){if(n[r])return n[r].exports;var i=n[r]={exports:{},id:r,loaded:!1};return e[r].call(i.exports,i,i.exports,t),i.loaded=!0,i.exports}var n={};return t.m=e,t.c=n,t.p=\"/dist\",t(0)}(function(e){for(var t in e)if(Object.prototype.hasOwnProperty.call(e,t))switch(typeof e[t]){case\"function\":break;case\"object\":e[t]=function(t){var n=t.slice(1),r=e[t[0]];return function(e,t,i){r.apply(this,[e,t,i].concat(n))}}(e[t]);break;default:e[t]=e[e[t]]}return e}([function(e,t,n){n(1),e.exports=n(56)},function(e,t,n){\"use strict\";n(2)},function(e,t,n){n(3),n(17),n(30),n(36),e.exports=n(16).Promise},function(e,t,n){\"use strict\";var r=n(4),i={};i[n(6)(\"toStringTag\")]=\"z\",i+\"\"!=\"[object z]\"&&n(10)(Object.prototype,\"toString\",function(){return\"[object \"+r(this)+\"]\"},!0)},function(e,t,n){var r=n(5),i=n(6)(\"toStringTag\"),o=\"Arguments\"==r(function(){return arguments}());e.exports=function(e){var t,n,s;return void 0===e?\"Undefined\":null===e?\"Null\":\"string\"==typeof(n=(t=Object(e))[i])?n:o?r(t):\"Object\"==(s=r(t))&&\"function\"==typeof t.callee?\"Arguments\":s}},function(e,t){var n={}.toString;e.exports=function(e){return n.call(e).slice(8,-1)}},function(e,t,n){var r=n(7)(\"wks\"),i=n(9),o=n(8).Symbol;e.exports=function(e){return r[e]||(r[e]=o&&o[e]||(o||i)(\"Symbol.\"+e))}},function(e,t,n){var r=n(8),i=\"__core-js_shared__\",o=r[i]||(r[i]={});e.exports=function(e){return o[e]||(o[e]={})}},function(e,t){var n=e.exports=\"undefined\"!=typeof window&&window.Math==Math?window:\"undefined\"!=typeof self&&self.Math==Math?self:Function(\"return this\")();\"number\"==typeof __g&&(__g=n)},function(e,t){var n=0,r=Math.random();e.exports=function(e){return\"Symbol(\".concat(void 0===e?\"\":e,\")_\",(++n+r).toString(36))}},function(e,t,n){var r=n(8),i=n(11),o=n(9)(\"src\"),s=\"toString\",a=Function[s],u=(\"\"+a).split(s);n(16).inspectSource=function(e){return a.call(e)},(e.exports=function(e,t,n,s){\"function\"==typeof n&&(n.hasOwnProperty(o)||i(n,o,e[t]?\"\"+e[t]:u.join(String(t))),n.hasOwnProperty(\"name\")||i(n,\"name\",t)),e===r?e[t]=n:(s||delete e[t],i(e,t,n))})(Function.prototype,s,function(){return\"function\"==typeof this&&this[o]||a.call(this)})},function(e,t,n){var r=n(12),i=n(13);e.exports=n(14)?function(e,t,n){return r.setDesc(e,t,i(1,n))}:function(e,t,n){return e[t]=n,e}},function(e,t){var n=Object;e.exports={create:n.create,getProto:n.getPrototypeOf,isEnum:{}.propertyIsEnumerable,getDesc:n.getOwnPropertyDescriptor,setDesc:n.defineProperty,setDescs:n.defineProperties,getKeys:n.keys,getNames:n.getOwnPropertyNames,getSymbols:n.getOwnPropertySymbols,each:[].forEach}},function(e,t){e.exports=function(e,t){return{enumerable:!(1&e),configurable:!(2&e),writable:!(4&e),value:t}}},function(e,t,n){e.exports=!n(15)(function(){return 7!=Object.defineProperty({},\"a\",{get:function(){return 7}}).a})},function(e,t){e.exports=function(e){try{return!!e()}catch(e){return!0}}},function(e,t){var n=e.exports={version:\"1.2.6\"};\"number\"==typeof __e&&(__e=n)},function(e,t,n){\"use strict\";var r=n(18)(!0);n(21)(String,\"String\",function(e){this._t=String(e),this._i=0},function(){var e,t=this._t,n=this._i;return n>=t.length?{value:void 0,done:!0}:(e=r(t,n),this._i+=e.length,{value:e,done:!1})})},function(e,t,n){var r=n(19),i=n(20);e.exports=function(e){return function(t,n){var o,s,a=String(i(t)),u=r(n),c=a.length;return u<0||u>=c?e?\"\":void 0:(o=a.charCodeAt(u),o<55296||o>56319||u+1===c||(s=a.charCodeAt(u+1))<56320||s>57343?e?a.charAt(u):o:e?a.slice(u,u+2):(o-55296<<10)+(s-56320)+65536)}}},function(e,t){var n=Math.ceil,r=Math.floor;e.exports=function(e){return isNaN(e=+e)?0:(e>0?r:n)(e)}},function(e,t){e.exports=function(e){if(void 0==e)throw TypeError(\"Can't call method on  \"+e);return e}},function(e,t,n){\"use strict\";var r=n(22),i=n(23),o=n(10),s=n(11),a=n(26),u=n(27),c=n(28),l=n(29),h=n(12).getProto,p=n(6)(\"iterator\"),f=!([].keys&&\"next\"in[].keys()),d=\"@@iterator\",m=\"keys\",g=\"values\",x=function(){return this};e.exports=function(e,t,n,y,v,b,D){c(n,t,y);var w,E,k=function(e){if(!f&&e in F)return F[e];switch(e){case m:return function(){return new n(this,e)};case g:return function(){return new n(this,e)}}return function(){return new n(this,e)}},A=t+\" Iterator\",C=v==g,S=!1,F=e.prototype,T=F[p]||F[d]||v&&F[v],B=T||k(v);if(T){var N=h(B.call(new e));l(N,A,!0),!r&&a(F,d)&&s(N,p,x),C&&T.name!==g&&(S=!0,B=function(){return T.call(this)})}if(r&&!D||!f&&!S&&F[p]||s(F,p,B),u[t]=B,u[A]=x,v)if(w={values:C?B:k(g),keys:b?B:k(m),entries:C?k(\"entries\"):B},D)for(E in w)E in F||o(F,E,w[E]);else i(i.P+i.F*(f||S),t,w);return w}},function(e,t){e.exports=!1},function(e,t,n){var r=n(8),i=n(16),o=n(11),s=n(10),a=n(24),u=\"prototype\",c=function(e,t,n){var l,h,p,f,d=e&c.F,m=e&c.G,g=e&c.S,x=e&c.P,y=e&c.B,v=m?r:g?r[t]||(r[t]={}):(r[t]||{})[u],b=m?i:i[t]||(i[t]={}),D=b[u]||(b[u]={});m&&(n=t);for(l in n)h=!d&&v&&l in v,p=(h?v:n)[l],f=y&&h?a(p,r):x&&\"function\"==typeof p?a(Function.call,p):p,v&&!h&&s(v,l,p),b[l]!=p&&o(b,l,f),x&&D[l]!=p&&(D[l]=p)};r.core=i,c.F=1,c.G=2,c.S=4,c.P=8,c.B=16,c.W=32,e.exports=c},function(e,t,n){var r=n(25);e.exports=function(e,t,n){if(r(e),void 0===t)return e;switch(n){case 1:return function(n){return e.call(t,n)};case 2:return function(n,r){return e.call(t,n,r)};case 3:return function(n,r,i){return e.call(t,n,r,i)}}return function(){return e.apply(t,arguments)}}},function(e,t){e.exports=function(e){if(\"function\"!=typeof e)throw TypeError(e+\" is not a function!\");return e}},function(e,t){var n={}.hasOwnProperty;e.exports=function(e,t){return n.call(e,t)}},function(e,t){e.exports={}},function(e,t,n){\"use strict\";var r=n(12),i=n(13),o=n(29),s={};n(11)(s,n(6)(\"iterator\"),function(){return this}),e.exports=function(e,t,n){e.prototype=r.create(s,{next:i(1,n)}),o(e,t+\" Iterator\")}},function(e,t,n){var r=n(12).setDesc,i=n(26),o=n(6)(\"toStringTag\");e.exports=function(e,t,n){e&&!i(e=n?e:e.prototype,o)&&r(e,o,{configurable:!0,value:t})}},function(e,t,n){n(31);var r=n(8),i=n(11),o=n(27),s=n(6)(\"iterator\"),a=r.NodeList,u=r.HTMLCollection,c=a&&a.prototype,l=u&&u.prototype,h=o.NodeList=o.HTMLCollection=o.Array;c&&!c[s]&&i(c,s,h),l&&!l[s]&&i(l,s,h)},function(e,t,n){\"use strict\";var r=n(32),i=n(33),o=n(27),s=n(34);e.exports=n(21)(Array,\"Array\",function(e,t){this._t=s(e),this._i=0,this._k=t},function(){var e=this._t,t=this._k,n=this._i++;return!e||n>=e.length?(this._t=void 0,i(1)):\"keys\"==t?i(0,n):\"values\"==t?i(0,e[n]):i(0,[n,e[n]])},\"values\"),o.Arguments=o.Array,r(\"keys\"),r(\"values\"),r(\"entries\")},function(e,t,n){var r=n(6)(\"unscopables\"),i=Array.prototype;void 0==i[r]&&n(11)(i,r,{}),e.exports=function(e){i[r][e]=!0}},function(e,t){e.exports=function(e,t){return{value:t,done:!!e}}},function(e,t,n){var r=n(35),i=n(20);e.exports=function(e){return r(i(e))}},function(e,t,n){var r=n(5);e.exports=Object(\"z\").propertyIsEnumerable(0)?Object:function(e){return\"String\"==r(e)?e.split(\"\"):Object(e)}},function(e,t,n){\"use strict\";var r,i=n(12),o=n(22),s=n(8),a=n(24),u=n(4),c=n(23),l=n(37),h=n(38),p=n(25),f=n(39),d=n(40),m=n(45).set,g=n(46),x=n(6)(\"species\"),y=n(47),v=n(48),b=\"Promise\",D=s.process,w=\"process\"==u(D),E=s[b],k=function(){},A=function(e){var t,n=new E(k);return e&&(n.constructor=function(e){e(k,k)}),(t=E.resolve(n)).catch(k),t===n},C=function(){function e(t){var n=new E(t);return m(n,e.prototype),n}var t=!1;try{if(t=E&&E.resolve&&A(),m(e,E),e.prototype=i.create(E.prototype,{constructor:{value:e}}),e.resolve(5).then(function(){})instanceof e||(t=!1),t&&n(14)){var r=!1;E.resolve(i.setDesc({},\"then\",{get:function(){r=!0}})),t=r}}catch(e){t=!1}return t}(),S=function(e,t){return!(!o||e!==E||t!==r)||g(e,t)},F=function(e){var t=h(e)[x];return void 0!=t?t:e},T=function(e){var t;return!(!l(e)||\"function\"!=typeof(t=e.then))&&t},B=function(e){var t,n;this.promise=new e(function(e,r){if(void 0!==t||void 0!==n)throw TypeError(\"Bad Promise constructor\");t=e,n=r}),this.resolve=p(t),this.reject=p(n)},N=function(e){try{e()}catch(e){return{error:e}}},I=function(e,t){if(!e.n){e.n=!0;var n=e.c;v(function(){for(var r=e.v,i=1==e.s,o=0,a=function(t){var n,o,s=i?t.ok:t.fail,a=t.resolve,u=t.reject;try{s?(i||(e.h=!0),n=s===!0?r:s(r),n===t.promise?u(TypeError(\"Promise-chain cycle\")):(o=T(n))?o.call(n,a,u):a(n)):u(r)}catch(e){u(e)}};n.length>o;)a(n[o++]);n.length=0,e.n=!1,t&&setTimeout(function(){var t,n,i=e.p;P(i)&&(w?D.emit(\"unhandledRejection\",r,i):(t=s.onunhandledrejection)?t({promise:i,reason:r}):(n=s.console)&&n.error&&n.error(\"Unhandled promise rejection\",r)),e.a=void 0},1)})}},P=function(e){var t,n=e._d,r=n.a||n.c,i=0;if(n.h)return!1;for(;r.length>i;)if(t=r[i++],t.fail||!P(t.promise))return!1;return!0},M=function(e){var t=this;t.d||(t.d=!0,t=t.r||t,t.v=e,t.s=2,t.a=t.c.slice(),I(t,!0))},O=function(e){var t,n=this;if(!n.d){n.d=!0,n=n.r||n;try{if(n.p===e)throw TypeError(\"Promise can't be resolved itself\");(t=T(e))?v(function(){var r={r:n,d:!1};try{t.call(e,a(O,r,1),a(M,r,1))}catch(e){M.call(r,e)}}):(n.v=e,n.s=1,I(n,!1))}catch(e){M.call({r:n,d:!1},e)}}};C||(E=function(e){p(e);var t=this._d={p:f(this,E,b),c:[],a:void 0,s:0,d:!1,v:void 0,h:!1,n:!1};try{e(a(O,t,1),a(M,t,1))}catch(e){M.call(t,e)}},n(53)(E.prototype,{then:function(e,t){var n=new B(y(this,E)),r=n.promise,i=this._d;return n.ok=\"function\"!=typeof e||e,n.fail=\"function\"==typeof t&&t,i.c.push(n),i.a&&i.a.push(n),i.s&&I(i,!1),r},catch:function(e){return this.then(void 0,e)}})),c(c.G+c.W+c.F*!C,{Promise:E}),n(29)(E,b),n(54)(b),r=n(16)[b],c(c.S+c.F*!C,b,{reject:function(e){var t=new B(this),n=t.reject;return n(e),t.promise}}),c(c.S+c.F*(!C||A(!0)),b,{resolve:function(e){if(e instanceof E&&S(e.constructor,this))return e;var t=new B(this),n=t.resolve;return n(e),t.promise}}),c(c.S+c.F*!(C&&n(55)(function(e){E.all(e).catch(function(){})})),b,{all:function(e){var t=F(this),n=new B(t),r=n.resolve,o=n.reject,s=[],a=N(function(){d(e,!1,s.push,s);var n=s.length,a=Array(n);n?i.each.call(s,function(e,i){var s=!1;t.resolve(e).then(function(e){s||(s=!0,a[i]=e,--n||r(a))},o)}):r(a)});return a&&o(a.error),n.promise},race:function(e){var t=F(this),n=new B(t),r=n.reject,i=N(function(){d(e,!1,function(e){t.resolve(e).then(n.resolve,r)})});return i&&r(i.error),n.promise}})},function(e,t){e.exports=function(e){return\"object\"==typeof e?null!==e:\"function\"==typeof e}},function(e,t,n){var r=n(37);e.exports=function(e){if(!r(e))throw TypeError(e+\" is not an object!\");return e}},function(e,t){e.exports=function(e,t,n){if(!(e instanceof t))throw TypeError(n+\": use the 'new' operator!\");return e}},function(e,t,n){var r=n(24),i=n(41),o=n(42),s=n(38),a=n(43),u=n(44);e.exports=function(e,t,n,c){var l,h,p,f=u(e),d=r(n,c,t?2:1),m=0;if(\"function\"!=typeof f)throw TypeError(e+\" is not iterable!\");if(o(f))for(l=a(e.length);l>m;m++)t?d(s(h=e[m])[0],h[1]):d(e[m]);else for(p=f.call(e);!(h=p.next()).done;)i(p,d,h.value,t)}},function(e,t,n){var r=n(38);e.exports=function(e,t,n,i){try{return i?t(r(n)[0],n[1]):t(n)}catch(t){var o=e.return;throw void 0!==o&&r(o.call(e)),t}}},function(e,t,n){var r=n(27),i=n(6)(\"iterator\"),o=Array.prototype;e.exports=function(e){return void 0!==e&&(r.Array===e||o[i]===e)}},function(e,t,n){var r=n(19),i=Math.min;e.exports=function(e){return e>0?i(r(e),9007199254740991):0}},function(e,t,n){var r=n(4),i=n(6)(\"iterator\"),o=n(27);e.exports=n(16).getIteratorMethod=function(e){if(void 0!=e)return e[i]||e[\"@@iterator\"]||o[r(e)]}},function(e,t,n){var r=n(12).getDesc,i=n(37),o=n(38),s=function(e,t){if(o(e),!i(t)&&null!==t)throw TypeError(t+\": can't set as prototype!\")};e.exports={set:Object.setPrototypeOf||(\"__proto__\"in{}?function(e,t,i){try{i=n(24)(Function.call,r(Object.prototype,\"__proto__\").set,2),i(e,[]),t=!(e instanceof Array)}catch(e){t=!0}return function(e,n){return s(e,n),t?e.__proto__=n:i(e,n),e}}({},!1):void 0),check:s}},function(e,t){e.exports=Object.is||function(e,t){return e===t?0!==e||1/e===1/t:e!=e&&t!=t}},function(e,t,n){var r=n(38),i=n(25),o=n(6)(\"species\");e.exports=function(e,t){var n,s=r(e).constructor;return void 0===s||void 0==(n=r(s)[o])?t:i(n)}},function(e,t,n){var r,i,o,s=n(8),a=n(49).set,u=s.MutationObserver||s.WebKitMutationObserver,c=s.process,l=s.Promise,h=\"process\"==n(5)(c),p=function(){var e,t,n;for(h&&(e=c.domain)&&(c.domain=null,e.exit());r;)t=r.domain,n=r.fn,t&&t.enter(),n(),t&&t.exit(),r=r.next;i=void 0,e&&e.enter()};if(h)o=function(){c.nextTick(p)};else if(u){var f=1,d=document.createTextNode(\"\");new u(p).observe(d,{characterData:!0}),o=function(){d.data=f=-f}}else o=l&&l.resolve?function(){l.resolve().then(p)}:function(){a.call(s,p)};e.exports=function(e){var t={fn:e,next:void 0,domain:h&&c.domain};i&&(i.next=t),r||(r=t,o()),i=t}},function(e,t,n){var r,i,o,s=n(24),a=n(50),u=n(51),c=n(52),l=n(8),h=l.process,p=l.setImmediate,f=l.clearImmediate,d=l.MessageChannel,m=0,g={},x=\"onreadystatechange\",y=function(){var e=+this;if(g.hasOwnProperty(e)){var t=g[e];delete g[e],t()}},v=function(e){y.call(e.data)};p&&f||(p=function(e){for(var t=[],n=1;arguments.length>n;)t.push(arguments[n++]);return g[++m]=function(){a(\"function\"==typeof e?e:Function(e),t)},r(m),m},f=function(e){delete g[e]},\"process\"==n(5)(h)?r=function(e){h.nextTick(s(y,e,1))}:d?(i=new d,o=i.port2,i.port1.onmessage=v,r=s(o.postMessage,o,1)):l.addEventListener&&\"function\"==typeof postMessage&&!l.importScripts?(r=function(e){l.postMessage(e+\"\",\"*\")},l.addEventListener(\"message\",v,!1)):r=x in c(\"script\")?function(e){u.appendChild(c(\"script\"))[x]=function(){u.removeChild(this),y.call(e)}}:function(e){setTimeout(s(y,e,1),0)}),e.exports={set:p,clear:f}},function(e,t){e.exports=function(e,t,n){var r=void 0===n;switch(t.length){case 0:return r?e():e.call(n);case 1:return r?e(t[0]):e.call(n,t[0]);case 2:return r?e(t[0],t[1]):e.call(n,t[0],t[1]);case 3:return r?e(t[0],t[1],t[2]):e.call(n,t[0],t[1],t[2]);case 4:return r?e(t[0],t[1],t[2],t[3]):e.call(n,t[0],t[1],t[2],t[3])}return e.apply(n,t)}},function(e,t,n){e.exports=n(8).document&&document.documentElement},function(e,t,n){var r=n(37),i=n(8).document,o=r(i)&&r(i.createElement);e.exports=function(e){return o?i.createElement(e):{}}},function(e,t,n){var r=n(10);e.exports=function(e,t){for(var n in t)r(e,n,t[n]);return e}},function(e,t,n){\"use strict\";var r=n(8),i=n(12),o=n(14),s=n(6)(\"species\");e.exports=function(e){var t=r[e];o&&t&&!t[s]&&i.setDesc(t,s,{configurable:!0,get:function(){return this}})}},function(e,t,n){var r=n(6)(\"iterator\"),i=!1;try{var o=[7][r]();o.return=function(){i=!0},Array.from(o,function(){throw 2})}catch(e){}e.exports=function(e,t){if(!t&&!i)return!1;var n=!1;try{var o=[7],s=o[r]();s.next=function(){return{done:n=!0}},o[r]=function(){return s},e(o)}catch(e){}return n}},function(e,t,n){\"use strict\";function r(e){return e&&e.__esModule?e:{default:e}}var i=n(57),o=r(i);n(174);var s=n(178),a=r(s),u=n(181),c=r(u),l=[a.default,c.default,function(){return{components:{StandaloneLayout:o.default}}}];e.exports=l},function(e,t,n){\"use strict\";function r(e){return e&&e.__esModule?e:{default:e}}Object.defineProperty(t,\"__esModule\",{value:!0});var i=n(58),o=r(i),s=n(84),a=r(s),u=n(85),c=r(u),l=n(89),h=r(l),p=n(136),f=r(p),d=n(144),m=r(d),g=function(e){function t(){return(0,a.default)(this,t),(0,h.default)(this,(t.__proto__||(0,o.default)(t)).apply(this,arguments))}return(0,f.default)(t,e),(0,c.default)(t,[{key:\"render\",value:function(){var e=this.props,t=e.getComponent,n=e.specSelectors,r=t(\"Container\"),i=t(\"Row\"),o=t(\"Col\"),s=t(\"Topbar\",!0),a=t(\"BaseLayout\",!0),u=t(\"onlineValidatorBadge\",!0),c=n.loadingStatus();return m.default.createElement(r,{className:\"swagger-ui\"},s?m.default.createElement(s,null):null,\"loading\"===c&&m.default.createElement(\"div\",{className:\"info\"},m.default.createElement(\"h4\",{className:\"title\"},\"Loading...\")),\"failed\"===c&&m.default.createElement(\"div\",{className:\"info\"},m.default.createElement(\"h4\",{className:\"title\"},\"Failed to load spec.\")),\"failedConfig\"===c&&m.default.createElement(\"div\",{className:\"info\",style:{maxWidth:\"880px\",marginLeft:\"auto\",marginRight:\"auto\",textAlign:\"center\"}},m.default.createElement(\"h4\",{className:\"title\"},\"Failed to load config.\")),!c||\"success\"===c&&m.default.createElement(a,null),m.default.createElement(i,null,m.default.createElement(o,null,m.default.createElement(u,null))))}}]),t}(m.default.Component);g.propTypes={errSelectors:d.PropTypes.object.isRequired,errActions:d.PropTypes.object.isRequired,specActions:d.PropTypes.object.isRequired,specSelectors:d.PropTypes.object.isRequired,layoutSelectors:d.PropTypes.object.isRequired,layoutActions:d.PropTypes.object.isRequired,getComponent:d.PropTypes.func.isRequired},t.default=g},function(e,t,n){e.exports={default:n(59),__esModule:!0}},function(e,t,n){n(60),e.exports=n(71).Object.getPrototypeOf},function(e,t,n){var r=n(61),i=n(63);n(69)(\"getPrototypeOf\",function(){return function(e){return i(r(e))}})},function(e,t,n){var r=n(62);e.exports=function(e){return Object(r(e))}},20,function(e,t,n){var r=n(64),i=n(61),o=n(65)(\"IE_PROTO\"),s=Object.prototype;e.exports=Object.getPrototypeOf||function(e){return e=i(e),r(e,o)?e[o]:\"function\"==typeof e.constructor&&e instanceof e.constructor?e.constructor.prototype:e instanceof Object?s:null}},26,function(e,t,n){var r=n(66)(\"keys\"),i=n(68);e.exports=function(e){return r[e]||(r[e]=i(e))}},function(e,t,n){var r=n(67),i=\"__core-js_shared__\",o=r[i]||(r[i]={});e.exports=function(e){return o[e]||(o[e]={})}},8,9,function(e,t,n){var r=n(70),i=n(71),o=n(80);e.exports=function(e,t){var n=(i.Object||{})[e]||Object[e],s={};s[e]=t(n),r(r.S+r.F*o(function(){n(1)}),\"Object\",s)}},function(e,t,n){var r=n(67),i=n(71),o=n(72),s=n(74),a=\"prototype\",u=function(e,t,n){var c,l,h,p=e&u.F,f=e&u.G,d=e&u.S,m=e&u.P,g=e&u.B,x=e&u.W,y=f?i:i[t]||(i[t]={}),v=y[a],b=f?r:d?r[t]:(r[t]||{})[a];f&&(n=t);for(c in n)l=!p&&b&&void 0!==b[c],l&&c in y||(h=l?b[c]:n[c],y[c]=f&&\"function\"!=typeof b[c]?n[c]:g&&l?o(h,r):x&&b[c]==h?function(e){var t=function(t,n,r){if(this instanceof e){switch(arguments.length){case 0:return new e;case 1:return new e(t);case 2:return new e(t,n)}return new e(t,n,r)}return e.apply(this,arguments)};return t[a]=e[a],t}(h):m&&\"function\"==typeof h?o(Function.call,h):h,m&&((y.virtual||(y.virtual={}))[c]=h,e&u.R&&v&&!v[c]&&s(v,c,h)))};u.F=1,u.G=2,u.S=4,u.P=8,u.B=16,u.W=32,u.U=64,u.R=128,e.exports=u},function(e,t){var n=e.exports={version:\"2.4.0\"};\"number\"==typeof __e&&(__e=n)},function(e,t,n){var r=n(73);e.exports=function(e,t,n){if(r(e),void 0===t)return e;switch(n){case 1:return function(n){return e.call(t,n)};case 2:return function(n,r){return e.call(t,n,r)};case 3:return function(n,r,i){return e.call(t,n,r,i)}}return function(){return e.apply(t,arguments)}}},25,function(e,t,n){var r=n(75),i=n(83);e.exports=n(79)?function(e,t,n){return r.f(e,t,i(1,n))}:function(e,t,n){return e[t]=n,e}},function(e,t,n){var r=n(76),i=n(78),o=n(82),s=Object.defineProperty;t.f=n(79)?Object.defineProperty:function(e,t,n){if(r(e),t=o(t,!0),r(n),i)try{return s(e,t,n)}catch(e){}if(\"get\"in n||\"set\"in n)throw TypeError(\"Accessors not supported!\");return\"value\"in n&&(e[t]=n.value),e}},function(e,t,n){var r=n(77);e.exports=function(e){if(!r(e))throw TypeError(e+\" is not an object!\");return e}},37,function(e,t,n){e.exports=!n(79)&&!n(80)(function(){return 7!=Object.defineProperty(n(81)(\"div\"),\"a\",{get:function(){return 7}}).a})},function(e,t,n){e.exports=!n(80)(function(){return 7!=Object.defineProperty({},\"a\",{get:function(){return 7}}).a})},15,function(e,t,n){var r=n(77),i=n(67).document,o=r(i)&&r(i.createElement);e.exports=function(e){return o?i.createElement(e):{}}},function(e,t,n){var r=n(77);e.exports=function(e,t){if(!r(e))return e;var n,i;if(t&&\"function\"==typeof(n=e.toString)&&!r(i=n.call(e)))return i;if(\"function\"==typeof(n=e.valueOf)&&!r(i=n.call(e)))return i;if(!t&&\"function\"==typeof(n=e.toString)&&!r(i=n.call(e)))return i;throw TypeError(\"Can't convert object to primitive value\")}},13,function(e,t){\"use strict\";t.__esModule=!0,t.default=function(e,t){if(!(e instanceof t))throw new TypeError(\"Cannot call a class as a function\")}},function(e,t,n){\"use strict\";function r(e){return e&&e.__esModule?e:{default:e}}t.__esModule=!0;var i=n(86),o=r(i);t.default=function(){function e(e,t){for(var n=0;n<t.length;n++){var r=t[n];r.enumerable=r.enumerable||!1,r.configurable=!0,\"value\"in r&&(r.writable=!0),(0,o.default)(e,r.key,r)}}return function(t,n,r){return n&&e(t.prototype,n),r&&e(t,r),t}}()},function(e,t,n){e.exports={default:n(87),__esModule:!0}},function(e,t,n){n(88);var r=n(71).Object;e.exports=function(e,t,n){return r.defineProperty(e,t,n)}},function(e,t,n){var r=n(70);r(r.S+r.F*!n(79),\"Object\",{defineProperty:n(75).f})},function(e,t,n){\"use strict\";function r(e){return e&&e.__esModule?e:{default:e}}t.__esModule=!0;var i=n(90),o=r(i);t.default=function(e,t){if(!e)throw new ReferenceError(\"this hasn't been initialised - super() hasn't been called\");return!t||\"object\"!==(\"undefined\"==typeof t?\"undefined\":(0,o.default)(t))&&\"function\"!=typeof t?e:t}},function(e,t,n){\"use strict\";function r(e){return e&&e.__esModule?e:{default:e}}t.__esModule=!0;var i=n(91),o=r(i),s=n(120),a=r(s),u=\"function\"==typeof a.default&&\"symbol\"==typeof o.default?function(e){return typeof e}:function(e){return e&&\"function\"==typeof a.default&&e.constructor===a.default&&e!==a.default.prototype?\"symbol\":typeof e};t.default=\"function\"==typeof a.default&&\"symbol\"===u(o.default)?function(e){return\"undefined\"==typeof e?\"undefined\":u(e)}:function(e){return e&&\"function\"==typeof a.default&&e.constructor===a.default&&e!==a.default.prototype?\"symbol\":\"undefined\"==typeof e?\"undefined\":u(e)}},function(e,t,n){e.exports={default:n(92),__esModule:!0}},function(e,t,n){n(93),n(115),e.exports=n(119).f(\"iterator\")},function(e,t,n){\"use strict\";var r=n(94)(!0);n(96)(String,\"String\",function(e){this._t=String(e),this._i=0},function(){var e,t=this._t,n=this._i;return n>=t.length?{value:void 0,done:!0}:(e=r(t,n),this._i+=e.length,{value:e,done:!1})})},function(e,t,n){var r=n(95),i=n(62);e.exports=function(e){return function(t,n){var o,s,a=String(i(t)),u=r(n),c=a.length;return u<0||u>=c?e?\"\":void 0:(o=a.charCodeAt(u),o<55296||o>56319||u+1===c||(s=a.charCodeAt(u+1))<56320||s>57343?e?a.charAt(u):o:e?a.slice(u,u+2):(o-55296<<10)+(s-56320)+65536)}}},19,function(e,t,n){\"use strict\";var r=n(97),i=n(70),o=n(98),s=n(74),a=n(64),u=n(99),c=n(100),l=n(113),h=n(63),p=n(114)(\"iterator\"),f=!([].keys&&\"next\"in[].keys()),d=\"@@iterator\",m=\"keys\",g=\"values\",x=function(){return this};e.exports=function(e,t,n,y,v,b,D){c(n,t,y);var w,E,k,A=function(e){if(!f&&e in T)return T[e];switch(e){case m:return function(){return new n(this,e)};case g:return function(){return new n(this,e)}}return function(){return new n(this,e)}},C=t+\" Iterator\",S=v==g,F=!1,T=e.prototype,B=T[p]||T[d]||v&&T[v],N=B||A(v),I=v?S?A(\"entries\"):N:void 0,P=\"Array\"==t?T.entries||B:B;if(P&&(k=h(P.call(new e)),k!==Object.prototype&&(l(k,C,!0),r||a(k,p)||s(k,p,x))),S&&B&&B.name!==g&&(F=!0,N=function(){return B.call(this)}),r&&!D||!f&&!F&&T[p]||s(T,p,N),u[t]=N,u[C]=x,v)if(w={values:S?N:A(g),keys:b?N:A(m),entries:I},D)for(E in w)E in T||o(T,E,w[E]);else i(i.P+i.F*(f||F),t,w);return w}},function(e,t){e.exports=!0},function(e,t,n){e.exports=n(74)},27,function(e,t,n){\"use strict\";var r=n(101),i=n(83),o=n(113),s={};n(74)(s,n(114)(\"iterator\"),function(){return this}),e.exports=function(e,t,n){e.prototype=r(s,{next:i(1,n)}),o(e,t+\" Iterator\")}},function(e,t,n){var r=n(76),i=n(102),o=n(111),s=n(65)(\"IE_PROTO\"),a=function(){},u=\"prototype\",c=function(){var e,t=n(81)(\"iframe\"),r=o.length,i=\"<\",s=\">\";for(t.style.display=\"none\",n(112).appendChild(t),t.src=\"javascript:\",e=t.contentWindow.document,e.open(),e.write(i+\"script\"+s+\"document.F=Object\"+i+\"/script\"+s),e.close(),c=e.F;r--;)delete c[u][o[r]];return c()};e.exports=Object.create||function(e,t){var n;return null!==e?(a[u]=r(e),n=new a,a[u]=null,n[s]=e):n=c(),void 0===t?n:i(n,t)}},function(e,t,n){var r=n(75),i=n(76),o=n(103);e.exports=n(79)?Object.defineProperties:function(e,t){i(e);for(var n,s=o(t),a=s.length,u=0;a>u;)r.f(e,n=s[u++],t[n]);return e}},function(e,t,n){var r=n(104),i=n(111);e.exports=Object.keys||function(e){return r(e,i)}},function(e,t,n){var r=n(64),i=n(105),o=n(108)(!1),s=n(65)(\"IE_PROTO\");e.exports=function(e,t){var n,a=i(e),u=0,c=[];for(n in a)n!=s&&r(a,n)&&c.push(n);for(;t.length>u;)r(a,n=t[u++])&&(~o(c,n)||c.push(n));return c}},function(e,t,n){var r=n(106),i=n(62);e.exports=function(e){return r(i(e))}},function(e,t,n){var r=n(107);e.exports=Object(\"z\").propertyIsEnumerable(0)?Object:function(e){return\"String\"==r(e)?e.split(\"\"):Object(e)}},5,function(e,t,n){var r=n(105),i=n(109),o=n(110);e.exports=function(e){return function(t,n,s){var a,u=r(t),c=i(u.length),l=o(s,c);if(e&&n!=n){for(;c>l;)if(a=u[l++],a!=a)return!0}else for(;c>l;l++)if((e||l in u)&&u[l]===n)return e||l||0;return!e&&-1}}},function(e,t,n){var r=n(95),i=Math.min;e.exports=function(e){return e>0?i(r(e),9007199254740991):0}},function(e,t,n){var r=n(95),i=Math.max,o=Math.min;e.exports=function(e,t){return e=r(e),e<0?i(e+t,0):o(e,t)}},function(e,t){e.exports=\"constructor,hasOwnProperty,isPrototypeOf,propertyIsEnumerable,toLocaleString,toString,valueOf\".split(\",\")},function(e,t,n){e.exports=n(67).document&&document.documentElement},function(e,t,n){var r=n(75).f,i=n(64),o=n(114)(\"toStringTag\");e.exports=function(e,t,n){e&&!i(e=n?e:e.prototype,o)&&r(e,o,{configurable:!0,value:t})}},function(e,t,n){var r=n(66)(\"wks\"),i=n(68),o=n(67).Symbol,s=\"function\"==typeof o,a=e.exports=function(e){return r[e]||(r[e]=s&&o[e]||(s?o:i)(\"Symbol.\"+e))};a.store=r},function(e,t,n){n(116);for(var r=n(67),i=n(74),o=n(99),s=n(114)(\"toStringTag\"),a=[\"NodeList\",\"DOMTokenList\",\"MediaList\",\"StyleSheetList\",\"CSSRuleList\"],u=0;u<5;u++){var c=a[u],l=r[c],h=l&&l.prototype;h&&!h[s]&&i(h,s,c),o[c]=o.Array}},function(e,t,n){\"use strict\";var r=n(117),i=n(118),o=n(99),s=n(105);e.exports=n(96)(Array,\"Array\",function(e,t){this._t=s(e),this._i=0,this._k=t},function(){var e=this._t,t=this._k,n=this._i++;return!e||n>=e.length?(this._t=void 0,i(1)):\"keys\"==t?i(0,n):\"values\"==t?i(0,e[n]):i(0,[n,e[n]])},\"values\"),o.Arguments=o.Array,r(\"keys\"),r(\"values\"),r(\"entries\")},function(e,t){e.exports=function(){}},33,function(e,t,n){t.f=n(114)},function(e,t,n){e.exports={default:n(121),__esModule:!0}},function(e,t,n){n(122),n(133),n(134),n(135),e.exports=n(71).Symbol},function(e,t,n){\"use strict\";var r=n(67),i=n(64),o=n(79),s=n(70),a=n(98),u=n(123).KEY,c=n(80),l=n(66),h=n(113),p=n(68),f=n(114),d=n(119),m=n(124),g=n(125),x=n(126),y=n(129),v=n(76),b=n(105),D=n(82),w=n(83),E=n(101),k=n(130),A=n(132),C=n(75),S=n(103),F=A.f,T=C.f,B=k.f,N=r.Symbol,I=r.JSON,P=I&&I.stringify,M=\"prototype\",O=f(\"_hidden\"),_=f(\"toPrimitive\"),L={}.propertyIsEnumerable,R=l(\"symbol-registry\"),U=l(\"symbols\"),j=l(\"op-symbols\"),z=Object[M],J=\"function\"==typeof N,X=r.QObject,Y=!X||!X[M]||!X[M].findChild,K=o&&c(function(){return 7!=E(T({},\"a\",{get:function(){return T(this,\"a\",{value:7}).a}})).a})?function(e,t,n){var r=F(z,t);r&&delete z[t],T(e,t,n),r&&e!==z&&T(z,t,r)}:T,W=function(e){var t=U[e]=E(N[M]);return t._k=e,t},H=J&&\"symbol\"==typeof N.iterator?function(e){return\"symbol\"==typeof e}:function(e){return e instanceof N},q=function(e,t,n){return e===z&&q(j,t,n),v(e),t=D(t,!0),v(n),i(U,t)?(n.enumerable?(i(e,O)&&e[O][t]&&(e[O][t]=!1),n=E(n,{enumerable:w(0,!1)})):(i(e,O)||T(e,O,w(1,{})),e[O][t]=!0),K(e,t,n)):T(e,t,n)},G=function(e,t){v(e);for(var n,r=x(t=b(t)),i=0,o=r.length;o>i;)q(e,n=r[i++],t[n]);return e},V=function(e,t){return void 0===t?E(e):G(E(e),t)},$=function(e){var t=L.call(this,e=D(e,!0));return!(this===z&&i(U,e)&&!i(j,e))&&(!(t||!i(this,e)||!i(U,e)||i(this,O)&&this[O][e])||t)},Z=function(e,t){if(e=b(e),t=D(t,!0),e!==z||!i(U,t)||i(j,t)){var n=F(e,t);return!n||!i(U,t)||i(e,O)&&e[O][t]||(n.enumerable=!0),n}},Q=function(e){for(var t,n=B(b(e)),r=[],o=0;n.length>o;)i(U,t=n[o++])||t==O||t==u||r.push(t);return r},ee=function(e){for(var t,n=e===z,r=B(n?j:b(e)),o=[],s=0;r.length>s;)!i(U,t=r[s++])||n&&!i(z,t)||o.push(U[t]);return o};J||(N=function(){if(this instanceof N)throw TypeError(\"Symbol is not a constructor!\");var e=p(arguments.length>0?arguments[0]:void 0),t=function(n){this===z&&t.call(j,n),i(this,O)&&i(this[O],e)&&(this[O][e]=!1),K(this,e,w(1,n))};return o&&Y&&K(z,e,{configurable:!0,set:t}),W(e)},a(N[M],\"toString\",function(){return this._k}),A.f=Z,C.f=q,n(131).f=k.f=Q,n(128).f=$,n(127).f=ee,o&&!n(97)&&a(z,\"propertyIsEnumerable\",$,!0),d.f=function(e){return W(f(e))}),s(s.G+s.W+s.F*!J,{Symbol:N});for(var te=\"hasInstance,isConcatSpreadable,iterator,match,replace,search,species,split,toPrimitive,toStringTag,unscopables\".split(\",\"),ne=0;te.length>ne;)f(te[ne++]);for(var te=S(f.store),ne=0;te.length>ne;)m(te[ne++]);s(s.S+s.F*!J,\"Symbol\",{for:function(e){return i(R,e+=\"\")?R[e]:R[e]=N(e)},keyFor:function(e){if(H(e))return g(R,e);throw TypeError(e+\" is not a symbol!\")},useSetter:function(){Y=!0},useSimple:function(){Y=!1}}),s(s.S+s.F*!J,\"Object\",{create:V,defineProperty:q,defineProperties:G,getOwnPropertyDescriptor:Z,getOwnPropertyNames:Q,getOwnPropertySymbols:ee}),I&&s(s.S+s.F*(!J||c(function(){var e=N();return\"[null]\"!=P([e])||\"{}\"!=P({a:e})||\"{}\"!=P(Object(e))})),\"JSON\",{stringify:function(e){if(void 0!==e&&!H(e)){for(var t,n,r=[e],i=1;arguments.length>i;)r.push(arguments[i++]);return t=r[1],\"function\"==typeof t&&(n=t),!n&&y(t)||(t=function(e,t){if(n&&(t=n.call(this,e,t)),!H(t))return t}),r[1]=t,P.apply(I,r)}}}),N[M][_]||n(74)(N[M],_,N[M].valueOf),h(N,\"Symbol\"),h(Math,\"Math\",!0),h(r.JSON,\"JSON\",!0)},function(e,t,n){var r=n(68)(\"meta\"),i=n(77),o=n(64),s=n(75).f,a=0,u=Object.isExtensible||function(){return!0},c=!n(80)(function(){return u(Object.preventExtensions({}))}),l=function(e){s(e,r,{value:{i:\"O\"+ ++a,w:{}}})},h=function(e,t){if(!i(e))return\"symbol\"==typeof e?e:(\"string\"==typeof e?\"S\":\"P\")+e;if(!o(e,r)){if(!u(e))return\"F\";if(!t)return\"E\";l(e)}return e[r].i},p=function(e,t){if(!o(e,r)){if(!u(e))return!0;if(!t)return!1;l(e)}return e[r].w},f=function(e){return c&&d.NEED&&u(e)&&!o(e,r)&&l(e),e},d=e.exports={KEY:r,NEED:!1,fastKey:h,getWeak:p,onFreeze:f}},function(e,t,n){var r=n(67),i=n(71),o=n(97),s=n(119),a=n(75).f;e.exports=function(e){var t=i.Symbol||(i.Symbol=o?{}:r.Symbol||{});\"_\"==e.charAt(0)||e in t||a(t,e,{value:s.f(e)})}},function(e,t,n){var r=n(103),i=n(105);e.exports=function(e,t){for(var n,o=i(e),s=r(o),a=s.length,u=0;a>u;)if(o[n=s[u++]]===t)return n}},function(e,t,n){var r=n(103),i=n(127),o=n(128);e.exports=function(e){var t=r(e),n=i.f;if(n)for(var s,a=n(e),u=o.f,c=0;a.length>c;)u.call(e,s=a[c++])&&t.push(s);return t}},function(e,t){t.f=Object.getOwnPropertySymbols},function(e,t){t.f={}.propertyIsEnumerable},function(e,t,n){var r=n(107);e.exports=Array.isArray||function(e){return\"Array\"==r(e)}},function(e,t,n){var r=n(105),i=n(131).f,o={}.toString,s=\"object\"==typeof window&&window&&Object.getOwnPropertyNames?Object.getOwnPropertyNames(window):[],a=function(e){try{return i(e)}catch(e){return s.slice()}};e.exports.f=function(e){return s&&\"[object Window]\"==o.call(e)?a(e):i(r(e))}},function(e,t,n){var r=n(104),i=n(111).concat(\"length\",\"prototype\");t.f=Object.getOwnPropertyNames||function(e){return r(e,i)}},function(e,t,n){var r=n(128),i=n(83),o=n(105),s=n(82),a=n(64),u=n(78),c=Object.getOwnPropertyDescriptor;t.f=n(79)?c:function(e,t){if(e=o(e),t=s(t,!0),u)try{return c(e,t)}catch(e){}if(a(e,t))return i(!r.f.call(e,t),e[t])}},function(e,t){},function(e,t,n){n(124)(\"asyncIterator\")},function(e,t,n){n(124)(\"observable\")},function(e,t,n){\"use strict\";function r(e){return e&&e.__esModule?e:{default:e}}t.__esModule=!0;var i=n(137),o=r(i),s=n(141),a=r(s),u=n(90),c=r(u);t.default=function(e,t){if(\"function\"!=typeof t&&null!==t)throw new TypeError(\"Super expression must either be null or a function, not \"+(\"undefined\"==typeof t?\"undefined\":(0,c.default)(t)));e.prototype=(0,a.default)(t&&t.prototype,{constructor:{value:e,enumerable:!1,writable:!0,configurable:!0\n}}),t&&(o.default?(0,o.default)(e,t):e.__proto__=t)}},function(e,t,n){e.exports={default:n(138),__esModule:!0}},function(e,t,n){n(139),e.exports=n(71).Object.setPrototypeOf},function(e,t,n){var r=n(70);r(r.S,\"Object\",{setPrototypeOf:n(140).set})},function(e,t,n){var r=n(77),i=n(76),o=function(e,t){if(i(e),!r(t)&&null!==t)throw TypeError(t+\": can't set as prototype!\")};e.exports={set:Object.setPrototypeOf||(\"__proto__\"in{}?function(e,t,r){try{r=n(72)(Function.call,n(132).f(Object.prototype,\"__proto__\").set,2),r(e,[]),t=!(e instanceof Array)}catch(e){t=!0}return function(e,n){return o(e,n),t?e.__proto__=n:r(e,n),e}}({},!1):void 0),check:o}},function(e,t,n){e.exports={default:n(142),__esModule:!0}},function(e,t,n){n(143);var r=n(71).Object;e.exports=function(e,t){return r.create(e,t)}},function(e,t,n){var r=n(70);r(r.S,\"Object\",{create:n(101)})},function(e,t,n){\"use strict\";e.exports=n(145)},function(e,t,n){\"use strict\";var r=n(146),i=n(147),o=n(156),s=n(164),a=n(158),u=n(165),c=n(170),l=n(171),h=n(173),p=a.createElement,f=a.createFactory,d=a.cloneElement,m=r,g=function(e){return e},x={Children:{map:o.map,forEach:o.forEach,count:o.count,toArray:o.toArray,only:h},Component:i.Component,PureComponent:i.PureComponent,createElement:p,cloneElement:d,isValidElement:a.isValidElement,PropTypes:u,createClass:l,createFactory:f,createMixin:g,DOM:s,version:c,__spread:m};e.exports=x},function(e,t){/*\n\tobject-assign\n\t(c) Sindre Sorhus\n\t@license MIT\n\t*/\n\"use strict\";function n(e){if(null===e||void 0===e)throw new TypeError(\"Object.assign cannot be called with null or undefined\");return Object(e)}function r(){try{if(!Object.assign)return!1;var e=new String(\"abc\");if(e[5]=\"de\",\"5\"===Object.getOwnPropertyNames(e)[0])return!1;for(var t={},n=0;n<10;n++)t[\"_\"+String.fromCharCode(n)]=n;var r=Object.getOwnPropertyNames(t).map(function(e){return t[e]});if(\"0123456789\"!==r.join(\"\"))return!1;var i={};return\"abcdefghijklmnopqrst\".split(\"\").forEach(function(e){i[e]=e}),\"abcdefghijklmnopqrst\"===Object.keys(Object.assign({},i)).join(\"\")}catch(e){return!1}}var i=Object.getOwnPropertySymbols,o=Object.prototype.hasOwnProperty,s=Object.prototype.propertyIsEnumerable;e.exports=r()?Object.assign:function(e,t){for(var r,a,u=n(e),c=1;c<arguments.length;c++){r=Object(arguments[c]);for(var l in r)o.call(r,l)&&(u[l]=r[l]);if(i){a=i(r);for(var h=0;h<a.length;h++)s.call(r,a[h])&&(u[a[h]]=r[a[h]])}}return u}},function(e,t,n){\"use strict\";function r(e,t,n){this.props=e,this.context=t,this.refs=c,this.updater=n||u}function i(e,t,n){this.props=e,this.context=t,this.refs=c,this.updater=n||u}function o(){}var s=n(148),a=n(146),u=n(149),c=(n(152),n(153));n(154),n(155);r.prototype.isReactComponent={},r.prototype.setState=function(e,t){\"object\"!=typeof e&&\"function\"!=typeof e&&null!=e?s(\"85\"):void 0,this.updater.enqueueSetState(this,e),t&&this.updater.enqueueCallback(this,t,\"setState\")},r.prototype.forceUpdate=function(e){this.updater.enqueueForceUpdate(this),e&&this.updater.enqueueCallback(this,e,\"forceUpdate\")};o.prototype=r.prototype,i.prototype=new o,i.prototype.constructor=i,a(i.prototype,r.prototype),i.prototype.isPureReactComponent=!0,e.exports={Component:r,PureComponent:i}},function(e,t){\"use strict\";function n(e){for(var t=arguments.length-1,n=\"Minified React error #\"+e+\"; visit http://facebook.github.io/react/docs/error-decoder.html?invariant=\"+e,r=0;r<t;r++)n+=\"&args[]=\"+encodeURIComponent(arguments[r+1]);n+=\" for the full message or use the non-minified dev environment for full errors and additional helpful warnings.\";var i=new Error(n);throw i.name=\"Invariant Violation\",i.framesToPop=1,i}e.exports=n},function(e,t,n){\"use strict\";function r(e,t){}var i=(n(150),{isMounted:function(e){return!1},enqueueCallback:function(e,t){},enqueueForceUpdate:function(e){r(e,\"forceUpdate\")},enqueueReplaceState:function(e,t){r(e,\"replaceState\")},enqueueSetState:function(e,t){r(e,\"setState\")}});e.exports=i},function(e,t,n){\"use strict\";var r=n(151),i=r;e.exports=i},function(e,t){\"use strict\";function n(e){return function(){return e}}var r=function(){};r.thatReturns=n,r.thatReturnsFalse=n(!1),r.thatReturnsTrue=n(!0),r.thatReturnsNull=n(null),r.thatReturnsThis=function(){return this},r.thatReturnsArgument=function(e){return e},e.exports=r},function(e,t,n){\"use strict\";var r=!1;e.exports=r},function(e,t,n){\"use strict\";var r={};e.exports=r},function(e,t,n){\"use strict\";function r(e,t,n,r,o,s,a,u){if(i(t),!e){var c;if(void 0===t)c=new Error(\"Minified exception occurred; use the non-minified dev environment for the full error message and additional helpful warnings.\");else{var l=[n,r,o,s,a,u],h=0;c=new Error(t.replace(/%s/g,function(){return l[h++]})),c.name=\"Invariant Violation\"}throw c.framesToPop=1,c}}var i=function(e){};e.exports=r},function(e,t,n){\"use strict\";var r=function(){};e.exports=r},function(e,t,n){\"use strict\";function r(e){return(\"\"+e).replace(b,\"$&/\")}function i(e,t){this.func=e,this.context=t,this.count=0}function o(e,t,n){var r=e.func,i=e.context;r.call(i,t,e.count++)}function s(e,t,n){if(null==e)return e;var r=i.getPooled(t,n);x(e,o,r),i.release(r)}function a(e,t,n,r){this.result=e,this.keyPrefix=t,this.func=n,this.context=r,this.count=0}function u(e,t,n){var i=e.result,o=e.keyPrefix,s=e.func,a=e.context,u=s.call(a,t,e.count++);Array.isArray(u)?c(u,i,n,g.thatReturnsArgument):null!=u&&(m.isValidElement(u)&&(u=m.cloneAndReplaceKey(u,o+(!u.key||t&&t.key===u.key?\"\":r(u.key)+\"/\")+n)),i.push(u))}function c(e,t,n,i,o){var s=\"\";null!=n&&(s=r(n)+\"/\");var c=a.getPooled(t,s,i,o);x(e,u,c),a.release(c)}function l(e,t,n){if(null==e)return e;var r=[];return c(e,r,null,t,n),r}function h(e,t,n){return null}function p(e,t){return x(e,h,null)}function f(e){var t=[];return c(e,t,null,g.thatReturnsArgument),t}var d=n(157),m=n(158),g=n(151),x=n(161),y=d.twoArgumentPooler,v=d.fourArgumentPooler,b=/\\/+/g;i.prototype.destructor=function(){this.func=null,this.context=null,this.count=0},d.addPoolingTo(i,y),a.prototype.destructor=function(){this.result=null,this.keyPrefix=null,this.func=null,this.context=null,this.count=0},d.addPoolingTo(a,v);var D={forEach:s,map:l,mapIntoWithKeyPrefixInternal:c,count:p,toArray:f};e.exports=D},function(e,t,n){\"use strict\";var r=n(148),i=(n(154),function(e){var t=this;if(t.instancePool.length){var n=t.instancePool.pop();return t.call(n,e),n}return new t(e)}),o=function(e,t){var n=this;if(n.instancePool.length){var r=n.instancePool.pop();return n.call(r,e,t),r}return new n(e,t)},s=function(e,t,n){var r=this;if(r.instancePool.length){var i=r.instancePool.pop();return r.call(i,e,t,n),i}return new r(e,t,n)},a=function(e,t,n,r){var i=this;if(i.instancePool.length){var o=i.instancePool.pop();return i.call(o,e,t,n,r),o}return new i(e,t,n,r)},u=function(e){var t=this;e instanceof t?void 0:r(\"25\"),e.destructor(),t.instancePool.length<t.poolSize&&t.instancePool.push(e)},c=10,l=i,h=function(e,t){var n=e;return n.instancePool=[],n.getPooled=t||l,n.poolSize||(n.poolSize=c),n.release=u,n},p={addPoolingTo:h,oneArgumentPooler:i,twoArgumentPooler:o,threeArgumentPooler:s,fourArgumentPooler:a};e.exports=p},function(e,t,n){\"use strict\";function r(e){return void 0!==e.ref}function i(e){return void 0!==e.key}var o=n(146),s=n(159),a=(n(150),n(152),Object.prototype.hasOwnProperty),u=n(160),c={key:!0,ref:!0,__self:!0,__source:!0},l=function(e,t,n,r,i,o,s){var a={$$typeof:u,type:e,key:t,ref:n,props:s,_owner:o};return a};l.createElement=function(e,t,n){var o,u={},h=null,p=null,f=null,d=null;if(null!=t){r(t)&&(p=t.ref),i(t)&&(h=\"\"+t.key),f=void 0===t.__self?null:t.__self,d=void 0===t.__source?null:t.__source;for(o in t)a.call(t,o)&&!c.hasOwnProperty(o)&&(u[o]=t[o])}var m=arguments.length-2;if(1===m)u.children=n;else if(m>1){for(var g=Array(m),x=0;x<m;x++)g[x]=arguments[x+2];u.children=g}if(e&&e.defaultProps){var y=e.defaultProps;for(o in y)void 0===u[o]&&(u[o]=y[o])}return l(e,h,p,f,d,s.current,u)},l.createFactory=function(e){var t=l.createElement.bind(null,e);return t.type=e,t},l.cloneAndReplaceKey=function(e,t){var n=l(e.type,t,e.ref,e._self,e._source,e._owner,e.props);return n},l.cloneElement=function(e,t,n){var u,h=o({},e.props),p=e.key,f=e.ref,d=e._self,m=e._source,g=e._owner;if(null!=t){r(t)&&(f=t.ref,g=s.current),i(t)&&(p=\"\"+t.key);var x;e.type&&e.type.defaultProps&&(x=e.type.defaultProps);for(u in t)a.call(t,u)&&!c.hasOwnProperty(u)&&(void 0===t[u]&&void 0!==x?h[u]=x[u]:h[u]=t[u])}var y=arguments.length-2;if(1===y)h.children=n;else if(y>1){for(var v=Array(y),b=0;b<y;b++)v[b]=arguments[b+2];h.children=v}return l(e.type,p,f,d,m,g,h)},l.isValidElement=function(e){return\"object\"==typeof e&&null!==e&&e.$$typeof===u},e.exports=l},function(e,t){\"use strict\";var n={current:null};e.exports=n},function(e,t){\"use strict\";var n=\"function\"==typeof Symbol&&Symbol.for&&Symbol.for(\"react.element\")||60103;e.exports=n},function(e,t,n){\"use strict\";function r(e,t){return e&&\"object\"==typeof e&&null!=e.key?c.escape(e.key):t.toString(36)}function i(e,t,n,o){var p=typeof e;if(\"undefined\"!==p&&\"boolean\"!==p||(e=null),null===e||\"string\"===p||\"number\"===p||\"object\"===p&&e.$$typeof===a)return n(o,e,\"\"===t?l+r(e,0):t),1;var f,d,m=0,g=\"\"===t?l:t+h;if(Array.isArray(e))for(var x=0;x<e.length;x++)f=e[x],d=g+r(f,x),m+=i(f,d,n,o);else{var y=u(e);if(y){var v,b=y.call(e);if(y!==e.entries)for(var D=0;!(v=b.next()).done;)f=v.value,d=g+r(f,D++),m+=i(f,d,n,o);else for(;!(v=b.next()).done;){var w=v.value;w&&(f=w[1],d=g+c.escape(w[0])+h+r(f,0),m+=i(f,d,n,o))}}else if(\"object\"===p){var E=\"\",k=String(e);s(\"31\",\"[object Object]\"===k?\"object with keys {\"+Object.keys(e).join(\", \")+\"}\":k,E)}}return m}function o(e,t,n){return null==e?0:i(e,\"\",t,n)}var s=n(148),a=(n(159),n(160)),u=n(162),c=(n(154),n(163)),l=(n(150),\".\"),h=\":\";e.exports=o},function(e,t){\"use strict\";function n(e){var t=e&&(r&&e[r]||e[i]);if(\"function\"==typeof t)return t}var r=\"function\"==typeof Symbol&&Symbol.iterator,i=\"@@iterator\";e.exports=n},function(e,t){\"use strict\";function n(e){var t=/[=:]/g,n={\"=\":\"=0\",\":\":\"=2\"},r=(\"\"+e).replace(t,function(e){return n[e]});return\"$\"+r}function r(e){var t=/(=0|=2)/g,n={\"=0\":\"=\",\"=2\":\":\"},r=\".\"===e[0]&&\"$\"===e[1]?e.substring(2):e.substring(1);return(\"\"+r).replace(t,function(e){return n[e]})}var i={escape:n,unescape:r};e.exports=i},function(e,t,n){\"use strict\";var r=n(158),i=r.createFactory,o={a:i(\"a\"),abbr:i(\"abbr\"),address:i(\"address\"),area:i(\"area\"),article:i(\"article\"),aside:i(\"aside\"),audio:i(\"audio\"),b:i(\"b\"),base:i(\"base\"),bdi:i(\"bdi\"),bdo:i(\"bdo\"),big:i(\"big\"),blockquote:i(\"blockquote\"),body:i(\"body\"),br:i(\"br\"),button:i(\"button\"),canvas:i(\"canvas\"),caption:i(\"caption\"),cite:i(\"cite\"),code:i(\"code\"),col:i(\"col\"),colgroup:i(\"colgroup\"),data:i(\"data\"),datalist:i(\"datalist\"),dd:i(\"dd\"),del:i(\"del\"),details:i(\"details\"),dfn:i(\"dfn\"),dialog:i(\"dialog\"),div:i(\"div\"),dl:i(\"dl\"),dt:i(\"dt\"),em:i(\"em\"),embed:i(\"embed\"),fieldset:i(\"fieldset\"),figcaption:i(\"figcaption\"),figure:i(\"figure\"),footer:i(\"footer\"),form:i(\"form\"),h1:i(\"h1\"),h2:i(\"h2\"),h3:i(\"h3\"),h4:i(\"h4\"),h5:i(\"h5\"),h6:i(\"h6\"),head:i(\"head\"),header:i(\"header\"),hgroup:i(\"hgroup\"),hr:i(\"hr\"),html:i(\"html\"),i:i(\"i\"),iframe:i(\"iframe\"),img:i(\"img\"),input:i(\"input\"),ins:i(\"ins\"),kbd:i(\"kbd\"),keygen:i(\"keygen\"),label:i(\"label\"),legend:i(\"legend\"),li:i(\"li\"),link:i(\"link\"),main:i(\"main\"),map:i(\"map\"),mark:i(\"mark\"),menu:i(\"menu\"),menuitem:i(\"menuitem\"),meta:i(\"meta\"),meter:i(\"meter\"),nav:i(\"nav\"),noscript:i(\"noscript\"),object:i(\"object\"),ol:i(\"ol\"),optgroup:i(\"optgroup\"),option:i(\"option\"),output:i(\"output\"),p:i(\"p\"),param:i(\"param\"),picture:i(\"picture\"),pre:i(\"pre\"),progress:i(\"progress\"),q:i(\"q\"),rp:i(\"rp\"),rt:i(\"rt\"),ruby:i(\"ruby\"),s:i(\"s\"),samp:i(\"samp\"),script:i(\"script\"),section:i(\"section\"),select:i(\"select\"),small:i(\"small\"),source:i(\"source\"),span:i(\"span\"),strong:i(\"strong\"),style:i(\"style\"),sub:i(\"sub\"),summary:i(\"summary\"),sup:i(\"sup\"),table:i(\"table\"),tbody:i(\"tbody\"),td:i(\"td\"),textarea:i(\"textarea\"),tfoot:i(\"tfoot\"),th:i(\"th\"),thead:i(\"thead\"),time:i(\"time\"),title:i(\"title\"),tr:i(\"tr\"),track:i(\"track\"),u:i(\"u\"),ul:i(\"ul\"),var:i(\"var\"),video:i(\"video\"),wbr:i(\"wbr\"),circle:i(\"circle\"),clipPath:i(\"clipPath\"),defs:i(\"defs\"),ellipse:i(\"ellipse\"),g:i(\"g\"),image:i(\"image\"),line:i(\"line\"),linearGradient:i(\"linearGradient\"),mask:i(\"mask\"),path:i(\"path\"),pattern:i(\"pattern\"),polygon:i(\"polygon\"),polyline:i(\"polyline\"),radialGradient:i(\"radialGradient\"),rect:i(\"rect\"),stop:i(\"stop\"),svg:i(\"svg\"),text:i(\"text\"),tspan:i(\"tspan\")};e.exports=o},function(e,t,n){\"use strict\";var r=n(158),i=r.isValidElement,o=n(166);e.exports=o(i)},function(e,t,n){\"use strict\";var r=n(167);e.exports=function(e){var t=!1;return r(e,t)}},function(e,t,n){\"use strict\";var r=n(151),i=n(154),o=n(150),s=n(168),a=n(169);e.exports=function(e,t){function n(e){var t=e&&(S&&e[S]||e[F]);if(\"function\"==typeof t)return t}function u(e,t){return e===t?0!==e||1/e===1/t:e!==e&&t!==t}function c(e){this.message=e,this.stack=\"\"}function l(e){function n(n,r,o,a,u,l,h){if(a=a||T,l=l||o,h!==s)if(t)i(!1,\"Calling PropTypes validators directly is not supported by the `prop-types` package. Use `PropTypes.checkPropTypes()` to call them. Read more at http://fb.me/use-check-prop-types\");else;return null==r[o]?n?new c(null===r[o]?\"The \"+u+\" `\"+l+\"` is marked as required \"+(\"in `\"+a+\"`, but its value is `null`.\"):\"The \"+u+\" `\"+l+\"` is marked as required in \"+(\"`\"+a+\"`, but its value is `undefined`.\")):null:e(r,o,a,u,l)}var r=n.bind(null,!1);return r.isRequired=n.bind(null,!0),r}function h(e){function t(t,n,r,i,o,s){var a=t[n],u=E(a);if(u!==e){var l=k(a);return new c(\"Invalid \"+i+\" `\"+o+\"` of type \"+(\"`\"+l+\"` supplied to `\"+r+\"`, expected \")+(\"`\"+e+\"`.\"))}return null}return l(t)}function p(){return l(r.thatReturnsNull)}function f(e){function t(t,n,r,i,o){if(\"function\"!=typeof e)return new c(\"Property `\"+o+\"` of component `\"+r+\"` has invalid PropType notation inside arrayOf.\");var a=t[n];if(!Array.isArray(a)){var u=E(a);return new c(\"Invalid \"+i+\" `\"+o+\"` of type \"+(\"`\"+u+\"` supplied to `\"+r+\"`, expected an array.\"))}for(var l=0;l<a.length;l++){var h=e(a,l,r,i,o+\"[\"+l+\"]\",s);if(h instanceof Error)return h}return null}return l(t)}function d(){function t(t,n,r,i,o){var s=t[n];if(!e(s)){var a=E(s);return new c(\"Invalid \"+i+\" `\"+o+\"` of type \"+(\"`\"+a+\"` supplied to `\"+r+\"`, expected a single ReactElement.\"))}return null}return l(t)}function m(e){function t(t,n,r,i,o){if(!(t[n]instanceof e)){var s=e.name||T,a=C(t[n]);return new c(\"Invalid \"+i+\" `\"+o+\"` of type \"+(\"`\"+a+\"` supplied to `\"+r+\"`, expected \")+(\"instance of `\"+s+\"`.\"))}return null}return l(t)}function g(e){function t(t,n,r,i,o){for(var s=t[n],a=0;a<e.length;a++)if(u(s,e[a]))return null;var l=JSON.stringify(e);return new c(\"Invalid \"+i+\" `\"+o+\"` of value `\"+s+\"` \"+(\"supplied to `\"+r+\"`, expected one of \"+l+\".\"))}return Array.isArray(e)?l(t):r.thatReturnsNull}function x(e){function t(t,n,r,i,o){if(\"function\"!=typeof e)return new c(\"Property `\"+o+\"` of component `\"+r+\"` has invalid PropType notation inside objectOf.\");var a=t[n],u=E(a);if(\"object\"!==u)return new c(\"Invalid \"+i+\" `\"+o+\"` of type \"+(\"`\"+u+\"` supplied to `\"+r+\"`, expected an object.\"));for(var l in a)if(a.hasOwnProperty(l)){var h=e(a,l,r,i,o+\".\"+l,s);if(h instanceof Error)return h}return null}return l(t)}function y(e){function t(t,n,r,i,o){for(var a=0;a<e.length;a++){var u=e[a];if(null==u(t,n,r,i,o,s))return null}return new c(\"Invalid \"+i+\" `\"+o+\"` supplied to \"+(\"`\"+r+\"`.\"))}if(!Array.isArray(e))return r.thatReturnsNull;for(var n=0;n<e.length;n++){var i=e[n];if(\"function\"!=typeof i)return o(!1,\"Invalid argument supplid to oneOfType. Expected an array of check functions, but received %s at index %s.\",A(i),n),r.thatReturnsNull}return l(t)}function v(){function e(e,t,n,r,i){return D(e[t])?null:new c(\"Invalid \"+r+\" `\"+i+\"` supplied to \"+(\"`\"+n+\"`, expected a ReactNode.\"))}return l(e)}function b(e){function t(t,n,r,i,o){var a=t[n],u=E(a);if(\"object\"!==u)return new c(\"Invalid \"+i+\" `\"+o+\"` of type `\"+u+\"` \"+(\"supplied to `\"+r+\"`, expected `object`.\"));for(var l in e){var h=e[l];if(h){var p=h(a,l,r,i,o+\".\"+l,s);if(p)return p}}return null}return l(t)}function D(t){switch(typeof t){case\"number\":case\"string\":case\"undefined\":return!0;case\"boolean\":return!t;case\"object\":if(Array.isArray(t))return t.every(D);if(null===t||e(t))return!0;var r=n(t);if(!r)return!1;var i,o=r.call(t);if(r!==t.entries){for(;!(i=o.next()).done;)if(!D(i.value))return!1}else for(;!(i=o.next()).done;){var s=i.value;if(s&&!D(s[1]))return!1}return!0;default:return!1}}function w(e,t){return\"symbol\"===e||(\"Symbol\"===t[\"@@toStringTag\"]||\"function\"==typeof Symbol&&t instanceof Symbol)}function E(e){var t=typeof e;return Array.isArray(e)?\"array\":e instanceof RegExp?\"object\":w(t,e)?\"symbol\":t}function k(e){if(\"undefined\"==typeof e||null===e)return\"\"+e;var t=E(e);if(\"object\"===t){if(e instanceof Date)return\"date\";if(e instanceof RegExp)return\"regexp\"}return t}function A(e){var t=k(e);switch(t){case\"array\":case\"object\":return\"an \"+t;case\"boolean\":case\"date\":case\"regexp\":return\"a \"+t;default:return t}}function C(e){return e.constructor&&e.constructor.name?e.constructor.name:T}var S=\"function\"==typeof Symbol&&Symbol.iterator,F=\"@@iterator\",T=\"<<anonymous>>\",B={array:h(\"array\"),bool:h(\"boolean\"),func:h(\"function\"),number:h(\"number\"),object:h(\"object\"),string:h(\"string\"),symbol:h(\"symbol\"),any:p(),arrayOf:f,element:d(),instanceOf:m,node:v(),objectOf:x,oneOf:g,oneOfType:y,shape:b};return c.prototype=Error.prototype,B.checkPropTypes=a,B.PropTypes=B,B}},function(e,t){\"use strict\";var n=\"SECRET_DO_NOT_PASS_THIS_OR_YOU_WILL_BE_FIRED\";e.exports=n},function(e,t,n){\"use strict\";function r(e,t,n,r,i){}e.exports=r},function(e,t){\"use strict\";e.exports=\"15.6.1\"},function(e,t,n){\"use strict\";var r=n(147),i=r.Component,o=n(158),s=o.isValidElement,a=n(149),u=n(172);e.exports=u(i,s,a)},function(e,t,n){\"use strict\";function r(e){return e}function i(e,t,n){function i(e,t){var n=y.hasOwnProperty(t)?y[t]:null;w.hasOwnProperty(t)&&u(\"OVERRIDE_BASE\"===n,\"ReactClassInterface: You are attempting to override `%s` from your class specification. Ensure that your method names do not overlap with React methods.\",t),e&&u(\"DEFINE_MANY\"===n||\"DEFINE_MANY_MERGED\"===n,\"ReactClassInterface: You are attempting to define `%s` on your component more than once. This conflict may be due to a mixin.\",t)}function o(e,n){if(n){u(\"function\"!=typeof n,\"ReactClass: You're attempting to use a component class or function as a mixin. Instead, just use a regular object.\"),u(!t(n),\"ReactClass: You're attempting to use a component as a mixin. Instead, just use a regular object.\");var r=e.prototype,o=r.__reactAutoBindPairs;n.hasOwnProperty(c)&&v.mixins(e,n.mixins);for(var s in n)if(n.hasOwnProperty(s)&&s!==c){var a=n[s],l=r.hasOwnProperty(s);if(i(l,s),v.hasOwnProperty(s))v[s](e,a);else{var h=y.hasOwnProperty(s),d=\"function\"==typeof a,m=d&&!h&&!l&&n.autobind!==!1;if(m)o.push(s,a),r[s]=a;else if(l){var g=y[s];u(h&&(\"DEFINE_MANY_MERGED\"===g||\"DEFINE_MANY\"===g),\"ReactClass: Unexpected spec policy %s for key %s when mixing in component specs.\",g,s),\"DEFINE_MANY_MERGED\"===g?r[s]=p(r[s],a):\"DEFINE_MANY\"===g&&(r[s]=f(r[s],a))}else r[s]=a}}}else;}function l(e,t){if(t)for(var n in t){var r=t[n];if(t.hasOwnProperty(n)){var i=n in v;u(!i,'ReactClass: You are attempting to define a reserved property, `%s`, that shouldn\\'t be on the \"statics\" key. Define it as an instance property instead; it will still be accessible on the constructor.',n);var o=n in e;u(!o,\"ReactClass: You are attempting to define `%s` on your component more than once. This conflict may be due to a mixin.\",n),e[n]=r}}}function h(e,t){u(e&&t&&\"object\"==typeof e&&\"object\"==typeof t,\"mergeIntoWithNoDuplicateKeys(): Cannot merge non-objects.\");for(var n in t)t.hasOwnProperty(n)&&(u(void 0===e[n],\"mergeIntoWithNoDuplicateKeys(): Tried to merge two objects with the same key: `%s`. This conflict may be due to a mixin; in particular, this may be caused by two getInitialState() or getDefaultProps() methods returning objects with clashing keys.\",n),e[n]=t[n]);return e}function p(e,t){return function(){var n=e.apply(this,arguments),r=t.apply(this,arguments);if(null==n)return r;if(null==r)return n;var i={};return h(i,n),h(i,r),i}}function f(e,t){return function(){e.apply(this,arguments),t.apply(this,arguments)}}function d(e,t){var n=t.bind(e);return n}function m(e){for(var t=e.__reactAutoBindPairs,n=0;n<t.length;n+=2){var r=t[n],i=t[n+1];e[r]=d(e,i)}}function g(e){var t=r(function(e,r,i){this.__reactAutoBindPairs.length&&m(this),this.props=e,this.context=r,this.refs=a,this.updater=i||n,this.state=null;var o=this.getInitialState?this.getInitialState():null;u(\"object\"==typeof o&&!Array.isArray(o),\"%s.getInitialState(): must return an object or null\",t.displayName||\"ReactCompositeComponent\"),this.state=o});t.prototype=new E,t.prototype.constructor=t,t.prototype.__reactAutoBindPairs=[],x.forEach(o.bind(null,t)),o(t,b),o(t,e),o(t,D),t.getDefaultProps&&(t.defaultProps=t.getDefaultProps()),u(t.prototype.render,\"createClass(...): Class specification must implement a `render` method.\");for(var i in y)t.prototype[i]||(t.prototype[i]=null);return t}var x=[],y={mixins:\"DEFINE_MANY\",statics:\"DEFINE_MANY\",propTypes:\"DEFINE_MANY\",contextTypes:\"DEFINE_MANY\",childContextTypes:\"DEFINE_MANY\",getDefaultProps:\"DEFINE_MANY_MERGED\",getInitialState:\"DEFINE_MANY_MERGED\",getChildContext:\"DEFINE_MANY_MERGED\",render:\"DEFINE_ONCE\",componentWillMount:\"DEFINE_MANY\",componentDidMount:\"DEFINE_MANY\",componentWillReceiveProps:\"DEFINE_MANY\",shouldComponentUpdate:\"DEFINE_ONCE\",componentWillUpdate:\"DEFINE_MANY\",componentDidUpdate:\"DEFINE_MANY\",componentWillUnmount:\"DEFINE_MANY\",updateComponent:\"OVERRIDE_BASE\"},v={displayName:function(e,t){e.displayName=t},mixins:function(e,t){if(t)for(var n=0;n<t.length;n++)o(e,t[n])},childContextTypes:function(e,t){e.childContextTypes=s({},e.childContextTypes,t)},contextTypes:function(e,t){e.contextTypes=s({},e.contextTypes,t)},getDefaultProps:function(e,t){e.getDefaultProps?e.getDefaultProps=p(e.getDefaultProps,t):e.getDefaultProps=t},propTypes:function(e,t){e.propTypes=s({},e.propTypes,t)},statics:function(e,t){l(e,t)},autobind:function(){}},b={componentDidMount:function(){this.__isMounted=!0}},D={componentWillUnmount:function(){this.__isMounted=!1}},w={replaceState:function(e,t){this.updater.enqueueReplaceState(this,e,t)},isMounted:function(){return!!this.__isMounted}},E=function(){};return s(E.prototype,e.prototype,w),g}var o,s=n(146),a=n(153),u=n(154),c=\"mixins\";o={},e.exports=i},function(e,t,n){\"use strict\";function r(e){return o.isValidElement(e)?void 0:i(\"143\"),e}var i=n(148),o=n(158);n(154);e.exports=r},function(e,t,n){var r=n(175);\"string\"==typeof r&&(r=[[e.id,r,\"\"]]);n(177)(r,{});r.locals&&(e.exports=r.locals)},function(e,t,n){t=e.exports=n(176)(),t.push([e.id,\"@charset \\\"UTF-8\\\";.swagger-ui html{box-sizing:border-box}.swagger-ui *,.swagger-ui :after,.swagger-ui :before{box-sizing:inherit}.swagger-ui body{margin:0;background:#fafafa}.swagger-ui .wrapper{width:100%;max-width:1460px;margin:0 auto;padding:0 20px}.swagger-ui .opblock-tag-section{display:-webkit-box;display:-ms-flexbox;display:flex;-webkit-box-orient:vertical;-webkit-box-direction:normal;-ms-flex-direction:column;flex-direction:column}.swagger-ui .opblock-tag{display:-webkit-box;display:-ms-flexbox;display:flex;padding:10px 20px 10px 10px;cursor:pointer;transition:all .2s;border-bottom:1px solid rgba(59,65,81,.3);-webkit-box-align:center;-ms-flex-align:center;align-items:center}.swagger-ui .opblock-tag:hover{background:rgba(0,0,0,.02)}.swagger-ui .opblock-tag{font-size:24px;margin:0 0 5px;font-family:Titillium Web,sans-serif;color:#3b4151}.swagger-ui .opblock-tag.no-desc span{-webkit-box-flex:1;-ms-flex:1;flex:1}.swagger-ui .opblock-tag svg{transition:all .4s}.swagger-ui .opblock-tag small{font-size:14px;font-weight:400;padding:0 10px;-webkit-box-flex:1;-ms-flex:1;flex:1;font-family:Open Sans,sans-serif;color:#3b4151}.swagger-ui .parаmeter__type{font-size:12px;padding:5px 0;font-family:Source Code Pro,monospace;font-weight:600;color:#3b4151}.swagger-ui .view-line-link{position:relative;top:3px;width:20px;margin:0 5px;cursor:pointer;transition:all .5s}.swagger-ui .opblock{margin:0 0 15px;border:1px solid #000;border-radius:4px;box-shadow:0 0 3px rgba(0,0,0,.19)}.swagger-ui .opblock.is-open .opblock-summary{border-bottom:1px solid #000}.swagger-ui .opblock .opblock-section-header{padding:8px 20px;background:hsla(0,0%,100%,.8);box-shadow:0 1px 2px rgba(0,0,0,.1)}.swagger-ui .opblock .opblock-section-header,.swagger-ui .opblock .opblock-section-header label{display:-webkit-box;display:-ms-flexbox;display:flex;-webkit-box-align:center;-ms-flex-align:center;align-items:center}.swagger-ui .opblock .opblock-section-header label{font-size:12px;font-weight:700;margin:0;font-family:Titillium Web,sans-serif;color:#3b4151}.swagger-ui .opblock .opblock-section-header label span{padding:0 10px 0 0}.swagger-ui .opblock .opblock-section-header h4{font-size:14px;margin:0;-webkit-box-flex:1;-ms-flex:1;flex:1;font-family:Titillium Web,sans-serif;color:#3b4151}.swagger-ui .opblock .opblock-summary-method{font-size:14px;font-weight:700;min-width:80px;padding:6px 15px;text-align:center;border-radius:3px;background:#000;text-shadow:0 1px 0 rgba(0,0,0,.1);font-family:Titillium Web,sans-serif;color:#fff}.swagger-ui .opblock .opblock-summary-operation-id,.swagger-ui .opblock .opblock-summary-path,.swagger-ui .opblock .opblock-summary-path__deprecated{font-size:16px;display:-webkit-box;display:-ms-flexbox;display:flex;padding:0 10px;font-family:Source Code Pro,monospace;font-weight:600;color:#3b4151;-webkit-box-align:center;-ms-flex-align:center;align-items:center}.swagger-ui .opblock .opblock-summary-operation-id .view-line-link,.swagger-ui .opblock .opblock-summary-path .view-line-link,.swagger-ui .opblock .opblock-summary-path__deprecated .view-line-link{position:relative;top:2px;width:0;margin:0;cursor:pointer;transition:all .5s}.swagger-ui .opblock .opblock-summary-operation-id:hover .view-line-link,.swagger-ui .opblock .opblock-summary-path:hover .view-line-link,.swagger-ui .opblock .opblock-summary-path__deprecated:hover .view-line-link{width:18px;margin:0 5px}.swagger-ui .opblock .opblock-summary-path__deprecated{text-decoration:line-through}.swagger-ui .opblock .opblock-summary-operation-id{font-size:14px}.swagger-ui .opblock .opblock-summary-description{font-size:13px;-webkit-box-flex:1;-ms-flex:1;flex:1;font-family:Open Sans,sans-serif;color:#3b4151}.swagger-ui .opblock .opblock-summary{display:-webkit-box;display:-ms-flexbox;display:flex;padding:5px;cursor:pointer;-webkit-box-align:center;-ms-flex-align:center;align-items:center}.swagger-ui .opblock.opblock-post{border-color:#49cc90;background:rgba(73,204,144,.1)}.swagger-ui .opblock.opblock-post .opblock-summary-method{background:#49cc90}.swagger-ui .opblock.opblock-post .opblock-summary{border-color:#49cc90}.swagger-ui .opblock.opblock-put{border-color:#fca130;background:rgba(252,161,48,.1)}.swagger-ui .opblock.opblock-put .opblock-summary-method{background:#fca130}.swagger-ui .opblock.opblock-put .opblock-summary{border-color:#fca130}.swagger-ui .opblock.opblock-delete{border-color:#f93e3e;background:rgba(249,62,62,.1)}.swagger-ui .opblock.opblock-delete .opblock-summary-method{background:#f93e3e}.swagger-ui .opblock.opblock-delete .opblock-summary{border-color:#f93e3e}.swagger-ui .opblock.opblock-get{border-color:#61affe;background:rgba(97,175,254,.1)}.swagger-ui .opblock.opblock-get .opblock-summary-method{background:#61affe}.swagger-ui .opblock.opblock-get .opblock-summary{border-color:#61affe}.swagger-ui .opblock.opblock-patch{border-color:#50e3c2;background:rgba(80,227,194,.1)}.swagger-ui .opblock.opblock-patch .opblock-summary-method{background:#50e3c2}.swagger-ui .opblock.opblock-patch .opblock-summary{border-color:#50e3c2}.swagger-ui .opblock.opblock-head{border-color:#9012fe;background:rgba(144,18,254,.1)}.swagger-ui .opblock.opblock-head .opblock-summary-method{background:#9012fe}.swagger-ui .opblock.opblock-head .opblock-summary{border-color:#9012fe}.swagger-ui .opblock.opblock-options{border-color:#0d5aa7;background:rgba(13,90,167,.1)}.swagger-ui .opblock.opblock-options .opblock-summary-method{background:#0d5aa7}.swagger-ui .opblock.opblock-options .opblock-summary{border-color:#0d5aa7}.swagger-ui .opblock.opblock-deprecated{opacity:.6;border-color:#ebebeb;background:hsla(0,0%,92%,.1)}.swagger-ui .opblock.opblock-deprecated .opblock-summary-method{background:#ebebeb}.swagger-ui .opblock.opblock-deprecated .opblock-summary{border-color:#ebebeb}.swagger-ui .opblock .opblock-schemes{padding:8px 20px}.swagger-ui .opblock .opblock-schemes .schemes-title{padding:0 10px 0 0}.swagger-ui .tab{display:-webkit-box;display:-ms-flexbox;display:flex;margin:20px 0 10px;padding:0;list-style:none}.swagger-ui .tab li{font-size:12px;min-width:100px;min-width:90px;padding:0;cursor:pointer;font-family:Titillium Web,sans-serif;color:#3b4151}.swagger-ui .tab li:first-of-type{position:relative;padding-left:0}.swagger-ui .tab li:first-of-type:after{position:absolute;top:0;right:6px;width:1px;height:100%;content:\\\"\\\";background:rgba(0,0,0,.2)}.swagger-ui .tab li.active{font-weight:700}.swagger-ui .opblock-description-wrapper,.swagger-ui .opblock-title_normal{padding:15px 20px}.swagger-ui .opblock-description-wrapper,.swagger-ui .opblock-description-wrapper h4,.swagger-ui .opblock-title_normal,.swagger-ui .opblock-title_normal h4{font-size:12px;margin:0 0 5px;font-family:Open Sans,sans-serif;color:#3b4151}.swagger-ui .opblock-description-wrapper p,.swagger-ui .opblock-title_normal p{font-size:14px;margin:0;font-family:Open Sans,sans-serif;color:#3b4151}.swagger-ui .execute-wrapper{padding:20px;text-align:right}.swagger-ui .execute-wrapper .btn{width:100%;padding:8px 40px}.swagger-ui .body-param-options{display:-webkit-box;display:-ms-flexbox;display:flex;-webkit-box-orient:vertical;-webkit-box-direction:normal;-ms-flex-direction:column;flex-direction:column}.swagger-ui .body-param-options .body-param-edit{padding:10px 0}.swagger-ui .body-param-options label{padding:8px 0}.swagger-ui .body-param-options label select{margin:3px 0 0}.swagger-ui .responses-inner{padding:20px}.swagger-ui .responses-inner h4,.swagger-ui .responses-inner h5{font-size:12px;margin:10px 0 5px;font-family:Open Sans,sans-serif;color:#3b4151}.swagger-ui .response-col_status{font-size:14px;font-family:Open Sans,sans-serif;color:#3b4151}.swagger-ui .response-col_status .response-undocumented{font-size:11px;font-family:Source Code Pro,monospace;font-weight:600;color:#999}.swagger-ui .response-col_description__inner span{font-size:12px;font-style:italic;display:block;margin:10px 0;padding:10px;border-radius:4px;background:#41444e;font-family:Source Code Pro,monospace;font-weight:600;color:#fff}.swagger-ui .response-col_description__inner span p{margin:0}.swagger-ui .opblock-body pre{font-size:12px;margin:0;padding:10px;word-wrap:break-word;word-break:break-all;word-break:break-word;-webkit-hyphens:auto;-ms-hyphens:auto;hyphens:auto;white-space:pre-wrap;border-radius:4px;background:#41444e;overflow-wrap:break-word;font-family:Source Code Pro,monospace;font-weight:600;color:#fff}.swagger-ui .opblock-body pre span{color:#fff!important}.swagger-ui .opblock-body pre .headerline{display:block}.swagger-ui .scheme-container{margin:0 0 20px;padding:30px 0;background:#fff;box-shadow:0 1px 2px 0 rgba(0,0,0,.15)}.swagger-ui .scheme-container .schemes{display:-webkit-box;display:-ms-flexbox;display:flex;-webkit-box-align:center;-ms-flex-align:center;align-items:center}.swagger-ui .scheme-container .schemes>label{font-size:12px;font-weight:700;display:-webkit-box;display:-ms-flexbox;display:flex;-webkit-box-orient:vertical;-webkit-box-direction:normal;-ms-flex-direction:column;flex-direction:column;margin:-20px 15px 0 0;font-family:Titillium Web,sans-serif;color:#3b4151}.swagger-ui .scheme-container .schemes>label select{min-width:130px;text-transform:uppercase}.swagger-ui .loading-container{padding:40px 0 60px}.swagger-ui .loading-container .loading{position:relative}.swagger-ui .loading-container .loading:after{font-size:10px;font-weight:700;position:absolute;top:50%;left:50%;content:\\\"loading\\\";-webkit-transform:translate(-50%,-50%);transform:translate(-50%,-50%);text-transform:uppercase;font-family:Titillium Web,sans-serif;color:#3b4151}.swagger-ui .loading-container .loading:before{position:absolute;top:50%;left:50%;display:block;width:60px;height:60px;margin:-30px;content:\\\"\\\";-webkit-animation:rotation 1s infinite linear,opacity .5s;animation:rotation 1s infinite linear,opacity .5s;opacity:1;border:2px solid rgba(85,85,85,.1);border-top-color:rgba(0,0,0,.6);border-radius:100%;-webkit-backface-visibility:hidden;backface-visibility:hidden}@-webkit-keyframes rotation{to{-webkit-transform:rotate(1turn);transform:rotate(1turn)}}@keyframes rotation{to{-webkit-transform:rotate(1turn);transform:rotate(1turn)}}@-webkit-keyframes blinker{50%{opacity:0}}@keyframes blinker{50%{opacity:0}}.swagger-ui .btn{font-size:14px;font-weight:700;padding:5px 23px;transition:all .3s;border:2px solid #888;border-radius:4px;background:transparent;box-shadow:0 1px 2px rgba(0,0,0,.1);font-family:Titillium Web,sans-serif;color:#3b4151}.swagger-ui .btn[disabled]{cursor:not-allowed;opacity:.3}.swagger-ui .btn:hover{box-shadow:0 0 5px rgba(0,0,0,.3)}.swagger-ui .btn.cancel{border-color:#ff6060;font-family:Titillium Web,sans-serif;color:#ff6060}.swagger-ui .btn.authorize{line-height:1;display:inline;color:#49cc90;border-color:#49cc90}.swagger-ui .btn.authorize span{float:left;padding:4px 20px 0 0}.swagger-ui .btn.authorize svg{fill:#49cc90}.swagger-ui .btn.execute{-webkit-animation:swagger-ui-pulse 2s infinite;animation:swagger-ui-pulse 2s infinite;color:#fff;border-color:#4990e2}@-webkit-keyframes swagger-ui-pulse{0%{color:#fff;background:#4990e2;box-shadow:0 0 0 0 rgba(73,144,226,.8)}70%{box-shadow:0 0 0 5px rgba(73,144,226,0)}to{color:#fff;background:#4990e2;box-shadow:0 0 0 0 rgba(73,144,226,0)}}@keyframes swagger-ui-pulse{0%{color:#fff;background:#4990e2;box-shadow:0 0 0 0 rgba(73,144,226,.8)}70%{box-shadow:0 0 0 5px rgba(73,144,226,0)}to{color:#fff;background:#4990e2;box-shadow:0 0 0 0 rgba(73,144,226,0)}}.swagger-ui .btn-group{display:-webkit-box;display:-ms-flexbox;display:flex;padding:30px}.swagger-ui .btn-group .btn{-webkit-box-flex:1;-ms-flex:1;flex:1}.swagger-ui .btn-group .btn:first-child{border-radius:4px 0 0 4px}.swagger-ui .btn-group .btn:last-child{border-radius:0 4px 4px 0}.swagger-ui .authorization__btn{padding:0 10px;border:none;background:none}.swagger-ui .authorization__btn.locked{opacity:1}.swagger-ui .authorization__btn.unlocked{opacity:.4}.swagger-ui .expand-methods,.swagger-ui .expand-operation{border:none;background:none}.swagger-ui .expand-methods svg,.swagger-ui .expand-operation svg{width:20px;height:20px}.swagger-ui .expand-methods{padding:0 10px}.swagger-ui .expand-methods:hover svg{fill:#444}.swagger-ui .expand-methods svg{transition:all .3s;fill:#777}.swagger-ui button{cursor:pointer;outline:none}.swagger-ui select{font-size:14px;font-weight:700;padding:5px 40px 5px 10px;border:2px solid #41444e;border-radius:4px;background:#f7f7f7 url(data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHZpZXdCb3g9IjAgMCAyMCAyMCI+ICAgIDxwYXRoIGQ9Ik0xMy40MTggNy44NTljLjI3MS0uMjY4LjcwOS0uMjY4Ljk3OCAwIC4yNy4yNjguMjcyLjcwMSAwIC45NjlsLTMuOTA4IDMuODNjLS4yNy4yNjgtLjcwNy4yNjgtLjk3OSAwbC0zLjkwOC0zLjgzYy0uMjctLjI2Ny0uMjctLjcwMSAwLS45NjkuMjcxLS4yNjguNzA5LS4yNjguOTc4IDBMMTAgMTFsMy40MTgtMy4xNDF6Ii8+PC9zdmc+) right 10px center no-repeat;background-size:20px;box-shadow:0 1px 2px 0 rgba(0,0,0,.25);font-family:Titillium Web,sans-serif;color:#3b4151;-webkit-appearance:none;-moz-appearance:none;appearance:none}.swagger-ui select[multiple]{margin:5px 0;padding:5px;background:#f7f7f7}.swagger-ui .opblock-body select{min-width:230px}.swagger-ui label{font-size:12px;font-weight:700;margin:0 0 5px;font-family:Titillium Web,sans-serif;color:#3b4151}.swagger-ui input[type=email],.swagger-ui input[type=password],.swagger-ui input[type=search],.swagger-ui input[type=text]{min-width:100px;margin:5px 0;padding:8px 10px;border:1px solid #d9d9d9;border-radius:4px;background:#fff}.swagger-ui input[type=email].invalid,.swagger-ui input[type=password].invalid,.swagger-ui input[type=search].invalid,.swagger-ui input[type=text].invalid{-webkit-animation:shake .4s 1;animation:shake .4s 1;border-color:#f93e3e;background:#feebeb}@-webkit-keyframes shake{10%,90%{-webkit-transform:translate3d(-1px,0,0);transform:translate3d(-1px,0,0)}20%,80%{-webkit-transform:translate3d(2px,0,0);transform:translate3d(2px,0,0)}30%,50%,70%{-webkit-transform:translate3d(-4px,0,0);transform:translate3d(-4px,0,0)}40%,60%{-webkit-transform:translate3d(4px,0,0);transform:translate3d(4px,0,0)}}@keyframes shake{10%,90%{-webkit-transform:translate3d(-1px,0,0);transform:translate3d(-1px,0,0)}20%,80%{-webkit-transform:translate3d(2px,0,0);transform:translate3d(2px,0,0)}30%,50%,70%{-webkit-transform:translate3d(-4px,0,0);transform:translate3d(-4px,0,0)}40%,60%{-webkit-transform:translate3d(4px,0,0);transform:translate3d(4px,0,0)}}.swagger-ui textarea{font-size:12px;width:100%;min-height:280px;padding:10px;border:none;border-radius:4px;outline:none;background:hsla(0,0%,100%,.8);font-family:Source Code Pro,monospace;font-weight:600;color:#3b4151}.swagger-ui textarea:focus{border:2px solid #61affe}.swagger-ui textarea.curl{font-size:12px;min-height:100px;margin:0;padding:10px;resize:none;border-radius:4px;background:#41444e;font-family:Source Code Pro,monospace;font-weight:600;color:#fff}.swagger-ui .checkbox{padding:5px 0 10px;transition:opacity .5s;color:#333}.swagger-ui .checkbox label{display:-webkit-box;display:-ms-flexbox;display:flex}.swagger-ui .checkbox p{font-weight:400!important;font-style:italic;margin:0!important;font-family:Source Code Pro,monospace;font-weight:600;color:#3b4151}.swagger-ui .checkbox input[type=checkbox]{display:none}.swagger-ui .checkbox input[type=checkbox]+label>.item{position:relative;top:3px;display:inline-block;width:16px;height:16px;margin:0 8px 0 0;padding:5px;cursor:pointer;border-radius:1px;background:#e8e8e8;box-shadow:0 0 0 2px #e8e8e8;-webkit-box-flex:0;-ms-flex:none;flex:none}.swagger-ui .checkbox input[type=checkbox]+label>.item:active{-webkit-transform:scale(.9);transform:scale(.9)}.swagger-ui .checkbox input[type=checkbox]:checked+label>.item{background:#e8e8e8 url(\\\"data:image/svg+xml;charset=utf-8,%3Csvg width='10' height='8' viewBox='3 7 10 8' xmlns='http://www.w3.org/2000/svg'%3E%3Cpath fill='%2341474E' fill-rule='evenodd' d='M6.333 15L3 11.667l1.333-1.334 2 2L11.667 7 13 8.333z'/%3E%3C/svg%3E\\\") 50% no-repeat}.swagger-ui .dialog-ux{position:fixed;z-index:9999;top:0;right:0;bottom:0;left:0}.swagger-ui .dialog-ux .backdrop-ux{position:fixed;top:0;right:0;bottom:0;left:0;background:rgba(0,0,0,.8)}.swagger-ui .dialog-ux .modal-ux{position:absolute;z-index:9999;top:50%;left:50%;width:100%;min-width:300px;max-width:650px;-webkit-transform:translate(-50%,-50%);transform:translate(-50%,-50%);border:1px solid #ebebeb;border-radius:4px;background:#fff;box-shadow:0 10px 30px 0 rgba(0,0,0,.2)}.swagger-ui .dialog-ux .modal-ux-content{overflow-y:auto;max-height:540px;padding:20px}.swagger-ui .dialog-ux .modal-ux-content p{font-size:12px;margin:0 0 5px;color:#41444e;font-family:Open Sans,sans-serif;color:#3b4151}.swagger-ui .dialog-ux .modal-ux-content h4{font-size:18px;font-weight:600;margin:15px 0 0;font-family:Titillium Web,sans-serif;color:#3b4151}.swagger-ui .dialog-ux .modal-ux-header{display:-webkit-box;display:-ms-flexbox;display:flex;padding:12px 0;border-bottom:1px solid #ebebeb;-webkit-box-align:center;-ms-flex-align:center;align-items:center}.swagger-ui .dialog-ux .modal-ux-header .close-modal{padding:0 10px;border:none;background:none;-webkit-appearance:none;-moz-appearance:none;appearance:none}.swagger-ui .dialog-ux .modal-ux-header h3{font-size:20px;font-weight:600;margin:0;padding:0 20px;-webkit-box-flex:1;-ms-flex:1;flex:1;font-family:Titillium Web,sans-serif;color:#3b4151}.swagger-ui .model{font-size:12px;font-weight:300;font-family:Source Code Pro,monospace;font-weight:600;color:#3b4151}.swagger-ui .model-toggle{font-size:10px;position:relative;top:6px;display:inline-block;margin:auto .3em;cursor:pointer;transition:-webkit-transform .15s ease-in;transition:transform .15s ease-in;transition:transform .15s ease-in,-webkit-transform .15s ease-in;-webkit-transform:rotate(90deg);transform:rotate(90deg);-webkit-transform-origin:50% 50%;transform-origin:50% 50%}.swagger-ui .model-toggle.collapsed{-webkit-transform:rotate(0deg);transform:rotate(0deg)}.swagger-ui .model-toggle:after{display:block;width:20px;height:20px;content:\\\"\\\";background:url(\\\"data:image/svg+xml;charset=utf-8,%3Csvg xmlns='http://www.w3.org/2000/svg' width='24' height='24' viewBox='0 0 24 24'%3E%3Cpath d='M10 6L8.59 7.41 13.17 12l-4.58 4.59L10 18l6-6z'/%3E%3C/svg%3E\\\") 50% no-repeat;background-size:100%}.swagger-ui .model-jump-to-path{position:relative;cursor:pointer}.swagger-ui .model-jump-to-path .view-line-link{position:absolute;top:-.4em;cursor:pointer}.swagger-ui .model-title{position:relative}.swagger-ui .model-title:hover .model-hint{visibility:visible}.swagger-ui .model-hint{position:absolute;top:-1.8em;visibility:hidden;padding:.1em .5em;white-space:nowrap;color:#ebebeb;border-radius:4px;background:rgba(0,0,0,.7)}.swagger-ui section.models{margin:30px 0;border:1px solid rgba(59,65,81,.3);border-radius:4px}.swagger-ui section.models.is-open{padding:0 0 20px}.swagger-ui section.models.is-open h4{margin:0 0 5px;border-bottom:1px solid rgba(59,65,81,.3)}.swagger-ui section.models.is-open h4 svg{-webkit-transform:rotate(90deg);transform:rotate(90deg)}.swagger-ui section.models h4{font-size:16px;display:-webkit-box;display:-ms-flexbox;display:flex;margin:0;padding:10px 20px 10px 10px;cursor:pointer;transition:all .2s;font-family:Titillium Web,sans-serif;color:#777;-webkit-box-align:center;-ms-flex-align:center;align-items:center}.swagger-ui section.models h4 svg{transition:all .4s}.swagger-ui section.models h4 span{-webkit-box-flex:1;-ms-flex:1;flex:1}.swagger-ui section.models h4:hover{background:rgba(0,0,0,.02)}.swagger-ui section.models h5{font-size:16px;margin:0 0 10px;font-family:Titillium Web,sans-serif;color:#777}.swagger-ui section.models .model-jump-to-path{position:relative;top:5px}.swagger-ui section.models .model-container{margin:0 20px 15px;transition:all .5s;border-radius:4px;background:rgba(0,0,0,.05)}.swagger-ui section.models .model-container:hover{background:rgba(0,0,0,.07)}.swagger-ui section.models .model-container:first-of-type{margin:20px}.swagger-ui section.models .model-container:last-of-type{margin:0 20px}.swagger-ui section.models .model-box{background:none}.swagger-ui .model-box{padding:10px;border-radius:4px;background:rgba(0,0,0,.1)}.swagger-ui .model-box .model-jump-to-path{position:relative;top:4px}.swagger-ui .model-title{font-size:16px;font-family:Titillium Web,sans-serif;color:#555}.swagger-ui span>span.model,.swagger-ui span>span.model .brace-close{padding:0 0 0 10px}.swagger-ui .prop-type{color:#55a}.swagger-ui .prop-enum{display:block}.swagger-ui .prop-format{color:#999}.swagger-ui table{width:100%;padding:0 10px;border-collapse:collapse}.swagger-ui table.model tbody tr td{padding:0;vertical-align:top}.swagger-ui table.model tbody tr td:first-of-type{width:100px;padding:0}.swagger-ui table.headers td{font-size:12px;font-weight:300;vertical-align:middle;font-family:Source Code Pro,monospace;font-weight:600;color:#3b4151}.swagger-ui table tbody tr td{padding:10px 0 0;vertical-align:top}.swagger-ui table tbody tr td:first-of-type{width:20%;padding:10px 0}.swagger-ui table thead tr td,.swagger-ui table thead tr th{font-size:12px;font-weight:700;padding:12px 0;text-align:left;border-bottom:1px solid rgba(59,65,81,.2);font-family:Open Sans,sans-serif;color:#3b4151}.swagger-ui .parameters-col_description p{font-size:14px;margin:0;font-family:Open Sans,sans-serif;color:#3b4151}.swagger-ui .parameters-col_description input[type=text]{width:100%;max-width:340px}.swagger-ui .parameter__name{font-size:16px;font-weight:400;font-family:Titillium Web,sans-serif;color:#3b4151}.swagger-ui .parameter__name.required{font-weight:700}.swagger-ui .parameter__name.required:after{font-size:10px;position:relative;top:-6px;padding:5px;content:\\\"required\\\";color:rgba(255,0,0,.6)}.swagger-ui .parameter__in{font-size:12px;font-style:italic;font-family:Source Code Pro,monospace;font-weight:600;color:#888}.swagger-ui .table-container{padding:20px}.swagger-ui .topbar{padding:8px 30px;background-color:#89bf04}.swagger-ui .topbar .topbar-wrapper{-ms-flex-align:center}.swagger-ui .topbar .topbar-wrapper,.swagger-ui .topbar a{display:-webkit-box;display:-ms-flexbox;display:flex;-webkit-box-align:center;align-items:center}.swagger-ui .topbar a{font-size:1.5em;font-weight:700;max-width:300px;text-decoration:none;-webkit-box-flex:1;-ms-flex:1;flex:1;-ms-flex-align:center;font-family:Titillium Web,sans-serif;color:#fff}.swagger-ui .topbar a span{margin:0;padding:0 10px}.swagger-ui .topbar .download-url-wrapper{display:-webkit-box;display:-ms-flexbox;display:flex;-webkit-box-flex:3;-ms-flex:3;flex:3}.swagger-ui .topbar .download-url-wrapper input[type=text]{width:100%;min-width:350px;margin:0;border:2px solid #547f00;border-radius:4px 0 0 4px;outline:none}.swagger-ui .topbar .download-url-wrapper .download-url-button{font-size:16px;font-weight:700;padding:4px 40px;border:none;border-radius:0 4px 4px 0;background:#547f00;font-family:Titillium Web,sans-serif;color:#fff}.swagger-ui .info{margin:50px 0}.swagger-ui .info hgroup.main{margin:0 0 20px}.swagger-ui .info hgroup.main a{font-size:12px}.swagger-ui .info li,.swagger-ui .info p,.swagger-ui .info table{font-size:14px;font-family:Open Sans,sans-serif;color:#3b4151}.swagger-ui .info h1,.swagger-ui .info h2,.swagger-ui .info h3,.swagger-ui .info h4,.swagger-ui .info h5{font-family:Open Sans,sans-serif;color:#3b4151}.swagger-ui .info code{padding:3px 5px;border-radius:4px;background:rgba(0,0,0,.05);font-family:Source Code Pro,monospace;font-weight:600;color:#9012fe}.swagger-ui .info a{font-size:14px;transition:all .4s;font-family:Open Sans,sans-serif;color:#4990e2}.swagger-ui .info a:hover{color:#1f69c0}.swagger-ui .info>div{margin:0 0 5px}.swagger-ui .info .base-url{font-size:12px;font-weight:300!important;margin:0;font-family:Source Code Pro,monospace;font-weight:600;color:#3b4151}.swagger-ui .info .title{font-size:36px;margin:0;font-family:Open Sans,sans-serif;color:#3b4151}.swagger-ui .info .title small{font-size:10px;position:relative;top:-5px;display:inline-block;margin:0 0 0 5px;padding:2px 4px;vertical-align:super;border-radius:57px;background:#7d8492}.swagger-ui .info .title small pre{margin:0;font-family:Titillium Web,sans-serif;color:#fff}.swagger-ui .auth-btn-wrapper{display:-webkit-box;display:-ms-flexbox;display:flex;padding:10px 0;-webkit-box-pack:center;-ms-flex-pack:center;justify-content:center}.swagger-ui .auth-wrapper{display:-webkit-box;display:-ms-flexbox;display:flex;-webkit-box-flex:1;-ms-flex:1;flex:1;-webkit-box-pack:end;-ms-flex-pack:end;justify-content:flex-end}.swagger-ui .auth-wrapper .authorize{padding-right:20px}.swagger-ui .auth-container{margin:0 0 10px;padding:10px 20px;border-bottom:1px solid #ebebeb}.swagger-ui .auth-container:last-of-type{margin:0;padding:10px 20px;border:0}.swagger-ui .auth-container h4{margin:5px 0 15px!important}.swagger-ui .auth-container .wrapper{margin:0;padding:0}.swagger-ui .auth-container input[type=password],.swagger-ui .auth-container input[type=text]{min-width:230px}.swagger-ui .auth-container .errors{font-size:12px;padding:10px;border-radius:4px;font-family:Source Code Pro,monospace;font-weight:600;color:#3b4151}.swagger-ui .scopes h2{font-size:14px;font-family:Titillium Web,sans-serif;color:#3b4151}.swagger-ui .scope-def{padding:0 0 20px}.swagger-ui .errors-wrapper{margin:20px;padding:10px 20px;-webkit-animation:scaleUp .5s;animation:scaleUp .5s;border:2px solid #f93e3e;border-radius:4px;background:rgba(249,62,62,.1)}.swagger-ui .errors-wrapper .error-wrapper{margin:0 0 10px}.swagger-ui .errors-wrapper .errors h4{font-size:14px;margin:0;font-family:Source Code Pro,monospace;font-weight:600;color:#3b4151}.swagger-ui .errors-wrapper .errors small{color:#666}.swagger-ui .errors-wrapper hgroup{display:-webkit-box;display:-ms-flexbox;display:flex;-webkit-box-align:center;-ms-flex-align:center;align-items:center}.swagger-ui .errors-wrapper hgroup h4{font-size:20px;margin:0;-webkit-box-flex:1;-ms-flex:1;flex:1;font-family:Titillium Web,sans-serif;color:#3b4151}@-webkit-keyframes scaleUp{0%{-webkit-transform:scale(.8);transform:scale(.8);opacity:0}to{-webkit-transform:scale(1);transform:scale(1);opacity:1}}@keyframes scaleUp{0%{-webkit-transform:scale(.8);transform:scale(.8);opacity:0}to{-webkit-transform:scale(1);transform:scale(1);opacity:1}}\",\"\"]);\n},function(e,t){e.exports=function(){var e=[];return e.toString=function(){for(var e=[],t=0;t<this.length;t++){var n=this[t];n[2]?e.push(\"@media \"+n[2]+\"{\"+n[1]+\"}\"):e.push(n[1])}return e.join(\"\")},e.i=function(t,n){\"string\"==typeof t&&(t=[[null,t,\"\"]]);for(var r={},i=0;i<this.length;i++){var o=this[i][0];\"number\"==typeof o&&(r[o]=!0)}for(i=0;i<t.length;i++){var s=t[i];\"number\"==typeof s[0]&&r[s[0]]||(n&&!s[2]?s[2]=n:n&&(s[2]=\"(\"+s[2]+\") and (\"+n+\")\"),e.push(s))}},e}},function(e,t,n){function r(e,t){for(var n=0;n<e.length;n++){var r=e[n],i=f[r.id];if(i){i.refs++;for(var o=0;o<i.parts.length;o++)i.parts[o](r.parts[o]);for(;o<r.parts.length;o++)i.parts.push(c(r.parts[o],t))}else{for(var s=[],o=0;o<r.parts.length;o++)s.push(c(r.parts[o],t));f[r.id]={id:r.id,refs:1,parts:s}}}}function i(e){for(var t=[],n={},r=0;r<e.length;r++){var i=e[r],o=i[0],s=i[1],a=i[2],u=i[3],c={css:s,media:a,sourceMap:u};n[o]?n[o].parts.push(c):t.push(n[o]={id:o,parts:[c]})}return t}function o(e,t){var n=g(),r=v[v.length-1];if(\"top\"===e.insertAt)r?r.nextSibling?n.insertBefore(t,r.nextSibling):n.appendChild(t):n.insertBefore(t,n.firstChild),v.push(t);else{if(\"bottom\"!==e.insertAt)throw new Error(\"Invalid value for parameter 'insertAt'. Must be 'top' or 'bottom'.\");n.appendChild(t)}}function s(e){e.parentNode.removeChild(e);var t=v.indexOf(e);t>=0&&v.splice(t,1)}function a(e){var t=document.createElement(\"style\");return t.type=\"text/css\",o(e,t),t}function u(e){var t=document.createElement(\"link\");return t.rel=\"stylesheet\",o(e,t),t}function c(e,t){var n,r,i;if(t.singleton){var o=y++;n=x||(x=a(t)),r=l.bind(null,n,o,!1),i=l.bind(null,n,o,!0)}else e.sourceMap&&\"function\"==typeof URL&&\"function\"==typeof URL.createObjectURL&&\"function\"==typeof URL.revokeObjectURL&&\"function\"==typeof Blob&&\"function\"==typeof btoa?(n=u(t),r=p.bind(null,n),i=function(){s(n),n.href&&URL.revokeObjectURL(n.href)}):(n=a(t),r=h.bind(null,n),i=function(){s(n)});return r(e),function(t){if(t){if(t.css===e.css&&t.media===e.media&&t.sourceMap===e.sourceMap)return;r(e=t)}else i()}}function l(e,t,n,r){var i=n?\"\":r.css;if(e.styleSheet)e.styleSheet.cssText=b(t,i);else{var o=document.createTextNode(i),s=e.childNodes;s[t]&&e.removeChild(s[t]),s.length?e.insertBefore(o,s[t]):e.appendChild(o)}}function h(e,t){var n=t.css,r=t.media;t.sourceMap;if(r&&e.setAttribute(\"media\",r),e.styleSheet)e.styleSheet.cssText=n;else{for(;e.firstChild;)e.removeChild(e.firstChild);e.appendChild(document.createTextNode(n))}}function p(e,t){var n=t.css,r=(t.media,t.sourceMap);r&&(n+=\"\\n/*# sourceMappingURL=data:application/json;base64,\"+btoa(unescape(encodeURIComponent(JSON.stringify(r))))+\" */\");var i=new Blob([n],{type:\"text/css\"}),o=e.href;e.href=URL.createObjectURL(i),o&&URL.revokeObjectURL(o)}var f={},d=function(e){var t;return function(){return\"undefined\"==typeof t&&(t=e.apply(this,arguments)),t}},m=d(function(){return/msie [6-9]\\b/.test(window.navigator.userAgent.toLowerCase())}),g=d(function(){return document.head||document.getElementsByTagName(\"head\")[0]}),x=null,y=0,v=[];e.exports=function(e,t){t=t||{},\"undefined\"==typeof t.singleton&&(t.singleton=m()),\"undefined\"==typeof t.insertAt&&(t.insertAt=\"bottom\");var n=i(e);return r(n,t),function(e){for(var o=[],s=0;s<n.length;s++){var a=n[s],u=f[a.id];u.refs--,o.push(u)}if(e){var c=i(e);r(c,t)}for(var s=0;s<o.length;s++){var u=o[s];if(0===u.refs){for(var l=0;l<u.parts.length;l++)u.parts[l]();delete f[u.id]}}}};var b=function(){var e=[];return function(t,n){return e[t]=n,e.filter(Boolean).join(\"\\n\")}}()},function(e,t,n){\"use strict\";function r(e){return e&&e.__esModule?e:{default:e}}Object.defineProperty(t,\"__esModule\",{value:!0}),t.default=function(){return{components:{Topbar:o.default}}};var i=n(179),o=r(i)},function(e,t,n){\"use strict\";function r(e){return e&&e.__esModule?e:{default:e}}Object.defineProperty(t,\"__esModule\",{value:!0});var i=n(58),o=r(i),s=n(84),a=r(s),u=n(85),c=r(u),l=n(89),h=r(l),p=n(136),f=r(p),d=n(144),m=r(d),g=n(180),x=r(g),y=function(e){function t(e,n){(0,a.default)(this,t);var r=(0,h.default)(this,(t.__proto__||(0,o.default)(t)).call(this,e,n));return r.onUrlChange=function(e){var t=e.target.value;r.setState({url:t})},r.downloadUrl=function(e){r.props.specActions.updateUrl(r.state.url),r.props.specActions.download(r.state.url),e.preventDefault()},r.state={url:e.specSelectors.url()},r}return(0,f.default)(t,e),(0,c.default)(t,[{key:\"componentWillReceiveProps\",value:function(e){this.setState({url:e.specSelectors.url()})}},{key:\"render\",value:function(){var e=this.props,t=e.getComponent,n=e.specSelectors,r=t(\"Button\"),i=t(\"Link\"),o=\"loading\"===n.loadingStatus(),s=\"failed\"===n.loadingStatus(),a={};return s&&(a.color=\"red\"),o&&(a.color=\"#aaa\"),m.default.createElement(\"div\",{className:\"topbar\"},m.default.createElement(\"div\",{className:\"wrapper\"},m.default.createElement(\"div\",{className:\"topbar-wrapper\"},m.default.createElement(i,{href:\"#\",title:\"Swagger UX\"},m.default.createElement(\"img\",{height:\"30\",width:\"30\",src:x.default,alt:\"Swagger UX\"}),m.default.createElement(\"span\",null,\"swagger\")),m.default.createElement(\"form\",{className:\"download-url-wrapper\",onSubmit:this.downloadUrl},m.default.createElement(\"input\",{className:\"download-url-input\",type:\"text\",onChange:this.onUrlChange,value:this.state.url,disabled:o,style:a}),m.default.createElement(r,{className:\"download-url-button\",onClick:this.downloadUrl},\"Explore\")))))}}]),t}(m.default.Component);t.default=y,y.propTypes={specSelectors:d.PropTypes.object.isRequired,specActions:d.PropTypes.object.isRequired,getComponent:d.PropTypes.func.isRequired}},function(e,t){e.exports=\"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAB4AAAAeCAYAAAA7MK6iAAAAGXRFWHRTb2Z0d2FyZQBBZG9iZSBJbWFnZVJlYWR5ccllPAAAAqRJREFUeNrEVz1s00AUfnGXii5maMXoEUEHVwIpEkPNgkBdMnQoU5ytiKHJwpp2Q2JIO8DCUDOxIJFIVOoWZyJSh3pp1Q2PVVlcCVBH3ufeVZZ9Zye1Ay86nXV+ue/9fO/lheg/Se02X1rvksmbnTiKvuxQMBNgBnN4a/LCbmnUAP6JV58NCUsBC8CuAJxGPF47OgNqBaA93tolUhnx6jC4NxGwyOEwlccyAs+3kwdzKq0HDn2vEBTi8J2XpyMaywNDE157BhXUE3zJhlq8GKq+Zd2zaWHepPA8oN9XkfLmRdOiJV4XUUg/IyWncLjCYY/SHndV2u7zHr3bPKZtdxgboJOnthvrfGj/oMf3G0r7JVmNlLfKklmrt2MvvcNO7LFOhoFHfuAJI5o6ta10jpt5CQLgwXhXG2YIwvu+34qf78ybOjWTnWwkgR36d7JqJOrW0hHmNrKg9xhiS4+1jFmrxymh03B0w+6kURIAu3yHtOD5oaUNojMnGgbcctNvwdAnyxvxRR+/vaJnjzbpzcZX+nN1SdGv85i9eH8w3qPO+mdm/y4dnQ1iI8Fq6Nf4cxL6GWSjiFDSs0VRnxC5g0xSB2cgHpaseTxfqOv5uoHkNQ6Ha/N1Yz9mNMppEkEkYKj79q6uCq4bCHcSX3fJ0Vk/k9siASjCm1N6gZH6Ec9IXt2WkFES2K/ixoIyktJPAu/ptOA1SgO5zqtr6KASJPF0nMV8dgMsRhRPOcMwqQAOoi0VAIMLAEWJ6YYC1c8ibj1GP51RqwzYwZVMHQuvOzMCBUtb2tGHx5NAdLKqp5AX7Ng4d+Zi8AGDI9z1ijx9yaCH04y3GCP2S+QcvaGl+pcxyUBvinFlawoDQjHSelX8hQEoIrAq8p/mgC88HOS1YCl/BRgAmiD/1gn6Nu8AAAAASUVORK5CYII=\"},function(e,t,n){\"use strict\";function r(e){return e&&e.__esModule?e:{default:e}}function i(e){var t=e.fn,n={downloadConfig:function(e){return function(){var n=t.fetch;return n(e)}},getConfigByUrl:function(e,t){return function(n){function r(n){n instanceof Error||n.status>=400?(i.updateLoadingStatus(\"failedConfig\"),i.updateLoadingStatus(\"failedConfig\"),i.updateUrl(\"\"),console.error(n.statusText+\" \"+e),t(null)):t(c(n.text))}var i=n.specActions;if(e)return i.downloadConfig(e).then(r,r)}}},r={getLocalConfig:function(){return c(u.default)}};return{statePlugins:{spec:{actions:n,selectors:r}}}}Object.defineProperty(t,\"__esModule\",{value:!0}),t.default=i;var o=n(182),s=r(o),a=n(217),u=r(a),c=function(e,t){try{return s.default.safeLoad(e)}catch(e){return t&&t.errActions.newThrownErr(new Error(e)),{}}}},function(e,t,n){\"use strict\";var r=n(183);e.exports=r},function(e,t,n){\"use strict\";function r(e){return function(){throw new Error(\"Function \"+e+\" is deprecated and cannot be used.\")}}var i=n(184),o=n(216);e.exports.Type=n(190),e.exports.Schema=n(189),e.exports.FAILSAFE_SCHEMA=n(193),e.exports.JSON_SCHEMA=n(192),e.exports.CORE_SCHEMA=n(191),e.exports.DEFAULT_SAFE_SCHEMA=n(188),e.exports.DEFAULT_FULL_SCHEMA=n(211),e.exports.load=i.load,e.exports.loadAll=i.loadAll,e.exports.safeLoad=i.safeLoad,e.exports.safeLoadAll=i.safeLoadAll,e.exports.dump=o.dump,e.exports.safeDump=o.safeDump,e.exports.YAMLException=n(186),e.exports.MINIMAL_SCHEMA=n(193),e.exports.SAFE_SCHEMA=n(188),e.exports.DEFAULT_SCHEMA=n(211),e.exports.scan=r(\"scan\"),e.exports.parse=r(\"parse\"),e.exports.compose=r(\"compose\"),e.exports.addConstructor=r(\"addConstructor\")},function(e,t,n){\"use strict\";function r(e){return 10===e||13===e}function i(e){return 9===e||32===e}function o(e){return 9===e||32===e||10===e||13===e}function s(e){return 44===e||91===e||93===e||123===e||125===e}function a(e){var t;return 48<=e&&e<=57?e-48:(t=32|e,97<=t&&t<=102?t-97+10:-1)}function u(e){return 120===e?2:117===e?4:85===e?8:0}function c(e){return 48<=e&&e<=57?e-48:-1}function l(e){return 48===e?\"\\0\":97===e?\"\u0007\":98===e?\"\\b\":116===e?\"\\t\":9===e?\"\\t\":110===e?\"\\n\":118===e?\"\\v\":102===e?\"\\f\":114===e?\"\\r\":101===e?\"\u001b\":32===e?\" \":34===e?'\"':47===e?\"/\":92===e?\"\\\\\":78===e?\"\":95===e?\" \":76===e?\"\\u2028\":80===e?\"\\u2029\":\"\"}function h(e){return e<=65535?String.fromCharCode(e):String.fromCharCode((e-65536>>10)+55296,(e-65536&1023)+56320)}function p(e,t){this.input=e,this.filename=t.filename||null,this.schema=t.schema||Y,this.onWarning=t.onWarning||null,this.legacy=t.legacy||!1,this.json=t.json||!1,this.listener=t.listener||null,this.implicitTypes=this.schema.compiledImplicit,this.typeMap=this.schema.compiledTypeMap,this.length=e.length,this.position=0,this.line=0,this.lineStart=0,this.lineIndent=0,this.documents=[]}function f(e,t){return new z(t,new J(e.filename,e.input,e.position,e.line,e.position-e.lineStart))}function d(e,t){throw f(e,t)}function m(e,t){e.onWarning&&e.onWarning.call(null,f(e,t))}function g(e,t,n,r){var i,o,s,a;if(t<n){if(a=e.input.slice(t,n),r)for(i=0,o=a.length;i<o;i+=1)s=a.charCodeAt(i),9===s||32<=s&&s<=1114111||d(e,\"expected valid JSON character\");else Q.test(a)&&d(e,\"the stream contains non-printable characters\");e.result+=a}}function x(e,t,n,r){var i,o,s,a;for(j.isObject(n)||d(e,\"cannot merge mappings; the provided source object is unacceptable\"),i=Object.keys(n),s=0,a=i.length;s<a;s+=1)o=i[s],K.call(t,o)||(t[o]=n[o],r[o]=!0)}function y(e,t,n,r,i,o,s,a){var u,c;if(i=String(i),null===t&&(t={}),\"tag:yaml.org,2002:merge\"===r)if(Array.isArray(o))for(u=0,c=o.length;u<c;u+=1)x(e,t,o[u],n);else x(e,t,o,n);else e.json||K.call(n,i)||!K.call(t,i)||(e.line=s||e.line,e.position=a||e.position,d(e,\"duplicated mapping key\")),t[i]=o,delete n[i];return t}function v(e){var t;t=e.input.charCodeAt(e.position),10===t?e.position++:13===t?(e.position++,10===e.input.charCodeAt(e.position)&&e.position++):d(e,\"a line break is expected\"),e.line+=1,e.lineStart=e.position}function b(e,t,n){for(var o=0,s=e.input.charCodeAt(e.position);0!==s;){for(;i(s);)s=e.input.charCodeAt(++e.position);if(t&&35===s)do s=e.input.charCodeAt(++e.position);while(10!==s&&13!==s&&0!==s);if(!r(s))break;for(v(e),s=e.input.charCodeAt(e.position),o++,e.lineIndent=0;32===s;)e.lineIndent++,s=e.input.charCodeAt(++e.position)}return n!==-1&&0!==o&&e.lineIndent<n&&m(e,\"deficient indentation\"),o}function D(e){var t,n=e.position;return t=e.input.charCodeAt(n),!(45!==t&&46!==t||t!==e.input.charCodeAt(n+1)||t!==e.input.charCodeAt(n+2)||(n+=3,t=e.input.charCodeAt(n),0!==t&&!o(t)))}function w(e,t){1===t?e.result+=\" \":t>1&&(e.result+=j.repeat(\"\\n\",t-1))}function E(e,t,n){var a,u,c,l,h,p,f,d,m,x=e.kind,y=e.result;if(m=e.input.charCodeAt(e.position),o(m)||s(m)||35===m||38===m||42===m||33===m||124===m||62===m||39===m||34===m||37===m||64===m||96===m)return!1;if((63===m||45===m)&&(u=e.input.charCodeAt(e.position+1),o(u)||n&&s(u)))return!1;for(e.kind=\"scalar\",e.result=\"\",c=l=e.position,h=!1;0!==m;){if(58===m){if(u=e.input.charCodeAt(e.position+1),o(u)||n&&s(u))break}else if(35===m){if(a=e.input.charCodeAt(e.position-1),o(a))break}else{if(e.position===e.lineStart&&D(e)||n&&s(m))break;if(r(m)){if(p=e.line,f=e.lineStart,d=e.lineIndent,b(e,!1,-1),e.lineIndent>=t){h=!0,m=e.input.charCodeAt(e.position);continue}e.position=l,e.line=p,e.lineStart=f,e.lineIndent=d;break}}h&&(g(e,c,l,!1),w(e,e.line-p),c=l=e.position,h=!1),i(m)||(l=e.position+1),m=e.input.charCodeAt(++e.position)}return g(e,c,l,!1),!!e.result||(e.kind=x,e.result=y,!1)}function k(e,t){var n,i,o;if(n=e.input.charCodeAt(e.position),39!==n)return!1;for(e.kind=\"scalar\",e.result=\"\",e.position++,i=o=e.position;0!==(n=e.input.charCodeAt(e.position));)if(39===n){if(g(e,i,e.position,!0),n=e.input.charCodeAt(++e.position),39!==n)return!0;i=e.position,e.position++,o=e.position}else r(n)?(g(e,i,o,!0),w(e,b(e,!1,t)),i=o=e.position):e.position===e.lineStart&&D(e)?d(e,\"unexpected end of the document within a single quoted scalar\"):(e.position++,o=e.position);d(e,\"unexpected end of the stream within a single quoted scalar\")}function A(e,t){var n,i,o,s,c,l;if(l=e.input.charCodeAt(e.position),34!==l)return!1;for(e.kind=\"scalar\",e.result=\"\",e.position++,n=i=e.position;0!==(l=e.input.charCodeAt(e.position));){if(34===l)return g(e,n,e.position,!0),e.position++,!0;if(92===l){if(g(e,n,e.position,!0),l=e.input.charCodeAt(++e.position),r(l))b(e,!1,t);else if(l<256&&ie[l])e.result+=oe[l],e.position++;else if((c=u(l))>0){for(o=c,s=0;o>0;o--)l=e.input.charCodeAt(++e.position),(c=a(l))>=0?s=(s<<4)+c:d(e,\"expected hexadecimal character\");e.result+=h(s),e.position++}else d(e,\"unknown escape sequence\");n=i=e.position}else r(l)?(g(e,n,i,!0),w(e,b(e,!1,t)),n=i=e.position):e.position===e.lineStart&&D(e)?d(e,\"unexpected end of the document within a double quoted scalar\"):(e.position++,i=e.position)}d(e,\"unexpected end of the stream within a double quoted scalar\")}function C(e,t){var n,r,i,s,a,u,c,l,h,p,f,m=!0,g=e.tag,x=e.anchor,v={};if(f=e.input.charCodeAt(e.position),91===f)s=93,c=!1,r=[];else{if(123!==f)return!1;s=125,c=!0,r={}}for(null!==e.anchor&&(e.anchorMap[e.anchor]=r),f=e.input.charCodeAt(++e.position);0!==f;){if(b(e,!0,t),f=e.input.charCodeAt(e.position),f===s)return e.position++,e.tag=g,e.anchor=x,e.kind=c?\"mapping\":\"sequence\",e.result=r,!0;m||d(e,\"missed comma between flow collection entries\"),h=l=p=null,a=u=!1,63===f&&(i=e.input.charCodeAt(e.position+1),o(i)&&(a=u=!0,e.position++,b(e,!0,t))),n=e.line,P(e,t,W,!1,!0),h=e.tag,l=e.result,b(e,!0,t),f=e.input.charCodeAt(e.position),!u&&e.line!==n||58!==f||(a=!0,f=e.input.charCodeAt(++e.position),b(e,!0,t),P(e,t,W,!1,!0),p=e.result),c?y(e,r,v,h,l,p):a?r.push(y(e,null,v,h,l,p)):r.push(l),b(e,!0,t),f=e.input.charCodeAt(e.position),44===f?(m=!0,f=e.input.charCodeAt(++e.position)):m=!1}d(e,\"unexpected end of the stream within a flow collection\")}function S(e,t){var n,o,s,a,u=V,l=!1,h=!1,p=t,f=0,m=!1;if(a=e.input.charCodeAt(e.position),124===a)o=!1;else{if(62!==a)return!1;o=!0}for(e.kind=\"scalar\",e.result=\"\";0!==a;)if(a=e.input.charCodeAt(++e.position),43===a||45===a)V===u?u=43===a?Z:$:d(e,\"repeat of a chomping mode identifier\");else{if(!((s=c(a))>=0))break;0===s?d(e,\"bad explicit indentation width of a block scalar; it cannot be less than one\"):h?d(e,\"repeat of an indentation width identifier\"):(p=t+s-1,h=!0)}if(i(a)){do a=e.input.charCodeAt(++e.position);while(i(a));if(35===a)do a=e.input.charCodeAt(++e.position);while(!r(a)&&0!==a)}for(;0!==a;){for(v(e),e.lineIndent=0,a=e.input.charCodeAt(e.position);(!h||e.lineIndent<p)&&32===a;)e.lineIndent++,a=e.input.charCodeAt(++e.position);if(!h&&e.lineIndent>p&&(p=e.lineIndent),r(a))f++;else{if(e.lineIndent<p){u===Z?e.result+=j.repeat(\"\\n\",l?1+f:f):u===V&&l&&(e.result+=\"\\n\");break}for(o?i(a)?(m=!0,e.result+=j.repeat(\"\\n\",l?1+f:f)):m?(m=!1,e.result+=j.repeat(\"\\n\",f+1)):0===f?l&&(e.result+=\" \"):e.result+=j.repeat(\"\\n\",f):e.result+=j.repeat(\"\\n\",l?1+f:f),l=!0,h=!0,f=0,n=e.position;!r(a)&&0!==a;)a=e.input.charCodeAt(++e.position);g(e,n,e.position,!1)}}return!0}function F(e,t){var n,r,i,s=e.tag,a=e.anchor,u=[],c=!1;for(null!==e.anchor&&(e.anchorMap[e.anchor]=u),i=e.input.charCodeAt(e.position);0!==i&&45===i&&(r=e.input.charCodeAt(e.position+1),o(r));)if(c=!0,e.position++,b(e,!0,-1)&&e.lineIndent<=t)u.push(null),i=e.input.charCodeAt(e.position);else if(n=e.line,P(e,t,q,!1,!0),u.push(e.result),b(e,!0,-1),i=e.input.charCodeAt(e.position),(e.line===n||e.lineIndent>t)&&0!==i)d(e,\"bad indentation of a sequence entry\");else if(e.lineIndent<t)break;return!!c&&(e.tag=s,e.anchor=a,e.kind=\"sequence\",e.result=u,!0)}function T(e,t,n){var r,s,a,u,c,l=e.tag,h=e.anchor,p={},f={},m=null,g=null,x=null,v=!1,D=!1;for(null!==e.anchor&&(e.anchorMap[e.anchor]=p),c=e.input.charCodeAt(e.position);0!==c;){if(r=e.input.charCodeAt(e.position+1),a=e.line,u=e.position,63!==c&&58!==c||!o(r)){if(!P(e,n,H,!1,!0))break;if(e.line===a){for(c=e.input.charCodeAt(e.position);i(c);)c=e.input.charCodeAt(++e.position);if(58===c)c=e.input.charCodeAt(++e.position),o(c)||d(e,\"a whitespace character is expected after the key-value separator within a block mapping\"),v&&(y(e,p,f,m,g,null),m=g=x=null),D=!0,v=!1,s=!1,m=e.tag,g=e.result;else{if(!D)return e.tag=l,e.anchor=h,!0;d(e,\"can not read an implicit mapping pair; a colon is missed\")}}else{if(!D)return e.tag=l,e.anchor=h,!0;d(e,\"can not read a block mapping entry; a multiline key may not be an implicit key\")}}else 63===c?(v&&(y(e,p,f,m,g,null),m=g=x=null),D=!0,v=!0,s=!0):v?(v=!1,s=!0):d(e,\"incomplete explicit mapping pair; a key node is missed\"),e.position+=1,c=r;if((e.line===a||e.lineIndent>t)&&(P(e,t,G,!0,s)&&(v?g=e.result:x=e.result),v||(y(e,p,f,m,g,x,a,u),m=g=x=null),b(e,!0,-1),c=e.input.charCodeAt(e.position)),e.lineIndent>t&&0!==c)d(e,\"bad indentation of a mapping entry\");else if(e.lineIndent<t)break}return v&&y(e,p,f,m,g,null),D&&(e.tag=l,e.anchor=h,e.kind=\"mapping\",e.result=p),D}function B(e){var t,n,r,i,s=!1,a=!1;if(i=e.input.charCodeAt(e.position),33!==i)return!1;if(null!==e.tag&&d(e,\"duplication of a tag property\"),i=e.input.charCodeAt(++e.position),60===i?(s=!0,i=e.input.charCodeAt(++e.position)):33===i?(a=!0,n=\"!!\",i=e.input.charCodeAt(++e.position)):n=\"!\",t=e.position,s){do i=e.input.charCodeAt(++e.position);while(0!==i&&62!==i);e.position<e.length?(r=e.input.slice(t,e.position),i=e.input.charCodeAt(++e.position)):d(e,\"unexpected end of the stream within a verbatim tag\")}else{for(;0!==i&&!o(i);)33===i&&(a?d(e,\"tag suffix cannot contain exclamation marks\"):(n=e.input.slice(t-1,e.position+1),ne.test(n)||d(e,\"named tag handle cannot contain such characters\"),a=!0,t=e.position+1)),i=e.input.charCodeAt(++e.position);r=e.input.slice(t,e.position),te.test(r)&&d(e,\"tag suffix cannot contain flow indicator characters\")}return r&&!re.test(r)&&d(e,\"tag name cannot contain such characters: \"+r),s?e.tag=r:K.call(e.tagMap,n)?e.tag=e.tagMap[n]+r:\"!\"===n?e.tag=\"!\"+r:\"!!\"===n?e.tag=\"tag:yaml.org,2002:\"+r:d(e,'undeclared tag handle \"'+n+'\"'),!0}function N(e){var t,n;if(n=e.input.charCodeAt(e.position),38!==n)return!1;for(null!==e.anchor&&d(e,\"duplication of an anchor property\"),n=e.input.charCodeAt(++e.position),t=e.position;0!==n&&!o(n)&&!s(n);)n=e.input.charCodeAt(++e.position);return e.position===t&&d(e,\"name of an anchor node must contain at least one character\"),e.anchor=e.input.slice(t,e.position),!0}function I(e){var t,n,r;if(r=e.input.charCodeAt(e.position),42!==r)return!1;for(r=e.input.charCodeAt(++e.position),t=e.position;0!==r&&!o(r)&&!s(r);)r=e.input.charCodeAt(++e.position);return e.position===t&&d(e,\"name of an alias node must contain at least one character\"),n=e.input.slice(t,e.position),e.anchorMap.hasOwnProperty(n)||d(e,'unidentified alias \"'+n+'\"'),e.result=e.anchorMap[n],b(e,!0,-1),!0}function P(e,t,n,r,i){var o,s,a,u,c,l,h,p,f=1,m=!1,g=!1;if(null!==e.listener&&e.listener(\"open\",e),e.tag=null,e.anchor=null,e.kind=null,e.result=null,o=s=a=G===n||q===n,r&&b(e,!0,-1)&&(m=!0,e.lineIndent>t?f=1:e.lineIndent===t?f=0:e.lineIndent<t&&(f=-1)),1===f)for(;B(e)||N(e);)b(e,!0,-1)?(m=!0,a=o,e.lineIndent>t?f=1:e.lineIndent===t?f=0:e.lineIndent<t&&(f=-1)):a=!1;if(a&&(a=m||i),1!==f&&G!==n||(h=W===n||H===n?t:t+1,p=e.position-e.lineStart,1===f?a&&(F(e,p)||T(e,p,h))||C(e,h)?g=!0:(s&&S(e,h)||k(e,h)||A(e,h)?g=!0:I(e)?(g=!0,null===e.tag&&null===e.anchor||d(e,\"alias node should not have any properties\")):E(e,h,W===n)&&(g=!0,null===e.tag&&(e.tag=\"?\")),null!==e.anchor&&(e.anchorMap[e.anchor]=e.result)):0===f&&(g=a&&F(e,p))),null!==e.tag&&\"!\"!==e.tag)if(\"?\"===e.tag){for(u=0,c=e.implicitTypes.length;u<c;u+=1)if(l=e.implicitTypes[u],l.resolve(e.result)){e.result=l.construct(e.result),e.tag=l.tag,null!==e.anchor&&(e.anchorMap[e.anchor]=e.result);break}}else K.call(e.typeMap[e.kind||\"fallback\"],e.tag)?(l=e.typeMap[e.kind||\"fallback\"][e.tag],null!==e.result&&l.kind!==e.kind&&d(e,\"unacceptable node kind for !<\"+e.tag+'> tag; it should be \"'+l.kind+'\", not \"'+e.kind+'\"'),l.resolve(e.result)?(e.result=l.construct(e.result),null!==e.anchor&&(e.anchorMap[e.anchor]=e.result)):d(e,\"cannot resolve a node with !<\"+e.tag+\"> explicit tag\")):d(e,\"unknown tag !<\"+e.tag+\">\");return null!==e.listener&&e.listener(\"close\",e),null!==e.tag||null!==e.anchor||g}function M(e){var t,n,s,a,u=e.position,c=!1;for(e.version=null,e.checkLineBreaks=e.legacy,e.tagMap={},e.anchorMap={};0!==(a=e.input.charCodeAt(e.position))&&(b(e,!0,-1),a=e.input.charCodeAt(e.position),!(e.lineIndent>0||37!==a));){for(c=!0,a=e.input.charCodeAt(++e.position),t=e.position;0!==a&&!o(a);)a=e.input.charCodeAt(++e.position);for(n=e.input.slice(t,e.position),s=[],n.length<1&&d(e,\"directive name must not be less than one character in length\");0!==a;){for(;i(a);)a=e.input.charCodeAt(++e.position);if(35===a){do a=e.input.charCodeAt(++e.position);while(0!==a&&!r(a));break}if(r(a))break;for(t=e.position;0!==a&&!o(a);)a=e.input.charCodeAt(++e.position);s.push(e.input.slice(t,e.position))}0!==a&&v(e),K.call(ae,n)?ae[n](e,n,s):m(e,'unknown document directive \"'+n+'\"')}return b(e,!0,-1),0===e.lineIndent&&45===e.input.charCodeAt(e.position)&&45===e.input.charCodeAt(e.position+1)&&45===e.input.charCodeAt(e.position+2)?(e.position+=3,b(e,!0,-1)):c&&d(e,\"directives end mark is expected\"),P(e,e.lineIndent-1,G,!1,!0),b(e,!0,-1),e.checkLineBreaks&&ee.test(e.input.slice(u,e.position))&&m(e,\"non-ASCII line breaks are interpreted as content\"),e.documents.push(e.result),e.position===e.lineStart&&D(e)?void(46===e.input.charCodeAt(e.position)&&(e.position+=3,b(e,!0,-1))):void(e.position<e.length-1&&d(e,\"end of the stream or a document separator is expected\"))}function O(e,t){e=String(e),t=t||{},0!==e.length&&(10!==e.charCodeAt(e.length-1)&&13!==e.charCodeAt(e.length-1)&&(e+=\"\\n\"),65279===e.charCodeAt(0)&&(e=e.slice(1)));var n=new p(e,t);for(n.input+=\"\\0\";32===n.input.charCodeAt(n.position);)n.lineIndent+=1,n.position+=1;for(;n.position<n.length-1;)M(n);return n.documents}function _(e,t,n){var r,i,o=O(e,n);for(r=0,i=o.length;r<i;r+=1)t(o[r])}function L(e,t){var n=O(e,t);if(0!==n.length){if(1===n.length)return n[0];throw new z(\"expected a single document in the stream, but found more\")}}function R(e,t,n){_(e,t,j.extend({schema:X},n))}function U(e,t){return L(e,j.extend({schema:X},t))}for(var j=n(185),z=n(186),J=n(187),X=n(188),Y=n(211),K=Object.prototype.hasOwnProperty,W=1,H=2,q=3,G=4,V=1,$=2,Z=3,Q=/[\\x00-\\x08\\x0B\\x0C\\x0E-\\x1F\\x7F-\\x84\\x86-\\x9F\\uFFFE\\uFFFF]|[\\uD800-\\uDBFF](?![\\uDC00-\\uDFFF])|(?:[^\\uD800-\\uDBFF]|^)[\\uDC00-\\uDFFF]/,ee=/[\\x85\\u2028\\u2029]/,te=/[,\\[\\]\\{\\}]/,ne=/^(?:!|!!|![a-z\\-]+!)$/i,re=/^(?:!|[^,\\[\\]\\{\\}])(?:%[0-9a-f]{2}|[0-9a-z\\-#;\\/\\?:@&=\\+\\$,_\\.!~\\*'\\(\\)\\[\\]])*$/i,ie=new Array(256),oe=new Array(256),se=0;se<256;se++)ie[se]=l(se)?1:0,oe[se]=l(se);var ae={YAML:function(e,t,n){var r,i,o;null!==e.version&&d(e,\"duplication of %YAML directive\"),1!==n.length&&d(e,\"YAML directive accepts exactly one argument\"),r=/^([0-9]+)\\.([0-9]+)$/.exec(n[0]),null===r&&d(e,\"ill-formed argument of the YAML directive\"),i=parseInt(r[1],10),o=parseInt(r[2],10),1!==i&&d(e,\"unacceptable YAML version of the document\"),e.version=n[0],e.checkLineBreaks=o<2,1!==o&&2!==o&&m(e,\"unsupported YAML version of the document\")},TAG:function(e,t,n){var r,i;2!==n.length&&d(e,\"TAG directive accepts exactly two arguments\"),r=n[0],i=n[1],ne.test(r)||d(e,\"ill-formed tag handle (first argument) of the TAG directive\"),K.call(e.tagMap,r)&&d(e,'there is a previously declared suffix for \"'+r+'\" tag handle'),re.test(i)||d(e,\"ill-formed tag prefix (second argument) of the TAG directive\"),e.tagMap[r]=i}};e.exports.loadAll=_,e.exports.load=L,e.exports.safeLoadAll=R,e.exports.safeLoad=U},function(e,t){\"use strict\";function n(e){return\"undefined\"==typeof e||null===e}function r(e){return\"object\"==typeof e&&null!==e}function i(e){return Array.isArray(e)?e:n(e)?[]:[e]}function o(e,t){var n,r,i,o;if(t)for(o=Object.keys(t),n=0,r=o.length;n<r;n+=1)i=o[n],e[i]=t[i];return e}function s(e,t){var n,r=\"\";for(n=0;n<t;n+=1)r+=e;return r}function a(e){return 0===e&&Number.NEGATIVE_INFINITY===1/e}e.exports.isNothing=n,e.exports.isObject=r,e.exports.toArray=i,e.exports.repeat=s,e.exports.isNegativeZero=a,e.exports.extend=o},function(e,t){\"use strict\";function n(e,t){Error.call(this),Error.captureStackTrace?Error.captureStackTrace(this,this.constructor):this.stack=(new Error).stack||\"\",this.name=\"YAMLException\",this.reason=e,this.mark=t,this.message=(this.reason||\"(unknown reason)\")+(this.mark?\" \"+this.mark.toString():\"\")}n.prototype=Object.create(Error.prototype),n.prototype.constructor=n,n.prototype.toString=function(e){var t=this.name+\": \";return t+=this.reason||\"(unknown reason)\",!e&&this.mark&&(t+=\" \"+this.mark.toString()),t},e.exports=n},function(e,t,n){\"use strict\";function r(e,t,n,r,i){this.name=e,this.buffer=t,this.position=n,this.line=r,this.column=i}var i=n(185);r.prototype.getSnippet=function(e,t){var n,r,o,s,a;if(!this.buffer)return null;for(e=e||4,t=t||75,n=\"\",r=this.position;r>0&&\"\\0\\r\\n\\u2028\\u2029\".indexOf(this.buffer.charAt(r-1))===-1;)if(r-=1,this.position-r>t/2-1){n=\" ... \",r+=5;break}for(o=\"\",s=this.position;s<this.buffer.length&&\"\\0\\r\\n\\u2028\\u2029\".indexOf(this.buffer.charAt(s))===-1;)if(s+=1,s-this.position>t/2-1){o=\" ... \",s-=5;break}return a=this.buffer.slice(r,s),i.repeat(\" \",e)+n+a+o+\"\\n\"+i.repeat(\" \",e+this.position-r+n.length)+\"^\"},r.prototype.toString=function(e){var t,n=\"\";return this.name&&(n+='in \"'+this.name+'\" '),n+=\"at line \"+(this.line+1)+\", column \"+(this.column+1),e||(t=this.getSnippet(),t&&(n+=\":\\n\"+t)),n},e.exports=r},function(e,t,n){\"use strict\";var r=n(189);e.exports=new r({include:[n(191)],implicit:[n(201),n(202)],explicit:[n(203),n(208),n(209),n(210)]})},function(e,t,n){\"use strict\";function r(e,t,n){var i=[];return e.include.forEach(function(e){n=r(e,t,n)}),e[t].forEach(function(e){n.forEach(function(t,n){t.tag===e.tag&&t.kind===e.kind&&i.push(n)}),n.push(e)}),n.filter(function(e,t){return i.indexOf(t)===-1})}function i(){function e(e){r[e.kind][e.tag]=r.fallback[e.tag]=e}var t,n,r={scalar:{},sequence:{},mapping:{},fallback:{}};for(t=0,n=arguments.length;t<n;t+=1)arguments[t].forEach(e);return r}function o(e){this.include=e.include||[],this.implicit=e.implicit||[],this.explicit=e.explicit||[],this.implicit.forEach(function(e){if(e.loadKind&&\"scalar\"!==e.loadKind)throw new a(\"There is a non-scalar type in the implicit list of a schema. Implicit resolving of such types is not supported.\")}),this.compiledImplicit=r(this,\"implicit\",[]),this.compiledExplicit=r(this,\"explicit\",[]),this.compiledTypeMap=i(this.compiledImplicit,this.compiledExplicit)}var s=n(185),a=n(186),u=n(190);o.DEFAULT=null,o.create=function(){var e,t;switch(arguments.length){case 1:e=o.DEFAULT,t=arguments[0];break;case 2:e=arguments[0],t=arguments[1];break;default:throw new a(\"Wrong number of arguments for Schema.create function\")}if(e=s.toArray(e),t=s.toArray(t),!e.every(function(e){return e instanceof o}))throw new a(\"Specified list of super schemas (or a single Schema object) contains a non-Schema object.\");if(!t.every(function(e){return e instanceof u}))throw new a(\"Specified list of YAML types (or a single Type object) contains a non-Type object.\");return new o({include:e,explicit:t})},e.exports=o},function(e,t,n){\"use strict\";function r(e){var t={};return null!==e&&Object.keys(e).forEach(function(n){e[n].forEach(function(e){t[String(e)]=n})}),t}function i(e,t){if(t=t||{},Object.keys(t).forEach(function(t){if(s.indexOf(t)===-1)throw new o('Unknown option \"'+t+'\" is met in definition of \"'+e+'\" YAML type.')}),this.tag=e,this.kind=t.kind||null,this.resolve=t.resolve||function(){return!0},this.construct=t.construct||function(e){return e},this.instanceOf=t.instanceOf||null,this.predicate=t.predicate||null,this.represent=t.represent||null,this.defaultStyle=t.defaultStyle||null,this.styleAliases=r(t.styleAliases||null),a.indexOf(this.kind)===-1)throw new o('Unknown kind \"'+this.kind+'\" is specified for \"'+e+'\" YAML type.')}var o=n(186),s=[\"kind\",\"resolve\",\"construct\",\"instanceOf\",\"predicate\",\"represent\",\"defaultStyle\",\"styleAliases\"],a=[\"scalar\",\"sequence\",\"mapping\"];e.exports=i},function(e,t,n){\"use strict\";var r=n(189);e.exports=new r({include:[n(192)]})},function(e,t,n){\"use strict\";var r=n(189);e.exports=new r({include:[n(193)],implicit:[n(197),n(198),n(199),n(200)]})},function(e,t,n){\"use strict\";var r=n(189);e.exports=new r({explicit:[n(194),n(195),n(196)]})},function(e,t,n){\"use strict\";var r=n(190);e.exports=new r(\"tag:yaml.org,2002:str\",{kind:\"scalar\",construct:function(e){return null!==e?e:\"\"}})},function(e,t,n){\"use strict\";var r=n(190);e.exports=new r(\"tag:yaml.org,2002:seq\",{kind:\"sequence\",construct:function(e){return null!==e?e:[]}})},function(e,t,n){\"use strict\";var r=n(190);e.exports=new r(\"tag:yaml.org,2002:map\",{kind:\"mapping\",construct:function(e){return null!==e?e:{}}})},function(e,t,n){\"use strict\";function r(e){if(null===e)return!0;var t=e.length;return 1===t&&\"~\"===e||4===t&&(\"null\"===e||\"Null\"===e||\"NULL\"===e)}function i(){return null}function o(e){return null===e}var s=n(190);e.exports=new s(\"tag:yaml.org,2002:null\",{kind:\"scalar\",resolve:r,construct:i,predicate:o,represent:{canonical:function(){return\"~\"},lowercase:function(){return\"null\"},uppercase:function(){return\"NULL\"},camelcase:function(){return\"Null\"}},defaultStyle:\"lowercase\"})},function(e,t,n){\"use strict\";function r(e){if(null===e)return!1;var t=e.length;return 4===t&&(\"true\"===e||\"True\"===e||\"TRUE\"===e)||5===t&&(\"false\"===e||\"False\"===e||\"FALSE\"===e)}function i(e){return\"true\"===e||\"True\"===e||\"TRUE\"===e}function o(e){return\"[object Boolean]\"===Object.prototype.toString.call(e)}var s=n(190);e.exports=new s(\"tag:yaml.org,2002:bool\",{kind:\"scalar\",resolve:r,construct:i,predicate:o,represent:{lowercase:function(e){return e?\"true\":\"false\"},uppercase:function(e){return e?\"TRUE\":\"FALSE\"},camelcase:function(e){return e?\"True\":\"False\"}},defaultStyle:\"lowercase\"})},function(e,t,n){\"use strict\";function r(e){return 48<=e&&e<=57||65<=e&&e<=70||97<=e&&e<=102}function i(e){return 48<=e&&e<=55}function o(e){return 48<=e&&e<=57}function s(e){if(null===e)return!1;var t,n=e.length,s=0,a=!1;if(!n)return!1;if(t=e[s],\"-\"!==t&&\"+\"!==t||(t=e[++s]),\"0\"===t){if(s+1===n)return!0;if(t=e[++s],\"b\"===t){for(s++;s<n;s++)if(t=e[s],\"_\"!==t){if(\"0\"!==t&&\"1\"!==t)return!1;a=!0}return a&&\"_\"!==t}if(\"x\"===t){for(s++;s<n;s++)if(t=e[s],\"_\"!==t){if(!r(e.charCodeAt(s)))return!1;a=!0}return a&&\"_\"!==t}for(;s<n;s++)if(t=e[s],\"_\"!==t){if(!i(e.charCodeAt(s)))return!1;a=!0}return a&&\"_\"!==t}if(\"_\"===t)return!1;for(;s<n;s++)if(t=e[s],\"_\"!==t){if(\":\"===t)break;if(!o(e.charCodeAt(s)))return!1;a=!0}return!(!a||\"_\"===t)&&(\":\"!==t||/^(:[0-5]?[0-9])+$/.test(e.slice(s)))}function a(e){var t,n,r=e,i=1,o=[];return r.indexOf(\"_\")!==-1&&(r=r.replace(/_/g,\"\")),t=r[0],\"-\"!==t&&\"+\"!==t||(\"-\"===t&&(i=-1),r=r.slice(1),t=r[0]),\"0\"===r?0:\"0\"===t?\"b\"===r[1]?i*parseInt(r.slice(2),2):\"x\"===r[1]?i*parseInt(r,16):i*parseInt(r,8):r.indexOf(\":\")!==-1?(r.split(\":\").forEach(function(e){o.unshift(parseInt(e,10))}),r=0,n=1,o.forEach(function(e){r+=e*n,n*=60}),i*r):i*parseInt(r,10)}function u(e){return\"[object Number]\"===Object.prototype.toString.call(e)&&e%1===0&&!c.isNegativeZero(e)}var c=n(185),l=n(190);e.exports=new l(\"tag:yaml.org,2002:int\",{kind:\"scalar\",resolve:s,construct:a,predicate:u,represent:{binary:function(e){return\"0b\"+e.toString(2)},octal:function(e){return\"0\"+e.toString(8)},decimal:function(e){\nreturn e.toString(10)},hexadecimal:function(e){return\"0x\"+e.toString(16).toUpperCase()}},defaultStyle:\"decimal\",styleAliases:{binary:[2,\"bin\"],octal:[8,\"oct\"],decimal:[10,\"dec\"],hexadecimal:[16,\"hex\"]}})},function(e,t,n){\"use strict\";function r(e){return null!==e&&!(!c.test(e)||\"_\"===e[e.length-1])}function i(e){var t,n,r,i;return t=e.replace(/_/g,\"\").toLowerCase(),n=\"-\"===t[0]?-1:1,i=[],\"+-\".indexOf(t[0])>=0&&(t=t.slice(1)),\".inf\"===t?1===n?Number.POSITIVE_INFINITY:Number.NEGATIVE_INFINITY:\".nan\"===t?NaN:t.indexOf(\":\")>=0?(t.split(\":\").forEach(function(e){i.unshift(parseFloat(e,10))}),t=0,r=1,i.forEach(function(e){t+=e*r,r*=60}),n*t):n*parseFloat(t,10)}function o(e,t){var n;if(isNaN(e))switch(t){case\"lowercase\":return\".nan\";case\"uppercase\":return\".NAN\";case\"camelcase\":return\".NaN\"}else if(Number.POSITIVE_INFINITY===e)switch(t){case\"lowercase\":return\".inf\";case\"uppercase\":return\".INF\";case\"camelcase\":return\".Inf\"}else if(Number.NEGATIVE_INFINITY===e)switch(t){case\"lowercase\":return\"-.inf\";case\"uppercase\":return\"-.INF\";case\"camelcase\":return\"-.Inf\"}else if(a.isNegativeZero(e))return\"-0.0\";return n=e.toString(10),l.test(n)?n.replace(\"e\",\".e\"):n}function s(e){return\"[object Number]\"===Object.prototype.toString.call(e)&&(e%1!==0||a.isNegativeZero(e))}var a=n(185),u=n(190),c=new RegExp(\"^(?:[-+]?(?:0|[1-9][0-9_]*)(?:\\\\.[0-9_]*)?(?:[eE][-+]?[0-9]+)?|\\\\.[0-9_]+(?:[eE][-+]?[0-9]+)?|[-+]?[0-9][0-9_]*(?::[0-5]?[0-9])+\\\\.[0-9_]*|[-+]?\\\\.(?:inf|Inf|INF)|\\\\.(?:nan|NaN|NAN))$\"),l=/^[-+]?[0-9]+e/;e.exports=new u(\"tag:yaml.org,2002:float\",{kind:\"scalar\",resolve:r,construct:i,predicate:s,represent:o,defaultStyle:\"lowercase\"})},function(e,t,n){\"use strict\";function r(e){return null!==e&&(null!==a.exec(e)||null!==u.exec(e))}function i(e){var t,n,r,i,o,s,c,l,h,p,f=0,d=null;if(t=a.exec(e),null===t&&(t=u.exec(e)),null===t)throw new Error(\"Date resolve error\");if(n=+t[1],r=+t[2]-1,i=+t[3],!t[4])return new Date(Date.UTC(n,r,i));if(o=+t[4],s=+t[5],c=+t[6],t[7]){for(f=t[7].slice(0,3);f.length<3;)f+=\"0\";f=+f}return t[9]&&(l=+t[10],h=+(t[11]||0),d=6e4*(60*l+h),\"-\"===t[9]&&(d=-d)),p=new Date(Date.UTC(n,r,i,o,s,c,f)),d&&p.setTime(p.getTime()-d),p}function o(e){return e.toISOString()}var s=n(190),a=new RegExp(\"^([0-9][0-9][0-9][0-9])-([0-9][0-9])-([0-9][0-9])$\"),u=new RegExp(\"^([0-9][0-9][0-9][0-9])-([0-9][0-9]?)-([0-9][0-9]?)(?:[Tt]|[ \\\\t]+)([0-9][0-9]?):([0-9][0-9]):([0-9][0-9])(?:\\\\.([0-9]*))?(?:[ \\\\t]*(Z|([-+])([0-9][0-9]?)(?::([0-9][0-9]))?))?$\");e.exports=new s(\"tag:yaml.org,2002:timestamp\",{kind:\"scalar\",resolve:r,construct:i,instanceOf:Date,represent:o})},function(e,t,n){\"use strict\";function r(e){return\"<<\"===e||null===e}var i=n(190);e.exports=new i(\"tag:yaml.org,2002:merge\",{kind:\"scalar\",resolve:r})},function(e,t,n){function r(e){if(null===e)return!1;var t,n,r=0,i=e.length,o=c;for(n=0;n<i;n++)if(t=o.indexOf(e.charAt(n)),!(t>64)){if(t<0)return!1;r+=6}return r%8===0}function i(e){var t,n,r=e.replace(/[\\r\\n=]/g,\"\"),i=r.length,o=c,s=0,u=[];for(t=0;t<i;t++)t%4===0&&t&&(u.push(s>>16&255),u.push(s>>8&255),u.push(255&s)),s=s<<6|o.indexOf(r.charAt(t));return n=i%4*6,0===n?(u.push(s>>16&255),u.push(s>>8&255),u.push(255&s)):18===n?(u.push(s>>10&255),u.push(s>>2&255)):12===n&&u.push(s>>4&255),a?a.from?a.from(u):new a(u):u}function o(e){var t,n,r=\"\",i=0,o=e.length,s=c;for(t=0;t<o;t++)t%3===0&&t&&(r+=s[i>>18&63],r+=s[i>>12&63],r+=s[i>>6&63],r+=s[63&i]),i=(i<<8)+e[t];return n=o%3,0===n?(r+=s[i>>18&63],r+=s[i>>12&63],r+=s[i>>6&63],r+=s[63&i]):2===n?(r+=s[i>>10&63],r+=s[i>>4&63],r+=s[i<<2&63],r+=s[64]):1===n&&(r+=s[i>>2&63],r+=s[i<<4&63],r+=s[64],r+=s[64]),r}function s(e){return a&&a.isBuffer(e)}var a;try{a=n(204).Buffer}catch(e){}var u=n(190),c=\"ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/=\\n\\r\";e.exports=new u(\"tag:yaml.org,2002:binary\",{kind:\"scalar\",resolve:r,construct:i,predicate:s,represent:o})},function(e,t,n){(function(e){/*!\n\t * The buffer module from node.js, for the browser.\n\t *\n\t * @author   Feross Aboukhadijeh <feross@feross.org> <http://feross.org>\n\t * @license  MIT\n\t */\n\"use strict\";function r(){try{var e=new Uint8Array(1);return e.__proto__={__proto__:Uint8Array.prototype,foo:function(){return 42}},42===e.foo()&&\"function\"==typeof e.subarray&&0===e.subarray(1,1).byteLength}catch(e){return!1}}function i(){return s.TYPED_ARRAY_SUPPORT?2147483647:1073741823}function o(e,t){if(i()<t)throw new RangeError(\"Invalid typed array length\");return s.TYPED_ARRAY_SUPPORT?(e=new Uint8Array(t),e.__proto__=s.prototype):(null===e&&(e=new s(t)),e.length=t),e}function s(e,t,n){if(!(s.TYPED_ARRAY_SUPPORT||this instanceof s))return new s(e,t,n);if(\"number\"==typeof e){if(\"string\"==typeof t)throw new Error(\"If encoding is specified then the first argument must be a string\");return l(this,e)}return a(this,e,t,n)}function a(e,t,n,r){if(\"number\"==typeof t)throw new TypeError('\"value\" argument must not be a number');return\"undefined\"!=typeof ArrayBuffer&&t instanceof ArrayBuffer?f(e,t,n,r):\"string\"==typeof t?h(e,t,n):d(e,t)}function u(e){if(\"number\"!=typeof e)throw new TypeError('\"size\" argument must be a number');if(e<0)throw new RangeError('\"size\" argument must not be negative')}function c(e,t,n,r){return u(t),t<=0?o(e,t):void 0!==n?\"string\"==typeof r?o(e,t).fill(n,r):o(e,t).fill(n):o(e,t)}function l(e,t){if(u(t),e=o(e,t<0?0:0|m(t)),!s.TYPED_ARRAY_SUPPORT)for(var n=0;n<t;++n)e[n]=0;return e}function h(e,t,n){if(\"string\"==typeof n&&\"\"!==n||(n=\"utf8\"),!s.isEncoding(n))throw new TypeError('\"encoding\" must be a valid string encoding');var r=0|x(t,n);e=o(e,r);var i=e.write(t,n);return i!==r&&(e=e.slice(0,i)),e}function p(e,t){var n=t.length<0?0:0|m(t.length);e=o(e,n);for(var r=0;r<n;r+=1)e[r]=255&t[r];return e}function f(e,t,n,r){if(t.byteLength,n<0||t.byteLength<n)throw new RangeError(\"'offset' is out of bounds\");if(t.byteLength<n+(r||0))throw new RangeError(\"'length' is out of bounds\");return t=void 0===n&&void 0===r?new Uint8Array(t):void 0===r?new Uint8Array(t,n):new Uint8Array(t,n,r),s.TYPED_ARRAY_SUPPORT?(e=t,e.__proto__=s.prototype):e=p(e,t),e}function d(e,t){if(s.isBuffer(t)){var n=0|m(t.length);return e=o(e,n),0===e.length?e:(t.copy(e,0,0,n),e)}if(t){if(\"undefined\"!=typeof ArrayBuffer&&t.buffer instanceof ArrayBuffer||\"length\"in t)return\"number\"!=typeof t.length||V(t.length)?o(e,0):p(e,t);if(\"Buffer\"===t.type&&Q(t.data))return p(e,t.data)}throw new TypeError(\"First argument must be a string, Buffer, ArrayBuffer, Array, or array-like object.\")}function m(e){if(e>=i())throw new RangeError(\"Attempt to allocate Buffer larger than maximum size: 0x\"+i().toString(16)+\" bytes\");return 0|e}function g(e){return+e!=e&&(e=0),s.alloc(+e)}function x(e,t){if(s.isBuffer(e))return e.length;if(\"undefined\"!=typeof ArrayBuffer&&\"function\"==typeof ArrayBuffer.isView&&(ArrayBuffer.isView(e)||e instanceof ArrayBuffer))return e.byteLength;\"string\"!=typeof e&&(e=\"\"+e);var n=e.length;if(0===n)return 0;for(var r=!1;;)switch(t){case\"ascii\":case\"latin1\":case\"binary\":return n;case\"utf8\":case\"utf-8\":case void 0:return K(e).length;case\"ucs2\":case\"ucs-2\":case\"utf16le\":case\"utf-16le\":return 2*n;case\"hex\":return n>>>1;case\"base64\":return q(e).length;default:if(r)return K(e).length;t=(\"\"+t).toLowerCase(),r=!0}}function y(e,t,n){var r=!1;if((void 0===t||t<0)&&(t=0),t>this.length)return\"\";if((void 0===n||n>this.length)&&(n=this.length),n<=0)return\"\";if(n>>>=0,t>>>=0,n<=t)return\"\";for(e||(e=\"utf8\");;)switch(e){case\"hex\":return P(this,t,n);case\"utf8\":case\"utf-8\":return T(this,t,n);case\"ascii\":return N(this,t,n);case\"latin1\":case\"binary\":return I(this,t,n);case\"base64\":return F(this,t,n);case\"ucs2\":case\"ucs-2\":case\"utf16le\":case\"utf-16le\":return M(this,t,n);default:if(r)throw new TypeError(\"Unknown encoding: \"+e);e=(e+\"\").toLowerCase(),r=!0}}function v(e,t,n){var r=e[t];e[t]=e[n],e[n]=r}function b(e,t,n,r,i){if(0===e.length)return-1;if(\"string\"==typeof n?(r=n,n=0):n>2147483647?n=2147483647:n<-2147483648&&(n=-2147483648),n=+n,isNaN(n)&&(n=i?0:e.length-1),n<0&&(n=e.length+n),n>=e.length){if(i)return-1;n=e.length-1}else if(n<0){if(!i)return-1;n=0}if(\"string\"==typeof t&&(t=s.from(t,r)),s.isBuffer(t))return 0===t.length?-1:D(e,t,n,r,i);if(\"number\"==typeof t)return t&=255,s.TYPED_ARRAY_SUPPORT&&\"function\"==typeof Uint8Array.prototype.indexOf?i?Uint8Array.prototype.indexOf.call(e,t,n):Uint8Array.prototype.lastIndexOf.call(e,t,n):D(e,[t],n,r,i);throw new TypeError(\"val must be string, number or Buffer\")}function D(e,t,n,r,i){function o(e,t){return 1===s?e[t]:e.readUInt16BE(t*s)}var s=1,a=e.length,u=t.length;if(void 0!==r&&(r=String(r).toLowerCase(),\"ucs2\"===r||\"ucs-2\"===r||\"utf16le\"===r||\"utf-16le\"===r)){if(e.length<2||t.length<2)return-1;s=2,a/=2,u/=2,n/=2}var c;if(i){var l=-1;for(c=n;c<a;c++)if(o(e,c)===o(t,l===-1?0:c-l)){if(l===-1&&(l=c),c-l+1===u)return l*s}else l!==-1&&(c-=c-l),l=-1}else for(n+u>a&&(n=a-u),c=n;c>=0;c--){for(var h=!0,p=0;p<u;p++)if(o(e,c+p)!==o(t,p)){h=!1;break}if(h)return c}return-1}function w(e,t,n,r){n=Number(n)||0;var i=e.length-n;r?(r=Number(r),r>i&&(r=i)):r=i;var o=t.length;if(o%2!==0)throw new TypeError(\"Invalid hex string\");r>o/2&&(r=o/2);for(var s=0;s<r;++s){var a=parseInt(t.substr(2*s,2),16);if(isNaN(a))return s;e[n+s]=a}return s}function E(e,t,n,r){return G(K(t,e.length-n),e,n,r)}function k(e,t,n,r){return G(W(t),e,n,r)}function A(e,t,n,r){return k(e,t,n,r)}function C(e,t,n,r){return G(q(t),e,n,r)}function S(e,t,n,r){return G(H(t,e.length-n),e,n,r)}function F(e,t,n){return 0===t&&n===e.length?$.fromByteArray(e):$.fromByteArray(e.slice(t,n))}function T(e,t,n){n=Math.min(e.length,n);for(var r=[],i=t;i<n;){var o=e[i],s=null,a=o>239?4:o>223?3:o>191?2:1;if(i+a<=n){var u,c,l,h;switch(a){case 1:o<128&&(s=o);break;case 2:u=e[i+1],128===(192&u)&&(h=(31&o)<<6|63&u,h>127&&(s=h));break;case 3:u=e[i+1],c=e[i+2],128===(192&u)&&128===(192&c)&&(h=(15&o)<<12|(63&u)<<6|63&c,h>2047&&(h<55296||h>57343)&&(s=h));break;case 4:u=e[i+1],c=e[i+2],l=e[i+3],128===(192&u)&&128===(192&c)&&128===(192&l)&&(h=(15&o)<<18|(63&u)<<12|(63&c)<<6|63&l,h>65535&&h<1114112&&(s=h))}}null===s?(s=65533,a=1):s>65535&&(s-=65536,r.push(s>>>10&1023|55296),s=56320|1023&s),r.push(s),i+=a}return B(r)}function B(e){var t=e.length;if(t<=ee)return String.fromCharCode.apply(String,e);for(var n=\"\",r=0;r<t;)n+=String.fromCharCode.apply(String,e.slice(r,r+=ee));return n}function N(e,t,n){var r=\"\";n=Math.min(e.length,n);for(var i=t;i<n;++i)r+=String.fromCharCode(127&e[i]);return r}function I(e,t,n){var r=\"\";n=Math.min(e.length,n);for(var i=t;i<n;++i)r+=String.fromCharCode(e[i]);return r}function P(e,t,n){var r=e.length;(!t||t<0)&&(t=0),(!n||n<0||n>r)&&(n=r);for(var i=\"\",o=t;o<n;++o)i+=Y(e[o]);return i}function M(e,t,n){for(var r=e.slice(t,n),i=\"\",o=0;o<r.length;o+=2)i+=String.fromCharCode(r[o]+256*r[o+1]);return i}function O(e,t,n){if(e%1!==0||e<0)throw new RangeError(\"offset is not uint\");if(e+t>n)throw new RangeError(\"Trying to access beyond buffer length\")}function _(e,t,n,r,i,o){if(!s.isBuffer(e))throw new TypeError('\"buffer\" argument must be a Buffer instance');if(t>i||t<o)throw new RangeError('\"value\" argument is out of bounds');if(n+r>e.length)throw new RangeError(\"Index out of range\")}function L(e,t,n,r){t<0&&(t=65535+t+1);for(var i=0,o=Math.min(e.length-n,2);i<o;++i)e[n+i]=(t&255<<8*(r?i:1-i))>>>8*(r?i:1-i)}function R(e,t,n,r){t<0&&(t=4294967295+t+1);for(var i=0,o=Math.min(e.length-n,4);i<o;++i)e[n+i]=t>>>8*(r?i:3-i)&255}function U(e,t,n,r,i,o){if(n+r>e.length)throw new RangeError(\"Index out of range\");if(n<0)throw new RangeError(\"Index out of range\")}function j(e,t,n,r,i){return i||U(e,t,n,4,3.4028234663852886e38,-3.4028234663852886e38),Z.write(e,t,n,r,23,4),n+4}function z(e,t,n,r,i){return i||U(e,t,n,8,1.7976931348623157e308,-1.7976931348623157e308),Z.write(e,t,n,r,52,8),n+8}function J(e){if(e=X(e).replace(te,\"\"),e.length<2)return\"\";for(;e.length%4!==0;)e+=\"=\";return e}function X(e){return e.trim?e.trim():e.replace(/^\\s+|\\s+$/g,\"\")}function Y(e){return e<16?\"0\"+e.toString(16):e.toString(16)}function K(e,t){t=t||1/0;for(var n,r=e.length,i=null,o=[],s=0;s<r;++s){if(n=e.charCodeAt(s),n>55295&&n<57344){if(!i){if(n>56319){(t-=3)>-1&&o.push(239,191,189);continue}if(s+1===r){(t-=3)>-1&&o.push(239,191,189);continue}i=n;continue}if(n<56320){(t-=3)>-1&&o.push(239,191,189),i=n;continue}n=(i-55296<<10|n-56320)+65536}else i&&(t-=3)>-1&&o.push(239,191,189);if(i=null,n<128){if((t-=1)<0)break;o.push(n)}else if(n<2048){if((t-=2)<0)break;o.push(n>>6|192,63&n|128)}else if(n<65536){if((t-=3)<0)break;o.push(n>>12|224,n>>6&63|128,63&n|128)}else{if(!(n<1114112))throw new Error(\"Invalid code point\");if((t-=4)<0)break;o.push(n>>18|240,n>>12&63|128,n>>6&63|128,63&n|128)}}return o}function W(e){for(var t=[],n=0;n<e.length;++n)t.push(255&e.charCodeAt(n));return t}function H(e,t){for(var n,r,i,o=[],s=0;s<e.length&&!((t-=2)<0);++s)n=e.charCodeAt(s),r=n>>8,i=n%256,o.push(i),o.push(r);return o}function q(e){return $.toByteArray(J(e))}function G(e,t,n,r){for(var i=0;i<r&&!(i+n>=t.length||i>=e.length);++i)t[i+n]=e[i];return i}function V(e){return e!==e}var $=n(205),Z=n(206),Q=n(207);t.Buffer=s,t.SlowBuffer=g,t.INSPECT_MAX_BYTES=50,s.TYPED_ARRAY_SUPPORT=void 0!==e.TYPED_ARRAY_SUPPORT?e.TYPED_ARRAY_SUPPORT:r(),t.kMaxLength=i(),s.poolSize=8192,s._augment=function(e){return e.__proto__=s.prototype,e},s.from=function(e,t,n){return a(null,e,t,n)},s.TYPED_ARRAY_SUPPORT&&(s.prototype.__proto__=Uint8Array.prototype,s.__proto__=Uint8Array,\"undefined\"!=typeof Symbol&&Symbol.species&&s[Symbol.species]===s&&Object.defineProperty(s,Symbol.species,{value:null,configurable:!0})),s.alloc=function(e,t,n){return c(null,e,t,n)},s.allocUnsafe=function(e){return l(null,e)},s.allocUnsafeSlow=function(e){return l(null,e)},s.isBuffer=function(e){return!(null==e||!e._isBuffer)},s.compare=function(e,t){if(!s.isBuffer(e)||!s.isBuffer(t))throw new TypeError(\"Arguments must be Buffers\");if(e===t)return 0;for(var n=e.length,r=t.length,i=0,o=Math.min(n,r);i<o;++i)if(e[i]!==t[i]){n=e[i],r=t[i];break}return n<r?-1:r<n?1:0},s.isEncoding=function(e){switch(String(e).toLowerCase()){case\"hex\":case\"utf8\":case\"utf-8\":case\"ascii\":case\"latin1\":case\"binary\":case\"base64\":case\"ucs2\":case\"ucs-2\":case\"utf16le\":case\"utf-16le\":return!0;default:return!1}},s.concat=function(e,t){if(!Q(e))throw new TypeError('\"list\" argument must be an Array of Buffers');if(0===e.length)return s.alloc(0);var n;if(void 0===t)for(t=0,n=0;n<e.length;++n)t+=e[n].length;var r=s.allocUnsafe(t),i=0;for(n=0;n<e.length;++n){var o=e[n];if(!s.isBuffer(o))throw new TypeError('\"list\" argument must be an Array of Buffers');o.copy(r,i),i+=o.length}return r},s.byteLength=x,s.prototype._isBuffer=!0,s.prototype.swap16=function(){var e=this.length;if(e%2!==0)throw new RangeError(\"Buffer size must be a multiple of 16-bits\");for(var t=0;t<e;t+=2)v(this,t,t+1);return this},s.prototype.swap32=function(){var e=this.length;if(e%4!==0)throw new RangeError(\"Buffer size must be a multiple of 32-bits\");for(var t=0;t<e;t+=4)v(this,t,t+3),v(this,t+1,t+2);return this},s.prototype.swap64=function(){var e=this.length;if(e%8!==0)throw new RangeError(\"Buffer size must be a multiple of 64-bits\");for(var t=0;t<e;t+=8)v(this,t,t+7),v(this,t+1,t+6),v(this,t+2,t+5),v(this,t+3,t+4);return this},s.prototype.toString=function(){var e=0|this.length;return 0===e?\"\":0===arguments.length?T(this,0,e):y.apply(this,arguments)},s.prototype.equals=function(e){if(!s.isBuffer(e))throw new TypeError(\"Argument must be a Buffer\");return this===e||0===s.compare(this,e)},s.prototype.inspect=function(){var e=\"\",n=t.INSPECT_MAX_BYTES;return this.length>0&&(e=this.toString(\"hex\",0,n).match(/.{2}/g).join(\" \"),this.length>n&&(e+=\" ... \")),\"<Buffer \"+e+\">\"},s.prototype.compare=function(e,t,n,r,i){if(!s.isBuffer(e))throw new TypeError(\"Argument must be a Buffer\");if(void 0===t&&(t=0),void 0===n&&(n=e?e.length:0),void 0===r&&(r=0),void 0===i&&(i=this.length),t<0||n>e.length||r<0||i>this.length)throw new RangeError(\"out of range index\");if(r>=i&&t>=n)return 0;if(r>=i)return-1;if(t>=n)return 1;if(t>>>=0,n>>>=0,r>>>=0,i>>>=0,this===e)return 0;for(var o=i-r,a=n-t,u=Math.min(o,a),c=this.slice(r,i),l=e.slice(t,n),h=0;h<u;++h)if(c[h]!==l[h]){o=c[h],a=l[h];break}return o<a?-1:a<o?1:0},s.prototype.includes=function(e,t,n){return this.indexOf(e,t,n)!==-1},s.prototype.indexOf=function(e,t,n){return b(this,e,t,n,!0)},s.prototype.lastIndexOf=function(e,t,n){return b(this,e,t,n,!1)},s.prototype.write=function(e,t,n,r){if(void 0===t)r=\"utf8\",n=this.length,t=0;else if(void 0===n&&\"string\"==typeof t)r=t,n=this.length,t=0;else{if(!isFinite(t))throw new Error(\"Buffer.write(string, encoding, offset[, length]) is no longer supported\");t|=0,isFinite(n)?(n|=0,void 0===r&&(r=\"utf8\")):(r=n,n=void 0)}var i=this.length-t;if((void 0===n||n>i)&&(n=i),e.length>0&&(n<0||t<0)||t>this.length)throw new RangeError(\"Attempt to write outside buffer bounds\");r||(r=\"utf8\");for(var o=!1;;)switch(r){case\"hex\":return w(this,e,t,n);case\"utf8\":case\"utf-8\":return E(this,e,t,n);case\"ascii\":return k(this,e,t,n);case\"latin1\":case\"binary\":return A(this,e,t,n);case\"base64\":return C(this,e,t,n);case\"ucs2\":case\"ucs-2\":case\"utf16le\":case\"utf-16le\":return S(this,e,t,n);default:if(o)throw new TypeError(\"Unknown encoding: \"+r);r=(\"\"+r).toLowerCase(),o=!0}},s.prototype.toJSON=function(){return{type:\"Buffer\",data:Array.prototype.slice.call(this._arr||this,0)}};var ee=4096;s.prototype.slice=function(e,t){var n=this.length;e=~~e,t=void 0===t?n:~~t,e<0?(e+=n,e<0&&(e=0)):e>n&&(e=n),t<0?(t+=n,t<0&&(t=0)):t>n&&(t=n),t<e&&(t=e);var r;if(s.TYPED_ARRAY_SUPPORT)r=this.subarray(e,t),r.__proto__=s.prototype;else{var i=t-e;r=new s(i,void 0);for(var o=0;o<i;++o)r[o]=this[o+e]}return r},s.prototype.readUIntLE=function(e,t,n){e|=0,t|=0,n||O(e,t,this.length);for(var r=this[e],i=1,o=0;++o<t&&(i*=256);)r+=this[e+o]*i;return r},s.prototype.readUIntBE=function(e,t,n){e|=0,t|=0,n||O(e,t,this.length);for(var r=this[e+--t],i=1;t>0&&(i*=256);)r+=this[e+--t]*i;return r},s.prototype.readUInt8=function(e,t){return t||O(e,1,this.length),this[e]},s.prototype.readUInt16LE=function(e,t){return t||O(e,2,this.length),this[e]|this[e+1]<<8},s.prototype.readUInt16BE=function(e,t){return t||O(e,2,this.length),this[e]<<8|this[e+1]},s.prototype.readUInt32LE=function(e,t){return t||O(e,4,this.length),(this[e]|this[e+1]<<8|this[e+2]<<16)+16777216*this[e+3]},s.prototype.readUInt32BE=function(e,t){return t||O(e,4,this.length),16777216*this[e]+(this[e+1]<<16|this[e+2]<<8|this[e+3])},s.prototype.readIntLE=function(e,t,n){e|=0,t|=0,n||O(e,t,this.length);for(var r=this[e],i=1,o=0;++o<t&&(i*=256);)r+=this[e+o]*i;return i*=128,r>=i&&(r-=Math.pow(2,8*t)),r},s.prototype.readIntBE=function(e,t,n){e|=0,t|=0,n||O(e,t,this.length);for(var r=t,i=1,o=this[e+--r];r>0&&(i*=256);)o+=this[e+--r]*i;return i*=128,o>=i&&(o-=Math.pow(2,8*t)),o},s.prototype.readInt8=function(e,t){return t||O(e,1,this.length),128&this[e]?(255-this[e]+1)*-1:this[e]},s.prototype.readInt16LE=function(e,t){t||O(e,2,this.length);var n=this[e]|this[e+1]<<8;return 32768&n?4294901760|n:n},s.prototype.readInt16BE=function(e,t){t||O(e,2,this.length);var n=this[e+1]|this[e]<<8;return 32768&n?4294901760|n:n},s.prototype.readInt32LE=function(e,t){return t||O(e,4,this.length),this[e]|this[e+1]<<8|this[e+2]<<16|this[e+3]<<24},s.prototype.readInt32BE=function(e,t){return t||O(e,4,this.length),this[e]<<24|this[e+1]<<16|this[e+2]<<8|this[e+3]},s.prototype.readFloatLE=function(e,t){return t||O(e,4,this.length),Z.read(this,e,!0,23,4)},s.prototype.readFloatBE=function(e,t){return t||O(e,4,this.length),Z.read(this,e,!1,23,4)},s.prototype.readDoubleLE=function(e,t){return t||O(e,8,this.length),Z.read(this,e,!0,52,8)},s.prototype.readDoubleBE=function(e,t){return t||O(e,8,this.length),Z.read(this,e,!1,52,8)},s.prototype.writeUIntLE=function(e,t,n,r){if(e=+e,t|=0,n|=0,!r){var i=Math.pow(2,8*n)-1;_(this,e,t,n,i,0)}var o=1,s=0;for(this[t]=255&e;++s<n&&(o*=256);)this[t+s]=e/o&255;return t+n},s.prototype.writeUIntBE=function(e,t,n,r){if(e=+e,t|=0,n|=0,!r){var i=Math.pow(2,8*n)-1;_(this,e,t,n,i,0)}var o=n-1,s=1;for(this[t+o]=255&e;--o>=0&&(s*=256);)this[t+o]=e/s&255;return t+n},s.prototype.writeUInt8=function(e,t,n){return e=+e,t|=0,n||_(this,e,t,1,255,0),s.TYPED_ARRAY_SUPPORT||(e=Math.floor(e)),this[t]=255&e,t+1},s.prototype.writeUInt16LE=function(e,t,n){return e=+e,t|=0,n||_(this,e,t,2,65535,0),s.TYPED_ARRAY_SUPPORT?(this[t]=255&e,this[t+1]=e>>>8):L(this,e,t,!0),t+2},s.prototype.writeUInt16BE=function(e,t,n){return e=+e,t|=0,n||_(this,e,t,2,65535,0),s.TYPED_ARRAY_SUPPORT?(this[t]=e>>>8,this[t+1]=255&e):L(this,e,t,!1),t+2},s.prototype.writeUInt32LE=function(e,t,n){return e=+e,t|=0,n||_(this,e,t,4,4294967295,0),s.TYPED_ARRAY_SUPPORT?(this[t+3]=e>>>24,this[t+2]=e>>>16,this[t+1]=e>>>8,this[t]=255&e):R(this,e,t,!0),t+4},s.prototype.writeUInt32BE=function(e,t,n){return e=+e,t|=0,n||_(this,e,t,4,4294967295,0),s.TYPED_ARRAY_SUPPORT?(this[t]=e>>>24,this[t+1]=e>>>16,this[t+2]=e>>>8,this[t+3]=255&e):R(this,e,t,!1),t+4},s.prototype.writeIntLE=function(e,t,n,r){if(e=+e,t|=0,!r){var i=Math.pow(2,8*n-1);_(this,e,t,n,i-1,-i)}var o=0,s=1,a=0;for(this[t]=255&e;++o<n&&(s*=256);)e<0&&0===a&&0!==this[t+o-1]&&(a=1),this[t+o]=(e/s>>0)-a&255;return t+n},s.prototype.writeIntBE=function(e,t,n,r){if(e=+e,t|=0,!r){var i=Math.pow(2,8*n-1);_(this,e,t,n,i-1,-i)}var o=n-1,s=1,a=0;for(this[t+o]=255&e;--o>=0&&(s*=256);)e<0&&0===a&&0!==this[t+o+1]&&(a=1),this[t+o]=(e/s>>0)-a&255;return t+n},s.prototype.writeInt8=function(e,t,n){return e=+e,t|=0,n||_(this,e,t,1,127,-128),s.TYPED_ARRAY_SUPPORT||(e=Math.floor(e)),e<0&&(e=255+e+1),this[t]=255&e,t+1},s.prototype.writeInt16LE=function(e,t,n){return e=+e,t|=0,n||_(this,e,t,2,32767,-32768),s.TYPED_ARRAY_SUPPORT?(this[t]=255&e,this[t+1]=e>>>8):L(this,e,t,!0),t+2},s.prototype.writeInt16BE=function(e,t,n){return e=+e,t|=0,n||_(this,e,t,2,32767,-32768),s.TYPED_ARRAY_SUPPORT?(this[t]=e>>>8,this[t+1]=255&e):L(this,e,t,!1),t+2},s.prototype.writeInt32LE=function(e,t,n){return e=+e,t|=0,n||_(this,e,t,4,2147483647,-2147483648),s.TYPED_ARRAY_SUPPORT?(this[t]=255&e,this[t+1]=e>>>8,this[t+2]=e>>>16,this[t+3]=e>>>24):R(this,e,t,!0),t+4},s.prototype.writeInt32BE=function(e,t,n){return e=+e,t|=0,n||_(this,e,t,4,2147483647,-2147483648),e<0&&(e=4294967295+e+1),s.TYPED_ARRAY_SUPPORT?(this[t]=e>>>24,this[t+1]=e>>>16,this[t+2]=e>>>8,this[t+3]=255&e):R(this,e,t,!1),t+4},s.prototype.writeFloatLE=function(e,t,n){return j(this,e,t,!0,n)},s.prototype.writeFloatBE=function(e,t,n){return j(this,e,t,!1,n)},s.prototype.writeDoubleLE=function(e,t,n){return z(this,e,t,!0,n)},s.prototype.writeDoubleBE=function(e,t,n){return z(this,e,t,!1,n)},s.prototype.copy=function(e,t,n,r){if(n||(n=0),r||0===r||(r=this.length),t>=e.length&&(t=e.length),t||(t=0),r>0&&r<n&&(r=n),r===n)return 0;if(0===e.length||0===this.length)return 0;if(t<0)throw new RangeError(\"targetStart out of bounds\");if(n<0||n>=this.length)throw new RangeError(\"sourceStart out of bounds\");if(r<0)throw new RangeError(\"sourceEnd out of bounds\");r>this.length&&(r=this.length),e.length-t<r-n&&(r=e.length-t+n);var i,o=r-n;if(this===e&&n<t&&t<r)for(i=o-1;i>=0;--i)e[i+t]=this[i+n];else if(o<1e3||!s.TYPED_ARRAY_SUPPORT)for(i=0;i<o;++i)e[i+t]=this[i+n];else Uint8Array.prototype.set.call(e,this.subarray(n,n+o),t);return o},s.prototype.fill=function(e,t,n,r){if(\"string\"==typeof e){if(\"string\"==typeof t?(r=t,t=0,n=this.length):\"string\"==typeof n&&(r=n,n=this.length),1===e.length){var i=e.charCodeAt(0);i<256&&(e=i)}if(void 0!==r&&\"string\"!=typeof r)throw new TypeError(\"encoding must be a string\");if(\"string\"==typeof r&&!s.isEncoding(r))throw new TypeError(\"Unknown encoding: \"+r)}else\"number\"==typeof e&&(e&=255);if(t<0||this.length<t||this.length<n)throw new RangeError(\"Out of range index\");if(n<=t)return this;t>>>=0,n=void 0===n?this.length:n>>>0,e||(e=0);var o;if(\"number\"==typeof e)for(o=t;o<n;++o)this[o]=e;else{var a=s.isBuffer(e)?e:K(new s(e,r).toString()),u=a.length;for(o=0;o<n-t;++o)this[o+t]=a[o%u]}return this};var te=/[^+\\/0-9A-Za-z-_]/g}).call(t,function(){return this}())},function(e,t){\"use strict\";function n(e){var t=e.length;if(t%4>0)throw new Error(\"Invalid string. Length must be a multiple of 4\");return\"=\"===e[t-2]?2:\"=\"===e[t-1]?1:0}function r(e){return 3*e.length/4-n(e)}function i(e){var t,r,i,o,s,a=e.length;o=n(e),s=new l(3*a/4-o),r=o>0?a-4:a;var u=0;for(t=0;t<r;t+=4)i=c[e.charCodeAt(t)]<<18|c[e.charCodeAt(t+1)]<<12|c[e.charCodeAt(t+2)]<<6|c[e.charCodeAt(t+3)],s[u++]=i>>16&255,s[u++]=i>>8&255,s[u++]=255&i;return 2===o?(i=c[e.charCodeAt(t)]<<2|c[e.charCodeAt(t+1)]>>4,s[u++]=255&i):1===o&&(i=c[e.charCodeAt(t)]<<10|c[e.charCodeAt(t+1)]<<4|c[e.charCodeAt(t+2)]>>2,s[u++]=i>>8&255,s[u++]=255&i),s}function o(e){return u[e>>18&63]+u[e>>12&63]+u[e>>6&63]+u[63&e]}function s(e,t,n){for(var r,i=[],s=t;s<n;s+=3)r=(e[s]<<16)+(e[s+1]<<8)+e[s+2],i.push(o(r));return i.join(\"\")}function a(e){for(var t,n=e.length,r=n%3,i=\"\",o=[],a=16383,c=0,l=n-r;c<l;c+=a)o.push(s(e,c,c+a>l?l:c+a));return 1===r?(t=e[n-1],i+=u[t>>2],i+=u[t<<4&63],i+=\"==\"):2===r&&(t=(e[n-2]<<8)+e[n-1],i+=u[t>>10],i+=u[t>>4&63],i+=u[t<<2&63],i+=\"=\"),o.push(i),o.join(\"\")}t.byteLength=r,t.toByteArray=i,t.fromByteArray=a;for(var u=[],c=[],l=\"undefined\"!=typeof Uint8Array?Uint8Array:Array,h=\"ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/\",p=0,f=h.length;p<f;++p)u[p]=h[p],c[h.charCodeAt(p)]=p;c[\"-\".charCodeAt(0)]=62,c[\"_\".charCodeAt(0)]=63},function(e,t){t.read=function(e,t,n,r,i){var o,s,a=8*i-r-1,u=(1<<a)-1,c=u>>1,l=-7,h=n?i-1:0,p=n?-1:1,f=e[t+h];for(h+=p,o=f&(1<<-l)-1,f>>=-l,l+=a;l>0;o=256*o+e[t+h],h+=p,l-=8);for(s=o&(1<<-l)-1,o>>=-l,l+=r;l>0;s=256*s+e[t+h],h+=p,l-=8);if(0===o)o=1-c;else{if(o===u)return s?NaN:(f?-1:1)*(1/0);s+=Math.pow(2,r),o-=c}return(f?-1:1)*s*Math.pow(2,o-r)},t.write=function(e,t,n,r,i,o){var s,a,u,c=8*o-i-1,l=(1<<c)-1,h=l>>1,p=23===i?Math.pow(2,-24)-Math.pow(2,-77):0,f=r?0:o-1,d=r?1:-1,m=t<0||0===t&&1/t<0?1:0;for(t=Math.abs(t),isNaN(t)||t===1/0?(a=isNaN(t)?1:0,s=l):(s=Math.floor(Math.log(t)/Math.LN2),t*(u=Math.pow(2,-s))<1&&(s--,u*=2),t+=s+h>=1?p/u:p*Math.pow(2,1-h),t*u>=2&&(s++,u/=2),s+h>=l?(a=0,s=l):s+h>=1?(a=(t*u-1)*Math.pow(2,i),s+=h):(a=t*Math.pow(2,h-1)*Math.pow(2,i),s=0));i>=8;e[n+f]=255&a,f+=d,a/=256,i-=8);for(s=s<<i|a,c+=i;c>0;e[n+f]=255&s,f+=d,s/=256,c-=8);e[n+f-d]|=128*m}},function(e,t){var n={}.toString;e.exports=Array.isArray||function(e){return\"[object Array]\"==n.call(e)}},function(e,t,n){\"use strict\";function r(e){if(null===e)return!0;var t,n,r,i,o,u=[],c=e;for(t=0,n=c.length;t<n;t+=1){if(r=c[t],o=!1,\"[object Object]\"!==a.call(r))return!1;for(i in r)if(s.call(r,i)){if(o)return!1;o=!0}if(!o)return!1;if(u.indexOf(i)!==-1)return!1;u.push(i)}return!0}function i(e){return null!==e?e:[]}var o=n(190),s=Object.prototype.hasOwnProperty,a=Object.prototype.toString;e.exports=new o(\"tag:yaml.org,2002:omap\",{kind:\"sequence\",resolve:r,construct:i})},function(e,t,n){\"use strict\";function r(e){if(null===e)return!0;var t,n,r,i,o,a=e;for(o=new Array(a.length),t=0,n=a.length;t<n;t+=1){if(r=a[t],\"[object Object]\"!==s.call(r))return!1;if(i=Object.keys(r),1!==i.length)return!1;o[t]=[i[0],r[i[0]]]}return!0}function i(e){if(null===e)return[];var t,n,r,i,o,s=e;for(o=new Array(s.length),t=0,n=s.length;t<n;t+=1)r=s[t],i=Object.keys(r),o[t]=[i[0],r[i[0]]];return o}var o=n(190),s=Object.prototype.toString;e.exports=new o(\"tag:yaml.org,2002:pairs\",{kind:\"sequence\",resolve:r,construct:i})},function(e,t,n){\"use strict\";function r(e){if(null===e)return!0;var t,n=e;for(t in n)if(s.call(n,t)&&null!==n[t])return!1;return!0}function i(e){return null!==e?e:{}}var o=n(190),s=Object.prototype.hasOwnProperty;e.exports=new o(\"tag:yaml.org,2002:set\",{kind:\"mapping\",resolve:r,construct:i})},function(e,t,n){\"use strict\";var r=n(189);e.exports=r.DEFAULT=new r({include:[n(188)],explicit:[n(212),n(213),n(214)]})},function(e,t,n){\"use strict\";function r(){return!0}function i(){}function o(){return\"\"}function s(e){return\"undefined\"==typeof e}var a=n(190);e.exports=new a(\"tag:yaml.org,2002:js/undefined\",{kind:\"scalar\",resolve:r,construct:i,predicate:s,represent:o})},function(e,t,n){\"use strict\";function r(e){if(null===e)return!1;if(0===e.length)return!1;var t=e,n=/\\/([gim]*)$/.exec(e),r=\"\";if(\"/\"===t[0]){if(n&&(r=n[1]),r.length>3)return!1;if(\"/\"!==t[t.length-r.length-1])return!1}return!0}function i(e){var t=e,n=/\\/([gim]*)$/.exec(e),r=\"\";return\"/\"===t[0]&&(n&&(r=n[1]),t=t.slice(1,t.length-r.length-1)),new RegExp(t,r)}function o(e){var t=\"/\"+e.source+\"/\";return e.global&&(t+=\"g\"),e.multiline&&(t+=\"m\"),e.ignoreCase&&(t+=\"i\"),t}function s(e){return\"[object RegExp]\"===Object.prototype.toString.call(e)}var a=n(190);e.exports=new a(\"tag:yaml.org,2002:js/regexp\",{kind:\"scalar\",resolve:r,construct:i,predicate:s,represent:o})},function(e,t,n){function r(e){if(null===e)return!1;try{var t=\"(\"+e+\")\",n=a.parse(t,{range:!0});return\"Program\"===n.type&&1===n.body.length&&\"ExpressionStatement\"===n.body[0].type&&\"FunctionExpression\"===n.body[0].expression.type}catch(e){return!1}}function i(e){var t,n=\"(\"+e+\")\",r=a.parse(n,{range:!0}),i=[];if(\"Program\"!==r.type||1!==r.body.length||\"ExpressionStatement\"!==r.body[0].type||\"FunctionExpression\"!==r.body[0].expression.type)throw new Error(\"Failed to resolve function\");return r.body[0].expression.params.forEach(function(e){i.push(e.name)}),t=r.body[0].expression.body.range,new Function(i,n.slice(t[0]+1,t[1]-1))}function o(e){return e.toString()}function s(e){return\"[object Function]\"===Object.prototype.toString.call(e)}var a;try{a=n(215)}catch(e){\"undefined\"!=typeof window&&(a=window.esprima)}var u=n(190);e.exports=new u(\"tag:yaml.org,2002:js/function\",{kind:\"scalar\",resolve:r,construct:i,predicate:s,represent:o})},function(e,t,n){!function(t,n){e.exports=n()}(this,function(){return function(e){function t(r){if(n[r])return n[r].exports;var i=n[r]={exports:{},id:r,loaded:!1};return e[r].call(i.exports,i,i.exports,t),i.loaded=!0,i.exports}var n={};return t.m=e,t.c=n,t.p=\"\",t(0)}([function(e,t,n){\"use strict\";function r(e,t,n){var r=null,i=function(e,t){n&&n(e,t),r&&r.visit(e,t)},u=\"function\"==typeof n?i:null,c=!1;if(t){c=\"boolean\"==typeof t.comment&&t.comment;var l=\"boolean\"==typeof t.attachComment&&t.attachComment;(c||l)&&(r=new o.CommentHandler,r.attach=l,t.comment=!0,u=i)}var h;h=t&&\"boolean\"==typeof t.jsx&&t.jsx?new a.JSXParser(e,t,u):new s.Parser(e,t,u);var p=h.parseProgram();return c&&(p.comments=r.comments),h.config.tokens&&(p.tokens=h.tokens),h.config.tolerant&&(p.errors=h.errorHandler.errors),p}function i(e,t,n){var r,i=new u.Tokenizer(e,t);r=[];try{for(;;){var o=i.getNextToken();if(!o)break;n&&(o=n(o)),r.push(o)}}catch(e){i.errorHandler.tolerate(e)}return i.errorHandler.tolerant&&(r.errors=i.errors()),r}var o=n(1),s=n(3),a=n(11),u=n(15);t.parse=r,t.tokenize=i;var c=n(2);t.Syntax=c.Syntax,t.version=\"3.1.3\"},function(e,t,n){\"use strict\";var r=n(2),i=function(){function e(){this.attach=!1,this.comments=[],this.stack=[],this.leading=[],this.trailing=[]}return e.prototype.insertInnerComments=function(e,t){if(e.type===r.Syntax.BlockStatement&&0===e.body.length){for(var n=[],i=this.leading.length-1;i>=0;--i){var o=this.leading[i];t.end.offset>=o.start&&(n.unshift(o.comment),this.leading.splice(i,1),this.trailing.splice(i,1))}n.length&&(e.innerComments=n)}},e.prototype.findTrailingComments=function(e,t){var n=[];if(this.trailing.length>0){for(var r=this.trailing.length-1;r>=0;--r){var i=this.trailing[r];i.start>=t.end.offset&&n.unshift(i.comment)}return this.trailing.length=0,n}var o=this.stack[this.stack.length-1];if(o&&o.node.trailingComments){var s=o.node.trailingComments[0];s&&s.range[0]>=t.end.offset&&(n=o.node.trailingComments,delete o.node.trailingComments)}return n},e.prototype.findLeadingComments=function(e,t){for(var n,r=[];this.stack.length>0;){var i=this.stack[this.stack.length-1];if(!(i&&i.start>=t.start.offset))break;n=this.stack.pop().node}if(n){for(var o=n.leadingComments?n.leadingComments.length:0,s=o-1;s>=0;--s){var a=n.leadingComments[s];a.range[1]<=t.start.offset&&(r.unshift(a),n.leadingComments.splice(s,1))}return n.leadingComments&&0===n.leadingComments.length&&delete n.leadingComments,r}for(var s=this.leading.length-1;s>=0;--s){var i=this.leading[s];i.start<=t.start.offset&&(r.unshift(i.comment),this.leading.splice(s,1))}return r},e.prototype.visitNode=function(e,t){if(!(e.type===r.Syntax.Program&&e.body.length>0)){this.insertInnerComments(e,t);var n=this.findTrailingComments(e,t),i=this.findLeadingComments(e,t);i.length>0&&(e.leadingComments=i),n.length>0&&(e.trailingComments=n),this.stack.push({node:e,start:t.start.offset})}},e.prototype.visitComment=function(e,t){var n=\"L\"===e.type[0]?\"Line\":\"Block\",r={type:n,value:e.value};if(e.range&&(r.range=e.range),e.loc&&(r.loc=e.loc),this.comments.push(r),this.attach){var i={comment:{type:n,value:e.value,range:[t.start.offset,t.end.offset]},start:t.start.offset};e.loc&&(i.comment.loc=e.loc),e.type=n,this.leading.push(i),this.trailing.push(i)}},e.prototype.visit=function(e,t){\"LineComment\"===e.type?this.visitComment(e,t):\"BlockComment\"===e.type?this.visitComment(e,t):this.attach&&this.visitNode(e,t)},e}();t.CommentHandler=i},function(e,t){\"use strict\";t.Syntax={AssignmentExpression:\"AssignmentExpression\",AssignmentPattern:\"AssignmentPattern\",ArrayExpression:\"ArrayExpression\",ArrayPattern:\"ArrayPattern\",ArrowFunctionExpression:\"ArrowFunctionExpression\",BlockStatement:\"BlockStatement\",BinaryExpression:\"BinaryExpression\",BreakStatement:\"BreakStatement\",CallExpression:\"CallExpression\",CatchClause:\"CatchClause\",ClassBody:\"ClassBody\",ClassDeclaration:\"ClassDeclaration\",ClassExpression:\"ClassExpression\",ConditionalExpression:\"ConditionalExpression\",ContinueStatement:\"ContinueStatement\",DoWhileStatement:\"DoWhileStatement\",DebuggerStatement:\"DebuggerStatement\",EmptyStatement:\"EmptyStatement\",ExportAllDeclaration:\"ExportAllDeclaration\",ExportDefaultDeclaration:\"ExportDefaultDeclaration\",ExportNamedDeclaration:\"ExportNamedDeclaration\",ExportSpecifier:\"ExportSpecifier\",ExpressionStatement:\"ExpressionStatement\",ForStatement:\"ForStatement\",ForOfStatement:\"ForOfStatement\",ForInStatement:\"ForInStatement\",FunctionDeclaration:\"FunctionDeclaration\",FunctionExpression:\"FunctionExpression\",Identifier:\"Identifier\",IfStatement:\"IfStatement\",ImportDeclaration:\"ImportDeclaration\",ImportDefaultSpecifier:\"ImportDefaultSpecifier\",ImportNamespaceSpecifier:\"ImportNamespaceSpecifier\",ImportSpecifier:\"ImportSpecifier\",Literal:\"Literal\",LabeledStatement:\"LabeledStatement\",LogicalExpression:\"LogicalExpression\",MemberExpression:\"MemberExpression\",MetaProperty:\"MetaProperty\",MethodDefinition:\"MethodDefinition\",NewExpression:\"NewExpression\",ObjectExpression:\"ObjectExpression\",ObjectPattern:\"ObjectPattern\",Program:\"Program\",Property:\"Property\",RestElement:\"RestElement\",ReturnStatement:\"ReturnStatement\",SequenceExpression:\"SequenceExpression\",SpreadElement:\"SpreadElement\",Super:\"Super\",SwitchCase:\"SwitchCase\",SwitchStatement:\"SwitchStatement\",TaggedTemplateExpression:\"TaggedTemplateExpression\",TemplateElement:\"TemplateElement\",TemplateLiteral:\"TemplateLiteral\",ThisExpression:\"ThisExpression\",ThrowStatement:\"ThrowStatement\",TryStatement:\"TryStatement\",UnaryExpression:\"UnaryExpression\",UpdateExpression:\"UpdateExpression\",VariableDeclaration:\"VariableDeclaration\",VariableDeclarator:\"VariableDeclarator\",WhileStatement:\"WhileStatement\",WithStatement:\"WithStatement\",YieldExpression:\"YieldExpression\"}},function(e,t,n){\"use strict\";var r=n(4),i=n(5),o=n(6),s=n(7),a=n(8),u=n(2),c=n(10),l=\"ArrowParameterPlaceHolder\",h=function(){function e(e,t,n){void 0===t&&(t={}),this.config={range:\"boolean\"==typeof t.range&&t.range,loc:\"boolean\"==typeof t.loc&&t.loc,source:null,tokens:\"boolean\"==typeof t.tokens&&t.tokens,comment:\"boolean\"==typeof t.comment&&t.comment,tolerant:\"boolean\"==typeof t.tolerant&&t.tolerant},this.config.loc&&t.source&&null!==t.source&&(this.config.source=String(t.source)),this.delegate=n,this.errorHandler=new o.ErrorHandler,this.errorHandler.tolerant=this.config.tolerant,this.scanner=new a.Scanner(e,this.errorHandler),this.scanner.trackComment=this.config.comment,this.operatorPrecedence={\")\":0,\";\":0,\",\":0,\"=\":0,\"]\":0,\"||\":1,\"&&\":2,\n\"|\":3,\"^\":4,\"&\":5,\"==\":6,\"!=\":6,\"===\":6,\"!==\":6,\"<\":7,\">\":7,\"<=\":7,\">=\":7,\"<<\":8,\">>\":8,\">>>\":8,\"+\":9,\"-\":9,\"*\":11,\"/\":11,\"%\":11},this.sourceType=t&&\"module\"===t.sourceType?\"module\":\"script\",this.lookahead=null,this.hasLineTerminator=!1,this.context={allowIn:!0,allowYield:!0,firstCoverInitializedNameError:null,isAssignmentTarget:!1,isBindingElement:!1,inFunctionBody:!1,inIteration:!1,inSwitch:!1,labelSet:{},strict:\"module\"===this.sourceType},this.tokens=[],this.startMarker={index:0,lineNumber:this.scanner.lineNumber,lineStart:0},this.lastMarker={index:0,lineNumber:this.scanner.lineNumber,lineStart:0},this.nextToken(),this.lastMarker={index:this.scanner.index,lineNumber:this.scanner.lineNumber,lineStart:this.scanner.lineStart}}return e.prototype.throwError=function(e){for(var t=[],n=1;n<arguments.length;n++)t[n-1]=arguments[n];var i=Array.prototype.slice.call(arguments,1),o=e.replace(/%(\\d)/g,function(e,t){return r.assert(t<i.length,\"Message reference must be in range\"),i[t]}),s=this.lastMarker.index,a=this.lastMarker.lineNumber,u=this.lastMarker.index-this.lastMarker.lineStart+1;throw this.errorHandler.createError(s,a,u,o)},e.prototype.tolerateError=function(e){for(var t=[],n=1;n<arguments.length;n++)t[n-1]=arguments[n];var i=Array.prototype.slice.call(arguments,1),o=e.replace(/%(\\d)/g,function(e,t){return r.assert(t<i.length,\"Message reference must be in range\"),i[t]}),s=this.lastMarker.index,a=this.scanner.lineNumber,u=this.lastMarker.index-this.lastMarker.lineStart+1;this.errorHandler.tolerateError(s,a,u,o)},e.prototype.unexpectedTokenError=function(e,t){var n,r=t||i.Messages.UnexpectedToken;if(e?(t||(r=e.type===s.Token.EOF?i.Messages.UnexpectedEOS:e.type===s.Token.Identifier?i.Messages.UnexpectedIdentifier:e.type===s.Token.NumericLiteral?i.Messages.UnexpectedNumber:e.type===s.Token.StringLiteral?i.Messages.UnexpectedString:e.type===s.Token.Template?i.Messages.UnexpectedTemplate:i.Messages.UnexpectedToken,e.type===s.Token.Keyword&&(this.scanner.isFutureReservedWord(e.value)?r=i.Messages.UnexpectedReserved:this.context.strict&&this.scanner.isStrictModeReservedWord(e.value)&&(r=i.Messages.StrictReservedWord))),n=e.type===s.Token.Template?e.value.raw:e.value):n=\"ILLEGAL\",r=r.replace(\"%0\",n),e&&\"number\"==typeof e.lineNumber){var o=e.start,a=e.lineNumber,u=e.start-this.lastMarker.lineStart+1;return this.errorHandler.createError(o,a,u,r)}var o=this.lastMarker.index,a=this.lastMarker.lineNumber,u=o-this.lastMarker.lineStart+1;return this.errorHandler.createError(o,a,u,r)},e.prototype.throwUnexpectedToken=function(e,t){throw this.unexpectedTokenError(e,t)},e.prototype.tolerateUnexpectedToken=function(e,t){this.errorHandler.tolerate(this.unexpectedTokenError(e,t))},e.prototype.collectComments=function(){if(this.config.comment){var e=this.scanner.scanComments();if(e.length>0&&this.delegate)for(var t=0;t<e.length;++t){var n=e[t],r=void 0;r={type:n.multiLine?\"BlockComment\":\"LineComment\",value:this.scanner.source.slice(n.slice[0],n.slice[1])},this.config.range&&(r.range=n.range),this.config.loc&&(r.loc=n.loc);var i={start:{line:n.loc.start.line,column:n.loc.start.column,offset:n.range[0]},end:{line:n.loc.end.line,column:n.loc.end.column,offset:n.range[1]}};this.delegate(r,i)}}else this.scanner.scanComments()},e.prototype.getTokenRaw=function(e){return this.scanner.source.slice(e.start,e.end)},e.prototype.convertToken=function(e){var t;return t={type:s.TokenName[e.type],value:this.getTokenRaw(e)},this.config.range&&(t.range=[e.start,e.end]),this.config.loc&&(t.loc={start:{line:this.startMarker.lineNumber,column:this.startMarker.index-this.startMarker.lineStart},end:{line:this.scanner.lineNumber,column:this.scanner.index-this.scanner.lineStart}}),e.regex&&(t.regex=e.regex),t},e.prototype.nextToken=function(){var e=this.lookahead;this.lastMarker.index=this.scanner.index,this.lastMarker.lineNumber=this.scanner.lineNumber,this.lastMarker.lineStart=this.scanner.lineStart,this.collectComments(),this.startMarker.index=this.scanner.index,this.startMarker.lineNumber=this.scanner.lineNumber,this.startMarker.lineStart=this.scanner.lineStart;var t;return t=this.scanner.lex(),this.hasLineTerminator=!(!e||!t)&&e.lineNumber!==t.lineNumber,t&&this.context.strict&&t.type===s.Token.Identifier&&this.scanner.isStrictModeReservedWord(t.value)&&(t.type=s.Token.Keyword),this.lookahead=t,this.config.tokens&&t.type!==s.Token.EOF&&this.tokens.push(this.convertToken(t)),e},e.prototype.nextRegexToken=function(){this.collectComments();var e=this.scanner.scanRegExp();return this.config.tokens&&(this.tokens.pop(),this.tokens.push(this.convertToken(e))),this.lookahead=e,this.nextToken(),e},e.prototype.createNode=function(){return{index:this.startMarker.index,line:this.startMarker.lineNumber,column:this.startMarker.index-this.startMarker.lineStart}},e.prototype.startNode=function(e){return{index:e.start,line:e.lineNumber,column:e.start-e.lineStart}},e.prototype.finalize=function(e,t){if(this.config.range&&(t.range=[e.index,this.lastMarker.index]),this.config.loc&&(t.loc={start:{line:e.line,column:e.column},end:{line:this.lastMarker.lineNumber,column:this.lastMarker.index-this.lastMarker.lineStart}},this.config.source&&(t.loc.source=this.config.source)),this.delegate){var n={start:{line:e.line,column:e.column,offset:e.index},end:{line:this.lastMarker.lineNumber,column:this.lastMarker.index-this.lastMarker.lineStart,offset:this.lastMarker.index}};this.delegate(t,n)}return t},e.prototype.expect=function(e){var t=this.nextToken();t.type===s.Token.Punctuator&&t.value===e||this.throwUnexpectedToken(t)},e.prototype.expectCommaSeparator=function(){if(this.config.tolerant){var e=this.lookahead;e.type===s.Token.Punctuator&&\",\"===e.value?this.nextToken():e.type===s.Token.Punctuator&&\";\"===e.value?(this.nextToken(),this.tolerateUnexpectedToken(e)):this.tolerateUnexpectedToken(e,i.Messages.UnexpectedToken)}else this.expect(\",\")},e.prototype.expectKeyword=function(e){var t=this.nextToken();t.type===s.Token.Keyword&&t.value===e||this.throwUnexpectedToken(t)},e.prototype.match=function(e){return this.lookahead.type===s.Token.Punctuator&&this.lookahead.value===e},e.prototype.matchKeyword=function(e){return this.lookahead.type===s.Token.Keyword&&this.lookahead.value===e},e.prototype.matchContextualKeyword=function(e){return this.lookahead.type===s.Token.Identifier&&this.lookahead.value===e},e.prototype.matchAssign=function(){if(this.lookahead.type!==s.Token.Punctuator)return!1;var e=this.lookahead.value;return\"=\"===e||\"*=\"===e||\"**=\"===e||\"/=\"===e||\"%=\"===e||\"+=\"===e||\"-=\"===e||\"<<=\"===e||\">>=\"===e||\">>>=\"===e||\"&=\"===e||\"^=\"===e||\"|=\"===e},e.prototype.isolateCoverGrammar=function(e){var t=this.context.isBindingElement,n=this.context.isAssignmentTarget,r=this.context.firstCoverInitializedNameError;this.context.isBindingElement=!0,this.context.isAssignmentTarget=!0,this.context.firstCoverInitializedNameError=null;var i=e.call(this);return null!==this.context.firstCoverInitializedNameError&&this.throwUnexpectedToken(this.context.firstCoverInitializedNameError),this.context.isBindingElement=t,this.context.isAssignmentTarget=n,this.context.firstCoverInitializedNameError=r,i},e.prototype.inheritCoverGrammar=function(e){var t=this.context.isBindingElement,n=this.context.isAssignmentTarget,r=this.context.firstCoverInitializedNameError;this.context.isBindingElement=!0,this.context.isAssignmentTarget=!0,this.context.firstCoverInitializedNameError=null;var i=e.call(this);return this.context.isBindingElement=this.context.isBindingElement&&t,this.context.isAssignmentTarget=this.context.isAssignmentTarget&&n,this.context.firstCoverInitializedNameError=r||this.context.firstCoverInitializedNameError,i},e.prototype.consumeSemicolon=function(){this.match(\";\")?this.nextToken():this.hasLineTerminator||(this.lookahead.type===s.Token.EOF||this.match(\"}\")||this.throwUnexpectedToken(this.lookahead),this.lastMarker.index=this.startMarker.index,this.lastMarker.lineNumber=this.startMarker.lineNumber,this.lastMarker.lineStart=this.startMarker.lineStart)},e.prototype.parsePrimaryExpression=function(){var e,t,n,r,o=this.createNode();switch(this.lookahead.type){case s.Token.Identifier:\"module\"===this.sourceType&&\"await\"===this.lookahead.value&&this.tolerateUnexpectedToken(this.lookahead),e=this.finalize(o,new c.Identifier(this.nextToken().value));break;case s.Token.NumericLiteral:case s.Token.StringLiteral:this.context.strict&&this.lookahead.octal&&this.tolerateUnexpectedToken(this.lookahead,i.Messages.StrictOctalLiteral),this.context.isAssignmentTarget=!1,this.context.isBindingElement=!1,n=this.nextToken(),r=this.getTokenRaw(n),e=this.finalize(o,new c.Literal(n.value,r));break;case s.Token.BooleanLiteral:this.context.isAssignmentTarget=!1,this.context.isBindingElement=!1,n=this.nextToken(),n.value=\"true\"===n.value,r=this.getTokenRaw(n),e=this.finalize(o,new c.Literal(n.value,r));break;case s.Token.NullLiteral:this.context.isAssignmentTarget=!1,this.context.isBindingElement=!1,n=this.nextToken(),n.value=null,r=this.getTokenRaw(n),e=this.finalize(o,new c.Literal(n.value,r));break;case s.Token.Template:e=this.parseTemplateLiteral();break;case s.Token.Punctuator:switch(t=this.lookahead.value){case\"(\":this.context.isBindingElement=!1,e=this.inheritCoverGrammar(this.parseGroupExpression);break;case\"[\":e=this.inheritCoverGrammar(this.parseArrayInitializer);break;case\"{\":e=this.inheritCoverGrammar(this.parseObjectInitializer);break;case\"/\":case\"/=\":this.context.isAssignmentTarget=!1,this.context.isBindingElement=!1,this.scanner.index=this.startMarker.index,n=this.nextRegexToken(),r=this.getTokenRaw(n),e=this.finalize(o,new c.RegexLiteral(n.value,r,n.regex));break;default:this.throwUnexpectedToken(this.nextToken())}break;case s.Token.Keyword:!this.context.strict&&this.context.allowYield&&this.matchKeyword(\"yield\")?e=this.parseIdentifierName():!this.context.strict&&this.matchKeyword(\"let\")?e=this.finalize(o,new c.Identifier(this.nextToken().value)):(this.context.isAssignmentTarget=!1,this.context.isBindingElement=!1,this.matchKeyword(\"function\")?e=this.parseFunctionExpression():this.matchKeyword(\"this\")?(this.nextToken(),e=this.finalize(o,new c.ThisExpression)):this.matchKeyword(\"class\")?e=this.parseClassExpression():this.throwUnexpectedToken(this.nextToken()));break;default:this.throwUnexpectedToken(this.nextToken())}return e},e.prototype.parseSpreadElement=function(){var e=this.createNode();this.expect(\"...\");var t=this.inheritCoverGrammar(this.parseAssignmentExpression);return this.finalize(e,new c.SpreadElement(t))},e.prototype.parseArrayInitializer=function(){var e=this.createNode(),t=[];for(this.expect(\"[\");!this.match(\"]\");)if(this.match(\",\"))this.nextToken(),t.push(null);else if(this.match(\"...\")){var n=this.parseSpreadElement();this.match(\"]\")||(this.context.isAssignmentTarget=!1,this.context.isBindingElement=!1,this.expect(\",\")),t.push(n)}else t.push(this.inheritCoverGrammar(this.parseAssignmentExpression)),this.match(\"]\")||this.expect(\",\");return this.expect(\"]\"),this.finalize(e,new c.ArrayExpression(t))},e.prototype.parsePropertyMethod=function(e){this.context.isAssignmentTarget=!1,this.context.isBindingElement=!1;var t=this.context.strict,n=this.isolateCoverGrammar(this.parseFunctionSourceElements);return this.context.strict&&e.firstRestricted&&this.tolerateUnexpectedToken(e.firstRestricted,e.message),this.context.strict&&e.stricted&&this.tolerateUnexpectedToken(e.stricted,e.message),this.context.strict=t,n},e.prototype.parsePropertyMethodFunction=function(){var e=!1,t=this.createNode(),n=this.context.allowYield;this.context.allowYield=!1;var r=this.parseFormalParameters(),i=this.parsePropertyMethod(r);return this.context.allowYield=n,this.finalize(t,new c.FunctionExpression(null,r.params,i,e))},e.prototype.parseObjectPropertyKey=function(){var e=this.createNode(),t=this.nextToken(),n=null;switch(t.type){case s.Token.StringLiteral:case s.Token.NumericLiteral:this.context.strict&&t.octal&&this.tolerateUnexpectedToken(t,i.Messages.StrictOctalLiteral);var r=this.getTokenRaw(t);n=this.finalize(e,new c.Literal(t.value,r));break;case s.Token.Identifier:case s.Token.BooleanLiteral:case s.Token.NullLiteral:case s.Token.Keyword:n=this.finalize(e,new c.Identifier(t.value));break;case s.Token.Punctuator:\"[\"===t.value?(n=this.isolateCoverGrammar(this.parseAssignmentExpression),this.expect(\"]\")):this.throwUnexpectedToken(t);break;default:this.throwUnexpectedToken(t)}return n},e.prototype.isPropertyKey=function(e,t){return e.type===u.Syntax.Identifier&&e.name===t||e.type===u.Syntax.Literal&&e.value===t},e.prototype.parseObjectProperty=function(e){var t,n,r,o=this.createNode(),a=this.lookahead,u=!1,l=!1,h=!1;a.type===s.Token.Identifier?(this.nextToken(),n=this.finalize(o,new c.Identifier(a.value))):this.match(\"*\")?this.nextToken():(u=this.match(\"[\"),n=this.parseObjectPropertyKey());var p=this.qualifiedPropertyName(this.lookahead);if(a.type===s.Token.Identifier&&\"get\"===a.value&&p)t=\"get\",u=this.match(\"[\"),n=this.parseObjectPropertyKey(),this.context.allowYield=!1,r=this.parseGetterMethod();else if(a.type===s.Token.Identifier&&\"set\"===a.value&&p)t=\"set\",u=this.match(\"[\"),n=this.parseObjectPropertyKey(),r=this.parseSetterMethod();else if(a.type===s.Token.Punctuator&&\"*\"===a.value&&p)t=\"init\",u=this.match(\"[\"),n=this.parseObjectPropertyKey(),r=this.parseGeneratorMethod(),l=!0;else if(n||this.throwUnexpectedToken(this.lookahead),t=\"init\",this.match(\":\"))!u&&this.isPropertyKey(n,\"__proto__\")&&(e.value&&this.tolerateError(i.Messages.DuplicateProtoProperty),e.value=!0),this.nextToken(),r=this.inheritCoverGrammar(this.parseAssignmentExpression);else if(this.match(\"(\"))r=this.parsePropertyMethodFunction(),l=!0;else if(a.type===s.Token.Identifier){var f=this.finalize(o,new c.Identifier(a.value));if(this.match(\"=\")){this.context.firstCoverInitializedNameError=this.lookahead,this.nextToken(),h=!0;var d=this.isolateCoverGrammar(this.parseAssignmentExpression);r=this.finalize(o,new c.AssignmentPattern(f,d))}else h=!0,r=f}else this.throwUnexpectedToken(this.nextToken());return this.finalize(o,new c.Property(t,n,u,r,l,h))},e.prototype.parseObjectInitializer=function(){var e=this.createNode();this.expect(\"{\");for(var t=[],n={value:!1};!this.match(\"}\");)t.push(this.parseObjectProperty(n)),this.match(\"}\")||this.expectCommaSeparator();return this.expect(\"}\"),this.finalize(e,new c.ObjectExpression(t))},e.prototype.parseTemplateHead=function(){r.assert(this.lookahead.head,\"Template literal must start with a template head\");var e=this.createNode(),t=this.nextToken(),n={raw:t.value.raw,cooked:t.value.cooked};return this.finalize(e,new c.TemplateElement(n,t.tail))},e.prototype.parseTemplateElement=function(){this.lookahead.type!==s.Token.Template&&this.throwUnexpectedToken();var e=this.createNode(),t=this.nextToken(),n={raw:t.value.raw,cooked:t.value.cooked};return this.finalize(e,new c.TemplateElement(n,t.tail))},e.prototype.parseTemplateLiteral=function(){var e=this.createNode(),t=[],n=[],r=this.parseTemplateHead();for(n.push(r);!r.tail;)t.push(this.parseExpression()),r=this.parseTemplateElement(),n.push(r);return this.finalize(e,new c.TemplateLiteral(n,t))},e.prototype.reinterpretExpressionAsPattern=function(e){switch(e.type){case u.Syntax.Identifier:case u.Syntax.MemberExpression:case u.Syntax.RestElement:case u.Syntax.AssignmentPattern:break;case u.Syntax.SpreadElement:e.type=u.Syntax.RestElement,this.reinterpretExpressionAsPattern(e.argument);break;case u.Syntax.ArrayExpression:e.type=u.Syntax.ArrayPattern;for(var t=0;t<e.elements.length;t++)null!==e.elements[t]&&this.reinterpretExpressionAsPattern(e.elements[t]);break;case u.Syntax.ObjectExpression:e.type=u.Syntax.ObjectPattern;for(var t=0;t<e.properties.length;t++)this.reinterpretExpressionAsPattern(e.properties[t].value);break;case u.Syntax.AssignmentExpression:e.type=u.Syntax.AssignmentPattern,delete e.operator,this.reinterpretExpressionAsPattern(e.left)}},e.prototype.parseGroupExpression=function(){var e;if(this.expect(\"(\"),this.match(\")\"))this.nextToken(),this.match(\"=>\")||this.expect(\"=>\"),e={type:l,params:[]};else{var t=this.lookahead,n=[];if(this.match(\"...\"))e=this.parseRestElement(n),this.expect(\")\"),this.match(\"=>\")||this.expect(\"=>\"),e={type:l,params:[e]};else{var r=!1;if(this.context.isBindingElement=!0,e=this.inheritCoverGrammar(this.parseAssignmentExpression),this.match(\",\")){var i=[];for(this.context.isAssignmentTarget=!1,i.push(e);this.startMarker.index<this.scanner.length&&this.match(\",\");){if(this.nextToken(),this.match(\"...\")){this.context.isBindingElement||this.throwUnexpectedToken(this.lookahead),i.push(this.parseRestElement(n)),this.expect(\")\"),this.match(\"=>\")||this.expect(\"=>\"),this.context.isBindingElement=!1;for(var o=0;o<i.length;o++)this.reinterpretExpressionAsPattern(i[o]);r=!0,e={type:l,params:i}}else i.push(this.inheritCoverGrammar(this.parseAssignmentExpression));if(r)break}r||(e=this.finalize(this.startNode(t),new c.SequenceExpression(i)))}if(!r){if(this.expect(\")\"),this.match(\"=>\")&&(e.type===u.Syntax.Identifier&&\"yield\"===e.name&&(r=!0,e={type:l,params:[e]}),!r)){if(this.context.isBindingElement||this.throwUnexpectedToken(this.lookahead),e.type===u.Syntax.SequenceExpression)for(var o=0;o<e.expressions.length;o++)this.reinterpretExpressionAsPattern(e.expressions[o]);else this.reinterpretExpressionAsPattern(e);var s=e.type===u.Syntax.SequenceExpression?e.expressions:[e];e={type:l,params:s}}this.context.isBindingElement=!1}}}return e},e.prototype.parseArguments=function(){this.expect(\"(\");var e=[];if(!this.match(\")\"))for(;;){var t=this.match(\"...\")?this.parseSpreadElement():this.isolateCoverGrammar(this.parseAssignmentExpression);if(e.push(t),this.match(\")\"))break;this.expectCommaSeparator()}return this.expect(\")\"),e},e.prototype.isIdentifierName=function(e){return e.type===s.Token.Identifier||e.type===s.Token.Keyword||e.type===s.Token.BooleanLiteral||e.type===s.Token.NullLiteral},e.prototype.parseIdentifierName=function(){var e=this.createNode(),t=this.nextToken();return this.isIdentifierName(t)||this.throwUnexpectedToken(t),this.finalize(e,new c.Identifier(t.value))},e.prototype.parseNewExpression=function(){var e=this.createNode(),t=this.parseIdentifierName();r.assert(\"new\"===t.name,\"New expression must start with `new`\");var n;if(this.match(\".\"))if(this.nextToken(),this.lookahead.type===s.Token.Identifier&&this.context.inFunctionBody&&\"target\"===this.lookahead.value){var i=this.parseIdentifierName();n=new c.MetaProperty(t,i)}else this.throwUnexpectedToken(this.lookahead);else{var o=this.isolateCoverGrammar(this.parseLeftHandSideExpression),a=this.match(\"(\")?this.parseArguments():[];n=new c.NewExpression(o,a),this.context.isAssignmentTarget=!1,this.context.isBindingElement=!1}return this.finalize(e,n)},e.prototype.parseLeftHandSideExpressionAllowCall=function(){var e=this.lookahead,t=this.context.allowIn;this.context.allowIn=!0;var n;for(this.matchKeyword(\"super\")&&this.context.inFunctionBody?(n=this.createNode(),this.nextToken(),n=this.finalize(n,new c.Super),this.match(\"(\")||this.match(\".\")||this.match(\"[\")||this.throwUnexpectedToken(this.lookahead)):n=this.inheritCoverGrammar(this.matchKeyword(\"new\")?this.parseNewExpression:this.parsePrimaryExpression);;)if(this.match(\".\")){this.context.isBindingElement=!1,this.context.isAssignmentTarget=!0,this.expect(\".\");var r=this.parseIdentifierName();n=this.finalize(this.startNode(e),new c.StaticMemberExpression(n,r))}else if(this.match(\"(\")){this.context.isBindingElement=!1,this.context.isAssignmentTarget=!1;var i=this.parseArguments();n=this.finalize(this.startNode(e),new c.CallExpression(n,i))}else if(this.match(\"[\")){this.context.isBindingElement=!1,this.context.isAssignmentTarget=!0,this.expect(\"[\");var r=this.isolateCoverGrammar(this.parseExpression);this.expect(\"]\"),n=this.finalize(this.startNode(e),new c.ComputedMemberExpression(n,r))}else{if(this.lookahead.type!==s.Token.Template||!this.lookahead.head)break;var o=this.parseTemplateLiteral();n=this.finalize(this.startNode(e),new c.TaggedTemplateExpression(n,o))}return this.context.allowIn=t,n},e.prototype.parseSuper=function(){var e=this.createNode();return this.expectKeyword(\"super\"),this.match(\"[\")||this.match(\".\")||this.throwUnexpectedToken(this.lookahead),this.finalize(e,new c.Super)},e.prototype.parseLeftHandSideExpression=function(){r.assert(this.context.allowIn,\"callee of new expression always allow in keyword.\");for(var e=this.startNode(this.lookahead),t=this.matchKeyword(\"super\")&&this.context.inFunctionBody?this.parseSuper():this.inheritCoverGrammar(this.matchKeyword(\"new\")?this.parseNewExpression:this.parsePrimaryExpression);;)if(this.match(\"[\")){this.context.isBindingElement=!1,this.context.isAssignmentTarget=!0,this.expect(\"[\");var n=this.isolateCoverGrammar(this.parseExpression);this.expect(\"]\"),t=this.finalize(e,new c.ComputedMemberExpression(t,n))}else if(this.match(\".\")){this.context.isBindingElement=!1,this.context.isAssignmentTarget=!0,this.expect(\".\");var n=this.parseIdentifierName();t=this.finalize(e,new c.StaticMemberExpression(t,n))}else{if(this.lookahead.type!==s.Token.Template||!this.lookahead.head)break;var i=this.parseTemplateLiteral();t=this.finalize(e,new c.TaggedTemplateExpression(t,i))}return t},e.prototype.parseUpdateExpression=function(){var e,t=this.lookahead;if(this.match(\"++\")||this.match(\"--\")){var n=this.startNode(t),r=this.nextToken();e=this.inheritCoverGrammar(this.parseUnaryExpression),this.context.strict&&e.type===u.Syntax.Identifier&&this.scanner.isRestrictedWord(e.name)&&this.tolerateError(i.Messages.StrictLHSPrefix),this.context.isAssignmentTarget||this.tolerateError(i.Messages.InvalidLHSInAssignment);var o=!0;e=this.finalize(n,new c.UpdateExpression(r.value,e,o)),this.context.isAssignmentTarget=!1,this.context.isBindingElement=!1}else if(e=this.inheritCoverGrammar(this.parseLeftHandSideExpressionAllowCall),!this.hasLineTerminator&&this.lookahead.type===s.Token.Punctuator&&(this.match(\"++\")||this.match(\"--\"))){this.context.strict&&e.type===u.Syntax.Identifier&&this.scanner.isRestrictedWord(e.name)&&this.tolerateError(i.Messages.StrictLHSPostfix),this.context.isAssignmentTarget||this.tolerateError(i.Messages.InvalidLHSInAssignment),this.context.isAssignmentTarget=!1,this.context.isBindingElement=!1;var a=this.nextToken().value,o=!1;e=this.finalize(this.startNode(t),new c.UpdateExpression(a,e,o))}return e},e.prototype.parseUnaryExpression=function(){var e;if(this.match(\"+\")||this.match(\"-\")||this.match(\"~\")||this.match(\"!\")||this.matchKeyword(\"delete\")||this.matchKeyword(\"void\")||this.matchKeyword(\"typeof\")){var t=this.startNode(this.lookahead),n=this.nextToken();e=this.inheritCoverGrammar(this.parseUnaryExpression),e=this.finalize(t,new c.UnaryExpression(n.value,e)),this.context.strict&&\"delete\"===e.operator&&e.argument.type===u.Syntax.Identifier&&this.tolerateError(i.Messages.StrictDelete),this.context.isAssignmentTarget=!1,this.context.isBindingElement=!1}else e=this.parseUpdateExpression();return e},e.prototype.parseExponentiationExpression=function(){var e=this.lookahead,t=this.inheritCoverGrammar(this.parseUnaryExpression);if(t.type!==u.Syntax.UnaryExpression&&this.match(\"**\")){this.nextToken(),this.context.isAssignmentTarget=!1,this.context.isBindingElement=!1;var n=t,r=this.isolateCoverGrammar(this.parseExponentiationExpression);t=this.finalize(this.startNode(e),new c.BinaryExpression(\"**\",n,r))}return t},e.prototype.binaryPrecedence=function(e){var t,n=e.value;return t=e.type===s.Token.Punctuator?this.operatorPrecedence[n]||0:e.type===s.Token.Keyword&&(\"instanceof\"===n||this.context.allowIn&&\"in\"===n)?7:0},e.prototype.parseBinaryExpression=function(){var e=this.lookahead,t=this.inheritCoverGrammar(this.parseExponentiationExpression),n=this.lookahead,r=this.binaryPrecedence(n);if(r>0){this.nextToken(),n.prec=r,this.context.isAssignmentTarget=!1,this.context.isBindingElement=!1;for(var i=[e,this.lookahead],o=t,s=this.isolateCoverGrammar(this.parseExponentiationExpression),a=[o,n,s];;){if(r=this.binaryPrecedence(this.lookahead),r<=0)break;for(;a.length>2&&r<=a[a.length-2].prec;){s=a.pop();var u=a.pop().value;o=a.pop(),i.pop();var l=this.startNode(i[i.length-1]);a.push(this.finalize(l,new c.BinaryExpression(u,o,s)))}n=this.nextToken(),n.prec=r,a.push(n),i.push(this.lookahead),a.push(this.isolateCoverGrammar(this.parseExponentiationExpression))}var h=a.length-1;for(t=a[h],i.pop();h>1;){var l=this.startNode(i.pop());t=this.finalize(l,new c.BinaryExpression(a[h-1].value,a[h-2],t)),h-=2}}return t},e.prototype.parseConditionalExpression=function(){var e=this.lookahead,t=this.inheritCoverGrammar(this.parseBinaryExpression);if(this.match(\"?\")){this.nextToken();var n=this.context.allowIn;this.context.allowIn=!0;var r=this.isolateCoverGrammar(this.parseAssignmentExpression);this.context.allowIn=n,this.expect(\":\");var i=this.isolateCoverGrammar(this.parseAssignmentExpression);t=this.finalize(this.startNode(e),new c.ConditionalExpression(t,r,i)),this.context.isAssignmentTarget=!1,this.context.isBindingElement=!1}return t},e.prototype.checkPatternParam=function(e,t){switch(t.type){case u.Syntax.Identifier:this.validateParam(e,t,t.name);break;case u.Syntax.RestElement:this.checkPatternParam(e,t.argument);break;case u.Syntax.AssignmentPattern:this.checkPatternParam(e,t.left);break;case u.Syntax.ArrayPattern:for(var n=0;n<t.elements.length;n++)null!==t.elements[n]&&this.checkPatternParam(e,t.elements[n]);break;case u.Syntax.YieldExpression:break;default:r.assert(t.type===u.Syntax.ObjectPattern,\"Invalid type\");for(var n=0;n<t.properties.length;n++)this.checkPatternParam(e,t.properties[n].value)}},e.prototype.reinterpretAsCoverFormalsList=function(e){var t,n=[e];switch(e.type){case u.Syntax.Identifier:break;case l:n=e.params;break;default:return null}t={paramSet:{}};for(var r=0;r<n.length;++r){var o=n[r];o.type===u.Syntax.AssignmentPattern&&o.right.type===u.Syntax.YieldExpression&&(o.right.argument&&this.throwUnexpectedToken(this.lookahead),o.right.type=u.Syntax.Identifier,o.right.name=\"yield\",delete o.right.argument,delete o.right.delegate),this.checkPatternParam(t,o),n[r]=o}if(this.context.strict||!this.context.allowYield)for(var r=0;r<n.length;++r){var o=n[r];o.type===u.Syntax.YieldExpression&&this.throwUnexpectedToken(this.lookahead)}if(t.message===i.Messages.StrictParamDupe){var s=this.context.strict?t.stricted:t.firstRestricted;this.throwUnexpectedToken(s,t.message)}return{params:n,stricted:t.stricted,firstRestricted:t.firstRestricted,message:t.message}},e.prototype.parseAssignmentExpression=function(){var e;if(!this.context.allowYield&&this.matchKeyword(\"yield\"))e=this.parseYieldExpression();else{var t=this.lookahead,n=t;if(e=this.parseConditionalExpression(),e.type===l||this.match(\"=>\")){this.context.isAssignmentTarget=!1,this.context.isBindingElement=!1;var r=this.reinterpretAsCoverFormalsList(e);if(r){this.hasLineTerminator&&this.tolerateUnexpectedToken(this.lookahead),this.context.firstCoverInitializedNameError=null;var o=this.context.strict,s=this.context.allowYield;this.context.allowYield=!0;var a=this.startNode(t);this.expect(\"=>\");var h=this.match(\"{\")?this.parseFunctionSourceElements():this.isolateCoverGrammar(this.parseAssignmentExpression),p=h.type!==u.Syntax.BlockStatement;this.context.strict&&r.firstRestricted&&this.throwUnexpectedToken(r.firstRestricted,r.message),this.context.strict&&r.stricted&&this.tolerateUnexpectedToken(r.stricted,r.message),e=this.finalize(a,new c.ArrowFunctionExpression(r.params,h,p)),this.context.strict=o,this.context.allowYield=s}}else if(this.matchAssign()){if(this.context.isAssignmentTarget||this.tolerateError(i.Messages.InvalidLHSInAssignment),this.context.strict&&e.type===u.Syntax.Identifier){var f=e;this.scanner.isRestrictedWord(f.name)&&this.tolerateUnexpectedToken(n,i.Messages.StrictLHSAssignment),this.scanner.isStrictModeReservedWord(f.name)&&this.tolerateUnexpectedToken(n,i.Messages.StrictReservedWord)}this.match(\"=\")?this.reinterpretExpressionAsPattern(e):(this.context.isAssignmentTarget=!1,this.context.isBindingElement=!1),n=this.nextToken();var d=this.isolateCoverGrammar(this.parseAssignmentExpression);e=this.finalize(this.startNode(t),new c.AssignmentExpression(n.value,e,d)),this.context.firstCoverInitializedNameError=null}}return e},e.prototype.parseExpression=function(){var e=this.lookahead,t=this.isolateCoverGrammar(this.parseAssignmentExpression);if(this.match(\",\")){var n=[];for(n.push(t);this.startMarker.index<this.scanner.length&&this.match(\",\");)this.nextToken(),n.push(this.isolateCoverGrammar(this.parseAssignmentExpression));t=this.finalize(this.startNode(e),new c.SequenceExpression(n))}return t},e.prototype.parseStatementListItem=function(){var e=null;if(this.context.isAssignmentTarget=!0,this.context.isBindingElement=!0,this.lookahead.type===s.Token.Keyword)switch(this.lookahead.value){case\"export\":\"module\"!==this.sourceType&&this.tolerateUnexpectedToken(this.lookahead,i.Messages.IllegalExportDeclaration),e=this.parseExportDeclaration();break;case\"import\":\"module\"!==this.sourceType&&this.tolerateUnexpectedToken(this.lookahead,i.Messages.IllegalImportDeclaration),e=this.parseImportDeclaration();break;case\"const\":e=this.parseLexicalDeclaration({inFor:!1});break;case\"function\":e=this.parseFunctionDeclaration();break;case\"class\":e=this.parseClassDeclaration();break;case\"let\":e=this.isLexicalDeclaration()?this.parseLexicalDeclaration({inFor:!1}):this.parseStatement();break;default:e=this.parseStatement()}else e=this.parseStatement();return e},e.prototype.parseBlock=function(){var e=this.createNode();this.expect(\"{\");for(var t=[];;){if(this.match(\"}\"))break;t.push(this.parseStatementListItem())}return this.expect(\"}\"),this.finalize(e,new c.BlockStatement(t))},e.prototype.parseLexicalBinding=function(e,t){var n=this.createNode(),r=[],o=this.parsePattern(r,e);this.context.strict&&o.type===u.Syntax.Identifier&&this.scanner.isRestrictedWord(o.name)&&this.tolerateError(i.Messages.StrictVarName);var s=null;return\"const\"===e?this.matchKeyword(\"in\")||this.matchContextualKeyword(\"of\")||(this.expect(\"=\"),s=this.isolateCoverGrammar(this.parseAssignmentExpression)):(!t.inFor&&o.type!==u.Syntax.Identifier||this.match(\"=\"))&&(this.expect(\"=\"),s=this.isolateCoverGrammar(this.parseAssignmentExpression)),this.finalize(n,new c.VariableDeclarator(o,s))},e.prototype.parseBindingList=function(e,t){for(var n=[this.parseLexicalBinding(e,t)];this.match(\",\");)this.nextToken(),n.push(this.parseLexicalBinding(e,t));return n},e.prototype.isLexicalDeclaration=function(){var e=this.scanner.index,t=this.scanner.lineNumber,n=this.scanner.lineStart;this.collectComments();var r=this.scanner.lex();return this.scanner.index=e,this.scanner.lineNumber=t,this.scanner.lineStart=n,r.type===s.Token.Identifier||r.type===s.Token.Punctuator&&\"[\"===r.value||r.type===s.Token.Punctuator&&\"{\"===r.value||r.type===s.Token.Keyword&&\"let\"===r.value||r.type===s.Token.Keyword&&\"yield\"===r.value},e.prototype.parseLexicalDeclaration=function(e){var t=this.createNode(),n=this.nextToken().value;r.assert(\"let\"===n||\"const\"===n,\"Lexical declaration must be either let or const\");var i=this.parseBindingList(n,e);return this.consumeSemicolon(),this.finalize(t,new c.VariableDeclaration(i,n))},e.prototype.parseBindingRestElement=function(e,t){var n=this.createNode();this.expect(\"...\");var r=this.parsePattern(e,t);return this.finalize(n,new c.RestElement(r))},e.prototype.parseArrayPattern=function(e,t){var n=this.createNode();this.expect(\"[\");for(var r=[];!this.match(\"]\");)if(this.match(\",\"))this.nextToken(),r.push(null);else{if(this.match(\"...\")){r.push(this.parseBindingRestElement(e,t));break}r.push(this.parsePatternWithDefault(e,t)),this.match(\"]\")||this.expect(\",\")}return this.expect(\"]\"),this.finalize(n,new c.ArrayPattern(r))},e.prototype.parsePropertyPattern=function(e,t){var n,r,i=this.createNode(),o=!1,a=!1,u=!1;if(this.lookahead.type===s.Token.Identifier){var l=this.lookahead;n=this.parseVariableIdentifier();var h=this.finalize(i,new c.Identifier(l.value));if(this.match(\"=\")){\ne.push(l),a=!0,this.nextToken();var p=this.parseAssignmentExpression();r=this.finalize(this.startNode(l),new c.AssignmentPattern(h,p))}else this.match(\":\")?(this.expect(\":\"),r=this.parsePatternWithDefault(e,t)):(e.push(l),a=!0,r=h)}else o=this.match(\"[\"),n=this.parseObjectPropertyKey(),this.expect(\":\"),r=this.parsePatternWithDefault(e,t);return this.finalize(i,new c.Property(\"init\",n,o,r,u,a))},e.prototype.parseObjectPattern=function(e,t){var n=this.createNode(),r=[];for(this.expect(\"{\");!this.match(\"}\");)r.push(this.parsePropertyPattern(e,t)),this.match(\"}\")||this.expect(\",\");return this.expect(\"}\"),this.finalize(n,new c.ObjectPattern(r))},e.prototype.parsePattern=function(e,t){var n;return this.match(\"[\")?n=this.parseArrayPattern(e,t):this.match(\"{\")?n=this.parseObjectPattern(e,t):(!this.matchKeyword(\"let\")||\"const\"!==t&&\"let\"!==t||this.tolerateUnexpectedToken(this.lookahead,i.Messages.UnexpectedToken),e.push(this.lookahead),n=this.parseVariableIdentifier(t)),n},e.prototype.parsePatternWithDefault=function(e,t){var n=this.lookahead,r=this.parsePattern(e,t);if(this.match(\"=\")){this.nextToken();var i=this.context.allowYield;this.context.allowYield=!0;var o=this.isolateCoverGrammar(this.parseAssignmentExpression);this.context.allowYield=i,r=this.finalize(this.startNode(n),new c.AssignmentPattern(r,o))}return r},e.prototype.parseVariableIdentifier=function(e){var t=this.createNode(),n=this.nextToken();return n.type===s.Token.Keyword&&\"yield\"===n.value?(this.context.strict&&this.tolerateUnexpectedToken(n,i.Messages.StrictReservedWord),this.context.allowYield||this.throwUnexpectedToken(n)):n.type!==s.Token.Identifier?this.context.strict&&n.type===s.Token.Keyword&&this.scanner.isStrictModeReservedWord(n.value)?this.tolerateUnexpectedToken(n,i.Messages.StrictReservedWord):(this.context.strict||\"let\"!==n.value||\"var\"!==e)&&this.throwUnexpectedToken(n):\"module\"===this.sourceType&&n.type===s.Token.Identifier&&\"await\"===n.value&&this.tolerateUnexpectedToken(n),this.finalize(t,new c.Identifier(n.value))},e.prototype.parseVariableDeclaration=function(e){var t=this.createNode(),n=[],r=this.parsePattern(n,\"var\");this.context.strict&&r.type===u.Syntax.Identifier&&this.scanner.isRestrictedWord(r.name)&&this.tolerateError(i.Messages.StrictVarName);var o=null;return this.match(\"=\")?(this.nextToken(),o=this.isolateCoverGrammar(this.parseAssignmentExpression)):r.type===u.Syntax.Identifier||e.inFor||this.expect(\"=\"),this.finalize(t,new c.VariableDeclarator(r,o))},e.prototype.parseVariableDeclarationList=function(e){var t={inFor:e.inFor},n=[];for(n.push(this.parseVariableDeclaration(t));this.match(\",\");)this.nextToken(),n.push(this.parseVariableDeclaration(t));return n},e.prototype.parseVariableStatement=function(){var e=this.createNode();this.expectKeyword(\"var\");var t=this.parseVariableDeclarationList({inFor:!1});return this.consumeSemicolon(),this.finalize(e,new c.VariableDeclaration(t,\"var\"))},e.prototype.parseEmptyStatement=function(){var e=this.createNode();return this.expect(\";\"),this.finalize(e,new c.EmptyStatement)},e.prototype.parseExpressionStatement=function(){var e=this.createNode(),t=this.parseExpression();return this.consumeSemicolon(),this.finalize(e,new c.ExpressionStatement(t))},e.prototype.parseIfStatement=function(){var e,t=this.createNode(),n=null;this.expectKeyword(\"if\"),this.expect(\"(\");var r=this.parseExpression();return!this.match(\")\")&&this.config.tolerant?(this.tolerateUnexpectedToken(this.nextToken()),e=this.finalize(this.createNode(),new c.EmptyStatement)):(this.expect(\")\"),e=this.parseStatement(),this.matchKeyword(\"else\")&&(this.nextToken(),n=this.parseStatement())),this.finalize(t,new c.IfStatement(r,e,n))},e.prototype.parseDoWhileStatement=function(){var e=this.createNode();this.expectKeyword(\"do\");var t=this.context.inIteration;this.context.inIteration=!0;var n=this.parseStatement();this.context.inIteration=t,this.expectKeyword(\"while\"),this.expect(\"(\");var r=this.parseExpression();return this.expect(\")\"),this.match(\";\")&&this.nextToken(),this.finalize(e,new c.DoWhileStatement(n,r))},e.prototype.parseWhileStatement=function(){var e,t=this.createNode();this.expectKeyword(\"while\"),this.expect(\"(\");var n=this.parseExpression();if(!this.match(\")\")&&this.config.tolerant)this.tolerateUnexpectedToken(this.nextToken()),e=this.finalize(this.createNode(),new c.EmptyStatement);else{this.expect(\")\");var r=this.context.inIteration;this.context.inIteration=!0,e=this.parseStatement(),this.context.inIteration=r}return this.finalize(t,new c.WhileStatement(n,e))},e.prototype.parseForStatement=function(){var e,t,n=null,r=null,o=null,s=!0,a=this.createNode();if(this.expectKeyword(\"for\"),this.expect(\"(\"),this.match(\";\"))this.nextToken();else if(this.matchKeyword(\"var\")){n=this.createNode(),this.nextToken();var l=this.context.allowIn;this.context.allowIn=!1;var h=this.parseVariableDeclarationList({inFor:!0});if(this.context.allowIn=l,1===h.length&&this.matchKeyword(\"in\")){var p=h[0];p.init&&(p.id.type===u.Syntax.ArrayPattern||p.id.type===u.Syntax.ObjectPattern||this.context.strict)&&this.tolerateError(i.Messages.ForInOfLoopInitializer,\"for-in\"),n=this.finalize(n,new c.VariableDeclaration(h,\"var\")),this.nextToken(),e=n,t=this.parseExpression(),n=null}else 1===h.length&&null===h[0].init&&this.matchContextualKeyword(\"of\")?(n=this.finalize(n,new c.VariableDeclaration(h,\"var\")),this.nextToken(),e=n,t=this.parseAssignmentExpression(),n=null,s=!1):(n=this.finalize(n,new c.VariableDeclaration(h,\"var\")),this.expect(\";\"))}else if(this.matchKeyword(\"const\")||this.matchKeyword(\"let\")){n=this.createNode();var f=this.nextToken().value;if(this.context.strict||\"in\"!==this.lookahead.value){var l=this.context.allowIn;this.context.allowIn=!1;var h=this.parseBindingList(f,{inFor:!0});this.context.allowIn=l,1===h.length&&null===h[0].init&&this.matchKeyword(\"in\")?(n=this.finalize(n,new c.VariableDeclaration(h,f)),this.nextToken(),e=n,t=this.parseExpression(),n=null):1===h.length&&null===h[0].init&&this.matchContextualKeyword(\"of\")?(n=this.finalize(n,new c.VariableDeclaration(h,f)),this.nextToken(),e=n,t=this.parseAssignmentExpression(),n=null,s=!1):(this.consumeSemicolon(),n=this.finalize(n,new c.VariableDeclaration(h,f)))}else n=this.finalize(n,new c.Identifier(f)),this.nextToken(),e=n,t=this.parseExpression(),n=null}else{var d=this.lookahead,l=this.context.allowIn;if(this.context.allowIn=!1,n=this.inheritCoverGrammar(this.parseAssignmentExpression),this.context.allowIn=l,this.matchKeyword(\"in\"))this.context.isAssignmentTarget&&n.type!==u.Syntax.AssignmentExpression||this.tolerateError(i.Messages.InvalidLHSInForIn),this.nextToken(),this.reinterpretExpressionAsPattern(n),e=n,t=this.parseExpression(),n=null;else if(this.matchContextualKeyword(\"of\"))this.context.isAssignmentTarget&&n.type!==u.Syntax.AssignmentExpression||this.tolerateError(i.Messages.InvalidLHSInForLoop),this.nextToken(),this.reinterpretExpressionAsPattern(n),e=n,t=this.parseAssignmentExpression(),n=null,s=!1;else{if(this.match(\",\")){for(var m=[n];this.match(\",\");)this.nextToken(),m.push(this.isolateCoverGrammar(this.parseAssignmentExpression));n=this.finalize(this.startNode(d),new c.SequenceExpression(m))}this.expect(\";\")}}\"undefined\"==typeof e&&(this.match(\";\")||(r=this.parseExpression()),this.expect(\";\"),this.match(\")\")||(o=this.parseExpression()));var g;if(!this.match(\")\")&&this.config.tolerant)this.tolerateUnexpectedToken(this.nextToken()),g=this.finalize(this.createNode(),new c.EmptyStatement);else{this.expect(\")\");var x=this.context.inIteration;this.context.inIteration=!0,g=this.isolateCoverGrammar(this.parseStatement),this.context.inIteration=x}return\"undefined\"==typeof e?this.finalize(a,new c.ForStatement(n,r,o,g)):s?this.finalize(a,new c.ForInStatement(e,t,g)):this.finalize(a,new c.ForOfStatement(e,t,g))},e.prototype.parseContinueStatement=function(){var e=this.createNode();this.expectKeyword(\"continue\");var t=null;if(this.lookahead.type===s.Token.Identifier&&!this.hasLineTerminator){t=this.parseVariableIdentifier();var n=\"$\"+t.name;Object.prototype.hasOwnProperty.call(this.context.labelSet,n)||this.throwError(i.Messages.UnknownLabel,t.name)}return this.consumeSemicolon(),null!==t||this.context.inIteration||this.throwError(i.Messages.IllegalContinue),this.finalize(e,new c.ContinueStatement(t))},e.prototype.parseBreakStatement=function(){var e=this.createNode();this.expectKeyword(\"break\");var t=null;if(this.lookahead.type===s.Token.Identifier&&!this.hasLineTerminator){t=this.parseVariableIdentifier();var n=\"$\"+t.name;Object.prototype.hasOwnProperty.call(this.context.labelSet,n)||this.throwError(i.Messages.UnknownLabel,t.name)}return this.consumeSemicolon(),null!==t||this.context.inIteration||this.context.inSwitch||this.throwError(i.Messages.IllegalBreak),this.finalize(e,new c.BreakStatement(t))},e.prototype.parseReturnStatement=function(){this.context.inFunctionBody||this.tolerateError(i.Messages.IllegalReturn);var e=this.createNode();this.expectKeyword(\"return\");var t=!this.match(\";\")&&!this.match(\"}\")&&!this.hasLineTerminator&&this.lookahead.type!==s.Token.EOF,n=t?this.parseExpression():null;return this.consumeSemicolon(),this.finalize(e,new c.ReturnStatement(n))},e.prototype.parseWithStatement=function(){this.context.strict&&this.tolerateError(i.Messages.StrictModeWith);var e=this.createNode();this.expectKeyword(\"with\"),this.expect(\"(\");var t=this.parseExpression();this.expect(\")\");var n=this.parseStatement();return this.finalize(e,new c.WithStatement(t,n))},e.prototype.parseSwitchCase=function(){var e,t=this.createNode();this.matchKeyword(\"default\")?(this.nextToken(),e=null):(this.expectKeyword(\"case\"),e=this.parseExpression()),this.expect(\":\");for(var n=[];;){if(this.match(\"}\")||this.matchKeyword(\"default\")||this.matchKeyword(\"case\"))break;n.push(this.parseStatementListItem())}return this.finalize(t,new c.SwitchCase(e,n))},e.prototype.parseSwitchStatement=function(){var e=this.createNode();this.expectKeyword(\"switch\"),this.expect(\"(\");var t=this.parseExpression();this.expect(\")\");var n=this.context.inSwitch;this.context.inSwitch=!0;var r=[],o=!1;for(this.expect(\"{\");;){if(this.match(\"}\"))break;var s=this.parseSwitchCase();null===s.test&&(o&&this.throwError(i.Messages.MultipleDefaultsInSwitch),o=!0),r.push(s)}return this.expect(\"}\"),this.context.inSwitch=n,this.finalize(e,new c.SwitchStatement(t,r))},e.prototype.parseLabelledStatement=function(){var e,t=this.createNode(),n=this.parseExpression();if(n.type===u.Syntax.Identifier&&this.match(\":\")){this.nextToken();var r=n,o=\"$\"+r.name;Object.prototype.hasOwnProperty.call(this.context.labelSet,o)&&this.throwError(i.Messages.Redeclaration,\"Label\",r.name),this.context.labelSet[o]=!0;var s=this.parseStatement();delete this.context.labelSet[o],e=new c.LabeledStatement(r,s)}else this.consumeSemicolon(),e=new c.ExpressionStatement(n);return this.finalize(t,e)},e.prototype.parseThrowStatement=function(){var e=this.createNode();this.expectKeyword(\"throw\"),this.hasLineTerminator&&this.throwError(i.Messages.NewlineAfterThrow);var t=this.parseExpression();return this.consumeSemicolon(),this.finalize(e,new c.ThrowStatement(t))},e.prototype.parseCatchClause=function(){var e=this.createNode();this.expectKeyword(\"catch\"),this.expect(\"(\"),this.match(\")\")&&this.throwUnexpectedToken(this.lookahead);for(var t=[],n=this.parsePattern(t),r={},o=0;o<t.length;o++){var s=\"$\"+t[o].value;Object.prototype.hasOwnProperty.call(r,s)&&this.tolerateError(i.Messages.DuplicateBinding,t[o].value),r[s]=!0}this.context.strict&&n.type===u.Syntax.Identifier&&this.scanner.isRestrictedWord(n.name)&&this.tolerateError(i.Messages.StrictCatchVariable),this.expect(\")\");var a=this.parseBlock();return this.finalize(e,new c.CatchClause(n,a))},e.prototype.parseFinallyClause=function(){return this.expectKeyword(\"finally\"),this.parseBlock()},e.prototype.parseTryStatement=function(){var e=this.createNode();this.expectKeyword(\"try\");var t=this.parseBlock(),n=this.matchKeyword(\"catch\")?this.parseCatchClause():null,r=this.matchKeyword(\"finally\")?this.parseFinallyClause():null;return n||r||this.throwError(i.Messages.NoCatchOrFinally),this.finalize(e,new c.TryStatement(t,n,r))},e.prototype.parseDebuggerStatement=function(){var e=this.createNode();return this.expectKeyword(\"debugger\"),this.consumeSemicolon(),this.finalize(e,new c.DebuggerStatement)},e.prototype.parseStatement=function(){var e=null;switch(this.lookahead.type){case s.Token.BooleanLiteral:case s.Token.NullLiteral:case s.Token.NumericLiteral:case s.Token.StringLiteral:case s.Token.Template:case s.Token.RegularExpression:e=this.parseExpressionStatement();break;case s.Token.Punctuator:var t=this.lookahead.value;e=\"{\"===t?this.parseBlock():\"(\"===t?this.parseExpressionStatement():\";\"===t?this.parseEmptyStatement():this.parseExpressionStatement();break;case s.Token.Identifier:e=this.parseLabelledStatement();break;case s.Token.Keyword:switch(this.lookahead.value){case\"break\":e=this.parseBreakStatement();break;case\"continue\":e=this.parseContinueStatement();break;case\"debugger\":e=this.parseDebuggerStatement();break;case\"do\":e=this.parseDoWhileStatement();break;case\"for\":e=this.parseForStatement();break;case\"function\":e=this.parseFunctionDeclaration();break;case\"if\":e=this.parseIfStatement();break;case\"return\":e=this.parseReturnStatement();break;case\"switch\":e=this.parseSwitchStatement();break;case\"throw\":e=this.parseThrowStatement();break;case\"try\":e=this.parseTryStatement();break;case\"var\":e=this.parseVariableStatement();break;case\"while\":e=this.parseWhileStatement();break;case\"with\":e=this.parseWithStatement();break;default:e=this.parseExpressionStatement()}break;default:this.throwUnexpectedToken(this.lookahead)}return e},e.prototype.parseFunctionSourceElements=function(){var e=this.createNode();this.expect(\"{\");var t=this.parseDirectivePrologues(),n=this.context.labelSet,r=this.context.inIteration,i=this.context.inSwitch,o=this.context.inFunctionBody;for(this.context.labelSet={},this.context.inIteration=!1,this.context.inSwitch=!1,this.context.inFunctionBody=!0;this.startMarker.index<this.scanner.length&&!this.match(\"}\");)t.push(this.parseStatementListItem());return this.expect(\"}\"),this.context.labelSet=n,this.context.inIteration=r,this.context.inSwitch=i,this.context.inFunctionBody=o,this.finalize(e,new c.BlockStatement(t))},e.prototype.validateParam=function(e,t,n){var r=\"$\"+n;this.context.strict?(this.scanner.isRestrictedWord(n)&&(e.stricted=t,e.message=i.Messages.StrictParamName),Object.prototype.hasOwnProperty.call(e.paramSet,r)&&(e.stricted=t,e.message=i.Messages.StrictParamDupe)):e.firstRestricted||(this.scanner.isRestrictedWord(n)?(e.firstRestricted=t,e.message=i.Messages.StrictParamName):this.scanner.isStrictModeReservedWord(n)?(e.firstRestricted=t,e.message=i.Messages.StrictReservedWord):Object.prototype.hasOwnProperty.call(e.paramSet,r)&&(e.stricted=t,e.message=i.Messages.StrictParamDupe)),\"function\"==typeof Object.defineProperty?Object.defineProperty(e.paramSet,r,{value:!0,enumerable:!0,writable:!0,configurable:!0}):e.paramSet[r]=!0},e.prototype.parseRestElement=function(e){var t=this.createNode();this.expect(\"...\");var n=this.parsePattern(e);return this.match(\"=\")&&this.throwError(i.Messages.DefaultRestParameter),this.match(\")\")||this.throwError(i.Messages.ParameterAfterRestParameter),this.finalize(t,new c.RestElement(n))},e.prototype.parseFormalParameter=function(e){for(var t=[],n=this.match(\"...\")?this.parseRestElement(t):this.parsePatternWithDefault(t),r=0;r<t.length;r++)this.validateParam(e,t[r],t[r].value);return e.params.push(n),!this.match(\")\")},e.prototype.parseFormalParameters=function(e){var t;if(t={params:[],firstRestricted:e},this.expect(\"(\"),!this.match(\")\"))for(t.paramSet={};this.startMarker.index<this.scanner.length&&this.parseFormalParameter(t);)this.expect(\",\");return this.expect(\")\"),{params:t.params,stricted:t.stricted,firstRestricted:t.firstRestricted,message:t.message}},e.prototype.parseFunctionDeclaration=function(e){var t=this.createNode();this.expectKeyword(\"function\");var n=this.match(\"*\");n&&this.nextToken();var r,o=null,s=null;if(!e||!this.match(\"(\")){var a=this.lookahead;o=this.parseVariableIdentifier(),this.context.strict?this.scanner.isRestrictedWord(a.value)&&this.tolerateUnexpectedToken(a,i.Messages.StrictFunctionName):this.scanner.isRestrictedWord(a.value)?(s=a,r=i.Messages.StrictFunctionName):this.scanner.isStrictModeReservedWord(a.value)&&(s=a,r=i.Messages.StrictReservedWord)}var u=this.context.allowYield;this.context.allowYield=!n;var l=this.parseFormalParameters(s),h=l.params,p=l.stricted;s=l.firstRestricted,l.message&&(r=l.message);var f=this.context.strict,d=this.parseFunctionSourceElements();return this.context.strict&&s&&this.throwUnexpectedToken(s,r),this.context.strict&&p&&this.tolerateUnexpectedToken(p,r),this.context.strict=f,this.context.allowYield=u,this.finalize(t,new c.FunctionDeclaration(o,h,d,n))},e.prototype.parseFunctionExpression=function(){var e=this.createNode();this.expectKeyword(\"function\");var t=this.match(\"*\");t&&this.nextToken();var n,r,o=null,s=this.context.allowYield;if(this.context.allowYield=!t,!this.match(\"(\")){var a=this.lookahead;o=this.context.strict||t||!this.matchKeyword(\"yield\")?this.parseVariableIdentifier():this.parseIdentifierName(),this.context.strict?this.scanner.isRestrictedWord(a.value)&&this.tolerateUnexpectedToken(a,i.Messages.StrictFunctionName):this.scanner.isRestrictedWord(a.value)?(r=a,n=i.Messages.StrictFunctionName):this.scanner.isStrictModeReservedWord(a.value)&&(r=a,n=i.Messages.StrictReservedWord)}var u=this.parseFormalParameters(r),l=u.params,h=u.stricted;r=u.firstRestricted,u.message&&(n=u.message);var p=this.context.strict,f=this.parseFunctionSourceElements();return this.context.strict&&r&&this.throwUnexpectedToken(r,n),this.context.strict&&h&&this.tolerateUnexpectedToken(h,n),this.context.strict=p,this.context.allowYield=s,this.finalize(e,new c.FunctionExpression(o,l,f,t))},e.prototype.parseDirective=function(){var e=this.lookahead,t=null,n=this.createNode(),r=this.parseExpression();return r.type===u.Syntax.Literal&&(t=this.getTokenRaw(e).slice(1,-1)),this.consumeSemicolon(),this.finalize(n,t?new c.Directive(r,t):new c.ExpressionStatement(r))},e.prototype.parseDirectivePrologues=function(){for(var e=null,t=[];;){var n=this.lookahead;if(n.type!==s.Token.StringLiteral)break;var r=this.parseDirective();t.push(r);var o=r.directive;if(\"string\"!=typeof o)break;\"use strict\"===o?(this.context.strict=!0,e&&this.tolerateUnexpectedToken(e,i.Messages.StrictOctalLiteral)):!e&&n.octal&&(e=n)}return t},e.prototype.qualifiedPropertyName=function(e){switch(e.type){case s.Token.Identifier:case s.Token.StringLiteral:case s.Token.BooleanLiteral:case s.Token.NullLiteral:case s.Token.NumericLiteral:case s.Token.Keyword:return!0;case s.Token.Punctuator:return\"[\"===e.value}return!1},e.prototype.parseGetterMethod=function(){var e=this.createNode();this.expect(\"(\"),this.expect(\")\");var t=!1,n={params:[],stricted:null,firstRestricted:null,message:null},r=this.context.allowYield;this.context.allowYield=!1;var i=this.parsePropertyMethod(n);return this.context.allowYield=r,this.finalize(e,new c.FunctionExpression(null,n.params,i,t))},e.prototype.parseSetterMethod=function(){var e=this.createNode(),t={params:[],firstRestricted:null,paramSet:{}},n=!1,r=this.context.allowYield;this.context.allowYield=!1,this.expect(\"(\"),this.match(\")\")?this.tolerateUnexpectedToken(this.lookahead):this.parseFormalParameter(t),this.expect(\")\");var i=this.parsePropertyMethod(t);return this.context.allowYield=r,this.finalize(e,new c.FunctionExpression(null,t.params,i,n))},e.prototype.parseGeneratorMethod=function(){var e=this.createNode(),t=!0,n=this.context.allowYield;this.context.allowYield=!0;var r=this.parseFormalParameters();this.context.allowYield=!1;var i=this.parsePropertyMethod(r);return this.context.allowYield=n,this.finalize(e,new c.FunctionExpression(null,r.params,i,t))},e.prototype.isStartOfExpression=function(){var e=!0,t=this.lookahead.value;switch(this.lookahead.type){case s.Token.Punctuator:e=\"[\"===t||\"(\"===t||\"{\"===t||\"+\"===t||\"-\"===t||\"!\"===t||\"~\"===t||\"++\"===t||\"--\"===t||\"/\"===t||\"/=\"===t;break;case s.Token.Keyword:e=\"class\"===t||\"delete\"===t||\"function\"===t||\"let\"===t||\"new\"===t||\"super\"===t||\"this\"===t||\"typeof\"===t||\"void\"===t||\"yield\"===t}return e},e.prototype.parseYieldExpression=function(){var e=this.createNode();this.expectKeyword(\"yield\");var t=null,n=!1;if(!this.hasLineTerminator){var r=this.context.allowYield;this.context.allowYield=!1,n=this.match(\"*\"),n?(this.nextToken(),t=this.parseAssignmentExpression()):this.isStartOfExpression()&&(t=this.parseAssignmentExpression()),this.context.allowYield=r}return this.finalize(e,new c.YieldExpression(t,n))},e.prototype.parseClassElement=function(e){var t,n,r,o=this.lookahead,a=this.createNode(),u=!1,l=!1,h=!1;if(this.match(\"*\"))this.nextToken();else{u=this.match(\"[\"),n=this.parseObjectPropertyKey();var p=n;\"static\"===p.name&&(this.qualifiedPropertyName(this.lookahead)||this.match(\"*\"))&&(o=this.lookahead,h=!0,u=this.match(\"[\"),this.match(\"*\")?this.nextToken():n=this.parseObjectPropertyKey())}var f=this.qualifiedPropertyName(this.lookahead);return o.type===s.Token.Identifier?\"get\"===o.value&&f?(t=\"get\",u=this.match(\"[\"),n=this.parseObjectPropertyKey(),this.context.allowYield=!1,r=this.parseGetterMethod()):\"set\"===o.value&&f&&(t=\"set\",u=this.match(\"[\"),n=this.parseObjectPropertyKey(),r=this.parseSetterMethod()):o.type===s.Token.Punctuator&&\"*\"===o.value&&f&&(t=\"init\",u=this.match(\"[\"),n=this.parseObjectPropertyKey(),r=this.parseGeneratorMethod(),l=!0),!t&&n&&this.match(\"(\")&&(t=\"init\",r=this.parsePropertyMethodFunction(),l=!0),t||this.throwUnexpectedToken(this.lookahead),\"init\"===t&&(t=\"method\"),u||(h&&this.isPropertyKey(n,\"prototype\")&&this.throwUnexpectedToken(o,i.Messages.StaticPrototype),!h&&this.isPropertyKey(n,\"constructor\")&&(\"method\"===t&&l&&!r.generator||this.throwUnexpectedToken(o,i.Messages.ConstructorSpecialMethod),e.value?this.throwUnexpectedToken(o,i.Messages.DuplicateConstructor):e.value=!0,t=\"constructor\")),this.finalize(a,new c.MethodDefinition(n,u,r,t,h))},e.prototype.parseClassElementList=function(){var e=[],t={value:!1};for(this.expect(\"{\");!this.match(\"}\");)this.match(\";\")?this.nextToken():e.push(this.parseClassElement(t));return this.expect(\"}\"),e},e.prototype.parseClassBody=function(){var e=this.createNode(),t=this.parseClassElementList();return this.finalize(e,new c.ClassBody(t))},e.prototype.parseClassDeclaration=function(e){var t=this.createNode(),n=this.context.strict;this.context.strict=!0,this.expectKeyword(\"class\");var r=e&&this.lookahead.type!==s.Token.Identifier?null:this.parseVariableIdentifier(),i=null;this.matchKeyword(\"extends\")&&(this.nextToken(),i=this.isolateCoverGrammar(this.parseLeftHandSideExpressionAllowCall));var o=this.parseClassBody();return this.context.strict=n,this.finalize(t,new c.ClassDeclaration(r,i,o))},e.prototype.parseClassExpression=function(){var e=this.createNode(),t=this.context.strict;this.context.strict=!0,this.expectKeyword(\"class\");var n=this.lookahead.type===s.Token.Identifier?this.parseVariableIdentifier():null,r=null;this.matchKeyword(\"extends\")&&(this.nextToken(),r=this.isolateCoverGrammar(this.parseLeftHandSideExpressionAllowCall));var i=this.parseClassBody();return this.context.strict=t,this.finalize(e,new c.ClassExpression(n,r,i))},e.prototype.parseProgram=function(){for(var e=this.createNode(),t=this.parseDirectivePrologues();this.startMarker.index<this.scanner.length;)t.push(this.parseStatementListItem());return this.finalize(e,new c.Program(t,this.sourceType))},e.prototype.parseModuleSpecifier=function(){var e=this.createNode();this.lookahead.type!==s.Token.StringLiteral&&this.throwError(i.Messages.InvalidModuleSpecifier);var t=this.nextToken(),n=this.getTokenRaw(t);return this.finalize(e,new c.Literal(t.value,n))},e.prototype.parseImportSpecifier=function(){var e,t,n=this.createNode();return this.lookahead.type===s.Token.Identifier?(e=this.parseVariableIdentifier(),t=e,this.matchContextualKeyword(\"as\")&&(this.nextToken(),t=this.parseVariableIdentifier())):(e=this.parseIdentifierName(),t=e,this.matchContextualKeyword(\"as\")?(this.nextToken(),t=this.parseVariableIdentifier()):this.throwUnexpectedToken(this.nextToken())),this.finalize(n,new c.ImportSpecifier(t,e))},e.prototype.parseNamedImports=function(){this.expect(\"{\");for(var e=[];!this.match(\"}\");)e.push(this.parseImportSpecifier()),this.match(\"}\")||this.expect(\",\");return this.expect(\"}\"),e},e.prototype.parseImportDefaultSpecifier=function(){var e=this.createNode(),t=this.parseIdentifierName();return this.finalize(e,new c.ImportDefaultSpecifier(t))},e.prototype.parseImportNamespaceSpecifier=function(){var e=this.createNode();this.expect(\"*\"),this.matchContextualKeyword(\"as\")||this.throwError(i.Messages.NoAsAfterImportNamespace),this.nextToken();var t=this.parseIdentifierName();return this.finalize(e,new c.ImportNamespaceSpecifier(t))},e.prototype.parseImportDeclaration=function(){this.context.inFunctionBody&&this.throwError(i.Messages.IllegalImportDeclaration);var e=this.createNode();this.expectKeyword(\"import\");var t,n=[];if(this.lookahead.type===s.Token.StringLiteral)t=this.parseModuleSpecifier();else{if(this.match(\"{\")?n=n.concat(this.parseNamedImports()):this.match(\"*\")?n.push(this.parseImportNamespaceSpecifier()):this.isIdentifierName(this.lookahead)&&!this.matchKeyword(\"default\")?(n.push(this.parseImportDefaultSpecifier()),this.match(\",\")&&(this.nextToken(),this.match(\"*\")?n.push(this.parseImportNamespaceSpecifier()):this.match(\"{\")?n=n.concat(this.parseNamedImports()):this.throwUnexpectedToken(this.lookahead))):this.throwUnexpectedToken(this.nextToken()),!this.matchContextualKeyword(\"from\")){var r=this.lookahead.value?i.Messages.UnexpectedToken:i.Messages.MissingFromClause;this.throwError(r,this.lookahead.value)}this.nextToken(),t=this.parseModuleSpecifier()}return this.consumeSemicolon(),this.finalize(e,new c.ImportDeclaration(n,t))},e.prototype.parseExportSpecifier=function(){var e=this.createNode(),t=this.parseIdentifierName(),n=t;return this.matchContextualKeyword(\"as\")&&(this.nextToken(),n=this.parseIdentifierName()),this.finalize(e,new c.ExportSpecifier(t,n))},e.prototype.parseExportDeclaration=function(){this.context.inFunctionBody&&this.throwError(i.Messages.IllegalExportDeclaration);var e=this.createNode();this.expectKeyword(\"export\");var t;if(this.matchKeyword(\"default\"))if(this.nextToken(),this.matchKeyword(\"function\")){var n=this.parseFunctionDeclaration(!0);t=this.finalize(e,new c.ExportDefaultDeclaration(n))}else if(this.matchKeyword(\"class\")){var n=this.parseClassDeclaration(!0);t=this.finalize(e,new c.ExportDefaultDeclaration(n))}else{this.matchContextualKeyword(\"from\")&&this.throwError(i.Messages.UnexpectedToken,this.lookahead.value);var n=this.match(\"{\")?this.parseObjectInitializer():this.match(\"[\")?this.parseArrayInitializer():this.parseAssignmentExpression();this.consumeSemicolon(),t=this.finalize(e,new c.ExportDefaultDeclaration(n))}else if(this.match(\"*\")){if(this.nextToken(),!this.matchContextualKeyword(\"from\")){var r=this.lookahead.value?i.Messages.UnexpectedToken:i.Messages.MissingFromClause;this.throwError(r,this.lookahead.value)}this.nextToken();var o=this.parseModuleSpecifier();this.consumeSemicolon(),t=this.finalize(e,new c.ExportAllDeclaration(o))}else if(this.lookahead.type===s.Token.Keyword){var n=void 0;switch(this.lookahead.value){case\"let\":case\"const\":n=this.parseLexicalDeclaration({inFor:!1});break;case\"var\":case\"class\":case\"function\":n=this.parseStatementListItem();break;default:this.throwUnexpectedToken(this.lookahead)}t=this.finalize(e,new c.ExportNamedDeclaration(n,[],null))}else{var a=[],u=null,l=!1;for(this.expect(\"{\");!this.match(\"}\");)l=l||this.matchKeyword(\"default\"),a.push(this.parseExportSpecifier()),this.match(\"}\")||this.expect(\",\");if(this.expect(\"}\"),this.matchContextualKeyword(\"from\"))this.nextToken(),u=this.parseModuleSpecifier(),this.consumeSemicolon();else if(l){var r=this.lookahead.value?i.Messages.UnexpectedToken:i.Messages.MissingFromClause;this.throwError(r,this.lookahead.value)}else this.consumeSemicolon();t=this.finalize(e,new c.ExportNamedDeclaration(null,a,u))}return t},e}();t.Parser=h},function(e,t){\"use strict\";function n(e,t){if(!e)throw new Error(\"ASSERT: \"+t)}t.assert=n},function(e,t){\"use strict\";t.Messages={UnexpectedToken:\"Unexpected token %0\",UnexpectedTokenIllegal:\"Unexpected token ILLEGAL\",UnexpectedNumber:\"Unexpected number\",UnexpectedString:\"Unexpected string\",UnexpectedIdentifier:\"Unexpected identifier\",UnexpectedReserved:\"Unexpected reserved word\",UnexpectedTemplate:\"Unexpected quasi %0\",UnexpectedEOS:\"Unexpected end of input\",NewlineAfterThrow:\"Illegal newline after throw\",InvalidRegExp:\"Invalid regular expression\",UnterminatedRegExp:\"Invalid regular expression: missing /\",InvalidLHSInAssignment:\"Invalid left-hand side in assignment\",InvalidLHSInForIn:\"Invalid left-hand side in for-in\",InvalidLHSInForLoop:\"Invalid left-hand side in for-loop\",MultipleDefaultsInSwitch:\"More than one default clause in switch statement\",NoCatchOrFinally:\"Missing catch or finally after try\",UnknownLabel:\"Undefined label '%0'\",Redeclaration:\"%0 '%1' has already been declared\",IllegalContinue:\"Illegal continue statement\",IllegalBreak:\"Illegal break statement\",IllegalReturn:\"Illegal return statement\",StrictModeWith:\"Strict mode code may not include a with statement\",StrictCatchVariable:\"Catch variable may not be eval or arguments in strict mode\",StrictVarName:\"Variable name may not be eval or arguments in strict mode\",StrictParamName:\"Parameter name eval or arguments is not allowed in strict mode\",StrictParamDupe:\"Strict mode function may not have duplicate parameter names\",StrictFunctionName:\"Function name may not be eval or arguments in strict mode\",StrictOctalLiteral:\"Octal literals are not allowed in strict mode.\",StrictDelete:\"Delete of an unqualified identifier in strict mode.\",StrictLHSAssignment:\"Assignment to eval or arguments is not allowed in strict mode\",StrictLHSPostfix:\"Postfix increment/decrement may not have eval or arguments operand in strict mode\",StrictLHSPrefix:\"Prefix increment/decrement may not have eval or arguments operand in strict mode\",StrictReservedWord:\"Use of future reserved word in strict mode\",TemplateOctalLiteral:\"Octal literals are not allowed in template strings.\",ParameterAfterRestParameter:\"Rest parameter must be last formal parameter\",DefaultRestParameter:\"Unexpected token =\",DuplicateProtoProperty:\"Duplicate __proto__ fields are not allowed in object literals\",ConstructorSpecialMethod:\"Class constructor may not be an accessor\",DuplicateConstructor:\"A class may only have one constructor\",StaticPrototype:\"Classes may not have static property named prototype\",MissingFromClause:\"Unexpected token\",NoAsAfterImportNamespace:\"Unexpected token\",InvalidModuleSpecifier:\"Unexpected token\",IllegalImportDeclaration:\"Unexpected token\",IllegalExportDeclaration:\"Unexpected token\",DuplicateBinding:\"Duplicate binding %0\",ForInOfLoopInitializer:\"%0 loop variable declaration may not have an initializer\"}},function(e,t){\"use strict\";var n=function(){function e(){this.errors=[],this.tolerant=!1}return e.prototype.recordError=function(e){this.errors.push(e)},e.prototype.tolerate=function(e){if(!this.tolerant)throw e;this.recordError(e)},e.prototype.constructError=function(e,t){var n=new Error(e);try{throw n}catch(e){Object.create&&Object.defineProperty&&(n=Object.create(e),Object.defineProperty(n,\"column\",{value:t}))}finally{return n}},e.prototype.createError=function(e,t,n,r){var i=\"Line \"+t+\": \"+r,o=this.constructError(i,n);return o.index=e,o.lineNumber=t,o.description=r,o},e.prototype.throwError=function(e,t,n,r){throw this.createError(e,t,n,r)},e.prototype.tolerateError=function(e,t,n,r){var i=this.createError(e,t,n,r);if(!this.tolerant)throw i;this.recordError(i)},e}();t.ErrorHandler=n},function(e,t){\"use strict\";!function(e){e[e.BooleanLiteral=1]=\"BooleanLiteral\",\ne[e.EOF=2]=\"EOF\",e[e.Identifier=3]=\"Identifier\",e[e.Keyword=4]=\"Keyword\",e[e.NullLiteral=5]=\"NullLiteral\",e[e.NumericLiteral=6]=\"NumericLiteral\",e[e.Punctuator=7]=\"Punctuator\",e[e.StringLiteral=8]=\"StringLiteral\",e[e.RegularExpression=9]=\"RegularExpression\",e[e.Template=10]=\"Template\"}(t.Token||(t.Token={}));var n=t.Token;t.TokenName={},t.TokenName[n.BooleanLiteral]=\"Boolean\",t.TokenName[n.EOF]=\"<end>\",t.TokenName[n.Identifier]=\"Identifier\",t.TokenName[n.Keyword]=\"Keyword\",t.TokenName[n.NullLiteral]=\"Null\",t.TokenName[n.NumericLiteral]=\"Numeric\",t.TokenName[n.Punctuator]=\"Punctuator\",t.TokenName[n.StringLiteral]=\"String\",t.TokenName[n.RegularExpression]=\"RegularExpression\",t.TokenName[n.Template]=\"Template\"},function(e,t,n){\"use strict\";function r(e){return\"0123456789abcdef\".indexOf(e.toLowerCase())}function i(e){return\"01234567\".indexOf(e)}var o=n(4),s=n(5),a=n(9),u=n(7),c=function(){function e(e,t){this.source=e,this.errorHandler=t,this.trackComment=!1,this.length=e.length,this.index=0,this.lineNumber=e.length>0?1:0,this.lineStart=0,this.curlyStack=[]}return e.prototype.eof=function(){return this.index>=this.length},e.prototype.throwUnexpectedToken=function(e){void 0===e&&(e=s.Messages.UnexpectedTokenIllegal),this.errorHandler.throwError(this.index,this.lineNumber,this.index-this.lineStart+1,e)},e.prototype.tolerateUnexpectedToken=function(){this.errorHandler.tolerateError(this.index,this.lineNumber,this.index-this.lineStart+1,s.Messages.UnexpectedTokenIllegal)},e.prototype.skipSingleLineComment=function(e){var t,n,r;for(this.trackComment&&(t=[],n=this.index-e,r={start:{line:this.lineNumber,column:this.index-this.lineStart-e},end:{}});!this.eof();){var i=this.source.charCodeAt(this.index);if(++this.index,a.Character.isLineTerminator(i)){if(this.trackComment){r.end={line:this.lineNumber,column:this.index-this.lineStart-1};var o={multiLine:!1,slice:[n+e,this.index-1],range:[n,this.index-1],loc:r};t.push(o)}return 13===i&&10===this.source.charCodeAt(this.index)&&++this.index,++this.lineNumber,this.lineStart=this.index,t}}if(this.trackComment){r.end={line:this.lineNumber,column:this.index-this.lineStart};var o={multiLine:!1,slice:[n+e,this.index],range:[n,this.index],loc:r};t.push(o)}return t},e.prototype.skipMultiLineComment=function(){var e,t,n;for(this.trackComment&&(e=[],t=this.index-2,n={start:{line:this.lineNumber,column:this.index-this.lineStart-2},end:{}});!this.eof();){var r=this.source.charCodeAt(this.index);if(a.Character.isLineTerminator(r))13===r&&10===this.source.charCodeAt(this.index+1)&&++this.index,++this.lineNumber,++this.index,this.lineStart=this.index;else if(42===r){if(47===this.source.charCodeAt(this.index+1)){if(this.index+=2,this.trackComment){n.end={line:this.lineNumber,column:this.index-this.lineStart};var i={multiLine:!0,slice:[t+2,this.index-2],range:[t,this.index],loc:n};e.push(i)}return e}++this.index}else++this.index}if(this.trackComment){n.end={line:this.lineNumber,column:this.index-this.lineStart};var i={multiLine:!0,slice:[t+2,this.index],range:[t,this.index],loc:n};e.push(i)}return this.tolerateUnexpectedToken(),e},e.prototype.scanComments=function(){var e;this.trackComment&&(e=[]);for(var t=0===this.index;!this.eof();){var n=this.source.charCodeAt(this.index);if(a.Character.isWhiteSpace(n))++this.index;else if(a.Character.isLineTerminator(n))++this.index,13===n&&10===this.source.charCodeAt(this.index)&&++this.index,++this.lineNumber,this.lineStart=this.index,t=!0;else if(47===n)if(n=this.source.charCodeAt(this.index+1),47===n){this.index+=2;var r=this.skipSingleLineComment(2);this.trackComment&&(e=e.concat(r)),t=!0}else{if(42!==n)break;this.index+=2;var r=this.skipMultiLineComment();this.trackComment&&(e=e.concat(r))}else if(t&&45===n){if(45!==this.source.charCodeAt(this.index+1)||62!==this.source.charCodeAt(this.index+2))break;this.index+=3;var r=this.skipSingleLineComment(3);this.trackComment&&(e=e.concat(r))}else{if(60!==n)break;if(\"!--\"!==this.source.slice(this.index+1,this.index+4))break;this.index+=4;var r=this.skipSingleLineComment(4);this.trackComment&&(e=e.concat(r))}}return e},e.prototype.isFutureReservedWord=function(e){switch(e){case\"enum\":case\"export\":case\"import\":case\"super\":return!0;default:return!1}},e.prototype.isStrictModeReservedWord=function(e){switch(e){case\"implements\":case\"interface\":case\"package\":case\"private\":case\"protected\":case\"public\":case\"static\":case\"yield\":case\"let\":return!0;default:return!1}},e.prototype.isRestrictedWord=function(e){return\"eval\"===e||\"arguments\"===e},e.prototype.isKeyword=function(e){switch(e.length){case 2:return\"if\"===e||\"in\"===e||\"do\"===e;case 3:return\"var\"===e||\"for\"===e||\"new\"===e||\"try\"===e||\"let\"===e;case 4:return\"this\"===e||\"else\"===e||\"case\"===e||\"void\"===e||\"with\"===e||\"enum\"===e;case 5:return\"while\"===e||\"break\"===e||\"catch\"===e||\"throw\"===e||\"const\"===e||\"yield\"===e||\"class\"===e||\"super\"===e;case 6:return\"return\"===e||\"typeof\"===e||\"delete\"===e||\"switch\"===e||\"export\"===e||\"import\"===e;case 7:return\"default\"===e||\"finally\"===e||\"extends\"===e;case 8:return\"function\"===e||\"continue\"===e||\"debugger\"===e;case 10:return\"instanceof\"===e;default:return!1}},e.prototype.codePointAt=function(e){var t=this.source.charCodeAt(e);if(t>=55296&&t<=56319){var n=this.source.charCodeAt(e+1);if(n>=56320&&n<=57343){var r=t;t=1024*(r-55296)+n-56320+65536}}return t},e.prototype.scanHexEscape=function(e){for(var t=\"u\"===e?4:2,n=0,i=0;i<t;++i){if(this.eof()||!a.Character.isHexDigit(this.source.charCodeAt(this.index)))return\"\";n=16*n+r(this.source[this.index++])}return String.fromCharCode(n)},e.prototype.scanUnicodeCodePointEscape=function(){var e=this.source[this.index],t=0;for(\"}\"===e&&this.throwUnexpectedToken();!this.eof()&&(e=this.source[this.index++],a.Character.isHexDigit(e.charCodeAt(0)));)t=16*t+r(e);return(t>1114111||\"}\"!==e)&&this.throwUnexpectedToken(),a.Character.fromCodePoint(t)},e.prototype.getIdentifier=function(){for(var e=this.index++;!this.eof();){var t=this.source.charCodeAt(this.index);if(92===t)return this.index=e,this.getComplexIdentifier();if(t>=55296&&t<57343)return this.index=e,this.getComplexIdentifier();if(!a.Character.isIdentifierPart(t))break;++this.index}return this.source.slice(e,this.index)},e.prototype.getComplexIdentifier=function(){var e=this.codePointAt(this.index),t=a.Character.fromCodePoint(e);this.index+=t.length;var n;for(92===e&&(117!==this.source.charCodeAt(this.index)&&this.throwUnexpectedToken(),++this.index,\"{\"===this.source[this.index]?(++this.index,n=this.scanUnicodeCodePointEscape()):(n=this.scanHexEscape(\"u\"),e=n.charCodeAt(0),n&&\"\\\\\"!==n&&a.Character.isIdentifierStart(e)||this.throwUnexpectedToken()),t=n);!this.eof()&&(e=this.codePointAt(this.index),a.Character.isIdentifierPart(e));)n=a.Character.fromCodePoint(e),t+=n,this.index+=n.length,92===e&&(t=t.substr(0,t.length-1),117!==this.source.charCodeAt(this.index)&&this.throwUnexpectedToken(),++this.index,\"{\"===this.source[this.index]?(++this.index,n=this.scanUnicodeCodePointEscape()):(n=this.scanHexEscape(\"u\"),e=n.charCodeAt(0),n&&\"\\\\\"!==n&&a.Character.isIdentifierPart(e)||this.throwUnexpectedToken()),t+=n);return t},e.prototype.octalToDecimal=function(e){var t=\"0\"!==e,n=i(e);return!this.eof()&&a.Character.isOctalDigit(this.source.charCodeAt(this.index))&&(t=!0,n=8*n+i(this.source[this.index++]),\"0123\".indexOf(e)>=0&&!this.eof()&&a.Character.isOctalDigit(this.source.charCodeAt(this.index))&&(n=8*n+i(this.source[this.index++]))),{code:n,octal:t}},e.prototype.scanIdentifier=function(){var e,t=this.index,n=92===this.source.charCodeAt(t)?this.getComplexIdentifier():this.getIdentifier();return e=1===n.length?u.Token.Identifier:this.isKeyword(n)?u.Token.Keyword:\"null\"===n?u.Token.NullLiteral:\"true\"===n||\"false\"===n?u.Token.BooleanLiteral:u.Token.Identifier,{type:e,value:n,lineNumber:this.lineNumber,lineStart:this.lineStart,start:t,end:this.index}},e.prototype.scanPunctuator=function(){var e={type:u.Token.Punctuator,value:\"\",lineNumber:this.lineNumber,lineStart:this.lineStart,start:this.index,end:this.index},t=this.source[this.index];switch(t){case\"(\":case\"{\":\"{\"===t&&this.curlyStack.push(\"{\"),++this.index;break;case\".\":++this.index,\".\"===this.source[this.index]&&\".\"===this.source[this.index+1]&&(this.index+=2,t=\"...\");break;case\"}\":++this.index,this.curlyStack.pop();break;case\")\":case\";\":case\",\":case\"[\":case\"]\":case\":\":case\"?\":case\"~\":++this.index;break;default:t=this.source.substr(this.index,4),\">>>=\"===t?this.index+=4:(t=t.substr(0,3),\"===\"===t||\"!==\"===t||\">>>\"===t||\"<<=\"===t||\">>=\"===t||\"**=\"===t?this.index+=3:(t=t.substr(0,2),\"&&\"===t||\"||\"===t||\"==\"===t||\"!=\"===t||\"+=\"===t||\"-=\"===t||\"*=\"===t||\"/=\"===t||\"++\"===t||\"--\"===t||\"<<\"===t||\">>\"===t||\"&=\"===t||\"|=\"===t||\"^=\"===t||\"%=\"===t||\"<=\"===t||\">=\"===t||\"=>\"===t||\"**\"===t?this.index+=2:(t=this.source[this.index],\"<>=!+-*%&|^/\".indexOf(t)>=0&&++this.index)))}return this.index===e.start&&this.throwUnexpectedToken(),e.end=this.index,e.value=t,e},e.prototype.scanHexLiteral=function(e){for(var t=\"\";!this.eof()&&a.Character.isHexDigit(this.source.charCodeAt(this.index));)t+=this.source[this.index++];return 0===t.length&&this.throwUnexpectedToken(),a.Character.isIdentifierStart(this.source.charCodeAt(this.index))&&this.throwUnexpectedToken(),{type:u.Token.NumericLiteral,value:parseInt(\"0x\"+t,16),lineNumber:this.lineNumber,lineStart:this.lineStart,start:e,end:this.index}},e.prototype.scanBinaryLiteral=function(e){for(var t,n=\"\";!this.eof()&&(t=this.source[this.index],\"0\"===t||\"1\"===t);)n+=this.source[this.index++];return 0===n.length&&this.throwUnexpectedToken(),this.eof()||(t=this.source.charCodeAt(this.index),(a.Character.isIdentifierStart(t)||a.Character.isDecimalDigit(t))&&this.throwUnexpectedToken()),{type:u.Token.NumericLiteral,value:parseInt(n,2),lineNumber:this.lineNumber,lineStart:this.lineStart,start:e,end:this.index}},e.prototype.scanOctalLiteral=function(e,t){var n=\"\",r=!1;for(a.Character.isOctalDigit(e.charCodeAt(0))?(r=!0,n=\"0\"+this.source[this.index++]):++this.index;!this.eof()&&a.Character.isOctalDigit(this.source.charCodeAt(this.index));)n+=this.source[this.index++];return r||0!==n.length||this.throwUnexpectedToken(),(a.Character.isIdentifierStart(this.source.charCodeAt(this.index))||a.Character.isDecimalDigit(this.source.charCodeAt(this.index)))&&this.throwUnexpectedToken(),{type:u.Token.NumericLiteral,value:parseInt(n,8),octal:r,lineNumber:this.lineNumber,lineStart:this.lineStart,start:t,end:this.index}},e.prototype.isImplicitOctalLiteral=function(){for(var e=this.index+1;e<this.length;++e){var t=this.source[e];if(\"8\"===t||\"9\"===t)return!1;if(!a.Character.isOctalDigit(t.charCodeAt(0)))return!0}return!0},e.prototype.scanNumericLiteral=function(){var e=this.index,t=this.source[e];o.assert(a.Character.isDecimalDigit(t.charCodeAt(0))||\".\"===t,\"Numeric literal must start with a decimal digit or a decimal point\");var n=\"\";if(\".\"!==t){if(n=this.source[this.index++],t=this.source[this.index],\"0\"===n){if(\"x\"===t||\"X\"===t)return++this.index,this.scanHexLiteral(e);if(\"b\"===t||\"B\"===t)return++this.index,this.scanBinaryLiteral(e);if(\"o\"===t||\"O\"===t)return this.scanOctalLiteral(t,e);if(t&&a.Character.isOctalDigit(t.charCodeAt(0))&&this.isImplicitOctalLiteral())return this.scanOctalLiteral(t,e)}for(;a.Character.isDecimalDigit(this.source.charCodeAt(this.index));)n+=this.source[this.index++];t=this.source[this.index]}if(\".\"===t){for(n+=this.source[this.index++];a.Character.isDecimalDigit(this.source.charCodeAt(this.index));)n+=this.source[this.index++];t=this.source[this.index]}if(\"e\"===t||\"E\"===t)if(n+=this.source[this.index++],t=this.source[this.index],\"+\"!==t&&\"-\"!==t||(n+=this.source[this.index++]),a.Character.isDecimalDigit(this.source.charCodeAt(this.index)))for(;a.Character.isDecimalDigit(this.source.charCodeAt(this.index));)n+=this.source[this.index++];else this.throwUnexpectedToken();return a.Character.isIdentifierStart(this.source.charCodeAt(this.index))&&this.throwUnexpectedToken(),{type:u.Token.NumericLiteral,value:parseFloat(n),lineNumber:this.lineNumber,lineStart:this.lineStart,start:e,end:this.index}},e.prototype.scanStringLiteral=function(){var e=this.index,t=this.source[e];o.assert(\"'\"===t||'\"'===t,\"String literal must starts with a quote\"),++this.index;for(var n=!1,r=\"\";!this.eof();){var i=this.source[this.index++];if(i===t){t=\"\";break}if(\"\\\\\"===i)if(i=this.source[this.index++],i&&a.Character.isLineTerminator(i.charCodeAt(0)))++this.lineNumber,\"\\r\"===i&&\"\\n\"===this.source[this.index]&&++this.index,this.lineStart=this.index;else switch(i){case\"u\":case\"x\":if(\"{\"===this.source[this.index])++this.index,r+=this.scanUnicodeCodePointEscape();else{var s=this.scanHexEscape(i);s||this.throwUnexpectedToken(),r+=s}break;case\"n\":r+=\"\\n\";break;case\"r\":r+=\"\\r\";break;case\"t\":r+=\"\\t\";break;case\"b\":r+=\"\\b\";break;case\"f\":r+=\"\\f\";break;case\"v\":r+=\"\\v\";break;case\"8\":case\"9\":r+=i,this.tolerateUnexpectedToken();break;default:if(i&&a.Character.isOctalDigit(i.charCodeAt(0))){var c=this.octalToDecimal(i);n=c.octal||n,r+=String.fromCharCode(c.code)}else r+=i}else{if(a.Character.isLineTerminator(i.charCodeAt(0)))break;r+=i}}return\"\"!==t&&(this.index=e,this.throwUnexpectedToken()),{type:u.Token.StringLiteral,value:r,octal:n,lineNumber:this.lineNumber,lineStart:this.lineStart,start:e,end:this.index}},e.prototype.scanTemplate=function(){var e=\"\",t=!1,n=this.index,r=\"`\"===this.source[n],i=!1,o=2;for(++this.index;!this.eof();){var c=this.source[this.index++];if(\"`\"===c){o=1,i=!0,t=!0;break}if(\"$\"===c){if(\"{\"===this.source[this.index]){this.curlyStack.push(\"${\"),++this.index,t=!0;break}e+=c}else if(\"\\\\\"===c)if(c=this.source[this.index++],a.Character.isLineTerminator(c.charCodeAt(0)))++this.lineNumber,\"\\r\"===c&&\"\\n\"===this.source[this.index]&&++this.index,this.lineStart=this.index;else switch(c){case\"n\":e+=\"\\n\";break;case\"r\":e+=\"\\r\";break;case\"t\":e+=\"\\t\";break;case\"u\":case\"x\":if(\"{\"===this.source[this.index])++this.index,e+=this.scanUnicodeCodePointEscape();else{var l=this.index,h=this.scanHexEscape(c);h?e+=h:(this.index=l,e+=c)}break;case\"b\":e+=\"\\b\";break;case\"f\":e+=\"\\f\";break;case\"v\":e+=\"\\v\";break;default:\"0\"===c?(a.Character.isDecimalDigit(this.source.charCodeAt(this.index))&&this.throwUnexpectedToken(s.Messages.TemplateOctalLiteral),e+=\"\\0\"):a.Character.isOctalDigit(c.charCodeAt(0))?this.throwUnexpectedToken(s.Messages.TemplateOctalLiteral):e+=c}else a.Character.isLineTerminator(c.charCodeAt(0))?(++this.lineNumber,\"\\r\"===c&&\"\\n\"===this.source[this.index]&&++this.index,this.lineStart=this.index,e+=\"\\n\"):e+=c}return t||this.throwUnexpectedToken(),r||this.curlyStack.pop(),{type:u.Token.Template,value:{cooked:e,raw:this.source.slice(n+1,this.index-o)},head:r,tail:i,lineNumber:this.lineNumber,lineStart:this.lineStart,start:n,end:this.index}},e.prototype.testRegExp=function(e,t){var n=\"￿\",r=e,i=this;t.indexOf(\"u\")>=0&&(r=r.replace(/\\\\u\\{([0-9a-fA-F]+)\\}|\\\\u([a-fA-F0-9]{4})/g,function(e,t,r){var o=parseInt(t||r,16);return o>1114111&&i.throwUnexpectedToken(s.Messages.InvalidRegExp),o<=65535?String.fromCharCode(o):n}).replace(/[\\uD800-\\uDBFF][\\uDC00-\\uDFFF]/g,n));try{RegExp(r)}catch(e){this.throwUnexpectedToken(s.Messages.InvalidRegExp)}try{return new RegExp(e,t)}catch(e){return null}},e.prototype.scanRegExpBody=function(){var e=this.source[this.index];o.assert(\"/\"===e,\"Regular expression literal must start with a slash\");for(var t=this.source[this.index++],n=!1,r=!1;!this.eof();)if(e=this.source[this.index++],t+=e,\"\\\\\"===e)e=this.source[this.index++],a.Character.isLineTerminator(e.charCodeAt(0))&&this.throwUnexpectedToken(s.Messages.UnterminatedRegExp),t+=e;else if(a.Character.isLineTerminator(e.charCodeAt(0)))this.throwUnexpectedToken(s.Messages.UnterminatedRegExp);else if(n)\"]\"===e&&(n=!1);else{if(\"/\"===e){r=!0;break}\"[\"===e&&(n=!0)}r||this.throwUnexpectedToken(s.Messages.UnterminatedRegExp);var i=t.substr(1,t.length-2);return{value:i,literal:t}},e.prototype.scanRegExpFlags=function(){for(var e=\"\",t=\"\";!this.eof();){var n=this.source[this.index];if(!a.Character.isIdentifierPart(n.charCodeAt(0)))break;if(++this.index,\"\\\\\"!==n||this.eof())t+=n,e+=n;else if(n=this.source[this.index],\"u\"===n){++this.index;var r=this.index;if(n=this.scanHexEscape(\"u\"))for(t+=n,e+=\"\\\\u\";r<this.index;++r)e+=this.source[r];else this.index=r,t+=\"u\",e+=\"\\\\u\";this.tolerateUnexpectedToken()}else e+=\"\\\\\",this.tolerateUnexpectedToken()}return{value:t,literal:e}},e.prototype.scanRegExp=function(){var e=this.index,t=this.scanRegExpBody(),n=this.scanRegExpFlags(),r=this.testRegExp(t.value,n.value);return{type:u.Token.RegularExpression,value:r,literal:t.literal+n.literal,regex:{pattern:t.value,flags:n.value},lineNumber:this.lineNumber,lineStart:this.lineStart,start:e,end:this.index}},e.prototype.lex=function(){if(this.eof())return{type:u.Token.EOF,lineNumber:this.lineNumber,lineStart:this.lineStart,start:this.index,end:this.index};var e=this.source.charCodeAt(this.index);return a.Character.isIdentifierStart(e)?this.scanIdentifier():40===e||41===e||59===e?this.scanPunctuator():39===e||34===e?this.scanStringLiteral():46===e?a.Character.isDecimalDigit(this.source.charCodeAt(this.index+1))?this.scanNumericLiteral():this.scanPunctuator():a.Character.isDecimalDigit(e)?this.scanNumericLiteral():96===e||125===e&&\"${\"===this.curlyStack[this.curlyStack.length-1]?this.scanTemplate():e>=55296&&e<57343&&a.Character.isIdentifierStart(this.codePointAt(this.index))?this.scanIdentifier():this.scanPunctuator()},e}();t.Scanner=c},function(e,t){\"use strict\";var n={NonAsciiIdentifierStart:/[\\xAA\\xB5\\xBA\\xC0-\\xD6\\xD8-\\xF6\\xF8-\\u02C1\\u02C6-\\u02D1\\u02E0-\\u02E4\\u02EC\\u02EE\\u0370-\\u0374\\u0376\\u0377\\u037A-\\u037D\\u037F\\u0386\\u0388-\\u038A\\u038C\\u038E-\\u03A1\\u03A3-\\u03F5\\u03F7-\\u0481\\u048A-\\u052F\\u0531-\\u0556\\u0559\\u0561-\\u0587\\u05D0-\\u05EA\\u05F0-\\u05F2\\u0620-\\u064A\\u066E\\u066F\\u0671-\\u06D3\\u06D5\\u06E5\\u06E6\\u06EE\\u06EF\\u06FA-\\u06FC\\u06FF\\u0710\\u0712-\\u072F\\u074D-\\u07A5\\u07B1\\u07CA-\\u07EA\\u07F4\\u07F5\\u07FA\\u0800-\\u0815\\u081A\\u0824\\u0828\\u0840-\\u0858\\u08A0-\\u08B4\\u0904-\\u0939\\u093D\\u0950\\u0958-\\u0961\\u0971-\\u0980\\u0985-\\u098C\\u098F\\u0990\\u0993-\\u09A8\\u09AA-\\u09B0\\u09B2\\u09B6-\\u09B9\\u09BD\\u09CE\\u09DC\\u09DD\\u09DF-\\u09E1\\u09F0\\u09F1\\u0A05-\\u0A0A\\u0A0F\\u0A10\\u0A13-\\u0A28\\u0A2A-\\u0A30\\u0A32\\u0A33\\u0A35\\u0A36\\u0A38\\u0A39\\u0A59-\\u0A5C\\u0A5E\\u0A72-\\u0A74\\u0A85-\\u0A8D\\u0A8F-\\u0A91\\u0A93-\\u0AA8\\u0AAA-\\u0AB0\\u0AB2\\u0AB3\\u0AB5-\\u0AB9\\u0ABD\\u0AD0\\u0AE0\\u0AE1\\u0AF9\\u0B05-\\u0B0C\\u0B0F\\u0B10\\u0B13-\\u0B28\\u0B2A-\\u0B30\\u0B32\\u0B33\\u0B35-\\u0B39\\u0B3D\\u0B5C\\u0B5D\\u0B5F-\\u0B61\\u0B71\\u0B83\\u0B85-\\u0B8A\\u0B8E-\\u0B90\\u0B92-\\u0B95\\u0B99\\u0B9A\\u0B9C\\u0B9E\\u0B9F\\u0BA3\\u0BA4\\u0BA8-\\u0BAA\\u0BAE-\\u0BB9\\u0BD0\\u0C05-\\u0C0C\\u0C0E-\\u0C10\\u0C12-\\u0C28\\u0C2A-\\u0C39\\u0C3D\\u0C58-\\u0C5A\\u0C60\\u0C61\\u0C85-\\u0C8C\\u0C8E-\\u0C90\\u0C92-\\u0CA8\\u0CAA-\\u0CB3\\u0CB5-\\u0CB9\\u0CBD\\u0CDE\\u0CE0\\u0CE1\\u0CF1\\u0CF2\\u0D05-\\u0D0C\\u0D0E-\\u0D10\\u0D12-\\u0D3A\\u0D3D\\u0D4E\\u0D5F-\\u0D61\\u0D7A-\\u0D7F\\u0D85-\\u0D96\\u0D9A-\\u0DB1\\u0DB3-\\u0DBB\\u0DBD\\u0DC0-\\u0DC6\\u0E01-\\u0E30\\u0E32\\u0E33\\u0E40-\\u0E46\\u0E81\\u0E82\\u0E84\\u0E87\\u0E88\\u0E8A\\u0E8D\\u0E94-\\u0E97\\u0E99-\\u0E9F\\u0EA1-\\u0EA3\\u0EA5\\u0EA7\\u0EAA\\u0EAB\\u0EAD-\\u0EB0\\u0EB2\\u0EB3\\u0EBD\\u0EC0-\\u0EC4\\u0EC6\\u0EDC-\\u0EDF\\u0F00\\u0F40-\\u0F47\\u0F49-\\u0F6C\\u0F88-\\u0F8C\\u1000-\\u102A\\u103F\\u1050-\\u1055\\u105A-\\u105D\\u1061\\u1065\\u1066\\u106E-\\u1070\\u1075-\\u1081\\u108E\\u10A0-\\u10C5\\u10C7\\u10CD\\u10D0-\\u10FA\\u10FC-\\u1248\\u124A-\\u124D\\u1250-\\u1256\\u1258\\u125A-\\u125D\\u1260-\\u1288\\u128A-\\u128D\\u1290-\\u12B0\\u12B2-\\u12B5\\u12B8-\\u12BE\\u12C0\\u12C2-\\u12C5\\u12C8-\\u12D6\\u12D8-\\u1310\\u1312-\\u1315\\u1318-\\u135A\\u1380-\\u138F\\u13A0-\\u13F5\\u13F8-\\u13FD\\u1401-\\u166C\\u166F-\\u167F\\u1681-\\u169A\\u16A0-\\u16EA\\u16EE-\\u16F8\\u1700-\\u170C\\u170E-\\u1711\\u1720-\\u1731\\u1740-\\u1751\\u1760-\\u176C\\u176E-\\u1770\\u1780-\\u17B3\\u17D7\\u17DC\\u1820-\\u1877\\u1880-\\u18A8\\u18AA\\u18B0-\\u18F5\\u1900-\\u191E\\u1950-\\u196D\\u1970-\\u1974\\u1980-\\u19AB\\u19B0-\\u19C9\\u1A00-\\u1A16\\u1A20-\\u1A54\\u1AA7\\u1B05-\\u1B33\\u1B45-\\u1B4B\\u1B83-\\u1BA0\\u1BAE\\u1BAF\\u1BBA-\\u1BE5\\u1C00-\\u1C23\\u1C4D-\\u1C4F\\u1C5A-\\u1C7D\\u1CE9-\\u1CEC\\u1CEE-\\u1CF1\\u1CF5\\u1CF6\\u1D00-\\u1DBF\\u1E00-\\u1F15\\u1F18-\\u1F1D\\u1F20-\\u1F45\\u1F48-\\u1F4D\\u1F50-\\u1F57\\u1F59\\u1F5B\\u1F5D\\u1F5F-\\u1F7D\\u1F80-\\u1FB4\\u1FB6-\\u1FBC\\u1FBE\\u1FC2-\\u1FC4\\u1FC6-\\u1FCC\\u1FD0-\\u1FD3\\u1FD6-\\u1FDB\\u1FE0-\\u1FEC\\u1FF2-\\u1FF4\\u1FF6-\\u1FFC\\u2071\\u207F\\u2090-\\u209C\\u2102\\u2107\\u210A-\\u2113\\u2115\\u2118-\\u211D\\u2124\\u2126\\u2128\\u212A-\\u2139\\u213C-\\u213F\\u2145-\\u2149\\u214E\\u2160-\\u2188\\u2C00-\\u2C2E\\u2C30-\\u2C5E\\u2C60-\\u2CE4\\u2CEB-\\u2CEE\\u2CF2\\u2CF3\\u2D00-\\u2D25\\u2D27\\u2D2D\\u2D30-\\u2D67\\u2D6F\\u2D80-\\u2D96\\u2DA0-\\u2DA6\\u2DA8-\\u2DAE\\u2DB0-\\u2DB6\\u2DB8-\\u2DBE\\u2DC0-\\u2DC6\\u2DC8-\\u2DCE\\u2DD0-\\u2DD6\\u2DD8-\\u2DDE\\u3005-\\u3007\\u3021-\\u3029\\u3031-\\u3035\\u3038-\\u303C\\u3041-\\u3096\\u309B-\\u309F\\u30A1-\\u30FA\\u30FC-\\u30FF\\u3105-\\u312D\\u3131-\\u318E\\u31A0-\\u31BA\\u31F0-\\u31FF\\u3400-\\u4DB5\\u4E00-\\u9FD5\\uA000-\\uA48C\\uA4D0-\\uA4FD\\uA500-\\uA60C\\uA610-\\uA61F\\uA62A\\uA62B\\uA640-\\uA66E\\uA67F-\\uA69D\\uA6A0-\\uA6EF\\uA717-\\uA71F\\uA722-\\uA788\\uA78B-\\uA7AD\\uA7B0-\\uA7B7\\uA7F7-\\uA801\\uA803-\\uA805\\uA807-\\uA80A\\uA80C-\\uA822\\uA840-\\uA873\\uA882-\\uA8B3\\uA8F2-\\uA8F7\\uA8FB\\uA8FD\\uA90A-\\uA925\\uA930-\\uA946\\uA960-\\uA97C\\uA984-\\uA9B2\\uA9CF\\uA9E0-\\uA9E4\\uA9E6-\\uA9EF\\uA9FA-\\uA9FE\\uAA00-\\uAA28\\uAA40-\\uAA42\\uAA44-\\uAA4B\\uAA60-\\uAA76\\uAA7A\\uAA7E-\\uAAAF\\uAAB1\\uAAB5\\uAAB6\\uAAB9-\\uAABD\\uAAC0\\uAAC2\\uAADB-\\uAADD\\uAAE0-\\uAAEA\\uAAF2-\\uAAF4\\uAB01-\\uAB06\\uAB09-\\uAB0E\\uAB11-\\uAB16\\uAB20-\\uAB26\\uAB28-\\uAB2E\\uAB30-\\uAB5A\\uAB5C-\\uAB65\\uAB70-\\uABE2\\uAC00-\\uD7A3\\uD7B0-\\uD7C6\\uD7CB-\\uD7FB\\uF900-\\uFA6D\\uFA70-\\uFAD9\\uFB00-\\uFB06\\uFB13-\\uFB17\\uFB1D\\uFB1F-\\uFB28\\uFB2A-\\uFB36\\uFB38-\\uFB3C\\uFB3E\\uFB40\\uFB41\\uFB43\\uFB44\\uFB46-\\uFBB1\\uFBD3-\\uFD3D\\uFD50-\\uFD8F\\uFD92-\\uFDC7\\uFDF0-\\uFDFB\\uFE70-\\uFE74\\uFE76-\\uFEFC\\uFF21-\\uFF3A\\uFF41-\\uFF5A\\uFF66-\\uFFBE\\uFFC2-\\uFFC7\\uFFCA-\\uFFCF\\uFFD2-\\uFFD7\\uFFDA-\\uFFDC]|\\uD800[\\uDC00-\\uDC0B\\uDC0D-\\uDC26\\uDC28-\\uDC3A\\uDC3C\\uDC3D\\uDC3F-\\uDC4D\\uDC50-\\uDC5D\\uDC80-\\uDCFA\\uDD40-\\uDD74\\uDE80-\\uDE9C\\uDEA0-\\uDED0\\uDF00-\\uDF1F\\uDF30-\\uDF4A\\uDF50-\\uDF75\\uDF80-\\uDF9D\\uDFA0-\\uDFC3\\uDFC8-\\uDFCF\\uDFD1-\\uDFD5]|\\uD801[\\uDC00-\\uDC9D\\uDD00-\\uDD27\\uDD30-\\uDD63\\uDE00-\\uDF36\\uDF40-\\uDF55\\uDF60-\\uDF67]|\\uD802[\\uDC00-\\uDC05\\uDC08\\uDC0A-\\uDC35\\uDC37\\uDC38\\uDC3C\\uDC3F-\\uDC55\\uDC60-\\uDC76\\uDC80-\\uDC9E\\uDCE0-\\uDCF2\\uDCF4\\uDCF5\\uDD00-\\uDD15\\uDD20-\\uDD39\\uDD80-\\uDDB7\\uDDBE\\uDDBF\\uDE00\\uDE10-\\uDE13\\uDE15-\\uDE17\\uDE19-\\uDE33\\uDE60-\\uDE7C\\uDE80-\\uDE9C\\uDEC0-\\uDEC7\\uDEC9-\\uDEE4\\uDF00-\\uDF35\\uDF40-\\uDF55\\uDF60-\\uDF72\\uDF80-\\uDF91]|\\uD803[\\uDC00-\\uDC48\\uDC80-\\uDCB2\\uDCC0-\\uDCF2]|\\uD804[\\uDC03-\\uDC37\\uDC83-\\uDCAF\\uDCD0-\\uDCE8\\uDD03-\\uDD26\\uDD50-\\uDD72\\uDD76\\uDD83-\\uDDB2\\uDDC1-\\uDDC4\\uDDDA\\uDDDC\\uDE00-\\uDE11\\uDE13-\\uDE2B\\uDE80-\\uDE86\\uDE88\\uDE8A-\\uDE8D\\uDE8F-\\uDE9D\\uDE9F-\\uDEA8\\uDEB0-\\uDEDE\\uDF05-\\uDF0C\\uDF0F\\uDF10\\uDF13-\\uDF28\\uDF2A-\\uDF30\\uDF32\\uDF33\\uDF35-\\uDF39\\uDF3D\\uDF50\\uDF5D-\\uDF61]|\\uD805[\\uDC80-\\uDCAF\\uDCC4\\uDCC5\\uDCC7\\uDD80-\\uDDAE\\uDDD8-\\uDDDB\\uDE00-\\uDE2F\\uDE44\\uDE80-\\uDEAA\\uDF00-\\uDF19]|\\uD806[\\uDCA0-\\uDCDF\\uDCFF\\uDEC0-\\uDEF8]|\\uD808[\\uDC00-\\uDF99]|\\uD809[\\uDC00-\\uDC6E\\uDC80-\\uDD43]|[\\uD80C\\uD840-\\uD868\\uD86A-\\uD86C\\uD86F-\\uD872][\\uDC00-\\uDFFF]|\\uD80D[\\uDC00-\\uDC2E]|\\uD811[\\uDC00-\\uDE46]|\\uD81A[\\uDC00-\\uDE38\\uDE40-\\uDE5E\\uDED0-\\uDEED\\uDF00-\\uDF2F\\uDF40-\\uDF43\\uDF63-\\uDF77\\uDF7D-\\uDF8F]|\\uD81B[\\uDF00-\\uDF44\\uDF50\\uDF93-\\uDF9F]|\\uD82C[\\uDC00\\uDC01]|\\uD82F[\\uDC00-\\uDC6A\\uDC70-\\uDC7C\\uDC80-\\uDC88\\uDC90-\\uDC99]|\\uD835[\\uDC00-\\uDC54\\uDC56-\\uDC9C\\uDC9E\\uDC9F\\uDCA2\\uDCA5\\uDCA6\\uDCA9-\\uDCAC\\uDCAE-\\uDCB9\\uDCBB\\uDCBD-\\uDCC3\\uDCC5-\\uDD05\\uDD07-\\uDD0A\\uDD0D-\\uDD14\\uDD16-\\uDD1C\\uDD1E-\\uDD39\\uDD3B-\\uDD3E\\uDD40-\\uDD44\\uDD46\\uDD4A-\\uDD50\\uDD52-\\uDEA5\\uDEA8-\\uDEC0\\uDEC2-\\uDEDA\\uDEDC-\\uDEFA\\uDEFC-\\uDF14\\uDF16-\\uDF34\\uDF36-\\uDF4E\\uDF50-\\uDF6E\\uDF70-\\uDF88\\uDF8A-\\uDFA8\\uDFAA-\\uDFC2\\uDFC4-\\uDFCB]|\\uD83A[\\uDC00-\\uDCC4]|\\uD83B[\\uDE00-\\uDE03\\uDE05-\\uDE1F\\uDE21\\uDE22\\uDE24\\uDE27\\uDE29-\\uDE32\\uDE34-\\uDE37\\uDE39\\uDE3B\\uDE42\\uDE47\\uDE49\\uDE4B\\uDE4D-\\uDE4F\\uDE51\\uDE52\\uDE54\\uDE57\\uDE59\\uDE5B\\uDE5D\\uDE5F\\uDE61\\uDE62\\uDE64\\uDE67-\\uDE6A\\uDE6C-\\uDE72\\uDE74-\\uDE77\\uDE79-\\uDE7C\\uDE7E\\uDE80-\\uDE89\\uDE8B-\\uDE9B\\uDEA1-\\uDEA3\\uDEA5-\\uDEA9\\uDEAB-\\uDEBB]|\\uD869[\\uDC00-\\uDED6\\uDF00-\\uDFFF]|\\uD86D[\\uDC00-\\uDF34\\uDF40-\\uDFFF]|\\uD86E[\\uDC00-\\uDC1D\\uDC20-\\uDFFF]|\\uD873[\\uDC00-\\uDEA1]|\\uD87E[\\uDC00-\\uDE1D]/,NonAsciiIdentifierPart:/[\\xAA\\xB5\\xB7\\xBA\\xC0-\\xD6\\xD8-\\xF6\\xF8-\\u02C1\\u02C6-\\u02D1\\u02E0-\\u02E4\\u02EC\\u02EE\\u0300-\\u0374\\u0376\\u0377\\u037A-\\u037D\\u037F\\u0386-\\u038A\\u038C\\u038E-\\u03A1\\u03A3-\\u03F5\\u03F7-\\u0481\\u0483-\\u0487\\u048A-\\u052F\\u0531-\\u0556\\u0559\\u0561-\\u0587\\u0591-\\u05BD\\u05BF\\u05C1\\u05C2\\u05C4\\u05C5\\u05C7\\u05D0-\\u05EA\\u05F0-\\u05F2\\u0610-\\u061A\\u0620-\\u0669\\u066E-\\u06D3\\u06D5-\\u06DC\\u06DF-\\u06E8\\u06EA-\\u06FC\\u06FF\\u0710-\\u074A\\u074D-\\u07B1\\u07C0-\\u07F5\\u07FA\\u0800-\\u082D\\u0840-\\u085B\\u08A0-\\u08B4\\u08E3-\\u0963\\u0966-\\u096F\\u0971-\\u0983\\u0985-\\u098C\\u098F\\u0990\\u0993-\\u09A8\\u09AA-\\u09B0\\u09B2\\u09B6-\\u09B9\\u09BC-\\u09C4\\u09C7\\u09C8\\u09CB-\\u09CE\\u09D7\\u09DC\\u09DD\\u09DF-\\u09E3\\u09E6-\\u09F1\\u0A01-\\u0A03\\u0A05-\\u0A0A\\u0A0F\\u0A10\\u0A13-\\u0A28\\u0A2A-\\u0A30\\u0A32\\u0A33\\u0A35\\u0A36\\u0A38\\u0A39\\u0A3C\\u0A3E-\\u0A42\\u0A47\\u0A48\\u0A4B-\\u0A4D\\u0A51\\u0A59-\\u0A5C\\u0A5E\\u0A66-\\u0A75\\u0A81-\\u0A83\\u0A85-\\u0A8D\\u0A8F-\\u0A91\\u0A93-\\u0AA8\\u0AAA-\\u0AB0\\u0AB2\\u0AB3\\u0AB5-\\u0AB9\\u0ABC-\\u0AC5\\u0AC7-\\u0AC9\\u0ACB-\\u0ACD\\u0AD0\\u0AE0-\\u0AE3\\u0AE6-\\u0AEF\\u0AF9\\u0B01-\\u0B03\\u0B05-\\u0B0C\\u0B0F\\u0B10\\u0B13-\\u0B28\\u0B2A-\\u0B30\\u0B32\\u0B33\\u0B35-\\u0B39\\u0B3C-\\u0B44\\u0B47\\u0B48\\u0B4B-\\u0B4D\\u0B56\\u0B57\\u0B5C\\u0B5D\\u0B5F-\\u0B63\\u0B66-\\u0B6F\\u0B71\\u0B82\\u0B83\\u0B85-\\u0B8A\\u0B8E-\\u0B90\\u0B92-\\u0B95\\u0B99\\u0B9A\\u0B9C\\u0B9E\\u0B9F\\u0BA3\\u0BA4\\u0BA8-\\u0BAA\\u0BAE-\\u0BB9\\u0BBE-\\u0BC2\\u0BC6-\\u0BC8\\u0BCA-\\u0BCD\\u0BD0\\u0BD7\\u0BE6-\\u0BEF\\u0C00-\\u0C03\\u0C05-\\u0C0C\\u0C0E-\\u0C10\\u0C12-\\u0C28\\u0C2A-\\u0C39\\u0C3D-\\u0C44\\u0C46-\\u0C48\\u0C4A-\\u0C4D\\u0C55\\u0C56\\u0C58-\\u0C5A\\u0C60-\\u0C63\\u0C66-\\u0C6F\\u0C81-\\u0C83\\u0C85-\\u0C8C\\u0C8E-\\u0C90\\u0C92-\\u0CA8\\u0CAA-\\u0CB3\\u0CB5-\\u0CB9\\u0CBC-\\u0CC4\\u0CC6-\\u0CC8\\u0CCA-\\u0CCD\\u0CD5\\u0CD6\\u0CDE\\u0CE0-\\u0CE3\\u0CE6-\\u0CEF\\u0CF1\\u0CF2\\u0D01-\\u0D03\\u0D05-\\u0D0C\\u0D0E-\\u0D10\\u0D12-\\u0D3A\\u0D3D-\\u0D44\\u0D46-\\u0D48\\u0D4A-\\u0D4E\\u0D57\\u0D5F-\\u0D63\\u0D66-\\u0D6F\\u0D7A-\\u0D7F\\u0D82\\u0D83\\u0D85-\\u0D96\\u0D9A-\\u0DB1\\u0DB3-\\u0DBB\\u0DBD\\u0DC0-\\u0DC6\\u0DCA\\u0DCF-\\u0DD4\\u0DD6\\u0DD8-\\u0DDF\\u0DE6-\\u0DEF\\u0DF2\\u0DF3\\u0E01-\\u0E3A\\u0E40-\\u0E4E\\u0E50-\\u0E59\\u0E81\\u0E82\\u0E84\\u0E87\\u0E88\\u0E8A\\u0E8D\\u0E94-\\u0E97\\u0E99-\\u0E9F\\u0EA1-\\u0EA3\\u0EA5\\u0EA7\\u0EAA\\u0EAB\\u0EAD-\\u0EB9\\u0EBB-\\u0EBD\\u0EC0-\\u0EC4\\u0EC6\\u0EC8-\\u0ECD\\u0ED0-\\u0ED9\\u0EDC-\\u0EDF\\u0F00\\u0F18\\u0F19\\u0F20-\\u0F29\\u0F35\\u0F37\\u0F39\\u0F3E-\\u0F47\\u0F49-\\u0F6C\\u0F71-\\u0F84\\u0F86-\\u0F97\\u0F99-\\u0FBC\\u0FC6\\u1000-\\u1049\\u1050-\\u109D\\u10A0-\\u10C5\\u10C7\\u10CD\\u10D0-\\u10FA\\u10FC-\\u1248\\u124A-\\u124D\\u1250-\\u1256\\u1258\\u125A-\\u125D\\u1260-\\u1288\\u128A-\\u128D\\u1290-\\u12B0\\u12B2-\\u12B5\\u12B8-\\u12BE\\u12C0\\u12C2-\\u12C5\\u12C8-\\u12D6\\u12D8-\\u1310\\u1312-\\u1315\\u1318-\\u135A\\u135D-\\u135F\\u1369-\\u1371\\u1380-\\u138F\\u13A0-\\u13F5\\u13F8-\\u13FD\\u1401-\\u166C\\u166F-\\u167F\\u1681-\\u169A\\u16A0-\\u16EA\\u16EE-\\u16F8\\u1700-\\u170C\\u170E-\\u1714\\u1720-\\u1734\\u1740-\\u1753\\u1760-\\u176C\\u176E-\\u1770\\u1772\\u1773\\u1780-\\u17D3\\u17D7\\u17DC\\u17DD\\u17E0-\\u17E9\\u180B-\\u180D\\u1810-\\u1819\\u1820-\\u1877\\u1880-\\u18AA\\u18B0-\\u18F5\\u1900-\\u191E\\u1920-\\u192B\\u1930-\\u193B\\u1946-\\u196D\\u1970-\\u1974\\u1980-\\u19AB\\u19B0-\\u19C9\\u19D0-\\u19DA\\u1A00-\\u1A1B\\u1A20-\\u1A5E\\u1A60-\\u1A7C\\u1A7F-\\u1A89\\u1A90-\\u1A99\\u1AA7\\u1AB0-\\u1ABD\\u1B00-\\u1B4B\\u1B50-\\u1B59\\u1B6B-\\u1B73\\u1B80-\\u1BF3\\u1C00-\\u1C37\\u1C40-\\u1C49\\u1C4D-\\u1C7D\\u1CD0-\\u1CD2\\u1CD4-\\u1CF6\\u1CF8\\u1CF9\\u1D00-\\u1DF5\\u1DFC-\\u1F15\\u1F18-\\u1F1D\\u1F20-\\u1F45\\u1F48-\\u1F4D\\u1F50-\\u1F57\\u1F59\\u1F5B\\u1F5D\\u1F5F-\\u1F7D\\u1F80-\\u1FB4\\u1FB6-\\u1FBC\\u1FBE\\u1FC2-\\u1FC4\\u1FC6-\\u1FCC\\u1FD0-\\u1FD3\\u1FD6-\\u1FDB\\u1FE0-\\u1FEC\\u1FF2-\\u1FF4\\u1FF6-\\u1FFC\\u200C\\u200D\\u203F\\u2040\\u2054\\u2071\\u207F\\u2090-\\u209C\\u20D0-\\u20DC\\u20E1\\u20E5-\\u20F0\\u2102\\u2107\\u210A-\\u2113\\u2115\\u2118-\\u211D\\u2124\\u2126\\u2128\\u212A-\\u2139\\u213C-\\u213F\\u2145-\\u2149\\u214E\\u2160-\\u2188\\u2C00-\\u2C2E\\u2C30-\\u2C5E\\u2C60-\\u2CE4\\u2CEB-\\u2CF3\\u2D00-\\u2D25\\u2D27\\u2D2D\\u2D30-\\u2D67\\u2D6F\\u2D7F-\\u2D96\\u2DA0-\\u2DA6\\u2DA8-\\u2DAE\\u2DB0-\\u2DB6\\u2DB8-\\u2DBE\\u2DC0-\\u2DC6\\u2DC8-\\u2DCE\\u2DD0-\\u2DD6\\u2DD8-\\u2DDE\\u2DE0-\\u2DFF\\u3005-\\u3007\\u3021-\\u302F\\u3031-\\u3035\\u3038-\\u303C\\u3041-\\u3096\\u3099-\\u309F\\u30A1-\\u30FA\\u30FC-\\u30FF\\u3105-\\u312D\\u3131-\\u318E\\u31A0-\\u31BA\\u31F0-\\u31FF\\u3400-\\u4DB5\\u4E00-\\u9FD5\\uA000-\\uA48C\\uA4D0-\\uA4FD\\uA500-\\uA60C\\uA610-\\uA62B\\uA640-\\uA66F\\uA674-\\uA67D\\uA67F-\\uA6F1\\uA717-\\uA71F\\uA722-\\uA788\\uA78B-\\uA7AD\\uA7B0-\\uA7B7\\uA7F7-\\uA827\\uA840-\\uA873\\uA880-\\uA8C4\\uA8D0-\\uA8D9\\uA8E0-\\uA8F7\\uA8FB\\uA8FD\\uA900-\\uA92D\\uA930-\\uA953\\uA960-\\uA97C\\uA980-\\uA9C0\\uA9CF-\\uA9D9\\uA9E0-\\uA9FE\\uAA00-\\uAA36\\uAA40-\\uAA4D\\uAA50-\\uAA59\\uAA60-\\uAA76\\uAA7A-\\uAAC2\\uAADB-\\uAADD\\uAAE0-\\uAAEF\\uAAF2-\\uAAF6\\uAB01-\\uAB06\\uAB09-\\uAB0E\\uAB11-\\uAB16\\uAB20-\\uAB26\\uAB28-\\uAB2E\\uAB30-\\uAB5A\\uAB5C-\\uAB65\\uAB70-\\uABEA\\uABEC\\uABED\\uABF0-\\uABF9\\uAC00-\\uD7A3\\uD7B0-\\uD7C6\\uD7CB-\\uD7FB\\uF900-\\uFA6D\\uFA70-\\uFAD9\\uFB00-\\uFB06\\uFB13-\\uFB17\\uFB1D-\\uFB28\\uFB2A-\\uFB36\\uFB38-\\uFB3C\\uFB3E\\uFB40\\uFB41\\uFB43\\uFB44\\uFB46-\\uFBB1\\uFBD3-\\uFD3D\\uFD50-\\uFD8F\\uFD92-\\uFDC7\\uFDF0-\\uFDFB\\uFE00-\\uFE0F\\uFE20-\\uFE2F\\uFE33\\uFE34\\uFE4D-\\uFE4F\\uFE70-\\uFE74\\uFE76-\\uFEFC\\uFF10-\\uFF19\\uFF21-\\uFF3A\\uFF3F\\uFF41-\\uFF5A\\uFF66-\\uFFBE\\uFFC2-\\uFFC7\\uFFCA-\\uFFCF\\uFFD2-\\uFFD7\\uFFDA-\\uFFDC]|\\uD800[\\uDC00-\\uDC0B\\uDC0D-\\uDC26\\uDC28-\\uDC3A\\uDC3C\\uDC3D\\uDC3F-\\uDC4D\\uDC50-\\uDC5D\\uDC80-\\uDCFA\\uDD40-\\uDD74\\uDDFD\\uDE80-\\uDE9C\\uDEA0-\\uDED0\\uDEE0\\uDF00-\\uDF1F\\uDF30-\\uDF4A\\uDF50-\\uDF7A\\uDF80-\\uDF9D\\uDFA0-\\uDFC3\\uDFC8-\\uDFCF\\uDFD1-\\uDFD5]|\\uD801[\\uDC00-\\uDC9D\\uDCA0-\\uDCA9\\uDD00-\\uDD27\\uDD30-\\uDD63\\uDE00-\\uDF36\\uDF40-\\uDF55\\uDF60-\\uDF67]|\\uD802[\\uDC00-\\uDC05\\uDC08\\uDC0A-\\uDC35\\uDC37\\uDC38\\uDC3C\\uDC3F-\\uDC55\\uDC60-\\uDC76\\uDC80-\\uDC9E\\uDCE0-\\uDCF2\\uDCF4\\uDCF5\\uDD00-\\uDD15\\uDD20-\\uDD39\\uDD80-\\uDDB7\\uDDBE\\uDDBF\\uDE00-\\uDE03\\uDE05\\uDE06\\uDE0C-\\uDE13\\uDE15-\\uDE17\\uDE19-\\uDE33\\uDE38-\\uDE3A\\uDE3F\\uDE60-\\uDE7C\\uDE80-\\uDE9C\\uDEC0-\\uDEC7\\uDEC9-\\uDEE6\\uDF00-\\uDF35\\uDF40-\\uDF55\\uDF60-\\uDF72\\uDF80-\\uDF91]|\\uD803[\\uDC00-\\uDC48\\uDC80-\\uDCB2\\uDCC0-\\uDCF2]|\\uD804[\\uDC00-\\uDC46\\uDC66-\\uDC6F\\uDC7F-\\uDCBA\\uDCD0-\\uDCE8\\uDCF0-\\uDCF9\\uDD00-\\uDD34\\uDD36-\\uDD3F\\uDD50-\\uDD73\\uDD76\\uDD80-\\uDDC4\\uDDCA-\\uDDCC\\uDDD0-\\uDDDA\\uDDDC\\uDE00-\\uDE11\\uDE13-\\uDE37\\uDE80-\\uDE86\\uDE88\\uDE8A-\\uDE8D\\uDE8F-\\uDE9D\\uDE9F-\\uDEA8\\uDEB0-\\uDEEA\\uDEF0-\\uDEF9\\uDF00-\\uDF03\\uDF05-\\uDF0C\\uDF0F\\uDF10\\uDF13-\\uDF28\\uDF2A-\\uDF30\\uDF32\\uDF33\\uDF35-\\uDF39\\uDF3C-\\uDF44\\uDF47\\uDF48\\uDF4B-\\uDF4D\\uDF50\\uDF57\\uDF5D-\\uDF63\\uDF66-\\uDF6C\\uDF70-\\uDF74]|\\uD805[\\uDC80-\\uDCC5\\uDCC7\\uDCD0-\\uDCD9\\uDD80-\\uDDB5\\uDDB8-\\uDDC0\\uDDD8-\\uDDDD\\uDE00-\\uDE40\\uDE44\\uDE50-\\uDE59\\uDE80-\\uDEB7\\uDEC0-\\uDEC9\\uDF00-\\uDF19\\uDF1D-\\uDF2B\\uDF30-\\uDF39]|\\uD806[\\uDCA0-\\uDCE9\\uDCFF\\uDEC0-\\uDEF8]|\\uD808[\\uDC00-\\uDF99]|\\uD809[\\uDC00-\\uDC6E\\uDC80-\\uDD43]|[\\uD80C\\uD840-\\uD868\\uD86A-\\uD86C\\uD86F-\\uD872][\\uDC00-\\uDFFF]|\\uD80D[\\uDC00-\\uDC2E]|\\uD811[\\uDC00-\\uDE46]|\\uD81A[\\uDC00-\\uDE38\\uDE40-\\uDE5E\\uDE60-\\uDE69\\uDED0-\\uDEED\\uDEF0-\\uDEF4\\uDF00-\\uDF36\\uDF40-\\uDF43\\uDF50-\\uDF59\\uDF63-\\uDF77\\uDF7D-\\uDF8F]|\\uD81B[\\uDF00-\\uDF44\\uDF50-\\uDF7E\\uDF8F-\\uDF9F]|\\uD82C[\\uDC00\\uDC01]|\\uD82F[\\uDC00-\\uDC6A\\uDC70-\\uDC7C\\uDC80-\\uDC88\\uDC90-\\uDC99\\uDC9D\\uDC9E]|\\uD834[\\uDD65-\\uDD69\\uDD6D-\\uDD72\\uDD7B-\\uDD82\\uDD85-\\uDD8B\\uDDAA-\\uDDAD\\uDE42-\\uDE44]|\\uD835[\\uDC00-\\uDC54\\uDC56-\\uDC9C\\uDC9E\\uDC9F\\uDCA2\\uDCA5\\uDCA6\\uDCA9-\\uDCAC\\uDCAE-\\uDCB9\\uDCBB\\uDCBD-\\uDCC3\\uDCC5-\\uDD05\\uDD07-\\uDD0A\\uDD0D-\\uDD14\\uDD16-\\uDD1C\\uDD1E-\\uDD39\\uDD3B-\\uDD3E\\uDD40-\\uDD44\\uDD46\\uDD4A-\\uDD50\\uDD52-\\uDEA5\\uDEA8-\\uDEC0\\uDEC2-\\uDEDA\\uDEDC-\\uDEFA\\uDEFC-\\uDF14\\uDF16-\\uDF34\\uDF36-\\uDF4E\\uDF50-\\uDF6E\\uDF70-\\uDF88\\uDF8A-\\uDFA8\\uDFAA-\\uDFC2\\uDFC4-\\uDFCB\\uDFCE-\\uDFFF]|\\uD836[\\uDE00-\\uDE36\\uDE3B-\\uDE6C\\uDE75\\uDE84\\uDE9B-\\uDE9F\\uDEA1-\\uDEAF]|\\uD83A[\\uDC00-\\uDCC4\\uDCD0-\\uDCD6]|\\uD83B[\\uDE00-\\uDE03\\uDE05-\\uDE1F\\uDE21\\uDE22\\uDE24\\uDE27\\uDE29-\\uDE32\\uDE34-\\uDE37\\uDE39\\uDE3B\\uDE42\\uDE47\\uDE49\\uDE4B\\uDE4D-\\uDE4F\\uDE51\\uDE52\\uDE54\\uDE57\\uDE59\\uDE5B\\uDE5D\\uDE5F\\uDE61\\uDE62\\uDE64\\uDE67-\\uDE6A\\uDE6C-\\uDE72\\uDE74-\\uDE77\\uDE79-\\uDE7C\\uDE7E\\uDE80-\\uDE89\\uDE8B-\\uDE9B\\uDEA1-\\uDEA3\\uDEA5-\\uDEA9\\uDEAB-\\uDEBB]|\\uD869[\\uDC00-\\uDED6\\uDF00-\\uDFFF]|\\uD86D[\\uDC00-\\uDF34\\uDF40-\\uDFFF]|\\uD86E[\\uDC00-\\uDC1D\\uDC20-\\uDFFF]|\\uD873[\\uDC00-\\uDEA1]|\\uD87E[\\uDC00-\\uDE1D]|\\uDB40[\\uDD00-\\uDDEF]/\n};t.Character={fromCodePoint:function(e){return e<65536?String.fromCharCode(e):String.fromCharCode(55296+(e-65536>>10))+String.fromCharCode(56320+(e-65536&1023))},isWhiteSpace:function(e){return 32===e||9===e||11===e||12===e||160===e||e>=5760&&[5760,8192,8193,8194,8195,8196,8197,8198,8199,8200,8201,8202,8239,8287,12288,65279].indexOf(e)>=0},isLineTerminator:function(e){return 10===e||13===e||8232===e||8233===e},isIdentifierStart:function(e){return 36===e||95===e||e>=65&&e<=90||e>=97&&e<=122||92===e||e>=128&&n.NonAsciiIdentifierStart.test(t.Character.fromCodePoint(e))},isIdentifierPart:function(e){return 36===e||95===e||e>=65&&e<=90||e>=97&&e<=122||e>=48&&e<=57||92===e||e>=128&&n.NonAsciiIdentifierPart.test(t.Character.fromCodePoint(e))},isDecimalDigit:function(e){return e>=48&&e<=57},isHexDigit:function(e){return e>=48&&e<=57||e>=65&&e<=70||e>=97&&e<=102},isOctalDigit:function(e){return e>=48&&e<=55}}},function(e,t,n){\"use strict\";var r=n(2),i=function(){function e(e){this.type=r.Syntax.ArrayExpression,this.elements=e}return e}();t.ArrayExpression=i;var o=function(){function e(e){this.type=r.Syntax.ArrayPattern,this.elements=e}return e}();t.ArrayPattern=o;var s=function(){function e(e,t,n){this.type=r.Syntax.ArrowFunctionExpression,this.id=null,this.params=e,this.body=t,this.generator=!1,this.expression=n}return e}();t.ArrowFunctionExpression=s;var a=function(){function e(e,t,n){this.type=r.Syntax.AssignmentExpression,this.operator=e,this.left=t,this.right=n}return e}();t.AssignmentExpression=a;var u=function(){function e(e,t){this.type=r.Syntax.AssignmentPattern,this.left=e,this.right=t}return e}();t.AssignmentPattern=u;var c=function(){function e(e,t,n){var i=\"||\"===e||\"&&\"===e;this.type=i?r.Syntax.LogicalExpression:r.Syntax.BinaryExpression,this.operator=e,this.left=t,this.right=n}return e}();t.BinaryExpression=c;var l=function(){function e(e){this.type=r.Syntax.BlockStatement,this.body=e}return e}();t.BlockStatement=l;var h=function(){function e(e){this.type=r.Syntax.BreakStatement,this.label=e}return e}();t.BreakStatement=h;var p=function(){function e(e,t){this.type=r.Syntax.CallExpression,this.callee=e,this.arguments=t}return e}();t.CallExpression=p;var f=function(){function e(e,t){this.type=r.Syntax.CatchClause,this.param=e,this.body=t}return e}();t.CatchClause=f;var d=function(){function e(e){this.type=r.Syntax.ClassBody,this.body=e}return e}();t.ClassBody=d;var m=function(){function e(e,t,n){this.type=r.Syntax.ClassDeclaration,this.id=e,this.superClass=t,this.body=n}return e}();t.ClassDeclaration=m;var g=function(){function e(e,t,n){this.type=r.Syntax.ClassExpression,this.id=e,this.superClass=t,this.body=n}return e}();t.ClassExpression=g;var x=function(){function e(e,t){this.type=r.Syntax.MemberExpression,this.computed=!0,this.object=e,this.property=t}return e}();t.ComputedMemberExpression=x;var y=function(){function e(e,t,n){this.type=r.Syntax.ConditionalExpression,this.test=e,this.consequent=t,this.alternate=n}return e}();t.ConditionalExpression=y;var v=function(){function e(e){this.type=r.Syntax.ContinueStatement,this.label=e}return e}();t.ContinueStatement=v;var b=function(){function e(){this.type=r.Syntax.DebuggerStatement}return e}();t.DebuggerStatement=b;var D=function(){function e(e,t){this.type=r.Syntax.ExpressionStatement,this.expression=e,this.directive=t}return e}();t.Directive=D;var w=function(){function e(e,t){this.type=r.Syntax.DoWhileStatement,this.body=e,this.test=t}return e}();t.DoWhileStatement=w;var E=function(){function e(){this.type=r.Syntax.EmptyStatement}return e}();t.EmptyStatement=E;var k=function(){function e(e){this.type=r.Syntax.ExportAllDeclaration,this.source=e}return e}();t.ExportAllDeclaration=k;var A=function(){function e(e){this.type=r.Syntax.ExportDefaultDeclaration,this.declaration=e}return e}();t.ExportDefaultDeclaration=A;var C=function(){function e(e,t,n){this.type=r.Syntax.ExportNamedDeclaration,this.declaration=e,this.specifiers=t,this.source=n}return e}();t.ExportNamedDeclaration=C;var S=function(){function e(e,t){this.type=r.Syntax.ExportSpecifier,this.exported=t,this.local=e}return e}();t.ExportSpecifier=S;var F=function(){function e(e){this.type=r.Syntax.ExpressionStatement,this.expression=e}return e}();t.ExpressionStatement=F;var T=function(){function e(e,t,n){this.type=r.Syntax.ForInStatement,this.left=e,this.right=t,this.body=n,this.each=!1}return e}();t.ForInStatement=T;var B=function(){function e(e,t,n){this.type=r.Syntax.ForOfStatement,this.left=e,this.right=t,this.body=n}return e}();t.ForOfStatement=B;var N=function(){function e(e,t,n,i){this.type=r.Syntax.ForStatement,this.init=e,this.test=t,this.update=n,this.body=i}return e}();t.ForStatement=N;var I=function(){function e(e,t,n,i){this.type=r.Syntax.FunctionDeclaration,this.id=e,this.params=t,this.body=n,this.generator=i,this.expression=!1}return e}();t.FunctionDeclaration=I;var P=function(){function e(e,t,n,i){this.type=r.Syntax.FunctionExpression,this.id=e,this.params=t,this.body=n,this.generator=i,this.expression=!1}return e}();t.FunctionExpression=P;var M=function(){function e(e){this.type=r.Syntax.Identifier,this.name=e}return e}();t.Identifier=M;var O=function(){function e(e,t,n){this.type=r.Syntax.IfStatement,this.test=e,this.consequent=t,this.alternate=n}return e}();t.IfStatement=O;var _=function(){function e(e,t){this.type=r.Syntax.ImportDeclaration,this.specifiers=e,this.source=t}return e}();t.ImportDeclaration=_;var L=function(){function e(e){this.type=r.Syntax.ImportDefaultSpecifier,this.local=e}return e}();t.ImportDefaultSpecifier=L;var R=function(){function e(e){this.type=r.Syntax.ImportNamespaceSpecifier,this.local=e}return e}();t.ImportNamespaceSpecifier=R;var U=function(){function e(e,t){this.type=r.Syntax.ImportSpecifier,this.local=e,this.imported=t}return e}();t.ImportSpecifier=U;var j=function(){function e(e,t){this.type=r.Syntax.LabeledStatement,this.label=e,this.body=t}return e}();t.LabeledStatement=j;var z=function(){function e(e,t){this.type=r.Syntax.Literal,this.value=e,this.raw=t}return e}();t.Literal=z;var J=function(){function e(e,t){this.type=r.Syntax.MetaProperty,this.meta=e,this.property=t}return e}();t.MetaProperty=J;var X=function(){function e(e,t,n,i,o){this.type=r.Syntax.MethodDefinition,this.key=e,this.computed=t,this.value=n,this.kind=i,this.static=o}return e}();t.MethodDefinition=X;var Y=function(){function e(e,t){this.type=r.Syntax.NewExpression,this.callee=e,this.arguments=t}return e}();t.NewExpression=Y;var K=function(){function e(e){this.type=r.Syntax.ObjectExpression,this.properties=e}return e}();t.ObjectExpression=K;var W=function(){function e(e){this.type=r.Syntax.ObjectPattern,this.properties=e}return e}();t.ObjectPattern=W;var H=function(){function e(e,t){this.type=r.Syntax.Program,this.body=e,this.sourceType=t}return e}();t.Program=H;var q=function(){function e(e,t,n,i,o,s){this.type=r.Syntax.Property,this.key=t,this.computed=n,this.value=i,this.kind=e,this.method=o,this.shorthand=s}return e}();t.Property=q;var G=function(){function e(e,t,n){this.type=r.Syntax.Literal,this.value=e,this.raw=t,this.regex=n}return e}();t.RegexLiteral=G;var V=function(){function e(e){this.type=r.Syntax.RestElement,this.argument=e}return e}();t.RestElement=V;var $=function(){function e(e){this.type=r.Syntax.ReturnStatement,this.argument=e}return e}();t.ReturnStatement=$;var Z=function(){function e(e){this.type=r.Syntax.SequenceExpression,this.expressions=e}return e}();t.SequenceExpression=Z;var Q=function(){function e(e){this.type=r.Syntax.SpreadElement,this.argument=e}return e}();t.SpreadElement=Q;var ee=function(){function e(e,t){this.type=r.Syntax.MemberExpression,this.computed=!1,this.object=e,this.property=t}return e}();t.StaticMemberExpression=ee;var te=function(){function e(){this.type=r.Syntax.Super}return e}();t.Super=te;var ne=function(){function e(e,t){this.type=r.Syntax.SwitchCase,this.test=e,this.consequent=t}return e}();t.SwitchCase=ne;var re=function(){function e(e,t){this.type=r.Syntax.SwitchStatement,this.discriminant=e,this.cases=t}return e}();t.SwitchStatement=re;var ie=function(){function e(e,t){this.type=r.Syntax.TaggedTemplateExpression,this.tag=e,this.quasi=t}return e}();t.TaggedTemplateExpression=ie;var oe=function(){function e(e,t){this.type=r.Syntax.TemplateElement,this.value=e,this.tail=t}return e}();t.TemplateElement=oe;var se=function(){function e(e,t){this.type=r.Syntax.TemplateLiteral,this.quasis=e,this.expressions=t}return e}();t.TemplateLiteral=se;var ae=function(){function e(){this.type=r.Syntax.ThisExpression}return e}();t.ThisExpression=ae;var ue=function(){function e(e){this.type=r.Syntax.ThrowStatement,this.argument=e}return e}();t.ThrowStatement=ue;var ce=function(){function e(e,t,n){this.type=r.Syntax.TryStatement,this.block=e,this.handler=t,this.finalizer=n}return e}();t.TryStatement=ce;var le=function(){function e(e,t){this.type=r.Syntax.UnaryExpression,this.operator=e,this.argument=t,this.prefix=!0}return e}();t.UnaryExpression=le;var he=function(){function e(e,t,n){this.type=r.Syntax.UpdateExpression,this.operator=e,this.argument=t,this.prefix=n}return e}();t.UpdateExpression=he;var pe=function(){function e(e,t){this.type=r.Syntax.VariableDeclaration,this.declarations=e,this.kind=t}return e}();t.VariableDeclaration=pe;var fe=function(){function e(e,t){this.type=r.Syntax.VariableDeclarator,this.id=e,this.init=t}return e}();t.VariableDeclarator=fe;var de=function(){function e(e,t){this.type=r.Syntax.WhileStatement,this.test=e,this.body=t}return e}();t.WhileStatement=de;var me=function(){function e(e,t){this.type=r.Syntax.WithStatement,this.object=e,this.body=t}return e}();t.WithStatement=me;var ge=function(){function e(e,t){this.type=r.Syntax.YieldExpression,this.argument=e,this.delegate=t}return e}();t.YieldExpression=ge},function(e,t,n){\"use strict\";function r(e){var t;switch(e.type){case l.JSXSyntax.JSXIdentifier:var n=e;t=n.name;break;case l.JSXSyntax.JSXNamespacedName:var i=e;t=r(i.namespace)+\":\"+r(i.name);break;case l.JSXSyntax.JSXMemberExpression:var o=e;t=r(o.object)+\".\"+r(o.property)}return t}var i,o=this&&this.__extends||function(e,t){function n(){this.constructor=e}for(var r in t)t.hasOwnProperty(r)&&(e[r]=t[r]);e.prototype=null===t?Object.create(t):(n.prototype=t.prototype,new n)},s=n(9),a=n(7),u=n(3),c=n(12),l=n(13),h=n(10),p=n(14);!function(e){e[e.Identifier=100]=\"Identifier\",e[e.Text=101]=\"Text\"}(i||(i={})),a.TokenName[i.Identifier]=\"JSXIdentifier\",a.TokenName[i.Text]=\"JSXText\";var f=function(e){function t(t,n,r){e.call(this,t,n,r)}return o(t,e),t.prototype.parsePrimaryExpression=function(){return this.match(\"<\")?this.parseJSXRoot():e.prototype.parsePrimaryExpression.call(this)},t.prototype.startJSX=function(){this.scanner.index=this.startMarker.index,this.scanner.lineNumber=this.startMarker.lineNumber,this.scanner.lineStart=this.startMarker.lineStart},t.prototype.finishJSX=function(){this.nextToken()},t.prototype.reenterJSX=function(){this.startJSX(),this.expectJSX(\"}\"),this.config.tokens&&this.tokens.pop()},t.prototype.createJSXNode=function(){return this.collectComments(),{index:this.scanner.index,line:this.scanner.lineNumber,column:this.scanner.index-this.scanner.lineStart}},t.prototype.createJSXChildNode=function(){return{index:this.scanner.index,line:this.scanner.lineNumber,column:this.scanner.index-this.scanner.lineStart}},t.prototype.scanXHTMLEntity=function(e){for(var t=\"&\",n=!0,r=!1,i=!1,o=!1;!this.scanner.eof()&&n&&!r;){var a=this.scanner.source[this.scanner.index];if(a===e)break;if(r=\";\"===a,t+=a,++this.scanner.index,!r)switch(t.length){case 2:i=\"#\"===a;break;case 3:i&&(o=\"x\"===a,n=o||s.Character.isDecimalDigit(a.charCodeAt(0)),i=i&&!o);break;default:n=n&&!(i&&!s.Character.isDecimalDigit(a.charCodeAt(0))),n=n&&!(o&&!s.Character.isHexDigit(a.charCodeAt(0)))}}if(n&&r&&t.length>2){var u=t.substr(1,t.length-2);i&&u.length>1?t=String.fromCharCode(parseInt(u.substr(1),10)):o&&u.length>2?t=String.fromCharCode(parseInt(\"0\"+u.substr(1),16)):i||o||!c.XHTMLEntities[u]||(t=c.XHTMLEntities[u])}return t},t.prototype.lexJSX=function(){var e=this.scanner.source.charCodeAt(this.scanner.index);if(60===e||62===e||47===e||58===e||61===e||123===e||125===e){var t=this.scanner.source[this.scanner.index++];return{type:a.Token.Punctuator,value:t,lineNumber:this.scanner.lineNumber,lineStart:this.scanner.lineStart,start:this.scanner.index-1,end:this.scanner.index}}if(34===e||39===e){for(var n=this.scanner.index,r=this.scanner.source[this.scanner.index++],o=\"\";!this.scanner.eof();){var u=this.scanner.source[this.scanner.index++];if(u===r)break;o+=\"&\"===u?this.scanXHTMLEntity(r):u}return{type:a.Token.StringLiteral,value:o,lineNumber:this.scanner.lineNumber,lineStart:this.scanner.lineStart,start:n,end:this.scanner.index}}if(46===e){var c=this.scanner.source.charCodeAt(this.scanner.index+1),l=this.scanner.source.charCodeAt(this.scanner.index+2),t=46===c&&46===l?\"...\":\".\",n=this.scanner.index;return this.scanner.index+=t.length,{type:a.Token.Punctuator,value:t,lineNumber:this.scanner.lineNumber,lineStart:this.scanner.lineStart,start:n,end:this.scanner.index}}if(96===e)return{type:a.Token.Template,lineNumber:this.scanner.lineNumber,lineStart:this.scanner.lineStart,start:this.scanner.index,end:this.scanner.index};if(s.Character.isIdentifierStart(e)&&92!==e){var n=this.scanner.index;for(++this.scanner.index;!this.scanner.eof();){var u=this.scanner.source.charCodeAt(this.scanner.index);if(s.Character.isIdentifierPart(u)&&92!==u)++this.scanner.index;else{if(45!==u)break;++this.scanner.index}}var h=this.scanner.source.slice(n,this.scanner.index);return{type:i.Identifier,value:h,lineNumber:this.scanner.lineNumber,lineStart:this.scanner.lineStart,start:n,end:this.scanner.index}}this.scanner.throwUnexpectedToken()},t.prototype.nextJSXToken=function(){this.collectComments(),this.startMarker.index=this.scanner.index,this.startMarker.lineNumber=this.scanner.lineNumber,this.startMarker.lineStart=this.scanner.lineStart;var e=this.lexJSX();return this.lastMarker.index=this.scanner.index,this.lastMarker.lineNumber=this.scanner.lineNumber,this.lastMarker.lineStart=this.scanner.lineStart,this.config.tokens&&this.tokens.push(this.convertToken(e)),e},t.prototype.nextJSXText=function(){this.startMarker.index=this.scanner.index,this.startMarker.lineNumber=this.scanner.lineNumber,this.startMarker.lineStart=this.scanner.lineStart;for(var e=this.scanner.index,t=\"\";!this.scanner.eof();){var n=this.scanner.source[this.scanner.index];if(\"{\"===n||\"<\"===n)break;++this.scanner.index,t+=n,s.Character.isLineTerminator(n.charCodeAt(0))&&(++this.scanner.lineNumber,\"\\r\"===n&&\"\\n\"===this.scanner.source[this.scanner.index]&&++this.scanner.index,this.scanner.lineStart=this.scanner.index)}this.lastMarker.index=this.scanner.index,this.lastMarker.lineNumber=this.scanner.lineNumber,this.lastMarker.lineStart=this.scanner.lineStart;var r={type:i.Text,value:t,lineNumber:this.scanner.lineNumber,lineStart:this.scanner.lineStart,start:e,end:this.scanner.index};return t.length>0&&this.config.tokens&&this.tokens.push(this.convertToken(r)),r},t.prototype.peekJSXToken=function(){var e=this.scanner.index,t=this.scanner.lineNumber,n=this.scanner.lineStart;this.scanner.scanComments();var r=this.lexJSX();return this.scanner.index=e,this.scanner.lineNumber=t,this.scanner.lineStart=n,r},t.prototype.expectJSX=function(e){var t=this.nextJSXToken();t.type===a.Token.Punctuator&&t.value===e||this.throwUnexpectedToken(t)},t.prototype.matchJSX=function(e){var t=this.peekJSXToken();return t.type===a.Token.Punctuator&&t.value===e},t.prototype.parseJSXIdentifier=function(){var e=this.createJSXNode(),t=this.nextJSXToken();return t.type!==i.Identifier&&this.throwUnexpectedToken(t),this.finalize(e,new p.JSXIdentifier(t.value))},t.prototype.parseJSXElementName=function(){var e=this.createJSXNode(),t=this.parseJSXIdentifier();if(this.matchJSX(\":\")){var n=t;this.expectJSX(\":\");var r=this.parseJSXIdentifier();t=this.finalize(e,new p.JSXNamespacedName(n,r))}else if(this.matchJSX(\".\"))for(;this.matchJSX(\".\");){var i=t;this.expectJSX(\".\");var o=this.parseJSXIdentifier();t=this.finalize(e,new p.JSXMemberExpression(i,o))}return t},t.prototype.parseJSXAttributeName=function(){var e,t=this.createJSXNode(),n=this.parseJSXIdentifier();if(this.matchJSX(\":\")){var r=n;this.expectJSX(\":\");var i=this.parseJSXIdentifier();e=this.finalize(t,new p.JSXNamespacedName(r,i))}else e=n;return e},t.prototype.parseJSXStringLiteralAttribute=function(){var e=this.createJSXNode(),t=this.nextJSXToken();t.type!==a.Token.StringLiteral&&this.throwUnexpectedToken(t);var n=this.getTokenRaw(t);return this.finalize(e,new h.Literal(t.value,n))},t.prototype.parseJSXExpressionAttribute=function(){var e=this.createJSXNode();this.expectJSX(\"{\"),this.finishJSX(),this.match(\"}\")&&this.tolerateError(\"JSX attributes must only be assigned a non-empty expression\");var t=this.parseAssignmentExpression();return this.reenterJSX(),this.finalize(e,new p.JSXExpressionContainer(t))},t.prototype.parseJSXAttributeValue=function(){return this.matchJSX(\"{\")?this.parseJSXExpressionAttribute():this.matchJSX(\"<\")?this.parseJSXElement():this.parseJSXStringLiteralAttribute()},t.prototype.parseJSXNameValueAttribute=function(){var e=this.createJSXNode(),t=this.parseJSXAttributeName(),n=null;return this.matchJSX(\"=\")&&(this.expectJSX(\"=\"),n=this.parseJSXAttributeValue()),this.finalize(e,new p.JSXAttribute(t,n))},t.prototype.parseJSXSpreadAttribute=function(){var e=this.createJSXNode();this.expectJSX(\"{\"),this.expectJSX(\"...\"),this.finishJSX();var t=this.parseAssignmentExpression();return this.reenterJSX(),this.finalize(e,new p.JSXSpreadAttribute(t))},t.prototype.parseJSXAttributes=function(){for(var e=[];!this.matchJSX(\"/\")&&!this.matchJSX(\">\");){var t=this.matchJSX(\"{\")?this.parseJSXSpreadAttribute():this.parseJSXNameValueAttribute();e.push(t)}return e},t.prototype.parseJSXOpeningElement=function(){var e=this.createJSXNode();this.expectJSX(\"<\");var t=this.parseJSXElementName(),n=this.parseJSXAttributes(),r=this.matchJSX(\"/\");return r&&this.expectJSX(\"/\"),this.expectJSX(\">\"),this.finalize(e,new p.JSXOpeningElement(t,r,n))},t.prototype.parseJSXBoundaryElement=function(){var e=this.createJSXNode();if(this.expectJSX(\"<\"),this.matchJSX(\"/\")){this.expectJSX(\"/\");var t=this.parseJSXElementName();return this.expectJSX(\">\"),this.finalize(e,new p.JSXClosingElement(t))}var n=this.parseJSXElementName(),r=this.parseJSXAttributes(),i=this.matchJSX(\"/\");return i&&this.expectJSX(\"/\"),this.expectJSX(\">\"),this.finalize(e,new p.JSXOpeningElement(n,i,r))},t.prototype.parseJSXEmptyExpression=function(){var e=this.createJSXChildNode();return this.collectComments(),this.lastMarker.index=this.scanner.index,this.lastMarker.lineNumber=this.scanner.lineNumber,this.lastMarker.lineStart=this.scanner.lineStart,this.finalize(e,new p.JSXEmptyExpression)},t.prototype.parseJSXExpressionContainer=function(){var e=this.createJSXNode();this.expectJSX(\"{\");var t;return this.matchJSX(\"}\")?(t=this.parseJSXEmptyExpression(),this.expectJSX(\"}\")):(this.finishJSX(),t=this.parseAssignmentExpression(),this.reenterJSX()),this.finalize(e,new p.JSXExpressionContainer(t))},t.prototype.parseJSXChildren=function(){for(var e=[];!this.scanner.eof();){var t=this.createJSXChildNode(),n=this.nextJSXText();if(n.start<n.end){var r=this.getTokenRaw(n),i=this.finalize(t,new p.JSXText(n.value,r));e.push(i)}if(\"{\"!==this.scanner.source[this.scanner.index])break;var o=this.parseJSXExpressionContainer();e.push(o)}return e},t.prototype.parseComplexJSXElement=function(e){for(var t=[];!this.scanner.eof();){e.children=e.children.concat(this.parseJSXChildren());var n=this.createJSXChildNode(),i=this.parseJSXBoundaryElement();if(i.type===l.JSXSyntax.JSXOpeningElement){var o=i;if(o.selfClosing){var s=this.finalize(n,new p.JSXElement(o,[],null));e.children.push(s)}else t.push(e),e={node:n,opening:o,closing:null,children:[]}}if(i.type===l.JSXSyntax.JSXClosingElement){e.closing=i;var a=r(e.opening.name),u=r(e.closing.name);if(a!==u&&this.tolerateError(\"Expected corresponding JSX closing tag for %0\",a),!(t.length>0))break;var s=this.finalize(e.node,new p.JSXElement(e.opening,e.children,e.closing));e=t.pop(),e.children.push(s)}}return e},t.prototype.parseJSXElement=function(){var e=this.createJSXNode(),t=this.parseJSXOpeningElement(),n=[],r=null;if(!t.selfClosing){var i=this.parseComplexJSXElement({node:e,opening:t,closing:r,children:n});n=i.children,r=i.closing}return this.finalize(e,new p.JSXElement(t,n,r))},t.prototype.parseJSXRoot=function(){this.config.tokens&&this.tokens.pop(),this.startJSX();var e=this.parseJSXElement();return this.finishJSX(),e},t}(u.Parser);t.JSXParser=f},function(e,t){\"use strict\";t.XHTMLEntities={quot:'\"',amp:\"&\",apos:\"'\",gt:\">\",nbsp:\" \",iexcl:\"¡\",cent:\"¢\",pound:\"£\",curren:\"¤\",yen:\"¥\",brvbar:\"¦\",sect:\"§\",uml:\"¨\",copy:\"©\",ordf:\"ª\",laquo:\"«\",not:\"¬\",shy:\"­\",reg:\"®\",macr:\"¯\",deg:\"°\",plusmn:\"±\",sup2:\"²\",sup3:\"³\",acute:\"´\",micro:\"µ\",para:\"¶\",middot:\"·\",cedil:\"¸\",sup1:\"¹\",ordm:\"º\",raquo:\"»\",frac14:\"¼\",frac12:\"½\",frac34:\"¾\",iquest:\"¿\",Agrave:\"À\",Aacute:\"Á\",Acirc:\"Â\",Atilde:\"Ã\",Auml:\"Ä\",Aring:\"Å\",AElig:\"Æ\",Ccedil:\"Ç\",Egrave:\"È\",Eacute:\"É\",Ecirc:\"Ê\",Euml:\"Ë\",Igrave:\"Ì\",Iacute:\"Í\",Icirc:\"Î\",Iuml:\"Ï\",ETH:\"Ð\",Ntilde:\"Ñ\",Ograve:\"Ò\",Oacute:\"Ó\",Ocirc:\"Ô\",Otilde:\"Õ\",Ouml:\"Ö\",times:\"×\",Oslash:\"Ø\",Ugrave:\"Ù\",Uacute:\"Ú\",Ucirc:\"Û\",Uuml:\"Ü\",Yacute:\"Ý\",THORN:\"Þ\",szlig:\"ß\",agrave:\"à\",aacute:\"á\",acirc:\"â\",atilde:\"ã\",auml:\"ä\",aring:\"å\",aelig:\"æ\",ccedil:\"ç\",egrave:\"è\",eacute:\"é\",ecirc:\"ê\",euml:\"ë\",igrave:\"ì\",iacute:\"í\",icirc:\"î\",iuml:\"ï\",eth:\"ð\",ntilde:\"ñ\",ograve:\"ò\",oacute:\"ó\",ocirc:\"ô\",otilde:\"õ\",ouml:\"ö\",divide:\"÷\",oslash:\"ø\",ugrave:\"ù\",uacute:\"ú\",ucirc:\"û\",uuml:\"ü\",yacute:\"ý\",thorn:\"þ\",yuml:\"ÿ\",OElig:\"Œ\",oelig:\"œ\",Scaron:\"Š\",scaron:\"š\",Yuml:\"Ÿ\",fnof:\"ƒ\",circ:\"ˆ\",tilde:\"˜\",Alpha:\"Α\",Beta:\"Β\",Gamma:\"Γ\",Delta:\"Δ\",Epsilon:\"Ε\",Zeta:\"Ζ\",Eta:\"Η\",Theta:\"Θ\",Iota:\"Ι\",Kappa:\"Κ\",Lambda:\"Λ\",Mu:\"Μ\",Nu:\"Ν\",Xi:\"Ξ\",Omicron:\"Ο\",Pi:\"Π\",Rho:\"Ρ\",Sigma:\"Σ\",Tau:\"Τ\",Upsilon:\"Υ\",Phi:\"Φ\",Chi:\"Χ\",Psi:\"Ψ\",Omega:\"Ω\",alpha:\"α\",beta:\"β\",gamma:\"γ\",delta:\"δ\",epsilon:\"ε\",zeta:\"ζ\",eta:\"η\",theta:\"θ\",iota:\"ι\",kappa:\"κ\",lambda:\"λ\",mu:\"μ\",nu:\"ν\",xi:\"ξ\",omicron:\"ο\",pi:\"π\",rho:\"ρ\",sigmaf:\"ς\",sigma:\"σ\",tau:\"τ\",upsilon:\"υ\",phi:\"φ\",chi:\"χ\",psi:\"ψ\",omega:\"ω\",thetasym:\"ϑ\",upsih:\"ϒ\",piv:\"ϖ\",ensp:\" \",emsp:\" \",thinsp:\" \",zwnj:\"‌\",zwj:\"‍\",lrm:\"‎\",rlm:\"‏\",ndash:\"–\",mdash:\"—\",lsquo:\"‘\",rsquo:\"’\",sbquo:\"‚\",ldquo:\"“\",rdquo:\"”\",bdquo:\"„\",dagger:\"†\",Dagger:\"‡\",bull:\"•\",hellip:\"…\",permil:\"‰\",prime:\"′\",Prime:\"″\",lsaquo:\"‹\",rsaquo:\"›\",oline:\"‾\",frasl:\"⁄\",euro:\"€\",image:\"ℑ\",weierp:\"℘\",real:\"ℜ\",trade:\"™\",alefsym:\"ℵ\",larr:\"←\",uarr:\"↑\",rarr:\"→\",darr:\"↓\",harr:\"↔\",crarr:\"↵\",lArr:\"⇐\",uArr:\"⇑\",rArr:\"⇒\",dArr:\"⇓\",hArr:\"⇔\",forall:\"∀\",part:\"∂\",exist:\"∃\",empty:\"∅\",nabla:\"∇\",isin:\"∈\",notin:\"∉\",ni:\"∋\",prod:\"∏\",sum:\"∑\",minus:\"−\",lowast:\"∗\",radic:\"√\",prop:\"∝\",infin:\"∞\",ang:\"∠\",and:\"∧\",or:\"∨\",cap:\"∩\",cup:\"∪\",int:\"∫\",there4:\"∴\",sim:\"∼\",cong:\"≅\",asymp:\"≈\",ne:\"≠\",equiv:\"≡\",le:\"≤\",ge:\"≥\",sub:\"⊂\",sup:\"⊃\",nsub:\"⊄\",sube:\"⊆\",supe:\"⊇\",oplus:\"⊕\",otimes:\"⊗\",perp:\"⊥\",sdot:\"⋅\",lceil:\"⌈\",rceil:\"⌉\",lfloor:\"⌊\",rfloor:\"⌋\",loz:\"◊\",spades:\"♠\",clubs:\"♣\",hearts:\"♥\",diams:\"♦\",lang:\"⟨\",rang:\"⟩\"}},function(e,t){\"use strict\";t.JSXSyntax={JSXAttribute:\"JSXAttribute\",JSXClosingElement:\"JSXClosingElement\",JSXElement:\"JSXElement\",JSXEmptyExpression:\"JSXEmptyExpression\",JSXExpressionContainer:\"JSXExpressionContainer\",JSXIdentifier:\"JSXIdentifier\",JSXMemberExpression:\"JSXMemberExpression\",JSXNamespacedName:\"JSXNamespacedName\",JSXOpeningElement:\"JSXOpeningElement\",JSXSpreadAttribute:\"JSXSpreadAttribute\",JSXText:\"JSXText\"}},function(e,t,n){\"use strict\";var r=n(13),i=function(){function e(e){this.type=r.JSXSyntax.JSXClosingElement,this.name=e}return e}();t.JSXClosingElement=i;var o=function(){function e(e,t,n){this.type=r.JSXSyntax.JSXElement,this.openingElement=e,this.children=t,this.closingElement=n}return e}();t.JSXElement=o;var s=function(){function e(){this.type=r.JSXSyntax.JSXEmptyExpression}return e}();t.JSXEmptyExpression=s;var a=function(){function e(e){this.type=r.JSXSyntax.JSXExpressionContainer,this.expression=e}return e}();t.JSXExpressionContainer=a;var u=function(){function e(e){this.type=r.JSXSyntax.JSXIdentifier,this.name=e}return e}();t.JSXIdentifier=u;var c=function(){function e(e,t){this.type=r.JSXSyntax.JSXMemberExpression,this.object=e,this.property=t}return e}();t.JSXMemberExpression=c;var l=function(){function e(e,t){this.type=r.JSXSyntax.JSXAttribute,this.name=e,this.value=t}return e}();t.JSXAttribute=l;var h=function(){function e(e,t){this.type=r.JSXSyntax.JSXNamespacedName,this.namespace=e,this.name=t}return e}();t.JSXNamespacedName=h;var p=function(){function e(e,t,n){this.type=r.JSXSyntax.JSXOpeningElement,this.name=e,this.selfClosing=t,this.attributes=n}return e}();t.JSXOpeningElement=p;var f=function(){function e(e){this.type=r.JSXSyntax.JSXSpreadAttribute,this.argument=e}return e}();t.JSXSpreadAttribute=f;var d=function(){function e(e,t){this.type=r.JSXSyntax.JSXText,this.value=e,this.raw=t}return e}();t.JSXText=d},function(e,t,n){\"use strict\";var r=n(8),i=n(6),o=n(7),s=function(){function e(){this.values=[],this.curly=this.paren=-1}return e.prototype.beforeFunctionExpression=function(e){return[\"(\",\"{\",\"[\",\"in\",\"typeof\",\"instanceof\",\"new\",\"return\",\"case\",\"delete\",\"throw\",\"void\",\"=\",\"+=\",\"-=\",\"*=\",\"**=\",\"/=\",\"%=\",\"<<=\",\">>=\",\">>>=\",\"&=\",\"|=\",\"^=\",\",\",\"+\",\"-\",\"*\",\"**\",\"/\",\"%\",\"++\",\"--\",\"<<\",\">>\",\">>>\",\"&\",\"|\",\"^\",\"!\",\"~\",\"&&\",\"||\",\"?\",\":\",\"===\",\"==\",\">=\",\"<=\",\"<\",\">\",\"!=\",\"!==\"].indexOf(e)>=0},e.prototype.isRegexStart=function(){var e=this.values[this.values.length-1],t=null!==e;switch(e){case\"this\":case\"]\":t=!1;break;case\")\":var n=this.values[this.paren-1];t=\"if\"===n||\"while\"===n||\"for\"===n||\"with\"===n;break;case\"}\":if(t=!1,\"function\"===this.values[this.curly-3]){var r=this.values[this.curly-4];t=!!r&&!this.beforeFunctionExpression(r)}else if(\"function\"===this.values[this.curly-4]){var i=this.values[this.curly-5];t=!i||!this.beforeFunctionExpression(i)}}return t},e.prototype.push=function(e){e.type===o.Token.Punctuator||e.type===o.Token.Keyword?(\"{\"===e.value?this.curly=this.values.length:\"(\"===e.value&&(this.paren=this.values.length),this.values.push(e.value)):this.values.push(null)},e}(),a=function(){function e(e,t){this.errorHandler=new i.ErrorHandler,this.errorHandler.tolerant=!!t&&(\"boolean\"==typeof t.tolerant&&t.tolerant),this.scanner=new r.Scanner(e,this.errorHandler),this.scanner.trackComment=!!t&&(\"boolean\"==typeof t.comment&&t.comment),this.trackRange=!!t&&(\"boolean\"==typeof t.range&&t.range),this.trackLoc=!!t&&(\"boolean\"==typeof t.loc&&t.loc),this.buffer=[],this.reader=new s}return e.prototype.errors=function(){return this.errorHandler.errors},e.prototype.getNextToken=function(){if(0===this.buffer.length){var e=this.scanner.scanComments();if(this.scanner.trackComment)for(var t=0;t<e.length;++t){var n=e[t],r=void 0,i=this.scanner.source.slice(n.slice[0],n.slice[1]);r={type:n.multiLine?\"BlockComment\":\"LineComment\",value:i},this.trackRange&&(r.range=n.range),this.trackLoc&&(r.loc=n.loc),this.buffer.push(r)}if(!this.scanner.eof()){var s=void 0;this.trackLoc&&(s={start:{line:this.scanner.lineNumber,column:this.scanner.index-this.scanner.lineStart},end:{}});var a=void 0;a=\"/\"===this.scanner.source[this.scanner.index]?this.reader.isRegexStart()?this.scanner.scanRegExp():this.scanner.scanPunctuator():this.scanner.lex(),this.reader.push(a);var u=void 0;u={type:o.TokenName[a.type],value:this.scanner.source.slice(a.start,a.end)},this.trackRange&&(u.range=[a.start,a.end]),this.trackLoc&&(s.end={line:this.scanner.lineNumber,column:this.scanner.index-this.scanner.lineStart},u.loc=s),a.regex&&(u.regex=a.regex),this.buffer.push(u)}}return this.buffer.shift()},e}();t.Tokenizer=a}])})},function(e,t,n){\"use strict\";function r(e,t){var n,r,i,o,s,a,u;if(null===t)return{};for(n={},r=Object.keys(t),i=0,o=r.length;i<o;i+=1)s=r[i],a=String(t[s]),\"!!\"===s.slice(0,2)&&(s=\"tag:yaml.org,2002:\"+s.slice(2)),u=e.compiledTypeMap.fallback[s],u&&O.call(u.styleAliases,a)&&(a=u.styleAliases[a]),n[s]=a;return n}function i(e){var t,n,r;if(t=e.toString(16).toUpperCase(),e<=255)n=\"x\",r=2;else if(e<=65535)n=\"u\",r=4;else{if(!(e<=4294967295))throw new N(\"code point within a string may not be greater than 0xFFFFFFFF\");n=\"U\",r=8}return\"\\\\\"+n+B.repeat(\"0\",r-t.length)+t}function o(e){this.schema=e.schema||I,this.indent=Math.max(1,e.indent||2),this.skipInvalid=e.skipInvalid||!1,this.flowLevel=B.isNothing(e.flowLevel)?-1:e.flowLevel,this.styleMap=r(this.schema,e.styles||null),this.sortKeys=e.sortKeys||!1,this.lineWidth=e.lineWidth||80,this.noRefs=e.noRefs||!1,this.noCompatMode=e.noCompatMode||!1,this.implicitTypes=this.schema.compiledImplicit,this.explicitTypes=this.schema.compiledExplicit,this.tag=null,this.result=\"\",this.duplicates=[],this.usedDuplicates=null}function s(e,t){for(var n,r=B.repeat(\" \",t),i=0,o=-1,s=\"\",a=e.length;i<a;)o=e.indexOf(\"\\n\",i),o===-1?(n=e.slice(i),i=a):(n=e.slice(i,o+1),i=o+1),n.length&&\"\\n\"!==n&&(s+=r),s+=n;return s}function a(e,t){return\"\\n\"+B.repeat(\" \",e.indent*t)}function u(e,t){var n,r,i;for(n=0,r=e.implicitTypes.length;n<r;n+=1)if(i=e.implicitTypes[n],i.resolve(t))return!0;return!1}function c(e){return e===R||e===_}function l(e){return 32<=e&&e<=126||161<=e&&e<=55295&&8232!==e&&8233!==e||57344<=e&&e<=65533&&65279!==e||65536<=e&&e<=1114111}function h(e){return l(e)&&65279!==e&&e!==W&&e!==Z&&e!==Q&&e!==te&&e!==re&&e!==q&&e!==z}function p(e){return l(e)&&65279!==e&&!c(e)&&e!==H&&e!==V&&e!==q&&e!==W&&e!==Z&&e!==Q&&e!==te&&e!==re&&e!==z&&e!==X&&e!==K&&e!==U&&e!==ne&&e!==G&&e!==Y&&e!==j&&e!==J&&e!==$&&e!==ee}function f(e,t,n,r,i){var o,s,a=!1,u=!1,f=r!==-1,d=-1,m=p(e.charCodeAt(0))&&!c(e.charCodeAt(e.length-1));if(t)for(o=0;o<e.length;o++){if(s=e.charCodeAt(o),!l(s))return le;m=m&&h(s)}else{for(o=0;o<e.length;o++){if(s=e.charCodeAt(o),s===L)a=!0,f&&(u=u||o-d-1>r&&\" \"!==e[d+1],d=o);else if(!l(s))return le;m=m&&h(s)}u=u||f&&o-d-1>r&&\" \"!==e[d+1]}return a||u?\" \"===e[0]&&n>9?le:u?ce:ue:m&&!i(e)?se:ae}function d(e,t,n,r){e.dump=function(){function i(t){return u(e,t)}if(0===t.length)return\"''\";if(!e.noCompatMode&&oe.indexOf(t)!==-1)return\"'\"+t+\"'\";var o=e.indent*Math.max(1,n),a=e.lineWidth===-1?-1:Math.max(Math.min(e.lineWidth,40),e.lineWidth-o),c=r||e.flowLevel>-1&&n>=e.flowLevel;switch(f(t,c,e.indent,a,i)){case se:return t;case ae:return\"'\"+t.replace(/'/g,\"''\")+\"'\";case ue:return\"|\"+m(t,e.indent)+g(s(t,o));case ce:return\">\"+m(t,e.indent)+g(s(x(t,a),o));case le:return'\"'+v(t,a)+'\"';default:throw new N(\"impossible error: invalid scalar style\")}}()}function m(e,t){var n=\" \"===e[0]?String(t):\"\",r=\"\\n\"===e[e.length-1],i=r&&(\"\\n\"===e[e.length-2]||\"\\n\"===e),o=i?\"+\":r?\"\":\"-\";return n+o+\"\\n\"}function g(e){return\"\\n\"===e[e.length-1]?e.slice(0,-1):e}function x(e,t){for(var n,r,i=/(\\n+)([^\\n]*)/g,o=function(){var n=e.indexOf(\"\\n\");return n=n!==-1?n:e.length,i.lastIndex=n,y(e.slice(0,n),t)}(),s=\"\\n\"===e[0]||\" \"===e[0];r=i.exec(e);){var a=r[1],u=r[2];n=\" \"===u[0],o+=a+(s||n||\"\"===u?\"\":\"\\n\")+y(u,t),s=n}return o}function y(e,t){if(\"\"===e||\" \"===e[0])return e;for(var n,r,i=/ [^ ]/g,o=0,s=0,a=0,u=\"\";n=i.exec(e);)a=n.index,a-o>t&&(r=s>o?s:a,u+=\"\\n\"+e.slice(o,r),o=r+1),s=a;return u+=\"\\n\",u+=e.length-o>t&&s>o?e.slice(o,s)+\"\\n\"+e.slice(s+1):e.slice(o),u.slice(1)}function v(e){for(var t,n,r=\"\",o=0;o<e.length;o++)t=e.charCodeAt(o),n=ie[t],r+=!n&&l(t)?e[o]:n||i(t);return r}function b(e,t,n){var r,i,o=\"\",s=e.tag;for(r=0,i=n.length;r<i;r+=1)A(e,t,n[r],!1,!1)&&(0!==r&&(o+=\", \"),o+=e.dump);e.tag=s,e.dump=\"[\"+o+\"]\"}function D(e,t,n,r){var i,o,s=\"\",u=e.tag;for(i=0,o=n.length;i<o;i+=1)A(e,t+1,n[i],!0,!0)&&(r&&0===i||(s+=a(e,t)),s+=e.dump&&L===e.dump.charCodeAt(0)?\"-\":\"- \",s+=e.dump);e.tag=u,e.dump=s||\"[]\"}function w(e,t,n){var r,i,o,s,a,u=\"\",c=e.tag,l=Object.keys(n);for(r=0,i=l.length;r<i;r+=1)a=\"\",0!==r&&(a+=\", \"),o=l[r],s=n[o],A(e,t,o,!1,!1)&&(e.dump.length>1024&&(a+=\"? \"),a+=e.dump+\": \",A(e,t,s,!1,!1)&&(a+=e.dump,u+=a));e.tag=c,e.dump=\"{\"+u+\"}\"}function E(e,t,n,r){var i,o,s,u,c,l,h=\"\",p=e.tag,f=Object.keys(n);if(e.sortKeys===!0)f.sort();else if(\"function\"==typeof e.sortKeys)f.sort(e.sortKeys);else if(e.sortKeys)throw new N(\"sortKeys must be a boolean or a function\");\nfor(i=0,o=f.length;i<o;i+=1)l=\"\",r&&0===i||(l+=a(e,t)),s=f[i],u=n[s],A(e,t+1,s,!0,!0,!0)&&(c=null!==e.tag&&\"?\"!==e.tag||e.dump&&e.dump.length>1024,c&&(l+=e.dump&&L===e.dump.charCodeAt(0)?\"?\":\"? \"),l+=e.dump,c&&(l+=a(e,t)),A(e,t+1,u,!0,c)&&(l+=e.dump&&L===e.dump.charCodeAt(0)?\":\":\": \",l+=e.dump,h+=l));e.tag=p,e.dump=h||\"{}\"}function k(e,t,n){var r,i,o,s,a,u;for(i=n?e.explicitTypes:e.implicitTypes,o=0,s=i.length;o<s;o+=1)if(a=i[o],(a.instanceOf||a.predicate)&&(!a.instanceOf||\"object\"==typeof t&&t instanceof a.instanceOf)&&(!a.predicate||a.predicate(t))){if(e.tag=n?a.tag:\"?\",a.represent){if(u=e.styleMap[a.tag]||a.defaultStyle,\"[object Function]\"===M.call(a.represent))r=a.represent(t,u);else{if(!O.call(a.represent,u))throw new N(\"!<\"+a.tag+'> tag resolver accepts not \"'+u+'\" style');r=a.represent[u](t,u)}e.dump=r}return!0}return!1}function A(e,t,n,r,i,o){e.tag=null,e.dump=n,k(e,n,!1)||k(e,n,!0);var s=M.call(e.dump);r&&(r=e.flowLevel<0||e.flowLevel>t);var a,u,c=\"[object Object]\"===s||\"[object Array]\"===s;if(c&&(a=e.duplicates.indexOf(n),u=a!==-1),(null!==e.tag&&\"?\"!==e.tag||u||2!==e.indent&&t>0)&&(i=!1),u&&e.usedDuplicates[a])e.dump=\"*ref_\"+a;else{if(c&&u&&!e.usedDuplicates[a]&&(e.usedDuplicates[a]=!0),\"[object Object]\"===s)r&&0!==Object.keys(e.dump).length?(E(e,t,e.dump,i),u&&(e.dump=\"&ref_\"+a+e.dump)):(w(e,t,e.dump),u&&(e.dump=\"&ref_\"+a+\" \"+e.dump));else if(\"[object Array]\"===s)r&&0!==e.dump.length?(D(e,t,e.dump,i),u&&(e.dump=\"&ref_\"+a+e.dump)):(b(e,t,e.dump),u&&(e.dump=\"&ref_\"+a+\" \"+e.dump));else{if(\"[object String]\"!==s){if(e.skipInvalid)return!1;throw new N(\"unacceptable kind of an object to dump \"+s)}\"?\"!==e.tag&&d(e,e.dump,t,o)}null!==e.tag&&\"?\"!==e.tag&&(e.dump=\"!<\"+e.tag+\"> \"+e.dump)}return!0}function C(e,t){var n,r,i=[],o=[];for(S(e,i,o),n=0,r=o.length;n<r;n+=1)t.duplicates.push(i[o[n]]);t.usedDuplicates=new Array(r)}function S(e,t,n){var r,i,o;if(null!==e&&\"object\"==typeof e)if(i=t.indexOf(e),i!==-1)n.indexOf(i)===-1&&n.push(i);else if(t.push(e),Array.isArray(e))for(i=0,o=e.length;i<o;i+=1)S(e[i],t,n);else for(r=Object.keys(e),i=0,o=r.length;i<o;i+=1)S(e[r[i]],t,n)}function F(e,t){t=t||{};var n=new o(t);return n.noRefs||C(e,n),A(n,0,e,!0,!0)?n.dump+\"\\n\":\"\"}function T(e,t){return F(e,B.extend({schema:P},t))}var B=n(185),N=n(186),I=n(211),P=n(188),M=Object.prototype.toString,O=Object.prototype.hasOwnProperty,_=9,L=10,R=32,U=33,j=34,z=35,J=37,X=38,Y=39,K=42,W=44,H=45,q=58,G=62,V=63,$=64,Z=91,Q=93,ee=96,te=123,ne=124,re=125,ie={};ie[0]=\"\\\\0\",ie[7]=\"\\\\a\",ie[8]=\"\\\\b\",ie[9]=\"\\\\t\",ie[10]=\"\\\\n\",ie[11]=\"\\\\v\",ie[12]=\"\\\\f\",ie[13]=\"\\\\r\",ie[27]=\"\\\\e\",ie[34]='\\\\\"',ie[92]=\"\\\\\\\\\",ie[133]=\"\\\\N\",ie[160]=\"\\\\_\",ie[8232]=\"\\\\L\",ie[8233]=\"\\\\P\";var oe=[\"y\",\"Y\",\"yes\",\"Yes\",\"YES\",\"on\",\"On\",\"ON\",\"n\",\"N\",\"no\",\"No\",\"NO\",\"off\",\"Off\",\"OFF\"],se=1,ae=2,ue=3,ce=4,le=5;e.exports.dump=F,e.exports.safeDump=T},function(e,t){e.exports='---\\nurl: \"http://petstore.swagger.io/v2/swagger.json\"\\ndom_id: \"#swagger-ui\"\\nvalidatorUrl: \"https://online.swagger.io/validator\"\\noauth2RedirectUrl: \"http://localhost:3200/oauth2-redirect.html\"\\n'}]))});\n//# sourceMappingURL=swagger-ui-standalone-preset.js.map"
  },
  {
    "path": "src/main/resources/static/swagger/swagger-ui.css",
    "content": "@charset \"UTF-8\";.swagger-ui html{box-sizing:border-box}.swagger-ui *,.swagger-ui :after,.swagger-ui :before{box-sizing:inherit}.swagger-ui body{margin:0;background:#fafafa}.swagger-ui .wrapper{width:100%;max-width:1460px;margin:0 auto;padding:0 20px}.swagger-ui .opblock-tag-section{display:-webkit-box;display:-ms-flexbox;display:flex;-webkit-box-orient:vertical;-webkit-box-direction:normal;-ms-flex-direction:column;flex-direction:column}.swagger-ui .opblock-tag{display:-webkit-box;display:-ms-flexbox;display:flex;padding:10px 20px 10px 10px;cursor:pointer;transition:all .2s;border-bottom:1px solid rgba(59,65,81,.3);-webkit-box-align:center;-ms-flex-align:center;align-items:center}.swagger-ui .opblock-tag:hover{background:rgba(0,0,0,.02)}.swagger-ui .opblock-tag{font-size:24px;margin:0 0 5px;font-family:Titillium Web,sans-serif;color:#3b4151}.swagger-ui .opblock-tag.no-desc span{-webkit-box-flex:1;-ms-flex:1;flex:1}.swagger-ui .opblock-tag svg{transition:all .4s}.swagger-ui .opblock-tag small{font-size:14px;font-weight:400;padding:0 10px;-webkit-box-flex:1;-ms-flex:1;flex:1;font-family:Open Sans,sans-serif;color:#3b4151}.swagger-ui .parаmeter__type{font-size:12px;padding:5px 0;font-family:Source Code Pro,monospace;font-weight:600;color:#3b4151}.swagger-ui .view-line-link{position:relative;top:3px;width:20px;margin:0 5px;cursor:pointer;transition:all .5s}.swagger-ui .opblock{margin:0 0 15px;border:1px solid #000;border-radius:4px;box-shadow:0 0 3px rgba(0,0,0,.19)}.swagger-ui .opblock.is-open .opblock-summary{border-bottom:1px solid #000}.swagger-ui .opblock .opblock-section-header{padding:8px 20px;background:hsla(0,0%,100%,.8);box-shadow:0 1px 2px rgba(0,0,0,.1)}.swagger-ui .opblock .opblock-section-header,.swagger-ui .opblock .opblock-section-header label{display:-webkit-box;display:-ms-flexbox;display:flex;-webkit-box-align:center;-ms-flex-align:center;align-items:center}.swagger-ui .opblock .opblock-section-header label{font-size:12px;font-weight:700;margin:0;font-family:Titillium Web,sans-serif;color:#3b4151}.swagger-ui .opblock .opblock-section-header label span{padding:0 10px 0 0}.swagger-ui .opblock .opblock-section-header h4{font-size:14px;margin:0;-webkit-box-flex:1;-ms-flex:1;flex:1;font-family:Titillium Web,sans-serif;color:#3b4151}.swagger-ui .opblock .opblock-summary-method{font-size:14px;font-weight:700;min-width:80px;padding:6px 15px;text-align:center;border-radius:3px;background:#000;text-shadow:0 1px 0 rgba(0,0,0,.1);font-family:Titillium Web,sans-serif;color:#fff}.swagger-ui .opblock .opblock-summary-operation-id,.swagger-ui .opblock .opblock-summary-path,.swagger-ui .opblock .opblock-summary-path__deprecated{font-size:16px;display:-webkit-box;display:-ms-flexbox;display:flex;padding:0 10px;font-family:Source Code Pro,monospace;font-weight:600;color:#3b4151;-webkit-box-align:center;-ms-flex-align:center;align-items:center}.swagger-ui .opblock .opblock-summary-operation-id .view-line-link,.swagger-ui .opblock .opblock-summary-path .view-line-link,.swagger-ui .opblock .opblock-summary-path__deprecated .view-line-link{position:relative;top:2px;width:0;margin:0;cursor:pointer;transition:all .5s}.swagger-ui .opblock .opblock-summary-operation-id:hover .view-line-link,.swagger-ui .opblock .opblock-summary-path:hover .view-line-link,.swagger-ui .opblock .opblock-summary-path__deprecated:hover .view-line-link{width:18px;margin:0 5px}.swagger-ui .opblock .opblock-summary-path__deprecated{text-decoration:line-through}.swagger-ui .opblock .opblock-summary-operation-id{font-size:14px}.swagger-ui .opblock .opblock-summary-description{font-size:13px;-webkit-box-flex:1;-ms-flex:1;flex:1;font-family:Open Sans,sans-serif;color:#3b4151}.swagger-ui .opblock .opblock-summary{display:-webkit-box;display:-ms-flexbox;display:flex;padding:5px;cursor:pointer;-webkit-box-align:center;-ms-flex-align:center;align-items:center}.swagger-ui .opblock.opblock-post{border-color:#49cc90;background:rgba(73,204,144,.1)}.swagger-ui .opblock.opblock-post .opblock-summary-method{background:#49cc90}.swagger-ui .opblock.opblock-post .opblock-summary{border-color:#49cc90}.swagger-ui .opblock.opblock-put{border-color:#fca130;background:rgba(252,161,48,.1)}.swagger-ui .opblock.opblock-put .opblock-summary-method{background:#fca130}.swagger-ui .opblock.opblock-put .opblock-summary{border-color:#fca130}.swagger-ui .opblock.opblock-delete{border-color:#f93e3e;background:rgba(249,62,62,.1)}.swagger-ui .opblock.opblock-delete .opblock-summary-method{background:#f93e3e}.swagger-ui .opblock.opblock-delete .opblock-summary{border-color:#f93e3e}.swagger-ui .opblock.opblock-get{border-color:#61affe;background:rgba(97,175,254,.1)}.swagger-ui .opblock.opblock-get .opblock-summary-method{background:#61affe}.swagger-ui .opblock.opblock-get .opblock-summary{border-color:#61affe}.swagger-ui .opblock.opblock-patch{border-color:#50e3c2;background:rgba(80,227,194,.1)}.swagger-ui .opblock.opblock-patch .opblock-summary-method{background:#50e3c2}.swagger-ui .opblock.opblock-patch .opblock-summary{border-color:#50e3c2}.swagger-ui .opblock.opblock-head{border-color:#9012fe;background:rgba(144,18,254,.1)}.swagger-ui .opblock.opblock-head .opblock-summary-method{background:#9012fe}.swagger-ui .opblock.opblock-head .opblock-summary{border-color:#9012fe}.swagger-ui .opblock.opblock-options{border-color:#0d5aa7;background:rgba(13,90,167,.1)}.swagger-ui .opblock.opblock-options .opblock-summary-method{background:#0d5aa7}.swagger-ui .opblock.opblock-options .opblock-summary{border-color:#0d5aa7}.swagger-ui .opblock.opblock-deprecated{opacity:.6;border-color:#ebebeb;background:hsla(0,0%,92%,.1)}.swagger-ui .opblock.opblock-deprecated .opblock-summary-method{background:#ebebeb}.swagger-ui .opblock.opblock-deprecated .opblock-summary{border-color:#ebebeb}.swagger-ui .opblock .opblock-schemes{padding:8px 20px}.swagger-ui .opblock .opblock-schemes .schemes-title{padding:0 10px 0 0}.swagger-ui .tab{display:-webkit-box;display:-ms-flexbox;display:flex;margin:20px 0 10px;padding:0;list-style:none}.swagger-ui .tab li{font-size:12px;min-width:100px;min-width:90px;padding:0;cursor:pointer;font-family:Titillium Web,sans-serif;color:#3b4151}.swagger-ui .tab li:first-of-type{position:relative;padding-left:0}.swagger-ui .tab li:first-of-type:after{position:absolute;top:0;right:6px;width:1px;height:100%;content:\"\";background:rgba(0,0,0,.2)}.swagger-ui .tab li.active{font-weight:700}.swagger-ui .opblock-description-wrapper,.swagger-ui .opblock-title_normal{padding:15px 20px}.swagger-ui .opblock-description-wrapper,.swagger-ui .opblock-description-wrapper h4,.swagger-ui .opblock-title_normal,.swagger-ui .opblock-title_normal h4{font-size:12px;margin:0 0 5px;font-family:Open Sans,sans-serif;color:#3b4151}.swagger-ui .opblock-description-wrapper p,.swagger-ui .opblock-title_normal p{font-size:14px;margin:0;font-family:Open Sans,sans-serif;color:#3b4151}.swagger-ui .execute-wrapper{padding:20px;text-align:right}.swagger-ui .execute-wrapper .btn{width:100%;padding:8px 40px}.swagger-ui .body-param-options{display:-webkit-box;display:-ms-flexbox;display:flex;-webkit-box-orient:vertical;-webkit-box-direction:normal;-ms-flex-direction:column;flex-direction:column}.swagger-ui .body-param-options .body-param-edit{padding:10px 0}.swagger-ui .body-param-options label{padding:8px 0}.swagger-ui .body-param-options label select{margin:3px 0 0}.swagger-ui .responses-inner{padding:20px}.swagger-ui .responses-inner h4,.swagger-ui .responses-inner h5{font-size:12px;margin:10px 0 5px;font-family:Open Sans,sans-serif;color:#3b4151}.swagger-ui .response-col_status{font-size:14px;font-family:Open Sans,sans-serif;color:#3b4151}.swagger-ui .response-col_status .response-undocumented{font-size:11px;font-family:Source Code Pro,monospace;font-weight:600;color:#999}.swagger-ui .response-col_description__inner span{font-size:12px;font-style:italic;display:block;margin:10px 0;padding:10px;border-radius:4px;background:#41444e;font-family:Source Code Pro,monospace;font-weight:600;color:#fff}.swagger-ui .response-col_description__inner span p{margin:0}.swagger-ui .opblock-body pre{font-size:12px;margin:0;padding:10px;word-wrap:break-word;word-break:break-all;word-break:break-word;-webkit-hyphens:auto;-ms-hyphens:auto;hyphens:auto;white-space:pre-wrap;border-radius:4px;background:#41444e;overflow-wrap:break-word;font-family:Source Code Pro,monospace;font-weight:600;color:#fff}.swagger-ui .opblock-body pre span{color:#fff!important}.swagger-ui .opblock-body pre .headerline{display:block}.swagger-ui .scheme-container{margin:0 0 20px;padding:30px 0;background:#fff;box-shadow:0 1px 2px 0 rgba(0,0,0,.15)}.swagger-ui .scheme-container .schemes{display:-webkit-box;display:-ms-flexbox;display:flex;-webkit-box-align:center;-ms-flex-align:center;align-items:center}.swagger-ui .scheme-container .schemes>label{font-size:12px;font-weight:700;display:-webkit-box;display:-ms-flexbox;display:flex;-webkit-box-orient:vertical;-webkit-box-direction:normal;-ms-flex-direction:column;flex-direction:column;margin:-20px 15px 0 0;font-family:Titillium Web,sans-serif;color:#3b4151}.swagger-ui .scheme-container .schemes>label select{min-width:130px;text-transform:uppercase}.swagger-ui .loading-container{padding:40px 0 60px}.swagger-ui .loading-container .loading{position:relative}.swagger-ui .loading-container .loading:after{font-size:10px;font-weight:700;position:absolute;top:50%;left:50%;content:\"loading\";-webkit-transform:translate(-50%,-50%);transform:translate(-50%,-50%);text-transform:uppercase;font-family:Titillium Web,sans-serif;color:#3b4151}.swagger-ui .loading-container .loading:before{position:absolute;top:50%;left:50%;display:block;width:60px;height:60px;margin:-30px;content:\"\";-webkit-animation:rotation 1s infinite linear,opacity .5s;animation:rotation 1s infinite linear,opacity .5s;opacity:1;border:2px solid rgba(85,85,85,.1);border-top-color:rgba(0,0,0,.6);border-radius:100%;-webkit-backface-visibility:hidden;backface-visibility:hidden}@-webkit-keyframes rotation{to{-webkit-transform:rotate(1turn);transform:rotate(1turn)}}@keyframes rotation{to{-webkit-transform:rotate(1turn);transform:rotate(1turn)}}@-webkit-keyframes blinker{50%{opacity:0}}@keyframes blinker{50%{opacity:0}}.swagger-ui .btn{font-size:14px;font-weight:700;padding:5px 23px;transition:all .3s;border:2px solid #888;border-radius:4px;background:transparent;box-shadow:0 1px 2px rgba(0,0,0,.1);font-family:Titillium Web,sans-serif;color:#3b4151}.swagger-ui .btn[disabled]{cursor:not-allowed;opacity:.3}.swagger-ui .btn:hover{box-shadow:0 0 5px rgba(0,0,0,.3)}.swagger-ui .btn.cancel{border-color:#ff6060;font-family:Titillium Web,sans-serif;color:#ff6060}.swagger-ui .btn.authorize{line-height:1;display:inline;color:#49cc90;border-color:#49cc90}.swagger-ui .btn.authorize span{float:left;padding:4px 20px 0 0}.swagger-ui .btn.authorize svg{fill:#49cc90}.swagger-ui .btn.execute{-webkit-animation:swagger-ui-pulse 2s infinite;animation:swagger-ui-pulse 2s infinite;color:#fff;border-color:#4990e2}@-webkit-keyframes swagger-ui-pulse{0%{color:#fff;background:#4990e2;box-shadow:0 0 0 0 rgba(73,144,226,.8)}70%{box-shadow:0 0 0 5px rgba(73,144,226,0)}to{color:#fff;background:#4990e2;box-shadow:0 0 0 0 rgba(73,144,226,0)}}@keyframes swagger-ui-pulse{0%{color:#fff;background:#4990e2;box-shadow:0 0 0 0 rgba(73,144,226,.8)}70%{box-shadow:0 0 0 5px rgba(73,144,226,0)}to{color:#fff;background:#4990e2;box-shadow:0 0 0 0 rgba(73,144,226,0)}}.swagger-ui .btn-group{display:-webkit-box;display:-ms-flexbox;display:flex;padding:30px}.swagger-ui .btn-group .btn{-webkit-box-flex:1;-ms-flex:1;flex:1}.swagger-ui .btn-group .btn:first-child{border-radius:4px 0 0 4px}.swagger-ui .btn-group .btn:last-child{border-radius:0 4px 4px 0}.swagger-ui .authorization__btn{padding:0 10px;border:none;background:none}.swagger-ui .authorization__btn.locked{opacity:1}.swagger-ui .authorization__btn.unlocked{opacity:.4}.swagger-ui .expand-methods,.swagger-ui .expand-operation{border:none;background:none}.swagger-ui .expand-methods svg,.swagger-ui .expand-operation svg{width:20px;height:20px}.swagger-ui .expand-methods{padding:0 10px}.swagger-ui .expand-methods:hover svg{fill:#444}.swagger-ui .expand-methods svg{transition:all .3s;fill:#777}.swagger-ui button{cursor:pointer;outline:none}.swagger-ui select{font-size:14px;font-weight:700;padding:5px 40px 5px 10px;border:2px solid #41444e;border-radius:4px;background:#f7f7f7 url(data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHZpZXdCb3g9IjAgMCAyMCAyMCI+ICAgIDxwYXRoIGQ9Ik0xMy40MTggNy44NTljLjI3MS0uMjY4LjcwOS0uMjY4Ljk3OCAwIC4yNy4yNjguMjcyLjcwMSAwIC45NjlsLTMuOTA4IDMuODNjLS4yNy4yNjgtLjcwNy4yNjgtLjk3OSAwbC0zLjkwOC0zLjgzYy0uMjctLjI2Ny0uMjctLjcwMSAwLS45NjkuMjcxLS4yNjguNzA5LS4yNjguOTc4IDBMMTAgMTFsMy40MTgtMy4xNDF6Ii8+PC9zdmc+) right 10px center no-repeat;background-size:20px;box-shadow:0 1px 2px 0 rgba(0,0,0,.25);font-family:Titillium Web,sans-serif;color:#3b4151;-webkit-appearance:none;-moz-appearance:none;appearance:none}.swagger-ui select[multiple]{margin:5px 0;padding:5px;background:#f7f7f7}.swagger-ui .opblock-body select{min-width:230px}.swagger-ui label{font-size:12px;font-weight:700;margin:0 0 5px;font-family:Titillium Web,sans-serif;color:#3b4151}.swagger-ui input[type=email],.swagger-ui input[type=password],.swagger-ui input[type=search],.swagger-ui input[type=text]{min-width:100px;margin:5px 0;padding:8px 10px;border:1px solid #d9d9d9;border-radius:4px;background:#fff}.swagger-ui input[type=email].invalid,.swagger-ui input[type=password].invalid,.swagger-ui input[type=search].invalid,.swagger-ui input[type=text].invalid{-webkit-animation:shake .4s 1;animation:shake .4s 1;border-color:#f93e3e;background:#feebeb}@-webkit-keyframes shake{10%,90%{-webkit-transform:translate3d(-1px,0,0);transform:translate3d(-1px,0,0)}20%,80%{-webkit-transform:translate3d(2px,0,0);transform:translate3d(2px,0,0)}30%,50%,70%{-webkit-transform:translate3d(-4px,0,0);transform:translate3d(-4px,0,0)}40%,60%{-webkit-transform:translate3d(4px,0,0);transform:translate3d(4px,0,0)}}@keyframes shake{10%,90%{-webkit-transform:translate3d(-1px,0,0);transform:translate3d(-1px,0,0)}20%,80%{-webkit-transform:translate3d(2px,0,0);transform:translate3d(2px,0,0)}30%,50%,70%{-webkit-transform:translate3d(-4px,0,0);transform:translate3d(-4px,0,0)}40%,60%{-webkit-transform:translate3d(4px,0,0);transform:translate3d(4px,0,0)}}.swagger-ui textarea{font-size:12px;width:100%;min-height:280px;padding:10px;border:none;border-radius:4px;outline:none;background:hsla(0,0%,100%,.8);font-family:Source Code Pro,monospace;font-weight:600;color:#3b4151}.swagger-ui textarea:focus{border:2px solid #61affe}.swagger-ui textarea.curl{font-size:12px;min-height:100px;margin:0;padding:10px;resize:none;border-radius:4px;background:#41444e;font-family:Source Code Pro,monospace;font-weight:600;color:#fff}.swagger-ui .checkbox{padding:5px 0 10px;transition:opacity .5s;color:#333}.swagger-ui .checkbox label{display:-webkit-box;display:-ms-flexbox;display:flex}.swagger-ui .checkbox p{font-weight:400!important;font-style:italic;margin:0!important;font-family:Source Code Pro,monospace;font-weight:600;color:#3b4151}.swagger-ui .checkbox input[type=checkbox]{display:none}.swagger-ui .checkbox input[type=checkbox]+label>.item{position:relative;top:3px;display:inline-block;width:16px;height:16px;margin:0 8px 0 0;padding:5px;cursor:pointer;border-radius:1px;background:#e8e8e8;box-shadow:0 0 0 2px #e8e8e8;-webkit-box-flex:0;-ms-flex:none;flex:none}.swagger-ui .checkbox input[type=checkbox]+label>.item:active{-webkit-transform:scale(.9);transform:scale(.9)}.swagger-ui .checkbox input[type=checkbox]:checked+label>.item{background:#e8e8e8 url(\"data:image/svg+xml;charset=utf-8,%3Csvg width='10' height='8' viewBox='3 7 10 8' xmlns='http://www.w3.org/2000/svg'%3E%3Cpath fill='%2341474E' fill-rule='evenodd' d='M6.333 15L3 11.667l1.333-1.334 2 2L11.667 7 13 8.333z'/%3E%3C/svg%3E\") 50% no-repeat}.swagger-ui .dialog-ux{position:fixed;z-index:9999;top:0;right:0;bottom:0;left:0}.swagger-ui .dialog-ux .backdrop-ux{position:fixed;top:0;right:0;bottom:0;left:0;background:rgba(0,0,0,.8)}.swagger-ui .dialog-ux .modal-ux{position:absolute;z-index:9999;top:50%;left:50%;width:100%;min-width:300px;max-width:650px;-webkit-transform:translate(-50%,-50%);transform:translate(-50%,-50%);border:1px solid #ebebeb;border-radius:4px;background:#fff;box-shadow:0 10px 30px 0 rgba(0,0,0,.2)}.swagger-ui .dialog-ux .modal-ux-content{overflow-y:auto;max-height:540px;padding:20px}.swagger-ui .dialog-ux .modal-ux-content p{font-size:12px;margin:0 0 5px;color:#41444e;font-family:Open Sans,sans-serif;color:#3b4151}.swagger-ui .dialog-ux .modal-ux-content h4{font-size:18px;font-weight:600;margin:15px 0 0;font-family:Titillium Web,sans-serif;color:#3b4151}.swagger-ui .dialog-ux .modal-ux-header{display:-webkit-box;display:-ms-flexbox;display:flex;padding:12px 0;border-bottom:1px solid #ebebeb;-webkit-box-align:center;-ms-flex-align:center;align-items:center}.swagger-ui .dialog-ux .modal-ux-header .close-modal{padding:0 10px;border:none;background:none;-webkit-appearance:none;-moz-appearance:none;appearance:none}.swagger-ui .dialog-ux .modal-ux-header h3{font-size:20px;font-weight:600;margin:0;padding:0 20px;-webkit-box-flex:1;-ms-flex:1;flex:1;font-family:Titillium Web,sans-serif;color:#3b4151}.swagger-ui .model{font-size:12px;font-weight:300;font-family:Source Code Pro,monospace;font-weight:600;color:#3b4151}.swagger-ui .model-toggle{font-size:10px;position:relative;top:6px;display:inline-block;margin:auto .3em;cursor:pointer;transition:-webkit-transform .15s ease-in;transition:transform .15s ease-in;transition:transform .15s ease-in,-webkit-transform .15s ease-in;-webkit-transform:rotate(90deg);transform:rotate(90deg);-webkit-transform-origin:50% 50%;transform-origin:50% 50%}.swagger-ui .model-toggle.collapsed{-webkit-transform:rotate(0deg);transform:rotate(0deg)}.swagger-ui .model-toggle:after{display:block;width:20px;height:20px;content:\"\";background:url(\"data:image/svg+xml;charset=utf-8,%3Csvg xmlns='http://www.w3.org/2000/svg' width='24' height='24' viewBox='0 0 24 24'%3E%3Cpath d='M10 6L8.59 7.41 13.17 12l-4.58 4.59L10 18l6-6z'/%3E%3C/svg%3E\") 50% no-repeat;background-size:100%}.swagger-ui .model-jump-to-path{position:relative;cursor:pointer}.swagger-ui .model-jump-to-path .view-line-link{position:absolute;top:-.4em;cursor:pointer}.swagger-ui .model-title{position:relative}.swagger-ui .model-title:hover .model-hint{visibility:visible}.swagger-ui .model-hint{position:absolute;top:-1.8em;visibility:hidden;padding:.1em .5em;white-space:nowrap;color:#ebebeb;border-radius:4px;background:rgba(0,0,0,.7)}.swagger-ui section.models{margin:30px 0;border:1px solid rgba(59,65,81,.3);border-radius:4px}.swagger-ui section.models.is-open{padding:0 0 20px}.swagger-ui section.models.is-open h4{margin:0 0 5px;border-bottom:1px solid rgba(59,65,81,.3)}.swagger-ui section.models.is-open h4 svg{-webkit-transform:rotate(90deg);transform:rotate(90deg)}.swagger-ui section.models h4{font-size:16px;display:-webkit-box;display:-ms-flexbox;display:flex;margin:0;padding:10px 20px 10px 10px;cursor:pointer;transition:all .2s;font-family:Titillium Web,sans-serif;color:#777;-webkit-box-align:center;-ms-flex-align:center;align-items:center}.swagger-ui section.models h4 svg{transition:all .4s}.swagger-ui section.models h4 span{-webkit-box-flex:1;-ms-flex:1;flex:1}.swagger-ui section.models h4:hover{background:rgba(0,0,0,.02)}.swagger-ui section.models h5{font-size:16px;margin:0 0 10px;font-family:Titillium Web,sans-serif;color:#777}.swagger-ui section.models .model-jump-to-path{position:relative;top:5px}.swagger-ui section.models .model-container{margin:0 20px 15px;transition:all .5s;border-radius:4px;background:rgba(0,0,0,.05)}.swagger-ui section.models .model-container:hover{background:rgba(0,0,0,.07)}.swagger-ui section.models .model-container:first-of-type{margin:20px}.swagger-ui section.models .model-container:last-of-type{margin:0 20px}.swagger-ui section.models .model-box{background:none}.swagger-ui .model-box{padding:10px;border-radius:4px;background:rgba(0,0,0,.1)}.swagger-ui .model-box .model-jump-to-path{position:relative;top:4px}.swagger-ui .model-title{font-size:16px;font-family:Titillium Web,sans-serif;color:#555}.swagger-ui span>span.model,.swagger-ui span>span.model .brace-close{padding:0 0 0 10px}.swagger-ui .prop-type{color:#55a}.swagger-ui .prop-enum{display:block}.swagger-ui .prop-format{color:#999}.swagger-ui table{width:100%;padding:0 10px;border-collapse:collapse}.swagger-ui table.model tbody tr td{padding:0;vertical-align:top}.swagger-ui table.model tbody tr td:first-of-type{width:100px;padding:0}.swagger-ui table.headers td{font-size:12px;font-weight:300;vertical-align:middle;font-family:Source Code Pro,monospace;font-weight:600;color:#3b4151}.swagger-ui table tbody tr td{padding:10px 0 0;vertical-align:top}.swagger-ui table tbody tr td:first-of-type{width:20%;padding:10px 0}.swagger-ui table thead tr td,.swagger-ui table thead tr th{font-size:12px;font-weight:700;padding:12px 0;text-align:left;border-bottom:1px solid rgba(59,65,81,.2);font-family:Open Sans,sans-serif;color:#3b4151}.swagger-ui .parameters-col_description p{font-size:14px;margin:0;font-family:Open Sans,sans-serif;color:#3b4151}.swagger-ui .parameters-col_description input[type=text]{width:100%;max-width:340px}.swagger-ui .parameter__name{font-size:16px;font-weight:400;font-family:Titillium Web,sans-serif;color:#3b4151}.swagger-ui .parameter__name.required{font-weight:700}.swagger-ui .parameter__name.required:after{font-size:10px;position:relative;top:-6px;padding:5px;content:\"required\";color:rgba(255,0,0,.6)}.swagger-ui .parameter__in{font-size:12px;font-style:italic;font-family:Source Code Pro,monospace;font-weight:600;color:#888}.swagger-ui .table-container{padding:20px}.swagger-ui .topbar{padding:8px 30px;background-color:#89bf04}.swagger-ui .topbar .topbar-wrapper{-ms-flex-align:center}.swagger-ui .topbar .topbar-wrapper,.swagger-ui .topbar a{display:-webkit-box;display:-ms-flexbox;display:flex;-webkit-box-align:center;align-items:center}.swagger-ui .topbar a{font-size:1.5em;font-weight:700;max-width:300px;text-decoration:none;-webkit-box-flex:1;-ms-flex:1;flex:1;-ms-flex-align:center;font-family:Titillium Web,sans-serif;color:#fff}.swagger-ui .topbar a span{margin:0;padding:0 10px}.swagger-ui .topbar .download-url-wrapper{display:-webkit-box;display:-ms-flexbox;display:flex;-webkit-box-flex:3;-ms-flex:3;flex:3}.swagger-ui .topbar .download-url-wrapper input[type=text]{width:100%;min-width:350px;margin:0;border:2px solid #547f00;border-radius:4px 0 0 4px;outline:none}.swagger-ui .topbar .download-url-wrapper .download-url-button{font-size:16px;font-weight:700;padding:4px 40px;border:none;border-radius:0 4px 4px 0;background:#547f00;font-family:Titillium Web,sans-serif;color:#fff}.swagger-ui .info{margin:50px 0}.swagger-ui .info hgroup.main{margin:0 0 20px}.swagger-ui .info hgroup.main a{font-size:12px}.swagger-ui .info li,.swagger-ui .info p,.swagger-ui .info table{font-size:14px;font-family:Open Sans,sans-serif;color:#3b4151}.swagger-ui .info h1,.swagger-ui .info h2,.swagger-ui .info h3,.swagger-ui .info h4,.swagger-ui .info h5{font-family:Open Sans,sans-serif;color:#3b4151}.swagger-ui .info code{padding:3px 5px;border-radius:4px;background:rgba(0,0,0,.05);font-family:Source Code Pro,monospace;font-weight:600;color:#9012fe}.swagger-ui .info a{font-size:14px;transition:all .4s;font-family:Open Sans,sans-serif;color:#4990e2}.swagger-ui .info a:hover{color:#1f69c0}.swagger-ui .info>div{margin:0 0 5px}.swagger-ui .info .base-url{font-size:12px;font-weight:300!important;margin:0;font-family:Source Code Pro,monospace;font-weight:600;color:#3b4151}.swagger-ui .info .title{font-size:36px;margin:0;font-family:Open Sans,sans-serif;color:#3b4151}.swagger-ui .info .title small{font-size:10px;position:relative;top:-5px;display:inline-block;margin:0 0 0 5px;padding:2px 4px;vertical-align:super;border-radius:57px;background:#7d8492}.swagger-ui .info .title small pre{margin:0;font-family:Titillium Web,sans-serif;color:#fff}.swagger-ui .auth-btn-wrapper{display:-webkit-box;display:-ms-flexbox;display:flex;padding:10px 0;-webkit-box-pack:center;-ms-flex-pack:center;justify-content:center}.swagger-ui .auth-wrapper{display:-webkit-box;display:-ms-flexbox;display:flex;-webkit-box-flex:1;-ms-flex:1;flex:1;-webkit-box-pack:end;-ms-flex-pack:end;justify-content:flex-end}.swagger-ui .auth-wrapper .authorize{padding-right:20px}.swagger-ui .auth-container{margin:0 0 10px;padding:10px 20px;border-bottom:1px solid #ebebeb}.swagger-ui .auth-container:last-of-type{margin:0;padding:10px 20px;border:0}.swagger-ui .auth-container h4{margin:5px 0 15px!important}.swagger-ui .auth-container .wrapper{margin:0;padding:0}.swagger-ui .auth-container input[type=password],.swagger-ui .auth-container input[type=text]{min-width:230px}.swagger-ui .auth-container .errors{font-size:12px;padding:10px;border-radius:4px;font-family:Source Code Pro,monospace;font-weight:600;color:#3b4151}.swagger-ui .scopes h2{font-size:14px;font-family:Titillium Web,sans-serif;color:#3b4151}.swagger-ui .scope-def{padding:0 0 20px}.swagger-ui .errors-wrapper{margin:20px;padding:10px 20px;-webkit-animation:scaleUp .5s;animation:scaleUp .5s;border:2px solid #f93e3e;border-radius:4px;background:rgba(249,62,62,.1)}.swagger-ui .errors-wrapper .error-wrapper{margin:0 0 10px}.swagger-ui .errors-wrapper .errors h4{font-size:14px;margin:0;font-family:Source Code Pro,monospace;font-weight:600;color:#3b4151}.swagger-ui .errors-wrapper .errors small{color:#666}.swagger-ui .errors-wrapper hgroup{display:-webkit-box;display:-ms-flexbox;display:flex;-webkit-box-align:center;-ms-flex-align:center;align-items:center}.swagger-ui .errors-wrapper hgroup h4{font-size:20px;margin:0;-webkit-box-flex:1;-ms-flex:1;flex:1;font-family:Titillium Web,sans-serif;color:#3b4151}@-webkit-keyframes scaleUp{0%{-webkit-transform:scale(.8);transform:scale(.8);opacity:0}to{-webkit-transform:scale(1);transform:scale(1);opacity:1}}@keyframes scaleUp{0%{-webkit-transform:scale(.8);transform:scale(.8);opacity:0}to{-webkit-transform:scale(1);transform:scale(1);opacity:1}}.swagger-ui .Resizer.vertical.disabled{display:none}\n/*# sourceMappingURL=swagger-ui.css.map*/"
  },
  {
    "path": "src/main/resources/static/swagger/swagger-ui.js",
    "content": "/**\n * swagger-ui - Swagger UI is a dependency-free collection of HTML, JavaScript, and CSS assets that dynamically generate beautiful documentation from a Swagger-compliant API\n * @version v2.2.10\n * @link http://swagger.io\n * @license Apache-2.0\n */\n(function(){/* jshint ignore:start */ \n {(function() {\n  var template = Handlebars.template, templates = Handlebars.templates = Handlebars.templates || {};\ntemplates['apikey_auth'] = template({\"1\":function(container,depth0,helpers,partials,data) {\n    var stack1;\n\n  return \"                <span class=\\\"key_auth__value\\\">\"\n    + ((stack1 = (helpers.sanitize || (depth0 && depth0.sanitize) || helpers.helperMissing).call(depth0 != null ? depth0 : {},(depth0 != null ? depth0.value : depth0),{\"name\":\"sanitize\",\"hash\":{},\"data\":data})) != null ? stack1 : \"\")\n    + \"</span>\\n\";\n},\"3\":function(container,depth0,helpers,partials,data) {\n    return \"                <input placeholder=\\\"api_key\\\" class=\\\"auth_input input_apiKey_entry\\\" name=\\\"apiKey\\\" type=\\\"text\\\"/>\\n\";\n},\"compiler\":[7,\">= 4.0.0\"],\"main\":function(container,depth0,helpers,partials,data) {\n    var stack1, alias1=depth0 != null ? depth0 : {}, alias2=helpers.helperMissing;\n\n  return \"<div class=\\\"key_input_container\\\">\\n    <h3 class=\\\"auth__title\\\">Api key authorization</h3>\\n    <div class=\\\"auth__description\\\">\"\n    + ((stack1 = (helpers.sanitize || (depth0 && depth0.sanitize) || alias2).call(alias1,(depth0 != null ? depth0.description : depth0),{\"name\":\"sanitize\",\"hash\":{},\"data\":data})) != null ? stack1 : \"\")\n    + \"</div>\\n    <div>\\n        <div class=\\\"key_auth__field\\\">\\n            <span class=\\\"key_auth__label\\\">name:</span>\\n            <span class=\\\"key_auth__value\\\">\"\n    + ((stack1 = (helpers.escape || (depth0 && depth0.escape) || alias2).call(alias1,(depth0 != null ? depth0.name : depth0),{\"name\":\"escape\",\"hash\":{},\"data\":data})) != null ? stack1 : \"\")\n    + \"</span>\\n        </div>\\n        <div class=\\\"key_auth__field\\\">\\n            <span class=\\\"key_auth__label\\\">in:</span>\\n            <span class=\\\"key_auth__value\\\">\"\n    + ((stack1 = (helpers.escape || (depth0 && depth0.escape) || alias2).call(alias1,(depth0 != null ? depth0[\"in\"] : depth0),{\"name\":\"escape\",\"hash\":{},\"data\":data})) != null ? stack1 : \"\")\n    + \"</span>\\n        </div>\\n        <div class=\\\"key_auth__field\\\">\\n            <span class=\\\"key_auth__label\\\">value:</span>\\n\"\n    + ((stack1 = helpers[\"if\"].call(alias1,(depth0 != null ? depth0.isLogout : depth0),{\"name\":\"if\",\"hash\":{},\"fn\":container.program(1, data, 0),\"inverse\":container.program(3, data, 0),\"data\":data})) != null ? stack1 : \"\")\n    + \"        </div>\\n    </div>\\n</div>\\n\";\n},\"useData\":true});\ntemplates['auth_button'] = template({\"compiler\":[7,\">= 4.0.0\"],\"main\":function(container,depth0,helpers,partials,data) {\n    return \"<a class='authorize__btn' href=\\\"#\\\">Authorize</a>\\n\";\n},\"useData\":true});\ntemplates['auth_button_operation'] = template({\"1\":function(container,depth0,helpers,partials,data) {\n    return \"        authorize__btn_operation_login\\n\";\n},\"3\":function(container,depth0,helpers,partials,data) {\n    return \"        authorize__btn_operation_logout\\n\";\n},\"5\":function(container,depth0,helpers,partials,data) {\n    var stack1;\n\n  return \"        <ul class=\\\"authorize-scopes\\\">\\n\"\n    + ((stack1 = helpers.each.call(depth0 != null ? depth0 : {},(depth0 != null ? depth0.scopes : depth0),{\"name\":\"each\",\"hash\":{},\"fn\":container.program(6, data, 0),\"inverse\":container.noop,\"data\":data})) != null ? stack1 : \"\")\n    + \"        </ul>\\n\";\n},\"6\":function(container,depth0,helpers,partials,data) {\n    var stack1, alias1=depth0 != null ? depth0 : {}, alias2=helpers.helperMissing;\n\n  return \"                <li class=\\\"authorize__scope\\\" title=\\\"\"\n    + ((stack1 = (helpers.escape || (depth0 && depth0.escape) || alias2).call(alias1,(depth0 != null ? depth0.description : depth0),{\"name\":\"escape\",\"hash\":{},\"data\":data})) != null ? stack1 : \"\")\n    + \"\\\">\"\n    + ((stack1 = (helpers.escape || (depth0 && depth0.escape) || alias2).call(alias1,(depth0 != null ? depth0.scope : depth0),{\"name\":\"escape\",\"hash\":{},\"data\":data})) != null ? stack1 : \"\")\n    + \"</li>\\n\";\n},\"compiler\":[7,\">= 4.0.0\"],\"main\":function(container,depth0,helpers,partials,data) {\n    var stack1, alias1=depth0 != null ? depth0 : {};\n\n  return \"<div class=\\\"authorize__btn authorize__btn_operation\\n\"\n    + ((stack1 = helpers[\"if\"].call(alias1,(depth0 != null ? depth0.isLogout : depth0),{\"name\":\"if\",\"hash\":{},\"fn\":container.program(1, data, 0),\"inverse\":container.program(3, data, 0),\"data\":data})) != null ? stack1 : \"\")\n    + \"\\\">\\n\"\n    + ((stack1 = helpers[\"if\"].call(alias1,(depth0 != null ? depth0.scopes : depth0),{\"name\":\"if\",\"hash\":{},\"fn\":container.program(5, data, 0),\"inverse\":container.noop,\"data\":data})) != null ? stack1 : \"\")\n    + \"</div>\\n\";\n},\"useData\":true});\ntemplates['auth_view'] = template({\"1\":function(container,depth0,helpers,partials,data) {\n    return \"            <button type=\\\"button\\\" class=\\\"auth__button auth_submit__button\\\" data-sw-translate>Authorize</button>\\n\";\n},\"3\":function(container,depth0,helpers,partials,data) {\n    return \"            <button type=\\\"button\\\" class=\\\"auth__button auth_logout__button\\\" data-sw-translate>Logout</button>\\n\";\n},\"compiler\":[7,\">= 4.0.0\"],\"main\":function(container,depth0,helpers,partials,data) {\n    var stack1, alias1=depth0 != null ? depth0 : {};\n\n  return \"<div class=\\\"auth_container\\\">\\n\\n    <div class=\\\"auth_inner\\\"></div>\\n    <div class=\\\"auth_submit\\\">\\n\"\n    + ((stack1 = helpers.unless.call(alias1,(depth0 != null ? depth0.isLogout : depth0),{\"name\":\"unless\",\"hash\":{},\"fn\":container.program(1, data, 0),\"inverse\":container.noop,\"data\":data})) != null ? stack1 : \"\")\n    + ((stack1 = helpers[\"if\"].call(alias1,(depth0 != null ? depth0.isAuthorized : depth0),{\"name\":\"if\",\"hash\":{},\"fn\":container.program(3, data, 0),\"inverse\":container.noop,\"data\":data})) != null ? stack1 : \"\")\n    + \"    </div>\\n\\n</div>\\n\";\n},\"useData\":true});\ntemplates['basic_auth'] = template({\"1\":function(container,depth0,helpers,partials,data) {\n    return \" - authorized\";\n},\"3\":function(container,depth0,helpers,partials,data) {\n    var stack1;\n\n  return \"                <span class=\\\"basic_auth__value\\\">\"\n    + ((stack1 = (helpers.escape || (depth0 && depth0.escape) || helpers.helperMissing).call(depth0 != null ? depth0 : {},(depth0 != null ? depth0.username : depth0),{\"name\":\"escape\",\"hash\":{},\"data\":data})) != null ? stack1 : \"\")\n    + \"</span>\\n\";\n},\"5\":function(container,depth0,helpers,partials,data) {\n    return \"                <input required placeholder=\\\"username\\\" class=\\\"basic_auth__username auth_input\\\" name=\\\"username\\\" type=\\\"text\\\"/>\\n\";\n},\"7\":function(container,depth0,helpers,partials,data) {\n    return \"            <div class=\\\"auth_label\\\">\\n                <span class=\\\"basic_auth__label\\\" data-sw-translate>password:</span>\\n                <input required placeholder=\\\"password\\\" class=\\\"basic_auth__password auth_input\\\" name=\\\"password\\\" type=\\\"password\\\"/></label>\\n            </div>\\n\";\n},\"compiler\":[7,\">= 4.0.0\"],\"main\":function(container,depth0,helpers,partials,data) {\n    var stack1, alias1=depth0 != null ? depth0 : {};\n\n  return \"<div class='basic_auth_container'>\\n    <h3 class=\\\"auth__title\\\">Basic authentication\"\n    + ((stack1 = helpers[\"if\"].call(alias1,(depth0 != null ? depth0.isLogout : depth0),{\"name\":\"if\",\"hash\":{},\"fn\":container.program(1, data, 0),\"inverse\":container.noop,\"data\":data})) != null ? stack1 : \"\")\n    + \"</h3>\\n    <form class=\\\"basic_input_container\\\">\\n        <div class=\\\"auth__description\\\">\"\n    + ((stack1 = (helpers.sanitize || (depth0 && depth0.sanitize) || helpers.helperMissing).call(alias1,(depth0 != null ? depth0.description : depth0),{\"name\":\"sanitize\",\"hash\":{},\"data\":data})) != null ? stack1 : \"\")\n    + \"</div>\\n        <div class=\\\"auth_label\\\">\\n            <span class=\\\"basic_auth__label\\\" data-sw-translate>username:</span>\\n\"\n    + ((stack1 = helpers[\"if\"].call(alias1,(depth0 != null ? depth0.isLogout : depth0),{\"name\":\"if\",\"hash\":{},\"fn\":container.program(3, data, 0),\"inverse\":container.program(5, data, 0),\"data\":data})) != null ? stack1 : \"\")\n    + \"        </div>\\n\"\n    + ((stack1 = helpers.unless.call(alias1,(depth0 != null ? depth0.isLogout : depth0),{\"name\":\"unless\",\"hash\":{},\"fn\":container.program(7, data, 0),\"inverse\":container.noop,\"data\":data})) != null ? stack1 : \"\")\n    + \"    </form>\\n</div>\\n\";\n},\"useData\":true});\ntemplates['content_type'] = template({\"1\":function(container,depth0,helpers,partials,data) {\n    var stack1;\n\n  return ((stack1 = helpers.each.call(depth0 != null ? depth0 : {},(depth0 != null ? depth0.produces : depth0),{\"name\":\"each\",\"hash\":{},\"fn\":container.program(2, data, 0),\"inverse\":container.noop,\"data\":data})) != null ? stack1 : \"\");\n},\"2\":function(container,depth0,helpers,partials,data) {\n    var stack1, alias1=depth0 != null ? depth0 : {}, alias2=helpers.helperMissing;\n\n  return \"\t<option value=\\\"\"\n    + ((stack1 = (helpers.sanitize || (depth0 && depth0.sanitize) || alias2).call(alias1,depth0,{\"name\":\"sanitize\",\"hash\":{},\"data\":data})) != null ? stack1 : \"\")\n    + \"\\\">\"\n    + ((stack1 = (helpers.sanitize || (depth0 && depth0.sanitize) || alias2).call(alias1,depth0,{\"name\":\"sanitize\",\"hash\":{},\"data\":data})) != null ? stack1 : \"\")\n    + \"</option>\\n\";\n},\"4\":function(container,depth0,helpers,partials,data) {\n    return \"  <option value=\\\"application/json\\\">application/json</option>\\n\";\n},\"compiler\":[7,\">= 4.0.0\"],\"main\":function(container,depth0,helpers,partials,data) {\n    var stack1, alias1=depth0 != null ? depth0 : {}, alias2=helpers.helperMissing;\n\n  return \"<label data-sw-translate for=\\\"\"\n    + ((stack1 = (helpers.escape || (depth0 && depth0.escape) || alias2).call(alias1,(depth0 != null ? depth0.contentTypeId : depth0),{\"name\":\"escape\",\"hash\":{},\"data\":data})) != null ? stack1 : \"\")\n    + \"\\\">Response Content Type</label>\\n<select name=\\\"contentType\\\" id=\\\"\"\n    + ((stack1 = (helpers.escape || (depth0 && depth0.escape) || alias2).call(alias1,(depth0 != null ? depth0.contentTypeId : depth0),{\"name\":\"escape\",\"hash\":{},\"data\":data})) != null ? stack1 : \"\")\n    + \"\\\">\\n\"\n    + ((stack1 = helpers[\"if\"].call(alias1,(depth0 != null ? depth0.produces : depth0),{\"name\":\"if\",\"hash\":{},\"fn\":container.program(1, data, 0),\"inverse\":container.program(4, data, 0),\"data\":data})) != null ? stack1 : \"\")\n    + \"</select>\\n\";\n},\"useData\":true});\ntemplates['main'] = template({\"1\":function(container,depth0,helpers,partials,data) {\n    var stack1, alias1=depth0 != null ? depth0 : {}, alias2=helpers.helperMissing;\n\n  return \"  <div class=\\\"info_title\\\">\"\n    + ((stack1 = (helpers.sanitize || (depth0 && depth0.sanitize) || alias2).call(alias1,((stack1 = (depth0 != null ? depth0.info : depth0)) != null ? stack1.title : stack1),{\"name\":\"sanitize\",\"hash\":{},\"data\":data})) != null ? stack1 : \"\")\n    + \"</div>\\n  <div class=\\\"info_description markdown\\\">\"\n    + ((stack1 = (helpers.sanitize || (depth0 && depth0.sanitize) || alias2).call(alias1,((stack1 = (depth0 != null ? depth0.info : depth0)) != null ? stack1.description : stack1),{\"name\":\"sanitize\",\"hash\":{},\"data\":data})) != null ? stack1 : \"\")\n    + \"</div>\\n\"\n    + ((stack1 = helpers[\"if\"].call(alias1,(depth0 != null ? depth0.externalDocs : depth0),{\"name\":\"if\",\"hash\":{},\"fn\":container.program(2, data, 0),\"inverse\":container.noop,\"data\":data})) != null ? stack1 : \"\")\n    + \"  \"\n    + ((stack1 = helpers[\"if\"].call(alias1,((stack1 = (depth0 != null ? depth0.info : depth0)) != null ? stack1.termsOfServiceUrl : stack1),{\"name\":\"if\",\"hash\":{},\"fn\":container.program(4, data, 0),\"inverse\":container.noop,\"data\":data})) != null ? stack1 : \"\")\n    + \"\\n  \"\n    + ((stack1 = helpers[\"if\"].call(alias1,((stack1 = ((stack1 = (depth0 != null ? depth0.info : depth0)) != null ? stack1.contact : stack1)) != null ? stack1.name : stack1),{\"name\":\"if\",\"hash\":{},\"fn\":container.program(6, data, 0),\"inverse\":container.noop,\"data\":data})) != null ? stack1 : \"\")\n    + \"\\n  \"\n    + ((stack1 = helpers[\"if\"].call(alias1,((stack1 = ((stack1 = (depth0 != null ? depth0.info : depth0)) != null ? stack1.contact : stack1)) != null ? stack1.url : stack1),{\"name\":\"if\",\"hash\":{},\"fn\":container.program(8, data, 0),\"inverse\":container.noop,\"data\":data})) != null ? stack1 : \"\")\n    + \"\\n  \"\n    + ((stack1 = helpers[\"if\"].call(alias1,((stack1 = ((stack1 = (depth0 != null ? depth0.info : depth0)) != null ? stack1.contact : stack1)) != null ? stack1.email : stack1),{\"name\":\"if\",\"hash\":{},\"fn\":container.program(10, data, 0),\"inverse\":container.noop,\"data\":data})) != null ? stack1 : \"\")\n    + \"\\n  \"\n    + ((stack1 = helpers[\"if\"].call(alias1,((stack1 = (depth0 != null ? depth0.info : depth0)) != null ? stack1.license : stack1),{\"name\":\"if\",\"hash\":{},\"fn\":container.program(12, data, 0),\"inverse\":container.noop,\"data\":data})) != null ? stack1 : \"\")\n    + \"\\n\";\n},\"2\":function(container,depth0,helpers,partials,data) {\n    var stack1, alias1=depth0 != null ? depth0 : {}, alias2=helpers.helperMissing;\n\n  return \"  <p>\"\n    + ((stack1 = (helpers.sanitize || (depth0 && depth0.sanitize) || alias2).call(alias1,((stack1 = (depth0 != null ? depth0.externalDocs : depth0)) != null ? stack1.description : stack1),{\"name\":\"sanitize\",\"hash\":{},\"data\":data})) != null ? stack1 : \"\")\n    + \"</p>\\n  <a href=\\\"\"\n    + ((stack1 = (helpers.escape || (depth0 && depth0.escape) || alias2).call(alias1,((stack1 = (depth0 != null ? depth0.externalDocs : depth0)) != null ? stack1.url : stack1),{\"name\":\"escape\",\"hash\":{},\"data\":data})) != null ? stack1 : \"\")\n    + \"\\\" target=\\\"_blank\\\">\"\n    + ((stack1 = (helpers.escape || (depth0 && depth0.escape) || alias2).call(alias1,((stack1 = (depth0 != null ? depth0.externalDocs : depth0)) != null ? stack1.url : stack1),{\"name\":\"escape\",\"hash\":{},\"data\":data})) != null ? stack1 : \"\")\n    + \"</a>\\n\";\n},\"4\":function(container,depth0,helpers,partials,data) {\n    var stack1;\n\n  return \"<div class=\\\"info_tos\\\"><a target=\\\"_blank\\\" href=\\\"\"\n    + ((stack1 = (helpers.escape || (depth0 && depth0.escape) || helpers.helperMissing).call(depth0 != null ? depth0 : {},((stack1 = (depth0 != null ? depth0.info : depth0)) != null ? stack1.termsOfServiceUrl : stack1),{\"name\":\"escape\",\"hash\":{},\"data\":data})) != null ? stack1 : \"\")\n    + \"\\\" data-sw-translate>Terms of service</a></div>\";\n},\"6\":function(container,depth0,helpers,partials,data) {\n    var stack1;\n\n  return \"<div><div class='info_name' style=\\\"display: inline\\\" data-sw-translate>Created by </div> \"\n    + ((stack1 = (helpers.escape || (depth0 && depth0.escape) || helpers.helperMissing).call(depth0 != null ? depth0 : {},((stack1 = ((stack1 = (depth0 != null ? depth0.info : depth0)) != null ? stack1.contact : stack1)) != null ? stack1.name : stack1),{\"name\":\"escape\",\"hash\":{},\"data\":data})) != null ? stack1 : \"\")\n    + \"</div>\";\n},\"8\":function(container,depth0,helpers,partials,data) {\n    var stack1, alias1=depth0 != null ? depth0 : {}, alias2=helpers.helperMissing;\n\n  return \"<div class='info_url' data-sw-translate>See more at <a href=\\\"\"\n    + ((stack1 = (helpers.escape || (depth0 && depth0.escape) || alias2).call(alias1,((stack1 = ((stack1 = (depth0 != null ? depth0.info : depth0)) != null ? stack1.contact : stack1)) != null ? stack1.url : stack1),{\"name\":\"escape\",\"hash\":{},\"data\":data})) != null ? stack1 : \"\")\n    + \"\\\">\"\n    + ((stack1 = (helpers.escape || (depth0 && depth0.escape) || alias2).call(alias1,((stack1 = ((stack1 = (depth0 != null ? depth0.info : depth0)) != null ? stack1.contact : stack1)) != null ? stack1.url : stack1),{\"name\":\"escape\",\"hash\":{},\"data\":data})) != null ? stack1 : \"\")\n    + \"</a></div>\";\n},\"10\":function(container,depth0,helpers,partials,data) {\n    var stack1, alias1=depth0 != null ? depth0 : {}, alias2=helpers.helperMissing;\n\n  return \"<div class='info_email'><a target=\\\"_parent\\\" href=\\\"mailto:\"\n    + ((stack1 = (helpers.escape || (depth0 && depth0.escape) || alias2).call(alias1,((stack1 = ((stack1 = (depth0 != null ? depth0.info : depth0)) != null ? stack1.contact : stack1)) != null ? stack1.email : stack1),{\"name\":\"escape\",\"hash\":{},\"data\":data})) != null ? stack1 : \"\")\n    + \"?subject=\"\n    + ((stack1 = (helpers.escape || (depth0 && depth0.escape) || alias2).call(alias1,((stack1 = (depth0 != null ? depth0.info : depth0)) != null ? stack1.title : stack1),{\"name\":\"escape\",\"hash\":{},\"data\":data})) != null ? stack1 : \"\")\n    + \"\\\" data-sw-translate>Contact the developer</a></div>\";\n},\"12\":function(container,depth0,helpers,partials,data) {\n    var stack1, alias1=depth0 != null ? depth0 : {}, alias2=helpers.helperMissing;\n\n  return \"<div class='info_license'><a target=\\\"_blank\\\" href='\"\n    + ((stack1 = (helpers.escape || (depth0 && depth0.escape) || alias2).call(alias1,((stack1 = ((stack1 = (depth0 != null ? depth0.info : depth0)) != null ? stack1.license : stack1)) != null ? stack1.url : stack1),{\"name\":\"escape\",\"hash\":{},\"data\":data})) != null ? stack1 : \"\")\n    + \"'>\"\n    + ((stack1 = (helpers.escape || (depth0 && depth0.escape) || alias2).call(alias1,((stack1 = ((stack1 = (depth0 != null ? depth0.info : depth0)) != null ? stack1.license : stack1)) != null ? stack1.name : stack1),{\"name\":\"escape\",\"hash\":{},\"data\":data})) != null ? stack1 : \"\")\n    + \"</a></div>\";\n},\"14\":function(container,depth0,helpers,partials,data) {\n    var stack1;\n\n  return \"  , <span style=\\\"font-variant: small-caps\\\" data-sw-translate>api version</span>: \"\n    + ((stack1 = (helpers.escape || (depth0 && depth0.escape) || helpers.helperMissing).call(depth0 != null ? depth0 : {},((stack1 = (depth0 != null ? depth0.info : depth0)) != null ? stack1.version : stack1),{\"name\":\"escape\",\"hash\":{},\"data\":data})) != null ? stack1 : \"\")\n    + \"\\n    \";\n},\"16\":function(container,depth0,helpers,partials,data) {\n    var stack1, alias1=depth0 != null ? depth0 : {}, alias2=helpers.helperMissing;\n\n  return \"    <span style=\\\"float:right\\\"><a target=\\\"_blank\\\" href=\\\"\"\n    + ((stack1 = (helpers.escape || (depth0 && depth0.escape) || alias2).call(alias1,(depth0 != null ? depth0.validatorUrl : depth0),{\"name\":\"escape\",\"hash\":{},\"data\":data})) != null ? stack1 : \"\")\n    + \"/debug?url=\"\n    + ((stack1 = (helpers.escape || (depth0 && depth0.escape) || alias2).call(alias1,(depth0 != null ? depth0.url : depth0),{\"name\":\"escape\",\"hash\":{},\"data\":data})) != null ? stack1 : \"\")\n    + \"\\\"><img id=\\\"validator\\\" src=\\\"\"\n    + ((stack1 = (helpers.escape || (depth0 && depth0.escape) || alias2).call(alias1,(depth0 != null ? depth0.validatorUrl : depth0),{\"name\":\"escape\",\"hash\":{},\"data\":data})) != null ? stack1 : \"\")\n    + \"?url=\"\n    + ((stack1 = (helpers.escape || (depth0 && depth0.escape) || alias2).call(alias1,(depth0 != null ? depth0.url : depth0),{\"name\":\"escape\",\"hash\":{},\"data\":data})) != null ? stack1 : \"\")\n    + \"\\\"></a>\\n    </span>\\n\";\n},\"compiler\":[7,\">= 4.0.0\"],\"main\":function(container,depth0,helpers,partials,data) {\n    var stack1, alias1=depth0 != null ? depth0 : {};\n\n  return \"<div class='info' id='api_info'>\\n\"\n    + ((stack1 = helpers[\"if\"].call(alias1,(depth0 != null ? depth0.info : depth0),{\"name\":\"if\",\"hash\":{},\"fn\":container.program(1, data, 0),\"inverse\":container.noop,\"data\":data})) != null ? stack1 : \"\")\n    + \"</div>\\n<div class='container' id='resources_container'>\\n  <div class='authorize-wrapper'></div>\\n\\n  <ul id='resources'></ul>\\n\\n  <div class=\\\"footer\\\">\\n    <h4 style=\\\"color: #999\\\">[ <span style=\\\"font-variant: small-caps\\\">base url</span>: \"\n    + ((stack1 = (helpers.escape || (depth0 && depth0.escape) || helpers.helperMissing).call(alias1,(depth0 != null ? depth0.basePath : depth0),{\"name\":\"escape\",\"hash\":{},\"data\":data})) != null ? stack1 : \"\")\n    + \"\\n\"\n    + ((stack1 = helpers[\"if\"].call(alias1,((stack1 = (depth0 != null ? depth0.info : depth0)) != null ? stack1.version : stack1),{\"name\":\"if\",\"hash\":{},\"fn\":container.program(14, data, 0),\"inverse\":container.noop,\"data\":data})) != null ? stack1 : \"\")\n    + \"]\\n\"\n    + ((stack1 = helpers[\"if\"].call(alias1,(depth0 != null ? depth0.validatorUrl : depth0),{\"name\":\"if\",\"hash\":{},\"fn\":container.program(16, data, 0),\"inverse\":container.noop,\"data\":data})) != null ? stack1 : \"\")\n    + \"    </h4>\\n    </div>\\n</div>\\n\";\n},\"useData\":true});\ntemplates['oauth2'] = template({\"1\":function(container,depth0,helpers,partials,data) {\n    var stack1;\n\n  return \"<p>Authorization URL: \"\n    + ((stack1 = (helpers.sanitize || (depth0 && depth0.sanitize) || helpers.helperMissing).call(depth0 != null ? depth0 : {},(depth0 != null ? depth0.authorizationUrl : depth0),{\"name\":\"sanitize\",\"hash\":{},\"data\":data})) != null ? stack1 : \"\")\n    + \"</p>\";\n},\"3\":function(container,depth0,helpers,partials,data) {\n    var stack1;\n\n  return \"<p>Token URL: \"\n    + ((stack1 = (helpers.sanitize || (depth0 && depth0.sanitize) || helpers.helperMissing).call(depth0 != null ? depth0 : {},(depth0 != null ? depth0.tokenUrl : depth0),{\"name\":\"sanitize\",\"hash\":{},\"data\":data})) != null ? stack1 : \"\")\n    + \"</p>\";\n},\"5\":function(container,depth0,helpers,partials,data) {\n    return \"        <p>Please input username and password for password flow authorization</p>\\n        <fieldset>\\n            <div><label>Username: <input class=\\\"oauth-username\\\" type=\\\"text\\\" name=\\\"username\\\"></label></div>\\n            <div><label>Password: <input class=\\\"oauth-password\\\" type=\\\"password\\\" name=\\\"password\\\"></label></div>\\n        </fieldset>\\n\";\n},\"7\":function(container,depth0,helpers,partials,data) {\n    var stack1;\n\n  return \"        <p>Setup client authentication.\"\n    + ((stack1 = helpers[\"if\"].call(depth0 != null ? depth0 : {},(depth0 != null ? depth0.requireClientAuthenticaiton : depth0),{\"name\":\"if\",\"hash\":{},\"fn\":container.program(8, data, 0),\"inverse\":container.noop,\"data\":data})) != null ? stack1 : \"\")\n    + \"</p>\\n        <fieldset>\\n            <div><label>Type:\\n                <select class=\\\"oauth-client-authentication-type\\\" name=\\\"client-authentication-type\\\">\\n                    <option value=\\\"none\\\" selected>None or other</option>\\n                    <option value=\\\"basic\\\">Basic auth</option>\\n                    <option value=\\\"request-body\\\">Request body</option>\\n                </select>\\n            </label></div>\\n            <div class=\\\"oauth-client-authentication\\\" hidden>\\n                <div><label>ClientId: <input class=\\\"oauth-client-id\\\" type=\\\"text\\\" name=\\\"client-id\\\"></label></div>\\n                <div><label>Secret: <input class=\\\"oauth-client-secret\\\" type=\\\"text\\\" name=\\\"client-secret\\\"></label></div>\\n            </div>\\n        </fieldset>\\n\";\n},\"8\":function(container,depth0,helpers,partials,data) {\n    return \"(Required)\";\n},\"10\":function(container,depth0,helpers,partials,data) {\n    var stack1, alias1=depth0 != null ? depth0 : {}, alias2=helpers.helperMissing;\n\n  return \"            <li>\\n                <input class=\\\"oauth-scope\\\" type=\\\"checkbox\\\" data-scope=\\\"\"\n    + ((stack1 = (helpers.escape || (depth0 && depth0.escape) || alias2).call(alias1,(depth0 != null ? depth0.scope : depth0),{\"name\":\"escape\",\"hash\":{},\"data\":data})) != null ? stack1 : \"\")\n    + \"\\\" oauthtype=\\\"\"\n    + ((stack1 = (helpers.escape || (depth0 && depth0.escape) || alias2).call(alias1,(depth0 != null ? depth0.OAuthSchemeKey : depth0),{\"name\":\"escape\",\"hash\":{},\"data\":data})) != null ? stack1 : \"\")\n    + \"\\\"/>\\n                <label>\"\n    + ((stack1 = (helpers.escape || (depth0 && depth0.escape) || alias2).call(alias1,(depth0 != null ? depth0.scope : depth0),{\"name\":\"escape\",\"hash\":{},\"data\":data})) != null ? stack1 : \"\")\n    + \"</label><br/>\\n                <span class=\\\"api-scope-desc\\\">\"\n    + ((stack1 = (helpers.escape || (depth0 && depth0.escape) || alias2).call(alias1,(depth0 != null ? depth0.description : depth0),{\"name\":\"escape\",\"hash\":{},\"data\":data})) != null ? stack1 : \"\")\n    + \"\\n\"\n    + ((stack1 = helpers[\"if\"].call(alias1,(depth0 != null ? depth0.OAuthSchemeKey : depth0),{\"name\":\"if\",\"hash\":{},\"fn\":container.program(11, data, 0),\"inverse\":container.noop,\"data\":data})) != null ? stack1 : \"\")\n    + \"                </span>\\n            </li>\\n\";\n},\"11\":function(container,depth0,helpers,partials,data) {\n    var stack1;\n\n  return \"                        (\"\n    + ((stack1 = (helpers.escape || (depth0 && depth0.escape) || helpers.helperMissing).call(depth0 != null ? depth0 : {},(depth0 != null ? depth0.OAuthSchemeKey : depth0),{\"name\":\"escape\",\"hash\":{},\"data\":data})) != null ? stack1 : \"\")\n    + \")\\n\";\n},\"compiler\":[7,\">= 4.0.0\"],\"main\":function(container,depth0,helpers,partials,data) {\n    var stack1, alias1=depth0 != null ? depth0 : {}, alias2=helpers.helperMissing;\n\n  return \"<div>\\n    <h3 class=\\\"auth__title\\\">OAuth2.0</h3>\\n    <p>\"\n    + ((stack1 = (helpers.sanitize || (depth0 && depth0.sanitize) || alias2).call(alias1,(depth0 != null ? depth0.description : depth0),{\"name\":\"sanitize\",\"hash\":{},\"data\":data})) != null ? stack1 : \"\")\n    + \"</p>\\n    \"\n    + ((stack1 = helpers[\"if\"].call(alias1,(depth0 != null ? depth0.authorizationUrl : depth0),{\"name\":\"if\",\"hash\":{},\"fn\":container.program(1, data, 0),\"inverse\":container.noop,\"data\":data})) != null ? stack1 : \"\")\n    + \"\\n    \"\n    + ((stack1 = helpers[\"if\"].call(alias1,(depth0 != null ? depth0.tokenUrl : depth0),{\"name\":\"if\",\"hash\":{},\"fn\":container.program(3, data, 0),\"inverse\":container.noop,\"data\":data})) != null ? stack1 : \"\")\n    + \"\\n    <p>flow: \"\n    + ((stack1 = (helpers.escape || (depth0 && depth0.escape) || alias2).call(alias1,(depth0 != null ? depth0.flow : depth0),{\"name\":\"escape\",\"hash\":{},\"data\":data})) != null ? stack1 : \"\")\n    + \"</p>\\n\"\n    + ((stack1 = helpers[\"if\"].call(alias1,(depth0 != null ? depth0.isPasswordFlow : depth0),{\"name\":\"if\",\"hash\":{},\"fn\":container.program(5, data, 0),\"inverse\":container.noop,\"data\":data})) != null ? stack1 : \"\")\n    + ((stack1 = helpers[\"if\"].call(alias1,(depth0 != null ? depth0.clientAuthentication : depth0),{\"name\":\"if\",\"hash\":{},\"fn\":container.program(7, data, 0),\"inverse\":container.noop,\"data\":data})) != null ? stack1 : \"\")\n    + \"    <p><strong> \"\n    + ((stack1 = (helpers.escape || (depth0 && depth0.escape) || alias2).call(alias1,(depth0 != null ? depth0.appName : depth0),{\"name\":\"escape\",\"hash\":{},\"data\":data})) != null ? stack1 : \"\")\n    + \" </strong> API requires the following scopes. Select which ones you want to grant to Swagger UI.</p>\\n    <p>Scopes are used to grant an application different levels of access to data on behalf of the end user. Each API may declare one or more scopes.\\n        <a href=\\\"#\\\">Learn how to use</a>\\n    </p>\\n    <ul class=\\\"api-popup-scopes\\\">\\n\"\n    + ((stack1 = helpers.each.call(alias1,(depth0 != null ? depth0.scopes : depth0),{\"name\":\"each\",\"hash\":{},\"fn\":container.program(10, data, 0),\"inverse\":container.noop,\"data\":data})) != null ? stack1 : \"\")\n    + \"    </ul>\\n</div>\";\n},\"useData\":true});\ntemplates['operation'] = template({\"1\":function(container,depth0,helpers,partials,data) {\n    return \"deprecated\";\n},\"3\":function(container,depth0,helpers,partials,data) {\n    return \"            <h4><span data-sw-translate>Warning: Deprecated</span></h4>\\n\";\n},\"5\":function(container,depth0,helpers,partials,data) {\n    var stack1;\n\n  return \"        <h4><span data-sw-translate>Implementation Notes</span></h4>\\n        <div class=\\\"markdown\\\">\"\n    + ((stack1 = (helpers.sanitize || (depth0 && depth0.sanitize) || helpers.helperMissing).call(depth0 != null ? depth0 : {},(depth0 != null ? depth0.description : depth0),{\"name\":\"sanitize\",\"hash\":{},\"data\":data})) != null ? stack1 : \"\")\n    + \"</div>\\n\";\n},\"7\":function(container,depth0,helpers,partials,data) {\n    return \"            <div class='authorize-wrapper authorize-wrapper_operation'></div>\\n\";\n},\"9\":function(container,depth0,helpers,partials,data) {\n    var stack1, alias1=depth0 != null ? depth0 : {};\n\n  return \"          <div class=\\\"response-class\\\">\\n            <h4><span data-sw-translate>Response Class</span> (<span data-sw-translate>Status</span> \"\n    + ((stack1 = (helpers.escape || (depth0 && depth0.escape) || helpers.helperMissing).call(alias1,(depth0 != null ? depth0.successCode : depth0),{\"name\":\"escape\",\"hash\":{},\"data\":data})) != null ? stack1 : \"\")\n    + \")</h4>\\n              \"\n    + ((stack1 = helpers[\"if\"].call(alias1,(depth0 != null ? depth0.successDescription : depth0),{\"name\":\"if\",\"hash\":{},\"fn\":container.program(10, data, 0),\"inverse\":container.noop,\"data\":data})) != null ? stack1 : \"\")\n    + \"\\n            <p><span class=\\\"model-signature\\\" /></p>\\n            <br/>\\n            <div class=\\\"response-content-type\\\" />\\n            </div>\\n\";\n},\"10\":function(container,depth0,helpers,partials,data) {\n    var stack1;\n\n  return \"<div class=\\\"markdown\\\">\"\n    + ((stack1 = (helpers.sanitize || (depth0 && depth0.sanitize) || helpers.helperMissing).call(depth0 != null ? depth0 : {},(depth0 != null ? depth0.successDescription : depth0),{\"name\":\"sanitize\",\"hash\":{},\"data\":data})) != null ? stack1 : \"\")\n    + \"</div>\";\n},\"12\":function(container,depth0,helpers,partials,data) {\n    var stack1;\n\n  return \"          <h4 data-sw-translate>Headers</h4>\\n          <table class=\\\"headers\\\">\\n            <thead>\\n              <tr>\\n                <th style=\\\"width: 100px; max-width: 100px\\\" data-sw-translate>Header</th>\\n                <th style=\\\"width: 310px; max-width: 310px\\\" data-sw-translate>Description</th>\\n                <th style=\\\"width: 200px; max-width: 200px\\\" data-sw-translate>Type</th>\\n                <th style=\\\"width: 320px; max-width: 320px\\\" data-sw-translate>Other</th>\\n              </tr>\\n            </thead>\\n            <tbody>\\n\"\n    + ((stack1 = helpers.each.call(depth0 != null ? depth0 : {},(depth0 != null ? depth0.headers : depth0),{\"name\":\"each\",\"hash\":{},\"fn\":container.program(13, data, 0),\"inverse\":container.noop,\"data\":data})) != null ? stack1 : \"\")\n    + \"            </tbody>\\n          </table>\\n\";\n},\"13\":function(container,depth0,helpers,partials,data) {\n    var stack1, helper, alias1=depth0 != null ? depth0 : {}, alias2=helpers.helperMissing;\n\n  return \"              <tr>\\n                <td>\"\n    + container.escapeExpression(((helper = (helper = helpers.key || (data && data.key)) != null ? helper : alias2),(typeof helper === \"function\" ? helper.call(alias1,{\"name\":\"key\",\"hash\":{},\"data\":data}) : helper)))\n    + \"</td>\\n                <td>\"\n    + ((stack1 = (helpers.sanitize || (depth0 && depth0.sanitize) || alias2).call(alias1,(depth0 != null ? depth0.description : depth0),{\"name\":\"sanitize\",\"hash\":{},\"data\":data})) != null ? stack1 : \"\")\n    + \"</td>\\n                <td>\"\n    + ((stack1 = (helpers.escape || (depth0 && depth0.escape) || alias2).call(alias1,(depth0 != null ? depth0.type : depth0),{\"name\":\"escape\",\"hash\":{},\"data\":data})) != null ? stack1 : \"\")\n    + \"</td>\\n                <td>\"\n    + ((stack1 = (helpers.escape || (depth0 && depth0.escape) || alias2).call(alias1,(depth0 != null ? depth0.other : depth0),{\"name\":\"escape\",\"hash\":{},\"data\":data})) != null ? stack1 : \"\")\n    + \"</td>\\n              </tr>\\n\";\n},\"15\":function(container,depth0,helpers,partials,data) {\n    return \"          <h4 data-sw-translate>Parameters</h4>\\n          <table class='fullwidth parameters'>\\n          <thead>\\n            <tr>\\n            <th style=\\\"width: 100px; max-width: 100px\\\" data-sw-translate>Parameter</th>\\n            <th style=\\\"width: 310px; max-width: 310px\\\" data-sw-translate>Value</th>\\n            <th style=\\\"width: 200px; max-width: 200px\\\" data-sw-translate>Description</th>\\n            <th style=\\\"width: 100px; max-width: 100px\\\" data-sw-translate>Parameter Type</th>\\n            <th style=\\\"width: 220px; max-width: 230px\\\" data-sw-translate>Data Type</th>\\n            </tr>\\n          </thead>\\n          <tbody class=\\\"operation-params\\\">\\n\\n          </tbody>\\n          </table>\\n\";\n},\"17\":function(container,depth0,helpers,partials,data) {\n    return \"          <div style='margin:0;padding:0;display:inline'></div>\\n          <h4 data-sw-translate>Response Messages</h4>\\n          <table class='fullwidth response-messages'>\\n            <thead>\\n            <tr>\\n              <th data-sw-translate>HTTP Status Code</th>\\n              <th data-sw-translate>Reason</th>\\n              <th data-sw-translate>Response Model</th>\\n              <th data-sw-translate>Headers</th>\\n            </tr>\\n            </thead>\\n            <tbody class=\\\"operation-status\\\">\\n            </tbody>\\n          </table>\\n\";\n},\"19\":function(container,depth0,helpers,partials,data) {\n    return \"\";\n},\"21\":function(container,depth0,helpers,partials,data) {\n    return \"          <div class='sandbox_header'>\\n            <input class='submit' type='submit' value='Try it out!' data-sw-translate/>\\n            <a href='#' class='response_hider' style='display:none' data-sw-translate>Hide Response</a>\\n            <span class='response_throbber' style='display:none'></span>\\n          </div>\\n\";\n},\"23\":function(container,depth0,helpers,partials,data) {\n    return \"          <h4 data-sw-translate>Request Headers</h4>\\n          <div class='block request_headers'></div>\\n\";\n},\"compiler\":[7,\">= 4.0.0\"],\"main\":function(container,depth0,helpers,partials,data) {\n    var stack1, alias1=depth0 != null ? depth0 : {}, alias2=helpers.helperMissing, alias3=container.escapeExpression;\n\n  return \"  <ul class='operations' >\\n    <li class='\"\n    + ((stack1 = (helpers.escape || (depth0 && depth0.escape) || alias2).call(alias1,(depth0 != null ? depth0.method : depth0),{\"name\":\"escape\",\"hash\":{},\"data\":data})) != null ? stack1 : \"\")\n    + \" operation' id='\"\n    + ((stack1 = (helpers.escape || (depth0 && depth0.escape) || alias2).call(alias1,(depth0 != null ? depth0.parentId : depth0),{\"name\":\"escape\",\"hash\":{},\"data\":data})) != null ? stack1 : \"\")\n    + \"_\"\n    + ((stack1 = (helpers.escape || (depth0 && depth0.escape) || alias2).call(alias1,(depth0 != null ? depth0.nickname : depth0),{\"name\":\"escape\",\"hash\":{},\"data\":data})) != null ? stack1 : \"\")\n    + \"'>\\n      <div class='heading'>\\n        <h3>\\n          <span class='http_method'>\\n          <a href='#!/\"\n    + alias3((helpers.sanitize || (depth0 && depth0.sanitize) || alias2).call(alias1,(depth0 != null ? depth0.encodedParentId : depth0),{\"name\":\"sanitize\",\"hash\":{},\"data\":data}))\n    + \"/\"\n    + alias3((helpers.sanitize || (depth0 && depth0.sanitize) || alias2).call(alias1,(depth0 != null ? depth0.nickname : depth0),{\"name\":\"sanitize\",\"hash\":{},\"data\":data}))\n    + \"' class=\\\"toggleOperation\\\">\"\n    + ((stack1 = (helpers.escape || (depth0 && depth0.escape) || alias2).call(alias1,(depth0 != null ? depth0.method : depth0),{\"name\":\"escape\",\"hash\":{},\"data\":data})) != null ? stack1 : \"\")\n    + \"</a>\\n          </span>\\n          <span class='path'>\\n          <a href='#!/\"\n    + alias3((helpers.sanitize || (depth0 && depth0.sanitize) || alias2).call(alias1,(depth0 != null ? depth0.encodedParentId : depth0),{\"name\":\"sanitize\",\"hash\":{},\"data\":data}))\n    + \"/\"\n    + alias3((helpers.sanitize || (depth0 && depth0.sanitize) || alias2).call(alias1,(depth0 != null ? depth0.nickname : depth0),{\"name\":\"sanitize\",\"hash\":{},\"data\":data}))\n    + \"' class=\\\"toggleOperation \"\n    + ((stack1 = helpers[\"if\"].call(alias1,(depth0 != null ? depth0.deprecated : depth0),{\"name\":\"if\",\"hash\":{},\"fn\":container.program(1, data, 0),\"inverse\":container.noop,\"data\":data})) != null ? stack1 : \"\")\n    + \"\\\">\"\n    + ((stack1 = (helpers.escape || (depth0 && depth0.escape) || alias2).call(alias1,(depth0 != null ? depth0.path : depth0),{\"name\":\"escape\",\"hash\":{},\"data\":data})) != null ? stack1 : \"\")\n    + \"</a>\\n          </span>\\n        </h3>\\n        <ul class='options'>\\n          <li>\\n          <a href='#!/\"\n    + alias3((helpers.sanitize || (depth0 && depth0.sanitize) || alias2).call(alias1,(depth0 != null ? depth0.encodedParentId : depth0),{\"name\":\"sanitize\",\"hash\":{},\"data\":data}))\n    + \"/\"\n    + alias3((helpers.sanitize || (depth0 && depth0.sanitize) || alias2).call(alias1,(depth0 != null ? depth0.nickname : depth0),{\"name\":\"sanitize\",\"hash\":{},\"data\":data}))\n    + \"' class=\\\"toggleOperation\\\"><span class=\\\"markdown\\\">\"\n    + ((stack1 = (helpers.escape || (depth0 && depth0.escape) || alias2).call(alias1,(depth0 != null ? depth0.summary : depth0),{\"name\":\"escape\",\"hash\":{},\"data\":data})) != null ? stack1 : \"\")\n    + \"</span></a>\\n          </li>\\n        </ul>\\n      </div>\\n      <div class='content' id='\"\n    + alias3((helpers.sanitize || (depth0 && depth0.sanitize) || alias2).call(alias1,(depth0 != null ? depth0.encodedParentId : depth0),{\"name\":\"sanitize\",\"hash\":{},\"data\":data}))\n    + \"_\"\n    + alias3((helpers.sanitize || (depth0 && depth0.sanitize) || alias2).call(alias1,(depth0 != null ? depth0.nickname : depth0),{\"name\":\"sanitize\",\"hash\":{},\"data\":data}))\n    + \"_content' style='display:none'>\\n\"\n    + ((stack1 = helpers[\"if\"].call(alias1,(depth0 != null ? depth0.deprecated : depth0),{\"name\":\"if\",\"hash\":{},\"fn\":container.program(3, data, 0),\"inverse\":container.noop,\"data\":data})) != null ? stack1 : \"\")\n    + ((stack1 = helpers[\"if\"].call(alias1,(depth0 != null ? depth0.description : depth0),{\"name\":\"if\",\"hash\":{},\"fn\":container.program(5, data, 0),\"inverse\":container.noop,\"data\":data})) != null ? stack1 : \"\")\n    + ((stack1 = helpers[\"if\"].call(alias1,(depth0 != null ? depth0.security : depth0),{\"name\":\"if\",\"hash\":{},\"fn\":container.program(7, data, 0),\"inverse\":container.noop,\"data\":data})) != null ? stack1 : \"\")\n    + ((stack1 = helpers[\"if\"].call(alias1,(depth0 != null ? depth0.type : depth0),{\"name\":\"if\",\"hash\":{},\"fn\":container.program(9, data, 0),\"inverse\":container.noop,\"data\":data})) != null ? stack1 : \"\")\n    + \"\\n\"\n    + ((stack1 = helpers[\"if\"].call(alias1,(depth0 != null ? depth0.headers : depth0),{\"name\":\"if\",\"hash\":{},\"fn\":container.program(12, data, 0),\"inverse\":container.noop,\"data\":data})) != null ? stack1 : \"\")\n    + \"\\n        <form accept-charset='UTF-8' class='sandbox'>\\n          <div style='margin:0;padding:0;display:inline'></div>\\n\"\n    + ((stack1 = helpers[\"if\"].call(alias1,(depth0 != null ? depth0.parameters : depth0),{\"name\":\"if\",\"hash\":{},\"fn\":container.program(15, data, 0),\"inverse\":container.noop,\"data\":data})) != null ? stack1 : \"\")\n    + ((stack1 = helpers[\"if\"].call(alias1,(depth0 != null ? depth0.responseMessages : depth0),{\"name\":\"if\",\"hash\":{},\"fn\":container.program(17, data, 0),\"inverse\":container.noop,\"data\":data})) != null ? stack1 : \"\")\n    + ((stack1 = helpers[\"if\"].call(alias1,(depth0 != null ? depth0.isReadOnly : depth0),{\"name\":\"if\",\"hash\":{},\"fn\":container.program(19, data, 0),\"inverse\":container.program(21, data, 0),\"data\":data})) != null ? stack1 : \"\")\n    + \"        </form>\\n        <div class='response' style='display:none'>\\n          <h4 class='curl'>Curl</h4>\\n          <div class='block curl'></div>\\n          <h4 data-sw-translate>Request URL</h4>\\n          <div class='block request_url'></div>\\n\"\n    + ((stack1 = helpers[\"if\"].call(alias1,(depth0 != null ? depth0.showRequestHeaders : depth0),{\"name\":\"if\",\"hash\":{},\"fn\":container.program(23, data, 0),\"inverse\":container.noop,\"data\":data})) != null ? stack1 : \"\")\n    + \"          <h4 data-sw-translate>Response Body</h4>\\n          <div class='block response_body'></div>\\n          <h4 data-sw-translate>Response Code</h4>\\n          <div class='block response_code'></div>\\n          <h4 data-sw-translate>Response Headers</h4>\\n          <div class='block response_headers'></div>\\n        </div>\\n      </div>\\n    </li>\\n  </ul>\\n\";\n},\"useData\":true});\ntemplates['param'] = template({\"1\":function(container,depth0,helpers,partials,data) {\n    var stack1;\n\n  return ((stack1 = helpers[\"if\"].call(depth0 != null ? depth0 : {},(depth0 != null ? depth0.isFile : depth0),{\"name\":\"if\",\"hash\":{},\"fn\":container.program(2, data, 0),\"inverse\":container.program(4, data, 0),\"data\":data})) != null ? stack1 : \"\");\n},\"2\":function(container,depth0,helpers,partials,data) {\n    var stack1, alias1=depth0 != null ? depth0 : {}, alias2=helpers.helperMissing;\n\n  return \"\t\t\t<input type=\\\"file\\\" name='\"\n    + ((stack1 = (helpers.escape || (depth0 && depth0.escape) || alias2).call(alias1,(depth0 != null ? depth0.name : depth0),{\"name\":\"escape\",\"hash\":{},\"data\":data})) != null ? stack1 : \"\")\n    + \"' id='\"\n    + ((stack1 = (helpers.escape || (depth0 && depth0.escape) || alias2).call(alias1,(depth0 != null ? depth0.valueId : depth0),{\"name\":\"escape\",\"hash\":{},\"data\":data})) != null ? stack1 : \"\")\n    + \"'/>\\n\t\t\t<div class=\\\"parameter-content-type\\\" />\\n\";\n},\"4\":function(container,depth0,helpers,partials,data) {\n    var stack1;\n\n  return ((stack1 = helpers[\"if\"].call(depth0 != null ? depth0 : {},(depth0 != null ? depth0[\"default\"] : depth0),{\"name\":\"if\",\"hash\":{},\"fn\":container.program(5, data, 0),\"inverse\":container.program(7, data, 0),\"data\":data})) != null ? stack1 : \"\");\n},\"5\":function(container,depth0,helpers,partials,data) {\n    var stack1, alias1=depth0 != null ? depth0 : {}, alias2=helpers.helperMissing;\n\n  return \"\t\t\t\t<div class=\\\"editor_holder\\\"></div>\\n\t\t\t\t<textarea class='body-textarea' name='\"\n    + ((stack1 = (helpers.escape || (depth0 && depth0.escape) || alias2).call(alias1,(depth0 != null ? depth0.name : depth0),{\"name\":\"escape\",\"hash\":{},\"data\":data})) != null ? stack1 : \"\")\n    + \"' id='\"\n    + ((stack1 = (helpers.escape || (depth0 && depth0.escape) || alias2).call(alias1,(depth0 != null ? depth0.valueId : depth0),{\"name\":\"escape\",\"hash\":{},\"data\":data})) != null ? stack1 : \"\")\n    + \"'>\"\n    + ((stack1 = (helpers.escape || (depth0 && depth0.escape) || alias2).call(alias1,(depth0 != null ? depth0[\"default\"] : depth0),{\"name\":\"escape\",\"hash\":{},\"data\":data})) != null ? stack1 : \"\")\n    + \"</textarea>\\n        <br />\\n        <div class=\\\"parameter-content-type\\\" />\\n\";\n},\"7\":function(container,depth0,helpers,partials,data) {\n    var stack1, alias1=depth0 != null ? depth0 : {}, alias2=helpers.helperMissing;\n\n  return \"\t\t\t\t<textarea class='body-textarea' name='\"\n    + ((stack1 = (helpers.escape || (depth0 && depth0.escape) || alias2).call(alias1,(depth0 != null ? depth0.name : depth0),{\"name\":\"escape\",\"hash\":{},\"data\":data})) != null ? stack1 : \"\")\n    + \"' id='\"\n    + ((stack1 = (helpers.escape || (depth0 && depth0.escape) || alias2).call(alias1,(depth0 != null ? depth0.valueId : depth0),{\"name\":\"escape\",\"hash\":{},\"data\":data})) != null ? stack1 : \"\")\n    + \"'></textarea>\\n\t\t\t\t<div class=\\\"editor_holder\\\"></div>\\n\t\t\t\t<br />\\n\t\t\t\t<div class=\\\"parameter-content-type\\\" />\\n\";\n},\"9\":function(container,depth0,helpers,partials,data) {\n    var stack1;\n\n  return ((stack1 = helpers[\"if\"].call(depth0 != null ? depth0 : {},(depth0 != null ? depth0.isFile : depth0),{\"name\":\"if\",\"hash\":{},\"fn\":container.program(2, data, 0),\"inverse\":container.program(10, data, 0),\"data\":data})) != null ? stack1 : \"\");\n},\"10\":function(container,depth0,helpers,partials,data) {\n    var stack1;\n\n  return ((stack1 = (helpers.renderTextParam || (depth0 && depth0.renderTextParam) || helpers.helperMissing).call(depth0 != null ? depth0 : {},depth0,{\"name\":\"renderTextParam\",\"hash\":{},\"fn\":container.program(11, data, 0),\"inverse\":container.noop,\"data\":data})) != null ? stack1 : \"\");\n},\"11\":function(container,depth0,helpers,partials,data) {\n    return \"\";\n},\"compiler\":[7,\">= 4.0.0\"],\"main\":function(container,depth0,helpers,partials,data) {\n    var stack1, alias1=depth0 != null ? depth0 : {}, alias2=helpers.helperMissing;\n\n  return \"<td class='code'><label for='\"\n    + ((stack1 = (helpers.escape || (depth0 && depth0.escape) || alias2).call(alias1,(depth0 != null ? depth0.valueId : depth0),{\"name\":\"escape\",\"hash\":{},\"data\":data})) != null ? stack1 : \"\")\n    + \"'>\"\n    + ((stack1 = (helpers.escape || (depth0 && depth0.escape) || alias2).call(alias1,(depth0 != null ? depth0.name : depth0),{\"name\":\"escape\",\"hash\":{},\"data\":data})) != null ? stack1 : \"\")\n    + \"</label></td>\\n<td>\\n\\n\"\n    + ((stack1 = helpers[\"if\"].call(alias1,(depth0 != null ? depth0.isBody : depth0),{\"name\":\"if\",\"hash\":{},\"fn\":container.program(1, data, 0),\"inverse\":container.program(9, data, 0),\"data\":data})) != null ? stack1 : \"\")\n    + \"\\n</td>\\n<td class=\\\"markdown\\\">\"\n    + ((stack1 = (helpers.sanitize || (depth0 && depth0.sanitize) || alias2).call(alias1,(depth0 != null ? depth0.description : depth0),{\"name\":\"sanitize\",\"hash\":{},\"data\":data})) != null ? stack1 : \"\")\n    + \"</td>\\n<td>\"\n    + ((stack1 = (helpers.escape || (depth0 && depth0.escape) || alias2).call(alias1,(depth0 != null ? depth0.paramType : depth0),{\"name\":\"escape\",\"hash\":{},\"data\":data})) != null ? stack1 : \"\")\n    + \"</td>\\n<td>\\n\t<span class=\\\"model-signature\\\"></span>\\n</td>\\n\";\n},\"useData\":true});\ntemplates['param_list'] = template({\"1\":function(container,depth0,helpers,partials,data) {\n    return \" required\";\n},\"3\":function(container,depth0,helpers,partials,data) {\n    return \" multiple=\\\"multiple\\\"\";\n},\"5\":function(container,depth0,helpers,partials,data) {\n    return \" required \";\n},\"7\":function(container,depth0,helpers,partials,data) {\n    var stack1;\n\n  return \"      <option \"\n    + ((stack1 = helpers.unless.call(depth0 != null ? depth0 : {},(depth0 != null ? depth0.hasDefault : depth0),{\"name\":\"unless\",\"hash\":{},\"fn\":container.program(8, data, 0),\"inverse\":container.noop,\"data\":data})) != null ? stack1 : \"\")\n    + \" value=''></option>\\n\";\n},\"8\":function(container,depth0,helpers,partials,data) {\n    return \"  selected=\\\"\\\" \";\n},\"10\":function(container,depth0,helpers,partials,data) {\n    var stack1, alias1=depth0 != null ? depth0 : {}, alias2=helpers.helperMissing;\n\n  return \"\\n      <option \"\n    + ((stack1 = helpers[\"if\"].call(alias1,(depth0 != null ? depth0.isDefault : depth0),{\"name\":\"if\",\"hash\":{},\"fn\":container.program(11, data, 0),\"inverse\":container.noop,\"data\":data})) != null ? stack1 : \"\")\n    + \"  value='\"\n    + ((stack1 = (helpers.sanitize || (depth0 && depth0.sanitize) || alias2).call(alias1,(depth0 != null ? depth0.value : depth0),{\"name\":\"sanitize\",\"hash\":{},\"data\":data})) != null ? stack1 : \"\")\n    + \"'> \"\n    + ((stack1 = (helpers.sanitize || (depth0 && depth0.sanitize) || alias2).call(alias1,(depth0 != null ? depth0.value : depth0),{\"name\":\"sanitize\",\"hash\":{},\"data\":data})) != null ? stack1 : \"\")\n    + \" \"\n    + ((stack1 = helpers[\"if\"].call(alias1,(depth0 != null ? depth0.isDefault : depth0),{\"name\":\"if\",\"hash\":{},\"fn\":container.program(13, data, 0),\"inverse\":container.noop,\"data\":data})) != null ? stack1 : \"\")\n    + \" </option>\\n\\n\";\n},\"11\":function(container,depth0,helpers,partials,data) {\n    return \" selected=\\\"\\\"  \";\n},\"13\":function(container,depth0,helpers,partials,data) {\n    return \" (default) \";\n},\"15\":function(container,depth0,helpers,partials,data) {\n    return \"<strong>\";\n},\"17\":function(container,depth0,helpers,partials,data) {\n    return \"</strong>\";\n},\"compiler\":[7,\">= 4.0.0\"],\"main\":function(container,depth0,helpers,partials,data) {\n    var stack1, helper, alias1=depth0 != null ? depth0 : {}, alias2=helpers.helperMissing;\n\n  return \"<td class='code\"\n    + ((stack1 = helpers[\"if\"].call(alias1,(depth0 != null ? depth0.required : depth0),{\"name\":\"if\",\"hash\":{},\"fn\":container.program(1, data, 0),\"inverse\":container.noop,\"data\":data})) != null ? stack1 : \"\")\n    + \"'><label for='\"\n    + ((stack1 = (helpers.escape || (depth0 && depth0.escape) || alias2).call(alias1,(depth0 != null ? depth0.valueId : depth0),{\"name\":\"escape\",\"hash\":{},\"data\":data})) != null ? stack1 : \"\")\n    + \"'>\"\n    + ((stack1 = (helpers.sanitize || (depth0 && depth0.sanitize) || alias2).call(alias1,(depth0 != null ? depth0.name : depth0),{\"name\":\"sanitize\",\"hash\":{},\"data\":data})) != null ? stack1 : \"\")\n    + \"</label></td>\\n<td>\\n  <select \"\n    + ((stack1 = (helpers.isArray || (depth0 && depth0.isArray) || alias2).call(alias1,depth0,{\"name\":\"isArray\",\"hash\":{},\"fn\":container.program(3, data, 0),\"inverse\":container.noop,\"data\":data})) != null ? stack1 : \"\")\n    + \" class=\\\"parameter \"\n    + ((stack1 = helpers[\"if\"].call(alias1,(depth0 != null ? depth0.required : depth0),{\"name\":\"if\",\"hash\":{},\"fn\":container.program(5, data, 0),\"inverse\":container.noop,\"data\":data})) != null ? stack1 : \"\")\n    + \"\\\" name=\\\"\"\n    + ((stack1 = (helpers.sanitize || (depth0 && depth0.sanitize) || alias2).call(alias1,(depth0 != null ? depth0.name : depth0),{\"name\":\"sanitize\",\"hash\":{},\"data\":data})) != null ? stack1 : \"\")\n    + \"\\\" id=\\\"\"\n    + ((stack1 = (helpers.escape || (depth0 && depth0.escape) || alias2).call(alias1,(depth0 != null ? depth0.valueId : depth0),{\"name\":\"escape\",\"hash\":{},\"data\":data})) != null ? stack1 : \"\")\n    + \"\\\">\\n\\n\"\n    + ((stack1 = helpers.unless.call(alias1,(depth0 != null ? depth0.required : depth0),{\"name\":\"unless\",\"hash\":{},\"fn\":container.program(7, data, 0),\"inverse\":container.noop,\"data\":data})) != null ? stack1 : \"\")\n    + \"\\n\"\n    + ((stack1 = helpers.each.call(alias1,((stack1 = (depth0 != null ? depth0.allowableValues : depth0)) != null ? stack1.descriptiveValues : stack1),{\"name\":\"each\",\"hash\":{},\"fn\":container.program(10, data, 0),\"inverse\":container.noop,\"data\":data})) != null ? stack1 : \"\")\n    + \"\\n  </select>\\n</td>\\n<td class=\\\"markdown\\\">\"\n    + ((stack1 = helpers[\"if\"].call(alias1,(depth0 != null ? depth0.required : depth0),{\"name\":\"if\",\"hash\":{},\"fn\":container.program(15, data, 0),\"inverse\":container.noop,\"data\":data})) != null ? stack1 : \"\")\n    + ((stack1 = ((helper = (helper = helpers.description || (depth0 != null ? depth0.description : depth0)) != null ? helper : alias2),(typeof helper === \"function\" ? helper.call(alias1,{\"name\":\"description\",\"hash\":{},\"data\":data}) : helper))) != null ? stack1 : \"\")\n    + ((stack1 = helpers[\"if\"].call(alias1,(depth0 != null ? depth0.required : depth0),{\"name\":\"if\",\"hash\":{},\"fn\":container.program(17, data, 0),\"inverse\":container.noop,\"data\":data})) != null ? stack1 : \"\")\n    + \"</td>\\n<td>\"\n    + ((stack1 = (helpers.escape || (depth0 && depth0.escape) || alias2).call(alias1,(depth0 != null ? depth0.paramType : depth0),{\"name\":\"escape\",\"hash\":{},\"data\":data})) != null ? stack1 : \"\")\n    + \"</td>\\n<td><span class=\\\"model-signature\\\"></span></td>\\n\";\n},\"useData\":true});\ntemplates['param_readonly'] = template({\"1\":function(container,depth0,helpers,partials,data) {\n    var stack1, alias1=depth0 != null ? depth0 : {}, alias2=helpers.helperMissing;\n\n  return \"        <textarea class='body-textarea' readonly='readonly' name='\"\n    + ((stack1 = (helpers.sanitize || (depth0 && depth0.sanitize) || alias2).call(alias1,(depth0 != null ? depth0.name : depth0),{\"name\":\"sanitize\",\"hash\":{},\"data\":data})) != null ? stack1 : \"\")\n    + \"' id='\"\n    + ((stack1 = (helpers.escape || (depth0 && depth0.escape) || alias2).call(alias1,(depth0 != null ? depth0.valueId : depth0),{\"name\":\"escape\",\"hash\":{},\"data\":data})) != null ? stack1 : \"\")\n    + \"'>\"\n    + ((stack1 = (helpers.sanitize || (depth0 && depth0.sanitize) || alias2).call(alias1,(depth0 != null ? depth0[\"default\"] : depth0),{\"name\":\"sanitize\",\"hash\":{},\"data\":data})) != null ? stack1 : \"\")\n    + \"</textarea>\\n        <div class=\\\"parameter-content-type\\\" />\\n\";\n},\"3\":function(container,depth0,helpers,partials,data) {\n    var stack1;\n\n  return ((stack1 = helpers[\"if\"].call(depth0 != null ? depth0 : {},(depth0 != null ? depth0[\"default\"] : depth0),{\"name\":\"if\",\"hash\":{},\"fn\":container.program(4, data, 0),\"inverse\":container.program(6, data, 0),\"data\":data})) != null ? stack1 : \"\");\n},\"4\":function(container,depth0,helpers,partials,data) {\n    var stack1;\n\n  return \"            \"\n    + ((stack1 = (helpers.sanitize || (depth0 && depth0.sanitize) || helpers.helperMissing).call(depth0 != null ? depth0 : {},(depth0 != null ? depth0[\"default\"] : depth0),{\"name\":\"sanitize\",\"hash\":{},\"data\":data})) != null ? stack1 : \"\")\n    + \"\\n\";\n},\"6\":function(container,depth0,helpers,partials,data) {\n    return \"            (empty)\\n\";\n},\"compiler\":[7,\">= 4.0.0\"],\"main\":function(container,depth0,helpers,partials,data) {\n    var stack1, alias1=depth0 != null ? depth0 : {}, alias2=helpers.helperMissing;\n\n  return \"<td class='code'><label for='\"\n    + ((stack1 = (helpers.escape || (depth0 && depth0.escape) || alias2).call(alias1,(depth0 != null ? depth0.valueId : depth0),{\"name\":\"escape\",\"hash\":{},\"data\":data})) != null ? stack1 : \"\")\n    + \"'>\"\n    + ((stack1 = (helpers.sanitize || (depth0 && depth0.sanitize) || alias2).call(alias1,(depth0 != null ? depth0.name : depth0),{\"name\":\"sanitize\",\"hash\":{},\"data\":data})) != null ? stack1 : \"\")\n    + \"</label></td>\\n<td>\\n\"\n    + ((stack1 = helpers[\"if\"].call(alias1,(depth0 != null ? depth0.isBody : depth0),{\"name\":\"if\",\"hash\":{},\"fn\":container.program(1, data, 0),\"inverse\":container.program(3, data, 0),\"data\":data})) != null ? stack1 : \"\")\n    + \"</td>\\n<td class=\\\"markdown\\\">\"\n    + ((stack1 = (helpers.sanitize || (depth0 && depth0.sanitize) || alias2).call(alias1,(depth0 != null ? depth0.description : depth0),{\"name\":\"sanitize\",\"hash\":{},\"data\":data})) != null ? stack1 : \"\")\n    + \"</td>\\n<td>\"\n    + ((stack1 = (helpers.escape || (depth0 && depth0.escape) || alias2).call(alias1,(depth0 != null ? depth0.paramType : depth0),{\"name\":\"escape\",\"hash\":{},\"data\":data})) != null ? stack1 : \"\")\n    + \"</td>\\n<td><span class=\\\"model-signature\\\"></span></td>\\n\";\n},\"useData\":true});\ntemplates['param_readonly_required'] = template({\"1\":function(container,depth0,helpers,partials,data) {\n    var stack1, alias1=depth0 != null ? depth0 : {}, alias2=helpers.helperMissing;\n\n  return \"        <textarea class='body-textarea' readonly='readonly' placeholder='(required)' name='\"\n    + ((stack1 = (helpers.sanitize || (depth0 && depth0.sanitize) || alias2).call(alias1,(depth0 != null ? depth0.name : depth0),{\"name\":\"sanitize\",\"hash\":{},\"data\":data})) != null ? stack1 : \"\")\n    + \"' id='\"\n    + ((stack1 = (helpers.escape || (depth0 && depth0.escape) || alias2).call(alias1,(depth0 != null ? depth0.valueId : depth0),{\"name\":\"escape\",\"hash\":{},\"data\":data})) != null ? stack1 : \"\")\n    + \"'>\"\n    + ((stack1 = (helpers.sanitize || (depth0 && depth0.sanitize) || alias2).call(alias1,(depth0 != null ? depth0[\"default\"] : depth0),{\"name\":\"sanitize\",\"hash\":{},\"data\":data})) != null ? stack1 : \"\")\n    + \"</textarea>\\n\";\n},\"3\":function(container,depth0,helpers,partials,data) {\n    var stack1;\n\n  return ((stack1 = helpers[\"if\"].call(depth0 != null ? depth0 : {},(depth0 != null ? depth0[\"default\"] : depth0),{\"name\":\"if\",\"hash\":{},\"fn\":container.program(4, data, 0),\"inverse\":container.program(6, data, 0),\"data\":data})) != null ? stack1 : \"\");\n},\"4\":function(container,depth0,helpers,partials,data) {\n    var stack1;\n\n  return \"            \"\n    + ((stack1 = (helpers.sanitize || (depth0 && depth0.sanitize) || helpers.helperMissing).call(depth0 != null ? depth0 : {},(depth0 != null ? depth0[\"default\"] : depth0),{\"name\":\"sanitize\",\"hash\":{},\"data\":data})) != null ? stack1 : \"\")\n    + \"\\n\";\n},\"6\":function(container,depth0,helpers,partials,data) {\n    return \"            (empty)\\n\";\n},\"compiler\":[7,\">= 4.0.0\"],\"main\":function(container,depth0,helpers,partials,data) {\n    var stack1, alias1=depth0 != null ? depth0 : {}, alias2=helpers.helperMissing;\n\n  return \"<td class='code required'><label for='\"\n    + ((stack1 = (helpers.escape || (depth0 && depth0.escape) || alias2).call(alias1,(depth0 != null ? depth0.valueId : depth0),{\"name\":\"escape\",\"hash\":{},\"data\":data})) != null ? stack1 : \"\")\n    + \"'>\"\n    + ((stack1 = (helpers.sanitize || (depth0 && depth0.sanitize) || alias2).call(alias1,(depth0 != null ? depth0.name : depth0),{\"name\":\"sanitize\",\"hash\":{},\"data\":data})) != null ? stack1 : \"\")\n    + \"</label></td>\\n<td>\\n\"\n    + ((stack1 = helpers[\"if\"].call(alias1,(depth0 != null ? depth0.isBody : depth0),{\"name\":\"if\",\"hash\":{},\"fn\":container.program(1, data, 0),\"inverse\":container.program(3, data, 0),\"data\":data})) != null ? stack1 : \"\")\n    + \"</td>\\n<td class=\\\"markdown\\\">\"\n    + ((stack1 = (helpers.sanitize || (depth0 && depth0.sanitize) || alias2).call(alias1,(depth0 != null ? depth0.description : depth0),{\"name\":\"sanitize\",\"hash\":{},\"data\":data})) != null ? stack1 : \"\")\n    + \"</td>\\n<td>\"\n    + ((stack1 = (helpers.escape || (depth0 && depth0.escape) || alias2).call(alias1,(depth0 != null ? depth0.paramType : depth0),{\"name\":\"escape\",\"hash\":{},\"data\":data})) != null ? stack1 : \"\")\n    + \"</td>\\n<td><span class=\\\"model-signature\\\"></span></td>\\n\";\n},\"useData\":true});\ntemplates['param_required'] = template({\"1\":function(container,depth0,helpers,partials,data) {\n    var stack1;\n\n  return ((stack1 = helpers[\"if\"].call(depth0 != null ? depth0 : {},(depth0 != null ? depth0.isFile : depth0),{\"name\":\"if\",\"hash\":{},\"fn\":container.program(2, data, 0),\"inverse\":container.program(4, data, 0),\"data\":data})) != null ? stack1 : \"\");\n},\"2\":function(container,depth0,helpers,partials,data) {\n    var stack1, alias1=depth0 != null ? depth0 : {}, alias2=helpers.helperMissing;\n\n  return \"\t\t\t<input type=\\\"file\\\" name='\"\n    + ((stack1 = (helpers.escape || (depth0 && depth0.escape) || alias2).call(alias1,(depth0 != null ? depth0.name : depth0),{\"name\":\"escape\",\"hash\":{},\"data\":data})) != null ? stack1 : \"\")\n    + \"' id='\"\n    + ((stack1 = (helpers.escape || (depth0 && depth0.escape) || alias2).call(alias1,(depth0 != null ? depth0.valueId : depth0),{\"name\":\"escape\",\"hash\":{},\"data\":data})) != null ? stack1 : \"\")\n    + \"'/>\\n\";\n},\"4\":function(container,depth0,helpers,partials,data) {\n    var stack1;\n\n  return ((stack1 = helpers[\"if\"].call(depth0 != null ? depth0 : {},(depth0 != null ? depth0[\"default\"] : depth0),{\"name\":\"if\",\"hash\":{},\"fn\":container.program(5, data, 0),\"inverse\":container.program(7, data, 0),\"data\":data})) != null ? stack1 : \"\");\n},\"5\":function(container,depth0,helpers,partials,data) {\n    var stack1, alias1=depth0 != null ? depth0 : {}, alias2=helpers.helperMissing;\n\n  return \"\t\t\t\t<div class=\\\"editor_holder\\\"></div>\\n\t\t\t\t<textarea class='body-textarea required' placeholder='(required)' name='\"\n    + ((stack1 = (helpers.sanitize || (depth0 && depth0.sanitize) || alias2).call(alias1,(depth0 != null ? depth0.name : depth0),{\"name\":\"sanitize\",\"hash\":{},\"data\":data})) != null ? stack1 : \"\")\n    + \"' id=\\\"\"\n    + ((stack1 = (helpers.escape || (depth0 && depth0.escape) || alias2).call(alias1,(depth0 != null ? depth0.valueId : depth0),{\"name\":\"escape\",\"hash\":{},\"data\":data})) != null ? stack1 : \"\")\n    + \"\\\">\"\n    + ((stack1 = (helpers.sanitize || (depth0 && depth0.sanitize) || alias2).call(alias1,(depth0 != null ? depth0[\"default\"] : depth0),{\"name\":\"sanitize\",\"hash\":{},\"data\":data})) != null ? stack1 : \"\")\n    + \"</textarea>\\n        <br />\\n        <div class=\\\"parameter-content-type\\\" />\\n\";\n},\"7\":function(container,depth0,helpers,partials,data) {\n    var stack1, alias1=depth0 != null ? depth0 : {}, alias2=helpers.helperMissing;\n\n  return \"\t\t\t\t<textarea class='body-textarea required' placeholder='(required)' name='\"\n    + ((stack1 = (helpers.sanitize || (depth0 && depth0.sanitize) || alias2).call(alias1,(depth0 != null ? depth0.name : depth0),{\"name\":\"sanitize\",\"hash\":{},\"data\":data})) != null ? stack1 : \"\")\n    + \"' id='\"\n    + ((stack1 = (helpers.escape || (depth0 && depth0.escape) || alias2).call(alias1,(depth0 != null ? depth0.valueId : depth0),{\"name\":\"escape\",\"hash\":{},\"data\":data})) != null ? stack1 : \"\")\n    + \"'></textarea>\\n\t\t\t\t<div class=\\\"editor_holder\\\"></div>\\n\t\t\t\t<br />\\n\t\t\t\t<div class=\\\"parameter-content-type\\\" />\\n\";\n},\"9\":function(container,depth0,helpers,partials,data) {\n    var stack1;\n\n  return ((stack1 = helpers[\"if\"].call(depth0 != null ? depth0 : {},(depth0 != null ? depth0.isFile : depth0),{\"name\":\"if\",\"hash\":{},\"fn\":container.program(10, data, 0),\"inverse\":container.program(12, data, 0),\"data\":data})) != null ? stack1 : \"\");\n},\"10\":function(container,depth0,helpers,partials,data) {\n    var stack1, alias1=depth0 != null ? depth0 : {}, alias2=helpers.helperMissing;\n\n  return \"\t\t\t<input class='parameter required' type='file' name='\"\n    + ((stack1 = (helpers.sanitize || (depth0 && depth0.sanitize) || alias2).call(alias1,(depth0 != null ? depth0.name : depth0),{\"name\":\"sanitize\",\"hash\":{},\"data\":data})) != null ? stack1 : \"\")\n    + \"' id='\"\n    + ((stack1 = (helpers.escape || (depth0 && depth0.escape) || alias2).call(alias1,(depth0 != null ? depth0.valueId : depth0),{\"name\":\"escape\",\"hash\":{},\"data\":data})) != null ? stack1 : \"\")\n    + \"'/>\\n\";\n},\"12\":function(container,depth0,helpers,partials,data) {\n    var stack1;\n\n  return ((stack1 = (helpers.renderTextParam || (depth0 && depth0.renderTextParam) || helpers.helperMissing).call(depth0 != null ? depth0 : {},depth0,{\"name\":\"renderTextParam\",\"hash\":{},\"fn\":container.program(13, data, 0),\"inverse\":container.noop,\"data\":data})) != null ? stack1 : \"\");\n},\"13\":function(container,depth0,helpers,partials,data) {\n    return \"\";\n},\"compiler\":[7,\">= 4.0.0\"],\"main\":function(container,depth0,helpers,partials,data) {\n    var stack1, alias1=depth0 != null ? depth0 : {}, alias2=helpers.helperMissing;\n\n  return \"<td class='code required'><label for='\"\n    + ((stack1 = (helpers.escape || (depth0 && depth0.escape) || alias2).call(alias1,(depth0 != null ? depth0.valueId : depth0),{\"name\":\"escape\",\"hash\":{},\"data\":data})) != null ? stack1 : \"\")\n    + \"'>\"\n    + ((stack1 = (helpers.escape || (depth0 && depth0.escape) || alias2).call(alias1,(depth0 != null ? depth0.name : depth0),{\"name\":\"escape\",\"hash\":{},\"data\":data})) != null ? stack1 : \"\")\n    + \"</label></td>\\n<td>\\n\"\n    + ((stack1 = helpers[\"if\"].call(alias1,(depth0 != null ? depth0.isBody : depth0),{\"name\":\"if\",\"hash\":{},\"fn\":container.program(1, data, 0),\"inverse\":container.program(9, data, 0),\"data\":data})) != null ? stack1 : \"\")\n    + \"</td>\\n<td>\\n\t<strong><span class=\\\"markdown\\\">\"\n    + ((stack1 = (helpers.sanitize || (depth0 && depth0.sanitize) || alias2).call(alias1,(depth0 != null ? depth0.description : depth0),{\"name\":\"sanitize\",\"hash\":{},\"data\":data})) != null ? stack1 : \"\")\n    + \"</span></strong>\\n</td>\\n<td>\"\n    + ((stack1 = (helpers.escape || (depth0 && depth0.escape) || alias2).call(alias1,(depth0 != null ? depth0.paramType : depth0),{\"name\":\"escape\",\"hash\":{},\"data\":data})) != null ? stack1 : \"\")\n    + \"</td>\\n<td><span class=\\\"model-signature\\\"></span></td>\\n\";\n},\"useData\":true});\ntemplates['parameter_content_type'] = template({\"1\":function(container,depth0,helpers,partials,data) {\n    var stack1;\n\n  return ((stack1 = helpers.each.call(depth0 != null ? depth0 : {},(depth0 != null ? depth0.consumes : depth0),{\"name\":\"each\",\"hash\":{},\"fn\":container.program(2, data, 0),\"inverse\":container.noop,\"data\":data})) != null ? stack1 : \"\");\n},\"2\":function(container,depth0,helpers,partials,data) {\n    var stack1, alias1=depth0 != null ? depth0 : {}, alias2=helpers.helperMissing;\n\n  return \"  <option value=\\\"\"\n    + ((stack1 = (helpers.sanitize || (depth0 && depth0.sanitize) || alias2).call(alias1,depth0,{\"name\":\"sanitize\",\"hash\":{},\"data\":data})) != null ? stack1 : \"\")\n    + \"\\\">\"\n    + ((stack1 = (helpers.sanitize || (depth0 && depth0.sanitize) || alias2).call(alias1,depth0,{\"name\":\"sanitize\",\"hash\":{},\"data\":data})) != null ? stack1 : \"\")\n    + \"</option>\\n\";\n},\"4\":function(container,depth0,helpers,partials,data) {\n    return \"  <option value=\\\"application/json\\\">application/json</option>\\n\";\n},\"compiler\":[7,\">= 4.0.0\"],\"main\":function(container,depth0,helpers,partials,data) {\n    var stack1, helper, alias1=depth0 != null ? depth0 : {}, alias2=helpers.helperMissing;\n\n  return \"<label for=\\\"\"\n    + container.escapeExpression(((helper = (helper = helpers.parameterContentTypeId || (depth0 != null ? depth0.parameterContentTypeId : depth0)) != null ? helper : alias2),(typeof helper === \"function\" ? helper.call(alias1,{\"name\":\"parameterContentTypeId\",\"hash\":{},\"data\":data}) : helper)))\n    + \"\\\" data-sw-translate>Parameter content type:</label>\\n<select name=\\\"parameterContentType\\\" id=\\\"\"\n    + ((stack1 = (helpers.sanitize || (depth0 && depth0.sanitize) || alias2).call(alias1,(depth0 != null ? depth0.parameterContentTypeId : depth0),{\"name\":\"sanitize\",\"hash\":{},\"data\":data})) != null ? stack1 : \"\")\n    + \"\\\">\\n\"\n    + ((stack1 = helpers[\"if\"].call(alias1,(depth0 != null ? depth0.consumes : depth0),{\"name\":\"if\",\"hash\":{},\"fn\":container.program(1, data, 0),\"inverse\":container.program(4, data, 0),\"data\":data})) != null ? stack1 : \"\")\n    + \"</select>\\n\";\n},\"useData\":true});\ntemplates['popup'] = template({\"compiler\":[7,\">= 4.0.0\"],\"main\":function(container,depth0,helpers,partials,data) {\n    var helper;\n\n  return \"<div class=\\\"api-popup-dialog-wrapper\\\">\\n    <div class=\\\"api-popup-title\\\">\"\n    + container.escapeExpression(((helper = (helper = helpers.title || (depth0 != null ? depth0.title : depth0)) != null ? helper : helpers.helperMissing),(typeof helper === \"function\" ? helper.call(depth0 != null ? depth0 : {},{\"name\":\"title\",\"hash\":{},\"data\":data}) : helper)))\n    + \"</div>\\n    <div class=\\\"api-popup-content\\\"></div>\\n    <p class=\\\"error-msg\\\"></p>\\n    <div class=\\\"api-popup-actions\\\">\\n        <button class=\\\"api-popup-cancel api-button gray\\\" type=\\\"button\\\">Cancel</button>\\n    </div>\\n</div>\\n<div class=\\\"api-popup-dialog-shadow\\\"></div>\";\n},\"useData\":true});\ntemplates['resource'] = template({\"1\":function(container,depth0,helpers,partials,data) {\n    return \" : \";\n},\"3\":function(container,depth0,helpers,partials,data) {\n    var stack1;\n\n  return \"    <li>\\n      <a href='\"\n    + ((stack1 = (helpers.sanitize || (depth0 && depth0.sanitize) || helpers.helperMissing).call(depth0 != null ? depth0 : {},(depth0 != null ? depth0.url : depth0),{\"name\":\"sanitize\",\"hash\":{},\"data\":data})) != null ? stack1 : \"\")\n    + \"' data-sw-translate>Raw</a>\\n    </li>\\n\";\n},\"compiler\":[7,\">= 4.0.0\"],\"main\":function(container,depth0,helpers,partials,data) {\n    var stack1, helper, options, alias1=depth0 != null ? depth0 : {}, alias2=helpers.helperMissing, buffer = \n  \"<div class='heading'>\\n  <h2>\\n    <a href='#!/\"\n    + ((stack1 = (helpers.sanitize || (depth0 && depth0.sanitize) || alias2).call(alias1,(depth0 != null ? depth0.id : depth0),{\"name\":\"sanitize\",\"hash\":{},\"data\":data})) != null ? stack1 : \"\")\n    + \"' class=\\\"toggleEndpointList\\\" data-id=\\\"\"\n    + ((stack1 = (helpers.sanitize || (depth0 && depth0.sanitize) || alias2).call(alias1,(depth0 != null ? depth0.id : depth0),{\"name\":\"sanitize\",\"hash\":{},\"data\":data})) != null ? stack1 : \"\")\n    + \"\\\">\"\n    + ((stack1 = (helpers.sanitize || (depth0 && depth0.sanitize) || alias2).call(alias1,(depth0 != null ? depth0.name : depth0),{\"name\":\"sanitize\",\"hash\":{},\"data\":data})) != null ? stack1 : \"\")\n    + \"</a> \";\n  stack1 = ((helper = (helper = helpers.summary || (depth0 != null ? depth0.summary : depth0)) != null ? helper : alias2),(options={\"name\":\"summary\",\"hash\":{},\"fn\":container.program(1, data, 0),\"inverse\":container.noop,\"data\":data}),(typeof helper === \"function\" ? helper.call(alias1,options) : helper));\n  if (!helpers.summary) { stack1 = helpers.blockHelperMissing.call(depth0,stack1,options)}\n  if (stack1 != null) { buffer += stack1; }\n  return buffer + ((stack1 = (helpers.sanitize || (depth0 && depth0.sanitize) || alias2).call(alias1,(depth0 != null ? depth0.summary : depth0),{\"name\":\"sanitize\",\"hash\":{},\"data\":data})) != null ? stack1 : \"\")\n    + \"\\n  </h2>\\n  <ul class='options'>\\n    <li>\\n      <a href='#!/\"\n    + ((stack1 = (helpers.sanitize || (depth0 && depth0.sanitize) || alias2).call(alias1,(depth0 != null ? depth0.id : depth0),{\"name\":\"sanitize\",\"hash\":{},\"data\":data})) != null ? stack1 : \"\")\n    + \"' id='endpointListTogger_\"\n    + ((stack1 = (helpers.sanitize || (depth0 && depth0.sanitize) || alias2).call(alias1,(depth0 != null ? depth0.id : depth0),{\"name\":\"sanitize\",\"hash\":{},\"data\":data})) != null ? stack1 : \"\")\n    + \"' class=\\\"toggleEndpointList\\\" data-id=\\\"\"\n    + ((stack1 = (helpers.sanitize || (depth0 && depth0.sanitize) || alias2).call(alias1,(depth0 != null ? depth0.id : depth0),{\"name\":\"sanitize\",\"hash\":{},\"data\":data})) != null ? stack1 : \"\")\n    + \"\\\" data-sw-translate>Show/Hide</a>\\n    </li>\\n    <li>\\n      <a href='#' class=\\\"collapseResource\\\" data-id=\\\"\"\n    + ((stack1 = (helpers.sanitize || (depth0 && depth0.sanitize) || alias2).call(alias1,(depth0 != null ? depth0.id : depth0),{\"name\":\"sanitize\",\"hash\":{},\"data\":data})) != null ? stack1 : \"\")\n    + \"\\\" data-sw-translate>\\n        List Operations\\n      </a>\\n    </li>\\n    <li>\\n      <a href='#' class=\\\"expandResource\\\" data-id=\\\"\"\n    + ((stack1 = (helpers.sanitize || (depth0 && depth0.sanitize) || alias2).call(alias1,(depth0 != null ? depth0.id : depth0),{\"name\":\"sanitize\",\"hash\":{},\"data\":data})) != null ? stack1 : \"\")\n    + \"\\\" data-sw-translate>\\n        Expand Operations\\n      </a>\\n    </li>\\n\"\n    + ((stack1 = helpers[\"if\"].call(alias1,(depth0 != null ? depth0.url : depth0),{\"name\":\"if\",\"hash\":{},\"fn\":container.program(3, data, 0),\"inverse\":container.noop,\"data\":data})) != null ? stack1 : \"\")\n    + \"  </ul>\\n</div>\\n<ul class='endpoints' id='\"\n    + ((stack1 = (helpers.sanitize || (depth0 && depth0.sanitize) || alias2).call(alias1,(depth0 != null ? depth0.id : depth0),{\"name\":\"sanitize\",\"hash\":{},\"data\":data})) != null ? stack1 : \"\")\n    + \"_endpoint_list' style='display:none'>\\n\\n</ul>\\n\";\n},\"useData\":true});\ntemplates['response_content_type'] = template({\"1\":function(container,depth0,helpers,partials,data) {\n    var stack1;\n\n  return ((stack1 = helpers.each.call(depth0 != null ? depth0 : {},(depth0 != null ? depth0.produces : depth0),{\"name\":\"each\",\"hash\":{},\"fn\":container.program(2, data, 0),\"inverse\":container.noop,\"data\":data})) != null ? stack1 : \"\");\n},\"2\":function(container,depth0,helpers,partials,data) {\n    var stack1, alias1=depth0 != null ? depth0 : {}, alias2=helpers.helperMissing;\n\n  return \"  <option value=\\\"\"\n    + ((stack1 = (helpers.sanitize || (depth0 && depth0.sanitize) || alias2).call(alias1,depth0,{\"name\":\"sanitize\",\"hash\":{},\"data\":data})) != null ? stack1 : \"\")\n    + \"\\\">\"\n    + ((stack1 = (helpers.sanitize || (depth0 && depth0.sanitize) || alias2).call(alias1,depth0,{\"name\":\"sanitize\",\"hash\":{},\"data\":data})) != null ? stack1 : \"\")\n    + \"</option>\\n\";\n},\"4\":function(container,depth0,helpers,partials,data) {\n    return \"  <option value=\\\"application/json\\\">application/json</option>\\n\";\n},\"compiler\":[7,\">= 4.0.0\"],\"main\":function(container,depth0,helpers,partials,data) {\n    var stack1, helper, alias1=depth0 != null ? depth0 : {}, alias2=helpers.helperMissing, alias3=\"function\", alias4=container.escapeExpression;\n\n  return \"<label data-sw-translate for=\\\"\"\n    + alias4(((helper = (helper = helpers.responseContentTypeId || (depth0 != null ? depth0.responseContentTypeId : depth0)) != null ? helper : alias2),(typeof helper === alias3 ? helper.call(alias1,{\"name\":\"responseContentTypeId\",\"hash\":{},\"data\":data}) : helper)))\n    + \"\\\">Response Content Type</label>\\n<select name=\\\"responseContentType\\\" id=\\\"\"\n    + alias4(((helper = (helper = helpers.responseContentTypeId || (depth0 != null ? depth0.responseContentTypeId : depth0)) != null ? helper : alias2),(typeof helper === alias3 ? helper.call(alias1,{\"name\":\"responseContentTypeId\",\"hash\":{},\"data\":data}) : helper)))\n    + \"\\\">\\n\"\n    + ((stack1 = helpers[\"if\"].call(alias1,(depth0 != null ? depth0.produces : depth0),{\"name\":\"if\",\"hash\":{},\"fn\":container.program(1, data, 0),\"inverse\":container.program(4, data, 0),\"data\":data})) != null ? stack1 : \"\")\n    + \"</select>\\n\";\n},\"useData\":true});\ntemplates['signature'] = template({\"1\":function(container,depth0,helpers,partials,data) {\n    var stack1, alias1=depth0 != null ? depth0 : {};\n\n  return \"\\n<div>\\n<ul class=\\\"signature-nav\\\">\\n  <li><a class=\\\"description-link\\\" href=\\\"#\\\" data-sw-translate>Model</a></li>\\n  <li><a class=\\\"snippet-link\\\" href=\\\"#\\\" data-sw-translate>Example Value</a></li>\\n</ul>\\n<div>\\n\\n<div class=\\\"signature-container\\\">\\n  <div class=\\\"description\\\">\\n      \"\n    + container.escapeExpression((helpers.sanitize || (depth0 && depth0.sanitize) || helpers.helperMissing).call(alias1,(depth0 != null ? depth0.signature : depth0),{\"name\":\"sanitize\",\"hash\":{},\"data\":data}))\n    + \"\\n  </div>\\n\\n  <div class=\\\"snippet\\\">\\n\"\n    + ((stack1 = helpers[\"if\"].call(alias1,(depth0 != null ? depth0.sampleJSON : depth0),{\"name\":\"if\",\"hash\":{},\"fn\":container.program(2, data, 0),\"inverse\":container.noop,\"data\":data})) != null ? stack1 : \"\")\n    + ((stack1 = helpers[\"if\"].call(alias1,(depth0 != null ? depth0.sampleXML : depth0),{\"name\":\"if\",\"hash\":{},\"fn\":container.program(5, data, 0),\"inverse\":container.noop,\"data\":data})) != null ? stack1 : \"\")\n    + \"  </div>\\n</div>\\n\";\n},\"2\":function(container,depth0,helpers,partials,data) {\n    var stack1, alias1=depth0 != null ? depth0 : {};\n\n  return \"      <div class=\\\"snippet_json\\\">\\n        <pre><code>\"\n    + ((stack1 = (helpers.escape || (depth0 && depth0.escape) || helpers.helperMissing).call(alias1,(depth0 != null ? depth0.sampleJSON : depth0),{\"name\":\"escape\",\"hash\":{},\"data\":data})) != null ? stack1 : \"\")\n    + \"</code></pre>\\n        \"\n    + ((stack1 = helpers[\"if\"].call(alias1,(depth0 != null ? depth0.isParam : depth0),{\"name\":\"if\",\"hash\":{},\"fn\":container.program(3, data, 0),\"inverse\":container.noop,\"data\":data})) != null ? stack1 : \"\")\n    + \"\\n      </div>\\n\";\n},\"3\":function(container,depth0,helpers,partials,data) {\n    return \"<small class=\\\"notice\\\" data-sw-translate></small>\";\n},\"5\":function(container,depth0,helpers,partials,data) {\n    var stack1, alias1=depth0 != null ? depth0 : {};\n\n  return \"    <div class=\\\"snippet_xml\\\">\\n      <pre><code>\"\n    + ((stack1 = (helpers.escape || (depth0 && depth0.escape) || helpers.helperMissing).call(alias1,(depth0 != null ? depth0.sampleXML : depth0),{\"name\":\"escape\",\"hash\":{},\"data\":data})) != null ? stack1 : \"\")\n    + \"</code></pre>\\n      \"\n    + ((stack1 = helpers[\"if\"].call(alias1,(depth0 != null ? depth0.isParam : depth0),{\"name\":\"if\",\"hash\":{},\"fn\":container.program(3, data, 0),\"inverse\":container.noop,\"data\":data})) != null ? stack1 : \"\")\n    + \"\\n    </div>\\n\";\n},\"7\":function(container,depth0,helpers,partials,data) {\n    var stack1;\n\n  return \"    \"\n    + ((stack1 = (helpers.escape || (depth0 && depth0.escape) || helpers.helperMissing).call(depth0 != null ? depth0 : {},(depth0 != null ? depth0.signature : depth0),{\"name\":\"escape\",\"hash\":{},\"data\":data})) != null ? stack1 : \"\")\n    + \"\\n\";\n},\"compiler\":[7,\">= 4.0.0\"],\"main\":function(container,depth0,helpers,partials,data) {\n    var stack1;\n\n  return ((stack1 = (helpers.ifCond || (depth0 && depth0.ifCond) || helpers.helperMissing).call(depth0 != null ? depth0 : {},(depth0 != null ? depth0.sampleJSON : depth0),\"||\",(depth0 != null ? depth0.sampleXML : depth0),{\"name\":\"ifCond\",\"hash\":{},\"fn\":container.program(1, data, 0),\"inverse\":container.program(7, data, 0),\"data\":data})) != null ? stack1 : \"\");\n},\"useData\":true});\ntemplates['status_code'] = template({\"1\":function(container,depth0,helpers,partials,data) {\n    var stack1, helper, alias1=depth0 != null ? depth0 : {}, alias2=helpers.helperMissing;\n\n  return \"      <tr>\\n        <td>\"\n    + container.escapeExpression(((helper = (helper = helpers.key || (data && data.key)) != null ? helper : alias2),(typeof helper === \"function\" ? helper.call(alias1,{\"name\":\"key\",\"hash\":{},\"data\":data}) : helper)))\n    + \"</td>\\n        <td>\"\n    + ((stack1 = (helpers.sanitize || (depth0 && depth0.sanitize) || alias2).call(alias1,(depth0 != null ? depth0.description : depth0),{\"name\":\"sanitize\",\"hash\":{},\"data\":data})) != null ? stack1 : \"\")\n    + \"</td>\\n        <td>\"\n    + ((stack1 = (helpers.escape || (depth0 && depth0.escape) || alias2).call(alias1,(depth0 != null ? depth0.type : depth0),{\"name\":\"escape\",\"hash\":{},\"data\":data})) != null ? stack1 : \"\")\n    + \"</td>\\n      </tr>\\n\";\n},\"compiler\":[7,\">= 4.0.0\"],\"main\":function(container,depth0,helpers,partials,data) {\n    var stack1, alias1=depth0 != null ? depth0 : {}, alias2=helpers.helperMissing;\n\n  return \"<td width='15%' class='code'>\"\n    + ((stack1 = (helpers.escape || (depth0 && depth0.escape) || alias2).call(alias1,(depth0 != null ? depth0.code : depth0),{\"name\":\"escape\",\"hash\":{},\"data\":data})) != null ? stack1 : \"\")\n    + \"</td>\\n<td class=\\\"markdown\\\">\"\n    + ((stack1 = (helpers.escape || (depth0 && depth0.escape) || alias2).call(alias1,(depth0 != null ? depth0.message : depth0),{\"name\":\"escape\",\"hash\":{},\"data\":data})) != null ? stack1 : \"\")\n    + \"</td>\\n<td width='50%'><span class=\\\"model-signature\\\" /></td>\\n<td class=\\\"headers\\\">\\n  <table>\\n    <tbody>\\n\"\n    + ((stack1 = helpers.each.call(alias1,(depth0 != null ? depth0.headers : depth0),{\"name\":\"each\",\"hash\":{},\"fn\":container.program(1, data, 0),\"inverse\":container.noop,\"data\":data})) != null ? stack1 : \"\")\n    + \"    </tbody>\\n  </table>\\n</td>\";\n},\"useData\":true});\n})();} \n /* jshint ignore:end */\n'use strict';\n\n\n$(function() {\n\n\t// Helper function for vertically aligning DOM elements\n\t// http://www.seodenver.com/simple-vertical-align-plugin-for-jquery/\n\t$.fn.vAlign = function() {\n\t\treturn this.each(function(){\n\t\t\tvar ah = $(this).height();\n\t\t\tvar ph = $(this).parent().height();\n\t\t\tvar mh = (ph - ah) / 2;\n\t\t\t$(this).css('margin-top', mh);\n\t\t});\n\t};\n\n\t$.fn.stretchFormtasticInputWidthToParent = function() {\n\t\treturn this.each(function(){\n\t\t\tvar p_width = $(this).closest(\"form\").innerWidth();\n\t\t\tvar p_padding = parseInt($(this).closest(\"form\").css('padding-left') ,10) + parseInt($(this).closest('form').css('padding-right'), 10);\n\t\t\tvar this_padding = parseInt($(this).css('padding-left'), 10) + parseInt($(this).css('padding-right'), 10);\n\t\t\t$(this).css('width', p_width - p_padding - this_padding);\n\t\t});\n\t};\n\n\t$('form.formtastic li.string input, form.formtastic textarea').stretchFormtasticInputWidthToParent();\n\n\t// Vertically center these paragraphs\n\t// Parent may need a min-height for this to work..\n\t$('ul.downplayed li div.content p').vAlign();\n\n\t// When a sandbox form is submitted..\n\t$(\"form.sandbox\").submit(function(){\n\n\t\tvar error_free = true;\n\n\t\t// Cycle through the forms required inputs\n \t\t$(this).find(\"input.required\").each(function() {\n\n\t\t\t// Remove any existing error styles from the input\n\t\t\t$(this).removeClass('error');\n\n\t\t\t// Tack the error style on if the input is empty..\n\t\t\tif ($(this).val() === '') {\n\t\t\t\t$(this).addClass('error');\n\t\t\t\t$(this).wiggle();\n\t\t\t\terror_free = false;\n\t\t\t}\n\n\t\t});\n\n\t\treturn error_free;\n\t});\n\n});\n\nfunction clippyCopiedCallback() {\n  $('#api_key_copied').fadeIn().delay(1000).fadeOut();\n\n  // var b = $(\"#clippy_tooltip_\" + a);\n  // b.length != 0 && (b.attr(\"title\", \"copied!\").trigger(\"tipsy.reload\"), setTimeout(function() {\n  //   b.attr(\"title\", \"copy to clipboard\")\n  // },\n  // 500))\n}\n\n// Logging function that accounts for browsers that don't have window.console\nfunction log(){\n  log.history = log.history || [];\n  log.history.push(arguments);\n  if(this.console){\n    console.log( Array.prototype.slice.call(arguments)[0] );\n  }\n}\n\n// Handle browsers that do console incorrectly (IE9 and below, see http://stackoverflow.com/a/5539378/7913)\nif (Function.prototype.bind && console && typeof console.log === \"object\") {\n    [\n      \"log\",\"info\",\"warn\",\"error\",\"assert\",\"dir\",\"clear\",\"profile\",\"profileEnd\"\n    ].forEach(function (method) {\n        console[method] = this.bind(console[method], console);\n    }, Function.prototype.call);\n}\n\nwindow.Docs = {\n\n\tshebang: function() {\n\n\t\t// If shebang has an operation nickname in it..\n\t\t// e.g. /docs/#!/words/get_search\n\t\tvar fragments = $.param.fragment().split('/');\n\t\tfragments.shift(); // get rid of the bang\n\n\t\tswitch (fragments.length) {\n\t\t\tcase 1:\n        if (fragments[0].length > 0) { // prevent matching \"#/\"\n          // Expand all operations for the resource and scroll to it\n          var dom_id = 'resource_' + fragments[0];\n\n          Docs.expandEndpointListForResource(fragments[0]);\n          $(\"#\"+dom_id).slideto({highlight: false});\n        }\n\t\t\t\tbreak;\n\t\t\tcase 2:\n\t\t\t\t// Refer to the endpoint DOM element, e.g. #words_get_search\n\n        // Expand Resource\n        Docs.expandEndpointListForResource(fragments[0]);\n        $(\"#\"+dom_id).slideto({highlight: false});\n\n            // Expand operation\n            var li_dom_id = fragments.join('_');\n            var li_content_dom_id = li_dom_id + \"_content\";\n\n\n            Docs.expandOperation($('#'+li_content_dom_id));\n            $('#'+li_dom_id).slideto({highlight: false});\n            break;\n\t\t}\n\t},\n\n\ttoggleEndpointListForResource: function(resource) {\n\t\tvar elem = $('li#resource_' + Docs.escapeResourceName(resource) + ' ul.endpoints');\n\t\tif (elem.is(':visible')) {\n\t\t\t$.bbq.pushState('#/', 2);\n\t\t\tDocs.collapseEndpointListForResource(resource);\n\t\t} else {\n            $.bbq.pushState('#/' + resource, 2);\n\t\t\tDocs.expandEndpointListForResource(resource);\n\t\t}\n\t},\n\n\t// Expand resource\n\texpandEndpointListForResource: function(resource) {\n\t\tvar resource = Docs.escapeResourceName(resource);\n\t\tif (resource == '') {\n\t\t\t$('.resource ul.endpoints').slideDown();\n\t\t\treturn;\n\t\t}\n\n\t\t$('li#resource_' + resource).addClass('active');\n\n\t\tvar elem = $('li#resource_' + resource + ' ul.endpoints');\n\t\telem.slideDown();\n\t},\n\n\t// Collapse resource and mark as explicitly closed\n\tcollapseEndpointListForResource: function(resource) {\n\t\tvar resource = Docs.escapeResourceName(resource);\n\t\tif (resource == '') {\n\t\t\t$('.resource ul.endpoints').slideUp();\n\t\t\treturn;\n\t\t}\n\n\t\t$('li#resource_' + resource).removeClass('active');\n\n\t\tvar elem = $('li#resource_' + resource + ' ul.endpoints');\n\t\telem.slideUp();\n\t},\n\n\texpandOperationsForResource: function(resource) {\n\t\t// Make sure the resource container is open..\n\t\tDocs.expandEndpointListForResource(resource);\n\n\t\tif (resource == '') {\n\t\t\t$('.resource ul.endpoints li.operation div.content').slideDown();\n\t\t\treturn;\n\t\t}\n\n\t\t$('li#resource_' + Docs.escapeResourceName(resource) + ' li.operation div.content').each(function() {\n\t\t\tDocs.expandOperation($(this));\n\t\t});\n\t},\n\n\tcollapseOperationsForResource: function(resource) {\n\t\t// Make sure the resource container is open..\n\t\tDocs.expandEndpointListForResource(resource);\n\n\t\tif (resource == '') {\n\t\t\t$('.resource ul.endpoints li.operation div.content').slideUp();\n\t\t\treturn;\n\t\t}\n\n\t\t$('li#resource_' + Docs.escapeResourceName(resource) + ' li.operation div.content').each(function() {\n\t\t\tDocs.collapseOperation($(this));\n\t\t});\n\t},\n\n\tescapeResourceName: function(resource) {\n\t\treturn resource.replace(/[!\"#$%&'()*+,.\\/:;<=>?@\\[\\\\\\]\\^`{|}~]/g, \"\\\\$&\");\n\t},\n\n\texpandOperation: function(elem) {\n\t\telem.slideDown();\n\t},\n\n\tcollapseOperation: function(elem) {\n\t\telem.slideUp();\n\t}\n};\n\n/*!\n * https://github.com/es-shims/es5-shim\n * @license es5-shim Copyright 2009-2015 by contributors, MIT License\n * see https://github.com/es-shims/es5-shim/blob/master/LICENSE\n */\n\n// vim: ts=4 sts=4 sw=4 expandtab\n\n// Add semicolon to prevent IIFE from being passed as argument to concatenated code.\n;\n\n// UMD (Universal Module Definition)\n// see https://github.com/umdjs/umd/blob/master/templates/returnExports.js\n(function (root, factory) {\n    'use strict';\n\n    /* global define, exports, module */\n    if (typeof define === 'function' && define.amd) {\n        // AMD. Register as an anonymous module.\n        define(factory);\n    } else if (typeof exports === 'object') {\n        // Node. Does not work with strict CommonJS, but\n        // only CommonJS-like enviroments that support module.exports,\n        // like Node.\n        module.exports = factory();\n    } else {\n        // Browser globals (root is window)\n        root.returnExports = factory();\n    }\n}(this, function () {\n    /**\n     * Brings an environment as close to ECMAScript 5 compliance\n     * as is possible with the facilities of erstwhile engines.\n     *\n     * Annotated ES5: http://es5.github.com/ (specific links below)\n     * ES5 Spec: http://www.ecma-international.org/publications/files/ECMA-ST/Ecma-262.pdf\n     * Required reading: http://javascriptweblog.wordpress.com/2011/12/05/extending-javascript-natives/\n     */\n\n    // Shortcut to an often accessed properties, in order to avoid multiple\n    // dereference that costs universally. This also holds a reference to known-good\n    // functions.\n    var $Array = Array;\n    var ArrayPrototype = $Array.prototype;\n    var $Object = Object;\n    var ObjectPrototype = $Object.prototype;\n    var $Function = Function;\n    var FunctionPrototype = $Function.prototype;\n    var $String = String;\n    var StringPrototype = $String.prototype;\n    var $Number = Number;\n    var NumberPrototype = $Number.prototype;\n    var array_slice = ArrayPrototype.slice;\n    var array_splice = ArrayPrototype.splice;\n    var array_push = ArrayPrototype.push;\n    var array_unshift = ArrayPrototype.unshift;\n    var array_concat = ArrayPrototype.concat;\n    var array_join = ArrayPrototype.join;\n    var call = FunctionPrototype.call;\n    var apply = FunctionPrototype.apply;\n    var max = Math.max;\n    var min = Math.min;\n\n    // Having a toString local variable name breaks in Opera so use to_string.\n    var to_string = ObjectPrototype.toString;\n\n    /* global Symbol */\n    /* eslint-disable one-var-declaration-per-line, no-redeclare, max-statements-per-line */\n    var hasToStringTag = typeof Symbol === 'function' && typeof Symbol.toStringTag === 'symbol';\n    var isCallable; /* inlined from https://npmjs.com/is-callable */ var fnToStr = Function.prototype.toString, constructorRegex = /^\\s*class /, isES6ClassFn = function isES6ClassFn(value) { try { var fnStr = fnToStr.call(value); var singleStripped = fnStr.replace(/\\/\\/.*\\n/g, ''); var multiStripped = singleStripped.replace(/\\/\\*[.\\s\\S]*\\*\\//g, ''); var spaceStripped = multiStripped.replace(/\\n/mg, ' ').replace(/ {2}/g, ' '); return constructorRegex.test(spaceStripped); } catch (e) { return false; /* not a function */ } }, tryFunctionObject = function tryFunctionObject(value) { try { if (isES6ClassFn(value)) { return false; } fnToStr.call(value); return true; } catch (e) { return false; } }, fnClass = '[object Function]', genClass = '[object GeneratorFunction]', isCallable = function isCallable(value) { if (!value) { return false; } if (typeof value !== 'function' && typeof value !== 'object') { return false; } if (hasToStringTag) { return tryFunctionObject(value); } if (isES6ClassFn(value)) { return false; } var strClass = to_string.call(value); return strClass === fnClass || strClass === genClass; };\n\n    var isRegex; /* inlined from https://npmjs.com/is-regex */ var regexExec = RegExp.prototype.exec, tryRegexExec = function tryRegexExec(value) { try { regexExec.call(value); return true; } catch (e) { return false; } }, regexClass = '[object RegExp]'; isRegex = function isRegex(value) { if (typeof value !== 'object') { return false; } return hasToStringTag ? tryRegexExec(value) : to_string.call(value) === regexClass; };\n    var isString; /* inlined from https://npmjs.com/is-string */ var strValue = String.prototype.valueOf, tryStringObject = function tryStringObject(value) { try { strValue.call(value); return true; } catch (e) { return false; } }, stringClass = '[object String]'; isString = function isString(value) { if (typeof value === 'string') { return true; } if (typeof value !== 'object') { return false; } return hasToStringTag ? tryStringObject(value) : to_string.call(value) === stringClass; };\n    /* eslint-enable one-var-declaration-per-line, no-redeclare, max-statements-per-line */\n\n    /* inlined from http://npmjs.com/define-properties */\n    var supportsDescriptors = $Object.defineProperty && (function () {\n        try {\n            var obj = {};\n            $Object.defineProperty(obj, 'x', { enumerable: false, value: obj });\n            for (var _ in obj) { // jscs:ignore disallowUnusedVariables\n                return false;\n            }\n            return obj.x === obj;\n        } catch (e) { /* this is ES3 */\n            return false;\n        }\n    }());\n    var defineProperties = (function (has) {\n        // Define configurable, writable, and non-enumerable props\n        // if they don't exist.\n        var defineProperty;\n        if (supportsDescriptors) {\n            defineProperty = function (object, name, method, forceAssign) {\n                if (!forceAssign && (name in object)) {\n                    return;\n                }\n                $Object.defineProperty(object, name, {\n                    configurable: true,\n                    enumerable: false,\n                    writable: true,\n                    value: method\n                });\n            };\n        } else {\n            defineProperty = function (object, name, method, forceAssign) {\n                if (!forceAssign && (name in object)) {\n                    return;\n                }\n                object[name] = method;\n            };\n        }\n        return function defineProperties(object, map, forceAssign) {\n            for (var name in map) {\n                if (has.call(map, name)) {\n                    defineProperty(object, name, map[name], forceAssign);\n                }\n            }\n        };\n    }(ObjectPrototype.hasOwnProperty));\n\n    //\n    // Util\n    // ======\n    //\n\n    /* replaceable with https://npmjs.com/package/es-abstract /helpers/isPrimitive */\n    var isPrimitive = function isPrimitive(input) {\n        var type = typeof input;\n        return input === null || (type !== 'object' && type !== 'function');\n    };\n\n    var isActualNaN = $Number.isNaN || function isActualNaN(x) {\n        return x !== x;\n    };\n\n    var ES = {\n        // ES5 9.4\n        // http://es5.github.com/#x9.4\n        // http://jsperf.com/to-integer\n        /* replaceable with https://npmjs.com/package/es-abstract ES5.ToInteger */\n        ToInteger: function ToInteger(num) {\n            var n = +num;\n            if (isActualNaN(n)) {\n                n = 0;\n            } else if (n !== 0 && n !== (1 / 0) && n !== -(1 / 0)) {\n                n = (n > 0 || -1) * Math.floor(Math.abs(n));\n            }\n            return n;\n        },\n\n        /* replaceable with https://npmjs.com/package/es-abstract ES5.ToPrimitive */\n        ToPrimitive: function ToPrimitive(input) {\n            var val, valueOf, toStr;\n            if (isPrimitive(input)) {\n                return input;\n            }\n            valueOf = input.valueOf;\n            if (isCallable(valueOf)) {\n                val = valueOf.call(input);\n                if (isPrimitive(val)) {\n                    return val;\n                }\n            }\n            toStr = input.toString;\n            if (isCallable(toStr)) {\n                val = toStr.call(input);\n                if (isPrimitive(val)) {\n                    return val;\n                }\n            }\n            throw new TypeError();\n        },\n\n        // ES5 9.9\n        // http://es5.github.com/#x9.9\n        /* replaceable with https://npmjs.com/package/es-abstract ES5.ToObject */\n        ToObject: function (o) {\n            if (o == null) { // this matches both null and undefined\n                throw new TypeError(\"can't convert \" + o + ' to object');\n            }\n            return $Object(o);\n        },\n\n        /* replaceable with https://npmjs.com/package/es-abstract ES5.ToUint32 */\n        ToUint32: function ToUint32(x) {\n            return x >>> 0;\n        }\n    };\n\n    //\n    // Function\n    // ========\n    //\n\n    // ES-5 15.3.4.5\n    // http://es5.github.com/#x15.3.4.5\n\n    var Empty = function Empty() {};\n\n    defineProperties(FunctionPrototype, {\n        bind: function bind(that) { // .length is 1\n            // 1. Let Target be the this value.\n            var target = this;\n            // 2. If IsCallable(Target) is false, throw a TypeError exception.\n            if (!isCallable(target)) {\n                throw new TypeError('Function.prototype.bind called on incompatible ' + target);\n            }\n            // 3. Let A be a new (possibly empty) internal list of all of the\n            //   argument values provided after thisArg (arg1, arg2 etc), in order.\n            // XXX slicedArgs will stand in for \"A\" if used\n            var args = array_slice.call(arguments, 1); // for normal call\n            // 4. Let F be a new native ECMAScript object.\n            // 11. Set the [[Prototype]] internal property of F to the standard\n            //   built-in Function prototype object as specified in 15.3.3.1.\n            // 12. Set the [[Call]] internal property of F as described in\n            //   15.3.4.5.1.\n            // 13. Set the [[Construct]] internal property of F as described in\n            //   15.3.4.5.2.\n            // 14. Set the [[HasInstance]] internal property of F as described in\n            //   15.3.4.5.3.\n            var bound;\n            var binder = function () {\n\n                if (this instanceof bound) {\n                    // 15.3.4.5.2 [[Construct]]\n                    // When the [[Construct]] internal method of a function object,\n                    // F that was created using the bind function is called with a\n                    // list of arguments ExtraArgs, the following steps are taken:\n                    // 1. Let target be the value of F's [[TargetFunction]]\n                    //   internal property.\n                    // 2. If target has no [[Construct]] internal method, a\n                    //   TypeError exception is thrown.\n                    // 3. Let boundArgs be the value of F's [[BoundArgs]] internal\n                    //   property.\n                    // 4. Let args be a new list containing the same values as the\n                    //   list boundArgs in the same order followed by the same\n                    //   values as the list ExtraArgs in the same order.\n                    // 5. Return the result of calling the [[Construct]] internal\n                    //   method of target providing args as the arguments.\n\n                    var result = apply.call(\n                        target,\n                        this,\n                        array_concat.call(args, array_slice.call(arguments))\n                    );\n                    if ($Object(result) === result) {\n                        return result;\n                    }\n                    return this;\n\n                } else {\n                    // 15.3.4.5.1 [[Call]]\n                    // When the [[Call]] internal method of a function object, F,\n                    // which was created using the bind function is called with a\n                    // this value and a list of arguments ExtraArgs, the following\n                    // steps are taken:\n                    // 1. Let boundArgs be the value of F's [[BoundArgs]] internal\n                    //   property.\n                    // 2. Let boundThis be the value of F's [[BoundThis]] internal\n                    //   property.\n                    // 3. Let target be the value of F's [[TargetFunction]] internal\n                    //   property.\n                    // 4. Let args be a new list containing the same values as the\n                    //   list boundArgs in the same order followed by the same\n                    //   values as the list ExtraArgs in the same order.\n                    // 5. Return the result of calling the [[Call]] internal method\n                    //   of target providing boundThis as the this value and\n                    //   providing args as the arguments.\n\n                    // equiv: target.call(this, ...boundArgs, ...args)\n                    return apply.call(\n                        target,\n                        that,\n                        array_concat.call(args, array_slice.call(arguments))\n                    );\n\n                }\n\n            };\n\n            // 15. If the [[Class]] internal property of Target is \"Function\", then\n            //     a. Let L be the length property of Target minus the length of A.\n            //     b. Set the length own property of F to either 0 or L, whichever is\n            //       larger.\n            // 16. Else set the length own property of F to 0.\n\n            var boundLength = max(0, target.length - args.length);\n\n            // 17. Set the attributes of the length own property of F to the values\n            //   specified in 15.3.5.1.\n            var boundArgs = [];\n            for (var i = 0; i < boundLength; i++) {\n                array_push.call(boundArgs, '$' + i);\n            }\n\n            // XXX Build a dynamic function with desired amount of arguments is the only\n            // way to set the length property of a function.\n            // In environments where Content Security Policies enabled (Chrome extensions,\n            // for ex.) all use of eval or Function costructor throws an exception.\n            // However in all of these environments Function.prototype.bind exists\n            // and so this code will never be executed.\n            bound = $Function('binder', 'return function (' + array_join.call(boundArgs, ',') + '){ return binder.apply(this, arguments); }')(binder);\n\n            if (target.prototype) {\n                Empty.prototype = target.prototype;\n                bound.prototype = new Empty();\n                // Clean up dangling references.\n                Empty.prototype = null;\n            }\n\n            // TODO\n            // 18. Set the [[Extensible]] internal property of F to true.\n\n            // TODO\n            // 19. Let thrower be the [[ThrowTypeError]] function Object (13.2.3).\n            // 20. Call the [[DefineOwnProperty]] internal method of F with\n            //   arguments \"caller\", PropertyDescriptor {[[Get]]: thrower, [[Set]]:\n            //   thrower, [[Enumerable]]: false, [[Configurable]]: false}, and\n            //   false.\n            // 21. Call the [[DefineOwnProperty]] internal method of F with\n            //   arguments \"arguments\", PropertyDescriptor {[[Get]]: thrower,\n            //   [[Set]]: thrower, [[Enumerable]]: false, [[Configurable]]: false},\n            //   and false.\n\n            // TODO\n            // NOTE Function objects created using Function.prototype.bind do not\n            // have a prototype property or the [[Code]], [[FormalParameters]], and\n            // [[Scope]] internal properties.\n            // XXX can't delete prototype in pure-js.\n\n            // 22. Return F.\n            return bound;\n        }\n    });\n\n    // _Please note: Shortcuts are defined after `Function.prototype.bind` as we\n    // use it in defining shortcuts.\n    var owns = call.bind(ObjectPrototype.hasOwnProperty);\n    var toStr = call.bind(ObjectPrototype.toString);\n    var arraySlice = call.bind(array_slice);\n    var arraySliceApply = apply.bind(array_slice);\n    var strSlice = call.bind(StringPrototype.slice);\n    var strSplit = call.bind(StringPrototype.split);\n    var strIndexOf = call.bind(StringPrototype.indexOf);\n    var pushCall = call.bind(array_push);\n    var isEnum = call.bind(ObjectPrototype.propertyIsEnumerable);\n    var arraySort = call.bind(ArrayPrototype.sort);\n\n    //\n    // Array\n    // =====\n    //\n\n    var isArray = $Array.isArray || function isArray(obj) {\n        return toStr(obj) === '[object Array]';\n    };\n\n    // ES5 15.4.4.12\n    // http://es5.github.com/#x15.4.4.13\n    // Return len+argCount.\n    // [bugfix, ielt8]\n    // IE < 8 bug: [].unshift(0) === undefined but should be \"1\"\n    var hasUnshiftReturnValueBug = [].unshift(0) !== 1;\n    defineProperties(ArrayPrototype, {\n        unshift: function () {\n            array_unshift.apply(this, arguments);\n            return this.length;\n        }\n    }, hasUnshiftReturnValueBug);\n\n    // ES5 15.4.3.2\n    // http://es5.github.com/#x15.4.3.2\n    // https://developer.mozilla.org/en/JavaScript/Reference/Global_Objects/Array/isArray\n    defineProperties($Array, { isArray: isArray });\n\n    // The IsCallable() check in the Array functions\n    // has been replaced with a strict check on the\n    // internal class of the object to trap cases where\n    // the provided function was actually a regular\n    // expression literal, which in V8 and\n    // JavaScriptCore is a typeof \"function\".  Only in\n    // V8 are regular expression literals permitted as\n    // reduce parameters, so it is desirable in the\n    // general case for the shim to match the more\n    // strict and common behavior of rejecting regular\n    // expressions.\n\n    // ES5 15.4.4.18\n    // http://es5.github.com/#x15.4.4.18\n    // https://developer.mozilla.org/en/JavaScript/Reference/Global_Objects/array/forEach\n\n    // Check failure of by-index access of string characters (IE < 9)\n    // and failure of `0 in boxedString` (Rhino)\n    var boxedString = $Object('a');\n    var splitString = boxedString[0] !== 'a' || !(0 in boxedString);\n\n    var properlyBoxesContext = function properlyBoxed(method) {\n        // Check node 0.6.21 bug where third parameter is not boxed\n        var properlyBoxesNonStrict = true;\n        var properlyBoxesStrict = true;\n        var threwException = false;\n        if (method) {\n            try {\n                method.call('foo', function (_, __, context) {\n                    if (typeof context !== 'object') {\n                        properlyBoxesNonStrict = false;\n                    }\n                });\n\n                method.call([1], function () {\n                    'use strict';\n\n                    properlyBoxesStrict = typeof this === 'string';\n                }, 'x');\n            } catch (e) {\n                threwException = true;\n            }\n        }\n        return !!method && !threwException && properlyBoxesNonStrict && properlyBoxesStrict;\n    };\n\n    defineProperties(ArrayPrototype, {\n        forEach: function forEach(callbackfn/*, thisArg*/) {\n            var object = ES.ToObject(this);\n            var self = splitString && isString(this) ? strSplit(this, '') : object;\n            var i = -1;\n            var length = ES.ToUint32(self.length);\n            var T;\n            if (arguments.length > 1) {\n                T = arguments[1];\n            }\n\n            // If no callback function or if callback is not a callable function\n            if (!isCallable(callbackfn)) {\n                throw new TypeError('Array.prototype.forEach callback must be a function');\n            }\n\n            while (++i < length) {\n                if (i in self) {\n                    // Invoke the callback function with call, passing arguments:\n                    // context, property value, property key, thisArg object\n                    if (typeof T === 'undefined') {\n                        callbackfn(self[i], i, object);\n                    } else {\n                        callbackfn.call(T, self[i], i, object);\n                    }\n                }\n            }\n        }\n    }, !properlyBoxesContext(ArrayPrototype.forEach));\n\n    // ES5 15.4.4.19\n    // http://es5.github.com/#x15.4.4.19\n    // https://developer.mozilla.org/en/Core_JavaScript_1.5_Reference/Objects/Array/map\n    defineProperties(ArrayPrototype, {\n        map: function map(callbackfn/*, thisArg*/) {\n            var object = ES.ToObject(this);\n            var self = splitString && isString(this) ? strSplit(this, '') : object;\n            var length = ES.ToUint32(self.length);\n            var result = $Array(length);\n            var T;\n            if (arguments.length > 1) {\n                T = arguments[1];\n            }\n\n            // If no callback function or if callback is not a callable function\n            if (!isCallable(callbackfn)) {\n                throw new TypeError('Array.prototype.map callback must be a function');\n            }\n\n            for (var i = 0; i < length; i++) {\n                if (i in self) {\n                    if (typeof T === 'undefined') {\n                        result[i] = callbackfn(self[i], i, object);\n                    } else {\n                        result[i] = callbackfn.call(T, self[i], i, object);\n                    }\n                }\n            }\n            return result;\n        }\n    }, !properlyBoxesContext(ArrayPrototype.map));\n\n    // ES5 15.4.4.20\n    // http://es5.github.com/#x15.4.4.20\n    // https://developer.mozilla.org/en/Core_JavaScript_1.5_Reference/Objects/Array/filter\n    defineProperties(ArrayPrototype, {\n        filter: function filter(callbackfn/*, thisArg*/) {\n            var object = ES.ToObject(this);\n            var self = splitString && isString(this) ? strSplit(this, '') : object;\n            var length = ES.ToUint32(self.length);\n            var result = [];\n            var value;\n            var T;\n            if (arguments.length > 1) {\n                T = arguments[1];\n            }\n\n            // If no callback function or if callback is not a callable function\n            if (!isCallable(callbackfn)) {\n                throw new TypeError('Array.prototype.filter callback must be a function');\n            }\n\n            for (var i = 0; i < length; i++) {\n                if (i in self) {\n                    value = self[i];\n                    if (typeof T === 'undefined' ? callbackfn(value, i, object) : callbackfn.call(T, value, i, object)) {\n                        pushCall(result, value);\n                    }\n                }\n            }\n            return result;\n        }\n    }, !properlyBoxesContext(ArrayPrototype.filter));\n\n    // ES5 15.4.4.16\n    // http://es5.github.com/#x15.4.4.16\n    // https://developer.mozilla.org/en/JavaScript/Reference/Global_Objects/Array/every\n    defineProperties(ArrayPrototype, {\n        every: function every(callbackfn/*, thisArg*/) {\n            var object = ES.ToObject(this);\n            var self = splitString && isString(this) ? strSplit(this, '') : object;\n            var length = ES.ToUint32(self.length);\n            var T;\n            if (arguments.length > 1) {\n                T = arguments[1];\n            }\n\n            // If no callback function or if callback is not a callable function\n            if (!isCallable(callbackfn)) {\n                throw new TypeError('Array.prototype.every callback must be a function');\n            }\n\n            for (var i = 0; i < length; i++) {\n                if (i in self && !(typeof T === 'undefined' ? callbackfn(self[i], i, object) : callbackfn.call(T, self[i], i, object))) {\n                    return false;\n                }\n            }\n            return true;\n        }\n    }, !properlyBoxesContext(ArrayPrototype.every));\n\n    // ES5 15.4.4.17\n    // http://es5.github.com/#x15.4.4.17\n    // https://developer.mozilla.org/en/JavaScript/Reference/Global_Objects/Array/some\n    defineProperties(ArrayPrototype, {\n        some: function some(callbackfn/*, thisArg */) {\n            var object = ES.ToObject(this);\n            var self = splitString && isString(this) ? strSplit(this, '') : object;\n            var length = ES.ToUint32(self.length);\n            var T;\n            if (arguments.length > 1) {\n                T = arguments[1];\n            }\n\n            // If no callback function or if callback is not a callable function\n            if (!isCallable(callbackfn)) {\n                throw new TypeError('Array.prototype.some callback must be a function');\n            }\n\n            for (var i = 0; i < length; i++) {\n                if (i in self && (typeof T === 'undefined' ? callbackfn(self[i], i, object) : callbackfn.call(T, self[i], i, object))) {\n                    return true;\n                }\n            }\n            return false;\n        }\n    }, !properlyBoxesContext(ArrayPrototype.some));\n\n    // ES5 15.4.4.21\n    // http://es5.github.com/#x15.4.4.21\n    // https://developer.mozilla.org/en/Core_JavaScript_1.5_Reference/Objects/Array/reduce\n    var reduceCoercesToObject = false;\n    if (ArrayPrototype.reduce) {\n        reduceCoercesToObject = typeof ArrayPrototype.reduce.call('es5', function (_, __, ___, list) {\n            return list;\n        }) === 'object';\n    }\n    defineProperties(ArrayPrototype, {\n        reduce: function reduce(callbackfn/*, initialValue*/) {\n            var object = ES.ToObject(this);\n            var self = splitString && isString(this) ? strSplit(this, '') : object;\n            var length = ES.ToUint32(self.length);\n\n            // If no callback function or if callback is not a callable function\n            if (!isCallable(callbackfn)) {\n                throw new TypeError('Array.prototype.reduce callback must be a function');\n            }\n\n            // no value to return if no initial value and an empty array\n            if (length === 0 && arguments.length === 1) {\n                throw new TypeError('reduce of empty array with no initial value');\n            }\n\n            var i = 0;\n            var result;\n            if (arguments.length >= 2) {\n                result = arguments[1];\n            } else {\n                do {\n                    if (i in self) {\n                        result = self[i++];\n                        break;\n                    }\n\n                    // if array contains no values, no initial value to return\n                    if (++i >= length) {\n                        throw new TypeError('reduce of empty array with no initial value');\n                    }\n                } while (true);\n            }\n\n            for (; i < length; i++) {\n                if (i in self) {\n                    result = callbackfn(result, self[i], i, object);\n                }\n            }\n\n            return result;\n        }\n    }, !reduceCoercesToObject);\n\n    // ES5 15.4.4.22\n    // http://es5.github.com/#x15.4.4.22\n    // https://developer.mozilla.org/en/Core_JavaScript_1.5_Reference/Objects/Array/reduceRight\n    var reduceRightCoercesToObject = false;\n    if (ArrayPrototype.reduceRight) {\n        reduceRightCoercesToObject = typeof ArrayPrototype.reduceRight.call('es5', function (_, __, ___, list) {\n            return list;\n        }) === 'object';\n    }\n    defineProperties(ArrayPrototype, {\n        reduceRight: function reduceRight(callbackfn/*, initial*/) {\n            var object = ES.ToObject(this);\n            var self = splitString && isString(this) ? strSplit(this, '') : object;\n            var length = ES.ToUint32(self.length);\n\n            // If no callback function or if callback is not a callable function\n            if (!isCallable(callbackfn)) {\n                throw new TypeError('Array.prototype.reduceRight callback must be a function');\n            }\n\n            // no value to return if no initial value, empty array\n            if (length === 0 && arguments.length === 1) {\n                throw new TypeError('reduceRight of empty array with no initial value');\n            }\n\n            var result;\n            var i = length - 1;\n            if (arguments.length >= 2) {\n                result = arguments[1];\n            } else {\n                do {\n                    if (i in self) {\n                        result = self[i--];\n                        break;\n                    }\n\n                    // if array contains no values, no initial value to return\n                    if (--i < 0) {\n                        throw new TypeError('reduceRight of empty array with no initial value');\n                    }\n                } while (true);\n            }\n\n            if (i < 0) {\n                return result;\n            }\n\n            do {\n                if (i in self) {\n                    result = callbackfn(result, self[i], i, object);\n                }\n            } while (i--);\n\n            return result;\n        }\n    }, !reduceRightCoercesToObject);\n\n    // ES5 15.4.4.14\n    // http://es5.github.com/#x15.4.4.14\n    // https://developer.mozilla.org/en/JavaScript/Reference/Global_Objects/Array/indexOf\n    var hasFirefox2IndexOfBug = ArrayPrototype.indexOf && [0, 1].indexOf(1, 2) !== -1;\n    defineProperties(ArrayPrototype, {\n        indexOf: function indexOf(searchElement/*, fromIndex */) {\n            var self = splitString && isString(this) ? strSplit(this, '') : ES.ToObject(this);\n            var length = ES.ToUint32(self.length);\n\n            if (length === 0) {\n                return -1;\n            }\n\n            var i = 0;\n            if (arguments.length > 1) {\n                i = ES.ToInteger(arguments[1]);\n            }\n\n            // handle negative indices\n            i = i >= 0 ? i : max(0, length + i);\n            for (; i < length; i++) {\n                if (i in self && self[i] === searchElement) {\n                    return i;\n                }\n            }\n            return -1;\n        }\n    }, hasFirefox2IndexOfBug);\n\n    // ES5 15.4.4.15\n    // http://es5.github.com/#x15.4.4.15\n    // https://developer.mozilla.org/en/JavaScript/Reference/Global_Objects/Array/lastIndexOf\n    var hasFirefox2LastIndexOfBug = ArrayPrototype.lastIndexOf && [0, 1].lastIndexOf(0, -3) !== -1;\n    defineProperties(ArrayPrototype, {\n        lastIndexOf: function lastIndexOf(searchElement/*, fromIndex */) {\n            var self = splitString && isString(this) ? strSplit(this, '') : ES.ToObject(this);\n            var length = ES.ToUint32(self.length);\n\n            if (length === 0) {\n                return -1;\n            }\n            var i = length - 1;\n            if (arguments.length > 1) {\n                i = min(i, ES.ToInteger(arguments[1]));\n            }\n            // handle negative indices\n            i = i >= 0 ? i : length - Math.abs(i);\n            for (; i >= 0; i--) {\n                if (i in self && searchElement === self[i]) {\n                    return i;\n                }\n            }\n            return -1;\n        }\n    }, hasFirefox2LastIndexOfBug);\n\n    // ES5 15.4.4.12\n    // http://es5.github.com/#x15.4.4.12\n    var spliceNoopReturnsEmptyArray = (function () {\n        var a = [1, 2];\n        var result = a.splice();\n        return a.length === 2 && isArray(result) && result.length === 0;\n    }());\n    defineProperties(ArrayPrototype, {\n        // Safari 5.0 bug where .splice() returns undefined\n        splice: function splice(start, deleteCount) {\n            if (arguments.length === 0) {\n                return [];\n            } else {\n                return array_splice.apply(this, arguments);\n            }\n        }\n    }, !spliceNoopReturnsEmptyArray);\n\n    var spliceWorksWithEmptyObject = (function () {\n        var obj = {};\n        ArrayPrototype.splice.call(obj, 0, 0, 1);\n        return obj.length === 1;\n    }());\n    defineProperties(ArrayPrototype, {\n        splice: function splice(start, deleteCount) {\n            if (arguments.length === 0) {\n                return [];\n            }\n            var args = arguments;\n            this.length = max(ES.ToInteger(this.length), 0);\n            if (arguments.length > 0 && typeof deleteCount !== 'number') {\n                args = arraySlice(arguments);\n                if (args.length < 2) {\n                    pushCall(args, this.length - start);\n                } else {\n                    args[1] = ES.ToInteger(deleteCount);\n                }\n            }\n            return array_splice.apply(this, args);\n        }\n    }, !spliceWorksWithEmptyObject);\n    var spliceWorksWithLargeSparseArrays = (function () {\n        // Per https://github.com/es-shims/es5-shim/issues/295\n        // Safari 7/8 breaks with sparse arrays of size 1e5 or greater\n        var arr = new $Array(1e5);\n        // note: the index MUST be 8 or larger or the test will false pass\n        arr[8] = 'x';\n        arr.splice(1, 1);\n        // note: this test must be defined *after* the indexOf shim\n        // per https://github.com/es-shims/es5-shim/issues/313\n        return arr.indexOf('x') === 7;\n    }());\n    var spliceWorksWithSmallSparseArrays = (function () {\n        // Per https://github.com/es-shims/es5-shim/issues/295\n        // Opera 12.15 breaks on this, no idea why.\n        var n = 256;\n        var arr = [];\n        arr[n] = 'a';\n        arr.splice(n + 1, 0, 'b');\n        return arr[n] === 'a';\n    }());\n    defineProperties(ArrayPrototype, {\n        splice: function splice(start, deleteCount) {\n            var O = ES.ToObject(this);\n            var A = [];\n            var len = ES.ToUint32(O.length);\n            var relativeStart = ES.ToInteger(start);\n            var actualStart = relativeStart < 0 ? max((len + relativeStart), 0) : min(relativeStart, len);\n            var actualDeleteCount = min(max(ES.ToInteger(deleteCount), 0), len - actualStart);\n\n            var k = 0;\n            var from;\n            while (k < actualDeleteCount) {\n                from = $String(actualStart + k);\n                if (owns(O, from)) {\n                    A[k] = O[from];\n                }\n                k += 1;\n            }\n\n            var items = arraySlice(arguments, 2);\n            var itemCount = items.length;\n            var to;\n            if (itemCount < actualDeleteCount) {\n                k = actualStart;\n                var maxK = len - actualDeleteCount;\n                while (k < maxK) {\n                    from = $String(k + actualDeleteCount);\n                    to = $String(k + itemCount);\n                    if (owns(O, from)) {\n                        O[to] = O[from];\n                    } else {\n                        delete O[to];\n                    }\n                    k += 1;\n                }\n                k = len;\n                var minK = len - actualDeleteCount + itemCount;\n                while (k > minK) {\n                    delete O[k - 1];\n                    k -= 1;\n                }\n            } else if (itemCount > actualDeleteCount) {\n                k = len - actualDeleteCount;\n                while (k > actualStart) {\n                    from = $String(k + actualDeleteCount - 1);\n                    to = $String(k + itemCount - 1);\n                    if (owns(O, from)) {\n                        O[to] = O[from];\n                    } else {\n                        delete O[to];\n                    }\n                    k -= 1;\n                }\n            }\n            k = actualStart;\n            for (var i = 0; i < items.length; ++i) {\n                O[k] = items[i];\n                k += 1;\n            }\n            O.length = len - actualDeleteCount + itemCount;\n\n            return A;\n        }\n    }, !spliceWorksWithLargeSparseArrays || !spliceWorksWithSmallSparseArrays);\n\n    var originalJoin = ArrayPrototype.join;\n    var hasStringJoinBug;\n    try {\n        hasStringJoinBug = Array.prototype.join.call('123', ',') !== '1,2,3';\n    } catch (e) {\n        hasStringJoinBug = true;\n    }\n    if (hasStringJoinBug) {\n        defineProperties(ArrayPrototype, {\n            join: function join(separator) {\n                var sep = typeof separator === 'undefined' ? ',' : separator;\n                return originalJoin.call(isString(this) ? strSplit(this, '') : this, sep);\n            }\n        }, hasStringJoinBug);\n    }\n\n    var hasJoinUndefinedBug = [1, 2].join(undefined) !== '1,2';\n    if (hasJoinUndefinedBug) {\n        defineProperties(ArrayPrototype, {\n            join: function join(separator) {\n                var sep = typeof separator === 'undefined' ? ',' : separator;\n                return originalJoin.call(this, sep);\n            }\n        }, hasJoinUndefinedBug);\n    }\n\n    var pushShim = function push(item) {\n        var O = ES.ToObject(this);\n        var n = ES.ToUint32(O.length);\n        var i = 0;\n        while (i < arguments.length) {\n            O[n + i] = arguments[i];\n            i += 1;\n        }\n        O.length = n + i;\n        return n + i;\n    };\n\n    var pushIsNotGeneric = (function () {\n        var obj = {};\n        var result = Array.prototype.push.call(obj, undefined);\n        return result !== 1 || obj.length !== 1 || typeof obj[0] !== 'undefined' || !owns(obj, 0);\n    }());\n    defineProperties(ArrayPrototype, {\n        push: function push(item) {\n            if (isArray(this)) {\n                return array_push.apply(this, arguments);\n            }\n            return pushShim.apply(this, arguments);\n        }\n    }, pushIsNotGeneric);\n\n    // This fixes a very weird bug in Opera 10.6 when pushing `undefined\n    var pushUndefinedIsWeird = (function () {\n        var arr = [];\n        var result = arr.push(undefined);\n        return result !== 1 || arr.length !== 1 || typeof arr[0] !== 'undefined' || !owns(arr, 0);\n    }());\n    defineProperties(ArrayPrototype, { push: pushShim }, pushUndefinedIsWeird);\n\n    // ES5 15.2.3.14\n    // http://es5.github.io/#x15.4.4.10\n    // Fix boxed string bug\n    defineProperties(ArrayPrototype, {\n        slice: function (start, end) {\n            var arr = isString(this) ? strSplit(this, '') : this;\n            return arraySliceApply(arr, arguments);\n        }\n    }, splitString);\n\n    var sortIgnoresNonFunctions = (function () {\n        try {\n            [1, 2].sort(null);\n            [1, 2].sort({});\n            return true;\n        } catch (e) {}\n        return false;\n    }());\n    var sortThrowsOnRegex = (function () {\n        // this is a problem in Firefox 4, in which `typeof /a/ === 'function'`\n        try {\n            [1, 2].sort(/a/);\n            return false;\n        } catch (e) {}\n        return true;\n    }());\n    var sortIgnoresUndefined = (function () {\n        // applies in IE 8, for one.\n        try {\n            [1, 2].sort(undefined);\n            return true;\n        } catch (e) {}\n        return false;\n    }());\n    defineProperties(ArrayPrototype, {\n        sort: function sort(compareFn) {\n            if (typeof compareFn === 'undefined') {\n                return arraySort(this);\n            }\n            if (!isCallable(compareFn)) {\n                throw new TypeError('Array.prototype.sort callback must be a function');\n            }\n            return arraySort(this, compareFn);\n        }\n    }, sortIgnoresNonFunctions || !sortIgnoresUndefined || !sortThrowsOnRegex);\n\n    //\n    // Object\n    // ======\n    //\n\n    // ES5 15.2.3.14\n    // http://es5.github.com/#x15.2.3.14\n\n    // http://whattheheadsaid.com/2010/10/a-safer-object-keys-compatibility-implementation\n    var hasDontEnumBug = !isEnum({ 'toString': null }, 'toString');\n    var hasProtoEnumBug = isEnum(function () {}, 'prototype');\n    var hasStringEnumBug = !owns('x', '0');\n    var equalsConstructorPrototype = function (o) {\n        var ctor = o.constructor;\n        return ctor && ctor.prototype === o;\n    };\n    var blacklistedKeys = {\n        $window: true,\n        $console: true,\n        $parent: true,\n        $self: true,\n        $frame: true,\n        $frames: true,\n        $frameElement: true,\n        $webkitIndexedDB: true,\n        $webkitStorageInfo: true,\n        $external: true\n    };\n    var hasAutomationEqualityBug = (function () {\n        /* globals window */\n        if (typeof window === 'undefined') {\n            return false;\n        }\n        for (var k in window) {\n            try {\n                if (!blacklistedKeys['$' + k] && owns(window, k) && window[k] !== null && typeof window[k] === 'object') {\n                    equalsConstructorPrototype(window[k]);\n                }\n            } catch (e) {\n                return true;\n            }\n        }\n        return false;\n    }());\n    var equalsConstructorPrototypeIfNotBuggy = function (object) {\n        if (typeof window === 'undefined' || !hasAutomationEqualityBug) {\n            return equalsConstructorPrototype(object);\n        }\n        try {\n            return equalsConstructorPrototype(object);\n        } catch (e) {\n            return false;\n        }\n    };\n    var dontEnums = [\n        'toString',\n        'toLocaleString',\n        'valueOf',\n        'hasOwnProperty',\n        'isPrototypeOf',\n        'propertyIsEnumerable',\n        'constructor'\n    ];\n    var dontEnumsLength = dontEnums.length;\n\n    // taken directly from https://github.com/ljharb/is-arguments/blob/master/index.js\n    // can be replaced with require('is-arguments') if we ever use a build process instead\n    var isStandardArguments = function isArguments(value) {\n        return toStr(value) === '[object Arguments]';\n    };\n    var isLegacyArguments = function isArguments(value) {\n        return value !== null &&\n            typeof value === 'object' &&\n            typeof value.length === 'number' &&\n            value.length >= 0 &&\n            !isArray(value) &&\n            isCallable(value.callee);\n    };\n    var isArguments = isStandardArguments(arguments) ? isStandardArguments : isLegacyArguments;\n\n    defineProperties($Object, {\n        keys: function keys(object) {\n            var isFn = isCallable(object);\n            var isArgs = isArguments(object);\n            var isObject = object !== null && typeof object === 'object';\n            var isStr = isObject && isString(object);\n\n            if (!isObject && !isFn && !isArgs) {\n                throw new TypeError('Object.keys called on a non-object');\n            }\n\n            var theKeys = [];\n            var skipProto = hasProtoEnumBug && isFn;\n            if ((isStr && hasStringEnumBug) || isArgs) {\n                for (var i = 0; i < object.length; ++i) {\n                    pushCall(theKeys, $String(i));\n                }\n            }\n\n            if (!isArgs) {\n                for (var name in object) {\n                    if (!(skipProto && name === 'prototype') && owns(object, name)) {\n                        pushCall(theKeys, $String(name));\n                    }\n                }\n            }\n\n            if (hasDontEnumBug) {\n                var skipConstructor = equalsConstructorPrototypeIfNotBuggy(object);\n                for (var j = 0; j < dontEnumsLength; j++) {\n                    var dontEnum = dontEnums[j];\n                    if (!(skipConstructor && dontEnum === 'constructor') && owns(object, dontEnum)) {\n                        pushCall(theKeys, dontEnum);\n                    }\n                }\n            }\n            return theKeys;\n        }\n    });\n\n    var keysWorksWithArguments = $Object.keys && (function () {\n        // Safari 5.0 bug\n        return $Object.keys(arguments).length === 2;\n    }(1, 2));\n    var keysHasArgumentsLengthBug = $Object.keys && (function () {\n        var argKeys = $Object.keys(arguments);\n        return arguments.length !== 1 || argKeys.length !== 1 || argKeys[0] !== 1;\n    }(1));\n    var originalKeys = $Object.keys;\n    defineProperties($Object, {\n        keys: function keys(object) {\n            if (isArguments(object)) {\n                return originalKeys(arraySlice(object));\n            } else {\n                return originalKeys(object);\n            }\n        }\n    }, !keysWorksWithArguments || keysHasArgumentsLengthBug);\n\n    //\n    // Date\n    // ====\n    //\n\n    var hasNegativeMonthYearBug = new Date(-3509827329600292).getUTCMonth() !== 0;\n    var aNegativeTestDate = new Date(-1509842289600292);\n    var aPositiveTestDate = new Date(1449662400000);\n    var hasToUTCStringFormatBug = aNegativeTestDate.toUTCString() !== 'Mon, 01 Jan -45875 11:59:59 GMT';\n    var hasToDateStringFormatBug;\n    var hasToStringFormatBug;\n    var timeZoneOffset = aNegativeTestDate.getTimezoneOffset();\n    if (timeZoneOffset < -720) {\n        hasToDateStringFormatBug = aNegativeTestDate.toDateString() !== 'Tue Jan 02 -45875';\n        hasToStringFormatBug = !(/^Thu Dec 10 2015 \\d\\d:\\d\\d:\\d\\d GMT[-\\+]\\d\\d\\d\\d(?: |$)/).test(aPositiveTestDate.toString());\n    } else {\n        hasToDateStringFormatBug = aNegativeTestDate.toDateString() !== 'Mon Jan 01 -45875';\n        hasToStringFormatBug = !(/^Wed Dec 09 2015 \\d\\d:\\d\\d:\\d\\d GMT[-\\+]\\d\\d\\d\\d(?: |$)/).test(aPositiveTestDate.toString());\n    }\n\n    var originalGetFullYear = call.bind(Date.prototype.getFullYear);\n    var originalGetMonth = call.bind(Date.prototype.getMonth);\n    var originalGetDate = call.bind(Date.prototype.getDate);\n    var originalGetUTCFullYear = call.bind(Date.prototype.getUTCFullYear);\n    var originalGetUTCMonth = call.bind(Date.prototype.getUTCMonth);\n    var originalGetUTCDate = call.bind(Date.prototype.getUTCDate);\n    var originalGetUTCDay = call.bind(Date.prototype.getUTCDay);\n    var originalGetUTCHours = call.bind(Date.prototype.getUTCHours);\n    var originalGetUTCMinutes = call.bind(Date.prototype.getUTCMinutes);\n    var originalGetUTCSeconds = call.bind(Date.prototype.getUTCSeconds);\n    var originalGetUTCMilliseconds = call.bind(Date.prototype.getUTCMilliseconds);\n    var dayName = ['Sun', 'Mon', 'Tue', 'Wed', 'Thu', 'Fri', 'Sat'];\n    var monthName = ['Jan', 'Feb', 'Mar', 'Apr', 'May', 'Jun', 'Jul', 'Aug', 'Sep', 'Oct', 'Nov', 'Dec'];\n    var daysInMonth = function daysInMonth(month, year) {\n        return originalGetDate(new Date(year, month, 0));\n    };\n\n    defineProperties(Date.prototype, {\n        getFullYear: function getFullYear() {\n            if (!this || !(this instanceof Date)) {\n                throw new TypeError('this is not a Date object.');\n            }\n            var year = originalGetFullYear(this);\n            if (year < 0 && originalGetMonth(this) > 11) {\n                return year + 1;\n            }\n            return year;\n        },\n        getMonth: function getMonth() {\n            if (!this || !(this instanceof Date)) {\n                throw new TypeError('this is not a Date object.');\n            }\n            var year = originalGetFullYear(this);\n            var month = originalGetMonth(this);\n            if (year < 0 && month > 11) {\n                return 0;\n            }\n            return month;\n        },\n        getDate: function getDate() {\n            if (!this || !(this instanceof Date)) {\n                throw new TypeError('this is not a Date object.');\n            }\n            var year = originalGetFullYear(this);\n            var month = originalGetMonth(this);\n            var date = originalGetDate(this);\n            if (year < 0 && month > 11) {\n                if (month === 12) {\n                    return date;\n                }\n                var days = daysInMonth(0, year + 1);\n                return (days - date) + 1;\n            }\n            return date;\n        },\n        getUTCFullYear: function getUTCFullYear() {\n            if (!this || !(this instanceof Date)) {\n                throw new TypeError('this is not a Date object.');\n            }\n            var year = originalGetUTCFullYear(this);\n            if (year < 0 && originalGetUTCMonth(this) > 11) {\n                return year + 1;\n            }\n            return year;\n        },\n        getUTCMonth: function getUTCMonth() {\n            if (!this || !(this instanceof Date)) {\n                throw new TypeError('this is not a Date object.');\n            }\n            var year = originalGetUTCFullYear(this);\n            var month = originalGetUTCMonth(this);\n            if (year < 0 && month > 11) {\n                return 0;\n            }\n            return month;\n        },\n        getUTCDate: function getUTCDate() {\n            if (!this || !(this instanceof Date)) {\n                throw new TypeError('this is not a Date object.');\n            }\n            var year = originalGetUTCFullYear(this);\n            var month = originalGetUTCMonth(this);\n            var date = originalGetUTCDate(this);\n            if (year < 0 && month > 11) {\n                if (month === 12) {\n                    return date;\n                }\n                var days = daysInMonth(0, year + 1);\n                return (days - date) + 1;\n            }\n            return date;\n        }\n    }, hasNegativeMonthYearBug);\n\n    defineProperties(Date.prototype, {\n        toUTCString: function toUTCString() {\n            if (!this || !(this instanceof Date)) {\n                throw new TypeError('this is not a Date object.');\n            }\n            var day = originalGetUTCDay(this);\n            var date = originalGetUTCDate(this);\n            var month = originalGetUTCMonth(this);\n            var year = originalGetUTCFullYear(this);\n            var hour = originalGetUTCHours(this);\n            var minute = originalGetUTCMinutes(this);\n            var second = originalGetUTCSeconds(this);\n            return dayName[day] + ', ' +\n                (date < 10 ? '0' + date : date) + ' ' +\n                monthName[month] + ' ' +\n                year + ' ' +\n                (hour < 10 ? '0' + hour : hour) + ':' +\n                (minute < 10 ? '0' + minute : minute) + ':' +\n                (second < 10 ? '0' + second : second) + ' GMT';\n        }\n    }, hasNegativeMonthYearBug || hasToUTCStringFormatBug);\n\n    // Opera 12 has `,`\n    defineProperties(Date.prototype, {\n        toDateString: function toDateString() {\n            if (!this || !(this instanceof Date)) {\n                throw new TypeError('this is not a Date object.');\n            }\n            var day = this.getDay();\n            var date = this.getDate();\n            var month = this.getMonth();\n            var year = this.getFullYear();\n            return dayName[day] + ' ' +\n                monthName[month] + ' ' +\n                (date < 10 ? '0' + date : date) + ' ' +\n                year;\n        }\n    }, hasNegativeMonthYearBug || hasToDateStringFormatBug);\n\n    // can't use defineProperties here because of toString enumeration issue in IE <= 8\n    if (hasNegativeMonthYearBug || hasToStringFormatBug) {\n        Date.prototype.toString = function toString() {\n            if (!this || !(this instanceof Date)) {\n                throw new TypeError('this is not a Date object.');\n            }\n            var day = this.getDay();\n            var date = this.getDate();\n            var month = this.getMonth();\n            var year = this.getFullYear();\n            var hour = this.getHours();\n            var minute = this.getMinutes();\n            var second = this.getSeconds();\n            var timezoneOffset = this.getTimezoneOffset();\n            var hoursOffset = Math.floor(Math.abs(timezoneOffset) / 60);\n            var minutesOffset = Math.floor(Math.abs(timezoneOffset) % 60);\n            return dayName[day] + ' ' +\n                monthName[month] + ' ' +\n                (date < 10 ? '0' + date : date) + ' ' +\n                year + ' ' +\n                (hour < 10 ? '0' + hour : hour) + ':' +\n                (minute < 10 ? '0' + minute : minute) + ':' +\n                (second < 10 ? '0' + second : second) + ' GMT' +\n                (timezoneOffset > 0 ? '-' : '+') +\n                (hoursOffset < 10 ? '0' + hoursOffset : hoursOffset) +\n                (minutesOffset < 10 ? '0' + minutesOffset : minutesOffset);\n        };\n        if (supportsDescriptors) {\n            $Object.defineProperty(Date.prototype, 'toString', {\n                configurable: true,\n                enumerable: false,\n                writable: true\n            });\n        }\n    }\n\n    // ES5 15.9.5.43\n    // http://es5.github.com/#x15.9.5.43\n    // This function returns a String value represent the instance in time\n    // represented by this Date object. The format of the String is the Date Time\n    // string format defined in 15.9.1.15. All fields are present in the String.\n    // The time zone is always UTC, denoted by the suffix Z. If the time value of\n    // this object is not a finite Number a RangeError exception is thrown.\n    var negativeDate = -62198755200000;\n    var negativeYearString = '-000001';\n    var hasNegativeDateBug = Date.prototype.toISOString && new Date(negativeDate).toISOString().indexOf(negativeYearString) === -1;\n    var hasSafari51DateBug = Date.prototype.toISOString && new Date(-1).toISOString() !== '1969-12-31T23:59:59.999Z';\n\n    var getTime = call.bind(Date.prototype.getTime);\n\n    defineProperties(Date.prototype, {\n        toISOString: function toISOString() {\n            if (!isFinite(this) || !isFinite(getTime(this))) {\n                // Adope Photoshop requires the second check.\n                throw new RangeError('Date.prototype.toISOString called on non-finite value.');\n            }\n\n            var year = originalGetUTCFullYear(this);\n\n            var month = originalGetUTCMonth(this);\n            // see https://github.com/es-shims/es5-shim/issues/111\n            year += Math.floor(month / 12);\n            month = (month % 12 + 12) % 12;\n\n            // the date time string format is specified in 15.9.1.15.\n            var result = [month + 1, originalGetUTCDate(this), originalGetUTCHours(this), originalGetUTCMinutes(this), originalGetUTCSeconds(this)];\n            year = (\n                (year < 0 ? '-' : (year > 9999 ? '+' : '')) +\n                strSlice('00000' + Math.abs(year), (0 <= year && year <= 9999) ? -4 : -6)\n            );\n\n            for (var i = 0; i < result.length; ++i) {\n                // pad months, days, hours, minutes, and seconds to have two digits.\n                result[i] = strSlice('00' + result[i], -2);\n            }\n            // pad milliseconds to have three digits.\n            return (\n                year + '-' + arraySlice(result, 0, 2).join('-') +\n                'T' + arraySlice(result, 2).join(':') + '.' +\n                strSlice('000' + originalGetUTCMilliseconds(this), -3) + 'Z'\n            );\n        }\n    }, hasNegativeDateBug || hasSafari51DateBug);\n\n    // ES5 15.9.5.44\n    // http://es5.github.com/#x15.9.5.44\n    // This function provides a String representation of a Date object for use by\n    // JSON.stringify (15.12.3).\n    var dateToJSONIsSupported = (function () {\n        try {\n            return Date.prototype.toJSON &&\n                new Date(NaN).toJSON() === null &&\n                new Date(negativeDate).toJSON().indexOf(negativeYearString) !== -1 &&\n                Date.prototype.toJSON.call({ // generic\n                    toISOString: function () { return true; }\n                });\n        } catch (e) {\n            return false;\n        }\n    }());\n    if (!dateToJSONIsSupported) {\n        Date.prototype.toJSON = function toJSON(key) {\n            // When the toJSON method is called with argument key, the following\n            // steps are taken:\n\n            // 1.  Let O be the result of calling ToObject, giving it the this\n            // value as its argument.\n            // 2. Let tv be ES.ToPrimitive(O, hint Number).\n            var O = $Object(this);\n            var tv = ES.ToPrimitive(O);\n            // 3. If tv is a Number and is not finite, return null.\n            if (typeof tv === 'number' && !isFinite(tv)) {\n                return null;\n            }\n            // 4. Let toISO be the result of calling the [[Get]] internal method of\n            // O with argument \"toISOString\".\n            var toISO = O.toISOString;\n            // 5. If IsCallable(toISO) is false, throw a TypeError exception.\n            if (!isCallable(toISO)) {\n                throw new TypeError('toISOString property is not callable');\n            }\n            // 6. Return the result of calling the [[Call]] internal method of\n            //  toISO with O as the this value and an empty argument list.\n            return toISO.call(O);\n\n            // NOTE 1 The argument is ignored.\n\n            // NOTE 2 The toJSON function is intentionally generic; it does not\n            // require that its this value be a Date object. Therefore, it can be\n            // transferred to other kinds of objects for use as a method. However,\n            // it does require that any such object have a toISOString method. An\n            // object is free to use the argument key to filter its\n            // stringification.\n        };\n    }\n\n    // ES5 15.9.4.2\n    // http://es5.github.com/#x15.9.4.2\n    // based on work shared by Daniel Friesen (dantman)\n    // http://gist.github.com/303249\n    var supportsExtendedYears = Date.parse('+033658-09-27T01:46:40.000Z') === 1e15;\n    var acceptsInvalidDates = !isNaN(Date.parse('2012-04-04T24:00:00.500Z')) || !isNaN(Date.parse('2012-11-31T23:59:59.000Z')) || !isNaN(Date.parse('2012-12-31T23:59:60.000Z'));\n    var doesNotParseY2KNewYear = isNaN(Date.parse('2000-01-01T00:00:00.000Z'));\n    if (doesNotParseY2KNewYear || acceptsInvalidDates || !supportsExtendedYears) {\n        // XXX global assignment won't work in embeddings that use\n        // an alternate object for the context.\n        /* global Date: true */\n        /* eslint-disable no-undef */\n        var maxSafeUnsigned32Bit = Math.pow(2, 31) - 1;\n        var hasSafariSignedIntBug = isActualNaN(new Date(1970, 0, 1, 0, 0, 0, maxSafeUnsigned32Bit + 1).getTime());\n        /* eslint-disable no-implicit-globals */\n        Date = (function (NativeDate) {\n        /* eslint-enable no-implicit-globals */\n        /* eslint-enable no-undef */\n            // Date.length === 7\n            var DateShim = function Date(Y, M, D, h, m, s, ms) {\n                var length = arguments.length;\n                var date;\n                if (this instanceof NativeDate) {\n                    var seconds = s;\n                    var millis = ms;\n                    if (hasSafariSignedIntBug && length >= 7 && ms > maxSafeUnsigned32Bit) {\n                        // work around a Safari 8/9 bug where it treats the seconds as signed\n                        var msToShift = Math.floor(ms / maxSafeUnsigned32Bit) * maxSafeUnsigned32Bit;\n                        var sToShift = Math.floor(msToShift / 1e3);\n                        seconds += sToShift;\n                        millis -= sToShift * 1e3;\n                    }\n                    date = length === 1 && $String(Y) === Y ? // isString(Y)\n                        // We explicitly pass it through parse:\n                        new NativeDate(DateShim.parse(Y)) :\n                        // We have to manually make calls depending on argument\n                        // length here\n                        length >= 7 ? new NativeDate(Y, M, D, h, m, seconds, millis) :\n                        length >= 6 ? new NativeDate(Y, M, D, h, m, seconds) :\n                        length >= 5 ? new NativeDate(Y, M, D, h, m) :\n                        length >= 4 ? new NativeDate(Y, M, D, h) :\n                        length >= 3 ? new NativeDate(Y, M, D) :\n                        length >= 2 ? new NativeDate(Y, M) :\n                        length >= 1 ? new NativeDate(Y instanceof NativeDate ? +Y : Y) :\n                                      new NativeDate();\n                } else {\n                    date = NativeDate.apply(this, arguments);\n                }\n                if (!isPrimitive(date)) {\n                    // Prevent mixups with unfixed Date object\n                    defineProperties(date, { constructor: DateShim }, true);\n                }\n                return date;\n            };\n\n            // 15.9.1.15 Date Time String Format.\n            var isoDateExpression = new RegExp('^' +\n                '(\\\\d{4}|[+-]\\\\d{6})' + // four-digit year capture or sign +\n                                          // 6-digit extended year\n                '(?:-(\\\\d{2})' + // optional month capture\n                '(?:-(\\\\d{2})' + // optional day capture\n                '(?:' + // capture hours:minutes:seconds.milliseconds\n                    'T(\\\\d{2})' + // hours capture\n                    ':(\\\\d{2})' + // minutes capture\n                    '(?:' + // optional :seconds.milliseconds\n                        ':(\\\\d{2})' + // seconds capture\n                        '(?:(\\\\.\\\\d{1,}))?' + // milliseconds capture\n                    ')?' +\n                '(' + // capture UTC offset component\n                    'Z|' + // UTC capture\n                    '(?:' + // offset specifier +/-hours:minutes\n                        '([-+])' + // sign capture\n                        '(\\\\d{2})' + // hours offset capture\n                        ':(\\\\d{2})' + // minutes offset capture\n                    ')' +\n                ')?)?)?)?' +\n            '$');\n\n            var months = [0, 31, 59, 90, 120, 151, 181, 212, 243, 273, 304, 334, 365];\n\n            var dayFromMonth = function dayFromMonth(year, month) {\n                var t = month > 1 ? 1 : 0;\n                return (\n                    months[month] +\n                    Math.floor((year - 1969 + t) / 4) -\n                    Math.floor((year - 1901 + t) / 100) +\n                    Math.floor((year - 1601 + t) / 400) +\n                    365 * (year - 1970)\n                );\n            };\n\n            var toUTC = function toUTC(t) {\n                var s = 0;\n                var ms = t;\n                if (hasSafariSignedIntBug && ms > maxSafeUnsigned32Bit) {\n                    // work around a Safari 8/9 bug where it treats the seconds as signed\n                    var msToShift = Math.floor(ms / maxSafeUnsigned32Bit) * maxSafeUnsigned32Bit;\n                    var sToShift = Math.floor(msToShift / 1e3);\n                    s += sToShift;\n                    ms -= sToShift * 1e3;\n                }\n                return $Number(new NativeDate(1970, 0, 1, 0, 0, s, ms));\n            };\n\n            // Copy any custom methods a 3rd party library may have added\n            for (var key in NativeDate) {\n                if (owns(NativeDate, key)) {\n                    DateShim[key] = NativeDate[key];\n                }\n            }\n\n            // Copy \"native\" methods explicitly; they may be non-enumerable\n            defineProperties(DateShim, {\n                now: NativeDate.now,\n                UTC: NativeDate.UTC\n            }, true);\n            DateShim.prototype = NativeDate.prototype;\n            defineProperties(DateShim.prototype, {\n                constructor: DateShim\n            }, true);\n\n            // Upgrade Date.parse to handle simplified ISO 8601 strings\n            var parseShim = function parse(string) {\n                var match = isoDateExpression.exec(string);\n                if (match) {\n                    // parse months, days, hours, minutes, seconds, and milliseconds\n                    // provide default values if necessary\n                    // parse the UTC offset component\n                    var year = $Number(match[1]),\n                        month = $Number(match[2] || 1) - 1,\n                        day = $Number(match[3] || 1) - 1,\n                        hour = $Number(match[4] || 0),\n                        minute = $Number(match[5] || 0),\n                        second = $Number(match[6] || 0),\n                        millisecond = Math.floor($Number(match[7] || 0) * 1000),\n                        // When time zone is missed, local offset should be used\n                        // (ES 5.1 bug)\n                        // see https://bugs.ecmascript.org/show_bug.cgi?id=112\n                        isLocalTime = Boolean(match[4] && !match[8]),\n                        signOffset = match[9] === '-' ? 1 : -1,\n                        hourOffset = $Number(match[10] || 0),\n                        minuteOffset = $Number(match[11] || 0),\n                        result;\n                    var hasMinutesOrSecondsOrMilliseconds = minute > 0 || second > 0 || millisecond > 0;\n                    if (\n                        hour < (hasMinutesOrSecondsOrMilliseconds ? 24 : 25) &&\n                        minute < 60 && second < 60 && millisecond < 1000 &&\n                        month > -1 && month < 12 && hourOffset < 24 &&\n                        minuteOffset < 60 && // detect invalid offsets\n                        day > -1 &&\n                        day < (dayFromMonth(year, month + 1) - dayFromMonth(year, month))\n                    ) {\n                        result = (\n                            (dayFromMonth(year, month) + day) * 24 +\n                            hour +\n                            hourOffset * signOffset\n                        ) * 60;\n                        result = (\n                            (result + minute + minuteOffset * signOffset) * 60 +\n                            second\n                        ) * 1000 + millisecond;\n                        if (isLocalTime) {\n                            result = toUTC(result);\n                        }\n                        if (-8.64e15 <= result && result <= 8.64e15) {\n                            return result;\n                        }\n                    }\n                    return NaN;\n                }\n                return NativeDate.parse.apply(this, arguments);\n            };\n            defineProperties(DateShim, { parse: parseShim });\n\n            return DateShim;\n        }(Date));\n        /* global Date: false */\n    }\n\n    // ES5 15.9.4.4\n    // http://es5.github.com/#x15.9.4.4\n    if (!Date.now) {\n        Date.now = function now() {\n            return new Date().getTime();\n        };\n    }\n\n    //\n    // Number\n    // ======\n    //\n\n    // ES5.1 15.7.4.5\n    // http://es5.github.com/#x15.7.4.5\n    var hasToFixedBugs = NumberPrototype.toFixed && (\n      (0.00008).toFixed(3) !== '0.000' ||\n      (0.9).toFixed(0) !== '1' ||\n      (1.255).toFixed(2) !== '1.25' ||\n      (1000000000000000128).toFixed(0) !== '1000000000000000128'\n    );\n\n    var toFixedHelpers = {\n        base: 1e7,\n        size: 6,\n        data: [0, 0, 0, 0, 0, 0],\n        multiply: function multiply(n, c) {\n            var i = -1;\n            var c2 = c;\n            while (++i < toFixedHelpers.size) {\n                c2 += n * toFixedHelpers.data[i];\n                toFixedHelpers.data[i] = c2 % toFixedHelpers.base;\n                c2 = Math.floor(c2 / toFixedHelpers.base);\n            }\n        },\n        divide: function divide(n) {\n            var i = toFixedHelpers.size;\n            var c = 0;\n            while (--i >= 0) {\n                c += toFixedHelpers.data[i];\n                toFixedHelpers.data[i] = Math.floor(c / n);\n                c = (c % n) * toFixedHelpers.base;\n            }\n        },\n        numToString: function numToString() {\n            var i = toFixedHelpers.size;\n            var s = '';\n            while (--i >= 0) {\n                if (s !== '' || i === 0 || toFixedHelpers.data[i] !== 0) {\n                    var t = $String(toFixedHelpers.data[i]);\n                    if (s === '') {\n                        s = t;\n                    } else {\n                        s += strSlice('0000000', 0, 7 - t.length) + t;\n                    }\n                }\n            }\n            return s;\n        },\n        pow: function pow(x, n, acc) {\n            return (n === 0 ? acc : (n % 2 === 1 ? pow(x, n - 1, acc * x) : pow(x * x, n / 2, acc)));\n        },\n        log: function log(x) {\n            var n = 0;\n            var x2 = x;\n            while (x2 >= 4096) {\n                n += 12;\n                x2 /= 4096;\n            }\n            while (x2 >= 2) {\n                n += 1;\n                x2 /= 2;\n            }\n            return n;\n        }\n    };\n\n    var toFixedShim = function toFixed(fractionDigits) {\n        var f, x, s, m, e, z, j, k;\n\n        // Test for NaN and round fractionDigits down\n        f = $Number(fractionDigits);\n        f = isActualNaN(f) ? 0 : Math.floor(f);\n\n        if (f < 0 || f > 20) {\n            throw new RangeError('Number.toFixed called with invalid number of decimals');\n        }\n\n        x = $Number(this);\n\n        if (isActualNaN(x)) {\n            return 'NaN';\n        }\n\n        // If it is too big or small, return the string value of the number\n        if (x <= -1e21 || x >= 1e21) {\n            return $String(x);\n        }\n\n        s = '';\n\n        if (x < 0) {\n            s = '-';\n            x = -x;\n        }\n\n        m = '0';\n\n        if (x > 1e-21) {\n            // 1e-21 < x < 1e21\n            // -70 < log2(x) < 70\n            e = toFixedHelpers.log(x * toFixedHelpers.pow(2, 69, 1)) - 69;\n            z = (e < 0 ? x * toFixedHelpers.pow(2, -e, 1) : x / toFixedHelpers.pow(2, e, 1));\n            z *= 0x10000000000000; // Math.pow(2, 52);\n            e = 52 - e;\n\n            // -18 < e < 122\n            // x = z / 2 ^ e\n            if (e > 0) {\n                toFixedHelpers.multiply(0, z);\n                j = f;\n\n                while (j >= 7) {\n                    toFixedHelpers.multiply(1e7, 0);\n                    j -= 7;\n                }\n\n                toFixedHelpers.multiply(toFixedHelpers.pow(10, j, 1), 0);\n                j = e - 1;\n\n                while (j >= 23) {\n                    toFixedHelpers.divide(1 << 23);\n                    j -= 23;\n                }\n\n                toFixedHelpers.divide(1 << j);\n                toFixedHelpers.multiply(1, 1);\n                toFixedHelpers.divide(2);\n                m = toFixedHelpers.numToString();\n            } else {\n                toFixedHelpers.multiply(0, z);\n                toFixedHelpers.multiply(1 << (-e), 0);\n                m = toFixedHelpers.numToString() + strSlice('0.00000000000000000000', 2, 2 + f);\n            }\n        }\n\n        if (f > 0) {\n            k = m.length;\n\n            if (k <= f) {\n                m = s + strSlice('0.0000000000000000000', 0, f - k + 2) + m;\n            } else {\n                m = s + strSlice(m, 0, k - f) + '.' + strSlice(m, k - f);\n            }\n        } else {\n            m = s + m;\n        }\n\n        return m;\n    };\n    defineProperties(NumberPrototype, { toFixed: toFixedShim }, hasToFixedBugs);\n\n    var hasToPrecisionUndefinedBug = (function () {\n        try {\n            return 1.0.toPrecision(undefined) === '1';\n        } catch (e) {\n            return true;\n        }\n    }());\n    var originalToPrecision = NumberPrototype.toPrecision;\n    defineProperties(NumberPrototype, {\n        toPrecision: function toPrecision(precision) {\n            return typeof precision === 'undefined' ? originalToPrecision.call(this) : originalToPrecision.call(this, precision);\n        }\n    }, hasToPrecisionUndefinedBug);\n\n    //\n    // String\n    // ======\n    //\n\n    // ES5 15.5.4.14\n    // http://es5.github.com/#x15.5.4.14\n\n    // [bugfix, IE lt 9, firefox 4, Konqueror, Opera, obscure browsers]\n    // Many browsers do not split properly with regular expressions or they\n    // do not perform the split correctly under obscure conditions.\n    // See http://blog.stevenlevithan.com/archives/cross-browser-split\n    // I've tested in many browsers and this seems to cover the deviant ones:\n    //    'ab'.split(/(?:ab)*/) should be [\"\", \"\"], not [\"\"]\n    //    '.'.split(/(.?)(.?)/) should be [\"\", \".\", \"\", \"\"], not [\"\", \"\"]\n    //    'tesst'.split(/(s)*/) should be [\"t\", undefined, \"e\", \"s\", \"t\"], not\n    //       [undefined, \"t\", undefined, \"e\", ...]\n    //    ''.split(/.?/) should be [], not [\"\"]\n    //    '.'.split(/()()/) should be [\".\"], not [\"\", \"\", \".\"]\n\n    if (\n        'ab'.split(/(?:ab)*/).length !== 2 ||\n        '.'.split(/(.?)(.?)/).length !== 4 ||\n        'tesst'.split(/(s)*/)[1] === 't' ||\n        'test'.split(/(?:)/, -1).length !== 4 ||\n        ''.split(/.?/).length ||\n        '.'.split(/()()/).length > 1\n    ) {\n        (function () {\n            var compliantExecNpcg = typeof (/()??/).exec('')[1] === 'undefined'; // NPCG: nonparticipating capturing group\n            var maxSafe32BitInt = Math.pow(2, 32) - 1;\n\n            StringPrototype.split = function (separator, limit) {\n                var string = String(this);\n                if (typeof separator === 'undefined' && limit === 0) {\n                    return [];\n                }\n\n                // If `separator` is not a regex, use native split\n                if (!isRegex(separator)) {\n                    return strSplit(this, separator, limit);\n                }\n\n                var output = [];\n                var flags = (separator.ignoreCase ? 'i' : '') +\n                            (separator.multiline ? 'm' : '') +\n                            (separator.unicode ? 'u' : '') + // in ES6\n                            (separator.sticky ? 'y' : ''), // Firefox 3+ and ES6\n                    lastLastIndex = 0,\n                    // Make `global` and avoid `lastIndex` issues by working with a copy\n                    separator2, match, lastIndex, lastLength;\n                var separatorCopy = new RegExp(separator.source, flags + 'g');\n                if (!compliantExecNpcg) {\n                    // Doesn't need flags gy, but they don't hurt\n                    separator2 = new RegExp('^' + separatorCopy.source + '$(?!\\\\s)', flags);\n                }\n                /* Values for `limit`, per the spec:\n                 * If undefined: 4294967295 // maxSafe32BitInt\n                 * If 0, Infinity, or NaN: 0\n                 * If positive number: limit = Math.floor(limit); if (limit > 4294967295) limit -= 4294967296;\n                 * If negative number: 4294967296 - Math.floor(Math.abs(limit))\n                 * If other: Type-convert, then use the above rules\n                 */\n                var splitLimit = typeof limit === 'undefined' ? maxSafe32BitInt : ES.ToUint32(limit);\n                match = separatorCopy.exec(string);\n                while (match) {\n                    // `separatorCopy.lastIndex` is not reliable cross-browser\n                    lastIndex = match.index + match[0].length;\n                    if (lastIndex > lastLastIndex) {\n                        pushCall(output, strSlice(string, lastLastIndex, match.index));\n                        // Fix browsers whose `exec` methods don't consistently return `undefined` for\n                        // nonparticipating capturing groups\n                        if (!compliantExecNpcg && match.length > 1) {\n                            /* eslint-disable no-loop-func */\n                            match[0].replace(separator2, function () {\n                                for (var i = 1; i < arguments.length - 2; i++) {\n                                    if (typeof arguments[i] === 'undefined') {\n                                        match[i] = void 0;\n                                    }\n                                }\n                            });\n                            /* eslint-enable no-loop-func */\n                        }\n                        if (match.length > 1 && match.index < string.length) {\n                            array_push.apply(output, arraySlice(match, 1));\n                        }\n                        lastLength = match[0].length;\n                        lastLastIndex = lastIndex;\n                        if (output.length >= splitLimit) {\n                            break;\n                        }\n                    }\n                    if (separatorCopy.lastIndex === match.index) {\n                        separatorCopy.lastIndex++; // Avoid an infinite loop\n                    }\n                    match = separatorCopy.exec(string);\n                }\n                if (lastLastIndex === string.length) {\n                    if (lastLength || !separatorCopy.test('')) {\n                        pushCall(output, '');\n                    }\n                } else {\n                    pushCall(output, strSlice(string, lastLastIndex));\n                }\n                return output.length > splitLimit ? arraySlice(output, 0, splitLimit) : output;\n            };\n        }());\n\n    // [bugfix, chrome]\n    // If separator is undefined, then the result array contains just one String,\n    // which is the this value (converted to a String). If limit is not undefined,\n    // then the output array is truncated so that it contains no more than limit\n    // elements.\n    // \"0\".split(undefined, 0) -> []\n    } else if ('0'.split(void 0, 0).length) {\n        StringPrototype.split = function split(separator, limit) {\n            if (typeof separator === 'undefined' && limit === 0) {\n                return [];\n            }\n            return strSplit(this, separator, limit);\n        };\n    }\n\n    var str_replace = StringPrototype.replace;\n    var replaceReportsGroupsCorrectly = (function () {\n        var groups = [];\n        'x'.replace(/x(.)?/g, function (match, group) {\n            pushCall(groups, group);\n        });\n        return groups.length === 1 && typeof groups[0] === 'undefined';\n    }());\n\n    if (!replaceReportsGroupsCorrectly) {\n        StringPrototype.replace = function replace(searchValue, replaceValue) {\n            var isFn = isCallable(replaceValue);\n            var hasCapturingGroups = isRegex(searchValue) && (/\\)[*?]/).test(searchValue.source);\n            if (!isFn || !hasCapturingGroups) {\n                return str_replace.call(this, searchValue, replaceValue);\n            } else {\n                var wrappedReplaceValue = function (match) {\n                    var length = arguments.length;\n                    var originalLastIndex = searchValue.lastIndex;\n                    searchValue.lastIndex = 0;\n                    var args = searchValue.exec(match) || [];\n                    searchValue.lastIndex = originalLastIndex;\n                    pushCall(args, arguments[length - 2], arguments[length - 1]);\n                    return replaceValue.apply(this, args);\n                };\n                return str_replace.call(this, searchValue, wrappedReplaceValue);\n            }\n        };\n    }\n\n    // ECMA-262, 3rd B.2.3\n    // Not an ECMAScript standard, although ECMAScript 3rd Edition has a\n    // non-normative section suggesting uniform semantics and it should be\n    // normalized across all browsers\n    // [bugfix, IE lt 9] IE < 9 substr() with negative value not working in IE\n    var string_substr = StringPrototype.substr;\n    var hasNegativeSubstrBug = ''.substr && '0b'.substr(-1) !== 'b';\n    defineProperties(StringPrototype, {\n        substr: function substr(start, length) {\n            var normalizedStart = start;\n            if (start < 0) {\n                normalizedStart = max(this.length + start, 0);\n            }\n            return string_substr.call(this, normalizedStart, length);\n        }\n    }, hasNegativeSubstrBug);\n\n    // ES5 15.5.4.20\n    // whitespace from: http://es5.github.io/#x15.5.4.20\n    var ws = '\\x09\\x0A\\x0B\\x0C\\x0D\\x20\\xA0\\u1680\\u180E\\u2000\\u2001\\u2002\\u2003' +\n        '\\u2004\\u2005\\u2006\\u2007\\u2008\\u2009\\u200A\\u202F\\u205F\\u3000\\u2028' +\n        '\\u2029\\uFEFF';\n    var zeroWidth = '\\u200b';\n    var wsRegexChars = '[' + ws + ']';\n    var trimBeginRegexp = new RegExp('^' + wsRegexChars + wsRegexChars + '*');\n    var trimEndRegexp = new RegExp(wsRegexChars + wsRegexChars + '*$');\n    var hasTrimWhitespaceBug = StringPrototype.trim && (ws.trim() || !zeroWidth.trim());\n    defineProperties(StringPrototype, {\n        // http://blog.stevenlevithan.com/archives/faster-trim-javascript\n        // http://perfectionkills.com/whitespace-deviations/\n        trim: function trim() {\n            if (typeof this === 'undefined' || this === null) {\n                throw new TypeError(\"can't convert \" + this + ' to object');\n            }\n            return $String(this).replace(trimBeginRegexp, '').replace(trimEndRegexp, '');\n        }\n    }, hasTrimWhitespaceBug);\n    var trim = call.bind(String.prototype.trim);\n\n    var hasLastIndexBug = StringPrototype.lastIndexOf && 'abcあい'.lastIndexOf('あい', 2) !== -1;\n    defineProperties(StringPrototype, {\n        lastIndexOf: function lastIndexOf(searchString) {\n            if (typeof this === 'undefined' || this === null) {\n                throw new TypeError(\"can't convert \" + this + ' to object');\n            }\n            var S = $String(this);\n            var searchStr = $String(searchString);\n            var numPos = arguments.length > 1 ? $Number(arguments[1]) : NaN;\n            var pos = isActualNaN(numPos) ? Infinity : ES.ToInteger(numPos);\n            var start = min(max(pos, 0), S.length);\n            var searchLen = searchStr.length;\n            var k = start + searchLen;\n            while (k > 0) {\n                k = max(0, k - searchLen);\n                var index = strIndexOf(strSlice(S, k, start + searchLen), searchStr);\n                if (index !== -1) {\n                    return k + index;\n                }\n            }\n            return -1;\n        }\n    }, hasLastIndexBug);\n\n    var originalLastIndexOf = StringPrototype.lastIndexOf;\n    defineProperties(StringPrototype, {\n        lastIndexOf: function lastIndexOf(searchString) {\n            return originalLastIndexOf.apply(this, arguments);\n        }\n    }, StringPrototype.lastIndexOf.length !== 1);\n\n    // ES-5 15.1.2.2\n    /* eslint-disable radix */\n    if (parseInt(ws + '08') !== 8 || parseInt(ws + '0x16') !== 22) {\n    /* eslint-enable radix */\n        /* global parseInt: true */\n        parseInt = (function (origParseInt) {\n            var hexRegex = /^[\\-+]?0[xX]/;\n            return function parseInt(str, radix) {\n                var string = trim(String(str));\n                var defaultedRadix = $Number(radix) || (hexRegex.test(string) ? 16 : 10);\n                return origParseInt(string, defaultedRadix);\n            };\n        }(parseInt));\n    }\n\n    // https://es5.github.io/#x15.1.2.3\n    if (1 / parseFloat('-0') !== -Infinity) {\n        /* global parseFloat: true */\n        parseFloat = (function (origParseFloat) {\n            return function parseFloat(string) {\n                var inputString = trim(String(string));\n                var result = origParseFloat(inputString);\n                return result === 0 && strSlice(inputString, 0, 1) === '-' ? -0 : result;\n            };\n        }(parseFloat));\n    }\n\n    if (String(new RangeError('test')) !== 'RangeError: test') {\n        var errorToStringShim = function toString() {\n            if (typeof this === 'undefined' || this === null) {\n                throw new TypeError(\"can't convert \" + this + ' to object');\n            }\n            var name = this.name;\n            if (typeof name === 'undefined') {\n                name = 'Error';\n            } else if (typeof name !== 'string') {\n                name = $String(name);\n            }\n            var msg = this.message;\n            if (typeof msg === 'undefined') {\n                msg = '';\n            } else if (typeof msg !== 'string') {\n                msg = $String(msg);\n            }\n            if (!name) {\n                return msg;\n            }\n            if (!msg) {\n                return name;\n            }\n            return name + ': ' + msg;\n        };\n        // can't use defineProperties here because of toString enumeration issue in IE <= 8\n        Error.prototype.toString = errorToStringShim;\n    }\n\n    if (supportsDescriptors) {\n        var ensureNonEnumerable = function (obj, prop) {\n            if (isEnum(obj, prop)) {\n                var desc = Object.getOwnPropertyDescriptor(obj, prop);\n                if (desc.configurable) {\n                    desc.enumerable = false;\n                    Object.defineProperty(obj, prop, desc);\n                }\n            }\n        };\n        ensureNonEnumerable(Error.prototype, 'message');\n        if (Error.prototype.message !== '') {\n            Error.prototype.message = '';\n        }\n        ensureNonEnumerable(Error.prototype, 'name');\n    }\n\n    if (String(/a/mig) !== '/a/gim') {\n        var regexToString = function toString() {\n            var str = '/' + this.source + '/';\n            if (this.global) {\n                str += 'g';\n            }\n            if (this.ignoreCase) {\n                str += 'i';\n            }\n            if (this.multiline) {\n                str += 'm';\n            }\n            return str;\n        };\n        // can't use defineProperties here because of toString enumeration issue in IE <= 8\n        RegExp.prototype.toString = regexToString;\n    }\n}));\n\n'use strict';\n/*jslint eqeq: true*/\n\nHandlebars.registerHelper('sanitize', function (text) {\n    var result;\n\n    if (text === undefined) { return ''; }\n\n    result = sanitizeHtml(text, {\n        allowedTags: [ 'div', 'span', 'b', 'i', 'em', 'strong', 'a', 'br', 'table', 'tbody', 'tr', 'th', 'td' ],\n        allowedAttributes: {\n            'div': [ 'class' ],\n            'span': [ 'class' ],\n            'table': [ 'class' ],\n            'td': [ 'class' ],\n            'th': [ 'colspan' ],\n            'a': [ 'href' ]\n        }\n    });\n\n    return new Handlebars.SafeString(result);\n});\n\nHandlebars.registerHelper('renderTextParam', function(param) {\n    var result, type = 'text', idAtt = '';\n    var paramType = param.type || param.schema && param.schema.type || '';\n    var isArray = paramType.toLowerCase() === 'array' || param.allowMultiple;\n    var defaultValue = isArray && Array.isArray(param.default) ? param.default.join('\\n') : param.default;\n    var name = Handlebars.Utils.escapeExpression(param.name);\n    var valueId = Handlebars.Utils.escapeExpression(param.valueId);\n    paramType = Handlebars.Utils.escapeExpression(paramType);\n\n    var dataVendorExtensions = Object.keys(param).filter(function(property) {\n        // filter X-data- properties\n        return property.match(/^X-data-/i) !== null;\n    }).reduce(function(result, property) {\n        // remove X- from property name, so it results in html attributes like data-foo='bar'\n        return result += ' ' + property.substring(2, property.length) + '=\\'' + param[property] + '\\'';\n    }, '');\n\n    if(param.format && param.format === 'password') {\n        type = 'password';\n    }\n\n    if(valueId) {\n        idAtt = ' id=\\'' + valueId + '\\'';\n    }\n\n    if (defaultValue) {\n      defaultValue = sanitizeHtml(defaultValue);\n    } else {\n      defaultValue = '';\n    }\n\n    if(isArray) {\n        result = '<textarea class=\\'body-textarea' + (param.required ? ' required' : '') + '\\' name=\\'' + name + '\\'' + idAtt + dataVendorExtensions;\n        result += ' placeholder=\\'Provide multiple values in new lines' + (param.required ? ' (at least one required).' : '.') + '\\'>';\n        result += defaultValue + '</textarea>';\n    } else {\n        var parameterClass = 'parameter';\n        if(param.required) {\n          parameterClass += ' required';\n        }\n        result = '<input class=\\'' + parameterClass + '\\' minlength=\\'' + (param.required ? 1 : 0) + '\\'';\n        result += ' name=\\'' + name +'\\' placeholder=\\'' + (param.required ? '(required)' : '') + '\\'' + idAtt + dataVendorExtensions;\n        result += ' type=\\'' + type + '\\' value=\\'' + defaultValue + '\\'/>';\n    }\n    return new Handlebars.SafeString(result);\n});\n\nHandlebars.registerHelper('ifCond', function (v1, operator, v2, options) {\n\n    switch (operator) {\n        case '==':\n            return (v1 == v2) ? options.fn(this) : options.inverse(this);\n        case '===':\n            return (v1 === v2) ? options.fn(this) : options.inverse(this);\n        case '<':\n            return (v1 < v2) ? options.fn(this) : options.inverse(this);\n        case '<=':\n            return (v1 <= v2) ? options.fn(this) : options.inverse(this);\n        case '>':\n            return (v1 > v2) ? options.fn(this) : options.inverse(this);\n        case '>=':\n            return (v1 >= v2) ? options.fn(this) : options.inverse(this);\n        case '&&':\n            return (v1 && v2) ? options.fn(this) : options.inverse(this);\n        case '||':\n            return (v1 || v2) ? options.fn(this) : options.inverse(this);\n        default:\n            return options.inverse(this);\n    }\n});\n\nHandlebars.registerHelper('escape', function (value) {\n    var text = Handlebars.Utils.escapeExpression(value);\n\n    return new Handlebars.SafeString(text);\n});\n\n(function(f){if(typeof exports===\"object\"&&typeof module!==\"undefined\"){module.exports=f()}else if(typeof define===\"function\"&&define.amd){define([],f)}else{var g;if(typeof window!==\"undefined\"){g=window}else if(typeof global!==\"undefined\"){g=global}else if(typeof self!==\"undefined\"){g=self}else{g=this}g.sanitizeHtml=f()}})(function(){var define,module,exports;return function e(t,n,r){function s(o,u){if(!n[o]){if(!t[o]){var a=typeof require==\"function\"&&require;if(!u&&a)return a(o,!0);if(i)return i(o,!0);var f=new Error(\"Cannot find module '\"+o+\"'\");throw f.code=\"MODULE_NOT_FOUND\",f}var l=n[o]={exports:{}};t[o][0].call(l.exports,function(e){var n=t[o][1][e];return s(n?n:e)},l,l.exports,e,t,n,r)}return n[o].exports}var i=typeof require==\"function\"&&require;for(var o=0;o<r.length;o++)s(r[o]);return s}({1:[function(require,module,exports){var htmlparser=require(\"htmlparser2\");var extend=require(\"xtend\");var quoteRegexp=require(\"regexp-quote\");function each(obj,cb){if(obj)Object.keys(obj).forEach(function(key){cb(obj[key],key)})}function has(obj,key){return{}.hasOwnProperty.call(obj,key)}module.exports=sanitizeHtml;function sanitizeHtml(html,options,_recursing){var result=\"\";function Frame(tag,attribs){var that=this;this.tag=tag;this.attribs=attribs||{};this.tagPosition=result.length;this.text=\"\";this.updateParentNodeText=function(){if(stack.length){var parentFrame=stack[stack.length-1];parentFrame.text+=that.text}}}if(!options){options=sanitizeHtml.defaults;options.parser=htmlParserDefaults}else{options=extend(sanitizeHtml.defaults,options);if(options.parser){options.parser=extend(htmlParserDefaults,options.parser)}else{options.parser=htmlParserDefaults}}var nonTextTagsArray=options.nonTextTags||[\"script\",\"style\",\"textarea\"];var allowedAttributesMap;var allowedAttributesGlobMap;if(options.allowedAttributes){allowedAttributesMap={};allowedAttributesGlobMap={};each(options.allowedAttributes,function(attributes,tag){allowedAttributesMap[tag]=[];var globRegex=[];attributes.forEach(function(name){if(name.indexOf(\"*\")>=0){globRegex.push(quoteRegexp(name).replace(/\\\\\\*/g,\".*\"))}else{allowedAttributesMap[tag].push(name)}});allowedAttributesGlobMap[tag]=new RegExp(\"^(\"+globRegex.join(\"|\")+\")$\")})}var allowedClassesMap={};each(options.allowedClasses,function(classes,tag){if(allowedAttributesMap){if(!has(allowedAttributesMap,tag)){allowedAttributesMap[tag]=[]}allowedAttributesMap[tag].push(\"class\")}allowedClassesMap[tag]=classes});var transformTagsMap={};var transformTagsAll;each(options.transformTags,function(transform,tag){var transFun;if(typeof transform===\"function\"){transFun=transform}else if(typeof transform===\"string\"){transFun=sanitizeHtml.simpleTransform(transform)}if(tag===\"*\"){transformTagsAll=transFun}else{transformTagsMap[tag]=transFun}});var depth=0;var stack=[];var skipMap={};var transformMap={};var skipText=false;var skipTextDepth=0;var parser=new htmlparser.Parser({onopentag:function(name,attribs){if(skipText){skipTextDepth++;return}var frame=new Frame(name,attribs);stack.push(frame);var skip=false;var hasText=frame.text?true:false;var transformedTag;if(has(transformTagsMap,name)){transformedTag=transformTagsMap[name](name,attribs);frame.attribs=attribs=transformedTag.attribs;if(transformedTag.text!==undefined){frame.innerText=transformedTag.text}if(name!==transformedTag.tagName){frame.name=name=transformedTag.tagName;transformMap[depth]=transformedTag.tagName}}if(transformTagsAll){transformedTag=transformTagsAll(name,attribs);frame.attribs=attribs=transformedTag.attribs;if(name!==transformedTag.tagName){frame.name=name=transformedTag.tagName;transformMap[depth]=transformedTag.tagName}}if(options.allowedTags&&options.allowedTags.indexOf(name)===-1){skip=true;if(nonTextTagsArray.indexOf(name)!==-1){skipText=true;skipTextDepth=1}skipMap[depth]=true}depth++;if(skip){return}result+=\"<\"+name;if(!allowedAttributesMap||has(allowedAttributesMap,name)||allowedAttributesMap[\"*\"]){each(attribs,function(value,a){if(!allowedAttributesMap||has(allowedAttributesMap,name)&&allowedAttributesMap[name].indexOf(a)!==-1||allowedAttributesMap[\"*\"]&&allowedAttributesMap[\"*\"].indexOf(a)!==-1||has(allowedAttributesGlobMap,name)&&allowedAttributesGlobMap[name].test(a)||allowedAttributesGlobMap[\"*\"]&&allowedAttributesGlobMap[\"*\"].test(a)){if(a===\"href\"||a===\"src\"){if(naughtyHref(name,value)){delete frame.attribs[a];return}}if(a===\"class\"){value=filterClasses(value,allowedClassesMap[name]);if(!value.length){delete frame.attribs[a];return}}result+=\" \"+a;if(value.length){result+='=\"'+escapeHtml(value)+'\"'}}else{delete frame.attribs[a]}})}if(options.selfClosing.indexOf(name)!==-1){result+=\" />\"}else{result+=\">\";if(frame.innerText&&!hasText&&!options.textFilter){result+=frame.innerText}}},ontext:function(text){if(skipText){return}var lastFrame=stack[stack.length-1];var tag;if(lastFrame){tag=lastFrame.tag;text=lastFrame.innerText!==undefined?lastFrame.innerText:text}if(tag===\"script\"||tag===\"style\"){result+=text}else{var escaped=escapeHtml(text);if(options.textFilter){result+=options.textFilter(escaped)}else{result+=escaped}}if(stack.length){var frame=stack[stack.length-1];frame.text+=text}},onclosetag:function(name){if(skipText){skipTextDepth--;if(!skipTextDepth){skipText=false}else{return}}var frame=stack.pop();if(!frame){return}skipText=false;depth--;if(skipMap[depth]){delete skipMap[depth];frame.updateParentNodeText();return}if(transformMap[depth]){name=transformMap[depth];delete transformMap[depth]}if(options.exclusiveFilter&&options.exclusiveFilter(frame)){result=result.substr(0,frame.tagPosition);return}frame.updateParentNodeText();if(options.selfClosing.indexOf(name)!==-1){return}result+=\"</\"+name+\">\"}},options.parser);parser.write(html);parser.end();return result;function escapeHtml(s){if(typeof s!==\"string\"){s=s+\"\"}return s.replace(/\\&/g,\"&amp;\").replace(/</g,\"&lt;\").replace(/\\>/g,\"&gt;\").replace(/\\\"/g,\"&quot;\")}function naughtyHref(name,href){href=href.replace(/[\\x00-\\x20]+/g,\"\");href=href.replace(/<\\!\\-\\-.*?\\-\\-\\>/g,\"\");var matches=href.match(/^([a-zA-Z]+)\\:/);if(!matches){return false}var scheme=matches[1].toLowerCase();if(has(options.allowedSchemesByTag,name)){return options.allowedSchemesByTag[name].indexOf(scheme)===-1}return!options.allowedSchemes||options.allowedSchemes.indexOf(scheme)===-1}function filterClasses(classes,allowed){if(!allowed){return classes}classes=classes.split(/\\s+/);return classes.filter(function(clss){return allowed.indexOf(clss)!==-1}).join(\" \")}}var htmlParserDefaults={decodeEntities:true};sanitizeHtml.defaults={allowedTags:[\"h3\",\"h4\",\"h5\",\"h6\",\"blockquote\",\"p\",\"a\",\"ul\",\"ol\",\"nl\",\"li\",\"b\",\"i\",\"strong\",\"em\",\"strike\",\"code\",\"hr\",\"br\",\"div\",\"table\",\"thead\",\"caption\",\"tbody\",\"tr\",\"th\",\"td\",\"pre\"],allowedAttributes:{a:[\"href\",\"name\",\"target\"],img:[\"src\"]},selfClosing:[\"img\",\"br\",\"hr\",\"area\",\"base\",\"basefont\",\"input\",\"link\",\"meta\"],allowedSchemes:[\"http\",\"https\",\"ftp\",\"mailto\"],allowedSchemesByTag:{}};sanitizeHtml.simpleTransform=function(newTagName,newAttribs,merge){merge=merge===undefined?true:merge;newAttribs=newAttribs||{};return function(tagName,attribs){var attrib;if(merge){for(attrib in newAttribs){attribs[attrib]=newAttribs[attrib]}}else{attribs=newAttribs}return{tagName:newTagName,attribs:attribs}}}},{htmlparser2:36,\"regexp-quote\":54,xtend:58}],2:[function(require,module,exports){\"use strict\";exports.toByteArray=toByteArray;exports.fromByteArray=fromByteArray;var lookup=[];var revLookup=[];var Arr=typeof Uint8Array!==\"undefined\"?Uint8Array:Array;function init(){var code=\"ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/\";for(var i=0,len=code.length;i<len;++i){lookup[i]=code[i];revLookup[code.charCodeAt(i)]=i}revLookup[\"-\".charCodeAt(0)]=62;revLookup[\"_\".charCodeAt(0)]=63}init();function toByteArray(b64){var i,j,l,tmp,placeHolders,arr;var len=b64.length;if(len%4>0){throw new Error(\"Invalid string. Length must be a multiple of 4\")}placeHolders=b64[len-2]===\"=\"?2:b64[len-1]===\"=\"?1:0;arr=new Arr(len*3/4-placeHolders);l=placeHolders>0?len-4:len;var L=0;for(i=0,j=0;i<l;i+=4,j+=3){tmp=revLookup[b64.charCodeAt(i)]<<18|revLookup[b64.charCodeAt(i+1)]<<12|revLookup[b64.charCodeAt(i+2)]<<6|revLookup[b64.charCodeAt(i+3)];arr[L++]=tmp>>16&255;arr[L++]=tmp>>8&255;arr[L++]=tmp&255}if(placeHolders===2){tmp=revLookup[b64.charCodeAt(i)]<<2|revLookup[b64.charCodeAt(i+1)]>>4;arr[L++]=tmp&255}else if(placeHolders===1){tmp=revLookup[b64.charCodeAt(i)]<<10|revLookup[b64.charCodeAt(i+1)]<<4|revLookup[b64.charCodeAt(i+2)]>>2;arr[L++]=tmp>>8&255;arr[L++]=tmp&255}return arr}function tripletToBase64(num){return lookup[num>>18&63]+lookup[num>>12&63]+lookup[num>>6&63]+lookup[num&63]}function encodeChunk(uint8,start,end){var tmp;var output=[];for(var i=start;i<end;i+=3){tmp=(uint8[i]<<16)+(uint8[i+1]<<8)+uint8[i+2];output.push(tripletToBase64(tmp))}return output.join(\"\")}function fromByteArray(uint8){var tmp;var len=uint8.length;var extraBytes=len%3;var output=\"\";var parts=[];var maxChunkLength=16383;for(var i=0,len2=len-extraBytes;i<len2;i+=maxChunkLength){parts.push(encodeChunk(uint8,i,i+maxChunkLength>len2?len2:i+maxChunkLength))}if(extraBytes===1){tmp=uint8[len-1];output+=lookup[tmp>>2];output+=lookup[tmp<<4&63];output+=\"==\"}else if(extraBytes===2){tmp=(uint8[len-2]<<8)+uint8[len-1];output+=lookup[tmp>>10];output+=lookup[tmp>>4&63];output+=lookup[tmp<<2&63];output+=\"=\"}parts.push(output);return parts.join(\"\")}},{}],3:[function(require,module,exports){},{}],4:[function(require,module,exports){(function(global){\"use strict\";var buffer=require(\"buffer\");var Buffer=buffer.Buffer;var SlowBuffer=buffer.SlowBuffer;var MAX_LEN=buffer.kMaxLength||2147483647;exports.alloc=function alloc(size,fill,encoding){if(typeof Buffer.alloc===\"function\"){return Buffer.alloc(size,fill,encoding)}if(typeof encoding===\"number\"){throw new TypeError(\"encoding must not be number\")}if(typeof size!==\"number\"){throw new TypeError(\"size must be a number\")}if(size>MAX_LEN){throw new RangeError(\"size is too large\")}var enc=encoding;var _fill=fill;if(_fill===undefined){enc=undefined;_fill=0}var buf=new Buffer(size);if(typeof _fill===\"string\"){var fillBuf=new Buffer(_fill,enc);var flen=fillBuf.length;var i=-1;while(++i<size){buf[i]=fillBuf[i%flen]}}else{buf.fill(_fill)}return buf};exports.allocUnsafe=function allocUnsafe(size){if(typeof Buffer.allocUnsafe===\"function\"){return Buffer.allocUnsafe(size)}if(typeof size!==\"number\"){throw new TypeError(\"size must be a number\")}if(size>MAX_LEN){throw new RangeError(\"size is too large\")}return new Buffer(size)};exports.from=function from(value,encodingOrOffset,length){if(typeof Buffer.from===\"function\"&&(!global.Uint8Array||Uint8Array.from!==Buffer.from)){return Buffer.from(value,encodingOrOffset,length)}if(typeof value===\"number\"){throw new TypeError('\"value\" argument must not be a number')}if(typeof value===\"string\"){return new Buffer(value,encodingOrOffset)}if(typeof ArrayBuffer!==\"undefined\"&&value instanceof ArrayBuffer){var offset=encodingOrOffset;if(arguments.length===1){return new Buffer(value)}if(typeof offset===\"undefined\"){offset=0}var len=length;if(typeof len===\"undefined\"){len=value.byteLength-offset}if(offset>=value.byteLength){throw new RangeError(\"'offset' is out of bounds\")}if(len>value.byteLength-offset){throw new RangeError(\"'length' is out of bounds\")}return new Buffer(value.slice(offset,offset+len))}if(Buffer.isBuffer(value)){var out=new Buffer(value.length);value.copy(out,0,0,value.length);return out}if(value){if(Array.isArray(value)||typeof ArrayBuffer!==\"undefined\"&&value.buffer instanceof ArrayBuffer||\"length\"in value){return new Buffer(value)}if(value.type===\"Buffer\"&&Array.isArray(value.data)){return new Buffer(value.data)}}throw new TypeError(\"First argument must be a string, Buffer, \"+\"ArrayBuffer, Array, or array-like object.\")};exports.allocUnsafeSlow=function allocUnsafeSlow(size){if(typeof Buffer.allocUnsafeSlow===\"function\"){return Buffer.allocUnsafeSlow(size)}if(typeof size!==\"number\"){throw new TypeError(\"size must be a number\")}if(size>=MAX_LEN){throw new RangeError(\"size is too large\")}return new SlowBuffer(size)}}).call(this,typeof global!==\"undefined\"?global:typeof self!==\"undefined\"?self:typeof window!==\"undefined\"?window:{})},{buffer:5}],5:[function(require,module,exports){(function(global){\"use strict\";var base64=require(\"base64-js\");var ieee754=require(\"ieee754\");var isArray=require(\"isarray\");exports.Buffer=Buffer;exports.SlowBuffer=SlowBuffer;exports.INSPECT_MAX_BYTES=50;Buffer.TYPED_ARRAY_SUPPORT=global.TYPED_ARRAY_SUPPORT!==undefined?global.TYPED_ARRAY_SUPPORT:typedArraySupport();exports.kMaxLength=kMaxLength();function typedArraySupport(){try{var arr=new Uint8Array(1);arr.__proto__={__proto__:Uint8Array.prototype,foo:function(){return 42}};return arr.foo()===42&&typeof arr.subarray===\"function\"&&arr.subarray(1,1).byteLength===0}catch(e){return false}}function kMaxLength(){return Buffer.TYPED_ARRAY_SUPPORT?2147483647:1073741823}function createBuffer(that,length){if(kMaxLength()<length){throw new RangeError(\"Invalid typed array length\")}if(Buffer.TYPED_ARRAY_SUPPORT){that=new Uint8Array(length);that.__proto__=Buffer.prototype}else{if(that===null){that=new Buffer(length)}that.length=length}return that}function Buffer(arg,encodingOrOffset,length){if(!Buffer.TYPED_ARRAY_SUPPORT&&!(this instanceof Buffer)){return new Buffer(arg,encodingOrOffset,length)}if(typeof arg===\"number\"){if(typeof encodingOrOffset===\"string\"){throw new Error(\"If encoding is specified then the first argument must be a string\")}return allocUnsafe(this,arg)}return from(this,arg,encodingOrOffset,length)}Buffer.poolSize=8192;Buffer._augment=function(arr){arr.__proto__=Buffer.prototype;return arr};function from(that,value,encodingOrOffset,length){if(typeof value===\"number\"){throw new TypeError('\"value\" argument must not be a number')}if(typeof ArrayBuffer!==\"undefined\"&&value instanceof ArrayBuffer){return fromArrayBuffer(that,value,encodingOrOffset,length)}if(typeof value===\"string\"){return fromString(that,value,encodingOrOffset)}return fromObject(that,value)}Buffer.from=function(value,encodingOrOffset,length){return from(null,value,encodingOrOffset,length)};if(Buffer.TYPED_ARRAY_SUPPORT){Buffer.prototype.__proto__=Uint8Array.prototype;Buffer.__proto__=Uint8Array;if(typeof Symbol!==\"undefined\"&&Symbol.species&&Buffer[Symbol.species]===Buffer){Object.defineProperty(Buffer,Symbol.species,{value:null,configurable:true})}}function assertSize(size){if(typeof size!==\"number\"){throw new TypeError('\"size\" argument must be a number')}else if(size<0){throw new RangeError('\"size\" argument must not be negative')}}function alloc(that,size,fill,encoding){assertSize(size);if(size<=0){return createBuffer(that,size)}if(fill!==undefined){return typeof encoding===\"string\"?createBuffer(that,size).fill(fill,encoding):createBuffer(that,size).fill(fill)}return createBuffer(that,size)}Buffer.alloc=function(size,fill,encoding){return alloc(null,size,fill,encoding)};function allocUnsafe(that,size){assertSize(size);that=createBuffer(that,size<0?0:checked(size)|0);if(!Buffer.TYPED_ARRAY_SUPPORT){for(var i=0;i<size;++i){that[i]=0}}return that}Buffer.allocUnsafe=function(size){return allocUnsafe(null,size)};Buffer.allocUnsafeSlow=function(size){return allocUnsafe(null,size)};function fromString(that,string,encoding){if(typeof encoding!==\"string\"||encoding===\"\"){encoding=\"utf8\"}if(!Buffer.isEncoding(encoding)){throw new TypeError('\"encoding\" must be a valid string encoding')}var length=byteLength(string,encoding)|0;that=createBuffer(that,length);var actual=that.write(string,encoding);if(actual!==length){that=that.slice(0,actual)}return that}function fromArrayLike(that,array){var length=array.length<0?0:checked(array.length)|0;that=createBuffer(that,length);for(var i=0;i<length;i+=1){that[i]=array[i]&255}return that}function fromArrayBuffer(that,array,byteOffset,length){array.byteLength;if(byteOffset<0||array.byteLength<byteOffset){throw new RangeError(\"'offset' is out of bounds\")}if(array.byteLength<byteOffset+(length||0)){throw new RangeError(\"'length' is out of bounds\")}if(byteOffset===undefined&&length===undefined){array=new Uint8Array(array)}else if(length===undefined){array=new Uint8Array(array,byteOffset)}else{array=new Uint8Array(array,byteOffset,length)}if(Buffer.TYPED_ARRAY_SUPPORT){that=array;that.__proto__=Buffer.prototype}else{that=fromArrayLike(that,array)}return that}function fromObject(that,obj){if(Buffer.isBuffer(obj)){var len=checked(obj.length)|0;that=createBuffer(that,len);if(that.length===0){return that}obj.copy(that,0,0,len);return that}if(obj){if(typeof ArrayBuffer!==\"undefined\"&&obj.buffer instanceof ArrayBuffer||\"length\"in obj){if(typeof obj.length!==\"number\"||isnan(obj.length)){return createBuffer(that,0)}return fromArrayLike(that,obj)}if(obj.type===\"Buffer\"&&isArray(obj.data)){return fromArrayLike(that,obj.data)}}throw new TypeError(\"First argument must be a string, Buffer, ArrayBuffer, Array, or array-like object.\")}function checked(length){if(length>=kMaxLength()){throw new RangeError(\"Attempt to allocate Buffer larger than maximum \"+\"size: 0x\"+kMaxLength().toString(16)+\" bytes\")}return length|0}function SlowBuffer(length){if(+length!=length){length=0}return Buffer.alloc(+length)}Buffer.isBuffer=function isBuffer(b){return!!(b!=null&&b._isBuffer)};Buffer.compare=function compare(a,b){if(!Buffer.isBuffer(a)||!Buffer.isBuffer(b)){throw new TypeError(\"Arguments must be Buffers\")}if(a===b)return 0;var x=a.length;var y=b.length;for(var i=0,len=Math.min(x,y);i<len;++i){if(a[i]!==b[i]){x=a[i];y=b[i];break}}if(x<y)return-1;if(y<x)return 1;return 0};Buffer.isEncoding=function isEncoding(encoding){switch(String(encoding).toLowerCase()){case\"hex\":case\"utf8\":case\"utf-8\":case\"ascii\":case\"latin1\":case\"binary\":case\"base64\":case\"ucs2\":case\"ucs-2\":case\"utf16le\":case\"utf-16le\":return true;default:return false}};Buffer.concat=function concat(list,length){if(!isArray(list)){throw new TypeError('\"list\" argument must be an Array of Buffers')}if(list.length===0){return Buffer.alloc(0)}var i;if(length===undefined){length=0;for(i=0;i<list.length;++i){length+=list[i].length}}var buffer=Buffer.allocUnsafe(length);var pos=0;for(i=0;i<list.length;++i){var buf=list[i];if(!Buffer.isBuffer(buf)){throw new TypeError('\"list\" argument must be an Array of Buffers')}buf.copy(buffer,pos);pos+=buf.length}return buffer};function byteLength(string,encoding){if(Buffer.isBuffer(string)){return string.length}if(typeof ArrayBuffer!==\"undefined\"&&typeof ArrayBuffer.isView===\"function\"&&(ArrayBuffer.isView(string)||string instanceof ArrayBuffer)){return string.byteLength}if(typeof string!==\"string\"){string=\"\"+string}var len=string.length;if(len===0)return 0;var loweredCase=false;for(;;){switch(encoding){case\"ascii\":case\"latin1\":case\"binary\":return len;case\"utf8\":case\"utf-8\":case undefined:return utf8ToBytes(string).length;case\"ucs2\":case\"ucs-2\":case\"utf16le\":case\"utf-16le\":return len*2;case\"hex\":return len>>>1;case\"base64\":return base64ToBytes(string).length;default:if(loweredCase)return utf8ToBytes(string).length;encoding=(\"\"+encoding).toLowerCase();loweredCase=true}}}Buffer.byteLength=byteLength;function slowToString(encoding,start,end){var loweredCase=false;if(start===undefined||start<0){start=0}if(start>this.length){return\"\"}if(end===undefined||end>this.length){end=this.length}if(end<=0){return\"\"}end>>>=0;start>>>=0;if(end<=start){return\"\"}if(!encoding)encoding=\"utf8\";while(true){switch(encoding){case\"hex\":return hexSlice(this,start,end);case\"utf8\":case\"utf-8\":return utf8Slice(this,start,end);case\"ascii\":return asciiSlice(this,start,end);case\"latin1\":case\"binary\":return latin1Slice(this,start,end);case\"base64\":return base64Slice(this,start,end);case\"ucs2\":case\"ucs-2\":case\"utf16le\":case\"utf-16le\":return utf16leSlice(this,start,end);default:if(loweredCase)throw new TypeError(\"Unknown encoding: \"+encoding);encoding=(encoding+\"\").toLowerCase();loweredCase=true}}}Buffer.prototype._isBuffer=true;function swap(b,n,m){var i=b[n];b[n]=b[m];b[m]=i}Buffer.prototype.swap16=function swap16(){var len=this.length;if(len%2!==0){throw new RangeError(\"Buffer size must be a multiple of 16-bits\")}for(var i=0;i<len;i+=2){swap(this,i,i+1)}return this};Buffer.prototype.swap32=function swap32(){var len=this.length;if(len%4!==0){throw new RangeError(\"Buffer size must be a multiple of 32-bits\")}for(var i=0;i<len;i+=4){swap(this,i,i+3);swap(this,i+1,i+2)}return this};Buffer.prototype.swap64=function swap64(){var len=this.length;if(len%8!==0){throw new RangeError(\"Buffer size must be a multiple of 64-bits\")}for(var i=0;i<len;i+=8){swap(this,i,i+7);swap(this,i+1,i+6);swap(this,i+2,i+5);swap(this,i+3,i+4)}return this};Buffer.prototype.toString=function toString(){var length=this.length|0;if(length===0)return\"\";if(arguments.length===0)return utf8Slice(this,0,length);return slowToString.apply(this,arguments)};Buffer.prototype.equals=function equals(b){if(!Buffer.isBuffer(b))throw new TypeError(\"Argument must be a Buffer\");if(this===b)return true;return Buffer.compare(this,b)===0};Buffer.prototype.inspect=function inspect(){var str=\"\";var max=exports.INSPECT_MAX_BYTES;if(this.length>0){str=this.toString(\"hex\",0,max).match(/.{2}/g).join(\" \");if(this.length>max)str+=\" ... \"}return\"<Buffer \"+str+\">\"};Buffer.prototype.compare=function compare(target,start,end,thisStart,thisEnd){if(!Buffer.isBuffer(target)){throw new TypeError(\"Argument must be a Buffer\")}if(start===undefined){start=0}if(end===undefined){end=target?target.length:0}if(thisStart===undefined){thisStart=0}if(thisEnd===undefined){thisEnd=this.length}if(start<0||end>target.length||thisStart<0||thisEnd>this.length){throw new RangeError(\"out of range index\")}if(thisStart>=thisEnd&&start>=end){return 0}if(thisStart>=thisEnd){return-1}if(start>=end){return 1}start>>>=0;end>>>=0;thisStart>>>=0;thisEnd>>>=0;if(this===target)return 0;var x=thisEnd-thisStart;var y=end-start;var len=Math.min(x,y);var thisCopy=this.slice(thisStart,thisEnd);var targetCopy=target.slice(start,end);for(var i=0;i<len;++i){if(thisCopy[i]!==targetCopy[i]){x=thisCopy[i];y=targetCopy[i];break}}if(x<y)return-1;if(y<x)return 1;return 0};function bidirectionalIndexOf(buffer,val,byteOffset,encoding,dir){if(buffer.length===0)return-1;if(typeof byteOffset===\"string\"){encoding=byteOffset;byteOffset=0}else if(byteOffset>2147483647){byteOffset=2147483647}else if(byteOffset<-2147483648){byteOffset=-2147483648}byteOffset=+byteOffset;if(isNaN(byteOffset)){byteOffset=dir?0:buffer.length-1}if(byteOffset<0)byteOffset=buffer.length+byteOffset;if(byteOffset>=buffer.length){if(dir)return-1;else byteOffset=buffer.length-1}else if(byteOffset<0){if(dir)byteOffset=0;else return-1}if(typeof val===\"string\"){val=Buffer.from(val,encoding)}if(Buffer.isBuffer(val)){if(val.length===0){return-1}return arrayIndexOf(buffer,val,byteOffset,encoding,dir)}else if(typeof val===\"number\"){val=val&255;if(Buffer.TYPED_ARRAY_SUPPORT&&typeof Uint8Array.prototype.indexOf===\"function\"){if(dir){return Uint8Array.prototype.indexOf.call(buffer,val,byteOffset)}else{return Uint8Array.prototype.lastIndexOf.call(buffer,val,byteOffset)}}return arrayIndexOf(buffer,[val],byteOffset,encoding,dir)}throw new TypeError(\"val must be string, number or Buffer\")}function arrayIndexOf(arr,val,byteOffset,encoding,dir){var indexSize=1;var arrLength=arr.length;var valLength=val.length;if(encoding!==undefined){encoding=String(encoding).toLowerCase();if(encoding===\"ucs2\"||encoding===\"ucs-2\"||encoding===\"utf16le\"||encoding===\"utf-16le\"){if(arr.length<2||val.length<2){return-1}indexSize=2;arrLength/=2;valLength/=2;byteOffset/=2}}function read(buf,i){if(indexSize===1){return buf[i]}else{return buf.readUInt16BE(i*indexSize)}}var i;if(dir){var foundIndex=-1;for(i=byteOffset;i<arrLength;i++){if(read(arr,i)===read(val,foundIndex===-1?0:i-foundIndex)){if(foundIndex===-1)foundIndex=i;if(i-foundIndex+1===valLength)return foundIndex*indexSize}else{if(foundIndex!==-1)i-=i-foundIndex;foundIndex=-1}}}else{if(byteOffset+valLength>arrLength)byteOffset=arrLength-valLength;for(i=byteOffset;i>=0;i--){var found=true;for(var j=0;j<valLength;j++){if(read(arr,i+j)!==read(val,j)){found=false;break}}if(found)return i}}return-1}Buffer.prototype.includes=function includes(val,byteOffset,encoding){return this.indexOf(val,byteOffset,encoding)!==-1};Buffer.prototype.indexOf=function indexOf(val,byteOffset,encoding){return bidirectionalIndexOf(this,val,byteOffset,encoding,true)};Buffer.prototype.lastIndexOf=function lastIndexOf(val,byteOffset,encoding){return bidirectionalIndexOf(this,val,byteOffset,encoding,false)};function hexWrite(buf,string,offset,length){offset=Number(offset)||0;var remaining=buf.length-offset;if(!length){length=remaining}else{length=Number(length);if(length>remaining){length=remaining}}var strLen=string.length;if(strLen%2!==0)throw new TypeError(\"Invalid hex string\");if(length>strLen/2){length=strLen/2}for(var i=0;i<length;++i){var parsed=parseInt(string.substr(i*2,2),16);if(isNaN(parsed))return i;buf[offset+i]=parsed}return i}function utf8Write(buf,string,offset,length){return blitBuffer(utf8ToBytes(string,buf.length-offset),buf,offset,length)}function asciiWrite(buf,string,offset,length){return blitBuffer(asciiToBytes(string),buf,offset,length)}function latin1Write(buf,string,offset,length){return asciiWrite(buf,string,offset,length)}function base64Write(buf,string,offset,length){return blitBuffer(base64ToBytes(string),buf,offset,length)}function ucs2Write(buf,string,offset,length){return blitBuffer(utf16leToBytes(string,buf.length-offset),buf,offset,length)}Buffer.prototype.write=function write(string,offset,length,encoding){if(offset===undefined){encoding=\"utf8\";length=this.length;offset=0}else if(length===undefined&&typeof offset===\"string\"){encoding=offset;length=this.length;offset=0}else if(isFinite(offset)){offset=offset|0;if(isFinite(length)){length=length|0;if(encoding===undefined)encoding=\"utf8\"}else{encoding=length;length=undefined}}else{throw new Error(\"Buffer.write(string, encoding, offset[, length]) is no longer supported\")}var remaining=this.length-offset;if(length===undefined||length>remaining)length=remaining;if(string.length>0&&(length<0||offset<0)||offset>this.length){throw new RangeError(\"Attempt to write outside buffer bounds\")}if(!encoding)encoding=\"utf8\";var loweredCase=false;for(;;){switch(encoding){case\"hex\":return hexWrite(this,string,offset,length);case\"utf8\":case\"utf-8\":return utf8Write(this,string,offset,length);case\"ascii\":return asciiWrite(this,string,offset,length);case\"latin1\":case\"binary\":return latin1Write(this,string,offset,length);case\"base64\":return base64Write(this,string,offset,length);case\"ucs2\":case\"ucs-2\":case\"utf16le\":case\"utf-16le\":return ucs2Write(this,string,offset,length);default:if(loweredCase)throw new TypeError(\"Unknown encoding: \"+encoding);encoding=(\"\"+encoding).toLowerCase();loweredCase=true}}};Buffer.prototype.toJSON=function toJSON(){return{type:\"Buffer\",data:Array.prototype.slice.call(this._arr||this,0)}};function base64Slice(buf,start,end){if(start===0&&end===buf.length){return base64.fromByteArray(buf)}else{return base64.fromByteArray(buf.slice(start,end))}}function utf8Slice(buf,start,end){end=Math.min(buf.length,end);var res=[];var i=start;while(i<end){var firstByte=buf[i];var codePoint=null;var bytesPerSequence=firstByte>239?4:firstByte>223?3:firstByte>191?2:1;if(i+bytesPerSequence<=end){var secondByte,thirdByte,fourthByte,tempCodePoint;switch(bytesPerSequence){case 1:if(firstByte<128){codePoint=firstByte}break;case 2:secondByte=buf[i+1];if((secondByte&192)===128){tempCodePoint=(firstByte&31)<<6|secondByte&63;if(tempCodePoint>127){codePoint=tempCodePoint}}break;case 3:secondByte=buf[i+1];thirdByte=buf[i+2];if((secondByte&192)===128&&(thirdByte&192)===128){tempCodePoint=(firstByte&15)<<12|(secondByte&63)<<6|thirdByte&63;if(tempCodePoint>2047&&(tempCodePoint<55296||tempCodePoint>57343)){codePoint=tempCodePoint}}break;case 4:secondByte=buf[i+1];thirdByte=buf[i+2];fourthByte=buf[i+3];if((secondByte&192)===128&&(thirdByte&192)===128&&(fourthByte&192)===128){tempCodePoint=(firstByte&15)<<18|(secondByte&63)<<12|(thirdByte&63)<<6|fourthByte&63;if(tempCodePoint>65535&&tempCodePoint<1114112){codePoint=tempCodePoint}}}}if(codePoint===null){codePoint=65533;bytesPerSequence=1}else if(codePoint>65535){codePoint-=65536;res.push(codePoint>>>10&1023|55296);codePoint=56320|codePoint&1023}res.push(codePoint);i+=bytesPerSequence}return decodeCodePointsArray(res)}var MAX_ARGUMENTS_LENGTH=4096;function decodeCodePointsArray(codePoints){var len=codePoints.length;if(len<=MAX_ARGUMENTS_LENGTH){return String.fromCharCode.apply(String,codePoints)}var res=\"\";var i=0;while(i<len){res+=String.fromCharCode.apply(String,codePoints.slice(i,i+=MAX_ARGUMENTS_LENGTH))}return res}function asciiSlice(buf,start,end){var ret=\"\";end=Math.min(buf.length,end);for(var i=start;i<end;++i){ret+=String.fromCharCode(buf[i]&127)}return ret}function latin1Slice(buf,start,end){var ret=\"\";end=Math.min(buf.length,end);for(var i=start;i<end;++i){ret+=String.fromCharCode(buf[i])}return ret}function hexSlice(buf,start,end){var len=buf.length;if(!start||start<0)start=0;if(!end||end<0||end>len)end=len;var out=\"\";for(var i=start;i<end;++i){out+=toHex(buf[i])}return out}function utf16leSlice(buf,start,end){var bytes=buf.slice(start,end);var res=\"\";for(var i=0;i<bytes.length;i+=2){res+=String.fromCharCode(bytes[i]+bytes[i+1]*256)}return res}Buffer.prototype.slice=function slice(start,end){var len=this.length;start=~~start;end=end===undefined?len:~~end;if(start<0){start+=len;if(start<0)start=0}else if(start>len){start=len}if(end<0){end+=len;if(end<0)end=0}else if(end>len){end=len}if(end<start)end=start;var newBuf;if(Buffer.TYPED_ARRAY_SUPPORT){newBuf=this.subarray(start,end);newBuf.__proto__=Buffer.prototype}else{var sliceLen=end-start;newBuf=new Buffer(sliceLen,undefined);for(var i=0;i<sliceLen;++i){newBuf[i]=this[i+start]}}return newBuf};function checkOffset(offset,ext,length){if(offset%1!==0||offset<0)throw new RangeError(\"offset is not uint\");if(offset+ext>length)throw new RangeError(\"Trying to access beyond buffer length\")}Buffer.prototype.readUIntLE=function readUIntLE(offset,byteLength,noAssert){offset=offset|0;byteLength=byteLength|0;if(!noAssert)checkOffset(offset,byteLength,this.length);var val=this[offset];var mul=1;var i=0;while(++i<byteLength&&(mul*=256)){val+=this[offset+i]*mul}return val};Buffer.prototype.readUIntBE=function readUIntBE(offset,byteLength,noAssert){offset=offset|0;byteLength=byteLength|0;if(!noAssert){checkOffset(offset,byteLength,this.length)}var val=this[offset+--byteLength];var mul=1;while(byteLength>0&&(mul*=256)){val+=this[offset+--byteLength]*mul}return val};Buffer.prototype.readUInt8=function readUInt8(offset,noAssert){if(!noAssert)checkOffset(offset,1,this.length);return this[offset]};Buffer.prototype.readUInt16LE=function readUInt16LE(offset,noAssert){if(!noAssert)checkOffset(offset,2,this.length);return this[offset]|this[offset+1]<<8};Buffer.prototype.readUInt16BE=function readUInt16BE(offset,noAssert){if(!noAssert)checkOffset(offset,2,this.length);return this[offset]<<8|this[offset+1]};Buffer.prototype.readUInt32LE=function readUInt32LE(offset,noAssert){if(!noAssert)checkOffset(offset,4,this.length);return(this[offset]|this[offset+1]<<8|this[offset+2]<<16)+this[offset+3]*16777216};Buffer.prototype.readUInt32BE=function readUInt32BE(offset,noAssert){if(!noAssert)checkOffset(offset,4,this.length);return this[offset]*16777216+(this[offset+1]<<16|this[offset+2]<<8|this[offset+3])};Buffer.prototype.readIntLE=function readIntLE(offset,byteLength,noAssert){offset=offset|0;byteLength=byteLength|0;if(!noAssert)checkOffset(offset,byteLength,this.length);var val=this[offset];var mul=1;var i=0;while(++i<byteLength&&(mul*=256)){val+=this[offset+i]*mul}mul*=128;if(val>=mul)val-=Math.pow(2,8*byteLength);return val};Buffer.prototype.readIntBE=function readIntBE(offset,byteLength,noAssert){offset=offset|0;byteLength=byteLength|0;if(!noAssert)checkOffset(offset,byteLength,this.length);\nvar i=byteLength;var mul=1;var val=this[offset+--i];while(i>0&&(mul*=256)){val+=this[offset+--i]*mul}mul*=128;if(val>=mul)val-=Math.pow(2,8*byteLength);return val};Buffer.prototype.readInt8=function readInt8(offset,noAssert){if(!noAssert)checkOffset(offset,1,this.length);if(!(this[offset]&128))return this[offset];return(255-this[offset]+1)*-1};Buffer.prototype.readInt16LE=function readInt16LE(offset,noAssert){if(!noAssert)checkOffset(offset,2,this.length);var val=this[offset]|this[offset+1]<<8;return val&32768?val|4294901760:val};Buffer.prototype.readInt16BE=function readInt16BE(offset,noAssert){if(!noAssert)checkOffset(offset,2,this.length);var val=this[offset+1]|this[offset]<<8;return val&32768?val|4294901760:val};Buffer.prototype.readInt32LE=function readInt32LE(offset,noAssert){if(!noAssert)checkOffset(offset,4,this.length);return this[offset]|this[offset+1]<<8|this[offset+2]<<16|this[offset+3]<<24};Buffer.prototype.readInt32BE=function readInt32BE(offset,noAssert){if(!noAssert)checkOffset(offset,4,this.length);return this[offset]<<24|this[offset+1]<<16|this[offset+2]<<8|this[offset+3]};Buffer.prototype.readFloatLE=function readFloatLE(offset,noAssert){if(!noAssert)checkOffset(offset,4,this.length);return ieee754.read(this,offset,true,23,4)};Buffer.prototype.readFloatBE=function readFloatBE(offset,noAssert){if(!noAssert)checkOffset(offset,4,this.length);return ieee754.read(this,offset,false,23,4)};Buffer.prototype.readDoubleLE=function readDoubleLE(offset,noAssert){if(!noAssert)checkOffset(offset,8,this.length);return ieee754.read(this,offset,true,52,8)};Buffer.prototype.readDoubleBE=function readDoubleBE(offset,noAssert){if(!noAssert)checkOffset(offset,8,this.length);return ieee754.read(this,offset,false,52,8)};function checkInt(buf,value,offset,ext,max,min){if(!Buffer.isBuffer(buf))throw new TypeError('\"buffer\" argument must be a Buffer instance');if(value>max||value<min)throw new RangeError('\"value\" argument is out of bounds');if(offset+ext>buf.length)throw new RangeError(\"Index out of range\")}Buffer.prototype.writeUIntLE=function writeUIntLE(value,offset,byteLength,noAssert){value=+value;offset=offset|0;byteLength=byteLength|0;if(!noAssert){var maxBytes=Math.pow(2,8*byteLength)-1;checkInt(this,value,offset,byteLength,maxBytes,0)}var mul=1;var i=0;this[offset]=value&255;while(++i<byteLength&&(mul*=256)){this[offset+i]=value/mul&255}return offset+byteLength};Buffer.prototype.writeUIntBE=function writeUIntBE(value,offset,byteLength,noAssert){value=+value;offset=offset|0;byteLength=byteLength|0;if(!noAssert){var maxBytes=Math.pow(2,8*byteLength)-1;checkInt(this,value,offset,byteLength,maxBytes,0)}var i=byteLength-1;var mul=1;this[offset+i]=value&255;while(--i>=0&&(mul*=256)){this[offset+i]=value/mul&255}return offset+byteLength};Buffer.prototype.writeUInt8=function writeUInt8(value,offset,noAssert){value=+value;offset=offset|0;if(!noAssert)checkInt(this,value,offset,1,255,0);if(!Buffer.TYPED_ARRAY_SUPPORT)value=Math.floor(value);this[offset]=value&255;return offset+1};function objectWriteUInt16(buf,value,offset,littleEndian){if(value<0)value=65535+value+1;for(var i=0,j=Math.min(buf.length-offset,2);i<j;++i){buf[offset+i]=(value&255<<8*(littleEndian?i:1-i))>>>(littleEndian?i:1-i)*8}}Buffer.prototype.writeUInt16LE=function writeUInt16LE(value,offset,noAssert){value=+value;offset=offset|0;if(!noAssert)checkInt(this,value,offset,2,65535,0);if(Buffer.TYPED_ARRAY_SUPPORT){this[offset]=value&255;this[offset+1]=value>>>8}else{objectWriteUInt16(this,value,offset,true)}return offset+2};Buffer.prototype.writeUInt16BE=function writeUInt16BE(value,offset,noAssert){value=+value;offset=offset|0;if(!noAssert)checkInt(this,value,offset,2,65535,0);if(Buffer.TYPED_ARRAY_SUPPORT){this[offset]=value>>>8;this[offset+1]=value&255}else{objectWriteUInt16(this,value,offset,false)}return offset+2};function objectWriteUInt32(buf,value,offset,littleEndian){if(value<0)value=4294967295+value+1;for(var i=0,j=Math.min(buf.length-offset,4);i<j;++i){buf[offset+i]=value>>>(littleEndian?i:3-i)*8&255}}Buffer.prototype.writeUInt32LE=function writeUInt32LE(value,offset,noAssert){value=+value;offset=offset|0;if(!noAssert)checkInt(this,value,offset,4,4294967295,0);if(Buffer.TYPED_ARRAY_SUPPORT){this[offset+3]=value>>>24;this[offset+2]=value>>>16;this[offset+1]=value>>>8;this[offset]=value&255}else{objectWriteUInt32(this,value,offset,true)}return offset+4};Buffer.prototype.writeUInt32BE=function writeUInt32BE(value,offset,noAssert){value=+value;offset=offset|0;if(!noAssert)checkInt(this,value,offset,4,4294967295,0);if(Buffer.TYPED_ARRAY_SUPPORT){this[offset]=value>>>24;this[offset+1]=value>>>16;this[offset+2]=value>>>8;this[offset+3]=value&255}else{objectWriteUInt32(this,value,offset,false)}return offset+4};Buffer.prototype.writeIntLE=function writeIntLE(value,offset,byteLength,noAssert){value=+value;offset=offset|0;if(!noAssert){var limit=Math.pow(2,8*byteLength-1);checkInt(this,value,offset,byteLength,limit-1,-limit)}var i=0;var mul=1;var sub=0;this[offset]=value&255;while(++i<byteLength&&(mul*=256)){if(value<0&&sub===0&&this[offset+i-1]!==0){sub=1}this[offset+i]=(value/mul>>0)-sub&255}return offset+byteLength};Buffer.prototype.writeIntBE=function writeIntBE(value,offset,byteLength,noAssert){value=+value;offset=offset|0;if(!noAssert){var limit=Math.pow(2,8*byteLength-1);checkInt(this,value,offset,byteLength,limit-1,-limit)}var i=byteLength-1;var mul=1;var sub=0;this[offset+i]=value&255;while(--i>=0&&(mul*=256)){if(value<0&&sub===0&&this[offset+i+1]!==0){sub=1}this[offset+i]=(value/mul>>0)-sub&255}return offset+byteLength};Buffer.prototype.writeInt8=function writeInt8(value,offset,noAssert){value=+value;offset=offset|0;if(!noAssert)checkInt(this,value,offset,1,127,-128);if(!Buffer.TYPED_ARRAY_SUPPORT)value=Math.floor(value);if(value<0)value=255+value+1;this[offset]=value&255;return offset+1};Buffer.prototype.writeInt16LE=function writeInt16LE(value,offset,noAssert){value=+value;offset=offset|0;if(!noAssert)checkInt(this,value,offset,2,32767,-32768);if(Buffer.TYPED_ARRAY_SUPPORT){this[offset]=value&255;this[offset+1]=value>>>8}else{objectWriteUInt16(this,value,offset,true)}return offset+2};Buffer.prototype.writeInt16BE=function writeInt16BE(value,offset,noAssert){value=+value;offset=offset|0;if(!noAssert)checkInt(this,value,offset,2,32767,-32768);if(Buffer.TYPED_ARRAY_SUPPORT){this[offset]=value>>>8;this[offset+1]=value&255}else{objectWriteUInt16(this,value,offset,false)}return offset+2};Buffer.prototype.writeInt32LE=function writeInt32LE(value,offset,noAssert){value=+value;offset=offset|0;if(!noAssert)checkInt(this,value,offset,4,2147483647,-2147483648);if(Buffer.TYPED_ARRAY_SUPPORT){this[offset]=value&255;this[offset+1]=value>>>8;this[offset+2]=value>>>16;this[offset+3]=value>>>24}else{objectWriteUInt32(this,value,offset,true)}return offset+4};Buffer.prototype.writeInt32BE=function writeInt32BE(value,offset,noAssert){value=+value;offset=offset|0;if(!noAssert)checkInt(this,value,offset,4,2147483647,-2147483648);if(value<0)value=4294967295+value+1;if(Buffer.TYPED_ARRAY_SUPPORT){this[offset]=value>>>24;this[offset+1]=value>>>16;this[offset+2]=value>>>8;this[offset+3]=value&255}else{objectWriteUInt32(this,value,offset,false)}return offset+4};function checkIEEE754(buf,value,offset,ext,max,min){if(offset+ext>buf.length)throw new RangeError(\"Index out of range\");if(offset<0)throw new RangeError(\"Index out of range\")}function writeFloat(buf,value,offset,littleEndian,noAssert){if(!noAssert){checkIEEE754(buf,value,offset,4,3.4028234663852886e38,-3.4028234663852886e38)}ieee754.write(buf,value,offset,littleEndian,23,4);return offset+4}Buffer.prototype.writeFloatLE=function writeFloatLE(value,offset,noAssert){return writeFloat(this,value,offset,true,noAssert)};Buffer.prototype.writeFloatBE=function writeFloatBE(value,offset,noAssert){return writeFloat(this,value,offset,false,noAssert)};function writeDouble(buf,value,offset,littleEndian,noAssert){if(!noAssert){checkIEEE754(buf,value,offset,8,1.7976931348623157e308,-1.7976931348623157e308)}ieee754.write(buf,value,offset,littleEndian,52,8);return offset+8}Buffer.prototype.writeDoubleLE=function writeDoubleLE(value,offset,noAssert){return writeDouble(this,value,offset,true,noAssert)};Buffer.prototype.writeDoubleBE=function writeDoubleBE(value,offset,noAssert){return writeDouble(this,value,offset,false,noAssert)};Buffer.prototype.copy=function copy(target,targetStart,start,end){if(!start)start=0;if(!end&&end!==0)end=this.length;if(targetStart>=target.length)targetStart=target.length;if(!targetStart)targetStart=0;if(end>0&&end<start)end=start;if(end===start)return 0;if(target.length===0||this.length===0)return 0;if(targetStart<0){throw new RangeError(\"targetStart out of bounds\")}if(start<0||start>=this.length)throw new RangeError(\"sourceStart out of bounds\");if(end<0)throw new RangeError(\"sourceEnd out of bounds\");if(end>this.length)end=this.length;if(target.length-targetStart<end-start){end=target.length-targetStart+start}var len=end-start;var i;if(this===target&&start<targetStart&&targetStart<end){for(i=len-1;i>=0;--i){target[i+targetStart]=this[i+start]}}else if(len<1e3||!Buffer.TYPED_ARRAY_SUPPORT){for(i=0;i<len;++i){target[i+targetStart]=this[i+start]}}else{Uint8Array.prototype.set.call(target,this.subarray(start,start+len),targetStart)}return len};Buffer.prototype.fill=function fill(val,start,end,encoding){if(typeof val===\"string\"){if(typeof start===\"string\"){encoding=start;start=0;end=this.length}else if(typeof end===\"string\"){encoding=end;end=this.length}if(val.length===1){var code=val.charCodeAt(0);if(code<256){val=code}}if(encoding!==undefined&&typeof encoding!==\"string\"){throw new TypeError(\"encoding must be a string\")}if(typeof encoding===\"string\"&&!Buffer.isEncoding(encoding)){throw new TypeError(\"Unknown encoding: \"+encoding)}}else if(typeof val===\"number\"){val=val&255}if(start<0||this.length<start||this.length<end){throw new RangeError(\"Out of range index\")}if(end<=start){return this}start=start>>>0;end=end===undefined?this.length:end>>>0;if(!val)val=0;var i;if(typeof val===\"number\"){for(i=start;i<end;++i){this[i]=val}}else{var bytes=Buffer.isBuffer(val)?val:utf8ToBytes(new Buffer(val,encoding).toString());var len=bytes.length;for(i=0;i<end-start;++i){this[i+start]=bytes[i%len]}}return this};var INVALID_BASE64_RE=/[^+\\/0-9A-Za-z-_]/g;function base64clean(str){str=stringtrim(str).replace(INVALID_BASE64_RE,\"\");if(str.length<2)return\"\";while(str.length%4!==0){str=str+\"=\"}return str}function stringtrim(str){if(str.trim)return str.trim();return str.replace(/^\\s+|\\s+$/g,\"\")}function toHex(n){if(n<16)return\"0\"+n.toString(16);return n.toString(16)}function utf8ToBytes(string,units){units=units||Infinity;var codePoint;var length=string.length;var leadSurrogate=null;var bytes=[];for(var i=0;i<length;++i){codePoint=string.charCodeAt(i);if(codePoint>55295&&codePoint<57344){if(!leadSurrogate){if(codePoint>56319){if((units-=3)>-1)bytes.push(239,191,189);continue}else if(i+1===length){if((units-=3)>-1)bytes.push(239,191,189);continue}leadSurrogate=codePoint;continue}if(codePoint<56320){if((units-=3)>-1)bytes.push(239,191,189);leadSurrogate=codePoint;continue}codePoint=(leadSurrogate-55296<<10|codePoint-56320)+65536}else if(leadSurrogate){if((units-=3)>-1)bytes.push(239,191,189)}leadSurrogate=null;if(codePoint<128){if((units-=1)<0)break;bytes.push(codePoint)}else if(codePoint<2048){if((units-=2)<0)break;bytes.push(codePoint>>6|192,codePoint&63|128)}else if(codePoint<65536){if((units-=3)<0)break;bytes.push(codePoint>>12|224,codePoint>>6&63|128,codePoint&63|128)}else if(codePoint<1114112){if((units-=4)<0)break;bytes.push(codePoint>>18|240,codePoint>>12&63|128,codePoint>>6&63|128,codePoint&63|128)}else{throw new Error(\"Invalid code point\")}}return bytes}function asciiToBytes(str){var byteArray=[];for(var i=0;i<str.length;++i){byteArray.push(str.charCodeAt(i)&255)}return byteArray}function utf16leToBytes(str,units){var c,hi,lo;var byteArray=[];for(var i=0;i<str.length;++i){if((units-=2)<0)break;c=str.charCodeAt(i);hi=c>>8;lo=c%256;byteArray.push(lo);byteArray.push(hi)}return byteArray}function base64ToBytes(str){return base64.toByteArray(base64clean(str))}function blitBuffer(src,dst,offset,length){for(var i=0;i<length;++i){if(i+offset>=dst.length||i>=src.length)break;dst[i+offset]=src[i]}return i}function isnan(val){return val!==val}}).call(this,typeof global!==\"undefined\"?global:typeof self!==\"undefined\"?self:typeof window!==\"undefined\"?window:{})},{\"base64-js\":2,ieee754:37,isarray:40}],6:[function(require,module,exports){(function(Buffer){function isArray(arg){if(Array.isArray){return Array.isArray(arg)}return objectToString(arg)===\"[object Array]\"}exports.isArray=isArray;function isBoolean(arg){return typeof arg===\"boolean\"}exports.isBoolean=isBoolean;function isNull(arg){return arg===null}exports.isNull=isNull;function isNullOrUndefined(arg){return arg==null}exports.isNullOrUndefined=isNullOrUndefined;function isNumber(arg){return typeof arg===\"number\"}exports.isNumber=isNumber;function isString(arg){return typeof arg===\"string\"}exports.isString=isString;function isSymbol(arg){return typeof arg===\"symbol\"}exports.isSymbol=isSymbol;function isUndefined(arg){return arg===void 0}exports.isUndefined=isUndefined;function isRegExp(re){return objectToString(re)===\"[object RegExp]\"}exports.isRegExp=isRegExp;function isObject(arg){return typeof arg===\"object\"&&arg!==null}exports.isObject=isObject;function isDate(d){return objectToString(d)===\"[object Date]\"}exports.isDate=isDate;function isError(e){return objectToString(e)===\"[object Error]\"||e instanceof Error}exports.isError=isError;function isFunction(arg){return typeof arg===\"function\"}exports.isFunction=isFunction;function isPrimitive(arg){return arg===null||typeof arg===\"boolean\"||typeof arg===\"number\"||typeof arg===\"string\"||typeof arg===\"symbol\"||typeof arg===\"undefined\"}exports.isPrimitive=isPrimitive;exports.isBuffer=Buffer.isBuffer;function objectToString(o){return Object.prototype.toString.call(o)}}).call(this,{isBuffer:require(\"../../is-buffer/index.js\")})},{\"../../is-buffer/index.js\":39}],7:[function(require,module,exports){var ElementType=require(\"domelementtype\");var entities=require(\"entities\");var booleanAttributes={__proto__:null,allowfullscreen:true,async:true,autofocus:true,autoplay:true,checked:true,controls:true,default:true,defer:true,disabled:true,hidden:true,ismap:true,loop:true,multiple:true,muted:true,open:true,readonly:true,required:true,reversed:true,scoped:true,seamless:true,selected:true,typemustmatch:true};var unencodedElements={__proto__:null,style:true,script:true,xmp:true,iframe:true,noembed:true,noframes:true,plaintext:true,noscript:true};function formatAttrs(attributes,opts){if(!attributes)return;var output=\"\",value;for(var key in attributes){value=attributes[key];if(output){output+=\" \"}if(!value&&booleanAttributes[key]){output+=key}else{output+=key+'=\"'+(opts.decodeEntities?entities.encodeXML(value):value)+'\"'}}return output}var singleTag={__proto__:null,area:true,base:true,basefont:true,br:true,col:true,command:true,embed:true,frame:true,hr:true,img:true,input:true,isindex:true,keygen:true,link:true,meta:true,param:true,source:true,track:true,wbr:true};var render=module.exports=function(dom,opts){if(!Array.isArray(dom)&&!dom.cheerio)dom=[dom];opts=opts||{};var output=\"\";for(var i=0;i<dom.length;i++){var elem=dom[i];if(elem.type===\"root\")output+=render(elem.children,opts);else if(ElementType.isTag(elem))output+=renderTag(elem,opts);else if(elem.type===ElementType.Directive)output+=renderDirective(elem);else if(elem.type===ElementType.Comment)output+=renderComment(elem);else if(elem.type===ElementType.CDATA)output+=renderCdata(elem);else output+=renderText(elem,opts)}return output};function renderTag(elem,opts){if(elem.name===\"svg\")opts={decodeEntities:opts.decodeEntities,xmlMode:true};var tag=\"<\"+elem.name,attribs=formatAttrs(elem.attribs,opts);if(attribs){tag+=\" \"+attribs}if(opts.xmlMode&&(!elem.children||elem.children.length===0)){tag+=\"/>\"}else{tag+=\">\";if(elem.children){tag+=render(elem.children,opts)}if(!singleTag[elem.name]||opts.xmlMode){tag+=\"</\"+elem.name+\">\"}}return tag}function renderDirective(elem){return\"<\"+elem.data+\">\"}function renderText(elem,opts){var data=elem.data||\"\";if(opts.decodeEntities&&!(elem.parent&&elem.parent.name in unencodedElements)){data=entities.encodeXML(data)}return data}function renderCdata(elem){return\"<![CDATA[\"+elem.children[0].data+\"]]>\"}function renderComment(elem){return\"<!--\"+elem.data+\"-->\"}},{domelementtype:8,entities:20}],8:[function(require,module,exports){module.exports={Text:\"text\",Directive:\"directive\",Comment:\"comment\",Script:\"script\",Style:\"style\",Tag:\"tag\",CDATA:\"cdata\",isTag:function(elem){return elem.type===\"tag\"||elem.type===\"script\"||elem.type===\"style\"}}},{}],9:[function(require,module,exports){module.exports={Text:\"text\",Directive:\"directive\",Comment:\"comment\",Script:\"script\",Style:\"style\",Tag:\"tag\",CDATA:\"cdata\",Doctype:\"doctype\",isTag:function(elem){return elem.type===\"tag\"||elem.type===\"script\"||elem.type===\"style\"}}},{}],10:[function(require,module,exports){var ElementType=require(\"domelementtype\");var re_whitespace=/\\s+/g;var NodePrototype=require(\"./lib/node\");var ElementPrototype=require(\"./lib/element\");function DomHandler(callback,options,elementCB){if(typeof callback===\"object\"){elementCB=options;options=callback;callback=null}else if(typeof options===\"function\"){elementCB=options;options=defaultOpts}this._callback=callback;this._options=options||defaultOpts;this._elementCB=elementCB;this.dom=[];this._done=false;this._tagStack=[];this._parser=this._parser||null}var defaultOpts={normalizeWhitespace:false,withStartIndices:false};DomHandler.prototype.onparserinit=function(parser){this._parser=parser};DomHandler.prototype.onreset=function(){DomHandler.call(this,this._callback,this._options,this._elementCB)};DomHandler.prototype.onend=function(){if(this._done)return;this._done=true;this._parser=null;this._handleCallback(null)};DomHandler.prototype._handleCallback=DomHandler.prototype.onerror=function(error){if(typeof this._callback===\"function\"){this._callback(error,this.dom)}else{if(error)throw error}};DomHandler.prototype.onclosetag=function(){var elem=this._tagStack.pop();if(this._elementCB)this._elementCB(elem)};DomHandler.prototype._addDomElement=function(element){var parent=this._tagStack[this._tagStack.length-1];var siblings=parent?parent.children:this.dom;var previousSibling=siblings[siblings.length-1];element.next=null;if(this._options.withStartIndices){element.startIndex=this._parser.startIndex}if(this._options.withDomLvl1){element.__proto__=element.type===\"tag\"?ElementPrototype:NodePrototype}if(previousSibling){element.prev=previousSibling;previousSibling.next=element}else{element.prev=null}siblings.push(element);element.parent=parent||null};DomHandler.prototype.onopentag=function(name,attribs){var element={type:name===\"script\"?ElementType.Script:name===\"style\"?ElementType.Style:ElementType.Tag,name:name,attribs:attribs,children:[]};this._addDomElement(element);this._tagStack.push(element)};DomHandler.prototype.ontext=function(data){var normalize=this._options.normalizeWhitespace||this._options.ignoreWhitespace;var lastTag;if(!this._tagStack.length&&this.dom.length&&(lastTag=this.dom[this.dom.length-1]).type===ElementType.Text){if(normalize){lastTag.data=(lastTag.data+data).replace(re_whitespace,\" \")}else{lastTag.data+=data}}else{if(this._tagStack.length&&(lastTag=this._tagStack[this._tagStack.length-1])&&(lastTag=lastTag.children[lastTag.children.length-1])&&lastTag.type===ElementType.Text){if(normalize){lastTag.data=(lastTag.data+data).replace(re_whitespace,\" \")}else{lastTag.data+=data}}else{if(normalize){data=data.replace(re_whitespace,\" \")}this._addDomElement({data:data,type:ElementType.Text})}}};DomHandler.prototype.oncomment=function(data){var lastTag=this._tagStack[this._tagStack.length-1];if(lastTag&&lastTag.type===ElementType.Comment){lastTag.data+=data;return}var element={data:data,type:ElementType.Comment};this._addDomElement(element);this._tagStack.push(element)};DomHandler.prototype.oncdatastart=function(){var element={children:[{data:\"\",type:ElementType.Text}],type:ElementType.CDATA};this._addDomElement(element);this._tagStack.push(element)};DomHandler.prototype.oncommentend=DomHandler.prototype.oncdataend=function(){this._tagStack.pop()};DomHandler.prototype.onprocessinginstruction=function(name,data){this._addDomElement({name:name,data:data,type:ElementType.Directive})};module.exports=DomHandler},{\"./lib/element\":11,\"./lib/node\":12,domelementtype:9}],11:[function(require,module,exports){var NodePrototype=require(\"./node\");var ElementPrototype=module.exports=Object.create(NodePrototype);var domLvl1={tagName:\"name\"};Object.keys(domLvl1).forEach(function(key){var shorthand=domLvl1[key];Object.defineProperty(ElementPrototype,key,{get:function(){return this[shorthand]||null},set:function(val){this[shorthand]=val;return val}})})},{\"./node\":12}],12:[function(require,module,exports){var NodePrototype=module.exports={get firstChild(){var children=this.children;return children&&children[0]||null},get lastChild(){var children=this.children;return children&&children[children.length-1]||null},get nodeType(){return nodeTypes[this.type]||nodeTypes.element}};var domLvl1={tagName:\"name\",childNodes:\"children\",parentNode:\"parent\",previousSibling:\"prev\",nextSibling:\"next\",nodeValue:\"data\"};var nodeTypes={element:1,text:3,cdata:4,comment:8};Object.keys(domLvl1).forEach(function(key){var shorthand=domLvl1[key];Object.defineProperty(NodePrototype,key,{get:function(){return this[shorthand]||null},set:function(val){this[shorthand]=val;return val}})})},{}],13:[function(require,module,exports){var DomUtils=module.exports;[require(\"./lib/stringify\"),require(\"./lib/traversal\"),require(\"./lib/manipulation\"),require(\"./lib/querying\"),require(\"./lib/legacy\"),require(\"./lib/helpers\")].forEach(function(ext){Object.keys(ext).forEach(function(key){DomUtils[key]=ext[key].bind(DomUtils)})})},{\"./lib/helpers\":14,\"./lib/legacy\":15,\"./lib/manipulation\":16,\"./lib/querying\":17,\"./lib/stringify\":18,\"./lib/traversal\":19}],14:[function(require,module,exports){exports.removeSubsets=function(nodes){var idx=nodes.length,node,ancestor,replace;while(--idx>-1){node=ancestor=nodes[idx];nodes[idx]=null;replace=true;while(ancestor){if(nodes.indexOf(ancestor)>-1){replace=false;nodes.splice(idx,1);break}ancestor=ancestor.parent}if(replace){nodes[idx]=node}}return nodes};var POSITION={DISCONNECTED:1,PRECEDING:2,FOLLOWING:4,CONTAINS:8,CONTAINED_BY:16};var comparePos=exports.compareDocumentPosition=function(nodeA,nodeB){var aParents=[];var bParents=[];var current,sharedParent,siblings,aSibling,bSibling,idx;if(nodeA===nodeB){return 0}current=nodeA;while(current){aParents.unshift(current);current=current.parent}current=nodeB;while(current){bParents.unshift(current);current=current.parent}idx=0;while(aParents[idx]===bParents[idx]){idx++}if(idx===0){return POSITION.DISCONNECTED}sharedParent=aParents[idx-1];siblings=sharedParent.children;aSibling=aParents[idx];bSibling=bParents[idx];if(siblings.indexOf(aSibling)>siblings.indexOf(bSibling)){if(sharedParent===nodeB){return POSITION.FOLLOWING|POSITION.CONTAINED_BY}return POSITION.FOLLOWING}else{if(sharedParent===nodeA){return POSITION.PRECEDING|POSITION.CONTAINS}return POSITION.PRECEDING}};exports.uniqueSort=function(nodes){var idx=nodes.length,node,position;nodes=nodes.slice();while(--idx>-1){node=nodes[idx];position=nodes.indexOf(node);if(position>-1&&position<idx){nodes.splice(idx,1)}}nodes.sort(function(a,b){var relative=comparePos(a,b);if(relative&POSITION.PRECEDING){return-1}else if(relative&POSITION.FOLLOWING){return 1}return 0});return nodes}},{}],15:[function(require,module,exports){var ElementType=require(\"domelementtype\");var isTag=exports.isTag=ElementType.isTag;exports.testElement=function(options,element){for(var key in options){if(!options.hasOwnProperty(key));else if(key===\"tag_name\"){if(!isTag(element)||!options.tag_name(element.name)){return false}}else if(key===\"tag_type\"){if(!options.tag_type(element.type))return false}else if(key===\"tag_contains\"){if(isTag(element)||!options.tag_contains(element.data)){return false}}else if(!element.attribs||!options[key](element.attribs[key])){return false}}return true};var Checks={tag_name:function(name){if(typeof name===\"function\"){return function(elem){return isTag(elem)&&name(elem.name)}}else if(name===\"*\"){return isTag}else{return function(elem){return isTag(elem)&&elem.name===name}}},tag_type:function(type){if(typeof type===\"function\"){return function(elem){return type(elem.type)}}else{return function(elem){return elem.type===type}}},tag_contains:function(data){if(typeof data===\"function\"){return function(elem){return!isTag(elem)&&data(elem.data)}}else{return function(elem){return!isTag(elem)&&elem.data===data}}}};function getAttribCheck(attrib,value){if(typeof value===\"function\"){return function(elem){return elem.attribs&&value(elem.attribs[attrib])}}else{return function(elem){return elem.attribs&&elem.attribs[attrib]===value}}}function combineFuncs(a,b){return function(elem){return a(elem)||b(elem)}}exports.getElements=function(options,element,recurse,limit){var funcs=Object.keys(options).map(function(key){var value=options[key];return key in Checks?Checks[key](value):getAttribCheck(key,value)});return funcs.length===0?[]:this.filter(funcs.reduce(combineFuncs),element,recurse,limit)};exports.getElementById=function(id,element,recurse){if(!Array.isArray(element))element=[element];return this.findOne(getAttribCheck(\"id\",id),element,recurse!==false)};exports.getElementsByTagName=function(name,element,recurse,limit){return this.filter(Checks.tag_name(name),element,recurse,limit)};exports.getElementsByTagType=function(type,element,recurse,limit){return this.filter(Checks.tag_type(type),element,recurse,limit)}},{domelementtype:9}],16:[function(require,module,exports){exports.removeElement=function(elem){if(elem.prev)elem.prev.next=elem.next;if(elem.next)elem.next.prev=elem.prev;if(elem.parent){var childs=elem.parent.children;childs.splice(childs.lastIndexOf(elem),1)}};exports.replaceElement=function(elem,replacement){var prev=replacement.prev=elem.prev;if(prev){prev.next=replacement}var next=replacement.next=elem.next;if(next){next.prev=replacement}var parent=replacement.parent=elem.parent;if(parent){var childs=parent.children;childs[childs.lastIndexOf(elem)]=replacement}};exports.appendChild=function(elem,child){child.parent=elem;if(elem.children.push(child)!==1){var sibling=elem.children[elem.children.length-2];sibling.next=child;child.prev=sibling;child.next=null}};exports.append=function(elem,next){var parent=elem.parent,currNext=elem.next;next.next=currNext;next.prev=elem;elem.next=next;next.parent=parent;if(currNext){currNext.prev=next;if(parent){var childs=parent.children;childs.splice(childs.lastIndexOf(currNext),0,next)}}else if(parent){parent.children.push(next)}};exports.prepend=function(elem,prev){var parent=elem.parent;if(parent){var childs=parent.children;childs.splice(childs.lastIndexOf(elem),0,prev)}if(elem.prev){elem.prev.next=prev}prev.parent=parent;prev.prev=elem.prev;prev.next=elem;elem.prev=prev}},{}],17:[function(require,module,exports){var isTag=require(\"domelementtype\").isTag;module.exports={filter:filter,find:find,findOneChild:findOneChild,findOne:findOne,existsOne:existsOne,findAll:findAll};function filter(test,element,recurse,limit){if(!Array.isArray(element))element=[element];if(typeof limit!==\"number\"||!isFinite(limit)){limit=Infinity}return find(test,element,recurse!==false,limit)}function find(test,elems,recurse,limit){var result=[],childs;for(var i=0,j=elems.length;i<j;i++){if(test(elems[i])){result.push(elems[i]);if(--limit<=0)break}childs=elems[i].children;if(recurse&&childs&&childs.length>0){childs=find(test,childs,recurse,limit);result=result.concat(childs);limit-=childs.length;if(limit<=0)break}}return result}function findOneChild(test,elems){for(var i=0,l=elems.length;i<l;i++){if(test(elems[i]))return elems[i]}return null}function findOne(test,elems){var elem=null;for(var i=0,l=elems.length;i<l&&!elem;i++){if(!isTag(elems[i])){continue}else if(test(elems[i])){elem=elems[i]}else if(elems[i].children.length>0){elem=findOne(test,elems[i].children)}}return elem}function existsOne(test,elems){for(var i=0,l=elems.length;i<l;i++){if(isTag(elems[i])&&(test(elems[i])||elems[i].children.length>0&&existsOne(test,elems[i].children))){return true}}return false}function findAll(test,elems){var result=[];for(var i=0,j=elems.length;i<j;i++){if(!isTag(elems[i]))continue;if(test(elems[i]))result.push(elems[i]);if(elems[i].children.length>0){result=result.concat(findAll(test,elems[i].children))}}return result}},{domelementtype:9}],18:[function(require,module,exports){var ElementType=require(\"domelementtype\"),getOuterHTML=require(\"dom-serializer\"),isTag=ElementType.isTag;module.exports={getInnerHTML:getInnerHTML,getOuterHTML:getOuterHTML,getText:getText};function getInnerHTML(elem,opts){return elem.children?elem.children.map(function(elem){return getOuterHTML(elem,opts)}).join(\"\"):\"\"}function getText(elem){if(Array.isArray(elem))return elem.map(getText).join(\"\");if(isTag(elem)||elem.type===ElementType.CDATA)return getText(elem.children);if(elem.type===ElementType.Text)return elem.data;return\"\"}},{\"dom-serializer\":7,domelementtype:9}],19:[function(require,module,exports){var getChildren=exports.getChildren=function(elem){return elem.children};var getParent=exports.getParent=function(elem){return elem.parent};exports.getSiblings=function(elem){var parent=getParent(elem);return parent?getChildren(parent):[elem]};exports.getAttributeValue=function(elem,name){return elem.attribs&&elem.attribs[name]};exports.hasAttrib=function(elem,name){return!!elem.attribs&&hasOwnProperty.call(elem.attribs,name)};exports.getName=function(elem){return elem.name}},{}],20:[function(require,module,exports){var encode=require(\"./lib/encode.js\"),decode=require(\"./lib/decode.js\");exports.decode=function(data,level){return(!level||level<=0?decode.XML:decode.HTML)(data)};exports.decodeStrict=function(data,level){return(!level||level<=0?decode.XML:decode.HTMLStrict)(data)};exports.encode=function(data,level){return(!level||level<=0?encode.XML:encode.HTML)(data)};exports.encodeXML=encode.XML;exports.encodeHTML4=exports.encodeHTML5=exports.encodeHTML=encode.HTML;exports.decodeXML=exports.decodeXMLStrict=decode.XML;exports.decodeHTML4=exports.decodeHTML5=exports.decodeHTML=decode.HTML;exports.decodeHTML4Strict=exports.decodeHTML5Strict=exports.decodeHTMLStrict=decode.HTMLStrict;exports.escape=encode.escape},{\"./lib/decode.js\":21,\"./lib/encode.js\":23}],21:[function(require,module,exports){var entityMap=require(\"../maps/entities.json\"),legacyMap=require(\"../maps/legacy.json\"),xmlMap=require(\"../maps/xml.json\"),decodeCodePoint=require(\"./decode_codepoint.js\");var decodeXMLStrict=getStrictDecoder(xmlMap),decodeHTMLStrict=getStrictDecoder(entityMap);function getStrictDecoder(map){var keys=Object.keys(map).join(\"|\"),replace=getReplacer(map);keys+=\"|#[xX][\\\\da-fA-F]+|#\\\\d+\";var re=new RegExp(\"&(?:\"+keys+\");\",\"g\");return function(str){return String(str).replace(re,replace)}}var decodeHTML=function(){var legacy=Object.keys(legacyMap).sort(sorter);var keys=Object.keys(entityMap).sort(sorter);for(var i=0,j=0;i<keys.length;i++){if(legacy[j]===keys[i]){keys[i]+=\";?\";j++}else{keys[i]+=\";\"}}var re=new RegExp(\"&(?:\"+keys.join(\"|\")+\"|#[xX][\\\\da-fA-F]+;?|#\\\\d+;?)\",\"g\"),replace=getReplacer(entityMap);function replacer(str){if(str.substr(-1)!==\";\")str+=\";\";return replace(str)}return function(str){return String(str).replace(re,replacer)}}();function sorter(a,b){return a<b?1:-1}function getReplacer(map){return function replace(str){if(str.charAt(1)===\"#\"){if(str.charAt(2)===\"X\"||str.charAt(2)===\"x\"){return decodeCodePoint(parseInt(str.substr(3),16))}return decodeCodePoint(parseInt(str.substr(2),10))}return map[str.slice(1,-1)];\n}}module.exports={XML:decodeXMLStrict,HTML:decodeHTML,HTMLStrict:decodeHTMLStrict}},{\"../maps/entities.json\":25,\"../maps/legacy.json\":26,\"../maps/xml.json\":27,\"./decode_codepoint.js\":22}],22:[function(require,module,exports){var decodeMap=require(\"../maps/decode.json\");module.exports=decodeCodePoint;function decodeCodePoint(codePoint){if(codePoint>=55296&&codePoint<=57343||codePoint>1114111){return\"�\"}if(codePoint in decodeMap){codePoint=decodeMap[codePoint]}var output=\"\";if(codePoint>65535){codePoint-=65536;output+=String.fromCharCode(codePoint>>>10&1023|55296);codePoint=56320|codePoint&1023}output+=String.fromCharCode(codePoint);return output}},{\"../maps/decode.json\":24}],23:[function(require,module,exports){var inverseXML=getInverseObj(require(\"../maps/xml.json\")),xmlReplacer=getInverseReplacer(inverseXML);exports.XML=getInverse(inverseXML,xmlReplacer);var inverseHTML=getInverseObj(require(\"../maps/entities.json\")),htmlReplacer=getInverseReplacer(inverseHTML);exports.HTML=getInverse(inverseHTML,htmlReplacer);function getInverseObj(obj){return Object.keys(obj).sort().reduce(function(inverse,name){inverse[obj[name]]=\"&\"+name+\";\";return inverse},{})}function getInverseReplacer(inverse){var single=[],multiple=[];Object.keys(inverse).forEach(function(k){if(k.length===1){single.push(\"\\\\\"+k)}else{multiple.push(k)}});multiple.unshift(\"[\"+single.join(\"\")+\"]\");return new RegExp(multiple.join(\"|\"),\"g\")}var re_nonASCII=/[^\\0-\\x7F]/g,re_astralSymbols=/[\\uD800-\\uDBFF][\\uDC00-\\uDFFF]/g;function singleCharReplacer(c){return\"&#x\"+c.charCodeAt(0).toString(16).toUpperCase()+\";\"}function astralReplacer(c){var high=c.charCodeAt(0);var low=c.charCodeAt(1);var codePoint=(high-55296)*1024+low-56320+65536;return\"&#x\"+codePoint.toString(16).toUpperCase()+\";\"}function getInverse(inverse,re){function func(name){return inverse[name]}return function(data){return data.replace(re,func).replace(re_astralSymbols,astralReplacer).replace(re_nonASCII,singleCharReplacer)}}var re_xmlChars=getInverseReplacer(inverseXML);function escapeXML(data){return data.replace(re_xmlChars,singleCharReplacer).replace(re_astralSymbols,astralReplacer).replace(re_nonASCII,singleCharReplacer)}exports.escape=escapeXML},{\"../maps/entities.json\":25,\"../maps/xml.json\":27}],24:[function(require,module,exports){module.exports={0:65533,128:8364,130:8218,131:402,132:8222,133:8230,134:8224,135:8225,136:710,137:8240,138:352,139:8249,140:338,142:381,145:8216,146:8217,147:8220,148:8221,149:8226,150:8211,151:8212,152:732,153:8482,154:353,155:8250,156:339,158:382,159:376}},{}],25:[function(require,module,exports){module.exports={Aacute:\"Á\",aacute:\"á\",Abreve:\"Ă\",abreve:\"ă\",ac:\"∾\",acd:\"∿\",acE:\"∾̳\",Acirc:\"Â\",acirc:\"â\",acute:\"´\",Acy:\"А\",acy:\"а\",AElig:\"Æ\",aelig:\"æ\",af:\"⁡\",Afr:\"𝔄\",afr:\"𝔞\",Agrave:\"À\",agrave:\"à\",alefsym:\"ℵ\",aleph:\"ℵ\",Alpha:\"Α\",alpha:\"α\",Amacr:\"Ā\",amacr:\"ā\",amalg:\"⨿\",amp:\"&\",AMP:\"&\",andand:\"⩕\",And:\"⩓\",and:\"∧\",andd:\"⩜\",andslope:\"⩘\",andv:\"⩚\",ang:\"∠\",ange:\"⦤\",angle:\"∠\",angmsdaa:\"⦨\",angmsdab:\"⦩\",angmsdac:\"⦪\",angmsdad:\"⦫\",angmsdae:\"⦬\",angmsdaf:\"⦭\",angmsdag:\"⦮\",angmsdah:\"⦯\",angmsd:\"∡\",angrt:\"∟\",angrtvb:\"⊾\",angrtvbd:\"⦝\",angsph:\"∢\",angst:\"Å\",angzarr:\"⍼\",Aogon:\"Ą\",aogon:\"ą\",Aopf:\"𝔸\",aopf:\"𝕒\",apacir:\"⩯\",ap:\"≈\",apE:\"⩰\",ape:\"≊\",apid:\"≋\",apos:\"'\",ApplyFunction:\"⁡\",approx:\"≈\",approxeq:\"≊\",Aring:\"Å\",aring:\"å\",Ascr:\"𝒜\",ascr:\"𝒶\",Assign:\"≔\",ast:\"*\",asymp:\"≈\",asympeq:\"≍\",Atilde:\"Ã\",atilde:\"ã\",Auml:\"Ä\",auml:\"ä\",awconint:\"∳\",awint:\"⨑\",backcong:\"≌\",backepsilon:\"϶\",backprime:\"‵\",backsim:\"∽\",backsimeq:\"⋍\",Backslash:\"∖\",Barv:\"⫧\",barvee:\"⊽\",barwed:\"⌅\",Barwed:\"⌆\",barwedge:\"⌅\",bbrk:\"⎵\",bbrktbrk:\"⎶\",bcong:\"≌\",Bcy:\"Б\",bcy:\"б\",bdquo:\"„\",becaus:\"∵\",because:\"∵\",Because:\"∵\",bemptyv:\"⦰\",bepsi:\"϶\",bernou:\"ℬ\",Bernoullis:\"ℬ\",Beta:\"Β\",beta:\"β\",beth:\"ℶ\",between:\"≬\",Bfr:\"𝔅\",bfr:\"𝔟\",bigcap:\"⋂\",bigcirc:\"◯\",bigcup:\"⋃\",bigodot:\"⨀\",bigoplus:\"⨁\",bigotimes:\"⨂\",bigsqcup:\"⨆\",bigstar:\"★\",bigtriangledown:\"▽\",bigtriangleup:\"△\",biguplus:\"⨄\",bigvee:\"⋁\",bigwedge:\"⋀\",bkarow:\"⤍\",blacklozenge:\"⧫\",blacksquare:\"▪\",blacktriangle:\"▴\",blacktriangledown:\"▾\",blacktriangleleft:\"◂\",blacktriangleright:\"▸\",blank:\"␣\",blk12:\"▒\",blk14:\"░\",blk34:\"▓\",block:\"█\",bne:\"=⃥\",bnequiv:\"≡⃥\",bNot:\"⫭\",bnot:\"⌐\",Bopf:\"𝔹\",bopf:\"𝕓\",bot:\"⊥\",bottom:\"⊥\",bowtie:\"⋈\",boxbox:\"⧉\",boxdl:\"┐\",boxdL:\"╕\",boxDl:\"╖\",boxDL:\"╗\",boxdr:\"┌\",boxdR:\"╒\",boxDr:\"╓\",boxDR:\"╔\",boxh:\"─\",boxH:\"═\",boxhd:\"┬\",boxHd:\"╤\",boxhD:\"╥\",boxHD:\"╦\",boxhu:\"┴\",boxHu:\"╧\",boxhU:\"╨\",boxHU:\"╩\",boxminus:\"⊟\",boxplus:\"⊞\",boxtimes:\"⊠\",boxul:\"┘\",boxuL:\"╛\",boxUl:\"╜\",boxUL:\"╝\",boxur:\"└\",boxuR:\"╘\",boxUr:\"╙\",boxUR:\"╚\",boxv:\"│\",boxV:\"║\",boxvh:\"┼\",boxvH:\"╪\",boxVh:\"╫\",boxVH:\"╬\",boxvl:\"┤\",boxvL:\"╡\",boxVl:\"╢\",boxVL:\"╣\",boxvr:\"├\",boxvR:\"╞\",boxVr:\"╟\",boxVR:\"╠\",bprime:\"‵\",breve:\"˘\",Breve:\"˘\",brvbar:\"¦\",bscr:\"𝒷\",Bscr:\"ℬ\",bsemi:\"⁏\",bsim:\"∽\",bsime:\"⋍\",bsolb:\"⧅\",bsol:\"\\\\\",bsolhsub:\"⟈\",bull:\"•\",bullet:\"•\",bump:\"≎\",bumpE:\"⪮\",bumpe:\"≏\",Bumpeq:\"≎\",bumpeq:\"≏\",Cacute:\"Ć\",cacute:\"ć\",capand:\"⩄\",capbrcup:\"⩉\",capcap:\"⩋\",cap:\"∩\",Cap:\"⋒\",capcup:\"⩇\",capdot:\"⩀\",CapitalDifferentialD:\"ⅅ\",caps:\"∩︀\",caret:\"⁁\",caron:\"ˇ\",Cayleys:\"ℭ\",ccaps:\"⩍\",Ccaron:\"Č\",ccaron:\"č\",Ccedil:\"Ç\",ccedil:\"ç\",Ccirc:\"Ĉ\",ccirc:\"ĉ\",Cconint:\"∰\",ccups:\"⩌\",ccupssm:\"⩐\",Cdot:\"Ċ\",cdot:\"ċ\",cedil:\"¸\",Cedilla:\"¸\",cemptyv:\"⦲\",cent:\"¢\",centerdot:\"·\",CenterDot:\"·\",cfr:\"𝔠\",Cfr:\"ℭ\",CHcy:\"Ч\",chcy:\"ч\",check:\"✓\",checkmark:\"✓\",Chi:\"Χ\",chi:\"χ\",circ:\"ˆ\",circeq:\"≗\",circlearrowleft:\"↺\",circlearrowright:\"↻\",circledast:\"⊛\",circledcirc:\"⊚\",circleddash:\"⊝\",CircleDot:\"⊙\",circledR:\"®\",circledS:\"Ⓢ\",CircleMinus:\"⊖\",CirclePlus:\"⊕\",CircleTimes:\"⊗\",cir:\"○\",cirE:\"⧃\",cire:\"≗\",cirfnint:\"⨐\",cirmid:\"⫯\",cirscir:\"⧂\",ClockwiseContourIntegral:\"∲\",CloseCurlyDoubleQuote:\"”\",CloseCurlyQuote:\"’\",clubs:\"♣\",clubsuit:\"♣\",colon:\":\",Colon:\"∷\",Colone:\"⩴\",colone:\"≔\",coloneq:\"≔\",comma:\",\",commat:\"@\",comp:\"∁\",compfn:\"∘\",complement:\"∁\",complexes:\"ℂ\",cong:\"≅\",congdot:\"⩭\",Congruent:\"≡\",conint:\"∮\",Conint:\"∯\",ContourIntegral:\"∮\",copf:\"𝕔\",Copf:\"ℂ\",coprod:\"∐\",Coproduct:\"∐\",copy:\"©\",COPY:\"©\",copysr:\"℗\",CounterClockwiseContourIntegral:\"∳\",crarr:\"↵\",cross:\"✗\",Cross:\"⨯\",Cscr:\"𝒞\",cscr:\"𝒸\",csub:\"⫏\",csube:\"⫑\",csup:\"⫐\",csupe:\"⫒\",ctdot:\"⋯\",cudarrl:\"⤸\",cudarrr:\"⤵\",cuepr:\"⋞\",cuesc:\"⋟\",cularr:\"↶\",cularrp:\"⤽\",cupbrcap:\"⩈\",cupcap:\"⩆\",CupCap:\"≍\",cup:\"∪\",Cup:\"⋓\",cupcup:\"⩊\",cupdot:\"⊍\",cupor:\"⩅\",cups:\"∪︀\",curarr:\"↷\",curarrm:\"⤼\",curlyeqprec:\"⋞\",curlyeqsucc:\"⋟\",curlyvee:\"⋎\",curlywedge:\"⋏\",curren:\"¤\",curvearrowleft:\"↶\",curvearrowright:\"↷\",cuvee:\"⋎\",cuwed:\"⋏\",cwconint:\"∲\",cwint:\"∱\",cylcty:\"⌭\",dagger:\"†\",Dagger:\"‡\",daleth:\"ℸ\",darr:\"↓\",Darr:\"↡\",dArr:\"⇓\",dash:\"‐\",Dashv:\"⫤\",dashv:\"⊣\",dbkarow:\"⤏\",dblac:\"˝\",Dcaron:\"Ď\",dcaron:\"ď\",Dcy:\"Д\",dcy:\"д\",ddagger:\"‡\",ddarr:\"⇊\",DD:\"ⅅ\",dd:\"ⅆ\",DDotrahd:\"⤑\",ddotseq:\"⩷\",deg:\"°\",Del:\"∇\",Delta:\"Δ\",delta:\"δ\",demptyv:\"⦱\",dfisht:\"⥿\",Dfr:\"𝔇\",dfr:\"𝔡\",dHar:\"⥥\",dharl:\"⇃\",dharr:\"⇂\",DiacriticalAcute:\"´\",DiacriticalDot:\"˙\",DiacriticalDoubleAcute:\"˝\",DiacriticalGrave:\"`\",DiacriticalTilde:\"˜\",diam:\"⋄\",diamond:\"⋄\",Diamond:\"⋄\",diamondsuit:\"♦\",diams:\"♦\",die:\"¨\",DifferentialD:\"ⅆ\",digamma:\"ϝ\",disin:\"⋲\",div:\"÷\",divide:\"÷\",divideontimes:\"⋇\",divonx:\"⋇\",DJcy:\"Ђ\",djcy:\"ђ\",dlcorn:\"⌞\",dlcrop:\"⌍\",dollar:\"$\",Dopf:\"𝔻\",dopf:\"𝕕\",Dot:\"¨\",dot:\"˙\",DotDot:\"⃜\",doteq:\"≐\",doteqdot:\"≑\",DotEqual:\"≐\",dotminus:\"∸\",dotplus:\"∔\",dotsquare:\"⊡\",doublebarwedge:\"⌆\",DoubleContourIntegral:\"∯\",DoubleDot:\"¨\",DoubleDownArrow:\"⇓\",DoubleLeftArrow:\"⇐\",DoubleLeftRightArrow:\"⇔\",DoubleLeftTee:\"⫤\",DoubleLongLeftArrow:\"⟸\",DoubleLongLeftRightArrow:\"⟺\",DoubleLongRightArrow:\"⟹\",DoubleRightArrow:\"⇒\",DoubleRightTee:\"⊨\",DoubleUpArrow:\"⇑\",DoubleUpDownArrow:\"⇕\",DoubleVerticalBar:\"∥\",DownArrowBar:\"⤓\",downarrow:\"↓\",DownArrow:\"↓\",Downarrow:\"⇓\",DownArrowUpArrow:\"⇵\",DownBreve:\"̑\",downdownarrows:\"⇊\",downharpoonleft:\"⇃\",downharpoonright:\"⇂\",DownLeftRightVector:\"⥐\",DownLeftTeeVector:\"⥞\",DownLeftVectorBar:\"⥖\",DownLeftVector:\"↽\",DownRightTeeVector:\"⥟\",DownRightVectorBar:\"⥗\",DownRightVector:\"⇁\",DownTeeArrow:\"↧\",DownTee:\"⊤\",drbkarow:\"⤐\",drcorn:\"⌟\",drcrop:\"⌌\",Dscr:\"𝒟\",dscr:\"𝒹\",DScy:\"Ѕ\",dscy:\"ѕ\",dsol:\"⧶\",Dstrok:\"Đ\",dstrok:\"đ\",dtdot:\"⋱\",dtri:\"▿\",dtrif:\"▾\",duarr:\"⇵\",duhar:\"⥯\",dwangle:\"⦦\",DZcy:\"Џ\",dzcy:\"џ\",dzigrarr:\"⟿\",Eacute:\"É\",eacute:\"é\",easter:\"⩮\",Ecaron:\"Ě\",ecaron:\"ě\",Ecirc:\"Ê\",ecirc:\"ê\",ecir:\"≖\",ecolon:\"≕\",Ecy:\"Э\",ecy:\"э\",eDDot:\"⩷\",Edot:\"Ė\",edot:\"ė\",eDot:\"≑\",ee:\"ⅇ\",efDot:\"≒\",Efr:\"𝔈\",efr:\"𝔢\",eg:\"⪚\",Egrave:\"È\",egrave:\"è\",egs:\"⪖\",egsdot:\"⪘\",el:\"⪙\",Element:\"∈\",elinters:\"⏧\",ell:\"ℓ\",els:\"⪕\",elsdot:\"⪗\",Emacr:\"Ē\",emacr:\"ē\",empty:\"∅\",emptyset:\"∅\",EmptySmallSquare:\"◻\",emptyv:\"∅\",EmptyVerySmallSquare:\"▫\",emsp13:\" \",emsp14:\" \",emsp:\" \",ENG:\"Ŋ\",eng:\"ŋ\",ensp:\" \",Eogon:\"Ę\",eogon:\"ę\",Eopf:\"𝔼\",eopf:\"𝕖\",epar:\"⋕\",eparsl:\"⧣\",eplus:\"⩱\",epsi:\"ε\",Epsilon:\"Ε\",epsilon:\"ε\",epsiv:\"ϵ\",eqcirc:\"≖\",eqcolon:\"≕\",eqsim:\"≂\",eqslantgtr:\"⪖\",eqslantless:\"⪕\",Equal:\"⩵\",equals:\"=\",EqualTilde:\"≂\",equest:\"≟\",Equilibrium:\"⇌\",equiv:\"≡\",equivDD:\"⩸\",eqvparsl:\"⧥\",erarr:\"⥱\",erDot:\"≓\",escr:\"ℯ\",Escr:\"ℰ\",esdot:\"≐\",Esim:\"⩳\",esim:\"≂\",Eta:\"Η\",eta:\"η\",ETH:\"Ð\",eth:\"ð\",Euml:\"Ë\",euml:\"ë\",euro:\"€\",excl:\"!\",exist:\"∃\",Exists:\"∃\",expectation:\"ℰ\",exponentiale:\"ⅇ\",ExponentialE:\"ⅇ\",fallingdotseq:\"≒\",Fcy:\"Ф\",fcy:\"ф\",female:\"♀\",ffilig:\"ﬃ\",fflig:\"ﬀ\",ffllig:\"ﬄ\",Ffr:\"𝔉\",ffr:\"𝔣\",filig:\"ﬁ\",FilledSmallSquare:\"◼\",FilledVerySmallSquare:\"▪\",fjlig:\"fj\",flat:\"♭\",fllig:\"ﬂ\",fltns:\"▱\",fnof:\"ƒ\",Fopf:\"𝔽\",fopf:\"𝕗\",forall:\"∀\",ForAll:\"∀\",fork:\"⋔\",forkv:\"⫙\",Fouriertrf:\"ℱ\",fpartint:\"⨍\",frac12:\"½\",frac13:\"⅓\",frac14:\"¼\",frac15:\"⅕\",frac16:\"⅙\",frac18:\"⅛\",frac23:\"⅔\",frac25:\"⅖\",frac34:\"¾\",frac35:\"⅗\",frac38:\"⅜\",frac45:\"⅘\",frac56:\"⅚\",frac58:\"⅝\",frac78:\"⅞\",frasl:\"⁄\",frown:\"⌢\",fscr:\"𝒻\",Fscr:\"ℱ\",gacute:\"ǵ\",Gamma:\"Γ\",gamma:\"γ\",Gammad:\"Ϝ\",gammad:\"ϝ\",gap:\"⪆\",Gbreve:\"Ğ\",gbreve:\"ğ\",Gcedil:\"Ģ\",Gcirc:\"Ĝ\",gcirc:\"ĝ\",Gcy:\"Г\",gcy:\"г\",Gdot:\"Ġ\",gdot:\"ġ\",ge:\"≥\",gE:\"≧\",gEl:\"⪌\",gel:\"⋛\",geq:\"≥\",geqq:\"≧\",geqslant:\"⩾\",gescc:\"⪩\",ges:\"⩾\",gesdot:\"⪀\",gesdoto:\"⪂\",gesdotol:\"⪄\",gesl:\"⋛︀\",gesles:\"⪔\",Gfr:\"𝔊\",gfr:\"𝔤\",gg:\"≫\",Gg:\"⋙\",ggg:\"⋙\",gimel:\"ℷ\",GJcy:\"Ѓ\",gjcy:\"ѓ\",gla:\"⪥\",gl:\"≷\",glE:\"⪒\",glj:\"⪤\",gnap:\"⪊\",gnapprox:\"⪊\",gne:\"⪈\",gnE:\"≩\",gneq:\"⪈\",gneqq:\"≩\",gnsim:\"⋧\",Gopf:\"𝔾\",gopf:\"𝕘\",grave:\"`\",GreaterEqual:\"≥\",GreaterEqualLess:\"⋛\",GreaterFullEqual:\"≧\",GreaterGreater:\"⪢\",GreaterLess:\"≷\",GreaterSlantEqual:\"⩾\",GreaterTilde:\"≳\",Gscr:\"𝒢\",gscr:\"ℊ\",gsim:\"≳\",gsime:\"⪎\",gsiml:\"⪐\",gtcc:\"⪧\",gtcir:\"⩺\",gt:\">\",GT:\">\",Gt:\"≫\",gtdot:\"⋗\",gtlPar:\"⦕\",gtquest:\"⩼\",gtrapprox:\"⪆\",gtrarr:\"⥸\",gtrdot:\"⋗\",gtreqless:\"⋛\",gtreqqless:\"⪌\",gtrless:\"≷\",gtrsim:\"≳\",gvertneqq:\"≩︀\",gvnE:\"≩︀\",Hacek:\"ˇ\",hairsp:\" \",half:\"½\",hamilt:\"ℋ\",HARDcy:\"Ъ\",hardcy:\"ъ\",harrcir:\"⥈\",harr:\"↔\",hArr:\"⇔\",harrw:\"↭\",Hat:\"^\",hbar:\"ℏ\",Hcirc:\"Ĥ\",hcirc:\"ĥ\",hearts:\"♥\",heartsuit:\"♥\",hellip:\"…\",hercon:\"⊹\",hfr:\"𝔥\",Hfr:\"ℌ\",HilbertSpace:\"ℋ\",hksearow:\"⤥\",hkswarow:\"⤦\",hoarr:\"⇿\",homtht:\"∻\",hookleftarrow:\"↩\",hookrightarrow:\"↪\",hopf:\"𝕙\",Hopf:\"ℍ\",horbar:\"―\",HorizontalLine:\"─\",hscr:\"𝒽\",Hscr:\"ℋ\",hslash:\"ℏ\",Hstrok:\"Ħ\",hstrok:\"ħ\",HumpDownHump:\"≎\",HumpEqual:\"≏\",hybull:\"⁃\",hyphen:\"‐\",Iacute:\"Í\",iacute:\"í\",ic:\"⁣\",Icirc:\"Î\",icirc:\"î\",Icy:\"И\",icy:\"и\",Idot:\"İ\",IEcy:\"Е\",iecy:\"е\",iexcl:\"¡\",iff:\"⇔\",ifr:\"𝔦\",Ifr:\"ℑ\",Igrave:\"Ì\",igrave:\"ì\",ii:\"ⅈ\",iiiint:\"⨌\",iiint:\"∭\",iinfin:\"⧜\",iiota:\"℩\",IJlig:\"Ĳ\",ijlig:\"ĳ\",Imacr:\"Ī\",imacr:\"ī\",image:\"ℑ\",ImaginaryI:\"ⅈ\",imagline:\"ℐ\",imagpart:\"ℑ\",imath:\"ı\",Im:\"ℑ\",imof:\"⊷\",imped:\"Ƶ\",Implies:\"⇒\",incare:\"℅\",in:\"∈\",infin:\"∞\",infintie:\"⧝\",inodot:\"ı\",intcal:\"⊺\",int:\"∫\",Int:\"∬\",integers:\"ℤ\",Integral:\"∫\",intercal:\"⊺\",Intersection:\"⋂\",intlarhk:\"⨗\",intprod:\"⨼\",InvisibleComma:\"⁣\",InvisibleTimes:\"⁢\",IOcy:\"Ё\",iocy:\"ё\",Iogon:\"Į\",iogon:\"į\",Iopf:\"𝕀\",iopf:\"𝕚\",Iota:\"Ι\",iota:\"ι\",iprod:\"⨼\",iquest:\"¿\",iscr:\"𝒾\",Iscr:\"ℐ\",isin:\"∈\",isindot:\"⋵\",isinE:\"⋹\",isins:\"⋴\",isinsv:\"⋳\",isinv:\"∈\",it:\"⁢\",Itilde:\"Ĩ\",itilde:\"ĩ\",Iukcy:\"І\",iukcy:\"і\",Iuml:\"Ï\",iuml:\"ï\",Jcirc:\"Ĵ\",jcirc:\"ĵ\",Jcy:\"Й\",jcy:\"й\",Jfr:\"𝔍\",jfr:\"𝔧\",jmath:\"ȷ\",Jopf:\"𝕁\",jopf:\"𝕛\",Jscr:\"𝒥\",jscr:\"𝒿\",Jsercy:\"Ј\",jsercy:\"ј\",Jukcy:\"Є\",jukcy:\"є\",Kappa:\"Κ\",kappa:\"κ\",kappav:\"ϰ\",Kcedil:\"Ķ\",kcedil:\"ķ\",Kcy:\"К\",kcy:\"к\",Kfr:\"𝔎\",kfr:\"𝔨\",kgreen:\"ĸ\",KHcy:\"Х\",khcy:\"х\",KJcy:\"Ќ\",kjcy:\"ќ\",Kopf:\"𝕂\",kopf:\"𝕜\",Kscr:\"𝒦\",kscr:\"𝓀\",lAarr:\"⇚\",Lacute:\"Ĺ\",lacute:\"ĺ\",laemptyv:\"⦴\",lagran:\"ℒ\",Lambda:\"Λ\",lambda:\"λ\",lang:\"⟨\",Lang:\"⟪\",langd:\"⦑\",langle:\"⟨\",lap:\"⪅\",Laplacetrf:\"ℒ\",laquo:\"«\",larrb:\"⇤\",larrbfs:\"⤟\",larr:\"←\",Larr:\"↞\",lArr:\"⇐\",larrfs:\"⤝\",larrhk:\"↩\",larrlp:\"↫\",larrpl:\"⤹\",larrsim:\"⥳\",larrtl:\"↢\",latail:\"⤙\",lAtail:\"⤛\",lat:\"⪫\",late:\"⪭\",lates:\"⪭︀\",lbarr:\"⤌\",lBarr:\"⤎\",lbbrk:\"❲\",lbrace:\"{\",lbrack:\"[\",lbrke:\"⦋\",lbrksld:\"⦏\",lbrkslu:\"⦍\",Lcaron:\"Ľ\",lcaron:\"ľ\",Lcedil:\"Ļ\",lcedil:\"ļ\",lceil:\"⌈\",lcub:\"{\",Lcy:\"Л\",lcy:\"л\",ldca:\"⤶\",ldquo:\"“\",ldquor:\"„\",ldrdhar:\"⥧\",ldrushar:\"⥋\",ldsh:\"↲\",le:\"≤\",lE:\"≦\",LeftAngleBracket:\"⟨\",LeftArrowBar:\"⇤\",leftarrow:\"←\",LeftArrow:\"←\",Leftarrow:\"⇐\",LeftArrowRightArrow:\"⇆\",leftarrowtail:\"↢\",LeftCeiling:\"⌈\",LeftDoubleBracket:\"⟦\",LeftDownTeeVector:\"⥡\",LeftDownVectorBar:\"⥙\",LeftDownVector:\"⇃\",LeftFloor:\"⌊\",leftharpoondown:\"↽\",leftharpoonup:\"↼\",leftleftarrows:\"⇇\",leftrightarrow:\"↔\",LeftRightArrow:\"↔\",Leftrightarrow:\"⇔\",leftrightarrows:\"⇆\",leftrightharpoons:\"⇋\",leftrightsquigarrow:\"↭\",LeftRightVector:\"⥎\",LeftTeeArrow:\"↤\",LeftTee:\"⊣\",LeftTeeVector:\"⥚\",leftthreetimes:\"⋋\",LeftTriangleBar:\"⧏\",LeftTriangle:\"⊲\",LeftTriangleEqual:\"⊴\",LeftUpDownVector:\"⥑\",LeftUpTeeVector:\"⥠\",LeftUpVectorBar:\"⥘\",LeftUpVector:\"↿\",LeftVectorBar:\"⥒\",LeftVector:\"↼\",lEg:\"⪋\",leg:\"⋚\",leq:\"≤\",leqq:\"≦\",leqslant:\"⩽\",lescc:\"⪨\",les:\"⩽\",lesdot:\"⩿\",lesdoto:\"⪁\",lesdotor:\"⪃\",lesg:\"⋚︀\",lesges:\"⪓\",lessapprox:\"⪅\",lessdot:\"⋖\",lesseqgtr:\"⋚\",lesseqqgtr:\"⪋\",LessEqualGreater:\"⋚\",LessFullEqual:\"≦\",LessGreater:\"≶\",lessgtr:\"≶\",LessLess:\"⪡\",lesssim:\"≲\",LessSlantEqual:\"⩽\",LessTilde:\"≲\",lfisht:\"⥼\",lfloor:\"⌊\",Lfr:\"𝔏\",lfr:\"𝔩\",lg:\"≶\",lgE:\"⪑\",lHar:\"⥢\",lhard:\"↽\",lharu:\"↼\",lharul:\"⥪\",lhblk:\"▄\",LJcy:\"Љ\",ljcy:\"љ\",llarr:\"⇇\",ll:\"≪\",Ll:\"⋘\",llcorner:\"⌞\",Lleftarrow:\"⇚\",llhard:\"⥫\",lltri:\"◺\",Lmidot:\"Ŀ\",lmidot:\"ŀ\",lmoustache:\"⎰\",lmoust:\"⎰\",lnap:\"⪉\",lnapprox:\"⪉\",lne:\"⪇\",lnE:\"≨\",lneq:\"⪇\",lneqq:\"≨\",lnsim:\"⋦\",loang:\"⟬\",loarr:\"⇽\",lobrk:\"⟦\",longleftarrow:\"⟵\",LongLeftArrow:\"⟵\",Longleftarrow:\"⟸\",longleftrightarrow:\"⟷\",LongLeftRightArrow:\"⟷\",Longleftrightarrow:\"⟺\",longmapsto:\"⟼\",longrightarrow:\"⟶\",LongRightArrow:\"⟶\",Longrightarrow:\"⟹\",looparrowleft:\"↫\",looparrowright:\"↬\",lopar:\"⦅\",Lopf:\"𝕃\",lopf:\"𝕝\",loplus:\"⨭\",lotimes:\"⨴\",lowast:\"∗\",lowbar:\"_\",LowerLeftArrow:\"↙\",LowerRightArrow:\"↘\",loz:\"◊\",lozenge:\"◊\",lozf:\"⧫\",lpar:\"(\",lparlt:\"⦓\",lrarr:\"⇆\",lrcorner:\"⌟\",lrhar:\"⇋\",lrhard:\"⥭\",lrm:\"‎\",lrtri:\"⊿\",lsaquo:\"‹\",lscr:\"𝓁\",Lscr:\"ℒ\",lsh:\"↰\",Lsh:\"↰\",lsim:\"≲\",lsime:\"⪍\",lsimg:\"⪏\",lsqb:\"[\",lsquo:\"‘\",lsquor:\"‚\",Lstrok:\"Ł\",lstrok:\"ł\",ltcc:\"⪦\",ltcir:\"⩹\",lt:\"<\",LT:\"<\",Lt:\"≪\",ltdot:\"⋖\",lthree:\"⋋\",ltimes:\"⋉\",ltlarr:\"⥶\",ltquest:\"⩻\",ltri:\"◃\",ltrie:\"⊴\",ltrif:\"◂\",ltrPar:\"⦖\",lurdshar:\"⥊\",luruhar:\"⥦\",lvertneqq:\"≨︀\",lvnE:\"≨︀\",macr:\"¯\",male:\"♂\",malt:\"✠\",maltese:\"✠\",Map:\"⤅\",map:\"↦\",mapsto:\"↦\",mapstodown:\"↧\",mapstoleft:\"↤\",mapstoup:\"↥\",marker:\"▮\",mcomma:\"⨩\",Mcy:\"М\",mcy:\"м\",mdash:\"—\",mDDot:\"∺\",measuredangle:\"∡\",MediumSpace:\" \",Mellintrf:\"ℳ\",Mfr:\"𝔐\",mfr:\"𝔪\",mho:\"℧\",micro:\"µ\",midast:\"*\",midcir:\"⫰\",mid:\"∣\",middot:\"·\",minusb:\"⊟\",minus:\"−\",minusd:\"∸\",minusdu:\"⨪\",MinusPlus:\"∓\",mlcp:\"⫛\",mldr:\"…\",mnplus:\"∓\",models:\"⊧\",Mopf:\"𝕄\",mopf:\"𝕞\",mp:\"∓\",mscr:\"𝓂\",Mscr:\"ℳ\",mstpos:\"∾\",Mu:\"Μ\",mu:\"μ\",multimap:\"⊸\",mumap:\"⊸\",nabla:\"∇\",Nacute:\"Ń\",nacute:\"ń\",nang:\"∠⃒\",nap:\"≉\",napE:\"⩰̸\",napid:\"≋̸\",napos:\"ŉ\",napprox:\"≉\",natural:\"♮\",naturals:\"ℕ\",natur:\"♮\",nbsp:\" \",nbump:\"≎̸\",nbumpe:\"≏̸\",ncap:\"⩃\",Ncaron:\"Ň\",ncaron:\"ň\",Ncedil:\"Ņ\",ncedil:\"ņ\",ncong:\"≇\",ncongdot:\"⩭̸\",ncup:\"⩂\",Ncy:\"Н\",ncy:\"н\",ndash:\"–\",nearhk:\"⤤\",nearr:\"↗\",neArr:\"⇗\",nearrow:\"↗\",ne:\"≠\",nedot:\"≐̸\",NegativeMediumSpace:\"​\",NegativeThickSpace:\"​\",NegativeThinSpace:\"​\",NegativeVeryThinSpace:\"​\",nequiv:\"≢\",nesear:\"⤨\",nesim:\"≂̸\",NestedGreaterGreater:\"≫\",NestedLessLess:\"≪\",NewLine:\"\\n\",nexist:\"∄\",nexists:\"∄\",Nfr:\"𝔑\",nfr:\"𝔫\",ngE:\"≧̸\",nge:\"≱\",ngeq:\"≱\",ngeqq:\"≧̸\",ngeqslant:\"⩾̸\",nges:\"⩾̸\",nGg:\"⋙̸\",ngsim:\"≵\",nGt:\"≫⃒\",ngt:\"≯\",ngtr:\"≯\",nGtv:\"≫̸\",nharr:\"↮\",nhArr:\"⇎\",nhpar:\"⫲\",ni:\"∋\",nis:\"⋼\",nisd:\"⋺\",niv:\"∋\",NJcy:\"Њ\",njcy:\"њ\",nlarr:\"↚\",nlArr:\"⇍\",nldr:\"‥\",nlE:\"≦̸\",nle:\"≰\",nleftarrow:\"↚\",nLeftarrow:\"⇍\",nleftrightarrow:\"↮\",nLeftrightarrow:\"⇎\",nleq:\"≰\",nleqq:\"≦̸\",nleqslant:\"⩽̸\",nles:\"⩽̸\",nless:\"≮\",nLl:\"⋘̸\",nlsim:\"≴\",nLt:\"≪⃒\",nlt:\"≮\",nltri:\"⋪\",nltrie:\"⋬\",nLtv:\"≪̸\",nmid:\"∤\",NoBreak:\"⁠\",NonBreakingSpace:\" \",nopf:\"𝕟\",Nopf:\"ℕ\",Not:\"⫬\",not:\"¬\",NotCongruent:\"≢\",NotCupCap:\"≭\",NotDoubleVerticalBar:\"∦\",NotElement:\"∉\",NotEqual:\"≠\",NotEqualTilde:\"≂̸\",NotExists:\"∄\",NotGreater:\"≯\",NotGreaterEqual:\"≱\",NotGreaterFullEqual:\"≧̸\",NotGreaterGreater:\"≫̸\",NotGreaterLess:\"≹\",NotGreaterSlantEqual:\"⩾̸\",NotGreaterTilde:\"≵\",NotHumpDownHump:\"≎̸\",NotHumpEqual:\"≏̸\",notin:\"∉\",notindot:\"⋵̸\",notinE:\"⋹̸\",notinva:\"∉\",notinvb:\"⋷\",notinvc:\"⋶\",NotLeftTriangleBar:\"⧏̸\",NotLeftTriangle:\"⋪\",NotLeftTriangleEqual:\"⋬\",NotLess:\"≮\",NotLessEqual:\"≰\",NotLessGreater:\"≸\",NotLessLess:\"≪̸\",NotLessSlantEqual:\"⩽̸\",NotLessTilde:\"≴\",NotNestedGreaterGreater:\"⪢̸\",NotNestedLessLess:\"⪡̸\",notni:\"∌\",notniva:\"∌\",notnivb:\"⋾\",notnivc:\"⋽\",NotPrecedes:\"⊀\",NotPrecedesEqual:\"⪯̸\",NotPrecedesSlantEqual:\"⋠\",NotReverseElement:\"∌\",NotRightTriangleBar:\"⧐̸\",NotRightTriangle:\"⋫\",NotRightTriangleEqual:\"⋭\",NotSquareSubset:\"⊏̸\",NotSquareSubsetEqual:\"⋢\",NotSquareSuperset:\"⊐̸\",NotSquareSupersetEqual:\"⋣\",NotSubset:\"⊂⃒\",NotSubsetEqual:\"⊈\",NotSucceeds:\"⊁\",NotSucceedsEqual:\"⪰̸\",NotSucceedsSlantEqual:\"⋡\",NotSucceedsTilde:\"≿̸\",NotSuperset:\"⊃⃒\",NotSupersetEqual:\"⊉\",NotTilde:\"≁\",NotTildeEqual:\"≄\",NotTildeFullEqual:\"≇\",NotTildeTilde:\"≉\",NotVerticalBar:\"∤\",nparallel:\"∦\",npar:\"∦\",nparsl:\"⫽⃥\",npart:\"∂̸\",npolint:\"⨔\",npr:\"⊀\",nprcue:\"⋠\",nprec:\"⊀\",npreceq:\"⪯̸\",npre:\"⪯̸\",nrarrc:\"⤳̸\",nrarr:\"↛\",nrArr:\"⇏\",nrarrw:\"↝̸\",nrightarrow:\"↛\",nRightarrow:\"⇏\",nrtri:\"⋫\",nrtrie:\"⋭\",nsc:\"⊁\",nsccue:\"⋡\",nsce:\"⪰̸\",Nscr:\"𝒩\",nscr:\"𝓃\",nshortmid:\"∤\",nshortparallel:\"∦\",nsim:\"≁\",nsime:\"≄\",nsimeq:\"≄\",nsmid:\"∤\",nspar:\"∦\",nsqsube:\"⋢\",nsqsupe:\"⋣\",nsub:\"⊄\",nsubE:\"⫅̸\",nsube:\"⊈\",nsubset:\"⊂⃒\",nsubseteq:\"⊈\",nsubseteqq:\"⫅̸\",nsucc:\"⊁\",nsucceq:\"⪰̸\",nsup:\"⊅\",nsupE:\"⫆̸\",nsupe:\"⊉\",nsupset:\"⊃⃒\",nsupseteq:\"⊉\",nsupseteqq:\"⫆̸\",ntgl:\"≹\",Ntilde:\"Ñ\",ntilde:\"ñ\",ntlg:\"≸\",ntriangleleft:\"⋪\",ntrianglelefteq:\"⋬\",ntriangleright:\"⋫\",ntrianglerighteq:\"⋭\",Nu:\"Ν\",nu:\"ν\",num:\"#\",numero:\"№\",numsp:\" \",nvap:\"≍⃒\",nvdash:\"⊬\",nvDash:\"⊭\",nVdash:\"⊮\",nVDash:\"⊯\",nvge:\"≥⃒\",nvgt:\">⃒\",nvHarr:\"⤄\",nvinfin:\"⧞\",nvlArr:\"⤂\",nvle:\"≤⃒\",nvlt:\"<⃒\",nvltrie:\"⊴⃒\",nvrArr:\"⤃\",nvrtrie:\"⊵⃒\",nvsim:\"∼⃒\",nwarhk:\"⤣\",nwarr:\"↖\",nwArr:\"⇖\",nwarrow:\"↖\",nwnear:\"⤧\",Oacute:\"Ó\",oacute:\"ó\",oast:\"⊛\",Ocirc:\"Ô\",ocirc:\"ô\",ocir:\"⊚\",Ocy:\"О\",ocy:\"о\",odash:\"⊝\",Odblac:\"Ő\",odblac:\"ő\",odiv:\"⨸\",odot:\"⊙\",odsold:\"⦼\",OElig:\"Œ\",oelig:\"œ\",ofcir:\"⦿\",Ofr:\"𝔒\",ofr:\"𝔬\",ogon:\"˛\",Ograve:\"Ò\",ograve:\"ò\",ogt:\"⧁\",ohbar:\"⦵\",ohm:\"Ω\",oint:\"∮\",olarr:\"↺\",olcir:\"⦾\",olcross:\"⦻\",oline:\"‾\",olt:\"⧀\",Omacr:\"Ō\",omacr:\"ō\",Omega:\"Ω\",omega:\"ω\",Omicron:\"Ο\",omicron:\"ο\",omid:\"⦶\",ominus:\"⊖\",Oopf:\"𝕆\",oopf:\"𝕠\",opar:\"⦷\",OpenCurlyDoubleQuote:\"“\",OpenCurlyQuote:\"‘\",operp:\"⦹\",oplus:\"⊕\",orarr:\"↻\",Or:\"⩔\",or:\"∨\",ord:\"⩝\",order:\"ℴ\",orderof:\"ℴ\",ordf:\"ª\",ordm:\"º\",origof:\"⊶\",oror:\"⩖\",orslope:\"⩗\",orv:\"⩛\",oS:\"Ⓢ\",Oscr:\"𝒪\",oscr:\"ℴ\",Oslash:\"Ø\",oslash:\"ø\",osol:\"⊘\",Otilde:\"Õ\",otilde:\"õ\",otimesas:\"⨶\",Otimes:\"⨷\",otimes:\"⊗\",Ouml:\"Ö\",ouml:\"ö\",ovbar:\"⌽\",OverBar:\"‾\",OverBrace:\"⏞\",OverBracket:\"⎴\",OverParenthesis:\"⏜\",para:\"¶\",parallel:\"∥\",par:\"∥\",parsim:\"⫳\",parsl:\"⫽\",part:\"∂\",PartialD:\"∂\",Pcy:\"П\",pcy:\"п\",percnt:\"%\",period:\".\",permil:\"‰\",perp:\"⊥\",pertenk:\"‱\",Pfr:\"𝔓\",pfr:\"𝔭\",Phi:\"Φ\",phi:\"φ\",phiv:\"ϕ\",phmmat:\"ℳ\",phone:\"☎\",Pi:\"Π\",pi:\"π\",pitchfork:\"⋔\",piv:\"ϖ\",planck:\"ℏ\",planckh:\"ℎ\",plankv:\"ℏ\",plusacir:\"⨣\",plusb:\"⊞\",pluscir:\"⨢\",plus:\"+\",plusdo:\"∔\",plusdu:\"⨥\",pluse:\"⩲\",PlusMinus:\"±\",plusmn:\"±\",plussim:\"⨦\",plustwo:\"⨧\",pm:\"±\",Poincareplane:\"ℌ\",pointint:\"⨕\",popf:\"𝕡\",Popf:\"ℙ\",pound:\"£\",prap:\"⪷\",Pr:\"⪻\",pr:\"≺\",prcue:\"≼\",precapprox:\"⪷\",prec:\"≺\",preccurlyeq:\"≼\",Precedes:\"≺\",PrecedesEqual:\"⪯\",PrecedesSlantEqual:\"≼\",PrecedesTilde:\"≾\",preceq:\"⪯\",precnapprox:\"⪹\",precneqq:\"⪵\",precnsim:\"⋨\",pre:\"⪯\",prE:\"⪳\",precsim:\"≾\",prime:\"′\",Prime:\"″\",primes:\"ℙ\",prnap:\"⪹\",prnE:\"⪵\",prnsim:\"⋨\",prod:\"∏\",Product:\"∏\",profalar:\"⌮\",profline:\"⌒\",profsurf:\"⌓\",prop:\"∝\",Proportional:\"∝\",Proportion:\"∷\",propto:\"∝\",prsim:\"≾\",prurel:\"⊰\",Pscr:\"𝒫\",pscr:\"𝓅\",Psi:\"Ψ\",psi:\"ψ\",puncsp:\" \",Qfr:\"𝔔\",qfr:\"𝔮\",qint:\"⨌\",qopf:\"𝕢\",Qopf:\"ℚ\",qprime:\"⁗\",Qscr:\"𝒬\",qscr:\"𝓆\",quaternions:\"ℍ\",quatint:\"⨖\",quest:\"?\",questeq:\"≟\",quot:'\"',QUOT:'\"',rAarr:\"⇛\",race:\"∽̱\",Racute:\"Ŕ\",racute:\"ŕ\",radic:\"√\",raemptyv:\"⦳\",rang:\"⟩\",Rang:\"⟫\",rangd:\"⦒\",range:\"⦥\",rangle:\"⟩\",raquo:\"»\",rarrap:\"⥵\",rarrb:\"⇥\",rarrbfs:\"⤠\",rarrc:\"⤳\",rarr:\"→\",Rarr:\"↠\",rArr:\"⇒\",rarrfs:\"⤞\",rarrhk:\"↪\",rarrlp:\"↬\",rarrpl:\"⥅\",rarrsim:\"⥴\",Rarrtl:\"⤖\",rarrtl:\"↣\",rarrw:\"↝\",ratail:\"⤚\",rAtail:\"⤜\",ratio:\"∶\",rationals:\"ℚ\",rbarr:\"⤍\",rBarr:\"⤏\",RBarr:\"⤐\",rbbrk:\"❳\",rbrace:\"}\",rbrack:\"]\",rbrke:\"⦌\",rbrksld:\"⦎\",rbrkslu:\"⦐\",Rcaron:\"Ř\",rcaron:\"ř\",Rcedil:\"Ŗ\",rcedil:\"ŗ\",rceil:\"⌉\",rcub:\"}\",Rcy:\"Р\",rcy:\"р\",rdca:\"⤷\",rdldhar:\"⥩\",rdquo:\"”\",rdquor:\"”\",rdsh:\"↳\",real:\"ℜ\",realine:\"ℛ\",realpart:\"ℜ\",reals:\"ℝ\",Re:\"ℜ\",rect:\"▭\",reg:\"®\",REG:\"®\",ReverseElement:\"∋\",ReverseEquilibrium:\"⇋\",ReverseUpEquilibrium:\"⥯\",rfisht:\"⥽\",rfloor:\"⌋\",rfr:\"𝔯\",Rfr:\"ℜ\",rHar:\"⥤\",rhard:\"⇁\",rharu:\"⇀\",rharul:\"⥬\",Rho:\"Ρ\",rho:\"ρ\",rhov:\"ϱ\",RightAngleBracket:\"⟩\",RightArrowBar:\"⇥\",rightarrow:\"→\",RightArrow:\"→\",Rightarrow:\"⇒\",RightArrowLeftArrow:\"⇄\",rightarrowtail:\"↣\",RightCeiling:\"⌉\",RightDoubleBracket:\"⟧\",RightDownTeeVector:\"⥝\",RightDownVectorBar:\"⥕\",RightDownVector:\"⇂\",RightFloor:\"⌋\",rightharpoondown:\"⇁\",rightharpoonup:\"⇀\",rightleftarrows:\"⇄\",rightleftharpoons:\"⇌\",rightrightarrows:\"⇉\",rightsquigarrow:\"↝\",RightTeeArrow:\"↦\",RightTee:\"⊢\",RightTeeVector:\"⥛\",rightthreetimes:\"⋌\",RightTriangleBar:\"⧐\",RightTriangle:\"⊳\",RightTriangleEqual:\"⊵\",RightUpDownVector:\"⥏\",RightUpTeeVector:\"⥜\",RightUpVectorBar:\"⥔\",RightUpVector:\"↾\",RightVectorBar:\"⥓\",RightVector:\"⇀\",ring:\"˚\",risingdotseq:\"≓\",rlarr:\"⇄\",rlhar:\"⇌\",rlm:\"‏\",rmoustache:\"⎱\",rmoust:\"⎱\",rnmid:\"⫮\",roang:\"⟭\",roarr:\"⇾\",robrk:\"⟧\",ropar:\"⦆\",ropf:\"𝕣\",Ropf:\"ℝ\",roplus:\"⨮\",rotimes:\"⨵\",RoundImplies:\"⥰\",rpar:\")\",rpargt:\"⦔\",rppolint:\"⨒\",rrarr:\"⇉\",Rrightarrow:\"⇛\",rsaquo:\"›\",rscr:\"𝓇\",Rscr:\"ℛ\",rsh:\"↱\",Rsh:\"↱\",rsqb:\"]\",rsquo:\"’\",rsquor:\"’\",rthree:\"⋌\",rtimes:\"⋊\",rtri:\"▹\",rtrie:\"⊵\",rtrif:\"▸\",rtriltri:\"⧎\",RuleDelayed:\"⧴\",ruluhar:\"⥨\",rx:\"℞\",Sacute:\"Ś\",sacute:\"ś\",sbquo:\"‚\",scap:\"⪸\",Scaron:\"Š\",scaron:\"š\",Sc:\"⪼\",sc:\"≻\",sccue:\"≽\",sce:\"⪰\",scE:\"⪴\",Scedil:\"Ş\",scedil:\"ş\",Scirc:\"Ŝ\",scirc:\"ŝ\",scnap:\"⪺\",scnE:\"⪶\",scnsim:\"⋩\",scpolint:\"⨓\",scsim:\"≿\",Scy:\"С\",scy:\"с\",sdotb:\"⊡\",sdot:\"⋅\",sdote:\"⩦\",searhk:\"⤥\",searr:\"↘\",seArr:\"⇘\",searrow:\"↘\",sect:\"§\",semi:\";\",seswar:\"⤩\",setminus:\"∖\",setmn:\"∖\",sext:\"✶\",Sfr:\"𝔖\",sfr:\"𝔰\",sfrown:\"⌢\",sharp:\"♯\",SHCHcy:\"Щ\",shchcy:\"щ\",SHcy:\"Ш\",shcy:\"ш\",ShortDownArrow:\"↓\",ShortLeftArrow:\"←\",shortmid:\"∣\",shortparallel:\"∥\",ShortRightArrow:\"→\",ShortUpArrow:\"↑\",shy:\"­\",Sigma:\"Σ\",sigma:\"σ\",sigmaf:\"ς\",sigmav:\"ς\",sim:\"∼\",simdot:\"⩪\",sime:\"≃\",simeq:\"≃\",simg:\"⪞\",simgE:\"⪠\",siml:\"⪝\",simlE:\"⪟\",simne:\"≆\",simplus:\"⨤\",simrarr:\"⥲\",slarr:\"←\",SmallCircle:\"∘\",smallsetminus:\"∖\",smashp:\"⨳\",smeparsl:\"⧤\",smid:\"∣\",smile:\"⌣\",smt:\"⪪\",smte:\"⪬\",smtes:\"⪬︀\",SOFTcy:\"Ь\",softcy:\"ь\",solbar:\"⌿\",solb:\"⧄\",sol:\"/\",Sopf:\"𝕊\",sopf:\"𝕤\",spades:\"♠\",spadesuit:\"♠\",spar:\"∥\",sqcap:\"⊓\",sqcaps:\"⊓︀\",sqcup:\"⊔\",sqcups:\"⊔︀\",Sqrt:\"√\",sqsub:\"⊏\",sqsube:\"⊑\",sqsubset:\"⊏\",sqsubseteq:\"⊑\",sqsup:\"⊐\",sqsupe:\"⊒\",sqsupset:\"⊐\",sqsupseteq:\"⊒\",square:\"□\",Square:\"□\",SquareIntersection:\"⊓\",SquareSubset:\"⊏\",SquareSubsetEqual:\"⊑\",SquareSuperset:\"⊐\",SquareSupersetEqual:\"⊒\",SquareUnion:\"⊔\",squarf:\"▪\",squ:\"□\",squf:\"▪\",srarr:\"→\",Sscr:\"𝒮\",sscr:\"𝓈\",ssetmn:\"∖\",ssmile:\"⌣\",sstarf:\"⋆\",Star:\"⋆\",star:\"☆\",starf:\"★\",straightepsilon:\"ϵ\",straightphi:\"ϕ\",strns:\"¯\",sub:\"⊂\",Sub:\"⋐\",subdot:\"⪽\",subE:\"⫅\",sube:\"⊆\",subedot:\"⫃\",submult:\"⫁\",subnE:\"⫋\",subne:\"⊊\",subplus:\"⪿\",subrarr:\"⥹\",subset:\"⊂\",Subset:\"⋐\",subseteq:\"⊆\",subseteqq:\"⫅\",SubsetEqual:\"⊆\",subsetneq:\"⊊\",subsetneqq:\"⫋\",subsim:\"⫇\",subsub:\"⫕\",subsup:\"⫓\",succapprox:\"⪸\",succ:\"≻\",succcurlyeq:\"≽\",Succeeds:\"≻\",SucceedsEqual:\"⪰\",SucceedsSlantEqual:\"≽\",SucceedsTilde:\"≿\",succeq:\"⪰\",succnapprox:\"⪺\",succneqq:\"⪶\",succnsim:\"⋩\",succsim:\"≿\",SuchThat:\"∋\",sum:\"∑\",Sum:\"∑\",sung:\"♪\",sup1:\"¹\",sup2:\"²\",sup3:\"³\",sup:\"⊃\",Sup:\"⋑\",supdot:\"⪾\",supdsub:\"⫘\",supE:\"⫆\",supe:\"⊇\",supedot:\"⫄\",Superset:\"⊃\",SupersetEqual:\"⊇\",suphsol:\"⟉\",suphsub:\"⫗\",suplarr:\"⥻\",supmult:\"⫂\",supnE:\"⫌\",supne:\"⊋\",supplus:\"⫀\",supset:\"⊃\",Supset:\"⋑\",supseteq:\"⊇\",supseteqq:\"⫆\",supsetneq:\"⊋\",supsetneqq:\"⫌\",supsim:\"⫈\",supsub:\"⫔\",supsup:\"⫖\",swarhk:\"⤦\",swarr:\"↙\",swArr:\"⇙\",swarrow:\"↙\",swnwar:\"⤪\",szlig:\"ß\",Tab:\"\\t\",target:\"⌖\",Tau:\"Τ\",tau:\"τ\",tbrk:\"⎴\",Tcaron:\"Ť\",tcaron:\"ť\",Tcedil:\"Ţ\",tcedil:\"ţ\",Tcy:\"Т\",tcy:\"т\",tdot:\"⃛\",telrec:\"⌕\",Tfr:\"𝔗\",tfr:\"𝔱\",there4:\"∴\",therefore:\"∴\",Therefore:\"∴\",Theta:\"Θ\",theta:\"θ\",thetasym:\"ϑ\",thetav:\"ϑ\",thickapprox:\"≈\",thicksim:\"∼\",ThickSpace:\"  \",ThinSpace:\" \",thinsp:\" \",thkap:\"≈\",thksim:\"∼\",THORN:\"Þ\",thorn:\"þ\",tilde:\"˜\",Tilde:\"∼\",TildeEqual:\"≃\",TildeFullEqual:\"≅\",TildeTilde:\"≈\",timesbar:\"⨱\",timesb:\"⊠\",times:\"×\",timesd:\"⨰\",tint:\"∭\",toea:\"⤨\",topbot:\"⌶\",topcir:\"⫱\",top:\"⊤\",Topf:\"𝕋\",topf:\"𝕥\",topfork:\"⫚\",tosa:\"⤩\",tprime:\"‴\",trade:\"™\",TRADE:\"™\",triangle:\"▵\",triangledown:\"▿\",triangleleft:\"◃\",trianglelefteq:\"⊴\",triangleq:\"≜\",triangleright:\"▹\",trianglerighteq:\"⊵\",tridot:\"◬\",trie:\"≜\",triminus:\"⨺\",TripleDot:\"⃛\",triplus:\"⨹\",trisb:\"⧍\",tritime:\"⨻\",trpezium:\"⏢\",Tscr:\"𝒯\",tscr:\"𝓉\",TScy:\"Ц\",tscy:\"ц\",TSHcy:\"Ћ\",tshcy:\"ћ\",Tstrok:\"Ŧ\",tstrok:\"ŧ\",twixt:\"≬\",twoheadleftarrow:\"↞\",twoheadrightarrow:\"↠\",Uacute:\"Ú\",uacute:\"ú\",uarr:\"↑\",Uarr:\"↟\",uArr:\"⇑\",Uarrocir:\"⥉\",Ubrcy:\"Ў\",ubrcy:\"ў\",Ubreve:\"Ŭ\",ubreve:\"ŭ\",Ucirc:\"Û\",ucirc:\"û\",Ucy:\"У\",ucy:\"у\",udarr:\"⇅\",Udblac:\"Ű\",udblac:\"ű\",udhar:\"⥮\",ufisht:\"⥾\",Ufr:\"𝔘\",ufr:\"𝔲\",Ugrave:\"Ù\",ugrave:\"ù\",uHar:\"⥣\",uharl:\"↿\",uharr:\"↾\",uhblk:\"▀\",ulcorn:\"⌜\",ulcorner:\"⌜\",ulcrop:\"⌏\",ultri:\"◸\",Umacr:\"Ū\",umacr:\"ū\",uml:\"¨\",UnderBar:\"_\",UnderBrace:\"⏟\",UnderBracket:\"⎵\",UnderParenthesis:\"⏝\",Union:\"⋃\",UnionPlus:\"⊎\",Uogon:\"Ų\",uogon:\"ų\",Uopf:\"𝕌\",uopf:\"𝕦\",UpArrowBar:\"⤒\",uparrow:\"↑\",UpArrow:\"↑\",Uparrow:\"⇑\",UpArrowDownArrow:\"⇅\",updownarrow:\"↕\",UpDownArrow:\"↕\",Updownarrow:\"⇕\",UpEquilibrium:\"⥮\",upharpoonleft:\"↿\",upharpoonright:\"↾\",uplus:\"⊎\",UpperLeftArrow:\"↖\",UpperRightArrow:\"↗\",upsi:\"υ\",Upsi:\"ϒ\",upsih:\"ϒ\",Upsilon:\"Υ\",upsilon:\"υ\",UpTeeArrow:\"↥\",UpTee:\"⊥\",upuparrows:\"⇈\",urcorn:\"⌝\",urcorner:\"⌝\",urcrop:\"⌎\",Uring:\"Ů\",uring:\"ů\",urtri:\"◹\",Uscr:\"𝒰\",uscr:\"𝓊\",utdot:\"⋰\",Utilde:\"Ũ\",utilde:\"ũ\",utri:\"▵\",utrif:\"▴\",uuarr:\"⇈\",Uuml:\"Ü\",uuml:\"ü\",uwangle:\"⦧\",vangrt:\"⦜\",varepsilon:\"ϵ\",varkappa:\"ϰ\",varnothing:\"∅\",varphi:\"ϕ\",varpi:\"ϖ\",varpropto:\"∝\",varr:\"↕\",vArr:\"⇕\",varrho:\"ϱ\",varsigma:\"ς\",varsubsetneq:\"⊊︀\",varsubsetneqq:\"⫋︀\",varsupsetneq:\"⊋︀\",varsupsetneqq:\"⫌︀\",vartheta:\"ϑ\",vartriangleleft:\"⊲\",vartriangleright:\"⊳\",vBar:\"⫨\",Vbar:\"⫫\",vBarv:\"⫩\",Vcy:\"В\",vcy:\"в\",vdash:\"⊢\",vDash:\"⊨\",Vdash:\"⊩\",VDash:\"⊫\",Vdashl:\"⫦\",veebar:\"⊻\",vee:\"∨\",Vee:\"⋁\",veeeq:\"≚\",vellip:\"⋮\",verbar:\"|\",Verbar:\"‖\",vert:\"|\",Vert:\"‖\",VerticalBar:\"∣\",VerticalLine:\"|\",VerticalSeparator:\"❘\",VerticalTilde:\"≀\",VeryThinSpace:\" \",Vfr:\"𝔙\",vfr:\"𝔳\",vltri:\"⊲\",vnsub:\"⊂⃒\",vnsup:\"⊃⃒\",Vopf:\"𝕍\",vopf:\"𝕧\",vprop:\"∝\",vrtri:\"⊳\",Vscr:\"𝒱\",vscr:\"𝓋\",vsubnE:\"⫋︀\",vsubne:\"⊊︀\",vsupnE:\"⫌︀\",vsupne:\"⊋︀\",Vvdash:\"⊪\",vzigzag:\"⦚\",Wcirc:\"Ŵ\",wcirc:\"ŵ\",wedbar:\"⩟\",wedge:\"∧\",Wedge:\"⋀\",wedgeq:\"≙\",weierp:\"℘\",Wfr:\"𝔚\",wfr:\"𝔴\",Wopf:\"𝕎\",wopf:\"𝕨\",wp:\"℘\",wr:\"≀\",wreath:\"≀\",Wscr:\"𝒲\",wscr:\"𝓌\",xcap:\"⋂\",xcirc:\"◯\",xcup:\"⋃\",xdtri:\"▽\",Xfr:\"𝔛\",xfr:\"𝔵\",xharr:\"⟷\",xhArr:\"⟺\",Xi:\"Ξ\",xi:\"ξ\",xlarr:\"⟵\",xlArr:\"⟸\",xmap:\"⟼\",xnis:\"⋻\",xodot:\"⨀\",Xopf:\"𝕏\",xopf:\"𝕩\",xoplus:\"⨁\",xotime:\"⨂\",xrarr:\"⟶\",xrArr:\"⟹\",Xscr:\"𝒳\",xscr:\"𝓍\",xsqcup:\"⨆\",xuplus:\"⨄\",xutri:\"△\",xvee:\"⋁\",xwedge:\"⋀\",Yacute:\"Ý\",yacute:\"ý\",YAcy:\"Я\",yacy:\"я\",Ycirc:\"Ŷ\",ycirc:\"ŷ\",Ycy:\"Ы\",ycy:\"ы\",yen:\"¥\",Yfr:\"𝔜\",yfr:\"𝔶\",YIcy:\"Ї\",yicy:\"ї\",Yopf:\"𝕐\",yopf:\"𝕪\",Yscr:\"𝒴\",yscr:\"𝓎\",YUcy:\"Ю\",yucy:\"ю\",yuml:\"ÿ\",Yuml:\"Ÿ\",Zacute:\"Ź\",zacute:\"ź\",Zcaron:\"Ž\",zcaron:\"ž\",Zcy:\"З\",zcy:\"з\",Zdot:\"Ż\",zdot:\"ż\",zeetrf:\"ℨ\",ZeroWidthSpace:\"​\",Zeta:\"Ζ\",zeta:\"ζ\",zfr:\"𝔷\",Zfr:\"ℨ\",ZHcy:\"Ж\",zhcy:\"ж\",zigrarr:\"⇝\",zopf:\"𝕫\",Zopf:\"ℤ\",Zscr:\"𝒵\",zscr:\"𝓏\",zwj:\"‍\",zwnj:\"‌\"}},{}],26:[function(require,module,exports){module.exports={Aacute:\"Á\",aacute:\"á\",Acirc:\"Â\",acirc:\"â\",acute:\"´\",AElig:\"Æ\",aelig:\"æ\",Agrave:\"À\",agrave:\"à\",amp:\"&\",AMP:\"&\",Aring:\"Å\",aring:\"å\",Atilde:\"Ã\",atilde:\"ã\",Auml:\"Ä\",auml:\"ä\",brvbar:\"¦\",Ccedil:\"Ç\",ccedil:\"ç\",cedil:\"¸\",cent:\"¢\",copy:\"©\",COPY:\"©\",curren:\"¤\",deg:\"°\",divide:\"÷\",Eacute:\"É\",eacute:\"é\",Ecirc:\"Ê\",ecirc:\"ê\",Egrave:\"È\",egrave:\"è\",ETH:\"Ð\",eth:\"ð\",Euml:\"Ë\",euml:\"ë\",frac12:\"½\",frac14:\"¼\",frac34:\"¾\",gt:\">\",GT:\">\",Iacute:\"Í\",iacute:\"í\",Icirc:\"Î\",icirc:\"î\",iexcl:\"¡\",Igrave:\"Ì\",igrave:\"ì\",iquest:\"¿\",Iuml:\"Ï\",iuml:\"ï\",laquo:\"«\",lt:\"<\",LT:\"<\",macr:\"¯\",micro:\"µ\",middot:\"·\",nbsp:\" \",not:\"¬\",Ntilde:\"Ñ\",ntilde:\"ñ\",Oacute:\"Ó\",oacute:\"ó\",Ocirc:\"Ô\",ocirc:\"ô\",Ograve:\"Ò\",ograve:\"ò\",ordf:\"ª\",ordm:\"º\",Oslash:\"Ø\",oslash:\"ø\",Otilde:\"Õ\",otilde:\"õ\",Ouml:\"Ö\",ouml:\"ö\",para:\"¶\",plusmn:\"±\",pound:\"£\",quot:'\"',QUOT:'\"',raquo:\"»\",reg:\"®\",REG:\"®\",sect:\"§\",shy:\"­\",sup1:\"¹\",sup2:\"²\",sup3:\"³\",szlig:\"ß\",THORN:\"Þ\",thorn:\"þ\",times:\"×\",Uacute:\"Ú\",uacute:\"ú\",Ucirc:\"Û\",ucirc:\"û\",Ugrave:\"Ù\",ugrave:\"ù\",uml:\"¨\",Uuml:\"Ü\",uuml:\"ü\",Yacute:\"Ý\",yacute:\"ý\",yen:\"¥\",yuml:\"ÿ\"}},{}],27:[function(require,module,exports){module.exports={amp:\"&\",apos:\"'\",gt:\">\",lt:\"<\",quot:'\"'}},{}],28:[function(require,module,exports){function EventEmitter(){this._events=this._events||{};this._maxListeners=this._maxListeners||undefined}module.exports=EventEmitter;EventEmitter.EventEmitter=EventEmitter;EventEmitter.prototype._events=undefined;EventEmitter.prototype._maxListeners=undefined;EventEmitter.defaultMaxListeners=10;EventEmitter.prototype.setMaxListeners=function(n){if(!isNumber(n)||n<0||isNaN(n))throw TypeError(\"n must be a positive number\");this._maxListeners=n;return this};EventEmitter.prototype.emit=function(type){var er,handler,len,args,i,listeners;if(!this._events)this._events={};if(type===\"error\"){if(!this._events.error||isObject(this._events.error)&&!this._events.error.length){er=arguments[1];if(er instanceof Error){throw er}else{var err=new Error('Uncaught, unspecified \"error\" event. ('+er+\")\");err.context=er;throw err}}}handler=this._events[type];if(isUndefined(handler))return false;if(isFunction(handler)){switch(arguments.length){case 1:handler.call(this);break;case 2:handler.call(this,arguments[1]);break;case 3:handler.call(this,arguments[1],arguments[2]);break;default:args=Array.prototype.slice.call(arguments,1);handler.apply(this,args)}}else if(isObject(handler)){args=Array.prototype.slice.call(arguments,1);listeners=handler.slice();len=listeners.length;for(i=0;i<len;i++)listeners[i].apply(this,args)}return true};EventEmitter.prototype.addListener=function(type,listener){var m;if(!isFunction(listener))throw TypeError(\"listener must be a function\");if(!this._events)this._events={};if(this._events.newListener)this.emit(\"newListener\",type,isFunction(listener.listener)?listener.listener:listener);if(!this._events[type])this._events[type]=listener;else if(isObject(this._events[type]))this._events[type].push(listener);else this._events[type]=[this._events[type],listener];if(isObject(this._events[type])&&!this._events[type].warned){if(!isUndefined(this._maxListeners)){m=this._maxListeners}else{m=EventEmitter.defaultMaxListeners}if(m&&m>0&&this._events[type].length>m){this._events[type].warned=true;console.error(\"(node) warning: possible EventEmitter memory \"+\"leak detected. %d listeners added. \"+\"Use emitter.setMaxListeners() to increase limit.\",this._events[type].length);if(typeof console.trace===\"function\"){console.trace()}}}return this};EventEmitter.prototype.on=EventEmitter.prototype.addListener;EventEmitter.prototype.once=function(type,listener){if(!isFunction(listener))throw TypeError(\"listener must be a function\");var fired=false;function g(){this.removeListener(type,g);if(!fired){fired=true;listener.apply(this,arguments)}}g.listener=listener;this.on(type,g);return this};EventEmitter.prototype.removeListener=function(type,listener){var list,position,length,i;if(!isFunction(listener))throw TypeError(\"listener must be a function\");if(!this._events||!this._events[type])return this;list=this._events[type];length=list.length;position=-1;if(list===listener||isFunction(list.listener)&&list.listener===listener){delete this._events[type];if(this._events.removeListener)this.emit(\"removeListener\",type,listener)}else if(isObject(list)){for(i=length;i-- >0;){if(list[i]===listener||list[i].listener&&list[i].listener===listener){position=i;break}}if(position<0)return this;if(list.length===1){list.length=0;delete this._events[type]}else{list.splice(position,1);\n}if(this._events.removeListener)this.emit(\"removeListener\",type,listener)}return this};EventEmitter.prototype.removeAllListeners=function(type){var key,listeners;if(!this._events)return this;if(!this._events.removeListener){if(arguments.length===0)this._events={};else if(this._events[type])delete this._events[type];return this}if(arguments.length===0){for(key in this._events){if(key===\"removeListener\")continue;this.removeAllListeners(key)}this.removeAllListeners(\"removeListener\");this._events={};return this}listeners=this._events[type];if(isFunction(listeners)){this.removeListener(type,listeners)}else if(listeners){while(listeners.length)this.removeListener(type,listeners[listeners.length-1])}delete this._events[type];return this};EventEmitter.prototype.listeners=function(type){var ret;if(!this._events||!this._events[type])ret=[];else if(isFunction(this._events[type]))ret=[this._events[type]];else ret=this._events[type].slice();return ret};EventEmitter.prototype.listenerCount=function(type){if(this._events){var evlistener=this._events[type];if(isFunction(evlistener))return 1;else if(evlistener)return evlistener.length}return 0};EventEmitter.listenerCount=function(emitter,type){return emitter.listenerCount(type)};function isFunction(arg){return typeof arg===\"function\"}function isNumber(arg){return typeof arg===\"number\"}function isObject(arg){return typeof arg===\"object\"&&arg!==null}function isUndefined(arg){return arg===void 0}},{}],29:[function(require,module,exports){module.exports=CollectingHandler;function CollectingHandler(cbs){this._cbs=cbs||{};this.events=[]}var EVENTS=require(\"./\").EVENTS;Object.keys(EVENTS).forEach(function(name){if(EVENTS[name]===0){name=\"on\"+name;CollectingHandler.prototype[name]=function(){this.events.push([name]);if(this._cbs[name])this._cbs[name]()}}else if(EVENTS[name]===1){name=\"on\"+name;CollectingHandler.prototype[name]=function(a){this.events.push([name,a]);if(this._cbs[name])this._cbs[name](a)}}else if(EVENTS[name]===2){name=\"on\"+name;CollectingHandler.prototype[name]=function(a,b){this.events.push([name,a,b]);if(this._cbs[name])this._cbs[name](a,b)}}else{throw Error(\"wrong number of arguments\")}});CollectingHandler.prototype.onreset=function(){this.events=[];if(this._cbs.onreset)this._cbs.onreset()};CollectingHandler.prototype.restart=function(){if(this._cbs.onreset)this._cbs.onreset();for(var i=0,len=this.events.length;i<len;i++){if(this._cbs[this.events[i][0]]){var num=this.events[i].length;if(num===1){this._cbs[this.events[i][0]]()}else if(num===2){this._cbs[this.events[i][0]](this.events[i][1])}else{this._cbs[this.events[i][0]](this.events[i][1],this.events[i][2])}}}}},{\"./\":36}],30:[function(require,module,exports){var index=require(\"./index.js\"),DomHandler=index.DomHandler,DomUtils=index.DomUtils;function FeedHandler(callback,options){this.init(callback,options)}require(\"inherits\")(FeedHandler,DomHandler);FeedHandler.prototype.init=DomHandler;function getElements(what,where){return DomUtils.getElementsByTagName(what,where,true)}function getOneElement(what,where){return DomUtils.getElementsByTagName(what,where,true,1)[0]}function fetch(what,where,recurse){return DomUtils.getText(DomUtils.getElementsByTagName(what,where,recurse,1)).trim()}function addConditionally(obj,prop,what,where,recurse){var tmp=fetch(what,where,recurse);if(tmp)obj[prop]=tmp}var isValidFeed=function(value){return value===\"rss\"||value===\"feed\"||value===\"rdf:RDF\"};FeedHandler.prototype.onend=function(){var feed={},feedRoot=getOneElement(isValidFeed,this.dom),tmp,childs;if(feedRoot){if(feedRoot.name===\"feed\"){childs=feedRoot.children;feed.type=\"atom\";addConditionally(feed,\"id\",\"id\",childs);addConditionally(feed,\"title\",\"title\",childs);if((tmp=getOneElement(\"link\",childs))&&(tmp=tmp.attribs)&&(tmp=tmp.href))feed.link=tmp;addConditionally(feed,\"description\",\"subtitle\",childs);if(tmp=fetch(\"updated\",childs))feed.updated=new Date(tmp);addConditionally(feed,\"author\",\"email\",childs,true);feed.items=getElements(\"entry\",childs).map(function(item){var entry={},tmp;item=item.children;addConditionally(entry,\"id\",\"id\",item);addConditionally(entry,\"title\",\"title\",item);if((tmp=getOneElement(\"link\",item))&&(tmp=tmp.attribs)&&(tmp=tmp.href))entry.link=tmp;if(tmp=fetch(\"summary\",item)||fetch(\"content\",item))entry.description=tmp;if(tmp=fetch(\"updated\",item))entry.pubDate=new Date(tmp);return entry})}else{childs=getOneElement(\"channel\",feedRoot.children).children;feed.type=feedRoot.name.substr(0,3);feed.id=\"\";addConditionally(feed,\"title\",\"title\",childs);addConditionally(feed,\"link\",\"link\",childs);addConditionally(feed,\"description\",\"description\",childs);if(tmp=fetch(\"lastBuildDate\",childs))feed.updated=new Date(tmp);addConditionally(feed,\"author\",\"managingEditor\",childs,true);feed.items=getElements(\"item\",feedRoot.children).map(function(item){var entry={},tmp;item=item.children;addConditionally(entry,\"id\",\"guid\",item);addConditionally(entry,\"title\",\"title\",item);addConditionally(entry,\"link\",\"link\",item);addConditionally(entry,\"description\",\"description\",item);if(tmp=fetch(\"pubDate\",item))entry.pubDate=new Date(tmp);return entry})}}this.dom=feed;DomHandler.prototype._handleCallback.call(this,feedRoot?null:Error(\"couldn't find root of feed\"))};module.exports=FeedHandler},{\"./index.js\":36,inherits:38}],31:[function(require,module,exports){var Tokenizer=require(\"./Tokenizer.js\");var formTags={input:true,option:true,optgroup:true,select:true,button:true,datalist:true,textarea:true};var openImpliesClose={tr:{tr:true,th:true,td:true},th:{th:true},td:{thead:true,th:true,td:true},body:{head:true,link:true,script:true},li:{li:true},p:{p:true},h1:{p:true},h2:{p:true},h3:{p:true},h4:{p:true},h5:{p:true},h6:{p:true},select:formTags,input:formTags,output:formTags,button:formTags,datalist:formTags,textarea:formTags,option:{option:true},optgroup:{optgroup:true}};var voidElements={__proto__:null,area:true,base:true,basefont:true,br:true,col:true,command:true,embed:true,frame:true,hr:true,img:true,input:true,isindex:true,keygen:true,link:true,meta:true,param:true,source:true,track:true,wbr:true,path:true,circle:true,ellipse:true,line:true,rect:true,use:true,stop:true,polyline:true,polygon:true};var re_nameEnd=/\\s|\\//;function Parser(cbs,options){this._options=options||{};this._cbs=cbs||{};this._tagname=\"\";this._attribname=\"\";this._attribvalue=\"\";this._attribs=null;this._stack=[];this.startIndex=0;this.endIndex=null;this._lowerCaseTagNames=\"lowerCaseTags\"in this._options?!!this._options.lowerCaseTags:!this._options.xmlMode;this._lowerCaseAttributeNames=\"lowerCaseAttributeNames\"in this._options?!!this._options.lowerCaseAttributeNames:!this._options.xmlMode;if(this._options.Tokenizer){Tokenizer=this._options.Tokenizer}this._tokenizer=new Tokenizer(this._options,this);if(this._cbs.onparserinit)this._cbs.onparserinit(this)}require(\"inherits\")(Parser,require(\"events\").EventEmitter);Parser.prototype._updatePosition=function(initialOffset){if(this.endIndex===null){if(this._tokenizer._sectionStart<=initialOffset){this.startIndex=0}else{this.startIndex=this._tokenizer._sectionStart-initialOffset}}else this.startIndex=this.endIndex+1;this.endIndex=this._tokenizer.getAbsoluteIndex()};Parser.prototype.ontext=function(data){this._updatePosition(1);this.endIndex--;if(this._cbs.ontext)this._cbs.ontext(data)};Parser.prototype.onopentagname=function(name){if(this._lowerCaseTagNames){name=name.toLowerCase()}this._tagname=name;if(!this._options.xmlMode&&name in openImpliesClose){for(var el;(el=this._stack[this._stack.length-1])in openImpliesClose[name];this.onclosetag(el));}if(this._options.xmlMode||!(name in voidElements)){this._stack.push(name)}if(this._cbs.onopentagname)this._cbs.onopentagname(name);if(this._cbs.onopentag)this._attribs={}};Parser.prototype.onopentagend=function(){this._updatePosition(1);if(this._attribs){if(this._cbs.onopentag)this._cbs.onopentag(this._tagname,this._attribs);this._attribs=null}if(!this._options.xmlMode&&this._cbs.onclosetag&&this._tagname in voidElements){this._cbs.onclosetag(this._tagname)}this._tagname=\"\"};Parser.prototype.onclosetag=function(name){this._updatePosition(1);if(this._lowerCaseTagNames){name=name.toLowerCase()}if(this._stack.length&&(!(name in voidElements)||this._options.xmlMode)){var pos=this._stack.lastIndexOf(name);if(pos!==-1){if(this._cbs.onclosetag){pos=this._stack.length-pos;while(pos--)this._cbs.onclosetag(this._stack.pop())}else this._stack.length=pos}else if(name===\"p\"&&!this._options.xmlMode){this.onopentagname(name);this._closeCurrentTag()}}else if(!this._options.xmlMode&&(name===\"br\"||name===\"p\")){this.onopentagname(name);this._closeCurrentTag()}};Parser.prototype.onselfclosingtag=function(){if(this._options.xmlMode||this._options.recognizeSelfClosing){this._closeCurrentTag()}else{this.onopentagend()}};Parser.prototype._closeCurrentTag=function(){var name=this._tagname;this.onopentagend();if(this._stack[this._stack.length-1]===name){if(this._cbs.onclosetag){this._cbs.onclosetag(name)}this._stack.pop()}};Parser.prototype.onattribname=function(name){if(this._lowerCaseAttributeNames){name=name.toLowerCase()}this._attribname=name};Parser.prototype.onattribdata=function(value){this._attribvalue+=value};Parser.prototype.onattribend=function(){if(this._cbs.onattribute)this._cbs.onattribute(this._attribname,this._attribvalue);if(this._attribs&&!Object.prototype.hasOwnProperty.call(this._attribs,this._attribname)){this._attribs[this._attribname]=this._attribvalue}this._attribname=\"\";this._attribvalue=\"\"};Parser.prototype._getInstructionName=function(value){var idx=value.search(re_nameEnd),name=idx<0?value:value.substr(0,idx);if(this._lowerCaseTagNames){name=name.toLowerCase()}return name};Parser.prototype.ondeclaration=function(value){if(this._cbs.onprocessinginstruction){var name=this._getInstructionName(value);this._cbs.onprocessinginstruction(\"!\"+name,\"!\"+value)}};Parser.prototype.onprocessinginstruction=function(value){if(this._cbs.onprocessinginstruction){var name=this._getInstructionName(value);this._cbs.onprocessinginstruction(\"?\"+name,\"?\"+value)}};Parser.prototype.oncomment=function(value){this._updatePosition(4);if(this._cbs.oncomment)this._cbs.oncomment(value);if(this._cbs.oncommentend)this._cbs.oncommentend()};Parser.prototype.oncdata=function(value){this._updatePosition(1);if(this._options.xmlMode||this._options.recognizeCDATA){if(this._cbs.oncdatastart)this._cbs.oncdatastart();if(this._cbs.ontext)this._cbs.ontext(value);if(this._cbs.oncdataend)this._cbs.oncdataend()}else{this.oncomment(\"[CDATA[\"+value+\"]]\")}};Parser.prototype.onerror=function(err){if(this._cbs.onerror)this._cbs.onerror(err)};Parser.prototype.onend=function(){if(this._cbs.onclosetag){for(var i=this._stack.length;i>0;this._cbs.onclosetag(this._stack[--i]));}if(this._cbs.onend)this._cbs.onend()};Parser.prototype.reset=function(){if(this._cbs.onreset)this._cbs.onreset();this._tokenizer.reset();this._tagname=\"\";this._attribname=\"\";this._attribs=null;this._stack=[];if(this._cbs.onparserinit)this._cbs.onparserinit(this)};Parser.prototype.parseComplete=function(data){this.reset();this.end(data)};Parser.prototype.write=function(chunk){this._tokenizer.write(chunk)};Parser.prototype.end=function(chunk){this._tokenizer.end(chunk)};Parser.prototype.pause=function(){this._tokenizer.pause()};Parser.prototype.resume=function(){this._tokenizer.resume()};Parser.prototype.parseChunk=Parser.prototype.write;Parser.prototype.done=Parser.prototype.end;module.exports=Parser},{\"./Tokenizer.js\":34,events:28,inherits:38}],32:[function(require,module,exports){module.exports=ProxyHandler;function ProxyHandler(cbs){this._cbs=cbs||{}}var EVENTS=require(\"./\").EVENTS;Object.keys(EVENTS).forEach(function(name){if(EVENTS[name]===0){name=\"on\"+name;ProxyHandler.prototype[name]=function(){if(this._cbs[name])this._cbs[name]()}}else if(EVENTS[name]===1){name=\"on\"+name;ProxyHandler.prototype[name]=function(a){if(this._cbs[name])this._cbs[name](a)}}else if(EVENTS[name]===2){name=\"on\"+name;ProxyHandler.prototype[name]=function(a,b){if(this._cbs[name])this._cbs[name](a,b)}}else{throw Error(\"wrong number of arguments\")}})},{\"./\":36}],33:[function(require,module,exports){module.exports=Stream;var Parser=require(\"./WritableStream.js\");function Stream(options){Parser.call(this,new Cbs(this),options)}require(\"inherits\")(Stream,Parser);Stream.prototype.readable=true;function Cbs(scope){this.scope=scope}var EVENTS=require(\"../\").EVENTS;Object.keys(EVENTS).forEach(function(name){if(EVENTS[name]===0){Cbs.prototype[\"on\"+name]=function(){this.scope.emit(name)}}else if(EVENTS[name]===1){Cbs.prototype[\"on\"+name]=function(a){this.scope.emit(name,a)}}else if(EVENTS[name]===2){Cbs.prototype[\"on\"+name]=function(a,b){this.scope.emit(name,a,b)}}else{throw Error(\"wrong number of arguments!\")}})},{\"../\":36,\"./WritableStream.js\":35,inherits:38}],34:[function(require,module,exports){module.exports=Tokenizer;var decodeCodePoint=require(\"entities/lib/decode_codepoint.js\"),entityMap=require(\"entities/maps/entities.json\"),legacyMap=require(\"entities/maps/legacy.json\"),xmlMap=require(\"entities/maps/xml.json\"),i=0,TEXT=i++,BEFORE_TAG_NAME=i++,IN_TAG_NAME=i++,IN_SELF_CLOSING_TAG=i++,BEFORE_CLOSING_TAG_NAME=i++,IN_CLOSING_TAG_NAME=i++,AFTER_CLOSING_TAG_NAME=i++,BEFORE_ATTRIBUTE_NAME=i++,IN_ATTRIBUTE_NAME=i++,AFTER_ATTRIBUTE_NAME=i++,BEFORE_ATTRIBUTE_VALUE=i++,IN_ATTRIBUTE_VALUE_DQ=i++,IN_ATTRIBUTE_VALUE_SQ=i++,IN_ATTRIBUTE_VALUE_NQ=i++,BEFORE_DECLARATION=i++,IN_DECLARATION=i++,IN_PROCESSING_INSTRUCTION=i++,BEFORE_COMMENT=i++,IN_COMMENT=i++,AFTER_COMMENT_1=i++,AFTER_COMMENT_2=i++,BEFORE_CDATA_1=i++,BEFORE_CDATA_2=i++,BEFORE_CDATA_3=i++,BEFORE_CDATA_4=i++,BEFORE_CDATA_5=i++,BEFORE_CDATA_6=i++,IN_CDATA=i++,AFTER_CDATA_1=i++,AFTER_CDATA_2=i++,BEFORE_SPECIAL=i++,BEFORE_SPECIAL_END=i++,BEFORE_SCRIPT_1=i++,BEFORE_SCRIPT_2=i++,BEFORE_SCRIPT_3=i++,BEFORE_SCRIPT_4=i++,BEFORE_SCRIPT_5=i++,AFTER_SCRIPT_1=i++,AFTER_SCRIPT_2=i++,AFTER_SCRIPT_3=i++,AFTER_SCRIPT_4=i++,AFTER_SCRIPT_5=i++,BEFORE_STYLE_1=i++,BEFORE_STYLE_2=i++,BEFORE_STYLE_3=i++,BEFORE_STYLE_4=i++,AFTER_STYLE_1=i++,AFTER_STYLE_2=i++,AFTER_STYLE_3=i++,AFTER_STYLE_4=i++,BEFORE_ENTITY=i++,BEFORE_NUMERIC_ENTITY=i++,IN_NAMED_ENTITY=i++,IN_NUMERIC_ENTITY=i++,IN_HEX_ENTITY=i++,j=0,SPECIAL_NONE=j++,SPECIAL_SCRIPT=j++,SPECIAL_STYLE=j++;function whitespace(c){return c===\" \"||c===\"\\n\"||c===\"\\t\"||c===\"\\f\"||c===\"\\r\"}function characterState(char,SUCCESS){return function(c){if(c===char)this._state=SUCCESS}}function ifElseState(upper,SUCCESS,FAILURE){var lower=upper.toLowerCase();if(upper===lower){return function(c){if(c===lower){this._state=SUCCESS}else{this._state=FAILURE;this._index--}}}else{return function(c){if(c===lower||c===upper){this._state=SUCCESS}else{this._state=FAILURE;this._index--}}}}function consumeSpecialNameChar(upper,NEXT_STATE){var lower=upper.toLowerCase();return function(c){if(c===lower||c===upper){this._state=NEXT_STATE}else{this._state=IN_TAG_NAME;this._index--}}}function Tokenizer(options,cbs){this._state=TEXT;this._buffer=\"\";this._sectionStart=0;this._index=0;this._bufferOffset=0;this._baseState=TEXT;this._special=SPECIAL_NONE;this._cbs=cbs;this._running=true;this._ended=false;this._xmlMode=!!(options&&options.xmlMode);this._decodeEntities=!!(options&&options.decodeEntities)}Tokenizer.prototype._stateText=function(c){if(c===\"<\"){if(this._index>this._sectionStart){this._cbs.ontext(this._getSection())}this._state=BEFORE_TAG_NAME;this._sectionStart=this._index}else if(this._decodeEntities&&this._special===SPECIAL_NONE&&c===\"&\"){if(this._index>this._sectionStart){this._cbs.ontext(this._getSection())}this._baseState=TEXT;this._state=BEFORE_ENTITY;this._sectionStart=this._index}};Tokenizer.prototype._stateBeforeTagName=function(c){if(c===\"/\"){this._state=BEFORE_CLOSING_TAG_NAME}else if(c===\"<\"){this._cbs.ontext(this._getSection());this._sectionStart=this._index}else if(c===\">\"||this._special!==SPECIAL_NONE||whitespace(c)){this._state=TEXT}else if(c===\"!\"){this._state=BEFORE_DECLARATION;this._sectionStart=this._index+1}else if(c===\"?\"){this._state=IN_PROCESSING_INSTRUCTION;this._sectionStart=this._index+1}else{this._state=!this._xmlMode&&(c===\"s\"||c===\"S\")?BEFORE_SPECIAL:IN_TAG_NAME;this._sectionStart=this._index}};Tokenizer.prototype._stateInTagName=function(c){if(c===\"/\"||c===\">\"||whitespace(c)){this._emitToken(\"onopentagname\");this._state=BEFORE_ATTRIBUTE_NAME;this._index--}};Tokenizer.prototype._stateBeforeCloseingTagName=function(c){if(whitespace(c));else if(c===\">\"){this._state=TEXT}else if(this._special!==SPECIAL_NONE){if(c===\"s\"||c===\"S\"){this._state=BEFORE_SPECIAL_END}else{this._state=TEXT;this._index--}}else{this._state=IN_CLOSING_TAG_NAME;this._sectionStart=this._index}};Tokenizer.prototype._stateInCloseingTagName=function(c){if(c===\">\"||whitespace(c)){this._emitToken(\"onclosetag\");this._state=AFTER_CLOSING_TAG_NAME;this._index--}};Tokenizer.prototype._stateAfterCloseingTagName=function(c){if(c===\">\"){this._state=TEXT;this._sectionStart=this._index+1}};Tokenizer.prototype._stateBeforeAttributeName=function(c){if(c===\">\"){this._cbs.onopentagend();this._state=TEXT;this._sectionStart=this._index+1}else if(c===\"/\"){this._state=IN_SELF_CLOSING_TAG}else if(!whitespace(c)){this._state=IN_ATTRIBUTE_NAME;this._sectionStart=this._index}};Tokenizer.prototype._stateInSelfClosingTag=function(c){if(c===\">\"){this._cbs.onselfclosingtag();this._state=TEXT;this._sectionStart=this._index+1}else if(!whitespace(c)){this._state=BEFORE_ATTRIBUTE_NAME;this._index--}};Tokenizer.prototype._stateInAttributeName=function(c){if(c===\"=\"||c===\"/\"||c===\">\"||whitespace(c)){this._cbs.onattribname(this._getSection());this._sectionStart=-1;this._state=AFTER_ATTRIBUTE_NAME;this._index--}};Tokenizer.prototype._stateAfterAttributeName=function(c){if(c===\"=\"){this._state=BEFORE_ATTRIBUTE_VALUE}else if(c===\"/\"||c===\">\"){this._cbs.onattribend();this._state=BEFORE_ATTRIBUTE_NAME;this._index--}else if(!whitespace(c)){this._cbs.onattribend();this._state=IN_ATTRIBUTE_NAME;this._sectionStart=this._index}};Tokenizer.prototype._stateBeforeAttributeValue=function(c){if(c==='\"'){this._state=IN_ATTRIBUTE_VALUE_DQ;this._sectionStart=this._index+1}else if(c===\"'\"){this._state=IN_ATTRIBUTE_VALUE_SQ;this._sectionStart=this._index+1}else if(!whitespace(c)){this._state=IN_ATTRIBUTE_VALUE_NQ;this._sectionStart=this._index;this._index--}};Tokenizer.prototype._stateInAttributeValueDoubleQuotes=function(c){if(c==='\"'){this._emitToken(\"onattribdata\");this._cbs.onattribend();this._state=BEFORE_ATTRIBUTE_NAME}else if(this._decodeEntities&&c===\"&\"){this._emitToken(\"onattribdata\");this._baseState=this._state;this._state=BEFORE_ENTITY;this._sectionStart=this._index}};Tokenizer.prototype._stateInAttributeValueSingleQuotes=function(c){if(c===\"'\"){this._emitToken(\"onattribdata\");this._cbs.onattribend();this._state=BEFORE_ATTRIBUTE_NAME}else if(this._decodeEntities&&c===\"&\"){this._emitToken(\"onattribdata\");this._baseState=this._state;this._state=BEFORE_ENTITY;this._sectionStart=this._index}};Tokenizer.prototype._stateInAttributeValueNoQuotes=function(c){if(whitespace(c)||c===\">\"){this._emitToken(\"onattribdata\");this._cbs.onattribend();this._state=BEFORE_ATTRIBUTE_NAME;this._index--}else if(this._decodeEntities&&c===\"&\"){this._emitToken(\"onattribdata\");this._baseState=this._state;this._state=BEFORE_ENTITY;this._sectionStart=this._index}};Tokenizer.prototype._stateBeforeDeclaration=function(c){this._state=c===\"[\"?BEFORE_CDATA_1:c===\"-\"?BEFORE_COMMENT:IN_DECLARATION};Tokenizer.prototype._stateInDeclaration=function(c){if(c===\">\"){this._cbs.ondeclaration(this._getSection());this._state=TEXT;this._sectionStart=this._index+1}};Tokenizer.prototype._stateInProcessingInstruction=function(c){if(c===\">\"){this._cbs.onprocessinginstruction(this._getSection());this._state=TEXT;this._sectionStart=this._index+1}};Tokenizer.prototype._stateBeforeComment=function(c){if(c===\"-\"){this._state=IN_COMMENT;this._sectionStart=this._index+1}else{this._state=IN_DECLARATION}};Tokenizer.prototype._stateInComment=function(c){if(c===\"-\")this._state=AFTER_COMMENT_1};Tokenizer.prototype._stateAfterComment1=function(c){if(c===\"-\"){this._state=AFTER_COMMENT_2}else{this._state=IN_COMMENT}};Tokenizer.prototype._stateAfterComment2=function(c){if(c===\">\"){this._cbs.oncomment(this._buffer.substring(this._sectionStart,this._index-2));this._state=TEXT;this._sectionStart=this._index+1}else if(c!==\"-\"){this._state=IN_COMMENT}};Tokenizer.prototype._stateBeforeCdata1=ifElseState(\"C\",BEFORE_CDATA_2,IN_DECLARATION);Tokenizer.prototype._stateBeforeCdata2=ifElseState(\"D\",BEFORE_CDATA_3,IN_DECLARATION);Tokenizer.prototype._stateBeforeCdata3=ifElseState(\"A\",BEFORE_CDATA_4,IN_DECLARATION);Tokenizer.prototype._stateBeforeCdata4=ifElseState(\"T\",BEFORE_CDATA_5,IN_DECLARATION);Tokenizer.prototype._stateBeforeCdata5=ifElseState(\"A\",BEFORE_CDATA_6,IN_DECLARATION);Tokenizer.prototype._stateBeforeCdata6=function(c){if(c===\"[\"){this._state=IN_CDATA;this._sectionStart=this._index+1}else{this._state=IN_DECLARATION;this._index--}};Tokenizer.prototype._stateInCdata=function(c){if(c===\"]\")this._state=AFTER_CDATA_1};Tokenizer.prototype._stateAfterCdata1=characterState(\"]\",AFTER_CDATA_2);Tokenizer.prototype._stateAfterCdata2=function(c){if(c===\">\"){this._cbs.oncdata(this._buffer.substring(this._sectionStart,this._index-2));this._state=TEXT;this._sectionStart=this._index+1}else if(c!==\"]\"){this._state=IN_CDATA}};Tokenizer.prototype._stateBeforeSpecial=function(c){if(c===\"c\"||c===\"C\"){this._state=BEFORE_SCRIPT_1}else if(c===\"t\"||c===\"T\"){this._state=BEFORE_STYLE_1}else{this._state=IN_TAG_NAME;this._index--}};Tokenizer.prototype._stateBeforeSpecialEnd=function(c){if(this._special===SPECIAL_SCRIPT&&(c===\"c\"||c===\"C\")){this._state=AFTER_SCRIPT_1}else if(this._special===SPECIAL_STYLE&&(c===\"t\"||c===\"T\")){this._state=AFTER_STYLE_1}else this._state=TEXT};Tokenizer.prototype._stateBeforeScript1=consumeSpecialNameChar(\"R\",BEFORE_SCRIPT_2);Tokenizer.prototype._stateBeforeScript2=consumeSpecialNameChar(\"I\",BEFORE_SCRIPT_3);Tokenizer.prototype._stateBeforeScript3=consumeSpecialNameChar(\"P\",BEFORE_SCRIPT_4);Tokenizer.prototype._stateBeforeScript4=consumeSpecialNameChar(\"T\",BEFORE_SCRIPT_5);Tokenizer.prototype._stateBeforeScript5=function(c){if(c===\"/\"||c===\">\"||whitespace(c)){this._special=SPECIAL_SCRIPT}this._state=IN_TAG_NAME;this._index--};Tokenizer.prototype._stateAfterScript1=ifElseState(\"R\",AFTER_SCRIPT_2,TEXT);Tokenizer.prototype._stateAfterScript2=ifElseState(\"I\",AFTER_SCRIPT_3,TEXT);Tokenizer.prototype._stateAfterScript3=ifElseState(\"P\",AFTER_SCRIPT_4,TEXT);Tokenizer.prototype._stateAfterScript4=ifElseState(\"T\",AFTER_SCRIPT_5,TEXT);Tokenizer.prototype._stateAfterScript5=function(c){if(c===\">\"||whitespace(c)){this._special=SPECIAL_NONE;this._state=IN_CLOSING_TAG_NAME;this._sectionStart=this._index-6;this._index--}else this._state=TEXT};Tokenizer.prototype._stateBeforeStyle1=consumeSpecialNameChar(\"Y\",BEFORE_STYLE_2);Tokenizer.prototype._stateBeforeStyle2=consumeSpecialNameChar(\"L\",BEFORE_STYLE_3);Tokenizer.prototype._stateBeforeStyle3=consumeSpecialNameChar(\"E\",BEFORE_STYLE_4);Tokenizer.prototype._stateBeforeStyle4=function(c){if(c===\"/\"||c===\">\"||whitespace(c)){this._special=SPECIAL_STYLE}this._state=IN_TAG_NAME;this._index--};Tokenizer.prototype._stateAfterStyle1=ifElseState(\"Y\",AFTER_STYLE_2,TEXT);Tokenizer.prototype._stateAfterStyle2=ifElseState(\"L\",AFTER_STYLE_3,TEXT);Tokenizer.prototype._stateAfterStyle3=ifElseState(\"E\",AFTER_STYLE_4,TEXT);Tokenizer.prototype._stateAfterStyle4=function(c){if(c===\">\"||whitespace(c)){this._special=SPECIAL_NONE;this._state=IN_CLOSING_TAG_NAME;this._sectionStart=this._index-5;this._index--}else this._state=TEXT};Tokenizer.prototype._stateBeforeEntity=ifElseState(\"#\",BEFORE_NUMERIC_ENTITY,IN_NAMED_ENTITY);Tokenizer.prototype._stateBeforeNumericEntity=ifElseState(\"X\",IN_HEX_ENTITY,IN_NUMERIC_ENTITY);Tokenizer.prototype._parseNamedEntityStrict=function(){if(this._sectionStart+1<this._index){var entity=this._buffer.substring(this._sectionStart+1,this._index),map=this._xmlMode?xmlMap:entityMap;if(map.hasOwnProperty(entity)){this._emitPartial(map[entity]);this._sectionStart=this._index+1}}};Tokenizer.prototype._parseLegacyEntity=function(){var start=this._sectionStart+1,limit=this._index-start;if(limit>6)limit=6;while(limit>=2){var entity=this._buffer.substr(start,limit);if(legacyMap.hasOwnProperty(entity)){this._emitPartial(legacyMap[entity]);this._sectionStart+=limit+1;return}else{limit--}}};Tokenizer.prototype._stateInNamedEntity=function(c){if(c===\";\"){this._parseNamedEntityStrict();if(this._sectionStart+1<this._index&&!this._xmlMode){this._parseLegacyEntity()}this._state=this._baseState}else if((c<\"a\"||c>\"z\")&&(c<\"A\"||c>\"Z\")&&(c<\"0\"||c>\"9\")){if(this._xmlMode);else if(this._sectionStart+1===this._index);else if(this._baseState!==TEXT){if(c!==\"=\"){this._parseNamedEntityStrict()}}else{this._parseLegacyEntity()}this._state=this._baseState;this._index--}};Tokenizer.prototype._decodeNumericEntity=function(offset,base){var sectionStart=this._sectionStart+offset;if(sectionStart!==this._index){var entity=this._buffer.substring(sectionStart,this._index);var parsed=parseInt(entity,base);this._emitPartial(decodeCodePoint(parsed));this._sectionStart=this._index}else{this._sectionStart--}this._state=this._baseState};Tokenizer.prototype._stateInNumericEntity=function(c){if(c===\";\"){this._decodeNumericEntity(2,10);this._sectionStart++}else if(c<\"0\"||c>\"9\"){if(!this._xmlMode){this._decodeNumericEntity(2,10)}else{this._state=this._baseState}this._index--}};Tokenizer.prototype._stateInHexEntity=function(c){if(c===\";\"){this._decodeNumericEntity(3,16);this._sectionStart++}else if((c<\"a\"||c>\"f\")&&(c<\"A\"||c>\"F\")&&(c<\"0\"||c>\"9\")){if(!this._xmlMode){this._decodeNumericEntity(3,16)}else{this._state=this._baseState}this._index--}};Tokenizer.prototype._cleanup=function(){if(this._sectionStart<0){this._buffer=\"\";this._index=0;this._bufferOffset+=this._index}else if(this._running){if(this._state===TEXT){if(this._sectionStart!==this._index){this._cbs.ontext(this._buffer.substr(this._sectionStart))}this._buffer=\"\";this._bufferOffset+=this._index;this._index=0}else if(this._sectionStart===this._index){this._buffer=\"\";this._bufferOffset+=this._index;this._index=0}else{this._buffer=this._buffer.substr(this._sectionStart);this._index-=this._sectionStart;this._bufferOffset+=this._sectionStart}this._sectionStart=0}};Tokenizer.prototype.write=function(chunk){if(this._ended)this._cbs.onerror(Error(\".write() after done!\"));this._buffer+=chunk;this._parse()};Tokenizer.prototype._parse=function(){while(this._index<this._buffer.length&&this._running){var c=this._buffer.charAt(this._index);if(this._state===TEXT){this._stateText(c)}else if(this._state===BEFORE_TAG_NAME){this._stateBeforeTagName(c)}else if(this._state===IN_TAG_NAME){this._stateInTagName(c)}else if(this._state===BEFORE_CLOSING_TAG_NAME){this._stateBeforeCloseingTagName(c)}else if(this._state===IN_CLOSING_TAG_NAME){this._stateInCloseingTagName(c)}else if(this._state===AFTER_CLOSING_TAG_NAME){this._stateAfterCloseingTagName(c)}else if(this._state===IN_SELF_CLOSING_TAG){this._stateInSelfClosingTag(c)}else if(this._state===BEFORE_ATTRIBUTE_NAME){this._stateBeforeAttributeName(c)}else if(this._state===IN_ATTRIBUTE_NAME){this._stateInAttributeName(c)}else if(this._state===AFTER_ATTRIBUTE_NAME){this._stateAfterAttributeName(c)}else if(this._state===BEFORE_ATTRIBUTE_VALUE){this._stateBeforeAttributeValue(c)}else if(this._state===IN_ATTRIBUTE_VALUE_DQ){this._stateInAttributeValueDoubleQuotes(c)}else if(this._state===IN_ATTRIBUTE_VALUE_SQ){this._stateInAttributeValueSingleQuotes(c)}else if(this._state===IN_ATTRIBUTE_VALUE_NQ){this._stateInAttributeValueNoQuotes(c)}else if(this._state===BEFORE_DECLARATION){this._stateBeforeDeclaration(c)}else if(this._state===IN_DECLARATION){this._stateInDeclaration(c)}else if(this._state===IN_PROCESSING_INSTRUCTION){this._stateInProcessingInstruction(c)}else if(this._state===BEFORE_COMMENT){this._stateBeforeComment(c)}else if(this._state===IN_COMMENT){this._stateInComment(c)}else if(this._state===AFTER_COMMENT_1){this._stateAfterComment1(c)}else if(this._state===AFTER_COMMENT_2){this._stateAfterComment2(c)}else if(this._state===BEFORE_CDATA_1){this._stateBeforeCdata1(c)}else if(this._state===BEFORE_CDATA_2){this._stateBeforeCdata2(c)}else if(this._state===BEFORE_CDATA_3){this._stateBeforeCdata3(c)}else if(this._state===BEFORE_CDATA_4){this._stateBeforeCdata4(c)}else if(this._state===BEFORE_CDATA_5){this._stateBeforeCdata5(c)}else if(this._state===BEFORE_CDATA_6){this._stateBeforeCdata6(c)}else if(this._state===IN_CDATA){this._stateInCdata(c)}else if(this._state===AFTER_CDATA_1){this._stateAfterCdata1(c)}else if(this._state===AFTER_CDATA_2){this._stateAfterCdata2(c)}else if(this._state===BEFORE_SPECIAL){this._stateBeforeSpecial(c)}else if(this._state===BEFORE_SPECIAL_END){this._stateBeforeSpecialEnd(c)}else if(this._state===BEFORE_SCRIPT_1){this._stateBeforeScript1(c)}else if(this._state===BEFORE_SCRIPT_2){this._stateBeforeScript2(c)}else if(this._state===BEFORE_SCRIPT_3){this._stateBeforeScript3(c)}else if(this._state===BEFORE_SCRIPT_4){this._stateBeforeScript4(c)}else if(this._state===BEFORE_SCRIPT_5){this._stateBeforeScript5(c)}else if(this._state===AFTER_SCRIPT_1){this._stateAfterScript1(c)}else if(this._state===AFTER_SCRIPT_2){this._stateAfterScript2(c)}else if(this._state===AFTER_SCRIPT_3){this._stateAfterScript3(c)}else if(this._state===AFTER_SCRIPT_4){this._stateAfterScript4(c)}else if(this._state===AFTER_SCRIPT_5){this._stateAfterScript5(c)}else if(this._state===BEFORE_STYLE_1){this._stateBeforeStyle1(c)}else if(this._state===BEFORE_STYLE_2){this._stateBeforeStyle2(c)}else if(this._state===BEFORE_STYLE_3){this._stateBeforeStyle3(c)}else if(this._state===BEFORE_STYLE_4){this._stateBeforeStyle4(c)}else if(this._state===AFTER_STYLE_1){this._stateAfterStyle1(c)}else if(this._state===AFTER_STYLE_2){this._stateAfterStyle2(c)}else if(this._state===AFTER_STYLE_3){this._stateAfterStyle3(c)}else if(this._state===AFTER_STYLE_4){this._stateAfterStyle4(c)}else if(this._state===BEFORE_ENTITY){this._stateBeforeEntity(c)}else if(this._state===BEFORE_NUMERIC_ENTITY){this._stateBeforeNumericEntity(c)}else if(this._state===IN_NAMED_ENTITY){this._stateInNamedEntity(c)}else if(this._state===IN_NUMERIC_ENTITY){this._stateInNumericEntity(c)}else if(this._state===IN_HEX_ENTITY){this._stateInHexEntity(c)}else{this._cbs.onerror(Error(\"unknown _state\"),this._state)}this._index++}this._cleanup()};Tokenizer.prototype.pause=function(){this._running=false};Tokenizer.prototype.resume=function(){this._running=true;if(this._index<this._buffer.length){this._parse()}if(this._ended){this._finish()}};Tokenizer.prototype.end=function(chunk){if(this._ended)this._cbs.onerror(Error(\".end() after done!\"));if(chunk)this.write(chunk);this._ended=true;if(this._running)this._finish()};Tokenizer.prototype._finish=function(){if(this._sectionStart<this._index){this._handleTrailingData()}this._cbs.onend()};Tokenizer.prototype._handleTrailingData=function(){var data=this._buffer.substr(this._sectionStart);if(this._state===IN_CDATA||this._state===AFTER_CDATA_1||this._state===AFTER_CDATA_2){this._cbs.oncdata(data)}else if(this._state===IN_COMMENT||this._state===AFTER_COMMENT_1||this._state===AFTER_COMMENT_2){this._cbs.oncomment(data)}else if(this._state===IN_NAMED_ENTITY&&!this._xmlMode){this._parseLegacyEntity();if(this._sectionStart<this._index){this._state=this._baseState;this._handleTrailingData()}}else if(this._state===IN_NUMERIC_ENTITY&&!this._xmlMode){this._decodeNumericEntity(2,10);if(this._sectionStart<this._index){this._state=this._baseState;this._handleTrailingData()}}else if(this._state===IN_HEX_ENTITY&&!this._xmlMode){this._decodeNumericEntity(3,16);if(this._sectionStart<this._index){this._state=this._baseState;this._handleTrailingData()}}else if(this._state!==IN_TAG_NAME&&this._state!==BEFORE_ATTRIBUTE_NAME&&this._state!==BEFORE_ATTRIBUTE_VALUE&&this._state!==AFTER_ATTRIBUTE_NAME&&this._state!==IN_ATTRIBUTE_NAME&&this._state!==IN_ATTRIBUTE_VALUE_SQ&&this._state!==IN_ATTRIBUTE_VALUE_DQ&&this._state!==IN_ATTRIBUTE_VALUE_NQ&&this._state!==IN_CLOSING_TAG_NAME){\nthis._cbs.ontext(data)}};Tokenizer.prototype.reset=function(){Tokenizer.call(this,{xmlMode:this._xmlMode,decodeEntities:this._decodeEntities},this._cbs)};Tokenizer.prototype.getAbsoluteIndex=function(){return this._bufferOffset+this._index};Tokenizer.prototype._getSection=function(){return this._buffer.substring(this._sectionStart,this._index)};Tokenizer.prototype._emitToken=function(name){this._cbs[name](this._getSection());this._sectionStart=-1};Tokenizer.prototype._emitPartial=function(value){if(this._baseState!==TEXT){this._cbs.onattribdata(value)}else{this._cbs.ontext(value)}}},{\"entities/lib/decode_codepoint.js\":22,\"entities/maps/entities.json\":25,\"entities/maps/legacy.json\":26,\"entities/maps/xml.json\":27}],35:[function(require,module,exports){module.exports=Stream;var Parser=require(\"./Parser.js\"),WritableStream=require(\"stream\").Writable||require(\"readable-stream\").Writable,StringDecoder=require(\"string_decoder\").StringDecoder,Buffer=require(\"buffer\").Buffer;function Stream(cbs,options){var parser=this._parser=new Parser(cbs,options);var decoder=this._decoder=new StringDecoder;WritableStream.call(this,{decodeStrings:false});this.once(\"finish\",function(){parser.end(decoder.end())})}require(\"inherits\")(Stream,WritableStream);WritableStream.prototype._write=function(chunk,encoding,cb){if(chunk instanceof Buffer)chunk=this._decoder.write(chunk);this._parser.write(chunk);cb()}},{\"./Parser.js\":31,buffer:5,inherits:38,\"readable-stream\":3,stream:55,string_decoder:56}],36:[function(require,module,exports){var Parser=require(\"./Parser.js\"),DomHandler=require(\"domhandler\");function defineProp(name,value){delete module.exports[name];module.exports[name]=value;return value}module.exports={Parser:Parser,Tokenizer:require(\"./Tokenizer.js\"),ElementType:require(\"domelementtype\"),DomHandler:DomHandler,get FeedHandler(){return defineProp(\"FeedHandler\",require(\"./FeedHandler.js\"))},get Stream(){return defineProp(\"Stream\",require(\"./Stream.js\"))},get WritableStream(){return defineProp(\"WritableStream\",require(\"./WritableStream.js\"))},get ProxyHandler(){return defineProp(\"ProxyHandler\",require(\"./ProxyHandler.js\"))},get DomUtils(){return defineProp(\"DomUtils\",require(\"domutils\"))},get CollectingHandler(){return defineProp(\"CollectingHandler\",require(\"./CollectingHandler.js\"))},DefaultHandler:DomHandler,get RssHandler(){return defineProp(\"RssHandler\",this.FeedHandler)},parseDOM:function(data,options){var handler=new DomHandler(options);new Parser(handler,options).end(data);return handler.dom},parseFeed:function(feed,options){var handler=new module.exports.FeedHandler(options);new Parser(handler,options).end(feed);return handler.dom},createDomStream:function(cb,options,elementCb){var handler=new DomHandler(cb,options,elementCb);return new Parser(handler,options)},EVENTS:{attribute:2,cdatastart:0,cdataend:0,text:1,processinginstruction:2,comment:1,commentend:0,closetag:1,opentag:2,opentagname:1,error:1,end:0}}},{\"./CollectingHandler.js\":29,\"./FeedHandler.js\":30,\"./Parser.js\":31,\"./ProxyHandler.js\":32,\"./Stream.js\":33,\"./Tokenizer.js\":34,\"./WritableStream.js\":35,domelementtype:9,domhandler:10,domutils:13}],37:[function(require,module,exports){exports.read=function(buffer,offset,isLE,mLen,nBytes){var e,m;var eLen=nBytes*8-mLen-1;var eMax=(1<<eLen)-1;var eBias=eMax>>1;var nBits=-7;var i=isLE?nBytes-1:0;var d=isLE?-1:1;var s=buffer[offset+i];i+=d;e=s&(1<<-nBits)-1;s>>=-nBits;nBits+=eLen;for(;nBits>0;e=e*256+buffer[offset+i],i+=d,nBits-=8){}m=e&(1<<-nBits)-1;e>>=-nBits;nBits+=mLen;for(;nBits>0;m=m*256+buffer[offset+i],i+=d,nBits-=8){}if(e===0){e=1-eBias}else if(e===eMax){return m?NaN:(s?-1:1)*Infinity}else{m=m+Math.pow(2,mLen);e=e-eBias}return(s?-1:1)*m*Math.pow(2,e-mLen)};exports.write=function(buffer,value,offset,isLE,mLen,nBytes){var e,m,c;var eLen=nBytes*8-mLen-1;var eMax=(1<<eLen)-1;var eBias=eMax>>1;var rt=mLen===23?Math.pow(2,-24)-Math.pow(2,-77):0;var i=isLE?0:nBytes-1;var d=isLE?1:-1;var s=value<0||value===0&&1/value<0?1:0;value=Math.abs(value);if(isNaN(value)||value===Infinity){m=isNaN(value)?1:0;e=eMax}else{e=Math.floor(Math.log(value)/Math.LN2);if(value*(c=Math.pow(2,-e))<1){e--;c*=2}if(e+eBias>=1){value+=rt/c}else{value+=rt*Math.pow(2,1-eBias)}if(value*c>=2){e++;c/=2}if(e+eBias>=eMax){m=0;e=eMax}else if(e+eBias>=1){m=(value*c-1)*Math.pow(2,mLen);e=e+eBias}else{m=value*Math.pow(2,eBias-1)*Math.pow(2,mLen);e=0}}for(;mLen>=8;buffer[offset+i]=m&255,i+=d,m/=256,mLen-=8){}e=e<<mLen|m;eLen+=mLen;for(;eLen>0;buffer[offset+i]=e&255,i+=d,e/=256,eLen-=8){}buffer[offset+i-d]|=s*128}},{}],38:[function(require,module,exports){if(typeof Object.create===\"function\"){module.exports=function inherits(ctor,superCtor){ctor.super_=superCtor;ctor.prototype=Object.create(superCtor.prototype,{constructor:{value:ctor,enumerable:false,writable:true,configurable:true}})}}else{module.exports=function inherits(ctor,superCtor){ctor.super_=superCtor;var TempCtor=function(){};TempCtor.prototype=superCtor.prototype;ctor.prototype=new TempCtor;ctor.prototype.constructor=ctor}}},{}],39:[function(require,module,exports){module.exports=function(obj){return obj!=null&&(isBuffer(obj)||isSlowBuffer(obj)||!!obj._isBuffer)};function isBuffer(obj){return!!obj.constructor&&typeof obj.constructor.isBuffer===\"function\"&&obj.constructor.isBuffer(obj)}function isSlowBuffer(obj){return typeof obj.readFloatLE===\"function\"&&typeof obj.slice===\"function\"&&isBuffer(obj.slice(0,0))}},{}],40:[function(require,module,exports){var toString={}.toString;module.exports=Array.isArray||function(arr){return toString.call(arr)==\"[object Array]\"}},{}],41:[function(require,module,exports){(function(process){\"use strict\";if(!process.version||process.version.indexOf(\"v0.\")===0||process.version.indexOf(\"v1.\")===0&&process.version.indexOf(\"v1.8.\")!==0){module.exports=nextTick}else{module.exports=process.nextTick}function nextTick(fn,arg1,arg2,arg3){if(typeof fn!==\"function\"){throw new TypeError('\"callback\" argument must be a function')}var len=arguments.length;var args,i;switch(len){case 0:case 1:return process.nextTick(fn);case 2:return process.nextTick(function afterTickOne(){fn.call(null,arg1)});case 3:return process.nextTick(function afterTickTwo(){fn.call(null,arg1,arg2)});case 4:return process.nextTick(function afterTickThree(){fn.call(null,arg1,arg2,arg3)});default:args=new Array(len-1);i=0;while(i<args.length){args[i++]=arguments[i]}return process.nextTick(function afterTick(){fn.apply(null,args)})}}}).call(this,require(\"_process\"))},{_process:42}],42:[function(require,module,exports){var process=module.exports={};var cachedSetTimeout;var cachedClearTimeout;function defaultSetTimout(){throw new Error(\"setTimeout has not been defined\")}function defaultClearTimeout(){throw new Error(\"clearTimeout has not been defined\")}(function(){try{if(typeof setTimeout===\"function\"){cachedSetTimeout=setTimeout}else{cachedSetTimeout=defaultSetTimout}}catch(e){cachedSetTimeout=defaultSetTimout}try{if(typeof clearTimeout===\"function\"){cachedClearTimeout=clearTimeout}else{cachedClearTimeout=defaultClearTimeout}}catch(e){cachedClearTimeout=defaultClearTimeout}})();function runTimeout(fun){if(cachedSetTimeout===setTimeout){return setTimeout(fun,0)}if((cachedSetTimeout===defaultSetTimout||!cachedSetTimeout)&&setTimeout){cachedSetTimeout=setTimeout;return setTimeout(fun,0)}try{return cachedSetTimeout(fun,0)}catch(e){try{return cachedSetTimeout.call(null,fun,0)}catch(e){return cachedSetTimeout.call(this,fun,0)}}}function runClearTimeout(marker){if(cachedClearTimeout===clearTimeout){return clearTimeout(marker)}if((cachedClearTimeout===defaultClearTimeout||!cachedClearTimeout)&&clearTimeout){cachedClearTimeout=clearTimeout;return clearTimeout(marker)}try{return cachedClearTimeout(marker)}catch(e){try{return cachedClearTimeout.call(null,marker)}catch(e){return cachedClearTimeout.call(this,marker)}}}var queue=[];var draining=false;var currentQueue;var queueIndex=-1;function cleanUpNextTick(){if(!draining||!currentQueue){return}draining=false;if(currentQueue.length){queue=currentQueue.concat(queue)}else{queueIndex=-1}if(queue.length){drainQueue()}}function drainQueue(){if(draining){return}var timeout=runTimeout(cleanUpNextTick);draining=true;var len=queue.length;while(len){currentQueue=queue;queue=[];while(++queueIndex<len){if(currentQueue){currentQueue[queueIndex].run()}}queueIndex=-1;len=queue.length}currentQueue=null;draining=false;runClearTimeout(timeout)}process.nextTick=function(fun){var args=new Array(arguments.length-1);if(arguments.length>1){for(var i=1;i<arguments.length;i++){args[i-1]=arguments[i]}}queue.push(new Item(fun,args));if(queue.length===1&&!draining){runTimeout(drainQueue)}};function Item(fun,array){this.fun=fun;this.array=array}Item.prototype.run=function(){this.fun.apply(null,this.array)};process.title=\"browser\";process.browser=true;process.env={};process.argv=[];process.version=\"\";process.versions={};function noop(){}process.on=noop;process.addListener=noop;process.once=noop;process.off=noop;process.removeListener=noop;process.removeAllListeners=noop;process.emit=noop;process.binding=function(name){throw new Error(\"process.binding is not supported\")};process.cwd=function(){return\"/\"};process.chdir=function(dir){throw new Error(\"process.chdir is not supported\")};process.umask=function(){return 0}},{}],43:[function(require,module,exports){module.exports=require(\"./lib/_stream_duplex.js\")},{\"./lib/_stream_duplex.js\":44}],44:[function(require,module,exports){\"use strict\";var objectKeys=Object.keys||function(obj){var keys=[];for(var key in obj){keys.push(key)}return keys};module.exports=Duplex;var processNextTick=require(\"process-nextick-args\");var util=require(\"core-util-is\");util.inherits=require(\"inherits\");var Readable=require(\"./_stream_readable\");var Writable=require(\"./_stream_writable\");util.inherits(Duplex,Readable);var keys=objectKeys(Writable.prototype);for(var v=0;v<keys.length;v++){var method=keys[v];if(!Duplex.prototype[method])Duplex.prototype[method]=Writable.prototype[method]}function Duplex(options){if(!(this instanceof Duplex))return new Duplex(options);Readable.call(this,options);Writable.call(this,options);if(options&&options.readable===false)this.readable=false;if(options&&options.writable===false)this.writable=false;this.allowHalfOpen=true;if(options&&options.allowHalfOpen===false)this.allowHalfOpen=false;this.once(\"end\",onend)}function onend(){if(this.allowHalfOpen||this._writableState.ended)return;processNextTick(onEndNT,this)}function onEndNT(self){self.end()}function forEach(xs,f){for(var i=0,l=xs.length;i<l;i++){f(xs[i],i)}}},{\"./_stream_readable\":46,\"./_stream_writable\":48,\"core-util-is\":6,inherits:38,\"process-nextick-args\":41}],45:[function(require,module,exports){\"use strict\";module.exports=PassThrough;var Transform=require(\"./_stream_transform\");var util=require(\"core-util-is\");util.inherits=require(\"inherits\");util.inherits(PassThrough,Transform);function PassThrough(options){if(!(this instanceof PassThrough))return new PassThrough(options);Transform.call(this,options)}PassThrough.prototype._transform=function(chunk,encoding,cb){cb(null,chunk)}},{\"./_stream_transform\":47,\"core-util-is\":6,inherits:38}],46:[function(require,module,exports){(function(process){\"use strict\";module.exports=Readable;var processNextTick=require(\"process-nextick-args\");var isArray=require(\"isarray\");Readable.ReadableState=ReadableState;var EE=require(\"events\").EventEmitter;var EElistenerCount=function(emitter,type){return emitter.listeners(type).length};var Stream;(function(){try{Stream=require(\"st\"+\"ream\")}catch(_){}finally{if(!Stream)Stream=require(\"events\").EventEmitter}})();var Buffer=require(\"buffer\").Buffer;var bufferShim=require(\"buffer-shims\");var util=require(\"core-util-is\");util.inherits=require(\"inherits\");var debugUtil=require(\"util\");var debug=void 0;if(debugUtil&&debugUtil.debuglog){debug=debugUtil.debuglog(\"stream\")}else{debug=function(){}}var BufferList=require(\"./internal/streams/BufferList\");var StringDecoder;util.inherits(Readable,Stream);function prependListener(emitter,event,fn){if(typeof emitter.prependListener===\"function\"){return emitter.prependListener(event,fn)}else{if(!emitter._events||!emitter._events[event])emitter.on(event,fn);else if(isArray(emitter._events[event]))emitter._events[event].unshift(fn);else emitter._events[event]=[fn,emitter._events[event]]}}var Duplex;function ReadableState(options,stream){Duplex=Duplex||require(\"./_stream_duplex\");options=options||{};this.objectMode=!!options.objectMode;if(stream instanceof Duplex)this.objectMode=this.objectMode||!!options.readableObjectMode;var hwm=options.highWaterMark;var defaultHwm=this.objectMode?16:16*1024;this.highWaterMark=hwm||hwm===0?hwm:defaultHwm;this.highWaterMark=~~this.highWaterMark;this.buffer=new BufferList;this.length=0;this.pipes=null;this.pipesCount=0;this.flowing=null;this.ended=false;this.endEmitted=false;this.reading=false;this.sync=true;this.needReadable=false;this.emittedReadable=false;this.readableListening=false;this.resumeScheduled=false;this.defaultEncoding=options.defaultEncoding||\"utf8\";this.ranOut=false;this.awaitDrain=0;this.readingMore=false;this.decoder=null;this.encoding=null;if(options.encoding){if(!StringDecoder)StringDecoder=require(\"string_decoder/\").StringDecoder;this.decoder=new StringDecoder(options.encoding);this.encoding=options.encoding}}var Duplex;function Readable(options){Duplex=Duplex||require(\"./_stream_duplex\");if(!(this instanceof Readable))return new Readable(options);this._readableState=new ReadableState(options,this);this.readable=true;if(options&&typeof options.read===\"function\")this._read=options.read;Stream.call(this)}Readable.prototype.push=function(chunk,encoding){var state=this._readableState;if(!state.objectMode&&typeof chunk===\"string\"){encoding=encoding||state.defaultEncoding;if(encoding!==state.encoding){chunk=bufferShim.from(chunk,encoding);encoding=\"\"}}return readableAddChunk(this,state,chunk,encoding,false)};Readable.prototype.unshift=function(chunk){var state=this._readableState;return readableAddChunk(this,state,chunk,\"\",true)};Readable.prototype.isPaused=function(){return this._readableState.flowing===false};function readableAddChunk(stream,state,chunk,encoding,addToFront){var er=chunkInvalid(state,chunk);if(er){stream.emit(\"error\",er)}else if(chunk===null){state.reading=false;onEofChunk(stream,state)}else if(state.objectMode||chunk&&chunk.length>0){if(state.ended&&!addToFront){var e=new Error(\"stream.push() after EOF\");stream.emit(\"error\",e)}else if(state.endEmitted&&addToFront){var _e=new Error(\"stream.unshift() after end event\");stream.emit(\"error\",_e)}else{var skipAdd;if(state.decoder&&!addToFront&&!encoding){chunk=state.decoder.write(chunk);skipAdd=!state.objectMode&&chunk.length===0}if(!addToFront)state.reading=false;if(!skipAdd){if(state.flowing&&state.length===0&&!state.sync){stream.emit(\"data\",chunk);stream.read(0)}else{state.length+=state.objectMode?1:chunk.length;if(addToFront)state.buffer.unshift(chunk);else state.buffer.push(chunk);if(state.needReadable)emitReadable(stream)}}maybeReadMore(stream,state)}}else if(!addToFront){state.reading=false}return needMoreData(state)}function needMoreData(state){return!state.ended&&(state.needReadable||state.length<state.highWaterMark||state.length===0)}Readable.prototype.setEncoding=function(enc){if(!StringDecoder)StringDecoder=require(\"string_decoder/\").StringDecoder;this._readableState.decoder=new StringDecoder(enc);this._readableState.encoding=enc;return this};var MAX_HWM=8388608;function computeNewHighWaterMark(n){if(n>=MAX_HWM){n=MAX_HWM}else{n--;n|=n>>>1;n|=n>>>2;n|=n>>>4;n|=n>>>8;n|=n>>>16;n++}return n}function howMuchToRead(n,state){if(n<=0||state.length===0&&state.ended)return 0;if(state.objectMode)return 1;if(n!==n){if(state.flowing&&state.length)return state.buffer.head.data.length;else return state.length}if(n>state.highWaterMark)state.highWaterMark=computeNewHighWaterMark(n);if(n<=state.length)return n;if(!state.ended){state.needReadable=true;return 0}return state.length}Readable.prototype.read=function(n){debug(\"read\",n);n=parseInt(n,10);var state=this._readableState;var nOrig=n;if(n!==0)state.emittedReadable=false;if(n===0&&state.needReadable&&(state.length>=state.highWaterMark||state.ended)){debug(\"read: emitReadable\",state.length,state.ended);if(state.length===0&&state.ended)endReadable(this);else emitReadable(this);return null}n=howMuchToRead(n,state);if(n===0&&state.ended){if(state.length===0)endReadable(this);return null}var doRead=state.needReadable;debug(\"need readable\",doRead);if(state.length===0||state.length-n<state.highWaterMark){doRead=true;debug(\"length less than watermark\",doRead)}if(state.ended||state.reading){doRead=false;debug(\"reading or ended\",doRead)}else if(doRead){debug(\"do read\");state.reading=true;state.sync=true;if(state.length===0)state.needReadable=true;this._read(state.highWaterMark);state.sync=false;if(!state.reading)n=howMuchToRead(nOrig,state)}var ret;if(n>0)ret=fromList(n,state);else ret=null;if(ret===null){state.needReadable=true;n=0}else{state.length-=n}if(state.length===0){if(!state.ended)state.needReadable=true;if(nOrig!==n&&state.ended)endReadable(this)}if(ret!==null)this.emit(\"data\",ret);return ret};function chunkInvalid(state,chunk){var er=null;if(!Buffer.isBuffer(chunk)&&typeof chunk!==\"string\"&&chunk!==null&&chunk!==undefined&&!state.objectMode){er=new TypeError(\"Invalid non-string/buffer chunk\")}return er}function onEofChunk(stream,state){if(state.ended)return;if(state.decoder){var chunk=state.decoder.end();if(chunk&&chunk.length){state.buffer.push(chunk);state.length+=state.objectMode?1:chunk.length}}state.ended=true;emitReadable(stream)}function emitReadable(stream){var state=stream._readableState;state.needReadable=false;if(!state.emittedReadable){debug(\"emitReadable\",state.flowing);state.emittedReadable=true;if(state.sync)processNextTick(emitReadable_,stream);else emitReadable_(stream)}}function emitReadable_(stream){debug(\"emit readable\");stream.emit(\"readable\");flow(stream)}function maybeReadMore(stream,state){if(!state.readingMore){state.readingMore=true;processNextTick(maybeReadMore_,stream,state)}}function maybeReadMore_(stream,state){var len=state.length;while(!state.reading&&!state.flowing&&!state.ended&&state.length<state.highWaterMark){debug(\"maybeReadMore read 0\");stream.read(0);if(len===state.length)break;else len=state.length}state.readingMore=false}Readable.prototype._read=function(n){this.emit(\"error\",new Error(\"not implemented\"))};Readable.prototype.pipe=function(dest,pipeOpts){var src=this;var state=this._readableState;switch(state.pipesCount){case 0:state.pipes=dest;break;case 1:state.pipes=[state.pipes,dest];break;default:state.pipes.push(dest);break}state.pipesCount+=1;debug(\"pipe count=%d opts=%j\",state.pipesCount,pipeOpts);var doEnd=(!pipeOpts||pipeOpts.end!==false)&&dest!==process.stdout&&dest!==process.stderr;var endFn=doEnd?onend:cleanup;if(state.endEmitted)processNextTick(endFn);else src.once(\"end\",endFn);dest.on(\"unpipe\",onunpipe);function onunpipe(readable){debug(\"onunpipe\");if(readable===src){cleanup()}}function onend(){debug(\"onend\");dest.end()}var ondrain=pipeOnDrain(src);dest.on(\"drain\",ondrain);var cleanedUp=false;function cleanup(){debug(\"cleanup\");dest.removeListener(\"close\",onclose);dest.removeListener(\"finish\",onfinish);dest.removeListener(\"drain\",ondrain);dest.removeListener(\"error\",onerror);dest.removeListener(\"unpipe\",onunpipe);src.removeListener(\"end\",onend);src.removeListener(\"end\",cleanup);src.removeListener(\"data\",ondata);cleanedUp=true;if(state.awaitDrain&&(!dest._writableState||dest._writableState.needDrain))ondrain()}var increasedAwaitDrain=false;src.on(\"data\",ondata);function ondata(chunk){debug(\"ondata\");increasedAwaitDrain=false;var ret=dest.write(chunk);if(false===ret&&!increasedAwaitDrain){if((state.pipesCount===1&&state.pipes===dest||state.pipesCount>1&&indexOf(state.pipes,dest)!==-1)&&!cleanedUp){debug(\"false write response, pause\",src._readableState.awaitDrain);src._readableState.awaitDrain++;increasedAwaitDrain=true}src.pause()}}function onerror(er){debug(\"onerror\",er);unpipe();dest.removeListener(\"error\",onerror);if(EElistenerCount(dest,\"error\")===0)dest.emit(\"error\",er)}prependListener(dest,\"error\",onerror);function onclose(){dest.removeListener(\"finish\",onfinish);unpipe()}dest.once(\"close\",onclose);function onfinish(){debug(\"onfinish\");dest.removeListener(\"close\",onclose);unpipe()}dest.once(\"finish\",onfinish);function unpipe(){debug(\"unpipe\");src.unpipe(dest)}dest.emit(\"pipe\",src);if(!state.flowing){debug(\"pipe resume\");src.resume()}return dest};function pipeOnDrain(src){return function(){var state=src._readableState;debug(\"pipeOnDrain\",state.awaitDrain);if(state.awaitDrain)state.awaitDrain--;if(state.awaitDrain===0&&EElistenerCount(src,\"data\")){state.flowing=true;flow(src)}}}Readable.prototype.unpipe=function(dest){var state=this._readableState;if(state.pipesCount===0)return this;if(state.pipesCount===1){if(dest&&dest!==state.pipes)return this;if(!dest)dest=state.pipes;state.pipes=null;state.pipesCount=0;state.flowing=false;if(dest)dest.emit(\"unpipe\",this);return this}if(!dest){var dests=state.pipes;var len=state.pipesCount;state.pipes=null;state.pipesCount=0;state.flowing=false;for(var _i=0;_i<len;_i++){dests[_i].emit(\"unpipe\",this)}return this}var i=indexOf(state.pipes,dest);if(i===-1)return this;state.pipes.splice(i,1);state.pipesCount-=1;if(state.pipesCount===1)state.pipes=state.pipes[0];dest.emit(\"unpipe\",this);return this};Readable.prototype.on=function(ev,fn){var res=Stream.prototype.on.call(this,ev,fn);if(ev===\"data\"){if(this._readableState.flowing!==false)this.resume()}else if(ev===\"readable\"){var state=this._readableState;if(!state.endEmitted&&!state.readableListening){state.readableListening=state.needReadable=true;state.emittedReadable=false;if(!state.reading){processNextTick(nReadingNextTick,this)}else if(state.length){emitReadable(this,state)}}}return res};Readable.prototype.addListener=Readable.prototype.on;function nReadingNextTick(self){debug(\"readable nexttick read 0\");self.read(0)}Readable.prototype.resume=function(){var state=this._readableState;if(!state.flowing){debug(\"resume\");state.flowing=true;resume(this,state)}return this};function resume(stream,state){if(!state.resumeScheduled){state.resumeScheduled=true;processNextTick(resume_,stream,state)}}function resume_(stream,state){if(!state.reading){debug(\"resume read 0\");stream.read(0)}state.resumeScheduled=false;state.awaitDrain=0;stream.emit(\"resume\");flow(stream);if(state.flowing&&!state.reading)stream.read(0)}Readable.prototype.pause=function(){debug(\"call pause flowing=%j\",this._readableState.flowing);if(false!==this._readableState.flowing){debug(\"pause\");this._readableState.flowing=false;this.emit(\"pause\")}return this};function flow(stream){var state=stream._readableState;debug(\"flow\",state.flowing);while(state.flowing&&stream.read()!==null){}}Readable.prototype.wrap=function(stream){var state=this._readableState;var paused=false;var self=this;stream.on(\"end\",function(){debug(\"wrapped end\");if(state.decoder&&!state.ended){var chunk=state.decoder.end();if(chunk&&chunk.length)self.push(chunk)}self.push(null)});stream.on(\"data\",function(chunk){debug(\"wrapped data\");if(state.decoder)chunk=state.decoder.write(chunk);if(state.objectMode&&(chunk===null||chunk===undefined))return;else if(!state.objectMode&&(!chunk||!chunk.length))return;var ret=self.push(chunk);if(!ret){paused=true;stream.pause()}});for(var i in stream){if(this[i]===undefined&&typeof stream[i]===\"function\"){this[i]=function(method){return function(){return stream[method].apply(stream,arguments)}}(i)}}var events=[\"error\",\"close\",\"destroy\",\"pause\",\"resume\"];forEach(events,function(ev){stream.on(ev,self.emit.bind(self,ev))});self._read=function(n){debug(\"wrapped _read\",n);if(paused){paused=false;stream.resume()}};return self};Readable._fromList=fromList;function fromList(n,state){if(state.length===0)return null;var ret;if(state.objectMode)ret=state.buffer.shift();else if(!n||n>=state.length){if(state.decoder)ret=state.buffer.join(\"\");else if(state.buffer.length===1)ret=state.buffer.head.data;else ret=state.buffer.concat(state.length);state.buffer.clear()}else{ret=fromListPartial(n,state.buffer,state.decoder)}return ret}function fromListPartial(n,list,hasStrings){var ret;if(n<list.head.data.length){ret=list.head.data.slice(0,n);list.head.data=list.head.data.slice(n)}else if(n===list.head.data.length){ret=list.shift()}else{ret=hasStrings?copyFromBufferString(n,list):copyFromBuffer(n,list)}return ret}function copyFromBufferString(n,list){var p=list.head;var c=1;var ret=p.data;n-=ret.length;while(p=p.next){var str=p.data;var nb=n>str.length?str.length:n;if(nb===str.length)ret+=str;else ret+=str.slice(0,n);n-=nb;if(n===0){if(nb===str.length){++c;if(p.next)list.head=p.next;else list.head=list.tail=null}else{list.head=p;p.data=str.slice(nb)}break}++c}list.length-=c;return ret}function copyFromBuffer(n,list){var ret=bufferShim.allocUnsafe(n);var p=list.head;var c=1;p.data.copy(ret);n-=p.data.length;while(p=p.next){var buf=p.data;var nb=n>buf.length?buf.length:n;buf.copy(ret,ret.length-n,0,nb);n-=nb;if(n===0){if(nb===buf.length){++c;if(p.next)list.head=p.next;else list.head=list.tail=null}else{list.head=p;p.data=buf.slice(nb)}break}++c}list.length-=c;return ret}function endReadable(stream){var state=stream._readableState;if(state.length>0)throw new Error('\"endReadable()\" called on non-empty stream');if(!state.endEmitted){state.ended=true;processNextTick(endReadableNT,state,stream)}}function endReadableNT(state,stream){if(!state.endEmitted&&state.length===0){state.endEmitted=true;stream.readable=false;stream.emit(\"end\")}}function forEach(xs,f){for(var i=0,l=xs.length;i<l;i++){f(xs[i],i)}}function indexOf(xs,x){for(var i=0,l=xs.length;i<l;i++){if(xs[i]===x)return i}return-1}}).call(this,require(\"_process\"))},{\"./_stream_duplex\":44,\"./internal/streams/BufferList\":49,_process:42,buffer:5,\"buffer-shims\":4,\"core-util-is\":6,events:28,inherits:38,isarray:40,\"process-nextick-args\":41,\"string_decoder/\":56,util:3}],47:[function(require,module,exports){\"use strict\";module.exports=Transform;var Duplex=require(\"./_stream_duplex\");var util=require(\"core-util-is\");util.inherits=require(\"inherits\");util.inherits(Transform,Duplex);function TransformState(stream){this.afterTransform=function(er,data){return afterTransform(stream,er,data)};this.needTransform=false;this.transforming=false;this.writecb=null;this.writechunk=null;this.writeencoding=null}function afterTransform(stream,er,data){var ts=stream._transformState;ts.transforming=false;var cb=ts.writecb;if(!cb)return stream.emit(\"error\",new Error(\"no writecb in Transform class\"));ts.writechunk=null;ts.writecb=null;if(data!==null&&data!==undefined)stream.push(data);cb(er);var rs=stream._readableState;rs.reading=false;if(rs.needReadable||rs.length<rs.highWaterMark){stream._read(rs.highWaterMark)}}function Transform(options){if(!(this instanceof Transform))return new Transform(options);Duplex.call(this,options);this._transformState=new TransformState(this);var stream=this;this._readableState.needReadable=true;this._readableState.sync=false;if(options){if(typeof options.transform===\"function\")this._transform=options.transform;if(typeof options.flush===\"function\")this._flush=options.flush}this.once(\"prefinish\",function(){if(typeof this._flush===\"function\")this._flush(function(er){done(stream,er)});else done(stream)})}Transform.prototype.push=function(chunk,encoding){this._transformState.needTransform=false;return Duplex.prototype.push.call(this,chunk,encoding)};Transform.prototype._transform=function(chunk,encoding,cb){throw new Error(\"Not implemented\")};Transform.prototype._write=function(chunk,encoding,cb){var ts=this._transformState;ts.writecb=cb;ts.writechunk=chunk;ts.writeencoding=encoding;if(!ts.transforming){var rs=this._readableState;if(ts.needTransform||rs.needReadable||rs.length<rs.highWaterMark)this._read(rs.highWaterMark)}};Transform.prototype._read=function(n){var ts=this._transformState;if(ts.writechunk!==null&&ts.writecb&&!ts.transforming){ts.transforming=true;this._transform(ts.writechunk,ts.writeencoding,ts.afterTransform)}else{ts.needTransform=true}};function done(stream,er){if(er)return stream.emit(\"error\",er);var ws=stream._writableState;var ts=stream._transformState;if(ws.length)throw new Error(\"Calling transform done when ws.length != 0\");if(ts.transforming)throw new Error(\"Calling transform done when still transforming\");return stream.push(null)}},{\"./_stream_duplex\":44,\"core-util-is\":6,inherits:38}],48:[function(require,module,exports){(function(process){\"use strict\";module.exports=Writable;var processNextTick=require(\"process-nextick-args\");var asyncWrite=!process.browser&&[\"v0.10\",\"v0.9.\"].indexOf(process.version.slice(0,5))>-1?setImmediate:processNextTick;Writable.WritableState=WritableState;var util=require(\"core-util-is\");util.inherits=require(\"inherits\");var internalUtil={deprecate:require(\"util-deprecate\")};var Stream;(function(){try{Stream=require(\"st\"+\"ream\")}catch(_){}finally{if(!Stream)Stream=require(\"events\").EventEmitter}})();var Buffer=require(\"buffer\").Buffer;var bufferShim=require(\"buffer-shims\");util.inherits(Writable,Stream);function nop(){}function WriteReq(chunk,encoding,cb){this.chunk=chunk;this.encoding=encoding;this.callback=cb;this.next=null}var Duplex;function WritableState(options,stream){Duplex=Duplex||require(\"./_stream_duplex\");options=options||{};this.objectMode=!!options.objectMode;if(stream instanceof Duplex)this.objectMode=this.objectMode||!!options.writableObjectMode;var hwm=options.highWaterMark;var defaultHwm=this.objectMode?16:16*1024;this.highWaterMark=hwm||hwm===0?hwm:defaultHwm;this.highWaterMark=~~this.highWaterMark;this.needDrain=false;this.ending=false;this.ended=false;this.finished=false;var noDecode=options.decodeStrings===false;this.decodeStrings=!noDecode;this.defaultEncoding=options.defaultEncoding||\"utf8\";this.length=0;this.writing=false;this.corked=0;this.sync=true;this.bufferProcessing=false;this.onwrite=function(er){onwrite(stream,er)};this.writecb=null;this.writelen=0;this.bufferedRequest=null;this.lastBufferedRequest=null;this.pendingcb=0;this.prefinished=false;this.errorEmitted=false;this.bufferedRequestCount=0;this.corkedRequestsFree=new CorkedRequest(this)}WritableState.prototype.getBuffer=function writableStateGetBuffer(){var current=this.bufferedRequest;var out=[];while(current){out.push(current);current=current.next}return out};(function(){try{Object.defineProperty(WritableState.prototype,\"buffer\",{get:internalUtil.deprecate(function(){return this.getBuffer()},\"_writableState.buffer is deprecated. Use _writableState.getBuffer \"+\"instead.\")})}catch(_){}})();var Duplex;function Writable(options){Duplex=Duplex||require(\"./_stream_duplex\");if(!(this instanceof Writable)&&!(this instanceof Duplex))return new Writable(options);this._writableState=new WritableState(options,this);this.writable=true;if(options){if(typeof options.write===\"function\")this._write=options.write;if(typeof options.writev===\"function\")this._writev=options.writev}Stream.call(this)}Writable.prototype.pipe=function(){this.emit(\"error\",new Error(\"Cannot pipe, not readable\"))};function writeAfterEnd(stream,cb){var er=new Error(\"write after end\");stream.emit(\"error\",er);processNextTick(cb,er)}function validChunk(stream,state,chunk,cb){var valid=true;var er=false;if(chunk===null){er=new TypeError(\"May not write null values to stream\")}else if(!Buffer.isBuffer(chunk)&&typeof chunk!==\"string\"&&chunk!==undefined&&!state.objectMode){er=new TypeError(\"Invalid non-string/buffer chunk\")}if(er){stream.emit(\"error\",er);processNextTick(cb,er);valid=false}return valid}Writable.prototype.write=function(chunk,encoding,cb){var state=this._writableState;var ret=false;if(typeof encoding===\"function\"){cb=encoding;encoding=null}if(Buffer.isBuffer(chunk))encoding=\"buffer\";else if(!encoding)encoding=state.defaultEncoding;if(typeof cb!==\"function\")cb=nop;if(state.ended)writeAfterEnd(this,cb);else if(validChunk(this,state,chunk,cb)){\nstate.pendingcb++;ret=writeOrBuffer(this,state,chunk,encoding,cb)}return ret};Writable.prototype.cork=function(){var state=this._writableState;state.corked++};Writable.prototype.uncork=function(){var state=this._writableState;if(state.corked){state.corked--;if(!state.writing&&!state.corked&&!state.finished&&!state.bufferProcessing&&state.bufferedRequest)clearBuffer(this,state)}};Writable.prototype.setDefaultEncoding=function setDefaultEncoding(encoding){if(typeof encoding===\"string\")encoding=encoding.toLowerCase();if(!([\"hex\",\"utf8\",\"utf-8\",\"ascii\",\"binary\",\"base64\",\"ucs2\",\"ucs-2\",\"utf16le\",\"utf-16le\",\"raw\"].indexOf((encoding+\"\").toLowerCase())>-1))throw new TypeError(\"Unknown encoding: \"+encoding);this._writableState.defaultEncoding=encoding;return this};function decodeChunk(state,chunk,encoding){if(!state.objectMode&&state.decodeStrings!==false&&typeof chunk===\"string\"){chunk=bufferShim.from(chunk,encoding)}return chunk}function writeOrBuffer(stream,state,chunk,encoding,cb){chunk=decodeChunk(state,chunk,encoding);if(Buffer.isBuffer(chunk))encoding=\"buffer\";var len=state.objectMode?1:chunk.length;state.length+=len;var ret=state.length<state.highWaterMark;if(!ret)state.needDrain=true;if(state.writing||state.corked){var last=state.lastBufferedRequest;state.lastBufferedRequest=new WriteReq(chunk,encoding,cb);if(last){last.next=state.lastBufferedRequest}else{state.bufferedRequest=state.lastBufferedRequest}state.bufferedRequestCount+=1}else{doWrite(stream,state,false,len,chunk,encoding,cb)}return ret}function doWrite(stream,state,writev,len,chunk,encoding,cb){state.writelen=len;state.writecb=cb;state.writing=true;state.sync=true;if(writev)stream._writev(chunk,state.onwrite);else stream._write(chunk,encoding,state.onwrite);state.sync=false}function onwriteError(stream,state,sync,er,cb){--state.pendingcb;if(sync)processNextTick(cb,er);else cb(er);stream._writableState.errorEmitted=true;stream.emit(\"error\",er)}function onwriteStateUpdate(state){state.writing=false;state.writecb=null;state.length-=state.writelen;state.writelen=0}function onwrite(stream,er){var state=stream._writableState;var sync=state.sync;var cb=state.writecb;onwriteStateUpdate(state);if(er)onwriteError(stream,state,sync,er,cb);else{var finished=needFinish(state);if(!finished&&!state.corked&&!state.bufferProcessing&&state.bufferedRequest){clearBuffer(stream,state)}if(sync){asyncWrite(afterWrite,stream,state,finished,cb)}else{afterWrite(stream,state,finished,cb)}}}function afterWrite(stream,state,finished,cb){if(!finished)onwriteDrain(stream,state);state.pendingcb--;cb();finishMaybe(stream,state)}function onwriteDrain(stream,state){if(state.length===0&&state.needDrain){state.needDrain=false;stream.emit(\"drain\")}}function clearBuffer(stream,state){state.bufferProcessing=true;var entry=state.bufferedRequest;if(stream._writev&&entry&&entry.next){var l=state.bufferedRequestCount;var buffer=new Array(l);var holder=state.corkedRequestsFree;holder.entry=entry;var count=0;while(entry){buffer[count]=entry;entry=entry.next;count+=1}doWrite(stream,state,true,state.length,buffer,\"\",holder.finish);state.pendingcb++;state.lastBufferedRequest=null;if(holder.next){state.corkedRequestsFree=holder.next;holder.next=null}else{state.corkedRequestsFree=new CorkedRequest(state)}}else{while(entry){var chunk=entry.chunk;var encoding=entry.encoding;var cb=entry.callback;var len=state.objectMode?1:chunk.length;doWrite(stream,state,false,len,chunk,encoding,cb);entry=entry.next;if(state.writing){break}}if(entry===null)state.lastBufferedRequest=null}state.bufferedRequestCount=0;state.bufferedRequest=entry;state.bufferProcessing=false}Writable.prototype._write=function(chunk,encoding,cb){cb(new Error(\"not implemented\"))};Writable.prototype._writev=null;Writable.prototype.end=function(chunk,encoding,cb){var state=this._writableState;if(typeof chunk===\"function\"){cb=chunk;chunk=null;encoding=null}else if(typeof encoding===\"function\"){cb=encoding;encoding=null}if(chunk!==null&&chunk!==undefined)this.write(chunk,encoding);if(state.corked){state.corked=1;this.uncork()}if(!state.ending&&!state.finished)endWritable(this,state,cb)};function needFinish(state){return state.ending&&state.length===0&&state.bufferedRequest===null&&!state.finished&&!state.writing}function prefinish(stream,state){if(!state.prefinished){state.prefinished=true;stream.emit(\"prefinish\")}}function finishMaybe(stream,state){var need=needFinish(state);if(need){if(state.pendingcb===0){prefinish(stream,state);state.finished=true;stream.emit(\"finish\")}else{prefinish(stream,state)}}return need}function endWritable(stream,state,cb){state.ending=true;finishMaybe(stream,state);if(cb){if(state.finished)processNextTick(cb);else stream.once(\"finish\",cb)}state.ended=true;stream.writable=false}function CorkedRequest(state){var _this=this;this.next=null;this.entry=null;this.finish=function(err){var entry=_this.entry;_this.entry=null;while(entry){var cb=entry.callback;state.pendingcb--;cb(err);entry=entry.next}if(state.corkedRequestsFree){state.corkedRequestsFree.next=_this}else{state.corkedRequestsFree=_this}}}}).call(this,require(\"_process\"))},{\"./_stream_duplex\":44,_process:42,buffer:5,\"buffer-shims\":4,\"core-util-is\":6,events:28,inherits:38,\"process-nextick-args\":41,\"util-deprecate\":57}],49:[function(require,module,exports){\"use strict\";var Buffer=require(\"buffer\").Buffer;var bufferShim=require(\"buffer-shims\");module.exports=BufferList;function BufferList(){this.head=null;this.tail=null;this.length=0}BufferList.prototype.push=function(v){var entry={data:v,next:null};if(this.length>0)this.tail.next=entry;else this.head=entry;this.tail=entry;++this.length};BufferList.prototype.unshift=function(v){var entry={data:v,next:this.head};if(this.length===0)this.tail=entry;this.head=entry;++this.length};BufferList.prototype.shift=function(){if(this.length===0)return;var ret=this.head.data;if(this.length===1)this.head=this.tail=null;else this.head=this.head.next;--this.length;return ret};BufferList.prototype.clear=function(){this.head=this.tail=null;this.length=0};BufferList.prototype.join=function(s){if(this.length===0)return\"\";var p=this.head;var ret=\"\"+p.data;while(p=p.next){ret+=s+p.data}return ret};BufferList.prototype.concat=function(n){if(this.length===0)return bufferShim.alloc(0);if(this.length===1)return this.head.data;var ret=bufferShim.allocUnsafe(n>>>0);var p=this.head;var i=0;while(p){p.data.copy(ret,i);i+=p.data.length;p=p.next}return ret}},{buffer:5,\"buffer-shims\":4}],50:[function(require,module,exports){module.exports=require(\"./lib/_stream_passthrough.js\")},{\"./lib/_stream_passthrough.js\":45}],51:[function(require,module,exports){(function(process){var Stream=function(){try{return require(\"st\"+\"ream\")}catch(_){}}();exports=module.exports=require(\"./lib/_stream_readable.js\");exports.Stream=Stream||exports;exports.Readable=exports;exports.Writable=require(\"./lib/_stream_writable.js\");exports.Duplex=require(\"./lib/_stream_duplex.js\");exports.Transform=require(\"./lib/_stream_transform.js\");exports.PassThrough=require(\"./lib/_stream_passthrough.js\");if(!process.browser&&process.env.READABLE_STREAM===\"disable\"&&Stream){module.exports=Stream}}).call(this,require(\"_process\"))},{\"./lib/_stream_duplex.js\":44,\"./lib/_stream_passthrough.js\":45,\"./lib/_stream_readable.js\":46,\"./lib/_stream_transform.js\":47,\"./lib/_stream_writable.js\":48,_process:42}],52:[function(require,module,exports){module.exports=require(\"./lib/_stream_transform.js\")},{\"./lib/_stream_transform.js\":47}],53:[function(require,module,exports){module.exports=require(\"./lib/_stream_writable.js\")},{\"./lib/_stream_writable.js\":48}],54:[function(require,module,exports){module.exports=function(string){return string.replace(/[-\\\\^$*+?.()|[\\]{}]/g,\"\\\\$&\")}},{}],55:[function(require,module,exports){module.exports=Stream;var EE=require(\"events\").EventEmitter;var inherits=require(\"inherits\");inherits(Stream,EE);Stream.Readable=require(\"readable-stream/readable.js\");Stream.Writable=require(\"readable-stream/writable.js\");Stream.Duplex=require(\"readable-stream/duplex.js\");Stream.Transform=require(\"readable-stream/transform.js\");Stream.PassThrough=require(\"readable-stream/passthrough.js\");Stream.Stream=Stream;function Stream(){EE.call(this)}Stream.prototype.pipe=function(dest,options){var source=this;function ondata(chunk){if(dest.writable){if(false===dest.write(chunk)&&source.pause){source.pause()}}}source.on(\"data\",ondata);function ondrain(){if(source.readable&&source.resume){source.resume()}}dest.on(\"drain\",ondrain);if(!dest._isStdio&&(!options||options.end!==false)){source.on(\"end\",onend);source.on(\"close\",onclose)}var didOnEnd=false;function onend(){if(didOnEnd)return;didOnEnd=true;dest.end()}function onclose(){if(didOnEnd)return;didOnEnd=true;if(typeof dest.destroy===\"function\")dest.destroy()}function onerror(er){cleanup();if(EE.listenerCount(this,\"error\")===0){throw er}}source.on(\"error\",onerror);dest.on(\"error\",onerror);function cleanup(){source.removeListener(\"data\",ondata);dest.removeListener(\"drain\",ondrain);source.removeListener(\"end\",onend);source.removeListener(\"close\",onclose);source.removeListener(\"error\",onerror);dest.removeListener(\"error\",onerror);source.removeListener(\"end\",cleanup);source.removeListener(\"close\",cleanup);dest.removeListener(\"close\",cleanup)}source.on(\"end\",cleanup);source.on(\"close\",cleanup);dest.on(\"close\",cleanup);dest.emit(\"pipe\",source);return dest}},{events:28,inherits:38,\"readable-stream/duplex.js\":43,\"readable-stream/passthrough.js\":50,\"readable-stream/readable.js\":51,\"readable-stream/transform.js\":52,\"readable-stream/writable.js\":53}],56:[function(require,module,exports){var Buffer=require(\"buffer\").Buffer;var isBufferEncoding=Buffer.isEncoding||function(encoding){switch(encoding&&encoding.toLowerCase()){case\"hex\":case\"utf8\":case\"utf-8\":case\"ascii\":case\"binary\":case\"base64\":case\"ucs2\":case\"ucs-2\":case\"utf16le\":case\"utf-16le\":case\"raw\":return true;default:return false}};function assertEncoding(encoding){if(encoding&&!isBufferEncoding(encoding)){throw new Error(\"Unknown encoding: \"+encoding)}}var StringDecoder=exports.StringDecoder=function(encoding){this.encoding=(encoding||\"utf8\").toLowerCase().replace(/[-_]/,\"\");assertEncoding(encoding);switch(this.encoding){case\"utf8\":this.surrogateSize=3;break;case\"ucs2\":case\"utf16le\":this.surrogateSize=2;this.detectIncompleteChar=utf16DetectIncompleteChar;break;case\"base64\":this.surrogateSize=3;this.detectIncompleteChar=base64DetectIncompleteChar;break;default:this.write=passThroughWrite;return}this.charBuffer=new Buffer(6);this.charReceived=0;this.charLength=0};StringDecoder.prototype.write=function(buffer){var charStr=\"\";while(this.charLength){var available=buffer.length>=this.charLength-this.charReceived?this.charLength-this.charReceived:buffer.length;buffer.copy(this.charBuffer,this.charReceived,0,available);this.charReceived+=available;if(this.charReceived<this.charLength){return\"\"}buffer=buffer.slice(available,buffer.length);charStr=this.charBuffer.slice(0,this.charLength).toString(this.encoding);var charCode=charStr.charCodeAt(charStr.length-1);if(charCode>=55296&&charCode<=56319){this.charLength+=this.surrogateSize;charStr=\"\";continue}this.charReceived=this.charLength=0;if(buffer.length===0){return charStr}break}this.detectIncompleteChar(buffer);var end=buffer.length;if(this.charLength){buffer.copy(this.charBuffer,0,buffer.length-this.charReceived,end);end-=this.charReceived}charStr+=buffer.toString(this.encoding,0,end);var end=charStr.length-1;var charCode=charStr.charCodeAt(end);if(charCode>=55296&&charCode<=56319){var size=this.surrogateSize;this.charLength+=size;this.charReceived+=size;this.charBuffer.copy(this.charBuffer,size,0,size);buffer.copy(this.charBuffer,0,0,size);return charStr.substring(0,end)}return charStr};StringDecoder.prototype.detectIncompleteChar=function(buffer){var i=buffer.length>=3?3:buffer.length;for(;i>0;i--){var c=buffer[buffer.length-i];if(i==1&&c>>5==6){this.charLength=2;break}if(i<=2&&c>>4==14){this.charLength=3;break}if(i<=3&&c>>3==30){this.charLength=4;break}}this.charReceived=i};StringDecoder.prototype.end=function(buffer){var res=\"\";if(buffer&&buffer.length)res=this.write(buffer);if(this.charReceived){var cr=this.charReceived;var buf=this.charBuffer;var enc=this.encoding;res+=buf.slice(0,cr).toString(enc)}return res};function passThroughWrite(buffer){return buffer.toString(this.encoding)}function utf16DetectIncompleteChar(buffer){this.charReceived=buffer.length%2;this.charLength=this.charReceived?2:0}function base64DetectIncompleteChar(buffer){this.charReceived=buffer.length%3;this.charLength=this.charReceived?3:0}},{buffer:5}],57:[function(require,module,exports){(function(global){module.exports=deprecate;function deprecate(fn,msg){if(config(\"noDeprecation\")){return fn}var warned=false;function deprecated(){if(!warned){if(config(\"throwDeprecation\")){throw new Error(msg)}else if(config(\"traceDeprecation\")){console.trace(msg)}else{console.warn(msg)}warned=true}return fn.apply(this,arguments)}return deprecated}function config(name){try{if(!global.localStorage)return false}catch(_){return false}var val=global.localStorage[name];if(null==val)return false;return String(val).toLowerCase()===\"true\"}}).call(this,typeof global!==\"undefined\"?global:typeof self!==\"undefined\"?self:typeof window!==\"undefined\"?window:{})},{}],58:[function(require,module,exports){module.exports=extend;var hasOwnProperty=Object.prototype.hasOwnProperty;function extend(){var target={};for(var i=0;i<arguments.length;i++){var source=arguments[i];for(var key in source){if(hasOwnProperty.call(source,key)){target[key]=source[key]}}}return target}},{}]},{},[1])(1)});\n\n/**\n * swagger-client - swagger-client is a javascript client for use with swaggering APIs.\n * @version v2.1.29\n * @link http://swagger.io\n * @license Apache-2.0\n */\n(function(f){if(typeof exports===\"object\"&&typeof module!==\"undefined\"){module.exports=f()}else if(typeof define===\"function\"&&define.amd){define([],f)}else{var g;if(typeof window!==\"undefined\"){g=window}else if(typeof global!==\"undefined\"){g=global}else if(typeof self!==\"undefined\"){g=self}else{g=this}g.SwaggerClient = f()}})(function(){var define,module,exports;return (function e(t,n,r){function s(o,u){if(!n[o]){if(!t[o]){var a=typeof require==\"function\"&&require;if(!u&&a)return a(o,!0);if(i)return i(o,!0);var f=new Error(\"Cannot find module '\"+o+\"'\");throw f.code=\"MODULE_NOT_FOUND\",f}var l=n[o]={exports:{}};t[o][0].call(l.exports,function(e){var n=t[o][1][e];return s(n?n:e)},l,l.exports,e,t,n,r)}return n[o].exports}var i=typeof require==\"function\"&&require;for(var o=0;o<r.length;o++)s(r[o]);return s})({1:[function(require,module,exports){\n'use strict';\n\nvar auth = require('./lib/auth');\nvar helpers = require('./lib/helpers');\nvar SwaggerClient = require('./lib/client');\nvar deprecationWrapper = function (url, options) {\n  helpers.log('This is deprecated, use \"new SwaggerClient\" instead.');\n\n  return new SwaggerClient(url, options);\n};\n\n/* Here for IE8 Support */\nif (!Array.prototype.indexOf) {\n  Array.prototype.indexOf = function(obj, start) {\n    for (var i = (start || 0), j = this.length; i < j; i++) {\n      if (this[i] === obj) { return i; }\n    }\n    return -1;\n  };\n}\n\n/* Here for IE8 Support */\nif (!String.prototype.trim) {\n  String.prototype.trim = function () {\n    return this.replace(/^\\s+|\\s+$/g, '');\n  };\n}\n\n/* Here for node 10.x support */\nif (!String.prototype.endsWith) {\n  String.prototype.endsWith = function(suffix) {\n    return this.indexOf(suffix, this.length - suffix.length) !== -1;\n  };\n}\n\nmodule.exports = SwaggerClient;\n\nSwaggerClient.ApiKeyAuthorization = auth.ApiKeyAuthorization;\nSwaggerClient.PasswordAuthorization = auth.PasswordAuthorization;\nSwaggerClient.CookieAuthorization = auth.CookieAuthorization;\nSwaggerClient.SwaggerApi = deprecationWrapper;\nSwaggerClient.SwaggerClient = deprecationWrapper;\nSwaggerClient.SchemaMarkup = require('./lib/schema-markup');\n\n},{\"./lib/auth\":2,\"./lib/client\":3,\"./lib/helpers\":4,\"./lib/schema-markup\":7}],2:[function(require,module,exports){\n'use strict';\n\nvar helpers = require('./helpers');\nvar btoa = require('btoa'); // jshint ignore:line\nvar CookieJar = require('cookiejar').CookieJar;\nvar _ = {\n  each: require('lodash-compat/collection/each'),\n  includes: require('lodash-compat/collection/includes'),\n  isObject: require('lodash-compat/lang/isObject'),\n  isArray: require('lodash-compat/lang/isArray')\n};\n\n/**\n * SwaggerAuthorizations applies the correct authorization to an operation being executed\n */\nvar SwaggerAuthorizations = module.exports.SwaggerAuthorizations = function (authz) {\n  this.authz = authz || {};\n};\n\n/**\n * Add auths to the hash\n * Will overwrite any existing\n *\n */\nSwaggerAuthorizations.prototype.add = function (name, auth) {\n  if(_.isObject(name)) {\n    for (var key in name) {\n      this.authz[key] = name[key];\n    }\n  } else if(typeof name === 'string' ){\n    this.authz[name] = auth;\n  }\n\n  return auth;\n};\n\nSwaggerAuthorizations.prototype.remove = function (name) {\n  return delete this.authz[name];\n};\n\nSwaggerAuthorizations.prototype.apply = function (obj, securities) {\n  var status = true;\n  var applyAll = !securities;\n  var flattenedSecurities = [];\n\n  // favor the object-level authorizations over global\n  var authz = obj.clientAuthorizations || this.authz;\n\n  // Securities could be [ {} ]\n  _.each(securities, function (obj, key) {\n\n    // Make sure we account for securities being [ str ]\n    if(typeof key === 'string') {\n      flattenedSecurities.push(key);\n    }\n\n    // Flatten keys in to our array\n    _.each(obj, function (val, key) {\n      flattenedSecurities.push(key);\n    });\n  });\n\n  _.each(authz, function (auth, authName) {\n    if(applyAll || _.includes(flattenedSecurities, authName)) {\n      var newStatus = auth.apply(obj);\n      status = status && !!newStatus; // logical ORs regarding status\n    }\n  });\n\n  return status;\n};\n\n/**\n * ApiKeyAuthorization allows a query param or header to be injected\n */\nvar ApiKeyAuthorization = module.exports.ApiKeyAuthorization = function (name, value, type) {\n  this.name = name;\n  this.value = value;\n  this.type = type;\n};\n\nApiKeyAuthorization.prototype.apply = function (obj) {\n  if (this.type === 'query') {\n    // see if already applied.  If so, don't do it again\n\n    var qp;\n    if (obj.url.indexOf('?') > 0) {\n      qp = obj.url.substring(obj.url.indexOf('?') + 1);\n      var parts = qp.split('&');\n      if(parts && parts.length > 0) {\n        for(var i = 0; i < parts.length; i++) {\n          var kv = parts[i].split('=');\n          if(kv && kv.length > 0) {\n            if (kv[0] === this.name) {\n              // skip it\n              return false;\n            }\n          }\n        }\n      }\n    }\n\n    if (obj.url.indexOf('?') > 0) {\n      obj.url = obj.url + '&' + this.name + '=' + this.value;\n    } else {\n      obj.url = obj.url + '?' + this.name + '=' + this.value;\n    }\n\n    return true;\n  } else if (this.type === 'header') {\n    if(typeof obj.headers[this.name] === 'undefined') {\n      obj.headers[this.name] = this.value;\n    }\n\n    return true;\n  }\n};\n\nvar CookieAuthorization = module.exports.CookieAuthorization = function (cookie) {\n  this.cookie = cookie;\n};\n\nCookieAuthorization.prototype.apply = function (obj) {\n  obj.cookieJar = obj.cookieJar || new CookieJar();\n  obj.cookieJar.setCookie(this.cookie);\n\n  return true;\n};\n\n/**\n * Password Authorization is a basic auth implementation\n */\nvar PasswordAuthorization = module.exports.PasswordAuthorization = function (username, password) {\n  if (arguments.length === 3) {\n    helpers.log('PasswordAuthorization: the \\'name\\' argument has been removed, pass only username and password');\n    username = arguments[1];\n    password = arguments[2];\n  }\n  this.username = username;\n  this.password = password;\n};\n\nPasswordAuthorization.prototype.apply = function (obj) {\n  if(typeof obj.headers.Authorization === 'undefined') {\n    obj.headers.Authorization = 'Basic ' + btoa(this.username + ':' + this.password);\n  }\n\n  return true;\n};\n\n},{\"./helpers\":4,\"btoa\":13,\"cookiejar\":18,\"lodash-compat/collection/each\":52,\"lodash-compat/collection/includes\":55,\"lodash-compat/lang/isArray\":140,\"lodash-compat/lang/isObject\":144}],3:[function(require,module,exports){\n'use strict';\n\nvar _ = {\n  bind: require('lodash-compat/function/bind'),\n  cloneDeep: require('lodash-compat/lang/cloneDeep'),\n  find: require('lodash-compat/collection/find'),\n  forEach: require('lodash-compat/collection/forEach'),\n  indexOf: require('lodash-compat/array/indexOf'),\n  isArray: require('lodash-compat/lang/isArray'),\n  isObject: require('lodash-compat/lang/isObject'),\n  isFunction: require('lodash-compat/lang/isFunction'),\n  isPlainObject: require('lodash-compat/lang/isPlainObject'),\n  isUndefined: require('lodash-compat/lang/isUndefined')\n};\nvar auth = require('./auth');\nvar helpers = require('./helpers');\nvar Model = require('./types/model');\nvar Operation = require('./types/operation');\nvar OperationGroup = require('./types/operationGroup');\nvar Resolver = require('./resolver');\nvar SwaggerHttp = require('./http');\nvar SwaggerSpecConverter = require('./spec-converter');\nvar Q = require('q');\n\n// We have to keep track of the function/property names to avoid collisions for tag names which are used to allow the\n// following usage: 'client.{tagName}'\nvar reservedClientTags = [\n  'apis',\n  'authorizationScheme',\n  'authorizations',\n  'basePath',\n  'build',\n  'buildFrom1_1Spec',\n  'buildFrom1_2Spec',\n  'buildFromSpec',\n  'clientAuthorizations',\n  'convertInfo',\n  'debug',\n  'defaultErrorCallback',\n  'defaultSuccessCallback',\n  'enableCookies',\n  'fail',\n  'failure',\n  'finish',\n  'help',\n  'host',\n  'idFromOp',\n  'info',\n  'initialize',\n  'isBuilt',\n  'isValid',\n  'modelPropertyMacro',\n  'models',\n  'modelsArray',\n  'options',\n  'parameterMacro',\n  'parseUri',\n  'progress',\n  'resourceCount',\n  'sampleModels',\n  'selfReflect',\n  'setConsolidatedModels',\n  'spec',\n  'supportedSubmitMethods',\n  'swaggerRequestHeaders',\n  'tagFromLabel',\n  'title',\n  'url',\n  'useJQuery',\n  'jqueryAjaxCache'\n];\n// We have to keep track of the function/property names to avoid collisions for tag names which are used to allow the\n// following usage: 'client.apis.{tagName}'\nvar reservedApiTags = [\n  'apis',\n  'asCurl',\n  'description',\n  'externalDocs',\n  'help',\n  'label',\n  'name',\n  'operation',\n  'operations',\n  'operationsArray',\n  'path',\n  'tag'\n];\nvar supportedOperationMethods = ['delete', 'get', 'head', 'options', 'patch', 'post', 'put'];\nvar SwaggerClient = module.exports = function (url, options) {\n  this.authorizations = null;\n  this.authorizationScheme = null;\n  this.basePath = null;\n  this.debug = false;\n  this.enableCookies = false;\n  this.info = null;\n  this.isBuilt = false;\n  this.isValid = false;\n  this.modelsArray = [];\n  this.resourceCount = 0;\n  this.url = null;\n  this.useJQuery = false;\n  this.jqueryAjaxCache = false;\n  this.swaggerObject = {};\n  this.deferredClient = undefined;\n\n  this.clientAuthorizations = new auth.SwaggerAuthorizations();\n\n  if (typeof url !== 'undefined') {\n    return this.initialize(url, options);\n  } else {\n    return this;\n  }\n};\n\nSwaggerClient.prototype.initialize = function (url, options) {\n  this.models = {};\n  this.sampleModels = {};\n\n  if (typeof url === 'string') {\n    this.url = url;\n  } else if (_.isObject(url)) {\n    options = url;\n    this.url = options.url;\n  }\n\n  if(this.url && this.url.indexOf('http:') === -1 && this.url.indexOf('https:') === -1) {\n    // no protocol, so we can only use window if it exists\n    if(typeof(window) !== 'undefined' && window && window.location) {\n      this.url = window.location.origin + this.url;\n    }\n  }\n\n  options = options || {};\n  this.clientAuthorizations.add(options.authorizations);\n  this.swaggerRequestHeaders = options.swaggerRequestHeaders || 'application/json;charset=utf-8,*/*';\n  this.defaultSuccessCallback = options.defaultSuccessCallback || null;\n  this.defaultErrorCallback = options.defaultErrorCallback || null;\n  this.modelPropertyMacro = options.modelPropertyMacro || null;\n  this.connectionAgent = options.connectionAgent || null;\n  this.parameterMacro = options.parameterMacro || null;\n  this.usePromise = options.usePromise || null;\n\n  // operation request timeout default\n  this.timeout = options.timeout || null;\n  // default to request timeout when not specified\n  this.fetchSpecTimeout = typeof options.fetchSpecTimeout !== 'undefined' ?\n      options.fetchSpecTimeout : options.timeout || null;\n\n  if(this.usePromise) {\n    this.deferredClient = Q.defer();\n  }\n\n  if (typeof options.success === 'function') {\n    this.success = options.success;\n  }\n  if (options.useJQuery) {\n    this.useJQuery = options.useJQuery;\n  }\n\n  if (options.jqueryAjaxCache) {\n    this.jqueryAjaxCache = options.jqueryAjaxCache;\n  }\n\n  if (options.enableCookies) {\n    this.enableCookies = options.enableCookies;\n  }\n\n  this.options = options || {};\n\n  // maybe don't need this?\n  this.options.timeout = this.timeout;\n  this.options.fetchSpecTimeout = this.fetchSpecTimeout;\n\n  this.supportedSubmitMethods = options.supportedSubmitMethods || [];\n  this.failure = options.failure || function (err) { throw err; };\n  this.progress = options.progress || function () {};\n  this.spec = _.cloneDeep(options.spec); // Clone so we do not alter the provided document\n\n  if (options.scheme) {\n    this.scheme = options.scheme;\n  }\n\n  if (this.usePromise || typeof options.success === 'function') {\n    this.ready = true;\n    return this.build();\n  }\n};\n\nSwaggerClient.prototype.build = function (mock) {\n  if (this.isBuilt) {\n    return this;\n  }\n\n  var self = this;\n\n  if (this.spec) {\n    this.progress('fetching resource list; Please wait.');\n  } else {\n    this.progress('fetching resource list: ' + this.url + '; Please wait.');\n  }\n\n  var obj = {\n    useJQuery: this.useJQuery,\n    jqueryAjaxCache: this.jqueryAjaxCache,\n    connectionAgent: this.connectionAgent,\n    enableCookies: this.enableCookies,\n    url: this.url,\n    method: 'get',\n    headers: {\n      accept: this.swaggerRequestHeaders\n    },\n    on: {\n      error: function (response) {\n        if (self.url.substring(0, 4) !== 'http') {\n          return self.fail('Please specify the protocol for ' + self.url);\n        } else if (response.errObj && (response.errObj.code === 'ECONNABORTED' || response.errObj.message.indexOf('timeout') !== -1)) {\n          return self.fail('Request timed out after ' + self.fetchSpecTimeout + 'ms');\n        } else if (response.status === 0) {\n          return self.fail('Can\\'t read from server.  It may not have the appropriate access-control-origin settings.');\n        } else if (response.status === 404) {\n          return self.fail('Can\\'t read swagger JSON from ' + self.url);\n        } else {\n          return self.fail(response.status + ' : ' + response.statusText + ' ' + self.url);\n        }\n      },\n      response: function (resp) {\n\n        var responseObj = resp.obj;\n        if(!responseObj) {\n          return self.fail('failed to parse JSON/YAML response');\n        }\n\n        self.swaggerVersion = responseObj.swaggerVersion;\n        self.swaggerObject = responseObj;\n\n        if (responseObj.swagger && parseInt(responseObj.swagger) === 2) {\n          self.swaggerVersion = responseObj.swagger;\n\n          new Resolver().resolve(responseObj, self.url, self.buildFromSpec, self);\n\n          self.isValid = true;\n        } else {\n          var converter = new SwaggerSpecConverter();\n          self.oldSwaggerObject = self.swaggerObject;\n\n          converter.setDocumentationLocation(self.url);\n          converter.convert(responseObj, self.clientAuthorizations, self.options, function(spec) {\n            self.swaggerObject = spec;\n            new Resolver().resolve(spec, self.url, self.buildFromSpec, self);\n            self.isValid = true;\n          });\n        }\n      }\n    }\n  };\n\n  // only set timeout when specified\n  if (this.fetchSpecTimeout) {\n    obj.timeout = this.fetchSpecTimeout;\n  }\n\n  if (this.spec) {\n    self.swaggerObject = this.spec;\n    setTimeout(function () {\n      new Resolver().resolve(self.spec, self.url, self.buildFromSpec, self);\n    }, 10);\n  } else {\n    this.clientAuthorizations.apply(obj);\n\n    if (mock) {\n      return obj;\n    }\n\n    new SwaggerHttp().execute(obj, this.options);\n  }\n\n  return (this.usePromise) ? this.deferredClient.promise : this;\n};\n\nSwaggerClient.prototype.buildFromSpec = function (response) {\n  if (this.isBuilt) {\n    return this;\n  }\n\n  this.apis = {};\n  this.apisArray = [];\n  this.basePath = response.basePath || '';\n  this.consumes = response.consumes;\n  this.host = response.host || '';\n  this.info = response.info || {};\n  this.produces = response.produces;\n  this.schemes = response.schemes || [];\n  this.securityDefinitions = _.cloneDeep(response.securityDefinitions);\n  this.security = response.security;\n  this.title = response.title || '';\n\n  var key, definedTags = {}, k, location, self = this, i;\n\n  if (response.externalDocs) {\n    this.externalDocs = response.externalDocs;\n  }\n\n  // legacy support\n  this.authSchemes = this.securityDefinitions;\n\n  if(this.securityDefinitions) {\n    for(key in this.securityDefinitions) {\n      var securityDefinition = this.securityDefinitions[key];\n      securityDefinition.vendorExtensions = {};\n      for(var ext in securityDefinition) {\n        helpers.extractExtensions(ext, securityDefinition);\n        if (ext === 'scopes') {\n          var scopes = securityDefinition[ext];\n          if(typeof scopes === 'object') {\n            scopes.vendorExtensions = {};\n            for (var s in scopes) {\n              helpers.extractExtensions(s, scopes);\n              if(s.indexOf('x-') === 0) {\n                delete scopes[s];\n              }\n            }\n          }\n        }\n      }\n    }\n  }\n\n  if (Array.isArray(response.tags)) {\n    definedTags = {};\n\n    for (k = 0; k < response.tags.length; k++) {\n      var t = _.cloneDeep(response.tags[k]);\n      definedTags[t.name] = t;\n      for(i in t) {\n        if(i === 'externalDocs' && typeof t[i] === 'object') {\n          for(var j in t[i]) {\n            helpers.extractExtensions(j, t[i]);\n          }\n        }\n        helpers.extractExtensions(i, t);\n      }\n    }\n  }\n\n\n  if (typeof this.url === 'string') {\n    location = this.parseUri(this.url);\n    if (typeof this.scheme === 'undefined' && typeof this.schemes === 'undefined' || this.schemes.length === 0) {\n      if(typeof window !== 'undefined') {\n        // use the window scheme\n        this.scheme = window.location.protocol.replace(':','');\n      }\n      else {\n        this.scheme = location.scheme || 'http';\n      }\n    } else if (typeof window !== 'undefined' && window.location.protocol.indexOf('chrome-extension') === 0) {\n\t\t// if it is chrome swagger ui extension scheme then let swagger doc url scheme decide the protocol\n\t\tthis.scheme = location.scheme;\n\t} else if (typeof this.scheme === 'undefined') {\n      if(typeof window !== 'undefined') {\n        var scheme = window.location.protocol.replace(':','');\n        if(scheme === 'https' && this.schemes.indexOf(scheme) === -1) {\n          // can't call http from https served page in a browser!\n          helpers.log('Cannot call a http server from https inside a browser!');\n          this.scheme = 'http';\n        }\n        else if(this.schemes.indexOf(scheme) !== -1) {\n          this.scheme = scheme;\n        }\n        else {\n          if(this.schemes.indexOf('https') !== -1) {\n            this.scheme = 'https';\n          }\n          else {\n            this.scheme = 'http';\n          }\n        }\n      }\n      else {\n        this.scheme = this.schemes[0] || location.scheme;\n      }\n    }\n\n    if (typeof this.host === 'undefined' || this.host === '') {\n      this.host = location.host;\n\n      if (location.port) {\n        this.host = this.host + ':' + location.port;\n      }\n    }\n  }\n  else {\n    if (typeof this.schemes === 'undefined' || this.schemes.length === 0) {\n      this.scheme = 'http';\n    }\n    else if (typeof this.scheme === 'undefined') {\n      this.scheme = this.schemes[0];\n    }\n  }\n\n  this.definitions = response.definitions;\n\n  for (key in this.definitions) {\n    var model = new Model(key, this.definitions[key], this.models, this.modelPropertyMacro);\n\n    if (model) {\n      this.models[key] = model;\n    }\n  }\n\n  // get paths, create functions for each operationId\n\n  // Bind help to 'client.apis'\n  self.apis.help = _.bind(self.help, self);\n\n  _.forEach(response.paths, function (pathObj, path) {\n    // Only process a path if it's an object\n    if (!_.isPlainObject(pathObj)) {\n      return;\n    }\n\n    _.forEach(supportedOperationMethods, function (method) {\n      var operation = pathObj[method];\n\n      if (_.isUndefined(operation)) {\n        // Operation does not exist\n        return;\n      } else if (!_.isPlainObject(operation)) {\n        // Operation exists but it is not an Operation Object.  Since this is invalid, log it.\n        helpers.log('The \\'' + method + '\\' operation for \\'' + path + '\\' path is not an Operation Object');\n\n        return;\n      }\n\n      var tags = operation.tags;\n\n      if (_.isUndefined(tags) || !_.isArray(tags) || tags.length === 0) {\n        tags = operation.tags = [ 'default' ];\n      }\n\n      var operationId = self.idFromOp(path, method, operation);\n\n      var operationObject = new Operation(self,\n        operation.scheme,\n        operationId,\n        method,\n        path,\n        operation,\n        self.definitions,\n        self.models,\n        self.clientAuthorizations);\n\n      operationObject.connectionAgent = self.connectionAgent;\n      operationObject.vendorExtensions = {};\n      for(i in operation) {\n        helpers.extractExtensions(i, operationObject, operation[i]);\n      }\n      operationObject.externalDocs = operation.externalDocs;\n      if(operationObject.externalDocs) {\n        operationObject.externalDocs = _.cloneDeep(operationObject.externalDocs);\n        operationObject.externalDocs.vendorExtensions = {};\n        for(i in operationObject.externalDocs) {\n          helpers.extractExtensions(i, operationObject.externalDocs);\n        }\n      }\n\n      // bind self operation's execute command to the api\n      _.forEach(tags, function (tag) {\n        var clientProperty = _.indexOf(reservedClientTags, tag) > -1 ? '_' + tag : tag;\n        var apiProperty = _.indexOf(reservedApiTags, tag) > -1 ? '_' + tag : tag;\n        var operationGroup = self[clientProperty];\n\n        if (clientProperty !== tag) {\n          helpers.log('The \\'' + tag + '\\' tag conflicts with a SwaggerClient function/property name.  Use \\'client.' +\n                      clientProperty + '\\' or \\'client.apis.' + tag + '\\' instead of \\'client.' + tag + '\\'.');\n        }\n\n        if (apiProperty !== tag) {\n          helpers.log('The \\'' + tag + '\\' tag conflicts with a SwaggerClient operation function/property name.  Use ' +\n                      '\\'client.apis.' + apiProperty + '\\' instead of \\'client.apis.' + tag + '\\'.');\n        }\n\n        if (_.indexOf(reservedApiTags, operationId) > -1) {\n          helpers.log('The \\'' + operationId + '\\' operationId conflicts with a SwaggerClient operation ' +\n                      'function/property name.  Use \\'client.apis.' + apiProperty + '._' + operationId +\n                      '\\' instead of \\'client.apis.' + apiProperty + '.' + operationId + '\\'.');\n\n          operationId = '_' + operationId;\n          operationObject.nickname = operationId; // So 'client.apis.[tag].operationId.help() works properly\n        }\n\n        if (_.isUndefined(operationGroup)) {\n          operationGroup = self[clientProperty] = self.apis[apiProperty] = {};\n\n          operationGroup.operations = {};\n          operationGroup.label = apiProperty;\n          operationGroup.apis = {};\n\n          var tagDef = definedTags[tag];\n\n          if (!_.isUndefined(tagDef)) {\n            operationGroup.description = tagDef.description;\n            operationGroup.externalDocs = tagDef.externalDocs;\n            operationGroup.vendorExtensions = tagDef.vendorExtensions;\n          }\n\n          self[clientProperty].help = _.bind(self.help, operationGroup);\n          self.apisArray.push(new OperationGroup(tag, operationGroup.description, operationGroup.externalDocs, operationObject));\n        }\n\n        operationId = self.makeUniqueOperationId(operationId, self.apis[apiProperty]);\n\n        // Bind tag help\n        if (!_.isFunction(operationGroup.help)) {\n          operationGroup.help = _.bind(self.help, operationGroup);\n        }\n\n        // bind to the apis object\n        self.apis[apiProperty][operationId] = operationGroup[operationId] = _.bind(operationObject.execute,\n                                                                                  operationObject);\n        self.apis[apiProperty][operationId].help = operationGroup[operationId].help = _.bind(operationObject.help,\n                                                                                             operationObject);\n        self.apis[apiProperty][operationId].asCurl = operationGroup[operationId].asCurl = _.bind(operationObject.asCurl,\n                                                                                                 operationObject);\n\n        operationGroup.apis[operationId] = operationGroup.operations[operationId] = operationObject;\n\n        // legacy UI feature\n        var api = _.find(self.apisArray, function (api) {\n          return api.tag === tag;\n        });\n\n        if (api) {\n          api.operationsArray.push(operationObject);\n        }\n      });\n    });\n  });\n\n  // sort the apisArray according to the tags\n  var sortedApis = [];\n  _.forEach(Object.keys(definedTags), function (tag) {\n    var pos;\n    for(pos in self.apisArray) {\n      var _api = self.apisArray[pos];\n      if(_api && tag === _api.name) {\n        sortedApis.push(_api);\n        self.apisArray[pos] = null;\n      }\n    }\n  });\n  // add anything left\n  _.forEach(self.apisArray, function (api) {\n    if(api) {\n      sortedApis.push(api);\n    }\n  });\n  self.apisArray = sortedApis;\n\n  _.forEach(response.definitions, function (definitionObj, definition) {\n    definitionObj.id = definition.toLowerCase();\n    definitionObj.name = definition;\n    self.modelsArray.push(definitionObj);\n  });\n\n  this.isBuilt = true;\n\n  if (this.usePromise) {\n    this.isValid = true;\n    this.isBuilt = true;\n    this.deferredClient.resolve(this);\n\n    return this.deferredClient.promise;\n  }\n\n  if (this.success) {\n    this.success();\n  }\n\n  return this;\n};\n\nSwaggerClient.prototype.makeUniqueOperationId = function(operationId, api) {\n  var count = 0;\n  var name = operationId;\n\n  // make unique across this operation group\n  while(true) {\n    var matched = false;\n    _.forEach(api.operations, function (operation) {\n      if(operation.nickname === name) {\n        matched = true;\n      }\n    });\n    if(!matched) {\n      return name;\n    }\n    name = operationId + '_' + count;\n    count ++;\n  }\n\n  return operationId;\n};\n\nSwaggerClient.prototype.parseUri = function (uri) {\n  var urlParseRE = /^(((([^:\\/#\\?]+:)?(?:(\\/\\/)((?:(([^:@\\/#\\?]+)(?:\\:([^:@\\/#\\?]+))?)@)?(([^:\\/#\\?\\]\\[]+|\\[[^\\/\\]@#?]+\\])(?:\\:([0-9]+))?))?)?)?((\\/?(?:[^\\/\\?#]+\\/+)*)([^\\?#]*)))?(\\?[^#]+)?)(#.*)?/;\n  var parts = urlParseRE.exec(uri);\n\n  return {\n    scheme: parts[4] ? parts[4].replace(':','') : undefined,\n    host: parts[11],\n    port: parts[12],\n    path: parts[15]\n  };\n};\n\nSwaggerClient.prototype.help = function (dontPrint) {\n  var output = '';\n\n  if (this instanceof SwaggerClient) {\n    _.forEach(this.apis, function (api, name) {\n      if (_.isPlainObject(api)) {\n        output += 'operations for the \\'' + name + '\\' tag\\n';\n\n        _.forEach(api.operations, function (operation, name) {\n          output += '  * ' + name + ': ' + operation.summary + '\\n';\n        });\n      }\n    });\n  } else if (this instanceof OperationGroup || _.isPlainObject(this)) {\n    output += 'operations for the \\'' + this.label + '\\' tag\\n';\n\n    _.forEach(this.apis, function (operation, name) {\n      output += '  * ' + name + ': ' + operation.summary + '\\n';\n    });\n  }\n\n  if (dontPrint) {\n    return output;\n  } else {\n    helpers.log(output);\n\n    return output;\n  }\n};\n\nSwaggerClient.prototype.tagFromLabel = function (label) {\n  return label;\n};\n\nSwaggerClient.prototype.idFromOp = function (path, httpMethod, op) {\n  if(!op || !op.operationId) {\n    op = op || {};\n    op.operationId = httpMethod + '_' + path;\n  }\n  var opId = op.operationId.replace(/[\\s!@#$%^&*()_+=\\[{\\]};:<>|.\\/?,\\\\'\"\"-]/g, '_') || (path.substring(1) + '_' + httpMethod);\n\n  opId = opId.replace(/((_){2,})/g, '_');\n  opId = opId.replace(/^(_)*/g, '');\n  opId = opId.replace(/([_])*$/g, '');\n\n  return opId;\n};\n\nSwaggerClient.prototype.setHost = function (host) {\n  this.host = host;\n\n  if(this.apis) {\n    _.forEach(this.apis, function(api) {\n      if(api.operations) {\n        _.forEach(api.operations, function(operation) {\n          operation.host = host;\n        });\n      }\n    });\n  }\n};\n\nSwaggerClient.prototype.setBasePath = function (basePath) {\n  this.basePath = basePath;\n\n  if(this.apis) {\n    _.forEach(this.apis, function(api) {\n      if(api.operations) {\n        _.forEach(api.operations, function(operation) {\n          operation.basePath = basePath;\n        });\n      }\n    });\n  }\n};\n\nSwaggerClient.prototype.setSchemes = function (schemes) {\n  this.schemes = schemes;\n\n  if(schemes && schemes.length > 0) {\n    if(this.apis) {\n      _.forEach(this.apis, function (api) {\n        if (api.operations) {\n          _.forEach(api.operations, function (operation) {\n            operation.scheme = schemes[0];\n          });\n        }\n      });\n    }\n  }\n};\n\nSwaggerClient.prototype.fail = function (message) {\n  if (this.usePromise) {\n    this.deferredClient.reject(message);\n    return this.deferredClient.promise;\n  } else {\n    if (this.failure) {\n      this.failure(message);\n    }\n    else {\n      this.failure(message);\n    }\n  }\n};\n\n},{\"./auth\":2,\"./helpers\":4,\"./http\":5,\"./resolver\":6,\"./spec-converter\":8,\"./types/model\":9,\"./types/operation\":10,\"./types/operationGroup\":11,\"lodash-compat/array/indexOf\":49,\"lodash-compat/collection/find\":53,\"lodash-compat/collection/forEach\":54,\"lodash-compat/function/bind\":58,\"lodash-compat/lang/cloneDeep\":138,\"lodash-compat/lang/isArray\":140,\"lodash-compat/lang/isFunction\":142,\"lodash-compat/lang/isObject\":144,\"lodash-compat/lang/isPlainObject\":145,\"lodash-compat/lang/isUndefined\":148,\"q\":157}],4:[function(require,module,exports){\n(function (process){\n'use strict';\n\nvar _ = {\n  isPlainObject: require('lodash-compat/lang/isPlainObject'),\n  indexOf: require('lodash-compat/array/indexOf')\n};\n\nmodule.exports.__bind = function (fn, me) {\n  return function(){\n    return fn.apply(me, arguments);\n  };\n};\n\nvar log = module.exports.log = function() {\n  // Only log if available and we're not testing\n  if (console && process.env.NODE_ENV !== 'test') {\n    console.log(Array.prototype.slice.call(arguments)[0]);\n  }\n};\n\nmodule.exports.fail = function (message) {\n  log(message);\n};\n\nmodule.exports.optionHtml = function (label, value) {\n  return '<tr><td class=\"optionName\">' + label + ':</td><td>' + value + '</td></tr>';\n};\n\nvar resolveSchema = module.exports.resolveSchema = function (schema) {\n  if (_.isPlainObject(schema.schema)) {\n    schema = resolveSchema(schema.schema);\n  }\n\n  return schema;\n};\n\nmodule.exports.simpleRef = function (name) {\n  if (typeof name === 'undefined') {\n    return null;\n  }\n\n  if (name.indexOf('#/definitions/') === 0) {\n    return name.substring('#/definitions/'.length);\n  } else {\n    return name;\n  }\n};\n\n/**\n * helper to remove extensions and add them to an object\n *\n * @param keyname\n * @param obj\n */\nmodule.exports.extractExtensions = function (keyname, obj, value) {\n  if(!keyname || !obj) {\n    return;\n  }\n\n  if (typeof keyname === 'string' && keyname.indexOf('x-') === 0) {\n    obj.vendorExtensions = obj.vendorExtensions || {};\n    if(value) {\n      obj.vendorExtensions[keyname] = value;\n    }\n    else {\n      obj.vendorExtensions[keyname] = obj[keyname];\n    }\n  }\n};\n}).call(this,require('_process'))\n\n},{\"_process\":12,\"lodash-compat/array/indexOf\":49,\"lodash-compat/lang/isPlainObject\":145}],5:[function(require,module,exports){\n(function (Buffer){\n'use strict';\n\nvar helpers = require('./helpers');\nvar request = require('superagent');\nvar jsyaml = require('js-yaml');\nvar _ = {\n  isObject: require('lodash-compat/lang/isObject'),\n  keys: require('lodash-compat/object/keys')\n};\n\n/*\n * JQueryHttpClient is a light-weight, node or browser HTTP client\n */\nvar JQueryHttpClient = function () {\n  this.type = 'JQueryHttpClient';\n};\n\n/*\n * SuperagentHttpClient is a light-weight, node or browser HTTP client\n */\nvar SuperagentHttpClient = function () {\n  this.type = 'SuperagentHttpClient';\n};\n\n/**\n * SwaggerHttp is a wrapper for executing requests\n */\nvar SwaggerHttp = module.exports = function () {};\n\nSwaggerHttp.prototype.execute = function (obj, opts) {\n  var client;\n\n  if(opts && opts.client) {\n    client = opts.client;\n  }\n  else {\n    client = new SuperagentHttpClient(opts);\n  }\n  client.opts = opts || {};\n\n  if (opts && opts.requestAgent) {\n    request = opts.requestAgent;\n  }\n\n  // legacy support\n  var hasJQuery = false;\n  if(typeof window !== 'undefined') {\n    if(typeof window.jQuery !== 'undefined') {\n      hasJQuery = true;\n    }\n  }\n  // OPTIONS support\n  if(obj.method.toLowerCase() === 'options' && client.type === 'SuperagentHttpClient') {\n    log('forcing jQuery as OPTIONS are not supported by SuperAgent');\n    obj.useJQuery = true;\n  }\n  if(this.isInternetExplorer() && (obj.useJQuery === false || !hasJQuery )) {\n    throw new Error('Unsupported configuration! JQuery is required but not available');\n  }\n  if ((obj && obj.useJQuery === true) || this.isInternetExplorer() && hasJQuery) {\n    client = new JQueryHttpClient(opts);\n  }\n\n  var success = obj.on.response;\n  var error = obj.on.error;\n\n  var requestInterceptor = function(data) {\n    if(opts && opts.requestInterceptor) {\n      data = opts.requestInterceptor.apply(data);\n    }\n    return data;\n  };\n\n  var responseInterceptor = function(data) {\n    if(opts && opts.responseInterceptor) {\n      data = opts.responseInterceptor.apply(data, [obj]);\n    }\n    return success(data);\n  };\n\n  var errorInterceptor = function(data) {\n    if(opts && opts.responseInterceptor) {\n      data = opts.responseInterceptor.apply(data, [obj]);\n    }\n    error(data);\n  };\n\n  obj.on.error = function(data) {\n    errorInterceptor(data);\n  };\n\n  obj.on.response = function(data) {\n    if(data && data.status >= 400) {\n      errorInterceptor(data);\n    }\n    else {\n      responseInterceptor(data);\n    }\n  };\n\n  if (_.isObject(obj) && _.isObject(obj.body)) {\n    // special processing for file uploads via jquery\n    if (obj.body.type && obj.body.type === 'formData'){\n      if(opts.useJQuery) {\n        obj.contentType = false;\n        obj.processData = false;\n        delete obj.headers['Content-Type'];\n      }\n    }\n  }\n\n  obj = requestInterceptor(obj) || obj;\n  if (obj.beforeSend) {\n    obj.beforeSend(function(_obj) {\n      client.execute(_obj || obj);\n    });\n  } else {\n    client.execute(obj);\n  }\n\n  return (obj.deferred) ? obj.deferred.promise : obj;\n};\n\nSwaggerHttp.prototype.isInternetExplorer = function () {\n  var detectedIE = false;\n\n  if (typeof navigator !== 'undefined' && navigator.userAgent) {\n    var nav = navigator.userAgent.toLowerCase();\n\n    if (nav.indexOf('msie') !== -1) {\n      var version = parseInt(nav.split('msie')[1]);\n\n      if (version <= 8) {\n        detectedIE = true;\n      }\n    }\n  }\n\n  return detectedIE;\n};\n\nJQueryHttpClient.prototype.execute = function (obj) {\n  var jq = this.jQuery || (typeof window !== 'undefined' && window.jQuery);\n  var cb = obj.on;\n  var request = obj;\n\n  if(typeof jq === 'undefined' || jq === false) {\n    throw new Error('Unsupported configuration! JQuery is required but not available');\n  }\n\n  obj.type = obj.method;\n  obj.cache = obj.jqueryAjaxCache;\n  obj.data = obj.body;\n  delete obj.jqueryAjaxCache;\n  delete obj.useJQuery;\n  delete obj.body;\n\n  obj.complete = function (response) {\n    var headers = {};\n    var headerArray = response.getAllResponseHeaders().split('\\n');\n\n    for (var i = 0; i < headerArray.length; i++) {\n      var toSplit = headerArray[i].trim();\n\n      if (toSplit.length === 0) {\n        continue;\n      }\n\n      var separator = toSplit.indexOf(':');\n\n      if (separator === -1) {\n        // Name but no value in the header\n        headers[toSplit] = null;\n\n        continue;\n      }\n\n      var name = toSplit.substring(0, separator).trim();\n      var value = toSplit.substring(separator + 1).trim();\n\n      headers[name] = value;\n    }\n\n    var out = {\n      url: request.url,\n      method: request.method,\n      status: response.status,\n      statusText: response.statusText,\n      data: response.responseText,\n      headers: headers\n    };\n\n    try {\n      var possibleObj =  response.responseJSON || jsyaml.safeLoad(response.responseText);\n      out.obj = (typeof possibleObj === 'string') ? {} : possibleObj;\n    } catch (ex) {\n      // do not set out.obj\n      helpers.log('unable to parse JSON/YAML content');\n    }\n\n    // I can throw, or parse null?\n    out.obj = out.obj || null;\n\n    if (response.status >= 200 && response.status < 300) {\n      cb.response(out);\n    } else if (response.status === 0 || (response.status >= 400 && response.status < 599)) {\n      cb.error(out);\n    } else {\n      return cb.response(out);\n    }\n  };\n\n  jq.support.cors = true;\n\n  return jq.ajax(obj);\n};\n\nSuperagentHttpClient.prototype.execute = function (obj) {\n  var method = obj.method.toLowerCase();\n  var timeout = obj.timeout;\n\n  if (method === 'delete') {\n    method = 'del';\n  }\n  var headers = obj.headers || {};\n\n  var r = request[method](obj.url);\n\n  if (obj.connectionAgent) {\n    r.agent(obj.connectionAgent);\n  }\n\n  if (timeout) {\n    r.timeout(timeout);\n  }\n\n  if (obj.enableCookies) {\n    r.withCredentials();\n  }\n\n  var accept = obj.headers.Accept;\n\n  if(this.binaryRequest(accept)) {\n    r.on('request', function () {\n      if(this.xhr) {\n        this.xhr.responseType = 'blob';\n      }\n    });\n  }\n\n  if(obj.body) {\n    if(_.isObject(obj.body)) {\n      var contentType = obj.headers['Content-Type'] || '';\n      if (contentType.indexOf('multipart/form-data') === 0) {\n        delete headers['Content-Type'];\n        if({}.toString.apply(obj.body) === '[object FormData]') {\n          r.send(obj.body);\n        }\n        else {\n          var keyname, value, v;\n          for (keyname in obj.body) {\n            value = obj.body[keyname];\n            if(Array.isArray(value)) {\n              for(v in value) {\n                r.field(keyname, v);\n              }\n            }\n            else {\n              r.field(keyname, value);\n            }\n          }\n        }\n      }\n      else if (_.isObject(obj.body)) {\n        // non multipart/form-data\n        obj.body = JSON.stringify(obj.body);\n        r.send(obj.body);\n      }\n    }\n    else {\n      r.send(obj.body);\n    }\n  }\n\n  var name;\n  for (name in headers) {\n    r.set(name, headers[name]);\n  }\n\n  if(typeof r.buffer === 'function') {\n    r.buffer(); // force superagent to populate res.text with the raw response data\n  }\n\n  r.end(function (err, res) {\n    res = res || {\n      status: 0,\n      headers: {error: 'no response from server'}\n    };\n    var response = {\n      url: obj.url,\n      method: obj.method,\n      headers: res.headers\n    };\n    var cb;\n\n    if (!err && res.error) {\n      err = res.error;\n    }\n\n    if (err && obj.on && obj.on.error) {\n      response.errObj = err;\n      response.status = res ? res.status : 500;\n      response.statusText = res ? res.text : err.message;\n      if (res.headers && res.headers['content-type']) {\n        if (res.headers['content-type'].indexOf('application/json') >= 0) {\n          try {\n            response.obj = JSON.parse(response.statusText);\n          }\n          catch (e) {\n            response.obj = null;\n          }\n        }\n      }\n      cb = obj.on.error;\n    } else if (res && obj.on && obj.on.response) {\n      var possibleObj;\n\n      // Already parsed by by superagent?\n      if (res.body && _.keys(res.body).length > 0) {\n        possibleObj = res.body;\n      } else {\n        try {\n          possibleObj = jsyaml.safeLoad(res.text);\n          // can parse into a string... which we don't need running around in the system\n          possibleObj = (typeof possibleObj === 'string') ? null : possibleObj;\n        } catch (e) {\n          helpers.log('cannot parse JSON/YAML content');\n        }\n      }\n\n      // null means we can't parse into object\n      if(typeof Buffer === 'function' && Buffer.isBuffer(possibleObj)) {\n        response.data = possibleObj;\n      }\n      else {\n        response.obj = (typeof possibleObj === 'object') ? possibleObj : null;\n      }\n\n      response.status = res.status;\n      response.statusText = res.text;\n      cb = obj.on.response;\n    }\n    if (res.xhr && res.xhr.response) {\n      response.data = res.xhr.response;\n    }\n    else if(!response.data) {\n      response.data = response.statusText;\n    }\n\n    if (cb) {\n      cb(response);\n    }\n  });\n};\n\nSuperagentHttpClient.prototype. binaryRequest = function (accept) {\n  if(!accept) {\n    return false;\n  }\n  return (/^image/i).test(accept)\n    || (/^application\\/pdf/).test(accept)\n    || (/^application\\/octet-stream/).test(accept);\n};\n\n}).call(this,require(\"buffer\").Buffer)\n\n},{\"./helpers\":4,\"buffer\":14,\"js-yaml\":19,\"lodash-compat/lang/isObject\":144,\"lodash-compat/object/keys\":149,\"superagent\":158}],6:[function(require,module,exports){\n'use strict';\n\nvar SwaggerHttp = require('./http');\nvar _ = {\n  isObject: require('lodash-compat/lang/isObject'),\n  cloneDeep: require('lodash-compat/lang/cloneDeep'),\n  isArray: require('lodash-compat/lang/isArray'),\n  isString: require('lodash-compat/lang/isString')\n};\n\n\n/**\n * Resolves a spec's remote references\n */\nvar Resolver = module.exports = function () {\n  this.failedUrls = [];\n  this.resolverCache = {};\n  this.pendingUrls = {};\n};\n\nResolver.prototype.processAllOf = function(root, name, definition, resolutionTable, unresolvedRefs, spec) {\n  var i, location, property;\n\n  definition['x-resolved-from'] = [ '#/definitions/' + name ];\n  var allOf = definition.allOf;\n  // the refs go first\n  allOf.sort(function(a, b) {\n    if(a.$ref && b.$ref) { return 0; }\n    else if(a.$ref) { return -1; }\n    else { return 1; }\n  });\n  for (i = 0; i < allOf.length; i++) {\n    property = allOf[i];\n    location = '/definitions/' + name + '/allOf';\n    this.resolveInline(root, spec, property, resolutionTable, unresolvedRefs, location);\n  }\n};\n\nResolver.prototype.resolve = function (spec, arg1, arg2, arg3) {\n  this.spec = spec;\n  var root = arg1, callback = arg2, scope = arg3, opts = {}, location, i;\n  if(typeof arg1 === 'function') {\n    root = null;\n    callback = arg1;\n    scope = arg2;\n  }\n  var _root = root, modelName;\n  this.scope = (scope || this);\n  this.iteration = this.iteration || 0;\n\n  if(this.scope.options && this.scope.options.requestInterceptor){\n    opts.requestInterceptor = this.scope.options.requestInterceptor;\n  }\n\n  if(this.scope.options && this.scope.options.responseInterceptor){\n    opts.responseInterceptor = this.scope.options.responseInterceptor;\n  }\n\n  var name, path, property, propertyName, parameter, done, counter;\n  var processedCalls = 0, resolvedRefs = {}, unresolvedRefs = {};\n  var resolutionTable = []; // store objects for dereferencing\n\n  spec.definitions = spec.definitions || {};\n  // definitions\n  for (name in spec.definitions) {\n    var definition = spec.definitions[name];\n    if(definition.$ref) {\n      this.resolveInline(root, spec, definition, resolutionTable, unresolvedRefs, definition);\n    }\n    else {\n      for (propertyName in definition.properties) {\n        property = definition.properties[propertyName];\n        if (_.isArray(property.allOf)) {\n          this.processAllOf(root, name, property, resolutionTable, unresolvedRefs, spec);\n        }\n        else {\n          this.resolveTo(root, property, resolutionTable, '/definitions');\n        }\n      }\n\n      if (definition.allOf) {\n        this.processAllOf(root, name, definition, resolutionTable, unresolvedRefs, spec);\n      }\n    }\n  }\n\n  // shared parameters\n  spec.parameters = spec.parameters || {};\n  for(name in spec.parameters) {\n    parameter = spec.parameters[name];\n    if (parameter.in === 'body' && parameter.schema) {\n      if(_.isArray(parameter.schema.allOf)) {\n        // move to a definition\n        modelName = 'inline_model';\n        var _name = modelName;\n        done = false; counter = 0;\n        while(!done) {\n          if(typeof spec.definitions[_name] === 'undefined') {\n            done = true;\n            break;\n          }\n          _name = modelName + '_' + counter;\n          counter ++;\n        }\n        spec.definitions[_name] = { allOf: parameter.schema.allOf };\n        delete parameter.schema.allOf;\n        parameter.schema.$ref = '#/definitions/' + _name;\n        this.processAllOf(root, _name, spec.definitions[_name], resolutionTable, unresolvedRefs, spec);\n      }\n      else {\n        this.resolveTo(root, parameter.schema, resolutionTable, location);\n      }\n    }\n\n    if (parameter.$ref) {\n      // parameter reference\n      this.resolveInline(root, spec, parameter, resolutionTable, unresolvedRefs, parameter.$ref);\n    }\n  }\n\n  // operations\n  for (name in spec.paths) {\n    var method, operation, responseCode;\n    path = spec.paths[name];\n\n    if(typeof path === 'object') {\n      for (method in path) {\n        // operation reference\n        if (method === '$ref') {\n          // location = path[method];\n          location = '/paths' + name;\n          this.resolveInline(root, spec, path, resolutionTable, unresolvedRefs, location);\n        }\n        else {\n          operation = path[method];\n          var sharedParameters = path.parameters || [];\n          var parameters = operation.parameters || [];\n\n          sharedParameters.forEach(function(parameter) {\n            parameters.unshift(parameter);\n          });\n\n          if (method !== 'parameters' && _.isObject(operation)) {\n            operation.parameters = operation.parameters || parameters;\n          }\n\n          for (i in parameters) {\n            parameter = parameters[i];\n            location = '/paths' + name + '/' + method + '/parameters';\n\n            if (parameter.in === 'body' && parameter.schema) {\n              if (_.isArray(parameter.schema.allOf)) {\n                // move to a definition\n                modelName = 'inline_model';\n                name = modelName;\n                done = false;\n                counter = 0;\n                while (!done) {\n                  if (typeof spec.definitions[name] === 'undefined') {\n                    done = true;\n                    break;\n                  }\n                  name = modelName + '_' + counter;\n                  counter++;\n                }\n                spec.definitions[name] = {allOf: parameter.schema.allOf};\n                delete parameter.schema.allOf;\n                parameter.schema.$ref = '#/definitions/' + name;\n                this.processAllOf(root, name, spec.definitions[name], resolutionTable, unresolvedRefs, spec);\n              }\n              else {\n                this.resolveTo(root, parameter.schema, resolutionTable, location);\n              }\n            }\n\n            if (parameter.$ref) {\n              // parameter reference\n              this.resolveInline(root, spec, parameter, resolutionTable, unresolvedRefs, parameter.$ref);\n            }\n          }\n\n          for (responseCode in operation.responses) {\n            var response = operation.responses[responseCode];\n            location = '/paths' + name + '/' + method + '/responses/' + responseCode;\n\n            if (_.isObject(response)) {\n              if (response.$ref) {\n                // response reference\n                this.resolveInline(root, spec, response, resolutionTable, unresolvedRefs, location);\n              }\n              if (response.schema) {\n                var responseObj = response;\n                if (_.isArray(responseObj.schema.allOf)) {\n                  // move to a definition\n                  modelName = 'inline_model';\n                  name = modelName;\n                  done = false;\n                  counter = 0;\n                  while (!done) {\n                    if (typeof spec.definitions[name] === 'undefined') {\n                      done = true;\n                      break;\n                    }\n                    name = modelName + '_' + counter;\n                    counter++;\n                  }\n                  spec.definitions[name] = {allOf: responseObj.schema.allOf};\n                  delete responseObj.schema.allOf;\n                  delete responseObj.schema.type;\n                  responseObj.schema.$ref = '#/definitions/' + name;\n                  this.processAllOf(root, name, spec.definitions[name], resolutionTable, unresolvedRefs, spec);\n                }\n                else if ('array' === responseObj.schema.type) {\n                  if (responseObj.schema.items && responseObj.schema.items.$ref) {\n                    // response reference\n                    this.resolveInline(root, spec, responseObj.schema.items, resolutionTable, unresolvedRefs, location);\n                  }\n                }\n                else {\n                  this.resolveTo(root, response.schema, resolutionTable, location);\n                }\n              }\n            }\n          }\n        }\n      }\n      // clear them out to avoid multiple resolutions\n      path.parameters = [];\n    }\n  }\n\n  var expectedCalls = 0, toResolve = [];\n  // if the root is same as obj[i].root we can resolve locally\n  var all = resolutionTable;\n\n  var parts;\n  for(i = 0; i < all.length; i++) {\n    var a = all[i];\n    if(root === a.root) {\n      if(a.resolveAs === 'ref') {\n        // resolve any path walking\n        var joined = ((a.root || '') + '/' + a.key).split('/');\n        var normalized = [];\n        var url = '';\n        var k;\n\n        if(a.key.indexOf('../') >= 0) {\n          for(var j = 0; j < joined.length; j++) {\n            if(joined[j] === '..') {\n              normalized = normalized.slice(0, normalized.length-1);\n            }\n            else {\n              normalized.push(joined[j]);\n            }\n          }\n          for(k = 0; k < normalized.length; k ++) {\n            if(k > 0) {\n              url += '/';\n            }\n            url += normalized[k];\n          }\n          // we now have to remote resolve this because the path has changed\n          a.root = url;\n          toResolve.push(a);\n        }\n        else {\n          parts = a.key.split('#');\n          if(parts.length === 2) {\n            if(parts[0].indexOf('http:') === 0 || parts[0].indexOf('https:') === 0) {\n              a.root = parts[0];\n            }\n            location = parts[1].split('/');\n            var r;\n            var s = spec;\n            for(k = 0; k < location.length; k++) {\n              var part = location[k];\n              if(part !== '') {\n                s = s[part];\n                if(typeof s !== 'undefined') {\n                  r = s;\n                }\n                else {\n                  r = null;\n                  break;\n                }\n              }\n            }\n            if(r === null) {\n              // must resolve this too\n              toResolve.push(a);\n            }\n          }\n        }\n      }\n      else {\n        if (a.resolveAs === 'inline') {\n          if(a.key && a.key.indexOf('#') === -1 && a.key.charAt(0) !== '/') {\n            // handle relative schema\n            parts = a.root.split('/');\n            location = '';\n            for(i = 0; i < parts.length - 1; i++) {\n              location += parts[i] + '/';\n            }\n            location += a.key;\n            a.root = location;\n            a.location = '';\n          }\n          toResolve.push(a);\n        }\n      }\n    }\n    else {\n      toResolve.push(a);\n    }\n  }\n  expectedCalls = toResolve.length;\n\n  // resolve anything that is local\n\n  var lock = {};\n  for(var ii = 0; ii < toResolve.length; ii++) {\n    (function(item, spec, self, lock, ii) {\n      if(!item.root || item.root === root) {\n        // local resolve\n        self.resolveItem(spec, _root, resolutionTable, resolvedRefs, unresolvedRefs, item);\n        processedCalls += 1;\n\n        if(processedCalls === expectedCalls) {\n          self.finish(spec, root, resolutionTable, resolvedRefs, unresolvedRefs, callback, true);\n        }\n      }\n      else if(self.failedUrls.indexOf(item.root) === -1) {\n        var obj = {\n          useJQuery: false,  // TODO\n          url: item.root,\n          method: 'get',\n          headers: {\n            accept: self.scope.swaggerRequestHeaders || 'application/json'\n          },\n          on: {\n            error: function (error) {\n              processedCalls += 1;\n              console.log('failed url: ' + obj.url);\n              self.failedUrls.push(obj.url);\n              if (lock) {\n                delete lock[item.root];\n              }\n              unresolvedRefs[item.key] = {\n                root: item.root,\n                location: item.location\n              };\n\n              if (processedCalls === expectedCalls) {\n                self.finish(spec, _root, resolutionTable, resolvedRefs, unresolvedRefs, callback);\n              }\n            },  // jshint ignore:line\n            response: function (response) {\n              var swagger = response.obj;\n              if (lock) {\n                delete lock[item.root];\n              }\n              if (self.resolverCache) {\n                self.resolverCache[item.root] = swagger;\n              }\n              self.resolveItem(swagger, item.root, resolutionTable, resolvedRefs, unresolvedRefs, item);\n              processedCalls += 1;\n\n              if (processedCalls === expectedCalls) {\n                self.finish(spec, _root, resolutionTable, resolvedRefs, unresolvedRefs, callback);\n              }\n            }\n          } // jshint ignore:line\n        };\n\n        // apply timeout only when specified\n        if (scope && scope.fetchSpecTimeout) {\n          obj.timeout = scope.fetchSpecTimeout;\n        }\n\n        if (scope && scope.clientAuthorizations) {\n          scope.clientAuthorizations.apply(obj);\n        }\n\n        (function waitForUnlock() {\n          setTimeout(function() {\n            if (lock[obj.url]) {\n              waitForUnlock();\n            }\n            else {\n              var cached = self.resolverCache[obj.url];\n              if (_.isObject(cached)) {\n                obj.on.response({obj: cached});\n              }\n              else {\n                lock[obj.url] = true;\n                new SwaggerHttp().execute(obj, opts);\n              }\n            }\n          }, 0);\n        })();\n      }\n\n      else {\n        processedCalls += 1;\n        unresolvedRefs[item.key] = {\n          root: item.root,\n          location: item.location\n        };\n        if (processedCalls === expectedCalls) {\n          self.finish(spec, _root, resolutionTable, resolvedRefs, unresolvedRefs, callback);\n        }\n      }\n    }(toResolve[ii], spec, this, lock, ii));\n  }\n\n  if (Object.keys(toResolve).length === 0) {\n    this.finish(spec, _root, resolutionTable, resolvedRefs, unresolvedRefs, callback);\n  }\n};\n\nResolver.prototype.resolveItem = function(spec, root, resolutionTable, resolvedRefs, unresolvedRefs, item) {\n  var path = item.location;\n  var location = spec, parts = path.split('/');\n  if(path !== '') {\n    for (var j = 0; j < parts.length; j++) {\n      var segment = parts[j];\n      if (segment.indexOf('~1') !== -1) {\n        segment = parts[j].replace(/~0/g, '~').replace(/~1/g, '/');\n        if (segment.charAt(0) !== '/') {\n          segment = '/' + segment;\n        }\n      }\n      if (typeof location === 'undefined' || location === null) {\n        break;\n      }\n      if (segment === '' && j === (parts.length - 1) && parts.length > 1) {\n        location = null;\n        break;\n      }\n      if (segment.length > 0) {\n        location = location[segment];\n      }\n    }\n  }\n  var resolved = item.key;\n  parts = item.key.split('/');\n  var resolvedName = parts[parts.length-1];\n\n  if(resolvedName.indexOf('#') >= 0) {\n    resolvedName = resolvedName.split('#')[1];\n  }\n\n  if (location !== null && typeof location !== 'undefined') {\n    resolvedRefs[resolved] = {\n      name: resolvedName,\n      obj: location,\n      key: item.key,\n      root: item.root\n    };\n  } else {\n    unresolvedRefs[resolved] = {\n      root: item.root,\n      location: item.location\n    };\n  }\n};\n\nResolver.prototype.finish = function (spec, root, resolutionTable, resolvedRefs, unresolvedRefs, callback, localResolve) {\n  // walk resolution table and replace with resolved refs\n  var ref, abs;\n  for (ref in resolutionTable) {\n    var item = resolutionTable[ref];\n\n    var key = item.key;\n    var resolvedTo = resolvedRefs[key];\n    if (resolvedTo) {\n      spec.definitions = spec.definitions || {};\n      if (item.resolveAs === 'ref') {\n        if (localResolve !== true) {\n          // don't retain root for local definitions\n          for (key in resolvedTo.obj) {\n            abs = this.retainRoot(key, resolvedTo.obj[key], item.root);\n            resolvedTo.obj[key] = abs;\n          }\n        }\n        spec.definitions[resolvedTo.name] = resolvedTo.obj;\n        item.obj.$ref = '#/definitions/' + resolvedTo.name;\n      } else if (item.resolveAs === 'inline') {\n        var targetObj = item.obj;\n        targetObj['x-resolved-from'] = [ item.key ];\n        delete targetObj.$ref;\n\n        for (key in resolvedTo.obj) {\n          abs = resolvedTo.obj[key];\n\n          if (localResolve !== true) {\n            // don't retain root for local definitions\n            abs = this.retainRoot(key, resolvedTo.obj[key], item.root);\n          }\n          targetObj[key] = abs;\n        }\n      }\n    }\n  }\n  var existingUnresolved = this.countUnresolvedRefs(spec);\n\n  if(existingUnresolved === 0 || this.iteration > 5) {\n    this.resolveAllOf(spec.definitions);\n    this.resolverCache = null;\n    callback.call(this.scope, spec, unresolvedRefs);\n  }\n  else {\n    this.iteration += 1;\n    this.resolve(spec, root, callback, this.scope);\n  }\n};\n\nResolver.prototype.countUnresolvedRefs = function(spec) {\n  var i;\n  var refs = this.getRefs(spec);\n  var keys = [];\n  var unresolvedKeys = [];\n  for(i in refs) {\n    if(i.indexOf('#') === 0) {\n      keys.push(i.substring(1));\n    }\n    else {\n      unresolvedKeys.push(i);\n    }\n  }\n\n  // verify possible keys\n  for (i = 0; i < keys.length; i++) {\n    var part = keys[i];\n    var parts = part.split('/');\n    var obj = spec;\n\n    for (var k = 0; k < parts.length; k++) {\n      var key = parts[k];\n      if(key !== '') {\n        obj = obj[key];\n        if(typeof obj === 'undefined') {\n          unresolvedKeys.push(part);\n          break;\n        }\n      }\n    }\n  }\n  return unresolvedKeys.length;\n};\n\nResolver.prototype.getRefs = function(spec, obj) {\n  obj = obj || spec;\n  var output = {};\n  for(var key in obj) {\n    if (!obj.hasOwnProperty(key)) {\n      continue;\n    }\n    var item = obj[key];\n    if(key === '$ref' && typeof item === 'string') {\n      output[item] = null;\n    }\n    else if(_.isObject(item)) {\n      var o = this.getRefs(item);\n      for(var k in o) {\n        output[k] = null;\n      }\n    }\n  }\n  return output;\n};\n\nfunction splitUrl(url) {\n  var result = {};\n  var proto = /[a-z]+:\\/\\//i.exec(url);\n  if (proto) {\n    result.proto = proto[0].slice(0, -3);\n    url = url.slice(result.proto.length + 1);\n  }\n  if (url.slice(0, 2) === '//') {\n    result.domain = url.slice(2).split('/')[0];\n    url = url.slice(2 + result.domain.length);\n  }\n  var p = url.split('#');\n  if (p[0].length) {\n    result.path = p[0];\n  }\n  if (p.length > 1) {\n    result.fragment = p.slice(1).join('#');\n  }\n  return result;\n}\n\nfunction unsplitUrl(url) {\n  var result = url.path;\n  if (result === undefined) {\n    result = '';\n  }\n  if (url.fragment !== undefined) {\n    result += '#' + url.fragment;\n  }\n  if (url.domain !== undefined) {\n    if (result.slice(0, 1) === '/') {\n      result = result.slice(1);\n    }\n    result = '//' + url.domain + '/' + result;\n    if (url.proto !== undefined) {\n      result = url.proto + ':' + result;\n    }\n  }\n  return result;\n}\n\nfunction joinUrl(base, rel) {\n  var relsp = splitUrl(rel);\n  if (relsp.domain !== undefined) {\n    return rel;\n  }\n  var result = splitUrl(base);\n  if (relsp.path === undefined) {\n    // change only fragment part\n    result.fragment = relsp.fragment;\n  } else if (relsp.path.slice(0, 1) === '/') {\n    // relative to domain\n    result.path = relsp.path;\n    result.fragment = relsp.fragment;\n  } else {\n    // relative to path\n    var path = result.path === undefined ? [] : result.path.split('/');\n    var relpath = relsp.path.split('/');\n    if (path.length) {\n      path.pop();\n    }\n    while (relpath[0] === '..' || relpath[0] === '.') {\n      if (relpath[0] === '..') {\n        path.pop();\n      }\n      relpath.shift();\n    }\n    result.path = path.concat(relpath).join('/');\n    result.fragment = relsp.fragment;\n  }\n  return unsplitUrl(result);\n}\n\nResolver.prototype.retainRoot = function(origKey, obj, root) {\n  // walk object and look for relative $refs\n  if(_.isObject(obj)) {\n    for(var key in obj) {\n      var item = obj[key];\n      if (key === '$ref' && typeof item === 'string') {\n        obj[key] = joinUrl(root, item);\n      }\n      else if (_.isObject(item)) {\n        this.retainRoot(key, item, root);\n      }\n    }\n  }\n  else if(_.isString(obj) && origKey === '$ref') {\n    obj = joinUrl(root, obj);\n  }\n  return obj;\n};\n\n/**\n * immediately in-lines local refs, queues remote refs\n * for inline resolution\n */\nResolver.prototype.resolveInline = function (root, spec, property, resolutionTable, unresolvedRefs, location) {\n  var key = property.$ref, ref = property.$ref, i, p, p2, rs;\n  var rootTrimmed = false;\n\n  root = root || ''; // Guard against .split. @fehguy, you'll need to check if this logic fits\n  // More imporantly is how do we gracefully handle relative urls, when provided just a 'spec', not a 'url' ?\n\n  if (ref) {\n    if(ref.indexOf('../') === 0) {\n      // reset root\n      p = ref.split('../');\n      p2 = root.split('/');\n      ref = '';\n      for(i = 0; i < p.length; i++) {\n        if(p[i] === '') {\n          p2 = p2.slice(0, p2.length-1);\n        }\n        else {\n          ref += p[i];\n        }\n      }\n      root = '';\n      for(i = 0; i < p2.length - 1; i++) {\n        if(i > 0) { root += '/'; }\n        root += p2[i];\n      }\n      rootTrimmed = true;\n    }\n    if(ref.indexOf('#') >= 0) {\n      if(ref.indexOf('/') === 0) {\n        rs = ref.split('#');\n        p  = root.split('//');\n        p2 = p[1].split('/');\n        root = p[0] + '//' + p2[0] + rs[0];\n        location = rs[1];\n      }\n      else {\n        rs = ref.split('#');\n        if(rs[0] !== '') {\n          p2 = root.split('/');\n          p2 = p2.slice(0, p2.length - 1);\n          if(!rootTrimmed) {\n            root = '';\n            for (var k = 0; k < p2.length; k++) {\n              if(k > 0) { root += '/'; }\n              root += p2[k];\n            }\n          }\n          root += '/' + ref.split('#')[0];\n        }\n        location = rs[1];\n      }\n    }\n    if (ref.indexOf('http:') === 0 || ref.indexOf('https:') === 0) {\n      if(ref.indexOf('#') >= 0) {\n        root = ref.split('#')[0];\n        location = ref.split('#')[1];\n      }\n      else {\n        root = ref;\n        location = '';\n      }\n      resolutionTable.push({obj: property, resolveAs: 'inline', root: root, key: key, location: location});\n    } else if (ref.indexOf('#') === 0) {\n      location = ref.split('#')[1];\n      resolutionTable.push({obj: property, resolveAs: 'inline', root: root, key: key, location: location});\n    } else if (ref.indexOf('/') === 0 && ref.indexOf('#') === -1) {\n      location = ref;\n      var matches = root.match(/^https?\\:\\/\\/([^\\/?#]+)(?:[\\/?#]|$)/i);\n      if(matches) {\n        root = matches[0] + ref.substring(1);\n        location = '';\n      }\n      resolutionTable.push({obj: property, resolveAs: 'inline', root: root, key: key, location: location});\n    }\n    else {\n      resolutionTable.push({obj: property, resolveAs: 'inline', root: root, key: key, location: location});\n    }\n  }\n  else if (property.type === 'array') {\n    this.resolveTo(root, property.items, resolutionTable, location);\n  }\n};\n\nResolver.prototype.resolveTo = function (root, property, resolutionTable, location) {\n  var sp, i;\n  var ref = property.$ref;\n  var lroot = root;\n  if ((typeof ref !== 'undefined') && (ref !== null)) {\n    if(ref.indexOf('#') >= 0) {\n      var parts = ref.split('#');\n\n      // #/definitions/foo\n      // foo.json#/bar\n      if(parts[0] && ref.indexOf('/') === 0) {\n\n      }\n      else if(parts[0] && (parts[0].indexOf('http:') === 0 || parts[0].indexOf('https:') === 0)) {\n        lroot = parts[0];\n        ref = parts[1];\n      }\n      else if(parts[0] && parts[0].length > 0) {\n        // relative file\n        sp = root.split('/');\n        lroot = '';\n        for(i = 0; i < sp.length - 1; i++) {\n          lroot += sp[i] + '/';\n        }\n        lroot += parts[0];\n      }\n      else {\n\n      }\n\n      location = parts[1];\n    }\n    else if (ref.indexOf('http:') === 0 || ref.indexOf('https:') === 0) {\n      lroot = ref;\n      location = '';\n    }\n    else {\n      // relative file\n      sp = root.split('/');\n      lroot = '';\n      for(i = 0; i < sp.length - 1; i++) {\n        lroot += sp[i] + '/';\n      }\n      lroot += ref;\n      location = '';\n    }\n    resolutionTable.push({\n      obj: property, resolveAs: 'ref', root: lroot, key: ref, location: location\n    });\n  } else if (property.type === 'array') {\n    var items = property.items;\n    this.resolveTo(root, items, resolutionTable, location);\n  } else {\n    if(property && (property.properties || property.additionalProperties)) {\n      var name = this.uniqueName('inline_model');\n      if (property.title) {\n        name = this.uniqueName(property.title);\n      }\n      delete property.title;\n      this.spec.definitions[name] = _.cloneDeep(property);\n      property.$ref = '#/definitions/' + name;\n      delete property.type;\n      delete property.properties;\n    }\n  }\n};\n\nResolver.prototype.uniqueName = function(base) {\n  var name = base;\n  var count = 0;\n  while(true) {\n    if(!_.isObject(this.spec.definitions[name])) {\n      return name;\n    }\n    name = base + '_' + count;\n    count++;\n  }\n};\n\nResolver.prototype.resolveAllOf = function(spec, obj, depth) {\n  depth = depth || 0;\n  obj = obj || spec;\n  var name;\n  for(var key in obj) {\n    if (!obj.hasOwnProperty(key)) {\n      continue;\n    }\n    var item = obj[key];\n    if(item === null) {\n      throw new TypeError('Swagger 2.0 does not support null types (' + obj + ').  See https://github.com/swagger-api/swagger-spec/issues/229.');\n    }\n    if(typeof item === 'object') {\n      this.resolveAllOf(spec, item, depth + 1);\n    }\n    if(item && typeof item.allOf !== 'undefined') {\n      var allOf = item.allOf;\n      if(_.isArray(allOf)) {\n        var output = _.cloneDeep(item);\n        delete output.allOf;\n\n        output['x-composed'] = true;\n        if (typeof item['x-resolved-from'] !== 'undefined') {\n          output['x-resolved-from'] = item['x-resolved-from'];\n        }\n\n        for(var i = 0; i < allOf.length; i++) {\n          var component = allOf[i];\n          var source = 'self';\n          if(typeof component['x-resolved-from'] !== 'undefined') {\n            source = component['x-resolved-from'][0];\n          }\n\n          for(var part in component) {\n            if(!output.hasOwnProperty(part)) {\n              output[part] = _.cloneDeep(component[part]);\n              if(part === 'properties') {\n                for(name in output[part]) {\n                  output[part][name]['x-resolved-from'] = source;\n                }\n              }\n            }\n            else {\n              if(part === 'properties') {\n                var properties = component[part];\n                for(name in properties) {\n                  output.properties[name] = _.cloneDeep(properties[name]);\n                  var resolvedFrom = properties[name]['x-resolved-from'];\n                  if (typeof resolvedFrom === 'undefined' || resolvedFrom === 'self') {\n                    resolvedFrom = source;\n                  }\n                  output.properties[name]['x-resolved-from'] = resolvedFrom;\n                }\n              }\n              else if(part === 'required') {\n                // merge & dedup the required array\n                var a = output.required.concat(component[part]);\n                for(var k = 0; k < a.length; ++k) {\n                  for(var j = k + 1; j < a.length; ++j) {\n                    if(a[k] === a[j]) { a.splice(j--, 1); }\n                  }\n                }\n                output.required = a;\n              }\n              else if(part === 'x-resolved-from') {\n                output['x-resolved-from'].push(source);\n              }\n              else {\n                // TODO: need to merge this property\n                // console.log('what to do with ' + part)\n              }\n            }\n          }\n        }\n        obj[key] = output;\n      }\n    }\n  }\n};\n\n},{\"./http\":5,\"lodash-compat/lang/cloneDeep\":138,\"lodash-compat/lang/isArray\":140,\"lodash-compat/lang/isObject\":144,\"lodash-compat/lang/isString\":146}],7:[function(require,module,exports){\n'use strict';\n\nvar Helpers = require('./helpers');\n\nvar _ = {\n  isPlainObject: require('lodash-compat/lang/isPlainObject'),\n  isUndefined: require('lodash-compat/lang/isUndefined'),\n  isArray: require('lodash-compat/lang/isArray'),\n  isObject: require('lodash-compat/lang/isObject'),\n  isEmpty: require('lodash-compat/lang/isEmpty'),\n  map: require('lodash-compat/collection/map'),\n  indexOf: require('lodash-compat/array/indexOf'),\n  cloneDeep: require('lodash-compat/lang/cloneDeep'),\n  keys: require('lodash-compat/object/keys'),\n  forEach: require('lodash-compat/collection/forEach')\n};\n\nvar optionHtml = module.exports.optionHtml = function  (label, value) {\n  return '<tr><td class=\"optionName\">' + label + ':</td><td>' + value + '</td></tr>';\n};\n\nmodule.exports.typeFromJsonSchema = function (type, format) {\n  var str;\n\n  if (type === 'integer' && format === 'int32') {\n    str = 'integer';\n  } else if (type === 'integer' && format === 'int64') {\n    str = 'long';\n  } else if (type === 'integer' && typeof format === 'undefined') {\n    str = 'long';\n  } else if (type === 'string' && format === 'date-time') {\n    str = 'date-time';\n  } else if (type === 'string' && format === 'date') {\n    str = 'date';\n  } else if (type === 'number' && format === 'float') {\n    str = 'float';\n  } else if (type === 'number' && format === 'double') {\n    str = 'double';\n  } else if (type === 'number' && typeof format === 'undefined') {\n    str = 'double';\n  } else if (type === 'boolean') {\n    str = 'boolean';\n  } else if (type === 'string') {\n    str = 'string';\n  }\n\n  return str;\n};\n\nvar getStringSignature = module.exports.getStringSignature = function (obj, baseComponent) {\n  var str = '';\n\n  if (typeof obj.$ref !== 'undefined') {\n    str += Helpers.simpleRef(obj.$ref);\n  } else if (typeof obj.type === 'undefined') {\n    str += 'object';\n  } else if (obj.type === 'array') {\n    if (baseComponent) {\n      str += getStringSignature((obj.items || obj.$ref || {}));\n    } else {\n      str += 'Array[';\n      str += getStringSignature((obj.items || obj.$ref || {}));\n      str += ']';\n    }\n  } else if (obj.type === 'integer' && obj.format === 'int32') {\n    str += 'integer';\n  } else if (obj.type === 'integer' && obj.format === 'int64') {\n    str += 'long';\n  } else if (obj.type === 'integer' && typeof obj.format === 'undefined') {\n    str += 'long';\n  } else if (obj.type === 'string' && obj.format === 'date-time') {\n    str += 'date-time';\n  } else if (obj.type === 'string' && obj.format === 'date') {\n    str += 'date';\n  } else if (obj.type === 'string' && typeof obj.format === 'undefined') {\n    str += 'string';\n  } else if (obj.type === 'number' && obj.format === 'float') {\n    str += 'float';\n  } else if (obj.type === 'number' && obj.format === 'double') {\n    str += 'double';\n  } else if (obj.type === 'number' && typeof obj.format === 'undefined') {\n    str += 'double';\n  } else if (obj.type === 'boolean') {\n    str += 'boolean';\n  } else if (obj.$ref) {\n    str += Helpers.simpleRef(obj.$ref);\n  } else {\n    str += obj.type;\n  }\n\n  return str;\n};\n\nvar schemaToJSON = module.exports.schemaToJSON = function (schema, models, modelsToIgnore, modelPropertyMacro) {\n  // Resolve the schema (Handle nested schemas)\n  schema = Helpers.resolveSchema(schema);\n\n  if(typeof modelPropertyMacro !== 'function') {\n    modelPropertyMacro = function(prop){\n      return (prop || {}).default;\n    };\n  }\n\n  modelsToIgnore= modelsToIgnore || {};\n\n  var type = schema.type || 'object';\n  var format = schema.format;\n  var model;\n  var output;\n\n  if (!_.isUndefined(schema.example)) {\n    output = schema.example;\n  } else if (_.isUndefined(schema.items) && _.isArray(schema.enum)) {\n    output = schema.enum[0];\n  }\n\n  if (_.isUndefined(output)) {\n    if (schema.$ref) {\n      model = models[Helpers.simpleRef(schema.$ref)];\n\n      if (!_.isUndefined(model)) {\n        if (_.isUndefined(modelsToIgnore[model.name])) {\n          modelsToIgnore[model.name] = model;\n          output = schemaToJSON(model.definition, models, modelsToIgnore, modelPropertyMacro);\n          delete modelsToIgnore[model.name];\n        } else {\n          if (model.type === 'array') {\n            output = [];\n          } else {\n            output = {};\n          }\n        }\n      }\n    } else if (!_.isUndefined(schema.default)) {\n      output = schema.default;\n    } else if (type === 'string') {\n      if (format === 'date-time') {\n        output = new Date().toISOString();\n      } else if (format === 'date') {\n        output = new Date().toISOString().split('T')[0];\n      } else {\n        output = 'string';\n      }\n    } else if (type === 'integer') {\n      output = 0;\n    } else if (type === 'number') {\n      output = 0.0;\n    } else if (type === 'boolean') {\n      output = true;\n    } else if (type === 'object') {\n      output = {};\n\n      _.forEach(schema.properties, function (property, name) {\n        var cProperty = _.cloneDeep(property);\n\n        // Allow macro to set the default value\n        cProperty.default = modelPropertyMacro(property);\n\n        output[name] = schemaToJSON(cProperty, models, modelsToIgnore, modelPropertyMacro);\n      });\n    } else if (type === 'array') {\n      output = [];\n\n      if (_.isArray(schema.items)) {\n        _.forEach(schema.items, function (item) {\n          output.push(schemaToJSON(item, models, modelsToIgnore, modelPropertyMacro));\n        });\n      } else if (_.isPlainObject(schema.items)) {\n        output.push(schemaToJSON(schema.items, models, modelsToIgnore, modelPropertyMacro));\n      } else if (_.isUndefined(schema.items)) {\n        output.push({});\n      } else {\n        Helpers.log('Array type\\'s \\'items\\' property is not an array or an object, cannot process');\n      }\n    }\n  }\n\n  return output;\n};\n\nmodule.exports.schemaToHTML =function (name, schema, models, modelPropertyMacro) {\n  var strongOpen = '<span class=\"strong\">';\n  var strongClose = '</span>';\n\n  // Allow for ignoring the 'name' argument.... shifting the rest\n  if(_.isObject(arguments[0])) {\n    name = void 0;\n    schema = arguments[0];\n    models = arguments[1];\n    modelPropertyMacro = arguments[2];\n  }\n\n  models = models || {};\n\n  // Resolve the schema (Handle nested schemas)\n  schema = Helpers.resolveSchema(schema);\n\n  // Return for empty object\n  if(_.isEmpty(schema)) {\n    return strongOpen + 'Empty' + strongClose;\n  }\n\n  // Dereference $ref from 'models'\n  if(typeof schema.$ref === 'string') {\n    name = Helpers.simpleRef(schema.$ref);\n    schema = models[name];\n    if(typeof schema === 'undefined')\n    {\n      return strongOpen + name + ' is not defined!' + strongClose;\n    }\n  }\n\n  if(typeof name !== 'string') {\n    name = schema.title || 'Inline Model';\n  }\n\n  // If we are a Model object... adjust accordingly\n  if(schema.definition) {\n    schema = schema.definition;\n  }\n\n  if(typeof modelPropertyMacro !== 'function') {\n    modelPropertyMacro = function(prop){\n      return (prop || {}).default;\n    };\n  }\n\n  var references = {};\n  var seenModels = [];\n  var inlineModels = 0;\n\n\n\n  // Generate current HTML\n  var html = processModel(schema, name);\n\n  // Generate references HTML\n  while (_.keys(references).length > 0) {\n    /* jshint ignore:start */\n    _.forEach(references, function (schema, name) {\n      var seenModel = _.indexOf(seenModels, name) > -1;\n\n      delete references[name];\n\n      if (!seenModel) {\n        seenModels.push(name);\n\n        html += '<br />' + processModel(schema, name);\n      }\n    });\n    /* jshint ignore:end */\n  }\n\n  return html;\n\n  /////////////////////////////////\n\n  function addReference(schema, name, skipRef) {\n    var modelName = name;\n    var model;\n\n    if (schema.$ref) {\n      modelName = schema.title || Helpers.simpleRef(schema.$ref);\n      model = models[modelName];\n    } else if (_.isUndefined(name)) {\n      modelName = schema.title || 'Inline Model ' + (++inlineModels);\n      model = {definition: schema};\n    }\n\n    if (skipRef !== true) {\n      references[modelName] = _.isUndefined(model) ? {} : model.definition;\n    }\n\n    return modelName;\n  }\n\n  function primitiveToHTML(schema) {\n    var html = '<span class=\"propType\">';\n    var type = schema.type || 'object';\n\n    if (schema.$ref) {\n      html += addReference(schema, Helpers.simpleRef(schema.$ref));\n    } else if (type === 'object') {\n      if (!_.isUndefined(schema.properties)) {\n        html += addReference(schema);\n      } else {\n        html += 'object';\n      }\n    } else if (type === 'array') {\n      html += 'Array[';\n\n      if (_.isArray(schema.items)) {\n        html += _.map(schema.items, addReference).join(',');\n      } else if (_.isPlainObject(schema.items)) {\n        if (_.isUndefined(schema.items.$ref)) {\n          if (!_.isUndefined(schema.items.type) && _.indexOf(['array', 'object'], schema.items.type) === -1) {\n            html += schema.items.type;\n          } else {\n            html += addReference(schema.items);\n          }\n        } else {\n          html += addReference(schema.items, Helpers.simpleRef(schema.items.$ref));\n        }\n      } else {\n        Helpers.log('Array type\\'s \\'items\\' schema is not an array or an object, cannot process');\n        html += 'object';\n      }\n\n      html += ']';\n    } else {\n      html += schema.type;\n    }\n\n    html += '</span>';\n\n    return html;\n  }\n\n  function primitiveToOptionsHTML(schema, html) {\n    var options = '';\n    var type = schema.type || 'object';\n    var isArray = type === 'array';\n\n    if (isArray) {\n      if (_.isPlainObject(schema.items) && !_.isUndefined(schema.items.type)) {\n        type = schema.items.type;\n      } else {\n        type = 'object';\n      }\n    }\n\n    if (!_.isUndefined(schema.default)) {\n      options += optionHtml('Default', schema.default);\n    }\n\n    switch (type) {\n    case 'string':\n      if (schema.minLength) {\n        options += optionHtml('Min. Length', schema.minLength);\n      }\n\n      if (schema.maxLength) {\n        options += optionHtml('Max. Length', schema.maxLength);\n      }\n\n      if (schema.pattern) {\n        options += optionHtml('Reg. Exp.', schema.pattern);\n      }\n      break;\n    case 'integer':\n    case 'number':\n      if (schema.minimum) {\n        options += optionHtml('Min. Value', schema.minimum);\n      }\n\n      if (schema.exclusiveMinimum) {\n        options += optionHtml('Exclusive Min.', 'true');\n      }\n\n      if (schema.maximum) {\n        options += optionHtml('Max. Value', schema.maximum);\n      }\n\n      if (schema.exclusiveMaximum) {\n        options += optionHtml('Exclusive Max.', 'true');\n      }\n\n      if (schema.multipleOf) {\n        options += optionHtml('Multiple Of', schema.multipleOf);\n      }\n\n      break;\n    }\n\n    if (isArray) {\n      if (schema.minItems) {\n        options += optionHtml('Min. Items', schema.minItems);\n      }\n\n      if (schema.maxItems) {\n        options += optionHtml('Max. Items', schema.maxItems);\n      }\n\n      if (schema.uniqueItems) {\n        options += optionHtml('Unique Items', 'true');\n      }\n\n      if (schema.collectionFormat) {\n        options += optionHtml('Coll. Format', schema.collectionFormat);\n      }\n    }\n\n    if (_.isUndefined(schema.items)) {\n      if (_.isArray(schema.enum)) {\n        var enumString;\n\n        if (type === 'number' || type === 'integer') {\n          enumString = schema.enum.join(', ');\n        } else {\n          enumString = '\"' + schema.enum.join('\", \"') + '\"';\n        }\n\n        options += optionHtml('Enum', enumString);\n      }\n    }\n\n    if (options.length > 0) {\n      html = '<span class=\"propWrap\">' + html + '<table class=\"optionsWrapper\"><tr><th colspan=\"2\">' + type + '</th></tr>' + options + '</table></span>';\n    }\n\n    return html;\n  }\n\n  function processModel(schema, name) {\n    var type = schema.type || 'object';\n    var isArray = schema.type === 'array';\n    var html = strongOpen + name + ' ' + (isArray ? '[' : '{') + strongClose;\n\n    if (name) {\n      seenModels.push(name);\n    }\n\n    if (isArray) {\n      if (_.isArray(schema.items)) {\n        html += '<div>' + _.map(schema.items, function (item) {\n          var type = item.type || 'object';\n\n          if (_.isUndefined(item.$ref)) {\n            if (_.indexOf(['array', 'object'], type) > -1) {\n              if (type === 'object' && _.isUndefined(item.properties)) {\n                return 'object';\n              } else {\n                return addReference(item);\n              }\n            } else {\n              return primitiveToOptionsHTML(item, type);\n            }\n          } else {\n            return addReference(item, Helpers.simpleRef(item.$ref));\n          }\n        }).join(',</div><div>');\n      } else if (_.isPlainObject(schema.items)) {\n        if (_.isUndefined(schema.items.$ref)) {\n          if (_.indexOf(['array', 'object'], schema.items.type || 'object') > -1) {\n            if ((_.isUndefined(schema.items.type) || schema.items.type === 'object') && _.isUndefined(schema.items.properties)) {\n              html += '<div>object</div>';\n            } else {\n              html += '<div>' + addReference(schema.items) + '</div>';\n            }\n          } else {\n            html += '<div>' + primitiveToOptionsHTML(schema.items, schema.items.type) + '</div>';\n          }\n        } else {\n          html += '<div>' + addReference(schema.items, Helpers.simpleRef(schema.items.$ref)) + '</div>';\n        }\n      } else {\n        Helpers.log('Array type\\'s \\'items\\' property is not an array or an object, cannot process');\n        html += '<div>object</div>';\n      }\n    } else {\n      if (schema.$ref) {\n        html += '<div>' + addReference(schema, name) + '</div>';\n      } else if (type === 'object') {\n        if (_.isPlainObject(schema.properties)) {\n          var contents = _.map(schema.properties, function (property, name) {\n            var propertyIsRequired = (_.indexOf(schema.required, name) >= 0);\n            var cProperty = _.cloneDeep(property);\n\n            var requiredClass = propertyIsRequired ? 'required' : '';\n            var html = '<span class=\"propName ' + requiredClass + '\">' + name + '</span> (';\n            var model;\n            var propDescription;\n\n            // Allow macro to set the default value\n            cProperty.default = modelPropertyMacro(cProperty);\n\n            // Resolve the schema (Handle nested schemas)\n            cProperty = Helpers.resolveSchema(cProperty);\n\n            propDescription = property.description || cProperty.description;\n\n            // We need to handle property references to primitives (Issue 339)\n            if (!_.isUndefined(cProperty.$ref)) {\n              model = models[Helpers.simpleRef(cProperty.$ref)];\n\n              if (!_.isUndefined(model) && _.indexOf([undefined, 'array', 'object'], model.definition.type) === -1) {\n                // Use referenced schema\n                cProperty = Helpers.resolveSchema(model.definition);\n              }\n            }\n\n            html += primitiveToHTML(cProperty);\n\n            if(!propertyIsRequired) {\n              html += ', <span class=\"propOptKey\">optional</span>';\n            }\n\n            if(property.readOnly) {\n                html += ', <span class=\"propReadOnly\">read only</span>';\n            }\n\n            html += ')';\n\n            if (!_.isUndefined(propDescription)) {\n              html += ': ' + '<span class=\"propDesc\">' + propDescription + '</span>';\n            }\n\n            if (cProperty.enum) {\n              html += ' = <span class=\"propVals\">[\\'' + cProperty.enum.join('\\', \\'') + '\\']</span>';\n            }\n\n            return '<div' + (property.readOnly ? ' class=\"readOnly\"' : '') + '>' + primitiveToOptionsHTML(cProperty, html);\n          }).join(',</div>');\n\n          if (contents) {\n            html += contents + '</div>';\n          }\n        }\n      } else {\n        html += '<div>' + primitiveToOptionsHTML(schema, type) + '</div>';\n      }\n    }\n\n    return html + strongOpen + (isArray ? ']' : '}') + strongClose;\n  }\n};\n},{\"./helpers\":4,\"lodash-compat/array/indexOf\":49,\"lodash-compat/collection/forEach\":54,\"lodash-compat/collection/map\":56,\"lodash-compat/lang/cloneDeep\":138,\"lodash-compat/lang/isArray\":140,\"lodash-compat/lang/isEmpty\":141,\"lodash-compat/lang/isObject\":144,\"lodash-compat/lang/isPlainObject\":145,\"lodash-compat/lang/isUndefined\":148,\"lodash-compat/object/keys\":149}],8:[function(require,module,exports){\n'use strict';\n\nvar SwaggerHttp = require('./http');\nvar _ = {\n  isObject: require('lodash-compat/lang/isObject')\n};\n\nvar SwaggerSpecConverter = module.exports = function () {\n  this.errors = [];\n  this.warnings = [];\n  this.modelMap = {};\n};\n\nSwaggerSpecConverter.prototype.setDocumentationLocation = function (location) {\n  this.docLocation = location;\n};\n\n/**\n * converts a resource listing OR api declaration\n **/\nSwaggerSpecConverter.prototype.convert = function (obj, clientAuthorizations, opts, callback) {\n  // not a valid spec\n  if(!obj || !Array.isArray(obj.apis)) {\n    return this.finish(callback, null);\n  }\n  this.clientAuthorizations = clientAuthorizations;\n\n  // create a new swagger object to return\n  var swagger = { swagger: '2.0' };\n\n  swagger.originalVersion = obj.swaggerVersion;\n\n  // add the info\n  this.apiInfo(obj, swagger);\n\n  // add security definitions\n  this.securityDefinitions(obj, swagger);\n\n  // take basePath into account\n  if (obj.basePath) {\n    this.setDocumentationLocation(obj.basePath);\n  }\n\n  // see if this is a single-file swagger definition\n  var isSingleFileSwagger = false;\n  var i;\n  for(i = 0; i < obj.apis.length; i++) {\n    var api = obj.apis[i];\n    if(Array.isArray(api.operations)) {\n      isSingleFileSwagger = true;\n    }\n  }\n  if(isSingleFileSwagger) {\n    this.declaration(obj, swagger);\n    this.finish(callback, swagger);\n  }\n  else {\n    this.resourceListing(obj, swagger, opts, callback);\n  }\n};\n\nSwaggerSpecConverter.prototype.declaration = function(obj, swagger) {\n  var name, i, p, pos;\n  if(!obj.apis) {\n    return;\n  }\n\n  if (obj.basePath.indexOf('http://') === 0) {\n    p = obj.basePath.substring('http://'.length);\n    pos = p.indexOf('/');\n    if (pos > 0) {\n      swagger.host = p.substring(0, pos);\n      swagger.basePath = p.substring(pos);\n    }\n    else {\n      swagger.host = p;\n      swagger.basePath = '/';\n    }\n  } else if (obj.basePath.indexOf('https://') === 0) {\n    p = obj.basePath.substring('https://'.length);\n    pos = p.indexOf('/');\n    if (pos > 0) {\n      swagger.host = p.substring(0, pos);\n      swagger.basePath = p.substring(pos);\n    }\n    else {\n      swagger.host = p;\n      swagger.basePath = '/';\n    }\n  } else {\n    swagger.basePath = obj.basePath;\n  }\n\n  var resourceLevelAuth;\n  if(obj.authorizations) {\n    resourceLevelAuth = obj.authorizations;\n  }\n  if(obj.consumes) {\n    swagger.consumes = obj.consumes;\n  }\n  if(obj.produces) {\n    swagger.produces = obj.produces;\n  }\n\n  // build a mapping of id to name for 1.0 model resolutions\n  if(_.isObject(obj)) {\n    for(name in obj.models) {\n      var existingModel = obj.models[name];\n      var key = (existingModel.id || name);\n      this.modelMap[key] = name;\n    }\n  }\n\n  for(i = 0; i < obj.apis.length; i++) {\n    var api = obj.apis[i];\n    var path = api.path;\n    var operations = api.operations;\n    this.operations(path, obj.resourcePath, operations, resourceLevelAuth, swagger);\n  }\n\n  var models = obj.models || {};\n  this.models(models, swagger);\n};\n\nSwaggerSpecConverter.prototype.models = function(obj, swagger) {\n  if(!_.isObject(obj)) {\n    return;\n  }\n  var name;\n\n  swagger.definitions = swagger.definitions || {};\n  for(name in obj) {\n    var existingModel = obj[name];\n    var _required = [];\n    var schema = { properties: {}};\n    var propertyName;\n    for(propertyName in existingModel.properties) {\n      var existingProperty = existingModel.properties[propertyName];\n      var property = {};\n      this.dataType(existingProperty, property);\n      if(existingProperty.description) {\n        property.description = existingProperty.description;\n      }\n      if(existingProperty['enum']) {\n        property['enum'] = existingProperty['enum'];\n      }\n      if(typeof existingProperty.required === 'boolean' && existingProperty.required === true) {\n        _required.push(propertyName);\n      }\n      if(typeof existingProperty.required === 'string' && existingProperty.required === 'true') {\n        _required.push(propertyName);\n      }\n      schema.properties[propertyName] = property;\n    }\n    if(_required.length > 0) {\n      schema.required = _required;\n    } else {\n      schema.required = existingModel.required;\n    }\n    swagger.definitions[name] = schema;\n  }\n};\n\nSwaggerSpecConverter.prototype.extractTag = function(resourcePath) {\n  var pathString = resourcePath || 'default';\n  if(pathString.indexOf('http:') === 0 || pathString.indexOf('https:') === 0) {\n    pathString = pathString.split(['/']);\n    pathString = pathString[pathString.length -1].substring();\n  }\n  if(pathString.endsWith('.json')) {\n    pathString = pathString.substring(0, pathString.length - '.json'.length);\n  }\n  return pathString.replace('/','');\n};\n\nSwaggerSpecConverter.prototype.operations = function(path, resourcePath, obj, resourceLevelAuth, swagger) {\n  if(!Array.isArray(obj)) {\n    return;\n  }\n  var i;\n\n  if(!swagger.paths) {\n    swagger.paths = {};\n  }\n\n  var pathObj = swagger.paths[path] || {};\n  var tag = this.extractTag(resourcePath);\n  swagger.tags = swagger.tags || [];\n  var matched = false;\n  for(i = 0; i < swagger.tags.length; i++) {\n    var tagObject = swagger.tags[i];\n    if(tagObject.name === tag) {\n      matched = true;\n    }\n  }\n  if(!matched) {\n    swagger.tags.push({name: tag});\n  }\n\n  for(i = 0; i < obj.length; i++) {\n    var existingOperation = obj[i];\n    var method = (existingOperation.method || existingOperation.httpMethod).toLowerCase();\n    var operation = {tags: [tag]};\n    var existingAuthorizations = existingOperation.authorizations;\n\n    if(existingAuthorizations && Object.keys(existingAuthorizations).length === 0) {\n      existingAuthorizations = resourceLevelAuth;\n    }\n\n    if(typeof existingAuthorizations !== 'undefined') {\n      var scopesObject;\n      for(var key in existingAuthorizations) {\n        operation.security = operation.security || [];\n        var scopes = existingAuthorizations[key];\n        if(scopes) {\n          var securityScopes = [];\n          for(var j in scopes) {\n            securityScopes.push(scopes[j].scope);\n          }\n          scopesObject = {};\n          scopesObject[key] = securityScopes;\n          operation.security.push(scopesObject);\n        }\n        else {\n          scopesObject = {};\n          scopesObject[key] = [];\n          operation.security.push(scopesObject);\n        }\n      }\n    }\n\n    if(existingOperation.consumes) {\n      operation.consumes = existingOperation.consumes;\n    }\n    else if(swagger.consumes) {\n      operation.consumes = swagger.consumes;\n    }\n    if(existingOperation.produces) {\n      operation.produces = existingOperation.produces;\n    }\n    else if(swagger.produces) {\n      operation.produces = swagger.produces;\n    }\n    if(existingOperation.summary) {\n      operation.summary = existingOperation.summary;\n    }\n    if(existingOperation.notes) {\n      operation.description = existingOperation.notes;\n    }\n    if(existingOperation.nickname) {\n      operation.operationId = existingOperation.nickname;\n    }\n    if(existingOperation.deprecated) {\n      operation.deprecated = existingOperation.deprecated;\n    }\n\n    this.authorizations(existingAuthorizations, swagger);\n    this.parameters(operation, existingOperation.parameters, swagger);\n    this.responseMessages(operation, existingOperation, swagger);\n\n    pathObj[method] = operation;\n  }\n\n  swagger.paths[path] = pathObj;\n};\n\nSwaggerSpecConverter.prototype.responseMessages = function(operation, existingOperation) {\n  if(!_.isObject(existingOperation)) {\n    return;\n  }\n  // build default response from the operation (1.x)\n  var defaultResponse = {};\n  this.dataType(existingOperation, defaultResponse);\n  // TODO: look into the real problem of rendering responses in swagger-ui\n  // ....should reponseType have an implicit schema?\n  if(!defaultResponse.schema && defaultResponse.type) {\n    defaultResponse = {schema: defaultResponse};\n  }\n\n  operation.responses = operation.responses || {};\n\n  // grab from responseMessages (1.2)\n  var has200 = false;\n  if(Array.isArray(existingOperation.responseMessages)) {\n    var i;\n    var existingResponses = existingOperation.responseMessages;\n    for(i = 0; i < existingResponses.length; i++) {\n      var existingResponse = existingResponses[i];\n      var response = { description: existingResponse.message };\n      if(existingResponse.code === 200) {\n        has200 = true;\n      }\n      // Convert responseModel -> schema{$ref: responseModel}\n      if(existingResponse.responseModel) {\n        response.schema = {'$ref': '#/definitions/' + existingResponse.responseModel};\n      }\n      operation.responses['' + existingResponse.code] = response;\n    }\n  }\n\n  if(has200) {\n    operation.responses['default'] = defaultResponse;\n  }\n  else {\n    operation.responses['200'] = defaultResponse;\n  }\n};\n\nSwaggerSpecConverter.prototype.authorizations = function(obj) {\n  // TODO\n  if(!_.isObject(obj)) {\n    return;\n  }\n};\n\nSwaggerSpecConverter.prototype.parameters = function(operation, obj) {\n  if(!Array.isArray(obj)) {\n    return;\n  }\n  var i;\n  for(i = 0; i < obj.length; i++) {\n    var existingParameter = obj[i];\n    var parameter = {};\n    parameter.name = existingParameter.name;\n    parameter.description = existingParameter.description;\n    parameter.required = existingParameter.required;\n    parameter.in = existingParameter.paramType;\n\n    // per #168\n    if(parameter.in === 'body') {\n      parameter.name = 'body';\n    }\n    if(parameter.in === 'form') {\n      parameter.in = 'formData';\n    }\n\n    if(existingParameter.enum) {\n      parameter.enum = existingParameter.enum;\n    }\n\n    if(existingParameter.allowMultiple === true || existingParameter.allowMultiple === 'true') {\n      var innerType = {};\n      this.dataType(existingParameter, innerType);\n      parameter.type = 'array';\n      parameter.items = innerType;\n\n      if(existingParameter.allowableValues) {\n        var av = existingParameter.allowableValues;\n        if(av.valueType === 'LIST') {\n          parameter['enum'] = av.values;\n        }\n      }\n    }\n    else {\n      this.dataType(existingParameter, parameter);\n    }\n    if(typeof existingParameter.defaultValue !== 'undefined') {\n      parameter.default = existingParameter.defaultValue;\n    }\n\n    operation.parameters = operation.parameters || [];\n    operation.parameters.push(parameter);\n  }\n};\n\nSwaggerSpecConverter.prototype.dataType = function(source, target) {\n  if(!_.isObject(source)) {\n    return;\n  }\n\n  if(source.minimum) {\n    target.minimum = source.minimum;\n  }\n  if(source.maximum) {\n    target.maximum = source.maximum;\n  }\n  if (source.format) {\n    target.format = source.format;\n  }\n\n  // default can be 'false'\n  if(typeof source.defaultValue !== 'undefined') {\n    target.default = source.defaultValue;\n  }\n\n  var jsonSchemaType = this.toJsonSchema(source);\n  if(jsonSchemaType) {\n    target = target || {};\n    if(jsonSchemaType.type) {\n      target.type = jsonSchemaType.type;\n    }\n    if(jsonSchemaType.format) {\n      target.format = jsonSchemaType.format;\n    }\n    if(jsonSchemaType.$ref) {\n      target.schema = {$ref: jsonSchemaType.$ref};\n    }\n    if(jsonSchemaType.items) {\n      target.items = jsonSchemaType.items;\n    }\n  }\n};\n\nSwaggerSpecConverter.prototype.toJsonSchema = function(source) {\n  if(!source) {\n    return 'object';\n  }\n  var detectedType = (source.type || source.dataType || source.responseClass || '');\n  var lcType = detectedType.toLowerCase();\n  var format = (source.format || '').toLowerCase();\n\n  if(lcType.indexOf('list[') === 0) {\n    var innerType = detectedType.substring(5, detectedType.length - 1);\n    var jsonType = this.toJsonSchema({type: innerType});\n    return {type: 'array', items: jsonType};\n  } else if(lcType === 'int' || (lcType === 'integer' && format === 'int32')) {\n    {return {type: 'integer', format: 'int32'};}\n  } else if(lcType === 'long' || (lcType === 'integer' && format === 'int64')) {\n    {return {type: 'integer', format: 'int64'};}\n  } else if(lcType === 'integer') {\n    {return {type: 'integer', format: 'int64'};}\n  } else if(lcType === 'float' || (lcType === 'number' && format === 'float')) {\n    {return {type: 'number', format: 'float'};}\n  } else if(lcType === 'double' || (lcType === 'number' && format === 'double')) {\n    {return {type: 'number', format: 'double'};}\n  } else if((lcType === 'string' && format === 'date-time') || (lcType === 'date')) {\n    {return {type: 'string', format: 'date-time'};}\n  } else if(lcType === 'string') {\n    {return {type: 'string'};}\n  } else if(lcType === 'file') {\n    {return {type: 'file'};}\n  } else if(lcType === 'boolean') {\n    {return {type: 'boolean'};}\n  } else if(lcType === 'boolean') {\n    {return {type: 'boolean'};}\n  } else if(lcType === 'array' || lcType === 'list') {\n    if(source.items) {\n      var it = this.toJsonSchema(source.items);\n      return {type: 'array', items: it};\n    }\n    else {\n      return {type: 'array', items: {type: 'object'}};\n    }\n  } else if(source.$ref) {\n    return {$ref: this.modelMap[source.$ref] ? '#/definitions/' + this.modelMap[source.$ref] : source.$ref};\n  } else if(lcType === 'void' || lcType === '') {\n    {return {};}\n  } else if (this.modelMap[source.type]) {\n    // If this a model using `type` instead of `$ref`, that's fine.\n    return {$ref: '#/definitions/' + this.modelMap[source.type]};\n  } else {\n    // Unknown model type or 'object', pass it along.\n    return {type: source.type};\n  }\n};\n\nSwaggerSpecConverter.prototype.resourceListing = function(obj, swagger, opts, callback) {\n  var i;\n  var processedCount = 0;   // jshint ignore:line\n  var self = this;          // jshint ignore:line\n  var expectedCount = obj.apis.length;\n  var _swagger = swagger;   // jshint ignore:line\n  var _opts = {};\n\n  if(opts && opts.requestInterceptor){\n    _opts.requestInterceptor = opts.requestInterceptor;\n  }\n\n  if(opts && opts.responseInterceptor){\n    _opts.responseInterceptor = opts.responseInterceptor;\n  }\n\n  var swaggerRequestHeaders = 'application/json';\n\n  if(opts && opts.swaggerRequestHeaders) {\n    swaggerRequestHeaders = opts.swaggerRequestHeaders;\n  }\n\n  if(expectedCount === 0) {\n    this.finish(callback, swagger);\n  }\n\n  for(i = 0; i < expectedCount; i++) {\n    var api = obj.apis[i];\n    var path = api.path;\n    var absolutePath = this.getAbsolutePath(obj.swaggerVersion, this.docLocation, path);\n\n    if(api.description) {\n      swagger.tags = swagger.tags || [];\n      swagger.tags.push({\n        name : this.extractTag(api.path),\n        description : api.description || ''\n      });\n    }\n    var http = {\n      url: absolutePath,\n      headers: { accept: swaggerRequestHeaders },\n      on: {},\n      method: 'get',\n      timeout: opts.timeout\n    };\n    /* jshint ignore:start */\n    http.on.response = function(data) {\n      processedCount += 1;\n      var obj = data.obj;\n      if(obj) {\n        self.declaration(obj, _swagger);\n      }\n      if(processedCount === expectedCount) {\n        self.finish(callback, _swagger);\n      }\n    };\n    http.on.error = function(data) {\n      console.error(data);\n      processedCount += 1;\n      if(processedCount === expectedCount) {\n        self.finish(callback, _swagger);\n      }\n    };\n    /* jshint ignore:end */\n\n    if(this.clientAuthorizations && typeof this.clientAuthorizations.apply === 'function') {\n      this.clientAuthorizations.apply(http);\n    }\n\n    new SwaggerHttp().execute(http, _opts);\n  }\n};\n\nSwaggerSpecConverter.prototype.getAbsolutePath = function(version, docLocation, path)  {\n  if(version === '1.0') {\n    if(docLocation.endsWith('.json')) {\n      // get root path\n      var pos = docLocation.lastIndexOf('/');\n      if(pos > 0) {\n        docLocation = docLocation.substring(0, pos);\n      }\n    }\n  }\n\n  var location = docLocation;\n  if(path.indexOf('http:') === 0 || path.indexOf('https:') === 0) {\n    location = path;\n  }\n  else {\n    if(docLocation.endsWith('/')) {\n      location = docLocation.substring(0, docLocation.length - 1);\n    }\n    location += path;\n  }\n  location = location.replace('{format}', 'json');\n  return location;\n};\n\nSwaggerSpecConverter.prototype.securityDefinitions = function(obj, swagger) {\n  if(obj.authorizations) {\n    var name;\n    for(name in obj.authorizations) {\n      var isValid = false;\n      var securityDefinition = {\n        vendorExtensions: {}\n      };\n      var definition = obj.authorizations[name];\n      if(definition.type === 'apiKey') {\n        securityDefinition.type = 'apiKey';\n        securityDefinition.in = definition.passAs;\n        securityDefinition.name = definition.keyname || name;\n        isValid = true;\n      }\n      else if(definition.type === 'basicAuth') {\n        securityDefinition.type = 'basicAuth';\n        isValid = true;\n      }\n      else if(definition.type === 'oauth2') {\n        var existingScopes = definition.scopes || [];\n        var scopes = {};\n        var i;\n        for(i in existingScopes) {\n          var scope = existingScopes[i];\n          scopes[scope.scope] = scope.description;\n        }\n        securityDefinition.type = 'oauth2';\n        if(i > 0) {\n          securityDefinition.scopes = scopes;\n        }\n        if(definition.grantTypes) {\n          if(definition.grantTypes.implicit) {\n            var implicit = definition.grantTypes.implicit;\n            securityDefinition.flow = 'implicit';\n            securityDefinition.authorizationUrl = implicit.loginEndpoint;\n            isValid = true;\n          }\n          /* jshint ignore:start */\n          if(definition.grantTypes['authorization_code']) {\n            if(!securityDefinition.flow) {\n              // cannot set if flow is already defined\n              var authCode = definition.grantTypes['authorization_code'];\n              securityDefinition.flow = 'accessCode';\n              securityDefinition.authorizationUrl = authCode.tokenRequestEndpoint.url;\n              securityDefinition.tokenUrl = authCode.tokenEndpoint.url;\n              isValid = true;\n            }\n          }\n          /* jshint ignore:end */\n        }\n      }\n      if(isValid) {\n        swagger.securityDefinitions = swagger.securityDefinitions || {};\n        swagger.securityDefinitions[name] = securityDefinition;\n      }\n    }\n  }\n};\n\nSwaggerSpecConverter.prototype.apiInfo = function(obj, swagger) {\n  // info section\n  if(obj.info) {\n    var info = obj.info;\n    swagger.info = {};\n\n    if(info.contact) {\n      swagger.info.contact = {};\n      swagger.info.contact.email = info.contact;\n    }\n    if(info.description) {\n      swagger.info.description = info.description;\n    }\n    if(info.title) {\n      swagger.info.title = info.title;\n    }\n    if(info.termsOfServiceUrl) {\n      swagger.info.termsOfService = info.termsOfServiceUrl;\n    }\n    if(info.license || info.licenseUrl) {\n      swagger.license = {};\n      if(info.license) {\n        swagger.license.name = info.license;\n      }\n      if(info.licenseUrl) {\n        swagger.license.url = info.licenseUrl;\n      }\n    }\n  }\n  else {\n    this.warnings.push('missing info section');\n  }\n};\n\nSwaggerSpecConverter.prototype.finish = function (callback, obj) {\n  callback(obj);\n};\n\n},{\"./http\":5,\"lodash-compat/lang/isObject\":144}],9:[function(require,module,exports){\n'use strict';\n\nvar log = require('../helpers').log;\nvar _ = {\n  isPlainObject: require('lodash-compat/lang/isPlainObject'),\n  isString: require('lodash-compat/lang/isString'),\n};\n\nvar SchemaMarkup = require('../schema-markup.js');\nvar jsyaml = require('js-yaml');\n\nvar Model = module.exports = function (name, definition, models, modelPropertyMacro) {\n  this.definition = definition || {};\n  this.isArray = definition.type === 'array';\n  this.models = models || {};\n  this.name = name || definition.title || 'Inline Model';\n  this.modelPropertyMacro = modelPropertyMacro || function (property) {\n    return property.default;\n  };\n\n  return this;\n};\n\n// Note!  This function will be removed in 2.2.x!\nModel.prototype.createJSONSample = Model.prototype.getSampleValue = function (modelsToIgnore) {\n  modelsToIgnore = modelsToIgnore || {};\n\n  modelsToIgnore[this.name] = this;\n\n  // Response support\n  if (this.examples && _.isPlainObject(this.examples) && this.examples['application/json']) {\n    this.definition.example = this.examples['application/json'];\n\n    if (_.isString(this.definition.example)) {\n      this.definition.example = jsyaml.safeLoad(this.definition.example);\n    }\n  } else if (!this.definition.example) {\n    this.definition.example = this.examples;\n  }\n\n  return SchemaMarkup.schemaToJSON(this.definition, this.models, modelsToIgnore, this.modelPropertyMacro);\n};\n\nModel.prototype.getMockSignature = function () {\n  return SchemaMarkup.schemaToHTML(this.name, this.definition, this.models, this.modelPropertyMacro);\n};\n\n},{\"../helpers\":4,\"../schema-markup.js\":7,\"js-yaml\":19,\"lodash-compat/lang/isPlainObject\":145,\"lodash-compat/lang/isString\":146}],10:[function(require,module,exports){\n'use strict';\n\nvar _ = {\n  cloneDeep: require('lodash-compat/lang/cloneDeep'),\n  isUndefined: require('lodash-compat/lang/isUndefined'),\n  isEmpty: require('lodash-compat/lang/isEmpty'),\n  isObject: require('lodash-compat/lang/isObject')\n};\nvar helpers = require('../helpers');\nvar Model = require('./model');\nvar SwaggerHttp = require('../http');\nvar Q = require('q');\n\nvar Operation = module.exports = function (parent, scheme, operationId, httpMethod, path, args, definitions, models, clientAuthorizations) {\n  var errors = [];\n\n  parent = parent || {};\n  args = args || {};\n\n  if(parent && parent.options) {\n    this.client = parent.options.client || null;\n    this.requestInterceptor = parent.options.requestInterceptor || null;\n    this.responseInterceptor = parent.options.responseInterceptor || null;\n    this.requestAgent = parent.options.requestAgent;\n  }\n  this.authorizations = args.security;\n  this.basePath = parent.basePath || '/';\n  this.clientAuthorizations = clientAuthorizations;\n  this.consumes = args.consumes || parent.consumes || ['application/json'];\n  this.produces = args.produces || parent.produces || ['application/json'];\n  this.deprecated = args.deprecated;\n  this.description = args.description;\n  this.host = parent.host;\n  this.method = (httpMethod || errors.push('Operation ' + operationId + ' is missing method.'));\n  this.models = models || {};\n  this.nickname = (operationId || errors.push('Operations must have a nickname.'));\n  this.operation = args;\n  this.operations = {};\n  this.parameters = args !== null ? (args.parameters || []) : {};\n  this.parent = parent;\n  this.path = (path || errors.push('Operation ' + this.nickname + ' is missing path.'));\n  this.responses = (args.responses || {});\n  this.scheme = scheme || parent.scheme || 'http';\n  this.schemes = args.schemes || parent.schemes;\n  this.security = args.security || parent.security;\n  this.summary = args.summary || '';\n  this.timeout = parent.timeout;\n  this.type = null;\n  this.useJQuery = parent.useJQuery;\n  this.jqueryAjaxCache = parent.jqueryAjaxCache;\n  this.enableCookies = parent.enableCookies;\n\n  var key;\n\n  if(!this.host) {\n    if(typeof window !== 'undefined') {\n      this.host = window.location.host;\n    }\n    else {\n      this.host = 'localhost';\n    }\n  }\n  this.parameterMacro = parent.parameterMacro || function (operation, parameter) {\n    return parameter.default;\n  };\n\n  this.inlineModels = [];\n\n  if(this.basePath !== '/' && this.basePath.slice(-1) === '/') {\n    this.basePath = this.basePath.slice(0, -1);\n  }\n\n  if (typeof this.deprecated === 'string') {\n    switch(this.deprecated.toLowerCase()) {\n      case 'true': case 'yes': case '1': {\n        this.deprecated = true;\n        break;\n      }\n\n      case 'false': case 'no': case '0': case null: {\n        this.deprecated = false;\n        break;\n      }\n\n      default: this.deprecated = Boolean(this.deprecated);\n    }\n  }\n\n  var i, model;\n\n  if (definitions) {\n    // add to global models\n    for (key in definitions) {\n      model = new Model(key, definitions[key], this.models, parent.modelPropertyMacro);\n\n      if (model) {\n        this.models[key] = model;\n      }\n    }\n  }\n  else {\n    definitions = {};\n  }\n\n  for (i = 0; i < this.parameters.length; i++) {\n    var d, param = this.parameters[i];\n\n    // Allow macro to set the default value\n    param.default = this.parameterMacro(this, param);\n\n    if (param.type === 'array') {\n      param.isList = true;\n      param.allowMultiple = true;\n    }\n\n    var innerType = this.getType(param);\n\n    if (innerType && innerType.toString().toLowerCase() === 'boolean') {\n      param.allowableValues = {};\n      param.isList = true;\n      param['enum'] = [true, false]; // use actual primitives\n    }\n\n    for(key in param) {\n      helpers.extractExtensions(key, param);\n    }\n    if(typeof param['x-example'] !== 'undefined') {\n      d = param['x-example'];\n      param.default = d;\n    }\n    if(param['x-examples']) {\n      d = param['x-examples'].default;\n      if(typeof d !== 'undefined') {\n        param.default = d;\n      }\n    }\n\n    var enumValues = param['enum'] || (param.items && param.items['enum']);\n\n    if (typeof enumValues !== 'undefined') {\n      var id;\n\n      param.allowableValues = {};\n      param.allowableValues.values = [];\n      param.allowableValues.descriptiveValues = [];\n\n      for (id = 0; id < enumValues.length; id++) {\n        var value = enumValues[id];\n        var isDefault = (value === param.default || value+'' === param.default);\n\n        param.allowableValues.values.push(value);\n        // Always have string for descriptive values....\n        param.allowableValues.descriptiveValues.push({value : value+'', isDefault: isDefault});\n      }\n    }\n\n    if (param.type === 'array') {\n      innerType = [innerType];\n\n      if (typeof param.allowableValues === 'undefined') {\n        // can't show as a list if no values to select from\n        delete param.isList;\n        delete param.allowMultiple;\n      }\n    }\n\n    param.modelSignature = {type: innerType, definitions: this.models};\n    param.signature = this.getModelSignature(innerType, this.models).toString();\n    param.sampleJSON = this.getModelSampleJSON(innerType, this.models);\n    param.responseClassSignature = param.signature;\n  }\n\n  var keyname, defaultResponseCode, response, responses = this.responses;\n\n  if (responses['200']) {\n    response = responses['200'];\n    defaultResponseCode = '200';\n  } else if (responses['201']) {\n    response = responses['201'];\n    defaultResponseCode = '201';\n  } else if (responses['202']) {\n    response = responses['202'];\n    defaultResponseCode = '202';\n  } else if (responses['203']) {\n    response = responses['203'];\n    defaultResponseCode = '203';\n  } else if (responses['204']) {\n    response = responses['204'];\n    defaultResponseCode = '204';\n  } else if (responses['205']) {\n    response = responses['205'];\n    defaultResponseCode = '205';\n  } else if (responses['206']) {\n    response = responses['206'];\n    defaultResponseCode = '206';\n  } else if (responses['default']) {\n    response = responses['default'];\n    defaultResponseCode = 'default';\n  }\n\n  for(keyname in responses) {\n    helpers.extractExtensions(keyname, responses);\n    if(typeof keyname === 'string' && keyname.indexOf('x-') === -1) {\n      var responseObject = responses[keyname];\n      if(typeof responseObject === 'object' && typeof responseObject.headers === 'object') {\n        var headers = responseObject.headers;\n        for(var headerName in headers) {\n          var header = headers[headerName];\n          if(typeof header === 'object') {\n            for(var headerKey in header) {\n              helpers.extractExtensions(headerKey, header);\n            }\n          }\n        }\n      }\n    }\n  }\n\n  if (response) {\n    for(keyname in response) {\n      helpers.extractExtensions(keyname, response);\n    }\n  }\n\n  if (response && response.schema) {\n    var resolvedModel = this.resolveModel(response.schema, definitions);\n    var successResponse;\n\n    delete responses[defaultResponseCode];\n\n    if (resolvedModel) {\n      this.successResponse = {};\n      successResponse = this.successResponse[defaultResponseCode] = resolvedModel;\n    } else if (!response.schema.type || response.schema.type === 'object' || response.schema.type === 'array') {\n      // Inline model\n      this.successResponse = {};\n      successResponse = this.successResponse[defaultResponseCode] = new Model(undefined, response.schema || {}, this.models, parent.modelPropertyMacro);\n    } else {\n      // Primitive\n      this.successResponse = {};\n      successResponse = this.successResponse[defaultResponseCode] = response.schema;\n    }\n\n    if (successResponse) {\n      successResponse.vendorExtensions = response.vendorExtensions;\n      // Attach response properties\n      if (response.description) {\n        successResponse.description = response.description;\n      }\n\n      if (response.examples) {\n        successResponse.examples = response.examples;\n      }\n\n      if (response.headers) {\n        successResponse.headers = response.headers;\n      }\n    }\n\n    this.type = response;\n  }\n\n  if (errors.length > 0) {\n    if (this.resource && this.resource.api && this.resource.api.fail) {\n      this.resource.api.fail(errors);\n    }\n  }\n\n  return this;\n};\n\nOperation.prototype.isDefaultArrayItemValue = function(value, param) {\n  if (param.default && Array.isArray(param.default)) {\n    return param.default.indexOf(value) !== -1;\n  }\n  return value === param.default;\n};\n\nOperation.prototype.getType = function (param) {\n  var type = param.type;\n  var format = param.format;\n  var isArray = false;\n  var str;\n\n  if (type === 'integer' && format === 'int32') {\n    str = 'integer';\n  } else if (type === 'integer' && format === 'int64') {\n    str = 'long';\n  } else if (type === 'integer') {\n    str = 'integer';\n  } else if (type === 'string') {\n    if (format === 'date-time') {\n      str = 'date-time';\n    } else if (format === 'date') {\n      str = 'date';\n    } else {\n      str = 'string';\n    }\n  } else if (type === 'number' && format === 'float') {\n    str = 'float';\n  } else if (type === 'number' && format === 'double') {\n    str = 'double';\n  } else if (type === 'number') {\n    str = 'double';\n  } else if (type === 'boolean') {\n    str = 'boolean';\n  } else if (type === 'array') {\n    isArray = true;\n\n    if (param.items) {\n      str = this.getType(param.items);\n    }\n  } else if (type === 'file') {\n    str = 'file';\n  }\n\n  if (param.$ref) {\n    str = helpers.simpleRef(param.$ref);\n  }\n\n  var schema = param.schema;\n\n  if (schema) {\n    var ref = schema.$ref;\n\n    if (ref) {\n      ref = helpers.simpleRef(ref);\n\n      if (isArray) {\n        return [ ref ];\n      } else {\n        return ref;\n      }\n    } else {\n      // If inline schema, we add it our interal hash -> which gives us it's ID (int)\n      if(schema.type === 'object') {\n        return this.addInlineModel(schema);\n      }\n      return this.getType(schema);\n    }\n  }\n  if (isArray) {\n    return [ str ];\n  } else {\n    return str;\n  }\n};\n\n/**\n * adds an inline schema (model) to a hash, where we can ref it later\n * @param {object} schema a schema\n * @return {number} the ID of the schema being added, or null\n **/\nOperation.prototype.addInlineModel = function (schema) {\n  var len = this.inlineModels.length;\n  var model = this.resolveModel(schema, {});\n  if(model) {\n    this.inlineModels.push(model);\n    return 'Inline Model '+len; // return string ref of the inline model (used with #getInlineModel)\n  }\n  return null; // report errors?\n};\n\n/**\n * gets the internal ref to an inline model\n * @param {string} inline_str a string reference to an inline model\n * @return {Model} the model being referenced. Or null\n **/\nOperation.prototype.getInlineModel = function(inlineStr) {\n  if(/^Inline Model \\d+$/.test(inlineStr)) {\n    var id = parseInt(inlineStr.substr('Inline Model'.length).trim(),10); //\n    var model = this.inlineModels[id];\n    return model;\n  }\n  // I'm returning null here, should I rather throw an error?\n  return null;\n};\n\nOperation.prototype.resolveModel = function (schema, definitions) {\n  if (typeof schema.$ref !== 'undefined') {\n    var ref = schema.$ref;\n\n    if (ref.indexOf('#/definitions/') === 0) {\n      ref = ref.substring('#/definitions/'.length);\n    }\n\n    if (definitions[ref]) {\n      return new Model(ref, definitions[ref], this.models, this.parent.modelPropertyMacro);\n    }\n  // schema must at least be an object to get resolved to an inline Model\n  } else if (schema && typeof schema === 'object' &&\n            (schema.type === 'object' || _.isUndefined(schema.type))) {\n    return new Model(undefined, schema, this.models, this.parent.modelPropertyMacro);\n  }\n\n  return null;\n};\n\nOperation.prototype.help = function (dontPrint) {\n  var out = this.nickname + ': ' + this.summary + '\\n';\n\n  for (var i = 0; i < this.parameters.length; i++) {\n    var param = this.parameters[i];\n    var typeInfo = param.signature;\n\n    out += '\\n  * ' + param.name + ' (' + typeInfo + '): ' + param.description;\n  }\n\n  if (typeof dontPrint === 'undefined') {\n    helpers.log(out);\n  }\n\n  return out;\n};\n\nOperation.prototype.getModelSignature = function (type, definitions) {\n  var isPrimitive, listType;\n\n  if (type instanceof Array) {\n    listType = true;\n    type = type[0];\n  }\n\n  // Convert undefined to string of 'undefined'\n  if (typeof type === 'undefined') {\n    type = 'undefined';\n    isPrimitive = true;\n\n  } else if (definitions[type]){\n    // a model def exists?\n    type = definitions[type]; /* Model */\n    isPrimitive = false;\n\n  } else if (this.getInlineModel(type)) {\n    type = this.getInlineModel(type); /* Model */\n    isPrimitive = false;\n\n  } else {\n    // We default to primitive\n    isPrimitive = true;\n  }\n\n  if (isPrimitive) {\n    if (listType) {\n      return 'Array[' + type + ']';\n    } else {\n      return type.toString();\n    }\n  } else {\n    if (listType) {\n      return 'Array[' + type.getMockSignature() + ']';\n    } else {\n      return type.getMockSignature();\n    }\n  }\n};\n\nOperation.prototype.supportHeaderParams = function () {\n  return true;\n};\n\nOperation.prototype.supportedSubmitMethods = function () {\n  return this.parent.supportedSubmitMethods;\n};\n\nOperation.prototype.getHeaderParams = function (args) {\n  var headers = this.setContentTypes(args, {});\n  var headerParamsByLowerCase = {};\n\n  for (var i = 0; i < this.parameters.length; i++) {\n    var param = this.parameters[i];\n\n    if (param.in === 'header') {\n      headerParamsByLowerCase[param.name.toLowerCase()] = param;\n    }\n  }\n\n  for (var arg in args) {\n    var headerParam = headerParamsByLowerCase[arg.toLowerCase()];\n    if (typeof headerParam !== 'undefined') {\n      var value = args[arg];\n\n      if (Array.isArray(value)) {\n        value = value.toString();\n      }\n\n      headers[headerParam.name] = value;\n    }\n  }\n\n  return headers;\n};\n\nOperation.prototype.urlify = function (args, maskPasswords) {\n  var formParams = {};\n  var requestUrl = this.path.replace(/#.*/, ''); // remove URL fragment\n  var querystring = ''; // grab params from the args, build the querystring along the way\n\n  for (var i = 0; i < this.parameters.length; i++) {\n    var param = this.parameters[i];\n\n    if (typeof args[param.name] !== 'undefined') {\n      var isPassword;\n      if(param.type === 'string' && param.format === 'password' && maskPasswords) {\n        isPassword = true;\n      }\n\n      if (param.in === 'path') {\n        var reg = new RegExp('\\{' + param.name + '\\}', 'gi');\n        var value = args[param.name];\n\n        if (Array.isArray(value)) {\n          value = this.encodePathCollection(param.collectionFormat, param.name, value, isPassword);\n        } else {\n          value = this.encodePathParam(value, isPassword);\n        }\n\n        requestUrl = requestUrl.replace(reg, value);\n      } else if (param.in === 'query' && typeof args[param.name] !== 'undefined') {\n        if (querystring === '' && requestUrl.indexOf('?') < 0) {\n          querystring += '?';\n        } else {\n          querystring += '&';\n        }\n\n        if (typeof param.collectionFormat !== 'undefined') {\n          var qp = args[param.name];\n\n          if (Array.isArray(qp)) {\n            querystring += this.encodeQueryCollection(param.collectionFormat, param.name, qp, isPassword);\n          } else {\n            querystring += this.encodeQueryKey(param.name) + '=' + this.encodeQueryParam(args[param.name], isPassword);\n          }\n        } else {\n          querystring += this.encodeQueryKey(param.name) + '=' + this.encodeQueryParam(args[param.name], isPassword);\n        }\n      } else if (param.in === 'formData') {\n        formParams[param.name] = args[param.name];\n      }\n    }\n  }\n  var url = this.scheme + '://' + this.host;\n\n  if (this.basePath !== '/') {\n    url += this.basePath;\n  }\n  return url + requestUrl + querystring;\n};\n\nOperation.prototype.getMissingParams = function (args) {\n  var missingParams = []; // check required params, track the ones that are missing\n  var i;\n\n  for (i = 0; i < this.parameters.length; i++) {\n    var param = this.parameters[i];\n\n    if (param.required === true) {\n      if (typeof args[param.name] === 'undefined') {\n        missingParams = param.name;\n      }\n    }\n  }\n\n  return missingParams;\n};\n\nOperation.prototype.getBody = function (headers, args, opts) {\n  var formParams = {}, hasFormParams, param, body, key, value, hasBody = false;\n\n  // look at each param and put form params in an object\n  for (var i = 0; i < this.parameters.length; i++) {\n    param = this.parameters[i];\n    if (typeof args[param.name] !== 'undefined') {\n      var isPassword;\n      if(param.type === 'string' && param.format === 'password') {\n        isPassword = 'password';\n      }\n      if (param.in === 'body') {\n        body = args[param.name];\n      } else if (param.in === 'formData') {\n        formParams[param.name] = {\n          param: param,\n          value: args[param.name],\n          password: isPassword\n        };\n        hasFormParams = true;\n      }\n    }\n    else {\n      if(param.in === 'body') {\n        hasBody = true;\n      }\n    }\n  }\n\n  // if body is null and hasBody is true, AND a JSON body is requested, send empty {}\n  if(hasBody && typeof body === 'undefined') {\n    var contentType = headers['Content-Type'];\n    if(contentType && contentType.indexOf('application/json') === 0) {\n      body = '{}';\n    }\n  }\n\n  var isMultiPart = false;\n  if(headers['Content-Type'] && headers['Content-Type'].indexOf('multipart/form-data') >= 0) {\n    isMultiPart = true;\n  }\n\n  // handle form params\n  if (hasFormParams && !isMultiPart) {\n    var encoded = '';\n\n    for (key in formParams) {\n      param = formParams[key].param;\n      value = formParams[key].value;\n      var password;\n\n      if(opts && opts.maskPasswords) {\n        password = formParams[key].password;\n      }\n\n      if (typeof value !== 'undefined') {\n        if (Array.isArray(value)) {\n          if (encoded !== '') {\n            encoded += '&';\n          }\n          encoded += this.encodeQueryCollection(param.collectionFormat, key, value, password);\n        }\n        else {\n          if (encoded !== '') {\n            encoded += '&';\n          }\n\n          encoded += encodeURIComponent(key) + '=' + mask(encodeURIComponent(value), password);\n        }\n      }\n    }\n\n    body = encoded;\n  } else if (isMultiPart) {\n    var bodyParam;\n    if (typeof FormData === 'function') {\n      bodyParam = new FormData();\n\n      bodyParam.type = 'formData';\n\n      for (key in formParams) {\n        param = formParams[key].param;\n        value = args[key];\n\n        if (typeof value !== 'undefined') {\n          if({}.toString.apply(value) === '[object File]') {\n            bodyParam.append(key, value);\n          }\n          else if (value.type === 'file' && value.value) {\n            bodyParam.append(key, value.value);\n          } else {\n            if (Array.isArray(value)) {\n              if(param.collectionFormat === 'multi') {\n                bodyParam.delete(key);\n                for(var v in value) {\n                  bodyParam.append(key, value[v]);\n                }\n              }\n              else {\n                bodyParam.append(key, this.encodeQueryCollection(param.collectionFormat, key, value).split('=').slice(1).join('='));\n              }\n            }\n            else {\n              bodyParam.append(key, value);\n            }\n          }\n        }\n      }\n      body = bodyParam;\n    }\n    else {\n      bodyParam = {};\n      for (key in formParams) {\n        value = args[key];\n        if (Array.isArray(value)) {\n          var delimeter;\n          var format = param.collectionFormat || 'multi';\n          if(format === 'ssv') {\n            delimeter = ' ';\n          }\n          else if(format === 'pipes') {\n            delimeter = '|';\n          }\n          else if(format === 'tsv') {\n            delimeter = '\\t';\n          }\n          else if(format === 'multi') {\n            bodyParam[key] = value;\n            break;\n          }\n          else {\n            delimeter = ',';\n          }\n          var data;\n          value.forEach(function(v) {\n            if(data) {\n              data += delimeter;\n            }\n            else {\n              data = '';\n            }\n            data += v;\n          });\n          bodyParam[key] = data;\n        }\n        else {\n          bodyParam[key] = value;\n        }\n      }\n      body = bodyParam;\n    }\n    headers['Content-Type'] = 'multipart/form-data';\n  }\n\n  return body;\n};\n\n/**\n * gets sample response for a single operation\n **/\nOperation.prototype.getModelSampleJSON = function (type, models) {\n  var listType, sampleJson, innerType;\n  models = models || {};\n\n  listType = (type instanceof Array);\n  innerType = listType ? type[0] : type;\n\n  if(models[innerType]) {\n    sampleJson = models[innerType].createJSONSample();\n  } else if (this.getInlineModel(innerType)){\n    sampleJson = this.getInlineModel(innerType).createJSONSample(); // may return null, if type isn't correct\n  }\n\n\n  if (sampleJson) {\n    sampleJson = listType ? [sampleJson] : sampleJson;\n\n    if (typeof sampleJson === 'string') {\n      return sampleJson;\n    } else if (_.isObject(sampleJson)) {\n      var t = sampleJson;\n\n      if (sampleJson instanceof Array && sampleJson.length > 0) {\n        t = sampleJson[0];\n      }\n\n      if (t.nodeName && typeof t === 'Node') {\n        var xmlString = new XMLSerializer().serializeToString(t);\n\n        return this.formatXml(xmlString);\n      } else {\n        return JSON.stringify(sampleJson, null, 2);\n      }\n    } else {\n      return sampleJson;\n    }\n  }\n};\n\n/**\n * legacy binding\n **/\nOperation.prototype.do = function (args, opts, callback, error, parent) {\n  return this.execute(args, opts, callback, error, parent);\n};\n\n/**\n * executes an operation\n **/\nOperation.prototype.execute = function (arg1, arg2, arg3, arg4, parent) {\n  var args = arg1 || {};\n  var opts = {}, success, error, deferred, timeout;\n\n  if (_.isObject(arg2)) {\n    opts = arg2;\n    success = arg3;\n    error = arg4;\n  }\n\n  timeout = typeof opts.timeout !== 'undefined' ? opts.timeout : this.timeout;\n\n  if(this.client) {\n    opts.client = this.client;\n  }\n\n  if(this.requestAgent) {\n    opts.requestAgent = this.requestAgent;\n  }\n\n  // add the request interceptor from parent, if none sent from client\n  if(!opts.requestInterceptor && this.requestInterceptor ) {\n    opts.requestInterceptor = this.requestInterceptor ;\n  }\n\n  if(!opts.responseInterceptor && this.responseInterceptor) {\n    opts.responseInterceptor = this.responseInterceptor;\n  }\n\n  if (typeof arg2 === 'function') {\n    success = arg2;\n    error = arg3;\n  }\n\n  if (this.parent.usePromise) {\n    deferred = Q.defer();\n  } else {\n    success = (success || this.parent.defaultSuccessCallback || helpers.log);\n    error = (error || this.parent.defaultErrorCallback || helpers.log);\n  }\n\n  if (typeof opts.useJQuery === 'undefined') {\n    opts.useJQuery = this.useJQuery;\n  }\n\n  if (typeof opts.jqueryAjaxCache === 'undefined') {\n    opts.jqueryAjaxCache = this.jqueryAjaxCache;\n  }\n\n  if (typeof opts.enableCookies === 'undefined') {\n    opts.enableCookies = this.enableCookies;\n  }\n\n  var missingParams = this.getMissingParams(args);\n\n  if (missingParams.length > 0) {\n    var message = 'missing required params: ' + missingParams;\n\n    helpers.fail(message);\n\n    if (this.parent.usePromise) {\n      deferred.reject(message);\n      return deferred.promise;\n    } else {\n      error(message, parent);\n      return {};\n    }\n  }\n\n  var allHeaders = this.getHeaderParams(args);\n  var contentTypeHeaders = this.setContentTypes(args, opts);\n  var headers = {}, attrname;\n\n  for (attrname in allHeaders) { headers[attrname] = allHeaders[attrname]; }\n  for (attrname in contentTypeHeaders) { headers[attrname] = contentTypeHeaders[attrname]; }\n\n  var body = this.getBody(contentTypeHeaders, args, opts);\n  var url = this.urlify(args, opts.maskPasswords);\n\n  if(url.indexOf('.{format}') > 0) {\n    if(headers) {\n      var format = headers.Accept || headers.accept;\n      if(format && format.indexOf('json') > 0) {\n        url = url.replace('.{format}', '.json');\n      }\n      else if(format && format.indexOf('xml') > 0) {\n        url = url.replace('.{format}', '.xml');\n      }\n    }\n  }\n\n  var obj = {\n    url: url,\n    method: this.method.toUpperCase(),\n    body: body,\n    enableCookies: opts.enableCookies,\n    useJQuery: opts.useJQuery,\n    jqueryAjaxCache: opts.jqueryAjaxCache,\n    deferred: deferred,\n    headers: headers,\n    clientAuthorizations: opts.clientAuthorizations,\n    operation: this,\n    connectionAgent: this.connectionAgent,\n    on: {\n      response: function (response) {\n        if (deferred) {\n          deferred.resolve(response);\n          return deferred.promise;\n        } else {\n          return success(response, parent);\n        }\n      },\n      error: function (response) {\n        if (deferred) {\n          deferred.reject(response);\n          return deferred.promise;\n        } else {\n          return error(response, parent);\n        }\n      }\n    }\n  };\n\n  if (timeout) {\n    obj.timeout = timeout;\n  }\n\n  this.clientAuthorizations.apply(obj, this.operation.security);\n  if (opts.mock === true) {\n    return obj;\n  } else {\n    return new SwaggerHttp().execute(obj, opts);\n  }\n};\n\nfunction itemByPriority(col, itemPriority) {\n\n  // No priorities? return first...\n  if(_.isEmpty(itemPriority)) {\n    return col[0];\n  }\n\n  for (var i = 0, len = itemPriority.length; i < len; i++) {\n    if(col.indexOf(itemPriority[i]) > -1) {\n      return itemPriority[i];\n    }\n  }\n\n  // Otherwise return first\n  return col[0];\n}\n\nOperation.prototype.setContentTypes = function (args, opts) {\n  // default type\n  var allDefinedParams = this.parameters;\n  var body;\n  var consumes = args.parameterContentType || itemByPriority(this.consumes, ['application/json', 'application/yaml']);\n  var accepts = opts.responseContentType || itemByPriority(this.produces, ['application/json', 'application/yaml']);\n  var definedFileParams = [];\n  var definedFormParams = [];\n  var headers = {};\n  var i;\n\n  // get params from the operation and set them in definedFileParams, definedFormParams, headers\n  for (i = 0; i < allDefinedParams.length; i++) {\n    var param = allDefinedParams[i];\n\n    if (param.in === 'formData') {\n      if (param.type === 'file') {\n        definedFileParams.push(param);\n      } else {\n        definedFormParams.push(param);\n      }\n    } else if (param.in === 'header' && opts) {\n      var key = param.name;\n      var headerValue = opts[param.name];\n\n      if (typeof opts[param.name] !== 'undefined') {\n        headers[key] = headerValue;\n      }\n    } else if (param.in === 'body' && typeof args[param.name] !== 'undefined') {\n      body = args[param.name];\n    }\n  }\n\n  // if there's a body, need to set the consumes header via requestContentType\n  var hasBody = body || definedFileParams.length || definedFormParams.length;\n  if (this.method === 'post' || this.method === 'put' || this.method === 'patch' ||\n      ((this.method === 'delete' || this.method === 'get') && hasBody)) {\n    if (opts.requestContentType) {\n      consumes = opts.requestContentType;\n    }\n    // if any form params, content type must be set\n    if (definedFormParams.length > 0) {\n      consumes = undefined;\n      if (opts.requestContentType) {             // override if set\n        consumes = opts.requestContentType;\n      } else if (definedFileParams.length > 0) { // if a file, must be multipart/form-data\n        consumes = 'multipart/form-data';\n      } else {\n        if (this.consumes && this.consumes.length > 0) {\n          // use the consumes setting\n          for(var c in this.consumes) {\n            var chk = this.consumes[c];\n            if(chk.indexOf('application/x-www-form-urlencoded') === 0 || chk.indexOf('multipart/form-data') === 0) {\n              consumes = chk;\n            }\n          }\n        }\n      }\n      if(typeof consumes === 'undefined') {\n        // default to x-www-from-urlencoded\n        consumes = 'application/x-www-form-urlencoded';\n      }\n    }\n  }\n  else {\n    consumes = null;\n  }\n\n  if (consumes && this.consumes) {\n    if (this.consumes.indexOf(consumes) === -1) {\n      helpers.log('server doesn\\'t consume ' + consumes + ', try ' + JSON.stringify(this.consumes));\n    }\n  }\n\n  if (!this.matchesAccept(accepts)) {\n    helpers.log('server can\\'t produce ' + accepts);\n  }\n\n  if ((consumes && body !== '') || (consumes === 'application/x-www-form-urlencoded')) {\n    headers['Content-Type'] = consumes;\n  }\n  else if(this.consumes && this.consumes.length > 0 && this.consumes[0] === 'application/x-www-form-urlencoded') {\n    headers['Content-Type'] = this.consumes[0];\n  }\n\n  if (accepts) {\n    headers.Accept = accepts;\n  }\n\n  return headers;\n};\n\n/**\n * Returns true if the request accepts header matches anything in this.produces.\n *  If this.produces contains * / *, ignore the accept header.\n * @param {string=} accepts The client request accept header.\n * @return {boolean}\n */\nOperation.prototype.matchesAccept = function(accepts) {\n  // no accepts or produces, no problem!\n  if (!accepts || !this.produces) {\n    return true;\n  }\n  return this.produces.indexOf(accepts) !== -1 || this.produces.indexOf('*/*') !== -1;\n};\n\nOperation.prototype.asCurl = function (args1, args2) {\n  var opts = {mock: true, maskPasswords: true};\n  if (typeof args2 === 'object') {\n    for (var argKey in args2) {\n      opts[argKey] = args2[argKey];\n    }\n  }\n  var obj = this.execute(args1, opts);\n\n  this.clientAuthorizations.apply(obj, this.operation.security);\n\n  var results = [];\n\n  results.push('-X ' + this.method.toUpperCase());\n\n  if (typeof obj.headers !== 'undefined') {\n    var key;\n\n    for (key in obj.headers) {\n      var value = obj.headers[key];\n      if(typeof value === 'string'){\n        value = value.replace(/\\'/g, '\\\\u0027');\n      }\n      results.push('--header \\'' + key + ': ' + value + '\\'');\n    }\n  }\n  var isFormData = false;\n  var isMultipart = false;\n\n  var type = obj.headers['Content-Type'];\n  if(type && type.indexOf('application/x-www-form-urlencoded') === 0) {\n    isFormData = true;\n  }\n  else if (type && type.indexOf('multipart/form-data') === 0) {\n    isFormData = true;\n    isMultipart = true;\n  }\n\n  if (obj.body) {\n    var body;\n    if (_.isObject(obj.body)) {\n      if(isMultipart) {\n        isMultipart = true;\n        // add the form data\n        for(var i = 0; i < this.parameters.length; i++) {\n          var parameter = this.parameters[i];\n          if(parameter.in === 'formData') {\n            if (!body) {\n              body = '';\n            }\n\n            var paramValue;\n            if(typeof FormData === 'function' && obj.body instanceof FormData) {\n              paramValue = obj.body.getAll(parameter.name);\n            }\n            else {\n              paramValue = obj.body[parameter.name];\n            }\n            if (paramValue) {\n              if (parameter.type === 'file') {\n                if(paramValue.name) {\n                  body += '-F ' + parameter.name + '=@\"' + paramValue.name + '\" ';\n                }\n              }\n              else {\n                if (Array.isArray(paramValue)) {\n                  if(parameter.collectionFormat === 'multi') {\n                    for(var v in paramValue) {\n                      body += '-F ' + this.encodeQueryKey(parameter.name) + '=' + mask(paramValue[v], parameter.format) + ' ';\n                    }\n                  }\n                  else {\n                    body += '-F ' + this.encodeQueryCollection(parameter.collectionFormat, parameter.name, mask(paramValue, parameter.format)) + ' ';\n                  }\n                } else {\n                  body += '-F ' + this.encodeQueryKey(parameter.name) + '=' + mask(paramValue, parameter.format) + ' ';\n                }\n              }\n            }\n          }\n        }\n      }\n      if(!body) {\n        body = JSON.stringify(obj.body);\n      }\n    } else {\n      body = obj.body;\n    }\n    // escape @ => %40, ' => %27\n    body = body.replace(/\\'/g, '%27').replace(/\\n/g, ' \\\\ \\n ');\n\n    if(!isFormData) {\n      // escape & => %26\n      body = body.replace(/&/g, '%26');\n    }\n    if(isMultipart) {\n      results.push(body);\n    }\n    else {\n      results.push('-d \\'' + body.replace(/@/g, '%40') + '\\'');\n    }\n  }\n\n  return 'curl ' + (results.join(' ')) + ' \\'' + obj.url + '\\'';\n};\n\nOperation.prototype.encodePathCollection = function (type, name, value, maskPasswords) {\n  var encoded = '';\n  var i;\n  var separator = '';\n\n  if (type === 'ssv') {\n    separator = '%20';\n  } else if (type === 'tsv') {\n    separator = '%09';\n  } else if (type === 'pipes') {\n    separator = '|';\n  } else {\n    separator = ',';\n  }\n\n  for (i = 0; i < value.length; i++) {\n    if (i === 0) {\n      encoded = this.encodeQueryParam(value[i], maskPasswords);\n    } else {\n      encoded += separator + this.encodeQueryParam(value[i], maskPasswords);\n    }\n  }\n\n  return encoded;\n};\n\nOperation.prototype.encodeQueryCollection = function (type, name, value, maskPasswords) {\n  var encoded = '';\n  var i;\n\n  type = type || 'default';\n  if (type === 'default' || type === 'multi') {\n    for (i = 0; i < value.length; i++) {\n      if (i > 0) {encoded += '&';}\n\n      encoded += this.encodeQueryKey(name) + '=' + mask(this.encodeQueryParam(value[i]), maskPasswords);\n    }\n  } else {\n    var separator = '';\n\n    if (type === 'csv') {\n      separator = ',';\n    } else if (type === 'ssv') {\n      separator = '%20';\n    } else if (type === 'tsv') {\n      separator = '%09';\n    } else if (type === 'pipes') {\n      separator = '|';\n    } else if (type === 'brackets') {\n      for (i = 0; i < value.length; i++) {\n        if (i !== 0) {\n          encoded += '&';\n        }\n        encoded += this.encodeQueryKey(name) + '[]=' + mask(this.encodeQueryParam(value[i]), maskPasswords);\n      }\n    }\n\n    if (separator !== '') {\n      for (i = 0; i < value.length; i++) {\n        if (i === 0) {\n          encoded = this.encodeQueryKey(name) + '=' + this.encodeQueryParam(value[i]);\n        } else {\n          encoded += separator + this.encodeQueryParam(value[i]);\n        }\n      }\n    }\n  }\n\n  return encoded;\n};\n\nOperation.prototype.encodeQueryKey = function (arg) {\n  return encodeURIComponent(arg)\n      .replace('%5B','[').replace('%5D', ']').replace('%24', '$');\n};\n\nOperation.prototype.encodeQueryParam = function (arg, maskPasswords) {\n  if(maskPasswords) {\n    return \"******\";\n  }\n  return encodeURIComponent(arg);\n};\n\n/**\n * TODO revisit, might not want to leave '/'\n **/\nOperation.prototype.encodePathParam = function (pathParam, maskPasswords) {\n  return encodeURIComponent(pathParam, maskPasswords);\n};\n\nvar mask = function(value, format) {\n  if(typeof format === 'string' && format === 'password') {\n    return '******';\n  }\n  return value;\n}\n},{\"../helpers\":4,\"../http\":5,\"./model\":9,\"lodash-compat/lang/cloneDeep\":138,\"lodash-compat/lang/isEmpty\":141,\"lodash-compat/lang/isObject\":144,\"lodash-compat/lang/isUndefined\":148,\"q\":157}],11:[function(require,module,exports){\n'use strict';\n\nvar OperationGroup = module.exports = function (tag, description, externalDocs, operation) {\n  this.description = description;\n  this.externalDocs = externalDocs;\n  this.name = tag;\n  this.operation = operation;\n  this.operationsArray = [];\n  this.path = tag;\n  this.tag = tag;\n};\n\nOperationGroup.prototype.sort = function () {\n\n};\n\n\n},{}],12:[function(require,module,exports){\n// shim for using process in browser\n\nvar process = module.exports = {};\nvar queue = [];\nvar draining = false;\n\nfunction drainQueue() {\n    if (draining) {\n        return;\n    }\n    draining = true;\n    var currentQueue;\n    var len = queue.length;\n    while(len) {\n        currentQueue = queue;\n        queue = [];\n        var i = -1;\n        while (++i < len) {\n            currentQueue[i]();\n        }\n        len = queue.length;\n    }\n    draining = false;\n}\nprocess.nextTick = function (fun) {\n    queue.push(fun);\n    if (!draining) {\n        setTimeout(drainQueue, 0);\n    }\n};\n\nprocess.title = 'browser';\nprocess.browser = true;\nprocess.env = {};\nprocess.argv = [];\nprocess.version = ''; // empty string to avoid regexp issues\nprocess.versions = {};\n\nfunction noop() {}\n\nprocess.on = noop;\nprocess.addListener = noop;\nprocess.once = noop;\nprocess.off = noop;\nprocess.removeListener = noop;\nprocess.removeAllListeners = noop;\nprocess.emit = noop;\n\nprocess.binding = function (name) {\n    throw new Error('process.binding is not supported');\n};\n\n// TODO(shtylman)\nprocess.cwd = function () { return '/' };\nprocess.chdir = function (dir) {\n    throw new Error('process.chdir is not supported');\n};\nprocess.umask = function() { return 0; };\n\n},{}],13:[function(require,module,exports){\n(function (Buffer){\n(function () {\n  \"use strict\";\n\n  function btoa(str) {\n    var buffer\n      ;\n\n    if (str instanceof Buffer) {\n      buffer = str;\n    } else {\n      buffer = new Buffer(str.toString(), 'binary');\n    }\n\n    return buffer.toString('base64');\n  }\n\n  module.exports = btoa;\n}());\n\n}).call(this,require(\"buffer\").Buffer)\n\n},{\"buffer\":14}],14:[function(require,module,exports){\n/*!\n * The buffer module from node.js, for the browser.\n *\n * @author   Feross Aboukhadijeh <feross@feross.org> <http://feross.org>\n * @license  MIT\n */\n\nvar base64 = require('base64-js')\nvar ieee754 = require('ieee754')\nvar isArray = require('is-array')\n\nexports.Buffer = Buffer\nexports.SlowBuffer = SlowBuffer\nexports.INSPECT_MAX_BYTES = 50\nBuffer.poolSize = 8192 // not used by this implementation\n\nvar rootParent = {}\n\n/**\n * If `Buffer.TYPED_ARRAY_SUPPORT`:\n *   === true    Use Uint8Array implementation (fastest)\n *   === false   Use Object implementation (most compatible, even IE6)\n *\n * Browsers that support typed arrays are IE 10+, Firefox 4+, Chrome 7+, Safari 5.1+,\n * Opera 11.6+, iOS 4.2+.\n *\n * Due to various browser bugs, sometimes the Object implementation will be used even\n * when the browser supports typed arrays.\n *\n * Note:\n *\n *   - Firefox 4-29 lacks support for adding new properties to `Uint8Array` instances,\n *     See: https://bugzilla.mozilla.org/show_bug.cgi?id=695438.\n *\n *   - Safari 5-7 lacks support for changing the `Object.prototype.constructor` property\n *     on objects.\n *\n *   - Chrome 9-10 is missing the `TypedArray.prototype.subarray` function.\n *\n *   - IE10 has a broken `TypedArray.prototype.subarray` function which returns arrays of\n *     incorrect length in some situations.\n\n * We detect these buggy browsers and set `Buffer.TYPED_ARRAY_SUPPORT` to `false` so they\n * get the Object implementation, which is slower but behaves correctly.\n */\nBuffer.TYPED_ARRAY_SUPPORT = (function () {\n  function Bar () {}\n  try {\n    var arr = new Uint8Array(1)\n    arr.foo = function () { return 42 }\n    arr.constructor = Bar\n    return arr.foo() === 42 && // typed array instances can be augmented\n        arr.constructor === Bar && // constructor can be set\n        typeof arr.subarray === 'function' && // chrome 9-10 lack `subarray`\n        arr.subarray(1, 1).byteLength === 0 // ie10 has broken `subarray`\n  } catch (e) {\n    return false\n  }\n})()\n\nfunction kMaxLength () {\n  return Buffer.TYPED_ARRAY_SUPPORT\n    ? 0x7fffffff\n    : 0x3fffffff\n}\n\n/**\n * Class: Buffer\n * =============\n *\n * The Buffer constructor returns instances of `Uint8Array` that are augmented\n * with function properties for all the node `Buffer` API functions. We use\n * `Uint8Array` so that square bracket notation works as expected -- it returns\n * a single octet.\n *\n * By augmenting the instances, we can avoid modifying the `Uint8Array`\n * prototype.\n */\nfunction Buffer (arg) {\n  if (!(this instanceof Buffer)) {\n    // Avoid going through an ArgumentsAdaptorTrampoline in the common case.\n    if (arguments.length > 1) return new Buffer(arg, arguments[1])\n    return new Buffer(arg)\n  }\n\n  this.length = 0\n  this.parent = undefined\n\n  // Common case.\n  if (typeof arg === 'number') {\n    return fromNumber(this, arg)\n  }\n\n  // Slightly less common case.\n  if (typeof arg === 'string') {\n    return fromString(this, arg, arguments.length > 1 ? arguments[1] : 'utf8')\n  }\n\n  // Unusual.\n  return fromObject(this, arg)\n}\n\nfunction fromNumber (that, length) {\n  that = allocate(that, length < 0 ? 0 : checked(length) | 0)\n  if (!Buffer.TYPED_ARRAY_SUPPORT) {\n    for (var i = 0; i < length; i++) {\n      that[i] = 0\n    }\n  }\n  return that\n}\n\nfunction fromString (that, string, encoding) {\n  if (typeof encoding !== 'string' || encoding === '') encoding = 'utf8'\n\n  // Assumption: byteLength() return value is always < kMaxLength.\n  var length = byteLength(string, encoding) | 0\n  that = allocate(that, length)\n\n  that.write(string, encoding)\n  return that\n}\n\nfunction fromObject (that, object) {\n  if (Buffer.isBuffer(object)) return fromBuffer(that, object)\n\n  if (isArray(object)) return fromArray(that, object)\n\n  if (object == null) {\n    throw new TypeError('must start with number, buffer, array or string')\n  }\n\n  if (typeof ArrayBuffer !== 'undefined') {\n    if (object.buffer instanceof ArrayBuffer) {\n      return fromTypedArray(that, object)\n    }\n    if (object instanceof ArrayBuffer) {\n      return fromArrayBuffer(that, object)\n    }\n  }\n\n  if (object.length) return fromArrayLike(that, object)\n\n  return fromJsonObject(that, object)\n}\n\nfunction fromBuffer (that, buffer) {\n  var length = checked(buffer.length) | 0\n  that = allocate(that, length)\n  buffer.copy(that, 0, 0, length)\n  return that\n}\n\nfunction fromArray (that, array) {\n  var length = checked(array.length) | 0\n  that = allocate(that, length)\n  for (var i = 0; i < length; i += 1) {\n    that[i] = array[i] & 255\n  }\n  return that\n}\n\n// Duplicate of fromArray() to keep fromArray() monomorphic.\nfunction fromTypedArray (that, array) {\n  var length = checked(array.length) | 0\n  that = allocate(that, length)\n  // Truncating the elements is probably not what people expect from typed\n  // arrays with BYTES_PER_ELEMENT > 1 but it's compatible with the behavior\n  // of the old Buffer constructor.\n  for (var i = 0; i < length; i += 1) {\n    that[i] = array[i] & 255\n  }\n  return that\n}\n\nfunction fromArrayBuffer (that, array) {\n  if (Buffer.TYPED_ARRAY_SUPPORT) {\n    // Return an augmented `Uint8Array` instance, for best performance\n    array.byteLength\n    that = Buffer._augment(new Uint8Array(array))\n  } else {\n    // Fallback: Return an object instance of the Buffer class\n    that = fromTypedArray(that, new Uint8Array(array))\n  }\n  return that\n}\n\nfunction fromArrayLike (that, array) {\n  var length = checked(array.length) | 0\n  that = allocate(that, length)\n  for (var i = 0; i < length; i += 1) {\n    that[i] = array[i] & 255\n  }\n  return that\n}\n\n// Deserialize { type: 'Buffer', data: [1,2,3,...] } into a Buffer object.\n// Returns a zero-length buffer for inputs that don't conform to the spec.\nfunction fromJsonObject (that, object) {\n  var array\n  var length = 0\n\n  if (object.type === 'Buffer' && isArray(object.data)) {\n    array = object.data\n    length = checked(array.length) | 0\n  }\n  that = allocate(that, length)\n\n  for (var i = 0; i < length; i += 1) {\n    that[i] = array[i] & 255\n  }\n  return that\n}\n\nfunction allocate (that, length) {\n  if (Buffer.TYPED_ARRAY_SUPPORT) {\n    // Return an augmented `Uint8Array` instance, for best performance\n    that = Buffer._augment(new Uint8Array(length))\n  } else {\n    // Fallback: Return an object instance of the Buffer class\n    that.length = length\n    that._isBuffer = true\n  }\n\n  var fromPool = length !== 0 && length <= Buffer.poolSize >>> 1\n  if (fromPool) that.parent = rootParent\n\n  return that\n}\n\nfunction checked (length) {\n  // Note: cannot use `length < kMaxLength` here because that fails when\n  // length is NaN (which is otherwise coerced to zero.)\n  if (length >= kMaxLength()) {\n    throw new RangeError('Attempt to allocate Buffer larger than maximum ' +\n                         'size: 0x' + kMaxLength().toString(16) + ' bytes')\n  }\n  return length | 0\n}\n\nfunction SlowBuffer (subject, encoding) {\n  if (!(this instanceof SlowBuffer)) return new SlowBuffer(subject, encoding)\n\n  var buf = new Buffer(subject, encoding)\n  delete buf.parent\n  return buf\n}\n\nBuffer.isBuffer = function isBuffer (b) {\n  return !!(b != null && b._isBuffer)\n}\n\nBuffer.compare = function compare (a, b) {\n  if (!Buffer.isBuffer(a) || !Buffer.isBuffer(b)) {\n    throw new TypeError('Arguments must be Buffers')\n  }\n\n  if (a === b) return 0\n\n  var x = a.length\n  var y = b.length\n\n  var i = 0\n  var len = Math.min(x, y)\n  while (i < len) {\n    if (a[i] !== b[i]) break\n\n    ++i\n  }\n\n  if (i !== len) {\n    x = a[i]\n    y = b[i]\n  }\n\n  if (x < y) return -1\n  if (y < x) return 1\n  return 0\n}\n\nBuffer.isEncoding = function isEncoding (encoding) {\n  switch (String(encoding).toLowerCase()) {\n    case 'hex':\n    case 'utf8':\n    case 'utf-8':\n    case 'ascii':\n    case 'binary':\n    case 'base64':\n    case 'raw':\n    case 'ucs2':\n    case 'ucs-2':\n    case 'utf16le':\n    case 'utf-16le':\n      return true\n    default:\n      return false\n  }\n}\n\nBuffer.concat = function concat (list, length) {\n  if (!isArray(list)) throw new TypeError('list argument must be an Array of Buffers.')\n\n  if (list.length === 0) {\n    return new Buffer(0)\n  }\n\n  var i\n  if (length === undefined) {\n    length = 0\n    for (i = 0; i < list.length; i++) {\n      length += list[i].length\n    }\n  }\n\n  var buf = new Buffer(length)\n  var pos = 0\n  for (i = 0; i < list.length; i++) {\n    var item = list[i]\n    item.copy(buf, pos)\n    pos += item.length\n  }\n  return buf\n}\n\nfunction byteLength (string, encoding) {\n  if (typeof string !== 'string') string = '' + string\n\n  var len = string.length\n  if (len === 0) return 0\n\n  // Use a for loop to avoid recursion\n  var loweredCase = false\n  for (;;) {\n    switch (encoding) {\n      case 'ascii':\n      case 'binary':\n      // Deprecated\n      case 'raw':\n      case 'raws':\n        return len\n      case 'utf8':\n      case 'utf-8':\n        return utf8ToBytes(string).length\n      case 'ucs2':\n      case 'ucs-2':\n      case 'utf16le':\n      case 'utf-16le':\n        return len * 2\n      case 'hex':\n        return len >>> 1\n      case 'base64':\n        return base64ToBytes(string).length\n      default:\n        if (loweredCase) return utf8ToBytes(string).length // assume utf8\n        encoding = ('' + encoding).toLowerCase()\n        loweredCase = true\n    }\n  }\n}\nBuffer.byteLength = byteLength\n\n// pre-set for values that may exist in the future\nBuffer.prototype.length = undefined\nBuffer.prototype.parent = undefined\n\nfunction slowToString (encoding, start, end) {\n  var loweredCase = false\n\n  start = start | 0\n  end = end === undefined || end === Infinity ? this.length : end | 0\n\n  if (!encoding) encoding = 'utf8'\n  if (start < 0) start = 0\n  if (end > this.length) end = this.length\n  if (end <= start) return ''\n\n  while (true) {\n    switch (encoding) {\n      case 'hex':\n        return hexSlice(this, start, end)\n\n      case 'utf8':\n      case 'utf-8':\n        return utf8Slice(this, start, end)\n\n      case 'ascii':\n        return asciiSlice(this, start, end)\n\n      case 'binary':\n        return binarySlice(this, start, end)\n\n      case 'base64':\n        return base64Slice(this, start, end)\n\n      case 'ucs2':\n      case 'ucs-2':\n      case 'utf16le':\n      case 'utf-16le':\n        return utf16leSlice(this, start, end)\n\n      default:\n        if (loweredCase) throw new TypeError('Unknown encoding: ' + encoding)\n        encoding = (encoding + '').toLowerCase()\n        loweredCase = true\n    }\n  }\n}\n\nBuffer.prototype.toString = function toString () {\n  var length = this.length | 0\n  if (length === 0) return ''\n  if (arguments.length === 0) return utf8Slice(this, 0, length)\n  return slowToString.apply(this, arguments)\n}\n\nBuffer.prototype.equals = function equals (b) {\n  if (!Buffer.isBuffer(b)) throw new TypeError('Argument must be a Buffer')\n  if (this === b) return true\n  return Buffer.compare(this, b) === 0\n}\n\nBuffer.prototype.inspect = function inspect () {\n  var str = ''\n  var max = exports.INSPECT_MAX_BYTES\n  if (this.length > 0) {\n    str = this.toString('hex', 0, max).match(/.{2}/g).join(' ')\n    if (this.length > max) str += ' ... '\n  }\n  return '<Buffer ' + str + '>'\n}\n\nBuffer.prototype.compare = function compare (b) {\n  if (!Buffer.isBuffer(b)) throw new TypeError('Argument must be a Buffer')\n  if (this === b) return 0\n  return Buffer.compare(this, b)\n}\n\nBuffer.prototype.indexOf = function indexOf (val, byteOffset) {\n  if (byteOffset > 0x7fffffff) byteOffset = 0x7fffffff\n  else if (byteOffset < -0x80000000) byteOffset = -0x80000000\n  byteOffset >>= 0\n\n  if (this.length === 0) return -1\n  if (byteOffset >= this.length) return -1\n\n  // Negative offsets start from the end of the buffer\n  if (byteOffset < 0) byteOffset = Math.max(this.length + byteOffset, 0)\n\n  if (typeof val === 'string') {\n    if (val.length === 0) return -1 // special case: looking for empty string always fails\n    return String.prototype.indexOf.call(this, val, byteOffset)\n  }\n  if (Buffer.isBuffer(val)) {\n    return arrayIndexOf(this, val, byteOffset)\n  }\n  if (typeof val === 'number') {\n    if (Buffer.TYPED_ARRAY_SUPPORT && Uint8Array.prototype.indexOf === 'function') {\n      return Uint8Array.prototype.indexOf.call(this, val, byteOffset)\n    }\n    return arrayIndexOf(this, [ val ], byteOffset)\n  }\n\n  function arrayIndexOf (arr, val, byteOffset) {\n    var foundIndex = -1\n    for (var i = 0; byteOffset + i < arr.length; i++) {\n      if (arr[byteOffset + i] === val[foundIndex === -1 ? 0 : i - foundIndex]) {\n        if (foundIndex === -1) foundIndex = i\n        if (i - foundIndex + 1 === val.length) return byteOffset + foundIndex\n      } else {\n        foundIndex = -1\n      }\n    }\n    return -1\n  }\n\n  throw new TypeError('val must be string, number or Buffer')\n}\n\n// `get` is deprecated\nBuffer.prototype.get = function get (offset) {\n  console.log('.get() is deprecated. Access using array indexes instead.')\n  return this.readUInt8(offset)\n}\n\n// `set` is deprecated\nBuffer.prototype.set = function set (v, offset) {\n  console.log('.set() is deprecated. Access using array indexes instead.')\n  return this.writeUInt8(v, offset)\n}\n\nfunction hexWrite (buf, string, offset, length) {\n  offset = Number(offset) || 0\n  var remaining = buf.length - offset\n  if (!length) {\n    length = remaining\n  } else {\n    length = Number(length)\n    if (length > remaining) {\n      length = remaining\n    }\n  }\n\n  // must be an even number of digits\n  var strLen = string.length\n  if (strLen % 2 !== 0) throw new Error('Invalid hex string')\n\n  if (length > strLen / 2) {\n    length = strLen / 2\n  }\n  for (var i = 0; i < length; i++) {\n    var parsed = parseInt(string.substr(i * 2, 2), 16)\n    if (isNaN(parsed)) throw new Error('Invalid hex string')\n    buf[offset + i] = parsed\n  }\n  return i\n}\n\nfunction utf8Write (buf, string, offset, length) {\n  return blitBuffer(utf8ToBytes(string, buf.length - offset), buf, offset, length)\n}\n\nfunction asciiWrite (buf, string, offset, length) {\n  return blitBuffer(asciiToBytes(string), buf, offset, length)\n}\n\nfunction binaryWrite (buf, string, offset, length) {\n  return asciiWrite(buf, string, offset, length)\n}\n\nfunction base64Write (buf, string, offset, length) {\n  return blitBuffer(base64ToBytes(string), buf, offset, length)\n}\n\nfunction ucs2Write (buf, string, offset, length) {\n  return blitBuffer(utf16leToBytes(string, buf.length - offset), buf, offset, length)\n}\n\nBuffer.prototype.write = function write (string, offset, length, encoding) {\n  // Buffer#write(string)\n  if (offset === undefined) {\n    encoding = 'utf8'\n    length = this.length\n    offset = 0\n  // Buffer#write(string, encoding)\n  } else if (length === undefined && typeof offset === 'string') {\n    encoding = offset\n    length = this.length\n    offset = 0\n  // Buffer#write(string, offset[, length][, encoding])\n  } else if (isFinite(offset)) {\n    offset = offset | 0\n    if (isFinite(length)) {\n      length = length | 0\n      if (encoding === undefined) encoding = 'utf8'\n    } else {\n      encoding = length\n      length = undefined\n    }\n  // legacy write(string, encoding, offset, length) - remove in v0.13\n  } else {\n    var swap = encoding\n    encoding = offset\n    offset = length | 0\n    length = swap\n  }\n\n  var remaining = this.length - offset\n  if (length === undefined || length > remaining) length = remaining\n\n  if ((string.length > 0 && (length < 0 || offset < 0)) || offset > this.length) {\n    throw new RangeError('attempt to write outside buffer bounds')\n  }\n\n  if (!encoding) encoding = 'utf8'\n\n  var loweredCase = false\n  for (;;) {\n    switch (encoding) {\n      case 'hex':\n        return hexWrite(this, string, offset, length)\n\n      case 'utf8':\n      case 'utf-8':\n        return utf8Write(this, string, offset, length)\n\n      case 'ascii':\n        return asciiWrite(this, string, offset, length)\n\n      case 'binary':\n        return binaryWrite(this, string, offset, length)\n\n      case 'base64':\n        // Warning: maxLength not taken into account in base64Write\n        return base64Write(this, string, offset, length)\n\n      case 'ucs2':\n      case 'ucs-2':\n      case 'utf16le':\n      case 'utf-16le':\n        return ucs2Write(this, string, offset, length)\n\n      default:\n        if (loweredCase) throw new TypeError('Unknown encoding: ' + encoding)\n        encoding = ('' + encoding).toLowerCase()\n        loweredCase = true\n    }\n  }\n}\n\nBuffer.prototype.toJSON = function toJSON () {\n  return {\n    type: 'Buffer',\n    data: Array.prototype.slice.call(this._arr || this, 0)\n  }\n}\n\nfunction base64Slice (buf, start, end) {\n  if (start === 0 && end === buf.length) {\n    return base64.fromByteArray(buf)\n  } else {\n    return base64.fromByteArray(buf.slice(start, end))\n  }\n}\n\nfunction utf8Slice (buf, start, end) {\n  end = Math.min(buf.length, end)\n  var res = []\n\n  var i = start\n  while (i < end) {\n    var firstByte = buf[i]\n    var codePoint = null\n    var bytesPerSequence = (firstByte > 0xEF) ? 4\n      : (firstByte > 0xDF) ? 3\n      : (firstByte > 0xBF) ? 2\n      : 1\n\n    if (i + bytesPerSequence <= end) {\n      var secondByte, thirdByte, fourthByte, tempCodePoint\n\n      switch (bytesPerSequence) {\n        case 1:\n          if (firstByte < 0x80) {\n            codePoint = firstByte\n          }\n          break\n        case 2:\n          secondByte = buf[i + 1]\n          if ((secondByte & 0xC0) === 0x80) {\n            tempCodePoint = (firstByte & 0x1F) << 0x6 | (secondByte & 0x3F)\n            if (tempCodePoint > 0x7F) {\n              codePoint = tempCodePoint\n            }\n          }\n          break\n        case 3:\n          secondByte = buf[i + 1]\n          thirdByte = buf[i + 2]\n          if ((secondByte & 0xC0) === 0x80 && (thirdByte & 0xC0) === 0x80) {\n            tempCodePoint = (firstByte & 0xF) << 0xC | (secondByte & 0x3F) << 0x6 | (thirdByte & 0x3F)\n            if (tempCodePoint > 0x7FF && (tempCodePoint < 0xD800 || tempCodePoint > 0xDFFF)) {\n              codePoint = tempCodePoint\n            }\n          }\n          break\n        case 4:\n          secondByte = buf[i + 1]\n          thirdByte = buf[i + 2]\n          fourthByte = buf[i + 3]\n          if ((secondByte & 0xC0) === 0x80 && (thirdByte & 0xC0) === 0x80 && (fourthByte & 0xC0) === 0x80) {\n            tempCodePoint = (firstByte & 0xF) << 0x12 | (secondByte & 0x3F) << 0xC | (thirdByte & 0x3F) << 0x6 | (fourthByte & 0x3F)\n            if (tempCodePoint > 0xFFFF && tempCodePoint < 0x110000) {\n              codePoint = tempCodePoint\n            }\n          }\n      }\n    }\n\n    if (codePoint === null) {\n      // we did not generate a valid codePoint so insert a\n      // replacement char (U+FFFD) and advance only 1 byte\n      codePoint = 0xFFFD\n      bytesPerSequence = 1\n    } else if (codePoint > 0xFFFF) {\n      // encode to utf16 (surrogate pair dance)\n      codePoint -= 0x10000\n      res.push(codePoint >>> 10 & 0x3FF | 0xD800)\n      codePoint = 0xDC00 | codePoint & 0x3FF\n    }\n\n    res.push(codePoint)\n    i += bytesPerSequence\n  }\n\n  return decodeCodePointsArray(res)\n}\n\n// Based on http://stackoverflow.com/a/22747272/680742, the browser with\n// the lowest limit is Chrome, with 0x10000 args.\n// We go 1 magnitude less, for safety\nvar MAX_ARGUMENTS_LENGTH = 0x1000\n\nfunction decodeCodePointsArray (codePoints) {\n  var len = codePoints.length\n  if (len <= MAX_ARGUMENTS_LENGTH) {\n    return String.fromCharCode.apply(String, codePoints) // avoid extra slice()\n  }\n\n  // Decode in chunks to avoid \"call stack size exceeded\".\n  var res = ''\n  var i = 0\n  while (i < len) {\n    res += String.fromCharCode.apply(\n      String,\n      codePoints.slice(i, i += MAX_ARGUMENTS_LENGTH)\n    )\n  }\n  return res\n}\n\nfunction asciiSlice (buf, start, end) {\n  var ret = ''\n  end = Math.min(buf.length, end)\n\n  for (var i = start; i < end; i++) {\n    ret += String.fromCharCode(buf[i] & 0x7F)\n  }\n  return ret\n}\n\nfunction binarySlice (buf, start, end) {\n  var ret = ''\n  end = Math.min(buf.length, end)\n\n  for (var i = start; i < end; i++) {\n    ret += String.fromCharCode(buf[i])\n  }\n  return ret\n}\n\nfunction hexSlice (buf, start, end) {\n  var len = buf.length\n\n  if (!start || start < 0) start = 0\n  if (!end || end < 0 || end > len) end = len\n\n  var out = ''\n  for (var i = start; i < end; i++) {\n    out += toHex(buf[i])\n  }\n  return out\n}\n\nfunction utf16leSlice (buf, start, end) {\n  var bytes = buf.slice(start, end)\n  var res = ''\n  for (var i = 0; i < bytes.length; i += 2) {\n    res += String.fromCharCode(bytes[i] + bytes[i + 1] * 256)\n  }\n  return res\n}\n\nBuffer.prototype.slice = function slice (start, end) {\n  var len = this.length\n  start = ~~start\n  end = end === undefined ? len : ~~end\n\n  if (start < 0) {\n    start += len\n    if (start < 0) start = 0\n  } else if (start > len) {\n    start = len\n  }\n\n  if (end < 0) {\n    end += len\n    if (end < 0) end = 0\n  } else if (end > len) {\n    end = len\n  }\n\n  if (end < start) end = start\n\n  var newBuf\n  if (Buffer.TYPED_ARRAY_SUPPORT) {\n    newBuf = Buffer._augment(this.subarray(start, end))\n  } else {\n    var sliceLen = end - start\n    newBuf = new Buffer(sliceLen, undefined)\n    for (var i = 0; i < sliceLen; i++) {\n      newBuf[i] = this[i + start]\n    }\n  }\n\n  if (newBuf.length) newBuf.parent = this.parent || this\n\n  return newBuf\n}\n\n/*\n * Need to make sure that buffer isn't trying to write out of bounds.\n */\nfunction checkOffset (offset, ext, length) {\n  if ((offset % 1) !== 0 || offset < 0) throw new RangeError('offset is not uint')\n  if (offset + ext > length) throw new RangeError('Trying to access beyond buffer length')\n}\n\nBuffer.prototype.readUIntLE = function readUIntLE (offset, byteLength, noAssert) {\n  offset = offset | 0\n  byteLength = byteLength | 0\n  if (!noAssert) checkOffset(offset, byteLength, this.length)\n\n  var val = this[offset]\n  var mul = 1\n  var i = 0\n  while (++i < byteLength && (mul *= 0x100)) {\n    val += this[offset + i] * mul\n  }\n\n  return val\n}\n\nBuffer.prototype.readUIntBE = function readUIntBE (offset, byteLength, noAssert) {\n  offset = offset | 0\n  byteLength = byteLength | 0\n  if (!noAssert) {\n    checkOffset(offset, byteLength, this.length)\n  }\n\n  var val = this[offset + --byteLength]\n  var mul = 1\n  while (byteLength > 0 && (mul *= 0x100)) {\n    val += this[offset + --byteLength] * mul\n  }\n\n  return val\n}\n\nBuffer.prototype.readUInt8 = function readUInt8 (offset, noAssert) {\n  if (!noAssert) checkOffset(offset, 1, this.length)\n  return this[offset]\n}\n\nBuffer.prototype.readUInt16LE = function readUInt16LE (offset, noAssert) {\n  if (!noAssert) checkOffset(offset, 2, this.length)\n  return this[offset] | (this[offset + 1] << 8)\n}\n\nBuffer.prototype.readUInt16BE = function readUInt16BE (offset, noAssert) {\n  if (!noAssert) checkOffset(offset, 2, this.length)\n  return (this[offset] << 8) | this[offset + 1]\n}\n\nBuffer.prototype.readUInt32LE = function readUInt32LE (offset, noAssert) {\n  if (!noAssert) checkOffset(offset, 4, this.length)\n\n  return ((this[offset]) |\n      (this[offset + 1] << 8) |\n      (this[offset + 2] << 16)) +\n      (this[offset + 3] * 0x1000000)\n}\n\nBuffer.prototype.readUInt32BE = function readUInt32BE (offset, noAssert) {\n  if (!noAssert) checkOffset(offset, 4, this.length)\n\n  return (this[offset] * 0x1000000) +\n    ((this[offset + 1] << 16) |\n    (this[offset + 2] << 8) |\n    this[offset + 3])\n}\n\nBuffer.prototype.readIntLE = function readIntLE (offset, byteLength, noAssert) {\n  offset = offset | 0\n  byteLength = byteLength | 0\n  if (!noAssert) checkOffset(offset, byteLength, this.length)\n\n  var val = this[offset]\n  var mul = 1\n  var i = 0\n  while (++i < byteLength && (mul *= 0x100)) {\n    val += this[offset + i] * mul\n  }\n  mul *= 0x80\n\n  if (val >= mul) val -= Math.pow(2, 8 * byteLength)\n\n  return val\n}\n\nBuffer.prototype.readIntBE = function readIntBE (offset, byteLength, noAssert) {\n  offset = offset | 0\n  byteLength = byteLength | 0\n  if (!noAssert) checkOffset(offset, byteLength, this.length)\n\n  var i = byteLength\n  var mul = 1\n  var val = this[offset + --i]\n  while (i > 0 && (mul *= 0x100)) {\n    val += this[offset + --i] * mul\n  }\n  mul *= 0x80\n\n  if (val >= mul) val -= Math.pow(2, 8 * byteLength)\n\n  return val\n}\n\nBuffer.prototype.readInt8 = function readInt8 (offset, noAssert) {\n  if (!noAssert) checkOffset(offset, 1, this.length)\n  if (!(this[offset] & 0x80)) return (this[offset])\n  return ((0xff - this[offset] + 1) * -1)\n}\n\nBuffer.prototype.readInt16LE = function readInt16LE (offset, noAssert) {\n  if (!noAssert) checkOffset(offset, 2, this.length)\n  var val = this[offset] | (this[offset + 1] << 8)\n  return (val & 0x8000) ? val | 0xFFFF0000 : val\n}\n\nBuffer.prototype.readInt16BE = function readInt16BE (offset, noAssert) {\n  if (!noAssert) checkOffset(offset, 2, this.length)\n  var val = this[offset + 1] | (this[offset] << 8)\n  return (val & 0x8000) ? val | 0xFFFF0000 : val\n}\n\nBuffer.prototype.readInt32LE = function readInt32LE (offset, noAssert) {\n  if (!noAssert) checkOffset(offset, 4, this.length)\n\n  return (this[offset]) |\n    (this[offset + 1] << 8) |\n    (this[offset + 2] << 16) |\n    (this[offset + 3] << 24)\n}\n\nBuffer.prototype.readInt32BE = function readInt32BE (offset, noAssert) {\n  if (!noAssert) checkOffset(offset, 4, this.length)\n\n  return (this[offset] << 24) |\n    (this[offset + 1] << 16) |\n    (this[offset + 2] << 8) |\n    (this[offset + 3])\n}\n\nBuffer.prototype.readFloatLE = function readFloatLE (offset, noAssert) {\n  if (!noAssert) checkOffset(offset, 4, this.length)\n  return ieee754.read(this, offset, true, 23, 4)\n}\n\nBuffer.prototype.readFloatBE = function readFloatBE (offset, noAssert) {\n  if (!noAssert) checkOffset(offset, 4, this.length)\n  return ieee754.read(this, offset, false, 23, 4)\n}\n\nBuffer.prototype.readDoubleLE = function readDoubleLE (offset, noAssert) {\n  if (!noAssert) checkOffset(offset, 8, this.length)\n  return ieee754.read(this, offset, true, 52, 8)\n}\n\nBuffer.prototype.readDoubleBE = function readDoubleBE (offset, noAssert) {\n  if (!noAssert) checkOffset(offset, 8, this.length)\n  return ieee754.read(this, offset, false, 52, 8)\n}\n\nfunction checkInt (buf, value, offset, ext, max, min) {\n  if (!Buffer.isBuffer(buf)) throw new TypeError('buffer must be a Buffer instance')\n  if (value > max || value < min) throw new RangeError('value is out of bounds')\n  if (offset + ext > buf.length) throw new RangeError('index out of range')\n}\n\nBuffer.prototype.writeUIntLE = function writeUIntLE (value, offset, byteLength, noAssert) {\n  value = +value\n  offset = offset | 0\n  byteLength = byteLength | 0\n  if (!noAssert) checkInt(this, value, offset, byteLength, Math.pow(2, 8 * byteLength), 0)\n\n  var mul = 1\n  var i = 0\n  this[offset] = value & 0xFF\n  while (++i < byteLength && (mul *= 0x100)) {\n    this[offset + i] = (value / mul) & 0xFF\n  }\n\n  return offset + byteLength\n}\n\nBuffer.prototype.writeUIntBE = function writeUIntBE (value, offset, byteLength, noAssert) {\n  value = +value\n  offset = offset | 0\n  byteLength = byteLength | 0\n  if (!noAssert) checkInt(this, value, offset, byteLength, Math.pow(2, 8 * byteLength), 0)\n\n  var i = byteLength - 1\n  var mul = 1\n  this[offset + i] = value & 0xFF\n  while (--i >= 0 && (mul *= 0x100)) {\n    this[offset + i] = (value / mul) & 0xFF\n  }\n\n  return offset + byteLength\n}\n\nBuffer.prototype.writeUInt8 = function writeUInt8 (value, offset, noAssert) {\n  value = +value\n  offset = offset | 0\n  if (!noAssert) checkInt(this, value, offset, 1, 0xff, 0)\n  if (!Buffer.TYPED_ARRAY_SUPPORT) value = Math.floor(value)\n  this[offset] = value\n  return offset + 1\n}\n\nfunction objectWriteUInt16 (buf, value, offset, littleEndian) {\n  if (value < 0) value = 0xffff + value + 1\n  for (var i = 0, j = Math.min(buf.length - offset, 2); i < j; i++) {\n    buf[offset + i] = (value & (0xff << (8 * (littleEndian ? i : 1 - i)))) >>>\n      (littleEndian ? i : 1 - i) * 8\n  }\n}\n\nBuffer.prototype.writeUInt16LE = function writeUInt16LE (value, offset, noAssert) {\n  value = +value\n  offset = offset | 0\n  if (!noAssert) checkInt(this, value, offset, 2, 0xffff, 0)\n  if (Buffer.TYPED_ARRAY_SUPPORT) {\n    this[offset] = value\n    this[offset + 1] = (value >>> 8)\n  } else {\n    objectWriteUInt16(this, value, offset, true)\n  }\n  return offset + 2\n}\n\nBuffer.prototype.writeUInt16BE = function writeUInt16BE (value, offset, noAssert) {\n  value = +value\n  offset = offset | 0\n  if (!noAssert) checkInt(this, value, offset, 2, 0xffff, 0)\n  if (Buffer.TYPED_ARRAY_SUPPORT) {\n    this[offset] = (value >>> 8)\n    this[offset + 1] = value\n  } else {\n    objectWriteUInt16(this, value, offset, false)\n  }\n  return offset + 2\n}\n\nfunction objectWriteUInt32 (buf, value, offset, littleEndian) {\n  if (value < 0) value = 0xffffffff + value + 1\n  for (var i = 0, j = Math.min(buf.length - offset, 4); i < j; i++) {\n    buf[offset + i] = (value >>> (littleEndian ? i : 3 - i) * 8) & 0xff\n  }\n}\n\nBuffer.prototype.writeUInt32LE = function writeUInt32LE (value, offset, noAssert) {\n  value = +value\n  offset = offset | 0\n  if (!noAssert) checkInt(this, value, offset, 4, 0xffffffff, 0)\n  if (Buffer.TYPED_ARRAY_SUPPORT) {\n    this[offset + 3] = (value >>> 24)\n    this[offset + 2] = (value >>> 16)\n    this[offset + 1] = (value >>> 8)\n    this[offset] = value\n  } else {\n    objectWriteUInt32(this, value, offset, true)\n  }\n  return offset + 4\n}\n\nBuffer.prototype.writeUInt32BE = function writeUInt32BE (value, offset, noAssert) {\n  value = +value\n  offset = offset | 0\n  if (!noAssert) checkInt(this, value, offset, 4, 0xffffffff, 0)\n  if (Buffer.TYPED_ARRAY_SUPPORT) {\n    this[offset] = (value >>> 24)\n    this[offset + 1] = (value >>> 16)\n    this[offset + 2] = (value >>> 8)\n    this[offset + 3] = value\n  } else {\n    objectWriteUInt32(this, value, offset, false)\n  }\n  return offset + 4\n}\n\nBuffer.prototype.writeIntLE = function writeIntLE (value, offset, byteLength, noAssert) {\n  value = +value\n  offset = offset | 0\n  if (!noAssert) {\n    var limit = Math.pow(2, 8 * byteLength - 1)\n\n    checkInt(this, value, offset, byteLength, limit - 1, -limit)\n  }\n\n  var i = 0\n  var mul = 1\n  var sub = value < 0 ? 1 : 0\n  this[offset] = value & 0xFF\n  while (++i < byteLength && (mul *= 0x100)) {\n    this[offset + i] = ((value / mul) >> 0) - sub & 0xFF\n  }\n\n  return offset + byteLength\n}\n\nBuffer.prototype.writeIntBE = function writeIntBE (value, offset, byteLength, noAssert) {\n  value = +value\n  offset = offset | 0\n  if (!noAssert) {\n    var limit = Math.pow(2, 8 * byteLength - 1)\n\n    checkInt(this, value, offset, byteLength, limit - 1, -limit)\n  }\n\n  var i = byteLength - 1\n  var mul = 1\n  var sub = value < 0 ? 1 : 0\n  this[offset + i] = value & 0xFF\n  while (--i >= 0 && (mul *= 0x100)) {\n    this[offset + i] = ((value / mul) >> 0) - sub & 0xFF\n  }\n\n  return offset + byteLength\n}\n\nBuffer.prototype.writeInt8 = function writeInt8 (value, offset, noAssert) {\n  value = +value\n  offset = offset | 0\n  if (!noAssert) checkInt(this, value, offset, 1, 0x7f, -0x80)\n  if (!Buffer.TYPED_ARRAY_SUPPORT) value = Math.floor(value)\n  if (value < 0) value = 0xff + value + 1\n  this[offset] = value\n  return offset + 1\n}\n\nBuffer.prototype.writeInt16LE = function writeInt16LE (value, offset, noAssert) {\n  value = +value\n  offset = offset | 0\n  if (!noAssert) checkInt(this, value, offset, 2, 0x7fff, -0x8000)\n  if (Buffer.TYPED_ARRAY_SUPPORT) {\n    this[offset] = value\n    this[offset + 1] = (value >>> 8)\n  } else {\n    objectWriteUInt16(this, value, offset, true)\n  }\n  return offset + 2\n}\n\nBuffer.prototype.writeInt16BE = function writeInt16BE (value, offset, noAssert) {\n  value = +value\n  offset = offset | 0\n  if (!noAssert) checkInt(this, value, offset, 2, 0x7fff, -0x8000)\n  if (Buffer.TYPED_ARRAY_SUPPORT) {\n    this[offset] = (value >>> 8)\n    this[offset + 1] = value\n  } else {\n    objectWriteUInt16(this, value, offset, false)\n  }\n  return offset + 2\n}\n\nBuffer.prototype.writeInt32LE = function writeInt32LE (value, offset, noAssert) {\n  value = +value\n  offset = offset | 0\n  if (!noAssert) checkInt(this, value, offset, 4, 0x7fffffff, -0x80000000)\n  if (Buffer.TYPED_ARRAY_SUPPORT) {\n    this[offset] = value\n    this[offset + 1] = (value >>> 8)\n    this[offset + 2] = (value >>> 16)\n    this[offset + 3] = (value >>> 24)\n  } else {\n    objectWriteUInt32(this, value, offset, true)\n  }\n  return offset + 4\n}\n\nBuffer.prototype.writeInt32BE = function writeInt32BE (value, offset, noAssert) {\n  value = +value\n  offset = offset | 0\n  if (!noAssert) checkInt(this, value, offset, 4, 0x7fffffff, -0x80000000)\n  if (value < 0) value = 0xffffffff + value + 1\n  if (Buffer.TYPED_ARRAY_SUPPORT) {\n    this[offset] = (value >>> 24)\n    this[offset + 1] = (value >>> 16)\n    this[offset + 2] = (value >>> 8)\n    this[offset + 3] = value\n  } else {\n    objectWriteUInt32(this, value, offset, false)\n  }\n  return offset + 4\n}\n\nfunction checkIEEE754 (buf, value, offset, ext, max, min) {\n  if (value > max || value < min) throw new RangeError('value is out of bounds')\n  if (offset + ext > buf.length) throw new RangeError('index out of range')\n  if (offset < 0) throw new RangeError('index out of range')\n}\n\nfunction writeFloat (buf, value, offset, littleEndian, noAssert) {\n  if (!noAssert) {\n    checkIEEE754(buf, value, offset, 4, 3.4028234663852886e+38, -3.4028234663852886e+38)\n  }\n  ieee754.write(buf, value, offset, littleEndian, 23, 4)\n  return offset + 4\n}\n\nBuffer.prototype.writeFloatLE = function writeFloatLE (value, offset, noAssert) {\n  return writeFloat(this, value, offset, true, noAssert)\n}\n\nBuffer.prototype.writeFloatBE = function writeFloatBE (value, offset, noAssert) {\n  return writeFloat(this, value, offset, false, noAssert)\n}\n\nfunction writeDouble (buf, value, offset, littleEndian, noAssert) {\n  if (!noAssert) {\n    checkIEEE754(buf, value, offset, 8, 1.7976931348623157E+308, -1.7976931348623157E+308)\n  }\n  ieee754.write(buf, value, offset, littleEndian, 52, 8)\n  return offset + 8\n}\n\nBuffer.prototype.writeDoubleLE = function writeDoubleLE (value, offset, noAssert) {\n  return writeDouble(this, value, offset, true, noAssert)\n}\n\nBuffer.prototype.writeDoubleBE = function writeDoubleBE (value, offset, noAssert) {\n  return writeDouble(this, value, offset, false, noAssert)\n}\n\n// copy(targetBuffer, targetStart=0, sourceStart=0, sourceEnd=buffer.length)\nBuffer.prototype.copy = function copy (target, targetStart, start, end) {\n  if (!start) start = 0\n  if (!end && end !== 0) end = this.length\n  if (targetStart >= target.length) targetStart = target.length\n  if (!targetStart) targetStart = 0\n  if (end > 0 && end < start) end = start\n\n  // Copy 0 bytes; we're done\n  if (end === start) return 0\n  if (target.length === 0 || this.length === 0) return 0\n\n  // Fatal error conditions\n  if (targetStart < 0) {\n    throw new RangeError('targetStart out of bounds')\n  }\n  if (start < 0 || start >= this.length) throw new RangeError('sourceStart out of bounds')\n  if (end < 0) throw new RangeError('sourceEnd out of bounds')\n\n  // Are we oob?\n  if (end > this.length) end = this.length\n  if (target.length - targetStart < end - start) {\n    end = target.length - targetStart + start\n  }\n\n  var len = end - start\n  var i\n\n  if (this === target && start < targetStart && targetStart < end) {\n    // descending copy from end\n    for (i = len - 1; i >= 0; i--) {\n      target[i + targetStart] = this[i + start]\n    }\n  } else if (len < 1000 || !Buffer.TYPED_ARRAY_SUPPORT) {\n    // ascending copy from start\n    for (i = 0; i < len; i++) {\n      target[i + targetStart] = this[i + start]\n    }\n  } else {\n    target._set(this.subarray(start, start + len), targetStart)\n  }\n\n  return len\n}\n\n// fill(value, start=0, end=buffer.length)\nBuffer.prototype.fill = function fill (value, start, end) {\n  if (!value) value = 0\n  if (!start) start = 0\n  if (!end) end = this.length\n\n  if (end < start) throw new RangeError('end < start')\n\n  // Fill 0 bytes; we're done\n  if (end === start) return\n  if (this.length === 0) return\n\n  if (start < 0 || start >= this.length) throw new RangeError('start out of bounds')\n  if (end < 0 || end > this.length) throw new RangeError('end out of bounds')\n\n  var i\n  if (typeof value === 'number') {\n    for (i = start; i < end; i++) {\n      this[i] = value\n    }\n  } else {\n    var bytes = utf8ToBytes(value.toString())\n    var len = bytes.length\n    for (i = start; i < end; i++) {\n      this[i] = bytes[i % len]\n    }\n  }\n\n  return this\n}\n\n/**\n * Creates a new `ArrayBuffer` with the *copied* memory of the buffer instance.\n * Added in Node 0.12. Only available in browsers that support ArrayBuffer.\n */\nBuffer.prototype.toArrayBuffer = function toArrayBuffer () {\n  if (typeof Uint8Array !== 'undefined') {\n    if (Buffer.TYPED_ARRAY_SUPPORT) {\n      return (new Buffer(this)).buffer\n    } else {\n      var buf = new Uint8Array(this.length)\n      for (var i = 0, len = buf.length; i < len; i += 1) {\n        buf[i] = this[i]\n      }\n      return buf.buffer\n    }\n  } else {\n    throw new TypeError('Buffer.toArrayBuffer not supported in this browser')\n  }\n}\n\n// HELPER FUNCTIONS\n// ================\n\nvar BP = Buffer.prototype\n\n/**\n * Augment a Uint8Array *instance* (not the Uint8Array class!) with Buffer methods\n */\nBuffer._augment = function _augment (arr) {\n  arr.constructor = Buffer\n  arr._isBuffer = true\n\n  // save reference to original Uint8Array set method before overwriting\n  arr._set = arr.set\n\n  // deprecated\n  arr.get = BP.get\n  arr.set = BP.set\n\n  arr.write = BP.write\n  arr.toString = BP.toString\n  arr.toLocaleString = BP.toString\n  arr.toJSON = BP.toJSON\n  arr.equals = BP.equals\n  arr.compare = BP.compare\n  arr.indexOf = BP.indexOf\n  arr.copy = BP.copy\n  arr.slice = BP.slice\n  arr.readUIntLE = BP.readUIntLE\n  arr.readUIntBE = BP.readUIntBE\n  arr.readUInt8 = BP.readUInt8\n  arr.readUInt16LE = BP.readUInt16LE\n  arr.readUInt16BE = BP.readUInt16BE\n  arr.readUInt32LE = BP.readUInt32LE\n  arr.readUInt32BE = BP.readUInt32BE\n  arr.readIntLE = BP.readIntLE\n  arr.readIntBE = BP.readIntBE\n  arr.readInt8 = BP.readInt8\n  arr.readInt16LE = BP.readInt16LE\n  arr.readInt16BE = BP.readInt16BE\n  arr.readInt32LE = BP.readInt32LE\n  arr.readInt32BE = BP.readInt32BE\n  arr.readFloatLE = BP.readFloatLE\n  arr.readFloatBE = BP.readFloatBE\n  arr.readDoubleLE = BP.readDoubleLE\n  arr.readDoubleBE = BP.readDoubleBE\n  arr.writeUInt8 = BP.writeUInt8\n  arr.writeUIntLE = BP.writeUIntLE\n  arr.writeUIntBE = BP.writeUIntBE\n  arr.writeUInt16LE = BP.writeUInt16LE\n  arr.writeUInt16BE = BP.writeUInt16BE\n  arr.writeUInt32LE = BP.writeUInt32LE\n  arr.writeUInt32BE = BP.writeUInt32BE\n  arr.writeIntLE = BP.writeIntLE\n  arr.writeIntBE = BP.writeIntBE\n  arr.writeInt8 = BP.writeInt8\n  arr.writeInt16LE = BP.writeInt16LE\n  arr.writeInt16BE = BP.writeInt16BE\n  arr.writeInt32LE = BP.writeInt32LE\n  arr.writeInt32BE = BP.writeInt32BE\n  arr.writeFloatLE = BP.writeFloatLE\n  arr.writeFloatBE = BP.writeFloatBE\n  arr.writeDoubleLE = BP.writeDoubleLE\n  arr.writeDoubleBE = BP.writeDoubleBE\n  arr.fill = BP.fill\n  arr.inspect = BP.inspect\n  arr.toArrayBuffer = BP.toArrayBuffer\n\n  return arr\n}\n\nvar INVALID_BASE64_RE = /[^+\\/0-9A-Za-z-_]/g\n\nfunction base64clean (str) {\n  // Node strips out invalid characters like \\n and \\t from the string, base64-js does not\n  str = stringtrim(str).replace(INVALID_BASE64_RE, '')\n  // Node converts strings with length < 2 to ''\n  if (str.length < 2) return ''\n  // Node allows for non-padded base64 strings (missing trailing ===), base64-js does not\n  while (str.length % 4 !== 0) {\n    str = str + '='\n  }\n  return str\n}\n\nfunction stringtrim (str) {\n  if (str.trim) return str.trim()\n  return str.replace(/^\\s+|\\s+$/g, '')\n}\n\nfunction toHex (n) {\n  if (n < 16) return '0' + n.toString(16)\n  return n.toString(16)\n}\n\nfunction utf8ToBytes (string, units) {\n  units = units || Infinity\n  var codePoint\n  var length = string.length\n  var leadSurrogate = null\n  var bytes = []\n\n  for (var i = 0; i < length; i++) {\n    codePoint = string.charCodeAt(i)\n\n    // is surrogate component\n    if (codePoint > 0xD7FF && codePoint < 0xE000) {\n      // last char was a lead\n      if (!leadSurrogate) {\n        // no lead yet\n        if (codePoint > 0xDBFF) {\n          // unexpected trail\n          if ((units -= 3) > -1) bytes.push(0xEF, 0xBF, 0xBD)\n          continue\n        } else if (i + 1 === length) {\n          // unpaired lead\n          if ((units -= 3) > -1) bytes.push(0xEF, 0xBF, 0xBD)\n          continue\n        }\n\n        // valid lead\n        leadSurrogate = codePoint\n\n        continue\n      }\n\n      // 2 leads in a row\n      if (codePoint < 0xDC00) {\n        if ((units -= 3) > -1) bytes.push(0xEF, 0xBF, 0xBD)\n        leadSurrogate = codePoint\n        continue\n      }\n\n      // valid surrogate pair\n      codePoint = leadSurrogate - 0xD800 << 10 | codePoint - 0xDC00 | 0x10000\n    } else if (leadSurrogate) {\n      // valid bmp char, but last char was a lead\n      if ((units -= 3) > -1) bytes.push(0xEF, 0xBF, 0xBD)\n    }\n\n    leadSurrogate = null\n\n    // encode utf8\n    if (codePoint < 0x80) {\n      if ((units -= 1) < 0) break\n      bytes.push(codePoint)\n    } else if (codePoint < 0x800) {\n      if ((units -= 2) < 0) break\n      bytes.push(\n        codePoint >> 0x6 | 0xC0,\n        codePoint & 0x3F | 0x80\n      )\n    } else if (codePoint < 0x10000) {\n      if ((units -= 3) < 0) break\n      bytes.push(\n        codePoint >> 0xC | 0xE0,\n        codePoint >> 0x6 & 0x3F | 0x80,\n        codePoint & 0x3F | 0x80\n      )\n    } else if (codePoint < 0x110000) {\n      if ((units -= 4) < 0) break\n      bytes.push(\n        codePoint >> 0x12 | 0xF0,\n        codePoint >> 0xC & 0x3F | 0x80,\n        codePoint >> 0x6 & 0x3F | 0x80,\n        codePoint & 0x3F | 0x80\n      )\n    } else {\n      throw new Error('Invalid code point')\n    }\n  }\n\n  return bytes\n}\n\nfunction asciiToBytes (str) {\n  var byteArray = []\n  for (var i = 0; i < str.length; i++) {\n    // Node's code seems to be doing this and not & 0x7F..\n    byteArray.push(str.charCodeAt(i) & 0xFF)\n  }\n  return byteArray\n}\n\nfunction utf16leToBytes (str, units) {\n  var c, hi, lo\n  var byteArray = []\n  for (var i = 0; i < str.length; i++) {\n    if ((units -= 2) < 0) break\n\n    c = str.charCodeAt(i)\n    hi = c >> 8\n    lo = c % 256\n    byteArray.push(lo)\n    byteArray.push(hi)\n  }\n\n  return byteArray\n}\n\nfunction base64ToBytes (str) {\n  return base64.toByteArray(base64clean(str))\n}\n\nfunction blitBuffer (src, dst, offset, length) {\n  for (var i = 0; i < length; i++) {\n    if ((i + offset >= dst.length) || (i >= src.length)) break\n    dst[i + offset] = src[i]\n  }\n  return i\n}\n\n},{\"base64-js\":15,\"ieee754\":16,\"is-array\":17}],15:[function(require,module,exports){\nvar lookup = 'ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/';\n\n;(function (exports) {\n\t'use strict';\n\n  var Arr = (typeof Uint8Array !== 'undefined')\n    ? Uint8Array\n    : Array\n\n\tvar PLUS   = '+'.charCodeAt(0)\n\tvar SLASH  = '/'.charCodeAt(0)\n\tvar NUMBER = '0'.charCodeAt(0)\n\tvar LOWER  = 'a'.charCodeAt(0)\n\tvar UPPER  = 'A'.charCodeAt(0)\n\tvar PLUS_URL_SAFE = '-'.charCodeAt(0)\n\tvar SLASH_URL_SAFE = '_'.charCodeAt(0)\n\n\tfunction decode (elt) {\n\t\tvar code = elt.charCodeAt(0)\n\t\tif (code === PLUS ||\n\t\t    code === PLUS_URL_SAFE)\n\t\t\treturn 62 // '+'\n\t\tif (code === SLASH ||\n\t\t    code === SLASH_URL_SAFE)\n\t\t\treturn 63 // '/'\n\t\tif (code < NUMBER)\n\t\t\treturn -1 //no match\n\t\tif (code < NUMBER + 10)\n\t\t\treturn code - NUMBER + 26 + 26\n\t\tif (code < UPPER + 26)\n\t\t\treturn code - UPPER\n\t\tif (code < LOWER + 26)\n\t\t\treturn code - LOWER + 26\n\t}\n\n\tfunction b64ToByteArray (b64) {\n\t\tvar i, j, l, tmp, placeHolders, arr\n\n\t\tif (b64.length % 4 > 0) {\n\t\t\tthrow new Error('Invalid string. Length must be a multiple of 4')\n\t\t}\n\n\t\t// the number of equal signs (place holders)\n\t\t// if there are two placeholders, than the two characters before it\n\t\t// represent one byte\n\t\t// if there is only one, then the three characters before it represent 2 bytes\n\t\t// this is just a cheap hack to not do indexOf twice\n\t\tvar len = b64.length\n\t\tplaceHolders = '=' === b64.charAt(len - 2) ? 2 : '=' === b64.charAt(len - 1) ? 1 : 0\n\n\t\t// base64 is 4/3 + up to two characters of the original data\n\t\tarr = new Arr(b64.length * 3 / 4 - placeHolders)\n\n\t\t// if there are placeholders, only get up to the last complete 4 chars\n\t\tl = placeHolders > 0 ? b64.length - 4 : b64.length\n\n\t\tvar L = 0\n\n\t\tfunction push (v) {\n\t\t\tarr[L++] = v\n\t\t}\n\n\t\tfor (i = 0, j = 0; i < l; i += 4, j += 3) {\n\t\t\ttmp = (decode(b64.charAt(i)) << 18) | (decode(b64.charAt(i + 1)) << 12) | (decode(b64.charAt(i + 2)) << 6) | decode(b64.charAt(i + 3))\n\t\t\tpush((tmp & 0xFF0000) >> 16)\n\t\t\tpush((tmp & 0xFF00) >> 8)\n\t\t\tpush(tmp & 0xFF)\n\t\t}\n\n\t\tif (placeHolders === 2) {\n\t\t\ttmp = (decode(b64.charAt(i)) << 2) | (decode(b64.charAt(i + 1)) >> 4)\n\t\t\tpush(tmp & 0xFF)\n\t\t} else if (placeHolders === 1) {\n\t\t\ttmp = (decode(b64.charAt(i)) << 10) | (decode(b64.charAt(i + 1)) << 4) | (decode(b64.charAt(i + 2)) >> 2)\n\t\t\tpush((tmp >> 8) & 0xFF)\n\t\t\tpush(tmp & 0xFF)\n\t\t}\n\n\t\treturn arr\n\t}\n\n\tfunction uint8ToBase64 (uint8) {\n\t\tvar i,\n\t\t\textraBytes = uint8.length % 3, // if we have 1 byte left, pad 2 bytes\n\t\t\toutput = \"\",\n\t\t\ttemp, length\n\n\t\tfunction encode (num) {\n\t\t\treturn lookup.charAt(num)\n\t\t}\n\n\t\tfunction tripletToBase64 (num) {\n\t\t\treturn encode(num >> 18 & 0x3F) + encode(num >> 12 & 0x3F) + encode(num >> 6 & 0x3F) + encode(num & 0x3F)\n\t\t}\n\n\t\t// go through the array every three bytes, we'll deal with trailing stuff later\n\t\tfor (i = 0, length = uint8.length - extraBytes; i < length; i += 3) {\n\t\t\ttemp = (uint8[i] << 16) + (uint8[i + 1] << 8) + (uint8[i + 2])\n\t\t\toutput += tripletToBase64(temp)\n\t\t}\n\n\t\t// pad the end with zeros, but make sure to not forget the extra bytes\n\t\tswitch (extraBytes) {\n\t\t\tcase 1:\n\t\t\t\ttemp = uint8[uint8.length - 1]\n\t\t\t\toutput += encode(temp >> 2)\n\t\t\t\toutput += encode((temp << 4) & 0x3F)\n\t\t\t\toutput += '=='\n\t\t\t\tbreak\n\t\t\tcase 2:\n\t\t\t\ttemp = (uint8[uint8.length - 2] << 8) + (uint8[uint8.length - 1])\n\t\t\t\toutput += encode(temp >> 10)\n\t\t\t\toutput += encode((temp >> 4) & 0x3F)\n\t\t\t\toutput += encode((temp << 2) & 0x3F)\n\t\t\t\toutput += '='\n\t\t\t\tbreak\n\t\t}\n\n\t\treturn output\n\t}\n\n\texports.toByteArray = b64ToByteArray\n\texports.fromByteArray = uint8ToBase64\n}(typeof exports === 'undefined' ? (this.base64js = {}) : exports))\n\n},{}],16:[function(require,module,exports){\nexports.read = function (buffer, offset, isLE, mLen, nBytes) {\n  var e, m\n  var eLen = nBytes * 8 - mLen - 1\n  var eMax = (1 << eLen) - 1\n  var eBias = eMax >> 1\n  var nBits = -7\n  var i = isLE ? (nBytes - 1) : 0\n  var d = isLE ? -1 : 1\n  var s = buffer[offset + i]\n\n  i += d\n\n  e = s & ((1 << (-nBits)) - 1)\n  s >>= (-nBits)\n  nBits += eLen\n  for (; nBits > 0; e = e * 256 + buffer[offset + i], i += d, nBits -= 8) {}\n\n  m = e & ((1 << (-nBits)) - 1)\n  e >>= (-nBits)\n  nBits += mLen\n  for (; nBits > 0; m = m * 256 + buffer[offset + i], i += d, nBits -= 8) {}\n\n  if (e === 0) {\n    e = 1 - eBias\n  } else if (e === eMax) {\n    return m ? NaN : ((s ? -1 : 1) * Infinity)\n  } else {\n    m = m + Math.pow(2, mLen)\n    e = e - eBias\n  }\n  return (s ? -1 : 1) * m * Math.pow(2, e - mLen)\n}\n\nexports.write = function (buffer, value, offset, isLE, mLen, nBytes) {\n  var e, m, c\n  var eLen = nBytes * 8 - mLen - 1\n  var eMax = (1 << eLen) - 1\n  var eBias = eMax >> 1\n  var rt = (mLen === 23 ? Math.pow(2, -24) - Math.pow(2, -77) : 0)\n  var i = isLE ? 0 : (nBytes - 1)\n  var d = isLE ? 1 : -1\n  var s = value < 0 || (value === 0 && 1 / value < 0) ? 1 : 0\n\n  value = Math.abs(value)\n\n  if (isNaN(value) || value === Infinity) {\n    m = isNaN(value) ? 1 : 0\n    e = eMax\n  } else {\n    e = Math.floor(Math.log(value) / Math.LN2)\n    if (value * (c = Math.pow(2, -e)) < 1) {\n      e--\n      c *= 2\n    }\n    if (e + eBias >= 1) {\n      value += rt / c\n    } else {\n      value += rt * Math.pow(2, 1 - eBias)\n    }\n    if (value * c >= 2) {\n      e++\n      c /= 2\n    }\n\n    if (e + eBias >= eMax) {\n      m = 0\n      e = eMax\n    } else if (e + eBias >= 1) {\n      m = (value * c - 1) * Math.pow(2, mLen)\n      e = e + eBias\n    } else {\n      m = value * Math.pow(2, eBias - 1) * Math.pow(2, mLen)\n      e = 0\n    }\n  }\n\n  for (; mLen >= 8; buffer[offset + i] = m & 0xff, i += d, m /= 256, mLen -= 8) {}\n\n  e = (e << mLen) | m\n  eLen += mLen\n  for (; eLen > 0; buffer[offset + i] = e & 0xff, i += d, e /= 256, eLen -= 8) {}\n\n  buffer[offset + i - d] |= s * 128\n}\n\n},{}],17:[function(require,module,exports){\n\n/**\n * isArray\n */\n\nvar isArray = Array.isArray;\n\n/**\n * toString\n */\n\nvar str = Object.prototype.toString;\n\n/**\n * Whether or not the given `val`\n * is an array.\n *\n * example:\n *\n *        isArray([]);\n *        // > true\n *        isArray(arguments);\n *        // > false\n *        isArray('');\n *        // > false\n *\n * @param {mixed} val\n * @return {bool}\n */\n\nmodule.exports = isArray || function (val) {\n  return !! val && '[object Array]' == str.call(val);\n};\n\n},{}],18:[function(require,module,exports){\n/* jshint node: true */\n(function () {\n    \"use strict\";\n\n    function CookieAccessInfo(domain, path, secure, script) {\n        if (this instanceof CookieAccessInfo) {\n            this.domain = domain || undefined;\n            this.path = path || \"/\";\n            this.secure = !!secure;\n            this.script = !!script;\n            return this;\n        }\n        return new CookieAccessInfo(domain, path, secure, script);\n    }\n    exports.CookieAccessInfo = CookieAccessInfo;\n\n    function Cookie(cookiestr, request_domain, request_path) {\n        if (cookiestr instanceof Cookie) {\n            return cookiestr;\n        }\n        if (this instanceof Cookie) {\n            this.name = null;\n            this.value = null;\n            this.expiration_date = Infinity;\n            this.path = String(request_path || \"/\");\n            this.explicit_path = false;\n            this.domain = request_domain || null;\n            this.explicit_domain = false;\n            this.secure = false; //how to define default?\n            this.noscript = false; //httponly\n            if (cookiestr) {\n                this.parse(cookiestr, request_domain, request_path);\n            }\n            return this;\n        }\n        return new Cookie(cookiestr, request_domain, request_path);\n    }\n    exports.Cookie = Cookie;\n\n    Cookie.prototype.toString = function toString() {\n        var str = [this.name + \"=\" + this.value];\n        if (this.expiration_date !== Infinity) {\n            str.push(\"expires=\" + (new Date(this.expiration_date)).toGMTString());\n        }\n        if (this.domain) {\n            str.push(\"domain=\" + this.domain);\n        }\n        if (this.path) {\n            str.push(\"path=\" + this.path);\n        }\n        if (this.secure) {\n            str.push(\"secure\");\n        }\n        if (this.noscript) {\n            str.push(\"httponly\");\n        }\n        return str.join(\"; \");\n    };\n\n    Cookie.prototype.toValueString = function toValueString() {\n        return this.name + \"=\" + this.value;\n    };\n\n    var cookie_str_splitter = /[:](?=\\s*[a-zA-Z0-9_\\-]+\\s*[=])/g;\n    Cookie.prototype.parse = function parse(str, request_domain, request_path) {\n        if (this instanceof Cookie) {\n            var parts = str.split(\";\").filter(function (value) {\n                    return !!value;\n                }),\n                pair = parts[0].match(/([^=]+)=([\\s\\S]*)/),\n                key = pair[1],\n                value = pair[2],\n                i;\n            this.name = key;\n            this.value = value;\n\n            for (i = 1; i < parts.length; i += 1) {\n                pair = parts[i].match(/([^=]+)(?:=([\\s\\S]*))?/);\n                key = pair[1].trim().toLowerCase();\n                value = pair[2];\n                switch (key) {\n                case \"httponly\":\n                    this.noscript = true;\n                    break;\n                case \"expires\":\n                    this.expiration_date = value ?\n                            Number(Date.parse(value)) :\n                            Infinity;\n                    break;\n                case \"path\":\n                    this.path = value ?\n                            value.trim() :\n                            \"\";\n                    this.explicit_path = true;\n                    break;\n                case \"domain\":\n                    this.domain = value ?\n                            value.trim() :\n                            \"\";\n                    this.explicit_domain = !!this.domain;\n                    break;\n                case \"secure\":\n                    this.secure = true;\n                    break;\n                }\n            }\n\n            if (!this.explicit_path) {\n               this.path = request_path || \"/\";\n            }\n            if (!this.explicit_domain) {\n               this.domain = request_domain;\n            }\n\n            return this;\n        }\n        return new Cookie().parse(str, request_domain, request_path);\n    };\n\n    Cookie.prototype.matches = function matches(access_info) {\n        if (this.noscript && access_info.script ||\n                this.secure && !access_info.secure ||\n                !this.collidesWith(access_info)) {\n            return false;\n        }\n        return true;\n    };\n\n    Cookie.prototype.collidesWith = function collidesWith(access_info) {\n        if ((this.path && !access_info.path) || (this.domain && !access_info.domain)) {\n            return false;\n        }\n        if (this.path && access_info.path.indexOf(this.path) !== 0) {\n            return false;\n        }\n        if (this.explicit_path && access_info.path.indexOf( this.path ) !== 0) {\n           return false;\n        }\n        var access_domain = access_info.domain && access_info.domain.replace(/^[\\.]/,'');\n        var cookie_domain = this.domain && this.domain.replace(/^[\\.]/,'');\n        if (cookie_domain === access_domain) {\n            return true;\n        }\n        if (cookie_domain) {\n            if (!this.explicit_domain) {\n                return false; // we already checked if the domains were exactly the same\n            }\n            var wildcard = access_domain.indexOf(cookie_domain);\n            if (wildcard === -1 || wildcard !== access_domain.length - cookie_domain.length) {\n                return false;\n            }\n            return true;\n        }\n        return true;\n    };\n\n    function CookieJar() {\n        var cookies, cookies_list, collidable_cookie;\n        if (this instanceof CookieJar) {\n            cookies = Object.create(null); //name: [Cookie]\n\n            this.setCookie = function setCookie(cookie, request_domain, request_path) {\n                var remove, i;\n                cookie = new Cookie(cookie, request_domain, request_path);\n                //Delete the cookie if the set is past the current time\n                remove = cookie.expiration_date <= Date.now();\n                if (cookies[cookie.name] !== undefined) {\n                    cookies_list = cookies[cookie.name];\n                    for (i = 0; i < cookies_list.length; i += 1) {\n                        collidable_cookie = cookies_list[i];\n                        if (collidable_cookie.collidesWith(cookie)) {\n                            if (remove) {\n                                cookies_list.splice(i, 1);\n                                if (cookies_list.length === 0) {\n                                    delete cookies[cookie.name];\n                                }\n                                return false;\n                            }\n                            cookies_list[i] = cookie;\n                            return cookie;\n                        }\n                    }\n                    if (remove) {\n                        return false;\n                    }\n                    cookies_list.push(cookie);\n                    return cookie;\n                }\n                if (remove) {\n                    return false;\n                }\n                cookies[cookie.name] = [cookie];\n                return cookies[cookie.name];\n            };\n            //returns a cookie\n            this.getCookie = function getCookie(cookie_name, access_info) {\n                var cookie, i;\n                cookies_list = cookies[cookie_name];\n                if (!cookies_list) {\n                    return;\n                }\n                for (i = 0; i < cookies_list.length; i += 1) {\n                    cookie = cookies_list[i];\n                    if (cookie.expiration_date <= Date.now()) {\n                        if (cookies_list.length === 0) {\n                            delete cookies[cookie.name];\n                        }\n                        continue;\n                    }\n\n                    if (cookie.matches(access_info)) {\n                        return cookie;\n                    }\n                }\n            };\n            //returns a list of cookies\n            this.getCookies = function getCookies(access_info) {\n                var matches = [], cookie_name, cookie;\n                for (cookie_name in cookies) {\n                    cookie = this.getCookie(cookie_name, access_info);\n                    if (cookie) {\n                        matches.push(cookie);\n                    }\n                }\n                matches.toString = function toString() {\n                    return matches.join(\":\");\n                };\n                matches.toValueString = function toValueString() {\n                    return matches.map(function (c) {\n                        return c.toValueString();\n                    }).join(';');\n                };\n                return matches;\n            };\n\n            return this;\n        }\n        return new CookieJar();\n    }\n    exports.CookieJar = CookieJar;\n\n    //returns list of cookies that were set correctly. Cookies that are expired and removed are not returned.\n    CookieJar.prototype.setCookies = function setCookies(cookies, request_domain, request_path) {\n        cookies = Array.isArray(cookies) ?\n                cookies :\n                cookies.split(cookie_str_splitter);\n        var successful = [],\n            i,\n            cookie;\n        cookies = cookies.map(function(item){\n            return new Cookie(item, request_domain, request_path);\n        });\n        for (i = 0; i < cookies.length; i += 1) {\n            cookie = cookies[i];\n            if (this.setCookie(cookie, request_domain, request_path)) {\n                successful.push(cookie);\n            }\n        }\n        return successful;\n    };\n}());\n\n},{}],19:[function(require,module,exports){\n'use strict';\n\n\nvar yaml = require('./lib/js-yaml.js');\n\n\nmodule.exports = yaml;\n\n},{\"./lib/js-yaml.js\":20}],20:[function(require,module,exports){\n'use strict';\n\n\nvar loader = require('./js-yaml/loader');\nvar dumper = require('./js-yaml/dumper');\n\n\nfunction deprecated(name) {\n  return function () {\n    throw new Error('Function ' + name + ' is deprecated and cannot be used.');\n  };\n}\n\n\nmodule.exports.Type                = require('./js-yaml/type');\nmodule.exports.Schema              = require('./js-yaml/schema');\nmodule.exports.FAILSAFE_SCHEMA     = require('./js-yaml/schema/failsafe');\nmodule.exports.JSON_SCHEMA         = require('./js-yaml/schema/json');\nmodule.exports.CORE_SCHEMA         = require('./js-yaml/schema/core');\nmodule.exports.DEFAULT_SAFE_SCHEMA = require('./js-yaml/schema/default_safe');\nmodule.exports.DEFAULT_FULL_SCHEMA = require('./js-yaml/schema/default_full');\nmodule.exports.load                = loader.load;\nmodule.exports.loadAll             = loader.loadAll;\nmodule.exports.safeLoad            = loader.safeLoad;\nmodule.exports.safeLoadAll         = loader.safeLoadAll;\nmodule.exports.dump                = dumper.dump;\nmodule.exports.safeDump            = dumper.safeDump;\nmodule.exports.YAMLException       = require('./js-yaml/exception');\n\n// Deprecated schema names from JS-YAML 2.0.x\nmodule.exports.MINIMAL_SCHEMA = require('./js-yaml/schema/failsafe');\nmodule.exports.SAFE_SCHEMA    = require('./js-yaml/schema/default_safe');\nmodule.exports.DEFAULT_SCHEMA = require('./js-yaml/schema/default_full');\n\n// Deprecated functions from JS-YAML 1.x.x\nmodule.exports.scan           = deprecated('scan');\nmodule.exports.parse          = deprecated('parse');\nmodule.exports.compose        = deprecated('compose');\nmodule.exports.addConstructor = deprecated('addConstructor');\n\n},{\"./js-yaml/dumper\":22,\"./js-yaml/exception\":23,\"./js-yaml/loader\":24,\"./js-yaml/schema\":26,\"./js-yaml/schema/core\":27,\"./js-yaml/schema/default_full\":28,\"./js-yaml/schema/default_safe\":29,\"./js-yaml/schema/failsafe\":30,\"./js-yaml/schema/json\":31,\"./js-yaml/type\":32}],21:[function(require,module,exports){\n'use strict';\n\n\nfunction isNothing(subject) {\n  return (typeof subject === 'undefined') || (subject === null);\n}\n\n\nfunction isObject(subject) {\n  return (typeof subject === 'object') && (subject !== null);\n}\n\n\nfunction toArray(sequence) {\n  if (Array.isArray(sequence)) return sequence;\n  else if (isNothing(sequence)) return [];\n\n  return [ sequence ];\n}\n\n\nfunction extend(target, source) {\n  var index, length, key, sourceKeys;\n\n  if (source) {\n    sourceKeys = Object.keys(source);\n\n    for (index = 0, length = sourceKeys.length; index < length; index += 1) {\n      key = sourceKeys[index];\n      target[key] = source[key];\n    }\n  }\n\n  return target;\n}\n\n\nfunction repeat(string, count) {\n  var result = '', cycle;\n\n  for (cycle = 0; cycle < count; cycle += 1) {\n    result += string;\n  }\n\n  return result;\n}\n\n\nfunction isNegativeZero(number) {\n  return (number === 0) && (Number.NEGATIVE_INFINITY === 1 / number);\n}\n\n\nmodule.exports.isNothing      = isNothing;\nmodule.exports.isObject       = isObject;\nmodule.exports.toArray        = toArray;\nmodule.exports.repeat         = repeat;\nmodule.exports.isNegativeZero = isNegativeZero;\nmodule.exports.extend         = extend;\n\n},{}],22:[function(require,module,exports){\n'use strict';\n\n/*eslint-disable no-use-before-define*/\n\nvar common              = require('./common');\nvar YAMLException       = require('./exception');\nvar DEFAULT_FULL_SCHEMA = require('./schema/default_full');\nvar DEFAULT_SAFE_SCHEMA = require('./schema/default_safe');\n\nvar _toString       = Object.prototype.toString;\nvar _hasOwnProperty = Object.prototype.hasOwnProperty;\n\nvar CHAR_TAB                  = 0x09; /* Tab */\nvar CHAR_LINE_FEED            = 0x0A; /* LF */\nvar CHAR_SPACE                = 0x20; /* Space */\nvar CHAR_EXCLAMATION          = 0x21; /* ! */\nvar CHAR_DOUBLE_QUOTE         = 0x22; /* \" */\nvar CHAR_SHARP                = 0x23; /* # */\nvar CHAR_PERCENT              = 0x25; /* % */\nvar CHAR_AMPERSAND            = 0x26; /* & */\nvar CHAR_SINGLE_QUOTE         = 0x27; /* ' */\nvar CHAR_ASTERISK             = 0x2A; /* * */\nvar CHAR_COMMA                = 0x2C; /* , */\nvar CHAR_MINUS                = 0x2D; /* - */\nvar CHAR_COLON                = 0x3A; /* : */\nvar CHAR_GREATER_THAN         = 0x3E; /* > */\nvar CHAR_QUESTION             = 0x3F; /* ? */\nvar CHAR_COMMERCIAL_AT        = 0x40; /* @ */\nvar CHAR_LEFT_SQUARE_BRACKET  = 0x5B; /* [ */\nvar CHAR_RIGHT_SQUARE_BRACKET = 0x5D; /* ] */\nvar CHAR_GRAVE_ACCENT         = 0x60; /* ` */\nvar CHAR_LEFT_CURLY_BRACKET   = 0x7B; /* { */\nvar CHAR_VERTICAL_LINE        = 0x7C; /* | */\nvar CHAR_RIGHT_CURLY_BRACKET  = 0x7D; /* } */\n\nvar ESCAPE_SEQUENCES = {};\n\nESCAPE_SEQUENCES[0x00]   = '\\\\0';\nESCAPE_SEQUENCES[0x07]   = '\\\\a';\nESCAPE_SEQUENCES[0x08]   = '\\\\b';\nESCAPE_SEQUENCES[0x09]   = '\\\\t';\nESCAPE_SEQUENCES[0x0A]   = '\\\\n';\nESCAPE_SEQUENCES[0x0B]   = '\\\\v';\nESCAPE_SEQUENCES[0x0C]   = '\\\\f';\nESCAPE_SEQUENCES[0x0D]   = '\\\\r';\nESCAPE_SEQUENCES[0x1B]   = '\\\\e';\nESCAPE_SEQUENCES[0x22]   = '\\\\\"';\nESCAPE_SEQUENCES[0x5C]   = '\\\\\\\\';\nESCAPE_SEQUENCES[0x85]   = '\\\\N';\nESCAPE_SEQUENCES[0xA0]   = '\\\\_';\nESCAPE_SEQUENCES[0x2028] = '\\\\L';\nESCAPE_SEQUENCES[0x2029] = '\\\\P';\n\nvar DEPRECATED_BOOLEANS_SYNTAX = [\n  'y', 'Y', 'yes', 'Yes', 'YES', 'on', 'On', 'ON',\n  'n', 'N', 'no', 'No', 'NO', 'off', 'Off', 'OFF'\n];\n\nfunction compileStyleMap(schema, map) {\n  var result, keys, index, length, tag, style, type;\n\n  if (map === null) return {};\n\n  result = {};\n  keys = Object.keys(map);\n\n  for (index = 0, length = keys.length; index < length; index += 1) {\n    tag = keys[index];\n    style = String(map[tag]);\n\n    if (tag.slice(0, 2) === '!!') {\n      tag = 'tag:yaml.org,2002:' + tag.slice(2);\n    }\n\n    type = schema.compiledTypeMap[tag];\n\n    if (type && _hasOwnProperty.call(type.styleAliases, style)) {\n      style = type.styleAliases[style];\n    }\n\n    result[tag] = style;\n  }\n\n  return result;\n}\n\nfunction encodeHex(character) {\n  var string, handle, length;\n\n  string = character.toString(16).toUpperCase();\n\n  if (character <= 0xFF) {\n    handle = 'x';\n    length = 2;\n  } else if (character <= 0xFFFF) {\n    handle = 'u';\n    length = 4;\n  } else if (character <= 0xFFFFFFFF) {\n    handle = 'U';\n    length = 8;\n  } else {\n    throw new YAMLException('code point within a string may not be greater than 0xFFFFFFFF');\n  }\n\n  return '\\\\' + handle + common.repeat('0', length - string.length) + string;\n}\n\nfunction State(options) {\n  this.schema       = options['schema'] || DEFAULT_FULL_SCHEMA;\n  this.indent       = Math.max(1, (options['indent'] || 2));\n  this.skipInvalid  = options['skipInvalid'] || false;\n  this.flowLevel    = (common.isNothing(options['flowLevel']) ? -1 : options['flowLevel']);\n  this.styleMap     = compileStyleMap(this.schema, options['styles'] || null);\n  this.sortKeys     = options['sortKeys'] || false;\n  this.lineWidth    = options['lineWidth'] || 80;\n  this.noRefs       = options['noRefs'] || false;\n  this.noCompatMode = options['noCompatMode'] || false;\n\n  this.implicitTypes = this.schema.compiledImplicit;\n  this.explicitTypes = this.schema.compiledExplicit;\n\n  this.tag = null;\n  this.result = '';\n\n  this.duplicates = [];\n  this.usedDuplicates = null;\n}\n\n// Indents every line in a string. Empty lines (\\n only) are not indented.\nfunction indentString(string, spaces) {\n  var ind = common.repeat(' ', spaces),\n      position = 0,\n      next = -1,\n      result = '',\n      line,\n      length = string.length;\n\n  while (position < length) {\n    next = string.indexOf('\\n', position);\n    if (next === -1) {\n      line = string.slice(position);\n      position = length;\n    } else {\n      line = string.slice(position, next + 1);\n      position = next + 1;\n    }\n\n    if (line.length && line !== '\\n') result += ind;\n\n    result += line;\n  }\n\n  return result;\n}\n\nfunction generateNextLine(state, level) {\n  return '\\n' + common.repeat(' ', state.indent * level);\n}\n\nfunction testImplicitResolving(state, str) {\n  var index, length, type;\n\n  for (index = 0, length = state.implicitTypes.length; index < length; index += 1) {\n    type = state.implicitTypes[index];\n\n    if (type.resolve(str)) {\n      return true;\n    }\n  }\n\n  return false;\n}\n\n// [33] s-white ::= s-space | s-tab\nfunction isWhitespace(c) {\n  return c === CHAR_SPACE || c === CHAR_TAB;\n}\n\n// Returns true if the character can be printed without escaping.\n// From YAML 1.2: \"any allowed characters known to be non-printable\n// should also be escaped. [However,] This isn’t mandatory\"\n// Derived from nb-char - \\t - #x85 - #xA0 - #x2028 - #x2029.\nfunction isPrintable(c) {\n  return  (0x00020 <= c && c <= 0x00007E)\n      || ((0x000A1 <= c && c <= 0x00D7FF) && c !== 0x2028 && c !== 0x2029)\n      || ((0x0E000 <= c && c <= 0x00FFFD) && c !== 0xFEFF /* BOM */)\n      ||  (0x10000 <= c && c <= 0x10FFFF);\n}\n\n// Simplified test for values allowed after the first character in plain style.\nfunction isPlainSafe(c) {\n  // Uses a subset of nb-char - c-flow-indicator - \":\" - \"#\"\n  // where nb-char ::= c-printable - b-char - c-byte-order-mark.\n  return isPrintable(c) && c !== 0xFEFF\n    // - c-flow-indicator\n    && c !== CHAR_COMMA\n    && c !== CHAR_LEFT_SQUARE_BRACKET\n    && c !== CHAR_RIGHT_SQUARE_BRACKET\n    && c !== CHAR_LEFT_CURLY_BRACKET\n    && c !== CHAR_RIGHT_CURLY_BRACKET\n    // - \":\" - \"#\"\n    && c !== CHAR_COLON\n    && c !== CHAR_SHARP;\n}\n\n// Simplified test for values allowed as the first character in plain style.\nfunction isPlainSafeFirst(c) {\n  // Uses a subset of ns-char - c-indicator\n  // where ns-char = nb-char - s-white.\n  return isPrintable(c) && c !== 0xFEFF\n    && !isWhitespace(c) // - s-white\n    // - (c-indicator ::=\n    // “-” | “?” | “:” | “,” | “[” | “]” | “{” | “}”\n    && c !== CHAR_MINUS\n    && c !== CHAR_QUESTION\n    && c !== CHAR_COLON\n    && c !== CHAR_COMMA\n    && c !== CHAR_LEFT_SQUARE_BRACKET\n    && c !== CHAR_RIGHT_SQUARE_BRACKET\n    && c !== CHAR_LEFT_CURLY_BRACKET\n    && c !== CHAR_RIGHT_CURLY_BRACKET\n    // | “#” | “&” | “*” | “!” | “|” | “>” | “'” | “\"”\n    && c !== CHAR_SHARP\n    && c !== CHAR_AMPERSAND\n    && c !== CHAR_ASTERISK\n    && c !== CHAR_EXCLAMATION\n    && c !== CHAR_VERTICAL_LINE\n    && c !== CHAR_GREATER_THAN\n    && c !== CHAR_SINGLE_QUOTE\n    && c !== CHAR_DOUBLE_QUOTE\n    // | “%” | “@” | “`”)\n    && c !== CHAR_PERCENT\n    && c !== CHAR_COMMERCIAL_AT\n    && c !== CHAR_GRAVE_ACCENT;\n}\n\nvar STYLE_PLAIN   = 1,\n    STYLE_SINGLE  = 2,\n    STYLE_LITERAL = 3,\n    STYLE_FOLDED  = 4,\n    STYLE_DOUBLE  = 5;\n\n// Determines which scalar styles are possible and returns the preferred style.\n// lineWidth = -1 => no limit.\n// Pre-conditions: str.length > 0.\n// Post-conditions:\n//    STYLE_PLAIN or STYLE_SINGLE => no \\n are in the string.\n//    STYLE_LITERAL => no lines are suitable for folding (or lineWidth is -1).\n//    STYLE_FOLDED => a line > lineWidth and can be folded (and lineWidth != -1).\nfunction chooseScalarStyle(string, singleLineOnly, indentPerLevel, lineWidth, testAmbiguousType) {\n  var i;\n  var char;\n  var hasLineBreak = false;\n  var hasFoldableLine = false; // only checked if shouldTrackWidth\n  var shouldTrackWidth = lineWidth !== -1;\n  var previousLineBreak = -1; // count the first line correctly\n  var plain = isPlainSafeFirst(string.charCodeAt(0))\n          && !isWhitespace(string.charCodeAt(string.length - 1));\n\n  if (singleLineOnly) {\n    // Case: no block styles.\n    // Check for disallowed characters to rule out plain and single.\n    for (i = 0; i < string.length; i++) {\n      char = string.charCodeAt(i);\n      if (!isPrintable(char)) {\n        return STYLE_DOUBLE;\n      }\n      plain = plain && isPlainSafe(char);\n    }\n  } else {\n    // Case: block styles permitted.\n    for (i = 0; i < string.length; i++) {\n      char = string.charCodeAt(i);\n      if (char === CHAR_LINE_FEED) {\n        hasLineBreak = true;\n        // Check if any line can be folded.\n        if (shouldTrackWidth) {\n          hasFoldableLine = hasFoldableLine ||\n            // Foldable line = too long, and not more-indented.\n            (i - previousLineBreak - 1 > lineWidth &&\n             string[previousLineBreak + 1] !== ' ');\n          previousLineBreak = i;\n        }\n      } else if (!isPrintable(char)) {\n        return STYLE_DOUBLE;\n      }\n      plain = plain && isPlainSafe(char);\n    }\n    // in case the end is missing a \\n\n    hasFoldableLine = hasFoldableLine || (shouldTrackWidth &&\n      (i - previousLineBreak - 1 > lineWidth &&\n       string[previousLineBreak + 1] !== ' '));\n  }\n  // Although every style can represent \\n without escaping, prefer block styles\n  // for multiline, since they're more readable and they don't add empty lines.\n  // Also prefer folding a super-long line.\n  if (!hasLineBreak && !hasFoldableLine) {\n    // Strings interpretable as another type have to be quoted;\n    // e.g. the string 'true' vs. the boolean true.\n    return plain && !testAmbiguousType(string)\n      ? STYLE_PLAIN : STYLE_SINGLE;\n  }\n  // Edge case: block indentation indicator can only have one digit.\n  if (string[0] === ' ' && indentPerLevel > 9) {\n    return STYLE_DOUBLE;\n  }\n  // At this point we know block styles are valid.\n  // Prefer literal style unless we want to fold.\n  return hasFoldableLine ? STYLE_FOLDED : STYLE_LITERAL;\n}\n\n// Note: line breaking/folding is implemented for only the folded style.\n// NB. We drop the last trailing newline (if any) of a returned block scalar\n//  since the dumper adds its own newline. This always works:\n//    • No ending newline => unaffected; already using strip \"-\" chomping.\n//    • Ending newline    => removed then restored.\n//  Importantly, this keeps the \"+\" chomp indicator from gaining an extra line.\nfunction writeScalar(state, string, level, iskey) {\n  state.dump = (function () {\n    if (string.length === 0) {\n      return \"''\";\n    }\n    if (!state.noCompatMode &&\n        DEPRECATED_BOOLEANS_SYNTAX.indexOf(string) !== -1) {\n      return \"'\" + string + \"'\";\n    }\n\n    var indent = state.indent * Math.max(1, level); // no 0-indent scalars\n    // As indentation gets deeper, let the width decrease monotonically\n    // to the lower bound min(state.lineWidth, 40).\n    // Note that this implies\n    //  state.lineWidth ≤ 40 + state.indent: width is fixed at the lower bound.\n    //  state.lineWidth > 40 + state.indent: width decreases until the lower bound.\n    // This behaves better than a constant minimum width which disallows narrower options,\n    // or an indent threshold which causes the width to suddenly increase.\n    var lineWidth = state.lineWidth === -1\n      ? -1 : Math.max(Math.min(state.lineWidth, 40), state.lineWidth - indent);\n\n    // Without knowing if keys are implicit/explicit, assume implicit for safety.\n    var singleLineOnly = iskey\n      // No block styles in flow mode.\n      || (state.flowLevel > -1 && level >= state.flowLevel);\n    function testAmbiguity(string) {\n      return testImplicitResolving(state, string);\n    }\n\n    switch (chooseScalarStyle(string, singleLineOnly, state.indent, lineWidth, testAmbiguity)) {\n      case STYLE_PLAIN:\n        return string;\n      case STYLE_SINGLE:\n        return \"'\" + string.replace(/'/g, \"''\") + \"'\";\n      case STYLE_LITERAL:\n        return '|' + blockHeader(string, state.indent)\n          + dropEndingNewline(indentString(string, indent));\n      case STYLE_FOLDED:\n        return '>' + blockHeader(string, state.indent)\n          + dropEndingNewline(indentString(foldString(string, lineWidth), indent));\n      case STYLE_DOUBLE:\n        return '\"' + escapeString(string, lineWidth) + '\"';\n      default:\n        throw new YAMLException('impossible error: invalid scalar style');\n    }\n  }());\n}\n\n// Pre-conditions: string is valid for a block scalar, 1 <= indentPerLevel <= 9.\nfunction blockHeader(string, indentPerLevel) {\n  var indentIndicator = (string[0] === ' ') ? String(indentPerLevel) : '';\n\n  // note the special case: the string '\\n' counts as a \"trailing\" empty line.\n  var clip =          string[string.length - 1] === '\\n';\n  var keep = clip && (string[string.length - 2] === '\\n' || string === '\\n');\n  var chomp = keep ? '+' : (clip ? '' : '-');\n\n  return indentIndicator + chomp + '\\n';\n}\n\n// (See the note for writeScalar.)\nfunction dropEndingNewline(string) {\n  return string[string.length - 1] === '\\n' ? string.slice(0, -1) : string;\n}\n\n// Note: a long line without a suitable break point will exceed the width limit.\n// Pre-conditions: every char in str isPrintable, str.length > 0, width > 0.\nfunction foldString(string, width) {\n  // In folded style, $k$ consecutive newlines output as $k+1$ newlines—\n  // unless they're before or after a more-indented line, or at the very\n  // beginning or end, in which case $k$ maps to $k$.\n  // Therefore, parse each chunk as newline(s) followed by a content line.\n  var lineRe = /(\\n+)([^\\n]*)/g;\n\n  // first line (possibly an empty line)\n  var result = (function () {\n    var nextLF = string.indexOf('\\n');\n    nextLF = nextLF !== -1 ? nextLF : string.length;\n    lineRe.lastIndex = nextLF;\n    return foldLine(string.slice(0, nextLF), width);\n  }());\n  // If we haven't reached the first content line yet, don't add an extra \\n.\n  var prevMoreIndented = string[0] === '\\n' || string[0] === ' ';\n  var moreIndented;\n\n  // rest of the lines\n  var match;\n  while ((match = lineRe.exec(string))) {\n    var prefix = match[1], line = match[2];\n    moreIndented = (line[0] === ' ');\n    result += prefix\n      + (!prevMoreIndented && !moreIndented && line !== ''\n        ? '\\n' : '')\n      + foldLine(line, width);\n    prevMoreIndented = moreIndented;\n  }\n\n  return result;\n}\n\n// Greedy line breaking.\n// Picks the longest line under the limit each time,\n// otherwise settles for the shortest line over the limit.\n// NB. More-indented lines *cannot* be folded, as that would add an extra \\n.\nfunction foldLine(line, width) {\n  if (line === '' || line[0] === ' ') return line;\n\n  // Since a more-indented line adds a \\n, breaks can't be followed by a space.\n  var breakRe = / [^ ]/g; // note: the match index will always be <= length-2.\n  var match;\n  // start is an inclusive index. end, curr, and next are exclusive.\n  var start = 0, end, curr = 0, next = 0;\n  var result = '';\n\n  // Invariants: 0 <= start <= length-1.\n  //   0 <= curr <= next <= max(0, length-2). curr - start <= width.\n  // Inside the loop:\n  //   A match implies length >= 2, so curr and next are <= length-2.\n  while ((match = breakRe.exec(line))) {\n    next = match.index;\n    // maintain invariant: curr - start <= width\n    if (next - start > width) {\n      end = (curr > start) ? curr : next; // derive end <= length-2\n      result += '\\n' + line.slice(start, end);\n      // skip the space that was output as \\n\n      start = end + 1;                    // derive start <= length-1\n    }\n    curr = next;\n  }\n\n  // By the invariants, start <= length-1, so there is something left over.\n  // It is either the whole string or a part starting from non-whitespace.\n  result += '\\n';\n  // Insert a break if the remainder is too long and there is a break available.\n  if (line.length - start > width && curr > start) {\n    result += line.slice(start, curr) + '\\n' + line.slice(curr + 1);\n  } else {\n    result += line.slice(start);\n  }\n\n  return result.slice(1); // drop extra \\n joiner\n}\n\n// Escapes a double-quoted string.\nfunction escapeString(string) {\n  var result = '';\n  var char;\n  var escapeSeq;\n\n  for (var i = 0; i < string.length; i++) {\n    char = string.charCodeAt(i);\n    escapeSeq = ESCAPE_SEQUENCES[char];\n    result += !escapeSeq && isPrintable(char)\n      ? string[i]\n      : escapeSeq || encodeHex(char);\n  }\n\n  return result;\n}\n\nfunction writeFlowSequence(state, level, object) {\n  var _result = '',\n      _tag    = state.tag,\n      index,\n      length;\n\n  for (index = 0, length = object.length; index < length; index += 1) {\n    // Write only valid elements.\n    if (writeNode(state, level, object[index], false, false)) {\n      if (index !== 0) _result += ', ';\n      _result += state.dump;\n    }\n  }\n\n  state.tag = _tag;\n  state.dump = '[' + _result + ']';\n}\n\nfunction writeBlockSequence(state, level, object, compact) {\n  var _result = '',\n      _tag    = state.tag,\n      index,\n      length;\n\n  for (index = 0, length = object.length; index < length; index += 1) {\n    // Write only valid elements.\n    if (writeNode(state, level + 1, object[index], true, true)) {\n      if (!compact || index !== 0) {\n        _result += generateNextLine(state, level);\n      }\n      _result += '- ' + state.dump;\n    }\n  }\n\n  state.tag = _tag;\n  state.dump = _result || '[]'; // Empty sequence if no valid values.\n}\n\nfunction writeFlowMapping(state, level, object) {\n  var _result       = '',\n      _tag          = state.tag,\n      objectKeyList = Object.keys(object),\n      index,\n      length,\n      objectKey,\n      objectValue,\n      pairBuffer;\n\n  for (index = 0, length = objectKeyList.length; index < length; index += 1) {\n    pairBuffer = '';\n\n    if (index !== 0) pairBuffer += ', ';\n\n    objectKey = objectKeyList[index];\n    objectValue = object[objectKey];\n\n    if (!writeNode(state, level, objectKey, false, false)) {\n      continue; // Skip this pair because of invalid key;\n    }\n\n    if (state.dump.length > 1024) pairBuffer += '? ';\n\n    pairBuffer += state.dump + ': ';\n\n    if (!writeNode(state, level, objectValue, false, false)) {\n      continue; // Skip this pair because of invalid value.\n    }\n\n    pairBuffer += state.dump;\n\n    // Both key and value are valid.\n    _result += pairBuffer;\n  }\n\n  state.tag = _tag;\n  state.dump = '{' + _result + '}';\n}\n\nfunction writeBlockMapping(state, level, object, compact) {\n  var _result       = '',\n      _tag          = state.tag,\n      objectKeyList = Object.keys(object),\n      index,\n      length,\n      objectKey,\n      objectValue,\n      explicitPair,\n      pairBuffer;\n\n  // Allow sorting keys so that the output file is deterministic\n  if (state.sortKeys === true) {\n    // Default sorting\n    objectKeyList.sort();\n  } else if (typeof state.sortKeys === 'function') {\n    // Custom sort function\n    objectKeyList.sort(state.sortKeys);\n  } else if (state.sortKeys) {\n    // Something is wrong\n    throw new YAMLException('sortKeys must be a boolean or a function');\n  }\n\n  for (index = 0, length = objectKeyList.length; index < length; index += 1) {\n    pairBuffer = '';\n\n    if (!compact || index !== 0) {\n      pairBuffer += generateNextLine(state, level);\n    }\n\n    objectKey = objectKeyList[index];\n    objectValue = object[objectKey];\n\n    if (!writeNode(state, level + 1, objectKey, true, true, true)) {\n      continue; // Skip this pair because of invalid key.\n    }\n\n    explicitPair = (state.tag !== null && state.tag !== '?') ||\n                   (state.dump && state.dump.length > 1024);\n\n    if (explicitPair) {\n      if (state.dump && CHAR_LINE_FEED === state.dump.charCodeAt(0)) {\n        pairBuffer += '?';\n      } else {\n        pairBuffer += '? ';\n      }\n    }\n\n    pairBuffer += state.dump;\n\n    if (explicitPair) {\n      pairBuffer += generateNextLine(state, level);\n    }\n\n    if (!writeNode(state, level + 1, objectValue, true, explicitPair)) {\n      continue; // Skip this pair because of invalid value.\n    }\n\n    if (state.dump && CHAR_LINE_FEED === state.dump.charCodeAt(0)) {\n      pairBuffer += ':';\n    } else {\n      pairBuffer += ': ';\n    }\n\n    pairBuffer += state.dump;\n\n    // Both key and value are valid.\n    _result += pairBuffer;\n  }\n\n  state.tag = _tag;\n  state.dump = _result || '{}'; // Empty mapping if no valid pairs.\n}\n\nfunction detectType(state, object, explicit) {\n  var _result, typeList, index, length, type, style;\n\n  typeList = explicit ? state.explicitTypes : state.implicitTypes;\n\n  for (index = 0, length = typeList.length; index < length; index += 1) {\n    type = typeList[index];\n\n    if ((type.instanceOf  || type.predicate) &&\n        (!type.instanceOf || ((typeof object === 'object') && (object instanceof type.instanceOf))) &&\n        (!type.predicate  || type.predicate(object))) {\n\n      state.tag = explicit ? type.tag : '?';\n\n      if (type.represent) {\n        style = state.styleMap[type.tag] || type.defaultStyle;\n\n        if (_toString.call(type.represent) === '[object Function]') {\n          _result = type.represent(object, style);\n        } else if (_hasOwnProperty.call(type.represent, style)) {\n          _result = type.represent[style](object, style);\n        } else {\n          throw new YAMLException('!<' + type.tag + '> tag resolver accepts not \"' + style + '\" style');\n        }\n\n        state.dump = _result;\n      }\n\n      return true;\n    }\n  }\n\n  return false;\n}\n\n// Serializes `object` and writes it to global `result`.\n// Returns true on success, or false on invalid object.\n//\nfunction writeNode(state, level, object, block, compact, iskey) {\n  state.tag = null;\n  state.dump = object;\n\n  if (!detectType(state, object, false)) {\n    detectType(state, object, true);\n  }\n\n  var type = _toString.call(state.dump);\n\n  if (block) {\n    block = (state.flowLevel < 0 || state.flowLevel > level);\n  }\n\n  var objectOrArray = type === '[object Object]' || type === '[object Array]',\n      duplicateIndex,\n      duplicate;\n\n  if (objectOrArray) {\n    duplicateIndex = state.duplicates.indexOf(object);\n    duplicate = duplicateIndex !== -1;\n  }\n\n  if ((state.tag !== null && state.tag !== '?') || duplicate || (state.indent !== 2 && level > 0)) {\n    compact = false;\n  }\n\n  if (duplicate && state.usedDuplicates[duplicateIndex]) {\n    state.dump = '*ref_' + duplicateIndex;\n  } else {\n    if (objectOrArray && duplicate && !state.usedDuplicates[duplicateIndex]) {\n      state.usedDuplicates[duplicateIndex] = true;\n    }\n    if (type === '[object Object]') {\n      if (block && (Object.keys(state.dump).length !== 0)) {\n        writeBlockMapping(state, level, state.dump, compact);\n        if (duplicate) {\n          state.dump = '&ref_' + duplicateIndex + state.dump;\n        }\n      } else {\n        writeFlowMapping(state, level, state.dump);\n        if (duplicate) {\n          state.dump = '&ref_' + duplicateIndex + ' ' + state.dump;\n        }\n      }\n    } else if (type === '[object Array]') {\n      if (block && (state.dump.length !== 0)) {\n        writeBlockSequence(state, level, state.dump, compact);\n        if (duplicate) {\n          state.dump = '&ref_' + duplicateIndex + state.dump;\n        }\n      } else {\n        writeFlowSequence(state, level, state.dump);\n        if (duplicate) {\n          state.dump = '&ref_' + duplicateIndex + ' ' + state.dump;\n        }\n      }\n    } else if (type === '[object String]') {\n      if (state.tag !== '?') {\n        writeScalar(state, state.dump, level, iskey);\n      }\n    } else {\n      if (state.skipInvalid) return false;\n      throw new YAMLException('unacceptable kind of an object to dump ' + type);\n    }\n\n    if (state.tag !== null && state.tag !== '?') {\n      state.dump = '!<' + state.tag + '> ' + state.dump;\n    }\n  }\n\n  return true;\n}\n\nfunction getDuplicateReferences(object, state) {\n  var objects = [],\n      duplicatesIndexes = [],\n      index,\n      length;\n\n  inspectNode(object, objects, duplicatesIndexes);\n\n  for (index = 0, length = duplicatesIndexes.length; index < length; index += 1) {\n    state.duplicates.push(objects[duplicatesIndexes[index]]);\n  }\n  state.usedDuplicates = new Array(length);\n}\n\nfunction inspectNode(object, objects, duplicatesIndexes) {\n  var objectKeyList,\n      index,\n      length;\n\n  if (object !== null && typeof object === 'object') {\n    index = objects.indexOf(object);\n    if (index !== -1) {\n      if (duplicatesIndexes.indexOf(index) === -1) {\n        duplicatesIndexes.push(index);\n      }\n    } else {\n      objects.push(object);\n\n      if (Array.isArray(object)) {\n        for (index = 0, length = object.length; index < length; index += 1) {\n          inspectNode(object[index], objects, duplicatesIndexes);\n        }\n      } else {\n        objectKeyList = Object.keys(object);\n\n        for (index = 0, length = objectKeyList.length; index < length; index += 1) {\n          inspectNode(object[objectKeyList[index]], objects, duplicatesIndexes);\n        }\n      }\n    }\n  }\n}\n\nfunction dump(input, options) {\n  options = options || {};\n\n  var state = new State(options);\n\n  if (!state.noRefs) getDuplicateReferences(input, state);\n\n  if (writeNode(state, 0, input, true, true)) return state.dump + '\\n';\n\n  return '';\n}\n\nfunction safeDump(input, options) {\n  return dump(input, common.extend({ schema: DEFAULT_SAFE_SCHEMA }, options));\n}\n\nmodule.exports.dump     = dump;\nmodule.exports.safeDump = safeDump;\n\n},{\"./common\":21,\"./exception\":23,\"./schema/default_full\":28,\"./schema/default_safe\":29}],23:[function(require,module,exports){\n// YAML error class. http://stackoverflow.com/questions/8458984\n//\n'use strict';\n\nfunction YAMLException(reason, mark) {\n  // Super constructor\n  Error.call(this);\n\n  // Include stack trace in error object\n  if (Error.captureStackTrace) {\n    // Chrome and NodeJS\n    Error.captureStackTrace(this, this.constructor);\n  } else {\n    // FF, IE 10+ and Safari 6+. Fallback for others\n    this.stack = (new Error()).stack || '';\n  }\n\n  this.name = 'YAMLException';\n  this.reason = reason;\n  this.mark = mark;\n  this.message = (this.reason || '(unknown reason)') + (this.mark ? ' ' + this.mark.toString() : '');\n}\n\n\n// Inherit from Error\nYAMLException.prototype = Object.create(Error.prototype);\nYAMLException.prototype.constructor = YAMLException;\n\n\nYAMLException.prototype.toString = function toString(compact) {\n  var result = this.name + ': ';\n\n  result += this.reason || '(unknown reason)';\n\n  if (!compact && this.mark) {\n    result += ' ' + this.mark.toString();\n  }\n\n  return result;\n};\n\n\nmodule.exports = YAMLException;\n\n},{}],24:[function(require,module,exports){\n'use strict';\n\n/*eslint-disable max-len,no-use-before-define*/\n\nvar common              = require('./common');\nvar YAMLException       = require('./exception');\nvar Mark                = require('./mark');\nvar DEFAULT_SAFE_SCHEMA = require('./schema/default_safe');\nvar DEFAULT_FULL_SCHEMA = require('./schema/default_full');\n\n\nvar _hasOwnProperty = Object.prototype.hasOwnProperty;\n\n\nvar CONTEXT_FLOW_IN   = 1;\nvar CONTEXT_FLOW_OUT  = 2;\nvar CONTEXT_BLOCK_IN  = 3;\nvar CONTEXT_BLOCK_OUT = 4;\n\n\nvar CHOMPING_CLIP  = 1;\nvar CHOMPING_STRIP = 2;\nvar CHOMPING_KEEP  = 3;\n\n\nvar PATTERN_NON_PRINTABLE         = /[\\x00-\\x08\\x0B\\x0C\\x0E-\\x1F\\x7F-\\x84\\x86-\\x9F\\uFFFE\\uFFFF]|[\\uD800-\\uDBFF](?![\\uDC00-\\uDFFF])|(?:[^\\uD800-\\uDBFF]|^)[\\uDC00-\\uDFFF]/;\nvar PATTERN_NON_ASCII_LINE_BREAKS = /[\\x85\\u2028\\u2029]/;\nvar PATTERN_FLOW_INDICATORS       = /[,\\[\\]\\{\\}]/;\nvar PATTERN_TAG_HANDLE            = /^(?:!|!!|![a-z\\-]+!)$/i;\nvar PATTERN_TAG_URI               = /^(?:!|[^,\\[\\]\\{\\}])(?:%[0-9a-f]{2}|[0-9a-z\\-#;\\/\\?:@&=\\+\\$,_\\.!~\\*'\\(\\)\\[\\]])*$/i;\n\n\nfunction is_EOL(c) {\n  return (c === 0x0A/* LF */) || (c === 0x0D/* CR */);\n}\n\nfunction is_WHITE_SPACE(c) {\n  return (c === 0x09/* Tab */) || (c === 0x20/* Space */);\n}\n\nfunction is_WS_OR_EOL(c) {\n  return (c === 0x09/* Tab */) ||\n         (c === 0x20/* Space */) ||\n         (c === 0x0A/* LF */) ||\n         (c === 0x0D/* CR */);\n}\n\nfunction is_FLOW_INDICATOR(c) {\n  return c === 0x2C/* , */ ||\n         c === 0x5B/* [ */ ||\n         c === 0x5D/* ] */ ||\n         c === 0x7B/* { */ ||\n         c === 0x7D/* } */;\n}\n\nfunction fromHexCode(c) {\n  var lc;\n\n  if ((0x30/* 0 */ <= c) && (c <= 0x39/* 9 */)) {\n    return c - 0x30;\n  }\n\n  /*eslint-disable no-bitwise*/\n  lc = c | 0x20;\n\n  if ((0x61/* a */ <= lc) && (lc <= 0x66/* f */)) {\n    return lc - 0x61 + 10;\n  }\n\n  return -1;\n}\n\nfunction escapedHexLen(c) {\n  if (c === 0x78/* x */) { return 2; }\n  if (c === 0x75/* u */) { return 4; }\n  if (c === 0x55/* U */) { return 8; }\n  return 0;\n}\n\nfunction fromDecimalCode(c) {\n  if ((0x30/* 0 */ <= c) && (c <= 0x39/* 9 */)) {\n    return c - 0x30;\n  }\n\n  return -1;\n}\n\nfunction simpleEscapeSequence(c) {\n  return (c === 0x30/* 0 */) ? '\\x00' :\n        (c === 0x61/* a */) ? '\\x07' :\n        (c === 0x62/* b */) ? '\\x08' :\n        (c === 0x74/* t */) ? '\\x09' :\n        (c === 0x09/* Tab */) ? '\\x09' :\n        (c === 0x6E/* n */) ? '\\x0A' :\n        (c === 0x76/* v */) ? '\\x0B' :\n        (c === 0x66/* f */) ? '\\x0C' :\n        (c === 0x72/* r */) ? '\\x0D' :\n        (c === 0x65/* e */) ? '\\x1B' :\n        (c === 0x20/* Space */) ? ' ' :\n        (c === 0x22/* \" */) ? '\\x22' :\n        (c === 0x2F/* / */) ? '/' :\n        (c === 0x5C/* \\ */) ? '\\x5C' :\n        (c === 0x4E/* N */) ? '\\x85' :\n        (c === 0x5F/* _ */) ? '\\xA0' :\n        (c === 0x4C/* L */) ? '\\u2028' :\n        (c === 0x50/* P */) ? '\\u2029' : '';\n}\n\nfunction charFromCodepoint(c) {\n  if (c <= 0xFFFF) {\n    return String.fromCharCode(c);\n  }\n  // Encode UTF-16 surrogate pair\n  // https://en.wikipedia.org/wiki/UTF-16#Code_points_U.2B010000_to_U.2B10FFFF\n  return String.fromCharCode(((c - 0x010000) >> 10) + 0xD800,\n                             ((c - 0x010000) & 0x03FF) + 0xDC00);\n}\n\nvar simpleEscapeCheck = new Array(256); // integer, for fast access\nvar simpleEscapeMap = new Array(256);\nfor (var i = 0; i < 256; i++) {\n  simpleEscapeCheck[i] = simpleEscapeSequence(i) ? 1 : 0;\n  simpleEscapeMap[i] = simpleEscapeSequence(i);\n}\n\n\nfunction State(input, options) {\n  this.input = input;\n\n  this.filename  = options['filename']  || null;\n  this.schema    = options['schema']    || DEFAULT_FULL_SCHEMA;\n  this.onWarning = options['onWarning'] || null;\n  this.legacy    = options['legacy']    || false;\n  this.json      = options['json']      || false;\n  this.listener  = options['listener']  || null;\n\n  this.implicitTypes = this.schema.compiledImplicit;\n  this.typeMap       = this.schema.compiledTypeMap;\n\n  this.length     = input.length;\n  this.position   = 0;\n  this.line       = 0;\n  this.lineStart  = 0;\n  this.lineIndent = 0;\n\n  this.documents = [];\n\n  /*\n  this.version;\n  this.checkLineBreaks;\n  this.tagMap;\n  this.anchorMap;\n  this.tag;\n  this.anchor;\n  this.kind;\n  this.result;*/\n\n}\n\n\nfunction generateError(state, message) {\n  return new YAMLException(\n    message,\n    new Mark(state.filename, state.input, state.position, state.line, (state.position - state.lineStart)));\n}\n\nfunction throwError(state, message) {\n  throw generateError(state, message);\n}\n\nfunction throwWarning(state, message) {\n  if (state.onWarning) {\n    state.onWarning.call(null, generateError(state, message));\n  }\n}\n\n\nvar directiveHandlers = {\n\n  YAML: function handleYamlDirective(state, name, args) {\n\n    var match, major, minor;\n\n    if (state.version !== null) {\n      throwError(state, 'duplication of %YAML directive');\n    }\n\n    if (args.length !== 1) {\n      throwError(state, 'YAML directive accepts exactly one argument');\n    }\n\n    match = /^([0-9]+)\\.([0-9]+)$/.exec(args[0]);\n\n    if (match === null) {\n      throwError(state, 'ill-formed argument of the YAML directive');\n    }\n\n    major = parseInt(match[1], 10);\n    minor = parseInt(match[2], 10);\n\n    if (major !== 1) {\n      throwError(state, 'unacceptable YAML version of the document');\n    }\n\n    state.version = args[0];\n    state.checkLineBreaks = (minor < 2);\n\n    if (minor !== 1 && minor !== 2) {\n      throwWarning(state, 'unsupported YAML version of the document');\n    }\n  },\n\n  TAG: function handleTagDirective(state, name, args) {\n\n    var handle, prefix;\n\n    if (args.length !== 2) {\n      throwError(state, 'TAG directive accepts exactly two arguments');\n    }\n\n    handle = args[0];\n    prefix = args[1];\n\n    if (!PATTERN_TAG_HANDLE.test(handle)) {\n      throwError(state, 'ill-formed tag handle (first argument) of the TAG directive');\n    }\n\n    if (_hasOwnProperty.call(state.tagMap, handle)) {\n      throwError(state, 'there is a previously declared suffix for \"' + handle + '\" tag handle');\n    }\n\n    if (!PATTERN_TAG_URI.test(prefix)) {\n      throwError(state, 'ill-formed tag prefix (second argument) of the TAG directive');\n    }\n\n    state.tagMap[handle] = prefix;\n  }\n};\n\n\nfunction captureSegment(state, start, end, checkJson) {\n  var _position, _length, _character, _result;\n\n  if (start < end) {\n    _result = state.input.slice(start, end);\n\n    if (checkJson) {\n      for (_position = 0, _length = _result.length;\n           _position < _length;\n           _position += 1) {\n        _character = _result.charCodeAt(_position);\n        if (!(_character === 0x09 ||\n              (0x20 <= _character && _character <= 0x10FFFF))) {\n          throwError(state, 'expected valid JSON character');\n        }\n      }\n    } else if (PATTERN_NON_PRINTABLE.test(_result)) {\n      throwError(state, 'the stream contains non-printable characters');\n    }\n\n    state.result += _result;\n  }\n}\n\nfunction mergeMappings(state, destination, source, overridableKeys) {\n  var sourceKeys, key, index, quantity;\n\n  if (!common.isObject(source)) {\n    throwError(state, 'cannot merge mappings; the provided source object is unacceptable');\n  }\n\n  sourceKeys = Object.keys(source);\n\n  for (index = 0, quantity = sourceKeys.length; index < quantity; index += 1) {\n    key = sourceKeys[index];\n\n    if (!_hasOwnProperty.call(destination, key)) {\n      destination[key] = source[key];\n      overridableKeys[key] = true;\n    }\n  }\n}\n\nfunction storeMappingPair(state, _result, overridableKeys, keyTag, keyNode, valueNode) {\n  var index, quantity;\n\n  keyNode = String(keyNode);\n\n  if (_result === null) {\n    _result = {};\n  }\n\n  if (keyTag === 'tag:yaml.org,2002:merge') {\n    if (Array.isArray(valueNode)) {\n      for (index = 0, quantity = valueNode.length; index < quantity; index += 1) {\n        mergeMappings(state, _result, valueNode[index], overridableKeys);\n      }\n    } else {\n      mergeMappings(state, _result, valueNode, overridableKeys);\n    }\n  } else {\n    if (!state.json &&\n        !_hasOwnProperty.call(overridableKeys, keyNode) &&\n        _hasOwnProperty.call(_result, keyNode)) {\n      throwError(state, 'duplicated mapping key');\n    }\n    _result[keyNode] = valueNode;\n    delete overridableKeys[keyNode];\n  }\n\n  return _result;\n}\n\nfunction readLineBreak(state) {\n  var ch;\n\n  ch = state.input.charCodeAt(state.position);\n\n  if (ch === 0x0A/* LF */) {\n    state.position++;\n  } else if (ch === 0x0D/* CR */) {\n    state.position++;\n    if (state.input.charCodeAt(state.position) === 0x0A/* LF */) {\n      state.position++;\n    }\n  } else {\n    throwError(state, 'a line break is expected');\n  }\n\n  state.line += 1;\n  state.lineStart = state.position;\n}\n\nfunction skipSeparationSpace(state, allowComments, checkIndent) {\n  var lineBreaks = 0,\n      ch = state.input.charCodeAt(state.position);\n\n  while (ch !== 0) {\n    while (is_WHITE_SPACE(ch)) {\n      ch = state.input.charCodeAt(++state.position);\n    }\n\n    if (allowComments && ch === 0x23/* # */) {\n      do {\n        ch = state.input.charCodeAt(++state.position);\n      } while (ch !== 0x0A/* LF */ && ch !== 0x0D/* CR */ && ch !== 0);\n    }\n\n    if (is_EOL(ch)) {\n      readLineBreak(state);\n\n      ch = state.input.charCodeAt(state.position);\n      lineBreaks++;\n      state.lineIndent = 0;\n\n      while (ch === 0x20/* Space */) {\n        state.lineIndent++;\n        ch = state.input.charCodeAt(++state.position);\n      }\n    } else {\n      break;\n    }\n  }\n\n  if (checkIndent !== -1 && lineBreaks !== 0 && state.lineIndent < checkIndent) {\n    throwWarning(state, 'deficient indentation');\n  }\n\n  return lineBreaks;\n}\n\nfunction testDocumentSeparator(state) {\n  var _position = state.position,\n      ch;\n\n  ch = state.input.charCodeAt(_position);\n\n  // Condition state.position === state.lineStart is tested\n  // in parent on each call, for efficiency. No needs to test here again.\n  if ((ch === 0x2D/* - */ || ch === 0x2E/* . */) &&\n      ch === state.input.charCodeAt(_position + 1) &&\n      ch === state.input.charCodeAt(_position + 2)) {\n\n    _position += 3;\n\n    ch = state.input.charCodeAt(_position);\n\n    if (ch === 0 || is_WS_OR_EOL(ch)) {\n      return true;\n    }\n  }\n\n  return false;\n}\n\nfunction writeFoldedLines(state, count) {\n  if (count === 1) {\n    state.result += ' ';\n  } else if (count > 1) {\n    state.result += common.repeat('\\n', count - 1);\n  }\n}\n\n\nfunction readPlainScalar(state, nodeIndent, withinFlowCollection) {\n  var preceding,\n      following,\n      captureStart,\n      captureEnd,\n      hasPendingContent,\n      _line,\n      _lineStart,\n      _lineIndent,\n      _kind = state.kind,\n      _result = state.result,\n      ch;\n\n  ch = state.input.charCodeAt(state.position);\n\n  if (is_WS_OR_EOL(ch)      ||\n      is_FLOW_INDICATOR(ch) ||\n      ch === 0x23/* # */    ||\n      ch === 0x26/* & */    ||\n      ch === 0x2A/* * */    ||\n      ch === 0x21/* ! */    ||\n      ch === 0x7C/* | */    ||\n      ch === 0x3E/* > */    ||\n      ch === 0x27/* ' */    ||\n      ch === 0x22/* \" */    ||\n      ch === 0x25/* % */    ||\n      ch === 0x40/* @ */    ||\n      ch === 0x60/* ` */) {\n    return false;\n  }\n\n  if (ch === 0x3F/* ? */ || ch === 0x2D/* - */) {\n    following = state.input.charCodeAt(state.position + 1);\n\n    if (is_WS_OR_EOL(following) ||\n        withinFlowCollection && is_FLOW_INDICATOR(following)) {\n      return false;\n    }\n  }\n\n  state.kind = 'scalar';\n  state.result = '';\n  captureStart = captureEnd = state.position;\n  hasPendingContent = false;\n\n  while (ch !== 0) {\n    if (ch === 0x3A/* : */) {\n      following = state.input.charCodeAt(state.position + 1);\n\n      if (is_WS_OR_EOL(following) ||\n          withinFlowCollection && is_FLOW_INDICATOR(following)) {\n        break;\n      }\n\n    } else if (ch === 0x23/* # */) {\n      preceding = state.input.charCodeAt(state.position - 1);\n\n      if (is_WS_OR_EOL(preceding)) {\n        break;\n      }\n\n    } else if ((state.position === state.lineStart && testDocumentSeparator(state)) ||\n               withinFlowCollection && is_FLOW_INDICATOR(ch)) {\n      break;\n\n    } else if (is_EOL(ch)) {\n      _line = state.line;\n      _lineStart = state.lineStart;\n      _lineIndent = state.lineIndent;\n      skipSeparationSpace(state, false, -1);\n\n      if (state.lineIndent >= nodeIndent) {\n        hasPendingContent = true;\n        ch = state.input.charCodeAt(state.position);\n        continue;\n      } else {\n        state.position = captureEnd;\n        state.line = _line;\n        state.lineStart = _lineStart;\n        state.lineIndent = _lineIndent;\n        break;\n      }\n    }\n\n    if (hasPendingContent) {\n      captureSegment(state, captureStart, captureEnd, false);\n      writeFoldedLines(state, state.line - _line);\n      captureStart = captureEnd = state.position;\n      hasPendingContent = false;\n    }\n\n    if (!is_WHITE_SPACE(ch)) {\n      captureEnd = state.position + 1;\n    }\n\n    ch = state.input.charCodeAt(++state.position);\n  }\n\n  captureSegment(state, captureStart, captureEnd, false);\n\n  if (state.result) {\n    return true;\n  }\n\n  state.kind = _kind;\n  state.result = _result;\n  return false;\n}\n\nfunction readSingleQuotedScalar(state, nodeIndent) {\n  var ch,\n      captureStart, captureEnd;\n\n  ch = state.input.charCodeAt(state.position);\n\n  if (ch !== 0x27/* ' */) {\n    return false;\n  }\n\n  state.kind = 'scalar';\n  state.result = '';\n  state.position++;\n  captureStart = captureEnd = state.position;\n\n  while ((ch = state.input.charCodeAt(state.position)) !== 0) {\n    if (ch === 0x27/* ' */) {\n      captureSegment(state, captureStart, state.position, true);\n      ch = state.input.charCodeAt(++state.position);\n\n      if (ch === 0x27/* ' */) {\n        captureStart = captureEnd = state.position;\n        state.position++;\n      } else {\n        return true;\n      }\n\n    } else if (is_EOL(ch)) {\n      captureSegment(state, captureStart, captureEnd, true);\n      writeFoldedLines(state, skipSeparationSpace(state, false, nodeIndent));\n      captureStart = captureEnd = state.position;\n\n    } else if (state.position === state.lineStart && testDocumentSeparator(state)) {\n      throwError(state, 'unexpected end of the document within a single quoted scalar');\n\n    } else {\n      state.position++;\n      captureEnd = state.position;\n    }\n  }\n\n  throwError(state, 'unexpected end of the stream within a single quoted scalar');\n}\n\nfunction readDoubleQuotedScalar(state, nodeIndent) {\n  var captureStart,\n      captureEnd,\n      hexLength,\n      hexResult,\n      tmp,\n      ch;\n\n  ch = state.input.charCodeAt(state.position);\n\n  if (ch !== 0x22/* \" */) {\n    return false;\n  }\n\n  state.kind = 'scalar';\n  state.result = '';\n  state.position++;\n  captureStart = captureEnd = state.position;\n\n  while ((ch = state.input.charCodeAt(state.position)) !== 0) {\n    if (ch === 0x22/* \" */) {\n      captureSegment(state, captureStart, state.position, true);\n      state.position++;\n      return true;\n\n    } else if (ch === 0x5C/* \\ */) {\n      captureSegment(state, captureStart, state.position, true);\n      ch = state.input.charCodeAt(++state.position);\n\n      if (is_EOL(ch)) {\n        skipSeparationSpace(state, false, nodeIndent);\n\n        // TODO: rework to inline fn with no type cast?\n      } else if (ch < 256 && simpleEscapeCheck[ch]) {\n        state.result += simpleEscapeMap[ch];\n        state.position++;\n\n      } else if ((tmp = escapedHexLen(ch)) > 0) {\n        hexLength = tmp;\n        hexResult = 0;\n\n        for (; hexLength > 0; hexLength--) {\n          ch = state.input.charCodeAt(++state.position);\n\n          if ((tmp = fromHexCode(ch)) >= 0) {\n            hexResult = (hexResult << 4) + tmp;\n\n          } else {\n            throwError(state, 'expected hexadecimal character');\n          }\n        }\n\n        state.result += charFromCodepoint(hexResult);\n\n        state.position++;\n\n      } else {\n        throwError(state, 'unknown escape sequence');\n      }\n\n      captureStart = captureEnd = state.position;\n\n    } else if (is_EOL(ch)) {\n      captureSegment(state, captureStart, captureEnd, true);\n      writeFoldedLines(state, skipSeparationSpace(state, false, nodeIndent));\n      captureStart = captureEnd = state.position;\n\n    } else if (state.position === state.lineStart && testDocumentSeparator(state)) {\n      throwError(state, 'unexpected end of the document within a double quoted scalar');\n\n    } else {\n      state.position++;\n      captureEnd = state.position;\n    }\n  }\n\n  throwError(state, 'unexpected end of the stream within a double quoted scalar');\n}\n\nfunction readFlowCollection(state, nodeIndent) {\n  var readNext = true,\n      _line,\n      _tag     = state.tag,\n      _result,\n      _anchor  = state.anchor,\n      following,\n      terminator,\n      isPair,\n      isExplicitPair,\n      isMapping,\n      overridableKeys = {},\n      keyNode,\n      keyTag,\n      valueNode,\n      ch;\n\n  ch = state.input.charCodeAt(state.position);\n\n  if (ch === 0x5B/* [ */) {\n    terminator = 0x5D;/* ] */\n    isMapping = false;\n    _result = [];\n  } else if (ch === 0x7B/* { */) {\n    terminator = 0x7D;/* } */\n    isMapping = true;\n    _result = {};\n  } else {\n    return false;\n  }\n\n  if (state.anchor !== null) {\n    state.anchorMap[state.anchor] = _result;\n  }\n\n  ch = state.input.charCodeAt(++state.position);\n\n  while (ch !== 0) {\n    skipSeparationSpace(state, true, nodeIndent);\n\n    ch = state.input.charCodeAt(state.position);\n\n    if (ch === terminator) {\n      state.position++;\n      state.tag = _tag;\n      state.anchor = _anchor;\n      state.kind = isMapping ? 'mapping' : 'sequence';\n      state.result = _result;\n      return true;\n    } else if (!readNext) {\n      throwError(state, 'missed comma between flow collection entries');\n    }\n\n    keyTag = keyNode = valueNode = null;\n    isPair = isExplicitPair = false;\n\n    if (ch === 0x3F/* ? */) {\n      following = state.input.charCodeAt(state.position + 1);\n\n      if (is_WS_OR_EOL(following)) {\n        isPair = isExplicitPair = true;\n        state.position++;\n        skipSeparationSpace(state, true, nodeIndent);\n      }\n    }\n\n    _line = state.line;\n    composeNode(state, nodeIndent, CONTEXT_FLOW_IN, false, true);\n    keyTag = state.tag;\n    keyNode = state.result;\n    skipSeparationSpace(state, true, nodeIndent);\n\n    ch = state.input.charCodeAt(state.position);\n\n    if ((isExplicitPair || state.line === _line) && ch === 0x3A/* : */) {\n      isPair = true;\n      ch = state.input.charCodeAt(++state.position);\n      skipSeparationSpace(state, true, nodeIndent);\n      composeNode(state, nodeIndent, CONTEXT_FLOW_IN, false, true);\n      valueNode = state.result;\n    }\n\n    if (isMapping) {\n      storeMappingPair(state, _result, overridableKeys, keyTag, keyNode, valueNode);\n    } else if (isPair) {\n      _result.push(storeMappingPair(state, null, overridableKeys, keyTag, keyNode, valueNode));\n    } else {\n      _result.push(keyNode);\n    }\n\n    skipSeparationSpace(state, true, nodeIndent);\n\n    ch = state.input.charCodeAt(state.position);\n\n    if (ch === 0x2C/* , */) {\n      readNext = true;\n      ch = state.input.charCodeAt(++state.position);\n    } else {\n      readNext = false;\n    }\n  }\n\n  throwError(state, 'unexpected end of the stream within a flow collection');\n}\n\nfunction readBlockScalar(state, nodeIndent) {\n  var captureStart,\n      folding,\n      chomping       = CHOMPING_CLIP,\n      didReadContent = false,\n      detectedIndent = false,\n      textIndent     = nodeIndent,\n      emptyLines     = 0,\n      atMoreIndented = false,\n      tmp,\n      ch;\n\n  ch = state.input.charCodeAt(state.position);\n\n  if (ch === 0x7C/* | */) {\n    folding = false;\n  } else if (ch === 0x3E/* > */) {\n    folding = true;\n  } else {\n    return false;\n  }\n\n  state.kind = 'scalar';\n  state.result = '';\n\n  while (ch !== 0) {\n    ch = state.input.charCodeAt(++state.position);\n\n    if (ch === 0x2B/* + */ || ch === 0x2D/* - */) {\n      if (CHOMPING_CLIP === chomping) {\n        chomping = (ch === 0x2B/* + */) ? CHOMPING_KEEP : CHOMPING_STRIP;\n      } else {\n        throwError(state, 'repeat of a chomping mode identifier');\n      }\n\n    } else if ((tmp = fromDecimalCode(ch)) >= 0) {\n      if (tmp === 0) {\n        throwError(state, 'bad explicit indentation width of a block scalar; it cannot be less than one');\n      } else if (!detectedIndent) {\n        textIndent = nodeIndent + tmp - 1;\n        detectedIndent = true;\n      } else {\n        throwError(state, 'repeat of an indentation width identifier');\n      }\n\n    } else {\n      break;\n    }\n  }\n\n  if (is_WHITE_SPACE(ch)) {\n    do { ch = state.input.charCodeAt(++state.position); }\n    while (is_WHITE_SPACE(ch));\n\n    if (ch === 0x23/* # */) {\n      do { ch = state.input.charCodeAt(++state.position); }\n      while (!is_EOL(ch) && (ch !== 0));\n    }\n  }\n\n  while (ch !== 0) {\n    readLineBreak(state);\n    state.lineIndent = 0;\n\n    ch = state.input.charCodeAt(state.position);\n\n    while ((!detectedIndent || state.lineIndent < textIndent) &&\n           (ch === 0x20/* Space */)) {\n      state.lineIndent++;\n      ch = state.input.charCodeAt(++state.position);\n    }\n\n    if (!detectedIndent && state.lineIndent > textIndent) {\n      textIndent = state.lineIndent;\n    }\n\n    if (is_EOL(ch)) {\n      emptyLines++;\n      continue;\n    }\n\n    // End of the scalar.\n    if (state.lineIndent < textIndent) {\n\n      // Perform the chomping.\n      if (chomping === CHOMPING_KEEP) {\n        state.result += common.repeat('\\n', didReadContent ? 1 + emptyLines : emptyLines);\n      } else if (chomping === CHOMPING_CLIP) {\n        if (didReadContent) { // i.e. only if the scalar is not empty.\n          state.result += '\\n';\n        }\n      }\n\n      // Break this `while` cycle and go to the funciton's epilogue.\n      break;\n    }\n\n    // Folded style: use fancy rules to handle line breaks.\n    if (folding) {\n\n      // Lines starting with white space characters (more-indented lines) are not folded.\n      if (is_WHITE_SPACE(ch)) {\n        atMoreIndented = true;\n        // except for the first content line (cf. Example 8.1)\n        state.result += common.repeat('\\n', didReadContent ? 1 + emptyLines : emptyLines);\n\n      // End of more-indented block.\n      } else if (atMoreIndented) {\n        atMoreIndented = false;\n        state.result += common.repeat('\\n', emptyLines + 1);\n\n      // Just one line break - perceive as the same line.\n      } else if (emptyLines === 0) {\n        if (didReadContent) { // i.e. only if we have already read some scalar content.\n          state.result += ' ';\n        }\n\n      // Several line breaks - perceive as different lines.\n      } else {\n        state.result += common.repeat('\\n', emptyLines);\n      }\n\n    // Literal style: just add exact number of line breaks between content lines.\n    } else {\n      // Keep all line breaks except the header line break.\n      state.result += common.repeat('\\n', didReadContent ? 1 + emptyLines : emptyLines);\n    }\n\n    didReadContent = true;\n    detectedIndent = true;\n    emptyLines = 0;\n    captureStart = state.position;\n\n    while (!is_EOL(ch) && (ch !== 0)) {\n      ch = state.input.charCodeAt(++state.position);\n    }\n\n    captureSegment(state, captureStart, state.position, false);\n  }\n\n  return true;\n}\n\nfunction readBlockSequence(state, nodeIndent) {\n  var _line,\n      _tag      = state.tag,\n      _anchor   = state.anchor,\n      _result   = [],\n      following,\n      detected  = false,\n      ch;\n\n  if (state.anchor !== null) {\n    state.anchorMap[state.anchor] = _result;\n  }\n\n  ch = state.input.charCodeAt(state.position);\n\n  while (ch !== 0) {\n\n    if (ch !== 0x2D/* - */) {\n      break;\n    }\n\n    following = state.input.charCodeAt(state.position + 1);\n\n    if (!is_WS_OR_EOL(following)) {\n      break;\n    }\n\n    detected = true;\n    state.position++;\n\n    if (skipSeparationSpace(state, true, -1)) {\n      if (state.lineIndent <= nodeIndent) {\n        _result.push(null);\n        ch = state.input.charCodeAt(state.position);\n        continue;\n      }\n    }\n\n    _line = state.line;\n    composeNode(state, nodeIndent, CONTEXT_BLOCK_IN, false, true);\n    _result.push(state.result);\n    skipSeparationSpace(state, true, -1);\n\n    ch = state.input.charCodeAt(state.position);\n\n    if ((state.line === _line || state.lineIndent > nodeIndent) && (ch !== 0)) {\n      throwError(state, 'bad indentation of a sequence entry');\n    } else if (state.lineIndent < nodeIndent) {\n      break;\n    }\n  }\n\n  if (detected) {\n    state.tag = _tag;\n    state.anchor = _anchor;\n    state.kind = 'sequence';\n    state.result = _result;\n    return true;\n  }\n  return false;\n}\n\nfunction readBlockMapping(state, nodeIndent, flowIndent) {\n  var following,\n      allowCompact,\n      _line,\n      _tag          = state.tag,\n      _anchor       = state.anchor,\n      _result       = {},\n      overridableKeys = {},\n      keyTag        = null,\n      keyNode       = null,\n      valueNode     = null,\n      atExplicitKey = false,\n      detected      = false,\n      ch;\n\n  if (state.anchor !== null) {\n    state.anchorMap[state.anchor] = _result;\n  }\n\n  ch = state.input.charCodeAt(state.position);\n\n  while (ch !== 0) {\n    following = state.input.charCodeAt(state.position + 1);\n    _line = state.line; // Save the current line.\n\n    //\n    // Explicit notation case. There are two separate blocks:\n    // first for the key (denoted by \"?\") and second for the value (denoted by \":\")\n    //\n    if ((ch === 0x3F/* ? */ || ch === 0x3A/* : */) && is_WS_OR_EOL(following)) {\n\n      if (ch === 0x3F/* ? */) {\n        if (atExplicitKey) {\n          storeMappingPair(state, _result, overridableKeys, keyTag, keyNode, null);\n          keyTag = keyNode = valueNode = null;\n        }\n\n        detected = true;\n        atExplicitKey = true;\n        allowCompact = true;\n\n      } else if (atExplicitKey) {\n        // i.e. 0x3A/* : */ === character after the explicit key.\n        atExplicitKey = false;\n        allowCompact = true;\n\n      } else {\n        throwError(state, 'incomplete explicit mapping pair; a key node is missed');\n      }\n\n      state.position += 1;\n      ch = following;\n\n    //\n    // Implicit notation case. Flow-style node as the key first, then \":\", and the value.\n    //\n    } else if (composeNode(state, flowIndent, CONTEXT_FLOW_OUT, false, true)) {\n\n      if (state.line === _line) {\n        ch = state.input.charCodeAt(state.position);\n\n        while (is_WHITE_SPACE(ch)) {\n          ch = state.input.charCodeAt(++state.position);\n        }\n\n        if (ch === 0x3A/* : */) {\n          ch = state.input.charCodeAt(++state.position);\n\n          if (!is_WS_OR_EOL(ch)) {\n            throwError(state, 'a whitespace character is expected after the key-value separator within a block mapping');\n          }\n\n          if (atExplicitKey) {\n            storeMappingPair(state, _result, overridableKeys, keyTag, keyNode, null);\n            keyTag = keyNode = valueNode = null;\n          }\n\n          detected = true;\n          atExplicitKey = false;\n          allowCompact = false;\n          keyTag = state.tag;\n          keyNode = state.result;\n\n        } else if (detected) {\n          throwError(state, 'can not read an implicit mapping pair; a colon is missed');\n\n        } else {\n          state.tag = _tag;\n          state.anchor = _anchor;\n          return true; // Keep the result of `composeNode`.\n        }\n\n      } else if (detected) {\n        throwError(state, 'can not read a block mapping entry; a multiline key may not be an implicit key');\n\n      } else {\n        state.tag = _tag;\n        state.anchor = _anchor;\n        return true; // Keep the result of `composeNode`.\n      }\n\n    } else {\n      break; // Reading is done. Go to the epilogue.\n    }\n\n    //\n    // Common reading code for both explicit and implicit notations.\n    //\n    if (state.line === _line || state.lineIndent > nodeIndent) {\n      if (composeNode(state, nodeIndent, CONTEXT_BLOCK_OUT, true, allowCompact)) {\n        if (atExplicitKey) {\n          keyNode = state.result;\n        } else {\n          valueNode = state.result;\n        }\n      }\n\n      if (!atExplicitKey) {\n        storeMappingPair(state, _result, overridableKeys, keyTag, keyNode, valueNode);\n        keyTag = keyNode = valueNode = null;\n      }\n\n      skipSeparationSpace(state, true, -1);\n      ch = state.input.charCodeAt(state.position);\n    }\n\n    if (state.lineIndent > nodeIndent && (ch !== 0)) {\n      throwError(state, 'bad indentation of a mapping entry');\n    } else if (state.lineIndent < nodeIndent) {\n      break;\n    }\n  }\n\n  //\n  // Epilogue.\n  //\n\n  // Special case: last mapping's node contains only the key in explicit notation.\n  if (atExplicitKey) {\n    storeMappingPair(state, _result, overridableKeys, keyTag, keyNode, null);\n  }\n\n  // Expose the resulting mapping.\n  if (detected) {\n    state.tag = _tag;\n    state.anchor = _anchor;\n    state.kind = 'mapping';\n    state.result = _result;\n  }\n\n  return detected;\n}\n\nfunction readTagProperty(state) {\n  var _position,\n      isVerbatim = false,\n      isNamed    = false,\n      tagHandle,\n      tagName,\n      ch;\n\n  ch = state.input.charCodeAt(state.position);\n\n  if (ch !== 0x21/* ! */) return false;\n\n  if (state.tag !== null) {\n    throwError(state, 'duplication of a tag property');\n  }\n\n  ch = state.input.charCodeAt(++state.position);\n\n  if (ch === 0x3C/* < */) {\n    isVerbatim = true;\n    ch = state.input.charCodeAt(++state.position);\n\n  } else if (ch === 0x21/* ! */) {\n    isNamed = true;\n    tagHandle = '!!';\n    ch = state.input.charCodeAt(++state.position);\n\n  } else {\n    tagHandle = '!';\n  }\n\n  _position = state.position;\n\n  if (isVerbatim) {\n    do { ch = state.input.charCodeAt(++state.position); }\n    while (ch !== 0 && ch !== 0x3E/* > */);\n\n    if (state.position < state.length) {\n      tagName = state.input.slice(_position, state.position);\n      ch = state.input.charCodeAt(++state.position);\n    } else {\n      throwError(state, 'unexpected end of the stream within a verbatim tag');\n    }\n  } else {\n    while (ch !== 0 && !is_WS_OR_EOL(ch)) {\n\n      if (ch === 0x21/* ! */) {\n        if (!isNamed) {\n          tagHandle = state.input.slice(_position - 1, state.position + 1);\n\n          if (!PATTERN_TAG_HANDLE.test(tagHandle)) {\n            throwError(state, 'named tag handle cannot contain such characters');\n          }\n\n          isNamed = true;\n          _position = state.position + 1;\n        } else {\n          throwError(state, 'tag suffix cannot contain exclamation marks');\n        }\n      }\n\n      ch = state.input.charCodeAt(++state.position);\n    }\n\n    tagName = state.input.slice(_position, state.position);\n\n    if (PATTERN_FLOW_INDICATORS.test(tagName)) {\n      throwError(state, 'tag suffix cannot contain flow indicator characters');\n    }\n  }\n\n  if (tagName && !PATTERN_TAG_URI.test(tagName)) {\n    throwError(state, 'tag name cannot contain such characters: ' + tagName);\n  }\n\n  if (isVerbatim) {\n    state.tag = tagName;\n\n  } else if (_hasOwnProperty.call(state.tagMap, tagHandle)) {\n    state.tag = state.tagMap[tagHandle] + tagName;\n\n  } else if (tagHandle === '!') {\n    state.tag = '!' + tagName;\n\n  } else if (tagHandle === '!!') {\n    state.tag = 'tag:yaml.org,2002:' + tagName;\n\n  } else {\n    throwError(state, 'undeclared tag handle \"' + tagHandle + '\"');\n  }\n\n  return true;\n}\n\nfunction readAnchorProperty(state) {\n  var _position,\n      ch;\n\n  ch = state.input.charCodeAt(state.position);\n\n  if (ch !== 0x26/* & */) return false;\n\n  if (state.anchor !== null) {\n    throwError(state, 'duplication of an anchor property');\n  }\n\n  ch = state.input.charCodeAt(++state.position);\n  _position = state.position;\n\n  while (ch !== 0 && !is_WS_OR_EOL(ch) && !is_FLOW_INDICATOR(ch)) {\n    ch = state.input.charCodeAt(++state.position);\n  }\n\n  if (state.position === _position) {\n    throwError(state, 'name of an anchor node must contain at least one character');\n  }\n\n  state.anchor = state.input.slice(_position, state.position);\n  return true;\n}\n\nfunction readAlias(state) {\n  var _position, alias,\n      ch;\n\n  ch = state.input.charCodeAt(state.position);\n\n  if (ch !== 0x2A/* * */) return false;\n\n  ch = state.input.charCodeAt(++state.position);\n  _position = state.position;\n\n  while (ch !== 0 && !is_WS_OR_EOL(ch) && !is_FLOW_INDICATOR(ch)) {\n    ch = state.input.charCodeAt(++state.position);\n  }\n\n  if (state.position === _position) {\n    throwError(state, 'name of an alias node must contain at least one character');\n  }\n\n  alias = state.input.slice(_position, state.position);\n\n  if (!state.anchorMap.hasOwnProperty(alias)) {\n    throwError(state, 'unidentified alias \"' + alias + '\"');\n  }\n\n  state.result = state.anchorMap[alias];\n  skipSeparationSpace(state, true, -1);\n  return true;\n}\n\nfunction composeNode(state, parentIndent, nodeContext, allowToSeek, allowCompact) {\n  var allowBlockStyles,\n      allowBlockScalars,\n      allowBlockCollections,\n      indentStatus = 1, // 1: this>parent, 0: this=parent, -1: this<parent\n      atNewLine  = false,\n      hasContent = false,\n      typeIndex,\n      typeQuantity,\n      type,\n      flowIndent,\n      blockIndent;\n\n  if (state.listener !== null) {\n    state.listener('open', state);\n  }\n\n  state.tag    = null;\n  state.anchor = null;\n  state.kind   = null;\n  state.result = null;\n\n  allowBlockStyles = allowBlockScalars = allowBlockCollections =\n    CONTEXT_BLOCK_OUT === nodeContext ||\n    CONTEXT_BLOCK_IN  === nodeContext;\n\n  if (allowToSeek) {\n    if (skipSeparationSpace(state, true, -1)) {\n      atNewLine = true;\n\n      if (state.lineIndent > parentIndent) {\n        indentStatus = 1;\n      } else if (state.lineIndent === parentIndent) {\n        indentStatus = 0;\n      } else if (state.lineIndent < parentIndent) {\n        indentStatus = -1;\n      }\n    }\n  }\n\n  if (indentStatus === 1) {\n    while (readTagProperty(state) || readAnchorProperty(state)) {\n      if (skipSeparationSpace(state, true, -1)) {\n        atNewLine = true;\n        allowBlockCollections = allowBlockStyles;\n\n        if (state.lineIndent > parentIndent) {\n          indentStatus = 1;\n        } else if (state.lineIndent === parentIndent) {\n          indentStatus = 0;\n        } else if (state.lineIndent < parentIndent) {\n          indentStatus = -1;\n        }\n      } else {\n        allowBlockCollections = false;\n      }\n    }\n  }\n\n  if (allowBlockCollections) {\n    allowBlockCollections = atNewLine || allowCompact;\n  }\n\n  if (indentStatus === 1 || CONTEXT_BLOCK_OUT === nodeContext) {\n    if (CONTEXT_FLOW_IN === nodeContext || CONTEXT_FLOW_OUT === nodeContext) {\n      flowIndent = parentIndent;\n    } else {\n      flowIndent = parentIndent + 1;\n    }\n\n    blockIndent = state.position - state.lineStart;\n\n    if (indentStatus === 1) {\n      if (allowBlockCollections &&\n          (readBlockSequence(state, blockIndent) ||\n           readBlockMapping(state, blockIndent, flowIndent)) ||\n          readFlowCollection(state, flowIndent)) {\n        hasContent = true;\n      } else {\n        if ((allowBlockScalars && readBlockScalar(state, flowIndent)) ||\n            readSingleQuotedScalar(state, flowIndent) ||\n            readDoubleQuotedScalar(state, flowIndent)) {\n          hasContent = true;\n\n        } else if (readAlias(state)) {\n          hasContent = true;\n\n          if (state.tag !== null || state.anchor !== null) {\n            throwError(state, 'alias node should not have any properties');\n          }\n\n        } else if (readPlainScalar(state, flowIndent, CONTEXT_FLOW_IN === nodeContext)) {\n          hasContent = true;\n\n          if (state.tag === null) {\n            state.tag = '?';\n          }\n        }\n\n        if (state.anchor !== null) {\n          state.anchorMap[state.anchor] = state.result;\n        }\n      }\n    } else if (indentStatus === 0) {\n      // Special case: block sequences are allowed to have same indentation level as the parent.\n      // http://www.yaml.org/spec/1.2/spec.html#id2799784\n      hasContent = allowBlockCollections && readBlockSequence(state, blockIndent);\n    }\n  }\n\n  if (state.tag !== null && state.tag !== '!') {\n    if (state.tag === '?') {\n      for (typeIndex = 0, typeQuantity = state.implicitTypes.length;\n           typeIndex < typeQuantity;\n           typeIndex += 1) {\n        type = state.implicitTypes[typeIndex];\n\n        // Implicit resolving is not allowed for non-scalar types, and '?'\n        // non-specific tag is only assigned to plain scalars. So, it isn't\n        // needed to check for 'kind' conformity.\n\n        if (type.resolve(state.result)) { // `state.result` updated in resolver if matched\n          state.result = type.construct(state.result);\n          state.tag = type.tag;\n          if (state.anchor !== null) {\n            state.anchorMap[state.anchor] = state.result;\n          }\n          break;\n        }\n      }\n    } else if (_hasOwnProperty.call(state.typeMap, state.tag)) {\n      type = state.typeMap[state.tag];\n\n      if (state.result !== null && type.kind !== state.kind) {\n        throwError(state, 'unacceptable node kind for !<' + state.tag + '> tag; it should be \"' + type.kind + '\", not \"' + state.kind + '\"');\n      }\n\n      if (!type.resolve(state.result)) { // `state.result` updated in resolver if matched\n        throwError(state, 'cannot resolve a node with !<' + state.tag + '> explicit tag');\n      } else {\n        state.result = type.construct(state.result);\n        if (state.anchor !== null) {\n          state.anchorMap[state.anchor] = state.result;\n        }\n      }\n    } else {\n      throwError(state, 'unknown tag !<' + state.tag + '>');\n    }\n  }\n\n  if (state.listener !== null) {\n    state.listener('close', state);\n  }\n  return state.tag !== null ||  state.anchor !== null || hasContent;\n}\n\nfunction readDocument(state) {\n  var documentStart = state.position,\n      _position,\n      directiveName,\n      directiveArgs,\n      hasDirectives = false,\n      ch;\n\n  state.version = null;\n  state.checkLineBreaks = state.legacy;\n  state.tagMap = {};\n  state.anchorMap = {};\n\n  while ((ch = state.input.charCodeAt(state.position)) !== 0) {\n    skipSeparationSpace(state, true, -1);\n\n    ch = state.input.charCodeAt(state.position);\n\n    if (state.lineIndent > 0 || ch !== 0x25/* % */) {\n      break;\n    }\n\n    hasDirectives = true;\n    ch = state.input.charCodeAt(++state.position);\n    _position = state.position;\n\n    while (ch !== 0 && !is_WS_OR_EOL(ch)) {\n      ch = state.input.charCodeAt(++state.position);\n    }\n\n    directiveName = state.input.slice(_position, state.position);\n    directiveArgs = [];\n\n    if (directiveName.length < 1) {\n      throwError(state, 'directive name must not be less than one character in length');\n    }\n\n    while (ch !== 0) {\n      while (is_WHITE_SPACE(ch)) {\n        ch = state.input.charCodeAt(++state.position);\n      }\n\n      if (ch === 0x23/* # */) {\n        do { ch = state.input.charCodeAt(++state.position); }\n        while (ch !== 0 && !is_EOL(ch));\n        break;\n      }\n\n      if (is_EOL(ch)) break;\n\n      _position = state.position;\n\n      while (ch !== 0 && !is_WS_OR_EOL(ch)) {\n        ch = state.input.charCodeAt(++state.position);\n      }\n\n      directiveArgs.push(state.input.slice(_position, state.position));\n    }\n\n    if (ch !== 0) readLineBreak(state);\n\n    if (_hasOwnProperty.call(directiveHandlers, directiveName)) {\n      directiveHandlers[directiveName](state, directiveName, directiveArgs);\n    } else {\n      throwWarning(state, 'unknown document directive \"' + directiveName + '\"');\n    }\n  }\n\n  skipSeparationSpace(state, true, -1);\n\n  if (state.lineIndent === 0 &&\n      state.input.charCodeAt(state.position)     === 0x2D/* - */ &&\n      state.input.charCodeAt(state.position + 1) === 0x2D/* - */ &&\n      state.input.charCodeAt(state.position + 2) === 0x2D/* - */) {\n    state.position += 3;\n    skipSeparationSpace(state, true, -1);\n\n  } else if (hasDirectives) {\n    throwError(state, 'directives end mark is expected');\n  }\n\n  composeNode(state, state.lineIndent - 1, CONTEXT_BLOCK_OUT, false, true);\n  skipSeparationSpace(state, true, -1);\n\n  if (state.checkLineBreaks &&\n      PATTERN_NON_ASCII_LINE_BREAKS.test(state.input.slice(documentStart, state.position))) {\n    throwWarning(state, 'non-ASCII line breaks are interpreted as content');\n  }\n\n  state.documents.push(state.result);\n\n  if (state.position === state.lineStart && testDocumentSeparator(state)) {\n\n    if (state.input.charCodeAt(state.position) === 0x2E/* . */) {\n      state.position += 3;\n      skipSeparationSpace(state, true, -1);\n    }\n    return;\n  }\n\n  if (state.position < (state.length - 1)) {\n    throwError(state, 'end of the stream or a document separator is expected');\n  } else {\n    return;\n  }\n}\n\n\nfunction loadDocuments(input, options) {\n  input = String(input);\n  options = options || {};\n\n  if (input.length !== 0) {\n\n    // Add tailing `\\n` if not exists\n    if (input.charCodeAt(input.length - 1) !== 0x0A/* LF */ &&\n        input.charCodeAt(input.length - 1) !== 0x0D/* CR */) {\n      input += '\\n';\n    }\n\n    // Strip BOM\n    if (input.charCodeAt(0) === 0xFEFF) {\n      input = input.slice(1);\n    }\n  }\n\n  var state = new State(input, options);\n\n  // Use 0 as string terminator. That significantly simplifies bounds check.\n  state.input += '\\0';\n\n  while (state.input.charCodeAt(state.position) === 0x20/* Space */) {\n    state.lineIndent += 1;\n    state.position += 1;\n  }\n\n  while (state.position < (state.length - 1)) {\n    readDocument(state);\n  }\n\n  return state.documents;\n}\n\n\nfunction loadAll(input, iterator, options) {\n  var documents = loadDocuments(input, options), index, length;\n\n  for (index = 0, length = documents.length; index < length; index += 1) {\n    iterator(documents[index]);\n  }\n}\n\n\nfunction load(input, options) {\n  var documents = loadDocuments(input, options);\n\n  if (documents.length === 0) {\n    /*eslint-disable no-undefined*/\n    return undefined;\n  } else if (documents.length === 1) {\n    return documents[0];\n  }\n  throw new YAMLException('expected a single document in the stream, but found more');\n}\n\n\nfunction safeLoadAll(input, output, options) {\n  loadAll(input, output, common.extend({ schema: DEFAULT_SAFE_SCHEMA }, options));\n}\n\n\nfunction safeLoad(input, options) {\n  return load(input, common.extend({ schema: DEFAULT_SAFE_SCHEMA }, options));\n}\n\n\nmodule.exports.loadAll     = loadAll;\nmodule.exports.load        = load;\nmodule.exports.safeLoadAll = safeLoadAll;\nmodule.exports.safeLoad    = safeLoad;\n\n},{\"./common\":21,\"./exception\":23,\"./mark\":25,\"./schema/default_full\":28,\"./schema/default_safe\":29}],25:[function(require,module,exports){\n'use strict';\n\n\nvar common = require('./common');\n\n\nfunction Mark(name, buffer, position, line, column) {\n  this.name     = name;\n  this.buffer   = buffer;\n  this.position = position;\n  this.line     = line;\n  this.column   = column;\n}\n\n\nMark.prototype.getSnippet = function getSnippet(indent, maxLength) {\n  var head, start, tail, end, snippet;\n\n  if (!this.buffer) return null;\n\n  indent = indent || 4;\n  maxLength = maxLength || 75;\n\n  head = '';\n  start = this.position;\n\n  while (start > 0 && '\\x00\\r\\n\\x85\\u2028\\u2029'.indexOf(this.buffer.charAt(start - 1)) === -1) {\n    start -= 1;\n    if (this.position - start > (maxLength / 2 - 1)) {\n      head = ' ... ';\n      start += 5;\n      break;\n    }\n  }\n\n  tail = '';\n  end = this.position;\n\n  while (end < this.buffer.length && '\\x00\\r\\n\\x85\\u2028\\u2029'.indexOf(this.buffer.charAt(end)) === -1) {\n    end += 1;\n    if (end - this.position > (maxLength / 2 - 1)) {\n      tail = ' ... ';\n      end -= 5;\n      break;\n    }\n  }\n\n  snippet = this.buffer.slice(start, end);\n\n  return common.repeat(' ', indent) + head + snippet + tail + '\\n' +\n         common.repeat(' ', indent + this.position - start + head.length) + '^';\n};\n\n\nMark.prototype.toString = function toString(compact) {\n  var snippet, where = '';\n\n  if (this.name) {\n    where += 'in \"' + this.name + '\" ';\n  }\n\n  where += 'at line ' + (this.line + 1) + ', column ' + (this.column + 1);\n\n  if (!compact) {\n    snippet = this.getSnippet();\n\n    if (snippet) {\n      where += ':\\n' + snippet;\n    }\n  }\n\n  return where;\n};\n\n\nmodule.exports = Mark;\n\n},{\"./common\":21}],26:[function(require,module,exports){\n'use strict';\n\n/*eslint-disable max-len*/\n\nvar common        = require('./common');\nvar YAMLException = require('./exception');\nvar Type          = require('./type');\n\n\nfunction compileList(schema, name, result) {\n  var exclude = [];\n\n  schema.include.forEach(function (includedSchema) {\n    result = compileList(includedSchema, name, result);\n  });\n\n  schema[name].forEach(function (currentType) {\n    result.forEach(function (previousType, previousIndex) {\n      if (previousType.tag === currentType.tag) {\n        exclude.push(previousIndex);\n      }\n    });\n\n    result.push(currentType);\n  });\n\n  return result.filter(function (type, index) {\n    return exclude.indexOf(index) === -1;\n  });\n}\n\n\nfunction compileMap(/* lists... */) {\n  var result = {}, index, length;\n\n  function collectType(type) {\n    result[type.tag] = type;\n  }\n\n  for (index = 0, length = arguments.length; index < length; index += 1) {\n    arguments[index].forEach(collectType);\n  }\n\n  return result;\n}\n\n\nfunction Schema(definition) {\n  this.include  = definition.include  || [];\n  this.implicit = definition.implicit || [];\n  this.explicit = definition.explicit || [];\n\n  this.implicit.forEach(function (type) {\n    if (type.loadKind && type.loadKind !== 'scalar') {\n      throw new YAMLException('There is a non-scalar type in the implicit list of a schema. Implicit resolving of such types is not supported.');\n    }\n  });\n\n  this.compiledImplicit = compileList(this, 'implicit', []);\n  this.compiledExplicit = compileList(this, 'explicit', []);\n  this.compiledTypeMap  = compileMap(this.compiledImplicit, this.compiledExplicit);\n}\n\n\nSchema.DEFAULT = null;\n\n\nSchema.create = function createSchema() {\n  var schemas, types;\n\n  switch (arguments.length) {\n    case 1:\n      schemas = Schema.DEFAULT;\n      types = arguments[0];\n      break;\n\n    case 2:\n      schemas = arguments[0];\n      types = arguments[1];\n      break;\n\n    default:\n      throw new YAMLException('Wrong number of arguments for Schema.create function');\n  }\n\n  schemas = common.toArray(schemas);\n  types = common.toArray(types);\n\n  if (!schemas.every(function (schema) { return schema instanceof Schema; })) {\n    throw new YAMLException('Specified list of super schemas (or a single Schema object) contains a non-Schema object.');\n  }\n\n  if (!types.every(function (type) { return type instanceof Type; })) {\n    throw new YAMLException('Specified list of YAML types (or a single Type object) contains a non-Type object.');\n  }\n\n  return new Schema({\n    include: schemas,\n    explicit: types\n  });\n};\n\n\nmodule.exports = Schema;\n\n},{\"./common\":21,\"./exception\":23,\"./type\":32}],27:[function(require,module,exports){\n// Standard YAML's Core schema.\n// http://www.yaml.org/spec/1.2/spec.html#id2804923\n//\n// NOTE: JS-YAML does not support schema-specific tag resolution restrictions.\n// So, Core schema has no distinctions from JSON schema is JS-YAML.\n\n\n'use strict';\n\n\nvar Schema = require('../schema');\n\n\nmodule.exports = new Schema({\n  include: [\n    require('./json')\n  ]\n});\n\n},{\"../schema\":26,\"./json\":31}],28:[function(require,module,exports){\n// JS-YAML's default schema for `load` function.\n// It is not described in the YAML specification.\n//\n// This schema is based on JS-YAML's default safe schema and includes\n// JavaScript-specific types: !!js/undefined, !!js/regexp and !!js/function.\n//\n// Also this schema is used as default base schema at `Schema.create` function.\n\n\n'use strict';\n\n\nvar Schema = require('../schema');\n\n\nmodule.exports = Schema.DEFAULT = new Schema({\n  include: [\n    require('./default_safe')\n  ],\n  explicit: [\n    require('../type/js/undefined'),\n    require('../type/js/regexp'),\n    require('../type/js/function')\n  ]\n});\n\n},{\"../schema\":26,\"../type/js/function\":37,\"../type/js/regexp\":38,\"../type/js/undefined\":39,\"./default_safe\":29}],29:[function(require,module,exports){\n// JS-YAML's default schema for `safeLoad` function.\n// It is not described in the YAML specification.\n//\n// This schema is based on standard YAML's Core schema and includes most of\n// extra types described at YAML tag repository. (http://yaml.org/type/)\n\n\n'use strict';\n\n\nvar Schema = require('../schema');\n\n\nmodule.exports = new Schema({\n  include: [\n    require('./core')\n  ],\n  implicit: [\n    require('../type/timestamp'),\n    require('../type/merge')\n  ],\n  explicit: [\n    require('../type/binary'),\n    require('../type/omap'),\n    require('../type/pairs'),\n    require('../type/set')\n  ]\n});\n\n},{\"../schema\":26,\"../type/binary\":33,\"../type/merge\":41,\"../type/omap\":43,\"../type/pairs\":44,\"../type/set\":46,\"../type/timestamp\":48,\"./core\":27}],30:[function(require,module,exports){\n// Standard YAML's Failsafe schema.\n// http://www.yaml.org/spec/1.2/spec.html#id2802346\n\n\n'use strict';\n\n\nvar Schema = require('../schema');\n\n\nmodule.exports = new Schema({\n  explicit: [\n    require('../type/str'),\n    require('../type/seq'),\n    require('../type/map')\n  ]\n});\n\n},{\"../schema\":26,\"../type/map\":40,\"../type/seq\":45,\"../type/str\":47}],31:[function(require,module,exports){\n// Standard YAML's JSON schema.\n// http://www.yaml.org/spec/1.2/spec.html#id2803231\n//\n// NOTE: JS-YAML does not support schema-specific tag resolution restrictions.\n// So, this schema is not such strict as defined in the YAML specification.\n// It allows numbers in binary notaion, use `Null` and `NULL` as `null`, etc.\n\n\n'use strict';\n\n\nvar Schema = require('../schema');\n\n\nmodule.exports = new Schema({\n  include: [\n    require('./failsafe')\n  ],\n  implicit: [\n    require('../type/null'),\n    require('../type/bool'),\n    require('../type/int'),\n    require('../type/float')\n  ]\n});\n\n},{\"../schema\":26,\"../type/bool\":34,\"../type/float\":35,\"../type/int\":36,\"../type/null\":42,\"./failsafe\":30}],32:[function(require,module,exports){\n'use strict';\n\nvar YAMLException = require('./exception');\n\nvar TYPE_CONSTRUCTOR_OPTIONS = [\n  'kind',\n  'resolve',\n  'construct',\n  'instanceOf',\n  'predicate',\n  'represent',\n  'defaultStyle',\n  'styleAliases'\n];\n\nvar YAML_NODE_KINDS = [\n  'scalar',\n  'sequence',\n  'mapping'\n];\n\nfunction compileStyleAliases(map) {\n  var result = {};\n\n  if (map !== null) {\n    Object.keys(map).forEach(function (style) {\n      map[style].forEach(function (alias) {\n        result[String(alias)] = style;\n      });\n    });\n  }\n\n  return result;\n}\n\nfunction Type(tag, options) {\n  options = options || {};\n\n  Object.keys(options).forEach(function (name) {\n    if (TYPE_CONSTRUCTOR_OPTIONS.indexOf(name) === -1) {\n      throw new YAMLException('Unknown option \"' + name + '\" is met in definition of \"' + tag + '\" YAML type.');\n    }\n  });\n\n  // TODO: Add tag format check.\n  this.tag          = tag;\n  this.kind         = options['kind']         || null;\n  this.resolve      = options['resolve']      || function () { return true; };\n  this.construct    = options['construct']    || function (data) { return data; };\n  this.instanceOf   = options['instanceOf']   || null;\n  this.predicate    = options['predicate']    || null;\n  this.represent    = options['represent']    || null;\n  this.defaultStyle = options['defaultStyle'] || null;\n  this.styleAliases = compileStyleAliases(options['styleAliases'] || null);\n\n  if (YAML_NODE_KINDS.indexOf(this.kind) === -1) {\n    throw new YAMLException('Unknown kind \"' + this.kind + '\" is specified for \"' + tag + '\" YAML type.');\n  }\n}\n\nmodule.exports = Type;\n\n},{\"./exception\":23}],33:[function(require,module,exports){\n'use strict';\n\n/*eslint-disable no-bitwise*/\n\nvar NodeBuffer;\n\ntry {\n  // A trick for browserified version, to not include `Buffer` shim\n  var _require = require;\n  NodeBuffer = _require('buffer').Buffer;\n} catch (__) {}\n\nvar Type       = require('../type');\n\n\n// [ 64, 65, 66 ] -> [ padding, CR, LF ]\nvar BASE64_MAP = 'ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/=\\n\\r';\n\n\nfunction resolveYamlBinary(data) {\n  if (data === null) return false;\n\n  var code, idx, bitlen = 0, max = data.length, map = BASE64_MAP;\n\n  // Convert one by one.\n  for (idx = 0; idx < max; idx++) {\n    code = map.indexOf(data.charAt(idx));\n\n    // Skip CR/LF\n    if (code > 64) continue;\n\n    // Fail on illegal characters\n    if (code < 0) return false;\n\n    bitlen += 6;\n  }\n\n  // If there are any bits left, source was corrupted\n  return (bitlen % 8) === 0;\n}\n\nfunction constructYamlBinary(data) {\n  var idx, tailbits,\n      input = data.replace(/[\\r\\n=]/g, ''), // remove CR/LF & padding to simplify scan\n      max = input.length,\n      map = BASE64_MAP,\n      bits = 0,\n      result = [];\n\n  // Collect by 6*4 bits (3 bytes)\n\n  for (idx = 0; idx < max; idx++) {\n    if ((idx % 4 === 0) && idx) {\n      result.push((bits >> 16) & 0xFF);\n      result.push((bits >> 8) & 0xFF);\n      result.push(bits & 0xFF);\n    }\n\n    bits = (bits << 6) | map.indexOf(input.charAt(idx));\n  }\n\n  // Dump tail\n\n  tailbits = (max % 4) * 6;\n\n  if (tailbits === 0) {\n    result.push((bits >> 16) & 0xFF);\n    result.push((bits >> 8) & 0xFF);\n    result.push(bits & 0xFF);\n  } else if (tailbits === 18) {\n    result.push((bits >> 10) & 0xFF);\n    result.push((bits >> 2) & 0xFF);\n  } else if (tailbits === 12) {\n    result.push((bits >> 4) & 0xFF);\n  }\n\n  // Wrap into Buffer for NodeJS and leave Array for browser\n  if (NodeBuffer) return new NodeBuffer(result);\n\n  return result;\n}\n\nfunction representYamlBinary(object /*, style*/) {\n  var result = '', bits = 0, idx, tail,\n      max = object.length,\n      map = BASE64_MAP;\n\n  // Convert every three bytes to 4 ASCII characters.\n\n  for (idx = 0; idx < max; idx++) {\n    if ((idx % 3 === 0) && idx) {\n      result += map[(bits >> 18) & 0x3F];\n      result += map[(bits >> 12) & 0x3F];\n      result += map[(bits >> 6) & 0x3F];\n      result += map[bits & 0x3F];\n    }\n\n    bits = (bits << 8) + object[idx];\n  }\n\n  // Dump tail\n\n  tail = max % 3;\n\n  if (tail === 0) {\n    result += map[(bits >> 18) & 0x3F];\n    result += map[(bits >> 12) & 0x3F];\n    result += map[(bits >> 6) & 0x3F];\n    result += map[bits & 0x3F];\n  } else if (tail === 2) {\n    result += map[(bits >> 10) & 0x3F];\n    result += map[(bits >> 4) & 0x3F];\n    result += map[(bits << 2) & 0x3F];\n    result += map[64];\n  } else if (tail === 1) {\n    result += map[(bits >> 2) & 0x3F];\n    result += map[(bits << 4) & 0x3F];\n    result += map[64];\n    result += map[64];\n  }\n\n  return result;\n}\n\nfunction isBinary(object) {\n  return NodeBuffer && NodeBuffer.isBuffer(object);\n}\n\nmodule.exports = new Type('tag:yaml.org,2002:binary', {\n  kind: 'scalar',\n  resolve: resolveYamlBinary,\n  construct: constructYamlBinary,\n  predicate: isBinary,\n  represent: representYamlBinary\n});\n\n},{\"../type\":32}],34:[function(require,module,exports){\n'use strict';\n\nvar Type = require('../type');\n\nfunction resolveYamlBoolean(data) {\n  if (data === null) return false;\n\n  var max = data.length;\n\n  return (max === 4 && (data === 'true' || data === 'True' || data === 'TRUE')) ||\n         (max === 5 && (data === 'false' || data === 'False' || data === 'FALSE'));\n}\n\nfunction constructYamlBoolean(data) {\n  return data === 'true' ||\n         data === 'True' ||\n         data === 'TRUE';\n}\n\nfunction isBoolean(object) {\n  return Object.prototype.toString.call(object) === '[object Boolean]';\n}\n\nmodule.exports = new Type('tag:yaml.org,2002:bool', {\n  kind: 'scalar',\n  resolve: resolveYamlBoolean,\n  construct: constructYamlBoolean,\n  predicate: isBoolean,\n  represent: {\n    lowercase: function (object) { return object ? 'true' : 'false'; },\n    uppercase: function (object) { return object ? 'TRUE' : 'FALSE'; },\n    camelcase: function (object) { return object ? 'True' : 'False'; }\n  },\n  defaultStyle: 'lowercase'\n});\n\n},{\"../type\":32}],35:[function(require,module,exports){\n'use strict';\n\nvar common = require('../common');\nvar Type   = require('../type');\n\nvar YAML_FLOAT_PATTERN = new RegExp(\n  '^(?:[-+]?(?:[0-9][0-9_]*)\\\\.[0-9_]*(?:[eE][-+][0-9]+)?' +\n  '|\\\\.[0-9_]+(?:[eE][-+][0-9]+)?' +\n  '|[-+]?[0-9][0-9_]*(?::[0-5]?[0-9])+\\\\.[0-9_]*' +\n  '|[-+]?\\\\.(?:inf|Inf|INF)' +\n  '|\\\\.(?:nan|NaN|NAN))$');\n\nfunction resolveYamlFloat(data) {\n  if (data === null) return false;\n\n  if (!YAML_FLOAT_PATTERN.test(data)) return false;\n\n  return true;\n}\n\nfunction constructYamlFloat(data) {\n  var value, sign, base, digits;\n\n  value  = data.replace(/_/g, '').toLowerCase();\n  sign   = value[0] === '-' ? -1 : 1;\n  digits = [];\n\n  if ('+-'.indexOf(value[0]) >= 0) {\n    value = value.slice(1);\n  }\n\n  if (value === '.inf') {\n    return (sign === 1) ? Number.POSITIVE_INFINITY : Number.NEGATIVE_INFINITY;\n\n  } else if (value === '.nan') {\n    return NaN;\n\n  } else if (value.indexOf(':') >= 0) {\n    value.split(':').forEach(function (v) {\n      digits.unshift(parseFloat(v, 10));\n    });\n\n    value = 0.0;\n    base = 1;\n\n    digits.forEach(function (d) {\n      value += d * base;\n      base *= 60;\n    });\n\n    return sign * value;\n\n  }\n  return sign * parseFloat(value, 10);\n}\n\n\nvar SCIENTIFIC_WITHOUT_DOT = /^[-+]?[0-9]+e/;\n\nfunction representYamlFloat(object, style) {\n  var res;\n\n  if (isNaN(object)) {\n    switch (style) {\n      case 'lowercase': return '.nan';\n      case 'uppercase': return '.NAN';\n      case 'camelcase': return '.NaN';\n    }\n  } else if (Number.POSITIVE_INFINITY === object) {\n    switch (style) {\n      case 'lowercase': return '.inf';\n      case 'uppercase': return '.INF';\n      case 'camelcase': return '.Inf';\n    }\n  } else if (Number.NEGATIVE_INFINITY === object) {\n    switch (style) {\n      case 'lowercase': return '-.inf';\n      case 'uppercase': return '-.INF';\n      case 'camelcase': return '-.Inf';\n    }\n  } else if (common.isNegativeZero(object)) {\n    return '-0.0';\n  }\n\n  res = object.toString(10);\n\n  // JS stringifier can build scientific format without dots: 5e-100,\n  // while YAML requres dot: 5.e-100. Fix it with simple hack\n\n  return SCIENTIFIC_WITHOUT_DOT.test(res) ? res.replace('e', '.e') : res;\n}\n\nfunction isFloat(object) {\n  return (Object.prototype.toString.call(object) === '[object Number]') &&\n         (object % 1 !== 0 || common.isNegativeZero(object));\n}\n\nmodule.exports = new Type('tag:yaml.org,2002:float', {\n  kind: 'scalar',\n  resolve: resolveYamlFloat,\n  construct: constructYamlFloat,\n  predicate: isFloat,\n  represent: representYamlFloat,\n  defaultStyle: 'lowercase'\n});\n\n},{\"../common\":21,\"../type\":32}],36:[function(require,module,exports){\n'use strict';\n\nvar common = require('../common');\nvar Type   = require('../type');\n\nfunction isHexCode(c) {\n  return ((0x30/* 0 */ <= c) && (c <= 0x39/* 9 */)) ||\n         ((0x41/* A */ <= c) && (c <= 0x46/* F */)) ||\n         ((0x61/* a */ <= c) && (c <= 0x66/* f */));\n}\n\nfunction isOctCode(c) {\n  return ((0x30/* 0 */ <= c) && (c <= 0x37/* 7 */));\n}\n\nfunction isDecCode(c) {\n  return ((0x30/* 0 */ <= c) && (c <= 0x39/* 9 */));\n}\n\nfunction resolveYamlInteger(data) {\n  if (data === null) return false;\n\n  var max = data.length,\n      index = 0,\n      hasDigits = false,\n      ch;\n\n  if (!max) return false;\n\n  ch = data[index];\n\n  // sign\n  if (ch === '-' || ch === '+') {\n    ch = data[++index];\n  }\n\n  if (ch === '0') {\n    // 0\n    if (index + 1 === max) return true;\n    ch = data[++index];\n\n    // base 2, base 8, base 16\n\n    if (ch === 'b') {\n      // base 2\n      index++;\n\n      for (; index < max; index++) {\n        ch = data[index];\n        if (ch === '_') continue;\n        if (ch !== '0' && ch !== '1') return false;\n        hasDigits = true;\n      }\n      return hasDigits;\n    }\n\n\n    if (ch === 'x') {\n      // base 16\n      index++;\n\n      for (; index < max; index++) {\n        ch = data[index];\n        if (ch === '_') continue;\n        if (!isHexCode(data.charCodeAt(index))) return false;\n        hasDigits = true;\n      }\n      return hasDigits;\n    }\n\n    // base 8\n    for (; index < max; index++) {\n      ch = data[index];\n      if (ch === '_') continue;\n      if (!isOctCode(data.charCodeAt(index))) return false;\n      hasDigits = true;\n    }\n    return hasDigits;\n  }\n\n  // base 10 (except 0) or base 60\n\n  for (; index < max; index++) {\n    ch = data[index];\n    if (ch === '_') continue;\n    if (ch === ':') break;\n    if (!isDecCode(data.charCodeAt(index))) {\n      return false;\n    }\n    hasDigits = true;\n  }\n\n  if (!hasDigits) return false;\n\n  // if !base60 - done;\n  if (ch !== ':') return true;\n\n  // base60 almost not used, no needs to optimize\n  return /^(:[0-5]?[0-9])+$/.test(data.slice(index));\n}\n\nfunction constructYamlInteger(data) {\n  var value = data, sign = 1, ch, base, digits = [];\n\n  if (value.indexOf('_') !== -1) {\n    value = value.replace(/_/g, '');\n  }\n\n  ch = value[0];\n\n  if (ch === '-' || ch === '+') {\n    if (ch === '-') sign = -1;\n    value = value.slice(1);\n    ch = value[0];\n  }\n\n  if (value === '0') return 0;\n\n  if (ch === '0') {\n    if (value[1] === 'b') return sign * parseInt(value.slice(2), 2);\n    if (value[1] === 'x') return sign * parseInt(value, 16);\n    return sign * parseInt(value, 8);\n  }\n\n  if (value.indexOf(':') !== -1) {\n    value.split(':').forEach(function (v) {\n      digits.unshift(parseInt(v, 10));\n    });\n\n    value = 0;\n    base = 1;\n\n    digits.forEach(function (d) {\n      value += (d * base);\n      base *= 60;\n    });\n\n    return sign * value;\n\n  }\n\n  return sign * parseInt(value, 10);\n}\n\nfunction isInteger(object) {\n  return (Object.prototype.toString.call(object)) === '[object Number]' &&\n         (object % 1 === 0 && !common.isNegativeZero(object));\n}\n\nmodule.exports = new Type('tag:yaml.org,2002:int', {\n  kind: 'scalar',\n  resolve: resolveYamlInteger,\n  construct: constructYamlInteger,\n  predicate: isInteger,\n  represent: {\n    binary:      function (object) { return '0b' + object.toString(2); },\n    octal:       function (object) { return '0'  + object.toString(8); },\n    decimal:     function (object) { return        object.toString(10); },\n    hexadecimal: function (object) { return '0x' + object.toString(16).toUpperCase(); }\n  },\n  defaultStyle: 'decimal',\n  styleAliases: {\n    binary:      [ 2,  'bin' ],\n    octal:       [ 8,  'oct' ],\n    decimal:     [ 10, 'dec' ],\n    hexadecimal: [ 16, 'hex' ]\n  }\n});\n\n},{\"../common\":21,\"../type\":32}],37:[function(require,module,exports){\n'use strict';\n\nvar esprima;\n\n// Browserified version does not have esprima\n//\n// 1. For node.js just require module as deps\n// 2. For browser try to require mudule via external AMD system.\n//    If not found - try to fallback to window.esprima. If not\n//    found too - then fail to parse.\n//\ntry {\n  // workaround to exclude package from browserify list.\n  var _require = require;\n  esprima = _require('esprima');\n} catch (_) {\n  /*global window */\n  if (typeof window !== 'undefined') esprima = window.esprima;\n}\n\nvar Type = require('../../type');\n\nfunction resolveJavascriptFunction(data) {\n  if (data === null) return false;\n\n  try {\n    var source = '(' + data + ')',\n        ast    = esprima.parse(source, { range: true });\n\n    if (ast.type                    !== 'Program'             ||\n        ast.body.length             !== 1                     ||\n        ast.body[0].type            !== 'ExpressionStatement' ||\n        ast.body[0].expression.type !== 'FunctionExpression') {\n      return false;\n    }\n\n    return true;\n  } catch (err) {\n    return false;\n  }\n}\n\nfunction constructJavascriptFunction(data) {\n  /*jslint evil:true*/\n\n  var source = '(' + data + ')',\n      ast    = esprima.parse(source, { range: true }),\n      params = [],\n      body;\n\n  if (ast.type                    !== 'Program'             ||\n      ast.body.length             !== 1                     ||\n      ast.body[0].type            !== 'ExpressionStatement' ||\n      ast.body[0].expression.type !== 'FunctionExpression') {\n    throw new Error('Failed to resolve function');\n  }\n\n  ast.body[0].expression.params.forEach(function (param) {\n    params.push(param.name);\n  });\n\n  body = ast.body[0].expression.body.range;\n\n  // Esprima's ranges include the first '{' and the last '}' characters on\n  // function expressions. So cut them out.\n  /*eslint-disable no-new-func*/\n  return new Function(params, source.slice(body[0] + 1, body[1] - 1));\n}\n\nfunction representJavascriptFunction(object /*, style*/) {\n  return object.toString();\n}\n\nfunction isFunction(object) {\n  return Object.prototype.toString.call(object) === '[object Function]';\n}\n\nmodule.exports = new Type('tag:yaml.org,2002:js/function', {\n  kind: 'scalar',\n  resolve: resolveJavascriptFunction,\n  construct: constructJavascriptFunction,\n  predicate: isFunction,\n  represent: representJavascriptFunction\n});\n\n},{\"../../type\":32}],38:[function(require,module,exports){\n'use strict';\n\nvar Type = require('../../type');\n\nfunction resolveJavascriptRegExp(data) {\n  if (data === null) return false;\n  if (data.length === 0) return false;\n\n  var regexp = data,\n      tail   = /\\/([gim]*)$/.exec(data),\n      modifiers = '';\n\n  // if regexp starts with '/' it can have modifiers and must be properly closed\n  // `/foo/gim` - modifiers tail can be maximum 3 chars\n  if (regexp[0] === '/') {\n    if (tail) modifiers = tail[1];\n\n    if (modifiers.length > 3) return false;\n    // if expression starts with /, is should be properly terminated\n    if (regexp[regexp.length - modifiers.length - 1] !== '/') return false;\n  }\n\n  return true;\n}\n\nfunction constructJavascriptRegExp(data) {\n  var regexp = data,\n      tail   = /\\/([gim]*)$/.exec(data),\n      modifiers = '';\n\n  // `/foo/gim` - tail can be maximum 4 chars\n  if (regexp[0] === '/') {\n    if (tail) modifiers = tail[1];\n    regexp = regexp.slice(1, regexp.length - modifiers.length - 1);\n  }\n\n  return new RegExp(regexp, modifiers);\n}\n\nfunction representJavascriptRegExp(object /*, style*/) {\n  var result = '/' + object.source + '/';\n\n  if (object.global) result += 'g';\n  if (object.multiline) result += 'm';\n  if (object.ignoreCase) result += 'i';\n\n  return result;\n}\n\nfunction isRegExp(object) {\n  return Object.prototype.toString.call(object) === '[object RegExp]';\n}\n\nmodule.exports = new Type('tag:yaml.org,2002:js/regexp', {\n  kind: 'scalar',\n  resolve: resolveJavascriptRegExp,\n  construct: constructJavascriptRegExp,\n  predicate: isRegExp,\n  represent: representJavascriptRegExp\n});\n\n},{\"../../type\":32}],39:[function(require,module,exports){\n'use strict';\n\nvar Type = require('../../type');\n\nfunction resolveJavascriptUndefined() {\n  return true;\n}\n\nfunction constructJavascriptUndefined() {\n  /*eslint-disable no-undefined*/\n  return undefined;\n}\n\nfunction representJavascriptUndefined() {\n  return '';\n}\n\nfunction isUndefined(object) {\n  return typeof object === 'undefined';\n}\n\nmodule.exports = new Type('tag:yaml.org,2002:js/undefined', {\n  kind: 'scalar',\n  resolve: resolveJavascriptUndefined,\n  construct: constructJavascriptUndefined,\n  predicate: isUndefined,\n  represent: representJavascriptUndefined\n});\n\n},{\"../../type\":32}],40:[function(require,module,exports){\n'use strict';\n\nvar Type = require('../type');\n\nmodule.exports = new Type('tag:yaml.org,2002:map', {\n  kind: 'mapping',\n  construct: function (data) { return data !== null ? data : {}; }\n});\n\n},{\"../type\":32}],41:[function(require,module,exports){\n'use strict';\n\nvar Type = require('../type');\n\nfunction resolveYamlMerge(data) {\n  return data === '<<' || data === null;\n}\n\nmodule.exports = new Type('tag:yaml.org,2002:merge', {\n  kind: 'scalar',\n  resolve: resolveYamlMerge\n});\n\n},{\"../type\":32}],42:[function(require,module,exports){\n'use strict';\n\nvar Type = require('../type');\n\nfunction resolveYamlNull(data) {\n  if (data === null) return true;\n\n  var max = data.length;\n\n  return (max === 1 && data === '~') ||\n         (max === 4 && (data === 'null' || data === 'Null' || data === 'NULL'));\n}\n\nfunction constructYamlNull() {\n  return null;\n}\n\nfunction isNull(object) {\n  return object === null;\n}\n\nmodule.exports = new Type('tag:yaml.org,2002:null', {\n  kind: 'scalar',\n  resolve: resolveYamlNull,\n  construct: constructYamlNull,\n  predicate: isNull,\n  represent: {\n    canonical: function () { return '~';    },\n    lowercase: function () { return 'null'; },\n    uppercase: function () { return 'NULL'; },\n    camelcase: function () { return 'Null'; }\n  },\n  defaultStyle: 'lowercase'\n});\n\n},{\"../type\":32}],43:[function(require,module,exports){\n'use strict';\n\nvar Type = require('../type');\n\nvar _hasOwnProperty = Object.prototype.hasOwnProperty;\nvar _toString       = Object.prototype.toString;\n\nfunction resolveYamlOmap(data) {\n  if (data === null) return true;\n\n  var objectKeys = [], index, length, pair, pairKey, pairHasKey,\n      object = data;\n\n  for (index = 0, length = object.length; index < length; index += 1) {\n    pair = object[index];\n    pairHasKey = false;\n\n    if (_toString.call(pair) !== '[object Object]') return false;\n\n    for (pairKey in pair) {\n      if (_hasOwnProperty.call(pair, pairKey)) {\n        if (!pairHasKey) pairHasKey = true;\n        else return false;\n      }\n    }\n\n    if (!pairHasKey) return false;\n\n    if (objectKeys.indexOf(pairKey) === -1) objectKeys.push(pairKey);\n    else return false;\n  }\n\n  return true;\n}\n\nfunction constructYamlOmap(data) {\n  return data !== null ? data : [];\n}\n\nmodule.exports = new Type('tag:yaml.org,2002:omap', {\n  kind: 'sequence',\n  resolve: resolveYamlOmap,\n  construct: constructYamlOmap\n});\n\n},{\"../type\":32}],44:[function(require,module,exports){\n'use strict';\n\nvar Type = require('../type');\n\nvar _toString = Object.prototype.toString;\n\nfunction resolveYamlPairs(data) {\n  if (data === null) return true;\n\n  var index, length, pair, keys, result,\n      object = data;\n\n  result = new Array(object.length);\n\n  for (index = 0, length = object.length; index < length; index += 1) {\n    pair = object[index];\n\n    if (_toString.call(pair) !== '[object Object]') return false;\n\n    keys = Object.keys(pair);\n\n    if (keys.length !== 1) return false;\n\n    result[index] = [ keys[0], pair[keys[0]] ];\n  }\n\n  return true;\n}\n\nfunction constructYamlPairs(data) {\n  if (data === null) return [];\n\n  var index, length, pair, keys, result,\n      object = data;\n\n  result = new Array(object.length);\n\n  for (index = 0, length = object.length; index < length; index += 1) {\n    pair = object[index];\n\n    keys = Object.keys(pair);\n\n    result[index] = [ keys[0], pair[keys[0]] ];\n  }\n\n  return result;\n}\n\nmodule.exports = new Type('tag:yaml.org,2002:pairs', {\n  kind: 'sequence',\n  resolve: resolveYamlPairs,\n  construct: constructYamlPairs\n});\n\n},{\"../type\":32}],45:[function(require,module,exports){\n'use strict';\n\nvar Type = require('../type');\n\nmodule.exports = new Type('tag:yaml.org,2002:seq', {\n  kind: 'sequence',\n  construct: function (data) { return data !== null ? data : []; }\n});\n\n},{\"../type\":32}],46:[function(require,module,exports){\n'use strict';\n\nvar Type = require('../type');\n\nvar _hasOwnProperty = Object.prototype.hasOwnProperty;\n\nfunction resolveYamlSet(data) {\n  if (data === null) return true;\n\n  var key, object = data;\n\n  for (key in object) {\n    if (_hasOwnProperty.call(object, key)) {\n      if (object[key] !== null) return false;\n    }\n  }\n\n  return true;\n}\n\nfunction constructYamlSet(data) {\n  return data !== null ? data : {};\n}\n\nmodule.exports = new Type('tag:yaml.org,2002:set', {\n  kind: 'mapping',\n  resolve: resolveYamlSet,\n  construct: constructYamlSet\n});\n\n},{\"../type\":32}],47:[function(require,module,exports){\n'use strict';\n\nvar Type = require('../type');\n\nmodule.exports = new Type('tag:yaml.org,2002:str', {\n  kind: 'scalar',\n  construct: function (data) { return data !== null ? data : ''; }\n});\n\n},{\"../type\":32}],48:[function(require,module,exports){\n'use strict';\n\nvar Type = require('../type');\n\nvar YAML_DATE_REGEXP = new RegExp(\n  '^([0-9][0-9][0-9][0-9])'          + // [1] year\n  '-([0-9][0-9])'                    + // [2] month\n  '-([0-9][0-9])$');                   // [3] day\n\nvar YAML_TIMESTAMP_REGEXP = new RegExp(\n  '^([0-9][0-9][0-9][0-9])'          + // [1] year\n  '-([0-9][0-9]?)'                   + // [2] month\n  '-([0-9][0-9]?)'                   + // [3] day\n  '(?:[Tt]|[ \\\\t]+)'                 + // ...\n  '([0-9][0-9]?)'                    + // [4] hour\n  ':([0-9][0-9])'                    + // [5] minute\n  ':([0-9][0-9])'                    + // [6] second\n  '(?:\\\\.([0-9]*))?'                 + // [7] fraction\n  '(?:[ \\\\t]*(Z|([-+])([0-9][0-9]?)' + // [8] tz [9] tz_sign [10] tz_hour\n  '(?::([0-9][0-9]))?))?$');           // [11] tz_minute\n\nfunction resolveYamlTimestamp(data) {\n  if (data === null) return false;\n  if (YAML_DATE_REGEXP.exec(data) !== null) return true;\n  if (YAML_TIMESTAMP_REGEXP.exec(data) !== null) return true;\n  return false;\n}\n\nfunction constructYamlTimestamp(data) {\n  var match, year, month, day, hour, minute, second, fraction = 0,\n      delta = null, tz_hour, tz_minute, date;\n\n  match = YAML_DATE_REGEXP.exec(data);\n  if (match === null) match = YAML_TIMESTAMP_REGEXP.exec(data);\n\n  if (match === null) throw new Error('Date resolve error');\n\n  // match: [1] year [2] month [3] day\n\n  year = +(match[1]);\n  month = +(match[2]) - 1; // JS month starts with 0\n  day = +(match[3]);\n\n  if (!match[4]) { // no hour\n    return new Date(Date.UTC(year, month, day));\n  }\n\n  // match: [4] hour [5] minute [6] second [7] fraction\n\n  hour = +(match[4]);\n  minute = +(match[5]);\n  second = +(match[6]);\n\n  if (match[7]) {\n    fraction = match[7].slice(0, 3);\n    while (fraction.length < 3) { // milli-seconds\n      fraction += '0';\n    }\n    fraction = +fraction;\n  }\n\n  // match: [8] tz [9] tz_sign [10] tz_hour [11] tz_minute\n\n  if (match[9]) {\n    tz_hour = +(match[10]);\n    tz_minute = +(match[11] || 0);\n    delta = (tz_hour * 60 + tz_minute) * 60000; // delta in mili-seconds\n    if (match[9] === '-') delta = -delta;\n  }\n\n  date = new Date(Date.UTC(year, month, day, hour, minute, second, fraction));\n\n  if (delta) date.setTime(date.getTime() - delta);\n\n  return date;\n}\n\nfunction representYamlTimestamp(object /*, style*/) {\n  return object.toISOString();\n}\n\nmodule.exports = new Type('tag:yaml.org,2002:timestamp', {\n  kind: 'scalar',\n  resolve: resolveYamlTimestamp,\n  construct: constructYamlTimestamp,\n  instanceOf: Date,\n  represent: representYamlTimestamp\n});\n\n},{\"../type\":32}],49:[function(require,module,exports){\nvar baseIndexOf = require('../internal/baseIndexOf'),\n    binaryIndex = require('../internal/binaryIndex');\n\n/* Native method references for those with the same name as other `lodash` methods. */\nvar nativeMax = Math.max;\n\n/**\n * Gets the index at which the first occurrence of `value` is found in `array`\n * using [`SameValueZero`](http://ecma-international.org/ecma-262/6.0/#sec-samevaluezero)\n * for equality comparisons. If `fromIndex` is negative, it's used as the offset\n * from the end of `array`. If `array` is sorted providing `true` for `fromIndex`\n * performs a faster binary search.\n *\n * @static\n * @memberOf _\n * @category Array\n * @param {Array} array The array to search.\n * @param {*} value The value to search for.\n * @param {boolean|number} [fromIndex=0] The index to search from or `true`\n *  to perform a binary search on a sorted array.\n * @returns {number} Returns the index of the matched value, else `-1`.\n * @example\n *\n * _.indexOf([1, 2, 1, 2], 2);\n * // => 1\n *\n * // using `fromIndex`\n * _.indexOf([1, 2, 1, 2], 2, 2);\n * // => 3\n *\n * // performing a binary search\n * _.indexOf([1, 1, 2, 2], 2, true);\n * // => 2\n */\nfunction indexOf(array, value, fromIndex) {\n  var length = array ? array.length : 0;\n  if (!length) {\n    return -1;\n  }\n  if (typeof fromIndex == 'number') {\n    fromIndex = fromIndex < 0 ? nativeMax(length + fromIndex, 0) : fromIndex;\n  } else if (fromIndex) {\n    var index = binaryIndex(array, value);\n    if (index < length &&\n        (value === value ? (value === array[index]) : (array[index] !== array[index]))) {\n      return index;\n    }\n    return -1;\n  }\n  return baseIndexOf(array, value, fromIndex || 0);\n}\n\nmodule.exports = indexOf;\n\n},{\"../internal/baseIndexOf\":78,\"../internal/binaryIndex\":92}],50:[function(require,module,exports){\n/**\n * Gets the last element of `array`.\n *\n * @static\n * @memberOf _\n * @category Array\n * @param {Array} array The array to query.\n * @returns {*} Returns the last element of `array`.\n * @example\n *\n * _.last([1, 2, 3]);\n * // => 3\n */\nfunction last(array) {\n  var length = array ? array.length : 0;\n  return length ? array[length - 1] : undefined;\n}\n\nmodule.exports = last;\n\n},{}],51:[function(require,module,exports){\nvar LazyWrapper = require('../internal/LazyWrapper'),\n    LodashWrapper = require('../internal/LodashWrapper'),\n    baseLodash = require('../internal/baseLodash'),\n    isArray = require('../lang/isArray'),\n    isObjectLike = require('../internal/isObjectLike'),\n    wrapperClone = require('../internal/wrapperClone');\n\n/** Used for native method references. */\nvar objectProto = Object.prototype;\n\n/** Used to check objects for own properties. */\nvar hasOwnProperty = objectProto.hasOwnProperty;\n\n/**\n * Creates a `lodash` object which wraps `value` to enable implicit chaining.\n * Methods that operate on and return arrays, collections, and functions can\n * be chained together. Methods that retrieve a single value or may return a\n * primitive value will automatically end the chain returning the unwrapped\n * value. Explicit chaining may be enabled using `_.chain`. The execution of\n * chained methods is lazy, that is, execution is deferred until `_#value`\n * is implicitly or explicitly called.\n *\n * Lazy evaluation allows several methods to support shortcut fusion. Shortcut\n * fusion is an optimization strategy which merge iteratee calls; this can help\n * to avoid the creation of intermediate data structures and greatly reduce the\n * number of iteratee executions.\n *\n * Chaining is supported in custom builds as long as the `_#value` method is\n * directly or indirectly included in the build.\n *\n * In addition to lodash methods, wrappers have `Array` and `String` methods.\n *\n * The wrapper `Array` methods are:\n * `concat`, `join`, `pop`, `push`, `reverse`, `shift`, `slice`, `sort`,\n * `splice`, and `unshift`\n *\n * The wrapper `String` methods are:\n * `replace` and `split`\n *\n * The wrapper methods that support shortcut fusion are:\n * `compact`, `drop`, `dropRight`, `dropRightWhile`, `dropWhile`, `filter`,\n * `first`, `initial`, `last`, `map`, `pluck`, `reject`, `rest`, `reverse`,\n * `slice`, `take`, `takeRight`, `takeRightWhile`, `takeWhile`, `toArray`,\n * and `where`\n *\n * The chainable wrapper methods are:\n * `after`, `ary`, `assign`, `at`, `before`, `bind`, `bindAll`, `bindKey`,\n * `callback`, `chain`, `chunk`, `commit`, `compact`, `concat`, `constant`,\n * `countBy`, `create`, `curry`, `debounce`, `defaults`, `defaultsDeep`,\n * `defer`, `delay`, `difference`, `drop`, `dropRight`, `dropRightWhile`,\n * `dropWhile`, `fill`, `filter`, `flatten`, `flattenDeep`, `flow`, `flowRight`,\n * `forEach`, `forEachRight`, `forIn`, `forInRight`, `forOwn`, `forOwnRight`,\n * `functions`, `groupBy`, `indexBy`, `initial`, `intersection`, `invert`,\n * `invoke`, `keys`, `keysIn`, `map`, `mapKeys`, `mapValues`, `matches`,\n * `matchesProperty`, `memoize`, `merge`, `method`, `methodOf`, `mixin`,\n * `modArgs`, `negate`, `omit`, `once`, `pairs`, `partial`, `partialRight`,\n * `partition`, `pick`, `plant`, `pluck`, `property`, `propertyOf`, `pull`,\n * `pullAt`, `push`, `range`, `rearg`, `reject`, `remove`, `rest`, `restParam`,\n * `reverse`, `set`, `shuffle`, `slice`, `sort`, `sortBy`, `sortByAll`,\n * `sortByOrder`, `splice`, `spread`, `take`, `takeRight`, `takeRightWhile`,\n * `takeWhile`, `tap`, `throttle`, `thru`, `times`, `toArray`, `toPlainObject`,\n * `transform`, `union`, `uniq`, `unshift`, `unzip`, `unzipWith`, `values`,\n * `valuesIn`, `where`, `without`, `wrap`, `xor`, `zip`, `zipObject`, `zipWith`\n *\n * The wrapper methods that are **not** chainable by default are:\n * `add`, `attempt`, `camelCase`, `capitalize`, `ceil`, `clone`, `cloneDeep`,\n * `deburr`, `endsWith`, `escape`, `escapeRegExp`, `every`, `find`, `findIndex`,\n * `findKey`, `findLast`, `findLastIndex`, `findLastKey`, `findWhere`, `first`,\n * `floor`, `get`, `gt`, `gte`, `has`, `identity`, `includes`, `indexOf`,\n * `inRange`, `isArguments`, `isArray`, `isBoolean`, `isDate`, `isElement`,\n * `isEmpty`, `isEqual`, `isError`, `isFinite` `isFunction`, `isMatch`,\n * `isNative`, `isNaN`, `isNull`, `isNumber`, `isObject`, `isPlainObject`,\n * `isRegExp`, `isString`, `isUndefined`, `isTypedArray`, `join`, `kebabCase`,\n * `last`, `lastIndexOf`, `lt`, `lte`, `max`, `min`, `noConflict`, `noop`,\n * `now`, `pad`, `padLeft`, `padRight`, `parseInt`, `pop`, `random`, `reduce`,\n * `reduceRight`, `repeat`, `result`, `round`, `runInContext`, `shift`, `size`,\n * `snakeCase`, `some`, `sortedIndex`, `sortedLastIndex`, `startCase`,\n * `startsWith`, `sum`, `template`, `trim`, `trimLeft`, `trimRight`, `trunc`,\n * `unescape`, `uniqueId`, `value`, and `words`\n *\n * The wrapper method `sample` will return a wrapped value when `n` is provided,\n * otherwise an unwrapped value is returned.\n *\n * @name _\n * @constructor\n * @category Chain\n * @param {*} value The value to wrap in a `lodash` instance.\n * @returns {Object} Returns the new `lodash` wrapper instance.\n * @example\n *\n * var wrapped = _([1, 2, 3]);\n *\n * // returns an unwrapped value\n * wrapped.reduce(function(total, n) {\n *   return total + n;\n * });\n * // => 6\n *\n * // returns a wrapped value\n * var squares = wrapped.map(function(n) {\n *   return n * n;\n * });\n *\n * _.isArray(squares);\n * // => false\n *\n * _.isArray(squares.value());\n * // => true\n */\nfunction lodash(value) {\n  if (isObjectLike(value) && !isArray(value) && !(value instanceof LazyWrapper)) {\n    if (value instanceof LodashWrapper) {\n      return value;\n    }\n    if (hasOwnProperty.call(value, '__chain__') && hasOwnProperty.call(value, '__wrapped__')) {\n      return wrapperClone(value);\n    }\n  }\n  return new LodashWrapper(value);\n}\n\n// Ensure wrappers are instances of `baseLodash`.\nlodash.prototype = baseLodash.prototype;\n\nmodule.exports = lodash;\n\n},{\"../internal/LazyWrapper\":60,\"../internal/LodashWrapper\":61,\"../internal/baseLodash\":82,\"../internal/isObjectLike\":126,\"../internal/wrapperClone\":137,\"../lang/isArray\":140}],52:[function(require,module,exports){\nmodule.exports = require('./forEach');\n\n},{\"./forEach\":54}],53:[function(require,module,exports){\nvar baseEach = require('../internal/baseEach'),\n    createFind = require('../internal/createFind');\n\n/**\n * Iterates over elements of `collection`, returning the first element\n * `predicate` returns truthy for. The predicate is bound to `thisArg` and\n * invoked with three arguments: (value, index|key, collection).\n *\n * If a property name is provided for `predicate` the created `_.property`\n * style callback returns the property value of the given element.\n *\n * If a value is also provided for `thisArg` the created `_.matchesProperty`\n * style callback returns `true` for elements that have a matching property\n * value, else `false`.\n *\n * If an object is provided for `predicate` the created `_.matches` style\n * callback returns `true` for elements that have the properties of the given\n * object, else `false`.\n *\n * @static\n * @memberOf _\n * @alias detect\n * @category Collection\n * @param {Array|Object|string} collection The collection to search.\n * @param {Function|Object|string} [predicate=_.identity] The function invoked\n *  per iteration.\n * @param {*} [thisArg] The `this` binding of `predicate`.\n * @returns {*} Returns the matched element, else `undefined`.\n * @example\n *\n * var users = [\n *   { 'user': 'barney',  'age': 36, 'active': true },\n *   { 'user': 'fred',    'age': 40, 'active': false },\n *   { 'user': 'pebbles', 'age': 1,  'active': true }\n * ];\n *\n * _.result(_.find(users, function(chr) {\n *   return chr.age < 40;\n * }), 'user');\n * // => 'barney'\n *\n * // using the `_.matches` callback shorthand\n * _.result(_.find(users, { 'age': 1, 'active': true }), 'user');\n * // => 'pebbles'\n *\n * // using the `_.matchesProperty` callback shorthand\n * _.result(_.find(users, 'active', false), 'user');\n * // => 'fred'\n *\n * // using the `_.property` callback shorthand\n * _.result(_.find(users, 'active'), 'user');\n * // => 'barney'\n */\nvar find = createFind(baseEach);\n\nmodule.exports = find;\n\n},{\"../internal/baseEach\":71,\"../internal/createFind\":102}],54:[function(require,module,exports){\nvar arrayEach = require('../internal/arrayEach'),\n    baseEach = require('../internal/baseEach'),\n    createForEach = require('../internal/createForEach');\n\n/**\n * Iterates over elements of `collection` invoking `iteratee` for each element.\n * The `iteratee` is bound to `thisArg` and invoked with three arguments:\n * (value, index|key, collection). Iteratee functions may exit iteration early\n * by explicitly returning `false`.\n *\n * **Note:** As with other \"Collections\" methods, objects with a \"length\" property\n * are iterated like arrays. To avoid this behavior `_.forIn` or `_.forOwn`\n * may be used for object iteration.\n *\n * @static\n * @memberOf _\n * @alias each\n * @category Collection\n * @param {Array|Object|string} collection The collection to iterate over.\n * @param {Function} [iteratee=_.identity] The function invoked per iteration.\n * @param {*} [thisArg] The `this` binding of `iteratee`.\n * @returns {Array|Object|string} Returns `collection`.\n * @example\n *\n * _([1, 2]).forEach(function(n) {\n *   console.log(n);\n * }).value();\n * // => logs each value from left to right and returns the array\n *\n * _.forEach({ 'a': 1, 'b': 2 }, function(n, key) {\n *   console.log(n, key);\n * });\n * // => logs each value-key pair and returns the object (iteration order is not guaranteed)\n */\nvar forEach = createForEach(arrayEach, baseEach);\n\nmodule.exports = forEach;\n\n},{\"../internal/arrayEach\":63,\"../internal/baseEach\":71,\"../internal/createForEach\":103}],55:[function(require,module,exports){\nvar baseIndexOf = require('../internal/baseIndexOf'),\n    getLength = require('../internal/getLength'),\n    isArray = require('../lang/isArray'),\n    isIterateeCall = require('../internal/isIterateeCall'),\n    isLength = require('../internal/isLength'),\n    isString = require('../lang/isString'),\n    values = require('../object/values');\n\n/* Native method references for those with the same name as other `lodash` methods. */\nvar nativeMax = Math.max;\n\n/**\n * Checks if `target` is in `collection` using\n * [`SameValueZero`](http://ecma-international.org/ecma-262/6.0/#sec-samevaluezero)\n * for equality comparisons. If `fromIndex` is negative, it's used as the offset\n * from the end of `collection`.\n *\n * @static\n * @memberOf _\n * @alias contains, include\n * @category Collection\n * @param {Array|Object|string} collection The collection to search.\n * @param {*} target The value to search for.\n * @param {number} [fromIndex=0] The index to search from.\n * @param- {Object} [guard] Enables use as a callback for functions like `_.reduce`.\n * @returns {boolean} Returns `true` if a matching element is found, else `false`.\n * @example\n *\n * _.includes([1, 2, 3], 1);\n * // => true\n *\n * _.includes([1, 2, 3], 1, 2);\n * // => false\n *\n * _.includes({ 'user': 'fred', 'age': 40 }, 'fred');\n * // => true\n *\n * _.includes('pebbles', 'eb');\n * // => true\n */\nfunction includes(collection, target, fromIndex, guard) {\n  var length = collection ? getLength(collection) : 0;\n  if (!isLength(length)) {\n    collection = values(collection);\n    length = collection.length;\n  }\n  if (typeof fromIndex != 'number' || (guard && isIterateeCall(target, fromIndex, guard))) {\n    fromIndex = 0;\n  } else {\n    fromIndex = fromIndex < 0 ? nativeMax(length + fromIndex, 0) : (fromIndex || 0);\n  }\n  return (typeof collection == 'string' || !isArray(collection) && isString(collection))\n    ? (fromIndex <= length && collection.indexOf(target, fromIndex) > -1)\n    : (!!length && baseIndexOf(collection, target, fromIndex) > -1);\n}\n\nmodule.exports = includes;\n\n},{\"../internal/baseIndexOf\":78,\"../internal/getLength\":112,\"../internal/isIterateeCall\":122,\"../internal/isLength\":125,\"../lang/isArray\":140,\"../lang/isString\":146,\"../object/values\":152}],56:[function(require,module,exports){\nvar arrayMap = require('../internal/arrayMap'),\n    baseCallback = require('../internal/baseCallback'),\n    baseMap = require('../internal/baseMap'),\n    isArray = require('../lang/isArray');\n\n/**\n * Creates an array of values by running each element in `collection` through\n * `iteratee`. The `iteratee` is bound to `thisArg` and invoked with three\n * arguments: (value, index|key, collection).\n *\n * If a property name is provided for `iteratee` the created `_.property`\n * style callback returns the property value of the given element.\n *\n * If a value is also provided for `thisArg` the created `_.matchesProperty`\n * style callback returns `true` for elements that have a matching property\n * value, else `false`.\n *\n * If an object is provided for `iteratee` the created `_.matches` style\n * callback returns `true` for elements that have the properties of the given\n * object, else `false`.\n *\n * Many lodash methods are guarded to work as iteratees for methods like\n * `_.every`, `_.filter`, `_.map`, `_.mapValues`, `_.reject`, and `_.some`.\n *\n * The guarded methods are:\n * `ary`, `callback`, `chunk`, `clone`, `create`, `curry`, `curryRight`,\n * `drop`, `dropRight`, `every`, `fill`, `flatten`, `invert`, `max`, `min`,\n * `parseInt`, `slice`, `sortBy`, `take`, `takeRight`, `template`, `trim`,\n * `trimLeft`, `trimRight`, `trunc`, `random`, `range`, `sample`, `some`,\n * `sum`, `uniq`, and `words`\n *\n * @static\n * @memberOf _\n * @alias collect\n * @category Collection\n * @param {Array|Object|string} collection The collection to iterate over.\n * @param {Function|Object|string} [iteratee=_.identity] The function invoked\n *  per iteration.\n * @param {*} [thisArg] The `this` binding of `iteratee`.\n * @returns {Array} Returns the new mapped array.\n * @example\n *\n * function timesThree(n) {\n *   return n * 3;\n * }\n *\n * _.map([1, 2], timesThree);\n * // => [3, 6]\n *\n * _.map({ 'a': 1, 'b': 2 }, timesThree);\n * // => [3, 6] (iteration order is not guaranteed)\n *\n * var users = [\n *   { 'user': 'barney' },\n *   { 'user': 'fred' }\n * ];\n *\n * // using the `_.property` callback shorthand\n * _.map(users, 'user');\n * // => ['barney', 'fred']\n */\nfunction map(collection, iteratee, thisArg) {\n  var func = isArray(collection) ? arrayMap : baseMap;\n  iteratee = baseCallback(iteratee, thisArg, 3);\n  return func(collection, iteratee);\n}\n\nmodule.exports = map;\n\n},{\"../internal/arrayMap\":64,\"../internal/baseCallback\":67,\"../internal/baseMap\":83,\"../lang/isArray\":140}],57:[function(require,module,exports){\nvar getNative = require('../internal/getNative');\n\n/* Native method references for those with the same name as other `lodash` methods. */\nvar nativeNow = getNative(Date, 'now');\n\n/**\n * Gets the number of milliseconds that have elapsed since the Unix epoch\n * (1 January 1970 00:00:00 UTC).\n *\n * @static\n * @memberOf _\n * @category Date\n * @example\n *\n * _.defer(function(stamp) {\n *   console.log(_.now() - stamp);\n * }, _.now());\n * // => logs the number of milliseconds it took for the deferred function to be invoked\n */\nvar now = nativeNow || function() {\n  return new Date().getTime();\n};\n\nmodule.exports = now;\n\n},{\"../internal/getNative\":114}],58:[function(require,module,exports){\nvar createWrapper = require('../internal/createWrapper'),\n    replaceHolders = require('../internal/replaceHolders'),\n    restParam = require('./restParam');\n\n/** Used to compose bitmasks for wrapper metadata. */\nvar BIND_FLAG = 1,\n    PARTIAL_FLAG = 32;\n\n/**\n * Creates a function that invokes `func` with the `this` binding of `thisArg`\n * and prepends any additional `_.bind` arguments to those provided to the\n * bound function.\n *\n * The `_.bind.placeholder` value, which defaults to `_` in monolithic builds,\n * may be used as a placeholder for partially applied arguments.\n *\n * **Note:** Unlike native `Function#bind` this method does not set the \"length\"\n * property of bound functions.\n *\n * @static\n * @memberOf _\n * @category Function\n * @param {Function} func The function to bind.\n * @param {*} thisArg The `this` binding of `func`.\n * @param {...*} [partials] The arguments to be partially applied.\n * @returns {Function} Returns the new bound function.\n * @example\n *\n * var greet = function(greeting, punctuation) {\n *   return greeting + ' ' + this.user + punctuation;\n * };\n *\n * var object = { 'user': 'fred' };\n *\n * var bound = _.bind(greet, object, 'hi');\n * bound('!');\n * // => 'hi fred!'\n *\n * // using placeholders\n * var bound = _.bind(greet, object, _, '!');\n * bound('hi');\n * // => 'hi fred!'\n */\nvar bind = restParam(function(func, thisArg, partials) {\n  var bitmask = BIND_FLAG;\n  if (partials.length) {\n    var holders = replaceHolders(partials, bind.placeholder);\n    bitmask |= PARTIAL_FLAG;\n  }\n  return createWrapper(func, bitmask, thisArg, partials, holders);\n});\n\n// Assign default placeholders.\nbind.placeholder = {};\n\nmodule.exports = bind;\n\n},{\"../internal/createWrapper\":106,\"../internal/replaceHolders\":132,\"./restParam\":59}],59:[function(require,module,exports){\n/** Used as the `TypeError` message for \"Functions\" methods. */\nvar FUNC_ERROR_TEXT = 'Expected a function';\n\n/* Native method references for those with the same name as other `lodash` methods. */\nvar nativeMax = Math.max;\n\n/**\n * Creates a function that invokes `func` with the `this` binding of the\n * created function and arguments from `start` and beyond provided as an array.\n *\n * **Note:** This method is based on the [rest parameter](https://developer.mozilla.org/Web/JavaScript/Reference/Functions/rest_parameters).\n *\n * @static\n * @memberOf _\n * @category Function\n * @param {Function} func The function to apply a rest parameter to.\n * @param {number} [start=func.length-1] The start position of the rest parameter.\n * @returns {Function} Returns the new function.\n * @example\n *\n * var say = _.restParam(function(what, names) {\n *   return what + ' ' + _.initial(names).join(', ') +\n *     (_.size(names) > 1 ? ', & ' : '') + _.last(names);\n * });\n *\n * say('hello', 'fred', 'barney', 'pebbles');\n * // => 'hello fred, barney, & pebbles'\n */\nfunction restParam(func, start) {\n  if (typeof func != 'function') {\n    throw new TypeError(FUNC_ERROR_TEXT);\n  }\n  start = nativeMax(start === undefined ? (func.length - 1) : (+start || 0), 0);\n  return function() {\n    var args = arguments,\n        index = -1,\n        length = nativeMax(args.length - start, 0),\n        rest = Array(length);\n\n    while (++index < length) {\n      rest[index] = args[start + index];\n    }\n    switch (start) {\n      case 0: return func.call(this, rest);\n      case 1: return func.call(this, args[0], rest);\n      case 2: return func.call(this, args[0], args[1], rest);\n    }\n    var otherArgs = Array(start + 1);\n    index = -1;\n    while (++index < start) {\n      otherArgs[index] = args[index];\n    }\n    otherArgs[start] = rest;\n    return func.apply(this, otherArgs);\n  };\n}\n\nmodule.exports = restParam;\n\n},{}],60:[function(require,module,exports){\nvar baseCreate = require('./baseCreate'),\n    baseLodash = require('./baseLodash');\n\n/** Used as references for `-Infinity` and `Infinity`. */\nvar POSITIVE_INFINITY = Number.POSITIVE_INFINITY;\n\n/**\n * Creates a lazy wrapper object which wraps `value` to enable lazy evaluation.\n *\n * @private\n * @param {*} value The value to wrap.\n */\nfunction LazyWrapper(value) {\n  this.__wrapped__ = value;\n  this.__actions__ = [];\n  this.__dir__ = 1;\n  this.__filtered__ = false;\n  this.__iteratees__ = [];\n  this.__takeCount__ = POSITIVE_INFINITY;\n  this.__views__ = [];\n}\n\nLazyWrapper.prototype = baseCreate(baseLodash.prototype);\nLazyWrapper.prototype.constructor = LazyWrapper;\n\nmodule.exports = LazyWrapper;\n\n},{\"./baseCreate\":70,\"./baseLodash\":82}],61:[function(require,module,exports){\nvar baseCreate = require('./baseCreate'),\n    baseLodash = require('./baseLodash');\n\n/**\n * The base constructor for creating `lodash` wrapper objects.\n *\n * @private\n * @param {*} value The value to wrap.\n * @param {boolean} [chainAll] Enable chaining for all wrapper methods.\n * @param {Array} [actions=[]] Actions to peform to resolve the unwrapped value.\n */\nfunction LodashWrapper(value, chainAll, actions) {\n  this.__wrapped__ = value;\n  this.__actions__ = actions || [];\n  this.__chain__ = !!chainAll;\n}\n\nLodashWrapper.prototype = baseCreate(baseLodash.prototype);\nLodashWrapper.prototype.constructor = LodashWrapper;\n\nmodule.exports = LodashWrapper;\n\n},{\"./baseCreate\":70,\"./baseLodash\":82}],62:[function(require,module,exports){\n/**\n * Copies the values of `source` to `array`.\n *\n * @private\n * @param {Array} source The array to copy values from.\n * @param {Array} [array=[]] The array to copy values to.\n * @returns {Array} Returns `array`.\n */\nfunction arrayCopy(source, array) {\n  var index = -1,\n      length = source.length;\n\n  array || (array = Array(length));\n  while (++index < length) {\n    array[index] = source[index];\n  }\n  return array;\n}\n\nmodule.exports = arrayCopy;\n\n},{}],63:[function(require,module,exports){\n/**\n * A specialized version of `_.forEach` for arrays without support for callback\n * shorthands and `this` binding.\n *\n * @private\n * @param {Array} array The array to iterate over.\n * @param {Function} iteratee The function invoked per iteration.\n * @returns {Array} Returns `array`.\n */\nfunction arrayEach(array, iteratee) {\n  var index = -1,\n      length = array.length;\n\n  while (++index < length) {\n    if (iteratee(array[index], index, array) === false) {\n      break;\n    }\n  }\n  return array;\n}\n\nmodule.exports = arrayEach;\n\n},{}],64:[function(require,module,exports){\n/**\n * A specialized version of `_.map` for arrays without support for callback\n * shorthands and `this` binding.\n *\n * @private\n * @param {Array} array The array to iterate over.\n * @param {Function} iteratee The function invoked per iteration.\n * @returns {Array} Returns the new mapped array.\n */\nfunction arrayMap(array, iteratee) {\n  var index = -1,\n      length = array.length,\n      result = Array(length);\n\n  while (++index < length) {\n    result[index] = iteratee(array[index], index, array);\n  }\n  return result;\n}\n\nmodule.exports = arrayMap;\n\n},{}],65:[function(require,module,exports){\n/**\n * A specialized version of `_.some` for arrays without support for callback\n * shorthands and `this` binding.\n *\n * @private\n * @param {Array} array The array to iterate over.\n * @param {Function} predicate The function invoked per iteration.\n * @returns {boolean} Returns `true` if any element passes the predicate check,\n *  else `false`.\n */\nfunction arraySome(array, predicate) {\n  var index = -1,\n      length = array.length;\n\n  while (++index < length) {\n    if (predicate(array[index], index, array)) {\n      return true;\n    }\n  }\n  return false;\n}\n\nmodule.exports = arraySome;\n\n},{}],66:[function(require,module,exports){\nvar baseCopy = require('./baseCopy'),\n    keys = require('../object/keys');\n\n/**\n * The base implementation of `_.assign` without support for argument juggling,\n * multiple sources, and `customizer` functions.\n *\n * @private\n * @param {Object} object The destination object.\n * @param {Object} source The source object.\n * @returns {Object} Returns `object`.\n */\nfunction baseAssign(object, source) {\n  return source == null\n    ? object\n    : baseCopy(source, keys(source), object);\n}\n\nmodule.exports = baseAssign;\n\n},{\"../object/keys\":149,\"./baseCopy\":69}],67:[function(require,module,exports){\nvar baseMatches = require('./baseMatches'),\n    baseMatchesProperty = require('./baseMatchesProperty'),\n    bindCallback = require('./bindCallback'),\n    identity = require('../utility/identity'),\n    property = require('../utility/property');\n\n/**\n * The base implementation of `_.callback` which supports specifying the\n * number of arguments to provide to `func`.\n *\n * @private\n * @param {*} [func=_.identity] The value to convert to a callback.\n * @param {*} [thisArg] The `this` binding of `func`.\n * @param {number} [argCount] The number of arguments to provide to `func`.\n * @returns {Function} Returns the callback.\n */\nfunction baseCallback(func, thisArg, argCount) {\n  var type = typeof func;\n  if (type == 'function') {\n    return thisArg === undefined\n      ? func\n      : bindCallback(func, thisArg, argCount);\n  }\n  if (func == null) {\n    return identity;\n  }\n  if (type == 'object') {\n    return baseMatches(func);\n  }\n  return thisArg === undefined\n    ? property(func)\n    : baseMatchesProperty(func, thisArg);\n}\n\nmodule.exports = baseCallback;\n\n},{\"../utility/identity\":154,\"../utility/property\":156,\"./baseMatches\":84,\"./baseMatchesProperty\":85,\"./bindCallback\":94}],68:[function(require,module,exports){\nvar arrayCopy = require('./arrayCopy'),\n    arrayEach = require('./arrayEach'),\n    baseAssign = require('./baseAssign'),\n    baseForOwn = require('./baseForOwn'),\n    initCloneArray = require('./initCloneArray'),\n    initCloneByTag = require('./initCloneByTag'),\n    initCloneObject = require('./initCloneObject'),\n    isArray = require('../lang/isArray'),\n    isHostObject = require('./isHostObject'),\n    isObject = require('../lang/isObject');\n\n/** `Object#toString` result references. */\nvar argsTag = '[object Arguments]',\n    arrayTag = '[object Array]',\n    boolTag = '[object Boolean]',\n    dateTag = '[object Date]',\n    errorTag = '[object Error]',\n    funcTag = '[object Function]',\n    mapTag = '[object Map]',\n    numberTag = '[object Number]',\n    objectTag = '[object Object]',\n    regexpTag = '[object RegExp]',\n    setTag = '[object Set]',\n    stringTag = '[object String]',\n    weakMapTag = '[object WeakMap]';\n\nvar arrayBufferTag = '[object ArrayBuffer]',\n    float32Tag = '[object Float32Array]',\n    float64Tag = '[object Float64Array]',\n    int8Tag = '[object Int8Array]',\n    int16Tag = '[object Int16Array]',\n    int32Tag = '[object Int32Array]',\n    uint8Tag = '[object Uint8Array]',\n    uint8ClampedTag = '[object Uint8ClampedArray]',\n    uint16Tag = '[object Uint16Array]',\n    uint32Tag = '[object Uint32Array]';\n\n/** Used to identify `toStringTag` values supported by `_.clone`. */\nvar cloneableTags = {};\ncloneableTags[argsTag] = cloneableTags[arrayTag] =\ncloneableTags[arrayBufferTag] = cloneableTags[boolTag] =\ncloneableTags[dateTag] = cloneableTags[float32Tag] =\ncloneableTags[float64Tag] = cloneableTags[int8Tag] =\ncloneableTags[int16Tag] = cloneableTags[int32Tag] =\ncloneableTags[numberTag] = cloneableTags[objectTag] =\ncloneableTags[regexpTag] = cloneableTags[stringTag] =\ncloneableTags[uint8Tag] = cloneableTags[uint8ClampedTag] =\ncloneableTags[uint16Tag] = cloneableTags[uint32Tag] = true;\ncloneableTags[errorTag] = cloneableTags[funcTag] =\ncloneableTags[mapTag] = cloneableTags[setTag] =\ncloneableTags[weakMapTag] = false;\n\n/** Used for native method references. */\nvar objectProto = Object.prototype;\n\n/**\n * Used to resolve the [`toStringTag`](http://ecma-international.org/ecma-262/6.0/#sec-object.prototype.tostring)\n * of values.\n */\nvar objToString = objectProto.toString;\n\n/**\n * The base implementation of `_.clone` without support for argument juggling\n * and `this` binding `customizer` functions.\n *\n * @private\n * @param {*} value The value to clone.\n * @param {boolean} [isDeep] Specify a deep clone.\n * @param {Function} [customizer] The function to customize cloning values.\n * @param {string} [key] The key of `value`.\n * @param {Object} [object] The object `value` belongs to.\n * @param {Array} [stackA=[]] Tracks traversed source objects.\n * @param {Array} [stackB=[]] Associates clones with source counterparts.\n * @returns {*} Returns the cloned value.\n */\nfunction baseClone(value, isDeep, customizer, key, object, stackA, stackB) {\n  var result;\n  if (customizer) {\n    result = object ? customizer(value, key, object) : customizer(value);\n  }\n  if (result !== undefined) {\n    return result;\n  }\n  if (!isObject(value)) {\n    return value;\n  }\n  var isArr = isArray(value);\n  if (isArr) {\n    result = initCloneArray(value);\n    if (!isDeep) {\n      return arrayCopy(value, result);\n    }\n  } else {\n    var tag = objToString.call(value),\n        isFunc = tag == funcTag;\n\n    if (tag == objectTag || tag == argsTag || (isFunc && !object)) {\n      if (isHostObject(value)) {\n        return object ? value : {};\n      }\n      result = initCloneObject(isFunc ? {} : value);\n      if (!isDeep) {\n        return baseAssign(result, value);\n      }\n    } else {\n      return cloneableTags[tag]\n        ? initCloneByTag(value, tag, isDeep)\n        : (object ? value : {});\n    }\n  }\n  // Check for circular references and return its corresponding clone.\n  stackA || (stackA = []);\n  stackB || (stackB = []);\n\n  var length = stackA.length;\n  while (length--) {\n    if (stackA[length] == value) {\n      return stackB[length];\n    }\n  }\n  // Add the source value to the stack of traversed objects and associate it with its clone.\n  stackA.push(value);\n  stackB.push(result);\n\n  // Recursively populate clone (susceptible to call stack limits).\n  (isArr ? arrayEach : baseForOwn)(value, function(subValue, key) {\n    result[key] = baseClone(subValue, isDeep, customizer, key, value, stackA, stackB);\n  });\n  return result;\n}\n\nmodule.exports = baseClone;\n\n},{\"../lang/isArray\":140,\"../lang/isObject\":144,\"./arrayCopy\":62,\"./arrayEach\":63,\"./baseAssign\":66,\"./baseForOwn\":76,\"./initCloneArray\":116,\"./initCloneByTag\":117,\"./initCloneObject\":118,\"./isHostObject\":120}],69:[function(require,module,exports){\n/**\n * Copies properties of `source` to `object`.\n *\n * @private\n * @param {Object} source The object to copy properties from.\n * @param {Array} props The property names to copy.\n * @param {Object} [object={}] The object to copy properties to.\n * @returns {Object} Returns `object`.\n */\nfunction baseCopy(source, props, object) {\n  object || (object = {});\n\n  var index = -1,\n      length = props.length;\n\n  while (++index < length) {\n    var key = props[index];\n    object[key] = source[key];\n  }\n  return object;\n}\n\nmodule.exports = baseCopy;\n\n},{}],70:[function(require,module,exports){\nvar isObject = require('../lang/isObject');\n\n/**\n * The base implementation of `_.create` without support for assigning\n * properties to the created object.\n *\n * @private\n * @param {Object} prototype The object to inherit from.\n * @returns {Object} Returns the new object.\n */\nvar baseCreate = (function() {\n  function object() {}\n  return function(prototype) {\n    if (isObject(prototype)) {\n      object.prototype = prototype;\n      var result = new object;\n      object.prototype = undefined;\n    }\n    return result || {};\n  };\n}());\n\nmodule.exports = baseCreate;\n\n},{\"../lang/isObject\":144}],71:[function(require,module,exports){\nvar baseForOwn = require('./baseForOwn'),\n    createBaseEach = require('./createBaseEach');\n\n/**\n * The base implementation of `_.forEach` without support for callback\n * shorthands and `this` binding.\n *\n * @private\n * @param {Array|Object|string} collection The collection to iterate over.\n * @param {Function} iteratee The function invoked per iteration.\n * @returns {Array|Object|string} Returns `collection`.\n */\nvar baseEach = createBaseEach(baseForOwn);\n\nmodule.exports = baseEach;\n\n},{\"./baseForOwn\":76,\"./createBaseEach\":98}],72:[function(require,module,exports){\n/**\n * The base implementation of `_.find`, `_.findLast`, `_.findKey`, and `_.findLastKey`,\n * without support for callback shorthands and `this` binding, which iterates\n * over `collection` using the provided `eachFunc`.\n *\n * @private\n * @param {Array|Object|string} collection The collection to search.\n * @param {Function} predicate The function invoked per iteration.\n * @param {Function} eachFunc The function to iterate over `collection`.\n * @param {boolean} [retKey] Specify returning the key of the found element\n *  instead of the element itself.\n * @returns {*} Returns the found element or its key, else `undefined`.\n */\nfunction baseFind(collection, predicate, eachFunc, retKey) {\n  var result;\n  eachFunc(collection, function(value, key, collection) {\n    if (predicate(value, key, collection)) {\n      result = retKey ? key : value;\n      return false;\n    }\n  });\n  return result;\n}\n\nmodule.exports = baseFind;\n\n},{}],73:[function(require,module,exports){\n/**\n * The base implementation of `_.findIndex` and `_.findLastIndex` without\n * support for callback shorthands and `this` binding.\n *\n * @private\n * @param {Array} array The array to search.\n * @param {Function} predicate The function invoked per iteration.\n * @param {boolean} [fromRight] Specify iterating from right to left.\n * @returns {number} Returns the index of the matched value, else `-1`.\n */\nfunction baseFindIndex(array, predicate, fromRight) {\n  var length = array.length,\n      index = fromRight ? length : -1;\n\n  while ((fromRight ? index-- : ++index < length)) {\n    if (predicate(array[index], index, array)) {\n      return index;\n    }\n  }\n  return -1;\n}\n\nmodule.exports = baseFindIndex;\n\n},{}],74:[function(require,module,exports){\nvar createBaseFor = require('./createBaseFor');\n\n/**\n * The base implementation of `baseForIn` and `baseForOwn` which iterates\n * over `object` properties returned by `keysFunc` invoking `iteratee` for\n * each property. Iteratee functions may exit iteration early by explicitly\n * returning `false`.\n *\n * @private\n * @param {Object} object The object to iterate over.\n * @param {Function} iteratee The function invoked per iteration.\n * @param {Function} keysFunc The function to get the keys of `object`.\n * @returns {Object} Returns `object`.\n */\nvar baseFor = createBaseFor();\n\nmodule.exports = baseFor;\n\n},{\"./createBaseFor\":99}],75:[function(require,module,exports){\nvar baseFor = require('./baseFor'),\n    keysIn = require('../object/keysIn');\n\n/**\n * The base implementation of `_.forIn` without support for callback\n * shorthands and `this` binding.\n *\n * @private\n * @param {Object} object The object to iterate over.\n * @param {Function} iteratee The function invoked per iteration.\n * @returns {Object} Returns `object`.\n */\nfunction baseForIn(object, iteratee) {\n  return baseFor(object, iteratee, keysIn);\n}\n\nmodule.exports = baseForIn;\n\n},{\"../object/keysIn\":150,\"./baseFor\":74}],76:[function(require,module,exports){\nvar baseFor = require('./baseFor'),\n    keys = require('../object/keys');\n\n/**\n * The base implementation of `_.forOwn` without support for callback\n * shorthands and `this` binding.\n *\n * @private\n * @param {Object} object The object to iterate over.\n * @param {Function} iteratee The function invoked per iteration.\n * @returns {Object} Returns `object`.\n */\nfunction baseForOwn(object, iteratee) {\n  return baseFor(object, iteratee, keys);\n}\n\nmodule.exports = baseForOwn;\n\n},{\"../object/keys\":149,\"./baseFor\":74}],77:[function(require,module,exports){\nvar toObject = require('./toObject');\n\n/**\n * The base implementation of `get` without support for string paths\n * and default values.\n *\n * @private\n * @param {Object} object The object to query.\n * @param {Array} path The path of the property to get.\n * @param {string} [pathKey] The key representation of path.\n * @returns {*} Returns the resolved value.\n */\nfunction baseGet(object, path, pathKey) {\n  if (object == null) {\n    return;\n  }\n  object = toObject(object);\n  if (pathKey !== undefined && pathKey in object) {\n    path = [pathKey];\n  }\n  var index = 0,\n      length = path.length;\n\n  while (object != null && index < length) {\n    object = toObject(object)[path[index++]];\n  }\n  return (index && index == length) ? object : undefined;\n}\n\nmodule.exports = baseGet;\n\n},{\"./toObject\":135}],78:[function(require,module,exports){\nvar indexOfNaN = require('./indexOfNaN');\n\n/**\n * The base implementation of `_.indexOf` without support for binary searches.\n *\n * @private\n * @param {Array} array The array to search.\n * @param {*} value The value to search for.\n * @param {number} fromIndex The index to search from.\n * @returns {number} Returns the index of the matched value, else `-1`.\n */\nfunction baseIndexOf(array, value, fromIndex) {\n  if (value !== value) {\n    return indexOfNaN(array, fromIndex);\n  }\n  var index = fromIndex - 1,\n      length = array.length;\n\n  while (++index < length) {\n    if (array[index] === value) {\n      return index;\n    }\n  }\n  return -1;\n}\n\nmodule.exports = baseIndexOf;\n\n},{\"./indexOfNaN\":115}],79:[function(require,module,exports){\nvar baseIsEqualDeep = require('./baseIsEqualDeep'),\n    isObject = require('../lang/isObject'),\n    isObjectLike = require('./isObjectLike');\n\n/**\n * The base implementation of `_.isEqual` without support for `this` binding\n * `customizer` functions.\n *\n * @private\n * @param {*} value The value to compare.\n * @param {*} other The other value to compare.\n * @param {Function} [customizer] The function to customize comparing values.\n * @param {boolean} [isLoose] Specify performing partial comparisons.\n * @param {Array} [stackA] Tracks traversed `value` objects.\n * @param {Array} [stackB] Tracks traversed `other` objects.\n * @returns {boolean} Returns `true` if the values are equivalent, else `false`.\n */\nfunction baseIsEqual(value, other, customizer, isLoose, stackA, stackB) {\n  if (value === other) {\n    return true;\n  }\n  if (value == null || other == null || (!isObject(value) && !isObjectLike(other))) {\n    return value !== value && other !== other;\n  }\n  return baseIsEqualDeep(value, other, baseIsEqual, customizer, isLoose, stackA, stackB);\n}\n\nmodule.exports = baseIsEqual;\n\n},{\"../lang/isObject\":144,\"./baseIsEqualDeep\":80,\"./isObjectLike\":126}],80:[function(require,module,exports){\nvar equalArrays = require('./equalArrays'),\n    equalByTag = require('./equalByTag'),\n    equalObjects = require('./equalObjects'),\n    isArray = require('../lang/isArray'),\n    isHostObject = require('./isHostObject'),\n    isTypedArray = require('../lang/isTypedArray');\n\n/** `Object#toString` result references. */\nvar argsTag = '[object Arguments]',\n    arrayTag = '[object Array]',\n    objectTag = '[object Object]';\n\n/** Used for native method references. */\nvar objectProto = Object.prototype;\n\n/** Used to check objects for own properties. */\nvar hasOwnProperty = objectProto.hasOwnProperty;\n\n/**\n * Used to resolve the [`toStringTag`](http://ecma-international.org/ecma-262/6.0/#sec-object.prototype.tostring)\n * of values.\n */\nvar objToString = objectProto.toString;\n\n/**\n * A specialized version of `baseIsEqual` for arrays and objects which performs\n * deep comparisons and tracks traversed objects enabling objects with circular\n * references to be compared.\n *\n * @private\n * @param {Object} object The object to compare.\n * @param {Object} other The other object to compare.\n * @param {Function} equalFunc The function to determine equivalents of values.\n * @param {Function} [customizer] The function to customize comparing objects.\n * @param {boolean} [isLoose] Specify performing partial comparisons.\n * @param {Array} [stackA=[]] Tracks traversed `value` objects.\n * @param {Array} [stackB=[]] Tracks traversed `other` objects.\n * @returns {boolean} Returns `true` if the objects are equivalent, else `false`.\n */\nfunction baseIsEqualDeep(object, other, equalFunc, customizer, isLoose, stackA, stackB) {\n  var objIsArr = isArray(object),\n      othIsArr = isArray(other),\n      objTag = arrayTag,\n      othTag = arrayTag;\n\n  if (!objIsArr) {\n    objTag = objToString.call(object);\n    if (objTag == argsTag) {\n      objTag = objectTag;\n    } else if (objTag != objectTag) {\n      objIsArr = isTypedArray(object);\n    }\n  }\n  if (!othIsArr) {\n    othTag = objToString.call(other);\n    if (othTag == argsTag) {\n      othTag = objectTag;\n    } else if (othTag != objectTag) {\n      othIsArr = isTypedArray(other);\n    }\n  }\n  var objIsObj = objTag == objectTag && !isHostObject(object),\n      othIsObj = othTag == objectTag && !isHostObject(other),\n      isSameTag = objTag == othTag;\n\n  if (isSameTag && !(objIsArr || objIsObj)) {\n    return equalByTag(object, other, objTag);\n  }\n  if (!isLoose) {\n    var objIsWrapped = objIsObj && hasOwnProperty.call(object, '__wrapped__'),\n        othIsWrapped = othIsObj && hasOwnProperty.call(other, '__wrapped__');\n\n    if (objIsWrapped || othIsWrapped) {\n      return equalFunc(objIsWrapped ? object.value() : object, othIsWrapped ? other.value() : other, customizer, isLoose, stackA, stackB);\n    }\n  }\n  if (!isSameTag) {\n    return false;\n  }\n  // Assume cyclic values are equal.\n  // For more information on detecting circular references see https://es5.github.io/#JO.\n  stackA || (stackA = []);\n  stackB || (stackB = []);\n\n  var length = stackA.length;\n  while (length--) {\n    if (stackA[length] == object) {\n      return stackB[length] == other;\n    }\n  }\n  // Add `object` and `other` to the stack of traversed objects.\n  stackA.push(object);\n  stackB.push(other);\n\n  var result = (objIsArr ? equalArrays : equalObjects)(object, other, equalFunc, customizer, isLoose, stackA, stackB);\n\n  stackA.pop();\n  stackB.pop();\n\n  return result;\n}\n\nmodule.exports = baseIsEqualDeep;\n\n},{\"../lang/isArray\":140,\"../lang/isTypedArray\":147,\"./equalArrays\":107,\"./equalByTag\":108,\"./equalObjects\":109,\"./isHostObject\":120}],81:[function(require,module,exports){\nvar baseIsEqual = require('./baseIsEqual'),\n    toObject = require('./toObject');\n\n/**\n * The base implementation of `_.isMatch` without support for callback\n * shorthands and `this` binding.\n *\n * @private\n * @param {Object} object The object to inspect.\n * @param {Array} matchData The propery names, values, and compare flags to match.\n * @param {Function} [customizer] The function to customize comparing objects.\n * @returns {boolean} Returns `true` if `object` is a match, else `false`.\n */\nfunction baseIsMatch(object, matchData, customizer) {\n  var index = matchData.length,\n      length = index,\n      noCustomizer = !customizer;\n\n  if (object == null) {\n    return !length;\n  }\n  object = toObject(object);\n  while (index--) {\n    var data = matchData[index];\n    if ((noCustomizer && data[2])\n          ? data[1] !== object[data[0]]\n          : !(data[0] in object)\n        ) {\n      return false;\n    }\n  }\n  while (++index < length) {\n    data = matchData[index];\n    var key = data[0],\n        objValue = object[key],\n        srcValue = data[1];\n\n    if (noCustomizer && data[2]) {\n      if (objValue === undefined && !(key in object)) {\n        return false;\n      }\n    } else {\n      var result = customizer ? customizer(objValue, srcValue, key) : undefined;\n      if (!(result === undefined ? baseIsEqual(srcValue, objValue, customizer, true) : result)) {\n        return false;\n      }\n    }\n  }\n  return true;\n}\n\nmodule.exports = baseIsMatch;\n\n},{\"./baseIsEqual\":79,\"./toObject\":135}],82:[function(require,module,exports){\n/**\n * The function whose prototype all chaining wrappers inherit from.\n *\n * @private\n */\nfunction baseLodash() {\n  // No operation performed.\n}\n\nmodule.exports = baseLodash;\n\n},{}],83:[function(require,module,exports){\nvar baseEach = require('./baseEach'),\n    isArrayLike = require('./isArrayLike');\n\n/**\n * The base implementation of `_.map` without support for callback shorthands\n * and `this` binding.\n *\n * @private\n * @param {Array|Object|string} collection The collection to iterate over.\n * @param {Function} iteratee The function invoked per iteration.\n * @returns {Array} Returns the new mapped array.\n */\nfunction baseMap(collection, iteratee) {\n  var index = -1,\n      result = isArrayLike(collection) ? Array(collection.length) : [];\n\n  baseEach(collection, function(value, key, collection) {\n    result[++index] = iteratee(value, key, collection);\n  });\n  return result;\n}\n\nmodule.exports = baseMap;\n\n},{\"./baseEach\":71,\"./isArrayLike\":119}],84:[function(require,module,exports){\nvar baseIsMatch = require('./baseIsMatch'),\n    getMatchData = require('./getMatchData'),\n    toObject = require('./toObject');\n\n/**\n * The base implementation of `_.matches` which does not clone `source`.\n *\n * @private\n * @param {Object} source The object of property values to match.\n * @returns {Function} Returns the new function.\n */\nfunction baseMatches(source) {\n  var matchData = getMatchData(source);\n  if (matchData.length == 1 && matchData[0][2]) {\n    var key = matchData[0][0],\n        value = matchData[0][1];\n\n    return function(object) {\n      if (object == null) {\n        return false;\n      }\n      object = toObject(object);\n      return object[key] === value && (value !== undefined || (key in object));\n    };\n  }\n  return function(object) {\n    return baseIsMatch(object, matchData);\n  };\n}\n\nmodule.exports = baseMatches;\n\n},{\"./baseIsMatch\":81,\"./getMatchData\":113,\"./toObject\":135}],85:[function(require,module,exports){\nvar baseGet = require('./baseGet'),\n    baseIsEqual = require('./baseIsEqual'),\n    baseSlice = require('./baseSlice'),\n    isArray = require('../lang/isArray'),\n    isKey = require('./isKey'),\n    isStrictComparable = require('./isStrictComparable'),\n    last = require('../array/last'),\n    toObject = require('./toObject'),\n    toPath = require('./toPath');\n\n/**\n * The base implementation of `_.matchesProperty` which does not clone `srcValue`.\n *\n * @private\n * @param {string} path The path of the property to get.\n * @param {*} srcValue The value to compare.\n * @returns {Function} Returns the new function.\n */\nfunction baseMatchesProperty(path, srcValue) {\n  var isArr = isArray(path),\n      isCommon = isKey(path) && isStrictComparable(srcValue),\n      pathKey = (path + '');\n\n  path = toPath(path);\n  return function(object) {\n    if (object == null) {\n      return false;\n    }\n    var key = pathKey;\n    object = toObject(object);\n    if ((isArr || !isCommon) && !(key in object)) {\n      object = path.length == 1 ? object : baseGet(object, baseSlice(path, 0, -1));\n      if (object == null) {\n        return false;\n      }\n      key = last(path);\n      object = toObject(object);\n    }\n    return object[key] === srcValue\n      ? (srcValue !== undefined || (key in object))\n      : baseIsEqual(srcValue, object[key], undefined, true);\n  };\n}\n\nmodule.exports = baseMatchesProperty;\n\n},{\"../array/last\":50,\"../lang/isArray\":140,\"./baseGet\":77,\"./baseIsEqual\":79,\"./baseSlice\":89,\"./isKey\":123,\"./isStrictComparable\":127,\"./toObject\":135,\"./toPath\":136}],86:[function(require,module,exports){\nvar toObject = require('./toObject');\n\n/**\n * The base implementation of `_.property` without support for deep paths.\n *\n * @private\n * @param {string} key The key of the property to get.\n * @returns {Function} Returns the new function.\n */\nfunction baseProperty(key) {\n  return function(object) {\n    return object == null ? undefined : toObject(object)[key];\n  };\n}\n\nmodule.exports = baseProperty;\n\n},{\"./toObject\":135}],87:[function(require,module,exports){\nvar baseGet = require('./baseGet'),\n    toPath = require('./toPath');\n\n/**\n * A specialized version of `baseProperty` which supports deep paths.\n *\n * @private\n * @param {Array|string} path The path of the property to get.\n * @returns {Function} Returns the new function.\n */\nfunction basePropertyDeep(path) {\n  var pathKey = (path + '');\n  path = toPath(path);\n  return function(object) {\n    return baseGet(object, path, pathKey);\n  };\n}\n\nmodule.exports = basePropertyDeep;\n\n},{\"./baseGet\":77,\"./toPath\":136}],88:[function(require,module,exports){\nvar identity = require('../utility/identity'),\n    metaMap = require('./metaMap');\n\n/**\n * The base implementation of `setData` without support for hot loop detection.\n *\n * @private\n * @param {Function} func The function to associate metadata with.\n * @param {*} data The metadata.\n * @returns {Function} Returns `func`.\n */\nvar baseSetData = !metaMap ? identity : function(func, data) {\n  metaMap.set(func, data);\n  return func;\n};\n\nmodule.exports = baseSetData;\n\n},{\"../utility/identity\":154,\"./metaMap\":129}],89:[function(require,module,exports){\n/**\n * The base implementation of `_.slice` without an iteratee call guard.\n *\n * @private\n * @param {Array} array The array to slice.\n * @param {number} [start=0] The start position.\n * @param {number} [end=array.length] The end position.\n * @returns {Array} Returns the slice of `array`.\n */\nfunction baseSlice(array, start, end) {\n  var index = -1,\n      length = array.length;\n\n  start = start == null ? 0 : (+start || 0);\n  if (start < 0) {\n    start = -start > length ? 0 : (length + start);\n  }\n  end = (end === undefined || end > length) ? length : (+end || 0);\n  if (end < 0) {\n    end += length;\n  }\n  length = start > end ? 0 : ((end - start) >>> 0);\n  start >>>= 0;\n\n  var result = Array(length);\n  while (++index < length) {\n    result[index] = array[index + start];\n  }\n  return result;\n}\n\nmodule.exports = baseSlice;\n\n},{}],90:[function(require,module,exports){\n/**\n * Converts `value` to a string if it's not one. An empty string is returned\n * for `null` or `undefined` values.\n *\n * @private\n * @param {*} value The value to process.\n * @returns {string} Returns the string.\n */\nfunction baseToString(value) {\n  return value == null ? '' : (value + '');\n}\n\nmodule.exports = baseToString;\n\n},{}],91:[function(require,module,exports){\n/**\n * The base implementation of `_.values` and `_.valuesIn` which creates an\n * array of `object` property values corresponding to the property names\n * of `props`.\n *\n * @private\n * @param {Object} object The object to query.\n * @param {Array} props The property names to get values for.\n * @returns {Object} Returns the array of property values.\n */\nfunction baseValues(object, props) {\n  var index = -1,\n      length = props.length,\n      result = Array(length);\n\n  while (++index < length) {\n    result[index] = object[props[index]];\n  }\n  return result;\n}\n\nmodule.exports = baseValues;\n\n},{}],92:[function(require,module,exports){\nvar binaryIndexBy = require('./binaryIndexBy'),\n    identity = require('../utility/identity');\n\n/** Used as references for the maximum length and index of an array. */\nvar MAX_ARRAY_LENGTH = 4294967295,\n    HALF_MAX_ARRAY_LENGTH = MAX_ARRAY_LENGTH >>> 1;\n\n/**\n * Performs a binary search of `array` to determine the index at which `value`\n * should be inserted into `array` in order to maintain its sort order.\n *\n * @private\n * @param {Array} array The sorted array to inspect.\n * @param {*} value The value to evaluate.\n * @param {boolean} [retHighest] Specify returning the highest qualified index.\n * @returns {number} Returns the index at which `value` should be inserted\n *  into `array`.\n */\nfunction binaryIndex(array, value, retHighest) {\n  var low = 0,\n      high = array ? array.length : low;\n\n  if (typeof value == 'number' && value === value && high <= HALF_MAX_ARRAY_LENGTH) {\n    while (low < high) {\n      var mid = (low + high) >>> 1,\n          computed = array[mid];\n\n      if ((retHighest ? (computed <= value) : (computed < value)) && computed !== null) {\n        low = mid + 1;\n      } else {\n        high = mid;\n      }\n    }\n    return high;\n  }\n  return binaryIndexBy(array, value, identity, retHighest);\n}\n\nmodule.exports = binaryIndex;\n\n},{\"../utility/identity\":154,\"./binaryIndexBy\":93}],93:[function(require,module,exports){\n/* Native method references for those with the same name as other `lodash` methods. */\nvar nativeFloor = Math.floor,\n    nativeMin = Math.min;\n\n/** Used as references for the maximum length and index of an array. */\nvar MAX_ARRAY_LENGTH = 4294967295,\n    MAX_ARRAY_INDEX = MAX_ARRAY_LENGTH - 1;\n\n/**\n * This function is like `binaryIndex` except that it invokes `iteratee` for\n * `value` and each element of `array` to compute their sort ranking. The\n * iteratee is invoked with one argument; (value).\n *\n * @private\n * @param {Array} array The sorted array to inspect.\n * @param {*} value The value to evaluate.\n * @param {Function} iteratee The function invoked per iteration.\n * @param {boolean} [retHighest] Specify returning the highest qualified index.\n * @returns {number} Returns the index at which `value` should be inserted\n *  into `array`.\n */\nfunction binaryIndexBy(array, value, iteratee, retHighest) {\n  value = iteratee(value);\n\n  var low = 0,\n      high = array ? array.length : 0,\n      valIsNaN = value !== value,\n      valIsNull = value === null,\n      valIsUndef = value === undefined;\n\n  while (low < high) {\n    var mid = nativeFloor((low + high) / 2),\n        computed = iteratee(array[mid]),\n        isDef = computed !== undefined,\n        isReflexive = computed === computed;\n\n    if (valIsNaN) {\n      var setLow = isReflexive || retHighest;\n    } else if (valIsNull) {\n      setLow = isReflexive && isDef && (retHighest || computed != null);\n    } else if (valIsUndef) {\n      setLow = isReflexive && (retHighest || isDef);\n    } else if (computed == null) {\n      setLow = false;\n    } else {\n      setLow = retHighest ? (computed <= value) : (computed < value);\n    }\n    if (setLow) {\n      low = mid + 1;\n    } else {\n      high = mid;\n    }\n  }\n  return nativeMin(high, MAX_ARRAY_INDEX);\n}\n\nmodule.exports = binaryIndexBy;\n\n},{}],94:[function(require,module,exports){\nvar identity = require('../utility/identity');\n\n/**\n * A specialized version of `baseCallback` which only supports `this` binding\n * and specifying the number of arguments to provide to `func`.\n *\n * @private\n * @param {Function} func The function to bind.\n * @param {*} thisArg The `this` binding of `func`.\n * @param {number} [argCount] The number of arguments to provide to `func`.\n * @returns {Function} Returns the callback.\n */\nfunction bindCallback(func, thisArg, argCount) {\n  if (typeof func != 'function') {\n    return identity;\n  }\n  if (thisArg === undefined) {\n    return func;\n  }\n  switch (argCount) {\n    case 1: return function(value) {\n      return func.call(thisArg, value);\n    };\n    case 3: return function(value, index, collection) {\n      return func.call(thisArg, value, index, collection);\n    };\n    case 4: return function(accumulator, value, index, collection) {\n      return func.call(thisArg, accumulator, value, index, collection);\n    };\n    case 5: return function(value, other, key, object, source) {\n      return func.call(thisArg, value, other, key, object, source);\n    };\n  }\n  return function() {\n    return func.apply(thisArg, arguments);\n  };\n}\n\nmodule.exports = bindCallback;\n\n},{\"../utility/identity\":154}],95:[function(require,module,exports){\n(function (global){\n/** Native method references. */\nvar ArrayBuffer = global.ArrayBuffer,\n    Uint8Array = global.Uint8Array;\n\n/**\n * Creates a clone of the given array buffer.\n *\n * @private\n * @param {ArrayBuffer} buffer The array buffer to clone.\n * @returns {ArrayBuffer} Returns the cloned array buffer.\n */\nfunction bufferClone(buffer) {\n  var result = new ArrayBuffer(buffer.byteLength),\n      view = new Uint8Array(result);\n\n  view.set(new Uint8Array(buffer));\n  return result;\n}\n\nmodule.exports = bufferClone;\n\n}).call(this,typeof global !== \"undefined\" ? global : typeof self !== \"undefined\" ? self : typeof window !== \"undefined\" ? window : {})\n\n},{}],96:[function(require,module,exports){\n/* Native method references for those with the same name as other `lodash` methods. */\nvar nativeMax = Math.max;\n\n/**\n * Creates an array that is the composition of partially applied arguments,\n * placeholders, and provided arguments into a single array of arguments.\n *\n * @private\n * @param {Array|Object} args The provided arguments.\n * @param {Array} partials The arguments to prepend to those provided.\n * @param {Array} holders The `partials` placeholder indexes.\n * @returns {Array} Returns the new array of composed arguments.\n */\nfunction composeArgs(args, partials, holders) {\n  var holdersLength = holders.length,\n      argsIndex = -1,\n      argsLength = nativeMax(args.length - holdersLength, 0),\n      leftIndex = -1,\n      leftLength = partials.length,\n      result = Array(leftLength + argsLength);\n\n  while (++leftIndex < leftLength) {\n    result[leftIndex] = partials[leftIndex];\n  }\n  while (++argsIndex < holdersLength) {\n    result[holders[argsIndex]] = args[argsIndex];\n  }\n  while (argsLength--) {\n    result[leftIndex++] = args[argsIndex++];\n  }\n  return result;\n}\n\nmodule.exports = composeArgs;\n\n},{}],97:[function(require,module,exports){\n/* Native method references for those with the same name as other `lodash` methods. */\nvar nativeMax = Math.max;\n\n/**\n * This function is like `composeArgs` except that the arguments composition\n * is tailored for `_.partialRight`.\n *\n * @private\n * @param {Array|Object} args The provided arguments.\n * @param {Array} partials The arguments to append to those provided.\n * @param {Array} holders The `partials` placeholder indexes.\n * @returns {Array} Returns the new array of composed arguments.\n */\nfunction composeArgsRight(args, partials, holders) {\n  var holdersIndex = -1,\n      holdersLength = holders.length,\n      argsIndex = -1,\n      argsLength = nativeMax(args.length - holdersLength, 0),\n      rightIndex = -1,\n      rightLength = partials.length,\n      result = Array(argsLength + rightLength);\n\n  while (++argsIndex < argsLength) {\n    result[argsIndex] = args[argsIndex];\n  }\n  var offset = argsIndex;\n  while (++rightIndex < rightLength) {\n    result[offset + rightIndex] = partials[rightIndex];\n  }\n  while (++holdersIndex < holdersLength) {\n    result[offset + holders[holdersIndex]] = args[argsIndex++];\n  }\n  return result;\n}\n\nmodule.exports = composeArgsRight;\n\n},{}],98:[function(require,module,exports){\nvar getLength = require('./getLength'),\n    isLength = require('./isLength'),\n    toObject = require('./toObject');\n\n/**\n * Creates a `baseEach` or `baseEachRight` function.\n *\n * @private\n * @param {Function} eachFunc The function to iterate over a collection.\n * @param {boolean} [fromRight] Specify iterating from right to left.\n * @returns {Function} Returns the new base function.\n */\nfunction createBaseEach(eachFunc, fromRight) {\n  return function(collection, iteratee) {\n    var length = collection ? getLength(collection) : 0;\n    if (!isLength(length)) {\n      return eachFunc(collection, iteratee);\n    }\n    var index = fromRight ? length : -1,\n        iterable = toObject(collection);\n\n    while ((fromRight ? index-- : ++index < length)) {\n      if (iteratee(iterable[index], index, iterable) === false) {\n        break;\n      }\n    }\n    return collection;\n  };\n}\n\nmodule.exports = createBaseEach;\n\n},{\"./getLength\":112,\"./isLength\":125,\"./toObject\":135}],99:[function(require,module,exports){\nvar toObject = require('./toObject');\n\n/**\n * Creates a base function for `_.forIn` or `_.forInRight`.\n *\n * @private\n * @param {boolean} [fromRight] Specify iterating from right to left.\n * @returns {Function} Returns the new base function.\n */\nfunction createBaseFor(fromRight) {\n  return function(object, iteratee, keysFunc) {\n    var iterable = toObject(object),\n        props = keysFunc(object),\n        length = props.length,\n        index = fromRight ? length : -1;\n\n    while ((fromRight ? index-- : ++index < length)) {\n      var key = props[index];\n      if (iteratee(iterable[key], key, iterable) === false) {\n        break;\n      }\n    }\n    return object;\n  };\n}\n\nmodule.exports = createBaseFor;\n\n},{\"./toObject\":135}],100:[function(require,module,exports){\n(function (global){\nvar createCtorWrapper = require('./createCtorWrapper');\n\n/**\n * Creates a function that wraps `func` and invokes it with the `this`\n * binding of `thisArg`.\n *\n * @private\n * @param {Function} func The function to bind.\n * @param {*} [thisArg] The `this` binding of `func`.\n * @returns {Function} Returns the new bound function.\n */\nfunction createBindWrapper(func, thisArg) {\n  var Ctor = createCtorWrapper(func);\n\n  function wrapper() {\n    var fn = (this && this !== global && this instanceof wrapper) ? Ctor : func;\n    return fn.apply(thisArg, arguments);\n  }\n  return wrapper;\n}\n\nmodule.exports = createBindWrapper;\n\n}).call(this,typeof global !== \"undefined\" ? global : typeof self !== \"undefined\" ? self : typeof window !== \"undefined\" ? window : {})\n\n},{\"./createCtorWrapper\":101}],101:[function(require,module,exports){\nvar baseCreate = require('./baseCreate'),\n    isObject = require('../lang/isObject');\n\n/**\n * Creates a function that produces an instance of `Ctor` regardless of\n * whether it was invoked as part of a `new` expression or by `call` or `apply`.\n *\n * @private\n * @param {Function} Ctor The constructor to wrap.\n * @returns {Function} Returns the new wrapped function.\n */\nfunction createCtorWrapper(Ctor) {\n  return function() {\n    // Use a `switch` statement to work with class constructors.\n    // See http://ecma-international.org/ecma-262/6.0/#sec-ecmascript-function-objects-call-thisargument-argumentslist\n    // for more details.\n    var args = arguments;\n    switch (args.length) {\n      case 0: return new Ctor;\n      case 1: return new Ctor(args[0]);\n      case 2: return new Ctor(args[0], args[1]);\n      case 3: return new Ctor(args[0], args[1], args[2]);\n      case 4: return new Ctor(args[0], args[1], args[2], args[3]);\n      case 5: return new Ctor(args[0], args[1], args[2], args[3], args[4]);\n      case 6: return new Ctor(args[0], args[1], args[2], args[3], args[4], args[5]);\n      case 7: return new Ctor(args[0], args[1], args[2], args[3], args[4], args[5], args[6]);\n    }\n    var thisBinding = baseCreate(Ctor.prototype),\n        result = Ctor.apply(thisBinding, args);\n\n    // Mimic the constructor's `return` behavior.\n    // See https://es5.github.io/#x13.2.2 for more details.\n    return isObject(result) ? result : thisBinding;\n  };\n}\n\nmodule.exports = createCtorWrapper;\n\n},{\"../lang/isObject\":144,\"./baseCreate\":70}],102:[function(require,module,exports){\nvar baseCallback = require('./baseCallback'),\n    baseFind = require('./baseFind'),\n    baseFindIndex = require('./baseFindIndex'),\n    isArray = require('../lang/isArray');\n\n/**\n * Creates a `_.find` or `_.findLast` function.\n *\n * @private\n * @param {Function} eachFunc The function to iterate over a collection.\n * @param {boolean} [fromRight] Specify iterating from right to left.\n * @returns {Function} Returns the new find function.\n */\nfunction createFind(eachFunc, fromRight) {\n  return function(collection, predicate, thisArg) {\n    predicate = baseCallback(predicate, thisArg, 3);\n    if (isArray(collection)) {\n      var index = baseFindIndex(collection, predicate, fromRight);\n      return index > -1 ? collection[index] : undefined;\n    }\n    return baseFind(collection, predicate, eachFunc);\n  };\n}\n\nmodule.exports = createFind;\n\n},{\"../lang/isArray\":140,\"./baseCallback\":67,\"./baseFind\":72,\"./baseFindIndex\":73}],103:[function(require,module,exports){\nvar bindCallback = require('./bindCallback'),\n    isArray = require('../lang/isArray');\n\n/**\n * Creates a function for `_.forEach` or `_.forEachRight`.\n *\n * @private\n * @param {Function} arrayFunc The function to iterate over an array.\n * @param {Function} eachFunc The function to iterate over a collection.\n * @returns {Function} Returns the new each function.\n */\nfunction createForEach(arrayFunc, eachFunc) {\n  return function(collection, iteratee, thisArg) {\n    return (typeof iteratee == 'function' && thisArg === undefined && isArray(collection))\n      ? arrayFunc(collection, iteratee)\n      : eachFunc(collection, bindCallback(iteratee, thisArg, 3));\n  };\n}\n\nmodule.exports = createForEach;\n\n},{\"../lang/isArray\":140,\"./bindCallback\":94}],104:[function(require,module,exports){\n(function (global){\nvar arrayCopy = require('./arrayCopy'),\n    composeArgs = require('./composeArgs'),\n    composeArgsRight = require('./composeArgsRight'),\n    createCtorWrapper = require('./createCtorWrapper'),\n    isLaziable = require('./isLaziable'),\n    reorder = require('./reorder'),\n    replaceHolders = require('./replaceHolders'),\n    setData = require('./setData');\n\n/** Used to compose bitmasks for wrapper metadata. */\nvar BIND_FLAG = 1,\n    BIND_KEY_FLAG = 2,\n    CURRY_BOUND_FLAG = 4,\n    CURRY_FLAG = 8,\n    CURRY_RIGHT_FLAG = 16,\n    PARTIAL_FLAG = 32,\n    PARTIAL_RIGHT_FLAG = 64,\n    ARY_FLAG = 128;\n\n/* Native method references for those with the same name as other `lodash` methods. */\nvar nativeMax = Math.max;\n\n/**\n * Creates a function that wraps `func` and invokes it with optional `this`\n * binding of, partial application, and currying.\n *\n * @private\n * @param {Function|string} func The function or method name to reference.\n * @param {number} bitmask The bitmask of flags. See `createWrapper` for more details.\n * @param {*} [thisArg] The `this` binding of `func`.\n * @param {Array} [partials] The arguments to prepend to those provided to the new function.\n * @param {Array} [holders] The `partials` placeholder indexes.\n * @param {Array} [partialsRight] The arguments to append to those provided to the new function.\n * @param {Array} [holdersRight] The `partialsRight` placeholder indexes.\n * @param {Array} [argPos] The argument positions of the new function.\n * @param {number} [ary] The arity cap of `func`.\n * @param {number} [arity] The arity of `func`.\n * @returns {Function} Returns the new wrapped function.\n */\nfunction createHybridWrapper(func, bitmask, thisArg, partials, holders, partialsRight, holdersRight, argPos, ary, arity) {\n  var isAry = bitmask & ARY_FLAG,\n      isBind = bitmask & BIND_FLAG,\n      isBindKey = bitmask & BIND_KEY_FLAG,\n      isCurry = bitmask & CURRY_FLAG,\n      isCurryBound = bitmask & CURRY_BOUND_FLAG,\n      isCurryRight = bitmask & CURRY_RIGHT_FLAG,\n      Ctor = isBindKey ? undefined : createCtorWrapper(func);\n\n  function wrapper() {\n    // Avoid `arguments` object use disqualifying optimizations by\n    // converting it to an array before providing it to other functions.\n    var length = arguments.length,\n        index = length,\n        args = Array(length);\n\n    while (index--) {\n      args[index] = arguments[index];\n    }\n    if (partials) {\n      args = composeArgs(args, partials, holders);\n    }\n    if (partialsRight) {\n      args = composeArgsRight(args, partialsRight, holdersRight);\n    }\n    if (isCurry || isCurryRight) {\n      var placeholder = wrapper.placeholder,\n          argsHolders = replaceHolders(args, placeholder);\n\n      length -= argsHolders.length;\n      if (length < arity) {\n        var newArgPos = argPos ? arrayCopy(argPos) : undefined,\n            newArity = nativeMax(arity - length, 0),\n            newsHolders = isCurry ? argsHolders : undefined,\n            newHoldersRight = isCurry ? undefined : argsHolders,\n            newPartials = isCurry ? args : undefined,\n            newPartialsRight = isCurry ? undefined : args;\n\n        bitmask |= (isCurry ? PARTIAL_FLAG : PARTIAL_RIGHT_FLAG);\n        bitmask &= ~(isCurry ? PARTIAL_RIGHT_FLAG : PARTIAL_FLAG);\n\n        if (!isCurryBound) {\n          bitmask &= ~(BIND_FLAG | BIND_KEY_FLAG);\n        }\n        var newData = [func, bitmask, thisArg, newPartials, newsHolders, newPartialsRight, newHoldersRight, newArgPos, ary, newArity],\n            result = createHybridWrapper.apply(undefined, newData);\n\n        if (isLaziable(func)) {\n          setData(result, newData);\n        }\n        result.placeholder = placeholder;\n        return result;\n      }\n    }\n    var thisBinding = isBind ? thisArg : this,\n        fn = isBindKey ? thisBinding[func] : func;\n\n    if (argPos) {\n      args = reorder(args, argPos);\n    }\n    if (isAry && ary < args.length) {\n      args.length = ary;\n    }\n    if (this && this !== global && this instanceof wrapper) {\n      fn = Ctor || createCtorWrapper(func);\n    }\n    return fn.apply(thisBinding, args);\n  }\n  return wrapper;\n}\n\nmodule.exports = createHybridWrapper;\n\n}).call(this,typeof global !== \"undefined\" ? global : typeof self !== \"undefined\" ? self : typeof window !== \"undefined\" ? window : {})\n\n},{\"./arrayCopy\":62,\"./composeArgs\":96,\"./composeArgsRight\":97,\"./createCtorWrapper\":101,\"./isLaziable\":124,\"./reorder\":131,\"./replaceHolders\":132,\"./setData\":133}],105:[function(require,module,exports){\n(function (global){\nvar createCtorWrapper = require('./createCtorWrapper');\n\n/** Used to compose bitmasks for wrapper metadata. */\nvar BIND_FLAG = 1;\n\n/**\n * Creates a function that wraps `func` and invokes it with the optional `this`\n * binding of `thisArg` and the `partials` prepended to those provided to\n * the wrapper.\n *\n * @private\n * @param {Function} func The function to partially apply arguments to.\n * @param {number} bitmask The bitmask of flags. See `createWrapper` for more details.\n * @param {*} thisArg The `this` binding of `func`.\n * @param {Array} partials The arguments to prepend to those provided to the new function.\n * @returns {Function} Returns the new bound function.\n */\nfunction createPartialWrapper(func, bitmask, thisArg, partials) {\n  var isBind = bitmask & BIND_FLAG,\n      Ctor = createCtorWrapper(func);\n\n  function wrapper() {\n    // Avoid `arguments` object use disqualifying optimizations by\n    // converting it to an array before providing it `func`.\n    var argsIndex = -1,\n        argsLength = arguments.length,\n        leftIndex = -1,\n        leftLength = partials.length,\n        args = Array(leftLength + argsLength);\n\n    while (++leftIndex < leftLength) {\n      args[leftIndex] = partials[leftIndex];\n    }\n    while (argsLength--) {\n      args[leftIndex++] = arguments[++argsIndex];\n    }\n    var fn = (this && this !== global && this instanceof wrapper) ? Ctor : func;\n    return fn.apply(isBind ? thisArg : this, args);\n  }\n  return wrapper;\n}\n\nmodule.exports = createPartialWrapper;\n\n}).call(this,typeof global !== \"undefined\" ? global : typeof self !== \"undefined\" ? self : typeof window !== \"undefined\" ? window : {})\n\n},{\"./createCtorWrapper\":101}],106:[function(require,module,exports){\nvar baseSetData = require('./baseSetData'),\n    createBindWrapper = require('./createBindWrapper'),\n    createHybridWrapper = require('./createHybridWrapper'),\n    createPartialWrapper = require('./createPartialWrapper'),\n    getData = require('./getData'),\n    mergeData = require('./mergeData'),\n    setData = require('./setData');\n\n/** Used to compose bitmasks for wrapper metadata. */\nvar BIND_FLAG = 1,\n    BIND_KEY_FLAG = 2,\n    PARTIAL_FLAG = 32,\n    PARTIAL_RIGHT_FLAG = 64;\n\n/** Used as the `TypeError` message for \"Functions\" methods. */\nvar FUNC_ERROR_TEXT = 'Expected a function';\n\n/* Native method references for those with the same name as other `lodash` methods. */\nvar nativeMax = Math.max;\n\n/**\n * Creates a function that either curries or invokes `func` with optional\n * `this` binding and partially applied arguments.\n *\n * @private\n * @param {Function|string} func The function or method name to reference.\n * @param {number} bitmask The bitmask of flags.\n *  The bitmask may be composed of the following flags:\n *     1 - `_.bind`\n *     2 - `_.bindKey`\n *     4 - `_.curry` or `_.curryRight` of a bound function\n *     8 - `_.curry`\n *    16 - `_.curryRight`\n *    32 - `_.partial`\n *    64 - `_.partialRight`\n *   128 - `_.rearg`\n *   256 - `_.ary`\n * @param {*} [thisArg] The `this` binding of `func`.\n * @param {Array} [partials] The arguments to be partially applied.\n * @param {Array} [holders] The `partials` placeholder indexes.\n * @param {Array} [argPos] The argument positions of the new function.\n * @param {number} [ary] The arity cap of `func`.\n * @param {number} [arity] The arity of `func`.\n * @returns {Function} Returns the new wrapped function.\n */\nfunction createWrapper(func, bitmask, thisArg, partials, holders, argPos, ary, arity) {\n  var isBindKey = bitmask & BIND_KEY_FLAG;\n  if (!isBindKey && typeof func != 'function') {\n    throw new TypeError(FUNC_ERROR_TEXT);\n  }\n  var length = partials ? partials.length : 0;\n  if (!length) {\n    bitmask &= ~(PARTIAL_FLAG | PARTIAL_RIGHT_FLAG);\n    partials = holders = undefined;\n  }\n  length -= (holders ? holders.length : 0);\n  if (bitmask & PARTIAL_RIGHT_FLAG) {\n    var partialsRight = partials,\n        holdersRight = holders;\n\n    partials = holders = undefined;\n  }\n  var data = isBindKey ? undefined : getData(func),\n      newData = [func, bitmask, thisArg, partials, holders, partialsRight, holdersRight, argPos, ary, arity];\n\n  if (data) {\n    mergeData(newData, data);\n    bitmask = newData[1];\n    arity = newData[9];\n  }\n  newData[9] = arity == null\n    ? (isBindKey ? 0 : func.length)\n    : (nativeMax(arity - length, 0) || 0);\n\n  if (bitmask == BIND_FLAG) {\n    var result = createBindWrapper(newData[0], newData[2]);\n  } else if ((bitmask == PARTIAL_FLAG || bitmask == (BIND_FLAG | PARTIAL_FLAG)) && !newData[4].length) {\n    result = createPartialWrapper.apply(undefined, newData);\n  } else {\n    result = createHybridWrapper.apply(undefined, newData);\n  }\n  var setter = data ? baseSetData : setData;\n  return setter(result, newData);\n}\n\nmodule.exports = createWrapper;\n\n},{\"./baseSetData\":88,\"./createBindWrapper\":100,\"./createHybridWrapper\":104,\"./createPartialWrapper\":105,\"./getData\":110,\"./mergeData\":128,\"./setData\":133}],107:[function(require,module,exports){\nvar arraySome = require('./arraySome');\n\n/**\n * A specialized version of `baseIsEqualDeep` for arrays with support for\n * partial deep comparisons.\n *\n * @private\n * @param {Array} array The array to compare.\n * @param {Array} other The other array to compare.\n * @param {Function} equalFunc The function to determine equivalents of values.\n * @param {Function} [customizer] The function to customize comparing arrays.\n * @param {boolean} [isLoose] Specify performing partial comparisons.\n * @param {Array} [stackA] Tracks traversed `value` objects.\n * @param {Array} [stackB] Tracks traversed `other` objects.\n * @returns {boolean} Returns `true` if the arrays are equivalent, else `false`.\n */\nfunction equalArrays(array, other, equalFunc, customizer, isLoose, stackA, stackB) {\n  var index = -1,\n      arrLength = array.length,\n      othLength = other.length;\n\n  if (arrLength != othLength && !(isLoose && othLength > arrLength)) {\n    return false;\n  }\n  // Ignore non-index properties.\n  while (++index < arrLength) {\n    var arrValue = array[index],\n        othValue = other[index],\n        result = customizer ? customizer(isLoose ? othValue : arrValue, isLoose ? arrValue : othValue, index) : undefined;\n\n    if (result !== undefined) {\n      if (result) {\n        continue;\n      }\n      return false;\n    }\n    // Recursively compare arrays (susceptible to call stack limits).\n    if (isLoose) {\n      if (!arraySome(other, function(othValue) {\n            return arrValue === othValue || equalFunc(arrValue, othValue, customizer, isLoose, stackA, stackB);\n          })) {\n        return false;\n      }\n    } else if (!(arrValue === othValue || equalFunc(arrValue, othValue, customizer, isLoose, stackA, stackB))) {\n      return false;\n    }\n  }\n  return true;\n}\n\nmodule.exports = equalArrays;\n\n},{\"./arraySome\":65}],108:[function(require,module,exports){\n/** `Object#toString` result references. */\nvar boolTag = '[object Boolean]',\n    dateTag = '[object Date]',\n    errorTag = '[object Error]',\n    numberTag = '[object Number]',\n    regexpTag = '[object RegExp]',\n    stringTag = '[object String]';\n\n/**\n * A specialized version of `baseIsEqualDeep` for comparing objects of\n * the same `toStringTag`.\n *\n * **Note:** This function only supports comparing values with tags of\n * `Boolean`, `Date`, `Error`, `Number`, `RegExp`, or `String`.\n *\n * @private\n * @param {Object} object The object to compare.\n * @param {Object} other The other object to compare.\n * @param {string} tag The `toStringTag` of the objects to compare.\n * @returns {boolean} Returns `true` if the objects are equivalent, else `false`.\n */\nfunction equalByTag(object, other, tag) {\n  switch (tag) {\n    case boolTag:\n    case dateTag:\n      // Coerce dates and booleans to numbers, dates to milliseconds and booleans\n      // to `1` or `0` treating invalid dates coerced to `NaN` as not equal.\n      return +object == +other;\n\n    case errorTag:\n      return object.name == other.name && object.message == other.message;\n\n    case numberTag:\n      // Treat `NaN` vs. `NaN` as equal.\n      return (object != +object)\n        ? other != +other\n        : object == +other;\n\n    case regexpTag:\n    case stringTag:\n      // Coerce regexes to strings and treat strings primitives and string\n      // objects as equal. See https://es5.github.io/#x15.10.6.4 for more details.\n      return object == (other + '');\n  }\n  return false;\n}\n\nmodule.exports = equalByTag;\n\n},{}],109:[function(require,module,exports){\nvar keys = require('../object/keys');\n\n/** Used for native method references. */\nvar objectProto = Object.prototype;\n\n/** Used to check objects for own properties. */\nvar hasOwnProperty = objectProto.hasOwnProperty;\n\n/**\n * A specialized version of `baseIsEqualDeep` for objects with support for\n * partial deep comparisons.\n *\n * @private\n * @param {Object} object The object to compare.\n * @param {Object} other The other object to compare.\n * @param {Function} equalFunc The function to determine equivalents of values.\n * @param {Function} [customizer] The function to customize comparing values.\n * @param {boolean} [isLoose] Specify performing partial comparisons.\n * @param {Array} [stackA] Tracks traversed `value` objects.\n * @param {Array} [stackB] Tracks traversed `other` objects.\n * @returns {boolean} Returns `true` if the objects are equivalent, else `false`.\n */\nfunction equalObjects(object, other, equalFunc, customizer, isLoose, stackA, stackB) {\n  var objProps = keys(object),\n      objLength = objProps.length,\n      othProps = keys(other),\n      othLength = othProps.length;\n\n  if (objLength != othLength && !isLoose) {\n    return false;\n  }\n  var index = objLength;\n  while (index--) {\n    var key = objProps[index];\n    if (!(isLoose ? key in other : hasOwnProperty.call(other, key))) {\n      return false;\n    }\n  }\n  var skipCtor = isLoose;\n  while (++index < objLength) {\n    key = objProps[index];\n    var objValue = object[key],\n        othValue = other[key],\n        result = customizer ? customizer(isLoose ? othValue : objValue, isLoose? objValue : othValue, key) : undefined;\n\n    // Recursively compare objects (susceptible to call stack limits).\n    if (!(result === undefined ? equalFunc(objValue, othValue, customizer, isLoose, stackA, stackB) : result)) {\n      return false;\n    }\n    skipCtor || (skipCtor = key == 'constructor');\n  }\n  if (!skipCtor) {\n    var objCtor = object.constructor,\n        othCtor = other.constructor;\n\n    // Non `Object` object instances with different constructors are not equal.\n    if (objCtor != othCtor &&\n        ('constructor' in object && 'constructor' in other) &&\n        !(typeof objCtor == 'function' && objCtor instanceof objCtor &&\n          typeof othCtor == 'function' && othCtor instanceof othCtor)) {\n      return false;\n    }\n  }\n  return true;\n}\n\nmodule.exports = equalObjects;\n\n},{\"../object/keys\":149}],110:[function(require,module,exports){\nvar metaMap = require('./metaMap'),\n    noop = require('../utility/noop');\n\n/**\n * Gets metadata for `func`.\n *\n * @private\n * @param {Function} func The function to query.\n * @returns {*} Returns the metadata for `func`.\n */\nvar getData = !metaMap ? noop : function(func) {\n  return metaMap.get(func);\n};\n\nmodule.exports = getData;\n\n},{\"../utility/noop\":155,\"./metaMap\":129}],111:[function(require,module,exports){\nvar realNames = require('./realNames');\n\n/**\n * Gets the name of `func`.\n *\n * @private\n * @param {Function} func The function to query.\n * @returns {string} Returns the function name.\n */\nfunction getFuncName(func) {\n  var result = (func.name + ''),\n      array = realNames[result],\n      length = array ? array.length : 0;\n\n  while (length--) {\n    var data = array[length],\n        otherFunc = data.func;\n    if (otherFunc == null || otherFunc == func) {\n      return data.name;\n    }\n  }\n  return result;\n}\n\nmodule.exports = getFuncName;\n\n},{\"./realNames\":130}],112:[function(require,module,exports){\nvar baseProperty = require('./baseProperty');\n\n/**\n * Gets the \"length\" property value of `object`.\n *\n * **Note:** This function is used to avoid a [JIT bug](https://bugs.webkit.org/show_bug.cgi?id=142792)\n * that affects Safari on at least iOS 8.1-8.3 ARM64.\n *\n * @private\n * @param {Object} object The object to query.\n * @returns {*} Returns the \"length\" value.\n */\nvar getLength = baseProperty('length');\n\nmodule.exports = getLength;\n\n},{\"./baseProperty\":86}],113:[function(require,module,exports){\nvar isStrictComparable = require('./isStrictComparable'),\n    pairs = require('../object/pairs');\n\n/**\n * Gets the propery names, values, and compare flags of `object`.\n *\n * @private\n * @param {Object} object The object to query.\n * @returns {Array} Returns the match data of `object`.\n */\nfunction getMatchData(object) {\n  var result = pairs(object),\n      length = result.length;\n\n  while (length--) {\n    result[length][2] = isStrictComparable(result[length][1]);\n  }\n  return result;\n}\n\nmodule.exports = getMatchData;\n\n},{\"../object/pairs\":151,\"./isStrictComparable\":127}],114:[function(require,module,exports){\nvar isNative = require('../lang/isNative');\n\n/**\n * Gets the native function at `key` of `object`.\n *\n * @private\n * @param {Object} object The object to query.\n * @param {string} key The key of the method to get.\n * @returns {*} Returns the function if it's native, else `undefined`.\n */\nfunction getNative(object, key) {\n  var value = object == null ? undefined : object[key];\n  return isNative(value) ? value : undefined;\n}\n\nmodule.exports = getNative;\n\n},{\"../lang/isNative\":143}],115:[function(require,module,exports){\n/**\n * Gets the index at which the first occurrence of `NaN` is found in `array`.\n *\n * @private\n * @param {Array} array The array to search.\n * @param {number} fromIndex The index to search from.\n * @param {boolean} [fromRight] Specify iterating from right to left.\n * @returns {number} Returns the index of the matched `NaN`, else `-1`.\n */\nfunction indexOfNaN(array, fromIndex, fromRight) {\n  var length = array.length,\n      index = fromIndex + (fromRight ? 0 : -1);\n\n  while ((fromRight ? index-- : ++index < length)) {\n    var other = array[index];\n    if (other !== other) {\n      return index;\n    }\n  }\n  return -1;\n}\n\nmodule.exports = indexOfNaN;\n\n},{}],116:[function(require,module,exports){\n/** Used for native method references. */\nvar objectProto = Object.prototype;\n\n/** Used to check objects for own properties. */\nvar hasOwnProperty = objectProto.hasOwnProperty;\n\n/**\n * Initializes an array clone.\n *\n * @private\n * @param {Array} array The array to clone.\n * @returns {Array} Returns the initialized clone.\n */\nfunction initCloneArray(array) {\n  var length = array.length,\n      result = new array.constructor(length);\n\n  // Add array properties assigned by `RegExp#exec`.\n  if (length && typeof array[0] == 'string' && hasOwnProperty.call(array, 'index')) {\n    result.index = array.index;\n    result.input = array.input;\n  }\n  return result;\n}\n\nmodule.exports = initCloneArray;\n\n},{}],117:[function(require,module,exports){\n(function (global){\nvar bufferClone = require('./bufferClone');\n\n/** `Object#toString` result references. */\nvar boolTag = '[object Boolean]',\n    dateTag = '[object Date]',\n    numberTag = '[object Number]',\n    regexpTag = '[object RegExp]',\n    stringTag = '[object String]';\n\nvar arrayBufferTag = '[object ArrayBuffer]',\n    float32Tag = '[object Float32Array]',\n    float64Tag = '[object Float64Array]',\n    int8Tag = '[object Int8Array]',\n    int16Tag = '[object Int16Array]',\n    int32Tag = '[object Int32Array]',\n    uint8Tag = '[object Uint8Array]',\n    uint8ClampedTag = '[object Uint8ClampedArray]',\n    uint16Tag = '[object Uint16Array]',\n    uint32Tag = '[object Uint32Array]';\n\n/** Used to match `RegExp` flags from their coerced string values. */\nvar reFlags = /\\w*$/;\n\n/** Native method references. */\nvar Uint8Array = global.Uint8Array;\n\n/** Used to lookup a type array constructors by `toStringTag`. */\nvar ctorByTag = {};\nctorByTag[float32Tag] = global.Float32Array;\nctorByTag[float64Tag] = global.Float64Array;\nctorByTag[int8Tag] = global.Int8Array;\nctorByTag[int16Tag] = global.Int16Array;\nctorByTag[int32Tag] = global.Int32Array;\nctorByTag[uint8Tag] = Uint8Array;\nctorByTag[uint8ClampedTag] = global.Uint8ClampedArray;\nctorByTag[uint16Tag] = global.Uint16Array;\nctorByTag[uint32Tag] = global.Uint32Array;\n\n/**\n * Initializes an object clone based on its `toStringTag`.\n *\n * **Note:** This function only supports cloning values with tags of\n * `Boolean`, `Date`, `Error`, `Number`, `RegExp`, or `String`.\n *\n * @private\n * @param {Object} object The object to clone.\n * @param {string} tag The `toStringTag` of the object to clone.\n * @param {boolean} [isDeep] Specify a deep clone.\n * @returns {Object} Returns the initialized clone.\n */\nfunction initCloneByTag(object, tag, isDeep) {\n  var Ctor = object.constructor;\n  switch (tag) {\n    case arrayBufferTag:\n      return bufferClone(object);\n\n    case boolTag:\n    case dateTag:\n      return new Ctor(+object);\n\n    case float32Tag: case float64Tag:\n    case int8Tag: case int16Tag: case int32Tag:\n    case uint8Tag: case uint8ClampedTag: case uint16Tag: case uint32Tag:\n      // Safari 5 mobile incorrectly has `Object` as the constructor of typed arrays.\n      if (Ctor instanceof Ctor) {\n        Ctor = ctorByTag[tag];\n      }\n      var buffer = object.buffer;\n      return new Ctor(isDeep ? bufferClone(buffer) : buffer, object.byteOffset, object.length);\n\n    case numberTag:\n    case stringTag:\n      return new Ctor(object);\n\n    case regexpTag:\n      var result = new Ctor(object.source, reFlags.exec(object));\n      result.lastIndex = object.lastIndex;\n  }\n  return result;\n}\n\nmodule.exports = initCloneByTag;\n\n}).call(this,typeof global !== \"undefined\" ? global : typeof self !== \"undefined\" ? self : typeof window !== \"undefined\" ? window : {})\n\n},{\"./bufferClone\":95}],118:[function(require,module,exports){\n/**\n * Initializes an object clone.\n *\n * @private\n * @param {Object} object The object to clone.\n * @returns {Object} Returns the initialized clone.\n */\nfunction initCloneObject(object) {\n  var Ctor = object.constructor;\n  if (!(typeof Ctor == 'function' && Ctor instanceof Ctor)) {\n    Ctor = Object;\n  }\n  return new Ctor;\n}\n\nmodule.exports = initCloneObject;\n\n},{}],119:[function(require,module,exports){\nvar getLength = require('./getLength'),\n    isLength = require('./isLength');\n\n/**\n * Checks if `value` is array-like.\n *\n * @private\n * @param {*} value The value to check.\n * @returns {boolean} Returns `true` if `value` is array-like, else `false`.\n */\nfunction isArrayLike(value) {\n  return value != null && isLength(getLength(value));\n}\n\nmodule.exports = isArrayLike;\n\n},{\"./getLength\":112,\"./isLength\":125}],120:[function(require,module,exports){\n/**\n * Checks if `value` is a host object in IE < 9.\n *\n * @private\n * @param {*} value The value to check.\n * @returns {boolean} Returns `true` if `value` is a host object, else `false`.\n */\nvar isHostObject = (function() {\n  try {\n    Object({ 'toString': 0 } + '');\n  } catch(e) {\n    return function() { return false; };\n  }\n  return function(value) {\n    // IE < 9 presents many host objects as `Object` objects that can coerce\n    // to strings despite having improperly defined `toString` methods.\n    return typeof value.toString != 'function' && typeof (value + '') == 'string';\n  };\n}());\n\nmodule.exports = isHostObject;\n\n},{}],121:[function(require,module,exports){\n/** Used to detect unsigned integer values. */\nvar reIsUint = /^\\d+$/;\n\n/**\n * Used as the [maximum length](http://ecma-international.org/ecma-262/6.0/#sec-number.max_safe_integer)\n * of an array-like value.\n */\nvar MAX_SAFE_INTEGER = 9007199254740991;\n\n/**\n * Checks if `value` is a valid array-like index.\n *\n * @private\n * @param {*} value The value to check.\n * @param {number} [length=MAX_SAFE_INTEGER] The upper bounds of a valid index.\n * @returns {boolean} Returns `true` if `value` is a valid index, else `false`.\n */\nfunction isIndex(value, length) {\n  value = (typeof value == 'number' || reIsUint.test(value)) ? +value : -1;\n  length = length == null ? MAX_SAFE_INTEGER : length;\n  return value > -1 && value % 1 == 0 && value < length;\n}\n\nmodule.exports = isIndex;\n\n},{}],122:[function(require,module,exports){\nvar isArrayLike = require('./isArrayLike'),\n    isIndex = require('./isIndex'),\n    isObject = require('../lang/isObject');\n\n/**\n * Checks if the provided arguments are from an iteratee call.\n *\n * @private\n * @param {*} value The potential iteratee value argument.\n * @param {*} index The potential iteratee index or key argument.\n * @param {*} object The potential iteratee object argument.\n * @returns {boolean} Returns `true` if the arguments are from an iteratee call, else `false`.\n */\nfunction isIterateeCall(value, index, object) {\n  if (!isObject(object)) {\n    return false;\n  }\n  var type = typeof index;\n  if (type == 'number'\n      ? (isArrayLike(object) && isIndex(index, object.length))\n      : (type == 'string' && index in object)) {\n    var other = object[index];\n    return value === value ? (value === other) : (other !== other);\n  }\n  return false;\n}\n\nmodule.exports = isIterateeCall;\n\n},{\"../lang/isObject\":144,\"./isArrayLike\":119,\"./isIndex\":121}],123:[function(require,module,exports){\nvar isArray = require('../lang/isArray'),\n    toObject = require('./toObject');\n\n/** Used to match property names within property paths. */\nvar reIsDeepProp = /\\.|\\[(?:[^[\\]]*|([\"'])(?:(?!\\1)[^\\n\\\\]|\\\\.)*?\\1)\\]/,\n    reIsPlainProp = /^\\w*$/;\n\n/**\n * Checks if `value` is a property name and not a property path.\n *\n * @private\n * @param {*} value The value to check.\n * @param {Object} [object] The object to query keys on.\n * @returns {boolean} Returns `true` if `value` is a property name, else `false`.\n */\nfunction isKey(value, object) {\n  var type = typeof value;\n  if ((type == 'string' && reIsPlainProp.test(value)) || type == 'number') {\n    return true;\n  }\n  if (isArray(value)) {\n    return false;\n  }\n  var result = !reIsDeepProp.test(value);\n  return result || (object != null && value in toObject(object));\n}\n\nmodule.exports = isKey;\n\n},{\"../lang/isArray\":140,\"./toObject\":135}],124:[function(require,module,exports){\nvar LazyWrapper = require('./LazyWrapper'),\n    getData = require('./getData'),\n    getFuncName = require('./getFuncName'),\n    lodash = require('../chain/lodash');\n\n/**\n * Checks if `func` has a lazy counterpart.\n *\n * @private\n * @param {Function} func The function to check.\n * @returns {boolean} Returns `true` if `func` has a lazy counterpart, else `false`.\n */\nfunction isLaziable(func) {\n  var funcName = getFuncName(func),\n      other = lodash[funcName];\n\n  if (typeof other != 'function' || !(funcName in LazyWrapper.prototype)) {\n    return false;\n  }\n  if (func === other) {\n    return true;\n  }\n  var data = getData(other);\n  return !!data && func === data[0];\n}\n\nmodule.exports = isLaziable;\n\n},{\"../chain/lodash\":51,\"./LazyWrapper\":60,\"./getData\":110,\"./getFuncName\":111}],125:[function(require,module,exports){\n/**\n * Used as the [maximum length](http://ecma-international.org/ecma-262/6.0/#sec-number.max_safe_integer)\n * of an array-like value.\n */\nvar MAX_SAFE_INTEGER = 9007199254740991;\n\n/**\n * Checks if `value` is a valid array-like length.\n *\n * **Note:** This function is based on [`ToLength`](http://ecma-international.org/ecma-262/6.0/#sec-tolength).\n *\n * @private\n * @param {*} value The value to check.\n * @returns {boolean} Returns `true` if `value` is a valid length, else `false`.\n */\nfunction isLength(value) {\n  return typeof value == 'number' && value > -1 && value % 1 == 0 && value <= MAX_SAFE_INTEGER;\n}\n\nmodule.exports = isLength;\n\n},{}],126:[function(require,module,exports){\n/**\n * Checks if `value` is object-like.\n *\n * @private\n * @param {*} value The value to check.\n * @returns {boolean} Returns `true` if `value` is object-like, else `false`.\n */\nfunction isObjectLike(value) {\n  return !!value && typeof value == 'object';\n}\n\nmodule.exports = isObjectLike;\n\n},{}],127:[function(require,module,exports){\nvar isObject = require('../lang/isObject');\n\n/**\n * Checks if `value` is suitable for strict equality comparisons, i.e. `===`.\n *\n * @private\n * @param {*} value The value to check.\n * @returns {boolean} Returns `true` if `value` if suitable for strict\n *  equality comparisons, else `false`.\n */\nfunction isStrictComparable(value) {\n  return value === value && !isObject(value);\n}\n\nmodule.exports = isStrictComparable;\n\n},{\"../lang/isObject\":144}],128:[function(require,module,exports){\nvar arrayCopy = require('./arrayCopy'),\n    composeArgs = require('./composeArgs'),\n    composeArgsRight = require('./composeArgsRight'),\n    replaceHolders = require('./replaceHolders');\n\n/** Used to compose bitmasks for wrapper metadata. */\nvar BIND_FLAG = 1,\n    CURRY_BOUND_FLAG = 4,\n    CURRY_FLAG = 8,\n    ARY_FLAG = 128,\n    REARG_FLAG = 256;\n\n/** Used as the internal argument placeholder. */\nvar PLACEHOLDER = '__lodash_placeholder__';\n\n/* Native method references for those with the same name as other `lodash` methods. */\nvar nativeMin = Math.min;\n\n/**\n * Merges the function metadata of `source` into `data`.\n *\n * Merging metadata reduces the number of wrappers required to invoke a function.\n * This is possible because methods like `_.bind`, `_.curry`, and `_.partial`\n * may be applied regardless of execution order. Methods like `_.ary` and `_.rearg`\n * augment function arguments, making the order in which they are executed important,\n * preventing the merging of metadata. However, we make an exception for a safe\n * common case where curried functions have `_.ary` and or `_.rearg` applied.\n *\n * @private\n * @param {Array} data The destination metadata.\n * @param {Array} source The source metadata.\n * @returns {Array} Returns `data`.\n */\nfunction mergeData(data, source) {\n  var bitmask = data[1],\n      srcBitmask = source[1],\n      newBitmask = bitmask | srcBitmask,\n      isCommon = newBitmask < ARY_FLAG;\n\n  var isCombo =\n    (srcBitmask == ARY_FLAG && bitmask == CURRY_FLAG) ||\n    (srcBitmask == ARY_FLAG && bitmask == REARG_FLAG && data[7].length <= source[8]) ||\n    (srcBitmask == (ARY_FLAG | REARG_FLAG) && bitmask == CURRY_FLAG);\n\n  // Exit early if metadata can't be merged.\n  if (!(isCommon || isCombo)) {\n    return data;\n  }\n  // Use source `thisArg` if available.\n  if (srcBitmask & BIND_FLAG) {\n    data[2] = source[2];\n    // Set when currying a bound function.\n    newBitmask |= (bitmask & BIND_FLAG) ? 0 : CURRY_BOUND_FLAG;\n  }\n  // Compose partial arguments.\n  var value = source[3];\n  if (value) {\n    var partials = data[3];\n    data[3] = partials ? composeArgs(partials, value, source[4]) : arrayCopy(value);\n    data[4] = partials ? replaceHolders(data[3], PLACEHOLDER) : arrayCopy(source[4]);\n  }\n  // Compose partial right arguments.\n  value = source[5];\n  if (value) {\n    partials = data[5];\n    data[5] = partials ? composeArgsRight(partials, value, source[6]) : arrayCopy(value);\n    data[6] = partials ? replaceHolders(data[5], PLACEHOLDER) : arrayCopy(source[6]);\n  }\n  // Use source `argPos` if available.\n  value = source[7];\n  if (value) {\n    data[7] = arrayCopy(value);\n  }\n  // Use source `ary` if it's smaller.\n  if (srcBitmask & ARY_FLAG) {\n    data[8] = data[8] == null ? source[8] : nativeMin(data[8], source[8]);\n  }\n  // Use source `arity` if one is not provided.\n  if (data[9] == null) {\n    data[9] = source[9];\n  }\n  // Use source `func` and merge bitmasks.\n  data[0] = source[0];\n  data[1] = newBitmask;\n\n  return data;\n}\n\nmodule.exports = mergeData;\n\n},{\"./arrayCopy\":62,\"./composeArgs\":96,\"./composeArgsRight\":97,\"./replaceHolders\":132}],129:[function(require,module,exports){\n(function (global){\nvar getNative = require('./getNative');\n\n/** Native method references. */\nvar WeakMap = getNative(global, 'WeakMap');\n\n/** Used to store function metadata. */\nvar metaMap = WeakMap && new WeakMap;\n\nmodule.exports = metaMap;\n\n}).call(this,typeof global !== \"undefined\" ? global : typeof self !== \"undefined\" ? self : typeof window !== \"undefined\" ? window : {})\n\n},{\"./getNative\":114}],130:[function(require,module,exports){\n/** Used to lookup unminified function names. */\nvar realNames = {};\n\nmodule.exports = realNames;\n\n},{}],131:[function(require,module,exports){\nvar arrayCopy = require('./arrayCopy'),\n    isIndex = require('./isIndex');\n\n/* Native method references for those with the same name as other `lodash` methods. */\nvar nativeMin = Math.min;\n\n/**\n * Reorder `array` according to the specified indexes where the element at\n * the first index is assigned as the first element, the element at\n * the second index is assigned as the second element, and so on.\n *\n * @private\n * @param {Array} array The array to reorder.\n * @param {Array} indexes The arranged array indexes.\n * @returns {Array} Returns `array`.\n */\nfunction reorder(array, indexes) {\n  var arrLength = array.length,\n      length = nativeMin(indexes.length, arrLength),\n      oldArray = arrayCopy(array);\n\n  while (length--) {\n    var index = indexes[length];\n    array[length] = isIndex(index, arrLength) ? oldArray[index] : undefined;\n  }\n  return array;\n}\n\nmodule.exports = reorder;\n\n},{\"./arrayCopy\":62,\"./isIndex\":121}],132:[function(require,module,exports){\n/** Used as the internal argument placeholder. */\nvar PLACEHOLDER = '__lodash_placeholder__';\n\n/**\n * Replaces all `placeholder` elements in `array` with an internal placeholder\n * and returns an array of their indexes.\n *\n * @private\n * @param {Array} array The array to modify.\n * @param {*} placeholder The placeholder to replace.\n * @returns {Array} Returns the new array of placeholder indexes.\n */\nfunction replaceHolders(array, placeholder) {\n  var index = -1,\n      length = array.length,\n      resIndex = -1,\n      result = [];\n\n  while (++index < length) {\n    if (array[index] === placeholder) {\n      array[index] = PLACEHOLDER;\n      result[++resIndex] = index;\n    }\n  }\n  return result;\n}\n\nmodule.exports = replaceHolders;\n\n},{}],133:[function(require,module,exports){\nvar baseSetData = require('./baseSetData'),\n    now = require('../date/now');\n\n/** Used to detect when a function becomes hot. */\nvar HOT_COUNT = 150,\n    HOT_SPAN = 16;\n\n/**\n * Sets metadata for `func`.\n *\n * **Note:** If this function becomes hot, i.e. is invoked a lot in a short\n * period of time, it will trip its breaker and transition to an identity function\n * to avoid garbage collection pauses in V8. See [V8 issue 2070](https://code.google.com/p/v8/issues/detail?id=2070)\n * for more details.\n *\n * @private\n * @param {Function} func The function to associate metadata with.\n * @param {*} data The metadata.\n * @returns {Function} Returns `func`.\n */\nvar setData = (function() {\n  var count = 0,\n      lastCalled = 0;\n\n  return function(key, value) {\n    var stamp = now(),\n        remaining = HOT_SPAN - (stamp - lastCalled);\n\n    lastCalled = stamp;\n    if (remaining > 0) {\n      if (++count >= HOT_COUNT) {\n        return key;\n      }\n    } else {\n      count = 0;\n    }\n    return baseSetData(key, value);\n  };\n}());\n\nmodule.exports = setData;\n\n},{\"../date/now\":57,\"./baseSetData\":88}],134:[function(require,module,exports){\nvar isArguments = require('../lang/isArguments'),\n    isArray = require('../lang/isArray'),\n    isIndex = require('./isIndex'),\n    isLength = require('./isLength'),\n    isString = require('../lang/isString'),\n    keysIn = require('../object/keysIn');\n\n/** Used for native method references. */\nvar objectProto = Object.prototype;\n\n/** Used to check objects for own properties. */\nvar hasOwnProperty = objectProto.hasOwnProperty;\n\n/**\n * A fallback implementation of `Object.keys` which creates an array of the\n * own enumerable property names of `object`.\n *\n * @private\n * @param {Object} object The object to query.\n * @returns {Array} Returns the array of property names.\n */\nfunction shimKeys(object) {\n  var props = keysIn(object),\n      propsLength = props.length,\n      length = propsLength && object.length;\n\n  var allowIndexes = !!length && isLength(length) &&\n    (isArray(object) || isArguments(object) || isString(object));\n\n  var index = -1,\n      result = [];\n\n  while (++index < propsLength) {\n    var key = props[index];\n    if ((allowIndexes && isIndex(key, length)) || hasOwnProperty.call(object, key)) {\n      result.push(key);\n    }\n  }\n  return result;\n}\n\nmodule.exports = shimKeys;\n\n},{\"../lang/isArguments\":139,\"../lang/isArray\":140,\"../lang/isString\":146,\"../object/keysIn\":150,\"./isIndex\":121,\"./isLength\":125}],135:[function(require,module,exports){\nvar isObject = require('../lang/isObject'),\n    isString = require('../lang/isString'),\n    support = require('../support');\n\n/**\n * Converts `value` to an object if it's not one.\n *\n * @private\n * @param {*} value The value to process.\n * @returns {Object} Returns the object.\n */\nfunction toObject(value) {\n  if (support.unindexedChars && isString(value)) {\n    var index = -1,\n        length = value.length,\n        result = Object(value);\n\n    while (++index < length) {\n      result[index] = value.charAt(index);\n    }\n    return result;\n  }\n  return isObject(value) ? value : Object(value);\n}\n\nmodule.exports = toObject;\n\n},{\"../lang/isObject\":144,\"../lang/isString\":146,\"../support\":153}],136:[function(require,module,exports){\nvar baseToString = require('./baseToString'),\n    isArray = require('../lang/isArray');\n\n/** Used to match property names within property paths. */\nvar rePropName = /[^.[\\]]+|\\[(?:(-?\\d+(?:\\.\\d+)?)|([\"'])((?:(?!\\2)[^\\n\\\\]|\\\\.)*?)\\2)\\]/g;\n\n/** Used to match backslashes in property paths. */\nvar reEscapeChar = /\\\\(\\\\)?/g;\n\n/**\n * Converts `value` to property path array if it's not one.\n *\n * @private\n * @param {*} value The value to process.\n * @returns {Array} Returns the property path array.\n */\nfunction toPath(value) {\n  if (isArray(value)) {\n    return value;\n  }\n  var result = [];\n  baseToString(value).replace(rePropName, function(match, number, quote, string) {\n    result.push(quote ? string.replace(reEscapeChar, '$1') : (number || match));\n  });\n  return result;\n}\n\nmodule.exports = toPath;\n\n},{\"../lang/isArray\":140,\"./baseToString\":90}],137:[function(require,module,exports){\nvar LazyWrapper = require('./LazyWrapper'),\n    LodashWrapper = require('./LodashWrapper'),\n    arrayCopy = require('./arrayCopy');\n\n/**\n * Creates a clone of `wrapper`.\n *\n * @private\n * @param {Object} wrapper The wrapper to clone.\n * @returns {Object} Returns the cloned wrapper.\n */\nfunction wrapperClone(wrapper) {\n  return wrapper instanceof LazyWrapper\n    ? wrapper.clone()\n    : new LodashWrapper(wrapper.__wrapped__, wrapper.__chain__, arrayCopy(wrapper.__actions__));\n}\n\nmodule.exports = wrapperClone;\n\n},{\"./LazyWrapper\":60,\"./LodashWrapper\":61,\"./arrayCopy\":62}],138:[function(require,module,exports){\nvar baseClone = require('../internal/baseClone'),\n    bindCallback = require('../internal/bindCallback');\n\n/**\n * Creates a deep clone of `value`. If `customizer` is provided it's invoked\n * to produce the cloned values. If `customizer` returns `undefined` cloning\n * is handled by the method instead. The `customizer` is bound to `thisArg`\n * and invoked with up to three argument; (value [, index|key, object]).\n *\n * **Note:** This method is loosely based on the\n * [structured clone algorithm](http://www.w3.org/TR/html5/infrastructure.html#internal-structured-cloning-algorithm).\n * The enumerable properties of `arguments` objects and objects created by\n * constructors other than `Object` are cloned to plain `Object` objects. An\n * empty object is returned for uncloneable values such as functions, DOM nodes,\n * Maps, Sets, and WeakMaps.\n *\n * @static\n * @memberOf _\n * @category Lang\n * @param {*} value The value to deep clone.\n * @param {Function} [customizer] The function to customize cloning values.\n * @param {*} [thisArg] The `this` binding of `customizer`.\n * @returns {*} Returns the deep cloned value.\n * @example\n *\n * var users = [\n *   { 'user': 'barney' },\n *   { 'user': 'fred' }\n * ];\n *\n * var deep = _.cloneDeep(users);\n * deep[0] === users[0];\n * // => false\n *\n * // using a customizer callback\n * var el = _.cloneDeep(document.body, function(value) {\n *   if (_.isElement(value)) {\n *     return value.cloneNode(true);\n *   }\n * });\n *\n * el === document.body\n * // => false\n * el.nodeName\n * // => BODY\n * el.childNodes.length;\n * // => 20\n */\nfunction cloneDeep(value, customizer, thisArg) {\n  return typeof customizer == 'function'\n    ? baseClone(value, true, bindCallback(customizer, thisArg, 3))\n    : baseClone(value, true);\n}\n\nmodule.exports = cloneDeep;\n\n},{\"../internal/baseClone\":68,\"../internal/bindCallback\":94}],139:[function(require,module,exports){\nvar isArrayLike = require('../internal/isArrayLike'),\n    isObjectLike = require('../internal/isObjectLike');\n\n/** Used for native method references. */\nvar objectProto = Object.prototype;\n\n/** Used to check objects for own properties. */\nvar hasOwnProperty = objectProto.hasOwnProperty;\n\n/** Native method references. */\nvar propertyIsEnumerable = objectProto.propertyIsEnumerable;\n\n/**\n * Checks if `value` is classified as an `arguments` object.\n *\n * @static\n * @memberOf _\n * @category Lang\n * @param {*} value The value to check.\n * @returns {boolean} Returns `true` if `value` is correctly classified, else `false`.\n * @example\n *\n * _.isArguments(function() { return arguments; }());\n * // => true\n *\n * _.isArguments([1, 2, 3]);\n * // => false\n */\nfunction isArguments(value) {\n  return isObjectLike(value) && isArrayLike(value) &&\n    hasOwnProperty.call(value, 'callee') && !propertyIsEnumerable.call(value, 'callee');\n}\n\nmodule.exports = isArguments;\n\n},{\"../internal/isArrayLike\":119,\"../internal/isObjectLike\":126}],140:[function(require,module,exports){\nvar getNative = require('../internal/getNative'),\n    isLength = require('../internal/isLength'),\n    isObjectLike = require('../internal/isObjectLike');\n\n/** `Object#toString` result references. */\nvar arrayTag = '[object Array]';\n\n/** Used for native method references. */\nvar objectProto = Object.prototype;\n\n/**\n * Used to resolve the [`toStringTag`](http://ecma-international.org/ecma-262/6.0/#sec-object.prototype.tostring)\n * of values.\n */\nvar objToString = objectProto.toString;\n\n/* Native method references for those with the same name as other `lodash` methods. */\nvar nativeIsArray = getNative(Array, 'isArray');\n\n/**\n * Checks if `value` is classified as an `Array` object.\n *\n * @static\n * @memberOf _\n * @category Lang\n * @param {*} value The value to check.\n * @returns {boolean} Returns `true` if `value` is correctly classified, else `false`.\n * @example\n *\n * _.isArray([1, 2, 3]);\n * // => true\n *\n * _.isArray(function() { return arguments; }());\n * // => false\n */\nvar isArray = nativeIsArray || function(value) {\n  return isObjectLike(value) && isLength(value.length) && objToString.call(value) == arrayTag;\n};\n\nmodule.exports = isArray;\n\n},{\"../internal/getNative\":114,\"../internal/isLength\":125,\"../internal/isObjectLike\":126}],141:[function(require,module,exports){\nvar isArguments = require('./isArguments'),\n    isArray = require('./isArray'),\n    isArrayLike = require('../internal/isArrayLike'),\n    isFunction = require('./isFunction'),\n    isObjectLike = require('../internal/isObjectLike'),\n    isString = require('./isString'),\n    keys = require('../object/keys');\n\n/**\n * Checks if `value` is empty. A value is considered empty unless it's an\n * `arguments` object, array, string, or jQuery-like collection with a length\n * greater than `0` or an object with own enumerable properties.\n *\n * @static\n * @memberOf _\n * @category Lang\n * @param {Array|Object|string} value The value to inspect.\n * @returns {boolean} Returns `true` if `value` is empty, else `false`.\n * @example\n *\n * _.isEmpty(null);\n * // => true\n *\n * _.isEmpty(true);\n * // => true\n *\n * _.isEmpty(1);\n * // => true\n *\n * _.isEmpty([1, 2, 3]);\n * // => false\n *\n * _.isEmpty({ 'a': 1 });\n * // => false\n */\nfunction isEmpty(value) {\n  if (value == null) {\n    return true;\n  }\n  if (isArrayLike(value) && (isArray(value) || isString(value) || isArguments(value) ||\n      (isObjectLike(value) && isFunction(value.splice)))) {\n    return !value.length;\n  }\n  return !keys(value).length;\n}\n\nmodule.exports = isEmpty;\n\n},{\"../internal/isArrayLike\":119,\"../internal/isObjectLike\":126,\"../object/keys\":149,\"./isArguments\":139,\"./isArray\":140,\"./isFunction\":142,\"./isString\":146}],142:[function(require,module,exports){\nvar isObject = require('./isObject');\n\n/** `Object#toString` result references. */\nvar funcTag = '[object Function]';\n\n/** Used for native method references. */\nvar objectProto = Object.prototype;\n\n/**\n * Used to resolve the [`toStringTag`](http://ecma-international.org/ecma-262/6.0/#sec-object.prototype.tostring)\n * of values.\n */\nvar objToString = objectProto.toString;\n\n/**\n * Checks if `value` is classified as a `Function` object.\n *\n * @static\n * @memberOf _\n * @category Lang\n * @param {*} value The value to check.\n * @returns {boolean} Returns `true` if `value` is correctly classified, else `false`.\n * @example\n *\n * _.isFunction(_);\n * // => true\n *\n * _.isFunction(/abc/);\n * // => false\n */\nfunction isFunction(value) {\n  // The use of `Object#toString` avoids issues with the `typeof` operator\n  // in older versions of Chrome and Safari which return 'function' for regexes\n  // and Safari 8 which returns 'object' for typed array constructors.\n  return isObject(value) && objToString.call(value) == funcTag;\n}\n\nmodule.exports = isFunction;\n\n},{\"./isObject\":144}],143:[function(require,module,exports){\nvar isFunction = require('./isFunction'),\n    isHostObject = require('../internal/isHostObject'),\n    isObjectLike = require('../internal/isObjectLike');\n\n/** Used to detect host constructors (Safari > 5). */\nvar reIsHostCtor = /^\\[object .+?Constructor\\]$/;\n\n/** Used for native method references. */\nvar objectProto = Object.prototype;\n\n/** Used to resolve the decompiled source of functions. */\nvar fnToString = Function.prototype.toString;\n\n/** Used to check objects for own properties. */\nvar hasOwnProperty = objectProto.hasOwnProperty;\n\n/** Used to detect if a method is native. */\nvar reIsNative = RegExp('^' +\n  fnToString.call(hasOwnProperty).replace(/[\\\\^$.*+?()[\\]{}|]/g, '\\\\$&')\n  .replace(/hasOwnProperty|(function).*?(?=\\\\\\()| for .+?(?=\\\\\\])/g, '$1.*?') + '$'\n);\n\n/**\n * Checks if `value` is a native function.\n *\n * @static\n * @memberOf _\n * @category Lang\n * @param {*} value The value to check.\n * @returns {boolean} Returns `true` if `value` is a native function, else `false`.\n * @example\n *\n * _.isNative(Array.prototype.push);\n * // => true\n *\n * _.isNative(_);\n * // => false\n */\nfunction isNative(value) {\n  if (value == null) {\n    return false;\n  }\n  if (isFunction(value)) {\n    return reIsNative.test(fnToString.call(value));\n  }\n  return isObjectLike(value) && (isHostObject(value) ? reIsNative : reIsHostCtor).test(value);\n}\n\nmodule.exports = isNative;\n\n},{\"../internal/isHostObject\":120,\"../internal/isObjectLike\":126,\"./isFunction\":142}],144:[function(require,module,exports){\n/**\n * Checks if `value` is the [language type](https://es5.github.io/#x8) of `Object`.\n * (e.g. arrays, functions, objects, regexes, `new Number(0)`, and `new String('')`)\n *\n * @static\n * @memberOf _\n * @category Lang\n * @param {*} value The value to check.\n * @returns {boolean} Returns `true` if `value` is an object, else `false`.\n * @example\n *\n * _.isObject({});\n * // => true\n *\n * _.isObject([1, 2, 3]);\n * // => true\n *\n * _.isObject(1);\n * // => false\n */\nfunction isObject(value) {\n  // Avoid a V8 JIT bug in Chrome 19-20.\n  // See https://code.google.com/p/v8/issues/detail?id=2291 for more details.\n  var type = typeof value;\n  return !!value && (type == 'object' || type == 'function');\n}\n\nmodule.exports = isObject;\n\n},{}],145:[function(require,module,exports){\nvar baseForIn = require('../internal/baseForIn'),\n    isArguments = require('./isArguments'),\n    isHostObject = require('../internal/isHostObject'),\n    isObjectLike = require('../internal/isObjectLike'),\n    support = require('../support');\n\n/** `Object#toString` result references. */\nvar objectTag = '[object Object]';\n\n/** Used for native method references. */\nvar objectProto = Object.prototype;\n\n/** Used to check objects for own properties. */\nvar hasOwnProperty = objectProto.hasOwnProperty;\n\n/**\n * Used to resolve the [`toStringTag`](http://ecma-international.org/ecma-262/6.0/#sec-object.prototype.tostring)\n * of values.\n */\nvar objToString = objectProto.toString;\n\n/**\n * Checks if `value` is a plain object, that is, an object created by the\n * `Object` constructor or one with a `[[Prototype]]` of `null`.\n *\n * **Note:** This method assumes objects created by the `Object` constructor\n * have no inherited enumerable properties.\n *\n * @static\n * @memberOf _\n * @category Lang\n * @param {*} value The value to check.\n * @returns {boolean} Returns `true` if `value` is a plain object, else `false`.\n * @example\n *\n * function Foo() {\n *   this.a = 1;\n * }\n *\n * _.isPlainObject(new Foo);\n * // => false\n *\n * _.isPlainObject([1, 2, 3]);\n * // => false\n *\n * _.isPlainObject({ 'x': 0, 'y': 0 });\n * // => true\n *\n * _.isPlainObject(Object.create(null));\n * // => true\n */\nfunction isPlainObject(value) {\n  var Ctor;\n\n  // Exit early for non `Object` objects.\n  if (!(isObjectLike(value) && objToString.call(value) == objectTag && !isHostObject(value) && !isArguments(value)) ||\n      (!hasOwnProperty.call(value, 'constructor') && (Ctor = value.constructor, typeof Ctor == 'function' && !(Ctor instanceof Ctor)))) {\n    return false;\n  }\n  // IE < 9 iterates inherited properties before own properties. If the first\n  // iterated property is an object's own property then there are no inherited\n  // enumerable properties.\n  var result;\n  if (support.ownLast) {\n    baseForIn(value, function(subValue, key, object) {\n      result = hasOwnProperty.call(object, key);\n      return false;\n    });\n    return result !== false;\n  }\n  // In most environments an object's own properties are iterated before\n  // its inherited properties. If the last iterated property is an object's\n  // own property then there are no inherited enumerable properties.\n  baseForIn(value, function(subValue, key) {\n    result = key;\n  });\n  return result === undefined || hasOwnProperty.call(value, result);\n}\n\nmodule.exports = isPlainObject;\n\n},{\"../internal/baseForIn\":75,\"../internal/isHostObject\":120,\"../internal/isObjectLike\":126,\"../support\":153,\"./isArguments\":139}],146:[function(require,module,exports){\nvar isObjectLike = require('../internal/isObjectLike');\n\n/** `Object#toString` result references. */\nvar stringTag = '[object String]';\n\n/** Used for native method references. */\nvar objectProto = Object.prototype;\n\n/**\n * Used to resolve the [`toStringTag`](http://ecma-international.org/ecma-262/6.0/#sec-object.prototype.tostring)\n * of values.\n */\nvar objToString = objectProto.toString;\n\n/**\n * Checks if `value` is classified as a `String` primitive or object.\n *\n * @static\n * @memberOf _\n * @category Lang\n * @param {*} value The value to check.\n * @returns {boolean} Returns `true` if `value` is correctly classified, else `false`.\n * @example\n *\n * _.isString('abc');\n * // => true\n *\n * _.isString(1);\n * // => false\n */\nfunction isString(value) {\n  return typeof value == 'string' || (isObjectLike(value) && objToString.call(value) == stringTag);\n}\n\nmodule.exports = isString;\n\n},{\"../internal/isObjectLike\":126}],147:[function(require,module,exports){\nvar isLength = require('../internal/isLength'),\n    isObjectLike = require('../internal/isObjectLike');\n\n/** `Object#toString` result references. */\nvar argsTag = '[object Arguments]',\n    arrayTag = '[object Array]',\n    boolTag = '[object Boolean]',\n    dateTag = '[object Date]',\n    errorTag = '[object Error]',\n    funcTag = '[object Function]',\n    mapTag = '[object Map]',\n    numberTag = '[object Number]',\n    objectTag = '[object Object]',\n    regexpTag = '[object RegExp]',\n    setTag = '[object Set]',\n    stringTag = '[object String]',\n    weakMapTag = '[object WeakMap]';\n\nvar arrayBufferTag = '[object ArrayBuffer]',\n    float32Tag = '[object Float32Array]',\n    float64Tag = '[object Float64Array]',\n    int8Tag = '[object Int8Array]',\n    int16Tag = '[object Int16Array]',\n    int32Tag = '[object Int32Array]',\n    uint8Tag = '[object Uint8Array]',\n    uint8ClampedTag = '[object Uint8ClampedArray]',\n    uint16Tag = '[object Uint16Array]',\n    uint32Tag = '[object Uint32Array]';\n\n/** Used to identify `toStringTag` values of typed arrays. */\nvar typedArrayTags = {};\ntypedArrayTags[float32Tag] = typedArrayTags[float64Tag] =\ntypedArrayTags[int8Tag] = typedArrayTags[int16Tag] =\ntypedArrayTags[int32Tag] = typedArrayTags[uint8Tag] =\ntypedArrayTags[uint8ClampedTag] = typedArrayTags[uint16Tag] =\ntypedArrayTags[uint32Tag] = true;\ntypedArrayTags[argsTag] = typedArrayTags[arrayTag] =\ntypedArrayTags[arrayBufferTag] = typedArrayTags[boolTag] =\ntypedArrayTags[dateTag] = typedArrayTags[errorTag] =\ntypedArrayTags[funcTag] = typedArrayTags[mapTag] =\ntypedArrayTags[numberTag] = typedArrayTags[objectTag] =\ntypedArrayTags[regexpTag] = typedArrayTags[setTag] =\ntypedArrayTags[stringTag] = typedArrayTags[weakMapTag] = false;\n\n/** Used for native method references. */\nvar objectProto = Object.prototype;\n\n/**\n * Used to resolve the [`toStringTag`](http://ecma-international.org/ecma-262/6.0/#sec-object.prototype.tostring)\n * of values.\n */\nvar objToString = objectProto.toString;\n\n/**\n * Checks if `value` is classified as a typed array.\n *\n * @static\n * @memberOf _\n * @category Lang\n * @param {*} value The value to check.\n * @returns {boolean} Returns `true` if `value` is correctly classified, else `false`.\n * @example\n *\n * _.isTypedArray(new Uint8Array);\n * // => true\n *\n * _.isTypedArray([]);\n * // => false\n */\nfunction isTypedArray(value) {\n  return isObjectLike(value) && isLength(value.length) && !!typedArrayTags[objToString.call(value)];\n}\n\nmodule.exports = isTypedArray;\n\n},{\"../internal/isLength\":125,\"../internal/isObjectLike\":126}],148:[function(require,module,exports){\n/**\n * Checks if `value` is `undefined`.\n *\n * @static\n * @memberOf _\n * @category Lang\n * @param {*} value The value to check.\n * @returns {boolean} Returns `true` if `value` is `undefined`, else `false`.\n * @example\n *\n * _.isUndefined(void 0);\n * // => true\n *\n * _.isUndefined(null);\n * // => false\n */\nfunction isUndefined(value) {\n  return value === undefined;\n}\n\nmodule.exports = isUndefined;\n\n},{}],149:[function(require,module,exports){\nvar getNative = require('../internal/getNative'),\n    isArrayLike = require('../internal/isArrayLike'),\n    isObject = require('../lang/isObject'),\n    shimKeys = require('../internal/shimKeys'),\n    support = require('../support');\n\n/* Native method references for those with the same name as other `lodash` methods. */\nvar nativeKeys = getNative(Object, 'keys');\n\n/**\n * Creates an array of the own enumerable property names of `object`.\n *\n * **Note:** Non-object values are coerced to objects. See the\n * [ES spec](http://ecma-international.org/ecma-262/6.0/#sec-object.keys)\n * for more details.\n *\n * @static\n * @memberOf _\n * @category Object\n * @param {Object} object The object to query.\n * @returns {Array} Returns the array of property names.\n * @example\n *\n * function Foo() {\n *   this.a = 1;\n *   this.b = 2;\n * }\n *\n * Foo.prototype.c = 3;\n *\n * _.keys(new Foo);\n * // => ['a', 'b'] (iteration order is not guaranteed)\n *\n * _.keys('hi');\n * // => ['0', '1']\n */\nvar keys = !nativeKeys ? shimKeys : function(object) {\n  var Ctor = object == null ? undefined : object.constructor;\n  if ((typeof Ctor == 'function' && Ctor.prototype === object) ||\n      (typeof object == 'function' ? support.enumPrototypes : isArrayLike(object))) {\n    return shimKeys(object);\n  }\n  return isObject(object) ? nativeKeys(object) : [];\n};\n\nmodule.exports = keys;\n\n},{\"../internal/getNative\":114,\"../internal/isArrayLike\":119,\"../internal/shimKeys\":134,\"../lang/isObject\":144,\"../support\":153}],150:[function(require,module,exports){\nvar arrayEach = require('../internal/arrayEach'),\n    isArguments = require('../lang/isArguments'),\n    isArray = require('../lang/isArray'),\n    isFunction = require('../lang/isFunction'),\n    isIndex = require('../internal/isIndex'),\n    isLength = require('../internal/isLength'),\n    isObject = require('../lang/isObject'),\n    isString = require('../lang/isString'),\n    support = require('../support');\n\n/** `Object#toString` result references. */\nvar arrayTag = '[object Array]',\n    boolTag = '[object Boolean]',\n    dateTag = '[object Date]',\n    errorTag = '[object Error]',\n    funcTag = '[object Function]',\n    numberTag = '[object Number]',\n    objectTag = '[object Object]',\n    regexpTag = '[object RegExp]',\n    stringTag = '[object String]';\n\n/** Used to fix the JScript `[[DontEnum]]` bug. */\nvar shadowProps = [\n  'constructor', 'hasOwnProperty', 'isPrototypeOf', 'propertyIsEnumerable',\n  'toLocaleString', 'toString', 'valueOf'\n];\n\n/** Used for native method references. */\nvar errorProto = Error.prototype,\n    objectProto = Object.prototype,\n    stringProto = String.prototype;\n\n/** Used to check objects for own properties. */\nvar hasOwnProperty = objectProto.hasOwnProperty;\n\n/**\n * Used to resolve the [`toStringTag`](http://ecma-international.org/ecma-262/6.0/#sec-object.prototype.tostring)\n * of values.\n */\nvar objToString = objectProto.toString;\n\n/** Used to avoid iterating over non-enumerable properties in IE < 9. */\nvar nonEnumProps = {};\nnonEnumProps[arrayTag] = nonEnumProps[dateTag] = nonEnumProps[numberTag] = { 'constructor': true, 'toLocaleString': true, 'toString': true, 'valueOf': true };\nnonEnumProps[boolTag] = nonEnumProps[stringTag] = { 'constructor': true, 'toString': true, 'valueOf': true };\nnonEnumProps[errorTag] = nonEnumProps[funcTag] = nonEnumProps[regexpTag] = { 'constructor': true, 'toString': true };\nnonEnumProps[objectTag] = { 'constructor': true };\n\narrayEach(shadowProps, function(key) {\n  for (var tag in nonEnumProps) {\n    if (hasOwnProperty.call(nonEnumProps, tag)) {\n      var props = nonEnumProps[tag];\n      props[key] = hasOwnProperty.call(props, key);\n    }\n  }\n});\n\n/**\n * Creates an array of the own and inherited enumerable property names of `object`.\n *\n * **Note:** Non-object values are coerced to objects.\n *\n * @static\n * @memberOf _\n * @category Object\n * @param {Object} object The object to query.\n * @returns {Array} Returns the array of property names.\n * @example\n *\n * function Foo() {\n *   this.a = 1;\n *   this.b = 2;\n * }\n *\n * Foo.prototype.c = 3;\n *\n * _.keysIn(new Foo);\n * // => ['a', 'b', 'c'] (iteration order is not guaranteed)\n */\nfunction keysIn(object) {\n  if (object == null) {\n    return [];\n  }\n  if (!isObject(object)) {\n    object = Object(object);\n  }\n  var length = object.length;\n\n  length = (length && isLength(length) &&\n    (isArray(object) || isArguments(object) || isString(object)) && length) || 0;\n\n  var Ctor = object.constructor,\n      index = -1,\n      proto = (isFunction(Ctor) && Ctor.prototype) || objectProto,\n      isProto = proto === object,\n      result = Array(length),\n      skipIndexes = length > 0,\n      skipErrorProps = support.enumErrorProps && (object === errorProto || object instanceof Error),\n      skipProto = support.enumPrototypes && isFunction(object);\n\n  while (++index < length) {\n    result[index] = (index + '');\n  }\n  // lodash skips the `constructor` property when it infers it's iterating\n  // over a `prototype` object because IE < 9 can't set the `[[Enumerable]]`\n  // attribute of an existing property and the `constructor` property of a\n  // prototype defaults to non-enumerable.\n  for (var key in object) {\n    if (!(skipProto && key == 'prototype') &&\n        !(skipErrorProps && (key == 'message' || key == 'name')) &&\n        !(skipIndexes && isIndex(key, length)) &&\n        !(key == 'constructor' && (isProto || !hasOwnProperty.call(object, key)))) {\n      result.push(key);\n    }\n  }\n  if (support.nonEnumShadows && object !== objectProto) {\n    var tag = object === stringProto ? stringTag : (object === errorProto ? errorTag : objToString.call(object)),\n        nonEnums = nonEnumProps[tag] || nonEnumProps[objectTag];\n\n    if (tag == objectTag) {\n      proto = objectProto;\n    }\n    length = shadowProps.length;\n    while (length--) {\n      key = shadowProps[length];\n      var nonEnum = nonEnums[key];\n      if (!(isProto && nonEnum) &&\n          (nonEnum ? hasOwnProperty.call(object, key) : object[key] !== proto[key])) {\n        result.push(key);\n      }\n    }\n  }\n  return result;\n}\n\nmodule.exports = keysIn;\n\n},{\"../internal/arrayEach\":63,\"../internal/isIndex\":121,\"../internal/isLength\":125,\"../lang/isArguments\":139,\"../lang/isArray\":140,\"../lang/isFunction\":142,\"../lang/isObject\":144,\"../lang/isString\":146,\"../support\":153}],151:[function(require,module,exports){\nvar keys = require('./keys'),\n    toObject = require('../internal/toObject');\n\n/**\n * Creates a two dimensional array of the key-value pairs for `object`,\n * e.g. `[[key1, value1], [key2, value2]]`.\n *\n * @static\n * @memberOf _\n * @category Object\n * @param {Object} object The object to query.\n * @returns {Array} Returns the new array of key-value pairs.\n * @example\n *\n * _.pairs({ 'barney': 36, 'fred': 40 });\n * // => [['barney', 36], ['fred', 40]] (iteration order is not guaranteed)\n */\nfunction pairs(object) {\n  object = toObject(object);\n\n  var index = -1,\n      props = keys(object),\n      length = props.length,\n      result = Array(length);\n\n  while (++index < length) {\n    var key = props[index];\n    result[index] = [key, object[key]];\n  }\n  return result;\n}\n\nmodule.exports = pairs;\n\n},{\"../internal/toObject\":135,\"./keys\":149}],152:[function(require,module,exports){\nvar baseValues = require('../internal/baseValues'),\n    keys = require('./keys');\n\n/**\n * Creates an array of the own enumerable property values of `object`.\n *\n * **Note:** Non-object values are coerced to objects.\n *\n * @static\n * @memberOf _\n * @category Object\n * @param {Object} object The object to query.\n * @returns {Array} Returns the array of property values.\n * @example\n *\n * function Foo() {\n *   this.a = 1;\n *   this.b = 2;\n * }\n *\n * Foo.prototype.c = 3;\n *\n * _.values(new Foo);\n * // => [1, 2] (iteration order is not guaranteed)\n *\n * _.values('hi');\n * // => ['h', 'i']\n */\nfunction values(object) {\n  return baseValues(object, keys(object));\n}\n\nmodule.exports = values;\n\n},{\"../internal/baseValues\":91,\"./keys\":149}],153:[function(require,module,exports){\n/** Used for native method references. */\nvar arrayProto = Array.prototype,\n    errorProto = Error.prototype,\n    objectProto = Object.prototype;\n\n/** Native method references. */\nvar propertyIsEnumerable = objectProto.propertyIsEnumerable,\n    splice = arrayProto.splice;\n\n/**\n * An object environment feature flags.\n *\n * @static\n * @memberOf _\n * @type Object\n */\nvar support = {};\n\n(function(x) {\n  var Ctor = function() { this.x = x; },\n      object = { '0': x, 'length': x },\n      props = [];\n\n  Ctor.prototype = { 'valueOf': x, 'y': x };\n  for (var key in new Ctor) { props.push(key); }\n\n  /**\n   * Detect if `name` or `message` properties of `Error.prototype` are\n   * enumerable by default (IE < 9, Safari < 5.1).\n   *\n   * @memberOf _.support\n   * @type boolean\n   */\n  support.enumErrorProps = propertyIsEnumerable.call(errorProto, 'message') ||\n    propertyIsEnumerable.call(errorProto, 'name');\n\n  /**\n   * Detect if `prototype` properties are enumerable by default.\n   *\n   * Firefox < 3.6, Opera > 9.50 - Opera < 11.60, and Safari < 5.1\n   * (if the prototype or a property on the prototype has been set)\n   * incorrectly set the `[[Enumerable]]` value of a function's `prototype`\n   * property to `true`.\n   *\n   * @memberOf _.support\n   * @type boolean\n   */\n  support.enumPrototypes = propertyIsEnumerable.call(Ctor, 'prototype');\n\n  /**\n   * Detect if properties shadowing those on `Object.prototype` are non-enumerable.\n   *\n   * In IE < 9 an object's own properties, shadowing non-enumerable ones,\n   * are made non-enumerable as well (a.k.a the JScript `[[DontEnum]]` bug).\n   *\n   * @memberOf _.support\n   * @type boolean\n   */\n  support.nonEnumShadows = !/valueOf/.test(props);\n\n  /**\n   * Detect if own properties are iterated after inherited properties (IE < 9).\n   *\n   * @memberOf _.support\n   * @type boolean\n   */\n  support.ownLast = props[0] != 'x';\n\n  /**\n   * Detect if `Array#shift` and `Array#splice` augment array-like objects\n   * correctly.\n   *\n   * Firefox < 10, compatibility modes of IE 8, and IE < 9 have buggy Array\n   * `shift()` and `splice()` functions that fail to remove the last element,\n   * `value[0]`, of array-like objects even though the \"length\" property is\n   * set to `0`. The `shift()` method is buggy in compatibility modes of IE 8,\n   * while `splice()` is buggy regardless of mode in IE < 9.\n   *\n   * @memberOf _.support\n   * @type boolean\n   */\n  support.spliceObjects = (splice.call(object, 0, 1), !object[0]);\n\n  /**\n   * Detect lack of support for accessing string characters by index.\n   *\n   * IE < 8 can't access characters by index. IE 8 can only access characters\n   * by index on string literals, not string objects.\n   *\n   * @memberOf _.support\n   * @type boolean\n   */\n  support.unindexedChars = ('x'[0] + Object('x')[0]) != 'xx';\n}(1, 0));\n\nmodule.exports = support;\n\n},{}],154:[function(require,module,exports){\n/**\n * This method returns the first argument provided to it.\n *\n * @static\n * @memberOf _\n * @category Utility\n * @param {*} value Any value.\n * @returns {*} Returns `value`.\n * @example\n *\n * var object = { 'user': 'fred' };\n *\n * _.identity(object) === object;\n * // => true\n */\nfunction identity(value) {\n  return value;\n}\n\nmodule.exports = identity;\n\n},{}],155:[function(require,module,exports){\n/**\n * A no-operation function that returns `undefined` regardless of the\n * arguments it receives.\n *\n * @static\n * @memberOf _\n * @category Utility\n * @example\n *\n * var object = { 'user': 'fred' };\n *\n * _.noop(object) === undefined;\n * // => true\n */\nfunction noop() {\n  // No operation performed.\n}\n\nmodule.exports = noop;\n\n},{}],156:[function(require,module,exports){\nvar baseProperty = require('../internal/baseProperty'),\n    basePropertyDeep = require('../internal/basePropertyDeep'),\n    isKey = require('../internal/isKey');\n\n/**\n * Creates a function that returns the property value at `path` on a\n * given object.\n *\n * @static\n * @memberOf _\n * @category Utility\n * @param {Array|string} path The path of the property to get.\n * @returns {Function} Returns the new function.\n * @example\n *\n * var objects = [\n *   { 'a': { 'b': { 'c': 2 } } },\n *   { 'a': { 'b': { 'c': 1 } } }\n * ];\n *\n * _.map(objects, _.property('a.b.c'));\n * // => [2, 1]\n *\n * _.pluck(_.sortBy(objects, _.property(['a', 'b', 'c'])), 'a.b.c');\n * // => [1, 2]\n */\nfunction property(path) {\n  return isKey(path) ? baseProperty(path) : basePropertyDeep(path);\n}\n\nmodule.exports = property;\n\n},{\"../internal/baseProperty\":86,\"../internal/basePropertyDeep\":87,\"../internal/isKey\":123}],157:[function(require,module,exports){\n(function (process){\n// vim:ts=4:sts=4:sw=4:\n/*!\n *\n * Copyright 2009-2012 Kris Kowal under the terms of the MIT\n * license found at http://github.com/kriskowal/q/raw/master/LICENSE\n *\n * With parts by Tyler Close\n * Copyright 2007-2009 Tyler Close under the terms of the MIT X license found\n * at http://www.opensource.org/licenses/mit-license.html\n * Forked at ref_send.js version: 2009-05-11\n *\n * With parts by Mark Miller\n * Copyright (C) 2011 Google Inc.\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 *\n */\n\n(function (definition) {\n    \"use strict\";\n\n    // This file will function properly as a <script> tag, or a module\n    // using CommonJS and NodeJS or RequireJS module formats.  In\n    // Common/Node/RequireJS, the module exports the Q API and when\n    // executed as a simple <script>, it creates a Q global instead.\n\n    // Montage Require\n    if (typeof bootstrap === \"function\") {\n        bootstrap(\"promise\", definition);\n\n    // CommonJS\n    } else if (typeof exports === \"object\" && typeof module === \"object\") {\n        module.exports = definition();\n\n    // RequireJS\n    } else if (typeof define === \"function\" && define.amd) {\n        define(definition);\n\n    // SES (Secure EcmaScript)\n    } else if (typeof ses !== \"undefined\") {\n        if (!ses.ok()) {\n            return;\n        } else {\n            ses.makeQ = definition;\n        }\n\n    // <script>\n    } else if (typeof window !== \"undefined\" || typeof self !== \"undefined\") {\n        // Prefer window over self for add-on scripts. Use self for\n        // non-windowed contexts.\n        var global = typeof window !== \"undefined\" ? window : self;\n\n        // Get the `window` object, save the previous Q global\n        // and initialize Q as a global.\n        var previousQ = global.Q;\n        global.Q = definition();\n\n        // Add a noConflict function so Q can be removed from the\n        // global namespace.\n        global.Q.noConflict = function () {\n            global.Q = previousQ;\n            return this;\n        };\n\n    } else {\n        throw new Error(\"This environment was not anticipated by Q. Please file a bug.\");\n    }\n\n})(function () {\n\"use strict\";\n\nvar hasStacks = false;\ntry {\n    throw new Error();\n} catch (e) {\n    hasStacks = !!e.stack;\n}\n\n// All code after this point will be filtered from stack traces reported\n// by Q.\nvar qStartingLine = captureLine();\nvar qFileName;\n\n// shims\n\n// used for fallback in \"allResolved\"\nvar noop = function () {};\n\n// Use the fastest possible means to execute a task in a future turn\n// of the event loop.\nvar nextTick =(function () {\n    // linked list of tasks (single, with head node)\n    var head = {task: void 0, next: null};\n    var tail = head;\n    var flushing = false;\n    var requestTick = void 0;\n    var isNodeJS = false;\n    // queue for late tasks, used by unhandled rejection tracking\n    var laterQueue = [];\n\n    function flush() {\n        /* jshint loopfunc: true */\n        var task, domain;\n\n        while (head.next) {\n            head = head.next;\n            task = head.task;\n            head.task = void 0;\n            domain = head.domain;\n\n            if (domain) {\n                head.domain = void 0;\n                domain.enter();\n            }\n            runSingle(task, domain);\n\n        }\n        while (laterQueue.length) {\n            task = laterQueue.pop();\n            runSingle(task);\n        }\n        flushing = false;\n    }\n    // runs a single function in the async queue\n    function runSingle(task, domain) {\n        try {\n            task();\n\n        } catch (e) {\n            if (isNodeJS) {\n                // In node, uncaught exceptions are considered fatal errors.\n                // Re-throw them synchronously to interrupt flushing!\n\n                // Ensure continuation if the uncaught exception is suppressed\n                // listening \"uncaughtException\" events (as domains does).\n                // Continue in next event to avoid tick recursion.\n                if (domain) {\n                    domain.exit();\n                }\n                setTimeout(flush, 0);\n                if (domain) {\n                    domain.enter();\n                }\n\n                throw e;\n\n            } else {\n                // In browsers, uncaught exceptions are not fatal.\n                // Re-throw them asynchronously to avoid slow-downs.\n                setTimeout(function () {\n                    throw e;\n                }, 0);\n            }\n        }\n\n        if (domain) {\n            domain.exit();\n        }\n    }\n\n    nextTick = function (task) {\n        tail = tail.next = {\n            task: task,\n            domain: isNodeJS && process.domain,\n            next: null\n        };\n\n        if (!flushing) {\n            flushing = true;\n            requestTick();\n        }\n    };\n\n    if (typeof process === \"object\" &&\n        process.toString() === \"[object process]\" && process.nextTick) {\n        // Ensure Q is in a real Node environment, with a `process.nextTick`.\n        // To see through fake Node environments:\n        // * Mocha test runner - exposes a `process` global without a `nextTick`\n        // * Browserify - exposes a `process.nexTick` function that uses\n        //   `setTimeout`. In this case `setImmediate` is preferred because\n        //    it is faster. Browserify's `process.toString()` yields\n        //   \"[object Object]\", while in a real Node environment\n        //   `process.nextTick()` yields \"[object process]\".\n        isNodeJS = true;\n\n        requestTick = function () {\n            process.nextTick(flush);\n        };\n\n    } else if (typeof setImmediate === \"function\") {\n        // In IE10, Node.js 0.9+, or https://github.com/NobleJS/setImmediate\n        if (typeof window !== \"undefined\") {\n            requestTick = setImmediate.bind(window, flush);\n        } else {\n            requestTick = function () {\n                setImmediate(flush);\n            };\n        }\n\n    } else if (typeof MessageChannel !== \"undefined\") {\n        // modern browsers\n        // http://www.nonblocking.io/2011/06/windownexttick.html\n        var channel = new MessageChannel();\n        // At least Safari Version 6.0.5 (8536.30.1) intermittently cannot create\n        // working message ports the first time a page loads.\n        channel.port1.onmessage = function () {\n            requestTick = requestPortTick;\n            channel.port1.onmessage = flush;\n            flush();\n        };\n        var requestPortTick = function () {\n            // Opera requires us to provide a message payload, regardless of\n            // whether we use it.\n            channel.port2.postMessage(0);\n        };\n        requestTick = function () {\n            setTimeout(flush, 0);\n            requestPortTick();\n        };\n\n    } else {\n        // old browsers\n        requestTick = function () {\n            setTimeout(flush, 0);\n        };\n    }\n    // runs a task after all other tasks have been run\n    // this is useful for unhandled rejection tracking that needs to happen\n    // after all `then`d tasks have been run.\n    nextTick.runAfter = function (task) {\n        laterQueue.push(task);\n        if (!flushing) {\n            flushing = true;\n            requestTick();\n        }\n    };\n    return nextTick;\n})();\n\n// Attempt to make generics safe in the face of downstream\n// modifications.\n// There is no situation where this is necessary.\n// If you need a security guarantee, these primordials need to be\n// deeply frozen anyway, and if you don’t need a security guarantee,\n// this is just plain paranoid.\n// However, this **might** have the nice side-effect of reducing the size of\n// the minified code by reducing x.call() to merely x()\n// See Mark Miller’s explanation of what this does.\n// http://wiki.ecmascript.org/doku.php?id=conventions:safe_meta_programming\nvar call = Function.call;\nfunction uncurryThis(f) {\n    return function () {\n        return call.apply(f, arguments);\n    };\n}\n// This is equivalent, but slower:\n// uncurryThis = Function_bind.bind(Function_bind.call);\n// http://jsperf.com/uncurrythis\n\nvar array_slice = uncurryThis(Array.prototype.slice);\n\nvar array_reduce = uncurryThis(\n    Array.prototype.reduce || function (callback, basis) {\n        var index = 0,\n            length = this.length;\n        // concerning the initial value, if one is not provided\n        if (arguments.length === 1) {\n            // seek to the first value in the array, accounting\n            // for the possibility that is is a sparse array\n            do {\n                if (index in this) {\n                    basis = this[index++];\n                    break;\n                }\n                if (++index >= length) {\n                    throw new TypeError();\n                }\n            } while (1);\n        }\n        // reduce\n        for (; index < length; index++) {\n            // account for the possibility that the array is sparse\n            if (index in this) {\n                basis = callback(basis, this[index], index);\n            }\n        }\n        return basis;\n    }\n);\n\nvar array_indexOf = uncurryThis(\n    Array.prototype.indexOf || function (value) {\n        // not a very good shim, but good enough for our one use of it\n        for (var i = 0; i < this.length; i++) {\n            if (this[i] === value) {\n                return i;\n            }\n        }\n        return -1;\n    }\n);\n\nvar array_map = uncurryThis(\n    Array.prototype.map || function (callback, thisp) {\n        var self = this;\n        var collect = [];\n        array_reduce(self, function (undefined, value, index) {\n            collect.push(callback.call(thisp, value, index, self));\n        }, void 0);\n        return collect;\n    }\n);\n\nvar object_create = Object.create || function (prototype) {\n    function Type() { }\n    Type.prototype = prototype;\n    return new Type();\n};\n\nvar object_hasOwnProperty = uncurryThis(Object.prototype.hasOwnProperty);\n\nvar object_keys = Object.keys || function (object) {\n    var keys = [];\n    for (var key in object) {\n        if (object_hasOwnProperty(object, key)) {\n            keys.push(key);\n        }\n    }\n    return keys;\n};\n\nvar object_toString = uncurryThis(Object.prototype.toString);\n\nfunction isObject(value) {\n    return value === Object(value);\n}\n\n// generator related shims\n\n// FIXME: Remove this function once ES6 generators are in SpiderMonkey.\nfunction isStopIteration(exception) {\n    return (\n        object_toString(exception) === \"[object StopIteration]\" ||\n        exception instanceof QReturnValue\n    );\n}\n\n// FIXME: Remove this helper and Q.return once ES6 generators are in\n// SpiderMonkey.\nvar QReturnValue;\nif (typeof ReturnValue !== \"undefined\") {\n    QReturnValue = ReturnValue;\n} else {\n    QReturnValue = function (value) {\n        this.value = value;\n    };\n}\n\n// long stack traces\n\nvar STACK_JUMP_SEPARATOR = \"From previous event:\";\n\nfunction makeStackTraceLong(error, promise) {\n    // If possible, transform the error stack trace by removing Node and Q\n    // cruft, then concatenating with the stack trace of `promise`. See #57.\n    if (hasStacks &&\n        promise.stack &&\n        typeof error === \"object\" &&\n        error !== null &&\n        error.stack &&\n        error.stack.indexOf(STACK_JUMP_SEPARATOR) === -1\n    ) {\n        var stacks = [];\n        for (var p = promise; !!p; p = p.source) {\n            if (p.stack) {\n                stacks.unshift(p.stack);\n            }\n        }\n        stacks.unshift(error.stack);\n\n        var concatedStacks = stacks.join(\"\\n\" + STACK_JUMP_SEPARATOR + \"\\n\");\n        error.stack = filterStackString(concatedStacks);\n    }\n}\n\nfunction filterStackString(stackString) {\n    var lines = stackString.split(\"\\n\");\n    var desiredLines = [];\n    for (var i = 0; i < lines.length; ++i) {\n        var line = lines[i];\n\n        if (!isInternalFrame(line) && !isNodeFrame(line) && line) {\n            desiredLines.push(line);\n        }\n    }\n    return desiredLines.join(\"\\n\");\n}\n\nfunction isNodeFrame(stackLine) {\n    return stackLine.indexOf(\"(module.js:\") !== -1 ||\n           stackLine.indexOf(\"(node.js:\") !== -1;\n}\n\nfunction getFileNameAndLineNumber(stackLine) {\n    // Named functions: \"at functionName (filename:lineNumber:columnNumber)\"\n    // In IE10 function name can have spaces (\"Anonymous function\") O_o\n    var attempt1 = /at .+ \\((.+):(\\d+):(?:\\d+)\\)$/.exec(stackLine);\n    if (attempt1) {\n        return [attempt1[1], Number(attempt1[2])];\n    }\n\n    // Anonymous functions: \"at filename:lineNumber:columnNumber\"\n    var attempt2 = /at ([^ ]+):(\\d+):(?:\\d+)$/.exec(stackLine);\n    if (attempt2) {\n        return [attempt2[1], Number(attempt2[2])];\n    }\n\n    // Firefox style: \"function@filename:lineNumber or @filename:lineNumber\"\n    var attempt3 = /.*@(.+):(\\d+)$/.exec(stackLine);\n    if (attempt3) {\n        return [attempt3[1], Number(attempt3[2])];\n    }\n}\n\nfunction isInternalFrame(stackLine) {\n    var fileNameAndLineNumber = getFileNameAndLineNumber(stackLine);\n\n    if (!fileNameAndLineNumber) {\n        return false;\n    }\n\n    var fileName = fileNameAndLineNumber[0];\n    var lineNumber = fileNameAndLineNumber[1];\n\n    return fileName === qFileName &&\n        lineNumber >= qStartingLine &&\n        lineNumber <= qEndingLine;\n}\n\n// discover own file name and line number range for filtering stack\n// traces\nfunction captureLine() {\n    if (!hasStacks) {\n        return;\n    }\n\n    try {\n        throw new Error();\n    } catch (e) {\n        var lines = e.stack.split(\"\\n\");\n        var firstLine = lines[0].indexOf(\"@\") > 0 ? lines[1] : lines[2];\n        var fileNameAndLineNumber = getFileNameAndLineNumber(firstLine);\n        if (!fileNameAndLineNumber) {\n            return;\n        }\n\n        qFileName = fileNameAndLineNumber[0];\n        return fileNameAndLineNumber[1];\n    }\n}\n\nfunction deprecate(callback, name, alternative) {\n    return function () {\n        if (typeof console !== \"undefined\" &&\n            typeof console.warn === \"function\") {\n            console.warn(name + \" is deprecated, use \" + alternative +\n                         \" instead.\", new Error(\"\").stack);\n        }\n        return callback.apply(callback, arguments);\n    };\n}\n\n// end of shims\n// beginning of real work\n\n/**\n * Constructs a promise for an immediate reference, passes promises through, or\n * coerces promises from different systems.\n * @param value immediate reference or promise\n */\nfunction Q(value) {\n    // If the object is already a Promise, return it directly.  This enables\n    // the resolve function to both be used to created references from objects,\n    // but to tolerably coerce non-promises to promises.\n    if (value instanceof Promise) {\n        return value;\n    }\n\n    // assimilate thenables\n    if (isPromiseAlike(value)) {\n        return coerce(value);\n    } else {\n        return fulfill(value);\n    }\n}\nQ.resolve = Q;\n\n/**\n * Performs a task in a future turn of the event loop.\n * @param {Function} task\n */\nQ.nextTick = nextTick;\n\n/**\n * Controls whether or not long stack traces will be on\n */\nQ.longStackSupport = false;\n\n// enable long stacks if Q_DEBUG is set\nif (typeof process === \"object\" && process && process.env && process.env.Q_DEBUG) {\n    Q.longStackSupport = true;\n}\n\n/**\n * Constructs a {promise, resolve, reject} object.\n *\n * `resolve` is a callback to invoke with a more resolved value for the\n * promise. To fulfill the promise, invoke `resolve` with any value that is\n * not a thenable. To reject the promise, invoke `resolve` with a rejected\n * thenable, or invoke `reject` with the reason directly. To resolve the\n * promise to another thenable, thus putting it in the same state, invoke\n * `resolve` with that other thenable.\n */\nQ.defer = defer;\nfunction defer() {\n    // if \"messages\" is an \"Array\", that indicates that the promise has not yet\n    // been resolved.  If it is \"undefined\", it has been resolved.  Each\n    // element of the messages array is itself an array of complete arguments to\n    // forward to the resolved promise.  We coerce the resolution value to a\n    // promise using the `resolve` function because it handles both fully\n    // non-thenable values and other thenables gracefully.\n    var messages = [], progressListeners = [], resolvedPromise;\n\n    var deferred = object_create(defer.prototype);\n    var promise = object_create(Promise.prototype);\n\n    promise.promiseDispatch = function (resolve, op, operands) {\n        var args = array_slice(arguments);\n        if (messages) {\n            messages.push(args);\n            if (op === \"when\" && operands[1]) { // progress operand\n                progressListeners.push(operands[1]);\n            }\n        } else {\n            Q.nextTick(function () {\n                resolvedPromise.promiseDispatch.apply(resolvedPromise, args);\n            });\n        }\n    };\n\n    // XXX deprecated\n    promise.valueOf = function () {\n        if (messages) {\n            return promise;\n        }\n        var nearerValue = nearer(resolvedPromise);\n        if (isPromise(nearerValue)) {\n            resolvedPromise = nearerValue; // shorten chain\n        }\n        return nearerValue;\n    };\n\n    promise.inspect = function () {\n        if (!resolvedPromise) {\n            return { state: \"pending\" };\n        }\n        return resolvedPromise.inspect();\n    };\n\n    if (Q.longStackSupport && hasStacks) {\n        try {\n            throw new Error();\n        } catch (e) {\n            // NOTE: don't try to use `Error.captureStackTrace` or transfer the\n            // accessor around; that causes memory leaks as per GH-111. Just\n            // reify the stack trace as a string ASAP.\n            //\n            // At the same time, cut off the first line; it's always just\n            // \"[object Promise]\\n\", as per the `toString`.\n            promise.stack = e.stack.substring(e.stack.indexOf(\"\\n\") + 1);\n        }\n    }\n\n    // NOTE: we do the checks for `resolvedPromise` in each method, instead of\n    // consolidating them into `become`, since otherwise we'd create new\n    // promises with the lines `become(whatever(value))`. See e.g. GH-252.\n\n    function become(newPromise) {\n        resolvedPromise = newPromise;\n        promise.source = newPromise;\n\n        array_reduce(messages, function (undefined, message) {\n            Q.nextTick(function () {\n                newPromise.promiseDispatch.apply(newPromise, message);\n            });\n        }, void 0);\n\n        messages = void 0;\n        progressListeners = void 0;\n    }\n\n    deferred.promise = promise;\n    deferred.resolve = function (value) {\n        if (resolvedPromise) {\n            return;\n        }\n\n        become(Q(value));\n    };\n\n    deferred.fulfill = function (value) {\n        if (resolvedPromise) {\n            return;\n        }\n\n        become(fulfill(value));\n    };\n    deferred.reject = function (reason) {\n        if (resolvedPromise) {\n            return;\n        }\n\n        become(reject(reason));\n    };\n    deferred.notify = function (progress) {\n        if (resolvedPromise) {\n            return;\n        }\n\n        array_reduce(progressListeners, function (undefined, progressListener) {\n            Q.nextTick(function () {\n                progressListener(progress);\n            });\n        }, void 0);\n    };\n\n    return deferred;\n}\n\n/**\n * Creates a Node-style callback that will resolve or reject the deferred\n * promise.\n * @returns a nodeback\n */\ndefer.prototype.makeNodeResolver = function () {\n    var self = this;\n    return function (error, value) {\n        if (error) {\n            self.reject(error);\n        } else if (arguments.length > 2) {\n            self.resolve(array_slice(arguments, 1));\n        } else {\n            self.resolve(value);\n        }\n    };\n};\n\n/**\n * @param resolver {Function} a function that returns nothing and accepts\n * the resolve, reject, and notify functions for a deferred.\n * @returns a promise that may be resolved with the given resolve and reject\n * functions, or rejected by a thrown exception in resolver\n */\nQ.Promise = promise; // ES6\nQ.promise = promise;\nfunction promise(resolver) {\n    if (typeof resolver !== \"function\") {\n        throw new TypeError(\"resolver must be a function.\");\n    }\n    var deferred = defer();\n    try {\n        resolver(deferred.resolve, deferred.reject, deferred.notify);\n    } catch (reason) {\n        deferred.reject(reason);\n    }\n    return deferred.promise;\n}\n\npromise.race = race; // ES6\npromise.all = all; // ES6\npromise.reject = reject; // ES6\npromise.resolve = Q; // ES6\n\n// XXX experimental.  This method is a way to denote that a local value is\n// serializable and should be immediately dispatched to a remote upon request,\n// instead of passing a reference.\nQ.passByCopy = function (object) {\n    //freeze(object);\n    //passByCopies.set(object, true);\n    return object;\n};\n\nPromise.prototype.passByCopy = function () {\n    //freeze(object);\n    //passByCopies.set(object, true);\n    return this;\n};\n\n/**\n * If two promises eventually fulfill to the same value, promises that value,\n * but otherwise rejects.\n * @param x {Any*}\n * @param y {Any*}\n * @returns {Any*} a promise for x and y if they are the same, but a rejection\n * otherwise.\n *\n */\nQ.join = function (x, y) {\n    return Q(x).join(y);\n};\n\nPromise.prototype.join = function (that) {\n    return Q([this, that]).spread(function (x, y) {\n        if (x === y) {\n            // TODO: \"===\" should be Object.is or equiv\n            return x;\n        } else {\n            throw new Error(\"Can't join: not the same: \" + x + \" \" + y);\n        }\n    });\n};\n\n/**\n * Returns a promise for the first of an array of promises to become settled.\n * @param answers {Array[Any*]} promises to race\n * @returns {Any*} the first promise to be settled\n */\nQ.race = race;\nfunction race(answerPs) {\n    return promise(function (resolve, reject) {\n        // Switch to this once we can assume at least ES5\n        // answerPs.forEach(function (answerP) {\n        //     Q(answerP).then(resolve, reject);\n        // });\n        // Use this in the meantime\n        for (var i = 0, len = answerPs.length; i < len; i++) {\n            Q(answerPs[i]).then(resolve, reject);\n        }\n    });\n}\n\nPromise.prototype.race = function () {\n    return this.then(Q.race);\n};\n\n/**\n * Constructs a Promise with a promise descriptor object and optional fallback\n * function.  The descriptor contains methods like when(rejected), get(name),\n * set(name, value), post(name, args), and delete(name), which all\n * return either a value, a promise for a value, or a rejection.  The fallback\n * accepts the operation name, a resolver, and any further arguments that would\n * have been forwarded to the appropriate method above had a method been\n * provided with the proper name.  The API makes no guarantees about the nature\n * of the returned object, apart from that it is usable whereever promises are\n * bought and sold.\n */\nQ.makePromise = Promise;\nfunction Promise(descriptor, fallback, inspect) {\n    if (fallback === void 0) {\n        fallback = function (op) {\n            return reject(new Error(\n                \"Promise does not support operation: \" + op\n            ));\n        };\n    }\n    if (inspect === void 0) {\n        inspect = function () {\n            return {state: \"unknown\"};\n        };\n    }\n\n    var promise = object_create(Promise.prototype);\n\n    promise.promiseDispatch = function (resolve, op, args) {\n        var result;\n        try {\n            if (descriptor[op]) {\n                result = descriptor[op].apply(promise, args);\n            } else {\n                result = fallback.call(promise, op, args);\n            }\n        } catch (exception) {\n            result = reject(exception);\n        }\n        if (resolve) {\n            resolve(result);\n        }\n    };\n\n    promise.inspect = inspect;\n\n    // XXX deprecated `valueOf` and `exception` support\n    if (inspect) {\n        var inspected = inspect();\n        if (inspected.state === \"rejected\") {\n            promise.exception = inspected.reason;\n        }\n\n        promise.valueOf = function () {\n            var inspected = inspect();\n            if (inspected.state === \"pending\" ||\n                inspected.state === \"rejected\") {\n                return promise;\n            }\n            return inspected.value;\n        };\n    }\n\n    return promise;\n}\n\nPromise.prototype.toString = function () {\n    return \"[object Promise]\";\n};\n\nPromise.prototype.then = function (fulfilled, rejected, progressed) {\n    var self = this;\n    var deferred = defer();\n    var done = false;   // ensure the untrusted promise makes at most a\n                        // single call to one of the callbacks\n\n    function _fulfilled(value) {\n        try {\n            return typeof fulfilled === \"function\" ? fulfilled(value) : value;\n        } catch (exception) {\n            return reject(exception);\n        }\n    }\n\n    function _rejected(exception) {\n        if (typeof rejected === \"function\") {\n            makeStackTraceLong(exception, self);\n            try {\n                return rejected(exception);\n            } catch (newException) {\n                return reject(newException);\n            }\n        }\n        return reject(exception);\n    }\n\n    function _progressed(value) {\n        return typeof progressed === \"function\" ? progressed(value) : value;\n    }\n\n    Q.nextTick(function () {\n        self.promiseDispatch(function (value) {\n            if (done) {\n                return;\n            }\n            done = true;\n\n            deferred.resolve(_fulfilled(value));\n        }, \"when\", [function (exception) {\n            if (done) {\n                return;\n            }\n            done = true;\n\n            deferred.resolve(_rejected(exception));\n        }]);\n    });\n\n    // Progress propagator need to be attached in the current tick.\n    self.promiseDispatch(void 0, \"when\", [void 0, function (value) {\n        var newValue;\n        var threw = false;\n        try {\n            newValue = _progressed(value);\n        } catch (e) {\n            threw = true;\n            if (Q.onerror) {\n                Q.onerror(e);\n            } else {\n                throw e;\n            }\n        }\n\n        if (!threw) {\n            deferred.notify(newValue);\n        }\n    }]);\n\n    return deferred.promise;\n};\n\nQ.tap = function (promise, callback) {\n    return Q(promise).tap(callback);\n};\n\n/**\n * Works almost like \"finally\", but not called for rejections.\n * Original resolution value is passed through callback unaffected.\n * Callback may return a promise that will be awaited for.\n * @param {Function} callback\n * @returns {Q.Promise}\n * @example\n * doSomething()\n *   .then(...)\n *   .tap(console.log)\n *   .then(...);\n */\nPromise.prototype.tap = function (callback) {\n    callback = Q(callback);\n\n    return this.then(function (value) {\n        return callback.fcall(value).thenResolve(value);\n    });\n};\n\n/**\n * Registers an observer on a promise.\n *\n * Guarantees:\n *\n * 1. that fulfilled and rejected will be called only once.\n * 2. that either the fulfilled callback or the rejected callback will be\n *    called, but not both.\n * 3. that fulfilled and rejected will not be called in this turn.\n *\n * @param value      promise or immediate reference to observe\n * @param fulfilled  function to be called with the fulfilled value\n * @param rejected   function to be called with the rejection exception\n * @param progressed function to be called on any progress notifications\n * @return promise for the return value from the invoked callback\n */\nQ.when = when;\nfunction when(value, fulfilled, rejected, progressed) {\n    return Q(value).then(fulfilled, rejected, progressed);\n}\n\nPromise.prototype.thenResolve = function (value) {\n    return this.then(function () { return value; });\n};\n\nQ.thenResolve = function (promise, value) {\n    return Q(promise).thenResolve(value);\n};\n\nPromise.prototype.thenReject = function (reason) {\n    return this.then(function () { throw reason; });\n};\n\nQ.thenReject = function (promise, reason) {\n    return Q(promise).thenReject(reason);\n};\n\n/**\n * If an object is not a promise, it is as \"near\" as possible.\n * If a promise is rejected, it is as \"near\" as possible too.\n * If it’s a fulfilled promise, the fulfillment value is nearer.\n * If it’s a deferred promise and the deferred has been resolved, the\n * resolution is \"nearer\".\n * @param object\n * @returns most resolved (nearest) form of the object\n */\n\n// XXX should we re-do this?\nQ.nearer = nearer;\nfunction nearer(value) {\n    if (isPromise(value)) {\n        var inspected = value.inspect();\n        if (inspected.state === \"fulfilled\") {\n            return inspected.value;\n        }\n    }\n    return value;\n}\n\n/**\n * @returns whether the given object is a promise.\n * Otherwise it is a fulfilled value.\n */\nQ.isPromise = isPromise;\nfunction isPromise(object) {\n    return object instanceof Promise;\n}\n\nQ.isPromiseAlike = isPromiseAlike;\nfunction isPromiseAlike(object) {\n    return isObject(object) && typeof object.then === \"function\";\n}\n\n/**\n * @returns whether the given object is a pending promise, meaning not\n * fulfilled or rejected.\n */\nQ.isPending = isPending;\nfunction isPending(object) {\n    return isPromise(object) && object.inspect().state === \"pending\";\n}\n\nPromise.prototype.isPending = function () {\n    return this.inspect().state === \"pending\";\n};\n\n/**\n * @returns whether the given object is a value or fulfilled\n * promise.\n */\nQ.isFulfilled = isFulfilled;\nfunction isFulfilled(object) {\n    return !isPromise(object) || object.inspect().state === \"fulfilled\";\n}\n\nPromise.prototype.isFulfilled = function () {\n    return this.inspect().state === \"fulfilled\";\n};\n\n/**\n * @returns whether the given object is a rejected promise.\n */\nQ.isRejected = isRejected;\nfunction isRejected(object) {\n    return isPromise(object) && object.inspect().state === \"rejected\";\n}\n\nPromise.prototype.isRejected = function () {\n    return this.inspect().state === \"rejected\";\n};\n\n//// BEGIN UNHANDLED REJECTION TRACKING\n\n// This promise library consumes exceptions thrown in handlers so they can be\n// handled by a subsequent promise.  The exceptions get added to this array when\n// they are created, and removed when they are handled.  Note that in ES6 or\n// shimmed environments, this would naturally be a `Set`.\nvar unhandledReasons = [];\nvar unhandledRejections = [];\nvar reportedUnhandledRejections = [];\nvar trackUnhandledRejections = true;\n\nfunction resetUnhandledRejections() {\n    unhandledReasons.length = 0;\n    unhandledRejections.length = 0;\n\n    if (!trackUnhandledRejections) {\n        trackUnhandledRejections = true;\n    }\n}\n\nfunction trackRejection(promise, reason) {\n    if (!trackUnhandledRejections) {\n        return;\n    }\n    if (typeof process === \"object\" && typeof process.emit === \"function\") {\n        Q.nextTick.runAfter(function () {\n            if (array_indexOf(unhandledRejections, promise) !== -1) {\n                process.emit(\"unhandledRejection\", reason, promise);\n                reportedUnhandledRejections.push(promise);\n            }\n        });\n    }\n\n    unhandledRejections.push(promise);\n    if (reason && typeof reason.stack !== \"undefined\") {\n        unhandledReasons.push(reason.stack);\n    } else {\n        unhandledReasons.push(\"(no stack) \" + reason);\n    }\n}\n\nfunction untrackRejection(promise) {\n    if (!trackUnhandledRejections) {\n        return;\n    }\n\n    var at = array_indexOf(unhandledRejections, promise);\n    if (at !== -1) {\n        if (typeof process === \"object\" && typeof process.emit === \"function\") {\n            Q.nextTick.runAfter(function () {\n                var atReport = array_indexOf(reportedUnhandledRejections, promise);\n                if (atReport !== -1) {\n                    process.emit(\"rejectionHandled\", unhandledReasons[at], promise);\n                    reportedUnhandledRejections.splice(atReport, 1);\n                }\n            });\n        }\n        unhandledRejections.splice(at, 1);\n        unhandledReasons.splice(at, 1);\n    }\n}\n\nQ.resetUnhandledRejections = resetUnhandledRejections;\n\nQ.getUnhandledReasons = function () {\n    // Make a copy so that consumers can't interfere with our internal state.\n    return unhandledReasons.slice();\n};\n\nQ.stopUnhandledRejectionTracking = function () {\n    resetUnhandledRejections();\n    trackUnhandledRejections = false;\n};\n\nresetUnhandledRejections();\n\n//// END UNHANDLED REJECTION TRACKING\n\n/**\n * Constructs a rejected promise.\n * @param reason value describing the failure\n */\nQ.reject = reject;\nfunction reject(reason) {\n    var rejection = Promise({\n        \"when\": function (rejected) {\n            // note that the error has been handled\n            if (rejected) {\n                untrackRejection(this);\n            }\n            return rejected ? rejected(reason) : this;\n        }\n    }, function fallback() {\n        return this;\n    }, function inspect() {\n        return { state: \"rejected\", reason: reason };\n    });\n\n    // Note that the reason has not been handled.\n    trackRejection(rejection, reason);\n\n    return rejection;\n}\n\n/**\n * Constructs a fulfilled promise for an immediate reference.\n * @param value immediate reference\n */\nQ.fulfill = fulfill;\nfunction fulfill(value) {\n    return Promise({\n        \"when\": function () {\n            return value;\n        },\n        \"get\": function (name) {\n            return value[name];\n        },\n        \"set\": function (name, rhs) {\n            value[name] = rhs;\n        },\n        \"delete\": function (name) {\n            delete value[name];\n        },\n        \"post\": function (name, args) {\n            // Mark Miller proposes that post with no name should apply a\n            // promised function.\n            if (name === null || name === void 0) {\n                return value.apply(void 0, args);\n            } else {\n                return value[name].apply(value, args);\n            }\n        },\n        \"apply\": function (thisp, args) {\n            return value.apply(thisp, args);\n        },\n        \"keys\": function () {\n            return object_keys(value);\n        }\n    }, void 0, function inspect() {\n        return { state: \"fulfilled\", value: value };\n    });\n}\n\n/**\n * Converts thenables to Q promises.\n * @param promise thenable promise\n * @returns a Q promise\n */\nfunction coerce(promise) {\n    var deferred = defer();\n    Q.nextTick(function () {\n        try {\n            promise.then(deferred.resolve, deferred.reject, deferred.notify);\n        } catch (exception) {\n            deferred.reject(exception);\n        }\n    });\n    return deferred.promise;\n}\n\n/**\n * Annotates an object such that it will never be\n * transferred away from this process over any promise\n * communication channel.\n * @param object\n * @returns promise a wrapping of that object that\n * additionally responds to the \"isDef\" message\n * without a rejection.\n */\nQ.master = master;\nfunction master(object) {\n    return Promise({\n        \"isDef\": function () {}\n    }, function fallback(op, args) {\n        return dispatch(object, op, args);\n    }, function () {\n        return Q(object).inspect();\n    });\n}\n\n/**\n * Spreads the values of a promised array of arguments into the\n * fulfillment callback.\n * @param fulfilled callback that receives variadic arguments from the\n * promised array\n * @param rejected callback that receives the exception if the promise\n * is rejected.\n * @returns a promise for the return value or thrown exception of\n * either callback.\n */\nQ.spread = spread;\nfunction spread(value, fulfilled, rejected) {\n    return Q(value).spread(fulfilled, rejected);\n}\n\nPromise.prototype.spread = function (fulfilled, rejected) {\n    return this.all().then(function (array) {\n        return fulfilled.apply(void 0, array);\n    }, rejected);\n};\n\n/**\n * The async function is a decorator for generator functions, turning\n * them into asynchronous generators.  Although generators are only part\n * of the newest ECMAScript 6 drafts, this code does not cause syntax\n * errors in older engines.  This code should continue to work and will\n * in fact improve over time as the language improves.\n *\n * ES6 generators are currently part of V8 version 3.19 with the\n * --harmony-generators runtime flag enabled.  SpiderMonkey has had them\n * for longer, but under an older Python-inspired form.  This function\n * works on both kinds of generators.\n *\n * Decorates a generator function such that:\n *  - it may yield promises\n *  - execution will continue when that promise is fulfilled\n *  - the value of the yield expression will be the fulfilled value\n *  - it returns a promise for the return value (when the generator\n *    stops iterating)\n *  - the decorated function returns a promise for the return value\n *    of the generator or the first rejected promise among those\n *    yielded.\n *  - if an error is thrown in the generator, it propagates through\n *    every following yield until it is caught, or until it escapes\n *    the generator function altogether, and is translated into a\n *    rejection for the promise returned by the decorated generator.\n */\nQ.async = async;\nfunction async(makeGenerator) {\n    return function () {\n        // when verb is \"send\", arg is a value\n        // when verb is \"throw\", arg is an exception\n        function continuer(verb, arg) {\n            var result;\n\n            // Until V8 3.19 / Chromium 29 is released, SpiderMonkey is the only\n            // engine that has a deployed base of browsers that support generators.\n            // However, SM's generators use the Python-inspired semantics of\n            // outdated ES6 drafts.  We would like to support ES6, but we'd also\n            // like to make it possible to use generators in deployed browsers, so\n            // we also support Python-style generators.  At some point we can remove\n            // this block.\n\n            if (typeof StopIteration === \"undefined\") {\n                // ES6 Generators\n                try {\n                    result = generator[verb](arg);\n                } catch (exception) {\n                    return reject(exception);\n                }\n                if (result.done) {\n                    return Q(result.value);\n                } else {\n                    return when(result.value, callback, errback);\n                }\n            } else {\n                // SpiderMonkey Generators\n                // FIXME: Remove this case when SM does ES6 generators.\n                try {\n                    result = generator[verb](arg);\n                } catch (exception) {\n                    if (isStopIteration(exception)) {\n                        return Q(exception.value);\n                    } else {\n                        return reject(exception);\n                    }\n                }\n                return when(result, callback, errback);\n            }\n        }\n        var generator = makeGenerator.apply(this, arguments);\n        var callback = continuer.bind(continuer, \"next\");\n        var errback = continuer.bind(continuer, \"throw\");\n        return callback();\n    };\n}\n\n/**\n * The spawn function is a small wrapper around async that immediately\n * calls the generator and also ends the promise chain, so that any\n * unhandled errors are thrown instead of forwarded to the error\n * handler. This is useful because it's extremely common to run\n * generators at the top-level to work with libraries.\n */\nQ.spawn = spawn;\nfunction spawn(makeGenerator) {\n    Q.done(Q.async(makeGenerator)());\n}\n\n// FIXME: Remove this interface once ES6 generators are in SpiderMonkey.\n/**\n * Throws a ReturnValue exception to stop an asynchronous generator.\n *\n * This interface is a stop-gap measure to support generator return\n * values in older Firefox/SpiderMonkey.  In browsers that support ES6\n * generators like Chromium 29, just use \"return\" in your generator\n * functions.\n *\n * @param value the return value for the surrounding generator\n * @throws ReturnValue exception with the value.\n * @example\n * // ES6 style\n * Q.async(function* () {\n *      var foo = yield getFooPromise();\n *      var bar = yield getBarPromise();\n *      return foo + bar;\n * })\n * // Older SpiderMonkey style\n * Q.async(function () {\n *      var foo = yield getFooPromise();\n *      var bar = yield getBarPromise();\n *      Q.return(foo + bar);\n * })\n */\nQ[\"return\"] = _return;\nfunction _return(value) {\n    throw new QReturnValue(value);\n}\n\n/**\n * The promised function decorator ensures that any promise arguments\n * are settled and passed as values (`this` is also settled and passed\n * as a value).  It will also ensure that the result of a function is\n * always a promise.\n *\n * @example\n * var add = Q.promised(function (a, b) {\n *     return a + b;\n * });\n * add(Q(a), Q(B));\n *\n * @param {function} callback The function to decorate\n * @returns {function} a function that has been decorated.\n */\nQ.promised = promised;\nfunction promised(callback) {\n    return function () {\n        return spread([this, all(arguments)], function (self, args) {\n            return callback.apply(self, args);\n        });\n    };\n}\n\n/**\n * sends a message to a value in a future turn\n * @param object* the recipient\n * @param op the name of the message operation, e.g., \"when\",\n * @param args further arguments to be forwarded to the operation\n * @returns result {Promise} a promise for the result of the operation\n */\nQ.dispatch = dispatch;\nfunction dispatch(object, op, args) {\n    return Q(object).dispatch(op, args);\n}\n\nPromise.prototype.dispatch = function (op, args) {\n    var self = this;\n    var deferred = defer();\n    Q.nextTick(function () {\n        self.promiseDispatch(deferred.resolve, op, args);\n    });\n    return deferred.promise;\n};\n\n/**\n * Gets the value of a property in a future turn.\n * @param object    promise or immediate reference for target object\n * @param name      name of property to get\n * @return promise for the property value\n */\nQ.get = function (object, key) {\n    return Q(object).dispatch(\"get\", [key]);\n};\n\nPromise.prototype.get = function (key) {\n    return this.dispatch(\"get\", [key]);\n};\n\n/**\n * Sets the value of a property in a future turn.\n * @param object    promise or immediate reference for object object\n * @param name      name of property to set\n * @param value     new value of property\n * @return promise for the return value\n */\nQ.set = function (object, key, value) {\n    return Q(object).dispatch(\"set\", [key, value]);\n};\n\nPromise.prototype.set = function (key, value) {\n    return this.dispatch(\"set\", [key, value]);\n};\n\n/**\n * Deletes a property in a future turn.\n * @param object    promise or immediate reference for target object\n * @param name      name of property to delete\n * @return promise for the return value\n */\nQ.del = // XXX legacy\nQ[\"delete\"] = function (object, key) {\n    return Q(object).dispatch(\"delete\", [key]);\n};\n\nPromise.prototype.del = // XXX legacy\nPromise.prototype[\"delete\"] = function (key) {\n    return this.dispatch(\"delete\", [key]);\n};\n\n/**\n * Invokes a method in a future turn.\n * @param object    promise or immediate reference for target object\n * @param name      name of method to invoke\n * @param value     a value to post, typically an array of\n *                  invocation arguments for promises that\n *                  are ultimately backed with `resolve` values,\n *                  as opposed to those backed with URLs\n *                  wherein the posted value can be any\n *                  JSON serializable object.\n * @return promise for the return value\n */\n// bound locally because it is used by other methods\nQ.mapply = // XXX As proposed by \"Redsandro\"\nQ.post = function (object, name, args) {\n    return Q(object).dispatch(\"post\", [name, args]);\n};\n\nPromise.prototype.mapply = // XXX As proposed by \"Redsandro\"\nPromise.prototype.post = function (name, args) {\n    return this.dispatch(\"post\", [name, args]);\n};\n\n/**\n * Invokes a method in a future turn.\n * @param object    promise or immediate reference for target object\n * @param name      name of method to invoke\n * @param ...args   array of invocation arguments\n * @return promise for the return value\n */\nQ.send = // XXX Mark Miller's proposed parlance\nQ.mcall = // XXX As proposed by \"Redsandro\"\nQ.invoke = function (object, name /*...args*/) {\n    return Q(object).dispatch(\"post\", [name, array_slice(arguments, 2)]);\n};\n\nPromise.prototype.send = // XXX Mark Miller's proposed parlance\nPromise.prototype.mcall = // XXX As proposed by \"Redsandro\"\nPromise.prototype.invoke = function (name /*...args*/) {\n    return this.dispatch(\"post\", [name, array_slice(arguments, 1)]);\n};\n\n/**\n * Applies the promised function in a future turn.\n * @param object    promise or immediate reference for target function\n * @param args      array of application arguments\n */\nQ.fapply = function (object, args) {\n    return Q(object).dispatch(\"apply\", [void 0, args]);\n};\n\nPromise.prototype.fapply = function (args) {\n    return this.dispatch(\"apply\", [void 0, args]);\n};\n\n/**\n * Calls the promised function in a future turn.\n * @param object    promise or immediate reference for target function\n * @param ...args   array of application arguments\n */\nQ[\"try\"] =\nQ.fcall = function (object /* ...args*/) {\n    return Q(object).dispatch(\"apply\", [void 0, array_slice(arguments, 1)]);\n};\n\nPromise.prototype.fcall = function (/*...args*/) {\n    return this.dispatch(\"apply\", [void 0, array_slice(arguments)]);\n};\n\n/**\n * Binds the promised function, transforming return values into a fulfilled\n * promise and thrown errors into a rejected one.\n * @param object    promise or immediate reference for target function\n * @param ...args   array of application arguments\n */\nQ.fbind = function (object /*...args*/) {\n    var promise = Q(object);\n    var args = array_slice(arguments, 1);\n    return function fbound() {\n        return promise.dispatch(\"apply\", [\n            this,\n            args.concat(array_slice(arguments))\n        ]);\n    };\n};\nPromise.prototype.fbind = function (/*...args*/) {\n    var promise = this;\n    var args = array_slice(arguments);\n    return function fbound() {\n        return promise.dispatch(\"apply\", [\n            this,\n            args.concat(array_slice(arguments))\n        ]);\n    };\n};\n\n/**\n * Requests the names of the owned properties of a promised\n * object in a future turn.\n * @param object    promise or immediate reference for target object\n * @return promise for the keys of the eventually settled object\n */\nQ.keys = function (object) {\n    return Q(object).dispatch(\"keys\", []);\n};\n\nPromise.prototype.keys = function () {\n    return this.dispatch(\"keys\", []);\n};\n\n/**\n * Turns an array of promises into a promise for an array.  If any of\n * the promises gets rejected, the whole array is rejected immediately.\n * @param {Array*} an array (or promise for an array) of values (or\n * promises for values)\n * @returns a promise for an array of the corresponding values\n */\n// By Mark Miller\n// http://wiki.ecmascript.org/doku.php?id=strawman:concurrency&rev=1308776521#allfulfilled\nQ.all = all;\nfunction all(promises) {\n    return when(promises, function (promises) {\n        var pendingCount = 0;\n        var deferred = defer();\n        array_reduce(promises, function (undefined, promise, index) {\n            var snapshot;\n            if (\n                isPromise(promise) &&\n                (snapshot = promise.inspect()).state === \"fulfilled\"\n            ) {\n                promises[index] = snapshot.value;\n            } else {\n                ++pendingCount;\n                when(\n                    promise,\n                    function (value) {\n                        promises[index] = value;\n                        if (--pendingCount === 0) {\n                            deferred.resolve(promises);\n                        }\n                    },\n                    deferred.reject,\n                    function (progress) {\n                        deferred.notify({ index: index, value: progress });\n                    }\n                );\n            }\n        }, void 0);\n        if (pendingCount === 0) {\n            deferred.resolve(promises);\n        }\n        return deferred.promise;\n    });\n}\n\nPromise.prototype.all = function () {\n    return all(this);\n};\n\n/**\n * Returns the first resolved promise of an array. Prior rejected promises are\n * ignored.  Rejects only if all promises are rejected.\n * @param {Array*} an array containing values or promises for values\n * @returns a promise fulfilled with the value of the first resolved promise,\n * or a rejected promise if all promises are rejected.\n */\nQ.any = any;\n\nfunction any(promises) {\n    if (promises.length === 0) {\n        return Q.resolve();\n    }\n\n    var deferred = Q.defer();\n    var pendingCount = 0;\n    array_reduce(promises, function (prev, current, index) {\n        var promise = promises[index];\n\n        pendingCount++;\n\n        when(promise, onFulfilled, onRejected, onProgress);\n        function onFulfilled(result) {\n            deferred.resolve(result);\n        }\n        function onRejected() {\n            pendingCount--;\n            if (pendingCount === 0) {\n                deferred.reject(new Error(\n                    \"Can't get fulfillment value from any promise, all \" +\n                    \"promises were rejected.\"\n                ));\n            }\n        }\n        function onProgress(progress) {\n            deferred.notify({\n                index: index,\n                value: progress\n            });\n        }\n    }, undefined);\n\n    return deferred.promise;\n}\n\nPromise.prototype.any = function () {\n    return any(this);\n};\n\n/**\n * Waits for all promises to be settled, either fulfilled or\n * rejected.  This is distinct from `all` since that would stop\n * waiting at the first rejection.  The promise returned by\n * `allResolved` will never be rejected.\n * @param promises a promise for an array (or an array) of promises\n * (or values)\n * @return a promise for an array of promises\n */\nQ.allResolved = deprecate(allResolved, \"allResolved\", \"allSettled\");\nfunction allResolved(promises) {\n    return when(promises, function (promises) {\n        promises = array_map(promises, Q);\n        return when(all(array_map(promises, function (promise) {\n            return when(promise, noop, noop);\n        })), function () {\n            return promises;\n        });\n    });\n}\n\nPromise.prototype.allResolved = function () {\n    return allResolved(this);\n};\n\n/**\n * @see Promise#allSettled\n */\nQ.allSettled = allSettled;\nfunction allSettled(promises) {\n    return Q(promises).allSettled();\n}\n\n/**\n * Turns an array of promises into a promise for an array of their states (as\n * returned by `inspect`) when they have all settled.\n * @param {Array[Any*]} values an array (or promise for an array) of values (or\n * promises for values)\n * @returns {Array[State]} an array of states for the respective values.\n */\nPromise.prototype.allSettled = function () {\n    return this.then(function (promises) {\n        return all(array_map(promises, function (promise) {\n            promise = Q(promise);\n            function regardless() {\n                return promise.inspect();\n            }\n            return promise.then(regardless, regardless);\n        }));\n    });\n};\n\n/**\n * Captures the failure of a promise, giving an oportunity to recover\n * with a callback.  If the given promise is fulfilled, the returned\n * promise is fulfilled.\n * @param {Any*} promise for something\n * @param {Function} callback to fulfill the returned promise if the\n * given promise is rejected\n * @returns a promise for the return value of the callback\n */\nQ.fail = // XXX legacy\nQ[\"catch\"] = function (object, rejected) {\n    return Q(object).then(void 0, rejected);\n};\n\nPromise.prototype.fail = // XXX legacy\nPromise.prototype[\"catch\"] = function (rejected) {\n    return this.then(void 0, rejected);\n};\n\n/**\n * Attaches a listener that can respond to progress notifications from a\n * promise's originating deferred. This listener receives the exact arguments\n * passed to ``deferred.notify``.\n * @param {Any*} promise for something\n * @param {Function} callback to receive any progress notifications\n * @returns the given promise, unchanged\n */\nQ.progress = progress;\nfunction progress(object, progressed) {\n    return Q(object).then(void 0, void 0, progressed);\n}\n\nPromise.prototype.progress = function (progressed) {\n    return this.then(void 0, void 0, progressed);\n};\n\n/**\n * Provides an opportunity to observe the settling of a promise,\n * regardless of whether the promise is fulfilled or rejected.  Forwards\n * the resolution to the returned promise when the callback is done.\n * The callback can return a promise to defer completion.\n * @param {Any*} promise\n * @param {Function} callback to observe the resolution of the given\n * promise, takes no arguments.\n * @returns a promise for the resolution of the given promise when\n * ``fin`` is done.\n */\nQ.fin = // XXX legacy\nQ[\"finally\"] = function (object, callback) {\n    return Q(object)[\"finally\"](callback);\n};\n\nPromise.prototype.fin = // XXX legacy\nPromise.prototype[\"finally\"] = function (callback) {\n    callback = Q(callback);\n    return this.then(function (value) {\n        return callback.fcall().then(function () {\n            return value;\n        });\n    }, function (reason) {\n        // TODO attempt to recycle the rejection with \"this\".\n        return callback.fcall().then(function () {\n            throw reason;\n        });\n    });\n};\n\n/**\n * Terminates a chain of promises, forcing rejections to be\n * thrown as exceptions.\n * @param {Any*} promise at the end of a chain of promises\n * @returns nothing\n */\nQ.done = function (object, fulfilled, rejected, progress) {\n    return Q(object).done(fulfilled, rejected, progress);\n};\n\nPromise.prototype.done = function (fulfilled, rejected, progress) {\n    var onUnhandledError = function (error) {\n        // forward to a future turn so that ``when``\n        // does not catch it and turn it into a rejection.\n        Q.nextTick(function () {\n            makeStackTraceLong(error, promise);\n            if (Q.onerror) {\n                Q.onerror(error);\n            } else {\n                throw error;\n            }\n        });\n    };\n\n    // Avoid unnecessary `nextTick`ing via an unnecessary `when`.\n    var promise = fulfilled || rejected || progress ?\n        this.then(fulfilled, rejected, progress) :\n        this;\n\n    if (typeof process === \"object\" && process && process.domain) {\n        onUnhandledError = process.domain.bind(onUnhandledError);\n    }\n\n    promise.then(void 0, onUnhandledError);\n};\n\n/**\n * Causes a promise to be rejected if it does not get fulfilled before\n * some milliseconds time out.\n * @param {Any*} promise\n * @param {Number} milliseconds timeout\n * @param {Any*} custom error message or Error object (optional)\n * @returns a promise for the resolution of the given promise if it is\n * fulfilled before the timeout, otherwise rejected.\n */\nQ.timeout = function (object, ms, error) {\n    return Q(object).timeout(ms, error);\n};\n\nPromise.prototype.timeout = function (ms, error) {\n    var deferred = defer();\n    var timeoutId = setTimeout(function () {\n        if (!error || \"string\" === typeof error) {\n            error = new Error(error || \"Timed out after \" + ms + \" ms\");\n            error.code = \"ETIMEDOUT\";\n        }\n        deferred.reject(error);\n    }, ms);\n\n    this.then(function (value) {\n        clearTimeout(timeoutId);\n        deferred.resolve(value);\n    }, function (exception) {\n        clearTimeout(timeoutId);\n        deferred.reject(exception);\n    }, deferred.notify);\n\n    return deferred.promise;\n};\n\n/**\n * Returns a promise for the given value (or promised value), some\n * milliseconds after it resolved. Passes rejections immediately.\n * @param {Any*} promise\n * @param {Number} milliseconds\n * @returns a promise for the resolution of the given promise after milliseconds\n * time has elapsed since the resolution of the given promise.\n * If the given promise rejects, that is passed immediately.\n */\nQ.delay = function (object, timeout) {\n    if (timeout === void 0) {\n        timeout = object;\n        object = void 0;\n    }\n    return Q(object).delay(timeout);\n};\n\nPromise.prototype.delay = function (timeout) {\n    return this.then(function (value) {\n        var deferred = defer();\n        setTimeout(function () {\n            deferred.resolve(value);\n        }, timeout);\n        return deferred.promise;\n    });\n};\n\n/**\n * Passes a continuation to a Node function, which is called with the given\n * arguments provided as an array, and returns a promise.\n *\n *      Q.nfapply(FS.readFile, [__filename])\n *      .then(function (content) {\n *      })\n *\n */\nQ.nfapply = function (callback, args) {\n    return Q(callback).nfapply(args);\n};\n\nPromise.prototype.nfapply = function (args) {\n    var deferred = defer();\n    var nodeArgs = array_slice(args);\n    nodeArgs.push(deferred.makeNodeResolver());\n    this.fapply(nodeArgs).fail(deferred.reject);\n    return deferred.promise;\n};\n\n/**\n * Passes a continuation to a Node function, which is called with the given\n * arguments provided individually, and returns a promise.\n * @example\n * Q.nfcall(FS.readFile, __filename)\n * .then(function (content) {\n * })\n *\n */\nQ.nfcall = function (callback /*...args*/) {\n    var args = array_slice(arguments, 1);\n    return Q(callback).nfapply(args);\n};\n\nPromise.prototype.nfcall = function (/*...args*/) {\n    var nodeArgs = array_slice(arguments);\n    var deferred = defer();\n    nodeArgs.push(deferred.makeNodeResolver());\n    this.fapply(nodeArgs).fail(deferred.reject);\n    return deferred.promise;\n};\n\n/**\n * Wraps a NodeJS continuation passing function and returns an equivalent\n * version that returns a promise.\n * @example\n * Q.nfbind(FS.readFile, __filename)(\"utf-8\")\n * .then(console.log)\n * .done()\n */\nQ.nfbind =\nQ.denodeify = function (callback /*...args*/) {\n    var baseArgs = array_slice(arguments, 1);\n    return function () {\n        var nodeArgs = baseArgs.concat(array_slice(arguments));\n        var deferred = defer();\n        nodeArgs.push(deferred.makeNodeResolver());\n        Q(callback).fapply(nodeArgs).fail(deferred.reject);\n        return deferred.promise;\n    };\n};\n\nPromise.prototype.nfbind =\nPromise.prototype.denodeify = function (/*...args*/) {\n    var args = array_slice(arguments);\n    args.unshift(this);\n    return Q.denodeify.apply(void 0, args);\n};\n\nQ.nbind = function (callback, thisp /*...args*/) {\n    var baseArgs = array_slice(arguments, 2);\n    return function () {\n        var nodeArgs = baseArgs.concat(array_slice(arguments));\n        var deferred = defer();\n        nodeArgs.push(deferred.makeNodeResolver());\n        function bound() {\n            return callback.apply(thisp, arguments);\n        }\n        Q(bound).fapply(nodeArgs).fail(deferred.reject);\n        return deferred.promise;\n    };\n};\n\nPromise.prototype.nbind = function (/*thisp, ...args*/) {\n    var args = array_slice(arguments, 0);\n    args.unshift(this);\n    return Q.nbind.apply(void 0, args);\n};\n\n/**\n * Calls a method of a Node-style object that accepts a Node-style\n * callback with a given array of arguments, plus a provided callback.\n * @param object an object that has the named method\n * @param {String} name name of the method of object\n * @param {Array} args arguments to pass to the method; the callback\n * will be provided by Q and appended to these arguments.\n * @returns a promise for the value or error\n */\nQ.nmapply = // XXX As proposed by \"Redsandro\"\nQ.npost = function (object, name, args) {\n    return Q(object).npost(name, args);\n};\n\nPromise.prototype.nmapply = // XXX As proposed by \"Redsandro\"\nPromise.prototype.npost = function (name, args) {\n    var nodeArgs = array_slice(args || []);\n    var deferred = defer();\n    nodeArgs.push(deferred.makeNodeResolver());\n    this.dispatch(\"post\", [name, nodeArgs]).fail(deferred.reject);\n    return deferred.promise;\n};\n\n/**\n * Calls a method of a Node-style object that accepts a Node-style\n * callback, forwarding the given variadic arguments, plus a provided\n * callback argument.\n * @param object an object that has the named method\n * @param {String} name name of the method of object\n * @param ...args arguments to pass to the method; the callback will\n * be provided by Q and appended to these arguments.\n * @returns a promise for the value or error\n */\nQ.nsend = // XXX Based on Mark Miller's proposed \"send\"\nQ.nmcall = // XXX Based on \"Redsandro's\" proposal\nQ.ninvoke = function (object, name /*...args*/) {\n    var nodeArgs = array_slice(arguments, 2);\n    var deferred = defer();\n    nodeArgs.push(deferred.makeNodeResolver());\n    Q(object).dispatch(\"post\", [name, nodeArgs]).fail(deferred.reject);\n    return deferred.promise;\n};\n\nPromise.prototype.nsend = // XXX Based on Mark Miller's proposed \"send\"\nPromise.prototype.nmcall = // XXX Based on \"Redsandro's\" proposal\nPromise.prototype.ninvoke = function (name /*...args*/) {\n    var nodeArgs = array_slice(arguments, 1);\n    var deferred = defer();\n    nodeArgs.push(deferred.makeNodeResolver());\n    this.dispatch(\"post\", [name, nodeArgs]).fail(deferred.reject);\n    return deferred.promise;\n};\n\n/**\n * If a function would like to support both Node continuation-passing-style and\n * promise-returning-style, it can end its internal promise chain with\n * `nodeify(nodeback)`, forwarding the optional nodeback argument.  If the user\n * elects to use a nodeback, the result will be sent there.  If they do not\n * pass a nodeback, they will receive the result promise.\n * @param object a result (or a promise for a result)\n * @param {Function} nodeback a Node.js-style callback\n * @returns either the promise or nothing\n */\nQ.nodeify = nodeify;\nfunction nodeify(object, nodeback) {\n    return Q(object).nodeify(nodeback);\n}\n\nPromise.prototype.nodeify = function (nodeback) {\n    if (nodeback) {\n        this.then(function (value) {\n            Q.nextTick(function () {\n                nodeback(null, value);\n            });\n        }, function (error) {\n            Q.nextTick(function () {\n                nodeback(error);\n            });\n        });\n    } else {\n        return this;\n    }\n};\n\nQ.noConflict = function() {\n    throw new Error(\"Q.noConflict only works when Q is used as a global\");\n};\n\n// All code before this point will be filtered from stack traces.\nvar qEndingLine = captureLine();\n\nreturn Q;\n\n});\n\n}).call(this,require('_process'))\n\n},{\"_process\":12}],158:[function(require,module,exports){\n/**\n * Root reference for iframes.\n */\n\nvar root;\nif (typeof window !== 'undefined') { // Browser window\n  root = window;\n} else if (typeof self !== 'undefined') { // Web Worker\n  root = self;\n} else { // Other environments\n  console.warn(\"Using browser-only version of superagent in non-browser environment\");\n  root = this;\n}\n\nvar Emitter = require('emitter');\nvar requestBase = require('./request-base');\nvar isObject = require('./is-object');\n\n/**\n * Noop.\n */\n\nfunction noop(){};\n\n/**\n * Expose `request`.\n */\n\nvar request = module.exports = require('./request').bind(null, Request);\n\n/**\n * Determine XHR.\n */\n\nrequest.getXHR = function () {\n  if (root.XMLHttpRequest\n      && (!root.location || 'file:' != root.location.protocol\n          || !root.ActiveXObject)) {\n    return new XMLHttpRequest;\n  } else {\n    try { return new ActiveXObject('Microsoft.XMLHTTP'); } catch(e) {}\n    try { return new ActiveXObject('Msxml2.XMLHTTP.6.0'); } catch(e) {}\n    try { return new ActiveXObject('Msxml2.XMLHTTP.3.0'); } catch(e) {}\n    try { return new ActiveXObject('Msxml2.XMLHTTP'); } catch(e) {}\n  }\n  throw Error(\"Browser-only verison of superagent could not find XHR\");\n};\n\n/**\n * Removes leading and trailing whitespace, added to support IE.\n *\n * @param {String} s\n * @return {String}\n * @api private\n */\n\nvar trim = ''.trim\n  ? function(s) { return s.trim(); }\n  : function(s) { return s.replace(/(^\\s*|\\s*$)/g, ''); };\n\n/**\n * Serialize the given `obj`.\n *\n * @param {Object} obj\n * @return {String}\n * @api private\n */\n\nfunction serialize(obj) {\n  if (!isObject(obj)) return obj;\n  var pairs = [];\n  for (var key in obj) {\n    pushEncodedKeyValuePair(pairs, key, obj[key]);\n  }\n  return pairs.join('&');\n}\n\n/**\n * Helps 'serialize' with serializing arrays.\n * Mutates the pairs array.\n *\n * @param {Array} pairs\n * @param {String} key\n * @param {Mixed} val\n */\n\nfunction pushEncodedKeyValuePair(pairs, key, val) {\n  if (val != null) {\n    if (Array.isArray(val)) {\n      val.forEach(function(v) {\n        pushEncodedKeyValuePair(pairs, key, v);\n      });\n    } else if (isObject(val)) {\n      for(var subkey in val) {\n        pushEncodedKeyValuePair(pairs, key + '[' + subkey + ']', val[subkey]);\n      }\n    } else {\n      pairs.push(encodeURIComponent(key)\n        + '=' + encodeURIComponent(val));\n    }\n  } else if (val === null) {\n    pairs.push(encodeURIComponent(key));\n  }\n}\n\n/**\n * Expose serialization method.\n */\n\n request.serializeObject = serialize;\n\n /**\n  * Parse the given x-www-form-urlencoded `str`.\n  *\n  * @param {String} str\n  * @return {Object}\n  * @api private\n  */\n\nfunction parseString(str) {\n  var obj = {};\n  var pairs = str.split('&');\n  var pair;\n  var pos;\n\n  for (var i = 0, len = pairs.length; i < len; ++i) {\n    pair = pairs[i];\n    pos = pair.indexOf('=');\n    if (pos == -1) {\n      obj[decodeURIComponent(pair)] = '';\n    } else {\n      obj[decodeURIComponent(pair.slice(0, pos))] =\n        decodeURIComponent(pair.slice(pos + 1));\n    }\n  }\n\n  return obj;\n}\n\n/**\n * Expose parser.\n */\n\nrequest.parseString = parseString;\n\n/**\n * Default MIME type map.\n *\n *     superagent.types.xml = 'application/xml';\n *\n */\n\nrequest.types = {\n  html: 'text/html',\n  json: 'application/json',\n  xml: 'application/xml',\n  urlencoded: 'application/x-www-form-urlencoded',\n  'form': 'application/x-www-form-urlencoded',\n  'form-data': 'application/x-www-form-urlencoded'\n};\n\n/**\n * Default serialization map.\n *\n *     superagent.serialize['application/xml'] = function(obj){\n *       return 'generated xml here';\n *     };\n *\n */\n\n request.serialize = {\n   'application/x-www-form-urlencoded': serialize,\n   'application/json': JSON.stringify\n };\n\n /**\n  * Default parsers.\n  *\n  *     superagent.parse['application/xml'] = function(str){\n  *       return { object parsed from str };\n  *     };\n  *\n  */\n\nrequest.parse = {\n  'application/x-www-form-urlencoded': parseString,\n  'application/json': JSON.parse\n};\n\n/**\n * Parse the given header `str` into\n * an object containing the mapped fields.\n *\n * @param {String} str\n * @return {Object}\n * @api private\n */\n\nfunction parseHeader(str) {\n  var lines = str.split(/\\r?\\n/);\n  var fields = {};\n  var index;\n  var line;\n  var field;\n  var val;\n\n  lines.pop(); // trailing CRLF\n\n  for (var i = 0, len = lines.length; i < len; ++i) {\n    line = lines[i];\n    index = line.indexOf(':');\n    field = line.slice(0, index).toLowerCase();\n    val = trim(line.slice(index + 1));\n    fields[field] = val;\n  }\n\n  return fields;\n}\n\n/**\n * Check if `mime` is json or has +json structured syntax suffix.\n *\n * @param {String} mime\n * @return {Boolean}\n * @api private\n */\n\nfunction isJSON(mime) {\n  return /[\\/+]json\\b/.test(mime);\n}\n\n/**\n * Return the mime type for the given `str`.\n *\n * @param {String} str\n * @return {String}\n * @api private\n */\n\nfunction type(str){\n  return str.split(/ *; */).shift();\n};\n\n/**\n * Return header field parameters.\n *\n * @param {String} str\n * @return {Object}\n * @api private\n */\n\nfunction params(str){\n  return str.split(/ *; */).reduce(function(obj, str){\n    var parts = str.split(/ *= */),\n        key = parts.shift(),\n        val = parts.shift();\n\n    if (key && val) obj[key] = val;\n    return obj;\n  }, {});\n};\n\n/**\n * Initialize a new `Response` with the given `xhr`.\n *\n *  - set flags (.ok, .error, etc)\n *  - parse header\n *\n * Examples:\n *\n *  Aliasing `superagent` as `request` is nice:\n *\n *      request = superagent;\n *\n *  We can use the promise-like API, or pass callbacks:\n *\n *      request.get('/').end(function(res){});\n *      request.get('/', function(res){});\n *\n *  Sending data can be chained:\n *\n *      request\n *        .post('/user')\n *        .send({ name: 'tj' })\n *        .end(function(res){});\n *\n *  Or passed to `.send()`:\n *\n *      request\n *        .post('/user')\n *        .send({ name: 'tj' }, function(res){});\n *\n *  Or passed to `.post()`:\n *\n *      request\n *        .post('/user', { name: 'tj' })\n *        .end(function(res){});\n *\n * Or further reduced to a single call for simple cases:\n *\n *      request\n *        .post('/user', { name: 'tj' }, function(res){});\n *\n * @param {XMLHTTPRequest} xhr\n * @param {Object} options\n * @api private\n */\n\nfunction Response(req, options) {\n  options = options || {};\n  this.req = req;\n  this.xhr = this.req.xhr;\n  // responseText is accessible only if responseType is '' or 'text' and on older browsers\n  this.text = ((this.req.method !='HEAD' && (this.xhr.responseType === '' || this.xhr.responseType === 'text')) || typeof this.xhr.responseType === 'undefined')\n     ? this.xhr.responseText\n     : null;\n  this.statusText = this.req.xhr.statusText;\n  this._setStatusProperties(this.xhr.status);\n  this.header = this.headers = parseHeader(this.xhr.getAllResponseHeaders());\n  // getAllResponseHeaders sometimes falsely returns \"\" for CORS requests, but\n  // getResponseHeader still works. so we get content-type even if getting\n  // other headers fails.\n  this.header['content-type'] = this.xhr.getResponseHeader('content-type');\n  this._setHeaderProperties(this.header);\n  this.body = this.req.method != 'HEAD'\n    ? this._parseBody(this.text ? this.text : this.xhr.response)\n    : null;\n}\n\n/**\n * Get case-insensitive `field` value.\n *\n * @param {String} field\n * @return {String}\n * @api public\n */\n\nResponse.prototype.get = function(field){\n  return this.header[field.toLowerCase()];\n};\n\n/**\n * Set header related properties:\n *\n *   - `.type` the content type without params\n *\n * A response of \"Content-Type: text/plain; charset=utf-8\"\n * will provide you with a `.type` of \"text/plain\".\n *\n * @param {Object} header\n * @api private\n */\n\nResponse.prototype._setHeaderProperties = function(header){\n  // content-type\n  var ct = this.header['content-type'] || '';\n  this.type = type(ct);\n\n  // params\n  var obj = params(ct);\n  for (var key in obj) this[key] = obj[key];\n};\n\n/**\n * Parse the given body `str`.\n *\n * Used for auto-parsing of bodies. Parsers\n * are defined on the `superagent.parse` object.\n *\n * @param {String} str\n * @return {Mixed}\n * @api private\n */\n\nResponse.prototype._parseBody = function(str){\n  var parse = request.parse[this.type];\n  if (!parse && isJSON(this.type)) {\n    parse = request.parse['application/json'];\n  }\n  return parse && str && (str.length || str instanceof Object)\n    ? parse(str)\n    : null;\n};\n\n/**\n * Set flags such as `.ok` based on `status`.\n *\n * For example a 2xx response will give you a `.ok` of __true__\n * whereas 5xx will be __false__ and `.error` will be __true__. The\n * `.clientError` and `.serverError` are also available to be more\n * specific, and `.statusType` is the class of error ranging from 1..5\n * sometimes useful for mapping respond colors etc.\n *\n * \"sugar\" properties are also defined for common cases. Currently providing:\n *\n *   - .noContent\n *   - .badRequest\n *   - .unauthorized\n *   - .notAcceptable\n *   - .notFound\n *\n * @param {Number} status\n * @api private\n */\n\nResponse.prototype._setStatusProperties = function(status){\n  // handle IE9 bug: http://stackoverflow.com/questions/10046972/msie-returns-status-code-of-1223-for-ajax-request\n  if (status === 1223) {\n    status = 204;\n  }\n\n  var type = status / 100 | 0;\n\n  // status / class\n  this.status = this.statusCode = status;\n  this.statusType = type;\n\n  // basics\n  this.info = 1 == type;\n  this.ok = 2 == type;\n  this.clientError = 4 == type;\n  this.serverError = 5 == type;\n  this.error = (4 == type || 5 == type)\n    ? this.toError()\n    : false;\n\n  // sugar\n  this.accepted = 202 == status;\n  this.noContent = 204 == status;\n  this.badRequest = 400 == status;\n  this.unauthorized = 401 == status;\n  this.notAcceptable = 406 == status;\n  this.notFound = 404 == status;\n  this.forbidden = 403 == status;\n};\n\n/**\n * Return an `Error` representative of this response.\n *\n * @return {Error}\n * @api public\n */\n\nResponse.prototype.toError = function(){\n  var req = this.req;\n  var method = req.method;\n  var url = req.url;\n\n  var msg = 'cannot ' + method + ' ' + url + ' (' + this.status + ')';\n  var err = new Error(msg);\n  err.status = this.status;\n  err.method = method;\n  err.url = url;\n\n  return err;\n};\n\n/**\n * Expose `Response`.\n */\n\nrequest.Response = Response;\n\n/**\n * Initialize a new `Request` with the given `method` and `url`.\n *\n * @param {String} method\n * @param {String} url\n * @api public\n */\n\nfunction Request(method, url) {\n  var self = this;\n  this._query = this._query || [];\n  this.method = method;\n  this.url = url;\n  this.header = {}; // preserves header name case\n  this._header = {}; // coerces header names to lowercase\n  this.on('end', function(){\n    var err = null;\n    var res = null;\n\n    try {\n      res = new Response(self);\n    } catch(e) {\n      err = new Error('Parser is unable to parse the response');\n      err.parse = true;\n      err.original = e;\n      // issue #675: return the raw response if the response parsing fails\n      err.rawResponse = self.xhr && self.xhr.responseText ? self.xhr.responseText : null;\n      // issue #876: return the http status code if the response parsing fails\n      err.statusCode = self.xhr && self.xhr.status ? self.xhr.status : null;\n      return self.callback(err);\n    }\n\n    self.emit('response', res);\n\n    var new_err;\n    try {\n      if (res.status < 200 || res.status >= 300) {\n        new_err = new Error(res.statusText || 'Unsuccessful HTTP response');\n        new_err.original = err;\n        new_err.response = res;\n        new_err.status = res.status;\n      }\n    } catch(e) {\n      new_err = e; // #985 touching res may cause INVALID_STATE_ERR on old Android\n    }\n\n    // #1000 don't catch errors from the callback to avoid double calling it\n    if (new_err) {\n      self.callback(new_err, res);\n    } else {\n      self.callback(null, res);\n    }\n  });\n}\n\n/**\n * Mixin `Emitter` and `requestBase`.\n */\n\nEmitter(Request.prototype);\nfor (var key in requestBase) {\n  Request.prototype[key] = requestBase[key];\n}\n\n/**\n * Set Content-Type to `type`, mapping values from `request.types`.\n *\n * Examples:\n *\n *      superagent.types.xml = 'application/xml';\n *\n *      request.post('/')\n *        .type('xml')\n *        .send(xmlstring)\n *        .end(callback);\n *\n *      request.post('/')\n *        .type('application/xml')\n *        .send(xmlstring)\n *        .end(callback);\n *\n * @param {String} type\n * @return {Request} for chaining\n * @api public\n */\n\nRequest.prototype.type = function(type){\n  this.set('Content-Type', request.types[type] || type);\n  return this;\n};\n\n/**\n * Set responseType to `val`. Presently valid responseTypes are 'blob' and\n * 'arraybuffer'.\n *\n * Examples:\n *\n *      req.get('/')\n *        .responseType('blob')\n *        .end(callback);\n *\n * @param {String} val\n * @return {Request} for chaining\n * @api public\n */\n\nRequest.prototype.responseType = function(val){\n  this._responseType = val;\n  return this;\n};\n\n/**\n * Set Accept to `type`, mapping values from `request.types`.\n *\n * Examples:\n *\n *      superagent.types.json = 'application/json';\n *\n *      request.get('/agent')\n *        .accept('json')\n *        .end(callback);\n *\n *      request.get('/agent')\n *        .accept('application/json')\n *        .end(callback);\n *\n * @param {String} accept\n * @return {Request} for chaining\n * @api public\n */\n\nRequest.prototype.accept = function(type){\n  this.set('Accept', request.types[type] || type);\n  return this;\n};\n\n/**\n * Set Authorization field value with `user` and `pass`.\n *\n * @param {String} user\n * @param {String} pass\n * @param {Object} options with 'type' property 'auto' or 'basic' (default 'basic')\n * @return {Request} for chaining\n * @api public\n */\n\nRequest.prototype.auth = function(user, pass, options){\n  if (!options) {\n    options = {\n      type: 'basic'\n    }\n  }\n\n  switch (options.type) {\n    case 'basic':\n      var str = btoa(user + ':' + pass);\n      this.set('Authorization', 'Basic ' + str);\n    break;\n\n    case 'auto':\n      this.username = user;\n      this.password = pass;\n    break;\n  }\n  return this;\n};\n\n/**\n* Add query-string `val`.\n*\n* Examples:\n*\n*   request.get('/shoes')\n*     .query('size=10')\n*     .query({ color: 'blue' })\n*\n* @param {Object|String} val\n* @return {Request} for chaining\n* @api public\n*/\n\nRequest.prototype.query = function(val){\n  if ('string' != typeof val) val = serialize(val);\n  if (val) this._query.push(val);\n  return this;\n};\n\n/**\n * Queue the given `file` as an attachment to the specified `field`,\n * with optional `filename`.\n *\n * ``` js\n * request.post('/upload')\n *   .attach('content', new Blob(['<a id=\"a\"><b id=\"b\">hey!</b></a>'], { type: \"text/html\"}))\n *   .end(callback);\n * ```\n *\n * @param {String} field\n * @param {Blob|File} file\n * @param {String} filename\n * @return {Request} for chaining\n * @api public\n */\n\nRequest.prototype.attach = function(field, file, filename){\n  this._getFormData().append(field, file, filename || file.name);\n  return this;\n};\n\nRequest.prototype._getFormData = function(){\n  if (!this._formData) {\n    this._formData = new root.FormData();\n  }\n  return this._formData;\n};\n\n/**\n * Invoke the callback with `err` and `res`\n * and handle arity check.\n *\n * @param {Error} err\n * @param {Response} res\n * @api private\n */\n\nRequest.prototype.callback = function(err, res){\n  var fn = this._callback;\n  this.clearTimeout();\n  fn(err, res);\n};\n\n/**\n * Invoke callback with x-domain error.\n *\n * @api private\n */\n\nRequest.prototype.crossDomainError = function(){\n  var err = new Error('Request has been terminated\\nPossible causes: the network is offline, Origin is not allowed by Access-Control-Allow-Origin, the page is being unloaded, etc.');\n  err.crossDomain = true;\n\n  err.status = this.status;\n  err.method = this.method;\n  err.url = this.url;\n\n  this.callback(err);\n};\n\n/**\n * Invoke callback with timeout error.\n *\n * @api private\n */\n\nRequest.prototype._timeoutError = function(){\n  var timeout = this._timeout;\n  var err = new Error('timeout of ' + timeout + 'ms exceeded');\n  err.timeout = timeout;\n  this.callback(err);\n};\n\n/**\n * Compose querystring to append to req.url\n *\n * @api private\n */\n\nRequest.prototype._appendQueryString = function(){\n  var query = this._query.join('&');\n  if (query) {\n    this.url += ~this.url.indexOf('?')\n      ? '&' + query\n      : '?' + query;\n  }\n};\n\n/**\n * Initiate request, invoking callback `fn(res)`\n * with an instanceof `Response`.\n *\n * @param {Function} fn\n * @return {Request} for chaining\n * @api public\n */\n\nRequest.prototype.end = function(fn){\n  var self = this;\n  var xhr = this.xhr = request.getXHR();\n  var timeout = this._timeout;\n  var data = this._formData || this._data;\n\n  // store callback\n  this._callback = fn || noop;\n\n  // state change\n  xhr.onreadystatechange = function(){\n    if (4 != xhr.readyState) return;\n\n    // In IE9, reads to any property (e.g. status) off of an aborted XHR will\n    // result in the error \"Could not complete the operation due to error c00c023f\"\n    var status;\n    try { status = xhr.status } catch(e) { status = 0; }\n\n    if (0 == status) {\n      if (self.timedout) return self._timeoutError();\n      if (self._aborted) return;\n      return self.crossDomainError();\n    }\n    self.emit('end');\n  };\n\n  // progress\n  var handleProgress = function(e){\n    if (e.total > 0) {\n      e.percent = e.loaded / e.total * 100;\n    }\n    e.direction = 'download';\n    self.emit('progress', e);\n  };\n  if (this.hasListeners('progress')) {\n    xhr.onprogress = handleProgress;\n  }\n  try {\n    if (xhr.upload && this.hasListeners('progress')) {\n      xhr.upload.onprogress = handleProgress;\n    }\n  } catch(e) {\n    // Accessing xhr.upload fails in IE from a web worker, so just pretend it doesn't exist.\n    // Reported here:\n    // https://connect.microsoft.com/IE/feedback/details/837245/xmlhttprequest-upload-throws-invalid-argument-when-used-from-web-worker-context\n  }\n\n  // timeout\n  if (timeout && !this._timer) {\n    this._timer = setTimeout(function(){\n      self.timedout = true;\n      self.abort();\n    }, timeout);\n  }\n\n  // querystring\n  this._appendQueryString();\n\n  // initiate request\n  if (this.username && this.password) {\n    xhr.open(this.method, this.url, true, this.username, this.password);\n  } else {\n    xhr.open(this.method, this.url, true);\n  }\n\n  // CORS\n  if (this._withCredentials) xhr.withCredentials = true;\n\n  // body\n  if ('GET' != this.method && 'HEAD' != this.method && 'string' != typeof data && !this._isHost(data)) {\n    // serialize stuff\n    var contentType = this._header['content-type'];\n    var serialize = this._serializer || request.serialize[contentType ? contentType.split(';')[0] : ''];\n    if (!serialize && isJSON(contentType)) serialize = request.serialize['application/json'];\n    if (serialize) data = serialize(data);\n  }\n\n  // set header fields\n  for (var field in this.header) {\n    if (null == this.header[field]) continue;\n    xhr.setRequestHeader(field, this.header[field]);\n  }\n\n  if (this._responseType) {\n    xhr.responseType = this._responseType;\n  }\n\n  // send stuff\n  this.emit('request', this);\n\n  // IE11 xhr.send(undefined) sends 'undefined' string as POST payload (instead of nothing)\n  // We need null here if data is undefined\n  xhr.send(typeof data !== 'undefined' ? data : null);\n  return this;\n};\n\n\n/**\n * Expose `Request`.\n */\n\nrequest.Request = Request;\n\n/**\n * GET `url` with optional callback `fn(res)`.\n *\n * @param {String} url\n * @param {Mixed|Function} [data] or fn\n * @param {Function} [fn]\n * @return {Request}\n * @api public\n */\n\nrequest.get = function(url, data, fn){\n  var req = request('GET', url);\n  if ('function' == typeof data) fn = data, data = null;\n  if (data) req.query(data);\n  if (fn) req.end(fn);\n  return req;\n};\n\n/**\n * HEAD `url` with optional callback `fn(res)`.\n *\n * @param {String} url\n * @param {Mixed|Function} [data] or fn\n * @param {Function} [fn]\n * @return {Request}\n * @api public\n */\n\nrequest.head = function(url, data, fn){\n  var req = request('HEAD', url);\n  if ('function' == typeof data) fn = data, data = null;\n  if (data) req.send(data);\n  if (fn) req.end(fn);\n  return req;\n};\n\n/**\n * OPTIONS query to `url` with optional callback `fn(res)`.\n *\n * @param {String} url\n * @param {Mixed|Function} [data] or fn\n * @param {Function} [fn]\n * @return {Request}\n * @api public\n */\n\nrequest.options = function(url, data, fn){\n  var req = request('OPTIONS', url);\n  if ('function' == typeof data) fn = data, data = null;\n  if (data) req.send(data);\n  if (fn) req.end(fn);\n  return req;\n};\n\n/**\n * DELETE `url` with optional callback `fn(res)`.\n *\n * @param {String} url\n * @param {Function} [fn]\n * @return {Request}\n * @api public\n */\n\nfunction del(url, fn){\n  var req = request('DELETE', url);\n  if (fn) req.end(fn);\n  return req;\n};\n\nrequest['del'] = del;\nrequest['delete'] = del;\n\n/**\n * PATCH `url` with optional `data` and callback `fn(res)`.\n *\n * @param {String} url\n * @param {Mixed} [data]\n * @param {Function} [fn]\n * @return {Request}\n * @api public\n */\n\nrequest.patch = function(url, data, fn){\n  var req = request('PATCH', url);\n  if ('function' == typeof data) fn = data, data = null;\n  if (data) req.send(data);\n  if (fn) req.end(fn);\n  return req;\n};\n\n/**\n * POST `url` with optional `data` and callback `fn(res)`.\n *\n * @param {String} url\n * @param {Mixed} [data]\n * @param {Function} [fn]\n * @return {Request}\n * @api public\n */\n\nrequest.post = function(url, data, fn){\n  var req = request('POST', url);\n  if ('function' == typeof data) fn = data, data = null;\n  if (data) req.send(data);\n  if (fn) req.end(fn);\n  return req;\n};\n\n/**\n * PUT `url` with optional `data` and callback `fn(res)`.\n *\n * @param {String} url\n * @param {Mixed|Function} [data] or fn\n * @param {Function} [fn]\n * @return {Request}\n * @api public\n */\n\nrequest.put = function(url, data, fn){\n  var req = request('PUT', url);\n  if ('function' == typeof data) fn = data, data = null;\n  if (data) req.send(data);\n  if (fn) req.end(fn);\n  return req;\n};\n\n},{\"./is-object\":159,\"./request\":161,\"./request-base\":160,\"emitter\":162}],159:[function(require,module,exports){\n/**\n * Check if `obj` is an object.\n *\n * @param {Object} obj\n * @return {Boolean}\n * @api private\n */\n\nfunction isObject(obj) {\n  return null !== obj && 'object' === typeof obj;\n}\n\nmodule.exports = isObject;\n\n},{}],160:[function(require,module,exports){\n/**\n * Module of mixed-in functions shared between node and client code\n */\nvar isObject = require('./is-object');\n\n/**\n * Clear previous timeout.\n *\n * @return {Request} for chaining\n * @api public\n */\n\nexports.clearTimeout = function _clearTimeout(){\n  this._timeout = 0;\n  clearTimeout(this._timer);\n  return this;\n};\n\n/**\n * Override default response body parser\n *\n * This function will be called to convert incoming data into request.body\n *\n * @param {Function}\n * @api public\n */\n\nexports.parse = function parse(fn){\n  this._parser = fn;\n  return this;\n};\n\n/**\n * Override default request body serializer\n *\n * This function will be called to convert data set via .send or .attach into payload to send\n *\n * @param {Function}\n * @api public\n */\n\nexports.serialize = function serialize(fn){\n  this._serializer = fn;\n  return this;\n};\n\n/**\n * Set timeout to `ms`.\n *\n * @param {Number} ms\n * @return {Request} for chaining\n * @api public\n */\n\nexports.timeout = function timeout(ms){\n  this._timeout = ms;\n  return this;\n};\n\n/**\n * Promise support\n *\n * @param {Function} resolve\n * @param {Function} reject\n * @return {Request}\n */\n\nexports.then = function then(resolve, reject) {\n  if (!this._fullfilledPromise) {\n    var self = this;\n    this._fullfilledPromise = new Promise(function(innerResolve, innerReject){\n      self.end(function(err, res){\n        if (err) innerReject(err); else innerResolve(res);\n      });\n    });\n  }\n  return this._fullfilledPromise.then(resolve, reject);\n}\n\n/**\n * Allow for extension\n */\n\nexports.use = function use(fn) {\n  fn(this);\n  return this;\n}\n\n\n/**\n * Get request header `field`.\n * Case-insensitive.\n *\n * @param {String} field\n * @return {String}\n * @api public\n */\n\nexports.get = function(field){\n  return this._header[field.toLowerCase()];\n};\n\n/**\n * Get case-insensitive header `field` value.\n * This is a deprecated internal API. Use `.get(field)` instead.\n *\n * (getHeader is no longer used internally by the superagent code base)\n *\n * @param {String} field\n * @return {String}\n * @api private\n * @deprecated\n */\n\nexports.getHeader = exports.get;\n\n/**\n * Set header `field` to `val`, or multiple fields with one object.\n * Case-insensitive.\n *\n * Examples:\n *\n *      req.get('/')\n *        .set('Accept', 'application/json')\n *        .set('X-API-Key', 'foobar')\n *        .end(callback);\n *\n *      req.get('/')\n *        .set({ Accept: 'application/json', 'X-API-Key': 'foobar' })\n *        .end(callback);\n *\n * @param {String|Object} field\n * @param {String} val\n * @return {Request} for chaining\n * @api public\n */\n\nexports.set = function(field, val){\n  if (isObject(field)) {\n    for (var key in field) {\n      this.set(key, field[key]);\n    }\n    return this;\n  }\n  this._header[field.toLowerCase()] = val;\n  this.header[field] = val;\n  return this;\n};\n\n/**\n * Remove header `field`.\n * Case-insensitive.\n *\n * Example:\n *\n *      req.get('/')\n *        .unset('User-Agent')\n *        .end(callback);\n *\n * @param {String} field\n */\nexports.unset = function(field){\n  delete this._header[field.toLowerCase()];\n  delete this.header[field];\n  return this;\n};\n\n/**\n * Write the field `name` and `val` for \"multipart/form-data\"\n * request bodies.\n *\n * ``` js\n * request.post('/upload')\n *   .field('foo', 'bar')\n *   .end(callback);\n * ```\n *\n * @param {String} name\n * @param {String|Blob|File|Buffer|fs.ReadStream} val\n * @return {Request} for chaining\n * @api public\n */\nexports.field = function(name, val) {\n  this._getFormData().append(name, val);\n  return this;\n};\n\n/**\n * Abort the request, and clear potential timeout.\n *\n * @return {Request}\n * @api public\n */\nexports.abort = function(){\n  if (this._aborted) {\n    return this;\n  }\n  this._aborted = true;\n  this.xhr && this.xhr.abort(); // browser\n  this.req && this.req.abort(); // node\n  this.clearTimeout();\n  this.emit('abort');\n  return this;\n};\n\n/**\n * Enable transmission of cookies with x-domain requests.\n *\n * Note that for this to work the origin must not be\n * using \"Access-Control-Allow-Origin\" with a wildcard,\n * and also must set \"Access-Control-Allow-Credentials\"\n * to \"true\".\n *\n * @api public\n */\n\nexports.withCredentials = function(){\n  // This is browser-only functionality. Node side is no-op.\n  this._withCredentials = true;\n  return this;\n};\n\n/**\n * Set the max redirects to `n`. Does noting in browser XHR implementation.\n *\n * @param {Number} n\n * @return {Request} for chaining\n * @api public\n */\n\nexports.redirects = function(n){\n  this._maxRedirects = n;\n  return this;\n};\n\n/**\n * Convert to a plain javascript object (not JSON string) of scalar properties.\n * Note as this method is designed to return a useful non-this value,\n * it cannot be chained.\n *\n * @return {Object} describing method, url, and data of this request\n * @api public\n */\n\nexports.toJSON = function(){\n  return {\n    method: this.method,\n    url: this.url,\n    data: this._data,\n    headers: this._header\n  };\n};\n\n/**\n * Check if `obj` is a host object,\n * we don't want to serialize these :)\n *\n * TODO: future proof, move to compoent land\n *\n * @param {Object} obj\n * @return {Boolean}\n * @api private\n */\n\nexports._isHost = function _isHost(obj) {\n  var str = {}.toString.call(obj);\n\n  switch (str) {\n    case '[object File]':\n    case '[object Blob]':\n    case '[object FormData]':\n      return true;\n    default:\n      return false;\n  }\n}\n\n/**\n * Send `data` as the request body, defaulting the `.type()` to \"json\" when\n * an object is given.\n *\n * Examples:\n *\n *       // manual json\n *       request.post('/user')\n *         .type('json')\n *         .send('{\"name\":\"tj\"}')\n *         .end(callback)\n *\n *       // auto json\n *       request.post('/user')\n *         .send({ name: 'tj' })\n *         .end(callback)\n *\n *       // manual x-www-form-urlencoded\n *       request.post('/user')\n *         .type('form')\n *         .send('name=tj')\n *         .end(callback)\n *\n *       // auto x-www-form-urlencoded\n *       request.post('/user')\n *         .type('form')\n *         .send({ name: 'tj' })\n *         .end(callback)\n *\n *       // defaults to x-www-form-urlencoded\n *      request.post('/user')\n *        .send('name=tobi')\n *        .send('species=ferret')\n *        .end(callback)\n *\n * @param {String|Object} data\n * @return {Request} for chaining\n * @api public\n */\n\nexports.send = function(data){\n  var obj = isObject(data);\n  var type = this._header['content-type'];\n\n  // merge\n  if (obj && isObject(this._data)) {\n    for (var key in data) {\n      this._data[key] = data[key];\n    }\n  } else if ('string' == typeof data) {\n    // default to x-www-form-urlencoded\n    if (!type) this.type('form');\n    type = this._header['content-type'];\n    if ('application/x-www-form-urlencoded' == type) {\n      this._data = this._data\n        ? this._data + '&' + data\n        : data;\n    } else {\n      this._data = (this._data || '') + data;\n    }\n  } else {\n    this._data = data;\n  }\n\n  if (!obj || this._isHost(data)) return this;\n\n  // default to json\n  if (!type) this.type('json');\n  return this;\n};\n\n},{\"./is-object\":159}],161:[function(require,module,exports){\n// The node and browser modules expose versions of this with the\n// appropriate constructor function bound as first argument\n/**\n * Issue a request:\n *\n * Examples:\n *\n *    request('GET', '/users').end(callback)\n *    request('/users').end(callback)\n *    request('/users', callback)\n *\n * @param {String} method\n * @param {String|Function} url or callback\n * @return {Request}\n * @api public\n */\n\nfunction request(RequestConstructor, method, url) {\n  // callback\n  if ('function' == typeof url) {\n    return new RequestConstructor('GET', method).end(url);\n  }\n\n  // url first\n  if (2 == arguments.length) {\n    return new RequestConstructor('GET', method);\n  }\n\n  return new RequestConstructor(method, url);\n}\n\nmodule.exports = request;\n\n},{}],162:[function(require,module,exports){\n\n/**\n * Expose `Emitter`.\n */\n\nif (typeof module !== 'undefined') {\n  module.exports = Emitter;\n}\n\n/**\n * Initialize a new `Emitter`.\n *\n * @api public\n */\n\nfunction Emitter(obj) {\n  if (obj) return mixin(obj);\n};\n\n/**\n * Mixin the emitter properties.\n *\n * @param {Object} obj\n * @return {Object}\n * @api private\n */\n\nfunction mixin(obj) {\n  for (var key in Emitter.prototype) {\n    obj[key] = Emitter.prototype[key];\n  }\n  return obj;\n}\n\n/**\n * Listen on the given `event` with `fn`.\n *\n * @param {String} event\n * @param {Function} fn\n * @return {Emitter}\n * @api public\n */\n\nEmitter.prototype.on =\nEmitter.prototype.addEventListener = function(event, fn){\n  this._callbacks = this._callbacks || {};\n  (this._callbacks['$' + event] = this._callbacks['$' + event] || [])\n    .push(fn);\n  return this;\n};\n\n/**\n * Adds an `event` listener that will be invoked a single\n * time then automatically removed.\n *\n * @param {String} event\n * @param {Function} fn\n * @return {Emitter}\n * @api public\n */\n\nEmitter.prototype.once = function(event, fn){\n  function on() {\n    this.off(event, on);\n    fn.apply(this, arguments);\n  }\n\n  on.fn = fn;\n  this.on(event, on);\n  return this;\n};\n\n/**\n * Remove the given callback for `event` or all\n * registered callbacks.\n *\n * @param {String} event\n * @param {Function} fn\n * @return {Emitter}\n * @api public\n */\n\nEmitter.prototype.off =\nEmitter.prototype.removeListener =\nEmitter.prototype.removeAllListeners =\nEmitter.prototype.removeEventListener = function(event, fn){\n  this._callbacks = this._callbacks || {};\n\n  // all\n  if (0 == arguments.length) {\n    this._callbacks = {};\n    return this;\n  }\n\n  // specific event\n  var callbacks = this._callbacks['$' + event];\n  if (!callbacks) return this;\n\n  // remove all handlers\n  if (1 == arguments.length) {\n    delete this._callbacks['$' + event];\n    return this;\n  }\n\n  // remove specific handler\n  var cb;\n  for (var i = 0; i < callbacks.length; i++) {\n    cb = callbacks[i];\n    if (cb === fn || cb.fn === fn) {\n      callbacks.splice(i, 1);\n      break;\n    }\n  }\n  return this;\n};\n\n/**\n * Emit `event` with the given args.\n *\n * @param {String} event\n * @param {Mixed} ...\n * @return {Emitter}\n */\n\nEmitter.prototype.emit = function(event){\n  this._callbacks = this._callbacks || {};\n  var args = [].slice.call(arguments, 1)\n    , callbacks = this._callbacks['$' + event];\n\n  if (callbacks) {\n    callbacks = callbacks.slice(0);\n    for (var i = 0, len = callbacks.length; i < len; ++i) {\n      callbacks[i].apply(this, args);\n    }\n  }\n\n  return this;\n};\n\n/**\n * Return array of callbacks for `event`.\n *\n * @param {String} event\n * @return {Array}\n * @api public\n */\n\nEmitter.prototype.listeners = function(event){\n  this._callbacks = this._callbacks || {};\n  return this._callbacks['$' + event] || [];\n};\n\n/**\n * Check if this emitter has `event` handlers.\n *\n * @param {String} event\n * @return {Boolean}\n * @api public\n */\n\nEmitter.prototype.hasListeners = function(event){\n  return !! this.listeners(event).length;\n};\n\n},{}]},{},[1])(1)\n});\n\n\n /*global JSONEditor*/\n'use strict';\n\nwindow.SwaggerUi = Backbone.Router.extend({\n\n  dom_id: 'swagger_ui',\n\n  // Attributes\n  options: null,\n  api: null,\n  headerView: null,\n  mainView: null,\n\n  // SwaggerUi accepts all the same options as SwaggerApi\n  initialize: function(options) {\n    options = options || {};\n\n    if (options.defaultModelRendering !== 'model') {\n      options.defaultModelRendering = 'schema';\n    }\n\n    if (!options.highlightSizeThreshold) {\n      options.highlightSizeThreshold = 100000;\n    }\n\n    // Allow dom_id to be overridden\n    if (options.dom_id) {\n      this.dom_id = options.dom_id;\n      delete options.dom_id;\n    }\n\n    if (!options.supportedSubmitMethods){\n      options.supportedSubmitMethods = [\n        'get',\n        'put',\n        'post',\n        'delete',\n        'head',\n        'options',\n        'patch'\n      ];\n    }\n\n    if (typeof options.oauth2RedirectUrl === 'string') {\n      window.oAuthRedirectUrl = options.oauth2RedirectUrl;\n    }\n\n    // Create an empty div which contains the dom_id\n    if (! $('#' + this.dom_id).length){\n      $('body').append('<div id=\"' + this.dom_id + '\"></div>') ;\n    }\n\n    this.options = options;\n\n    // set marked options\n    marked.setOptions({gfm: true});\n\n    // Set the callbacks\n    var that = this;\n    this.options.success = function() { return that.render(); };\n    this.options.progress = function(d) { return that.showMessage(d); };\n    this.options.failure = function(d) { return that.onLoadFailure(d); };\n\n    // Create view to handle the header inputs\n    this.headerView = new SwaggerUi.Views.HeaderView({el: $('#header')});\n\n    // Event handler for when the baseUrl/apiKey is entered by user\n    this.headerView.on('update-swagger-ui', function(data) {\n      return that.updateSwaggerUi(data);\n    });\n\n    // JSon Editor custom theming\n     JSONEditor.defaults.iconlibs.swagger = JSONEditor.AbstractIconLib.extend({\n      mapping: {\n        collapse: 'collapse',\n        expand: 'expand'\n        },\n      icon_prefix: 'swagger-'\n      });\n\n  },\n\n  // Set an option after initializing\n  setOption: function(option, value) {\n    this.options[option] = value;\n  },\n\n  // Get the value of a previously set option\n  getOption: function(option) {\n    return this.options[option];\n  },\n\n  // Event handler for when url/key is received from user\n  updateSwaggerUi: function(data){\n    this.options.url = data.url;\n    this.load();\n  },\n\n  // Create an api and render\n  load: function(){\n    // Initialize the API object\n    if (this.mainView) {\n      this.mainView.clear();\n    }\n\n    if (this.authView) {\n      this.authView.remove();\n    }\n    var url = this.options.url;\n    if (url && url.indexOf('http') !== 0) {\n      url = this.buildUrl(window.location.href.toString(), url);\n    }\n    if(this.api) {\n      this.options.authorizations = this.api.clientAuthorizations.authz;\n    }\n    this.options.url = url;\n    this.headerView.update(url);\n\n    this.api = new SwaggerClient(this.options);\n  },\n\n  // collapse all sections\n  collapseAll: function(){\n    Docs.collapseEndpointListForResource('');\n  },\n\n  // list operations for all sections\n  listAll: function(){\n    Docs.collapseOperationsForResource('');\n  },\n\n  // expand operations for all sections\n  expandAll: function(){\n    Docs.expandOperationsForResource('');\n  },\n\n  // This is bound to success handler for SwaggerApi\n  //  so it gets called when SwaggerApi completes loading\n  render: function(){\n    var authsModel;\n    this.showMessage('Finished Loading Resource Information. Rendering Swagger UI...');\n    this.mainView = new SwaggerUi.Views.MainView({\n      model: this.api,\n      el: $('#' + this.dom_id),\n      swaggerOptions: this.options,\n      router: this\n    }).render();\n    if (!_.isEmpty(this.api.securityDefinitions)){\n      authsModel = _.map(this.api.securityDefinitions, function (auth, name) {\n        var result = {};\n        result[name] = auth;\n        return result;\n      });\n      this.authView = new SwaggerUi.Views.AuthButtonView({\n        data: SwaggerUi.utils.parseSecurityDefinitions(authsModel),\n        router: this\n      });\n      $('#auth_container').append(this.authView.render().el);\n    }\n    this.showMessage();\n    switch (this.options.docExpansion) {\n      case 'full':\n        this.expandAll(); break;\n      case 'list':\n        this.listAll(); break;\n      default:\n        break;\n    }\n    this.renderGFM();\n\n    if (this.options.onComplete){\n      this.options.onComplete(this.api, this);\n    }\n\n    setTimeout(Docs.shebang.bind(this), 100);\n  },\n\n  buildUrl: function(base, url){\n    if (url.indexOf('/') === 0) {\n      var parts = base.split('/');\n      base = parts[0] + '//' + parts[2];\n      return base + url;\n    } else {\n      var endOfPath = base.length;\n\n      if (base.indexOf('?') > -1){\n        endOfPath = Math.min(endOfPath, base.indexOf('?'));\n      }\n\n      if (base.indexOf('#') > -1){\n        endOfPath = Math.min(endOfPath, base.indexOf('#'));\n      }\n\n      base = base.substring(0, endOfPath);\n\n      if (base.indexOf('/', base.length - 1 ) !== -1){\n        return base + url;\n      }\n\n      return base + '/' + url;\n    }\n  },\n\n  // Shows message on topbar of the ui\n  showMessage: function(data){\n    if (data === undefined) {\n      data = '';\n    }\n    var $msgbar = $('#message-bar');\n    $msgbar.removeClass('message-fail');\n    $msgbar.addClass('message-success');\n    $msgbar.text(data);\n    if(window.SwaggerTranslator) {\n      window.SwaggerTranslator.translate($msgbar);\n    }\n  },\n\n  // shows message in red\n  onLoadFailure: function(data){\n    if (data === undefined) {\n      data = '';\n    }\n    $('#message-bar').removeClass('message-success');\n    $('#message-bar').addClass('message-fail');\n\n    var val = $('#message-bar').text(data);\n\n    if (this.options.onFailure) {\n      this.options.onFailure(data);\n    }\n\n    return val;\n  },\n\n  // Renders GFM for elements with 'markdown' class\n  renderGFM: function(){\n    $('.markdown').each(function(){\n      $(this).html(marked($(this).html()));\n    });\n\n    $('.propDesc', '.model-signature .description').each(function () {\n      $(this).html(marked($(this).html())).addClass('markdown');\n    });\n  }\n\n});\n\nwindow.SwaggerUi.Views = {};\nwindow.SwaggerUi.Models = {};\nwindow.SwaggerUi.Collections = {};\nwindow.SwaggerUi.partials = {};\nwindow.SwaggerUi.utils = {};\n\n// don't break backward compatibility with previous versions and warn users to upgrade their code\n(function(){\n  window.authorizations = {\n    add: function() {\n      warn('Using window.authorizations is deprecated. Please use SwaggerUi.api.clientAuthorizations.add().');\n\n      if (typeof window.swaggerUi === 'undefined') {\n        throw new TypeError('window.swaggerUi is not defined');\n      }\n\n      if (window.swaggerUi instanceof SwaggerUi) {\n        window.swaggerUi.api.clientAuthorizations.add.apply(window.swaggerUi.api.clientAuthorizations, arguments);\n      }\n    }\n  };\n\n  window.ApiKeyAuthorization = function() {\n    warn('window.ApiKeyAuthorization is deprecated. Please use SwaggerClient.ApiKeyAuthorization.');\n    SwaggerClient.ApiKeyAuthorization.apply(window, arguments);\n  };\n\n  window.PasswordAuthorization = function() {\n    warn('window.PasswordAuthorization is deprecated. Please use SwaggerClient.PasswordAuthorization.');\n    SwaggerClient.PasswordAuthorization.apply(window, arguments);\n  };\n\n  function warn(message) {\n    if ('console' in window && typeof window.console.warn === 'function') {\n      console.warn(message);\n    }\n  }\n})();\n\n\n// UMD\n(function (root, factory) {\n    if (typeof define === 'function' && define.amd) {\n        // AMD. Register as an anonymous module.\n        define(['b'], function (b) {\n            return (root.SwaggerUi = factory(b));\n        });\n    } else if (typeof exports === 'object') {\n        // Node. Does not work with strict CommonJS, but\n        // only CommonJS-like environments that support module.exports,\n        // like Node.\n        module.exports = factory(require('b'));\n    } else {\n        // Browser globals\n        root.SwaggerUi = factory(root.b);\n    }\n}(this, function () {\n    return SwaggerUi;\n}));\n\n'use strict';\n\nwindow.SwaggerUi.utils = {\n    parseSecurityDefinitions: function (security, securityDefinitions) {\n        var auths = Object.assign({}, securityDefinitions);\n        var oauth2Arr = [];\n        var authsArr = [];\n        var scopes = [];\n        var utils = window.SwaggerUi.utils;\n\n        if (!Array.isArray(security)) { return null; }\n\n        security.forEach(function (item) {\n            var singleSecurity = {};\n            var singleOauth2Security = {};\n\n            for (var key in item) {\n                if (Array.isArray(item[key])) {\n                    if (!auths[key]) { continue; }\n                    auths[key] = auths[key] || {};\n                    if (auths[key].type === 'oauth2') {\n                        singleOauth2Security[key] = Object.assign({}, auths[key]);\n                        singleOauth2Security[key].scopes = Object.assign({}, auths[key].scopes);\n                        for (var i in singleOauth2Security[key].scopes) {\n                            if (item[key].indexOf(i) < 0) {\n                                delete singleOauth2Security[key].scopes[i];\n                            }\n                        }\n                        singleOauth2Security[key].scopes = utils.parseOauth2Scopes(singleOauth2Security[key].scopes);\n                        scopes = _.merge(scopes, singleOauth2Security[key].scopes);\n                    } else {\n                        singleSecurity[key] = Object.assign({}, auths[key]);\n                    }\n                } else {\n                    if (item[key].type === 'oauth2') {\n                        singleOauth2Security[key] = Object.assign({}, item[key]);\n                        singleOauth2Security[key].scopes = utils.parseOauth2Scopes(singleOauth2Security[key].scopes);\n                        scopes = _.merge(scopes, singleOauth2Security[key].scopes);\n                    } else {\n                        singleSecurity[key] = item[key];\n                    }\n                }\n            }\n\n            if (!_.isEmpty(singleSecurity)) {\n                authsArr.push(singleSecurity);\n            }\n\n            if (!_.isEmpty(singleOauth2Security)){\n                oauth2Arr.push(singleOauth2Security);\n            }\n        });\n\n        return {\n            auths : authsArr,\n            oauth2: oauth2Arr,\n            scopes: scopes\n        };\n    },\n\n    parseOauth2Scopes: function (data) {\n        var scopes = Object.assign({}, data);\n        var result = [];\n        var key;\n\n        for (key in scopes) {\n            result.push({scope: key, description: scopes[key]});\n        }\n\n        return result;\n    },\n\n    sanitize: function(html) {\n        // Strip the script tags from the html and inline evenhandlers\n        html = html.replace(/<script\\b[^<]*(?:(?!<\\/script>)<[^<]*)*<\\/script>/gi, '');\n        html = html.replace(/(on\\w+=\"[^\"]*\")*(on\\w+='[^']*')*(on\\w+=\\w*\\(\\w*\\))*/gi, '');\n\n        return html;\n    }\n};\n'use strict';\n\nSwaggerUi.Models.ApiKeyAuthModel = Backbone.Model.extend({\n    defaults: {\n        'in': '',\n        name: '',\n        title: '',\n        value: ''\n    },\n\n    initialize: function () {\n        this.on('change', this.validate);\n    },\n\n    validate: function () {\n        var valid = !!this.get('value');\n\n        this.set('valid', valid);\n\n        return valid;\n    }\n});\n'use strict';\n\nSwaggerUi.Views.ApiKeyAuthView = Backbone.View.extend({ // TODO: append this to global SwaggerUi\n\n    events: {\n        'change .input_apiKey_entry': 'apiKeyChange'\n    },\n\n    selectors: {\n        apikeyInput: '.input_apiKey_entry'\n    },\n\n    template: Handlebars.templates.apikey_auth,\n\n    initialize: function(opts) {\n        this.options = opts || {};\n        this.router = this.options.router;\n    },\n\n    render: function (){\n        this.$el.html(this.template(this.model.toJSON()));\n\n        return this;\n    },\n\n    apiKeyChange: function (e) {\n        var val = $(e.target).val();\n        if (val) {\n            this.$(this.selectors.apikeyInput).removeClass('error');\n        }\n\n        this.model.set('value', val);\n    },\n\n    isValid: function () {\n        return this.model.validate();\n    },\n\n    highlightInvalid: function () {\n        if (!this.isValid()) {\n            this.$(this.selectors.apikeyInput).addClass('error');\n        }\n    }\n\n});\n'use strict';\n\nSwaggerUi.Views.AuthButtonView = Backbone.View.extend({\n    events: {\n        'click .authorize__btn': 'authorizeBtnClick'\n    },\n\n    tpls: {\n        popup: Handlebars.templates.popup,\n        authBtn: Handlebars.templates.auth_button,\n        authBtnOperation: Handlebars.templates.auth_button_operation\n    },\n\n    initialize: function(opts) {\n        this.options = opts || {};\n        this.options.data = this.options.data || {};\n        this.isOperation = this.options.isOperation;\n        this.model = this.model || {};\n        this.router = this.options.router;\n        this.auths = this.options.data.oauth2.concat(this.options.data.auths);\n    },\n\n    render: function () {\n        var tplName = this.isOperation ? 'authBtnOperation' : 'authBtn';\n\n        this.$authEl = this.renderAuths(this.auths);\n        this.$el.html(this.tpls[tplName](this.model));\n\n        return this;\n    },\n\n    authorizeBtnClick: function (e) {\n        var authsModel;\n\n        e.preventDefault();\n\n        authsModel = {\n            title: 'Available authorizations',\n            content: this.$authEl\n        };\n\n        // The content of the popup is removed and all events unbound after clicking the 'Cancel' button of the popup.\n        // We'll have to re-render the contents before creating a new popup view.\n        this.render();\n\n        this.popup = new SwaggerUi.Views.PopupView({model: authsModel});\n        this.popup.render();\n    },\n\n    renderAuths: function (auths) {\n        var $el = $('<div>');\n        var isLogout = false;\n\n        auths.forEach(function (auth) {\n            var authView = new SwaggerUi.Views.AuthView({data: auth, router: this.router});\n            var authEl = authView.render().el;\n            $el.append(authEl);\n            if (authView.isLogout) {\n                isLogout = true;\n            }\n        }, this);\n\n        this.model.isLogout = isLogout;\n\n        return $el;\n    }\n\n});\n\n'use strict';\n\nSwaggerUi.Collections.AuthsCollection = Backbone.Collection.extend({\n    constructor: function() {\n        var args = Array.prototype.slice.call(arguments);\n\n        args[0] = this.parse(args[0]);\n\n        Backbone.Collection.apply(this, args);\n    },\n\n    add: function (model) {\n        var args = Array.prototype.slice.call(arguments);\n\n        if (Array.isArray(model)) {\n            args[0] = _.map(model, function(val) {\n                return this.handleOne(val);\n            }, this);\n        } else {\n            args[0] = this.handleOne(model);\n        }\n\n        Backbone.Collection.prototype.add.apply(this, args);\n    },\n\n    handleOne: function (model) {\n        var result = model;\n\n        if (! (model instanceof Backbone.Model) ) {\n            switch (model.type) {\n                case 'oauth2':\n                    result = new SwaggerUi.Models.Oauth2Model(model);\n                    break;\n                case 'basic':\n                    result = new SwaggerUi.Models.BasicAuthModel(model);\n                    break;\n                case 'apiKey':\n                    result = new SwaggerUi.Models.ApiKeyAuthModel(model);\n                    break;\n                default:\n                    result = new Backbone.Model(model);\n            }\n        }\n\n        return result;\n    },\n\n    isValid: function () {\n        var valid = true;\n\n        this.models.forEach(function(model) {\n            if (!model.validate()) {\n                valid = false;\n            }\n        });\n\n        return valid;\n    },\n\n    isAuthorized: function () {\n        return this.length === this.where({ isLogout: true }).length;\n    },\n\n    isPartiallyAuthorized: function () {\n        return this.where({ isLogout: true }).length > 0;\n    },\n\n    parse: function (data) {\n        var authz = {};\n\n        if(typeof window.swaggerUi !== 'undefined') {\n            authz = Object.assign({}, window.swaggerUi.api.clientAuthorizations.authz);\n        }\n\n        return _.map(data, function (auth, name) {\n            var isBasic = authz[name] && auth.type === 'basic' && authz[name].username && authz[name].password;\n\n            _.extend(auth, {\n                title: name\n            });\n\n            if (authz[name] || isBasic) {\n                _.extend(auth, {\n                    isLogout: true,\n                    value: isBasic ? undefined : authz[name].value,\n                    username: isBasic ? authz[name].username : undefined,\n                    password: isBasic ? authz[name].password : undefined,\n                    valid: true\n                });\n            }\n\n            return auth;\n        });\n    }\n});\n'use strict';\n\nSwaggerUi.Views.AuthsCollectionView = Backbone.View.extend({\n\n    initialize: function(opts) {\n        this.options = opts || {};\n        this.options.data = this.options.data || {};\n        this.router = this.options.router;\n\n        this.collection = new SwaggerUi.Collections.AuthsCollection(opts.data);\n\n        this.$innerEl = $('<div>');\n        this.authViews = [];\n    },\n\n    render: function () {\n        this.collection.each(function (auth) {\n            this.renderOneAuth(auth);\n        }, this);\n\n        this.$el.html(this.$innerEl.html() ? this.$innerEl : '');\n\n        return this;\n    },\n\n    renderOneAuth: function (authModel) {\n        var authViewEl, authView, authViewName;\n        var type = authModel.get('type');\n\n        if (type === 'apiKey') {\n            authViewName = 'ApiKeyAuthView';\n        } else if (type === 'basic' && this.$innerEl.find('.basic_auth_container').length === 0) {\n            authViewName = 'BasicAuthView';\n        } else if (type === 'oauth2') {\n            authViewName = 'Oauth2View';\n        }\n\n        if (authViewName) {\n            authView = new SwaggerUi.Views[authViewName]({model: authModel, router: this.router});\n            authViewEl = authView.render().el;\n            this.authViews.push(authView);\n        }\n\n        this.$innerEl.append(authViewEl);\n    },\n\n    highlightInvalid: function () {\n        this.authViews.forEach(function (view) {\n            view.highlightInvalid();\n        }, this);\n    }\n\n});\n\n'use strict';\n\n/* global redirect_uri:true */\n/* global clientId */\n/* global scopeSeparator */\n/* global additionalQueryStringParams */\n/* global clientSecret */\n/* global onOAuthComplete */\n/* global realm */\n/*jshint unused:false*/\n\nSwaggerUi.Views.AuthView = Backbone.View.extend({\n    events: {\n        'click .auth_submit__button': 'authorizeClick',\n        'click .auth_logout__button': 'logoutClick'\n    },\n\n    tpls: {\n        main: Handlebars.templates.auth_view\n    },\n\n    selectors: {\n        innerEl: '.auth_inner',\n        authBtn: '.auth_submit__button'\n    },\n\n    initialize: function(opts) {\n        this.options = opts || {};\n        opts.data = opts.data || {};\n        this.router = this.options.router;\n\n        this.authsCollectionView = new SwaggerUi.Views.AuthsCollectionView({data: opts.data});\n\n        this.$el.html(this.tpls.main({\n            isLogout: this.authsCollectionView.collection.isAuthorized(),\n            isAuthorized: this.authsCollectionView.collection.isPartiallyAuthorized()\n        }));\n        this.$innerEl = this.$(this.selectors.innerEl);\n        this.isLogout = this.authsCollectionView.collection.isPartiallyAuthorized();\n    },\n\n    render: function () {\n        this.$innerEl.html(this.authsCollectionView.render().el);\n\n        return this;\n    },\n\n    authorizeClick: function (e) {\n        e.preventDefault();\n        e.stopPropagation();\n\n        if (this.authsCollectionView.collection.isValid()) {\n            this.authorize();\n        } else {\n            this.authsCollectionView.highlightInvalid();\n        }\n    },\n\n    authorize: function () {\n        this.authsCollectionView.collection.forEach(function (auth) {\n            var keyAuth, basicAuth;\n            var type = auth.get('type');\n\n            if (type === 'apiKey') {\n                keyAuth = new SwaggerClient.ApiKeyAuthorization(\n                    auth.get('name'),\n                    auth.get('value'),\n                    auth.get('in')\n                );\n\n                this.router.api.clientAuthorizations.add(auth.get('title'), keyAuth);\n            } else if (type === 'basic') {\n                basicAuth = new SwaggerClient.PasswordAuthorization(auth.get('username'), auth.get('password'));\n                this.router.api.clientAuthorizations.add(auth.get('title'), basicAuth);\n            } else if (type === 'oauth2') {\n                this.handleOauth2Login(auth);\n            }\n        }, this);\n\n        this.router.load();\n    },\n\n    logoutClick: function (e) {\n        e.preventDefault();\n\n        this.authsCollectionView.collection.forEach(function (auth) {\n            window.swaggerUi.api.clientAuthorizations.remove(auth.get('title'));\n        });\n\n        this.router.load();\n    },\n\n    // taken from lib/swagger-oauth.js\n    handleOauth2Login: function (auth) {\n        var host = window.location;\n        var pathname = location.pathname.substring(0, location.pathname.lastIndexOf('/'));\n        var defaultRedirectUrl = host.protocol + '//' + host.host + pathname + '/o2c.html';\n        var redirectUrl = window.oAuthRedirectUrl || defaultRedirectUrl;\n        var url = null;\n        var scopes = _.map(auth.get('scopes'), function (scope) {\n            if(scope.checked) {\n                return scope.scope;\n            }\n        });\n        var container = window.swaggerUiAuth || (window.swaggerUiAuth = {});\n        var state, dets, ep;\n        container.OAuthSchemeKey = auth.get('title');\n\n        window.enabledScopes = scopes;\n        var flow = auth.get('flow');\n\n        /**\n         * Returns the name of the access token parameter returned by the server.\n         *\n         * @param dets\n         *     The authorisation scheme configuration.\n         * @return the name of the access token parameter\n         */\n        function getTokenName(dets) {\n            return dets.vendorExtensions['x-tokenName'] || dets.tokenName;\n        }\n\n        if(auth.get('type') === 'oauth2' && flow && (flow === 'implicit' || flow === 'accessCode')) {\n            dets = auth.attributes;\n            url = dets.authorizationUrl + '?response_type=' + (flow === 'implicit' ? 'token' : 'code');\n            container.tokenName = getTokenName(dets) || 'access_token';\n            container.tokenUrl = (flow === 'accessCode' ? dets.tokenUrl : null);\n            state = container.OAuthSchemeKey;\n        }\n        else if(auth.get('type') === 'oauth2' && flow && (flow === 'application')) {\n            dets = auth.attributes;\n            container.tokenName = getTokenName(dets) || 'access_token';\n            this.clientCredentialsFlow(scopes, dets, container.OAuthSchemeKey);\n            return;\n        }\n        else if(auth.get('type') === 'oauth2' && flow && (flow === 'password')) {\n            dets = auth.attributes;\n            container.tokenName = getTokenName(dets) || 'access_token';\n            this.passwordFlow(scopes, dets, container.OAuthSchemeKey);\n            return;\n        }\n        else if(auth.get('grantTypes')) {\n            // 1.2 support\n            var o = auth.get('grantTypes');\n            for(var t in o) {\n                if(o.hasOwnProperty(t) && t === 'implicit') {\n                    dets = o[t];\n                    ep = dets.loginEndpoint.url;\n                    url = dets.loginEndpoint.url + '?response_type=token';\n                    container.tokenName = getTokenName(dets);\n                }\n                else if (o.hasOwnProperty(t) && t === 'accessCode') {\n                    dets = o[t];\n                    ep = dets.tokenRequestEndpoint.url;\n                    url = dets.tokenRequestEndpoint.url + '?response_type=code';\n                    container.tokenName = getTokenName(dets);\n                }\n            }\n        }\n\n        redirect_uri = redirectUrl;\n\n        url += '&redirect_uri=' + encodeURIComponent(redirectUrl);\n        url += '&realm=' + encodeURIComponent(realm);\n        url += '&client_id=' + encodeURIComponent(clientId);\n        url += '&scope=' + encodeURIComponent(scopes.join(scopeSeparator));\n        url += '&state=' + encodeURIComponent(state);\n        for (var key in additionalQueryStringParams) {\n            url += '&' + key + '=' + encodeURIComponent(additionalQueryStringParams[key]);\n        }\n\n        window.open(url);\n    },\n\n    // taken from lib/swagger-oauth.js\n    clientCredentialsFlow: function (scopes, oauth, OAuthSchemeKey) {\n        this.accessTokenRequest(scopes, oauth, OAuthSchemeKey, 'client_credentials');\n    },\n\n    passwordFlow: function (scopes, oauth, OAuthSchemeKey) {\n        this.accessTokenRequest(scopes, oauth, OAuthSchemeKey, 'password', {\n            'username': oauth.username,\n            'password': oauth.password\n        });\n    },\n\n    accessTokenRequest: function (scopes, oauth, OAuthSchemeKey, grantType, params) {\n        params = $.extend({}, {\n            'scope': scopes.join(' '),\n            'grant_type': grantType\n        }, params);\n\n        var headers= {};\n\n        switch (oauth.clientAuthenticationType) {\n            case 'basic':\n                headers.Authorization = 'Basic ' + btoa(oauth.clientId + ':' + oauth.clientSecret);\n                break;\n            case 'request-body':\n                params.client_id = oauth.clientId;\n                params.client_secret = oauth.clientSecret;\n                break;\n        }\n\n        $.ajax({\n            url : oauth.tokenUrl,\n            type: 'POST',\n            data: params,\n            headers: headers,\n            success: function (data)\n            {\n                onOAuthComplete(data, OAuthSchemeKey);\n            },\n            error: function ()\n            {\n                onOAuthComplete('');\n            }\n        });\n    }\n});\n\n'use strict';\n\nSwaggerUi.Models.BasicAuthModel = Backbone.Model.extend({\n    defaults: {\n        username: '',\n        password: '',\n        title: 'basic'\n    },\n\n    initialize: function () {\n        this.on('change', this.validate);\n    },\n\n    validate: function () {\n        var valid = !!this.get('password') && !!this.get('username');\n\n        this.set('valid', valid);\n\n        return valid;\n    }\n});\n'use strict';\n\nSwaggerUi.Views.BasicAuthView = Backbone.View.extend({\n\n    initialize: function (opts) {\n        this.options = opts || {};\n        this.router = this.options.router;\n    },\n\n    events: {\n        'change .auth_input': 'inputChange'\n    },\n\n    selectors: {\n        usernameInput: '.basic_auth__username',\n        passwordInput: '.basic_auth__password'\n    },\n\n    cls: {\n        error: 'error'\n    },\n\n    template: Handlebars.templates.basic_auth,\n\n    render: function(){\n        $(this.el).html(this.template(this.model.toJSON()));\n\n        return this;\n    },\n\n    inputChange: function (e) {\n        var $el = $(e.target);\n        var val = $el.val();\n        var attr = $el.prop('name');\n\n        if (val) {\n            $el.removeClass(this.cls.error);\n        }\n\n        this.model.set(attr, val);\n    },\n\n    isValid: function () {\n        return this.model.validate();\n    },\n\n    highlightInvalid: function () {\n        if (!this.model.get('username')) {\n            this.$(this.selectors.usernameInput).addClass(this.cls.error);\n        }\n    }\n});\n\n'use strict';\n\nSwaggerUi.Views.ContentTypeView = Backbone.View.extend({\n  initialize: function() {},\n\n  render: function(){\n  \tthis.model.contentTypeId = 'ct' + Math.random();\n    $(this.el).html(Handlebars.templates.content_type(this.model));\n    return this;\n  }\n});\n'use strict';\n\nSwaggerUi.Views.HeaderView = Backbone.View.extend({\n  events: {\n    'click #show-pet-store-icon'    : 'showPetStore',\n    'click #explore'                : 'showCustom',\n    'submit #api_selector'          : 'showCustom',\n    'keyup #input_baseUrl'          : 'showCustomOnKeyup',\n    'keyup #input_apiKey'           : 'showCustomOnKeyup'\n  },\n\n  initialize: function(){},\n\n  showPetStore: function(){\n    this.trigger('update-swagger-ui', {\n      url:'http://petstore.swagger.io/v2/swagger.json'\n    });\n  },\n\n  showCustomOnKeyup: function(e){\n    if (e.keyCode === 13) {\n      this.showCustom();\n    }\n  },\n\n  showCustom: function(e){\n    if (e) {\n      e.preventDefault();\n    }\n\n    this.trigger('update-swagger-ui', {\n      url: $('#input_baseUrl').val()\n    });\n  },\n\n  update: function(url, apiKey, trigger){\n    if (trigger === undefined) {\n      trigger = false;\n    }\n\n    $('#input_baseUrl').val(url);\n\n    if (trigger) {\n      this.trigger('update-swagger-ui', {url:url});\n    }\n  }\n});\n\n'use strict';\n\nSwaggerUi.Views.MainView = Backbone.View.extend({\n  apisSorter : {\n    alpha   : function(a,b){ return a.name.localeCompare(b.name); }\n  },\n  operationsSorters : {\n    alpha   : function(a,b){ return a.path.localeCompare(b.path); },\n    method  : function(a,b){ return a.method.localeCompare(b.method); }\n  },\n  initialize: function(opts){\n    var sorterOption, sorterFn, key, value;\n    opts = opts || {};\n\n    this.router = opts.router;\n\n    // Sort APIs\n    if (opts.swaggerOptions.apisSorter) {\n      sorterOption = opts.swaggerOptions.apisSorter;\n      if (_.isFunction(sorterOption)) {\n        sorterFn = sorterOption;\n      } else {\n        sorterFn = this.apisSorter[sorterOption];\n      }\n      if (_.isFunction(sorterFn)) {\n        this.model.apisArray.sort(sorterFn);\n      }\n    }\n    // Sort operations of each API\n    if (opts.swaggerOptions.operationsSorter) {\n      sorterOption = opts.swaggerOptions.operationsSorter;\n      if (_.isFunction(sorterOption)) {\n        sorterFn = sorterOption;\n      } else {\n        sorterFn = this.operationsSorters[sorterOption];\n      }\n      if (_.isFunction(sorterFn)) {\n        for (key in this.model.apisArray) {\n          this.model.apisArray[key].operationsArray.sort(sorterFn);\n        }\n      }\n    }\n\n    // set up the UI for input\n    this.model.auths = [];\n\n    for (key in this.model.securityDefinitions) {\n      value = this.model.securityDefinitions[key];\n\n      this.model.auths.push({\n        name: key,\n        type: value.type,\n        value: value\n      });\n    }\n\n    if ('validatorUrl' in opts.swaggerOptions) {\n      // Validator URL specified explicitly\n      this.model.validatorUrl = opts.swaggerOptions.validatorUrl;\n    } else if (this.model.url.indexOf('localhost') > 0 || this.model.url.indexOf('127.0.0.1') > 0) {\n      // Localhost override\n      this.model.validatorUrl = null;\n    } else {\n      this.model.validatorUrl = '//online.swagger.io/validator';\n    }\n\n    // JSonEditor requires type='object' to be present on defined types, we add it if it's missing\n    // is there any valid case were it should not be added ?\n    var def;\n    for(def in this.model.definitions){\n      if (!this.model.definitions[def].type){\n        this.model.definitions[def].type = 'object';\n      }\n    }\n\n  },\n\n  render: function () {\n    $(this.el).html(Handlebars.templates.main(this.model));\n    this.info = this.$('.info')[0];\n\n    if (this.info) {\n      this.info.addEventListener('click', this.onLinkClick, true);\n    }\n\n    this.model.securityDefinitions = this.model.securityDefinitions || {};\n\n    // Render each resource\n\n    var resources = {};\n    var counter = 0;\n    for (var i = 0; i < this.model.apisArray.length; i++) {\n      var resource = this.model.apisArray[i];\n      var id = resource.name;\n      while (typeof resources[id] !== 'undefined') {\n        id = id + '_' + counter;\n        counter += 1;\n      }\n      resource.id = sanitizeHtml(id);\n      resources[id] = resource;\n      this.addResource(resource, this.model.auths);\n    }\n\n    $('.propWrap').hover(function onHover(){\n      $('.optionsWrapper', $(this)).show();\n    }, function offhover(){\n      $('.optionsWrapper', $(this)).hide();\n    });\n    return this;\n  },\n\n  addResource: function(resource, auths){\n    // Render a resource and add it to resources li\n    resource.id = resource.id.replace(/[^a-zA-Z\\d]/g, function(str) { return str.charCodeAt(0); });\n\n    // Make all definitions available at the root of the resource so that they can\n    // be loaded by the JSonEditor\n    resource.definitions = this.model.definitions;\n\n    var resourceView = new SwaggerUi.Views.ResourceView({\n      model: resource,\n      router: this.router,\n      tagName: 'li',\n      id: 'resource_' + resource.id,\n      className: 'resource',\n      auths: auths,\n      swaggerOptions: this.options.swaggerOptions\n    });\n    $('#resources', this.el).append(resourceView.render().el);\n  },\n\n  clear: function(){\n    $(this.el).html('');\n  },\n\n  onLinkClick: function (e) {\n    var el = e.target;\n\n    if (el.tagName === 'A' && el.href && !el.target) {\n        e.preventDefault();\n        window.open(el.href, '_blank');\n    }\n  }\n});\n\n'use strict';\n\nSwaggerUi.Models.Oauth2Model = Backbone.Model.extend({\n    defaults: {\n        scopes: {},\n        isPasswordFlow: false,\n        clientAuthenticationType: 'none'\n    },\n\n    initialize: function () {\n        if(this.attributes && this.attributes.scopes) {\n            var attributes = _.cloneDeep(this.attributes);\n            var i, scopes = [];\n            for(i in attributes.scopes) {\n                var scope = attributes.scopes[i];\n                if(typeof scope.description === 'string') {\n                    scopes[scope] = attributes.scopes[i];\n                    scopes.push(attributes.scopes[i]);\n                }\n            }\n            attributes.scopes = scopes;\n            this.attributes = attributes;\n        }\n\n        if (this.attributes && this.attributes.flow) {\n            var flow = this.attributes.flow;\n            this.set('isPasswordFlow', flow === 'password');\n            this.set('requireClientAuthentication', flow === 'application');\n            this.set('clientAuthentication', flow === 'password' || flow === 'application');\n        }\n        this.on('change', this.validate);\n    },\n\n    setScopes: function (name, val) {\n        var auth = _.extend({}, this.attributes);\n        var index = _.findIndex(auth.scopes, function(o) {\n            return o.scope === name;\n        });\n        auth.scopes[index].checked = val;\n\n        this.set(auth);\n        this.validate();\n    },\n\n    validate: function () {\n      var valid = false;\n      if (this.get('isPasswordFlow') &&\n          (!this.get('username'))) {\n          return false;\n      }\n\n      if (this.get('clientAuthenticationType') in ['basic', 'request-body'] &&\n          (!this.get('clientId'))) {\n          return false;\n      }\n\n      var scp = this.get('scopes');\n      var idx =  _.findIndex(scp, function (o) {\n         return o.checked === true;\n      });\n\n      if(scp.length > 0 && idx >= 0) {\n          valid = true;\n      }\n\n      if(scp.length === 0) {\n          valid = true;\n      }\n\n      this.set('valid', valid);\n\n      return valid;\n    }\n});\n\n'use strict';\n\nSwaggerUi.Views.Oauth2View = Backbone.View.extend({\n    events: {\n        'change .oauth-scope': 'scopeChange',\n        'change .oauth-username': 'setUsername',\n        'change .oauth-password': 'setPassword',\n        'change .oauth-client-authentication-type': 'setClientAuthenticationType',\n        'change .oauth-client-id': 'setClientId',\n        'change .oauth-client-secret': 'setClientSecret'\n    },\n\n    template: Handlebars.templates.oauth2,\n\n    cls: {\n        error: 'error'\n    },\n\n    render: function () {\n        this.$el.html(this.template(this.model.toJSON()));\n\n        return this;\n    },\n\n    scopeChange: function (e) {\n        var val = $(e.target).prop('checked');\n        var scope = $(e.target).data('scope');\n\n        this.model.setScopes(scope, val);\n    },\n\n    setUsername: function (e) {\n        var val= $(e.target).val();\n        this.model.set('username', val);\n        if (val) {\n            $(e.target).removeClass(this.cls.error);\n        }\n    },\n\n    setPassword: function (e) {\n        this.model.set('password', $(e.target).val());\n    },\n\n    setClientAuthenticationType: function (e) {\n        var type = $(e.target).val();\n        var $el = this.$el;\n        this.model.set('clientAuthenticationType', type);\n\n        switch(type) {\n            case 'none':\n                $el.find('.oauth-client-authentication').hide();\n                break;\n            case 'basic':\n            case 'request-body':\n                $el.find('.oauth-client-id').removeClass(this.cls.error);\n                $el.find('.oauth-client-authentication').show();\n                break;\n        }\n    },\n\n    setClientId: function (e) {\n        var val = $(e.target).val();\n        this.model.set('clientId', val);\n        if (val) {\n            $(e.target).removeClass(this.cls.error);\n        }\n    },\n\n    setClientSecret: function (e) {\n        this.model.set('clientSecret', $(e.target).val());\n        $(e.target).removeClass('error');\n    },\n\n    highlightInvalid: function () {\n        if (!this.model.get('username')) {\n            this.$el.find('.oauth-username').addClass(this.cls.error);\n        }\n\n        if (!this.model.get('clientId')) {\n            this.$el.find('.oauth-client-id').addClass(this.cls.error);\n        }\n    }\n});\n'use strict';\n\nSwaggerUi.Views.OperationView = Backbone.View.extend({\n  invocationUrl: null,\n\n  events: {\n    'submit .sandbox'         : 'submitOperation',\n    'click .submit'           : 'submitOperation',\n    'click .response_hider'   : 'hideResponse',\n    'click .toggleOperation'  : 'toggleOperationContent',\n    'mouseenter .api-ic'      : 'mouseEnter',\n    'dblclick .curl'          : 'selectText',\n    'change [name=responseContentType]' : 'showSnippet'\n  },\n\n  initialize: function(opts) {\n    opts = opts || {};\n    this.router = opts.router;\n    this.auths = opts.auths;\n    this.parentId = this.model.parentId;\n    this.nickname = this.model.nickname;\n    this.model.encodedParentId = encodeURIComponent(this.parentId);\n\n    if (opts.swaggerOptions) {\n      this.model.defaultRendering = opts.swaggerOptions.defaultModelRendering;\n\n      if (opts.swaggerOptions.showRequestHeaders) {\n        this.model.showRequestHeaders = true;\n      }\n\n      if (opts.swaggerOptions.showOperationIds) {\n        this.model.showOperationIds = true;\n      }\n    }\n    return this;\n  },\n\n  selectText: function(event) {\n    var doc = document,\n        text = event.target.firstChild,\n        range,\n        selection;\n    if (doc.body.createTextRange) {\n      range = document.body.createTextRange();\n      range.moveToElementText(text);\n      range.select();\n    } else if (window.getSelection) {\n      selection = window.getSelection();\n      range = document.createRange();\n      range.selectNodeContents(text);\n      selection.removeAllRanges();\n      selection.addRange(range);\n    }\n  },\n\n  mouseEnter: function(e) {\n    var elem = $(this.el).find('.content');\n    var x = e.pageX;\n    var y = e.pageY;\n    var scX = $(window).scrollLeft();\n    var scY = $(window).scrollTop();\n    var scMaxX = scX + $(window).width();\n    var scMaxY = scY + $(window).height();\n    var wd = elem.width();\n    var hgh = elem.height();\n\n    if (x + wd > scMaxX) {\n      x = scMaxX - wd;\n    }\n\n    if (x < scX) {\n      x = scX;\n    }\n\n    if (y + hgh > scMaxY) {\n      y = scMaxY - hgh;\n    }\n\n    if (y < scY) {\n      y = scY;\n    }\n\n    var pos = {};\n    pos.top = y;\n    pos.left = x;\n    elem.css(pos);\n  },\n\n  // Note: copied from CoffeeScript compiled file\n  // TODO: refactor\n  render: function() {\n    var a, auth, auths, code, contentTypeModel, isMethodSubmissionSupported, k, key, l, len, len1, len2, len3, len4, m, modelAuths, n, o, p, param, q, ref, ref1, ref2, ref3, ref4, ref5, responseContentTypeView, responseSignatureView, schema, schemaObj, scopeIndex, signatureModel, statusCode, successResponse, type, v, value, produces, isXML, isJSON;\n    isMethodSubmissionSupported = jQuery.inArray(this.model.method, this.model.supportedSubmitMethods()) >= 0;\n    if (!isMethodSubmissionSupported) {\n      this.model.isReadOnly = true;\n    }\n    this.model.description = this.model.description || this.model.notes;\n    this.model.oauth = null;\n    modelAuths = this.model.authorizations || this.model.security;\n    if (modelAuths) {\n      if (Array.isArray(modelAuths)) {\n        for (l = 0, len = modelAuths.length; l < len; l++) {\n          auths = modelAuths[l];\n          for (key in auths) {\n            for (a in this.auths) {\n              auth = this.auths[a];\n              if (key === auth.name) {\n                if (auth.type === 'oauth2') {\n                  this.model.oauth = {};\n                  this.model.oauth.scopes = [];\n                  ref1 = auth.value.scopes;\n                  for (k in ref1) {\n                    v = ref1[k];\n                    scopeIndex = auths[key].indexOf(k);\n                    if (scopeIndex >= 0) {\n                      o = {\n                        scope: k,\n                        description: v\n                      };\n                      this.model.oauth.scopes.push(o);\n                    }\n                  }\n                }\n              }\n            }\n          }\n        }\n      } else {\n        for (k in modelAuths) {\n          v = modelAuths[k];\n          if (k === 'oauth2') {\n            if (this.model.oauth === null) {\n              this.model.oauth = {};\n            }\n            if (this.model.oauth.scopes === void 0) {\n              this.model.oauth.scopes = [];\n            }\n            for (m = 0, len1 = v.length; m < len1; m++) {\n              o = v[m];\n              this.model.oauth.scopes.push(o);\n            }\n          }\n        }\n      }\n    }\n    if (typeof this.model.responses !== 'undefined') {\n      this.model.responseMessages = [];\n      ref2 = this.model.responses;\n      for (code in ref2) {\n        value = ref2[code];\n        schema = null;\n        schemaObj = this.model.responses[code].schema;\n        if (schemaObj && schemaObj.$ref) {\n          schema = schemaObj.$ref;\n          if (schema.indexOf('#/definitions/') !== -1) {\n            schema = schema.replace(/^.*#\\/definitions\\//, '');\n          }\n        }\n        this.model.responseMessages.push({\n          code: code,\n          message: value.description,\n          responseModel: schema,\n          headers: value.headers,\n          schema: schemaObj\n        });\n      }\n    }\n    if (typeof this.model.responseMessages === 'undefined') {\n      this.model.responseMessages = [];\n    }\n    signatureModel = null;\n    produces = this.model.produces;\n    isXML = this.contains(produces, 'xml');\n    isJSON = isXML ? this.contains(produces, 'json') : true;\n\n    if (this.model.successResponse) {\n      successResponse = this.model.successResponse;\n      for (key in successResponse) {\n        value = successResponse[key];\n        this.model.successCode = key;\n        if (typeof value === 'object' && typeof value.createJSONSample === 'function') {\n          this.model.successDescription = value.description;\n          this.model.headers = this.parseResponseHeaders(value.headers);\n          signatureModel = {\n            sampleJSON: isJSON ? JSON.stringify(SwaggerUi.partials.signature.createJSONSample(value), void 0, 2) : false,\n            isParam: false,\n            sampleXML: isXML ? SwaggerUi.partials.signature.createXMLSample(value.name, value.definition, value.models) : false,\n            signature: SwaggerUi.partials.signature.getModelSignature(value.name, value.definition, value.models, value.modelPropertyMacro)\n          };\n        } else {\n          signatureModel = {\n            signature: SwaggerUi.partials.signature.getPrimitiveSignature(value)\n          };\n        }\n      }\n    } else if (this.model.responseClassSignature && this.model.responseClassSignature !== 'string') {\n      signatureModel = {\n        sampleJSON: this.model.responseSampleJSON,\n        isParam: false,\n        signature: this.model.responseClassSignature\n      };\n    }\n    $(this.el).html(Handlebars.templates.operation(this.model));\n    if (signatureModel) {\n      signatureModel.defaultRendering = this.model.defaultRendering;\n      responseSignatureView = new SwaggerUi.Views.SignatureView({\n        model: signatureModel,\n        router: this.router,\n        tagName: 'div'\n      });\n      $('.model-signature', $(this.el)).append(responseSignatureView.render().el);\n    } else {\n      this.model.responseClassSignature = 'string';\n      $('.model-signature', $(this.el)).html(this.model.type);\n    }\n    contentTypeModel = {\n      isParam: false\n    };\n    contentTypeModel.consumes = this.model.consumes;\n    contentTypeModel.produces = this.model.produces;\n    ref3 = this.model.parameters;\n    for (n = 0, len2 = ref3.length; n < len2; n++) {\n      param = ref3[n];\n      type = param.type || param.dataType || '';\n      if (typeof type === 'undefined') {\n        schema = param.schema;\n        if (schema && schema.$ref) {\n          ref = schema.$ref;\n          if (ref.indexOf('#/definitions/') === 0) {\n            type = ref.substring('#/definitions/'.length);\n          } else {\n            type = ref;\n          }\n        }\n      }\n      if (type && type.toLowerCase() === 'file') {\n        if (!contentTypeModel.consumes) {\n          contentTypeModel.consumes = 'multipart/form-data';\n        }\n      }\n      param.type = type;\n    }\n    responseContentTypeView = new SwaggerUi.Views.ResponseContentTypeView({\n      model: contentTypeModel,\n      router: this.router\n    });\n    $('.response-content-type', $(this.el)).append(responseContentTypeView.render().el);\n    ref4 = this.model.parameters;\n    for (p = 0, len3 = ref4.length; p < len3; p++) {\n      param = ref4[p];\n      this.addParameter(param, contentTypeModel.consumes);\n    }\n    ref5 = this.model.responseMessages;\n    for (q = 0, len4 = ref5.length; q < len4; q++) {\n      statusCode = ref5[q];\n      statusCode.isXML = isXML;\n      statusCode.isJSON = isJSON;\n      if (!_.isUndefined(statusCode.headers)) {\n        statusCode.headers = this.parseHeadersType(statusCode.headers);\n      }\n      this.addStatusCode(statusCode);\n    }\n\n    if (Array.isArray(this.model.security)) {\n      var authsModel = SwaggerUi.utils.parseSecurityDefinitions(this.model.security, this.model.parent.securityDefinitions);\n\n      authsModel.isLogout = !_.isEmpty(this.model.clientAuthorizations.authz);\n      this.authView = new SwaggerUi.Views.AuthButtonView({\n        data: authsModel,\n        router: this.router,\n        isOperation: true,\n        model: {\n          scopes: authsModel.scopes\n        }\n      });\n      this.$('.authorize-wrapper').append(this.authView.render().el);\n    }\n\n    this.showSnippet();\n    return this;\n  },\n\n  parseHeadersType: function (headers) {\n    var map = {\n      'string': {\n        'date-time': 'dateTime',\n        'date'     : 'date'\n      }\n    };\n\n    _.forEach(headers, function (header) {\n      var value;\n      header = header || {};\n      value = map[header.type] && map[header.type][header.format];\n      if (!_.isUndefined(value)) {\n        header.type = value;\n      }\n    });\n\n    return headers;\n  },\n\n  contains: function (produces, type) {\n    return produces.filter(function (val) {\n      if (val.indexOf(type) > -1) {\n        return true;\n      }\n    }).length;\n  },\n\n  parseResponseHeaders: function (data) {\n    var HEADERS_SEPARATOR = '; ';\n    var headers = _.clone(data);\n\n    _.forEach(headers, function (header) {\n      var other = [];\n      _.forEach(header, function (value, key) {\n        var properties = ['type', 'description'];\n        if (properties.indexOf(key.toLowerCase()) === -1) {\n          other.push(key + ': ' + value);\n        }\n      });\n\n      other.join(HEADERS_SEPARATOR);\n      header.other = other;\n    });\n\n    return headers;\n  },\n\n  addParameter: function(param, consumes) {\n    // Render a parameter\n    param.consumes = consumes;\n    param.defaultRendering = this.model.defaultRendering;\n\n    // Copy this param JSON spec so that it will be available for JsonEditor\n    if(param.schema){\n      $.extend(true, param.schema, this.model.definitions[param.type]);\n      param.schema.definitions = this.model.definitions;\n      // This is required for JsonEditor to display the root properly\n      if(!param.schema.type){\n        param.schema.type = 'object';\n      }\n      // This is the title that will be used by JsonEditor for the root\n      // Since we already display the parameter's name in the Parameter column\n      // We set this to space, we can't set it to null or space otherwise JsonEditor\n      // will replace it with the text \"root\" which won't look good on screen\n      if(!param.schema.title){\n        param.schema.title = ' ';\n      }\n    }\n\n    var paramView = new SwaggerUi.Views.ParameterView({\n      model: param,\n      tagName: 'tr',\n      readOnly: this.model.isReadOnly,\n      swaggerOptions: this.options.swaggerOptions\n    });\n    $('.operation-params', $(this.el)).append(paramView.render().el);\n  },\n\n  addStatusCode: function(statusCode) {\n    // Render status codes\n    statusCode.defaultRendering = this.model.defaultRendering;\n    var statusCodeView = new SwaggerUi.Views.StatusCodeView({\n      model: statusCode,\n      tagName: 'tr',\n      router: this.router\n    });\n    $('.operation-status', $(this.el)).append(statusCodeView.render().el);\n  },\n\n  // Note: copied from CoffeeScript compiled file\n  // TODO: redactor\n  submitOperation: function(e) {\n    var error_free, form, isFileUpload, map, opts;\n    if (e !== null) {\n      e.preventDefault();\n    }\n    form = $('.sandbox', $(this.el));\n    error_free = true;\n    form.find('input.required').each(function() {\n      $(this).removeClass('error');\n      if (jQuery.trim($(this).val()) === '') {\n        $(this).addClass('error');\n        $(this).wiggle({\n          callback: (function(_this) {\n            return function() {\n              $(_this).focus();\n            };\n          })(this)\n        });\n        error_free = false;\n      }\n    });\n    form.find('textarea.required:visible').each(function() {\n      $(this).removeClass('error');\n      if (jQuery.trim($(this).val()) === '') {\n        $(this).addClass('error');\n        $(this).wiggle({\n          callback: (function(_this) {\n            return function() {\n              return $(_this).focus();\n            };\n          })(this)\n        });\n        error_free = false;\n      }\n    });\n    form.find('select.required').each(function() {\n      $(this).removeClass('error');\n      if (this.selectedIndex === -1) {\n        $(this).addClass('error');\n        $(this).wiggle({\n          callback: (function(_this) {\n            return function() {\n              $(_this).focus();\n            };\n          })(this)\n        });\n        error_free = false;\n      }\n    });\n    if (error_free) {\n      map = this.getInputMap(form);\n      isFileUpload = this.isFileUpload(form);\n      opts = {\n        parent: this\n      };\n      if (this.options.swaggerOptions) {\n        for(var key in this.options.swaggerOptions) {\n          opts[key] = this.options.swaggerOptions[key];\n        }\n      }\n\n      var pi;\n      for(pi = 0; pi < this.model.parameters.length; pi++){\n        var p = this.model.parameters[pi];\n        if( p.jsonEditor && p.jsonEditor.isEnabled()){\n          var json = p.jsonEditor.getValue();\n          map[p.name] = JSON.stringify(json);\n        }\n      }\n\n      opts.responseContentType = $('div select[name=responseContentType]', $(this.el)).val();\n      opts.requestContentType = $('div select[name=parameterContentType]', $(this.el)).val();\n      $('.response_throbber', $(this.el)).show();\n      if (isFileUpload) {\n        $('.request_url', $(this.el)).html('<pre></pre>');\n        $('.request_url pre', $(this.el)).text(this.invocationUrl);\n\n        opts.useJQuery = true;\n        map.parameterContentType = 'multipart/form-data';\n        this.map = map;\n        return this.model.execute(map, opts, this.showCompleteStatus, this.showErrorStatus, this);\n      } else {\n        this.map = map;\n        return this.model.execute(map, opts, this.showCompleteStatus, this.showErrorStatus, this);\n      }\n    }\n  },\n\n  getInputMap: function (form) {\n    var map, ref1, l, len, o, ref2, m, len1, val, ref3, n, len2;\n    map = {};\n    ref1 = form.find('input');\n    for (l = 0, len = ref1.length; l < len; l++) {\n      o = ref1[l];\n      if ((o.value !== null) && jQuery.trim(o.value).length > 0) {\n        map[o.name] = o.value;\n      }\n      if (o.type === 'file') {\n        map[o.name] = o.files[0];\n      }\n    }\n    ref2 = form.find('textarea');\n    for (m = 0, len1 = ref2.length; m < len1; m++) {\n      o = ref2[m];\n      val = this.getTextAreaValue(o);\n      if ((val !== null) && jQuery.trim(val).length > 0) {\n        map[o.name] = val;\n      }\n    }\n    ref3 = form.find('select');\n    for (n = 0, len2 = ref3.length; n < len2; n++) {\n      o = ref3[n];\n      val = this.getSelectedValue(o);\n      if ((val !== null) && jQuery.trim(val).length > 0) {\n        map[o.name] = val;\n      }\n    }\n    return map;\n  },\n\n  isFileUpload: function (form) {\n    var ref1, l, len, o;\n    var isFileUpload = false;\n    ref1 = form.find('input');\n    for (l = 0, len = ref1.length; l < len; l++) {\n      o = ref1[l];\n      if (o.type === 'file') {\n        isFileUpload = true;\n      }\n    }\n    return isFileUpload;\n  },\n\n  success: function(response, parent) {\n    parent.showCompleteStatus(response);\n  },\n\n  // wraps a jquery response as a shred response\n  wrap: function(data) {\n    var h, headerArray, headers, i, l, len, o;\n    headers = {};\n    headerArray = data.getAllResponseHeaders().split('\\r');\n    for (l = 0, len = headerArray.length; l < len; l++) {\n      i = headerArray[l];\n      h = i.match(/^([^:]*?):(.*)$/);\n      if (!h) {\n        h = [];\n      }\n      h.shift();\n      if (h[0] !== void 0 && h[1] !== void 0) {\n        headers[h[0].trim()] = h[1].trim();\n      }\n    }\n    o = {};\n    o.content = {};\n    o.content.data = data.responseText;\n    o.headers = headers;\n    o.request = {};\n    o.request.url = this.invocationUrl;\n    o.status = data.status;\n    return o;\n  },\n\n  getSelectedValue: function(select) {\n    if (!select.multiple) {\n      return select.value;\n    } else {\n      var options = [];\n      for (var l = 0, len = select.options.length; l < len; l++) {\n        var opt = select.options[l];\n        if (opt.selected) {\n          options.push(opt.value);\n        }\n      }\n      if (options.length > 0) {\n        return options;\n      } else {\n        return null;\n      }\n    }\n  },\n\n  // handler for hide response link\n  hideResponse: function(e) {\n    if (e) { e.preventDefault(); }\n    $('.response', $(this.el)).slideUp();\n    $('.response_hider', $(this.el)).fadeOut();\n  },\n\n  // Show response from server\n  showResponse: function(response) {\n    var prettyJson = JSON.stringify(response, null, '\\t').replace(/\\n/g, '<br>');\n    $('.response_body', $(this.el)).html(_.escape(prettyJson));\n  },\n\n  // Show error from server\n  showErrorStatus: function(data, parent) {\n    parent.showStatus(data);\n  },\n\n  // show the status codes\n  showCompleteStatus: function(data, parent){\n    parent.showStatus(data);\n  },\n\n  // Adapted from http://stackoverflow.com/a/2893259/454004\n  // Note: directly ported from CoffeeScript\n  // TODO: Cleanup CoffeeScript artifacts\n  formatXml: function(xml) {\n    var contexp, fn, formatted, indent, l, lastType, len, lines, ln, pad, reg, transitions, wsexp;\n    reg = /(>)(<)(\\/*)/g;\n    wsexp = /[ ]*(.*)[ ]+\\n/g;\n    contexp = /(<.+>)(.+\\n)/g;\n    xml = xml.replace(/\\r\\n/g, '\\n').replace(reg, '$1\\n$2$3').replace(wsexp, '$1\\n').replace(contexp, '$1\\n$2');\n    pad = 0;\n    formatted = '';\n    lines = xml.split('\\n');\n    indent = 0;\n    lastType = 'other';\n    transitions = {\n      'single->single': 0,\n      'single->closing': -1,\n      'single->opening': 0,\n      'single->other': 0,\n      'closing->single': 0,\n      'closing->closing': -1,\n      'closing->opening': 0,\n      'closing->other': 0,\n      'opening->single': 1,\n      'opening->closing': 0,\n      'opening->opening': 1,\n      'opening->other': 1,\n      'other->single': 0,\n      'other->closing': -1,\n      'other->opening': 0,\n      'other->other': 0\n    };\n    fn = function(ln) {\n      var fromTo, j, key, padding, type, types, value;\n      types = {\n        single: Boolean(ln.match(/<.+\\/>/)),\n        closing: Boolean(ln.match(/<\\/.+>/)),\n        opening: Boolean(ln.match(/<[^!?].*>/))\n      };\n      type = ((function() {\n        var results;\n        results = [];\n        for (key in types) {\n          value = types[key];\n          if (value) {\n            results.push(key);\n          }\n        }\n        return results;\n      })())[0];\n      type = type === void 0 ? 'other' : type;\n      fromTo = lastType + '->' + type;\n      lastType = type;\n      padding = '';\n      indent += transitions[fromTo];\n      padding = ((function() {\n        var m, ref1, results;\n        results = [];\n        for (j = m = 0, ref1 = indent; 0 <= ref1 ? m < ref1 : m > ref1; j = 0 <= ref1 ? ++m : --m) {\n          results.push('  ');\n        }\n        return results;\n      })()).join('');\n      if (fromTo === 'opening->closing') {\n        formatted = formatted.substr(0, formatted.length - 1) + ln + '\\n';\n      } else {\n        formatted += padding + ln + '\\n';\n      }\n    };\n    for (l = 0, len = lines.length; l < len; l++) {\n      ln = lines[l];\n      fn(ln);\n    }\n    return formatted;\n  },\n\n  // puts the response data in UI\n  showStatus: function(response) {\n    var url, content;\n    if (response.content === undefined) {\n      content = response.data;\n      url = response.url;\n    } else {\n      content = response.content.data;\n      url = response.request.url;\n    }\n    var headers = response.headers;\n    if(typeof content === 'string') {\n      content = jQuery.trim(content);\n    }\n\n    // if server is nice, and sends content-type back, we can use it\n    var contentType = null;\n    if (headers) {\n      contentType = headers['Content-Type'] || headers['content-type'];\n      if (contentType) {\n        contentType = contentType.split(';')[0].trim();\n      }\n    }\n\n    $('.response_body', $(this.el)).removeClass('json');\n    $('.response_body', $(this.el)).removeClass('xml');\n\n    var supportsAudioPlayback = function(contentType){\n      var audioElement = document.createElement('audio');\n      return !!(audioElement.canPlayType && audioElement.canPlayType(contentType).replace(/no/, ''));\n    };\n\n    var pre;\n    var code;\n    var skipHighlight = false;\n    if (!content) {\n      code = $('<code />').text('no content');\n      pre = $('<pre class=\"json\" />').append(code);\n\n      // JSON\n    } else if (\n        contentType === 'application/octet-stream' ||\n        headers['Content-Disposition'] && (/attachment/).test(headers['Content-Disposition']) ||\n        headers['content-disposition'] && (/attachment/).test(headers['content-disposition']) ||\n        headers['Content-Description'] && (/File Transfer/).test(headers['Content-Description']) ||\n        headers['content-description'] && (/File Transfer/).test(headers['content-description'])) {\n\n      if ('Blob' in window) {\n        var type = contentType || 'text/html';\n        var a = document.createElement('a');\n        var href;\n\n        if({}.toString.apply(content) === '[object Blob]') {\n          href = window.URL.createObjectURL(content);\n        }\n        else {\n          var binaryData = [];\n          binaryData.push(content);\n          href = window.URL.createObjectURL(new Blob(binaryData, {type: type}));\n        }\n        var fileName = response.url.substr(response.url.lastIndexOf('/') + 1);\n        var download = [type, fileName, href].join(':');\n\n        // Use filename from response header\n        var disposition = headers['content-disposition'] || headers['Content-Disposition'];\n        if(typeof disposition !== 'undefined') {\n          var responseFilename = /filename=([^;]*);?/.exec(disposition);\n          if(responseFilename !== null && responseFilename.length > 1) {\n            download = responseFilename[1];\n            fileName = download;\n          }\n        }\n\n        a.setAttribute('href', href);\n        a.setAttribute('download', download);\n        a.innerText = 'Download ' + fileName;\n\n        pre = $('<div/>').append(a);\n        skipHighlight = true;\n      } else {\n        pre = $('<pre class=\"json\" />').append('Download headers detected but your browser does not support downloading binary via XHR (Blob).');\n      }\n    } else if (contentType === 'application/json' || /\\+json$/.test(contentType)) {\n      var json = null;\n      try {\n        json = JSON.stringify(JSON.parse(content), null, '  ');\n      } catch (_error) {\n        json = 'can\\'t parse JSON.  Raw result:\\n\\n' + content;\n      }\n      code = $('<code />').text(json);\n      pre = $('<pre class=\"json\" />').append(code);\n\n      // XML\n    } else if (contentType === 'application/xml' || /\\+xml$/.test(contentType)) {\n      code = $('<code />').text(this.formatXml(content));\n      pre = $('<pre class=\"xml\" />').append(code);\n\n      // HTML\n    } else if (contentType === 'text/html') {\n      code = $('<code />').html(_.escape(content));\n      pre = $('<pre class=\"xml\" />').append(code);\n\n      // Plain Text\n    } else if (/text\\/plain/.test(contentType)) {\n      code = $('<code />').text(content);\n      pre = $('<pre class=\"plain\" />').append(code);\n\n      // Image\n    } else if (/^image\\//.test(contentType)) {\n      var urlCreator = window.URL || window.webkitURL;\n      var imageUrl = urlCreator.createObjectURL(content);\n\n      pre = $('<img>').attr( 'src', imageUrl);\n      // Audio\n    } else if (/^audio\\//.test(contentType) && supportsAudioPlayback(contentType)) {\n      pre = $('<audio controls>').append($('<source>').attr('src', url).attr('type', contentType));\n    } else if(headers.location || headers.Location) {\n      // Location header based redirect download\n      window.location = response.url;\n\n      // Anything else (CORS)\n    } else {\n      code = $('<code />').text(content);\n      pre = $('<pre class=\"json\" />').append(code);\n    }\n    var response_body = pre;\n    $('.request_url', $(this.el)).html('<pre></pre>');\n    $('.request_url pre', $(this.el)).text(url);\n    $('.response_code', $(this.el)).html('<pre>' + response.status + '</pre>');\n    $('.response_body', $(this.el)).html(response_body);\n    $('.response_headers', $(this.el)).html('<pre>' + _.escape(JSON.stringify(response.headers, null, '  ')).replace(/\\n/g, '<br>') + '</pre>');\n    $('.response', $(this.el)).slideDown();\n    $('.response_hider', $(this.el)).show();\n    $('.response_throbber', $(this.el)).hide();\n\n\n    // adds curl output\n    var curlCommand = this.model.asCurl(this.map, {responseContentType: contentType});\n    curlCommand = curlCommand.replace('!', '&#33;');\n    $( 'div.curl', $(this.el)).html('<pre>' + _.escape(curlCommand) + '</pre>');\n\n    // only highlight the response if response is less than threshold, default state is highlight response\n    var opts = this.options.swaggerOptions;\n\n    if (opts.showRequestHeaders) {\n      var form = $('.sandbox', $(this.el)),\n          map = this.getInputMap(form),\n          requestHeaders = this.model.getHeaderParams(map);\n      delete requestHeaders['Content-Type'];\n      $('.request_headers', $(this.el)).html('<pre>' + _.escape(JSON.stringify(requestHeaders, null, '  ')).replace(/\\n/g, '<br>') + '</pre>');\n    }\n\n    // Call user-defined hook\n    if (opts.responseHooks && opts.responseHooks[this.nickname]) {\n      opts.responseHooks[this.nickname](response, this);\n    }\n\n    var response_body_el = $('.response_body', $(this.el))[0];\n    // only highlight the response if response is less than threshold, default state is highlight response\n    if (opts.highlightSizeThreshold && typeof response.data !== 'undefined' && response.data.length > opts.highlightSizeThreshold || skipHighlight) {\n      return response_body_el;\n    } else {\n      return hljs.highlightBlock(response_body_el);\n    }\n  },\n\n  toggleOperationContent: function (event) {\n    var elem = $('#' + Docs.escapeResourceName(this.parentId + '_' + this.nickname + '_content'));\n    if (elem.is(':visible')){\n      $.bbq.pushState('#/', 2);\n      event.preventDefault();\n      Docs.collapseOperation(elem);\n    } else {\n      Docs.expandOperation(elem);\n    }\n  },\n\n  getTextAreaValue: function(textArea) {\n    var param, parsed, result, i;\n    if (textArea.value === null || jQuery.trim(textArea.value).length === 0) {\n      return null;\n    }\n    param = this.getParamByName(textArea.name);\n    if (param && param.type && param.type.toLowerCase() === 'array') {\n      parsed = textArea.value.split('\\n');\n      result = [];\n      for (i = 0; i < parsed.length; i++) {\n        if (parsed[i] !== null && jQuery.trim(parsed[i]).length > 0) {\n          result.push(parsed[i]);\n        }\n      }\n      return result.length > 0 ? result : null;\n    } else {\n      return textArea.value;\n    }\n  },\n\n  showSnippet: function () {\n    var contentTypeEl = this.$('[name=responseContentType]');\n    var xmlSnippetEl = this.$('.operation-status .snippet_xml, .response-class .snippet_xml');\n    var jsonSnippetEl = this.$('.operation-status .snippet_json, .response-class .snippet_json');\n    var contentType;\n\n    if (!contentTypeEl.length) { return; }\n    contentType = contentTypeEl.val();\n\n    if (contentType.indexOf('xml') > -1) {\n      xmlSnippetEl.show();\n      jsonSnippetEl.hide();\n    } else {\n      jsonSnippetEl.show();\n      xmlSnippetEl.hide();\n    }\n  },\n\n  getParamByName: function(name) {\n    var i;\n    if (this.model.parameters) {\n      for(i = 0; i < this.model.parameters.length; i++) {\n        if (this.model.parameters[i].name === name) {\n          return this.model.parameters[i];\n        }\n      }\n    }\n    return null;\n  }\n\n});\n\n'use strict';\n\nSwaggerUi.Views.ParameterContentTypeView = Backbone.View.extend({\n  initialize: function  () {},\n\n  render: function(){\n    this.model.parameterContentTypeId = 'pct' + Math.random();\n    $(this.el).html(Handlebars.templates.parameter_content_type(this.model));\n    return this;\n  }\n\n});\n'use strict';\n\nSwaggerUi.Views.ParameterView = Backbone.View.extend({\n  events: {\n    'change [name=parameterContentType]' : 'toggleParameterSnippet'\n  },\n\n  initialize: function(){\n    Handlebars.registerHelper('isArray', function(param, opts) {\n      var paramType = param.type && param.type.toLowerCase();\n      if (paramType === 'array' || param.allowMultiple) {\n        return opts.fn(this);\n      } else {\n        return opts.inverse(this);\n      }\n    });\n  },\n\n  render: function() {\n    var type = this.model.type || this.model.dataType;\n    var modelType = this.model.modelSignature.type;\n    var modelDefinitions = this.model.modelSignature.definitions;\n    var schema = this.model.schema || {};\n    var consumes = this.model.consumes || [];\n    var sampleJSON, signatureView;\n\n    if (typeof type === 'undefined') {\n      if (schema.$ref) {\n        var ref = schema.$ref;\n        if (ref.indexOf('#/definitions/') === 0) {\n          type = ref.substring('#/definitions/'.length);\n        } else {\n          type = ref;\n        }\n      }\n    }\n\n    this.model.type = type;\n    this.model.paramType = this.model.in || this.model.paramType;\n    this.model.isBody = this.model.paramType === 'body' || this.model.in === 'body';\n    this.model.isFile = type && type.toLowerCase() === 'file';\n\n    // Allow for default === false\n    if(typeof this.model.default === 'undefined') {\n      this.model.default = this.model.defaultValue;\n    }\n\n    this.model.hasDefault = (typeof this.model.default !== 'undefined');\n    this.model.valueId = 'm' + this.model.name + Math.random();\n\n    if (this.model.allowableValues) {\n      this.model.isList = true;\n    }\n\n    var isXML = this.contains(consumes, 'xml');\n    var isJSON = isXML ? this.contains(consumes, 'json') : true;\n    sampleJSON = SwaggerUi.partials.signature.createParameterJSONSample(modelType, modelDefinitions);\n\n    var template = this.template();\n    $(this.el).html(template(this.model));\n\n    var signatureModel = {\n      sampleJSON: isJSON ? sampleJSON : false,\n      sampleXML: sampleJSON && isXML ? SwaggerUi.partials.signature.createXMLSample('', schema, modelDefinitions, true) : false,\n      isParam: true,\n      signature: SwaggerUi.partials.signature.getParameterModelSignature(modelType, modelDefinitions),\n      defaultRendering: this.model.defaultRendering\n    };\n\n    if (sampleJSON) {\n      signatureView = new SwaggerUi.Views.SignatureView({model: signatureModel, tagName: 'div'});\n      $('.model-signature', $(this.el)).append(signatureView.render().el);\n    }\n    else {\n      $('.model-signature', $(this.el)).html(this.model.signature);\n    }\n\n    var isParam = false;\n\n    if( this.options.swaggerOptions.jsonEditor && this.model.isBody && this.model.schema){\n      var $self = $(this.el);\n      this.model.jsonEditor =\n        /* global JSONEditor */\n        new JSONEditor($('.editor_holder', $self)[0],\n                       {schema: this.model.schema, startval : this.model.default,\n                        ajax:true,\n                        disable_properties:true,\n                        disable_edit_json:true,\n                        iconlib: 'swagger' });\n      // This is so that the signature can send back the sample to the json editor\n      // TODO: SignatureView should expose an event \"onSampleClicked\" instead\n      signatureModel.jsonEditor = this.model.jsonEditor;\n      $('.body-textarea', $self).hide();\n      $('.editor_holder', $self).show();\n      $('.parameter-content-type', $self)\n        .change(function(e){\n            if(e.target.value === 'application/xml'){\n              $('.body-textarea', $self).show();\n              $('.editor_holder', $self).hide();\n              this.model.jsonEditor.disable();\n            }\n            else {\n              $('.body-textarea', $self).hide();\n              $('.editor_holder', $self).show();\n              this.model.jsonEditor.enable();\n            }\n        });\n      }\n\n\n    if (this.model.isBody) {\n      isParam = true;\n    }\n\n    var contentTypeModel = {\n      isParam: isParam\n    };\n\n    contentTypeModel.consumes = this.model.consumes;\n\n    if (isParam) {\n      var parameterContentTypeView = new SwaggerUi.Views.ParameterContentTypeView({model: contentTypeModel});\n      $('.parameter-content-type', $(this.el)).append(parameterContentTypeView.render().el);\n      this.toggleParameterSnippet();\n    }\n\n    else {\n      var responseContentTypeView = new SwaggerUi.Views.ResponseContentTypeView({model: contentTypeModel});\n      $('.response-content-type', $(this.el)).append(responseContentTypeView.render().el);\n      this.toggleResponseSnippet();\n    }\n\n    return this;\n  },\n\n  contains: function (consumes, type) {\n    return consumes.filter(function (val) {\n      if (val.indexOf(type) > -1) {\n        return true;\n      }\n    }).length;\n  },\n\n  toggleParameterSnippet: function () {\n    var contentType = this.$('[name=parameterContentType]').val();\n\n    this.toggleSnippet(contentType);\n  },\n\n  toggleResponseSnippet: function () {\n    var contentEl = this.$('[name=responseContentType]');\n\n    if (!contentEl.length) { return; }\n\n    this.toggleSnippet(contentEl.val());\n  },\n\n  toggleSnippet: function (type) {\n    type = type || '';\n    if (type.indexOf('xml') > -1) {\n      this.$('.snippet_xml').show();\n      this.$('.snippet_json').hide();\n    } else {\n      this.$('.snippet_json').show();\n      this.$('.snippet_xml').hide();\n    }\n  },\n\n  // Return an appropriate template based on if the parameter is a list, readonly, required\n  template: function(){\n    if (this.model.isList) {\n      return Handlebars.templates.param_list;\n    } else {\n      if (this.options.readOnly) {\n        if (this.model.required) {\n          return Handlebars.templates.param_readonly_required;\n        } else {\n          return Handlebars.templates.param_readonly;\n        }\n      } else {\n        if (this.model.required) {\n          return Handlebars.templates.param_required;\n        } else {\n          return Handlebars.templates.param;\n        }\n      }\n    }\n  }\n});\n\n'use strict';\n\n/* jshint -W122 */\nSwaggerUi.partials.signature = (function () {\n  // copy-pasted from swagger-js\n  var resolveSchema = function (schema) {\n    if (_.isPlainObject(schema.schema)) {\n      schema = resolveSchema(schema.schema);\n    }\n\n    return schema;\n  };\n\n  // copy-pasted from swagger-js\n  var simpleRef = function (name) {\n    if (typeof name === 'undefined') {\n      return null;\n    }\n\n    if (name.indexOf('#/definitions/') === 0) {\n      return name.substring('#/definitions/'.length);\n    } else {\n      return name;\n    }\n  };\n\n  // copy-pasted from swagger-js\n  var getInlineModel = function(inlineStr) {\n    if(/^Inline Model \\d+$/.test(inlineStr) && this.inlineModels) {\n      var id = parseInt(inlineStr.substr('Inline Model'.length).trim(),10); //\n      var model = this.inlineModels[id];\n      return model;\n    }\n    // I'm returning null here, should I rather throw an error?\n    return null;\n  };\n\n  // copy-pasted from swagger-js\n  var formatXml = function(xml) {\n    var contexp, fn, formatted, indent, l, lastType, len, lines, ln, pad, reg, transitions, wsexp;\n    reg = /(>)(<)(\\/*)/g;\n    wsexp = /[ ]*(.*)[ ]+\\n/g;\n    contexp = /(<.+>)(.+\\n)/g;\n    xml = xml.replace(reg, '$1\\n$2$3').replace(wsexp, '$1\\n').replace(contexp, '$1\\n$2');\n    pad = 0;\n    formatted = '';\n    lines = xml.split('\\n');\n    indent = 0;\n    lastType = 'other';\n    transitions = {\n      'single->single': 0,\n      'single->closing': -1,\n      'single->opening': 0,\n      'single->other': 0,\n      'closing->single': 0,\n      'closing->closing': -1,\n      'closing->opening': 0,\n      'closing->other': 0,\n      'opening->single': 1,\n      'opening->closing': 0,\n      'opening->opening': 1,\n      'opening->other': 1,\n      'other->single': 0,\n      'other->closing': -1,\n      'other->opening': 0,\n      'other->other': 0\n    };\n    fn = function(ln) {\n      var fromTo, j, key, padding, type, types, value;\n      types = {\n        single: Boolean(ln.match(/<.+\\/>/)),\n        closing: Boolean(ln.match(/<\\/.+>/)),\n        opening: Boolean(ln.match(/<[^!?].*>/))\n      };\n      type = ((function() {\n        var results;\n        results = [];\n        for (key in types) {\n          value = types[key];\n          if (value) {\n            results.push(key);\n          }\n        }\n        return results;\n      })())[0];\n      type = type === void 0 ? 'other' : type;\n      fromTo = lastType + '->' + type;\n      lastType = type;\n      padding = '';\n      indent += transitions[fromTo];\n      padding = ((function() {\n        var m, ref1, results;\n        results = [];\n        for (j = m = 0, ref1 = indent; 0 <= ref1 ? m < ref1 : m > ref1; j = 0 <= ref1 ? ++m : --m) {\n          results.push('  ');\n        }\n        return results;\n      })()).join('');\n      if (fromTo === 'opening->closing') {\n        formatted = formatted.substr(0, formatted.length - 1) + ln + '\\n';\n      } else {\n        formatted += padding + ln + '\\n';\n      }\n    };\n    for (l = 0, len = lines.length; l < len; l++) {\n      ln = lines[l];\n      fn(ln);\n    }\n    return formatted;\n  };\n\n  // copy-pasted from swagger-js\n  var getModelSignature = function (name, schema, models, modelPropertyMacro) {\n    var strongOpen = '<span class=\"strong\">';\n    var strongClose = '</span>';\n\n    var optionHtml = function (label, value) {\n      return '<tr><td class=\"optionName\">' + label + ':</td><td>' + value + '</td></tr>';\n    };\n\n\n    // Allow for ignoring the 'name' argument.... shifting the rest\n    if(_.isObject(arguments[0])) {\n      name = void 0;\n      schema = arguments[0];\n      models = arguments[1];\n      modelPropertyMacro = arguments[2];\n    }\n\n    models = models || {};\n\n    // Resolve the schema (Handle nested schemas)\n    schema = resolveSchema(schema);\n\n    // Return for empty object\n    if(_.isEmpty(schema)) {\n      return strongOpen + 'Empty' + strongClose;\n    }\n\n    // Dereference $ref from 'models'\n    if(typeof schema.$ref === 'string') {\n      name = simpleRef(schema.$ref);\n      schema = models[name];\n      if(typeof schema === 'undefined')\n      {\n        return strongOpen + name + ' is not defined!' + strongClose;\n      }\n    }\n\n    if(typeof name !== 'string') {\n      name = schema.title || 'Inline Model';\n    }\n\n    // If we are a Model object... adjust accordingly\n    if(schema.definition) {\n      schema = schema.definition;\n    }\n\n    if(typeof modelPropertyMacro !== 'function') {\n      modelPropertyMacro = function(prop){\n        return (prop || {}).default;\n      };\n    }\n\n    var references = {};\n    var seenModels = [];\n    var inlineModels = 0;\n\n    // Generate current HTML\n    var html = processModel(schema, name);\n\n    // Generate references HTML\n    while (_.keys(references).length > 0) {\n      /* jshint ignore:start */\n      _.forEach(references, function (schema, name) {\n        var seenModel = _.indexOf(seenModels, name) > -1;\n\n        delete references[name];\n\n        if (!seenModel) {\n          seenModels.push(name);\n\n          html += '<br />' + processModel(schema, name);\n        }\n      });\n      /* jshint ignore:end */\n    }\n\n    return html;\n\n\n    function addReference(schema, name, skipRef) {\n      var modelName = name;\n      var model;\n\n      if (schema.$ref) {\n        modelName = schema.title || simpleRef(schema.$ref);\n        model = models[simpleRef(schema.$ref)];\n      } else if (_.isUndefined(name)) {\n        modelName = schema.title || 'Inline Model ' + (++inlineModels);\n        model = {definition: schema};\n      }\n\n      if (skipRef !== true) {\n        references[modelName] = _.isUndefined(model) ? {} : model.definition;\n      }\n\n      return modelName;\n    }\n\n    function primitiveToHTML(schema) {\n      var html = '<span class=\"propType\">';\n      var type = schema.type || 'object';\n\n      if (schema.$ref) {\n        html += addReference(schema, simpleRef(schema.$ref));\n      } else if (type === 'object') {\n        if (!_.isUndefined(schema.properties)) {\n          html += addReference(schema);\n        } else {\n          html += 'object';\n        }\n      } else if (type === 'array') {\n        html += 'Array[';\n\n        if (_.isArray(schema.items)) {\n          html += _.map(schema.items, addReference).join(',');\n        } else if (_.isPlainObject(schema.items)) {\n          if (_.isUndefined(schema.items.$ref)) {\n            if (!_.isUndefined(schema.items.type) && _.indexOf(['array', 'object'], schema.items.type) === -1) {\n              html += schema.items.type;\n            } else {\n              html += addReference(schema.items);\n            }\n          } else {\n            html += addReference(schema.items, simpleRef(schema.items.$ref));\n          }\n        } else {\n          console.log('Array type\\'s \\'items\\' schema is not an array or an object, cannot process');\n          html += 'object';\n        }\n\n        html += ']';\n      } else {\n        html += schema.type;\n      }\n\n      html += '</span>';\n\n      return html;\n    }\n\n    function primitiveToOptionsHTML(schema, html) {\n      var options = '';\n      var type = schema.type || 'object';\n      var isArray = type === 'array';\n\n      if (!_.isUndefined(schema.description)) {\n        html += ': ' + '<span class=\"propDesc\">' + schema.description + '</span>';\n      }\n\n      if (schema.enum) {\n        html += ' = <span class=\"propVals\">[\\'' + schema.enum.join('\\', \\'') + '\\']</span>';\n      }\n\n      if (isArray) {\n        if (_.isPlainObject(schema.items) && !_.isUndefined(schema.items.type)) {\n          type = schema.items.type;\n        } else {\n          type = 'object';\n        }\n      }\n\n      if (!_.isUndefined(schema.default)) {\n        options += optionHtml('Default', schema.default);\n      }\n\n      switch (type) {\n      case 'string':\n        if (schema.minLength) {\n          options += optionHtml('Min. Length', schema.minLength);\n        }\n\n        if (schema.maxLength) {\n          options += optionHtml('Max. Length', schema.maxLength);\n        }\n\n        if (schema.pattern) {\n          options += optionHtml('Reg. Exp.', schema.pattern);\n        }\n        break;\n      case 'integer':\n      case 'number':\n        if (schema.minimum) {\n          options += optionHtml('Min. Value', schema.minimum);\n        }\n\n        if (schema.exclusiveMinimum) {\n          options += optionHtml('Exclusive Min.', 'true');\n        }\n\n        if (schema.maximum) {\n          options += optionHtml('Max. Value', schema.maximum);\n        }\n\n        if (schema.exclusiveMaximum) {\n          options += optionHtml('Exclusive Max.', 'true');\n        }\n\n        if (schema.multipleOf) {\n          options += optionHtml('Multiple Of', schema.multipleOf);\n        }\n\n        break;\n      }\n\n      if (isArray) {\n        if (schema.minItems) {\n          options += optionHtml('Min. Items', schema.minItems);\n        }\n\n        if (schema.maxItems) {\n          options += optionHtml('Max. Items', schema.maxItems);\n        }\n\n        if (schema.uniqueItems) {\n          options += optionHtml('Unique Items', 'true');\n        }\n\n        if (schema.collectionFormat) {\n          options += optionHtml('Coll. Format', schema.collectionFormat);\n        }\n      }\n\n      if (_.isUndefined(schema.items)) {\n        if (_.isArray(schema.enum)) {\n          var enumString;\n\n          if (type === 'number' || type === 'integer') {\n            enumString = schema.enum.join(', ');\n          } else {\n            enumString = '\"' + schema.enum.join('\", \"') + '\"';\n          }\n\n          options += optionHtml('Enum', enumString);\n        }\n      }\n\n      if (options.length > 0) {\n        html = '<span class=\"propWrap\">' + html + '<table class=\"optionsWrapper\"><tr><th colspan=\"2\">' + type + '</th></tr>' + options + '</table></span>';\n      }\n\n      return html;\n    }\n\n    function processModel(schema, name) {\n      var type = schema.type || 'object';\n      var isArray = schema.type === 'array';\n      var html = strongOpen + name + ' ' + (isArray ? '[' : '{') + strongClose;\n      var contents;\n\n      if (name) {\n        seenModels.push(name);\n      }\n\n      if (isArray) {\n        if (_.isArray(schema.items)) {\n          html += '<div>' + _.map(schema.items, function (item) {\n            var type = item.type || 'object';\n\n            if (_.isUndefined(item.$ref)) {\n              if (_.indexOf(['array', 'object'], type) > -1) {\n                if (type === 'object' && _.isUndefined(item.properties)) {\n                  return 'object';\n                } else {\n                  return addReference(item);\n                }\n              } else {\n                return primitiveToOptionsHTML(item, type);\n              }\n            } else {\n              return addReference(item, simpleRef(item.$ref));\n            }\n          }).join(',</div><div>');\n        } else if (_.isPlainObject(schema.items)) {\n          if (_.isUndefined(schema.items.$ref)) {\n            if (_.indexOf(['array', 'object'], schema.items.type || 'object') > -1) {\n              if ((_.isUndefined(schema.items.type) || schema.items.type === 'object') && _.isUndefined(schema.items.properties)) {\n                html += '<div>object</div>';\n              } else {\n                html += '<div>' + addReference(schema.items) + '</div>';\n              }\n            } else {\n              html += '<div>' + primitiveToOptionsHTML(schema.items, schema.items.type) + '</div>';\n            }\n          } else {\n            html += '<div>' + addReference(schema.items, simpleRef(schema.items.$ref)) + '</div>';\n          }\n        } else {\n          console.log('Array type\\'s \\'items\\' property is not an array or an object, cannot process');\n          html += '<div>object</div>';\n        }\n      } else {\n        if (schema.$ref) {\n          html += '<div>' + addReference(schema, name) + '</div>';\n        } else if (type === 'object') {\n          if (_.isPlainObject(schema.properties)) {\n            contents = _.map(schema.properties, function (property, name) {\n              var propertyIsRequired = (_.indexOf(schema.required, name) >= 0);\n              var cProperty = _.cloneDeep(property);\n\n              var requiredClass = propertyIsRequired ? 'required' : '';\n              var html = '<span class=\"propName ' + requiredClass + '\">' + name + '</span> (';\n              var model;\n\n              // Allow macro to set the default value\n              cProperty.default = modelPropertyMacro(cProperty);\n\n              // Resolve the schema (Handle nested schemas)\n              cProperty = resolveSchema(cProperty);\n\n              // We need to handle property references to primitives (Issue 339)\n              if (!_.isUndefined(cProperty.$ref)) {\n                model = models[simpleRef(cProperty.$ref)];\n\n                if (!_.isUndefined(model) && _.indexOf([undefined, 'array', 'object'], model.definition.type) === -1) {\n                  // Use referenced schema\n                  cProperty = resolveSchema(model.definition);\n                }\n              }\n\n              html += primitiveToHTML(cProperty);\n\n              if(!propertyIsRequired) {\n                html += ', <span class=\"propOptKey\">optional</span>';\n              }\n\n              if(property.readOnly) {\n                  html += ', <span class=\"propReadOnly\">read only</span>';\n              }\n\n              html += ')';\n\n              return '<div' + (property.readOnly ? ' class=\"readOnly\"' : '') + '>' + primitiveToOptionsHTML(cProperty, html);\n            }).join(',</div>');\n          }\n\n          if (contents) {\n            html += contents + '</div>';\n          }\n        } else {\n          html += '<div>' + primitiveToOptionsHTML(schema, type) + '</div>';\n        }\n      }\n\n      return html + strongOpen + (isArray ? ']' : '}') + strongClose;\n    }\n\n  };\n\n  // copy-pasted from swagger-js\n  var schemaToJSON = function (schema, models, modelsToIgnore, modelPropertyMacro) {\n    // Resolve the schema (Handle nested schemas)\n    schema = resolveSchema(schema);\n\n    if(typeof modelPropertyMacro !== 'function') {\n      modelPropertyMacro = function(prop){\n        return (prop || {}).default;\n      };\n    }\n\n    modelsToIgnore= modelsToIgnore || {};\n\n    var type = schema.type || 'object';\n    var format = schema.format;\n    var model;\n    var output;\n\n    if (!_.isUndefined(schema.example)) {\n      output = schema.example;\n    } else if (_.isUndefined(schema.items) && _.isArray(schema.enum)) {\n      output = schema.enum[0];\n    }\n\n    if (_.isUndefined(output)) {\n      if (schema.$ref) {\n        model = models[simpleRef(schema.$ref)];\n\n        if (!_.isUndefined(model)) {\n          if (_.isUndefined(modelsToIgnore[model.name])) {\n            modelsToIgnore[model.name] = model;\n            output = schemaToJSON(model.definition, models, modelsToIgnore, modelPropertyMacro);\n            delete modelsToIgnore[model.name];\n          } else {\n            if (model.type === 'array') {\n              output = [];\n            } else {\n              output = {};\n            }\n          }\n        }\n      } else if (!_.isUndefined(schema.default)) {\n        output = schema.default;\n      } else if (type === 'string') {\n        if (format === 'date-time') {\n          output = new Date().toISOString();\n        } else if (format === 'date') {\n          output = new Date().toISOString().split('T')[0];\n        } else {\n          output = 'string';\n        }\n      } else if (type === 'integer') {\n        output = 0;\n      } else if (type === 'number') {\n        output = 0.0;\n      } else if (type === 'boolean') {\n        output = true;\n      } else if (type === 'object') {\n        output = {};\n\n        _.forEach(schema.properties, function (property, name) {\n          var cProperty = _.cloneDeep(property);\n\n          // Allow macro to set the default value\n          cProperty.default = modelPropertyMacro(property);\n\n          output[name] = schemaToJSON(cProperty, models, modelsToIgnore, modelPropertyMacro);\n        });\n      } else if (type === 'array') {\n        output = [];\n\n        if (_.isArray(schema.items)) {\n          _.forEach(schema.items, function (item) {\n            output.push(schemaToJSON(item, models, modelsToIgnore, modelPropertyMacro));\n          });\n        } else if (_.isPlainObject(schema.items)) {\n          output.push(schemaToJSON(schema.items, models, modelsToIgnore, modelPropertyMacro));\n        } else if (_.isUndefined(schema.items)) {\n          output.push({});\n        } else {\n          console.log('Array type\\'s \\'items\\' property is not an array or an object, cannot process');\n        }\n      }\n    }\n\n    return output;\n  };\n\n  // copy-pasted from swagger-js\n  var createJSONSample = function (value, modelsToIgnore) {\n    modelsToIgnore = modelsToIgnore || {};\n\n    modelsToIgnore[value.name] = value;\n\n    // Response support\n    if (value.examples && _.isPlainObject(value.examples)) {\n      value = _.cloneDeep(value);\n      var keys = Object.keys(value.examples);\n\n      _.forEach(keys, function(key) {\n        if(key.indexOf('application/json') === 0) {\n          var example = value.examples[key];\n          if (_.isString(example)) {\n            example = jsyaml.safeLoad(example);\n          }\n          value.definition.example = example;\n          return schemaToJSON(value.definition, example, modelsToIgnore, value.modelPropertyMacro);\n        }\n      });\n    }\n\n    if (value.examples) {\n      value = _.cloneDeep(value);\n      var example = value.examples;\n      if (_.isString(example)) {\n        example = jsyaml.safeLoad(example);\n      }\n      value.definition.example = example;\n      return schemaToJSON(value.definition, example, modelsToIgnore, value.modelPropertyMacro);\n    }\n\n    return schemaToJSON(value.definition, value.models, modelsToIgnore, value.modelPropertyMacro);\n  };\n\n  // copy-pasted from swagger-js\n  var getParameterModelSignature = function (type, definitions) {\n      var isPrimitive, listType;\n\n      if (type instanceof Array) {\n        listType = true;\n        type = type[0];\n      }\n\n      // Convert undefined to string of 'undefined'\n      if (typeof type === 'undefined') {\n        type = 'undefined';\n        isPrimitive = true;\n\n      } else if (definitions[type]){\n        // a model def exists?\n        type = definitions[type]; /* Model */\n        isPrimitive = false;\n\n      } else if (getInlineModel(type)) {\n        type = getInlineModel(type); /* Model */\n        isPrimitive = false;\n\n      } else {\n        // We default to primitive\n        isPrimitive = true;\n      }\n\n      if (isPrimitive) {\n        if (listType) {\n          return 'Array[' + type + ']';\n        } else {\n          return type.toString();\n        }\n      } else {\n        if (listType) {\n          return 'Array[' + getModelSignature(type.name, type.definition, type.models, type.modelPropertyMacro) + ']';\n        } else {\n          return getModelSignature(type.name, type.definition, type.models, type.modelPropertyMacro);\n        }\n      }\n  };\n\n  // copy-pasted from swagger-js\n  var createParameterJSONSample = function (type, models) {\n    var listType, sampleJson, innerType;\n    models = models || {};\n\n    listType = (type instanceof Array);\n    innerType = listType ? type[0] : type;\n\n    if(models[innerType]) {\n      sampleJson = createJSONSample(models[innerType]);\n    } else if (getInlineModel(innerType)){\n      sampleJson = createJSONSample(getInlineModel(innerType)); // may return null, if type isn't correct\n    }\n\n\n    if (sampleJson) {\n      sampleJson = listType ? [sampleJson] : sampleJson;\n\n      if (typeof sampleJson === 'string') {\n        return sampleJson;\n      } else if (_.isObject(sampleJson)) {\n        var t = sampleJson;\n\n        if (sampleJson instanceof Array && sampleJson.length > 0) {\n          t = sampleJson[0];\n        }\n\n        if (t.nodeName && typeof t === 'Node') {\n          var xmlString = new XMLSerializer().serializeToString(t);\n\n          return formatXml(xmlString);\n        } else {\n          return JSON.stringify(sampleJson, null, 2);\n        }\n      } else {\n        return sampleJson;\n      }\n    }\n  };\n\n  var wrapTag = function (name, value, attrs) {\n    var str, attributes;\n\n    attrs = attrs || [];\n\n    attributes = attrs.map(function (attr) {\n      return ' ' + attr.name + '=\"' + attr.value + '\"';\n    }).join('');\n\n    if (!name) {\n      return getErrorMessage('Node name is not provided');\n    }\n\n    str = [\n      '<', name,\n      attributes,\n      '>',\n      value,\n      '</', name, '>'\n    ];\n\n    return str.join('');\n  };\n\n  // Commenting this funtion as the names are now determined beforehand and the prefix part is exposed as a separate function | https://github.com/swagger-api/swagger-ui/issues/2577\n /** var getName = function (name, xml) {\n    var result = name || '';\n\n    xml = xml || {};\n\n    if (xml.name) {\n      result = xml.name;\n    }\n\n    if (xml.prefix) {\n      result = xml.prefix + ':' + result;\n    }\n\n    return result;\n  };\n  */\n  \n  var getPrefix = function (name, xml) {\n    var result = name || '';\n\n    xml = xml || {};\n\n    if (xml.prefix) {\n      result = xml.prefix + ':' + result;\n    }\n\n    return result;\n  };\n\n  var getNamespace = function (xml) {\n    var namespace = '';\n    var name = 'xmlns';\n\n    xml = xml || {};\n\n    if (xml.namespace) {\n      namespace = xml.namespace;\n    } else {\n      return namespace;\n    }\n\n    if (xml.prefix) {\n      name += ':' + xml.prefix;\n    }\n\n    return {\n      name: name,\n      value: namespace\n    };\n  };\n\n  var createArrayXML = function (descriptor) {\n    var name = descriptor.name;\n    var config = descriptor.config;\n    var definition = descriptor.definition;\n    var models = descriptor.models;\n    var value;\n    var items = definition.items;\n    var xml = definition.xml || {};\n    var namespace = getNamespace(xml);\n    var attributes = [];\n\n    if (!items) { return getErrorMessage(); }\n    var key = name;\n    // If there is a name specified for the array elements, use that for the array elements name | https://github.com/swagger-api/swagger-ui/issues/2577\n    if(items.xml && items.xml.name) {\n        key = items.xml.name;\n    }\n    value = createSchemaXML(key, items, models, config);\n    if (namespace) {\n      attributes.push(namespace);\n    }\n\n    if (xml.wrapped) {\n      value = wrapTag(name, value, attributes);\n    }\n\n    return value;\n  };\n\n  var getPrimitiveSignature = function (schema) {\n    var type, items;\n\n    schema = schema || {};\n    items = schema.items || {};\n    type = schema.type || '';\n\n    switch (type) {\n      case 'object': return 'Object is not a primitive';\n      case 'array' : return 'Array[' + (items.format || items.type) + ']';\n      default: return schema.format || type;\n    }\n  };\n\n  var createPrimitiveXML = function (descriptor) {\n    var name = descriptor.name;\n    var definition = descriptor.definition;\n    var primitivesMap = {\n      'string': {\n        'date': new Date(1).toISOString().split('T')[0],\n        'date-time' : new Date(1).toISOString(),\n        'default': 'string'\n      },\n      'integer': {\n        'default': 1\n      },\n      'number': {\n        'default': 1.1\n      },\n      'boolean': {\n        'default': true\n      }\n    };\n    var type = definition.type;\n    var format = definition.format;\n    var xml = definition.xml || {};\n    var namespace = getNamespace(xml);\n    var attributes = [];\n    var value;\n\n    if (_.keys(primitivesMap).indexOf(type) < 0) { return getErrorMessage(); }\n\n    if (_.isArray(definition.enum)){\n      value = definition.enum[0];\n    } else {\n      value = definition.example || primitivesMap[type][format] || primitivesMap[type].default;\n    }\n\n    if (xml.attribute) {\n      return {name: name, value: value};\n    }\n\n    if (namespace) {\n      attributes.push(namespace);\n    }\n\n    return wrapTag(name, value, attributes);\n  };\n\n  function createObjectXML (descriptor) {\n    var name = descriptor.name;\n    var definition = descriptor.definition;\n    var config = descriptor.config;\n    var models = descriptor.models;\n    var isParam = descriptor.config.isParam;\n    var serializedProperties;\n    var attrs = [];\n    var properties = definition.properties;\n    var additionalProperties = definition.additionalProperties;\n    var xml = definition.xml;\n    var namespace = getNamespace(xml);\n\n    if (namespace) {\n      attrs.push(namespace);\n    }   \n\n    if (!properties && !additionalProperties) { return getErrorMessage(); }\n\n    properties = properties || {};\n\n    serializedProperties = _.map(properties, function (prop, key) {\n      var xml, result;\n\n      if (isParam && prop.readOnly) {\n        return '';\n      }\n\n      xml = prop.xml || {};\n      result = createSchemaXML(key, prop, models, config);\n\n      if (xml.attribute) {\n        attrs.push(result);\n        return '';\n      }\n\n      return result;\n    }).join('');\n\n    if (additionalProperties) {\n      serializedProperties += '<!-- additional elements allowed -->';\n    }\n\n    return wrapTag(name, serializedProperties, attrs);\n  }\n\n  function getInfiniteLoopMessage (name, loopTo) {\n    return wrapTag(name, '<!-- Infinite loop $ref:' + loopTo + ' -->');\n  }\n\n  function getErrorMessage (details) {\n    details = details ? ': ' + details : '';\n    return '<!-- invalid XML' + details + ' -->';\n  }\n\n  function createSchemaXML (name, definition, models, config) {\n    var $ref = _.isObject(definition) ? definition.$ref : null;\n    var output, index;\n    config = config || {};\n    config.modelsToIgnore = config.modelsToIgnore || [];\n   \n    var descriptor = _.isString($ref) ? getDescriptorByRef($ref, name, models, config)\n        : getDescriptor(name, definition, models, config);\n    \n    if (!descriptor) {\n      return getErrorMessage();\n    }\n\n    switch (descriptor.type) {\n      case 'array':\n        output = createArrayXML(descriptor); break;\n      case 'object':\n        output = createObjectXML(descriptor); break;\n      case 'loop':\n        output = getInfiniteLoopMessage(descriptor.name, descriptor.config.loopTo); break;\n      default:\n        output = createPrimitiveXML(descriptor);\n    }\n\n    if ($ref && descriptor.type !== 'loop') {\n      index = config.modelsToIgnore.indexOf($ref);\n      if (index > -1) {\n        config.modelsToIgnore.splice(index, 1);\n      }\n    }\n\n    return output;\n  }\n\n  function Descriptor (name, type, definition, models, config) {\n    if (arguments.length < 4) {\n      throw new Error();\n    }\n    this.config = config || {};\n    this.config.modelsToIgnore = this.config.modelsToIgnore || [];\n    // name is already set by getDescriptorByRef or getDescriptor function depending on the type. Only prefix, if present is needed to be set here | https://github.com/swagger-api/swagger-ui/issues/2577\n    this.name = getPrefix(name, definition.xml);\n    this.definition = definition;\n    this.models = models;\n    this.type = type;\n  }\n\n  function getDescriptorByRef($ref, name, models, config) {\n    var modelType = simpleRef($ref);\n    var model = models[modelType] || {};\n    var type = model.definition && model.definition.type ? model.definition.type : 'object';\n    // If model definition xml name is present, then that will be preferred over model name. This is the case of preferring XmlElement name over XmlRootElement name if XmlElement name is provided | https://github.com/swagger-api/swagger-ui/issues/2577\n    if(model.definition && model.definition.xml && model.definition.xml.name) {\n        name = name || model.definition.xml.name || model.name;\n    }\n    // else only model name will be considered for determination | https://github.com/swagger-api/swagger-ui/issues/2577\n    else {\n        name = name || model.name;\n    }\n    \n    if (config.modelsToIgnore.indexOf($ref) > -1) {\n      type = 'loop';\n      config.loopTo = modelType;\n    } else {\n      config.modelsToIgnore.push($ref);\n    }\n\n    if (!model.definition) {\n      return null;\n    }\n    return new Descriptor(name, type, model.definition, models, config);    \n  }\n\n  function getDescriptor (name, definition, models, config){\n    var type = definition.type || 'object';\n    // If definition xml name is present, then that will be preferred over name | https://github.com/swagger-api/swagger-ui/issues/2577\n    if(definition.xml && definition.xml.name) {\n        name = definition.xml.name || name;\n    }\n    if (!definition) {\n      return null;\n    }\n\n    return new Descriptor(name, type, definition, models, config);\n  }\n\n  function createXMLSample (name, definition, models, isParam) {\n    var prolog = '<?xml version=\"1.0\"?>';\n\n    return formatXml(prolog + createSchemaXML(name, definition, models, { isParam: isParam } ));\n  }\n\n  return {\n      getModelSignature: getModelSignature,\n      createJSONSample: createJSONSample,\n      getParameterModelSignature: getParameterModelSignature,\n      createParameterJSONSample: createParameterJSONSample,\n      createSchemaXML: createSchemaXML,\n      createXMLSample: createXMLSample,\n      getPrimitiveSignature: getPrimitiveSignature\n  };\n\n})();\n\n'use strict';\n\nSwaggerUi.Views.PopupView = Backbone.View.extend({\n    events: {\n        'click .api-popup-cancel': 'cancelClick'\n    },\n\n    template: Handlebars.templates.popup,\n    className: 'api-popup-dialog',\n\n    selectors: {\n        content: '.api-popup-content',\n        main   : '#swagger-ui-container'\n    },\n\n    initialize: function(){\n        this.$el.html(this.template(this.model));\n    },\n\n    render: function () {\n        this.$(this.selectors.content).append(this.model.content);\n        $(this.selectors.main).first().append(this.el);\n        this.showPopup();\n\n        return this;\n    },\n\n    showPopup: function () {\n        this.$el.show();\n    },\n\n    cancelClick: function () {\n        this.remove();\n    }\n\n});\n\n'use strict';\n\nSwaggerUi.Views.ResourceView = Backbone.View.extend({\n  initialize: function(opts) {\n    opts = opts || {};\n    this.router = opts.router;\n    this.auths = opts.auths;\n    if ('' === this.model.description) {\n      this.model.description = null;\n    }\n    if (this.model.description) {\n      this.model.summary = this.model.description;\n    }\n    this.number = 0;\n  },\n\n  render: function(){\n    var methods = {};\n\n\n    $(this.el).html(Handlebars.templates.resource(this.model));\n\n    // Render each operation\n    for (var i = 0; i < this.model.operationsArray.length; i++) {\n      var operation = this.model.operationsArray[i];\n      var counter = 0;\n      var id = operation.nickname;\n\n      while (typeof methods[id] !== 'undefined') {\n        id = id + '_' + counter;\n        counter += 1;\n      }\n\n      methods[id] = operation;\n\n      operation.nickname = id;\n      operation.parentId = this.model.id;\n      operation.definitions = this.model.definitions; // make Json Schema available for JSonEditor in this operation\n      this.addOperation(operation);\n    }\n\n    $('.toggleEndpointList', this.el).click(this.callDocs.bind(this, 'toggleEndpointListForResource'));\n    $('.collapseResource', this.el).click(this.callDocs.bind(this, 'collapseOperationsForResource'));\n    $('.expandResource', this.el).click(this.callDocs.bind(this, 'expandOperationsForResource'));\n\n    return this;\n  },\n\n  addOperation: function(operation) {\n\n    operation.number = this.number;\n\n    // Render an operation and add it to operations li\n    var operationView = new SwaggerUi.Views.OperationView({\n      model: operation,\n      router: this.router,\n      tagName: 'li',\n      className: 'endpoint',\n      swaggerOptions: this.options.swaggerOptions,\n      auths: this.auths\n    });\n\n    $('.endpoints', $(this.el)).append(operationView.render().el);\n\n    this.number++;\n\n  },\n  // Generic Event handler (`Docs` is global)\n\n\n  callDocs: function(fnName, e) {\n    e.preventDefault();\n    Docs[fnName](e.currentTarget.getAttribute('data-id'));\n  }\n});\n\n'use strict';\n\nSwaggerUi.Views.ResponseContentTypeView = Backbone.View.extend({\n  initialize: function(){},\n\n  render: function(){\n    this.model.responseContentTypeId = 'rct' + Math.random();\n    $(this.el).html(Handlebars.templates.response_content_type(this.model));\n    return this;\n  }\n});\n'use strict';\n\nSwaggerUi.Views.SignatureView = Backbone.View.extend({\n  events: {\n    'click a.description-link'       : 'switchToDescription',\n    'click a.snippet-link'           : 'switchToSnippet',\n    'mousedown .snippet_json'          : 'jsonSnippetMouseDown',\n    'mousedown .snippet_xml'          : 'xmlSnippetMouseDown'\n  },\n\n  initialize: function () {\n  },\n\n  render: function(){\n\n    $(this.el).html(Handlebars.templates.signature(this.model));\n\n    if (this.model.defaultRendering === 'model') {\n      this.switchToDescription();\n    } else {\n      this.switchToSnippet();\n    }\n\n    return this;\n  },\n\n  // handler for show signature\n  switchToDescription: function(e){\n    if (e) { e.preventDefault(); }\n\n    $('.snippet', $(this.el)).hide();\n    $('.description', $(this.el)).show();\n    $('.description-link', $(this.el)).addClass('selected');\n    $('.snippet-link', $(this.el)).removeClass('selected');\n  },\n\n  // handler for show sample\n  switchToSnippet: function(e){\n    if (e) { e.preventDefault(); }\n\n    $('.snippet', $(this.el)).show();\n    $('.description', $(this.el)).hide();\n    $('.snippet-link', $(this.el)).addClass('selected');\n    $('.description-link', $(this.el)).removeClass('selected');\n  },\n\n  // handler for snippet to text area\n  snippetToTextArea: function(val) {\n    var textArea = $('textarea', $(this.el.parentNode.parentNode.parentNode));\n\n    // Fix for bug in IE 10/11 which causes placeholder text to be copied to \"value\"\n    if ($.trim(textArea.val()) === '' || textArea.prop('placeholder') === textArea.val()) {\n      textArea.val(val);\n      // TODO move this code outside of the view and expose an event instead\n      if( this.model.jsonEditor && this.model.jsonEditor.isEnabled()){\n        this.model.jsonEditor.setValue(JSON.parse(this.model.sampleJSON));\n      }\n    }\n  },\n\n  jsonSnippetMouseDown: function (e) {\n    if (this.model.isParam) {\n      if (e) { e.preventDefault(); }\n\n      this.snippetToTextArea(this.model.sampleJSON);\n    }\n  },\n\n  xmlSnippetMouseDown: function (e) {\n    if (this.model.isParam) {\n      if (e) { e.preventDefault(); }\n\n      this.snippetToTextArea(this.model.sampleXML);\n    }\n  }\n});\n'use strict';\n\nSwaggerUi.Views.StatusCodeView = Backbone.View.extend({\n  initialize: function (opts) {\n    this.options = opts || {};\n    this.router = this.options.router;\n  },\n\n  render: function(){\n    var responseModel, responseModelView;\n    var value = this.router.api.models[this.model.responseModel];\n    $(this.el).html(Handlebars.templates.status_code(this.model));\n\n    if (this.router.api.models.hasOwnProperty(this.model.responseModel)) {\n      responseModel = {\n        sampleJSON: JSON.stringify(SwaggerUi.partials.signature.createJSONSample(value), void 0, 2),\n        sampleXML: this.model.isXML ? SwaggerUi.partials.signature.createXMLSample('', this.model.schema, this.router.api.models) : false,\n        isParam: false,\n        signature: SwaggerUi.partials.signature.getModelSignature(this.model.responseModel, value, this.router.api.models),\n        defaultRendering: this.model.defaultRendering\n      };\n    } else {\n      responseModel = {\n        signature: SwaggerUi.partials.signature.getPrimitiveSignature(this.model.schema)\n      };\n    }\n\n    responseModelView = new SwaggerUi.Views.SignatureView({model: responseModel, tagName: 'div'});\n    $('.model-signature', this.$el).append(responseModelView.render().el);\n    return this;\n  }\n});}).call(this);\n//# sourceMappingURL=data:application/json;charset=utf8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbInRlbXBsYXRlcy5qcyIsImRvYy5qcyIsImVzNS1zaGltLmpzIiwiaGVscGVycy9oYW5kbGViYXJzLmpzIiwic2FuaXRpemUtaHRtbC5taW4uanMiLCJub2RlX21vZHVsZXMvYnJvd3NlcmlmeS9ub2RlX21vZHVsZXMvYnJvd3Nlci1wYWNrL19wcmVsdWRlLmpzIiwiaW5kZXguanMiLCJsaWIvYXV0aC5qcyIsImxpYi9jbGllbnQuanMiLCJsaWIvaGVscGVycy5qcyIsImxpYi9odHRwLmpzIiwibGliL3Jlc29sdmVyLmpzIiwibGliL3NjaGVtYS1tYXJrdXAuanMiLCJsaWIvc3BlYy1jb252ZXJ0ZXIuanMiLCJsaWIvdHlwZXMvbW9kZWwuanMiLCJsaWIvdHlwZXMvb3BlcmF0aW9uLmpzIiwibGliL3R5cGVzL29wZXJhdGlvbkdyb3VwLmpzIiwibm9kZV9tb2R1bGVzL2Jyb3dzZXJpZnkvbm9kZV9tb2R1bGVzL3Byb2Nlc3MvYnJvd3Nlci5qcyIsIm5vZGVfbW9kdWxlcy9idG9hL2luZGV4LmpzIiwibm9kZV9tb2R1bGVzL2J1ZmZlci9pbmRleC5qcyIsIm5vZGVfbW9kdWxlcy9idWZmZXIvbm9kZV9tb2R1bGVzL2Jhc2U2NC1qcy9saWIvYjY0LmpzIiwibm9kZV9tb2R1bGVzL2J1ZmZlci9ub2RlX21vZHVsZXMvaWVlZTc1NC9pbmRleC5qcyIsIm5vZGVfbW9kdWxlcy9idWZmZXIvbm9kZV9tb2R1bGVzL2lzLWFycmF5L2luZGV4LmpzIiwibm9kZV9tb2R1bGVzL2Nvb2tpZWphci9jb29raWVqYXIuanMiLCJub2RlX21vZHVsZXMvanMteWFtbC9pbmRleC5qcyIsIm5vZGVfbW9kdWxlcy9qcy15YW1sL2xpYi9qcy15YW1sLmpzIiwibm9kZV9tb2R1bGVzL2pzLXlhbWwvbGliL2pzLXlhbWwvY29tbW9uLmpzIiwibm9kZV9tb2R1bGVzL2pzLXlhbWwvbGliL2pzLXlhbWwvZHVtcGVyLmpzIiwibm9kZV9tb2R1bGVzL2pzLXlhbWwvbGliL2pzLXlhbWwvZXhjZXB0aW9uLmpzIiwibm9kZV9tb2R1bGVzL2pzLXlhbWwvbGliL2pzLXlhbWwvbG9hZGVyLmpzIiwibm9kZV9tb2R1bGVzL2pzLXlhbWwvbGliL2pzLXlhbWwvbWFyay5qcyIsIm5vZGVfbW9kdWxlcy9qcy15YW1sL2xpYi9qcy15YW1sL3NjaGVtYS5qcyIsIm5vZGVfbW9kdWxlcy9qcy15YW1sL2xpYi9qcy15YW1sL3NjaGVtYS9jb3JlLmpzIiwibm9kZV9tb2R1bGVzL2pzLXlhbWwvbGliL2pzLXlhbWwvc2NoZW1hL2RlZmF1bHRfZnVsbC5qcyIsIm5vZGVfbW9kdWxlcy9qcy15YW1sL2xpYi9qcy15YW1sL3NjaGVtYS9kZWZhdWx0X3NhZmUuanMiLCJub2RlX21vZHVsZXMvanMteWFtbC9saWIvanMteWFtbC9zY2hlbWEvZmFpbHNhZmUuanMiLCJub2RlX21vZHVsZXMvanMteWFtbC9saWIvanMteWFtbC9zY2hlbWEvanNvbi5qcyIsIm5vZGVfbW9kdWxlcy9qcy15YW1sL2xpYi9qcy15YW1sL3R5cGUuanMiLCJub2RlX21vZHVsZXMvanMteWFtbC9saWIvanMteWFtbC90eXBlL2JpbmFyeS5qcyIsIm5vZGVfbW9kdWxlcy9qcy15YW1sL2xpYi9qcy15YW1sL3R5cGUvYm9vbC5qcyIsIm5vZGVfbW9kdWxlcy9qcy15YW1sL2xpYi9qcy15YW1sL3R5cGUvZmxvYXQuanMiLCJub2RlX21vZHVsZXMvanMteWFtbC9saWIvanMteWFtbC90eXBlL2ludC5qcyIsIm5vZGVfbW9kdWxlcy9qcy15YW1sL2xpYi9qcy15YW1sL3R5cGUvanMvZnVuY3Rpb24uanMiLCJub2RlX21vZHVsZXMvanMteWFtbC9saWIvanMteWFtbC90eXBlL2pzL3JlZ2V4cC5qcyIsIm5vZGVfbW9kdWxlcy9qcy15YW1sL2xpYi9qcy15YW1sL3R5cGUvanMvdW5kZWZpbmVkLmpzIiwibm9kZV9tb2R1bGVzL2pzLXlhbWwvbGliL2pzLXlhbWwvdHlwZS9tYXAuanMiLCJub2RlX21vZHVsZXMvanMteWFtbC9saWIvanMteWFtbC90eXBlL21lcmdlLmpzIiwibm9kZV9tb2R1bGVzL2pzLXlhbWwvbGliL2pzLXlhbWwvdHlwZS9udWxsLmpzIiwibm9kZV9tb2R1bGVzL2pzLXlhbWwvbGliL2pzLXlhbWwvdHlwZS9vbWFwLmpzIiwibm9kZV9tb2R1bGVzL2pzLXlhbWwvbGliL2pzLXlhbWwvdHlwZS9wYWlycy5qcyIsIm5vZGVfbW9kdWxlcy9qcy15YW1sL2xpYi9qcy15YW1sL3R5cGUvc2VxLmpzIiwibm9kZV9tb2R1bGVzL2pzLXlhbWwvbGliL2pzLXlhbWwvdHlwZS9zZXQuanMiLCJub2RlX21vZHVsZXMvanMteWFtbC9saWIvanMteWFtbC90eXBlL3N0ci5qcyIsIm5vZGVfbW9kdWxlcy9qcy15YW1sL2xpYi9qcy15YW1sL3R5cGUvdGltZXN0YW1wLmpzIiwibm9kZV9tb2R1bGVzL2xvZGFzaC1jb21wYXQvYXJyYXkvaW5kZXhPZi5qcyIsIm5vZGVfbW9kdWxlcy9sb2Rhc2gtY29tcGF0L2FycmF5L2xhc3QuanMiLCJub2RlX21vZHVsZXMvbG9kYXNoLWNvbXBhdC9jaGFpbi9sb2Rhc2guanMiLCJub2RlX21vZHVsZXMvbG9kYXNoLWNvbXBhdC9jb2xsZWN0aW9uL2VhY2guanMiLCJub2RlX21vZHVsZXMvbG9kYXNoLWNvbXBhdC9jb2xsZWN0aW9uL2ZpbmQuanMiLCJub2RlX21vZHVsZXMvbG9kYXNoLWNvbXBhdC9jb2xsZWN0aW9uL2ZvckVhY2guanMiLCJub2RlX21vZHVsZXMvbG9kYXNoLWNvbXBhdC9jb2xsZWN0aW9uL2luY2x1ZGVzLmpzIiwibm9kZV9tb2R1bGVzL2xvZGFzaC1jb21wYXQvY29sbGVjdGlvbi9tYXAuanMiLCJub2RlX21vZHVsZXMvbG9kYXNoLWNvbXBhdC9kYXRlL25vdy5qcyIsIm5vZGVfbW9kdWxlcy9sb2Rhc2gtY29tcGF0L2Z1bmN0aW9uL2JpbmQuanMiLCJub2RlX21vZHVsZXMvbG9kYXNoLWNvbXBhdC9mdW5jdGlvbi9yZXN0UGFyYW0uanMiLCJub2RlX21vZHVsZXMvbG9kYXNoLWNvbXBhdC9pbnRlcm5hbC9MYXp5V3JhcHBlci5qcyIsIm5vZGVfbW9kdWxlcy9sb2Rhc2gtY29tcGF0L2ludGVybmFsL0xvZGFzaFdyYXBwZXIuanMiLCJub2RlX21vZHVsZXMvbG9kYXNoLWNvbXBhdC9pbnRlcm5hbC9hcnJheUNvcHkuanMiLCJub2RlX21vZHVsZXMvbG9kYXNoLWNvbXBhdC9pbnRlcm5hbC9hcnJheUVhY2guanMiLCJub2RlX21vZHVsZXMvbG9kYXNoLWNvbXBhdC9pbnRlcm5hbC9hcnJheU1hcC5qcyIsIm5vZGVfbW9kdWxlcy9sb2Rhc2gtY29tcGF0L2ludGVybmFsL2FycmF5U29tZS5qcyIsIm5vZGVfbW9kdWxlcy9sb2Rhc2gtY29tcGF0L2ludGVybmFsL2Jhc2VBc3NpZ24uanMiLCJub2RlX21vZHVsZXMvbG9kYXNoLWNvbXBhdC9pbnRlcm5hbC9iYXNlQ2FsbGJhY2suanMiLCJub2RlX21vZHVsZXMvbG9kYXNoLWNvbXBhdC9pbnRlcm5hbC9iYXNlQ2xvbmUuanMiLCJub2RlX21vZHVsZXMvbG9kYXNoLWNvbXBhdC9pbnRlcm5hbC9iYXNlQ29weS5qcyIsIm5vZGVfbW9kdWxlcy9sb2Rhc2gtY29tcGF0L2ludGVybmFsL2Jhc2VDcmVhdGUuanMiLCJub2RlX21vZHVsZXMvbG9kYXNoLWNvbXBhdC9pbnRlcm5hbC9iYXNlRWFjaC5qcyIsIm5vZGVfbW9kdWxlcy9sb2Rhc2gtY29tcGF0L2ludGVybmFsL2Jhc2VGaW5kLmpzIiwibm9kZV9tb2R1bGVzL2xvZGFzaC1jb21wYXQvaW50ZXJuYWwvYmFzZUZpbmRJbmRleC5qcyIsIm5vZGVfbW9kdWxlcy9sb2Rhc2gtY29tcGF0L2ludGVybmFsL2Jhc2VGb3IuanMiLCJub2RlX21vZHVsZXMvbG9kYXNoLWNvbXBhdC9pbnRlcm5hbC9iYXNlRm9ySW4uanMiLCJub2RlX21vZHVsZXMvbG9kYXNoLWNvbXBhdC9pbnRlcm5hbC9iYXNlRm9yT3duLmpzIiwibm9kZV9tb2R1bGVzL2xvZGFzaC1jb21wYXQvaW50ZXJuYWwvYmFzZUdldC5qcyIsIm5vZGVfbW9kdWxlcy9sb2Rhc2gtY29tcGF0L2ludGVybmFsL2Jhc2VJbmRleE9mLmpzIiwibm9kZV9tb2R1bGVzL2xvZGFzaC1jb21wYXQvaW50ZXJuYWwvYmFzZUlzRXF1YWwuanMiLCJub2RlX21vZHVsZXMvbG9kYXNoLWNvbXBhdC9pbnRlcm5hbC9iYXNlSXNFcXVhbERlZXAuanMiLCJub2RlX21vZHVsZXMvbG9kYXNoLWNvbXBhdC9pbnRlcm5hbC9iYXNlSXNNYXRjaC5qcyIsIm5vZGVfbW9kdWxlcy9sb2Rhc2gtY29tcGF0L2ludGVybmFsL2Jhc2VMb2Rhc2guanMiLCJub2RlX21vZHVsZXMvbG9kYXNoLWNvbXBhdC9pbnRlcm5hbC9iYXNlTWFwLmpzIiwibm9kZV9tb2R1bGVzL2xvZGFzaC1jb21wYXQvaW50ZXJuYWwvYmFzZU1hdGNoZXMuanMiLCJub2RlX21vZHVsZXMvbG9kYXNoLWNvbXBhdC9pbnRlcm5hbC9iYXNlTWF0Y2hlc1Byb3BlcnR5LmpzIiwibm9kZV9tb2R1bGVzL2xvZGFzaC1jb21wYXQvaW50ZXJuYWwvYmFzZVByb3BlcnR5LmpzIiwibm9kZV9tb2R1bGVzL2xvZGFzaC1jb21wYXQvaW50ZXJuYWwvYmFzZVByb3BlcnR5RGVlcC5qcyIsIm5vZGVfbW9kdWxlcy9sb2Rhc2gtY29tcGF0L2ludGVybmFsL2Jhc2VTZXREYXRhLmpzIiwibm9kZV9tb2R1bGVzL2xvZGFzaC1jb21wYXQvaW50ZXJuYWwvYmFzZVNsaWNlLmpzIiwibm9kZV9tb2R1bGVzL2xvZGFzaC1jb21wYXQvaW50ZXJuYWwvYmFzZVRvU3RyaW5nLmpzIiwibm9kZV9tb2R1bGVzL2xvZGFzaC1jb21wYXQvaW50ZXJuYWwvYmFzZVZhbHVlcy5qcyIsIm5vZGVfbW9kdWxlcy9sb2Rhc2gtY29tcGF0L2ludGVybmFsL2JpbmFyeUluZGV4LmpzIiwibm9kZV9tb2R1bGVzL2xvZGFzaC1jb21wYXQvaW50ZXJuYWwvYmluYXJ5SW5kZXhCeS5qcyIsIm5vZGVfbW9kdWxlcy9sb2Rhc2gtY29tcGF0L2ludGVybmFsL2JpbmRDYWxsYmFjay5qcyIsIm5vZGVfbW9kdWxlcy9sb2Rhc2gtY29tcGF0L2ludGVybmFsL2J1ZmZlckNsb25lLmpzIiwibm9kZV9tb2R1bGVzL2xvZGFzaC1jb21wYXQvaW50ZXJuYWwvY29tcG9zZUFyZ3MuanMiLCJub2RlX21vZHVsZXMvbG9kYXNoLWNvbXBhdC9pbnRlcm5hbC9jb21wb3NlQXJnc1JpZ2h0LmpzIiwibm9kZV9tb2R1bGVzL2xvZGFzaC1jb21wYXQvaW50ZXJuYWwvY3JlYXRlQmFzZUVhY2guanMiLCJub2RlX21vZHVsZXMvbG9kYXNoLWNvbXBhdC9pbnRlcm5hbC9jcmVhdGVCYXNlRm9yLmpzIiwibm9kZV9tb2R1bGVzL2xvZGFzaC1jb21wYXQvaW50ZXJuYWwvY3JlYXRlQmluZFdyYXBwZXIuanMiLCJub2RlX21vZHVsZXMvbG9kYXNoLWNvbXBhdC9pbnRlcm5hbC9jcmVhdGVDdG9yV3JhcHBlci5qcyIsIm5vZGVfbW9kdWxlcy9sb2Rhc2gtY29tcGF0L2ludGVybmFsL2NyZWF0ZUZpbmQuanMiLCJub2RlX21vZHVsZXMvbG9kYXNoLWNvbXBhdC9pbnRlcm5hbC9jcmVhdGVGb3JFYWNoLmpzIiwibm9kZV9tb2R1bGVzL2xvZGFzaC1jb21wYXQvaW50ZXJuYWwvY3JlYXRlSHlicmlkV3JhcHBlci5qcyIsIm5vZGVfbW9kdWxlcy9sb2Rhc2gtY29tcGF0L2ludGVybmFsL2NyZWF0ZVBhcnRpYWxXcmFwcGVyLmpzIiwibm9kZV9tb2R1bGVzL2xvZGFzaC1jb21wYXQvaW50ZXJuYWwvY3JlYXRlV3JhcHBlci5qcyIsIm5vZGVfbW9kdWxlcy9sb2Rhc2gtY29tcGF0L2ludGVybmFsL2VxdWFsQXJyYXlzLmpzIiwibm9kZV9tb2R1bGVzL2xvZGFzaC1jb21wYXQvaW50ZXJuYWwvZXF1YWxCeVRhZy5qcyIsIm5vZGVfbW9kdWxlcy9sb2Rhc2gtY29tcGF0L2ludGVybmFsL2VxdWFsT2JqZWN0cy5qcyIsIm5vZGVfbW9kdWxlcy9sb2Rhc2gtY29tcGF0L2ludGVybmFsL2dldERhdGEuanMiLCJub2RlX21vZHVsZXMvbG9kYXNoLWNvbXBhdC9pbnRlcm5hbC9nZXRGdW5jTmFtZS5qcyIsIm5vZGVfbW9kdWxlcy9sb2Rhc2gtY29tcGF0L2ludGVybmFsL2dldExlbmd0aC5qcyIsIm5vZGVfbW9kdWxlcy9sb2Rhc2gtY29tcGF0L2ludGVybmFsL2dldE1hdGNoRGF0YS5qcyIsIm5vZGVfbW9kdWxlcy9sb2Rhc2gtY29tcGF0L2ludGVybmFsL2dldE5hdGl2ZS5qcyIsIm5vZGVfbW9kdWxlcy9sb2Rhc2gtY29tcGF0L2ludGVybmFsL2luZGV4T2ZOYU4uanMiLCJub2RlX21vZHVsZXMvbG9kYXNoLWNvbXBhdC9pbnRlcm5hbC9pbml0Q2xvbmVBcnJheS5qcyIsIm5vZGVfbW9kdWxlcy9sb2Rhc2gtY29tcGF0L2ludGVybmFsL2luaXRDbG9uZUJ5VGFnLmpzIiwibm9kZV9tb2R1bGVzL2xvZGFzaC1jb21wYXQvaW50ZXJuYWwvaW5pdENsb25lT2JqZWN0LmpzIiwibm9kZV9tb2R1bGVzL2xvZGFzaC1jb21wYXQvaW50ZXJuYWwvaXNBcnJheUxpa2UuanMiLCJub2RlX21vZHVsZXMvbG9kYXNoLWNvbXBhdC9pbnRlcm5hbC9pc0hvc3RPYmplY3QuanMiLCJub2RlX21vZHVsZXMvbG9kYXNoLWNvbXBhdC9pbnRlcm5hbC9pc0luZGV4LmpzIiwibm9kZV9tb2R1bGVzL2xvZGFzaC1jb21wYXQvaW50ZXJuYWwvaXNJdGVyYXRlZUNhbGwuanMiLCJub2RlX21vZHVsZXMvbG9kYXNoLWNvbXBhdC9pbnRlcm5hbC9pc0tleS5qcyIsIm5vZGVfbW9kdWxlcy9sb2Rhc2gtY29tcGF0L2ludGVybmFsL2lzTGF6aWFibGUuanMiLCJub2RlX21vZHVsZXMvbG9kYXNoLWNvbXBhdC9pbnRlcm5hbC9pc0xlbmd0aC5qcyIsIm5vZGVfbW9kdWxlcy9sb2Rhc2gtY29tcGF0L2ludGVybmFsL2lzT2JqZWN0TGlrZS5qcyIsIm5vZGVfbW9kdWxlcy9sb2Rhc2gtY29tcGF0L2ludGVybmFsL2lzU3RyaWN0Q29tcGFyYWJsZS5qcyIsIm5vZGVfbW9kdWxlcy9sb2Rhc2gtY29tcGF0L2ludGVybmFsL21lcmdlRGF0YS5qcyIsIm5vZGVfbW9kdWxlcy9sb2Rhc2gtY29tcGF0L2ludGVybmFsL21ldGFNYXAuanMiLCJub2RlX21vZHVsZXMvbG9kYXNoLWNvbXBhdC9pbnRlcm5hbC9yZWFsTmFtZXMuanMiLCJub2RlX21vZHVsZXMvbG9kYXNoLWNvbXBhdC9pbnRlcm5hbC9yZW9yZGVyLmpzIiwibm9kZV9tb2R1bGVzL2xvZGFzaC1jb21wYXQvaW50ZXJuYWwvcmVwbGFjZUhvbGRlcnMuanMiLCJub2RlX21vZHVsZXMvbG9kYXNoLWNvbXBhdC9pbnRlcm5hbC9zZXREYXRhLmpzIiwibm9kZV9tb2R1bGVzL2xvZGFzaC1jb21wYXQvaW50ZXJuYWwvc2hpbUtleXMuanMiLCJub2RlX21vZHVsZXMvbG9kYXNoLWNvbXBhdC9pbnRlcm5hbC90b09iamVjdC5qcyIsIm5vZGVfbW9kdWxlcy9sb2Rhc2gtY29tcGF0L2ludGVybmFsL3RvUGF0aC5qcyIsIm5vZGVfbW9kdWxlcy9sb2Rhc2gtY29tcGF0L2ludGVybmFsL3dyYXBwZXJDbG9uZS5qcyIsIm5vZGVfbW9kdWxlcy9sb2Rhc2gtY29tcGF0L2xhbmcvY2xvbmVEZWVwLmpzIiwibm9kZV9tb2R1bGVzL2xvZGFzaC1jb21wYXQvbGFuZy9pc0FyZ3VtZW50cy5qcyIsIm5vZGVfbW9kdWxlcy9sb2Rhc2gtY29tcGF0L2xhbmcvaXNBcnJheS5qcyIsIm5vZGVfbW9kdWxlcy9sb2Rhc2gtY29tcGF0L2xhbmcvaXNFbXB0eS5qcyIsIm5vZGVfbW9kdWxlcy9sb2Rhc2gtY29tcGF0L2xhbmcvaXNGdW5jdGlvbi5qcyIsIm5vZGVfbW9kdWxlcy9sb2Rhc2gtY29tcGF0L2xhbmcvaXNOYXRpdmUuanMiLCJub2RlX21vZHVsZXMvbG9kYXNoLWNvbXBhdC9sYW5nL2lzT2JqZWN0LmpzIiwibm9kZV9tb2R1bGVzL2xvZGFzaC1jb21wYXQvbGFuZy9pc1BsYWluT2JqZWN0LmpzIiwibm9kZV9tb2R1bGVzL2xvZGFzaC1jb21wYXQvbGFuZy9pc1N0cmluZy5qcyIsIm5vZGVfbW9kdWxlcy9sb2Rhc2gtY29tcGF0L2xhbmcvaXNUeXBlZEFycmF5LmpzIiwibm9kZV9tb2R1bGVzL2xvZGFzaC1jb21wYXQvbGFuZy9pc1VuZGVmaW5lZC5qcyIsIm5vZGVfbW9kdWxlcy9sb2Rhc2gtY29tcGF0L29iamVjdC9rZXlzLmpzIiwibm9kZV9tb2R1bGVzL2xvZGFzaC1jb21wYXQvb2JqZWN0L2tleXNJbi5qcyIsIm5vZGVfbW9kdWxlcy9sb2Rhc2gtY29tcGF0L29iamVjdC9wYWlycy5qcyIsIm5vZGVfbW9kdWxlcy9sb2Rhc2gtY29tcGF0L29iamVjdC92YWx1ZXMuanMiLCJub2RlX21vZHVsZXMvbG9kYXNoLWNvbXBhdC9zdXBwb3J0LmpzIiwibm9kZV9tb2R1bGVzL2xvZGFzaC1jb21wYXQvdXRpbGl0eS9pZGVudGl0eS5qcyIsIm5vZGVfbW9kdWxlcy9sb2Rhc2gtY29tcGF0L3V0aWxpdHkvbm9vcC5qcyIsIm5vZGVfbW9kdWxlcy9sb2Rhc2gtY29tcGF0L3V0aWxpdHkvcHJvcGVydHkuanMiLCJub2RlX21vZHVsZXMvcS9xLmpzIiwibm9kZV9tb2R1bGVzL3N1cGVyYWdlbnQvbGliL2NsaWVudC5qcyIsIm5vZGVfbW9kdWxlcy9zdXBlcmFnZW50L2xpYi9pcy1vYmplY3QuanMiLCJub2RlX21vZHVsZXMvc3VwZXJhZ2VudC9saWIvcmVxdWVzdC1iYXNlLmpzIiwibm9kZV9tb2R1bGVzL3N1cGVyYWdlbnQvbGliL3JlcXVlc3QuanMiLCJub2RlX21vZHVsZXMvc3VwZXJhZ2VudC9ub2RlX21vZHVsZXMvY29tcG9uZW50LWVtaXR0ZXIvaW5kZXguanMiLCJTd2FnZ2VyVWkuanMiLCJ1dGlscy91dGlscy5qcyIsInZpZXcvQXBpS2V5QXV0aE1vZGVsLmpzIiwidmlldy9BcGlLZXlBdXRoVmlldy5qcyIsInZpZXcvQXV0aEJ1dHRvblZpZXcuanMiLCJ2aWV3L0F1dGhzQ29sbGVjdGlvbi5qcyIsInZpZXcvQXV0aHNDb2xsZWN0aW9uVmlldy5qcyIsInZpZXcvQXV0aFZpZXcuanMiLCJ2aWV3L0Jhc2ljQXV0aE1vZGVsLmpzIiwidmlldy9CYXNpY0F1dGhWaWV3LmpzIiwidmlldy9Db250ZW50VHlwZVZpZXcuanMiLCJ2aWV3L0hlYWRlclZpZXcuanMiLCJ2aWV3L01haW5WaWV3LmpzIiwidmlldy9PYXV0aDJNb2RlbC5qcyIsInZpZXcvT2F1dGgyVmlldy5qcyIsInZpZXcvT3BlcmF0aW9uVmlldy5qcyIsInZpZXcvUGFyYW1ldGVyQ29udGVudFR5cGVWaWV3LmpzIiwidmlldy9QYXJhbWV0ZXJWaWV3LmpzIiwidmlldy9wYXJ0aWFscy9zaWduYXR1cmUuanMiLCJ2aWV3L1BvcHVwVmlldy5qcyIsInZpZXcvUmVzb3VyY2VWaWV3LmpzIiwidmlldy9SZXNwb25zZUNvbnRlbnRUeXBlVmlldy5qcyIsInZpZXcvU2lnbmF0dXJlVmlldy5qcyIsInZpZXcvU3RhdHVzQ29kZVZpZXcuanMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7Ozs7O0FBQUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FDMXhCQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUN4TUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQ2poRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUNuR0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7Ozs7Ozs7QUNOQTtBQ0FBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FDM0NBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUNySkE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUNqdEJBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUN2RUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUN4WEE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUM5NEJBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQzdnQkE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FDM29CQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQzlDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQ2x0Q0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUNoQkE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUMxREE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FDckJBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQzcvQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUM1SEE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FDcEZBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQ2pDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUNyUUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUNQQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUN2Q0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQzNEQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQ2x5QkE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUMzQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQ2xqREE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUM1RUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQ3hHQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUNsQkE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUN6QkE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUM1QkE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQ2pCQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQ3pCQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQzdEQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUN2SUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQ25DQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUN6R0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FDeEtBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQ3BGQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUM1REE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUM1QkE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQ1JBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQ1pBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FDbENBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUM1Q0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQ3JEQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FDUkE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQzdCQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FDUkE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUN4RkE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQ3JEQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQ25CQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FDN0hBO0FBQ0E7O0FDREE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQ3hEQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQ3JDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUN6REE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQ3BFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUN4QkE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQ3hEQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQzFEQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FDMUJBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQ3JCQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FDcEJBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FDdEJBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQ3JCQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FDdkJBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FDbkJBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUNuQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FDcElBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUN2QkE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQ3ZCQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUNmQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQ3pCQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FDdkJBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUNqQkE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQ2pCQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FDakJBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQzlCQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUMzQkE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUM1QkE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUN2R0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUNwREE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUNWQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FDdkJBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FDL0JBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQzdDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQ2hCQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQ25CQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FDakJBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUNoQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUNiQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQ3RCQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUN2Q0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FDekRBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQ3ZDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FDdkJBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FDbENBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQ3BDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQy9CQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUMzQkE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUN6QkE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUNyQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUN6QkE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQ3BCQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUNsSEE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUM5Q0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQ3RGQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUNuREE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FDaERBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FDbkVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQ2ZBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FDekJBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQ2ZBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQ3JCQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQ2hCQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FDdkJBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUMxQkE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUNyRkE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUNoQkE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FDZkE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FDckJBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQ3hCQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQzVCQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQzVCQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUMzQkE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQ3BCQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUNaQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUNmQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FDekZBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQ1pBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FDSkE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQzdCQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQzVCQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FDekNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQzFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FDMUJBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FDNUJBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQ2xCQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQ3ZEQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQ2xDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQ3hDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FDL0NBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUN0Q0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUNqREE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUM1QkE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQ2hGQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FDbkNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUMxRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FDckJBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FDOUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FDeElBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQ2pDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUNqQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FDaEdBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUNwQkE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUNuQkE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUMvQkE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQ25nRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUNoOUJBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FDYkE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQzNWQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FDaENBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7Ozs7O0FDbktBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FDbFRBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUMvRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUNyQkE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FDNUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQ3BFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FDOUZBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQ3JEQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FDNU5BO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQ3BCQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FDcERBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUNWQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUMvQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUNoSkE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FDMUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUNsRkE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQ24zQkE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FDWEE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUM3TEE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FDNzlCQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQ3BDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQzNFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FDVkE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUMzRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSIsImZpbGUiOiJzd2FnZ2VyLXVpLmpzIiwic291cmNlc0NvbnRlbnQiOlsiLyoganNoaW50IGlnbm9yZTpzdGFydCAqLyBcbiB7KGZ1bmN0aW9uKCkge1xuICB2YXIgdGVtcGxhdGUgPSBIYW5kbGViYXJzLnRlbXBsYXRlLCB0ZW1wbGF0ZXMgPSBIYW5kbGViYXJzLnRlbXBsYXRlcyA9IEhhbmRsZWJhcnMudGVtcGxhdGVzIHx8IHt9O1xudGVtcGxhdGVzWydhcGlrZXlfYXV0aCddID0gdGVtcGxhdGUoe1wiMVwiOmZ1bmN0aW9uKGNvbnRhaW5lcixkZXB0aDAsaGVscGVycyxwYXJ0aWFscyxkYXRhKSB7XG4gICAgdmFyIHN0YWNrMTtcblxuICByZXR1cm4gXCIgICAgICAgICAgICAgICAgPHNwYW4gY2xhc3M9XFxcImtleV9hdXRoX192YWx1ZVxcXCI+XCJcbiAgICArICgoc3RhY2sxID0gKGhlbHBlcnMuc2FuaXRpemUgfHwgKGRlcHRoMCAmJiBkZXB0aDAuc2FuaXRpemUpIHx8IGhlbHBlcnMuaGVscGVyTWlzc2luZykuY2FsbChkZXB0aDAgIT0gbnVsbCA/IGRlcHRoMCA6IHt9LChkZXB0aDAgIT0gbnVsbCA/IGRlcHRoMC52YWx1ZSA6IGRlcHRoMCkse1wibmFtZVwiOlwic2FuaXRpemVcIixcImhhc2hcIjp7fSxcImRhdGFcIjpkYXRhfSkpICE9IG51bGwgPyBzdGFjazEgOiBcIlwiKVxuICAgICsgXCI8L3NwYW4+XFxuXCI7XG59LFwiM1wiOmZ1bmN0aW9uKGNvbnRhaW5lcixkZXB0aDAsaGVscGVycyxwYXJ0aWFscyxkYXRhKSB7XG4gICAgcmV0dXJuIFwiICAgICAgICAgICAgICAgIDxpbnB1dCBwbGFjZWhvbGRlcj1cXFwiYXBpX2tleVxcXCIgY2xhc3M9XFxcImF1dGhfaW5wdXQgaW5wdXRfYXBpS2V5X2VudHJ5XFxcIiBuYW1lPVxcXCJhcGlLZXlcXFwiIHR5cGU9XFxcInRleHRcXFwiLz5cXG5cIjtcbn0sXCJjb21waWxlclwiOls3LFwiPj0gNC4wLjBcIl0sXCJtYWluXCI6ZnVuY3Rpb24oY29udGFpbmVyLGRlcHRoMCxoZWxwZXJzLHBhcnRpYWxzLGRhdGEpIHtcbiAgICB2YXIgc3RhY2sxLCBhbGlhczE9ZGVwdGgwICE9IG51bGwgPyBkZXB0aDAgOiB7fSwgYWxpYXMyPWhlbHBlcnMuaGVscGVyTWlzc2luZztcblxuICByZXR1cm4gXCI8ZGl2IGNsYXNzPVxcXCJrZXlfaW5wdXRfY29udGFpbmVyXFxcIj5cXG4gICAgPGgzIGNsYXNzPVxcXCJhdXRoX190aXRsZVxcXCI+QXBpIGtleSBhdXRob3JpemF0aW9uPC9oMz5cXG4gICAgPGRpdiBjbGFzcz1cXFwiYXV0aF9fZGVzY3JpcHRpb25cXFwiPlwiXG4gICAgKyAoKHN0YWNrMSA9IChoZWxwZXJzLnNhbml0aXplIHx8IChkZXB0aDAgJiYgZGVwdGgwLnNhbml0aXplKSB8fCBhbGlhczIpLmNhbGwoYWxpYXMxLChkZXB0aDAgIT0gbnVsbCA/IGRlcHRoMC5kZXNjcmlwdGlvbiA6IGRlcHRoMCkse1wibmFtZVwiOlwic2FuaXRpemVcIixcImhhc2hcIjp7fSxcImRhdGFcIjpkYXRhfSkpICE9IG51bGwgPyBzdGFjazEgOiBcIlwiKVxuICAgICsgXCI8L2Rpdj5cXG4gICAgPGRpdj5cXG4gICAgICAgIDxkaXYgY2xhc3M9XFxcImtleV9hdXRoX19maWVsZFxcXCI+XFxuICAgICAgICAgICAgPHNwYW4gY2xhc3M9XFxcImtleV9hdXRoX19sYWJlbFxcXCI+bmFtZTo8L3NwYW4+XFxuICAgICAgICAgICAgPHNwYW4gY2xhc3M9XFxcImtleV9hdXRoX192YWx1ZVxcXCI+XCJcbiAgICArICgoc3RhY2sxID0gKGhlbHBlcnMuZXNjYXBlIHx8IChkZXB0aDAgJiYgZGVwdGgwLmVzY2FwZSkgfHwgYWxpYXMyKS5jYWxsKGFsaWFzMSwoZGVwdGgwICE9IG51bGwgPyBkZXB0aDAubmFtZSA6IGRlcHRoMCkse1wibmFtZVwiOlwiZXNjYXBlXCIsXCJoYXNoXCI6e30sXCJkYXRhXCI6ZGF0YX0pKSAhPSBudWxsID8gc3RhY2sxIDogXCJcIilcbiAgICArIFwiPC9zcGFuPlxcbiAgICAgICAgPC9kaXY+XFxuICAgICAgICA8ZGl2IGNsYXNzPVxcXCJrZXlfYXV0aF9fZmllbGRcXFwiPlxcbiAgICAgICAgICAgIDxzcGFuIGNsYXNzPVxcXCJrZXlfYXV0aF9fbGFiZWxcXFwiPmluOjwvc3Bhbj5cXG4gICAgICAgICAgICA8c3BhbiBjbGFzcz1cXFwia2V5X2F1dGhfX3ZhbHVlXFxcIj5cIlxuICAgICsgKChzdGFjazEgPSAoaGVscGVycy5lc2NhcGUgfHwgKGRlcHRoMCAmJiBkZXB0aDAuZXNjYXBlKSB8fCBhbGlhczIpLmNhbGwoYWxpYXMxLChkZXB0aDAgIT0gbnVsbCA/IGRlcHRoMFtcImluXCJdIDogZGVwdGgwKSx7XCJuYW1lXCI6XCJlc2NhcGVcIixcImhhc2hcIjp7fSxcImRhdGFcIjpkYXRhfSkpICE9IG51bGwgPyBzdGFjazEgOiBcIlwiKVxuICAgICsgXCI8L3NwYW4+XFxuICAgICAgICA8L2Rpdj5cXG4gICAgICAgIDxkaXYgY2xhc3M9XFxcImtleV9hdXRoX19maWVsZFxcXCI+XFxuICAgICAgICAgICAgPHNwYW4gY2xhc3M9XFxcImtleV9hdXRoX19sYWJlbFxcXCI+dmFsdWU6PC9zcGFuPlxcblwiXG4gICAgKyAoKHN0YWNrMSA9IGhlbHBlcnNbXCJpZlwiXS5jYWxsKGFsaWFzMSwoZGVwdGgwICE9IG51bGwgPyBkZXB0aDAuaXNMb2dvdXQgOiBkZXB0aDApLHtcIm5hbWVcIjpcImlmXCIsXCJoYXNoXCI6e30sXCJmblwiOmNvbnRhaW5lci5wcm9ncmFtKDEsIGRhdGEsIDApLFwiaW52ZXJzZVwiOmNvbnRhaW5lci5wcm9ncmFtKDMsIGRhdGEsIDApLFwiZGF0YVwiOmRhdGF9KSkgIT0gbnVsbCA/IHN0YWNrMSA6IFwiXCIpXG4gICAgKyBcIiAgICAgICAgPC9kaXY+XFxuICAgIDwvZGl2PlxcbjwvZGl2PlxcblwiO1xufSxcInVzZURhdGFcIjp0cnVlfSk7XG50ZW1wbGF0ZXNbJ2F1dGhfYnV0dG9uJ10gPSB0ZW1wbGF0ZSh7XCJjb21waWxlclwiOls3LFwiPj0gNC4wLjBcIl0sXCJtYWluXCI6ZnVuY3Rpb24oY29udGFpbmVyLGRlcHRoMCxoZWxwZXJzLHBhcnRpYWxzLGRhdGEpIHtcbiAgICByZXR1cm4gXCI8YSBjbGFzcz0nYXV0aG9yaXplX19idG4nIGhyZWY9XFxcIiNcXFwiPkF1dGhvcml6ZTwvYT5cXG5cIjtcbn0sXCJ1c2VEYXRhXCI6dHJ1ZX0pO1xudGVtcGxhdGVzWydhdXRoX2J1dHRvbl9vcGVyYXRpb24nXSA9IHRlbXBsYXRlKHtcIjFcIjpmdW5jdGlvbihjb250YWluZXIsZGVwdGgwLGhlbHBlcnMscGFydGlhbHMsZGF0YSkge1xuICAgIHJldHVybiBcIiAgICAgICAgYXV0aG9yaXplX19idG5fb3BlcmF0aW9uX2xvZ2luXFxuXCI7XG59LFwiM1wiOmZ1bmN0aW9uKGNvbnRhaW5lcixkZXB0aDAsaGVscGVycyxwYXJ0aWFscyxkYXRhKSB7XG4gICAgcmV0dXJuIFwiICAgICAgICBhdXRob3JpemVfX2J0bl9vcGVyYXRpb25fbG9nb3V0XFxuXCI7XG59LFwiNVwiOmZ1bmN0aW9uKGNvbnRhaW5lcixkZXB0aDAsaGVscGVycyxwYXJ0aWFscyxkYXRhKSB7XG4gICAgdmFyIHN0YWNrMTtcblxuICByZXR1cm4gXCIgICAgICAgIDx1bCBjbGFzcz1cXFwiYXV0aG9yaXplLXNjb3Blc1xcXCI+XFxuXCJcbiAgICArICgoc3RhY2sxID0gaGVscGVycy5lYWNoLmNhbGwoZGVwdGgwICE9IG51bGwgPyBkZXB0aDAgOiB7fSwoZGVwdGgwICE9IG51bGwgPyBkZXB0aDAuc2NvcGVzIDogZGVwdGgwKSx7XCJuYW1lXCI6XCJlYWNoXCIsXCJoYXNoXCI6e30sXCJmblwiOmNvbnRhaW5lci5wcm9ncmFtKDYsIGRhdGEsIDApLFwiaW52ZXJzZVwiOmNvbnRhaW5lci5ub29wLFwiZGF0YVwiOmRhdGF9KSkgIT0gbnVsbCA/IHN0YWNrMSA6IFwiXCIpXG4gICAgKyBcIiAgICAgICAgPC91bD5cXG5cIjtcbn0sXCI2XCI6ZnVuY3Rpb24oY29udGFpbmVyLGRlcHRoMCxoZWxwZXJzLHBhcnRpYWxzLGRhdGEpIHtcbiAgICB2YXIgc3RhY2sxLCBhbGlhczE9ZGVwdGgwICE9IG51bGwgPyBkZXB0aDAgOiB7fSwgYWxpYXMyPWhlbHBlcnMuaGVscGVyTWlzc2luZztcblxuICByZXR1cm4gXCIgICAgICAgICAgICAgICAgPGxpIGNsYXNzPVxcXCJhdXRob3JpemVfX3Njb3BlXFxcIiB0aXRsZT1cXFwiXCJcbiAgICArICgoc3RhY2sxID0gKGhlbHBlcnMuZXNjYXBlIHx8IChkZXB0aDAgJiYgZGVwdGgwLmVzY2FwZSkgfHwgYWxpYXMyKS5jYWxsKGFsaWFzMSwoZGVwdGgwICE9IG51bGwgPyBkZXB0aDAuZGVzY3JpcHRpb24gOiBkZXB0aDApLHtcIm5hbWVcIjpcImVzY2FwZVwiLFwiaGFzaFwiOnt9LFwiZGF0YVwiOmRhdGF9KSkgIT0gbnVsbCA/IHN0YWNrMSA6IFwiXCIpXG4gICAgKyBcIlxcXCI+XCJcbiAgICArICgoc3RhY2sxID0gKGhlbHBlcnMuZXNjYXBlIHx8IChkZXB0aDAgJiYgZGVwdGgwLmVzY2FwZSkgfHwgYWxpYXMyKS5jYWxsKGFsaWFzMSwoZGVwdGgwICE9IG51bGwgPyBkZXB0aDAuc2NvcGUgOiBkZXB0aDApLHtcIm5hbWVcIjpcImVzY2FwZVwiLFwiaGFzaFwiOnt9LFwiZGF0YVwiOmRhdGF9KSkgIT0gbnVsbCA/IHN0YWNrMSA6IFwiXCIpXG4gICAgKyBcIjwvbGk+XFxuXCI7XG59LFwiY29tcGlsZXJcIjpbNyxcIj49IDQuMC4wXCJdLFwibWFpblwiOmZ1bmN0aW9uKGNvbnRhaW5lcixkZXB0aDAsaGVscGVycyxwYXJ0aWFscyxkYXRhKSB7XG4gICAgdmFyIHN0YWNrMSwgYWxpYXMxPWRlcHRoMCAhPSBudWxsID8gZGVwdGgwIDoge307XG5cbiAgcmV0dXJuIFwiPGRpdiBjbGFzcz1cXFwiYXV0aG9yaXplX19idG4gYXV0aG9yaXplX19idG5fb3BlcmF0aW9uXFxuXCJcbiAgICArICgoc3RhY2sxID0gaGVscGVyc1tcImlmXCJdLmNhbGwoYWxpYXMxLChkZXB0aDAgIT0gbnVsbCA/IGRlcHRoMC5pc0xvZ291dCA6IGRlcHRoMCkse1wibmFtZVwiOlwiaWZcIixcImhhc2hcIjp7fSxcImZuXCI6Y29udGFpbmVyLnByb2dyYW0oMSwgZGF0YSwgMCksXCJpbnZlcnNlXCI6Y29udGFpbmVyLnByb2dyYW0oMywgZGF0YSwgMCksXCJkYXRhXCI6ZGF0YX0pKSAhPSBudWxsID8gc3RhY2sxIDogXCJcIilcbiAgICArIFwiXFxcIj5cXG5cIlxuICAgICsgKChzdGFjazEgPSBoZWxwZXJzW1wiaWZcIl0uY2FsbChhbGlhczEsKGRlcHRoMCAhPSBudWxsID8gZGVwdGgwLnNjb3BlcyA6IGRlcHRoMCkse1wibmFtZVwiOlwiaWZcIixcImhhc2hcIjp7fSxcImZuXCI6Y29udGFpbmVyLnByb2dyYW0oNSwgZGF0YSwgMCksXCJpbnZlcnNlXCI6Y29udGFpbmVyLm5vb3AsXCJkYXRhXCI6ZGF0YX0pKSAhPSBudWxsID8gc3RhY2sxIDogXCJcIilcbiAgICArIFwiPC9kaXY+XFxuXCI7XG59LFwidXNlRGF0YVwiOnRydWV9KTtcbnRlbXBsYXRlc1snYXV0aF92aWV3J10gPSB0ZW1wbGF0ZSh7XCIxXCI6ZnVuY3Rpb24oY29udGFpbmVyLGRlcHRoMCxoZWxwZXJzLHBhcnRpYWxzLGRhdGEpIHtcbiAgICByZXR1cm4gXCIgICAgICAgICAgICA8YnV0dG9uIHR5cGU9XFxcImJ1dHRvblxcXCIgY2xhc3M9XFxcImF1dGhfX2J1dHRvbiBhdXRoX3N1Ym1pdF9fYnV0dG9uXFxcIiBkYXRhLXN3LXRyYW5zbGF0ZT5BdXRob3JpemU8L2J1dHRvbj5cXG5cIjtcbn0sXCIzXCI6ZnVuY3Rpb24oY29udGFpbmVyLGRlcHRoMCxoZWxwZXJzLHBhcnRpYWxzLGRhdGEpIHtcbiAgICByZXR1cm4gXCIgICAgICAgICAgICA8YnV0dG9uIHR5cGU9XFxcImJ1dHRvblxcXCIgY2xhc3M9XFxcImF1dGhfX2J1dHRvbiBhdXRoX2xvZ291dF9fYnV0dG9uXFxcIiBkYXRhLXN3LXRyYW5zbGF0ZT5Mb2dvdXQ8L2J1dHRvbj5cXG5cIjtcbn0sXCJjb21waWxlclwiOls3LFwiPj0gNC4wLjBcIl0sXCJtYWluXCI6ZnVuY3Rpb24oY29udGFpbmVyLGRlcHRoMCxoZWxwZXJzLHBhcnRpYWxzLGRhdGEpIHtcbiAgICB2YXIgc3RhY2sxLCBhbGlhczE9ZGVwdGgwICE9IG51bGwgPyBkZXB0aDAgOiB7fTtcblxuICByZXR1cm4gXCI8ZGl2IGNsYXNzPVxcXCJhdXRoX2NvbnRhaW5lclxcXCI+XFxuXFxuICAgIDxkaXYgY2xhc3M9XFxcImF1dGhfaW5uZXJcXFwiPjwvZGl2PlxcbiAgICA8ZGl2IGNsYXNzPVxcXCJhdXRoX3N1Ym1pdFxcXCI+XFxuXCJcbiAgICArICgoc3RhY2sxID0gaGVscGVycy51bmxlc3MuY2FsbChhbGlhczEsKGRlcHRoMCAhPSBudWxsID8gZGVwdGgwLmlzTG9nb3V0IDogZGVwdGgwKSx7XCJuYW1lXCI6XCJ1bmxlc3NcIixcImhhc2hcIjp7fSxcImZuXCI6Y29udGFpbmVyLnByb2dyYW0oMSwgZGF0YSwgMCksXCJpbnZlcnNlXCI6Y29udGFpbmVyLm5vb3AsXCJkYXRhXCI6ZGF0YX0pKSAhPSBudWxsID8gc3RhY2sxIDogXCJcIilcbiAgICArICgoc3RhY2sxID0gaGVscGVyc1tcImlmXCJdLmNhbGwoYWxpYXMxLChkZXB0aDAgIT0gbnVsbCA/IGRlcHRoMC5pc0F1dGhvcml6ZWQgOiBkZXB0aDApLHtcIm5hbWVcIjpcImlmXCIsXCJoYXNoXCI6e30sXCJmblwiOmNvbnRhaW5lci5wcm9ncmFtKDMsIGRhdGEsIDApLFwiaW52ZXJzZVwiOmNvbnRhaW5lci5ub29wLFwiZGF0YVwiOmRhdGF9KSkgIT0gbnVsbCA/IHN0YWNrMSA6IFwiXCIpXG4gICAgKyBcIiAgICA8L2Rpdj5cXG5cXG48L2Rpdj5cXG5cIjtcbn0sXCJ1c2VEYXRhXCI6dHJ1ZX0pO1xudGVtcGxhdGVzWydiYXNpY19hdXRoJ10gPSB0ZW1wbGF0ZSh7XCIxXCI6ZnVuY3Rpb24oY29udGFpbmVyLGRlcHRoMCxoZWxwZXJzLHBhcnRpYWxzLGRhdGEpIHtcbiAgICByZXR1cm4gXCIgLSBhdXRob3JpemVkXCI7XG59LFwiM1wiOmZ1bmN0aW9uKGNvbnRhaW5lcixkZXB0aDAsaGVscGVycyxwYXJ0aWFscyxkYXRhKSB7XG4gICAgdmFyIHN0YWNrMTtcblxuICByZXR1cm4gXCIgICAgICAgICAgICAgICAgPHNwYW4gY2xhc3M9XFxcImJhc2ljX2F1dGhfX3ZhbHVlXFxcIj5cIlxuICAgICsgKChzdGFjazEgPSAoaGVscGVycy5lc2NhcGUgfHwgKGRlcHRoMCAmJiBkZXB0aDAuZXNjYXBlKSB8fCBoZWxwZXJzLmhlbHBlck1pc3NpbmcpLmNhbGwoZGVwdGgwICE9IG51bGwgPyBkZXB0aDAgOiB7fSwoZGVwdGgwICE9IG51bGwgPyBkZXB0aDAudXNlcm5hbWUgOiBkZXB0aDApLHtcIm5hbWVcIjpcImVzY2FwZVwiLFwiaGFzaFwiOnt9LFwiZGF0YVwiOmRhdGF9KSkgIT0gbnVsbCA/IHN0YWNrMSA6IFwiXCIpXG4gICAgKyBcIjwvc3Bhbj5cXG5cIjtcbn0sXCI1XCI6ZnVuY3Rpb24oY29udGFpbmVyLGRlcHRoMCxoZWxwZXJzLHBhcnRpYWxzLGRhdGEpIHtcbiAgICByZXR1cm4gXCIgICAgICAgICAgICAgICAgPGlucHV0IHJlcXVpcmVkIHBsYWNlaG9sZGVyPVxcXCJ1c2VybmFtZVxcXCIgY2xhc3M9XFxcImJhc2ljX2F1dGhfX3VzZXJuYW1lIGF1dGhfaW5wdXRcXFwiIG5hbWU9XFxcInVzZXJuYW1lXFxcIiB0eXBlPVxcXCJ0ZXh0XFxcIi8+XFxuXCI7XG59LFwiN1wiOmZ1bmN0aW9uKGNvbnRhaW5lcixkZXB0aDAsaGVscGVycyxwYXJ0aWFscyxkYXRhKSB7XG4gICAgcmV0dXJuIFwiICAgICAgICAgICAgPGRpdiBjbGFzcz1cXFwiYXV0aF9sYWJlbFxcXCI+XFxuICAgICAgICAgICAgICAgIDxzcGFuIGNsYXNzPVxcXCJiYXNpY19hdXRoX19sYWJlbFxcXCIgZGF0YS1zdy10cmFuc2xhdGU+cGFzc3dvcmQ6PC9zcGFuPlxcbiAgICAgICAgICAgICAgICA8aW5wdXQgcmVxdWlyZWQgcGxhY2Vob2xkZXI9XFxcInBhc3N3b3JkXFxcIiBjbGFzcz1cXFwiYmFzaWNfYXV0aF9fcGFzc3dvcmQgYXV0aF9pbnB1dFxcXCIgbmFtZT1cXFwicGFzc3dvcmRcXFwiIHR5cGU9XFxcInBhc3N3b3JkXFxcIi8+PC9sYWJlbD5cXG4gICAgICAgICAgICA8L2Rpdj5cXG5cIjtcbn0sXCJjb21waWxlclwiOls3LFwiPj0gNC4wLjBcIl0sXCJtYWluXCI6ZnVuY3Rpb24oY29udGFpbmVyLGRlcHRoMCxoZWxwZXJzLHBhcnRpYWxzLGRhdGEpIHtcbiAgICB2YXIgc3RhY2sxLCBhbGlhczE9ZGVwdGgwICE9IG51bGwgPyBkZXB0aDAgOiB7fTtcblxuICByZXR1cm4gXCI8ZGl2IGNsYXNzPSdiYXNpY19hdXRoX2NvbnRhaW5lcic+XFxuICAgIDxoMyBjbGFzcz1cXFwiYXV0aF9fdGl0bGVcXFwiPkJhc2ljIGF1dGhlbnRpY2F0aW9uXCJcbiAgICArICgoc3RhY2sxID0gaGVscGVyc1tcImlmXCJdLmNhbGwoYWxpYXMxLChkZXB0aDAgIT0gbnVsbCA/IGRlcHRoMC5pc0xvZ291dCA6IGRlcHRoMCkse1wibmFtZVwiOlwiaWZcIixcImhhc2hcIjp7fSxcImZuXCI6Y29udGFpbmVyLnByb2dyYW0oMSwgZGF0YSwgMCksXCJpbnZlcnNlXCI6Y29udGFpbmVyLm5vb3AsXCJkYXRhXCI6ZGF0YX0pKSAhPSBudWxsID8gc3RhY2sxIDogXCJcIilcbiAgICArIFwiPC9oMz5cXG4gICAgPGZvcm0gY2xhc3M9XFxcImJhc2ljX2lucHV0X2NvbnRhaW5lclxcXCI+XFxuICAgICAgICA8ZGl2IGNsYXNzPVxcXCJhdXRoX19kZXNjcmlwdGlvblxcXCI+XCJcbiAgICArICgoc3RhY2sxID0gKGhlbHBlcnMuc2FuaXRpemUgfHwgKGRlcHRoMCAmJiBkZXB0aDAuc2FuaXRpemUpIHx8IGhlbHBlcnMuaGVscGVyTWlzc2luZykuY2FsbChhbGlhczEsKGRlcHRoMCAhPSBudWxsID8gZGVwdGgwLmRlc2NyaXB0aW9uIDogZGVwdGgwKSx7XCJuYW1lXCI6XCJzYW5pdGl6ZVwiLFwiaGFzaFwiOnt9LFwiZGF0YVwiOmRhdGF9KSkgIT0gbnVsbCA/IHN0YWNrMSA6IFwiXCIpXG4gICAgKyBcIjwvZGl2PlxcbiAgICAgICAgPGRpdiBjbGFzcz1cXFwiYXV0aF9sYWJlbFxcXCI+XFxuICAgICAgICAgICAgPHNwYW4gY2xhc3M9XFxcImJhc2ljX2F1dGhfX2xhYmVsXFxcIiBkYXRhLXN3LXRyYW5zbGF0ZT51c2VybmFtZTo8L3NwYW4+XFxuXCJcbiAgICArICgoc3RhY2sxID0gaGVscGVyc1tcImlmXCJdLmNhbGwoYWxpYXMxLChkZXB0aDAgIT0gbnVsbCA/IGRlcHRoMC5pc0xvZ291dCA6IGRlcHRoMCkse1wibmFtZVwiOlwiaWZcIixcImhhc2hcIjp7fSxcImZuXCI6Y29udGFpbmVyLnByb2dyYW0oMywgZGF0YSwgMCksXCJpbnZlcnNlXCI6Y29udGFpbmVyLnByb2dyYW0oNSwgZGF0YSwgMCksXCJkYXRhXCI6ZGF0YX0pKSAhPSBudWxsID8gc3RhY2sxIDogXCJcIilcbiAgICArIFwiICAgICAgICA8L2Rpdj5cXG5cIlxuICAgICsgKChzdGFjazEgPSBoZWxwZXJzLnVubGVzcy5jYWxsKGFsaWFzMSwoZGVwdGgwICE9IG51bGwgPyBkZXB0aDAuaXNMb2dvdXQgOiBkZXB0aDApLHtcIm5hbWVcIjpcInVubGVzc1wiLFwiaGFzaFwiOnt9LFwiZm5cIjpjb250YWluZXIucHJvZ3JhbSg3LCBkYXRhLCAwKSxcImludmVyc2VcIjpjb250YWluZXIubm9vcCxcImRhdGFcIjpkYXRhfSkpICE9IG51bGwgPyBzdGFjazEgOiBcIlwiKVxuICAgICsgXCIgICAgPC9mb3JtPlxcbjwvZGl2PlxcblwiO1xufSxcInVzZURhdGFcIjp0cnVlfSk7XG50ZW1wbGF0ZXNbJ2NvbnRlbnRfdHlwZSddID0gdGVtcGxhdGUoe1wiMVwiOmZ1bmN0aW9uKGNvbnRhaW5lcixkZXB0aDAsaGVscGVycyxwYXJ0aWFscyxkYXRhKSB7XG4gICAgdmFyIHN0YWNrMTtcblxuICByZXR1cm4gKChzdGFjazEgPSBoZWxwZXJzLmVhY2guY2FsbChkZXB0aDAgIT0gbnVsbCA/IGRlcHRoMCA6IHt9LChkZXB0aDAgIT0gbnVsbCA/IGRlcHRoMC5wcm9kdWNlcyA6IGRlcHRoMCkse1wibmFtZVwiOlwiZWFjaFwiLFwiaGFzaFwiOnt9LFwiZm5cIjpjb250YWluZXIucHJvZ3JhbSgyLCBkYXRhLCAwKSxcImludmVyc2VcIjpjb250YWluZXIubm9vcCxcImRhdGFcIjpkYXRhfSkpICE9IG51bGwgPyBzdGFjazEgOiBcIlwiKTtcbn0sXCIyXCI6ZnVuY3Rpb24oY29udGFpbmVyLGRlcHRoMCxoZWxwZXJzLHBhcnRpYWxzLGRhdGEpIHtcbiAgICB2YXIgc3RhY2sxLCBhbGlhczE9ZGVwdGgwICE9IG51bGwgPyBkZXB0aDAgOiB7fSwgYWxpYXMyPWhlbHBlcnMuaGVscGVyTWlzc2luZztcblxuICByZXR1cm4gXCJcdDxvcHRpb24gdmFsdWU9XFxcIlwiXG4gICAgKyAoKHN0YWNrMSA9IChoZWxwZXJzLnNhbml0aXplIHx8IChkZXB0aDAgJiYgZGVwdGgwLnNhbml0aXplKSB8fCBhbGlhczIpLmNhbGwoYWxpYXMxLGRlcHRoMCx7XCJuYW1lXCI6XCJzYW5pdGl6ZVwiLFwiaGFzaFwiOnt9LFwiZGF0YVwiOmRhdGF9KSkgIT0gbnVsbCA/IHN0YWNrMSA6IFwiXCIpXG4gICAgKyBcIlxcXCI+XCJcbiAgICArICgoc3RhY2sxID0gKGhlbHBlcnMuc2FuaXRpemUgfHwgKGRlcHRoMCAmJiBkZXB0aDAuc2FuaXRpemUpIHx8IGFsaWFzMikuY2FsbChhbGlhczEsZGVwdGgwLHtcIm5hbWVcIjpcInNhbml0aXplXCIsXCJoYXNoXCI6e30sXCJkYXRhXCI6ZGF0YX0pKSAhPSBudWxsID8gc3RhY2sxIDogXCJcIilcbiAgICArIFwiPC9vcHRpb24+XFxuXCI7XG59LFwiNFwiOmZ1bmN0aW9uKGNvbnRhaW5lcixkZXB0aDAsaGVscGVycyxwYXJ0aWFscyxkYXRhKSB7XG4gICAgcmV0dXJuIFwiICA8b3B0aW9uIHZhbHVlPVxcXCJhcHBsaWNhdGlvbi9qc29uXFxcIj5hcHBsaWNhdGlvbi9qc29uPC9vcHRpb24+XFxuXCI7XG59LFwiY29tcGlsZXJcIjpbNyxcIj49IDQuMC4wXCJdLFwibWFpblwiOmZ1bmN0aW9uKGNvbnRhaW5lcixkZXB0aDAsaGVscGVycyxwYXJ0aWFscyxkYXRhKSB7XG4gICAgdmFyIHN0YWNrMSwgYWxpYXMxPWRlcHRoMCAhPSBudWxsID8gZGVwdGgwIDoge30sIGFsaWFzMj1oZWxwZXJzLmhlbHBlck1pc3Npbmc7XG5cbiAgcmV0dXJuIFwiPGxhYmVsIGRhdGEtc3ctdHJhbnNsYXRlIGZvcj1cXFwiXCJcbiAgICArICgoc3RhY2sxID0gKGhlbHBlcnMuZXNjYXBlIHx8IChkZXB0aDAgJiYgZGVwdGgwLmVzY2FwZSkgfHwgYWxpYXMyKS5jYWxsKGFsaWFzMSwoZGVwdGgwICE9IG51bGwgPyBkZXB0aDAuY29udGVudFR5cGVJZCA6IGRlcHRoMCkse1wibmFtZVwiOlwiZXNjYXBlXCIsXCJoYXNoXCI6e30sXCJkYXRhXCI6ZGF0YX0pKSAhPSBudWxsID8gc3RhY2sxIDogXCJcIilcbiAgICArIFwiXFxcIj5SZXNwb25zZSBDb250ZW50IFR5cGU8L2xhYmVsPlxcbjxzZWxlY3QgbmFtZT1cXFwiY29udGVudFR5cGVcXFwiIGlkPVxcXCJcIlxuICAgICsgKChzdGFjazEgPSAoaGVscGVycy5lc2NhcGUgfHwgKGRlcHRoMCAmJiBkZXB0aDAuZXNjYXBlKSB8fCBhbGlhczIpLmNhbGwoYWxpYXMxLChkZXB0aDAgIT0gbnVsbCA/IGRlcHRoMC5jb250ZW50VHlwZUlkIDogZGVwdGgwKSx7XCJuYW1lXCI6XCJlc2NhcGVcIixcImhhc2hcIjp7fSxcImRhdGFcIjpkYXRhfSkpICE9IG51bGwgPyBzdGFjazEgOiBcIlwiKVxuICAgICsgXCJcXFwiPlxcblwiXG4gICAgKyAoKHN0YWNrMSA9IGhlbHBlcnNbXCJpZlwiXS5jYWxsKGFsaWFzMSwoZGVwdGgwICE9IG51bGwgPyBkZXB0aDAucHJvZHVjZXMgOiBkZXB0aDApLHtcIm5hbWVcIjpcImlmXCIsXCJoYXNoXCI6e30sXCJmblwiOmNvbnRhaW5lci5wcm9ncmFtKDEsIGRhdGEsIDApLFwiaW52ZXJzZVwiOmNvbnRhaW5lci5wcm9ncmFtKDQsIGRhdGEsIDApLFwiZGF0YVwiOmRhdGF9KSkgIT0gbnVsbCA/IHN0YWNrMSA6IFwiXCIpXG4gICAgKyBcIjwvc2VsZWN0PlxcblwiO1xufSxcInVzZURhdGFcIjp0cnVlfSk7XG50ZW1wbGF0ZXNbJ21haW4nXSA9IHRlbXBsYXRlKHtcIjFcIjpmdW5jdGlvbihjb250YWluZXIsZGVwdGgwLGhlbHBlcnMscGFydGlhbHMsZGF0YSkge1xuICAgIHZhciBzdGFjazEsIGFsaWFzMT1kZXB0aDAgIT0gbnVsbCA/IGRlcHRoMCA6IHt9LCBhbGlhczI9aGVscGVycy5oZWxwZXJNaXNzaW5nO1xuXG4gIHJldHVybiBcIiAgPGRpdiBjbGFzcz1cXFwiaW5mb190aXRsZVxcXCI+XCJcbiAgICArICgoc3RhY2sxID0gKGhlbHBlcnMuc2FuaXRpemUgfHwgKGRlcHRoMCAmJiBkZXB0aDAuc2FuaXRpemUpIHx8IGFsaWFzMikuY2FsbChhbGlhczEsKChzdGFjazEgPSAoZGVwdGgwICE9IG51bGwgPyBkZXB0aDAuaW5mbyA6IGRlcHRoMCkpICE9IG51bGwgPyBzdGFjazEudGl0bGUgOiBzdGFjazEpLHtcIm5hbWVcIjpcInNhbml0aXplXCIsXCJoYXNoXCI6e30sXCJkYXRhXCI6ZGF0YX0pKSAhPSBudWxsID8gc3RhY2sxIDogXCJcIilcbiAgICArIFwiPC9kaXY+XFxuICA8ZGl2IGNsYXNzPVxcXCJpbmZvX2Rlc2NyaXB0aW9uIG1hcmtkb3duXFxcIj5cIlxuICAgICsgKChzdGFjazEgPSAoaGVscGVycy5zYW5pdGl6ZSB8fCAoZGVwdGgwICYmIGRlcHRoMC5zYW5pdGl6ZSkgfHwgYWxpYXMyKS5jYWxsKGFsaWFzMSwoKHN0YWNrMSA9IChkZXB0aDAgIT0gbnVsbCA/IGRlcHRoMC5pbmZvIDogZGVwdGgwKSkgIT0gbnVsbCA/IHN0YWNrMS5kZXNjcmlwdGlvbiA6IHN0YWNrMSkse1wibmFtZVwiOlwic2FuaXRpemVcIixcImhhc2hcIjp7fSxcImRhdGFcIjpkYXRhfSkpICE9IG51bGwgPyBzdGFjazEgOiBcIlwiKVxuICAgICsgXCI8L2Rpdj5cXG5cIlxuICAgICsgKChzdGFjazEgPSBoZWxwZXJzW1wiaWZcIl0uY2FsbChhbGlhczEsKGRlcHRoMCAhPSBudWxsID8gZGVwdGgwLmV4dGVybmFsRG9jcyA6IGRlcHRoMCkse1wibmFtZVwiOlwiaWZcIixcImhhc2hcIjp7fSxcImZuXCI6Y29udGFpbmVyLnByb2dyYW0oMiwgZGF0YSwgMCksXCJpbnZlcnNlXCI6Y29udGFpbmVyLm5vb3AsXCJkYXRhXCI6ZGF0YX0pKSAhPSBudWxsID8gc3RhY2sxIDogXCJcIilcbiAgICArIFwiICBcIlxuICAgICsgKChzdGFjazEgPSBoZWxwZXJzW1wiaWZcIl0uY2FsbChhbGlhczEsKChzdGFjazEgPSAoZGVwdGgwICE9IG51bGwgPyBkZXB0aDAuaW5mbyA6IGRlcHRoMCkpICE9IG51bGwgPyBzdGFjazEudGVybXNPZlNlcnZpY2VVcmwgOiBzdGFjazEpLHtcIm5hbWVcIjpcImlmXCIsXCJoYXNoXCI6e30sXCJmblwiOmNvbnRhaW5lci5wcm9ncmFtKDQsIGRhdGEsIDApLFwiaW52ZXJzZVwiOmNvbnRhaW5lci5ub29wLFwiZGF0YVwiOmRhdGF9KSkgIT0gbnVsbCA/IHN0YWNrMSA6IFwiXCIpXG4gICAgKyBcIlxcbiAgXCJcbiAgICArICgoc3RhY2sxID0gaGVscGVyc1tcImlmXCJdLmNhbGwoYWxpYXMxLCgoc3RhY2sxID0gKChzdGFjazEgPSAoZGVwdGgwICE9IG51bGwgPyBkZXB0aDAuaW5mbyA6IGRlcHRoMCkpICE9IG51bGwgPyBzdGFjazEuY29udGFjdCA6IHN0YWNrMSkpICE9IG51bGwgPyBzdGFjazEubmFtZSA6IHN0YWNrMSkse1wibmFtZVwiOlwiaWZcIixcImhhc2hcIjp7fSxcImZuXCI6Y29udGFpbmVyLnByb2dyYW0oNiwgZGF0YSwgMCksXCJpbnZlcnNlXCI6Y29udGFpbmVyLm5vb3AsXCJkYXRhXCI6ZGF0YX0pKSAhPSBudWxsID8gc3RhY2sxIDogXCJcIilcbiAgICArIFwiXFxuICBcIlxuICAgICsgKChzdGFjazEgPSBoZWxwZXJzW1wiaWZcIl0uY2FsbChhbGlhczEsKChzdGFjazEgPSAoKHN0YWNrMSA9IChkZXB0aDAgIT0gbnVsbCA/IGRlcHRoMC5pbmZvIDogZGVwdGgwKSkgIT0gbnVsbCA/IHN0YWNrMS5jb250YWN0IDogc3RhY2sxKSkgIT0gbnVsbCA/IHN0YWNrMS51cmwgOiBzdGFjazEpLHtcIm5hbWVcIjpcImlmXCIsXCJoYXNoXCI6e30sXCJmblwiOmNvbnRhaW5lci5wcm9ncmFtKDgsIGRhdGEsIDApLFwiaW52ZXJzZVwiOmNvbnRhaW5lci5ub29wLFwiZGF0YVwiOmRhdGF9KSkgIT0gbnVsbCA/IHN0YWNrMSA6IFwiXCIpXG4gICAgKyBcIlxcbiAgXCJcbiAgICArICgoc3RhY2sxID0gaGVscGVyc1tcImlmXCJdLmNhbGwoYWxpYXMxLCgoc3RhY2sxID0gKChzdGFjazEgPSAoZGVwdGgwICE9IG51bGwgPyBkZXB0aDAuaW5mbyA6IGRlcHRoMCkpICE9IG51bGwgPyBzdGFjazEuY29udGFjdCA6IHN0YWNrMSkpICE9IG51bGwgPyBzdGFjazEuZW1haWwgOiBzdGFjazEpLHtcIm5hbWVcIjpcImlmXCIsXCJoYXNoXCI6e30sXCJmblwiOmNvbnRhaW5lci5wcm9ncmFtKDEwLCBkYXRhLCAwKSxcImludmVyc2VcIjpjb250YWluZXIubm9vcCxcImRhdGFcIjpkYXRhfSkpICE9IG51bGwgPyBzdGFjazEgOiBcIlwiKVxuICAgICsgXCJcXG4gIFwiXG4gICAgKyAoKHN0YWNrMSA9IGhlbHBlcnNbXCJpZlwiXS5jYWxsKGFsaWFzMSwoKHN0YWNrMSA9IChkZXB0aDAgIT0gbnVsbCA/IGRlcHRoMC5pbmZvIDogZGVwdGgwKSkgIT0gbnVsbCA/IHN0YWNrMS5saWNlbnNlIDogc3RhY2sxKSx7XCJuYW1lXCI6XCJpZlwiLFwiaGFzaFwiOnt9LFwiZm5cIjpjb250YWluZXIucHJvZ3JhbSgxMiwgZGF0YSwgMCksXCJpbnZlcnNlXCI6Y29udGFpbmVyLm5vb3AsXCJkYXRhXCI6ZGF0YX0pKSAhPSBudWxsID8gc3RhY2sxIDogXCJcIilcbiAgICArIFwiXFxuXCI7XG59LFwiMlwiOmZ1bmN0aW9uKGNvbnRhaW5lcixkZXB0aDAsaGVscGVycyxwYXJ0aWFscyxkYXRhKSB7XG4gICAgdmFyIHN0YWNrMSwgYWxpYXMxPWRlcHRoMCAhPSBudWxsID8gZGVwdGgwIDoge30sIGFsaWFzMj1oZWxwZXJzLmhlbHBlck1pc3Npbmc7XG5cbiAgcmV0dXJuIFwiICA8cD5cIlxuICAgICsgKChzdGFjazEgPSAoaGVscGVycy5zYW5pdGl6ZSB8fCAoZGVwdGgwICYmIGRlcHRoMC5zYW5pdGl6ZSkgfHwgYWxpYXMyKS5jYWxsKGFsaWFzMSwoKHN0YWNrMSA9IChkZXB0aDAgIT0gbnVsbCA/IGRlcHRoMC5leHRlcm5hbERvY3MgOiBkZXB0aDApKSAhPSBudWxsID8gc3RhY2sxLmRlc2NyaXB0aW9uIDogc3RhY2sxKSx7XCJuYW1lXCI6XCJzYW5pdGl6ZVwiLFwiaGFzaFwiOnt9LFwiZGF0YVwiOmRhdGF9KSkgIT0gbnVsbCA/IHN0YWNrMSA6IFwiXCIpXG4gICAgKyBcIjwvcD5cXG4gIDxhIGhyZWY9XFxcIlwiXG4gICAgKyAoKHN0YWNrMSA9IChoZWxwZXJzLmVzY2FwZSB8fCAoZGVwdGgwICYmIGRlcHRoMC5lc2NhcGUpIHx8IGFsaWFzMikuY2FsbChhbGlhczEsKChzdGFjazEgPSAoZGVwdGgwICE9IG51bGwgPyBkZXB0aDAuZXh0ZXJuYWxEb2NzIDogZGVwdGgwKSkgIT0gbnVsbCA/IHN0YWNrMS51cmwgOiBzdGFjazEpLHtcIm5hbWVcIjpcImVzY2FwZVwiLFwiaGFzaFwiOnt9LFwiZGF0YVwiOmRhdGF9KSkgIT0gbnVsbCA/IHN0YWNrMSA6IFwiXCIpXG4gICAgKyBcIlxcXCIgdGFyZ2V0PVxcXCJfYmxhbmtcXFwiPlwiXG4gICAgKyAoKHN0YWNrMSA9IChoZWxwZXJzLmVzY2FwZSB8fCAoZGVwdGgwICYmIGRlcHRoMC5lc2NhcGUpIHx8IGFsaWFzMikuY2FsbChhbGlhczEsKChzdGFjazEgPSAoZGVwdGgwICE9IG51bGwgPyBkZXB0aDAuZXh0ZXJuYWxEb2NzIDogZGVwdGgwKSkgIT0gbnVsbCA/IHN0YWNrMS51cmwgOiBzdGFjazEpLHtcIm5hbWVcIjpcImVzY2FwZVwiLFwiaGFzaFwiOnt9LFwiZGF0YVwiOmRhdGF9KSkgIT0gbnVsbCA/IHN0YWNrMSA6IFwiXCIpXG4gICAgKyBcIjwvYT5cXG5cIjtcbn0sXCI0XCI6ZnVuY3Rpb24oY29udGFpbmVyLGRlcHRoMCxoZWxwZXJzLHBhcnRpYWxzLGRhdGEpIHtcbiAgICB2YXIgc3RhY2sxO1xuXG4gIHJldHVybiBcIjxkaXYgY2xhc3M9XFxcImluZm9fdG9zXFxcIj48YSB0YXJnZXQ9XFxcIl9ibGFua1xcXCIgaHJlZj1cXFwiXCJcbiAgICArICgoc3RhY2sxID0gKGhlbHBlcnMuZXNjYXBlIHx8IChkZXB0aDAgJiYgZGVwdGgwLmVzY2FwZSkgfHwgaGVscGVycy5oZWxwZXJNaXNzaW5nKS5jYWxsKGRlcHRoMCAhPSBudWxsID8gZGVwdGgwIDoge30sKChzdGFjazEgPSAoZGVwdGgwICE9IG51bGwgPyBkZXB0aDAuaW5mbyA6IGRlcHRoMCkpICE9IG51bGwgPyBzdGFjazEudGVybXNPZlNlcnZpY2VVcmwgOiBzdGFjazEpLHtcIm5hbWVcIjpcImVzY2FwZVwiLFwiaGFzaFwiOnt9LFwiZGF0YVwiOmRhdGF9KSkgIT0gbnVsbCA/IHN0YWNrMSA6IFwiXCIpXG4gICAgKyBcIlxcXCIgZGF0YS1zdy10cmFuc2xhdGU+VGVybXMgb2Ygc2VydmljZTwvYT48L2Rpdj5cIjtcbn0sXCI2XCI6ZnVuY3Rpb24oY29udGFpbmVyLGRlcHRoMCxoZWxwZXJzLHBhcnRpYWxzLGRhdGEpIHtcbiAgICB2YXIgc3RhY2sxO1xuXG4gIHJldHVybiBcIjxkaXY+PGRpdiBjbGFzcz0naW5mb19uYW1lJyBzdHlsZT1cXFwiZGlzcGxheTogaW5saW5lXFxcIiBkYXRhLXN3LXRyYW5zbGF0ZT5DcmVhdGVkIGJ5IDwvZGl2PiBcIlxuICAgICsgKChzdGFjazEgPSAoaGVscGVycy5lc2NhcGUgfHwgKGRlcHRoMCAmJiBkZXB0aDAuZXNjYXBlKSB8fCBoZWxwZXJzLmhlbHBlck1pc3NpbmcpLmNhbGwoZGVwdGgwICE9IG51bGwgPyBkZXB0aDAgOiB7fSwoKHN0YWNrMSA9ICgoc3RhY2sxID0gKGRlcHRoMCAhPSBudWxsID8gZGVwdGgwLmluZm8gOiBkZXB0aDApKSAhPSBudWxsID8gc3RhY2sxLmNvbnRhY3QgOiBzdGFjazEpKSAhPSBudWxsID8gc3RhY2sxLm5hbWUgOiBzdGFjazEpLHtcIm5hbWVcIjpcImVzY2FwZVwiLFwiaGFzaFwiOnt9LFwiZGF0YVwiOmRhdGF9KSkgIT0gbnVsbCA/IHN0YWNrMSA6IFwiXCIpXG4gICAgKyBcIjwvZGl2PlwiO1xufSxcIjhcIjpmdW5jdGlvbihjb250YWluZXIsZGVwdGgwLGhlbHBlcnMscGFydGlhbHMsZGF0YSkge1xuICAgIHZhciBzdGFjazEsIGFsaWFzMT1kZXB0aDAgIT0gbnVsbCA/IGRlcHRoMCA6IHt9LCBhbGlhczI9aGVscGVycy5oZWxwZXJNaXNzaW5nO1xuXG4gIHJldHVybiBcIjxkaXYgY2xhc3M9J2luZm9fdXJsJyBkYXRhLXN3LXRyYW5zbGF0ZT5TZWUgbW9yZSBhdCA8YSBocmVmPVxcXCJcIlxuICAgICsgKChzdGFjazEgPSAoaGVscGVycy5lc2NhcGUgfHwgKGRlcHRoMCAmJiBkZXB0aDAuZXNjYXBlKSB8fCBhbGlhczIpLmNhbGwoYWxpYXMxLCgoc3RhY2sxID0gKChzdGFjazEgPSAoZGVwdGgwICE9IG51bGwgPyBkZXB0aDAuaW5mbyA6IGRlcHRoMCkpICE9IG51bGwgPyBzdGFjazEuY29udGFjdCA6IHN0YWNrMSkpICE9IG51bGwgPyBzdGFjazEudXJsIDogc3RhY2sxKSx7XCJuYW1lXCI6XCJlc2NhcGVcIixcImhhc2hcIjp7fSxcImRhdGFcIjpkYXRhfSkpICE9IG51bGwgPyBzdGFjazEgOiBcIlwiKVxuICAgICsgXCJcXFwiPlwiXG4gICAgKyAoKHN0YWNrMSA9IChoZWxwZXJzLmVzY2FwZSB8fCAoZGVwdGgwICYmIGRlcHRoMC5lc2NhcGUpIHx8IGFsaWFzMikuY2FsbChhbGlhczEsKChzdGFjazEgPSAoKHN0YWNrMSA9IChkZXB0aDAgIT0gbnVsbCA/IGRlcHRoMC5pbmZvIDogZGVwdGgwKSkgIT0gbnVsbCA/IHN0YWNrMS5jb250YWN0IDogc3RhY2sxKSkgIT0gbnVsbCA/IHN0YWNrMS51cmwgOiBzdGFjazEpLHtcIm5hbWVcIjpcImVzY2FwZVwiLFwiaGFzaFwiOnt9LFwiZGF0YVwiOmRhdGF9KSkgIT0gbnVsbCA/IHN0YWNrMSA6IFwiXCIpXG4gICAgKyBcIjwvYT48L2Rpdj5cIjtcbn0sXCIxMFwiOmZ1bmN0aW9uKGNvbnRhaW5lcixkZXB0aDAsaGVscGVycyxwYXJ0aWFscyxkYXRhKSB7XG4gICAgdmFyIHN0YWNrMSwgYWxpYXMxPWRlcHRoMCAhPSBudWxsID8gZGVwdGgwIDoge30sIGFsaWFzMj1oZWxwZXJzLmhlbHBlck1pc3Npbmc7XG5cbiAgcmV0dXJuIFwiPGRpdiBjbGFzcz0naW5mb19lbWFpbCc+PGEgdGFyZ2V0PVxcXCJfcGFyZW50XFxcIiBocmVmPVxcXCJtYWlsdG86XCJcbiAgICArICgoc3RhY2sxID0gKGhlbHBlcnMuZXNjYXBlIHx8IChkZXB0aDAgJiYgZGVwdGgwLmVzY2FwZSkgfHwgYWxpYXMyKS5jYWxsKGFsaWFzMSwoKHN0YWNrMSA9ICgoc3RhY2sxID0gKGRlcHRoMCAhPSBudWxsID8gZGVwdGgwLmluZm8gOiBkZXB0aDApKSAhPSBudWxsID8gc3RhY2sxLmNvbnRhY3QgOiBzdGFjazEpKSAhPSBudWxsID8gc3RhY2sxLmVtYWlsIDogc3RhY2sxKSx7XCJuYW1lXCI6XCJlc2NhcGVcIixcImhhc2hcIjp7fSxcImRhdGFcIjpkYXRhfSkpICE9IG51bGwgPyBzdGFjazEgOiBcIlwiKVxuICAgICsgXCI/c3ViamVjdD1cIlxuICAgICsgKChzdGFjazEgPSAoaGVscGVycy5lc2NhcGUgfHwgKGRlcHRoMCAmJiBkZXB0aDAuZXNjYXBlKSB8fCBhbGlhczIpLmNhbGwoYWxpYXMxLCgoc3RhY2sxID0gKGRlcHRoMCAhPSBudWxsID8gZGVwdGgwLmluZm8gOiBkZXB0aDApKSAhPSBudWxsID8gc3RhY2sxLnRpdGxlIDogc3RhY2sxKSx7XCJuYW1lXCI6XCJlc2NhcGVcIixcImhhc2hcIjp7fSxcImRhdGFcIjpkYXRhfSkpICE9IG51bGwgPyBzdGFjazEgOiBcIlwiKVxuICAgICsgXCJcXFwiIGRhdGEtc3ctdHJhbnNsYXRlPkNvbnRhY3QgdGhlIGRldmVsb3BlcjwvYT48L2Rpdj5cIjtcbn0sXCIxMlwiOmZ1bmN0aW9uKGNvbnRhaW5lcixkZXB0aDAsaGVscGVycyxwYXJ0aWFscyxkYXRhKSB7XG4gICAgdmFyIHN0YWNrMSwgYWxpYXMxPWRlcHRoMCAhPSBudWxsID8gZGVwdGgwIDoge30sIGFsaWFzMj1oZWxwZXJzLmhlbHBlck1pc3Npbmc7XG5cbiAgcmV0dXJuIFwiPGRpdiBjbGFzcz0naW5mb19saWNlbnNlJz48YSB0YXJnZXQ9XFxcIl9ibGFua1xcXCIgaHJlZj0nXCJcbiAgICArICgoc3RhY2sxID0gKGhlbHBlcnMuZXNjYXBlIHx8IChkZXB0aDAgJiYgZGVwdGgwLmVzY2FwZSkgfHwgYWxpYXMyKS5jYWxsKGFsaWFzMSwoKHN0YWNrMSA9ICgoc3RhY2sxID0gKGRlcHRoMCAhPSBudWxsID8gZGVwdGgwLmluZm8gOiBkZXB0aDApKSAhPSBudWxsID8gc3RhY2sxLmxpY2Vuc2UgOiBzdGFjazEpKSAhPSBudWxsID8gc3RhY2sxLnVybCA6IHN0YWNrMSkse1wibmFtZVwiOlwiZXNjYXBlXCIsXCJoYXNoXCI6e30sXCJkYXRhXCI6ZGF0YX0pKSAhPSBudWxsID8gc3RhY2sxIDogXCJcIilcbiAgICArIFwiJz5cIlxuICAgICsgKChzdGFjazEgPSAoaGVscGVycy5lc2NhcGUgfHwgKGRlcHRoMCAmJiBkZXB0aDAuZXNjYXBlKSB8fCBhbGlhczIpLmNhbGwoYWxpYXMxLCgoc3RhY2sxID0gKChzdGFjazEgPSAoZGVwdGgwICE9IG51bGwgPyBkZXB0aDAuaW5mbyA6IGRlcHRoMCkpICE9IG51bGwgPyBzdGFjazEubGljZW5zZSA6IHN0YWNrMSkpICE9IG51bGwgPyBzdGFjazEubmFtZSA6IHN0YWNrMSkse1wibmFtZVwiOlwiZXNjYXBlXCIsXCJoYXNoXCI6e30sXCJkYXRhXCI6ZGF0YX0pKSAhPSBudWxsID8gc3RhY2sxIDogXCJcIilcbiAgICArIFwiPC9hPjwvZGl2PlwiO1xufSxcIjE0XCI6ZnVuY3Rpb24oY29udGFpbmVyLGRlcHRoMCxoZWxwZXJzLHBhcnRpYWxzLGRhdGEpIHtcbiAgICB2YXIgc3RhY2sxO1xuXG4gIHJldHVybiBcIiAgLCA8c3BhbiBzdHlsZT1cXFwiZm9udC12YXJpYW50OiBzbWFsbC1jYXBzXFxcIiBkYXRhLXN3LXRyYW5zbGF0ZT5hcGkgdmVyc2lvbjwvc3Bhbj46IFwiXG4gICAgKyAoKHN0YWNrMSA9IChoZWxwZXJzLmVzY2FwZSB8fCAoZGVwdGgwICYmIGRlcHRoMC5lc2NhcGUpIHx8IGhlbHBlcnMuaGVscGVyTWlzc2luZykuY2FsbChkZXB0aDAgIT0gbnVsbCA/IGRlcHRoMCA6IHt9LCgoc3RhY2sxID0gKGRlcHRoMCAhPSBudWxsID8gZGVwdGgwLmluZm8gOiBkZXB0aDApKSAhPSBudWxsID8gc3RhY2sxLnZlcnNpb24gOiBzdGFjazEpLHtcIm5hbWVcIjpcImVzY2FwZVwiLFwiaGFzaFwiOnt9LFwiZGF0YVwiOmRhdGF9KSkgIT0gbnVsbCA/IHN0YWNrMSA6IFwiXCIpXG4gICAgKyBcIlxcbiAgICBcIjtcbn0sXCIxNlwiOmZ1bmN0aW9uKGNvbnRhaW5lcixkZXB0aDAsaGVscGVycyxwYXJ0aWFscyxkYXRhKSB7XG4gICAgdmFyIHN0YWNrMSwgYWxpYXMxPWRlcHRoMCAhPSBudWxsID8gZGVwdGgwIDoge30sIGFsaWFzMj1oZWxwZXJzLmhlbHBlck1pc3Npbmc7XG5cbiAgcmV0dXJuIFwiICAgIDxzcGFuIHN0eWxlPVxcXCJmbG9hdDpyaWdodFxcXCI+PGEgdGFyZ2V0PVxcXCJfYmxhbmtcXFwiIGhyZWY9XFxcIlwiXG4gICAgKyAoKHN0YWNrMSA9IChoZWxwZXJzLmVzY2FwZSB8fCAoZGVwdGgwICYmIGRlcHRoMC5lc2NhcGUpIHx8IGFsaWFzMikuY2FsbChhbGlhczEsKGRlcHRoMCAhPSBudWxsID8gZGVwdGgwLnZhbGlkYXRvclVybCA6IGRlcHRoMCkse1wibmFtZVwiOlwiZXNjYXBlXCIsXCJoYXNoXCI6e30sXCJkYXRhXCI6ZGF0YX0pKSAhPSBudWxsID8gc3RhY2sxIDogXCJcIilcbiAgICArIFwiL2RlYnVnP3VybD1cIlxuICAgICsgKChzdGFjazEgPSAoaGVscGVycy5lc2NhcGUgfHwgKGRlcHRoMCAmJiBkZXB0aDAuZXNjYXBlKSB8fCBhbGlhczIpLmNhbGwoYWxpYXMxLChkZXB0aDAgIT0gbnVsbCA/IGRlcHRoMC51cmwgOiBkZXB0aDApLHtcIm5hbWVcIjpcImVzY2FwZVwiLFwiaGFzaFwiOnt9LFwiZGF0YVwiOmRhdGF9KSkgIT0gbnVsbCA/IHN0YWNrMSA6IFwiXCIpXG4gICAgKyBcIlxcXCI+PGltZyBpZD1cXFwidmFsaWRhdG9yXFxcIiBzcmM9XFxcIlwiXG4gICAgKyAoKHN0YWNrMSA9IChoZWxwZXJzLmVzY2FwZSB8fCAoZGVwdGgwICYmIGRlcHRoMC5lc2NhcGUpIHx8IGFsaWFzMikuY2FsbChhbGlhczEsKGRlcHRoMCAhPSBudWxsID8gZGVwdGgwLnZhbGlkYXRvclVybCA6IGRlcHRoMCkse1wibmFtZVwiOlwiZXNjYXBlXCIsXCJoYXNoXCI6e30sXCJkYXRhXCI6ZGF0YX0pKSAhPSBudWxsID8gc3RhY2sxIDogXCJcIilcbiAgICArIFwiP3VybD1cIlxuICAgICsgKChzdGFjazEgPSAoaGVscGVycy5lc2NhcGUgfHwgKGRlcHRoMCAmJiBkZXB0aDAuZXNjYXBlKSB8fCBhbGlhczIpLmNhbGwoYWxpYXMxLChkZXB0aDAgIT0gbnVsbCA/IGRlcHRoMC51cmwgOiBkZXB0aDApLHtcIm5hbWVcIjpcImVzY2FwZVwiLFwiaGFzaFwiOnt9LFwiZGF0YVwiOmRhdGF9KSkgIT0gbnVsbCA/IHN0YWNrMSA6IFwiXCIpXG4gICAgKyBcIlxcXCI+PC9hPlxcbiAgICA8L3NwYW4+XFxuXCI7XG59LFwiY29tcGlsZXJcIjpbNyxcIj49IDQuMC4wXCJdLFwibWFpblwiOmZ1bmN0aW9uKGNvbnRhaW5lcixkZXB0aDAsaGVscGVycyxwYXJ0aWFscyxkYXRhKSB7XG4gICAgdmFyIHN0YWNrMSwgYWxpYXMxPWRlcHRoMCAhPSBudWxsID8gZGVwdGgwIDoge307XG5cbiAgcmV0dXJuIFwiPGRpdiBjbGFzcz0naW5mbycgaWQ9J2FwaV9pbmZvJz5cXG5cIlxuICAgICsgKChzdGFjazEgPSBoZWxwZXJzW1wiaWZcIl0uY2FsbChhbGlhczEsKGRlcHRoMCAhPSBudWxsID8gZGVwdGgwLmluZm8gOiBkZXB0aDApLHtcIm5hbWVcIjpcImlmXCIsXCJoYXNoXCI6e30sXCJmblwiOmNvbnRhaW5lci5wcm9ncmFtKDEsIGRhdGEsIDApLFwiaW52ZXJzZVwiOmNvbnRhaW5lci5ub29wLFwiZGF0YVwiOmRhdGF9KSkgIT0gbnVsbCA/IHN0YWNrMSA6IFwiXCIpXG4gICAgKyBcIjwvZGl2PlxcbjxkaXYgY2xhc3M9J2NvbnRhaW5lcicgaWQ9J3Jlc291cmNlc19jb250YWluZXInPlxcbiAgPGRpdiBjbGFzcz0nYXV0aG9yaXplLXdyYXBwZXInPjwvZGl2PlxcblxcbiAgPHVsIGlkPSdyZXNvdXJjZXMnPjwvdWw+XFxuXFxuICA8ZGl2IGNsYXNzPVxcXCJmb290ZXJcXFwiPlxcbiAgICA8aDQgc3R5bGU9XFxcImNvbG9yOiAjOTk5XFxcIj5bIDxzcGFuIHN0eWxlPVxcXCJmb250LXZhcmlhbnQ6IHNtYWxsLWNhcHNcXFwiPmJhc2UgdXJsPC9zcGFuPjogXCJcbiAgICArICgoc3RhY2sxID0gKGhlbHBlcnMuZXNjYXBlIHx8IChkZXB0aDAgJiYgZGVwdGgwLmVzY2FwZSkgfHwgaGVscGVycy5oZWxwZXJNaXNzaW5nKS5jYWxsKGFsaWFzMSwoZGVwdGgwICE9IG51bGwgPyBkZXB0aDAuYmFzZVBhdGggOiBkZXB0aDApLHtcIm5hbWVcIjpcImVzY2FwZVwiLFwiaGFzaFwiOnt9LFwiZGF0YVwiOmRhdGF9KSkgIT0gbnVsbCA/IHN0YWNrMSA6IFwiXCIpXG4gICAgKyBcIlxcblwiXG4gICAgKyAoKHN0YWNrMSA9IGhlbHBlcnNbXCJpZlwiXS5jYWxsKGFsaWFzMSwoKHN0YWNrMSA9IChkZXB0aDAgIT0gbnVsbCA/IGRlcHRoMC5pbmZvIDogZGVwdGgwKSkgIT0gbnVsbCA/IHN0YWNrMS52ZXJzaW9uIDogc3RhY2sxKSx7XCJuYW1lXCI6XCJpZlwiLFwiaGFzaFwiOnt9LFwiZm5cIjpjb250YWluZXIucHJvZ3JhbSgxNCwgZGF0YSwgMCksXCJpbnZlcnNlXCI6Y29udGFpbmVyLm5vb3AsXCJkYXRhXCI6ZGF0YX0pKSAhPSBudWxsID8gc3RhY2sxIDogXCJcIilcbiAgICArIFwiXVxcblwiXG4gICAgKyAoKHN0YWNrMSA9IGhlbHBlcnNbXCJpZlwiXS5jYWxsKGFsaWFzMSwoZGVwdGgwICE9IG51bGwgPyBkZXB0aDAudmFsaWRhdG9yVXJsIDogZGVwdGgwKSx7XCJuYW1lXCI6XCJpZlwiLFwiaGFzaFwiOnt9LFwiZm5cIjpjb250YWluZXIucHJvZ3JhbSgxNiwgZGF0YSwgMCksXCJpbnZlcnNlXCI6Y29udGFpbmVyLm5vb3AsXCJkYXRhXCI6ZGF0YX0pKSAhPSBudWxsID8gc3RhY2sxIDogXCJcIilcbiAgICArIFwiICAgIDwvaDQ+XFxuICAgIDwvZGl2PlxcbjwvZGl2PlxcblwiO1xufSxcInVzZURhdGFcIjp0cnVlfSk7XG50ZW1wbGF0ZXNbJ29hdXRoMiddID0gdGVtcGxhdGUoe1wiMVwiOmZ1bmN0aW9uKGNvbnRhaW5lcixkZXB0aDAsaGVscGVycyxwYXJ0aWFscyxkYXRhKSB7XG4gICAgdmFyIHN0YWNrMTtcblxuICByZXR1cm4gXCI8cD5BdXRob3JpemF0aW9uIFVSTDogXCJcbiAgICArICgoc3RhY2sxID0gKGhlbHBlcnMuc2FuaXRpemUgfHwgKGRlcHRoMCAmJiBkZXB0aDAuc2FuaXRpemUpIHx8IGhlbHBlcnMuaGVscGVyTWlzc2luZykuY2FsbChkZXB0aDAgIT0gbnVsbCA/IGRlcHRoMCA6IHt9LChkZXB0aDAgIT0gbnVsbCA/IGRlcHRoMC5hdXRob3JpemF0aW9uVXJsIDogZGVwdGgwKSx7XCJuYW1lXCI6XCJzYW5pdGl6ZVwiLFwiaGFzaFwiOnt9LFwiZGF0YVwiOmRhdGF9KSkgIT0gbnVsbCA/IHN0YWNrMSA6IFwiXCIpXG4gICAgKyBcIjwvcD5cIjtcbn0sXCIzXCI6ZnVuY3Rpb24oY29udGFpbmVyLGRlcHRoMCxoZWxwZXJzLHBhcnRpYWxzLGRhdGEpIHtcbiAgICB2YXIgc3RhY2sxO1xuXG4gIHJldHVybiBcIjxwPlRva2VuIFVSTDogXCJcbiAgICArICgoc3RhY2sxID0gKGhlbHBlcnMuc2FuaXRpemUgfHwgKGRlcHRoMCAmJiBkZXB0aDAuc2FuaXRpemUpIHx8IGhlbHBlcnMuaGVscGVyTWlzc2luZykuY2FsbChkZXB0aDAgIT0gbnVsbCA/IGRlcHRoMCA6IHt9LChkZXB0aDAgIT0gbnVsbCA/IGRlcHRoMC50b2tlblVybCA6IGRlcHRoMCkse1wibmFtZVwiOlwic2FuaXRpemVcIixcImhhc2hcIjp7fSxcImRhdGFcIjpkYXRhfSkpICE9IG51bGwgPyBzdGFjazEgOiBcIlwiKVxuICAgICsgXCI8L3A+XCI7XG59LFwiNVwiOmZ1bmN0aW9uKGNvbnRhaW5lcixkZXB0aDAsaGVscGVycyxwYXJ0aWFscyxkYXRhKSB7XG4gICAgcmV0dXJuIFwiICAgICAgICA8cD5QbGVhc2UgaW5wdXQgdXNlcm5hbWUgYW5kIHBhc3N3b3JkIGZvciBwYXNzd29yZCBmbG93IGF1dGhvcml6YXRpb248L3A+XFxuICAgICAgICA8ZmllbGRzZXQ+XFxuICAgICAgICAgICAgPGRpdj48bGFiZWw+VXNlcm5hbWU6IDxpbnB1dCBjbGFzcz1cXFwib2F1dGgtdXNlcm5hbWVcXFwiIHR5cGU9XFxcInRleHRcXFwiIG5hbWU9XFxcInVzZXJuYW1lXFxcIj48L2xhYmVsPjwvZGl2PlxcbiAgICAgICAgICAgIDxkaXY+PGxhYmVsPlBhc3N3b3JkOiA8aW5wdXQgY2xhc3M9XFxcIm9hdXRoLXBhc3N3b3JkXFxcIiB0eXBlPVxcXCJwYXNzd29yZFxcXCIgbmFtZT1cXFwicGFzc3dvcmRcXFwiPjwvbGFiZWw+PC9kaXY+XFxuICAgICAgICA8L2ZpZWxkc2V0PlxcblwiO1xufSxcIjdcIjpmdW5jdGlvbihjb250YWluZXIsZGVwdGgwLGhlbHBlcnMscGFydGlhbHMsZGF0YSkge1xuICAgIHZhciBzdGFjazE7XG5cbiAgcmV0dXJuIFwiICAgICAgICA8cD5TZXR1cCBjbGllbnQgYXV0aGVudGljYXRpb24uXCJcbiAgICArICgoc3RhY2sxID0gaGVscGVyc1tcImlmXCJdLmNhbGwoZGVwdGgwICE9IG51bGwgPyBkZXB0aDAgOiB7fSwoZGVwdGgwICE9IG51bGwgPyBkZXB0aDAucmVxdWlyZUNsaWVudEF1dGhlbnRpY2FpdG9uIDogZGVwdGgwKSx7XCJuYW1lXCI6XCJpZlwiLFwiaGFzaFwiOnt9LFwiZm5cIjpjb250YWluZXIucHJvZ3JhbSg4LCBkYXRhLCAwKSxcImludmVyc2VcIjpjb250YWluZXIubm9vcCxcImRhdGFcIjpkYXRhfSkpICE9IG51bGwgPyBzdGFjazEgOiBcIlwiKVxuICAgICsgXCI8L3A+XFxuICAgICAgICA8ZmllbGRzZXQ+XFxuICAgICAgICAgICAgPGRpdj48bGFiZWw+VHlwZTpcXG4gICAgICAgICAgICAgICAgPHNlbGVjdCBjbGFzcz1cXFwib2F1dGgtY2xpZW50LWF1dGhlbnRpY2F0aW9uLXR5cGVcXFwiIG5hbWU9XFxcImNsaWVudC1hdXRoZW50aWNhdGlvbi10eXBlXFxcIj5cXG4gICAgICAgICAgICAgICAgICAgIDxvcHRpb24gdmFsdWU9XFxcIm5vbmVcXFwiIHNlbGVjdGVkPk5vbmUgb3Igb3RoZXI8L29wdGlvbj5cXG4gICAgICAgICAgICAgICAgICAgIDxvcHRpb24gdmFsdWU9XFxcImJhc2ljXFxcIj5CYXNpYyBhdXRoPC9vcHRpb24+XFxuICAgICAgICAgICAgICAgICAgICA8b3B0aW9uIHZhbHVlPVxcXCJyZXF1ZXN0LWJvZHlcXFwiPlJlcXVlc3QgYm9keTwvb3B0aW9uPlxcbiAgICAgICAgICAgICAgICA8L3NlbGVjdD5cXG4gICAgICAgICAgICA8L2xhYmVsPjwvZGl2PlxcbiAgICAgICAgICAgIDxkaXYgY2xhc3M9XFxcIm9hdXRoLWNsaWVudC1hdXRoZW50aWNhdGlvblxcXCIgaGlkZGVuPlxcbiAgICAgICAgICAgICAgICA8ZGl2PjxsYWJlbD5DbGllbnRJZDogPGlucHV0IGNsYXNzPVxcXCJvYXV0aC1jbGllbnQtaWRcXFwiIHR5cGU9XFxcInRleHRcXFwiIG5hbWU9XFxcImNsaWVudC1pZFxcXCI+PC9sYWJlbD48L2Rpdj5cXG4gICAgICAgICAgICAgICAgPGRpdj48bGFiZWw+U2VjcmV0OiA8aW5wdXQgY2xhc3M9XFxcIm9hdXRoLWNsaWVudC1zZWNyZXRcXFwiIHR5cGU9XFxcInRleHRcXFwiIG5hbWU9XFxcImNsaWVudC1zZWNyZXRcXFwiPjwvbGFiZWw+PC9kaXY+XFxuICAgICAgICAgICAgPC9kaXY+XFxuICAgICAgICA8L2ZpZWxkc2V0PlxcblwiO1xufSxcIjhcIjpmdW5jdGlvbihjb250YWluZXIsZGVwdGgwLGhlbHBlcnMscGFydGlhbHMsZGF0YSkge1xuICAgIHJldHVybiBcIihSZXF1aXJlZClcIjtcbn0sXCIxMFwiOmZ1bmN0aW9uKGNvbnRhaW5lcixkZXB0aDAsaGVscGVycyxwYXJ0aWFscyxkYXRhKSB7XG4gICAgdmFyIHN0YWNrMSwgYWxpYXMxPWRlcHRoMCAhPSBudWxsID8gZGVwdGgwIDoge30sIGFsaWFzMj1oZWxwZXJzLmhlbHBlck1pc3Npbmc7XG5cbiAgcmV0dXJuIFwiICAgICAgICAgICAgPGxpPlxcbiAgICAgICAgICAgICAgICA8aW5wdXQgY2xhc3M9XFxcIm9hdXRoLXNjb3BlXFxcIiB0eXBlPVxcXCJjaGVja2JveFxcXCIgZGF0YS1zY29wZT1cXFwiXCJcbiAgICArICgoc3RhY2sxID0gKGhlbHBlcnMuZXNjYXBlIHx8IChkZXB0aDAgJiYgZGVwdGgwLmVzY2FwZSkgfHwgYWxpYXMyKS5jYWxsKGFsaWFzMSwoZGVwdGgwICE9IG51bGwgPyBkZXB0aDAuc2NvcGUgOiBkZXB0aDApLHtcIm5hbWVcIjpcImVzY2FwZVwiLFwiaGFzaFwiOnt9LFwiZGF0YVwiOmRhdGF9KSkgIT0gbnVsbCA/IHN0YWNrMSA6IFwiXCIpXG4gICAgKyBcIlxcXCIgb2F1dGh0eXBlPVxcXCJcIlxuICAgICsgKChzdGFjazEgPSAoaGVscGVycy5lc2NhcGUgfHwgKGRlcHRoMCAmJiBkZXB0aDAuZXNjYXBlKSB8fCBhbGlhczIpLmNhbGwoYWxpYXMxLChkZXB0aDAgIT0gbnVsbCA/IGRlcHRoMC5PQXV0aFNjaGVtZUtleSA6IGRlcHRoMCkse1wibmFtZVwiOlwiZXNjYXBlXCIsXCJoYXNoXCI6e30sXCJkYXRhXCI6ZGF0YX0pKSAhPSBudWxsID8gc3RhY2sxIDogXCJcIilcbiAgICArIFwiXFxcIi8+XFxuICAgICAgICAgICAgICAgIDxsYWJlbD5cIlxuICAgICsgKChzdGFjazEgPSAoaGVscGVycy5lc2NhcGUgfHwgKGRlcHRoMCAmJiBkZXB0aDAuZXNjYXBlKSB8fCBhbGlhczIpLmNhbGwoYWxpYXMxLChkZXB0aDAgIT0gbnVsbCA/IGRlcHRoMC5zY29wZSA6IGRlcHRoMCkse1wibmFtZVwiOlwiZXNjYXBlXCIsXCJoYXNoXCI6e30sXCJkYXRhXCI6ZGF0YX0pKSAhPSBudWxsID8gc3RhY2sxIDogXCJcIilcbiAgICArIFwiPC9sYWJlbD48YnIvPlxcbiAgICAgICAgICAgICAgICA8c3BhbiBjbGFzcz1cXFwiYXBpLXNjb3BlLWRlc2NcXFwiPlwiXG4gICAgKyAoKHN0YWNrMSA9IChoZWxwZXJzLmVzY2FwZSB8fCAoZGVwdGgwICYmIGRlcHRoMC5lc2NhcGUpIHx8IGFsaWFzMikuY2FsbChhbGlhczEsKGRlcHRoMCAhPSBudWxsID8gZGVwdGgwLmRlc2NyaXB0aW9uIDogZGVwdGgwKSx7XCJuYW1lXCI6XCJlc2NhcGVcIixcImhhc2hcIjp7fSxcImRhdGFcIjpkYXRhfSkpICE9IG51bGwgPyBzdGFjazEgOiBcIlwiKVxuICAgICsgXCJcXG5cIlxuICAgICsgKChzdGFjazEgPSBoZWxwZXJzW1wiaWZcIl0uY2FsbChhbGlhczEsKGRlcHRoMCAhPSBudWxsID8gZGVwdGgwLk9BdXRoU2NoZW1lS2V5IDogZGVwdGgwKSx7XCJuYW1lXCI6XCJpZlwiLFwiaGFzaFwiOnt9LFwiZm5cIjpjb250YWluZXIucHJvZ3JhbSgxMSwgZGF0YSwgMCksXCJpbnZlcnNlXCI6Y29udGFpbmVyLm5vb3AsXCJkYXRhXCI6ZGF0YX0pKSAhPSBudWxsID8gc3RhY2sxIDogXCJcIilcbiAgICArIFwiICAgICAgICAgICAgICAgIDwvc3Bhbj5cXG4gICAgICAgICAgICA8L2xpPlxcblwiO1xufSxcIjExXCI6ZnVuY3Rpb24oY29udGFpbmVyLGRlcHRoMCxoZWxwZXJzLHBhcnRpYWxzLGRhdGEpIHtcbiAgICB2YXIgc3RhY2sxO1xuXG4gIHJldHVybiBcIiAgICAgICAgICAgICAgICAgICAgICAgIChcIlxuICAgICsgKChzdGFjazEgPSAoaGVscGVycy5lc2NhcGUgfHwgKGRlcHRoMCAmJiBkZXB0aDAuZXNjYXBlKSB8fCBoZWxwZXJzLmhlbHBlck1pc3NpbmcpLmNhbGwoZGVwdGgwICE9IG51bGwgPyBkZXB0aDAgOiB7fSwoZGVwdGgwICE9IG51bGwgPyBkZXB0aDAuT0F1dGhTY2hlbWVLZXkgOiBkZXB0aDApLHtcIm5hbWVcIjpcImVzY2FwZVwiLFwiaGFzaFwiOnt9LFwiZGF0YVwiOmRhdGF9KSkgIT0gbnVsbCA/IHN0YWNrMSA6IFwiXCIpXG4gICAgKyBcIilcXG5cIjtcbn0sXCJjb21waWxlclwiOls3LFwiPj0gNC4wLjBcIl0sXCJtYWluXCI6ZnVuY3Rpb24oY29udGFpbmVyLGRlcHRoMCxoZWxwZXJzLHBhcnRpYWxzLGRhdGEpIHtcbiAgICB2YXIgc3RhY2sxLCBhbGlhczE9ZGVwdGgwICE9IG51bGwgPyBkZXB0aDAgOiB7fSwgYWxpYXMyPWhlbHBlcnMuaGVscGVyTWlzc2luZztcblxuICByZXR1cm4gXCI8ZGl2PlxcbiAgICA8aDMgY2xhc3M9XFxcImF1dGhfX3RpdGxlXFxcIj5PQXV0aDIuMDwvaDM+XFxuICAgIDxwPlwiXG4gICAgKyAoKHN0YWNrMSA9IChoZWxwZXJzLnNhbml0aXplIHx8IChkZXB0aDAgJiYgZGVwdGgwLnNhbml0aXplKSB8fCBhbGlhczIpLmNhbGwoYWxpYXMxLChkZXB0aDAgIT0gbnVsbCA/IGRlcHRoMC5kZXNjcmlwdGlvbiA6IGRlcHRoMCkse1wibmFtZVwiOlwic2FuaXRpemVcIixcImhhc2hcIjp7fSxcImRhdGFcIjpkYXRhfSkpICE9IG51bGwgPyBzdGFjazEgOiBcIlwiKVxuICAgICsgXCI8L3A+XFxuICAgIFwiXG4gICAgKyAoKHN0YWNrMSA9IGhlbHBlcnNbXCJpZlwiXS5jYWxsKGFsaWFzMSwoZGVwdGgwICE9IG51bGwgPyBkZXB0aDAuYXV0aG9yaXphdGlvblVybCA6IGRlcHRoMCkse1wibmFtZVwiOlwiaWZcIixcImhhc2hcIjp7fSxcImZuXCI6Y29udGFpbmVyLnByb2dyYW0oMSwgZGF0YSwgMCksXCJpbnZlcnNlXCI6Y29udGFpbmVyLm5vb3AsXCJkYXRhXCI6ZGF0YX0pKSAhPSBudWxsID8gc3RhY2sxIDogXCJcIilcbiAgICArIFwiXFxuICAgIFwiXG4gICAgKyAoKHN0YWNrMSA9IGhlbHBlcnNbXCJpZlwiXS5jYWxsKGFsaWFzMSwoZGVwdGgwICE9IG51bGwgPyBkZXB0aDAudG9rZW5VcmwgOiBkZXB0aDApLHtcIm5hbWVcIjpcImlmXCIsXCJoYXNoXCI6e30sXCJmblwiOmNvbnRhaW5lci5wcm9ncmFtKDMsIGRhdGEsIDApLFwiaW52ZXJzZVwiOmNvbnRhaW5lci5ub29wLFwiZGF0YVwiOmRhdGF9KSkgIT0gbnVsbCA/IHN0YWNrMSA6IFwiXCIpXG4gICAgKyBcIlxcbiAgICA8cD5mbG93OiBcIlxuICAgICsgKChzdGFjazEgPSAoaGVscGVycy5lc2NhcGUgfHwgKGRlcHRoMCAmJiBkZXB0aDAuZXNjYXBlKSB8fCBhbGlhczIpLmNhbGwoYWxpYXMxLChkZXB0aDAgIT0gbnVsbCA/IGRlcHRoMC5mbG93IDogZGVwdGgwKSx7XCJuYW1lXCI6XCJlc2NhcGVcIixcImhhc2hcIjp7fSxcImRhdGFcIjpkYXRhfSkpICE9IG51bGwgPyBzdGFjazEgOiBcIlwiKVxuICAgICsgXCI8L3A+XFxuXCJcbiAgICArICgoc3RhY2sxID0gaGVscGVyc1tcImlmXCJdLmNhbGwoYWxpYXMxLChkZXB0aDAgIT0gbnVsbCA/IGRlcHRoMC5pc1Bhc3N3b3JkRmxvdyA6IGRlcHRoMCkse1wibmFtZVwiOlwiaWZcIixcImhhc2hcIjp7fSxcImZuXCI6Y29udGFpbmVyLnByb2dyYW0oNSwgZGF0YSwgMCksXCJpbnZlcnNlXCI6Y29udGFpbmVyLm5vb3AsXCJkYXRhXCI6ZGF0YX0pKSAhPSBudWxsID8gc3RhY2sxIDogXCJcIilcbiAgICArICgoc3RhY2sxID0gaGVscGVyc1tcImlmXCJdLmNhbGwoYWxpYXMxLChkZXB0aDAgIT0gbnVsbCA/IGRlcHRoMC5jbGllbnRBdXRoZW50aWNhdGlvbiA6IGRlcHRoMCkse1wibmFtZVwiOlwiaWZcIixcImhhc2hcIjp7fSxcImZuXCI6Y29udGFpbmVyLnByb2dyYW0oNywgZGF0YSwgMCksXCJpbnZlcnNlXCI6Y29udGFpbmVyLm5vb3AsXCJkYXRhXCI6ZGF0YX0pKSAhPSBudWxsID8gc3RhY2sxIDogXCJcIilcbiAgICArIFwiICAgIDxwPjxzdHJvbmc+IFwiXG4gICAgKyAoKHN0YWNrMSA9IChoZWxwZXJzLmVzY2FwZSB8fCAoZGVwdGgwICYmIGRlcHRoMC5lc2NhcGUpIHx8IGFsaWFzMikuY2FsbChhbGlhczEsKGRlcHRoMCAhPSBudWxsID8gZGVwdGgwLmFwcE5hbWUgOiBkZXB0aDApLHtcIm5hbWVcIjpcImVzY2FwZVwiLFwiaGFzaFwiOnt9LFwiZGF0YVwiOmRhdGF9KSkgIT0gbnVsbCA/IHN0YWNrMSA6IFwiXCIpXG4gICAgKyBcIiA8L3N0cm9uZz4gQVBJIHJlcXVpcmVzIHRoZSBmb2xsb3dpbmcgc2NvcGVzLiBTZWxlY3Qgd2hpY2ggb25lcyB5b3Ugd2FudCB0byBncmFudCB0byBTd2FnZ2VyIFVJLjwvcD5cXG4gICAgPHA+U2NvcGVzIGFyZSB1c2VkIHRvIGdyYW50IGFuIGFwcGxpY2F0aW9uIGRpZmZlcmVudCBsZXZlbHMgb2YgYWNjZXNzIHRvIGRhdGEgb24gYmVoYWxmIG9mIHRoZSBlbmQgdXNlci4gRWFjaCBBUEkgbWF5IGRlY2xhcmUgb25lIG9yIG1vcmUgc2NvcGVzLlxcbiAgICAgICAgPGEgaHJlZj1cXFwiI1xcXCI+TGVhcm4gaG93IHRvIHVzZTwvYT5cXG4gICAgPC9wPlxcbiAgICA8dWwgY2xhc3M9XFxcImFwaS1wb3B1cC1zY29wZXNcXFwiPlxcblwiXG4gICAgKyAoKHN0YWNrMSA9IGhlbHBlcnMuZWFjaC5jYWxsKGFsaWFzMSwoZGVwdGgwICE9IG51bGwgPyBkZXB0aDAuc2NvcGVzIDogZGVwdGgwKSx7XCJuYW1lXCI6XCJlYWNoXCIsXCJoYXNoXCI6e30sXCJmblwiOmNvbnRhaW5lci5wcm9ncmFtKDEwLCBkYXRhLCAwKSxcImludmVyc2VcIjpjb250YWluZXIubm9vcCxcImRhdGFcIjpkYXRhfSkpICE9IG51bGwgPyBzdGFjazEgOiBcIlwiKVxuICAgICsgXCIgICAgPC91bD5cXG48L2Rpdj5cIjtcbn0sXCJ1c2VEYXRhXCI6dHJ1ZX0pO1xudGVtcGxhdGVzWydvcGVyYXRpb24nXSA9IHRlbXBsYXRlKHtcIjFcIjpmdW5jdGlvbihjb250YWluZXIsZGVwdGgwLGhlbHBlcnMscGFydGlhbHMsZGF0YSkge1xuICAgIHJldHVybiBcImRlcHJlY2F0ZWRcIjtcbn0sXCIzXCI6ZnVuY3Rpb24oY29udGFpbmVyLGRlcHRoMCxoZWxwZXJzLHBhcnRpYWxzLGRhdGEpIHtcbiAgICByZXR1cm4gXCIgICAgICAgICAgICA8aDQ+PHNwYW4gZGF0YS1zdy10cmFuc2xhdGU+V2FybmluZzogRGVwcmVjYXRlZDwvc3Bhbj48L2g0PlxcblwiO1xufSxcIjVcIjpmdW5jdGlvbihjb250YWluZXIsZGVwdGgwLGhlbHBlcnMscGFydGlhbHMsZGF0YSkge1xuICAgIHZhciBzdGFjazE7XG5cbiAgcmV0dXJuIFwiICAgICAgICA8aDQ+PHNwYW4gZGF0YS1zdy10cmFuc2xhdGU+SW1wbGVtZW50YXRpb24gTm90ZXM8L3NwYW4+PC9oND5cXG4gICAgICAgIDxkaXYgY2xhc3M9XFxcIm1hcmtkb3duXFxcIj5cIlxuICAgICsgKChzdGFjazEgPSAoaGVscGVycy5zYW5pdGl6ZSB8fCAoZGVwdGgwICYmIGRlcHRoMC5zYW5pdGl6ZSkgfHwgaGVscGVycy5oZWxwZXJNaXNzaW5nKS5jYWxsKGRlcHRoMCAhPSBudWxsID8gZGVwdGgwIDoge30sKGRlcHRoMCAhPSBudWxsID8gZGVwdGgwLmRlc2NyaXB0aW9uIDogZGVwdGgwKSx7XCJuYW1lXCI6XCJzYW5pdGl6ZVwiLFwiaGFzaFwiOnt9LFwiZGF0YVwiOmRhdGF9KSkgIT0gbnVsbCA/IHN0YWNrMSA6IFwiXCIpXG4gICAgKyBcIjwvZGl2PlxcblwiO1xufSxcIjdcIjpmdW5jdGlvbihjb250YWluZXIsZGVwdGgwLGhlbHBlcnMscGFydGlhbHMsZGF0YSkge1xuICAgIHJldHVybiBcIiAgICAgICAgICAgIDxkaXYgY2xhc3M9J2F1dGhvcml6ZS13cmFwcGVyIGF1dGhvcml6ZS13cmFwcGVyX29wZXJhdGlvbic+PC9kaXY+XFxuXCI7XG59LFwiOVwiOmZ1bmN0aW9uKGNvbnRhaW5lcixkZXB0aDAsaGVscGVycyxwYXJ0aWFscyxkYXRhKSB7XG4gICAgdmFyIHN0YWNrMSwgYWxpYXMxPWRlcHRoMCAhPSBudWxsID8gZGVwdGgwIDoge307XG5cbiAgcmV0dXJuIFwiICAgICAgICAgIDxkaXYgY2xhc3M9XFxcInJlc3BvbnNlLWNsYXNzXFxcIj5cXG4gICAgICAgICAgICA8aDQ+PHNwYW4gZGF0YS1zdy10cmFuc2xhdGU+UmVzcG9uc2UgQ2xhc3M8L3NwYW4+ICg8c3BhbiBkYXRhLXN3LXRyYW5zbGF0ZT5TdGF0dXM8L3NwYW4+IFwiXG4gICAgKyAoKHN0YWNrMSA9IChoZWxwZXJzLmVzY2FwZSB8fCAoZGVwdGgwICYmIGRlcHRoMC5lc2NhcGUpIHx8IGhlbHBlcnMuaGVscGVyTWlzc2luZykuY2FsbChhbGlhczEsKGRlcHRoMCAhPSBudWxsID8gZGVwdGgwLnN1Y2Nlc3NDb2RlIDogZGVwdGgwKSx7XCJuYW1lXCI6XCJlc2NhcGVcIixcImhhc2hcIjp7fSxcImRhdGFcIjpkYXRhfSkpICE9IG51bGwgPyBzdGFjazEgOiBcIlwiKVxuICAgICsgXCIpPC9oND5cXG4gICAgICAgICAgICAgIFwiXG4gICAgKyAoKHN0YWNrMSA9IGhlbHBlcnNbXCJpZlwiXS5jYWxsKGFsaWFzMSwoZGVwdGgwICE9IG51bGwgPyBkZXB0aDAuc3VjY2Vzc0Rlc2NyaXB0aW9uIDogZGVwdGgwKSx7XCJuYW1lXCI6XCJpZlwiLFwiaGFzaFwiOnt9LFwiZm5cIjpjb250YWluZXIucHJvZ3JhbSgxMCwgZGF0YSwgMCksXCJpbnZlcnNlXCI6Y29udGFpbmVyLm5vb3AsXCJkYXRhXCI6ZGF0YX0pKSAhPSBudWxsID8gc3RhY2sxIDogXCJcIilcbiAgICArIFwiXFxuICAgICAgICAgICAgPHA+PHNwYW4gY2xhc3M9XFxcIm1vZGVsLXNpZ25hdHVyZVxcXCIgLz48L3A+XFxuICAgICAgICAgICAgPGJyLz5cXG4gICAgICAgICAgICA8ZGl2IGNsYXNzPVxcXCJyZXNwb25zZS1jb250ZW50LXR5cGVcXFwiIC8+XFxuICAgICAgICAgICAgPC9kaXY+XFxuXCI7XG59LFwiMTBcIjpmdW5jdGlvbihjb250YWluZXIsZGVwdGgwLGhlbHBlcnMscGFydGlhbHMsZGF0YSkge1xuICAgIHZhciBzdGFjazE7XG5cbiAgcmV0dXJuIFwiPGRpdiBjbGFzcz1cXFwibWFya2Rvd25cXFwiPlwiXG4gICAgKyAoKHN0YWNrMSA9IChoZWxwZXJzLnNhbml0aXplIHx8IChkZXB0aDAgJiYgZGVwdGgwLnNhbml0aXplKSB8fCBoZWxwZXJzLmhlbHBlck1pc3NpbmcpLmNhbGwoZGVwdGgwICE9IG51bGwgPyBkZXB0aDAgOiB7fSwoZGVwdGgwICE9IG51bGwgPyBkZXB0aDAuc3VjY2Vzc0Rlc2NyaXB0aW9uIDogZGVwdGgwKSx7XCJuYW1lXCI6XCJzYW5pdGl6ZVwiLFwiaGFzaFwiOnt9LFwiZGF0YVwiOmRhdGF9KSkgIT0gbnVsbCA/IHN0YWNrMSA6IFwiXCIpXG4gICAgKyBcIjwvZGl2PlwiO1xufSxcIjEyXCI6ZnVuY3Rpb24oY29udGFpbmVyLGRlcHRoMCxoZWxwZXJzLHBhcnRpYWxzLGRhdGEpIHtcbiAgICB2YXIgc3RhY2sxO1xuXG4gIHJldHVybiBcIiAgICAgICAgICA8aDQgZGF0YS1zdy10cmFuc2xhdGU+SGVhZGVyczwvaDQ+XFxuICAgICAgICAgIDx0YWJsZSBjbGFzcz1cXFwiaGVhZGVyc1xcXCI+XFxuICAgICAgICAgICAgPHRoZWFkPlxcbiAgICAgICAgICAgICAgPHRyPlxcbiAgICAgICAgICAgICAgICA8dGggc3R5bGU9XFxcIndpZHRoOiAxMDBweDsgbWF4LXdpZHRoOiAxMDBweFxcXCIgZGF0YS1zdy10cmFuc2xhdGU+SGVhZGVyPC90aD5cXG4gICAgICAgICAgICAgICAgPHRoIHN0eWxlPVxcXCJ3aWR0aDogMzEwcHg7IG1heC13aWR0aDogMzEwcHhcXFwiIGRhdGEtc3ctdHJhbnNsYXRlPkRlc2NyaXB0aW9uPC90aD5cXG4gICAgICAgICAgICAgICAgPHRoIHN0eWxlPVxcXCJ3aWR0aDogMjAwcHg7IG1heC13aWR0aDogMjAwcHhcXFwiIGRhdGEtc3ctdHJhbnNsYXRlPlR5cGU8L3RoPlxcbiAgICAgICAgICAgICAgICA8dGggc3R5bGU9XFxcIndpZHRoOiAzMjBweDsgbWF4LXdpZHRoOiAzMjBweFxcXCIgZGF0YS1zdy10cmFuc2xhdGU+T3RoZXI8L3RoPlxcbiAgICAgICAgICAgICAgPC90cj5cXG4gICAgICAgICAgICA8L3RoZWFkPlxcbiAgICAgICAgICAgIDx0Ym9keT5cXG5cIlxuICAgICsgKChzdGFjazEgPSBoZWxwZXJzLmVhY2guY2FsbChkZXB0aDAgIT0gbnVsbCA/IGRlcHRoMCA6IHt9LChkZXB0aDAgIT0gbnVsbCA/IGRlcHRoMC5oZWFkZXJzIDogZGVwdGgwKSx7XCJuYW1lXCI6XCJlYWNoXCIsXCJoYXNoXCI6e30sXCJmblwiOmNvbnRhaW5lci5wcm9ncmFtKDEzLCBkYXRhLCAwKSxcImludmVyc2VcIjpjb250YWluZXIubm9vcCxcImRhdGFcIjpkYXRhfSkpICE9IG51bGwgPyBzdGFjazEgOiBcIlwiKVxuICAgICsgXCIgICAgICAgICAgICA8L3Rib2R5PlxcbiAgICAgICAgICA8L3RhYmxlPlxcblwiO1xufSxcIjEzXCI6ZnVuY3Rpb24oY29udGFpbmVyLGRlcHRoMCxoZWxwZXJzLHBhcnRpYWxzLGRhdGEpIHtcbiAgICB2YXIgc3RhY2sxLCBoZWxwZXIsIGFsaWFzMT1kZXB0aDAgIT0gbnVsbCA/IGRlcHRoMCA6IHt9LCBhbGlhczI9aGVscGVycy5oZWxwZXJNaXNzaW5nO1xuXG4gIHJldHVybiBcIiAgICAgICAgICAgICAgPHRyPlxcbiAgICAgICAgICAgICAgICA8dGQ+XCJcbiAgICArIGNvbnRhaW5lci5lc2NhcGVFeHByZXNzaW9uKCgoaGVscGVyID0gKGhlbHBlciA9IGhlbHBlcnMua2V5IHx8IChkYXRhICYmIGRhdGEua2V5KSkgIT0gbnVsbCA/IGhlbHBlciA6IGFsaWFzMiksKHR5cGVvZiBoZWxwZXIgPT09IFwiZnVuY3Rpb25cIiA/IGhlbHBlci5jYWxsKGFsaWFzMSx7XCJuYW1lXCI6XCJrZXlcIixcImhhc2hcIjp7fSxcImRhdGFcIjpkYXRhfSkgOiBoZWxwZXIpKSlcbiAgICArIFwiPC90ZD5cXG4gICAgICAgICAgICAgICAgPHRkPlwiXG4gICAgKyAoKHN0YWNrMSA9IChoZWxwZXJzLnNhbml0aXplIHx8IChkZXB0aDAgJiYgZGVwdGgwLnNhbml0aXplKSB8fCBhbGlhczIpLmNhbGwoYWxpYXMxLChkZXB0aDAgIT0gbnVsbCA/IGRlcHRoMC5kZXNjcmlwdGlvbiA6IGRlcHRoMCkse1wibmFtZVwiOlwic2FuaXRpemVcIixcImhhc2hcIjp7fSxcImRhdGFcIjpkYXRhfSkpICE9IG51bGwgPyBzdGFjazEgOiBcIlwiKVxuICAgICsgXCI8L3RkPlxcbiAgICAgICAgICAgICAgICA8dGQ+XCJcbiAgICArICgoc3RhY2sxID0gKGhlbHBlcnMuZXNjYXBlIHx8IChkZXB0aDAgJiYgZGVwdGgwLmVzY2FwZSkgfHwgYWxpYXMyKS5jYWxsKGFsaWFzMSwoZGVwdGgwICE9IG51bGwgPyBkZXB0aDAudHlwZSA6IGRlcHRoMCkse1wibmFtZVwiOlwiZXNjYXBlXCIsXCJoYXNoXCI6e30sXCJkYXRhXCI6ZGF0YX0pKSAhPSBudWxsID8gc3RhY2sxIDogXCJcIilcbiAgICArIFwiPC90ZD5cXG4gICAgICAgICAgICAgICAgPHRkPlwiXG4gICAgKyAoKHN0YWNrMSA9IChoZWxwZXJzLmVzY2FwZSB8fCAoZGVwdGgwICYmIGRlcHRoMC5lc2NhcGUpIHx8IGFsaWFzMikuY2FsbChhbGlhczEsKGRlcHRoMCAhPSBudWxsID8gZGVwdGgwLm90aGVyIDogZGVwdGgwKSx7XCJuYW1lXCI6XCJlc2NhcGVcIixcImhhc2hcIjp7fSxcImRhdGFcIjpkYXRhfSkpICE9IG51bGwgPyBzdGFjazEgOiBcIlwiKVxuICAgICsgXCI8L3RkPlxcbiAgICAgICAgICAgICAgPC90cj5cXG5cIjtcbn0sXCIxNVwiOmZ1bmN0aW9uKGNvbnRhaW5lcixkZXB0aDAsaGVscGVycyxwYXJ0aWFscyxkYXRhKSB7XG4gICAgcmV0dXJuIFwiICAgICAgICAgIDxoNCBkYXRhLXN3LXRyYW5zbGF0ZT5QYXJhbWV0ZXJzPC9oND5cXG4gICAgICAgICAgPHRhYmxlIGNsYXNzPSdmdWxsd2lkdGggcGFyYW1ldGVycyc+XFxuICAgICAgICAgIDx0aGVhZD5cXG4gICAgICAgICAgICA8dHI+XFxuICAgICAgICAgICAgPHRoIHN0eWxlPVxcXCJ3aWR0aDogMTAwcHg7IG1heC13aWR0aDogMTAwcHhcXFwiIGRhdGEtc3ctdHJhbnNsYXRlPlBhcmFtZXRlcjwvdGg+XFxuICAgICAgICAgICAgPHRoIHN0eWxlPVxcXCJ3aWR0aDogMzEwcHg7IG1heC13aWR0aDogMzEwcHhcXFwiIGRhdGEtc3ctdHJhbnNsYXRlPlZhbHVlPC90aD5cXG4gICAgICAgICAgICA8dGggc3R5bGU9XFxcIndpZHRoOiAyMDBweDsgbWF4LXdpZHRoOiAyMDBweFxcXCIgZGF0YS1zdy10cmFuc2xhdGU+RGVzY3JpcHRpb248L3RoPlxcbiAgICAgICAgICAgIDx0aCBzdHlsZT1cXFwid2lkdGg6IDEwMHB4OyBtYXgtd2lkdGg6IDEwMHB4XFxcIiBkYXRhLXN3LXRyYW5zbGF0ZT5QYXJhbWV0ZXIgVHlwZTwvdGg+XFxuICAgICAgICAgICAgPHRoIHN0eWxlPVxcXCJ3aWR0aDogMjIwcHg7IG1heC13aWR0aDogMjMwcHhcXFwiIGRhdGEtc3ctdHJhbnNsYXRlPkRhdGEgVHlwZTwvdGg+XFxuICAgICAgICAgICAgPC90cj5cXG4gICAgICAgICAgPC90aGVhZD5cXG4gICAgICAgICAgPHRib2R5IGNsYXNzPVxcXCJvcGVyYXRpb24tcGFyYW1zXFxcIj5cXG5cXG4gICAgICAgICAgPC90Ym9keT5cXG4gICAgICAgICAgPC90YWJsZT5cXG5cIjtcbn0sXCIxN1wiOmZ1bmN0aW9uKGNvbnRhaW5lcixkZXB0aDAsaGVscGVycyxwYXJ0aWFscyxkYXRhKSB7XG4gICAgcmV0dXJuIFwiICAgICAgICAgIDxkaXYgc3R5bGU9J21hcmdpbjowO3BhZGRpbmc6MDtkaXNwbGF5OmlubGluZSc+PC9kaXY+XFxuICAgICAgICAgIDxoNCBkYXRhLXN3LXRyYW5zbGF0ZT5SZXNwb25zZSBNZXNzYWdlczwvaDQ+XFxuICAgICAgICAgIDx0YWJsZSBjbGFzcz0nZnVsbHdpZHRoIHJlc3BvbnNlLW1lc3NhZ2VzJz5cXG4gICAgICAgICAgICA8dGhlYWQ+XFxuICAgICAgICAgICAgPHRyPlxcbiAgICAgICAgICAgICAgPHRoIGRhdGEtc3ctdHJhbnNsYXRlPkhUVFAgU3RhdHVzIENvZGU8L3RoPlxcbiAgICAgICAgICAgICAgPHRoIGRhdGEtc3ctdHJhbnNsYXRlPlJlYXNvbjwvdGg+XFxuICAgICAgICAgICAgICA8dGggZGF0YS1zdy10cmFuc2xhdGU+UmVzcG9uc2UgTW9kZWw8L3RoPlxcbiAgICAgICAgICAgICAgPHRoIGRhdGEtc3ctdHJhbnNsYXRlPkhlYWRlcnM8L3RoPlxcbiAgICAgICAgICAgIDwvdHI+XFxuICAgICAgICAgICAgPC90aGVhZD5cXG4gICAgICAgICAgICA8dGJvZHkgY2xhc3M9XFxcIm9wZXJhdGlvbi1zdGF0dXNcXFwiPlxcbiAgICAgICAgICAgIDwvdGJvZHk+XFxuICAgICAgICAgIDwvdGFibGU+XFxuXCI7XG59LFwiMTlcIjpmdW5jdGlvbihjb250YWluZXIsZGVwdGgwLGhlbHBlcnMscGFydGlhbHMsZGF0YSkge1xuICAgIHJldHVybiBcIlwiO1xufSxcIjIxXCI6ZnVuY3Rpb24oY29udGFpbmVyLGRlcHRoMCxoZWxwZXJzLHBhcnRpYWxzLGRhdGEpIHtcbiAgICByZXR1cm4gXCIgICAgICAgICAgPGRpdiBjbGFzcz0nc2FuZGJveF9oZWFkZXInPlxcbiAgICAgICAgICAgIDxpbnB1dCBjbGFzcz0nc3VibWl0JyB0eXBlPSdzdWJtaXQnIHZhbHVlPSdUcnkgaXQgb3V0IScgZGF0YS1zdy10cmFuc2xhdGUvPlxcbiAgICAgICAgICAgIDxhIGhyZWY9JyMnIGNsYXNzPSdyZXNwb25zZV9oaWRlcicgc3R5bGU9J2Rpc3BsYXk6bm9uZScgZGF0YS1zdy10cmFuc2xhdGU+SGlkZSBSZXNwb25zZTwvYT5cXG4gICAgICAgICAgICA8c3BhbiBjbGFzcz0ncmVzcG9uc2VfdGhyb2JiZXInIHN0eWxlPSdkaXNwbGF5Om5vbmUnPjwvc3Bhbj5cXG4gICAgICAgICAgPC9kaXY+XFxuXCI7XG59LFwiMjNcIjpmdW5jdGlvbihjb250YWluZXIsZGVwdGgwLGhlbHBlcnMscGFydGlhbHMsZGF0YSkge1xuICAgIHJldHVybiBcIiAgICAgICAgICA8aDQgZGF0YS1zdy10cmFuc2xhdGU+UmVxdWVzdCBIZWFkZXJzPC9oND5cXG4gICAgICAgICAgPGRpdiBjbGFzcz0nYmxvY2sgcmVxdWVzdF9oZWFkZXJzJz48L2Rpdj5cXG5cIjtcbn0sXCJjb21waWxlclwiOls3LFwiPj0gNC4wLjBcIl0sXCJtYWluXCI6ZnVuY3Rpb24oY29udGFpbmVyLGRlcHRoMCxoZWxwZXJzLHBhcnRpYWxzLGRhdGEpIHtcbiAgICB2YXIgc3RhY2sxLCBhbGlhczE9ZGVwdGgwICE9IG51bGwgPyBkZXB0aDAgOiB7fSwgYWxpYXMyPWhlbHBlcnMuaGVscGVyTWlzc2luZywgYWxpYXMzPWNvbnRhaW5lci5lc2NhcGVFeHByZXNzaW9uO1xuXG4gIHJldHVybiBcIiAgPHVsIGNsYXNzPSdvcGVyYXRpb25zJyA+XFxuICAgIDxsaSBjbGFzcz0nXCJcbiAgICArICgoc3RhY2sxID0gKGhlbHBlcnMuZXNjYXBlIHx8IChkZXB0aDAgJiYgZGVwdGgwLmVzY2FwZSkgfHwgYWxpYXMyKS5jYWxsKGFsaWFzMSwoZGVwdGgwICE9IG51bGwgPyBkZXB0aDAubWV0aG9kIDogZGVwdGgwKSx7XCJuYW1lXCI6XCJlc2NhcGVcIixcImhhc2hcIjp7fSxcImRhdGFcIjpkYXRhfSkpICE9IG51bGwgPyBzdGFjazEgOiBcIlwiKVxuICAgICsgXCIgb3BlcmF0aW9uJyBpZD0nXCJcbiAgICArICgoc3RhY2sxID0gKGhlbHBlcnMuZXNjYXBlIHx8IChkZXB0aDAgJiYgZGVwdGgwLmVzY2FwZSkgfHwgYWxpYXMyKS5jYWxsKGFsaWFzMSwoZGVwdGgwICE9IG51bGwgPyBkZXB0aDAucGFyZW50SWQgOiBkZXB0aDApLHtcIm5hbWVcIjpcImVzY2FwZVwiLFwiaGFzaFwiOnt9LFwiZGF0YVwiOmRhdGF9KSkgIT0gbnVsbCA/IHN0YWNrMSA6IFwiXCIpXG4gICAgKyBcIl9cIlxuICAgICsgKChzdGFjazEgPSAoaGVscGVycy5lc2NhcGUgfHwgKGRlcHRoMCAmJiBkZXB0aDAuZXNjYXBlKSB8fCBhbGlhczIpLmNhbGwoYWxpYXMxLChkZXB0aDAgIT0gbnVsbCA/IGRlcHRoMC5uaWNrbmFtZSA6IGRlcHRoMCkse1wibmFtZVwiOlwiZXNjYXBlXCIsXCJoYXNoXCI6e30sXCJkYXRhXCI6ZGF0YX0pKSAhPSBudWxsID8gc3RhY2sxIDogXCJcIilcbiAgICArIFwiJz5cXG4gICAgICA8ZGl2IGNsYXNzPSdoZWFkaW5nJz5cXG4gICAgICAgIDxoMz5cXG4gICAgICAgICAgPHNwYW4gY2xhc3M9J2h0dHBfbWV0aG9kJz5cXG4gICAgICAgICAgPGEgaHJlZj0nIyEvXCJcbiAgICArIGFsaWFzMygoaGVscGVycy5zYW5pdGl6ZSB8fCAoZGVwdGgwICYmIGRlcHRoMC5zYW5pdGl6ZSkgfHwgYWxpYXMyKS5jYWxsKGFsaWFzMSwoZGVwdGgwICE9IG51bGwgPyBkZXB0aDAuZW5jb2RlZFBhcmVudElkIDogZGVwdGgwKSx7XCJuYW1lXCI6XCJzYW5pdGl6ZVwiLFwiaGFzaFwiOnt9LFwiZGF0YVwiOmRhdGF9KSlcbiAgICArIFwiL1wiXG4gICAgKyBhbGlhczMoKGhlbHBlcnMuc2FuaXRpemUgfHwgKGRlcHRoMCAmJiBkZXB0aDAuc2FuaXRpemUpIHx8IGFsaWFzMikuY2FsbChhbGlhczEsKGRlcHRoMCAhPSBudWxsID8gZGVwdGgwLm5pY2tuYW1lIDogZGVwdGgwKSx7XCJuYW1lXCI6XCJzYW5pdGl6ZVwiLFwiaGFzaFwiOnt9LFwiZGF0YVwiOmRhdGF9KSlcbiAgICArIFwiJyBjbGFzcz1cXFwidG9nZ2xlT3BlcmF0aW9uXFxcIj5cIlxuICAgICsgKChzdGFjazEgPSAoaGVscGVycy5lc2NhcGUgfHwgKGRlcHRoMCAmJiBkZXB0aDAuZXNjYXBlKSB8fCBhbGlhczIpLmNhbGwoYWxpYXMxLChkZXB0aDAgIT0gbnVsbCA/IGRlcHRoMC5tZXRob2QgOiBkZXB0aDApLHtcIm5hbWVcIjpcImVzY2FwZVwiLFwiaGFzaFwiOnt9LFwiZGF0YVwiOmRhdGF9KSkgIT0gbnVsbCA/IHN0YWNrMSA6IFwiXCIpXG4gICAgKyBcIjwvYT5cXG4gICAgICAgICAgPC9zcGFuPlxcbiAgICAgICAgICA8c3BhbiBjbGFzcz0ncGF0aCc+XFxuICAgICAgICAgIDxhIGhyZWY9JyMhL1wiXG4gICAgKyBhbGlhczMoKGhlbHBlcnMuc2FuaXRpemUgfHwgKGRlcHRoMCAmJiBkZXB0aDAuc2FuaXRpemUpIHx8IGFsaWFzMikuY2FsbChhbGlhczEsKGRlcHRoMCAhPSBudWxsID8gZGVwdGgwLmVuY29kZWRQYXJlbnRJZCA6IGRlcHRoMCkse1wibmFtZVwiOlwic2FuaXRpemVcIixcImhhc2hcIjp7fSxcImRhdGFcIjpkYXRhfSkpXG4gICAgKyBcIi9cIlxuICAgICsgYWxpYXMzKChoZWxwZXJzLnNhbml0aXplIHx8IChkZXB0aDAgJiYgZGVwdGgwLnNhbml0aXplKSB8fCBhbGlhczIpLmNhbGwoYWxpYXMxLChkZXB0aDAgIT0gbnVsbCA/IGRlcHRoMC5uaWNrbmFtZSA6IGRlcHRoMCkse1wibmFtZVwiOlwic2FuaXRpemVcIixcImhhc2hcIjp7fSxcImRhdGFcIjpkYXRhfSkpXG4gICAgKyBcIicgY2xhc3M9XFxcInRvZ2dsZU9wZXJhdGlvbiBcIlxuICAgICsgKChzdGFjazEgPSBoZWxwZXJzW1wiaWZcIl0uY2FsbChhbGlhczEsKGRlcHRoMCAhPSBudWxsID8gZGVwdGgwLmRlcHJlY2F0ZWQgOiBkZXB0aDApLHtcIm5hbWVcIjpcImlmXCIsXCJoYXNoXCI6e30sXCJmblwiOmNvbnRhaW5lci5wcm9ncmFtKDEsIGRhdGEsIDApLFwiaW52ZXJzZVwiOmNvbnRhaW5lci5ub29wLFwiZGF0YVwiOmRhdGF9KSkgIT0gbnVsbCA/IHN0YWNrMSA6IFwiXCIpXG4gICAgKyBcIlxcXCI+XCJcbiAgICArICgoc3RhY2sxID0gKGhlbHBlcnMuZXNjYXBlIHx8IChkZXB0aDAgJiYgZGVwdGgwLmVzY2FwZSkgfHwgYWxpYXMyKS5jYWxsKGFsaWFzMSwoZGVwdGgwICE9IG51bGwgPyBkZXB0aDAucGF0aCA6IGRlcHRoMCkse1wibmFtZVwiOlwiZXNjYXBlXCIsXCJoYXNoXCI6e30sXCJkYXRhXCI6ZGF0YX0pKSAhPSBudWxsID8gc3RhY2sxIDogXCJcIilcbiAgICArIFwiPC9hPlxcbiAgICAgICAgICA8L3NwYW4+XFxuICAgICAgICA8L2gzPlxcbiAgICAgICAgPHVsIGNsYXNzPSdvcHRpb25zJz5cXG4gICAgICAgICAgPGxpPlxcbiAgICAgICAgICA8YSBocmVmPScjIS9cIlxuICAgICsgYWxpYXMzKChoZWxwZXJzLnNhbml0aXplIHx8IChkZXB0aDAgJiYgZGVwdGgwLnNhbml0aXplKSB8fCBhbGlhczIpLmNhbGwoYWxpYXMxLChkZXB0aDAgIT0gbnVsbCA/IGRlcHRoMC5lbmNvZGVkUGFyZW50SWQgOiBkZXB0aDApLHtcIm5hbWVcIjpcInNhbml0aXplXCIsXCJoYXNoXCI6e30sXCJkYXRhXCI6ZGF0YX0pKVxuICAgICsgXCIvXCJcbiAgICArIGFsaWFzMygoaGVscGVycy5zYW5pdGl6ZSB8fCAoZGVwdGgwICYmIGRlcHRoMC5zYW5pdGl6ZSkgfHwgYWxpYXMyKS5jYWxsKGFsaWFzMSwoZGVwdGgwICE9IG51bGwgPyBkZXB0aDAubmlja25hbWUgOiBkZXB0aDApLHtcIm5hbWVcIjpcInNhbml0aXplXCIsXCJoYXNoXCI6e30sXCJkYXRhXCI6ZGF0YX0pKVxuICAgICsgXCInIGNsYXNzPVxcXCJ0b2dnbGVPcGVyYXRpb25cXFwiPjxzcGFuIGNsYXNzPVxcXCJtYXJrZG93blxcXCI+XCJcbiAgICArICgoc3RhY2sxID0gKGhlbHBlcnMuZXNjYXBlIHx8IChkZXB0aDAgJiYgZGVwdGgwLmVzY2FwZSkgfHwgYWxpYXMyKS5jYWxsKGFsaWFzMSwoZGVwdGgwICE9IG51bGwgPyBkZXB0aDAuc3VtbWFyeSA6IGRlcHRoMCkse1wibmFtZVwiOlwiZXNjYXBlXCIsXCJoYXNoXCI6e30sXCJkYXRhXCI6ZGF0YX0pKSAhPSBudWxsID8gc3RhY2sxIDogXCJcIilcbiAgICArIFwiPC9zcGFuPjwvYT5cXG4gICAgICAgICAgPC9saT5cXG4gICAgICAgIDwvdWw+XFxuICAgICAgPC9kaXY+XFxuICAgICAgPGRpdiBjbGFzcz0nY29udGVudCcgaWQ9J1wiXG4gICAgKyBhbGlhczMoKGhlbHBlcnMuc2FuaXRpemUgfHwgKGRlcHRoMCAmJiBkZXB0aDAuc2FuaXRpemUpIHx8IGFsaWFzMikuY2FsbChhbGlhczEsKGRlcHRoMCAhPSBudWxsID8gZGVwdGgwLmVuY29kZWRQYXJlbnRJZCA6IGRlcHRoMCkse1wibmFtZVwiOlwic2FuaXRpemVcIixcImhhc2hcIjp7fSxcImRhdGFcIjpkYXRhfSkpXG4gICAgKyBcIl9cIlxuICAgICsgYWxpYXMzKChoZWxwZXJzLnNhbml0aXplIHx8IChkZXB0aDAgJiYgZGVwdGgwLnNhbml0aXplKSB8fCBhbGlhczIpLmNhbGwoYWxpYXMxLChkZXB0aDAgIT0gbnVsbCA/IGRlcHRoMC5uaWNrbmFtZSA6IGRlcHRoMCkse1wibmFtZVwiOlwic2FuaXRpemVcIixcImhhc2hcIjp7fSxcImRhdGFcIjpkYXRhfSkpXG4gICAgKyBcIl9jb250ZW50JyBzdHlsZT0nZGlzcGxheTpub25lJz5cXG5cIlxuICAgICsgKChzdGFjazEgPSBoZWxwZXJzW1wiaWZcIl0uY2FsbChhbGlhczEsKGRlcHRoMCAhPSBudWxsID8gZGVwdGgwLmRlcHJlY2F0ZWQgOiBkZXB0aDApLHtcIm5hbWVcIjpcImlmXCIsXCJoYXNoXCI6e30sXCJmblwiOmNvbnRhaW5lci5wcm9ncmFtKDMsIGRhdGEsIDApLFwiaW52ZXJzZVwiOmNvbnRhaW5lci5ub29wLFwiZGF0YVwiOmRhdGF9KSkgIT0gbnVsbCA/IHN0YWNrMSA6IFwiXCIpXG4gICAgKyAoKHN0YWNrMSA9IGhlbHBlcnNbXCJpZlwiXS5jYWxsKGFsaWFzMSwoZGVwdGgwICE9IG51bGwgPyBkZXB0aDAuZGVzY3JpcHRpb24gOiBkZXB0aDApLHtcIm5hbWVcIjpcImlmXCIsXCJoYXNoXCI6e30sXCJmblwiOmNvbnRhaW5lci5wcm9ncmFtKDUsIGRhdGEsIDApLFwiaW52ZXJzZVwiOmNvbnRhaW5lci5ub29wLFwiZGF0YVwiOmRhdGF9KSkgIT0gbnVsbCA/IHN0YWNrMSA6IFwiXCIpXG4gICAgKyAoKHN0YWNrMSA9IGhlbHBlcnNbXCJpZlwiXS5jYWxsKGFsaWFzMSwoZGVwdGgwICE9IG51bGwgPyBkZXB0aDAuc2VjdXJpdHkgOiBkZXB0aDApLHtcIm5hbWVcIjpcImlmXCIsXCJoYXNoXCI6e30sXCJmblwiOmNvbnRhaW5lci5wcm9ncmFtKDcsIGRhdGEsIDApLFwiaW52ZXJzZVwiOmNvbnRhaW5lci5ub29wLFwiZGF0YVwiOmRhdGF9KSkgIT0gbnVsbCA/IHN0YWNrMSA6IFwiXCIpXG4gICAgKyAoKHN0YWNrMSA9IGhlbHBlcnNbXCJpZlwiXS5jYWxsKGFsaWFzMSwoZGVwdGgwICE9IG51bGwgPyBkZXB0aDAudHlwZSA6IGRlcHRoMCkse1wibmFtZVwiOlwiaWZcIixcImhhc2hcIjp7fSxcImZuXCI6Y29udGFpbmVyLnByb2dyYW0oOSwgZGF0YSwgMCksXCJpbnZlcnNlXCI6Y29udGFpbmVyLm5vb3AsXCJkYXRhXCI6ZGF0YX0pKSAhPSBudWxsID8gc3RhY2sxIDogXCJcIilcbiAgICArIFwiXFxuXCJcbiAgICArICgoc3RhY2sxID0gaGVscGVyc1tcImlmXCJdLmNhbGwoYWxpYXMxLChkZXB0aDAgIT0gbnVsbCA/IGRlcHRoMC5oZWFkZXJzIDogZGVwdGgwKSx7XCJuYW1lXCI6XCJpZlwiLFwiaGFzaFwiOnt9LFwiZm5cIjpjb250YWluZXIucHJvZ3JhbSgxMiwgZGF0YSwgMCksXCJpbnZlcnNlXCI6Y29udGFpbmVyLm5vb3AsXCJkYXRhXCI6ZGF0YX0pKSAhPSBudWxsID8gc3RhY2sxIDogXCJcIilcbiAgICArIFwiXFxuICAgICAgICA8Zm9ybSBhY2NlcHQtY2hhcnNldD0nVVRGLTgnIGNsYXNzPSdzYW5kYm94Jz5cXG4gICAgICAgICAgPGRpdiBzdHlsZT0nbWFyZ2luOjA7cGFkZGluZzowO2Rpc3BsYXk6aW5saW5lJz48L2Rpdj5cXG5cIlxuICAgICsgKChzdGFjazEgPSBoZWxwZXJzW1wiaWZcIl0uY2FsbChhbGlhczEsKGRlcHRoMCAhPSBudWxsID8gZGVwdGgwLnBhcmFtZXRlcnMgOiBkZXB0aDApLHtcIm5hbWVcIjpcImlmXCIsXCJoYXNoXCI6e30sXCJmblwiOmNvbnRhaW5lci5wcm9ncmFtKDE1LCBkYXRhLCAwKSxcImludmVyc2VcIjpjb250YWluZXIubm9vcCxcImRhdGFcIjpkYXRhfSkpICE9IG51bGwgPyBzdGFjazEgOiBcIlwiKVxuICAgICsgKChzdGFjazEgPSBoZWxwZXJzW1wiaWZcIl0uY2FsbChhbGlhczEsKGRlcHRoMCAhPSBudWxsID8gZGVwdGgwLnJlc3BvbnNlTWVzc2FnZXMgOiBkZXB0aDApLHtcIm5hbWVcIjpcImlmXCIsXCJoYXNoXCI6e30sXCJmblwiOmNvbnRhaW5lci5wcm9ncmFtKDE3LCBkYXRhLCAwKSxcImludmVyc2VcIjpjb250YWluZXIubm9vcCxcImRhdGFcIjpkYXRhfSkpICE9IG51bGwgPyBzdGFjazEgOiBcIlwiKVxuICAgICsgKChzdGFjazEgPSBoZWxwZXJzW1wiaWZcIl0uY2FsbChhbGlhczEsKGRlcHRoMCAhPSBudWxsID8gZGVwdGgwLmlzUmVhZE9ubHkgOiBkZXB0aDApLHtcIm5hbWVcIjpcImlmXCIsXCJoYXNoXCI6e30sXCJmblwiOmNvbnRhaW5lci5wcm9ncmFtKDE5LCBkYXRhLCAwKSxcImludmVyc2VcIjpjb250YWluZXIucHJvZ3JhbSgyMSwgZGF0YSwgMCksXCJkYXRhXCI6ZGF0YX0pKSAhPSBudWxsID8gc3RhY2sxIDogXCJcIilcbiAgICArIFwiICAgICAgICA8L2Zvcm0+XFxuICAgICAgICA8ZGl2IGNsYXNzPSdyZXNwb25zZScgc3R5bGU9J2Rpc3BsYXk6bm9uZSc+XFxuICAgICAgICAgIDxoNCBjbGFzcz0nY3VybCc+Q3VybDwvaDQ+XFxuICAgICAgICAgIDxkaXYgY2xhc3M9J2Jsb2NrIGN1cmwnPjwvZGl2PlxcbiAgICAgICAgICA8aDQgZGF0YS1zdy10cmFuc2xhdGU+UmVxdWVzdCBVUkw8L2g0PlxcbiAgICAgICAgICA8ZGl2IGNsYXNzPSdibG9jayByZXF1ZXN0X3VybCc+PC9kaXY+XFxuXCJcbiAgICArICgoc3RhY2sxID0gaGVscGVyc1tcImlmXCJdLmNhbGwoYWxpYXMxLChkZXB0aDAgIT0gbnVsbCA/IGRlcHRoMC5zaG93UmVxdWVzdEhlYWRlcnMgOiBkZXB0aDApLHtcIm5hbWVcIjpcImlmXCIsXCJoYXNoXCI6e30sXCJmblwiOmNvbnRhaW5lci5wcm9ncmFtKDIzLCBkYXRhLCAwKSxcImludmVyc2VcIjpjb250YWluZXIubm9vcCxcImRhdGFcIjpkYXRhfSkpICE9IG51bGwgPyBzdGFjazEgOiBcIlwiKVxuICAgICsgXCIgICAgICAgICAgPGg0IGRhdGEtc3ctdHJhbnNsYXRlPlJlc3BvbnNlIEJvZHk8L2g0PlxcbiAgICAgICAgICA8ZGl2IGNsYXNzPSdibG9jayByZXNwb25zZV9ib2R5Jz48L2Rpdj5cXG4gICAgICAgICAgPGg0IGRhdGEtc3ctdHJhbnNsYXRlPlJlc3BvbnNlIENvZGU8L2g0PlxcbiAgICAgICAgICA8ZGl2IGNsYXNzPSdibG9jayByZXNwb25zZV9jb2RlJz48L2Rpdj5cXG4gICAgICAgICAgPGg0IGRhdGEtc3ctdHJhbnNsYXRlPlJlc3BvbnNlIEhlYWRlcnM8L2g0PlxcbiAgICAgICAgICA8ZGl2IGNsYXNzPSdibG9jayByZXNwb25zZV9oZWFkZXJzJz48L2Rpdj5cXG4gICAgICAgIDwvZGl2PlxcbiAgICAgIDwvZGl2PlxcbiAgICA8L2xpPlxcbiAgPC91bD5cXG5cIjtcbn0sXCJ1c2VEYXRhXCI6dHJ1ZX0pO1xudGVtcGxhdGVzWydwYXJhbSddID0gdGVtcGxhdGUoe1wiMVwiOmZ1bmN0aW9uKGNvbnRhaW5lcixkZXB0aDAsaGVscGVycyxwYXJ0aWFscyxkYXRhKSB7XG4gICAgdmFyIHN0YWNrMTtcblxuICByZXR1cm4gKChzdGFjazEgPSBoZWxwZXJzW1wiaWZcIl0uY2FsbChkZXB0aDAgIT0gbnVsbCA/IGRlcHRoMCA6IHt9LChkZXB0aDAgIT0gbnVsbCA/IGRlcHRoMC5pc0ZpbGUgOiBkZXB0aDApLHtcIm5hbWVcIjpcImlmXCIsXCJoYXNoXCI6e30sXCJmblwiOmNvbnRhaW5lci5wcm9ncmFtKDIsIGRhdGEsIDApLFwiaW52ZXJzZVwiOmNvbnRhaW5lci5wcm9ncmFtKDQsIGRhdGEsIDApLFwiZGF0YVwiOmRhdGF9KSkgIT0gbnVsbCA/IHN0YWNrMSA6IFwiXCIpO1xufSxcIjJcIjpmdW5jdGlvbihjb250YWluZXIsZGVwdGgwLGhlbHBlcnMscGFydGlhbHMsZGF0YSkge1xuICAgIHZhciBzdGFjazEsIGFsaWFzMT1kZXB0aDAgIT0gbnVsbCA/IGRlcHRoMCA6IHt9LCBhbGlhczI9aGVscGVycy5oZWxwZXJNaXNzaW5nO1xuXG4gIHJldHVybiBcIlx0XHRcdDxpbnB1dCB0eXBlPVxcXCJmaWxlXFxcIiBuYW1lPSdcIlxuICAgICsgKChzdGFjazEgPSAoaGVscGVycy5lc2NhcGUgfHwgKGRlcHRoMCAmJiBkZXB0aDAuZXNjYXBlKSB8fCBhbGlhczIpLmNhbGwoYWxpYXMxLChkZXB0aDAgIT0gbnVsbCA/IGRlcHRoMC5uYW1lIDogZGVwdGgwKSx7XCJuYW1lXCI6XCJlc2NhcGVcIixcImhhc2hcIjp7fSxcImRhdGFcIjpkYXRhfSkpICE9IG51bGwgPyBzdGFjazEgOiBcIlwiKVxuICAgICsgXCInIGlkPSdcIlxuICAgICsgKChzdGFjazEgPSAoaGVscGVycy5lc2NhcGUgfHwgKGRlcHRoMCAmJiBkZXB0aDAuZXNjYXBlKSB8fCBhbGlhczIpLmNhbGwoYWxpYXMxLChkZXB0aDAgIT0gbnVsbCA/IGRlcHRoMC52YWx1ZUlkIDogZGVwdGgwKSx7XCJuYW1lXCI6XCJlc2NhcGVcIixcImhhc2hcIjp7fSxcImRhdGFcIjpkYXRhfSkpICE9IG51bGwgPyBzdGFjazEgOiBcIlwiKVxuICAgICsgXCInLz5cXG5cdFx0XHQ8ZGl2IGNsYXNzPVxcXCJwYXJhbWV0ZXItY29udGVudC10eXBlXFxcIiAvPlxcblwiO1xufSxcIjRcIjpmdW5jdGlvbihjb250YWluZXIsZGVwdGgwLGhlbHBlcnMscGFydGlhbHMsZGF0YSkge1xuICAgIHZhciBzdGFjazE7XG5cbiAgcmV0dXJuICgoc3RhY2sxID0gaGVscGVyc1tcImlmXCJdLmNhbGwoZGVwdGgwICE9IG51bGwgPyBkZXB0aDAgOiB7fSwoZGVwdGgwICE9IG51bGwgPyBkZXB0aDBbXCJkZWZhdWx0XCJdIDogZGVwdGgwKSx7XCJuYW1lXCI6XCJpZlwiLFwiaGFzaFwiOnt9LFwiZm5cIjpjb250YWluZXIucHJvZ3JhbSg1LCBkYXRhLCAwKSxcImludmVyc2VcIjpjb250YWluZXIucHJvZ3JhbSg3LCBkYXRhLCAwKSxcImRhdGFcIjpkYXRhfSkpICE9IG51bGwgPyBzdGFjazEgOiBcIlwiKTtcbn0sXCI1XCI6ZnVuY3Rpb24oY29udGFpbmVyLGRlcHRoMCxoZWxwZXJzLHBhcnRpYWxzLGRhdGEpIHtcbiAgICB2YXIgc3RhY2sxLCBhbGlhczE9ZGVwdGgwICE9IG51bGwgPyBkZXB0aDAgOiB7fSwgYWxpYXMyPWhlbHBlcnMuaGVscGVyTWlzc2luZztcblxuICByZXR1cm4gXCJcdFx0XHRcdDxkaXYgY2xhc3M9XFxcImVkaXRvcl9ob2xkZXJcXFwiPjwvZGl2Plxcblx0XHRcdFx0PHRleHRhcmVhIGNsYXNzPSdib2R5LXRleHRhcmVhJyBuYW1lPSdcIlxuICAgICsgKChzdGFjazEgPSAoaGVscGVycy5lc2NhcGUgfHwgKGRlcHRoMCAmJiBkZXB0aDAuZXNjYXBlKSB8fCBhbGlhczIpLmNhbGwoYWxpYXMxLChkZXB0aDAgIT0gbnVsbCA/IGRlcHRoMC5uYW1lIDogZGVwdGgwKSx7XCJuYW1lXCI6XCJlc2NhcGVcIixcImhhc2hcIjp7fSxcImRhdGFcIjpkYXRhfSkpICE9IG51bGwgPyBzdGFjazEgOiBcIlwiKVxuICAgICsgXCInIGlkPSdcIlxuICAgICsgKChzdGFjazEgPSAoaGVscGVycy5lc2NhcGUgfHwgKGRlcHRoMCAmJiBkZXB0aDAuZXNjYXBlKSB8fCBhbGlhczIpLmNhbGwoYWxpYXMxLChkZXB0aDAgIT0gbnVsbCA/IGRlcHRoMC52YWx1ZUlkIDogZGVwdGgwKSx7XCJuYW1lXCI6XCJlc2NhcGVcIixcImhhc2hcIjp7fSxcImRhdGFcIjpkYXRhfSkpICE9IG51bGwgPyBzdGFjazEgOiBcIlwiKVxuICAgICsgXCInPlwiXG4gICAgKyAoKHN0YWNrMSA9IChoZWxwZXJzLmVzY2FwZSB8fCAoZGVwdGgwICYmIGRlcHRoMC5lc2NhcGUpIHx8IGFsaWFzMikuY2FsbChhbGlhczEsKGRlcHRoMCAhPSBudWxsID8gZGVwdGgwW1wiZGVmYXVsdFwiXSA6IGRlcHRoMCkse1wibmFtZVwiOlwiZXNjYXBlXCIsXCJoYXNoXCI6e30sXCJkYXRhXCI6ZGF0YX0pKSAhPSBudWxsID8gc3RhY2sxIDogXCJcIilcbiAgICArIFwiPC90ZXh0YXJlYT5cXG4gICAgICAgIDxiciAvPlxcbiAgICAgICAgPGRpdiBjbGFzcz1cXFwicGFyYW1ldGVyLWNvbnRlbnQtdHlwZVxcXCIgLz5cXG5cIjtcbn0sXCI3XCI6ZnVuY3Rpb24oY29udGFpbmVyLGRlcHRoMCxoZWxwZXJzLHBhcnRpYWxzLGRhdGEpIHtcbiAgICB2YXIgc3RhY2sxLCBhbGlhczE9ZGVwdGgwICE9IG51bGwgPyBkZXB0aDAgOiB7fSwgYWxpYXMyPWhlbHBlcnMuaGVscGVyTWlzc2luZztcblxuICByZXR1cm4gXCJcdFx0XHRcdDx0ZXh0YXJlYSBjbGFzcz0nYm9keS10ZXh0YXJlYScgbmFtZT0nXCJcbiAgICArICgoc3RhY2sxID0gKGhlbHBlcnMuZXNjYXBlIHx8IChkZXB0aDAgJiYgZGVwdGgwLmVzY2FwZSkgfHwgYWxpYXMyKS5jYWxsKGFsaWFzMSwoZGVwdGgwICE9IG51bGwgPyBkZXB0aDAubmFtZSA6IGRlcHRoMCkse1wibmFtZVwiOlwiZXNjYXBlXCIsXCJoYXNoXCI6e30sXCJkYXRhXCI6ZGF0YX0pKSAhPSBudWxsID8gc3RhY2sxIDogXCJcIilcbiAgICArIFwiJyBpZD0nXCJcbiAgICArICgoc3RhY2sxID0gKGhlbHBlcnMuZXNjYXBlIHx8IChkZXB0aDAgJiYgZGVwdGgwLmVzY2FwZSkgfHwgYWxpYXMyKS5jYWxsKGFsaWFzMSwoZGVwdGgwICE9IG51bGwgPyBkZXB0aDAudmFsdWVJZCA6IGRlcHRoMCkse1wibmFtZVwiOlwiZXNjYXBlXCIsXCJoYXNoXCI6e30sXCJkYXRhXCI6ZGF0YX0pKSAhPSBudWxsID8gc3RhY2sxIDogXCJcIilcbiAgICArIFwiJz48L3RleHRhcmVhPlxcblx0XHRcdFx0PGRpdiBjbGFzcz1cXFwiZWRpdG9yX2hvbGRlclxcXCI+PC9kaXY+XFxuXHRcdFx0XHQ8YnIgLz5cXG5cdFx0XHRcdDxkaXYgY2xhc3M9XFxcInBhcmFtZXRlci1jb250ZW50LXR5cGVcXFwiIC8+XFxuXCI7XG59LFwiOVwiOmZ1bmN0aW9uKGNvbnRhaW5lcixkZXB0aDAsaGVscGVycyxwYXJ0aWFscyxkYXRhKSB7XG4gICAgdmFyIHN0YWNrMTtcblxuICByZXR1cm4gKChzdGFjazEgPSBoZWxwZXJzW1wiaWZcIl0uY2FsbChkZXB0aDAgIT0gbnVsbCA/IGRlcHRoMCA6IHt9LChkZXB0aDAgIT0gbnVsbCA/IGRlcHRoMC5pc0ZpbGUgOiBkZXB0aDApLHtcIm5hbWVcIjpcImlmXCIsXCJoYXNoXCI6e30sXCJmblwiOmNvbnRhaW5lci5wcm9ncmFtKDIsIGRhdGEsIDApLFwiaW52ZXJzZVwiOmNvbnRhaW5lci5wcm9ncmFtKDEwLCBkYXRhLCAwKSxcImRhdGFcIjpkYXRhfSkpICE9IG51bGwgPyBzdGFjazEgOiBcIlwiKTtcbn0sXCIxMFwiOmZ1bmN0aW9uKGNvbnRhaW5lcixkZXB0aDAsaGVscGVycyxwYXJ0aWFscyxkYXRhKSB7XG4gICAgdmFyIHN0YWNrMTtcblxuICByZXR1cm4gKChzdGFjazEgPSAoaGVscGVycy5yZW5kZXJUZXh0UGFyYW0gfHwgKGRlcHRoMCAmJiBkZXB0aDAucmVuZGVyVGV4dFBhcmFtKSB8fCBoZWxwZXJzLmhlbHBlck1pc3NpbmcpLmNhbGwoZGVwdGgwICE9IG51bGwgPyBkZXB0aDAgOiB7fSxkZXB0aDAse1wibmFtZVwiOlwicmVuZGVyVGV4dFBhcmFtXCIsXCJoYXNoXCI6e30sXCJmblwiOmNvbnRhaW5lci5wcm9ncmFtKDExLCBkYXRhLCAwKSxcImludmVyc2VcIjpjb250YWluZXIubm9vcCxcImRhdGFcIjpkYXRhfSkpICE9IG51bGwgPyBzdGFjazEgOiBcIlwiKTtcbn0sXCIxMVwiOmZ1bmN0aW9uKGNvbnRhaW5lcixkZXB0aDAsaGVscGVycyxwYXJ0aWFscyxkYXRhKSB7XG4gICAgcmV0dXJuIFwiXCI7XG59LFwiY29tcGlsZXJcIjpbNyxcIj49IDQuMC4wXCJdLFwibWFpblwiOmZ1bmN0aW9uKGNvbnRhaW5lcixkZXB0aDAsaGVscGVycyxwYXJ0aWFscyxkYXRhKSB7XG4gICAgdmFyIHN0YWNrMSwgYWxpYXMxPWRlcHRoMCAhPSBudWxsID8gZGVwdGgwIDoge30sIGFsaWFzMj1oZWxwZXJzLmhlbHBlck1pc3Npbmc7XG5cbiAgcmV0dXJuIFwiPHRkIGNsYXNzPSdjb2RlJz48bGFiZWwgZm9yPSdcIlxuICAgICsgKChzdGFjazEgPSAoaGVscGVycy5lc2NhcGUgfHwgKGRlcHRoMCAmJiBkZXB0aDAuZXNjYXBlKSB8fCBhbGlhczIpLmNhbGwoYWxpYXMxLChkZXB0aDAgIT0gbnVsbCA/IGRlcHRoMC52YWx1ZUlkIDogZGVwdGgwKSx7XCJuYW1lXCI6XCJlc2NhcGVcIixcImhhc2hcIjp7fSxcImRhdGFcIjpkYXRhfSkpICE9IG51bGwgPyBzdGFjazEgOiBcIlwiKVxuICAgICsgXCInPlwiXG4gICAgKyAoKHN0YWNrMSA9IChoZWxwZXJzLmVzY2FwZSB8fCAoZGVwdGgwICYmIGRlcHRoMC5lc2NhcGUpIHx8IGFsaWFzMikuY2FsbChhbGlhczEsKGRlcHRoMCAhPSBudWxsID8gZGVwdGgwLm5hbWUgOiBkZXB0aDApLHtcIm5hbWVcIjpcImVzY2FwZVwiLFwiaGFzaFwiOnt9LFwiZGF0YVwiOmRhdGF9KSkgIT0gbnVsbCA/IHN0YWNrMSA6IFwiXCIpXG4gICAgKyBcIjwvbGFiZWw+PC90ZD5cXG48dGQ+XFxuXFxuXCJcbiAgICArICgoc3RhY2sxID0gaGVscGVyc1tcImlmXCJdLmNhbGwoYWxpYXMxLChkZXB0aDAgIT0gbnVsbCA/IGRlcHRoMC5pc0JvZHkgOiBkZXB0aDApLHtcIm5hbWVcIjpcImlmXCIsXCJoYXNoXCI6e30sXCJmblwiOmNvbnRhaW5lci5wcm9ncmFtKDEsIGRhdGEsIDApLFwiaW52ZXJzZVwiOmNvbnRhaW5lci5wcm9ncmFtKDksIGRhdGEsIDApLFwiZGF0YVwiOmRhdGF9KSkgIT0gbnVsbCA/IHN0YWNrMSA6IFwiXCIpXG4gICAgKyBcIlxcbjwvdGQ+XFxuPHRkIGNsYXNzPVxcXCJtYXJrZG93blxcXCI+XCJcbiAgICArICgoc3RhY2sxID0gKGhlbHBlcnMuc2FuaXRpemUgfHwgKGRlcHRoMCAmJiBkZXB0aDAuc2FuaXRpemUpIHx8IGFsaWFzMikuY2FsbChhbGlhczEsKGRlcHRoMCAhPSBudWxsID8gZGVwdGgwLmRlc2NyaXB0aW9uIDogZGVwdGgwKSx7XCJuYW1lXCI6XCJzYW5pdGl6ZVwiLFwiaGFzaFwiOnt9LFwiZGF0YVwiOmRhdGF9KSkgIT0gbnVsbCA/IHN0YWNrMSA6IFwiXCIpXG4gICAgKyBcIjwvdGQ+XFxuPHRkPlwiXG4gICAgKyAoKHN0YWNrMSA9IChoZWxwZXJzLmVzY2FwZSB8fCAoZGVwdGgwICYmIGRlcHRoMC5lc2NhcGUpIHx8IGFsaWFzMikuY2FsbChhbGlhczEsKGRlcHRoMCAhPSBudWxsID8gZGVwdGgwLnBhcmFtVHlwZSA6IGRlcHRoMCkse1wibmFtZVwiOlwiZXNjYXBlXCIsXCJoYXNoXCI6e30sXCJkYXRhXCI6ZGF0YX0pKSAhPSBudWxsID8gc3RhY2sxIDogXCJcIilcbiAgICArIFwiPC90ZD5cXG48dGQ+XFxuXHQ8c3BhbiBjbGFzcz1cXFwibW9kZWwtc2lnbmF0dXJlXFxcIj48L3NwYW4+XFxuPC90ZD5cXG5cIjtcbn0sXCJ1c2VEYXRhXCI6dHJ1ZX0pO1xudGVtcGxhdGVzWydwYXJhbV9saXN0J10gPSB0ZW1wbGF0ZSh7XCIxXCI6ZnVuY3Rpb24oY29udGFpbmVyLGRlcHRoMCxoZWxwZXJzLHBhcnRpYWxzLGRhdGEpIHtcbiAgICByZXR1cm4gXCIgcmVxdWlyZWRcIjtcbn0sXCIzXCI6ZnVuY3Rpb24oY29udGFpbmVyLGRlcHRoMCxoZWxwZXJzLHBhcnRpYWxzLGRhdGEpIHtcbiAgICByZXR1cm4gXCIgbXVsdGlwbGU9XFxcIm11bHRpcGxlXFxcIlwiO1xufSxcIjVcIjpmdW5jdGlvbihjb250YWluZXIsZGVwdGgwLGhlbHBlcnMscGFydGlhbHMsZGF0YSkge1xuICAgIHJldHVybiBcIiByZXF1aXJlZCBcIjtcbn0sXCI3XCI6ZnVuY3Rpb24oY29udGFpbmVyLGRlcHRoMCxoZWxwZXJzLHBhcnRpYWxzLGRhdGEpIHtcbiAgICB2YXIgc3RhY2sxO1xuXG4gIHJldHVybiBcIiAgICAgIDxvcHRpb24gXCJcbiAgICArICgoc3RhY2sxID0gaGVscGVycy51bmxlc3MuY2FsbChkZXB0aDAgIT0gbnVsbCA/IGRlcHRoMCA6IHt9LChkZXB0aDAgIT0gbnVsbCA/IGRlcHRoMC5oYXNEZWZhdWx0IDogZGVwdGgwKSx7XCJuYW1lXCI6XCJ1bmxlc3NcIixcImhhc2hcIjp7fSxcImZuXCI6Y29udGFpbmVyLnByb2dyYW0oOCwgZGF0YSwgMCksXCJpbnZlcnNlXCI6Y29udGFpbmVyLm5vb3AsXCJkYXRhXCI6ZGF0YX0pKSAhPSBudWxsID8gc3RhY2sxIDogXCJcIilcbiAgICArIFwiIHZhbHVlPScnPjwvb3B0aW9uPlxcblwiO1xufSxcIjhcIjpmdW5jdGlvbihjb250YWluZXIsZGVwdGgwLGhlbHBlcnMscGFydGlhbHMsZGF0YSkge1xuICAgIHJldHVybiBcIiAgc2VsZWN0ZWQ9XFxcIlxcXCIgXCI7XG59LFwiMTBcIjpmdW5jdGlvbihjb250YWluZXIsZGVwdGgwLGhlbHBlcnMscGFydGlhbHMsZGF0YSkge1xuICAgIHZhciBzdGFjazEsIGFsaWFzMT1kZXB0aDAgIT0gbnVsbCA/IGRlcHRoMCA6IHt9LCBhbGlhczI9aGVscGVycy5oZWxwZXJNaXNzaW5nO1xuXG4gIHJldHVybiBcIlxcbiAgICAgIDxvcHRpb24gXCJcbiAgICArICgoc3RhY2sxID0gaGVscGVyc1tcImlmXCJdLmNhbGwoYWxpYXMxLChkZXB0aDAgIT0gbnVsbCA/IGRlcHRoMC5pc0RlZmF1bHQgOiBkZXB0aDApLHtcIm5hbWVcIjpcImlmXCIsXCJoYXNoXCI6e30sXCJmblwiOmNvbnRhaW5lci5wcm9ncmFtKDExLCBkYXRhLCAwKSxcImludmVyc2VcIjpjb250YWluZXIubm9vcCxcImRhdGFcIjpkYXRhfSkpICE9IG51bGwgPyBzdGFjazEgOiBcIlwiKVxuICAgICsgXCIgIHZhbHVlPSdcIlxuICAgICsgKChzdGFjazEgPSAoaGVscGVycy5zYW5pdGl6ZSB8fCAoZGVwdGgwICYmIGRlcHRoMC5zYW5pdGl6ZSkgfHwgYWxpYXMyKS5jYWxsKGFsaWFzMSwoZGVwdGgwICE9IG51bGwgPyBkZXB0aDAudmFsdWUgOiBkZXB0aDApLHtcIm5hbWVcIjpcInNhbml0aXplXCIsXCJoYXNoXCI6e30sXCJkYXRhXCI6ZGF0YX0pKSAhPSBudWxsID8gc3RhY2sxIDogXCJcIilcbiAgICArIFwiJz4gXCJcbiAgICArICgoc3RhY2sxID0gKGhlbHBlcnMuc2FuaXRpemUgfHwgKGRlcHRoMCAmJiBkZXB0aDAuc2FuaXRpemUpIHx8IGFsaWFzMikuY2FsbChhbGlhczEsKGRlcHRoMCAhPSBudWxsID8gZGVwdGgwLnZhbHVlIDogZGVwdGgwKSx7XCJuYW1lXCI6XCJzYW5pdGl6ZVwiLFwiaGFzaFwiOnt9LFwiZGF0YVwiOmRhdGF9KSkgIT0gbnVsbCA/IHN0YWNrMSA6IFwiXCIpXG4gICAgKyBcIiBcIlxuICAgICsgKChzdGFjazEgPSBoZWxwZXJzW1wiaWZcIl0uY2FsbChhbGlhczEsKGRlcHRoMCAhPSBudWxsID8gZGVwdGgwLmlzRGVmYXVsdCA6IGRlcHRoMCkse1wibmFtZVwiOlwiaWZcIixcImhhc2hcIjp7fSxcImZuXCI6Y29udGFpbmVyLnByb2dyYW0oMTMsIGRhdGEsIDApLFwiaW52ZXJzZVwiOmNvbnRhaW5lci5ub29wLFwiZGF0YVwiOmRhdGF9KSkgIT0gbnVsbCA/IHN0YWNrMSA6IFwiXCIpXG4gICAgKyBcIiA8L29wdGlvbj5cXG5cXG5cIjtcbn0sXCIxMVwiOmZ1bmN0aW9uKGNvbnRhaW5lcixkZXB0aDAsaGVscGVycyxwYXJ0aWFscyxkYXRhKSB7XG4gICAgcmV0dXJuIFwiIHNlbGVjdGVkPVxcXCJcXFwiICBcIjtcbn0sXCIxM1wiOmZ1bmN0aW9uKGNvbnRhaW5lcixkZXB0aDAsaGVscGVycyxwYXJ0aWFscyxkYXRhKSB7XG4gICAgcmV0dXJuIFwiIChkZWZhdWx0KSBcIjtcbn0sXCIxNVwiOmZ1bmN0aW9uKGNvbnRhaW5lcixkZXB0aDAsaGVscGVycyxwYXJ0aWFscyxkYXRhKSB7XG4gICAgcmV0dXJuIFwiPHN0cm9uZz5cIjtcbn0sXCIxN1wiOmZ1bmN0aW9uKGNvbnRhaW5lcixkZXB0aDAsaGVscGVycyxwYXJ0aWFscyxkYXRhKSB7XG4gICAgcmV0dXJuIFwiPC9zdHJvbmc+XCI7XG59LFwiY29tcGlsZXJcIjpbNyxcIj49IDQuMC4wXCJdLFwibWFpblwiOmZ1bmN0aW9uKGNvbnRhaW5lcixkZXB0aDAsaGVscGVycyxwYXJ0aWFscyxkYXRhKSB7XG4gICAgdmFyIHN0YWNrMSwgaGVscGVyLCBhbGlhczE9ZGVwdGgwICE9IG51bGwgPyBkZXB0aDAgOiB7fSwgYWxpYXMyPWhlbHBlcnMuaGVscGVyTWlzc2luZztcblxuICByZXR1cm4gXCI8dGQgY2xhc3M9J2NvZGVcIlxuICAgICsgKChzdGFjazEgPSBoZWxwZXJzW1wiaWZcIl0uY2FsbChhbGlhczEsKGRlcHRoMCAhPSBudWxsID8gZGVwdGgwLnJlcXVpcmVkIDogZGVwdGgwKSx7XCJuYW1lXCI6XCJpZlwiLFwiaGFzaFwiOnt9LFwiZm5cIjpjb250YWluZXIucHJvZ3JhbSgxLCBkYXRhLCAwKSxcImludmVyc2VcIjpjb250YWluZXIubm9vcCxcImRhdGFcIjpkYXRhfSkpICE9IG51bGwgPyBzdGFjazEgOiBcIlwiKVxuICAgICsgXCInPjxsYWJlbCBmb3I9J1wiXG4gICAgKyAoKHN0YWNrMSA9IChoZWxwZXJzLmVzY2FwZSB8fCAoZGVwdGgwICYmIGRlcHRoMC5lc2NhcGUpIHx8IGFsaWFzMikuY2FsbChhbGlhczEsKGRlcHRoMCAhPSBudWxsID8gZGVwdGgwLnZhbHVlSWQgOiBkZXB0aDApLHtcIm5hbWVcIjpcImVzY2FwZVwiLFwiaGFzaFwiOnt9LFwiZGF0YVwiOmRhdGF9KSkgIT0gbnVsbCA/IHN0YWNrMSA6IFwiXCIpXG4gICAgKyBcIic+XCJcbiAgICArICgoc3RhY2sxID0gKGhlbHBlcnMuc2FuaXRpemUgfHwgKGRlcHRoMCAmJiBkZXB0aDAuc2FuaXRpemUpIHx8IGFsaWFzMikuY2FsbChhbGlhczEsKGRlcHRoMCAhPSBudWxsID8gZGVwdGgwLm5hbWUgOiBkZXB0aDApLHtcIm5hbWVcIjpcInNhbml0aXplXCIsXCJoYXNoXCI6e30sXCJkYXRhXCI6ZGF0YX0pKSAhPSBudWxsID8gc3RhY2sxIDogXCJcIilcbiAgICArIFwiPC9sYWJlbD48L3RkPlxcbjx0ZD5cXG4gIDxzZWxlY3QgXCJcbiAgICArICgoc3RhY2sxID0gKGhlbHBlcnMuaXNBcnJheSB8fCAoZGVwdGgwICYmIGRlcHRoMC5pc0FycmF5KSB8fCBhbGlhczIpLmNhbGwoYWxpYXMxLGRlcHRoMCx7XCJuYW1lXCI6XCJpc0FycmF5XCIsXCJoYXNoXCI6e30sXCJmblwiOmNvbnRhaW5lci5wcm9ncmFtKDMsIGRhdGEsIDApLFwiaW52ZXJzZVwiOmNvbnRhaW5lci5ub29wLFwiZGF0YVwiOmRhdGF9KSkgIT0gbnVsbCA/IHN0YWNrMSA6IFwiXCIpXG4gICAgKyBcIiBjbGFzcz1cXFwicGFyYW1ldGVyIFwiXG4gICAgKyAoKHN0YWNrMSA9IGhlbHBlcnNbXCJpZlwiXS5jYWxsKGFsaWFzMSwoZGVwdGgwICE9IG51bGwgPyBkZXB0aDAucmVxdWlyZWQgOiBkZXB0aDApLHtcIm5hbWVcIjpcImlmXCIsXCJoYXNoXCI6e30sXCJmblwiOmNvbnRhaW5lci5wcm9ncmFtKDUsIGRhdGEsIDApLFwiaW52ZXJzZVwiOmNvbnRhaW5lci5ub29wLFwiZGF0YVwiOmRhdGF9KSkgIT0gbnVsbCA/IHN0YWNrMSA6IFwiXCIpXG4gICAgKyBcIlxcXCIgbmFtZT1cXFwiXCJcbiAgICArICgoc3RhY2sxID0gKGhlbHBlcnMuc2FuaXRpemUgfHwgKGRlcHRoMCAmJiBkZXB0aDAuc2FuaXRpemUpIHx8IGFsaWFzMikuY2FsbChhbGlhczEsKGRlcHRoMCAhPSBudWxsID8gZGVwdGgwLm5hbWUgOiBkZXB0aDApLHtcIm5hbWVcIjpcInNhbml0aXplXCIsXCJoYXNoXCI6e30sXCJkYXRhXCI6ZGF0YX0pKSAhPSBudWxsID8gc3RhY2sxIDogXCJcIilcbiAgICArIFwiXFxcIiBpZD1cXFwiXCJcbiAgICArICgoc3RhY2sxID0gKGhlbHBlcnMuZXNjYXBlIHx8IChkZXB0aDAgJiYgZGVwdGgwLmVzY2FwZSkgfHwgYWxpYXMyKS5jYWxsKGFsaWFzMSwoZGVwdGgwICE9IG51bGwgPyBkZXB0aDAudmFsdWVJZCA6IGRlcHRoMCkse1wibmFtZVwiOlwiZXNjYXBlXCIsXCJoYXNoXCI6e30sXCJkYXRhXCI6ZGF0YX0pKSAhPSBudWxsID8gc3RhY2sxIDogXCJcIilcbiAgICArIFwiXFxcIj5cXG5cXG5cIlxuICAgICsgKChzdGFjazEgPSBoZWxwZXJzLnVubGVzcy5jYWxsKGFsaWFzMSwoZGVwdGgwICE9IG51bGwgPyBkZXB0aDAucmVxdWlyZWQgOiBkZXB0aDApLHtcIm5hbWVcIjpcInVubGVzc1wiLFwiaGFzaFwiOnt9LFwiZm5cIjpjb250YWluZXIucHJvZ3JhbSg3LCBkYXRhLCAwKSxcImludmVyc2VcIjpjb250YWluZXIubm9vcCxcImRhdGFcIjpkYXRhfSkpICE9IG51bGwgPyBzdGFjazEgOiBcIlwiKVxuICAgICsgXCJcXG5cIlxuICAgICsgKChzdGFjazEgPSBoZWxwZXJzLmVhY2guY2FsbChhbGlhczEsKChzdGFjazEgPSAoZGVwdGgwICE9IG51bGwgPyBkZXB0aDAuYWxsb3dhYmxlVmFsdWVzIDogZGVwdGgwKSkgIT0gbnVsbCA/IHN0YWNrMS5kZXNjcmlwdGl2ZVZhbHVlcyA6IHN0YWNrMSkse1wibmFtZVwiOlwiZWFjaFwiLFwiaGFzaFwiOnt9LFwiZm5cIjpjb250YWluZXIucHJvZ3JhbSgxMCwgZGF0YSwgMCksXCJpbnZlcnNlXCI6Y29udGFpbmVyLm5vb3AsXCJkYXRhXCI6ZGF0YX0pKSAhPSBudWxsID8gc3RhY2sxIDogXCJcIilcbiAgICArIFwiXFxuICA8L3NlbGVjdD5cXG48L3RkPlxcbjx0ZCBjbGFzcz1cXFwibWFya2Rvd25cXFwiPlwiXG4gICAgKyAoKHN0YWNrMSA9IGhlbHBlcnNbXCJpZlwiXS5jYWxsKGFsaWFzMSwoZGVwdGgwICE9IG51bGwgPyBkZXB0aDAucmVxdWlyZWQgOiBkZXB0aDApLHtcIm5hbWVcIjpcImlmXCIsXCJoYXNoXCI6e30sXCJmblwiOmNvbnRhaW5lci5wcm9ncmFtKDE1LCBkYXRhLCAwKSxcImludmVyc2VcIjpjb250YWluZXIubm9vcCxcImRhdGFcIjpkYXRhfSkpICE9IG51bGwgPyBzdGFjazEgOiBcIlwiKVxuICAgICsgKChzdGFjazEgPSAoKGhlbHBlciA9IChoZWxwZXIgPSBoZWxwZXJzLmRlc2NyaXB0aW9uIHx8IChkZXB0aDAgIT0gbnVsbCA/IGRlcHRoMC5kZXNjcmlwdGlvbiA6IGRlcHRoMCkpICE9IG51bGwgPyBoZWxwZXIgOiBhbGlhczIpLCh0eXBlb2YgaGVscGVyID09PSBcImZ1bmN0aW9uXCIgPyBoZWxwZXIuY2FsbChhbGlhczEse1wibmFtZVwiOlwiZGVzY3JpcHRpb25cIixcImhhc2hcIjp7fSxcImRhdGFcIjpkYXRhfSkgOiBoZWxwZXIpKSkgIT0gbnVsbCA/IHN0YWNrMSA6IFwiXCIpXG4gICAgKyAoKHN0YWNrMSA9IGhlbHBlcnNbXCJpZlwiXS5jYWxsKGFsaWFzMSwoZGVwdGgwICE9IG51bGwgPyBkZXB0aDAucmVxdWlyZWQgOiBkZXB0aDApLHtcIm5hbWVcIjpcImlmXCIsXCJoYXNoXCI6e30sXCJmblwiOmNvbnRhaW5lci5wcm9ncmFtKDE3LCBkYXRhLCAwKSxcImludmVyc2VcIjpjb250YWluZXIubm9vcCxcImRhdGFcIjpkYXRhfSkpICE9IG51bGwgPyBzdGFjazEgOiBcIlwiKVxuICAgICsgXCI8L3RkPlxcbjx0ZD5cIlxuICAgICsgKChzdGFjazEgPSAoaGVscGVycy5lc2NhcGUgfHwgKGRlcHRoMCAmJiBkZXB0aDAuZXNjYXBlKSB8fCBhbGlhczIpLmNhbGwoYWxpYXMxLChkZXB0aDAgIT0gbnVsbCA/IGRlcHRoMC5wYXJhbVR5cGUgOiBkZXB0aDApLHtcIm5hbWVcIjpcImVzY2FwZVwiLFwiaGFzaFwiOnt9LFwiZGF0YVwiOmRhdGF9KSkgIT0gbnVsbCA/IHN0YWNrMSA6IFwiXCIpXG4gICAgKyBcIjwvdGQ+XFxuPHRkPjxzcGFuIGNsYXNzPVxcXCJtb2RlbC1zaWduYXR1cmVcXFwiPjwvc3Bhbj48L3RkPlxcblwiO1xufSxcInVzZURhdGFcIjp0cnVlfSk7XG50ZW1wbGF0ZXNbJ3BhcmFtX3JlYWRvbmx5J10gPSB0ZW1wbGF0ZSh7XCIxXCI6ZnVuY3Rpb24oY29udGFpbmVyLGRlcHRoMCxoZWxwZXJzLHBhcnRpYWxzLGRhdGEpIHtcbiAgICB2YXIgc3RhY2sxLCBhbGlhczE9ZGVwdGgwICE9IG51bGwgPyBkZXB0aDAgOiB7fSwgYWxpYXMyPWhlbHBlcnMuaGVscGVyTWlzc2luZztcblxuICByZXR1cm4gXCIgICAgICAgIDx0ZXh0YXJlYSBjbGFzcz0nYm9keS10ZXh0YXJlYScgcmVhZG9ubHk9J3JlYWRvbmx5JyBuYW1lPSdcIlxuICAgICsgKChzdGFjazEgPSAoaGVscGVycy5zYW5pdGl6ZSB8fCAoZGVwdGgwICYmIGRlcHRoMC5zYW5pdGl6ZSkgfHwgYWxpYXMyKS5jYWxsKGFsaWFzMSwoZGVwdGgwICE9IG51bGwgPyBkZXB0aDAubmFtZSA6IGRlcHRoMCkse1wibmFtZVwiOlwic2FuaXRpemVcIixcImhhc2hcIjp7fSxcImRhdGFcIjpkYXRhfSkpICE9IG51bGwgPyBzdGFjazEgOiBcIlwiKVxuICAgICsgXCInIGlkPSdcIlxuICAgICsgKChzdGFjazEgPSAoaGVscGVycy5lc2NhcGUgfHwgKGRlcHRoMCAmJiBkZXB0aDAuZXNjYXBlKSB8fCBhbGlhczIpLmNhbGwoYWxpYXMxLChkZXB0aDAgIT0gbnVsbCA/IGRlcHRoMC52YWx1ZUlkIDogZGVwdGgwKSx7XCJuYW1lXCI6XCJlc2NhcGVcIixcImhhc2hcIjp7fSxcImRhdGFcIjpkYXRhfSkpICE9IG51bGwgPyBzdGFjazEgOiBcIlwiKVxuICAgICsgXCInPlwiXG4gICAgKyAoKHN0YWNrMSA9IChoZWxwZXJzLnNhbml0aXplIHx8IChkZXB0aDAgJiYgZGVwdGgwLnNhbml0aXplKSB8fCBhbGlhczIpLmNhbGwoYWxpYXMxLChkZXB0aDAgIT0gbnVsbCA/IGRlcHRoMFtcImRlZmF1bHRcIl0gOiBkZXB0aDApLHtcIm5hbWVcIjpcInNhbml0aXplXCIsXCJoYXNoXCI6e30sXCJkYXRhXCI6ZGF0YX0pKSAhPSBudWxsID8gc3RhY2sxIDogXCJcIilcbiAgICArIFwiPC90ZXh0YXJlYT5cXG4gICAgICAgIDxkaXYgY2xhc3M9XFxcInBhcmFtZXRlci1jb250ZW50LXR5cGVcXFwiIC8+XFxuXCI7XG59LFwiM1wiOmZ1bmN0aW9uKGNvbnRhaW5lcixkZXB0aDAsaGVscGVycyxwYXJ0aWFscyxkYXRhKSB7XG4gICAgdmFyIHN0YWNrMTtcblxuICByZXR1cm4gKChzdGFjazEgPSBoZWxwZXJzW1wiaWZcIl0uY2FsbChkZXB0aDAgIT0gbnVsbCA/IGRlcHRoMCA6IHt9LChkZXB0aDAgIT0gbnVsbCA/IGRlcHRoMFtcImRlZmF1bHRcIl0gOiBkZXB0aDApLHtcIm5hbWVcIjpcImlmXCIsXCJoYXNoXCI6e30sXCJmblwiOmNvbnRhaW5lci5wcm9ncmFtKDQsIGRhdGEsIDApLFwiaW52ZXJzZVwiOmNvbnRhaW5lci5wcm9ncmFtKDYsIGRhdGEsIDApLFwiZGF0YVwiOmRhdGF9KSkgIT0gbnVsbCA/IHN0YWNrMSA6IFwiXCIpO1xufSxcIjRcIjpmdW5jdGlvbihjb250YWluZXIsZGVwdGgwLGhlbHBlcnMscGFydGlhbHMsZGF0YSkge1xuICAgIHZhciBzdGFjazE7XG5cbiAgcmV0dXJuIFwiICAgICAgICAgICAgXCJcbiAgICArICgoc3RhY2sxID0gKGhlbHBlcnMuc2FuaXRpemUgfHwgKGRlcHRoMCAmJiBkZXB0aDAuc2FuaXRpemUpIHx8IGhlbHBlcnMuaGVscGVyTWlzc2luZykuY2FsbChkZXB0aDAgIT0gbnVsbCA/IGRlcHRoMCA6IHt9LChkZXB0aDAgIT0gbnVsbCA/IGRlcHRoMFtcImRlZmF1bHRcIl0gOiBkZXB0aDApLHtcIm5hbWVcIjpcInNhbml0aXplXCIsXCJoYXNoXCI6e30sXCJkYXRhXCI6ZGF0YX0pKSAhPSBudWxsID8gc3RhY2sxIDogXCJcIilcbiAgICArIFwiXFxuXCI7XG59LFwiNlwiOmZ1bmN0aW9uKGNvbnRhaW5lcixkZXB0aDAsaGVscGVycyxwYXJ0aWFscyxkYXRhKSB7XG4gICAgcmV0dXJuIFwiICAgICAgICAgICAgKGVtcHR5KVxcblwiO1xufSxcImNvbXBpbGVyXCI6WzcsXCI+PSA0LjAuMFwiXSxcIm1haW5cIjpmdW5jdGlvbihjb250YWluZXIsZGVwdGgwLGhlbHBlcnMscGFydGlhbHMsZGF0YSkge1xuICAgIHZhciBzdGFjazEsIGFsaWFzMT1kZXB0aDAgIT0gbnVsbCA/IGRlcHRoMCA6IHt9LCBhbGlhczI9aGVscGVycy5oZWxwZXJNaXNzaW5nO1xuXG4gIHJldHVybiBcIjx0ZCBjbGFzcz0nY29kZSc+PGxhYmVsIGZvcj0nXCJcbiAgICArICgoc3RhY2sxID0gKGhlbHBlcnMuZXNjYXBlIHx8IChkZXB0aDAgJiYgZGVwdGgwLmVzY2FwZSkgfHwgYWxpYXMyKS5jYWxsKGFsaWFzMSwoZGVwdGgwICE9IG51bGwgPyBkZXB0aDAudmFsdWVJZCA6IGRlcHRoMCkse1wibmFtZVwiOlwiZXNjYXBlXCIsXCJoYXNoXCI6e30sXCJkYXRhXCI6ZGF0YX0pKSAhPSBudWxsID8gc3RhY2sxIDogXCJcIilcbiAgICArIFwiJz5cIlxuICAgICsgKChzdGFjazEgPSAoaGVscGVycy5zYW5pdGl6ZSB8fCAoZGVwdGgwICYmIGRlcHRoMC5zYW5pdGl6ZSkgfHwgYWxpYXMyKS5jYWxsKGFsaWFzMSwoZGVwdGgwICE9IG51bGwgPyBkZXB0aDAubmFtZSA6IGRlcHRoMCkse1wibmFtZVwiOlwic2FuaXRpemVcIixcImhhc2hcIjp7fSxcImRhdGFcIjpkYXRhfSkpICE9IG51bGwgPyBzdGFjazEgOiBcIlwiKVxuICAgICsgXCI8L2xhYmVsPjwvdGQ+XFxuPHRkPlxcblwiXG4gICAgKyAoKHN0YWNrMSA9IGhlbHBlcnNbXCJpZlwiXS5jYWxsKGFsaWFzMSwoZGVwdGgwICE9IG51bGwgPyBkZXB0aDAuaXNCb2R5IDogZGVwdGgwKSx7XCJuYW1lXCI6XCJpZlwiLFwiaGFzaFwiOnt9LFwiZm5cIjpjb250YWluZXIucHJvZ3JhbSgxLCBkYXRhLCAwKSxcImludmVyc2VcIjpjb250YWluZXIucHJvZ3JhbSgzLCBkYXRhLCAwKSxcImRhdGFcIjpkYXRhfSkpICE9IG51bGwgPyBzdGFjazEgOiBcIlwiKVxuICAgICsgXCI8L3RkPlxcbjx0ZCBjbGFzcz1cXFwibWFya2Rvd25cXFwiPlwiXG4gICAgKyAoKHN0YWNrMSA9IChoZWxwZXJzLnNhbml0aXplIHx8IChkZXB0aDAgJiYgZGVwdGgwLnNhbml0aXplKSB8fCBhbGlhczIpLmNhbGwoYWxpYXMxLChkZXB0aDAgIT0gbnVsbCA/IGRlcHRoMC5kZXNjcmlwdGlvbiA6IGRlcHRoMCkse1wibmFtZVwiOlwic2FuaXRpemVcIixcImhhc2hcIjp7fSxcImRhdGFcIjpkYXRhfSkpICE9IG51bGwgPyBzdGFjazEgOiBcIlwiKVxuICAgICsgXCI8L3RkPlxcbjx0ZD5cIlxuICAgICsgKChzdGFjazEgPSAoaGVscGVycy5lc2NhcGUgfHwgKGRlcHRoMCAmJiBkZXB0aDAuZXNjYXBlKSB8fCBhbGlhczIpLmNhbGwoYWxpYXMxLChkZXB0aDAgIT0gbnVsbCA/IGRlcHRoMC5wYXJhbVR5cGUgOiBkZXB0aDApLHtcIm5hbWVcIjpcImVzY2FwZVwiLFwiaGFzaFwiOnt9LFwiZGF0YVwiOmRhdGF9KSkgIT0gbnVsbCA/IHN0YWNrMSA6IFwiXCIpXG4gICAgKyBcIjwvdGQ+XFxuPHRkPjxzcGFuIGNsYXNzPVxcXCJtb2RlbC1zaWduYXR1cmVcXFwiPjwvc3Bhbj48L3RkPlxcblwiO1xufSxcInVzZURhdGFcIjp0cnVlfSk7XG50ZW1wbGF0ZXNbJ3BhcmFtX3JlYWRvbmx5X3JlcXVpcmVkJ10gPSB0ZW1wbGF0ZSh7XCIxXCI6ZnVuY3Rpb24oY29udGFpbmVyLGRlcHRoMCxoZWxwZXJzLHBhcnRpYWxzLGRhdGEpIHtcbiAgICB2YXIgc3RhY2sxLCBhbGlhczE9ZGVwdGgwICE9IG51bGwgPyBkZXB0aDAgOiB7fSwgYWxpYXMyPWhlbHBlcnMuaGVscGVyTWlzc2luZztcblxuICByZXR1cm4gXCIgICAgICAgIDx0ZXh0YXJlYSBjbGFzcz0nYm9keS10ZXh0YXJlYScgcmVhZG9ubHk9J3JlYWRvbmx5JyBwbGFjZWhvbGRlcj0nKHJlcXVpcmVkKScgbmFtZT0nXCJcbiAgICArICgoc3RhY2sxID0gKGhlbHBlcnMuc2FuaXRpemUgfHwgKGRlcHRoMCAmJiBkZXB0aDAuc2FuaXRpemUpIHx8IGFsaWFzMikuY2FsbChhbGlhczEsKGRlcHRoMCAhPSBudWxsID8gZGVwdGgwLm5hbWUgOiBkZXB0aDApLHtcIm5hbWVcIjpcInNhbml0aXplXCIsXCJoYXNoXCI6e30sXCJkYXRhXCI6ZGF0YX0pKSAhPSBudWxsID8gc3RhY2sxIDogXCJcIilcbiAgICArIFwiJyBpZD0nXCJcbiAgICArICgoc3RhY2sxID0gKGhlbHBlcnMuZXNjYXBlIHx8IChkZXB0aDAgJiYgZGVwdGgwLmVzY2FwZSkgfHwgYWxpYXMyKS5jYWxsKGFsaWFzMSwoZGVwdGgwICE9IG51bGwgPyBkZXB0aDAudmFsdWVJZCA6IGRlcHRoMCkse1wibmFtZVwiOlwiZXNjYXBlXCIsXCJoYXNoXCI6e30sXCJkYXRhXCI6ZGF0YX0pKSAhPSBudWxsID8gc3RhY2sxIDogXCJcIilcbiAgICArIFwiJz5cIlxuICAgICsgKChzdGFjazEgPSAoaGVscGVycy5zYW5pdGl6ZSB8fCAoZGVwdGgwICYmIGRlcHRoMC5zYW5pdGl6ZSkgfHwgYWxpYXMyKS5jYWxsKGFsaWFzMSwoZGVwdGgwICE9IG51bGwgPyBkZXB0aDBbXCJkZWZhdWx0XCJdIDogZGVwdGgwKSx7XCJuYW1lXCI6XCJzYW5pdGl6ZVwiLFwiaGFzaFwiOnt9LFwiZGF0YVwiOmRhdGF9KSkgIT0gbnVsbCA/IHN0YWNrMSA6IFwiXCIpXG4gICAgKyBcIjwvdGV4dGFyZWE+XFxuXCI7XG59LFwiM1wiOmZ1bmN0aW9uKGNvbnRhaW5lcixkZXB0aDAsaGVscGVycyxwYXJ0aWFscyxkYXRhKSB7XG4gICAgdmFyIHN0YWNrMTtcblxuICByZXR1cm4gKChzdGFjazEgPSBoZWxwZXJzW1wiaWZcIl0uY2FsbChkZXB0aDAgIT0gbnVsbCA/IGRlcHRoMCA6IHt9LChkZXB0aDAgIT0gbnVsbCA/IGRlcHRoMFtcImRlZmF1bHRcIl0gOiBkZXB0aDApLHtcIm5hbWVcIjpcImlmXCIsXCJoYXNoXCI6e30sXCJmblwiOmNvbnRhaW5lci5wcm9ncmFtKDQsIGRhdGEsIDApLFwiaW52ZXJzZVwiOmNvbnRhaW5lci5wcm9ncmFtKDYsIGRhdGEsIDApLFwiZGF0YVwiOmRhdGF9KSkgIT0gbnVsbCA/IHN0YWNrMSA6IFwiXCIpO1xufSxcIjRcIjpmdW5jdGlvbihjb250YWluZXIsZGVwdGgwLGhlbHBlcnMscGFydGlhbHMsZGF0YSkge1xuICAgIHZhciBzdGFjazE7XG5cbiAgcmV0dXJuIFwiICAgICAgICAgICAgXCJcbiAgICArICgoc3RhY2sxID0gKGhlbHBlcnMuc2FuaXRpemUgfHwgKGRlcHRoMCAmJiBkZXB0aDAuc2FuaXRpemUpIHx8IGhlbHBlcnMuaGVscGVyTWlzc2luZykuY2FsbChkZXB0aDAgIT0gbnVsbCA/IGRlcHRoMCA6IHt9LChkZXB0aDAgIT0gbnVsbCA/IGRlcHRoMFtcImRlZmF1bHRcIl0gOiBkZXB0aDApLHtcIm5hbWVcIjpcInNhbml0aXplXCIsXCJoYXNoXCI6e30sXCJkYXRhXCI6ZGF0YX0pKSAhPSBudWxsID8gc3RhY2sxIDogXCJcIilcbiAgICArIFwiXFxuXCI7XG59LFwiNlwiOmZ1bmN0aW9uKGNvbnRhaW5lcixkZXB0aDAsaGVscGVycyxwYXJ0aWFscyxkYXRhKSB7XG4gICAgcmV0dXJuIFwiICAgICAgICAgICAgKGVtcHR5KVxcblwiO1xufSxcImNvbXBpbGVyXCI6WzcsXCI+PSA0LjAuMFwiXSxcIm1haW5cIjpmdW5jdGlvbihjb250YWluZXIsZGVwdGgwLGhlbHBlcnMscGFydGlhbHMsZGF0YSkge1xuICAgIHZhciBzdGFjazEsIGFsaWFzMT1kZXB0aDAgIT0gbnVsbCA/IGRlcHRoMCA6IHt9LCBhbGlhczI9aGVscGVycy5oZWxwZXJNaXNzaW5nO1xuXG4gIHJldHVybiBcIjx0ZCBjbGFzcz0nY29kZSByZXF1aXJlZCc+PGxhYmVsIGZvcj0nXCJcbiAgICArICgoc3RhY2sxID0gKGhlbHBlcnMuZXNjYXBlIHx8IChkZXB0aDAgJiYgZGVwdGgwLmVzY2FwZSkgfHwgYWxpYXMyKS5jYWxsKGFsaWFzMSwoZGVwdGgwICE9IG51bGwgPyBkZXB0aDAudmFsdWVJZCA6IGRlcHRoMCkse1wibmFtZVwiOlwiZXNjYXBlXCIsXCJoYXNoXCI6e30sXCJkYXRhXCI6ZGF0YX0pKSAhPSBudWxsID8gc3RhY2sxIDogXCJcIilcbiAgICArIFwiJz5cIlxuICAgICsgKChzdGFjazEgPSAoaGVscGVycy5zYW5pdGl6ZSB8fCAoZGVwdGgwICYmIGRlcHRoMC5zYW5pdGl6ZSkgfHwgYWxpYXMyKS5jYWxsKGFsaWFzMSwoZGVwdGgwICE9IG51bGwgPyBkZXB0aDAubmFtZSA6IGRlcHRoMCkse1wibmFtZVwiOlwic2FuaXRpemVcIixcImhhc2hcIjp7fSxcImRhdGFcIjpkYXRhfSkpICE9IG51bGwgPyBzdGFjazEgOiBcIlwiKVxuICAgICsgXCI8L2xhYmVsPjwvdGQ+XFxuPHRkPlxcblwiXG4gICAgKyAoKHN0YWNrMSA9IGhlbHBlcnNbXCJpZlwiXS5jYWxsKGFsaWFzMSwoZGVwdGgwICE9IG51bGwgPyBkZXB0aDAuaXNCb2R5IDogZGVwdGgwKSx7XCJuYW1lXCI6XCJpZlwiLFwiaGFzaFwiOnt9LFwiZm5cIjpjb250YWluZXIucHJvZ3JhbSgxLCBkYXRhLCAwKSxcImludmVyc2VcIjpjb250YWluZXIucHJvZ3JhbSgzLCBkYXRhLCAwKSxcImRhdGFcIjpkYXRhfSkpICE9IG51bGwgPyBzdGFjazEgOiBcIlwiKVxuICAgICsgXCI8L3RkPlxcbjx0ZCBjbGFzcz1cXFwibWFya2Rvd25cXFwiPlwiXG4gICAgKyAoKHN0YWNrMSA9IChoZWxwZXJzLnNhbml0aXplIHx8IChkZXB0aDAgJiYgZGVwdGgwLnNhbml0aXplKSB8fCBhbGlhczIpLmNhbGwoYWxpYXMxLChkZXB0aDAgIT0gbnVsbCA/IGRlcHRoMC5kZXNjcmlwdGlvbiA6IGRlcHRoMCkse1wibmFtZVwiOlwic2FuaXRpemVcIixcImhhc2hcIjp7fSxcImRhdGFcIjpkYXRhfSkpICE9IG51bGwgPyBzdGFjazEgOiBcIlwiKVxuICAgICsgXCI8L3RkPlxcbjx0ZD5cIlxuICAgICsgKChzdGFjazEgPSAoaGVscGVycy5lc2NhcGUgfHwgKGRlcHRoMCAmJiBkZXB0aDAuZXNjYXBlKSB8fCBhbGlhczIpLmNhbGwoYWxpYXMxLChkZXB0aDAgIT0gbnVsbCA/IGRlcHRoMC5wYXJhbVR5cGUgOiBkZXB0aDApLHtcIm5hbWVcIjpcImVzY2FwZVwiLFwiaGFzaFwiOnt9LFwiZGF0YVwiOmRhdGF9KSkgIT0gbnVsbCA/IHN0YWNrMSA6IFwiXCIpXG4gICAgKyBcIjwvdGQ+XFxuPHRkPjxzcGFuIGNsYXNzPVxcXCJtb2RlbC1zaWduYXR1cmVcXFwiPjwvc3Bhbj48L3RkPlxcblwiO1xufSxcInVzZURhdGFcIjp0cnVlfSk7XG50ZW1wbGF0ZXNbJ3BhcmFtX3JlcXVpcmVkJ10gPSB0ZW1wbGF0ZSh7XCIxXCI6ZnVuY3Rpb24oY29udGFpbmVyLGRlcHRoMCxoZWxwZXJzLHBhcnRpYWxzLGRhdGEpIHtcbiAgICB2YXIgc3RhY2sxO1xuXG4gIHJldHVybiAoKHN0YWNrMSA9IGhlbHBlcnNbXCJpZlwiXS5jYWxsKGRlcHRoMCAhPSBudWxsID8gZGVwdGgwIDoge30sKGRlcHRoMCAhPSBudWxsID8gZGVwdGgwLmlzRmlsZSA6IGRlcHRoMCkse1wibmFtZVwiOlwiaWZcIixcImhhc2hcIjp7fSxcImZuXCI6Y29udGFpbmVyLnByb2dyYW0oMiwgZGF0YSwgMCksXCJpbnZlcnNlXCI6Y29udGFpbmVyLnByb2dyYW0oNCwgZGF0YSwgMCksXCJkYXRhXCI6ZGF0YX0pKSAhPSBudWxsID8gc3RhY2sxIDogXCJcIik7XG59LFwiMlwiOmZ1bmN0aW9uKGNvbnRhaW5lcixkZXB0aDAsaGVscGVycyxwYXJ0aWFscyxkYXRhKSB7XG4gICAgdmFyIHN0YWNrMSwgYWxpYXMxPWRlcHRoMCAhPSBudWxsID8gZGVwdGgwIDoge30sIGFsaWFzMj1oZWxwZXJzLmhlbHBlck1pc3Npbmc7XG5cbiAgcmV0dXJuIFwiXHRcdFx0PGlucHV0IHR5cGU9XFxcImZpbGVcXFwiIG5hbWU9J1wiXG4gICAgKyAoKHN0YWNrMSA9IChoZWxwZXJzLmVzY2FwZSB8fCAoZGVwdGgwICYmIGRlcHRoMC5lc2NhcGUpIHx8IGFsaWFzMikuY2FsbChhbGlhczEsKGRlcHRoMCAhPSBudWxsID8gZGVwdGgwLm5hbWUgOiBkZXB0aDApLHtcIm5hbWVcIjpcImVzY2FwZVwiLFwiaGFzaFwiOnt9LFwiZGF0YVwiOmRhdGF9KSkgIT0gbnVsbCA/IHN0YWNrMSA6IFwiXCIpXG4gICAgKyBcIicgaWQ9J1wiXG4gICAgKyAoKHN0YWNrMSA9IChoZWxwZXJzLmVzY2FwZSB8fCAoZGVwdGgwICYmIGRlcHRoMC5lc2NhcGUpIHx8IGFsaWFzMikuY2FsbChhbGlhczEsKGRlcHRoMCAhPSBudWxsID8gZGVwdGgwLnZhbHVlSWQgOiBkZXB0aDApLHtcIm5hbWVcIjpcImVzY2FwZVwiLFwiaGFzaFwiOnt9LFwiZGF0YVwiOmRhdGF9KSkgIT0gbnVsbCA/IHN0YWNrMSA6IFwiXCIpXG4gICAgKyBcIicvPlxcblwiO1xufSxcIjRcIjpmdW5jdGlvbihjb250YWluZXIsZGVwdGgwLGhlbHBlcnMscGFydGlhbHMsZGF0YSkge1xuICAgIHZhciBzdGFjazE7XG5cbiAgcmV0dXJuICgoc3RhY2sxID0gaGVscGVyc1tcImlmXCJdLmNhbGwoZGVwdGgwICE9IG51bGwgPyBkZXB0aDAgOiB7fSwoZGVwdGgwICE9IG51bGwgPyBkZXB0aDBbXCJkZWZhdWx0XCJdIDogZGVwdGgwKSx7XCJuYW1lXCI6XCJpZlwiLFwiaGFzaFwiOnt9LFwiZm5cIjpjb250YWluZXIucHJvZ3JhbSg1LCBkYXRhLCAwKSxcImludmVyc2VcIjpjb250YWluZXIucHJvZ3JhbSg3LCBkYXRhLCAwKSxcImRhdGFcIjpkYXRhfSkpICE9IG51bGwgPyBzdGFjazEgOiBcIlwiKTtcbn0sXCI1XCI6ZnVuY3Rpb24oY29udGFpbmVyLGRlcHRoMCxoZWxwZXJzLHBhcnRpYWxzLGRhdGEpIHtcbiAgICB2YXIgc3RhY2sxLCBhbGlhczE9ZGVwdGgwICE9IG51bGwgPyBkZXB0aDAgOiB7fSwgYWxpYXMyPWhlbHBlcnMuaGVscGVyTWlzc2luZztcblxuICByZXR1cm4gXCJcdFx0XHRcdDxkaXYgY2xhc3M9XFxcImVkaXRvcl9ob2xkZXJcXFwiPjwvZGl2Plxcblx0XHRcdFx0PHRleHRhcmVhIGNsYXNzPSdib2R5LXRleHRhcmVhIHJlcXVpcmVkJyBwbGFjZWhvbGRlcj0nKHJlcXVpcmVkKScgbmFtZT0nXCJcbiAgICArICgoc3RhY2sxID0gKGhlbHBlcnMuc2FuaXRpemUgfHwgKGRlcHRoMCAmJiBkZXB0aDAuc2FuaXRpemUpIHx8IGFsaWFzMikuY2FsbChhbGlhczEsKGRlcHRoMCAhPSBudWxsID8gZGVwdGgwLm5hbWUgOiBkZXB0aDApLHtcIm5hbWVcIjpcInNhbml0aXplXCIsXCJoYXNoXCI6e30sXCJkYXRhXCI6ZGF0YX0pKSAhPSBudWxsID8gc3RhY2sxIDogXCJcIilcbiAgICArIFwiJyBpZD1cXFwiXCJcbiAgICArICgoc3RhY2sxID0gKGhlbHBlcnMuZXNjYXBlIHx8IChkZXB0aDAgJiYgZGVwdGgwLmVzY2FwZSkgfHwgYWxpYXMyKS5jYWxsKGFsaWFzMSwoZGVwdGgwICE9IG51bGwgPyBkZXB0aDAudmFsdWVJZCA6IGRlcHRoMCkse1wibmFtZVwiOlwiZXNjYXBlXCIsXCJoYXNoXCI6e30sXCJkYXRhXCI6ZGF0YX0pKSAhPSBudWxsID8gc3RhY2sxIDogXCJcIilcbiAgICArIFwiXFxcIj5cIlxuICAgICsgKChzdGFjazEgPSAoaGVscGVycy5zYW5pdGl6ZSB8fCAoZGVwdGgwICYmIGRlcHRoMC5zYW5pdGl6ZSkgfHwgYWxpYXMyKS5jYWxsKGFsaWFzMSwoZGVwdGgwICE9IG51bGwgPyBkZXB0aDBbXCJkZWZhdWx0XCJdIDogZGVwdGgwKSx7XCJuYW1lXCI6XCJzYW5pdGl6ZVwiLFwiaGFzaFwiOnt9LFwiZGF0YVwiOmRhdGF9KSkgIT0gbnVsbCA/IHN0YWNrMSA6IFwiXCIpXG4gICAgKyBcIjwvdGV4dGFyZWE+XFxuICAgICAgICA8YnIgLz5cXG4gICAgICAgIDxkaXYgY2xhc3M9XFxcInBhcmFtZXRlci1jb250ZW50LXR5cGVcXFwiIC8+XFxuXCI7XG59LFwiN1wiOmZ1bmN0aW9uKGNvbnRhaW5lcixkZXB0aDAsaGVscGVycyxwYXJ0aWFscyxkYXRhKSB7XG4gICAgdmFyIHN0YWNrMSwgYWxpYXMxPWRlcHRoMCAhPSBudWxsID8gZGVwdGgwIDoge30sIGFsaWFzMj1oZWxwZXJzLmhlbHBlck1pc3Npbmc7XG5cbiAgcmV0dXJuIFwiXHRcdFx0XHQ8dGV4dGFyZWEgY2xhc3M9J2JvZHktdGV4dGFyZWEgcmVxdWlyZWQnIHBsYWNlaG9sZGVyPScocmVxdWlyZWQpJyBuYW1lPSdcIlxuICAgICsgKChzdGFjazEgPSAoaGVscGVycy5zYW5pdGl6ZSB8fCAoZGVwdGgwICYmIGRlcHRoMC5zYW5pdGl6ZSkgfHwgYWxpYXMyKS5jYWxsKGFsaWFzMSwoZGVwdGgwICE9IG51bGwgPyBkZXB0aDAubmFtZSA6IGRlcHRoMCkse1wibmFtZVwiOlwic2FuaXRpemVcIixcImhhc2hcIjp7fSxcImRhdGFcIjpkYXRhfSkpICE9IG51bGwgPyBzdGFjazEgOiBcIlwiKVxuICAgICsgXCInIGlkPSdcIlxuICAgICsgKChzdGFjazEgPSAoaGVscGVycy5lc2NhcGUgfHwgKGRlcHRoMCAmJiBkZXB0aDAuZXNjYXBlKSB8fCBhbGlhczIpLmNhbGwoYWxpYXMxLChkZXB0aDAgIT0gbnVsbCA/IGRlcHRoMC52YWx1ZUlkIDogZGVwdGgwKSx7XCJuYW1lXCI6XCJlc2NhcGVcIixcImhhc2hcIjp7fSxcImRhdGFcIjpkYXRhfSkpICE9IG51bGwgPyBzdGFjazEgOiBcIlwiKVxuICAgICsgXCInPjwvdGV4dGFyZWE+XFxuXHRcdFx0XHQ8ZGl2IGNsYXNzPVxcXCJlZGl0b3JfaG9sZGVyXFxcIj48L2Rpdj5cXG5cdFx0XHRcdDxiciAvPlxcblx0XHRcdFx0PGRpdiBjbGFzcz1cXFwicGFyYW1ldGVyLWNvbnRlbnQtdHlwZVxcXCIgLz5cXG5cIjtcbn0sXCI5XCI6ZnVuY3Rpb24oY29udGFpbmVyLGRlcHRoMCxoZWxwZXJzLHBhcnRpYWxzLGRhdGEpIHtcbiAgICB2YXIgc3RhY2sxO1xuXG4gIHJldHVybiAoKHN0YWNrMSA9IGhlbHBlcnNbXCJpZlwiXS5jYWxsKGRlcHRoMCAhPSBudWxsID8gZGVwdGgwIDoge30sKGRlcHRoMCAhPSBudWxsID8gZGVwdGgwLmlzRmlsZSA6IGRlcHRoMCkse1wibmFtZVwiOlwiaWZcIixcImhhc2hcIjp7fSxcImZuXCI6Y29udGFpbmVyLnByb2dyYW0oMTAsIGRhdGEsIDApLFwiaW52ZXJzZVwiOmNvbnRhaW5lci5wcm9ncmFtKDEyLCBkYXRhLCAwKSxcImRhdGFcIjpkYXRhfSkpICE9IG51bGwgPyBzdGFjazEgOiBcIlwiKTtcbn0sXCIxMFwiOmZ1bmN0aW9uKGNvbnRhaW5lcixkZXB0aDAsaGVscGVycyxwYXJ0aWFscyxkYXRhKSB7XG4gICAgdmFyIHN0YWNrMSwgYWxpYXMxPWRlcHRoMCAhPSBudWxsID8gZGVwdGgwIDoge30sIGFsaWFzMj1oZWxwZXJzLmhlbHBlck1pc3Npbmc7XG5cbiAgcmV0dXJuIFwiXHRcdFx0PGlucHV0IGNsYXNzPSdwYXJhbWV0ZXIgcmVxdWlyZWQnIHR5cGU9J2ZpbGUnIG5hbWU9J1wiXG4gICAgKyAoKHN0YWNrMSA9IChoZWxwZXJzLnNhbml0aXplIHx8IChkZXB0aDAgJiYgZGVwdGgwLnNhbml0aXplKSB8fCBhbGlhczIpLmNhbGwoYWxpYXMxLChkZXB0aDAgIT0gbnVsbCA/IGRlcHRoMC5uYW1lIDogZGVwdGgwKSx7XCJuYW1lXCI6XCJzYW5pdGl6ZVwiLFwiaGFzaFwiOnt9LFwiZGF0YVwiOmRhdGF9KSkgIT0gbnVsbCA/IHN0YWNrMSA6IFwiXCIpXG4gICAgKyBcIicgaWQ9J1wiXG4gICAgKyAoKHN0YWNrMSA9IChoZWxwZXJzLmVzY2FwZSB8fCAoZGVwdGgwICYmIGRlcHRoMC5lc2NhcGUpIHx8IGFsaWFzMikuY2FsbChhbGlhczEsKGRlcHRoMCAhPSBudWxsID8gZGVwdGgwLnZhbHVlSWQgOiBkZXB0aDApLHtcIm5hbWVcIjpcImVzY2FwZVwiLFwiaGFzaFwiOnt9LFwiZGF0YVwiOmRhdGF9KSkgIT0gbnVsbCA/IHN0YWNrMSA6IFwiXCIpXG4gICAgKyBcIicvPlxcblwiO1xufSxcIjEyXCI6ZnVuY3Rpb24oY29udGFpbmVyLGRlcHRoMCxoZWxwZXJzLHBhcnRpYWxzLGRhdGEpIHtcbiAgICB2YXIgc3RhY2sxO1xuXG4gIHJldHVybiAoKHN0YWNrMSA9IChoZWxwZXJzLnJlbmRlclRleHRQYXJhbSB8fCAoZGVwdGgwICYmIGRlcHRoMC5yZW5kZXJUZXh0UGFyYW0pIHx8IGhlbHBlcnMuaGVscGVyTWlzc2luZykuY2FsbChkZXB0aDAgIT0gbnVsbCA/IGRlcHRoMCA6IHt9LGRlcHRoMCx7XCJuYW1lXCI6XCJyZW5kZXJUZXh0UGFyYW1cIixcImhhc2hcIjp7fSxcImZuXCI6Y29udGFpbmVyLnByb2dyYW0oMTMsIGRhdGEsIDApLFwiaW52ZXJzZVwiOmNvbnRhaW5lci5ub29wLFwiZGF0YVwiOmRhdGF9KSkgIT0gbnVsbCA/IHN0YWNrMSA6IFwiXCIpO1xufSxcIjEzXCI6ZnVuY3Rpb24oY29udGFpbmVyLGRlcHRoMCxoZWxwZXJzLHBhcnRpYWxzLGRhdGEpIHtcbiAgICByZXR1cm4gXCJcIjtcbn0sXCJjb21waWxlclwiOls3LFwiPj0gNC4wLjBcIl0sXCJtYWluXCI6ZnVuY3Rpb24oY29udGFpbmVyLGRlcHRoMCxoZWxwZXJzLHBhcnRpYWxzLGRhdGEpIHtcbiAgICB2YXIgc3RhY2sxLCBhbGlhczE9ZGVwdGgwICE9IG51bGwgPyBkZXB0aDAgOiB7fSwgYWxpYXMyPWhlbHBlcnMuaGVscGVyTWlzc2luZztcblxuICByZXR1cm4gXCI8dGQgY2xhc3M9J2NvZGUgcmVxdWlyZWQnPjxsYWJlbCBmb3I9J1wiXG4gICAgKyAoKHN0YWNrMSA9IChoZWxwZXJzLmVzY2FwZSB8fCAoZGVwdGgwICYmIGRlcHRoMC5lc2NhcGUpIHx8IGFsaWFzMikuY2FsbChhbGlhczEsKGRlcHRoMCAhPSBudWxsID8gZGVwdGgwLnZhbHVlSWQgOiBkZXB0aDApLHtcIm5hbWVcIjpcImVzY2FwZVwiLFwiaGFzaFwiOnt9LFwiZGF0YVwiOmRhdGF9KSkgIT0gbnVsbCA/IHN0YWNrMSA6IFwiXCIpXG4gICAgKyBcIic+XCJcbiAgICArICgoc3RhY2sxID0gKGhlbHBlcnMuZXNjYXBlIHx8IChkZXB0aDAgJiYgZGVwdGgwLmVzY2FwZSkgfHwgYWxpYXMyKS5jYWxsKGFsaWFzMSwoZGVwdGgwICE9IG51bGwgPyBkZXB0aDAubmFtZSA6IGRlcHRoMCkse1wibmFtZVwiOlwiZXNjYXBlXCIsXCJoYXNoXCI6e30sXCJkYXRhXCI6ZGF0YX0pKSAhPSBudWxsID8gc3RhY2sxIDogXCJcIilcbiAgICArIFwiPC9sYWJlbD48L3RkPlxcbjx0ZD5cXG5cIlxuICAgICsgKChzdGFjazEgPSBoZWxwZXJzW1wiaWZcIl0uY2FsbChhbGlhczEsKGRlcHRoMCAhPSBudWxsID8gZGVwdGgwLmlzQm9keSA6IGRlcHRoMCkse1wibmFtZVwiOlwiaWZcIixcImhhc2hcIjp7fSxcImZuXCI6Y29udGFpbmVyLnByb2dyYW0oMSwgZGF0YSwgMCksXCJpbnZlcnNlXCI6Y29udGFpbmVyLnByb2dyYW0oOSwgZGF0YSwgMCksXCJkYXRhXCI6ZGF0YX0pKSAhPSBudWxsID8gc3RhY2sxIDogXCJcIilcbiAgICArIFwiPC90ZD5cXG48dGQ+XFxuXHQ8c3Ryb25nPjxzcGFuIGNsYXNzPVxcXCJtYXJrZG93blxcXCI+XCJcbiAgICArICgoc3RhY2sxID0gKGhlbHBlcnMuc2FuaXRpemUgfHwgKGRlcHRoMCAmJiBkZXB0aDAuc2FuaXRpemUpIHx8IGFsaWFzMikuY2FsbChhbGlhczEsKGRlcHRoMCAhPSBudWxsID8gZGVwdGgwLmRlc2NyaXB0aW9uIDogZGVwdGgwKSx7XCJuYW1lXCI6XCJzYW5pdGl6ZVwiLFwiaGFzaFwiOnt9LFwiZGF0YVwiOmRhdGF9KSkgIT0gbnVsbCA/IHN0YWNrMSA6IFwiXCIpXG4gICAgKyBcIjwvc3Bhbj48L3N0cm9uZz5cXG48L3RkPlxcbjx0ZD5cIlxuICAgICsgKChzdGFjazEgPSAoaGVscGVycy5lc2NhcGUgfHwgKGRlcHRoMCAmJiBkZXB0aDAuZXNjYXBlKSB8fCBhbGlhczIpLmNhbGwoYWxpYXMxLChkZXB0aDAgIT0gbnVsbCA/IGRlcHRoMC5wYXJhbVR5cGUgOiBkZXB0aDApLHtcIm5hbWVcIjpcImVzY2FwZVwiLFwiaGFzaFwiOnt9LFwiZGF0YVwiOmRhdGF9KSkgIT0gbnVsbCA/IHN0YWNrMSA6IFwiXCIpXG4gICAgKyBcIjwvdGQ+XFxuPHRkPjxzcGFuIGNsYXNzPVxcXCJtb2RlbC1zaWduYXR1cmVcXFwiPjwvc3Bhbj48L3RkPlxcblwiO1xufSxcInVzZURhdGFcIjp0cnVlfSk7XG50ZW1wbGF0ZXNbJ3BhcmFtZXRlcl9jb250ZW50X3R5cGUnXSA9IHRlbXBsYXRlKHtcIjFcIjpmdW5jdGlvbihjb250YWluZXIsZGVwdGgwLGhlbHBlcnMscGFydGlhbHMsZGF0YSkge1xuICAgIHZhciBzdGFjazE7XG5cbiAgcmV0dXJuICgoc3RhY2sxID0gaGVscGVycy5lYWNoLmNhbGwoZGVwdGgwICE9IG51bGwgPyBkZXB0aDAgOiB7fSwoZGVwdGgwICE9IG51bGwgPyBkZXB0aDAuY29uc3VtZXMgOiBkZXB0aDApLHtcIm5hbWVcIjpcImVhY2hcIixcImhhc2hcIjp7fSxcImZuXCI6Y29udGFpbmVyLnByb2dyYW0oMiwgZGF0YSwgMCksXCJpbnZlcnNlXCI6Y29udGFpbmVyLm5vb3AsXCJkYXRhXCI6ZGF0YX0pKSAhPSBudWxsID8gc3RhY2sxIDogXCJcIik7XG59LFwiMlwiOmZ1bmN0aW9uKGNvbnRhaW5lcixkZXB0aDAsaGVscGVycyxwYXJ0aWFscyxkYXRhKSB7XG4gICAgdmFyIHN0YWNrMSwgYWxpYXMxPWRlcHRoMCAhPSBudWxsID8gZGVwdGgwIDoge30sIGFsaWFzMj1oZWxwZXJzLmhlbHBlck1pc3Npbmc7XG5cbiAgcmV0dXJuIFwiICA8b3B0aW9uIHZhbHVlPVxcXCJcIlxuICAgICsgKChzdGFjazEgPSAoaGVscGVycy5zYW5pdGl6ZSB8fCAoZGVwdGgwICYmIGRlcHRoMC5zYW5pdGl6ZSkgfHwgYWxpYXMyKS5jYWxsKGFsaWFzMSxkZXB0aDAse1wibmFtZVwiOlwic2FuaXRpemVcIixcImhhc2hcIjp7fSxcImRhdGFcIjpkYXRhfSkpICE9IG51bGwgPyBzdGFjazEgOiBcIlwiKVxuICAgICsgXCJcXFwiPlwiXG4gICAgKyAoKHN0YWNrMSA9IChoZWxwZXJzLnNhbml0aXplIHx8IChkZXB0aDAgJiYgZGVwdGgwLnNhbml0aXplKSB8fCBhbGlhczIpLmNhbGwoYWxpYXMxLGRlcHRoMCx7XCJuYW1lXCI6XCJzYW5pdGl6ZVwiLFwiaGFzaFwiOnt9LFwiZGF0YVwiOmRhdGF9KSkgIT0gbnVsbCA/IHN0YWNrMSA6IFwiXCIpXG4gICAgKyBcIjwvb3B0aW9uPlxcblwiO1xufSxcIjRcIjpmdW5jdGlvbihjb250YWluZXIsZGVwdGgwLGhlbHBlcnMscGFydGlhbHMsZGF0YSkge1xuICAgIHJldHVybiBcIiAgPG9wdGlvbiB2YWx1ZT1cXFwiYXBwbGljYXRpb24vanNvblxcXCI+YXBwbGljYXRpb24vanNvbjwvb3B0aW9uPlxcblwiO1xufSxcImNvbXBpbGVyXCI6WzcsXCI+PSA0LjAuMFwiXSxcIm1haW5cIjpmdW5jdGlvbihjb250YWluZXIsZGVwdGgwLGhlbHBlcnMscGFydGlhbHMsZGF0YSkge1xuICAgIHZhciBzdGFjazEsIGhlbHBlciwgYWxpYXMxPWRlcHRoMCAhPSBudWxsID8gZGVwdGgwIDoge30sIGFsaWFzMj1oZWxwZXJzLmhlbHBlck1pc3Npbmc7XG5cbiAgcmV0dXJuIFwiPGxhYmVsIGZvcj1cXFwiXCJcbiAgICArIGNvbnRhaW5lci5lc2NhcGVFeHByZXNzaW9uKCgoaGVscGVyID0gKGhlbHBlciA9IGhlbHBlcnMucGFyYW1ldGVyQ29udGVudFR5cGVJZCB8fCAoZGVwdGgwICE9IG51bGwgPyBkZXB0aDAucGFyYW1ldGVyQ29udGVudFR5cGVJZCA6IGRlcHRoMCkpICE9IG51bGwgPyBoZWxwZXIgOiBhbGlhczIpLCh0eXBlb2YgaGVscGVyID09PSBcImZ1bmN0aW9uXCIgPyBoZWxwZXIuY2FsbChhbGlhczEse1wibmFtZVwiOlwicGFyYW1ldGVyQ29udGVudFR5cGVJZFwiLFwiaGFzaFwiOnt9LFwiZGF0YVwiOmRhdGF9KSA6IGhlbHBlcikpKVxuICAgICsgXCJcXFwiIGRhdGEtc3ctdHJhbnNsYXRlPlBhcmFtZXRlciBjb250ZW50IHR5cGU6PC9sYWJlbD5cXG48c2VsZWN0IG5hbWU9XFxcInBhcmFtZXRlckNvbnRlbnRUeXBlXFxcIiBpZD1cXFwiXCJcbiAgICArICgoc3RhY2sxID0gKGhlbHBlcnMuc2FuaXRpemUgfHwgKGRlcHRoMCAmJiBkZXB0aDAuc2FuaXRpemUpIHx8IGFsaWFzMikuY2FsbChhbGlhczEsKGRlcHRoMCAhPSBudWxsID8gZGVwdGgwLnBhcmFtZXRlckNvbnRlbnRUeXBlSWQgOiBkZXB0aDApLHtcIm5hbWVcIjpcInNhbml0aXplXCIsXCJoYXNoXCI6e30sXCJkYXRhXCI6ZGF0YX0pKSAhPSBudWxsID8gc3RhY2sxIDogXCJcIilcbiAgICArIFwiXFxcIj5cXG5cIlxuICAgICsgKChzdGFjazEgPSBoZWxwZXJzW1wiaWZcIl0uY2FsbChhbGlhczEsKGRlcHRoMCAhPSBudWxsID8gZGVwdGgwLmNvbnN1bWVzIDogZGVwdGgwKSx7XCJuYW1lXCI6XCJpZlwiLFwiaGFzaFwiOnt9LFwiZm5cIjpjb250YWluZXIucHJvZ3JhbSgxLCBkYXRhLCAwKSxcImludmVyc2VcIjpjb250YWluZXIucHJvZ3JhbSg0LCBkYXRhLCAwKSxcImRhdGFcIjpkYXRhfSkpICE9IG51bGwgPyBzdGFjazEgOiBcIlwiKVxuICAgICsgXCI8L3NlbGVjdD5cXG5cIjtcbn0sXCJ1c2VEYXRhXCI6dHJ1ZX0pO1xudGVtcGxhdGVzWydwb3B1cCddID0gdGVtcGxhdGUoe1wiY29tcGlsZXJcIjpbNyxcIj49IDQuMC4wXCJdLFwibWFpblwiOmZ1bmN0aW9uKGNvbnRhaW5lcixkZXB0aDAsaGVscGVycyxwYXJ0aWFscyxkYXRhKSB7XG4gICAgdmFyIGhlbHBlcjtcblxuICByZXR1cm4gXCI8ZGl2IGNsYXNzPVxcXCJhcGktcG9wdXAtZGlhbG9nLXdyYXBwZXJcXFwiPlxcbiAgICA8ZGl2IGNsYXNzPVxcXCJhcGktcG9wdXAtdGl0bGVcXFwiPlwiXG4gICAgKyBjb250YWluZXIuZXNjYXBlRXhwcmVzc2lvbigoKGhlbHBlciA9IChoZWxwZXIgPSBoZWxwZXJzLnRpdGxlIHx8IChkZXB0aDAgIT0gbnVsbCA/IGRlcHRoMC50aXRsZSA6IGRlcHRoMCkpICE9IG51bGwgPyBoZWxwZXIgOiBoZWxwZXJzLmhlbHBlck1pc3NpbmcpLCh0eXBlb2YgaGVscGVyID09PSBcImZ1bmN0aW9uXCIgPyBoZWxwZXIuY2FsbChkZXB0aDAgIT0gbnVsbCA/IGRlcHRoMCA6IHt9LHtcIm5hbWVcIjpcInRpdGxlXCIsXCJoYXNoXCI6e30sXCJkYXRhXCI6ZGF0YX0pIDogaGVscGVyKSkpXG4gICAgKyBcIjwvZGl2PlxcbiAgICA8ZGl2IGNsYXNzPVxcXCJhcGktcG9wdXAtY29udGVudFxcXCI+PC9kaXY+XFxuICAgIDxwIGNsYXNzPVxcXCJlcnJvci1tc2dcXFwiPjwvcD5cXG4gICAgPGRpdiBjbGFzcz1cXFwiYXBpLXBvcHVwLWFjdGlvbnNcXFwiPlxcbiAgICAgICAgPGJ1dHRvbiBjbGFzcz1cXFwiYXBpLXBvcHVwLWNhbmNlbCBhcGktYnV0dG9uIGdyYXlcXFwiIHR5cGU9XFxcImJ1dHRvblxcXCI+Q2FuY2VsPC9idXR0b24+XFxuICAgIDwvZGl2PlxcbjwvZGl2PlxcbjxkaXYgY2xhc3M9XFxcImFwaS1wb3B1cC1kaWFsb2ctc2hhZG93XFxcIj48L2Rpdj5cIjtcbn0sXCJ1c2VEYXRhXCI6dHJ1ZX0pO1xudGVtcGxhdGVzWydyZXNvdXJjZSddID0gdGVtcGxhdGUoe1wiMVwiOmZ1bmN0aW9uKGNvbnRhaW5lcixkZXB0aDAsaGVscGVycyxwYXJ0aWFscyxkYXRhKSB7XG4gICAgcmV0dXJuIFwiIDogXCI7XG59LFwiM1wiOmZ1bmN0aW9uKGNvbnRhaW5lcixkZXB0aDAsaGVscGVycyxwYXJ0aWFscyxkYXRhKSB7XG4gICAgdmFyIHN0YWNrMTtcblxuICByZXR1cm4gXCIgICAgPGxpPlxcbiAgICAgIDxhIGhyZWY9J1wiXG4gICAgKyAoKHN0YWNrMSA9IChoZWxwZXJzLnNhbml0aXplIHx8IChkZXB0aDAgJiYgZGVwdGgwLnNhbml0aXplKSB8fCBoZWxwZXJzLmhlbHBlck1pc3NpbmcpLmNhbGwoZGVwdGgwICE9IG51bGwgPyBkZXB0aDAgOiB7fSwoZGVwdGgwICE9IG51bGwgPyBkZXB0aDAudXJsIDogZGVwdGgwKSx7XCJuYW1lXCI6XCJzYW5pdGl6ZVwiLFwiaGFzaFwiOnt9LFwiZGF0YVwiOmRhdGF9KSkgIT0gbnVsbCA/IHN0YWNrMSA6IFwiXCIpXG4gICAgKyBcIicgZGF0YS1zdy10cmFuc2xhdGU+UmF3PC9hPlxcbiAgICA8L2xpPlxcblwiO1xufSxcImNvbXBpbGVyXCI6WzcsXCI+PSA0LjAuMFwiXSxcIm1haW5cIjpmdW5jdGlvbihjb250YWluZXIsZGVwdGgwLGhlbHBlcnMscGFydGlhbHMsZGF0YSkge1xuICAgIHZhciBzdGFjazEsIGhlbHBlciwgb3B0aW9ucywgYWxpYXMxPWRlcHRoMCAhPSBudWxsID8gZGVwdGgwIDoge30sIGFsaWFzMj1oZWxwZXJzLmhlbHBlck1pc3NpbmcsIGJ1ZmZlciA9IFxuICBcIjxkaXYgY2xhc3M9J2hlYWRpbmcnPlxcbiAgPGgyPlxcbiAgICA8YSBocmVmPScjIS9cIlxuICAgICsgKChzdGFjazEgPSAoaGVscGVycy5zYW5pdGl6ZSB8fCAoZGVwdGgwICYmIGRlcHRoMC5zYW5pdGl6ZSkgfHwgYWxpYXMyKS5jYWxsKGFsaWFzMSwoZGVwdGgwICE9IG51bGwgPyBkZXB0aDAuaWQgOiBkZXB0aDApLHtcIm5hbWVcIjpcInNhbml0aXplXCIsXCJoYXNoXCI6e30sXCJkYXRhXCI6ZGF0YX0pKSAhPSBudWxsID8gc3RhY2sxIDogXCJcIilcbiAgICArIFwiJyBjbGFzcz1cXFwidG9nZ2xlRW5kcG9pbnRMaXN0XFxcIiBkYXRhLWlkPVxcXCJcIlxuICAgICsgKChzdGFjazEgPSAoaGVscGVycy5zYW5pdGl6ZSB8fCAoZGVwdGgwICYmIGRlcHRoMC5zYW5pdGl6ZSkgfHwgYWxpYXMyKS5jYWxsKGFsaWFzMSwoZGVwdGgwICE9IG51bGwgPyBkZXB0aDAuaWQgOiBkZXB0aDApLHtcIm5hbWVcIjpcInNhbml0aXplXCIsXCJoYXNoXCI6e30sXCJkYXRhXCI6ZGF0YX0pKSAhPSBudWxsID8gc3RhY2sxIDogXCJcIilcbiAgICArIFwiXFxcIj5cIlxuICAgICsgKChzdGFjazEgPSAoaGVscGVycy5zYW5pdGl6ZSB8fCAoZGVwdGgwICYmIGRlcHRoMC5zYW5pdGl6ZSkgfHwgYWxpYXMyKS5jYWxsKGFsaWFzMSwoZGVwdGgwICE9IG51bGwgPyBkZXB0aDAubmFtZSA6IGRlcHRoMCkse1wibmFtZVwiOlwic2FuaXRpemVcIixcImhhc2hcIjp7fSxcImRhdGFcIjpkYXRhfSkpICE9IG51bGwgPyBzdGFjazEgOiBcIlwiKVxuICAgICsgXCI8L2E+IFwiO1xuICBzdGFjazEgPSAoKGhlbHBlciA9IChoZWxwZXIgPSBoZWxwZXJzLnN1bW1hcnkgfHwgKGRlcHRoMCAhPSBudWxsID8gZGVwdGgwLnN1bW1hcnkgOiBkZXB0aDApKSAhPSBudWxsID8gaGVscGVyIDogYWxpYXMyKSwob3B0aW9ucz17XCJuYW1lXCI6XCJzdW1tYXJ5XCIsXCJoYXNoXCI6e30sXCJmblwiOmNvbnRhaW5lci5wcm9ncmFtKDEsIGRhdGEsIDApLFwiaW52ZXJzZVwiOmNvbnRhaW5lci5ub29wLFwiZGF0YVwiOmRhdGF9KSwodHlwZW9mIGhlbHBlciA9PT0gXCJmdW5jdGlvblwiID8gaGVscGVyLmNhbGwoYWxpYXMxLG9wdGlvbnMpIDogaGVscGVyKSk7XG4gIGlmICghaGVscGVycy5zdW1tYXJ5KSB7IHN0YWNrMSA9IGhlbHBlcnMuYmxvY2tIZWxwZXJNaXNzaW5nLmNhbGwoZGVwdGgwLHN0YWNrMSxvcHRpb25zKX1cbiAgaWYgKHN0YWNrMSAhPSBudWxsKSB7IGJ1ZmZlciArPSBzdGFjazE7IH1cbiAgcmV0dXJuIGJ1ZmZlciArICgoc3RhY2sxID0gKGhlbHBlcnMuc2FuaXRpemUgfHwgKGRlcHRoMCAmJiBkZXB0aDAuc2FuaXRpemUpIHx8IGFsaWFzMikuY2FsbChhbGlhczEsKGRlcHRoMCAhPSBudWxsID8gZGVwdGgwLnN1bW1hcnkgOiBkZXB0aDApLHtcIm5hbWVcIjpcInNhbml0aXplXCIsXCJoYXNoXCI6e30sXCJkYXRhXCI6ZGF0YX0pKSAhPSBudWxsID8gc3RhY2sxIDogXCJcIilcbiAgICArIFwiXFxuICA8L2gyPlxcbiAgPHVsIGNsYXNzPSdvcHRpb25zJz5cXG4gICAgPGxpPlxcbiAgICAgIDxhIGhyZWY9JyMhL1wiXG4gICAgKyAoKHN0YWNrMSA9IChoZWxwZXJzLnNhbml0aXplIHx8IChkZXB0aDAgJiYgZGVwdGgwLnNhbml0aXplKSB8fCBhbGlhczIpLmNhbGwoYWxpYXMxLChkZXB0aDAgIT0gbnVsbCA/IGRlcHRoMC5pZCA6IGRlcHRoMCkse1wibmFtZVwiOlwic2FuaXRpemVcIixcImhhc2hcIjp7fSxcImRhdGFcIjpkYXRhfSkpICE9IG51bGwgPyBzdGFjazEgOiBcIlwiKVxuICAgICsgXCInIGlkPSdlbmRwb2ludExpc3RUb2dnZXJfXCJcbiAgICArICgoc3RhY2sxID0gKGhlbHBlcnMuc2FuaXRpemUgfHwgKGRlcHRoMCAmJiBkZXB0aDAuc2FuaXRpemUpIHx8IGFsaWFzMikuY2FsbChhbGlhczEsKGRlcHRoMCAhPSBudWxsID8gZGVwdGgwLmlkIDogZGVwdGgwKSx7XCJuYW1lXCI6XCJzYW5pdGl6ZVwiLFwiaGFzaFwiOnt9LFwiZGF0YVwiOmRhdGF9KSkgIT0gbnVsbCA/IHN0YWNrMSA6IFwiXCIpXG4gICAgKyBcIicgY2xhc3M9XFxcInRvZ2dsZUVuZHBvaW50TGlzdFxcXCIgZGF0YS1pZD1cXFwiXCJcbiAgICArICgoc3RhY2sxID0gKGhlbHBlcnMuc2FuaXRpemUgfHwgKGRlcHRoMCAmJiBkZXB0aDAuc2FuaXRpemUpIHx8IGFsaWFzMikuY2FsbChhbGlhczEsKGRlcHRoMCAhPSBudWxsID8gZGVwdGgwLmlkIDogZGVwdGgwKSx7XCJuYW1lXCI6XCJzYW5pdGl6ZVwiLFwiaGFzaFwiOnt9LFwiZGF0YVwiOmRhdGF9KSkgIT0gbnVsbCA/IHN0YWNrMSA6IFwiXCIpXG4gICAgKyBcIlxcXCIgZGF0YS1zdy10cmFuc2xhdGU+U2hvdy9IaWRlPC9hPlxcbiAgICA8L2xpPlxcbiAgICA8bGk+XFxuICAgICAgPGEgaHJlZj0nIycgY2xhc3M9XFxcImNvbGxhcHNlUmVzb3VyY2VcXFwiIGRhdGEtaWQ9XFxcIlwiXG4gICAgKyAoKHN0YWNrMSA9IChoZWxwZXJzLnNhbml0aXplIHx8IChkZXB0aDAgJiYgZGVwdGgwLnNhbml0aXplKSB8fCBhbGlhczIpLmNhbGwoYWxpYXMxLChkZXB0aDAgIT0gbnVsbCA/IGRlcHRoMC5pZCA6IGRlcHRoMCkse1wibmFtZVwiOlwic2FuaXRpemVcIixcImhhc2hcIjp7fSxcImRhdGFcIjpkYXRhfSkpICE9IG51bGwgPyBzdGFjazEgOiBcIlwiKVxuICAgICsgXCJcXFwiIGRhdGEtc3ctdHJhbnNsYXRlPlxcbiAgICAgICAgTGlzdCBPcGVyYXRpb25zXFxuICAgICAgPC9hPlxcbiAgICA8L2xpPlxcbiAgICA8bGk+XFxuICAgICAgPGEgaHJlZj0nIycgY2xhc3M9XFxcImV4cGFuZFJlc291cmNlXFxcIiBkYXRhLWlkPVxcXCJcIlxuICAgICsgKChzdGFjazEgPSAoaGVscGVycy5zYW5pdGl6ZSB8fCAoZGVwdGgwICYmIGRlcHRoMC5zYW5pdGl6ZSkgfHwgYWxpYXMyKS5jYWxsKGFsaWFzMSwoZGVwdGgwICE9IG51bGwgPyBkZXB0aDAuaWQgOiBkZXB0aDApLHtcIm5hbWVcIjpcInNhbml0aXplXCIsXCJoYXNoXCI6e30sXCJkYXRhXCI6ZGF0YX0pKSAhPSBudWxsID8gc3RhY2sxIDogXCJcIilcbiAgICArIFwiXFxcIiBkYXRhLXN3LXRyYW5zbGF0ZT5cXG4gICAgICAgIEV4cGFuZCBPcGVyYXRpb25zXFxuICAgICAgPC9hPlxcbiAgICA8L2xpPlxcblwiXG4gICAgKyAoKHN0YWNrMSA9IGhlbHBlcnNbXCJpZlwiXS5jYWxsKGFsaWFzMSwoZGVwdGgwICE9IG51bGwgPyBkZXB0aDAudXJsIDogZGVwdGgwKSx7XCJuYW1lXCI6XCJpZlwiLFwiaGFzaFwiOnt9LFwiZm5cIjpjb250YWluZXIucHJvZ3JhbSgzLCBkYXRhLCAwKSxcImludmVyc2VcIjpjb250YWluZXIubm9vcCxcImRhdGFcIjpkYXRhfSkpICE9IG51bGwgPyBzdGFjazEgOiBcIlwiKVxuICAgICsgXCIgIDwvdWw+XFxuPC9kaXY+XFxuPHVsIGNsYXNzPSdlbmRwb2ludHMnIGlkPSdcIlxuICAgICsgKChzdGFjazEgPSAoaGVscGVycy5zYW5pdGl6ZSB8fCAoZGVwdGgwICYmIGRlcHRoMC5zYW5pdGl6ZSkgfHwgYWxpYXMyKS5jYWxsKGFsaWFzMSwoZGVwdGgwICE9IG51bGwgPyBkZXB0aDAuaWQgOiBkZXB0aDApLHtcIm5hbWVcIjpcInNhbml0aXplXCIsXCJoYXNoXCI6e30sXCJkYXRhXCI6ZGF0YX0pKSAhPSBudWxsID8gc3RhY2sxIDogXCJcIilcbiAgICArIFwiX2VuZHBvaW50X2xpc3QnIHN0eWxlPSdkaXNwbGF5Om5vbmUnPlxcblxcbjwvdWw+XFxuXCI7XG59LFwidXNlRGF0YVwiOnRydWV9KTtcbnRlbXBsYXRlc1sncmVzcG9uc2VfY29udGVudF90eXBlJ10gPSB0ZW1wbGF0ZSh7XCIxXCI6ZnVuY3Rpb24oY29udGFpbmVyLGRlcHRoMCxoZWxwZXJzLHBhcnRpYWxzLGRhdGEpIHtcbiAgICB2YXIgc3RhY2sxO1xuXG4gIHJldHVybiAoKHN0YWNrMSA9IGhlbHBlcnMuZWFjaC5jYWxsKGRlcHRoMCAhPSBudWxsID8gZGVwdGgwIDoge30sKGRlcHRoMCAhPSBudWxsID8gZGVwdGgwLnByb2R1Y2VzIDogZGVwdGgwKSx7XCJuYW1lXCI6XCJlYWNoXCIsXCJoYXNoXCI6e30sXCJmblwiOmNvbnRhaW5lci5wcm9ncmFtKDIsIGRhdGEsIDApLFwiaW52ZXJzZVwiOmNvbnRhaW5lci5ub29wLFwiZGF0YVwiOmRhdGF9KSkgIT0gbnVsbCA/IHN0YWNrMSA6IFwiXCIpO1xufSxcIjJcIjpmdW5jdGlvbihjb250YWluZXIsZGVwdGgwLGhlbHBlcnMscGFydGlhbHMsZGF0YSkge1xuICAgIHZhciBzdGFjazEsIGFsaWFzMT1kZXB0aDAgIT0gbnVsbCA/IGRlcHRoMCA6IHt9LCBhbGlhczI9aGVscGVycy5oZWxwZXJNaXNzaW5nO1xuXG4gIHJldHVybiBcIiAgPG9wdGlvbiB2YWx1ZT1cXFwiXCJcbiAgICArICgoc3RhY2sxID0gKGhlbHBlcnMuc2FuaXRpemUgfHwgKGRlcHRoMCAmJiBkZXB0aDAuc2FuaXRpemUpIHx8IGFsaWFzMikuY2FsbChhbGlhczEsZGVwdGgwLHtcIm5hbWVcIjpcInNhbml0aXplXCIsXCJoYXNoXCI6e30sXCJkYXRhXCI6ZGF0YX0pKSAhPSBudWxsID8gc3RhY2sxIDogXCJcIilcbiAgICArIFwiXFxcIj5cIlxuICAgICsgKChzdGFjazEgPSAoaGVscGVycy5zYW5pdGl6ZSB8fCAoZGVwdGgwICYmIGRlcHRoMC5zYW5pdGl6ZSkgfHwgYWxpYXMyKS5jYWxsKGFsaWFzMSxkZXB0aDAse1wibmFtZVwiOlwic2FuaXRpemVcIixcImhhc2hcIjp7fSxcImRhdGFcIjpkYXRhfSkpICE9IG51bGwgPyBzdGFjazEgOiBcIlwiKVxuICAgICsgXCI8L29wdGlvbj5cXG5cIjtcbn0sXCI0XCI6ZnVuY3Rpb24oY29udGFpbmVyLGRlcHRoMCxoZWxwZXJzLHBhcnRpYWxzLGRhdGEpIHtcbiAgICByZXR1cm4gXCIgIDxvcHRpb24gdmFsdWU9XFxcImFwcGxpY2F0aW9uL2pzb25cXFwiPmFwcGxpY2F0aW9uL2pzb248L29wdGlvbj5cXG5cIjtcbn0sXCJjb21waWxlclwiOls3LFwiPj0gNC4wLjBcIl0sXCJtYWluXCI6ZnVuY3Rpb24oY29udGFpbmVyLGRlcHRoMCxoZWxwZXJzLHBhcnRpYWxzLGRhdGEpIHtcbiAgICB2YXIgc3RhY2sxLCBoZWxwZXIsIGFsaWFzMT1kZXB0aDAgIT0gbnVsbCA/IGRlcHRoMCA6IHt9LCBhbGlhczI9aGVscGVycy5oZWxwZXJNaXNzaW5nLCBhbGlhczM9XCJmdW5jdGlvblwiLCBhbGlhczQ9Y29udGFpbmVyLmVzY2FwZUV4cHJlc3Npb247XG5cbiAgcmV0dXJuIFwiPGxhYmVsIGRhdGEtc3ctdHJhbnNsYXRlIGZvcj1cXFwiXCJcbiAgICArIGFsaWFzNCgoKGhlbHBlciA9IChoZWxwZXIgPSBoZWxwZXJzLnJlc3BvbnNlQ29udGVudFR5cGVJZCB8fCAoZGVwdGgwICE9IG51bGwgPyBkZXB0aDAucmVzcG9uc2VDb250ZW50VHlwZUlkIDogZGVwdGgwKSkgIT0gbnVsbCA/IGhlbHBlciA6IGFsaWFzMiksKHR5cGVvZiBoZWxwZXIgPT09IGFsaWFzMyA/IGhlbHBlci5jYWxsKGFsaWFzMSx7XCJuYW1lXCI6XCJyZXNwb25zZUNvbnRlbnRUeXBlSWRcIixcImhhc2hcIjp7fSxcImRhdGFcIjpkYXRhfSkgOiBoZWxwZXIpKSlcbiAgICArIFwiXFxcIj5SZXNwb25zZSBDb250ZW50IFR5cGU8L2xhYmVsPlxcbjxzZWxlY3QgbmFtZT1cXFwicmVzcG9uc2VDb250ZW50VHlwZVxcXCIgaWQ9XFxcIlwiXG4gICAgKyBhbGlhczQoKChoZWxwZXIgPSAoaGVscGVyID0gaGVscGVycy5yZXNwb25zZUNvbnRlbnRUeXBlSWQgfHwgKGRlcHRoMCAhPSBudWxsID8gZGVwdGgwLnJlc3BvbnNlQ29udGVudFR5cGVJZCA6IGRlcHRoMCkpICE9IG51bGwgPyBoZWxwZXIgOiBhbGlhczIpLCh0eXBlb2YgaGVscGVyID09PSBhbGlhczMgPyBoZWxwZXIuY2FsbChhbGlhczEse1wibmFtZVwiOlwicmVzcG9uc2VDb250ZW50VHlwZUlkXCIsXCJoYXNoXCI6e30sXCJkYXRhXCI6ZGF0YX0pIDogaGVscGVyKSkpXG4gICAgKyBcIlxcXCI+XFxuXCJcbiAgICArICgoc3RhY2sxID0gaGVscGVyc1tcImlmXCJdLmNhbGwoYWxpYXMxLChkZXB0aDAgIT0gbnVsbCA/IGRlcHRoMC5wcm9kdWNlcyA6IGRlcHRoMCkse1wibmFtZVwiOlwiaWZcIixcImhhc2hcIjp7fSxcImZuXCI6Y29udGFpbmVyLnByb2dyYW0oMSwgZGF0YSwgMCksXCJpbnZlcnNlXCI6Y29udGFpbmVyLnByb2dyYW0oNCwgZGF0YSwgMCksXCJkYXRhXCI6ZGF0YX0pKSAhPSBudWxsID8gc3RhY2sxIDogXCJcIilcbiAgICArIFwiPC9zZWxlY3Q+XFxuXCI7XG59LFwidXNlRGF0YVwiOnRydWV9KTtcbnRlbXBsYXRlc1snc2lnbmF0dXJlJ10gPSB0ZW1wbGF0ZSh7XCIxXCI6ZnVuY3Rpb24oY29udGFpbmVyLGRlcHRoMCxoZWxwZXJzLHBhcnRpYWxzLGRhdGEpIHtcbiAgICB2YXIgc3RhY2sxLCBhbGlhczE9ZGVwdGgwICE9IG51bGwgPyBkZXB0aDAgOiB7fTtcblxuICByZXR1cm4gXCJcXG48ZGl2Plxcbjx1bCBjbGFzcz1cXFwic2lnbmF0dXJlLW5hdlxcXCI+XFxuICA8bGk+PGEgY2xhc3M9XFxcImRlc2NyaXB0aW9uLWxpbmtcXFwiIGhyZWY9XFxcIiNcXFwiIGRhdGEtc3ctdHJhbnNsYXRlPk1vZGVsPC9hPjwvbGk+XFxuICA8bGk+PGEgY2xhc3M9XFxcInNuaXBwZXQtbGlua1xcXCIgaHJlZj1cXFwiI1xcXCIgZGF0YS1zdy10cmFuc2xhdGU+RXhhbXBsZSBWYWx1ZTwvYT48L2xpPlxcbjwvdWw+XFxuPGRpdj5cXG5cXG48ZGl2IGNsYXNzPVxcXCJzaWduYXR1cmUtY29udGFpbmVyXFxcIj5cXG4gIDxkaXYgY2xhc3M9XFxcImRlc2NyaXB0aW9uXFxcIj5cXG4gICAgICBcIlxuICAgICsgY29udGFpbmVyLmVzY2FwZUV4cHJlc3Npb24oKGhlbHBlcnMuc2FuaXRpemUgfHwgKGRlcHRoMCAmJiBkZXB0aDAuc2FuaXRpemUpIHx8IGhlbHBlcnMuaGVscGVyTWlzc2luZykuY2FsbChhbGlhczEsKGRlcHRoMCAhPSBudWxsID8gZGVwdGgwLnNpZ25hdHVyZSA6IGRlcHRoMCkse1wibmFtZVwiOlwic2FuaXRpemVcIixcImhhc2hcIjp7fSxcImRhdGFcIjpkYXRhfSkpXG4gICAgKyBcIlxcbiAgPC9kaXY+XFxuXFxuICA8ZGl2IGNsYXNzPVxcXCJzbmlwcGV0XFxcIj5cXG5cIlxuICAgICsgKChzdGFjazEgPSBoZWxwZXJzW1wiaWZcIl0uY2FsbChhbGlhczEsKGRlcHRoMCAhPSBudWxsID8gZGVwdGgwLnNhbXBsZUpTT04gOiBkZXB0aDApLHtcIm5hbWVcIjpcImlmXCIsXCJoYXNoXCI6e30sXCJmblwiOmNvbnRhaW5lci5wcm9ncmFtKDIsIGRhdGEsIDApLFwiaW52ZXJzZVwiOmNvbnRhaW5lci5ub29wLFwiZGF0YVwiOmRhdGF9KSkgIT0gbnVsbCA/IHN0YWNrMSA6IFwiXCIpXG4gICAgKyAoKHN0YWNrMSA9IGhlbHBlcnNbXCJpZlwiXS5jYWxsKGFsaWFzMSwoZGVwdGgwICE9IG51bGwgPyBkZXB0aDAuc2FtcGxlWE1MIDogZGVwdGgwKSx7XCJuYW1lXCI6XCJpZlwiLFwiaGFzaFwiOnt9LFwiZm5cIjpjb250YWluZXIucHJvZ3JhbSg1LCBkYXRhLCAwKSxcImludmVyc2VcIjpjb250YWluZXIubm9vcCxcImRhdGFcIjpkYXRhfSkpICE9IG51bGwgPyBzdGFjazEgOiBcIlwiKVxuICAgICsgXCIgIDwvZGl2PlxcbjwvZGl2PlxcblwiO1xufSxcIjJcIjpmdW5jdGlvbihjb250YWluZXIsZGVwdGgwLGhlbHBlcnMscGFydGlhbHMsZGF0YSkge1xuICAgIHZhciBzdGFjazEsIGFsaWFzMT1kZXB0aDAgIT0gbnVsbCA/IGRlcHRoMCA6IHt9O1xuXG4gIHJldHVybiBcIiAgICAgIDxkaXYgY2xhc3M9XFxcInNuaXBwZXRfanNvblxcXCI+XFxuICAgICAgICA8cHJlPjxjb2RlPlwiXG4gICAgKyAoKHN0YWNrMSA9IChoZWxwZXJzLmVzY2FwZSB8fCAoZGVwdGgwICYmIGRlcHRoMC5lc2NhcGUpIHx8IGhlbHBlcnMuaGVscGVyTWlzc2luZykuY2FsbChhbGlhczEsKGRlcHRoMCAhPSBudWxsID8gZGVwdGgwLnNhbXBsZUpTT04gOiBkZXB0aDApLHtcIm5hbWVcIjpcImVzY2FwZVwiLFwiaGFzaFwiOnt9LFwiZGF0YVwiOmRhdGF9KSkgIT0gbnVsbCA/IHN0YWNrMSA6IFwiXCIpXG4gICAgKyBcIjwvY29kZT48L3ByZT5cXG4gICAgICAgIFwiXG4gICAgKyAoKHN0YWNrMSA9IGhlbHBlcnNbXCJpZlwiXS5jYWxsKGFsaWFzMSwoZGVwdGgwICE9IG51bGwgPyBkZXB0aDAuaXNQYXJhbSA6IGRlcHRoMCkse1wibmFtZVwiOlwiaWZcIixcImhhc2hcIjp7fSxcImZuXCI6Y29udGFpbmVyLnByb2dyYW0oMywgZGF0YSwgMCksXCJpbnZlcnNlXCI6Y29udGFpbmVyLm5vb3AsXCJkYXRhXCI6ZGF0YX0pKSAhPSBudWxsID8gc3RhY2sxIDogXCJcIilcbiAgICArIFwiXFxuICAgICAgPC9kaXY+XFxuXCI7XG59LFwiM1wiOmZ1bmN0aW9uKGNvbnRhaW5lcixkZXB0aDAsaGVscGVycyxwYXJ0aWFscyxkYXRhKSB7XG4gICAgcmV0dXJuIFwiPHNtYWxsIGNsYXNzPVxcXCJub3RpY2VcXFwiIGRhdGEtc3ctdHJhbnNsYXRlPjwvc21hbGw+XCI7XG59LFwiNVwiOmZ1bmN0aW9uKGNvbnRhaW5lcixkZXB0aDAsaGVscGVycyxwYXJ0aWFscyxkYXRhKSB7XG4gICAgdmFyIHN0YWNrMSwgYWxpYXMxPWRlcHRoMCAhPSBudWxsID8gZGVwdGgwIDoge307XG5cbiAgcmV0dXJuIFwiICAgIDxkaXYgY2xhc3M9XFxcInNuaXBwZXRfeG1sXFxcIj5cXG4gICAgICA8cHJlPjxjb2RlPlwiXG4gICAgKyAoKHN0YWNrMSA9IChoZWxwZXJzLmVzY2FwZSB8fCAoZGVwdGgwICYmIGRlcHRoMC5lc2NhcGUpIHx8IGhlbHBlcnMuaGVscGVyTWlzc2luZykuY2FsbChhbGlhczEsKGRlcHRoMCAhPSBudWxsID8gZGVwdGgwLnNhbXBsZVhNTCA6IGRlcHRoMCkse1wibmFtZVwiOlwiZXNjYXBlXCIsXCJoYXNoXCI6e30sXCJkYXRhXCI6ZGF0YX0pKSAhPSBudWxsID8gc3RhY2sxIDogXCJcIilcbiAgICArIFwiPC9jb2RlPjwvcHJlPlxcbiAgICAgIFwiXG4gICAgKyAoKHN0YWNrMSA9IGhlbHBlcnNbXCJpZlwiXS5jYWxsKGFsaWFzMSwoZGVwdGgwICE9IG51bGwgPyBkZXB0aDAuaXNQYXJhbSA6IGRlcHRoMCkse1wibmFtZVwiOlwiaWZcIixcImhhc2hcIjp7fSxcImZuXCI6Y29udGFpbmVyLnByb2dyYW0oMywgZGF0YSwgMCksXCJpbnZlcnNlXCI6Y29udGFpbmVyLm5vb3AsXCJkYXRhXCI6ZGF0YX0pKSAhPSBudWxsID8gc3RhY2sxIDogXCJcIilcbiAgICArIFwiXFxuICAgIDwvZGl2PlxcblwiO1xufSxcIjdcIjpmdW5jdGlvbihjb250YWluZXIsZGVwdGgwLGhlbHBlcnMscGFydGlhbHMsZGF0YSkge1xuICAgIHZhciBzdGFjazE7XG5cbiAgcmV0dXJuIFwiICAgIFwiXG4gICAgKyAoKHN0YWNrMSA9IChoZWxwZXJzLmVzY2FwZSB8fCAoZGVwdGgwICYmIGRlcHRoMC5lc2NhcGUpIHx8IGhlbHBlcnMuaGVscGVyTWlzc2luZykuY2FsbChkZXB0aDAgIT0gbnVsbCA/IGRlcHRoMCA6IHt9LChkZXB0aDAgIT0gbnVsbCA/IGRlcHRoMC5zaWduYXR1cmUgOiBkZXB0aDApLHtcIm5hbWVcIjpcImVzY2FwZVwiLFwiaGFzaFwiOnt9LFwiZGF0YVwiOmRhdGF9KSkgIT0gbnVsbCA/IHN0YWNrMSA6IFwiXCIpXG4gICAgKyBcIlxcblwiO1xufSxcImNvbXBpbGVyXCI6WzcsXCI+PSA0LjAuMFwiXSxcIm1haW5cIjpmdW5jdGlvbihjb250YWluZXIsZGVwdGgwLGhlbHBlcnMscGFydGlhbHMsZGF0YSkge1xuICAgIHZhciBzdGFjazE7XG5cbiAgcmV0dXJuICgoc3RhY2sxID0gKGhlbHBlcnMuaWZDb25kIHx8IChkZXB0aDAgJiYgZGVwdGgwLmlmQ29uZCkgfHwgaGVscGVycy5oZWxwZXJNaXNzaW5nKS5jYWxsKGRlcHRoMCAhPSBudWxsID8gZGVwdGgwIDoge30sKGRlcHRoMCAhPSBudWxsID8gZGVwdGgwLnNhbXBsZUpTT04gOiBkZXB0aDApLFwifHxcIiwoZGVwdGgwICE9IG51bGwgPyBkZXB0aDAuc2FtcGxlWE1MIDogZGVwdGgwKSx7XCJuYW1lXCI6XCJpZkNvbmRcIixcImhhc2hcIjp7fSxcImZuXCI6Y29udGFpbmVyLnByb2dyYW0oMSwgZGF0YSwgMCksXCJpbnZlcnNlXCI6Y29udGFpbmVyLnByb2dyYW0oNywgZGF0YSwgMCksXCJkYXRhXCI6ZGF0YX0pKSAhPSBudWxsID8gc3RhY2sxIDogXCJcIik7XG59LFwidXNlRGF0YVwiOnRydWV9KTtcbnRlbXBsYXRlc1snc3RhdHVzX2NvZGUnXSA9IHRlbXBsYXRlKHtcIjFcIjpmdW5jdGlvbihjb250YWluZXIsZGVwdGgwLGhlbHBlcnMscGFydGlhbHMsZGF0YSkge1xuICAgIHZhciBzdGFjazEsIGhlbHBlciwgYWxpYXMxPWRlcHRoMCAhPSBudWxsID8gZGVwdGgwIDoge30sIGFsaWFzMj1oZWxwZXJzLmhlbHBlck1pc3Npbmc7XG5cbiAgcmV0dXJuIFwiICAgICAgPHRyPlxcbiAgICAgICAgPHRkPlwiXG4gICAgKyBjb250YWluZXIuZXNjYXBlRXhwcmVzc2lvbigoKGhlbHBlciA9IChoZWxwZXIgPSBoZWxwZXJzLmtleSB8fCAoZGF0YSAmJiBkYXRhLmtleSkpICE9IG51bGwgPyBoZWxwZXIgOiBhbGlhczIpLCh0eXBlb2YgaGVscGVyID09PSBcImZ1bmN0aW9uXCIgPyBoZWxwZXIuY2FsbChhbGlhczEse1wibmFtZVwiOlwia2V5XCIsXCJoYXNoXCI6e30sXCJkYXRhXCI6ZGF0YX0pIDogaGVscGVyKSkpXG4gICAgKyBcIjwvdGQ+XFxuICAgICAgICA8dGQ+XCJcbiAgICArICgoc3RhY2sxID0gKGhlbHBlcnMuc2FuaXRpemUgfHwgKGRlcHRoMCAmJiBkZXB0aDAuc2FuaXRpemUpIHx8IGFsaWFzMikuY2FsbChhbGlhczEsKGRlcHRoMCAhPSBudWxsID8gZGVwdGgwLmRlc2NyaXB0aW9uIDogZGVwdGgwKSx7XCJuYW1lXCI6XCJzYW5pdGl6ZVwiLFwiaGFzaFwiOnt9LFwiZGF0YVwiOmRhdGF9KSkgIT0gbnVsbCA/IHN0YWNrMSA6IFwiXCIpXG4gICAgKyBcIjwvdGQ+XFxuICAgICAgICA8dGQ+XCJcbiAgICArICgoc3RhY2sxID0gKGhlbHBlcnMuZXNjYXBlIHx8IChkZXB0aDAgJiYgZGVwdGgwLmVzY2FwZSkgfHwgYWxpYXMyKS5jYWxsKGFsaWFzMSwoZGVwdGgwICE9IG51bGwgPyBkZXB0aDAudHlwZSA6IGRlcHRoMCkse1wibmFtZVwiOlwiZXNjYXBlXCIsXCJoYXNoXCI6e30sXCJkYXRhXCI6ZGF0YX0pKSAhPSBudWxsID8gc3RhY2sxIDogXCJcIilcbiAgICArIFwiPC90ZD5cXG4gICAgICA8L3RyPlxcblwiO1xufSxcImNvbXBpbGVyXCI6WzcsXCI+PSA0LjAuMFwiXSxcIm1haW5cIjpmdW5jdGlvbihjb250YWluZXIsZGVwdGgwLGhlbHBlcnMscGFydGlhbHMsZGF0YSkge1xuICAgIHZhciBzdGFjazEsIGFsaWFzMT1kZXB0aDAgIT0gbnVsbCA/IGRlcHRoMCA6IHt9LCBhbGlhczI9aGVscGVycy5oZWxwZXJNaXNzaW5nO1xuXG4gIHJldHVybiBcIjx0ZCB3aWR0aD0nMTUlJyBjbGFzcz0nY29kZSc+XCJcbiAgICArICgoc3RhY2sxID0gKGhlbHBlcnMuZXNjYXBlIHx8IChkZXB0aDAgJiYgZGVwdGgwLmVzY2FwZSkgfHwgYWxpYXMyKS5jYWxsKGFsaWFzMSwoZGVwdGgwICE9IG51bGwgPyBkZXB0aDAuY29kZSA6IGRlcHRoMCkse1wibmFtZVwiOlwiZXNjYXBlXCIsXCJoYXNoXCI6e30sXCJkYXRhXCI6ZGF0YX0pKSAhPSBudWxsID8gc3RhY2sxIDogXCJcIilcbiAgICArIFwiPC90ZD5cXG48dGQgY2xhc3M9XFxcIm1hcmtkb3duXFxcIj5cIlxuICAgICsgKChzdGFjazEgPSAoaGVscGVycy5lc2NhcGUgfHwgKGRlcHRoMCAmJiBkZXB0aDAuZXNjYXBlKSB8fCBhbGlhczIpLmNhbGwoYWxpYXMxLChkZXB0aDAgIT0gbnVsbCA/IGRlcHRoMC5tZXNzYWdlIDogZGVwdGgwKSx7XCJuYW1lXCI6XCJlc2NhcGVcIixcImhhc2hcIjp7fSxcImRhdGFcIjpkYXRhfSkpICE9IG51bGwgPyBzdGFjazEgOiBcIlwiKVxuICAgICsgXCI8L3RkPlxcbjx0ZCB3aWR0aD0nNTAlJz48c3BhbiBjbGFzcz1cXFwibW9kZWwtc2lnbmF0dXJlXFxcIiAvPjwvdGQ+XFxuPHRkIGNsYXNzPVxcXCJoZWFkZXJzXFxcIj5cXG4gIDx0YWJsZT5cXG4gICAgPHRib2R5PlxcblwiXG4gICAgKyAoKHN0YWNrMSA9IGhlbHBlcnMuZWFjaC5jYWxsKGFsaWFzMSwoZGVwdGgwICE9IG51bGwgPyBkZXB0aDAuaGVhZGVycyA6IGRlcHRoMCkse1wibmFtZVwiOlwiZWFjaFwiLFwiaGFzaFwiOnt9LFwiZm5cIjpjb250YWluZXIucHJvZ3JhbSgxLCBkYXRhLCAwKSxcImludmVyc2VcIjpjb250YWluZXIubm9vcCxcImRhdGFcIjpkYXRhfSkpICE9IG51bGwgPyBzdGFjazEgOiBcIlwiKVxuICAgICsgXCIgICAgPC90Ym9keT5cXG4gIDwvdGFibGU+XFxuPC90ZD5cIjtcbn0sXCJ1c2VEYXRhXCI6dHJ1ZX0pO1xufSkoKTt9IFxuIC8qIGpzaGludCBpZ25vcmU6ZW5kICovIiwiJ3VzZSBzdHJpY3QnO1xuXG5cbiQoZnVuY3Rpb24oKSB7XG5cblx0Ly8gSGVscGVyIGZ1bmN0aW9uIGZvciB2ZXJ0aWNhbGx5IGFsaWduaW5nIERPTSBlbGVtZW50c1xuXHQvLyBodHRwOi8vd3d3LnNlb2RlbnZlci5jb20vc2ltcGxlLXZlcnRpY2FsLWFsaWduLXBsdWdpbi1mb3ItanF1ZXJ5L1xuXHQkLmZuLnZBbGlnbiA9IGZ1bmN0aW9uKCkge1xuXHRcdHJldHVybiB0aGlzLmVhY2goZnVuY3Rpb24oKXtcblx0XHRcdHZhciBhaCA9ICQodGhpcykuaGVpZ2h0KCk7XG5cdFx0XHR2YXIgcGggPSAkKHRoaXMpLnBhcmVudCgpLmhlaWdodCgpO1xuXHRcdFx0dmFyIG1oID0gKHBoIC0gYWgpIC8gMjtcblx0XHRcdCQodGhpcykuY3NzKCdtYXJnaW4tdG9wJywgbWgpO1xuXHRcdH0pO1xuXHR9O1xuXG5cdCQuZm4uc3RyZXRjaEZvcm10YXN0aWNJbnB1dFdpZHRoVG9QYXJlbnQgPSBmdW5jdGlvbigpIHtcblx0XHRyZXR1cm4gdGhpcy5lYWNoKGZ1bmN0aW9uKCl7XG5cdFx0XHR2YXIgcF93aWR0aCA9ICQodGhpcykuY2xvc2VzdChcImZvcm1cIikuaW5uZXJXaWR0aCgpO1xuXHRcdFx0dmFyIHBfcGFkZGluZyA9IHBhcnNlSW50KCQodGhpcykuY2xvc2VzdChcImZvcm1cIikuY3NzKCdwYWRkaW5nLWxlZnQnKSAsMTApICsgcGFyc2VJbnQoJCh0aGlzKS5jbG9zZXN0KCdmb3JtJykuY3NzKCdwYWRkaW5nLXJpZ2h0JyksIDEwKTtcblx0XHRcdHZhciB0aGlzX3BhZGRpbmcgPSBwYXJzZUludCgkKHRoaXMpLmNzcygncGFkZGluZy1sZWZ0JyksIDEwKSArIHBhcnNlSW50KCQodGhpcykuY3NzKCdwYWRkaW5nLXJpZ2h0JyksIDEwKTtcblx0XHRcdCQodGhpcykuY3NzKCd3aWR0aCcsIHBfd2lkdGggLSBwX3BhZGRpbmcgLSB0aGlzX3BhZGRpbmcpO1xuXHRcdH0pO1xuXHR9O1xuXG5cdCQoJ2Zvcm0uZm9ybXRhc3RpYyBsaS5zdHJpbmcgaW5wdXQsIGZvcm0uZm9ybXRhc3RpYyB0ZXh0YXJlYScpLnN0cmV0Y2hGb3JtdGFzdGljSW5wdXRXaWR0aFRvUGFyZW50KCk7XG5cblx0Ly8gVmVydGljYWxseSBjZW50ZXIgdGhlc2UgcGFyYWdyYXBoc1xuXHQvLyBQYXJlbnQgbWF5IG5lZWQgYSBtaW4taGVpZ2h0IGZvciB0aGlzIHRvIHdvcmsuLlxuXHQkKCd1bC5kb3ducGxheWVkIGxpIGRpdi5jb250ZW50IHAnKS52QWxpZ24oKTtcblxuXHQvLyBXaGVuIGEgc2FuZGJveCBmb3JtIGlzIHN1Ym1pdHRlZC4uXG5cdCQoXCJmb3JtLnNhbmRib3hcIikuc3VibWl0KGZ1bmN0aW9uKCl7XG5cblx0XHR2YXIgZXJyb3JfZnJlZSA9IHRydWU7XG5cblx0XHQvLyBDeWNsZSB0aHJvdWdoIHRoZSBmb3JtcyByZXF1aXJlZCBpbnB1dHNcbiBcdFx0JCh0aGlzKS5maW5kKFwiaW5wdXQucmVxdWlyZWRcIikuZWFjaChmdW5jdGlvbigpIHtcblxuXHRcdFx0Ly8gUmVtb3ZlIGFueSBleGlzdGluZyBlcnJvciBzdHlsZXMgZnJvbSB0aGUgaW5wdXRcblx0XHRcdCQodGhpcykucmVtb3ZlQ2xhc3MoJ2Vycm9yJyk7XG5cblx0XHRcdC8vIFRhY2sgdGhlIGVycm9yIHN0eWxlIG9uIGlmIHRoZSBpbnB1dCBpcyBlbXB0eS4uXG5cdFx0XHRpZiAoJCh0aGlzKS52YWwoKSA9PT0gJycpIHtcblx0XHRcdFx0JCh0aGlzKS5hZGRDbGFzcygnZXJyb3InKTtcblx0XHRcdFx0JCh0aGlzKS53aWdnbGUoKTtcblx0XHRcdFx0ZXJyb3JfZnJlZSA9IGZhbHNlO1xuXHRcdFx0fVxuXG5cdFx0fSk7XG5cblx0XHRyZXR1cm4gZXJyb3JfZnJlZTtcblx0fSk7XG5cbn0pO1xuXG5mdW5jdGlvbiBjbGlwcHlDb3BpZWRDYWxsYmFjaygpIHtcbiAgJCgnI2FwaV9rZXlfY29waWVkJykuZmFkZUluKCkuZGVsYXkoMTAwMCkuZmFkZU91dCgpO1xuXG4gIC8vIHZhciBiID0gJChcIiNjbGlwcHlfdG9vbHRpcF9cIiArIGEpO1xuICAvLyBiLmxlbmd0aCAhPSAwICYmIChiLmF0dHIoXCJ0aXRsZVwiLCBcImNvcGllZCFcIikudHJpZ2dlcihcInRpcHN5LnJlbG9hZFwiKSwgc2V0VGltZW91dChmdW5jdGlvbigpIHtcbiAgLy8gICBiLmF0dHIoXCJ0aXRsZVwiLCBcImNvcHkgdG8gY2xpcGJvYXJkXCIpXG4gIC8vIH0sXG4gIC8vIDUwMCkpXG59XG5cbi8vIExvZ2dpbmcgZnVuY3Rpb24gdGhhdCBhY2NvdW50cyBmb3IgYnJvd3NlcnMgdGhhdCBkb24ndCBoYXZlIHdpbmRvdy5jb25zb2xlXG5mdW5jdGlvbiBsb2coKXtcbiAgbG9nLmhpc3RvcnkgPSBsb2cuaGlzdG9yeSB8fCBbXTtcbiAgbG9nLmhpc3RvcnkucHVzaChhcmd1bWVudHMpO1xuICBpZih0aGlzLmNvbnNvbGUpe1xuICAgIGNvbnNvbGUubG9nKCBBcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChhcmd1bWVudHMpWzBdICk7XG4gIH1cbn1cblxuLy8gSGFuZGxlIGJyb3dzZXJzIHRoYXQgZG8gY29uc29sZSBpbmNvcnJlY3RseSAoSUU5IGFuZCBiZWxvdywgc2VlIGh0dHA6Ly9zdGFja292ZXJmbG93LmNvbS9hLzU1MzkzNzgvNzkxMylcbmlmIChGdW5jdGlvbi5wcm90b3R5cGUuYmluZCAmJiBjb25zb2xlICYmIHR5cGVvZiBjb25zb2xlLmxvZyA9PT0gXCJvYmplY3RcIikge1xuICAgIFtcbiAgICAgIFwibG9nXCIsXCJpbmZvXCIsXCJ3YXJuXCIsXCJlcnJvclwiLFwiYXNzZXJ0XCIsXCJkaXJcIixcImNsZWFyXCIsXCJwcm9maWxlXCIsXCJwcm9maWxlRW5kXCJcbiAgICBdLmZvckVhY2goZnVuY3Rpb24gKG1ldGhvZCkge1xuICAgICAgICBjb25zb2xlW21ldGhvZF0gPSB0aGlzLmJpbmQoY29uc29sZVttZXRob2RdLCBjb25zb2xlKTtcbiAgICB9LCBGdW5jdGlvbi5wcm90b3R5cGUuY2FsbCk7XG59XG5cbndpbmRvdy5Eb2NzID0ge1xuXG5cdHNoZWJhbmc6IGZ1bmN0aW9uKCkge1xuXG5cdFx0Ly8gSWYgc2hlYmFuZyBoYXMgYW4gb3BlcmF0aW9uIG5pY2tuYW1lIGluIGl0Li5cblx0XHQvLyBlLmcuIC9kb2NzLyMhL3dvcmRzL2dldF9zZWFyY2hcblx0XHR2YXIgZnJhZ21lbnRzID0gJC5wYXJhbS5mcmFnbWVudCgpLnNwbGl0KCcvJyk7XG5cdFx0ZnJhZ21lbnRzLnNoaWZ0KCk7IC8vIGdldCByaWQgb2YgdGhlIGJhbmdcblxuXHRcdHN3aXRjaCAoZnJhZ21lbnRzLmxlbmd0aCkge1xuXHRcdFx0Y2FzZSAxOlxuICAgICAgICBpZiAoZnJhZ21lbnRzWzBdLmxlbmd0aCA+IDApIHsgLy8gcHJldmVudCBtYXRjaGluZyBcIiMvXCJcbiAgICAgICAgICAvLyBFeHBhbmQgYWxsIG9wZXJhdGlvbnMgZm9yIHRoZSByZXNvdXJjZSBhbmQgc2Nyb2xsIHRvIGl0XG4gICAgICAgICAgdmFyIGRvbV9pZCA9ICdyZXNvdXJjZV8nICsgZnJhZ21lbnRzWzBdO1xuXG4gICAgICAgICAgRG9jcy5leHBhbmRFbmRwb2ludExpc3RGb3JSZXNvdXJjZShmcmFnbWVudHNbMF0pO1xuICAgICAgICAgICQoXCIjXCIrZG9tX2lkKS5zbGlkZXRvKHtoaWdobGlnaHQ6IGZhbHNlfSk7XG4gICAgICAgIH1cblx0XHRcdFx0YnJlYWs7XG5cdFx0XHRjYXNlIDI6XG5cdFx0XHRcdC8vIFJlZmVyIHRvIHRoZSBlbmRwb2ludCBET00gZWxlbWVudCwgZS5nLiAjd29yZHNfZ2V0X3NlYXJjaFxuXG4gICAgICAgIC8vIEV4cGFuZCBSZXNvdXJjZVxuICAgICAgICBEb2NzLmV4cGFuZEVuZHBvaW50TGlzdEZvclJlc291cmNlKGZyYWdtZW50c1swXSk7XG4gICAgICAgICQoXCIjXCIrZG9tX2lkKS5zbGlkZXRvKHtoaWdobGlnaHQ6IGZhbHNlfSk7XG5cbiAgICAgICAgICAgIC8vIEV4cGFuZCBvcGVyYXRpb25cbiAgICAgICAgICAgIHZhciBsaV9kb21faWQgPSBmcmFnbWVudHMuam9pbignXycpO1xuICAgICAgICAgICAgdmFyIGxpX2NvbnRlbnRfZG9tX2lkID0gbGlfZG9tX2lkICsgXCJfY29udGVudFwiO1xuXG5cbiAgICAgICAgICAgIERvY3MuZXhwYW5kT3BlcmF0aW9uKCQoJyMnK2xpX2NvbnRlbnRfZG9tX2lkKSk7XG4gICAgICAgICAgICAkKCcjJytsaV9kb21faWQpLnNsaWRldG8oe2hpZ2hsaWdodDogZmFsc2V9KTtcbiAgICAgICAgICAgIGJyZWFrO1xuXHRcdH1cblx0fSxcblxuXHR0b2dnbGVFbmRwb2ludExpc3RGb3JSZXNvdXJjZTogZnVuY3Rpb24ocmVzb3VyY2UpIHtcblx0XHR2YXIgZWxlbSA9ICQoJ2xpI3Jlc291cmNlXycgKyBEb2NzLmVzY2FwZVJlc291cmNlTmFtZShyZXNvdXJjZSkgKyAnIHVsLmVuZHBvaW50cycpO1xuXHRcdGlmIChlbGVtLmlzKCc6dmlzaWJsZScpKSB7XG5cdFx0XHQkLmJicS5wdXNoU3RhdGUoJyMvJywgMik7XG5cdFx0XHREb2NzLmNvbGxhcHNlRW5kcG9pbnRMaXN0Rm9yUmVzb3VyY2UocmVzb3VyY2UpO1xuXHRcdH0gZWxzZSB7XG4gICAgICAgICAgICAkLmJicS5wdXNoU3RhdGUoJyMvJyArIHJlc291cmNlLCAyKTtcblx0XHRcdERvY3MuZXhwYW5kRW5kcG9pbnRMaXN0Rm9yUmVzb3VyY2UocmVzb3VyY2UpO1xuXHRcdH1cblx0fSxcblxuXHQvLyBFeHBhbmQgcmVzb3VyY2Vcblx0ZXhwYW5kRW5kcG9pbnRMaXN0Rm9yUmVzb3VyY2U6IGZ1bmN0aW9uKHJlc291cmNlKSB7XG5cdFx0dmFyIHJlc291cmNlID0gRG9jcy5lc2NhcGVSZXNvdXJjZU5hbWUocmVzb3VyY2UpO1xuXHRcdGlmIChyZXNvdXJjZSA9PSAnJykge1xuXHRcdFx0JCgnLnJlc291cmNlIHVsLmVuZHBvaW50cycpLnNsaWRlRG93bigpO1xuXHRcdFx0cmV0dXJuO1xuXHRcdH1cblxuXHRcdCQoJ2xpI3Jlc291cmNlXycgKyByZXNvdXJjZSkuYWRkQ2xhc3MoJ2FjdGl2ZScpO1xuXG5cdFx0dmFyIGVsZW0gPSAkKCdsaSNyZXNvdXJjZV8nICsgcmVzb3VyY2UgKyAnIHVsLmVuZHBvaW50cycpO1xuXHRcdGVsZW0uc2xpZGVEb3duKCk7XG5cdH0sXG5cblx0Ly8gQ29sbGFwc2UgcmVzb3VyY2UgYW5kIG1hcmsgYXMgZXhwbGljaXRseSBjbG9zZWRcblx0Y29sbGFwc2VFbmRwb2ludExpc3RGb3JSZXNvdXJjZTogZnVuY3Rpb24ocmVzb3VyY2UpIHtcblx0XHR2YXIgcmVzb3VyY2UgPSBEb2NzLmVzY2FwZVJlc291cmNlTmFtZShyZXNvdXJjZSk7XG5cdFx0aWYgKHJlc291cmNlID09ICcnKSB7XG5cdFx0XHQkKCcucmVzb3VyY2UgdWwuZW5kcG9pbnRzJykuc2xpZGVVcCgpO1xuXHRcdFx0cmV0dXJuO1xuXHRcdH1cblxuXHRcdCQoJ2xpI3Jlc291cmNlXycgKyByZXNvdXJjZSkucmVtb3ZlQ2xhc3MoJ2FjdGl2ZScpO1xuXG5cdFx0dmFyIGVsZW0gPSAkKCdsaSNyZXNvdXJjZV8nICsgcmVzb3VyY2UgKyAnIHVsLmVuZHBvaW50cycpO1xuXHRcdGVsZW0uc2xpZGVVcCgpO1xuXHR9LFxuXG5cdGV4cGFuZE9wZXJhdGlvbnNGb3JSZXNvdXJjZTogZnVuY3Rpb24ocmVzb3VyY2UpIHtcblx0XHQvLyBNYWtlIHN1cmUgdGhlIHJlc291cmNlIGNvbnRhaW5lciBpcyBvcGVuLi5cblx0XHREb2NzLmV4cGFuZEVuZHBvaW50TGlzdEZvclJlc291cmNlKHJlc291cmNlKTtcblxuXHRcdGlmIChyZXNvdXJjZSA9PSAnJykge1xuXHRcdFx0JCgnLnJlc291cmNlIHVsLmVuZHBvaW50cyBsaS5vcGVyYXRpb24gZGl2LmNvbnRlbnQnKS5zbGlkZURvd24oKTtcblx0XHRcdHJldHVybjtcblx0XHR9XG5cblx0XHQkKCdsaSNyZXNvdXJjZV8nICsgRG9jcy5lc2NhcGVSZXNvdXJjZU5hbWUocmVzb3VyY2UpICsgJyBsaS5vcGVyYXRpb24gZGl2LmNvbnRlbnQnKS5lYWNoKGZ1bmN0aW9uKCkge1xuXHRcdFx0RG9jcy5leHBhbmRPcGVyYXRpb24oJCh0aGlzKSk7XG5cdFx0fSk7XG5cdH0sXG5cblx0Y29sbGFwc2VPcGVyYXRpb25zRm9yUmVzb3VyY2U6IGZ1bmN0aW9uKHJlc291cmNlKSB7XG5cdFx0Ly8gTWFrZSBzdXJlIHRoZSByZXNvdXJjZSBjb250YWluZXIgaXMgb3Blbi4uXG5cdFx0RG9jcy5leHBhbmRFbmRwb2ludExpc3RGb3JSZXNvdXJjZShyZXNvdXJjZSk7XG5cblx0XHRpZiAocmVzb3VyY2UgPT0gJycpIHtcblx0XHRcdCQoJy5yZXNvdXJjZSB1bC5lbmRwb2ludHMgbGkub3BlcmF0aW9uIGRpdi5jb250ZW50Jykuc2xpZGVVcCgpO1xuXHRcdFx0cmV0dXJuO1xuXHRcdH1cblxuXHRcdCQoJ2xpI3Jlc291cmNlXycgKyBEb2NzLmVzY2FwZVJlc291cmNlTmFtZShyZXNvdXJjZSkgKyAnIGxpLm9wZXJhdGlvbiBkaXYuY29udGVudCcpLmVhY2goZnVuY3Rpb24oKSB7XG5cdFx0XHREb2NzLmNvbGxhcHNlT3BlcmF0aW9uKCQodGhpcykpO1xuXHRcdH0pO1xuXHR9LFxuXG5cdGVzY2FwZVJlc291cmNlTmFtZTogZnVuY3Rpb24ocmVzb3VyY2UpIHtcblx0XHRyZXR1cm4gcmVzb3VyY2UucmVwbGFjZSgvWyFcIiMkJSYnKCkqKywuXFwvOjs8PT4/QFxcW1xcXFxcXF1cXF5ge3x9fl0vZywgXCJcXFxcJCZcIik7XG5cdH0sXG5cblx0ZXhwYW5kT3BlcmF0aW9uOiBmdW5jdGlvbihlbGVtKSB7XG5cdFx0ZWxlbS5zbGlkZURvd24oKTtcblx0fSxcblxuXHRjb2xsYXBzZU9wZXJhdGlvbjogZnVuY3Rpb24oZWxlbSkge1xuXHRcdGVsZW0uc2xpZGVVcCgpO1xuXHR9XG59O1xuIiwiLyohXG4gKiBodHRwczovL2dpdGh1Yi5jb20vZXMtc2hpbXMvZXM1LXNoaW1cbiAqIEBsaWNlbnNlIGVzNS1zaGltIENvcHlyaWdodCAyMDA5LTIwMTUgYnkgY29udHJpYnV0b3JzLCBNSVQgTGljZW5zZVxuICogc2VlIGh0dHBzOi8vZ2l0aHViLmNvbS9lcy1zaGltcy9lczUtc2hpbS9ibG9iL21hc3Rlci9MSUNFTlNFXG4gKi9cblxuLy8gdmltOiB0cz00IHN0cz00IHN3PTQgZXhwYW5kdGFiXG5cbi8vIEFkZCBzZW1pY29sb24gdG8gcHJldmVudCBJSUZFIGZyb20gYmVpbmcgcGFzc2VkIGFzIGFyZ3VtZW50IHRvIGNvbmNhdGVuYXRlZCBjb2RlLlxuO1xuXG4vLyBVTUQgKFVuaXZlcnNhbCBNb2R1bGUgRGVmaW5pdGlvbilcbi8vIHNlZSBodHRwczovL2dpdGh1Yi5jb20vdW1kanMvdW1kL2Jsb2IvbWFzdGVyL3RlbXBsYXRlcy9yZXR1cm5FeHBvcnRzLmpzXG4oZnVuY3Rpb24gKHJvb3QsIGZhY3RvcnkpIHtcbiAgICAndXNlIHN0cmljdCc7XG5cbiAgICAvKiBnbG9iYWwgZGVmaW5lLCBleHBvcnRzLCBtb2R1bGUgKi9cbiAgICBpZiAodHlwZW9mIGRlZmluZSA9PT0gJ2Z1bmN0aW9uJyAmJiBkZWZpbmUuYW1kKSB7XG4gICAgICAgIC8vIEFNRC4gUmVnaXN0ZXIgYXMgYW4gYW5vbnltb3VzIG1vZHVsZS5cbiAgICAgICAgZGVmaW5lKGZhY3RvcnkpO1xuICAgIH0gZWxzZSBpZiAodHlwZW9mIGV4cG9ydHMgPT09ICdvYmplY3QnKSB7XG4gICAgICAgIC8vIE5vZGUuIERvZXMgbm90IHdvcmsgd2l0aCBzdHJpY3QgQ29tbW9uSlMsIGJ1dFxuICAgICAgICAvLyBvbmx5IENvbW1vbkpTLWxpa2UgZW52aXJvbWVudHMgdGhhdCBzdXBwb3J0IG1vZHVsZS5leHBvcnRzLFxuICAgICAgICAvLyBsaWtlIE5vZGUuXG4gICAgICAgIG1vZHVsZS5leHBvcnRzID0gZmFjdG9yeSgpO1xuICAgIH0gZWxzZSB7XG4gICAgICAgIC8vIEJyb3dzZXIgZ2xvYmFscyAocm9vdCBpcyB3aW5kb3cpXG4gICAgICAgIHJvb3QucmV0dXJuRXhwb3J0cyA9IGZhY3RvcnkoKTtcbiAgICB9XG59KHRoaXMsIGZ1bmN0aW9uICgpIHtcbiAgICAvKipcbiAgICAgKiBCcmluZ3MgYW4gZW52aXJvbm1lbnQgYXMgY2xvc2UgdG8gRUNNQVNjcmlwdCA1IGNvbXBsaWFuY2VcbiAgICAgKiBhcyBpcyBwb3NzaWJsZSB3aXRoIHRoZSBmYWNpbGl0aWVzIG9mIGVyc3R3aGlsZSBlbmdpbmVzLlxuICAgICAqXG4gICAgICogQW5ub3RhdGVkIEVTNTogaHR0cDovL2VzNS5naXRodWIuY29tLyAoc3BlY2lmaWMgbGlua3MgYmVsb3cpXG4gICAgICogRVM1IFNwZWM6IGh0dHA6Ly93d3cuZWNtYS1pbnRlcm5hdGlvbmFsLm9yZy9wdWJsaWNhdGlvbnMvZmlsZXMvRUNNQS1TVC9FY21hLTI2Mi5wZGZcbiAgICAgKiBSZXF1aXJlZCByZWFkaW5nOiBodHRwOi8vamF2YXNjcmlwdHdlYmxvZy53b3JkcHJlc3MuY29tLzIwMTEvMTIvMDUvZXh0ZW5kaW5nLWphdmFzY3JpcHQtbmF0aXZlcy9cbiAgICAgKi9cblxuICAgIC8vIFNob3J0Y3V0IHRvIGFuIG9mdGVuIGFjY2Vzc2VkIHByb3BlcnRpZXMsIGluIG9yZGVyIHRvIGF2b2lkIG11bHRpcGxlXG4gICAgLy8gZGVyZWZlcmVuY2UgdGhhdCBjb3N0cyB1bml2ZXJzYWxseS4gVGhpcyBhbHNvIGhvbGRzIGEgcmVmZXJlbmNlIHRvIGtub3duLWdvb2RcbiAgICAvLyBmdW5jdGlvbnMuXG4gICAgdmFyICRBcnJheSA9IEFycmF5O1xuICAgIHZhciBBcnJheVByb3RvdHlwZSA9ICRBcnJheS5wcm90b3R5cGU7XG4gICAgdmFyICRPYmplY3QgPSBPYmplY3Q7XG4gICAgdmFyIE9iamVjdFByb3RvdHlwZSA9ICRPYmplY3QucHJvdG90eXBlO1xuICAgIHZhciAkRnVuY3Rpb24gPSBGdW5jdGlvbjtcbiAgICB2YXIgRnVuY3Rpb25Qcm90b3R5cGUgPSAkRnVuY3Rpb24ucHJvdG90eXBlO1xuICAgIHZhciAkU3RyaW5nID0gU3RyaW5nO1xuICAgIHZhciBTdHJpbmdQcm90b3R5cGUgPSAkU3RyaW5nLnByb3RvdHlwZTtcbiAgICB2YXIgJE51bWJlciA9IE51bWJlcjtcbiAgICB2YXIgTnVtYmVyUHJvdG90eXBlID0gJE51bWJlci5wcm90b3R5cGU7XG4gICAgdmFyIGFycmF5X3NsaWNlID0gQXJyYXlQcm90b3R5cGUuc2xpY2U7XG4gICAgdmFyIGFycmF5X3NwbGljZSA9IEFycmF5UHJvdG90eXBlLnNwbGljZTtcbiAgICB2YXIgYXJyYXlfcHVzaCA9IEFycmF5UHJvdG90eXBlLnB1c2g7XG4gICAgdmFyIGFycmF5X3Vuc2hpZnQgPSBBcnJheVByb3RvdHlwZS51bnNoaWZ0O1xuICAgIHZhciBhcnJheV9jb25jYXQgPSBBcnJheVByb3RvdHlwZS5jb25jYXQ7XG4gICAgdmFyIGFycmF5X2pvaW4gPSBBcnJheVByb3RvdHlwZS5qb2luO1xuICAgIHZhciBjYWxsID0gRnVuY3Rpb25Qcm90b3R5cGUuY2FsbDtcbiAgICB2YXIgYXBwbHkgPSBGdW5jdGlvblByb3RvdHlwZS5hcHBseTtcbiAgICB2YXIgbWF4ID0gTWF0aC5tYXg7XG4gICAgdmFyIG1pbiA9IE1hdGgubWluO1xuXG4gICAgLy8gSGF2aW5nIGEgdG9TdHJpbmcgbG9jYWwgdmFyaWFibGUgbmFtZSBicmVha3MgaW4gT3BlcmEgc28gdXNlIHRvX3N0cmluZy5cbiAgICB2YXIgdG9fc3RyaW5nID0gT2JqZWN0UHJvdG90eXBlLnRvU3RyaW5nO1xuXG4gICAgLyogZ2xvYmFsIFN5bWJvbCAqL1xuICAgIC8qIGVzbGludC1kaXNhYmxlIG9uZS12YXItZGVjbGFyYXRpb24tcGVyLWxpbmUsIG5vLXJlZGVjbGFyZSwgbWF4LXN0YXRlbWVudHMtcGVyLWxpbmUgKi9cbiAgICB2YXIgaGFzVG9TdHJpbmdUYWcgPSB0eXBlb2YgU3ltYm9sID09PSAnZnVuY3Rpb24nICYmIHR5cGVvZiBTeW1ib2wudG9TdHJpbmdUYWcgPT09ICdzeW1ib2wnO1xuICAgIHZhciBpc0NhbGxhYmxlOyAvKiBpbmxpbmVkIGZyb20gaHR0cHM6Ly9ucG1qcy5jb20vaXMtY2FsbGFibGUgKi8gdmFyIGZuVG9TdHIgPSBGdW5jdGlvbi5wcm90b3R5cGUudG9TdHJpbmcsIGNvbnN0cnVjdG9yUmVnZXggPSAvXlxccypjbGFzcyAvLCBpc0VTNkNsYXNzRm4gPSBmdW5jdGlvbiBpc0VTNkNsYXNzRm4odmFsdWUpIHsgdHJ5IHsgdmFyIGZuU3RyID0gZm5Ub1N0ci5jYWxsKHZhbHVlKTsgdmFyIHNpbmdsZVN0cmlwcGVkID0gZm5TdHIucmVwbGFjZSgvXFwvXFwvLipcXG4vZywgJycpOyB2YXIgbXVsdGlTdHJpcHBlZCA9IHNpbmdsZVN0cmlwcGVkLnJlcGxhY2UoL1xcL1xcKlsuXFxzXFxTXSpcXCpcXC8vZywgJycpOyB2YXIgc3BhY2VTdHJpcHBlZCA9IG11bHRpU3RyaXBwZWQucmVwbGFjZSgvXFxuL21nLCAnICcpLnJlcGxhY2UoLyB7Mn0vZywgJyAnKTsgcmV0dXJuIGNvbnN0cnVjdG9yUmVnZXgudGVzdChzcGFjZVN0cmlwcGVkKTsgfSBjYXRjaCAoZSkgeyByZXR1cm4gZmFsc2U7IC8qIG5vdCBhIGZ1bmN0aW9uICovIH0gfSwgdHJ5RnVuY3Rpb25PYmplY3QgPSBmdW5jdGlvbiB0cnlGdW5jdGlvbk9iamVjdCh2YWx1ZSkgeyB0cnkgeyBpZiAoaXNFUzZDbGFzc0ZuKHZhbHVlKSkgeyByZXR1cm4gZmFsc2U7IH0gZm5Ub1N0ci5jYWxsKHZhbHVlKTsgcmV0dXJuIHRydWU7IH0gY2F0Y2ggKGUpIHsgcmV0dXJuIGZhbHNlOyB9IH0sIGZuQ2xhc3MgPSAnW29iamVjdCBGdW5jdGlvbl0nLCBnZW5DbGFzcyA9ICdbb2JqZWN0IEdlbmVyYXRvckZ1bmN0aW9uXScsIGlzQ2FsbGFibGUgPSBmdW5jdGlvbiBpc0NhbGxhYmxlKHZhbHVlKSB7IGlmICghdmFsdWUpIHsgcmV0dXJuIGZhbHNlOyB9IGlmICh0eXBlb2YgdmFsdWUgIT09ICdmdW5jdGlvbicgJiYgdHlwZW9mIHZhbHVlICE9PSAnb2JqZWN0JykgeyByZXR1cm4gZmFsc2U7IH0gaWYgKGhhc1RvU3RyaW5nVGFnKSB7IHJldHVybiB0cnlGdW5jdGlvbk9iamVjdCh2YWx1ZSk7IH0gaWYgKGlzRVM2Q2xhc3NGbih2YWx1ZSkpIHsgcmV0dXJuIGZhbHNlOyB9IHZhciBzdHJDbGFzcyA9IHRvX3N0cmluZy5jYWxsKHZhbHVlKTsgcmV0dXJuIHN0ckNsYXNzID09PSBmbkNsYXNzIHx8IHN0ckNsYXNzID09PSBnZW5DbGFzczsgfTtcblxuICAgIHZhciBpc1JlZ2V4OyAvKiBpbmxpbmVkIGZyb20gaHR0cHM6Ly9ucG1qcy5jb20vaXMtcmVnZXggKi8gdmFyIHJlZ2V4RXhlYyA9IFJlZ0V4cC5wcm90b3R5cGUuZXhlYywgdHJ5UmVnZXhFeGVjID0gZnVuY3Rpb24gdHJ5UmVnZXhFeGVjKHZhbHVlKSB7IHRyeSB7IHJlZ2V4RXhlYy5jYWxsKHZhbHVlKTsgcmV0dXJuIHRydWU7IH0gY2F0Y2ggKGUpIHsgcmV0dXJuIGZhbHNlOyB9IH0sIHJlZ2V4Q2xhc3MgPSAnW29iamVjdCBSZWdFeHBdJzsgaXNSZWdleCA9IGZ1bmN0aW9uIGlzUmVnZXgodmFsdWUpIHsgaWYgKHR5cGVvZiB2YWx1ZSAhPT0gJ29iamVjdCcpIHsgcmV0dXJuIGZhbHNlOyB9IHJldHVybiBoYXNUb1N0cmluZ1RhZyA/IHRyeVJlZ2V4RXhlYyh2YWx1ZSkgOiB0b19zdHJpbmcuY2FsbCh2YWx1ZSkgPT09IHJlZ2V4Q2xhc3M7IH07XG4gICAgdmFyIGlzU3RyaW5nOyAvKiBpbmxpbmVkIGZyb20gaHR0cHM6Ly9ucG1qcy5jb20vaXMtc3RyaW5nICovIHZhciBzdHJWYWx1ZSA9IFN0cmluZy5wcm90b3R5cGUudmFsdWVPZiwgdHJ5U3RyaW5nT2JqZWN0ID0gZnVuY3Rpb24gdHJ5U3RyaW5nT2JqZWN0KHZhbHVlKSB7IHRyeSB7IHN0clZhbHVlLmNhbGwodmFsdWUpOyByZXR1cm4gdHJ1ZTsgfSBjYXRjaCAoZSkgeyByZXR1cm4gZmFsc2U7IH0gfSwgc3RyaW5nQ2xhc3MgPSAnW29iamVjdCBTdHJpbmddJzsgaXNTdHJpbmcgPSBmdW5jdGlvbiBpc1N0cmluZyh2YWx1ZSkgeyBpZiAodHlwZW9mIHZhbHVlID09PSAnc3RyaW5nJykgeyByZXR1cm4gdHJ1ZTsgfSBpZiAodHlwZW9mIHZhbHVlICE9PSAnb2JqZWN0JykgeyByZXR1cm4gZmFsc2U7IH0gcmV0dXJuIGhhc1RvU3RyaW5nVGFnID8gdHJ5U3RyaW5nT2JqZWN0KHZhbHVlKSA6IHRvX3N0cmluZy5jYWxsKHZhbHVlKSA9PT0gc3RyaW5nQ2xhc3M7IH07XG4gICAgLyogZXNsaW50LWVuYWJsZSBvbmUtdmFyLWRlY2xhcmF0aW9uLXBlci1saW5lLCBuby1yZWRlY2xhcmUsIG1heC1zdGF0ZW1lbnRzLXBlci1saW5lICovXG5cbiAgICAvKiBpbmxpbmVkIGZyb20gaHR0cDovL25wbWpzLmNvbS9kZWZpbmUtcHJvcGVydGllcyAqL1xuICAgIHZhciBzdXBwb3J0c0Rlc2NyaXB0b3JzID0gJE9iamVjdC5kZWZpbmVQcm9wZXJ0eSAmJiAoZnVuY3Rpb24gKCkge1xuICAgICAgICB0cnkge1xuICAgICAgICAgICAgdmFyIG9iaiA9IHt9O1xuICAgICAgICAgICAgJE9iamVjdC5kZWZpbmVQcm9wZXJ0eShvYmosICd4JywgeyBlbnVtZXJhYmxlOiBmYWxzZSwgdmFsdWU6IG9iaiB9KTtcbiAgICAgICAgICAgIGZvciAodmFyIF8gaW4gb2JqKSB7IC8vIGpzY3M6aWdub3JlIGRpc2FsbG93VW51c2VkVmFyaWFibGVzXG4gICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgcmV0dXJuIG9iai54ID09PSBvYmo7XG4gICAgICAgIH0gY2F0Y2ggKGUpIHsgLyogdGhpcyBpcyBFUzMgKi9cbiAgICAgICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgICAgfVxuICAgIH0oKSk7XG4gICAgdmFyIGRlZmluZVByb3BlcnRpZXMgPSAoZnVuY3Rpb24gKGhhcykge1xuICAgICAgICAvLyBEZWZpbmUgY29uZmlndXJhYmxlLCB3cml0YWJsZSwgYW5kIG5vbi1lbnVtZXJhYmxlIHByb3BzXG4gICAgICAgIC8vIGlmIHRoZXkgZG9uJ3QgZXhpc3QuXG4gICAgICAgIHZhciBkZWZpbmVQcm9wZXJ0eTtcbiAgICAgICAgaWYgKHN1cHBvcnRzRGVzY3JpcHRvcnMpIHtcbiAgICAgICAgICAgIGRlZmluZVByb3BlcnR5ID0gZnVuY3Rpb24gKG9iamVjdCwgbmFtZSwgbWV0aG9kLCBmb3JjZUFzc2lnbikge1xuICAgICAgICAgICAgICAgIGlmICghZm9yY2VBc3NpZ24gJiYgKG5hbWUgaW4gb2JqZWN0KSkge1xuICAgICAgICAgICAgICAgICAgICByZXR1cm47XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICRPYmplY3QuZGVmaW5lUHJvcGVydHkob2JqZWN0LCBuYW1lLCB7XG4gICAgICAgICAgICAgICAgICAgIGNvbmZpZ3VyYWJsZTogdHJ1ZSxcbiAgICAgICAgICAgICAgICAgICAgZW51bWVyYWJsZTogZmFsc2UsXG4gICAgICAgICAgICAgICAgICAgIHdyaXRhYmxlOiB0cnVlLFxuICAgICAgICAgICAgICAgICAgICB2YWx1ZTogbWV0aG9kXG4gICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICB9O1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgZGVmaW5lUHJvcGVydHkgPSBmdW5jdGlvbiAob2JqZWN0LCBuYW1lLCBtZXRob2QsIGZvcmNlQXNzaWduKSB7XG4gICAgICAgICAgICAgICAgaWYgKCFmb3JjZUFzc2lnbiAmJiAobmFtZSBpbiBvYmplY3QpKSB7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgb2JqZWN0W25hbWVdID0gbWV0aG9kO1xuICAgICAgICAgICAgfTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gZnVuY3Rpb24gZGVmaW5lUHJvcGVydGllcyhvYmplY3QsIG1hcCwgZm9yY2VBc3NpZ24pIHtcbiAgICAgICAgICAgIGZvciAodmFyIG5hbWUgaW4gbWFwKSB7XG4gICAgICAgICAgICAgICAgaWYgKGhhcy5jYWxsKG1hcCwgbmFtZSkpIHtcbiAgICAgICAgICAgICAgICAgICAgZGVmaW5lUHJvcGVydHkob2JqZWN0LCBuYW1lLCBtYXBbbmFtZV0sIGZvcmNlQXNzaWduKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgIH07XG4gICAgfShPYmplY3RQcm90b3R5cGUuaGFzT3duUHJvcGVydHkpKTtcblxuICAgIC8vXG4gICAgLy8gVXRpbFxuICAgIC8vID09PT09PVxuICAgIC8vXG5cbiAgICAvKiByZXBsYWNlYWJsZSB3aXRoIGh0dHBzOi8vbnBtanMuY29tL3BhY2thZ2UvZXMtYWJzdHJhY3QgL2hlbHBlcnMvaXNQcmltaXRpdmUgKi9cbiAgICB2YXIgaXNQcmltaXRpdmUgPSBmdW5jdGlvbiBpc1ByaW1pdGl2ZShpbnB1dCkge1xuICAgICAgICB2YXIgdHlwZSA9IHR5cGVvZiBpbnB1dDtcbiAgICAgICAgcmV0dXJuIGlucHV0ID09PSBudWxsIHx8ICh0eXBlICE9PSAnb2JqZWN0JyAmJiB0eXBlICE9PSAnZnVuY3Rpb24nKTtcbiAgICB9O1xuXG4gICAgdmFyIGlzQWN0dWFsTmFOID0gJE51bWJlci5pc05hTiB8fCBmdW5jdGlvbiBpc0FjdHVhbE5hTih4KSB7XG4gICAgICAgIHJldHVybiB4ICE9PSB4O1xuICAgIH07XG5cbiAgICB2YXIgRVMgPSB7XG4gICAgICAgIC8vIEVTNSA5LjRcbiAgICAgICAgLy8gaHR0cDovL2VzNS5naXRodWIuY29tLyN4OS40XG4gICAgICAgIC8vIGh0dHA6Ly9qc3BlcmYuY29tL3RvLWludGVnZXJcbiAgICAgICAgLyogcmVwbGFjZWFibGUgd2l0aCBodHRwczovL25wbWpzLmNvbS9wYWNrYWdlL2VzLWFic3RyYWN0IEVTNS5Ub0ludGVnZXIgKi9cbiAgICAgICAgVG9JbnRlZ2VyOiBmdW5jdGlvbiBUb0ludGVnZXIobnVtKSB7XG4gICAgICAgICAgICB2YXIgbiA9ICtudW07XG4gICAgICAgICAgICBpZiAoaXNBY3R1YWxOYU4obikpIHtcbiAgICAgICAgICAgICAgICBuID0gMDtcbiAgICAgICAgICAgIH0gZWxzZSBpZiAobiAhPT0gMCAmJiBuICE9PSAoMSAvIDApICYmIG4gIT09IC0oMSAvIDApKSB7XG4gICAgICAgICAgICAgICAgbiA9IChuID4gMCB8fCAtMSkgKiBNYXRoLmZsb29yKE1hdGguYWJzKG4pKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHJldHVybiBuO1xuICAgICAgICB9LFxuXG4gICAgICAgIC8qIHJlcGxhY2VhYmxlIHdpdGggaHR0cHM6Ly9ucG1qcy5jb20vcGFja2FnZS9lcy1hYnN0cmFjdCBFUzUuVG9QcmltaXRpdmUgKi9cbiAgICAgICAgVG9QcmltaXRpdmU6IGZ1bmN0aW9uIFRvUHJpbWl0aXZlKGlucHV0KSB7XG4gICAgICAgICAgICB2YXIgdmFsLCB2YWx1ZU9mLCB0b1N0cjtcbiAgICAgICAgICAgIGlmIChpc1ByaW1pdGl2ZShpbnB1dCkpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gaW5wdXQ7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICB2YWx1ZU9mID0gaW5wdXQudmFsdWVPZjtcbiAgICAgICAgICAgIGlmIChpc0NhbGxhYmxlKHZhbHVlT2YpKSB7XG4gICAgICAgICAgICAgICAgdmFsID0gdmFsdWVPZi5jYWxsKGlucHV0KTtcbiAgICAgICAgICAgICAgICBpZiAoaXNQcmltaXRpdmUodmFsKSkge1xuICAgICAgICAgICAgICAgICAgICByZXR1cm4gdmFsO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHRvU3RyID0gaW5wdXQudG9TdHJpbmc7XG4gICAgICAgICAgICBpZiAoaXNDYWxsYWJsZSh0b1N0cikpIHtcbiAgICAgICAgICAgICAgICB2YWwgPSB0b1N0ci5jYWxsKGlucHV0KTtcbiAgICAgICAgICAgICAgICBpZiAoaXNQcmltaXRpdmUodmFsKSkge1xuICAgICAgICAgICAgICAgICAgICByZXR1cm4gdmFsO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHRocm93IG5ldyBUeXBlRXJyb3IoKTtcbiAgICAgICAgfSxcblxuICAgICAgICAvLyBFUzUgOS45XG4gICAgICAgIC8vIGh0dHA6Ly9lczUuZ2l0aHViLmNvbS8jeDkuOVxuICAgICAgICAvKiByZXBsYWNlYWJsZSB3aXRoIGh0dHBzOi8vbnBtanMuY29tL3BhY2thZ2UvZXMtYWJzdHJhY3QgRVM1LlRvT2JqZWN0ICovXG4gICAgICAgIFRvT2JqZWN0OiBmdW5jdGlvbiAobykge1xuICAgICAgICAgICAgaWYgKG8gPT0gbnVsbCkgeyAvLyB0aGlzIG1hdGNoZXMgYm90aCBudWxsIGFuZCB1bmRlZmluZWRcbiAgICAgICAgICAgICAgICB0aHJvdyBuZXcgVHlwZUVycm9yKFwiY2FuJ3QgY29udmVydCBcIiArIG8gKyAnIHRvIG9iamVjdCcpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgcmV0dXJuICRPYmplY3Qobyk7XG4gICAgICAgIH0sXG5cbiAgICAgICAgLyogcmVwbGFjZWFibGUgd2l0aCBodHRwczovL25wbWpzLmNvbS9wYWNrYWdlL2VzLWFic3RyYWN0IEVTNS5Ub1VpbnQzMiAqL1xuICAgICAgICBUb1VpbnQzMjogZnVuY3Rpb24gVG9VaW50MzIoeCkge1xuICAgICAgICAgICAgcmV0dXJuIHggPj4+IDA7XG4gICAgICAgIH1cbiAgICB9O1xuXG4gICAgLy9cbiAgICAvLyBGdW5jdGlvblxuICAgIC8vID09PT09PT09XG4gICAgLy9cblxuICAgIC8vIEVTLTUgMTUuMy40LjVcbiAgICAvLyBodHRwOi8vZXM1LmdpdGh1Yi5jb20vI3gxNS4zLjQuNVxuXG4gICAgdmFyIEVtcHR5ID0gZnVuY3Rpb24gRW1wdHkoKSB7fTtcblxuICAgIGRlZmluZVByb3BlcnRpZXMoRnVuY3Rpb25Qcm90b3R5cGUsIHtcbiAgICAgICAgYmluZDogZnVuY3Rpb24gYmluZCh0aGF0KSB7IC8vIC5sZW5ndGggaXMgMVxuICAgICAgICAgICAgLy8gMS4gTGV0IFRhcmdldCBiZSB0aGUgdGhpcyB2YWx1ZS5cbiAgICAgICAgICAgIHZhciB0YXJnZXQgPSB0aGlzO1xuICAgICAgICAgICAgLy8gMi4gSWYgSXNDYWxsYWJsZShUYXJnZXQpIGlzIGZhbHNlLCB0aHJvdyBhIFR5cGVFcnJvciBleGNlcHRpb24uXG4gICAgICAgICAgICBpZiAoIWlzQ2FsbGFibGUodGFyZ2V0KSkge1xuICAgICAgICAgICAgICAgIHRocm93IG5ldyBUeXBlRXJyb3IoJ0Z1bmN0aW9uLnByb3RvdHlwZS5iaW5kIGNhbGxlZCBvbiBpbmNvbXBhdGlibGUgJyArIHRhcmdldCk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICAvLyAzLiBMZXQgQSBiZSBhIG5ldyAocG9zc2libHkgZW1wdHkpIGludGVybmFsIGxpc3Qgb2YgYWxsIG9mIHRoZVxuICAgICAgICAgICAgLy8gICBhcmd1bWVudCB2YWx1ZXMgcHJvdmlkZWQgYWZ0ZXIgdGhpc0FyZyAoYXJnMSwgYXJnMiBldGMpLCBpbiBvcmRlci5cbiAgICAgICAgICAgIC8vIFhYWCBzbGljZWRBcmdzIHdpbGwgc3RhbmQgaW4gZm9yIFwiQVwiIGlmIHVzZWRcbiAgICAgICAgICAgIHZhciBhcmdzID0gYXJyYXlfc2xpY2UuY2FsbChhcmd1bWVudHMsIDEpOyAvLyBmb3Igbm9ybWFsIGNhbGxcbiAgICAgICAgICAgIC8vIDQuIExldCBGIGJlIGEgbmV3IG5hdGl2ZSBFQ01BU2NyaXB0IG9iamVjdC5cbiAgICAgICAgICAgIC8vIDExLiBTZXQgdGhlIFtbUHJvdG90eXBlXV0gaW50ZXJuYWwgcHJvcGVydHkgb2YgRiB0byB0aGUgc3RhbmRhcmRcbiAgICAgICAgICAgIC8vICAgYnVpbHQtaW4gRnVuY3Rpb24gcHJvdG90eXBlIG9iamVjdCBhcyBzcGVjaWZpZWQgaW4gMTUuMy4zLjEuXG4gICAgICAgICAgICAvLyAxMi4gU2V0IHRoZSBbW0NhbGxdXSBpbnRlcm5hbCBwcm9wZXJ0eSBvZiBGIGFzIGRlc2NyaWJlZCBpblxuICAgICAgICAgICAgLy8gICAxNS4zLjQuNS4xLlxuICAgICAgICAgICAgLy8gMTMuIFNldCB0aGUgW1tDb25zdHJ1Y3RdXSBpbnRlcm5hbCBwcm9wZXJ0eSBvZiBGIGFzIGRlc2NyaWJlZCBpblxuICAgICAgICAgICAgLy8gICAxNS4zLjQuNS4yLlxuICAgICAgICAgICAgLy8gMTQuIFNldCB0aGUgW1tIYXNJbnN0YW5jZV1dIGludGVybmFsIHByb3BlcnR5IG9mIEYgYXMgZGVzY3JpYmVkIGluXG4gICAgICAgICAgICAvLyAgIDE1LjMuNC41LjMuXG4gICAgICAgICAgICB2YXIgYm91bmQ7XG4gICAgICAgICAgICB2YXIgYmluZGVyID0gZnVuY3Rpb24gKCkge1xuXG4gICAgICAgICAgICAgICAgaWYgKHRoaXMgaW5zdGFuY2VvZiBib3VuZCkge1xuICAgICAgICAgICAgICAgICAgICAvLyAxNS4zLjQuNS4yIFtbQ29uc3RydWN0XV1cbiAgICAgICAgICAgICAgICAgICAgLy8gV2hlbiB0aGUgW1tDb25zdHJ1Y3RdXSBpbnRlcm5hbCBtZXRob2Qgb2YgYSBmdW5jdGlvbiBvYmplY3QsXG4gICAgICAgICAgICAgICAgICAgIC8vIEYgdGhhdCB3YXMgY3JlYXRlZCB1c2luZyB0aGUgYmluZCBmdW5jdGlvbiBpcyBjYWxsZWQgd2l0aCBhXG4gICAgICAgICAgICAgICAgICAgIC8vIGxpc3Qgb2YgYXJndW1lbnRzIEV4dHJhQXJncywgdGhlIGZvbGxvd2luZyBzdGVwcyBhcmUgdGFrZW46XG4gICAgICAgICAgICAgICAgICAgIC8vIDEuIExldCB0YXJnZXQgYmUgdGhlIHZhbHVlIG9mIEYncyBbW1RhcmdldEZ1bmN0aW9uXV1cbiAgICAgICAgICAgICAgICAgICAgLy8gICBpbnRlcm5hbCBwcm9wZXJ0eS5cbiAgICAgICAgICAgICAgICAgICAgLy8gMi4gSWYgdGFyZ2V0IGhhcyBubyBbW0NvbnN0cnVjdF1dIGludGVybmFsIG1ldGhvZCwgYVxuICAgICAgICAgICAgICAgICAgICAvLyAgIFR5cGVFcnJvciBleGNlcHRpb24gaXMgdGhyb3duLlxuICAgICAgICAgICAgICAgICAgICAvLyAzLiBMZXQgYm91bmRBcmdzIGJlIHRoZSB2YWx1ZSBvZiBGJ3MgW1tCb3VuZEFyZ3NdXSBpbnRlcm5hbFxuICAgICAgICAgICAgICAgICAgICAvLyAgIHByb3BlcnR5LlxuICAgICAgICAgICAgICAgICAgICAvLyA0LiBMZXQgYXJncyBiZSBhIG5ldyBsaXN0IGNvbnRhaW5pbmcgdGhlIHNhbWUgdmFsdWVzIGFzIHRoZVxuICAgICAgICAgICAgICAgICAgICAvLyAgIGxpc3QgYm91bmRBcmdzIGluIHRoZSBzYW1lIG9yZGVyIGZvbGxvd2VkIGJ5IHRoZSBzYW1lXG4gICAgICAgICAgICAgICAgICAgIC8vICAgdmFsdWVzIGFzIHRoZSBsaXN0IEV4dHJhQXJncyBpbiB0aGUgc2FtZSBvcmRlci5cbiAgICAgICAgICAgICAgICAgICAgLy8gNS4gUmV0dXJuIHRoZSByZXN1bHQgb2YgY2FsbGluZyB0aGUgW1tDb25zdHJ1Y3RdXSBpbnRlcm5hbFxuICAgICAgICAgICAgICAgICAgICAvLyAgIG1ldGhvZCBvZiB0YXJnZXQgcHJvdmlkaW5nIGFyZ3MgYXMgdGhlIGFyZ3VtZW50cy5cblxuICAgICAgICAgICAgICAgICAgICB2YXIgcmVzdWx0ID0gYXBwbHkuY2FsbChcbiAgICAgICAgICAgICAgICAgICAgICAgIHRhcmdldCxcbiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMsXG4gICAgICAgICAgICAgICAgICAgICAgICBhcnJheV9jb25jYXQuY2FsbChhcmdzLCBhcnJheV9zbGljZS5jYWxsKGFyZ3VtZW50cykpXG4gICAgICAgICAgICAgICAgICAgICk7XG4gICAgICAgICAgICAgICAgICAgIGlmICgkT2JqZWN0KHJlc3VsdCkgPT09IHJlc3VsdCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHJlc3VsdDtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICByZXR1cm4gdGhpcztcblxuICAgICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgIC8vIDE1LjMuNC41LjEgW1tDYWxsXV1cbiAgICAgICAgICAgICAgICAgICAgLy8gV2hlbiB0aGUgW1tDYWxsXV0gaW50ZXJuYWwgbWV0aG9kIG9mIGEgZnVuY3Rpb24gb2JqZWN0LCBGLFxuICAgICAgICAgICAgICAgICAgICAvLyB3aGljaCB3YXMgY3JlYXRlZCB1c2luZyB0aGUgYmluZCBmdW5jdGlvbiBpcyBjYWxsZWQgd2l0aCBhXG4gICAgICAgICAgICAgICAgICAgIC8vIHRoaXMgdmFsdWUgYW5kIGEgbGlzdCBvZiBhcmd1bWVudHMgRXh0cmFBcmdzLCB0aGUgZm9sbG93aW5nXG4gICAgICAgICAgICAgICAgICAgIC8vIHN0ZXBzIGFyZSB0YWtlbjpcbiAgICAgICAgICAgICAgICAgICAgLy8gMS4gTGV0IGJvdW5kQXJncyBiZSB0aGUgdmFsdWUgb2YgRidzIFtbQm91bmRBcmdzXV0gaW50ZXJuYWxcbiAgICAgICAgICAgICAgICAgICAgLy8gICBwcm9wZXJ0eS5cbiAgICAgICAgICAgICAgICAgICAgLy8gMi4gTGV0IGJvdW5kVGhpcyBiZSB0aGUgdmFsdWUgb2YgRidzIFtbQm91bmRUaGlzXV0gaW50ZXJuYWxcbiAgICAgICAgICAgICAgICAgICAgLy8gICBwcm9wZXJ0eS5cbiAgICAgICAgICAgICAgICAgICAgLy8gMy4gTGV0IHRhcmdldCBiZSB0aGUgdmFsdWUgb2YgRidzIFtbVGFyZ2V0RnVuY3Rpb25dXSBpbnRlcm5hbFxuICAgICAgICAgICAgICAgICAgICAvLyAgIHByb3BlcnR5LlxuICAgICAgICAgICAgICAgICAgICAvLyA0LiBMZXQgYXJncyBiZSBhIG5ldyBsaXN0IGNvbnRhaW5pbmcgdGhlIHNhbWUgdmFsdWVzIGFzIHRoZVxuICAgICAgICAgICAgICAgICAgICAvLyAgIGxpc3QgYm91bmRBcmdzIGluIHRoZSBzYW1lIG9yZGVyIGZvbGxvd2VkIGJ5IHRoZSBzYW1lXG4gICAgICAgICAgICAgICAgICAgIC8vICAgdmFsdWVzIGFzIHRoZSBsaXN0IEV4dHJhQXJncyBpbiB0aGUgc2FtZSBvcmRlci5cbiAgICAgICAgICAgICAgICAgICAgLy8gNS4gUmV0dXJuIHRoZSByZXN1bHQgb2YgY2FsbGluZyB0aGUgW1tDYWxsXV0gaW50ZXJuYWwgbWV0aG9kXG4gICAgICAgICAgICAgICAgICAgIC8vICAgb2YgdGFyZ2V0IHByb3ZpZGluZyBib3VuZFRoaXMgYXMgdGhlIHRoaXMgdmFsdWUgYW5kXG4gICAgICAgICAgICAgICAgICAgIC8vICAgcHJvdmlkaW5nIGFyZ3MgYXMgdGhlIGFyZ3VtZW50cy5cblxuICAgICAgICAgICAgICAgICAgICAvLyBlcXVpdjogdGFyZ2V0LmNhbGwodGhpcywgLi4uYm91bmRBcmdzLCAuLi5hcmdzKVxuICAgICAgICAgICAgICAgICAgICByZXR1cm4gYXBwbHkuY2FsbChcbiAgICAgICAgICAgICAgICAgICAgICAgIHRhcmdldCxcbiAgICAgICAgICAgICAgICAgICAgICAgIHRoYXQsXG4gICAgICAgICAgICAgICAgICAgICAgICBhcnJheV9jb25jYXQuY2FsbChhcmdzLCBhcnJheV9zbGljZS5jYWxsKGFyZ3VtZW50cykpXG4gICAgICAgICAgICAgICAgICAgICk7XG5cbiAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIH07XG5cbiAgICAgICAgICAgIC8vIDE1LiBJZiB0aGUgW1tDbGFzc11dIGludGVybmFsIHByb3BlcnR5IG9mIFRhcmdldCBpcyBcIkZ1bmN0aW9uXCIsIHRoZW5cbiAgICAgICAgICAgIC8vICAgICBhLiBMZXQgTCBiZSB0aGUgbGVuZ3RoIHByb3BlcnR5IG9mIFRhcmdldCBtaW51cyB0aGUgbGVuZ3RoIG9mIEEuXG4gICAgICAgICAgICAvLyAgICAgYi4gU2V0IHRoZSBsZW5ndGggb3duIHByb3BlcnR5IG9mIEYgdG8gZWl0aGVyIDAgb3IgTCwgd2hpY2hldmVyIGlzXG4gICAgICAgICAgICAvLyAgICAgICBsYXJnZXIuXG4gICAgICAgICAgICAvLyAxNi4gRWxzZSBzZXQgdGhlIGxlbmd0aCBvd24gcHJvcGVydHkgb2YgRiB0byAwLlxuXG4gICAgICAgICAgICB2YXIgYm91bmRMZW5ndGggPSBtYXgoMCwgdGFyZ2V0Lmxlbmd0aCAtIGFyZ3MubGVuZ3RoKTtcblxuICAgICAgICAgICAgLy8gMTcuIFNldCB0aGUgYXR0cmlidXRlcyBvZiB0aGUgbGVuZ3RoIG93biBwcm9wZXJ0eSBvZiBGIHRvIHRoZSB2YWx1ZXNcbiAgICAgICAgICAgIC8vICAgc3BlY2lmaWVkIGluIDE1LjMuNS4xLlxuICAgICAgICAgICAgdmFyIGJvdW5kQXJncyA9IFtdO1xuICAgICAgICAgICAgZm9yICh2YXIgaSA9IDA7IGkgPCBib3VuZExlbmd0aDsgaSsrKSB7XG4gICAgICAgICAgICAgICAgYXJyYXlfcHVzaC5jYWxsKGJvdW5kQXJncywgJyQnICsgaSk7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIC8vIFhYWCBCdWlsZCBhIGR5bmFtaWMgZnVuY3Rpb24gd2l0aCBkZXNpcmVkIGFtb3VudCBvZiBhcmd1bWVudHMgaXMgdGhlIG9ubHlcbiAgICAgICAgICAgIC8vIHdheSB0byBzZXQgdGhlIGxlbmd0aCBwcm9wZXJ0eSBvZiBhIGZ1bmN0aW9uLlxuICAgICAgICAgICAgLy8gSW4gZW52aXJvbm1lbnRzIHdoZXJlIENvbnRlbnQgU2VjdXJpdHkgUG9saWNpZXMgZW5hYmxlZCAoQ2hyb21lIGV4dGVuc2lvbnMsXG4gICAgICAgICAgICAvLyBmb3IgZXguKSBhbGwgdXNlIG9mIGV2YWwgb3IgRnVuY3Rpb24gY29zdHJ1Y3RvciB0aHJvd3MgYW4gZXhjZXB0aW9uLlxuICAgICAgICAgICAgLy8gSG93ZXZlciBpbiBhbGwgb2YgdGhlc2UgZW52aXJvbm1lbnRzIEZ1bmN0aW9uLnByb3RvdHlwZS5iaW5kIGV4aXN0c1xuICAgICAgICAgICAgLy8gYW5kIHNvIHRoaXMgY29kZSB3aWxsIG5ldmVyIGJlIGV4ZWN1dGVkLlxuICAgICAgICAgICAgYm91bmQgPSAkRnVuY3Rpb24oJ2JpbmRlcicsICdyZXR1cm4gZnVuY3Rpb24gKCcgKyBhcnJheV9qb2luLmNhbGwoYm91bmRBcmdzLCAnLCcpICsgJyl7IHJldHVybiBiaW5kZXIuYXBwbHkodGhpcywgYXJndW1lbnRzKTsgfScpKGJpbmRlcik7XG5cbiAgICAgICAgICAgIGlmICh0YXJnZXQucHJvdG90eXBlKSB7XG4gICAgICAgICAgICAgICAgRW1wdHkucHJvdG90eXBlID0gdGFyZ2V0LnByb3RvdHlwZTtcbiAgICAgICAgICAgICAgICBib3VuZC5wcm90b3R5cGUgPSBuZXcgRW1wdHkoKTtcbiAgICAgICAgICAgICAgICAvLyBDbGVhbiB1cCBkYW5nbGluZyByZWZlcmVuY2VzLlxuICAgICAgICAgICAgICAgIEVtcHR5LnByb3RvdHlwZSA9IG51bGw7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIC8vIFRPRE9cbiAgICAgICAgICAgIC8vIDE4LiBTZXQgdGhlIFtbRXh0ZW5zaWJsZV1dIGludGVybmFsIHByb3BlcnR5IG9mIEYgdG8gdHJ1ZS5cblxuICAgICAgICAgICAgLy8gVE9ET1xuICAgICAgICAgICAgLy8gMTkuIExldCB0aHJvd2VyIGJlIHRoZSBbW1Rocm93VHlwZUVycm9yXV0gZnVuY3Rpb24gT2JqZWN0ICgxMy4yLjMpLlxuICAgICAgICAgICAgLy8gMjAuIENhbGwgdGhlIFtbRGVmaW5lT3duUHJvcGVydHldXSBpbnRlcm5hbCBtZXRob2Qgb2YgRiB3aXRoXG4gICAgICAgICAgICAvLyAgIGFyZ3VtZW50cyBcImNhbGxlclwiLCBQcm9wZXJ0eURlc2NyaXB0b3Ige1tbR2V0XV06IHRocm93ZXIsIFtbU2V0XV06XG4gICAgICAgICAgICAvLyAgIHRocm93ZXIsIFtbRW51bWVyYWJsZV1dOiBmYWxzZSwgW1tDb25maWd1cmFibGVdXTogZmFsc2V9LCBhbmRcbiAgICAgICAgICAgIC8vICAgZmFsc2UuXG4gICAgICAgICAgICAvLyAyMS4gQ2FsbCB0aGUgW1tEZWZpbmVPd25Qcm9wZXJ0eV1dIGludGVybmFsIG1ldGhvZCBvZiBGIHdpdGhcbiAgICAgICAgICAgIC8vICAgYXJndW1lbnRzIFwiYXJndW1lbnRzXCIsIFByb3BlcnR5RGVzY3JpcHRvciB7W1tHZXRdXTogdGhyb3dlcixcbiAgICAgICAgICAgIC8vICAgW1tTZXRdXTogdGhyb3dlciwgW1tFbnVtZXJhYmxlXV06IGZhbHNlLCBbW0NvbmZpZ3VyYWJsZV1dOiBmYWxzZX0sXG4gICAgICAgICAgICAvLyAgIGFuZCBmYWxzZS5cblxuICAgICAgICAgICAgLy8gVE9ET1xuICAgICAgICAgICAgLy8gTk9URSBGdW5jdGlvbiBvYmplY3RzIGNyZWF0ZWQgdXNpbmcgRnVuY3Rpb24ucHJvdG90eXBlLmJpbmQgZG8gbm90XG4gICAgICAgICAgICAvLyBoYXZlIGEgcHJvdG90eXBlIHByb3BlcnR5IG9yIHRoZSBbW0NvZGVdXSwgW1tGb3JtYWxQYXJhbWV0ZXJzXV0sIGFuZFxuICAgICAgICAgICAgLy8gW1tTY29wZV1dIGludGVybmFsIHByb3BlcnRpZXMuXG4gICAgICAgICAgICAvLyBYWFggY2FuJ3QgZGVsZXRlIHByb3RvdHlwZSBpbiBwdXJlLWpzLlxuXG4gICAgICAgICAgICAvLyAyMi4gUmV0dXJuIEYuXG4gICAgICAgICAgICByZXR1cm4gYm91bmQ7XG4gICAgICAgIH1cbiAgICB9KTtcblxuICAgIC8vIF9QbGVhc2Ugbm90ZTogU2hvcnRjdXRzIGFyZSBkZWZpbmVkIGFmdGVyIGBGdW5jdGlvbi5wcm90b3R5cGUuYmluZGAgYXMgd2VcbiAgICAvLyB1c2UgaXQgaW4gZGVmaW5pbmcgc2hvcnRjdXRzLlxuICAgIHZhciBvd25zID0gY2FsbC5iaW5kKE9iamVjdFByb3RvdHlwZS5oYXNPd25Qcm9wZXJ0eSk7XG4gICAgdmFyIHRvU3RyID0gY2FsbC5iaW5kKE9iamVjdFByb3RvdHlwZS50b1N0cmluZyk7XG4gICAgdmFyIGFycmF5U2xpY2UgPSBjYWxsLmJpbmQoYXJyYXlfc2xpY2UpO1xuICAgIHZhciBhcnJheVNsaWNlQXBwbHkgPSBhcHBseS5iaW5kKGFycmF5X3NsaWNlKTtcbiAgICB2YXIgc3RyU2xpY2UgPSBjYWxsLmJpbmQoU3RyaW5nUHJvdG90eXBlLnNsaWNlKTtcbiAgICB2YXIgc3RyU3BsaXQgPSBjYWxsLmJpbmQoU3RyaW5nUHJvdG90eXBlLnNwbGl0KTtcbiAgICB2YXIgc3RySW5kZXhPZiA9IGNhbGwuYmluZChTdHJpbmdQcm90b3R5cGUuaW5kZXhPZik7XG4gICAgdmFyIHB1c2hDYWxsID0gY2FsbC5iaW5kKGFycmF5X3B1c2gpO1xuICAgIHZhciBpc0VudW0gPSBjYWxsLmJpbmQoT2JqZWN0UHJvdG90eXBlLnByb3BlcnR5SXNFbnVtZXJhYmxlKTtcbiAgICB2YXIgYXJyYXlTb3J0ID0gY2FsbC5iaW5kKEFycmF5UHJvdG90eXBlLnNvcnQpO1xuXG4gICAgLy9cbiAgICAvLyBBcnJheVxuICAgIC8vID09PT09XG4gICAgLy9cblxuICAgIHZhciBpc0FycmF5ID0gJEFycmF5LmlzQXJyYXkgfHwgZnVuY3Rpb24gaXNBcnJheShvYmopIHtcbiAgICAgICAgcmV0dXJuIHRvU3RyKG9iaikgPT09ICdbb2JqZWN0IEFycmF5XSc7XG4gICAgfTtcblxuICAgIC8vIEVTNSAxNS40LjQuMTJcbiAgICAvLyBodHRwOi8vZXM1LmdpdGh1Yi5jb20vI3gxNS40LjQuMTNcbiAgICAvLyBSZXR1cm4gbGVuK2FyZ0NvdW50LlxuICAgIC8vIFtidWdmaXgsIGllbHQ4XVxuICAgIC8vIElFIDwgOCBidWc6IFtdLnVuc2hpZnQoMCkgPT09IHVuZGVmaW5lZCBidXQgc2hvdWxkIGJlIFwiMVwiXG4gICAgdmFyIGhhc1Vuc2hpZnRSZXR1cm5WYWx1ZUJ1ZyA9IFtdLnVuc2hpZnQoMCkgIT09IDE7XG4gICAgZGVmaW5lUHJvcGVydGllcyhBcnJheVByb3RvdHlwZSwge1xuICAgICAgICB1bnNoaWZ0OiBmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgICBhcnJheV91bnNoaWZ0LmFwcGx5KHRoaXMsIGFyZ3VtZW50cyk7XG4gICAgICAgICAgICByZXR1cm4gdGhpcy5sZW5ndGg7XG4gICAgICAgIH1cbiAgICB9LCBoYXNVbnNoaWZ0UmV0dXJuVmFsdWVCdWcpO1xuXG4gICAgLy8gRVM1IDE1LjQuMy4yXG4gICAgLy8gaHR0cDovL2VzNS5naXRodWIuY29tLyN4MTUuNC4zLjJcbiAgICAvLyBodHRwczovL2RldmVsb3Blci5tb3ppbGxhLm9yZy9lbi9KYXZhU2NyaXB0L1JlZmVyZW5jZS9HbG9iYWxfT2JqZWN0cy9BcnJheS9pc0FycmF5XG4gICAgZGVmaW5lUHJvcGVydGllcygkQXJyYXksIHsgaXNBcnJheTogaXNBcnJheSB9KTtcblxuICAgIC8vIFRoZSBJc0NhbGxhYmxlKCkgY2hlY2sgaW4gdGhlIEFycmF5IGZ1bmN0aW9uc1xuICAgIC8vIGhhcyBiZWVuIHJlcGxhY2VkIHdpdGggYSBzdHJpY3QgY2hlY2sgb24gdGhlXG4gICAgLy8gaW50ZXJuYWwgY2xhc3Mgb2YgdGhlIG9iamVjdCB0byB0cmFwIGNhc2VzIHdoZXJlXG4gICAgLy8gdGhlIHByb3ZpZGVkIGZ1bmN0aW9uIHdhcyBhY3R1YWxseSBhIHJlZ3VsYXJcbiAgICAvLyBleHByZXNzaW9uIGxpdGVyYWwsIHdoaWNoIGluIFY4IGFuZFxuICAgIC8vIEphdmFTY3JpcHRDb3JlIGlzIGEgdHlwZW9mIFwiZnVuY3Rpb25cIi4gIE9ubHkgaW5cbiAgICAvLyBWOCBhcmUgcmVndWxhciBleHByZXNzaW9uIGxpdGVyYWxzIHBlcm1pdHRlZCBhc1xuICAgIC8vIHJlZHVjZSBwYXJhbWV0ZXJzLCBzbyBpdCBpcyBkZXNpcmFibGUgaW4gdGhlXG4gICAgLy8gZ2VuZXJhbCBjYXNlIGZvciB0aGUgc2hpbSB0byBtYXRjaCB0aGUgbW9yZVxuICAgIC8vIHN0cmljdCBhbmQgY29tbW9uIGJlaGF2aW9yIG9mIHJlamVjdGluZyByZWd1bGFyXG4gICAgLy8gZXhwcmVzc2lvbnMuXG5cbiAgICAvLyBFUzUgMTUuNC40LjE4XG4gICAgLy8gaHR0cDovL2VzNS5naXRodWIuY29tLyN4MTUuNC40LjE4XG4gICAgLy8gaHR0cHM6Ly9kZXZlbG9wZXIubW96aWxsYS5vcmcvZW4vSmF2YVNjcmlwdC9SZWZlcmVuY2UvR2xvYmFsX09iamVjdHMvYXJyYXkvZm9yRWFjaFxuXG4gICAgLy8gQ2hlY2sgZmFpbHVyZSBvZiBieS1pbmRleCBhY2Nlc3Mgb2Ygc3RyaW5nIGNoYXJhY3RlcnMgKElFIDwgOSlcbiAgICAvLyBhbmQgZmFpbHVyZSBvZiBgMCBpbiBib3hlZFN0cmluZ2AgKFJoaW5vKVxuICAgIHZhciBib3hlZFN0cmluZyA9ICRPYmplY3QoJ2EnKTtcbiAgICB2YXIgc3BsaXRTdHJpbmcgPSBib3hlZFN0cmluZ1swXSAhPT0gJ2EnIHx8ICEoMCBpbiBib3hlZFN0cmluZyk7XG5cbiAgICB2YXIgcHJvcGVybHlCb3hlc0NvbnRleHQgPSBmdW5jdGlvbiBwcm9wZXJseUJveGVkKG1ldGhvZCkge1xuICAgICAgICAvLyBDaGVjayBub2RlIDAuNi4yMSBidWcgd2hlcmUgdGhpcmQgcGFyYW1ldGVyIGlzIG5vdCBib3hlZFxuICAgICAgICB2YXIgcHJvcGVybHlCb3hlc05vblN0cmljdCA9IHRydWU7XG4gICAgICAgIHZhciBwcm9wZXJseUJveGVzU3RyaWN0ID0gdHJ1ZTtcbiAgICAgICAgdmFyIHRocmV3RXhjZXB0aW9uID0gZmFsc2U7XG4gICAgICAgIGlmIChtZXRob2QpIHtcbiAgICAgICAgICAgIHRyeSB7XG4gICAgICAgICAgICAgICAgbWV0aG9kLmNhbGwoJ2ZvbycsIGZ1bmN0aW9uIChfLCBfXywgY29udGV4dCkge1xuICAgICAgICAgICAgICAgICAgICBpZiAodHlwZW9mIGNvbnRleHQgIT09ICdvYmplY3QnKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBwcm9wZXJseUJveGVzTm9uU3RyaWN0ID0gZmFsc2U7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9KTtcblxuICAgICAgICAgICAgICAgIG1ldGhvZC5jYWxsKFsxXSwgZnVuY3Rpb24gKCkge1xuICAgICAgICAgICAgICAgICAgICAndXNlIHN0cmljdCc7XG5cbiAgICAgICAgICAgICAgICAgICAgcHJvcGVybHlCb3hlc1N0cmljdCA9IHR5cGVvZiB0aGlzID09PSAnc3RyaW5nJztcbiAgICAgICAgICAgICAgICB9LCAneCcpO1xuICAgICAgICAgICAgfSBjYXRjaCAoZSkge1xuICAgICAgICAgICAgICAgIHRocmV3RXhjZXB0aW9uID0gdHJ1ZTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gISFtZXRob2QgJiYgIXRocmV3RXhjZXB0aW9uICYmIHByb3Blcmx5Qm94ZXNOb25TdHJpY3QgJiYgcHJvcGVybHlCb3hlc1N0cmljdDtcbiAgICB9O1xuXG4gICAgZGVmaW5lUHJvcGVydGllcyhBcnJheVByb3RvdHlwZSwge1xuICAgICAgICBmb3JFYWNoOiBmdW5jdGlvbiBmb3JFYWNoKGNhbGxiYWNrZm4vKiwgdGhpc0FyZyovKSB7XG4gICAgICAgICAgICB2YXIgb2JqZWN0ID0gRVMuVG9PYmplY3QodGhpcyk7XG4gICAgICAgICAgICB2YXIgc2VsZiA9IHNwbGl0U3RyaW5nICYmIGlzU3RyaW5nKHRoaXMpID8gc3RyU3BsaXQodGhpcywgJycpIDogb2JqZWN0O1xuICAgICAgICAgICAgdmFyIGkgPSAtMTtcbiAgICAgICAgICAgIHZhciBsZW5ndGggPSBFUy5Ub1VpbnQzMihzZWxmLmxlbmd0aCk7XG4gICAgICAgICAgICB2YXIgVDtcbiAgICAgICAgICAgIGlmIChhcmd1bWVudHMubGVuZ3RoID4gMSkge1xuICAgICAgICAgICAgICAgIFQgPSBhcmd1bWVudHNbMV07XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIC8vIElmIG5vIGNhbGxiYWNrIGZ1bmN0aW9uIG9yIGlmIGNhbGxiYWNrIGlzIG5vdCBhIGNhbGxhYmxlIGZ1bmN0aW9uXG4gICAgICAgICAgICBpZiAoIWlzQ2FsbGFibGUoY2FsbGJhY2tmbikpIHtcbiAgICAgICAgICAgICAgICB0aHJvdyBuZXcgVHlwZUVycm9yKCdBcnJheS5wcm90b3R5cGUuZm9yRWFjaCBjYWxsYmFjayBtdXN0IGJlIGEgZnVuY3Rpb24nKTtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgd2hpbGUgKCsraSA8IGxlbmd0aCkge1xuICAgICAgICAgICAgICAgIGlmIChpIGluIHNlbGYpIHtcbiAgICAgICAgICAgICAgICAgICAgLy8gSW52b2tlIHRoZSBjYWxsYmFjayBmdW5jdGlvbiB3aXRoIGNhbGwsIHBhc3NpbmcgYXJndW1lbnRzOlxuICAgICAgICAgICAgICAgICAgICAvLyBjb250ZXh0LCBwcm9wZXJ0eSB2YWx1ZSwgcHJvcGVydHkga2V5LCB0aGlzQXJnIG9iamVjdFxuICAgICAgICAgICAgICAgICAgICBpZiAodHlwZW9mIFQgPT09ICd1bmRlZmluZWQnKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBjYWxsYmFja2ZuKHNlbGZbaV0sIGksIG9iamVjdCk7XG4gICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBjYWxsYmFja2ZuLmNhbGwoVCwgc2VsZltpXSwgaSwgb2JqZWN0KTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgIH0sICFwcm9wZXJseUJveGVzQ29udGV4dChBcnJheVByb3RvdHlwZS5mb3JFYWNoKSk7XG5cbiAgICAvLyBFUzUgMTUuNC40LjE5XG4gICAgLy8gaHR0cDovL2VzNS5naXRodWIuY29tLyN4MTUuNC40LjE5XG4gICAgLy8gaHR0cHM6Ly9kZXZlbG9wZXIubW96aWxsYS5vcmcvZW4vQ29yZV9KYXZhU2NyaXB0XzEuNV9SZWZlcmVuY2UvT2JqZWN0cy9BcnJheS9tYXBcbiAgICBkZWZpbmVQcm9wZXJ0aWVzKEFycmF5UHJvdG90eXBlLCB7XG4gICAgICAgIG1hcDogZnVuY3Rpb24gbWFwKGNhbGxiYWNrZm4vKiwgdGhpc0FyZyovKSB7XG4gICAgICAgICAgICB2YXIgb2JqZWN0ID0gRVMuVG9PYmplY3QodGhpcyk7XG4gICAgICAgICAgICB2YXIgc2VsZiA9IHNwbGl0U3RyaW5nICYmIGlzU3RyaW5nKHRoaXMpID8gc3RyU3BsaXQodGhpcywgJycpIDogb2JqZWN0O1xuICAgICAgICAgICAgdmFyIGxlbmd0aCA9IEVTLlRvVWludDMyKHNlbGYubGVuZ3RoKTtcbiAgICAgICAgICAgIHZhciByZXN1bHQgPSAkQXJyYXkobGVuZ3RoKTtcbiAgICAgICAgICAgIHZhciBUO1xuICAgICAgICAgICAgaWYgKGFyZ3VtZW50cy5sZW5ndGggPiAxKSB7XG4gICAgICAgICAgICAgICAgVCA9IGFyZ3VtZW50c1sxXTtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgLy8gSWYgbm8gY2FsbGJhY2sgZnVuY3Rpb24gb3IgaWYgY2FsbGJhY2sgaXMgbm90IGEgY2FsbGFibGUgZnVuY3Rpb25cbiAgICAgICAgICAgIGlmICghaXNDYWxsYWJsZShjYWxsYmFja2ZuKSkge1xuICAgICAgICAgICAgICAgIHRocm93IG5ldyBUeXBlRXJyb3IoJ0FycmF5LnByb3RvdHlwZS5tYXAgY2FsbGJhY2sgbXVzdCBiZSBhIGZ1bmN0aW9uJyk7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIGZvciAodmFyIGkgPSAwOyBpIDwgbGVuZ3RoOyBpKyspIHtcbiAgICAgICAgICAgICAgICBpZiAoaSBpbiBzZWxmKSB7XG4gICAgICAgICAgICAgICAgICAgIGlmICh0eXBlb2YgVCA9PT0gJ3VuZGVmaW5lZCcpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHJlc3VsdFtpXSA9IGNhbGxiYWNrZm4oc2VsZltpXSwgaSwgb2JqZWN0KTtcbiAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHJlc3VsdFtpXSA9IGNhbGxiYWNrZm4uY2FsbChULCBzZWxmW2ldLCBpLCBvYmplY3QpO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICAgICAgcmV0dXJuIHJlc3VsdDtcbiAgICAgICAgfVxuICAgIH0sICFwcm9wZXJseUJveGVzQ29udGV4dChBcnJheVByb3RvdHlwZS5tYXApKTtcblxuICAgIC8vIEVTNSAxNS40LjQuMjBcbiAgICAvLyBodHRwOi8vZXM1LmdpdGh1Yi5jb20vI3gxNS40LjQuMjBcbiAgICAvLyBodHRwczovL2RldmVsb3Blci5tb3ppbGxhLm9yZy9lbi9Db3JlX0phdmFTY3JpcHRfMS41X1JlZmVyZW5jZS9PYmplY3RzL0FycmF5L2ZpbHRlclxuICAgIGRlZmluZVByb3BlcnRpZXMoQXJyYXlQcm90b3R5cGUsIHtcbiAgICAgICAgZmlsdGVyOiBmdW5jdGlvbiBmaWx0ZXIoY2FsbGJhY2tmbi8qLCB0aGlzQXJnKi8pIHtcbiAgICAgICAgICAgIHZhciBvYmplY3QgPSBFUy5Ub09iamVjdCh0aGlzKTtcbiAgICAgICAgICAgIHZhciBzZWxmID0gc3BsaXRTdHJpbmcgJiYgaXNTdHJpbmcodGhpcykgPyBzdHJTcGxpdCh0aGlzLCAnJykgOiBvYmplY3Q7XG4gICAgICAgICAgICB2YXIgbGVuZ3RoID0gRVMuVG9VaW50MzIoc2VsZi5sZW5ndGgpO1xuICAgICAgICAgICAgdmFyIHJlc3VsdCA9IFtdO1xuICAgICAgICAgICAgdmFyIHZhbHVlO1xuICAgICAgICAgICAgdmFyIFQ7XG4gICAgICAgICAgICBpZiAoYXJndW1lbnRzLmxlbmd0aCA+IDEpIHtcbiAgICAgICAgICAgICAgICBUID0gYXJndW1lbnRzWzFdO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAvLyBJZiBubyBjYWxsYmFjayBmdW5jdGlvbiBvciBpZiBjYWxsYmFjayBpcyBub3QgYSBjYWxsYWJsZSBmdW5jdGlvblxuICAgICAgICAgICAgaWYgKCFpc0NhbGxhYmxlKGNhbGxiYWNrZm4pKSB7XG4gICAgICAgICAgICAgICAgdGhyb3cgbmV3IFR5cGVFcnJvcignQXJyYXkucHJvdG90eXBlLmZpbHRlciBjYWxsYmFjayBtdXN0IGJlIGEgZnVuY3Rpb24nKTtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgZm9yICh2YXIgaSA9IDA7IGkgPCBsZW5ndGg7IGkrKykge1xuICAgICAgICAgICAgICAgIGlmIChpIGluIHNlbGYpIHtcbiAgICAgICAgICAgICAgICAgICAgdmFsdWUgPSBzZWxmW2ldO1xuICAgICAgICAgICAgICAgICAgICBpZiAodHlwZW9mIFQgPT09ICd1bmRlZmluZWQnID8gY2FsbGJhY2tmbih2YWx1ZSwgaSwgb2JqZWN0KSA6IGNhbGxiYWNrZm4uY2FsbChULCB2YWx1ZSwgaSwgb2JqZWN0KSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgcHVzaENhbGwocmVzdWx0LCB2YWx1ZSk7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICByZXR1cm4gcmVzdWx0O1xuICAgICAgICB9XG4gICAgfSwgIXByb3Blcmx5Qm94ZXNDb250ZXh0KEFycmF5UHJvdG90eXBlLmZpbHRlcikpO1xuXG4gICAgLy8gRVM1IDE1LjQuNC4xNlxuICAgIC8vIGh0dHA6Ly9lczUuZ2l0aHViLmNvbS8jeDE1LjQuNC4xNlxuICAgIC8vIGh0dHBzOi8vZGV2ZWxvcGVyLm1vemlsbGEub3JnL2VuL0phdmFTY3JpcHQvUmVmZXJlbmNlL0dsb2JhbF9PYmplY3RzL0FycmF5L2V2ZXJ5XG4gICAgZGVmaW5lUHJvcGVydGllcyhBcnJheVByb3RvdHlwZSwge1xuICAgICAgICBldmVyeTogZnVuY3Rpb24gZXZlcnkoY2FsbGJhY2tmbi8qLCB0aGlzQXJnKi8pIHtcbiAgICAgICAgICAgIHZhciBvYmplY3QgPSBFUy5Ub09iamVjdCh0aGlzKTtcbiAgICAgICAgICAgIHZhciBzZWxmID0gc3BsaXRTdHJpbmcgJiYgaXNTdHJpbmcodGhpcykgPyBzdHJTcGxpdCh0aGlzLCAnJykgOiBvYmplY3Q7XG4gICAgICAgICAgICB2YXIgbGVuZ3RoID0gRVMuVG9VaW50MzIoc2VsZi5sZW5ndGgpO1xuICAgICAgICAgICAgdmFyIFQ7XG4gICAgICAgICAgICBpZiAoYXJndW1lbnRzLmxlbmd0aCA+IDEpIHtcbiAgICAgICAgICAgICAgICBUID0gYXJndW1lbnRzWzFdO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAvLyBJZiBubyBjYWxsYmFjayBmdW5jdGlvbiBvciBpZiBjYWxsYmFjayBpcyBub3QgYSBjYWxsYWJsZSBmdW5jdGlvblxuICAgICAgICAgICAgaWYgKCFpc0NhbGxhYmxlKGNhbGxiYWNrZm4pKSB7XG4gICAgICAgICAgICAgICAgdGhyb3cgbmV3IFR5cGVFcnJvcignQXJyYXkucHJvdG90eXBlLmV2ZXJ5IGNhbGxiYWNrIG11c3QgYmUgYSBmdW5jdGlvbicpO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBmb3IgKHZhciBpID0gMDsgaSA8IGxlbmd0aDsgaSsrKSB7XG4gICAgICAgICAgICAgICAgaWYgKGkgaW4gc2VsZiAmJiAhKHR5cGVvZiBUID09PSAndW5kZWZpbmVkJyA/IGNhbGxiYWNrZm4oc2VsZltpXSwgaSwgb2JqZWN0KSA6IGNhbGxiYWNrZm4uY2FsbChULCBzZWxmW2ldLCBpLCBvYmplY3QpKSkge1xuICAgICAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgICAgIH1cbiAgICB9LCAhcHJvcGVybHlCb3hlc0NvbnRleHQoQXJyYXlQcm90b3R5cGUuZXZlcnkpKTtcblxuICAgIC8vIEVTNSAxNS40LjQuMTdcbiAgICAvLyBodHRwOi8vZXM1LmdpdGh1Yi5jb20vI3gxNS40LjQuMTdcbiAgICAvLyBodHRwczovL2RldmVsb3Blci5tb3ppbGxhLm9yZy9lbi9KYXZhU2NyaXB0L1JlZmVyZW5jZS9HbG9iYWxfT2JqZWN0cy9BcnJheS9zb21lXG4gICAgZGVmaW5lUHJvcGVydGllcyhBcnJheVByb3RvdHlwZSwge1xuICAgICAgICBzb21lOiBmdW5jdGlvbiBzb21lKGNhbGxiYWNrZm4vKiwgdGhpc0FyZyAqLykge1xuICAgICAgICAgICAgdmFyIG9iamVjdCA9IEVTLlRvT2JqZWN0KHRoaXMpO1xuICAgICAgICAgICAgdmFyIHNlbGYgPSBzcGxpdFN0cmluZyAmJiBpc1N0cmluZyh0aGlzKSA/IHN0clNwbGl0KHRoaXMsICcnKSA6IG9iamVjdDtcbiAgICAgICAgICAgIHZhciBsZW5ndGggPSBFUy5Ub1VpbnQzMihzZWxmLmxlbmd0aCk7XG4gICAgICAgICAgICB2YXIgVDtcbiAgICAgICAgICAgIGlmIChhcmd1bWVudHMubGVuZ3RoID4gMSkge1xuICAgICAgICAgICAgICAgIFQgPSBhcmd1bWVudHNbMV07XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIC8vIElmIG5vIGNhbGxiYWNrIGZ1bmN0aW9uIG9yIGlmIGNhbGxiYWNrIGlzIG5vdCBhIGNhbGxhYmxlIGZ1bmN0aW9uXG4gICAgICAgICAgICBpZiAoIWlzQ2FsbGFibGUoY2FsbGJhY2tmbikpIHtcbiAgICAgICAgICAgICAgICB0aHJvdyBuZXcgVHlwZUVycm9yKCdBcnJheS5wcm90b3R5cGUuc29tZSBjYWxsYmFjayBtdXN0IGJlIGEgZnVuY3Rpb24nKTtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgZm9yICh2YXIgaSA9IDA7IGkgPCBsZW5ndGg7IGkrKykge1xuICAgICAgICAgICAgICAgIGlmIChpIGluIHNlbGYgJiYgKHR5cGVvZiBUID09PSAndW5kZWZpbmVkJyA/IGNhbGxiYWNrZm4oc2VsZltpXSwgaSwgb2JqZWN0KSA6IGNhbGxiYWNrZm4uY2FsbChULCBzZWxmW2ldLCBpLCBvYmplY3QpKSkge1xuICAgICAgICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICAgIH1cbiAgICB9LCAhcHJvcGVybHlCb3hlc0NvbnRleHQoQXJyYXlQcm90b3R5cGUuc29tZSkpO1xuXG4gICAgLy8gRVM1IDE1LjQuNC4yMVxuICAgIC8vIGh0dHA6Ly9lczUuZ2l0aHViLmNvbS8jeDE1LjQuNC4yMVxuICAgIC8vIGh0dHBzOi8vZGV2ZWxvcGVyLm1vemlsbGEub3JnL2VuL0NvcmVfSmF2YVNjcmlwdF8xLjVfUmVmZXJlbmNlL09iamVjdHMvQXJyYXkvcmVkdWNlXG4gICAgdmFyIHJlZHVjZUNvZXJjZXNUb09iamVjdCA9IGZhbHNlO1xuICAgIGlmIChBcnJheVByb3RvdHlwZS5yZWR1Y2UpIHtcbiAgICAgICAgcmVkdWNlQ29lcmNlc1RvT2JqZWN0ID0gdHlwZW9mIEFycmF5UHJvdG90eXBlLnJlZHVjZS5jYWxsKCdlczUnLCBmdW5jdGlvbiAoXywgX18sIF9fXywgbGlzdCkge1xuICAgICAgICAgICAgcmV0dXJuIGxpc3Q7XG4gICAgICAgIH0pID09PSAnb2JqZWN0JztcbiAgICB9XG4gICAgZGVmaW5lUHJvcGVydGllcyhBcnJheVByb3RvdHlwZSwge1xuICAgICAgICByZWR1Y2U6IGZ1bmN0aW9uIHJlZHVjZShjYWxsYmFja2ZuLyosIGluaXRpYWxWYWx1ZSovKSB7XG4gICAgICAgICAgICB2YXIgb2JqZWN0ID0gRVMuVG9PYmplY3QodGhpcyk7XG4gICAgICAgICAgICB2YXIgc2VsZiA9IHNwbGl0U3RyaW5nICYmIGlzU3RyaW5nKHRoaXMpID8gc3RyU3BsaXQodGhpcywgJycpIDogb2JqZWN0O1xuICAgICAgICAgICAgdmFyIGxlbmd0aCA9IEVTLlRvVWludDMyKHNlbGYubGVuZ3RoKTtcblxuICAgICAgICAgICAgLy8gSWYgbm8gY2FsbGJhY2sgZnVuY3Rpb24gb3IgaWYgY2FsbGJhY2sgaXMgbm90IGEgY2FsbGFibGUgZnVuY3Rpb25cbiAgICAgICAgICAgIGlmICghaXNDYWxsYWJsZShjYWxsYmFja2ZuKSkge1xuICAgICAgICAgICAgICAgIHRocm93IG5ldyBUeXBlRXJyb3IoJ0FycmF5LnByb3RvdHlwZS5yZWR1Y2UgY2FsbGJhY2sgbXVzdCBiZSBhIGZ1bmN0aW9uJyk7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIC8vIG5vIHZhbHVlIHRvIHJldHVybiBpZiBubyBpbml0aWFsIHZhbHVlIGFuZCBhbiBlbXB0eSBhcnJheVxuICAgICAgICAgICAgaWYgKGxlbmd0aCA9PT0gMCAmJiBhcmd1bWVudHMubGVuZ3RoID09PSAxKSB7XG4gICAgICAgICAgICAgICAgdGhyb3cgbmV3IFR5cGVFcnJvcigncmVkdWNlIG9mIGVtcHR5IGFycmF5IHdpdGggbm8gaW5pdGlhbCB2YWx1ZScpO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICB2YXIgaSA9IDA7XG4gICAgICAgICAgICB2YXIgcmVzdWx0O1xuICAgICAgICAgICAgaWYgKGFyZ3VtZW50cy5sZW5ndGggPj0gMikge1xuICAgICAgICAgICAgICAgIHJlc3VsdCA9IGFyZ3VtZW50c1sxXTtcbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgZG8ge1xuICAgICAgICAgICAgICAgICAgICBpZiAoaSBpbiBzZWxmKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICByZXN1bHQgPSBzZWxmW2krK107XG4gICAgICAgICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgICAgIC8vIGlmIGFycmF5IGNvbnRhaW5zIG5vIHZhbHVlcywgbm8gaW5pdGlhbCB2YWx1ZSB0byByZXR1cm5cbiAgICAgICAgICAgICAgICAgICAgaWYgKCsraSA+PSBsZW5ndGgpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHRocm93IG5ldyBUeXBlRXJyb3IoJ3JlZHVjZSBvZiBlbXB0eSBhcnJheSB3aXRoIG5vIGluaXRpYWwgdmFsdWUnKTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH0gd2hpbGUgKHRydWUpO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBmb3IgKDsgaSA8IGxlbmd0aDsgaSsrKSB7XG4gICAgICAgICAgICAgICAgaWYgKGkgaW4gc2VsZikge1xuICAgICAgICAgICAgICAgICAgICByZXN1bHQgPSBjYWxsYmFja2ZuKHJlc3VsdCwgc2VsZltpXSwgaSwgb2JqZWN0KTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIHJldHVybiByZXN1bHQ7XG4gICAgICAgIH1cbiAgICB9LCAhcmVkdWNlQ29lcmNlc1RvT2JqZWN0KTtcblxuICAgIC8vIEVTNSAxNS40LjQuMjJcbiAgICAvLyBodHRwOi8vZXM1LmdpdGh1Yi5jb20vI3gxNS40LjQuMjJcbiAgICAvLyBodHRwczovL2RldmVsb3Blci5tb3ppbGxhLm9yZy9lbi9Db3JlX0phdmFTY3JpcHRfMS41X1JlZmVyZW5jZS9PYmplY3RzL0FycmF5L3JlZHVjZVJpZ2h0XG4gICAgdmFyIHJlZHVjZVJpZ2h0Q29lcmNlc1RvT2JqZWN0ID0gZmFsc2U7XG4gICAgaWYgKEFycmF5UHJvdG90eXBlLnJlZHVjZVJpZ2h0KSB7XG4gICAgICAgIHJlZHVjZVJpZ2h0Q29lcmNlc1RvT2JqZWN0ID0gdHlwZW9mIEFycmF5UHJvdG90eXBlLnJlZHVjZVJpZ2h0LmNhbGwoJ2VzNScsIGZ1bmN0aW9uIChfLCBfXywgX19fLCBsaXN0KSB7XG4gICAgICAgICAgICByZXR1cm4gbGlzdDtcbiAgICAgICAgfSkgPT09ICdvYmplY3QnO1xuICAgIH1cbiAgICBkZWZpbmVQcm9wZXJ0aWVzKEFycmF5UHJvdG90eXBlLCB7XG4gICAgICAgIHJlZHVjZVJpZ2h0OiBmdW5jdGlvbiByZWR1Y2VSaWdodChjYWxsYmFja2ZuLyosIGluaXRpYWwqLykge1xuICAgICAgICAgICAgdmFyIG9iamVjdCA9IEVTLlRvT2JqZWN0KHRoaXMpO1xuICAgICAgICAgICAgdmFyIHNlbGYgPSBzcGxpdFN0cmluZyAmJiBpc1N0cmluZyh0aGlzKSA/IHN0clNwbGl0KHRoaXMsICcnKSA6IG9iamVjdDtcbiAgICAgICAgICAgIHZhciBsZW5ndGggPSBFUy5Ub1VpbnQzMihzZWxmLmxlbmd0aCk7XG5cbiAgICAgICAgICAgIC8vIElmIG5vIGNhbGxiYWNrIGZ1bmN0aW9uIG9yIGlmIGNhbGxiYWNrIGlzIG5vdCBhIGNhbGxhYmxlIGZ1bmN0aW9uXG4gICAgICAgICAgICBpZiAoIWlzQ2FsbGFibGUoY2FsbGJhY2tmbikpIHtcbiAgICAgICAgICAgICAgICB0aHJvdyBuZXcgVHlwZUVycm9yKCdBcnJheS5wcm90b3R5cGUucmVkdWNlUmlnaHQgY2FsbGJhY2sgbXVzdCBiZSBhIGZ1bmN0aW9uJyk7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIC8vIG5vIHZhbHVlIHRvIHJldHVybiBpZiBubyBpbml0aWFsIHZhbHVlLCBlbXB0eSBhcnJheVxuICAgICAgICAgICAgaWYgKGxlbmd0aCA9PT0gMCAmJiBhcmd1bWVudHMubGVuZ3RoID09PSAxKSB7XG4gICAgICAgICAgICAgICAgdGhyb3cgbmV3IFR5cGVFcnJvcigncmVkdWNlUmlnaHQgb2YgZW1wdHkgYXJyYXkgd2l0aCBubyBpbml0aWFsIHZhbHVlJyk7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIHZhciByZXN1bHQ7XG4gICAgICAgICAgICB2YXIgaSA9IGxlbmd0aCAtIDE7XG4gICAgICAgICAgICBpZiAoYXJndW1lbnRzLmxlbmd0aCA+PSAyKSB7XG4gICAgICAgICAgICAgICAgcmVzdWx0ID0gYXJndW1lbnRzWzFdO1xuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICBkbyB7XG4gICAgICAgICAgICAgICAgICAgIGlmIChpIGluIHNlbGYpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHJlc3VsdCA9IHNlbGZbaS0tXTtcbiAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICAgICAgLy8gaWYgYXJyYXkgY29udGFpbnMgbm8gdmFsdWVzLCBubyBpbml0aWFsIHZhbHVlIHRvIHJldHVyblxuICAgICAgICAgICAgICAgICAgICBpZiAoLS1pIDwgMCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IFR5cGVFcnJvcigncmVkdWNlUmlnaHQgb2YgZW1wdHkgYXJyYXkgd2l0aCBubyBpbml0aWFsIHZhbHVlJyk7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9IHdoaWxlICh0cnVlKTtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgaWYgKGkgPCAwKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIHJlc3VsdDtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgZG8ge1xuICAgICAgICAgICAgICAgIGlmIChpIGluIHNlbGYpIHtcbiAgICAgICAgICAgICAgICAgICAgcmVzdWx0ID0gY2FsbGJhY2tmbihyZXN1bHQsIHNlbGZbaV0sIGksIG9iamVjdCk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSB3aGlsZSAoaS0tKTtcblxuICAgICAgICAgICAgcmV0dXJuIHJlc3VsdDtcbiAgICAgICAgfVxuICAgIH0sICFyZWR1Y2VSaWdodENvZXJjZXNUb09iamVjdCk7XG5cbiAgICAvLyBFUzUgMTUuNC40LjE0XG4gICAgLy8gaHR0cDovL2VzNS5naXRodWIuY29tLyN4MTUuNC40LjE0XG4gICAgLy8gaHR0cHM6Ly9kZXZlbG9wZXIubW96aWxsYS5vcmcvZW4vSmF2YVNjcmlwdC9SZWZlcmVuY2UvR2xvYmFsX09iamVjdHMvQXJyYXkvaW5kZXhPZlxuICAgIHZhciBoYXNGaXJlZm94MkluZGV4T2ZCdWcgPSBBcnJheVByb3RvdHlwZS5pbmRleE9mICYmIFswLCAxXS5pbmRleE9mKDEsIDIpICE9PSAtMTtcbiAgICBkZWZpbmVQcm9wZXJ0aWVzKEFycmF5UHJvdG90eXBlLCB7XG4gICAgICAgIGluZGV4T2Y6IGZ1bmN0aW9uIGluZGV4T2Yoc2VhcmNoRWxlbWVudC8qLCBmcm9tSW5kZXggKi8pIHtcbiAgICAgICAgICAgIHZhciBzZWxmID0gc3BsaXRTdHJpbmcgJiYgaXNTdHJpbmcodGhpcykgPyBzdHJTcGxpdCh0aGlzLCAnJykgOiBFUy5Ub09iamVjdCh0aGlzKTtcbiAgICAgICAgICAgIHZhciBsZW5ndGggPSBFUy5Ub1VpbnQzMihzZWxmLmxlbmd0aCk7XG5cbiAgICAgICAgICAgIGlmIChsZW5ndGggPT09IDApIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gLTE7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIHZhciBpID0gMDtcbiAgICAgICAgICAgIGlmIChhcmd1bWVudHMubGVuZ3RoID4gMSkge1xuICAgICAgICAgICAgICAgIGkgPSBFUy5Ub0ludGVnZXIoYXJndW1lbnRzWzFdKTtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgLy8gaGFuZGxlIG5lZ2F0aXZlIGluZGljZXNcbiAgICAgICAgICAgIGkgPSBpID49IDAgPyBpIDogbWF4KDAsIGxlbmd0aCArIGkpO1xuICAgICAgICAgICAgZm9yICg7IGkgPCBsZW5ndGg7IGkrKykge1xuICAgICAgICAgICAgICAgIGlmIChpIGluIHNlbGYgJiYgc2VsZltpXSA9PT0gc2VhcmNoRWxlbWVudCkge1xuICAgICAgICAgICAgICAgICAgICByZXR1cm4gaTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICByZXR1cm4gLTE7XG4gICAgICAgIH1cbiAgICB9LCBoYXNGaXJlZm94MkluZGV4T2ZCdWcpO1xuXG4gICAgLy8gRVM1IDE1LjQuNC4xNVxuICAgIC8vIGh0dHA6Ly9lczUuZ2l0aHViLmNvbS8jeDE1LjQuNC4xNVxuICAgIC8vIGh0dHBzOi8vZGV2ZWxvcGVyLm1vemlsbGEub3JnL2VuL0phdmFTY3JpcHQvUmVmZXJlbmNlL0dsb2JhbF9PYmplY3RzL0FycmF5L2xhc3RJbmRleE9mXG4gICAgdmFyIGhhc0ZpcmVmb3gyTGFzdEluZGV4T2ZCdWcgPSBBcnJheVByb3RvdHlwZS5sYXN0SW5kZXhPZiAmJiBbMCwgMV0ubGFzdEluZGV4T2YoMCwgLTMpICE9PSAtMTtcbiAgICBkZWZpbmVQcm9wZXJ0aWVzKEFycmF5UHJvdG90eXBlLCB7XG4gICAgICAgIGxhc3RJbmRleE9mOiBmdW5jdGlvbiBsYXN0SW5kZXhPZihzZWFyY2hFbGVtZW50LyosIGZyb21JbmRleCAqLykge1xuICAgICAgICAgICAgdmFyIHNlbGYgPSBzcGxpdFN0cmluZyAmJiBpc1N0cmluZyh0aGlzKSA/IHN0clNwbGl0KHRoaXMsICcnKSA6IEVTLlRvT2JqZWN0KHRoaXMpO1xuICAgICAgICAgICAgdmFyIGxlbmd0aCA9IEVTLlRvVWludDMyKHNlbGYubGVuZ3RoKTtcblxuICAgICAgICAgICAgaWYgKGxlbmd0aCA9PT0gMCkge1xuICAgICAgICAgICAgICAgIHJldHVybiAtMTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHZhciBpID0gbGVuZ3RoIC0gMTtcbiAgICAgICAgICAgIGlmIChhcmd1bWVudHMubGVuZ3RoID4gMSkge1xuICAgICAgICAgICAgICAgIGkgPSBtaW4oaSwgRVMuVG9JbnRlZ2VyKGFyZ3VtZW50c1sxXSkpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgLy8gaGFuZGxlIG5lZ2F0aXZlIGluZGljZXNcbiAgICAgICAgICAgIGkgPSBpID49IDAgPyBpIDogbGVuZ3RoIC0gTWF0aC5hYnMoaSk7XG4gICAgICAgICAgICBmb3IgKDsgaSA+PSAwOyBpLS0pIHtcbiAgICAgICAgICAgICAgICBpZiAoaSBpbiBzZWxmICYmIHNlYXJjaEVsZW1lbnQgPT09IHNlbGZbaV0pIHtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICAgICAgcmV0dXJuIC0xO1xuICAgICAgICB9XG4gICAgfSwgaGFzRmlyZWZveDJMYXN0SW5kZXhPZkJ1Zyk7XG5cbiAgICAvLyBFUzUgMTUuNC40LjEyXG4gICAgLy8gaHR0cDovL2VzNS5naXRodWIuY29tLyN4MTUuNC40LjEyXG4gICAgdmFyIHNwbGljZU5vb3BSZXR1cm5zRW1wdHlBcnJheSA9IChmdW5jdGlvbiAoKSB7XG4gICAgICAgIHZhciBhID0gWzEsIDJdO1xuICAgICAgICB2YXIgcmVzdWx0ID0gYS5zcGxpY2UoKTtcbiAgICAgICAgcmV0dXJuIGEubGVuZ3RoID09PSAyICYmIGlzQXJyYXkocmVzdWx0KSAmJiByZXN1bHQubGVuZ3RoID09PSAwO1xuICAgIH0oKSk7XG4gICAgZGVmaW5lUHJvcGVydGllcyhBcnJheVByb3RvdHlwZSwge1xuICAgICAgICAvLyBTYWZhcmkgNS4wIGJ1ZyB3aGVyZSAuc3BsaWNlKCkgcmV0dXJucyB1bmRlZmluZWRcbiAgICAgICAgc3BsaWNlOiBmdW5jdGlvbiBzcGxpY2Uoc3RhcnQsIGRlbGV0ZUNvdW50KSB7XG4gICAgICAgICAgICBpZiAoYXJndW1lbnRzLmxlbmd0aCA9PT0gMCkge1xuICAgICAgICAgICAgICAgIHJldHVybiBbXTtcbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIGFycmF5X3NwbGljZS5hcHBseSh0aGlzLCBhcmd1bWVudHMpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgfSwgIXNwbGljZU5vb3BSZXR1cm5zRW1wdHlBcnJheSk7XG5cbiAgICB2YXIgc3BsaWNlV29ya3NXaXRoRW1wdHlPYmplY3QgPSAoZnVuY3Rpb24gKCkge1xuICAgICAgICB2YXIgb2JqID0ge307XG4gICAgICAgIEFycmF5UHJvdG90eXBlLnNwbGljZS5jYWxsKG9iaiwgMCwgMCwgMSk7XG4gICAgICAgIHJldHVybiBvYmoubGVuZ3RoID09PSAxO1xuICAgIH0oKSk7XG4gICAgZGVmaW5lUHJvcGVydGllcyhBcnJheVByb3RvdHlwZSwge1xuICAgICAgICBzcGxpY2U6IGZ1bmN0aW9uIHNwbGljZShzdGFydCwgZGVsZXRlQ291bnQpIHtcbiAgICAgICAgICAgIGlmIChhcmd1bWVudHMubGVuZ3RoID09PSAwKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIFtdO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgdmFyIGFyZ3MgPSBhcmd1bWVudHM7XG4gICAgICAgICAgICB0aGlzLmxlbmd0aCA9IG1heChFUy5Ub0ludGVnZXIodGhpcy5sZW5ndGgpLCAwKTtcbiAgICAgICAgICAgIGlmIChhcmd1bWVudHMubGVuZ3RoID4gMCAmJiB0eXBlb2YgZGVsZXRlQ291bnQgIT09ICdudW1iZXInKSB7XG4gICAgICAgICAgICAgICAgYXJncyA9IGFycmF5U2xpY2UoYXJndW1lbnRzKTtcbiAgICAgICAgICAgICAgICBpZiAoYXJncy5sZW5ndGggPCAyKSB7XG4gICAgICAgICAgICAgICAgICAgIHB1c2hDYWxsKGFyZ3MsIHRoaXMubGVuZ3RoIC0gc3RhcnQpO1xuICAgICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgIGFyZ3NbMV0gPSBFUy5Ub0ludGVnZXIoZGVsZXRlQ291bnQpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHJldHVybiBhcnJheV9zcGxpY2UuYXBwbHkodGhpcywgYXJncyk7XG4gICAgICAgIH1cbiAgICB9LCAhc3BsaWNlV29ya3NXaXRoRW1wdHlPYmplY3QpO1xuICAgIHZhciBzcGxpY2VXb3Jrc1dpdGhMYXJnZVNwYXJzZUFycmF5cyA9IChmdW5jdGlvbiAoKSB7XG4gICAgICAgIC8vIFBlciBodHRwczovL2dpdGh1Yi5jb20vZXMtc2hpbXMvZXM1LXNoaW0vaXNzdWVzLzI5NVxuICAgICAgICAvLyBTYWZhcmkgNy84IGJyZWFrcyB3aXRoIHNwYXJzZSBhcnJheXMgb2Ygc2l6ZSAxZTUgb3IgZ3JlYXRlclxuICAgICAgICB2YXIgYXJyID0gbmV3ICRBcnJheSgxZTUpO1xuICAgICAgICAvLyBub3RlOiB0aGUgaW5kZXggTVVTVCBiZSA4IG9yIGxhcmdlciBvciB0aGUgdGVzdCB3aWxsIGZhbHNlIHBhc3NcbiAgICAgICAgYXJyWzhdID0gJ3gnO1xuICAgICAgICBhcnIuc3BsaWNlKDEsIDEpO1xuICAgICAgICAvLyBub3RlOiB0aGlzIHRlc3QgbXVzdCBiZSBkZWZpbmVkICphZnRlciogdGhlIGluZGV4T2Ygc2hpbVxuICAgICAgICAvLyBwZXIgaHR0cHM6Ly9naXRodWIuY29tL2VzLXNoaW1zL2VzNS1zaGltL2lzc3Vlcy8zMTNcbiAgICAgICAgcmV0dXJuIGFyci5pbmRleE9mKCd4JykgPT09IDc7XG4gICAgfSgpKTtcbiAgICB2YXIgc3BsaWNlV29ya3NXaXRoU21hbGxTcGFyc2VBcnJheXMgPSAoZnVuY3Rpb24gKCkge1xuICAgICAgICAvLyBQZXIgaHR0cHM6Ly9naXRodWIuY29tL2VzLXNoaW1zL2VzNS1zaGltL2lzc3Vlcy8yOTVcbiAgICAgICAgLy8gT3BlcmEgMTIuMTUgYnJlYWtzIG9uIHRoaXMsIG5vIGlkZWEgd2h5LlxuICAgICAgICB2YXIgbiA9IDI1NjtcbiAgICAgICAgdmFyIGFyciA9IFtdO1xuICAgICAgICBhcnJbbl0gPSAnYSc7XG4gICAgICAgIGFyci5zcGxpY2UobiArIDEsIDAsICdiJyk7XG4gICAgICAgIHJldHVybiBhcnJbbl0gPT09ICdhJztcbiAgICB9KCkpO1xuICAgIGRlZmluZVByb3BlcnRpZXMoQXJyYXlQcm90b3R5cGUsIHtcbiAgICAgICAgc3BsaWNlOiBmdW5jdGlvbiBzcGxpY2Uoc3RhcnQsIGRlbGV0ZUNvdW50KSB7XG4gICAgICAgICAgICB2YXIgTyA9IEVTLlRvT2JqZWN0KHRoaXMpO1xuICAgICAgICAgICAgdmFyIEEgPSBbXTtcbiAgICAgICAgICAgIHZhciBsZW4gPSBFUy5Ub1VpbnQzMihPLmxlbmd0aCk7XG4gICAgICAgICAgICB2YXIgcmVsYXRpdmVTdGFydCA9IEVTLlRvSW50ZWdlcihzdGFydCk7XG4gICAgICAgICAgICB2YXIgYWN0dWFsU3RhcnQgPSByZWxhdGl2ZVN0YXJ0IDwgMCA/IG1heCgobGVuICsgcmVsYXRpdmVTdGFydCksIDApIDogbWluKHJlbGF0aXZlU3RhcnQsIGxlbik7XG4gICAgICAgICAgICB2YXIgYWN0dWFsRGVsZXRlQ291bnQgPSBtaW4obWF4KEVTLlRvSW50ZWdlcihkZWxldGVDb3VudCksIDApLCBsZW4gLSBhY3R1YWxTdGFydCk7XG5cbiAgICAgICAgICAgIHZhciBrID0gMDtcbiAgICAgICAgICAgIHZhciBmcm9tO1xuICAgICAgICAgICAgd2hpbGUgKGsgPCBhY3R1YWxEZWxldGVDb3VudCkge1xuICAgICAgICAgICAgICAgIGZyb20gPSAkU3RyaW5nKGFjdHVhbFN0YXJ0ICsgayk7XG4gICAgICAgICAgICAgICAgaWYgKG93bnMoTywgZnJvbSkpIHtcbiAgICAgICAgICAgICAgICAgICAgQVtrXSA9IE9bZnJvbV07XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGsgKz0gMTtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgdmFyIGl0ZW1zID0gYXJyYXlTbGljZShhcmd1bWVudHMsIDIpO1xuICAgICAgICAgICAgdmFyIGl0ZW1Db3VudCA9IGl0ZW1zLmxlbmd0aDtcbiAgICAgICAgICAgIHZhciB0bztcbiAgICAgICAgICAgIGlmIChpdGVtQ291bnQgPCBhY3R1YWxEZWxldGVDb3VudCkge1xuICAgICAgICAgICAgICAgIGsgPSBhY3R1YWxTdGFydDtcbiAgICAgICAgICAgICAgICB2YXIgbWF4SyA9IGxlbiAtIGFjdHVhbERlbGV0ZUNvdW50O1xuICAgICAgICAgICAgICAgIHdoaWxlIChrIDwgbWF4Sykge1xuICAgICAgICAgICAgICAgICAgICBmcm9tID0gJFN0cmluZyhrICsgYWN0dWFsRGVsZXRlQ291bnQpO1xuICAgICAgICAgICAgICAgICAgICB0byA9ICRTdHJpbmcoayArIGl0ZW1Db3VudCk7XG4gICAgICAgICAgICAgICAgICAgIGlmIChvd25zKE8sIGZyb20pKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBPW3RvXSA9IE9bZnJvbV07XG4gICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBkZWxldGUgT1t0b107XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgayArPSAxO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBrID0gbGVuO1xuICAgICAgICAgICAgICAgIHZhciBtaW5LID0gbGVuIC0gYWN0dWFsRGVsZXRlQ291bnQgKyBpdGVtQ291bnQ7XG4gICAgICAgICAgICAgICAgd2hpbGUgKGsgPiBtaW5LKSB7XG4gICAgICAgICAgICAgICAgICAgIGRlbGV0ZSBPW2sgLSAxXTtcbiAgICAgICAgICAgICAgICAgICAgayAtPSAxO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0gZWxzZSBpZiAoaXRlbUNvdW50ID4gYWN0dWFsRGVsZXRlQ291bnQpIHtcbiAgICAgICAgICAgICAgICBrID0gbGVuIC0gYWN0dWFsRGVsZXRlQ291bnQ7XG4gICAgICAgICAgICAgICAgd2hpbGUgKGsgPiBhY3R1YWxTdGFydCkge1xuICAgICAgICAgICAgICAgICAgICBmcm9tID0gJFN0cmluZyhrICsgYWN0dWFsRGVsZXRlQ291bnQgLSAxKTtcbiAgICAgICAgICAgICAgICAgICAgdG8gPSAkU3RyaW5nKGsgKyBpdGVtQ291bnQgLSAxKTtcbiAgICAgICAgICAgICAgICAgICAgaWYgKG93bnMoTywgZnJvbSkpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIE9bdG9dID0gT1tmcm9tXTtcbiAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGRlbGV0ZSBPW3RvXTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICBrIC09IDE7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICAgICAgayA9IGFjdHVhbFN0YXJ0O1xuICAgICAgICAgICAgZm9yICh2YXIgaSA9IDA7IGkgPCBpdGVtcy5sZW5ndGg7ICsraSkge1xuICAgICAgICAgICAgICAgIE9ba10gPSBpdGVtc1tpXTtcbiAgICAgICAgICAgICAgICBrICs9IDE7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBPLmxlbmd0aCA9IGxlbiAtIGFjdHVhbERlbGV0ZUNvdW50ICsgaXRlbUNvdW50O1xuXG4gICAgICAgICAgICByZXR1cm4gQTtcbiAgICAgICAgfVxuICAgIH0sICFzcGxpY2VXb3Jrc1dpdGhMYXJnZVNwYXJzZUFycmF5cyB8fCAhc3BsaWNlV29ya3NXaXRoU21hbGxTcGFyc2VBcnJheXMpO1xuXG4gICAgdmFyIG9yaWdpbmFsSm9pbiA9IEFycmF5UHJvdG90eXBlLmpvaW47XG4gICAgdmFyIGhhc1N0cmluZ0pvaW5CdWc7XG4gICAgdHJ5IHtcbiAgICAgICAgaGFzU3RyaW5nSm9pbkJ1ZyA9IEFycmF5LnByb3RvdHlwZS5qb2luLmNhbGwoJzEyMycsICcsJykgIT09ICcxLDIsMyc7XG4gICAgfSBjYXRjaCAoZSkge1xuICAgICAgICBoYXNTdHJpbmdKb2luQnVnID0gdHJ1ZTtcbiAgICB9XG4gICAgaWYgKGhhc1N0cmluZ0pvaW5CdWcpIHtcbiAgICAgICAgZGVmaW5lUHJvcGVydGllcyhBcnJheVByb3RvdHlwZSwge1xuICAgICAgICAgICAgam9pbjogZnVuY3Rpb24gam9pbihzZXBhcmF0b3IpIHtcbiAgICAgICAgICAgICAgICB2YXIgc2VwID0gdHlwZW9mIHNlcGFyYXRvciA9PT0gJ3VuZGVmaW5lZCcgPyAnLCcgOiBzZXBhcmF0b3I7XG4gICAgICAgICAgICAgICAgcmV0dXJuIG9yaWdpbmFsSm9pbi5jYWxsKGlzU3RyaW5nKHRoaXMpID8gc3RyU3BsaXQodGhpcywgJycpIDogdGhpcywgc2VwKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfSwgaGFzU3RyaW5nSm9pbkJ1Zyk7XG4gICAgfVxuXG4gICAgdmFyIGhhc0pvaW5VbmRlZmluZWRCdWcgPSBbMSwgMl0uam9pbih1bmRlZmluZWQpICE9PSAnMSwyJztcbiAgICBpZiAoaGFzSm9pblVuZGVmaW5lZEJ1Zykge1xuICAgICAgICBkZWZpbmVQcm9wZXJ0aWVzKEFycmF5UHJvdG90eXBlLCB7XG4gICAgICAgICAgICBqb2luOiBmdW5jdGlvbiBqb2luKHNlcGFyYXRvcikge1xuICAgICAgICAgICAgICAgIHZhciBzZXAgPSB0eXBlb2Ygc2VwYXJhdG9yID09PSAndW5kZWZpbmVkJyA/ICcsJyA6IHNlcGFyYXRvcjtcbiAgICAgICAgICAgICAgICByZXR1cm4gb3JpZ2luYWxKb2luLmNhbGwodGhpcywgc2VwKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfSwgaGFzSm9pblVuZGVmaW5lZEJ1Zyk7XG4gICAgfVxuXG4gICAgdmFyIHB1c2hTaGltID0gZnVuY3Rpb24gcHVzaChpdGVtKSB7XG4gICAgICAgIHZhciBPID0gRVMuVG9PYmplY3QodGhpcyk7XG4gICAgICAgIHZhciBuID0gRVMuVG9VaW50MzIoTy5sZW5ndGgpO1xuICAgICAgICB2YXIgaSA9IDA7XG4gICAgICAgIHdoaWxlIChpIDwgYXJndW1lbnRzLmxlbmd0aCkge1xuICAgICAgICAgICAgT1tuICsgaV0gPSBhcmd1bWVudHNbaV07XG4gICAgICAgICAgICBpICs9IDE7XG4gICAgICAgIH1cbiAgICAgICAgTy5sZW5ndGggPSBuICsgaTtcbiAgICAgICAgcmV0dXJuIG4gKyBpO1xuICAgIH07XG5cbiAgICB2YXIgcHVzaElzTm90R2VuZXJpYyA9IChmdW5jdGlvbiAoKSB7XG4gICAgICAgIHZhciBvYmogPSB7fTtcbiAgICAgICAgdmFyIHJlc3VsdCA9IEFycmF5LnByb3RvdHlwZS5wdXNoLmNhbGwob2JqLCB1bmRlZmluZWQpO1xuICAgICAgICByZXR1cm4gcmVzdWx0ICE9PSAxIHx8IG9iai5sZW5ndGggIT09IDEgfHwgdHlwZW9mIG9ialswXSAhPT0gJ3VuZGVmaW5lZCcgfHwgIW93bnMob2JqLCAwKTtcbiAgICB9KCkpO1xuICAgIGRlZmluZVByb3BlcnRpZXMoQXJyYXlQcm90b3R5cGUsIHtcbiAgICAgICAgcHVzaDogZnVuY3Rpb24gcHVzaChpdGVtKSB7XG4gICAgICAgICAgICBpZiAoaXNBcnJheSh0aGlzKSkge1xuICAgICAgICAgICAgICAgIHJldHVybiBhcnJheV9wdXNoLmFwcGx5KHRoaXMsIGFyZ3VtZW50cyk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICByZXR1cm4gcHVzaFNoaW0uYXBwbHkodGhpcywgYXJndW1lbnRzKTtcbiAgICAgICAgfVxuICAgIH0sIHB1c2hJc05vdEdlbmVyaWMpO1xuXG4gICAgLy8gVGhpcyBmaXhlcyBhIHZlcnkgd2VpcmQgYnVnIGluIE9wZXJhIDEwLjYgd2hlbiBwdXNoaW5nIGB1bmRlZmluZWRcbiAgICB2YXIgcHVzaFVuZGVmaW5lZElzV2VpcmQgPSAoZnVuY3Rpb24gKCkge1xuICAgICAgICB2YXIgYXJyID0gW107XG4gICAgICAgIHZhciByZXN1bHQgPSBhcnIucHVzaCh1bmRlZmluZWQpO1xuICAgICAgICByZXR1cm4gcmVzdWx0ICE9PSAxIHx8IGFyci5sZW5ndGggIT09IDEgfHwgdHlwZW9mIGFyclswXSAhPT0gJ3VuZGVmaW5lZCcgfHwgIW93bnMoYXJyLCAwKTtcbiAgICB9KCkpO1xuICAgIGRlZmluZVByb3BlcnRpZXMoQXJyYXlQcm90b3R5cGUsIHsgcHVzaDogcHVzaFNoaW0gfSwgcHVzaFVuZGVmaW5lZElzV2VpcmQpO1xuXG4gICAgLy8gRVM1IDE1LjIuMy4xNFxuICAgIC8vIGh0dHA6Ly9lczUuZ2l0aHViLmlvLyN4MTUuNC40LjEwXG4gICAgLy8gRml4IGJveGVkIHN0cmluZyBidWdcbiAgICBkZWZpbmVQcm9wZXJ0aWVzKEFycmF5UHJvdG90eXBlLCB7XG4gICAgICAgIHNsaWNlOiBmdW5jdGlvbiAoc3RhcnQsIGVuZCkge1xuICAgICAgICAgICAgdmFyIGFyciA9IGlzU3RyaW5nKHRoaXMpID8gc3RyU3BsaXQodGhpcywgJycpIDogdGhpcztcbiAgICAgICAgICAgIHJldHVybiBhcnJheVNsaWNlQXBwbHkoYXJyLCBhcmd1bWVudHMpO1xuICAgICAgICB9XG4gICAgfSwgc3BsaXRTdHJpbmcpO1xuXG4gICAgdmFyIHNvcnRJZ25vcmVzTm9uRnVuY3Rpb25zID0gKGZ1bmN0aW9uICgpIHtcbiAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgIFsxLCAyXS5zb3J0KG51bGwpO1xuICAgICAgICAgICAgWzEsIDJdLnNvcnQoe30pO1xuICAgICAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgICAgIH0gY2F0Y2ggKGUpIHt9XG4gICAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9KCkpO1xuICAgIHZhciBzb3J0VGhyb3dzT25SZWdleCA9IChmdW5jdGlvbiAoKSB7XG4gICAgICAgIC8vIHRoaXMgaXMgYSBwcm9ibGVtIGluIEZpcmVmb3ggNCwgaW4gd2hpY2ggYHR5cGVvZiAvYS8gPT09ICdmdW5jdGlvbidgXG4gICAgICAgIHRyeSB7XG4gICAgICAgICAgICBbMSwgMl0uc29ydCgvYS8pO1xuICAgICAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgICB9IGNhdGNoIChlKSB7fVxuICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICB9KCkpO1xuICAgIHZhciBzb3J0SWdub3Jlc1VuZGVmaW5lZCA9IChmdW5jdGlvbiAoKSB7XG4gICAgICAgIC8vIGFwcGxpZXMgaW4gSUUgOCwgZm9yIG9uZS5cbiAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgIFsxLCAyXS5zb3J0KHVuZGVmaW5lZCk7XG4gICAgICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICAgICAgfSBjYXRjaCAoZSkge31cbiAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH0oKSk7XG4gICAgZGVmaW5lUHJvcGVydGllcyhBcnJheVByb3RvdHlwZSwge1xuICAgICAgICBzb3J0OiBmdW5jdGlvbiBzb3J0KGNvbXBhcmVGbikge1xuICAgICAgICAgICAgaWYgKHR5cGVvZiBjb21wYXJlRm4gPT09ICd1bmRlZmluZWQnKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIGFycmF5U29ydCh0aGlzKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGlmICghaXNDYWxsYWJsZShjb21wYXJlRm4pKSB7XG4gICAgICAgICAgICAgICAgdGhyb3cgbmV3IFR5cGVFcnJvcignQXJyYXkucHJvdG90eXBlLnNvcnQgY2FsbGJhY2sgbXVzdCBiZSBhIGZ1bmN0aW9uJyk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICByZXR1cm4gYXJyYXlTb3J0KHRoaXMsIGNvbXBhcmVGbik7XG4gICAgICAgIH1cbiAgICB9LCBzb3J0SWdub3Jlc05vbkZ1bmN0aW9ucyB8fCAhc29ydElnbm9yZXNVbmRlZmluZWQgfHwgIXNvcnRUaHJvd3NPblJlZ2V4KTtcblxuICAgIC8vXG4gICAgLy8gT2JqZWN0XG4gICAgLy8gPT09PT09XG4gICAgLy9cblxuICAgIC8vIEVTNSAxNS4yLjMuMTRcbiAgICAvLyBodHRwOi8vZXM1LmdpdGh1Yi5jb20vI3gxNS4yLjMuMTRcblxuICAgIC8vIGh0dHA6Ly93aGF0dGhlaGVhZHNhaWQuY29tLzIwMTAvMTAvYS1zYWZlci1vYmplY3Qta2V5cy1jb21wYXRpYmlsaXR5LWltcGxlbWVudGF0aW9uXG4gICAgdmFyIGhhc0RvbnRFbnVtQnVnID0gIWlzRW51bSh7ICd0b1N0cmluZyc6IG51bGwgfSwgJ3RvU3RyaW5nJyk7XG4gICAgdmFyIGhhc1Byb3RvRW51bUJ1ZyA9IGlzRW51bShmdW5jdGlvbiAoKSB7fSwgJ3Byb3RvdHlwZScpO1xuICAgIHZhciBoYXNTdHJpbmdFbnVtQnVnID0gIW93bnMoJ3gnLCAnMCcpO1xuICAgIHZhciBlcXVhbHNDb25zdHJ1Y3RvclByb3RvdHlwZSA9IGZ1bmN0aW9uIChvKSB7XG4gICAgICAgIHZhciBjdG9yID0gby5jb25zdHJ1Y3RvcjtcbiAgICAgICAgcmV0dXJuIGN0b3IgJiYgY3Rvci5wcm90b3R5cGUgPT09IG87XG4gICAgfTtcbiAgICB2YXIgYmxhY2tsaXN0ZWRLZXlzID0ge1xuICAgICAgICAkd2luZG93OiB0cnVlLFxuICAgICAgICAkY29uc29sZTogdHJ1ZSxcbiAgICAgICAgJHBhcmVudDogdHJ1ZSxcbiAgICAgICAgJHNlbGY6IHRydWUsXG4gICAgICAgICRmcmFtZTogdHJ1ZSxcbiAgICAgICAgJGZyYW1lczogdHJ1ZSxcbiAgICAgICAgJGZyYW1lRWxlbWVudDogdHJ1ZSxcbiAgICAgICAgJHdlYmtpdEluZGV4ZWREQjogdHJ1ZSxcbiAgICAgICAgJHdlYmtpdFN0b3JhZ2VJbmZvOiB0cnVlLFxuICAgICAgICAkZXh0ZXJuYWw6IHRydWVcbiAgICB9O1xuICAgIHZhciBoYXNBdXRvbWF0aW9uRXF1YWxpdHlCdWcgPSAoZnVuY3Rpb24gKCkge1xuICAgICAgICAvKiBnbG9iYWxzIHdpbmRvdyAqL1xuICAgICAgICBpZiAodHlwZW9mIHdpbmRvdyA9PT0gJ3VuZGVmaW5lZCcpIHtcbiAgICAgICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgICAgfVxuICAgICAgICBmb3IgKHZhciBrIGluIHdpbmRvdykge1xuICAgICAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgICAgICBpZiAoIWJsYWNrbGlzdGVkS2V5c1snJCcgKyBrXSAmJiBvd25zKHdpbmRvdywgaykgJiYgd2luZG93W2tdICE9PSBudWxsICYmIHR5cGVvZiB3aW5kb3dba10gPT09ICdvYmplY3QnKSB7XG4gICAgICAgICAgICAgICAgICAgIGVxdWFsc0NvbnN0cnVjdG9yUHJvdG90eXBlKHdpbmRvd1trXSk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSBjYXRjaCAoZSkge1xuICAgICAgICAgICAgICAgIHJldHVybiB0cnVlO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9KCkpO1xuICAgIHZhciBlcXVhbHNDb25zdHJ1Y3RvclByb3RvdHlwZUlmTm90QnVnZ3kgPSBmdW5jdGlvbiAob2JqZWN0KSB7XG4gICAgICAgIGlmICh0eXBlb2Ygd2luZG93ID09PSAndW5kZWZpbmVkJyB8fCAhaGFzQXV0b21hdGlvbkVxdWFsaXR5QnVnKSB7XG4gICAgICAgICAgICByZXR1cm4gZXF1YWxzQ29uc3RydWN0b3JQcm90b3R5cGUob2JqZWN0KTtcbiAgICAgICAgfVxuICAgICAgICB0cnkge1xuICAgICAgICAgICAgcmV0dXJuIGVxdWFsc0NvbnN0cnVjdG9yUHJvdG90eXBlKG9iamVjdCk7XG4gICAgICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAgICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgICAgfVxuICAgIH07XG4gICAgdmFyIGRvbnRFbnVtcyA9IFtcbiAgICAgICAgJ3RvU3RyaW5nJyxcbiAgICAgICAgJ3RvTG9jYWxlU3RyaW5nJyxcbiAgICAgICAgJ3ZhbHVlT2YnLFxuICAgICAgICAnaGFzT3duUHJvcGVydHknLFxuICAgICAgICAnaXNQcm90b3R5cGVPZicsXG4gICAgICAgICdwcm9wZXJ0eUlzRW51bWVyYWJsZScsXG4gICAgICAgICdjb25zdHJ1Y3RvcidcbiAgICBdO1xuICAgIHZhciBkb250RW51bXNMZW5ndGggPSBkb250RW51bXMubGVuZ3RoO1xuXG4gICAgLy8gdGFrZW4gZGlyZWN0bHkgZnJvbSBodHRwczovL2dpdGh1Yi5jb20vbGpoYXJiL2lzLWFyZ3VtZW50cy9ibG9iL21hc3Rlci9pbmRleC5qc1xuICAgIC8vIGNhbiBiZSByZXBsYWNlZCB3aXRoIHJlcXVpcmUoJ2lzLWFyZ3VtZW50cycpIGlmIHdlIGV2ZXIgdXNlIGEgYnVpbGQgcHJvY2VzcyBpbnN0ZWFkXG4gICAgdmFyIGlzU3RhbmRhcmRBcmd1bWVudHMgPSBmdW5jdGlvbiBpc0FyZ3VtZW50cyh2YWx1ZSkge1xuICAgICAgICByZXR1cm4gdG9TdHIodmFsdWUpID09PSAnW29iamVjdCBBcmd1bWVudHNdJztcbiAgICB9O1xuICAgIHZhciBpc0xlZ2FjeUFyZ3VtZW50cyA9IGZ1bmN0aW9uIGlzQXJndW1lbnRzKHZhbHVlKSB7XG4gICAgICAgIHJldHVybiB2YWx1ZSAhPT0gbnVsbCAmJlxuICAgICAgICAgICAgdHlwZW9mIHZhbHVlID09PSAnb2JqZWN0JyAmJlxuICAgICAgICAgICAgdHlwZW9mIHZhbHVlLmxlbmd0aCA9PT0gJ251bWJlcicgJiZcbiAgICAgICAgICAgIHZhbHVlLmxlbmd0aCA+PSAwICYmXG4gICAgICAgICAgICAhaXNBcnJheSh2YWx1ZSkgJiZcbiAgICAgICAgICAgIGlzQ2FsbGFibGUodmFsdWUuY2FsbGVlKTtcbiAgICB9O1xuICAgIHZhciBpc0FyZ3VtZW50cyA9IGlzU3RhbmRhcmRBcmd1bWVudHMoYXJndW1lbnRzKSA/IGlzU3RhbmRhcmRBcmd1bWVudHMgOiBpc0xlZ2FjeUFyZ3VtZW50cztcblxuICAgIGRlZmluZVByb3BlcnRpZXMoJE9iamVjdCwge1xuICAgICAgICBrZXlzOiBmdW5jdGlvbiBrZXlzKG9iamVjdCkge1xuICAgICAgICAgICAgdmFyIGlzRm4gPSBpc0NhbGxhYmxlKG9iamVjdCk7XG4gICAgICAgICAgICB2YXIgaXNBcmdzID0gaXNBcmd1bWVudHMob2JqZWN0KTtcbiAgICAgICAgICAgIHZhciBpc09iamVjdCA9IG9iamVjdCAhPT0gbnVsbCAmJiB0eXBlb2Ygb2JqZWN0ID09PSAnb2JqZWN0JztcbiAgICAgICAgICAgIHZhciBpc1N0ciA9IGlzT2JqZWN0ICYmIGlzU3RyaW5nKG9iamVjdCk7XG5cbiAgICAgICAgICAgIGlmICghaXNPYmplY3QgJiYgIWlzRm4gJiYgIWlzQXJncykge1xuICAgICAgICAgICAgICAgIHRocm93IG5ldyBUeXBlRXJyb3IoJ09iamVjdC5rZXlzIGNhbGxlZCBvbiBhIG5vbi1vYmplY3QnKTtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgdmFyIHRoZUtleXMgPSBbXTtcbiAgICAgICAgICAgIHZhciBza2lwUHJvdG8gPSBoYXNQcm90b0VudW1CdWcgJiYgaXNGbjtcbiAgICAgICAgICAgIGlmICgoaXNTdHIgJiYgaGFzU3RyaW5nRW51bUJ1ZykgfHwgaXNBcmdzKSB7XG4gICAgICAgICAgICAgICAgZm9yICh2YXIgaSA9IDA7IGkgPCBvYmplY3QubGVuZ3RoOyArK2kpIHtcbiAgICAgICAgICAgICAgICAgICAgcHVzaENhbGwodGhlS2V5cywgJFN0cmluZyhpKSk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBpZiAoIWlzQXJncykge1xuICAgICAgICAgICAgICAgIGZvciAodmFyIG5hbWUgaW4gb2JqZWN0KSB7XG4gICAgICAgICAgICAgICAgICAgIGlmICghKHNraXBQcm90byAmJiBuYW1lID09PSAncHJvdG90eXBlJykgJiYgb3ducyhvYmplY3QsIG5hbWUpKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBwdXNoQ2FsbCh0aGVLZXlzLCAkU3RyaW5nKG5hbWUpKTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgaWYgKGhhc0RvbnRFbnVtQnVnKSB7XG4gICAgICAgICAgICAgICAgdmFyIHNraXBDb25zdHJ1Y3RvciA9IGVxdWFsc0NvbnN0cnVjdG9yUHJvdG90eXBlSWZOb3RCdWdneShvYmplY3QpO1xuICAgICAgICAgICAgICAgIGZvciAodmFyIGogPSAwOyBqIDwgZG9udEVudW1zTGVuZ3RoOyBqKyspIHtcbiAgICAgICAgICAgICAgICAgICAgdmFyIGRvbnRFbnVtID0gZG9udEVudW1zW2pdO1xuICAgICAgICAgICAgICAgICAgICBpZiAoIShza2lwQ29uc3RydWN0b3IgJiYgZG9udEVudW0gPT09ICdjb25zdHJ1Y3RvcicpICYmIG93bnMob2JqZWN0LCBkb250RW51bSkpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHB1c2hDYWxsKHRoZUtleXMsIGRvbnRFbnVtKTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHJldHVybiB0aGVLZXlzO1xuICAgICAgICB9XG4gICAgfSk7XG5cbiAgICB2YXIga2V5c1dvcmtzV2l0aEFyZ3VtZW50cyA9ICRPYmplY3Qua2V5cyAmJiAoZnVuY3Rpb24gKCkge1xuICAgICAgICAvLyBTYWZhcmkgNS4wIGJ1Z1xuICAgICAgICByZXR1cm4gJE9iamVjdC5rZXlzKGFyZ3VtZW50cykubGVuZ3RoID09PSAyO1xuICAgIH0oMSwgMikpO1xuICAgIHZhciBrZXlzSGFzQXJndW1lbnRzTGVuZ3RoQnVnID0gJE9iamVjdC5rZXlzICYmIChmdW5jdGlvbiAoKSB7XG4gICAgICAgIHZhciBhcmdLZXlzID0gJE9iamVjdC5rZXlzKGFyZ3VtZW50cyk7XG4gICAgICAgIHJldHVybiBhcmd1bWVudHMubGVuZ3RoICE9PSAxIHx8IGFyZ0tleXMubGVuZ3RoICE9PSAxIHx8IGFyZ0tleXNbMF0gIT09IDE7XG4gICAgfSgxKSk7XG4gICAgdmFyIG9yaWdpbmFsS2V5cyA9ICRPYmplY3Qua2V5cztcbiAgICBkZWZpbmVQcm9wZXJ0aWVzKCRPYmplY3QsIHtcbiAgICAgICAga2V5czogZnVuY3Rpb24ga2V5cyhvYmplY3QpIHtcbiAgICAgICAgICAgIGlmIChpc0FyZ3VtZW50cyhvYmplY3QpKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIG9yaWdpbmFsS2V5cyhhcnJheVNsaWNlKG9iamVjdCkpO1xuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gb3JpZ2luYWxLZXlzKG9iamVjdCk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICB9LCAha2V5c1dvcmtzV2l0aEFyZ3VtZW50cyB8fCBrZXlzSGFzQXJndW1lbnRzTGVuZ3RoQnVnKTtcblxuICAgIC8vXG4gICAgLy8gRGF0ZVxuICAgIC8vID09PT1cbiAgICAvL1xuXG4gICAgdmFyIGhhc05lZ2F0aXZlTW9udGhZZWFyQnVnID0gbmV3IERhdGUoLTM1MDk4MjczMjk2MDAyOTIpLmdldFVUQ01vbnRoKCkgIT09IDA7XG4gICAgdmFyIGFOZWdhdGl2ZVRlc3REYXRlID0gbmV3IERhdGUoLTE1MDk4NDIyODk2MDAyOTIpO1xuICAgIHZhciBhUG9zaXRpdmVUZXN0RGF0ZSA9IG5ldyBEYXRlKDE0NDk2NjI0MDAwMDApO1xuICAgIHZhciBoYXNUb1VUQ1N0cmluZ0Zvcm1hdEJ1ZyA9IGFOZWdhdGl2ZVRlc3REYXRlLnRvVVRDU3RyaW5nKCkgIT09ICdNb24sIDAxIEphbiAtNDU4NzUgMTE6NTk6NTkgR01UJztcbiAgICB2YXIgaGFzVG9EYXRlU3RyaW5nRm9ybWF0QnVnO1xuICAgIHZhciBoYXNUb1N0cmluZ0Zvcm1hdEJ1ZztcbiAgICB2YXIgdGltZVpvbmVPZmZzZXQgPSBhTmVnYXRpdmVUZXN0RGF0ZS5nZXRUaW1lem9uZU9mZnNldCgpO1xuICAgIGlmICh0aW1lWm9uZU9mZnNldCA8IC03MjApIHtcbiAgICAgICAgaGFzVG9EYXRlU3RyaW5nRm9ybWF0QnVnID0gYU5lZ2F0aXZlVGVzdERhdGUudG9EYXRlU3RyaW5nKCkgIT09ICdUdWUgSmFuIDAyIC00NTg3NSc7XG4gICAgICAgIGhhc1RvU3RyaW5nRm9ybWF0QnVnID0gISgvXlRodSBEZWMgMTAgMjAxNSBcXGRcXGQ6XFxkXFxkOlxcZFxcZCBHTVRbLVxcK11cXGRcXGRcXGRcXGQoPzogfCQpLykudGVzdChhUG9zaXRpdmVUZXN0RGF0ZS50b1N0cmluZygpKTtcbiAgICB9IGVsc2Uge1xuICAgICAgICBoYXNUb0RhdGVTdHJpbmdGb3JtYXRCdWcgPSBhTmVnYXRpdmVUZXN0RGF0ZS50b0RhdGVTdHJpbmcoKSAhPT0gJ01vbiBKYW4gMDEgLTQ1ODc1JztcbiAgICAgICAgaGFzVG9TdHJpbmdGb3JtYXRCdWcgPSAhKC9eV2VkIERlYyAwOSAyMDE1IFxcZFxcZDpcXGRcXGQ6XFxkXFxkIEdNVFstXFwrXVxcZFxcZFxcZFxcZCg/OiB8JCkvKS50ZXN0KGFQb3NpdGl2ZVRlc3REYXRlLnRvU3RyaW5nKCkpO1xuICAgIH1cblxuICAgIHZhciBvcmlnaW5hbEdldEZ1bGxZZWFyID0gY2FsbC5iaW5kKERhdGUucHJvdG90eXBlLmdldEZ1bGxZZWFyKTtcbiAgICB2YXIgb3JpZ2luYWxHZXRNb250aCA9IGNhbGwuYmluZChEYXRlLnByb3RvdHlwZS5nZXRNb250aCk7XG4gICAgdmFyIG9yaWdpbmFsR2V0RGF0ZSA9IGNhbGwuYmluZChEYXRlLnByb3RvdHlwZS5nZXREYXRlKTtcbiAgICB2YXIgb3JpZ2luYWxHZXRVVENGdWxsWWVhciA9IGNhbGwuYmluZChEYXRlLnByb3RvdHlwZS5nZXRVVENGdWxsWWVhcik7XG4gICAgdmFyIG9yaWdpbmFsR2V0VVRDTW9udGggPSBjYWxsLmJpbmQoRGF0ZS5wcm90b3R5cGUuZ2V0VVRDTW9udGgpO1xuICAgIHZhciBvcmlnaW5hbEdldFVUQ0RhdGUgPSBjYWxsLmJpbmQoRGF0ZS5wcm90b3R5cGUuZ2V0VVRDRGF0ZSk7XG4gICAgdmFyIG9yaWdpbmFsR2V0VVRDRGF5ID0gY2FsbC5iaW5kKERhdGUucHJvdG90eXBlLmdldFVUQ0RheSk7XG4gICAgdmFyIG9yaWdpbmFsR2V0VVRDSG91cnMgPSBjYWxsLmJpbmQoRGF0ZS5wcm90b3R5cGUuZ2V0VVRDSG91cnMpO1xuICAgIHZhciBvcmlnaW5hbEdldFVUQ01pbnV0ZXMgPSBjYWxsLmJpbmQoRGF0ZS5wcm90b3R5cGUuZ2V0VVRDTWludXRlcyk7XG4gICAgdmFyIG9yaWdpbmFsR2V0VVRDU2Vjb25kcyA9IGNhbGwuYmluZChEYXRlLnByb3RvdHlwZS5nZXRVVENTZWNvbmRzKTtcbiAgICB2YXIgb3JpZ2luYWxHZXRVVENNaWxsaXNlY29uZHMgPSBjYWxsLmJpbmQoRGF0ZS5wcm90b3R5cGUuZ2V0VVRDTWlsbGlzZWNvbmRzKTtcbiAgICB2YXIgZGF5TmFtZSA9IFsnU3VuJywgJ01vbicsICdUdWUnLCAnV2VkJywgJ1RodScsICdGcmknLCAnU2F0J107XG4gICAgdmFyIG1vbnRoTmFtZSA9IFsnSmFuJywgJ0ZlYicsICdNYXInLCAnQXByJywgJ01heScsICdKdW4nLCAnSnVsJywgJ0F1ZycsICdTZXAnLCAnT2N0JywgJ05vdicsICdEZWMnXTtcbiAgICB2YXIgZGF5c0luTW9udGggPSBmdW5jdGlvbiBkYXlzSW5Nb250aChtb250aCwgeWVhcikge1xuICAgICAgICByZXR1cm4gb3JpZ2luYWxHZXREYXRlKG5ldyBEYXRlKHllYXIsIG1vbnRoLCAwKSk7XG4gICAgfTtcblxuICAgIGRlZmluZVByb3BlcnRpZXMoRGF0ZS5wcm90b3R5cGUsIHtcbiAgICAgICAgZ2V0RnVsbFllYXI6IGZ1bmN0aW9uIGdldEZ1bGxZZWFyKCkge1xuICAgICAgICAgICAgaWYgKCF0aGlzIHx8ICEodGhpcyBpbnN0YW5jZW9mIERhdGUpKSB7XG4gICAgICAgICAgICAgICAgdGhyb3cgbmV3IFR5cGVFcnJvcigndGhpcyBpcyBub3QgYSBEYXRlIG9iamVjdC4nKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHZhciB5ZWFyID0gb3JpZ2luYWxHZXRGdWxsWWVhcih0aGlzKTtcbiAgICAgICAgICAgIGlmICh5ZWFyIDwgMCAmJiBvcmlnaW5hbEdldE1vbnRoKHRoaXMpID4gMTEpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4geWVhciArIDE7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICByZXR1cm4geWVhcjtcbiAgICAgICAgfSxcbiAgICAgICAgZ2V0TW9udGg6IGZ1bmN0aW9uIGdldE1vbnRoKCkge1xuICAgICAgICAgICAgaWYgKCF0aGlzIHx8ICEodGhpcyBpbnN0YW5jZW9mIERhdGUpKSB7XG4gICAgICAgICAgICAgICAgdGhyb3cgbmV3IFR5cGVFcnJvcigndGhpcyBpcyBub3QgYSBEYXRlIG9iamVjdC4nKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHZhciB5ZWFyID0gb3JpZ2luYWxHZXRGdWxsWWVhcih0aGlzKTtcbiAgICAgICAgICAgIHZhciBtb250aCA9IG9yaWdpbmFsR2V0TW9udGgodGhpcyk7XG4gICAgICAgICAgICBpZiAoeWVhciA8IDAgJiYgbW9udGggPiAxMSkge1xuICAgICAgICAgICAgICAgIHJldHVybiAwO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgcmV0dXJuIG1vbnRoO1xuICAgICAgICB9LFxuICAgICAgICBnZXREYXRlOiBmdW5jdGlvbiBnZXREYXRlKCkge1xuICAgICAgICAgICAgaWYgKCF0aGlzIHx8ICEodGhpcyBpbnN0YW5jZW9mIERhdGUpKSB7XG4gICAgICAgICAgICAgICAgdGhyb3cgbmV3IFR5cGVFcnJvcigndGhpcyBpcyBub3QgYSBEYXRlIG9iamVjdC4nKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHZhciB5ZWFyID0gb3JpZ2luYWxHZXRGdWxsWWVhcih0aGlzKTtcbiAgICAgICAgICAgIHZhciBtb250aCA9IG9yaWdpbmFsR2V0TW9udGgodGhpcyk7XG4gICAgICAgICAgICB2YXIgZGF0ZSA9IG9yaWdpbmFsR2V0RGF0ZSh0aGlzKTtcbiAgICAgICAgICAgIGlmICh5ZWFyIDwgMCAmJiBtb250aCA+IDExKSB7XG4gICAgICAgICAgICAgICAgaWYgKG1vbnRoID09PSAxMikge1xuICAgICAgICAgICAgICAgICAgICByZXR1cm4gZGF0ZTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgdmFyIGRheXMgPSBkYXlzSW5Nb250aCgwLCB5ZWFyICsgMSk7XG4gICAgICAgICAgICAgICAgcmV0dXJuIChkYXlzIC0gZGF0ZSkgKyAxO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgcmV0dXJuIGRhdGU7XG4gICAgICAgIH0sXG4gICAgICAgIGdldFVUQ0Z1bGxZZWFyOiBmdW5jdGlvbiBnZXRVVENGdWxsWWVhcigpIHtcbiAgICAgICAgICAgIGlmICghdGhpcyB8fCAhKHRoaXMgaW5zdGFuY2VvZiBEYXRlKSkge1xuICAgICAgICAgICAgICAgIHRocm93IG5ldyBUeXBlRXJyb3IoJ3RoaXMgaXMgbm90IGEgRGF0ZSBvYmplY3QuJyk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICB2YXIgeWVhciA9IG9yaWdpbmFsR2V0VVRDRnVsbFllYXIodGhpcyk7XG4gICAgICAgICAgICBpZiAoeWVhciA8IDAgJiYgb3JpZ2luYWxHZXRVVENNb250aCh0aGlzKSA+IDExKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIHllYXIgKyAxO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgcmV0dXJuIHllYXI7XG4gICAgICAgIH0sXG4gICAgICAgIGdldFVUQ01vbnRoOiBmdW5jdGlvbiBnZXRVVENNb250aCgpIHtcbiAgICAgICAgICAgIGlmICghdGhpcyB8fCAhKHRoaXMgaW5zdGFuY2VvZiBEYXRlKSkge1xuICAgICAgICAgICAgICAgIHRocm93IG5ldyBUeXBlRXJyb3IoJ3RoaXMgaXMgbm90IGEgRGF0ZSBvYmplY3QuJyk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICB2YXIgeWVhciA9IG9yaWdpbmFsR2V0VVRDRnVsbFllYXIodGhpcyk7XG4gICAgICAgICAgICB2YXIgbW9udGggPSBvcmlnaW5hbEdldFVUQ01vbnRoKHRoaXMpO1xuICAgICAgICAgICAgaWYgKHllYXIgPCAwICYmIG1vbnRoID4gMTEpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gMDtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHJldHVybiBtb250aDtcbiAgICAgICAgfSxcbiAgICAgICAgZ2V0VVRDRGF0ZTogZnVuY3Rpb24gZ2V0VVRDRGF0ZSgpIHtcbiAgICAgICAgICAgIGlmICghdGhpcyB8fCAhKHRoaXMgaW5zdGFuY2VvZiBEYXRlKSkge1xuICAgICAgICAgICAgICAgIHRocm93IG5ldyBUeXBlRXJyb3IoJ3RoaXMgaXMgbm90IGEgRGF0ZSBvYmplY3QuJyk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICB2YXIgeWVhciA9IG9yaWdpbmFsR2V0VVRDRnVsbFllYXIodGhpcyk7XG4gICAgICAgICAgICB2YXIgbW9udGggPSBvcmlnaW5hbEdldFVUQ01vbnRoKHRoaXMpO1xuICAgICAgICAgICAgdmFyIGRhdGUgPSBvcmlnaW5hbEdldFVUQ0RhdGUodGhpcyk7XG4gICAgICAgICAgICBpZiAoeWVhciA8IDAgJiYgbW9udGggPiAxMSkge1xuICAgICAgICAgICAgICAgIGlmIChtb250aCA9PT0gMTIpIHtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGRhdGU7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIHZhciBkYXlzID0gZGF5c0luTW9udGgoMCwgeWVhciArIDEpO1xuICAgICAgICAgICAgICAgIHJldHVybiAoZGF5cyAtIGRhdGUpICsgMTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHJldHVybiBkYXRlO1xuICAgICAgICB9XG4gICAgfSwgaGFzTmVnYXRpdmVNb250aFllYXJCdWcpO1xuXG4gICAgZGVmaW5lUHJvcGVydGllcyhEYXRlLnByb3RvdHlwZSwge1xuICAgICAgICB0b1VUQ1N0cmluZzogZnVuY3Rpb24gdG9VVENTdHJpbmcoKSB7XG4gICAgICAgICAgICBpZiAoIXRoaXMgfHwgISh0aGlzIGluc3RhbmNlb2YgRGF0ZSkpIHtcbiAgICAgICAgICAgICAgICB0aHJvdyBuZXcgVHlwZUVycm9yKCd0aGlzIGlzIG5vdCBhIERhdGUgb2JqZWN0LicpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgdmFyIGRheSA9IG9yaWdpbmFsR2V0VVRDRGF5KHRoaXMpO1xuICAgICAgICAgICAgdmFyIGRhdGUgPSBvcmlnaW5hbEdldFVUQ0RhdGUodGhpcyk7XG4gICAgICAgICAgICB2YXIgbW9udGggPSBvcmlnaW5hbEdldFVUQ01vbnRoKHRoaXMpO1xuICAgICAgICAgICAgdmFyIHllYXIgPSBvcmlnaW5hbEdldFVUQ0Z1bGxZZWFyKHRoaXMpO1xuICAgICAgICAgICAgdmFyIGhvdXIgPSBvcmlnaW5hbEdldFVUQ0hvdXJzKHRoaXMpO1xuICAgICAgICAgICAgdmFyIG1pbnV0ZSA9IG9yaWdpbmFsR2V0VVRDTWludXRlcyh0aGlzKTtcbiAgICAgICAgICAgIHZhciBzZWNvbmQgPSBvcmlnaW5hbEdldFVUQ1NlY29uZHModGhpcyk7XG4gICAgICAgICAgICByZXR1cm4gZGF5TmFtZVtkYXldICsgJywgJyArXG4gICAgICAgICAgICAgICAgKGRhdGUgPCAxMCA/ICcwJyArIGRhdGUgOiBkYXRlKSArICcgJyArXG4gICAgICAgICAgICAgICAgbW9udGhOYW1lW21vbnRoXSArICcgJyArXG4gICAgICAgICAgICAgICAgeWVhciArICcgJyArXG4gICAgICAgICAgICAgICAgKGhvdXIgPCAxMCA/ICcwJyArIGhvdXIgOiBob3VyKSArICc6JyArXG4gICAgICAgICAgICAgICAgKG1pbnV0ZSA8IDEwID8gJzAnICsgbWludXRlIDogbWludXRlKSArICc6JyArXG4gICAgICAgICAgICAgICAgKHNlY29uZCA8IDEwID8gJzAnICsgc2Vjb25kIDogc2Vjb25kKSArICcgR01UJztcbiAgICAgICAgfVxuICAgIH0sIGhhc05lZ2F0aXZlTW9udGhZZWFyQnVnIHx8IGhhc1RvVVRDU3RyaW5nRm9ybWF0QnVnKTtcblxuICAgIC8vIE9wZXJhIDEyIGhhcyBgLGBcbiAgICBkZWZpbmVQcm9wZXJ0aWVzKERhdGUucHJvdG90eXBlLCB7XG4gICAgICAgIHRvRGF0ZVN0cmluZzogZnVuY3Rpb24gdG9EYXRlU3RyaW5nKCkge1xuICAgICAgICAgICAgaWYgKCF0aGlzIHx8ICEodGhpcyBpbnN0YW5jZW9mIERhdGUpKSB7XG4gICAgICAgICAgICAgICAgdGhyb3cgbmV3IFR5cGVFcnJvcigndGhpcyBpcyBub3QgYSBEYXRlIG9iamVjdC4nKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHZhciBkYXkgPSB0aGlzLmdldERheSgpO1xuICAgICAgICAgICAgdmFyIGRhdGUgPSB0aGlzLmdldERhdGUoKTtcbiAgICAgICAgICAgIHZhciBtb250aCA9IHRoaXMuZ2V0TW9udGgoKTtcbiAgICAgICAgICAgIHZhciB5ZWFyID0gdGhpcy5nZXRGdWxsWWVhcigpO1xuICAgICAgICAgICAgcmV0dXJuIGRheU5hbWVbZGF5XSArICcgJyArXG4gICAgICAgICAgICAgICAgbW9udGhOYW1lW21vbnRoXSArICcgJyArXG4gICAgICAgICAgICAgICAgKGRhdGUgPCAxMCA/ICcwJyArIGRhdGUgOiBkYXRlKSArICcgJyArXG4gICAgICAgICAgICAgICAgeWVhcjtcbiAgICAgICAgfVxuICAgIH0sIGhhc05lZ2F0aXZlTW9udGhZZWFyQnVnIHx8IGhhc1RvRGF0ZVN0cmluZ0Zvcm1hdEJ1Zyk7XG5cbiAgICAvLyBjYW4ndCB1c2UgZGVmaW5lUHJvcGVydGllcyBoZXJlIGJlY2F1c2Ugb2YgdG9TdHJpbmcgZW51bWVyYXRpb24gaXNzdWUgaW4gSUUgPD0gOFxuICAgIGlmIChoYXNOZWdhdGl2ZU1vbnRoWWVhckJ1ZyB8fCBoYXNUb1N0cmluZ0Zvcm1hdEJ1Zykge1xuICAgICAgICBEYXRlLnByb3RvdHlwZS50b1N0cmluZyA9IGZ1bmN0aW9uIHRvU3RyaW5nKCkge1xuICAgICAgICAgICAgaWYgKCF0aGlzIHx8ICEodGhpcyBpbnN0YW5jZW9mIERhdGUpKSB7XG4gICAgICAgICAgICAgICAgdGhyb3cgbmV3IFR5cGVFcnJvcigndGhpcyBpcyBub3QgYSBEYXRlIG9iamVjdC4nKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHZhciBkYXkgPSB0aGlzLmdldERheSgpO1xuICAgICAgICAgICAgdmFyIGRhdGUgPSB0aGlzLmdldERhdGUoKTtcbiAgICAgICAgICAgIHZhciBtb250aCA9IHRoaXMuZ2V0TW9udGgoKTtcbiAgICAgICAgICAgIHZhciB5ZWFyID0gdGhpcy5nZXRGdWxsWWVhcigpO1xuICAgICAgICAgICAgdmFyIGhvdXIgPSB0aGlzLmdldEhvdXJzKCk7XG4gICAgICAgICAgICB2YXIgbWludXRlID0gdGhpcy5nZXRNaW51dGVzKCk7XG4gICAgICAgICAgICB2YXIgc2Vjb25kID0gdGhpcy5nZXRTZWNvbmRzKCk7XG4gICAgICAgICAgICB2YXIgdGltZXpvbmVPZmZzZXQgPSB0aGlzLmdldFRpbWV6b25lT2Zmc2V0KCk7XG4gICAgICAgICAgICB2YXIgaG91cnNPZmZzZXQgPSBNYXRoLmZsb29yKE1hdGguYWJzKHRpbWV6b25lT2Zmc2V0KSAvIDYwKTtcbiAgICAgICAgICAgIHZhciBtaW51dGVzT2Zmc2V0ID0gTWF0aC5mbG9vcihNYXRoLmFicyh0aW1lem9uZU9mZnNldCkgJSA2MCk7XG4gICAgICAgICAgICByZXR1cm4gZGF5TmFtZVtkYXldICsgJyAnICtcbiAgICAgICAgICAgICAgICBtb250aE5hbWVbbW9udGhdICsgJyAnICtcbiAgICAgICAgICAgICAgICAoZGF0ZSA8IDEwID8gJzAnICsgZGF0ZSA6IGRhdGUpICsgJyAnICtcbiAgICAgICAgICAgICAgICB5ZWFyICsgJyAnICtcbiAgICAgICAgICAgICAgICAoaG91ciA8IDEwID8gJzAnICsgaG91ciA6IGhvdXIpICsgJzonICtcbiAgICAgICAgICAgICAgICAobWludXRlIDwgMTAgPyAnMCcgKyBtaW51dGUgOiBtaW51dGUpICsgJzonICtcbiAgICAgICAgICAgICAgICAoc2Vjb25kIDwgMTAgPyAnMCcgKyBzZWNvbmQgOiBzZWNvbmQpICsgJyBHTVQnICtcbiAgICAgICAgICAgICAgICAodGltZXpvbmVPZmZzZXQgPiAwID8gJy0nIDogJysnKSArXG4gICAgICAgICAgICAgICAgKGhvdXJzT2Zmc2V0IDwgMTAgPyAnMCcgKyBob3Vyc09mZnNldCA6IGhvdXJzT2Zmc2V0KSArXG4gICAgICAgICAgICAgICAgKG1pbnV0ZXNPZmZzZXQgPCAxMCA/ICcwJyArIG1pbnV0ZXNPZmZzZXQgOiBtaW51dGVzT2Zmc2V0KTtcbiAgICAgICAgfTtcbiAgICAgICAgaWYgKHN1cHBvcnRzRGVzY3JpcHRvcnMpIHtcbiAgICAgICAgICAgICRPYmplY3QuZGVmaW5lUHJvcGVydHkoRGF0ZS5wcm90b3R5cGUsICd0b1N0cmluZycsIHtcbiAgICAgICAgICAgICAgICBjb25maWd1cmFibGU6IHRydWUsXG4gICAgICAgICAgICAgICAgZW51bWVyYWJsZTogZmFsc2UsXG4gICAgICAgICAgICAgICAgd3JpdGFibGU6IHRydWVcbiAgICAgICAgICAgIH0pO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgLy8gRVM1IDE1LjkuNS40M1xuICAgIC8vIGh0dHA6Ly9lczUuZ2l0aHViLmNvbS8jeDE1LjkuNS40M1xuICAgIC8vIFRoaXMgZnVuY3Rpb24gcmV0dXJucyBhIFN0cmluZyB2YWx1ZSByZXByZXNlbnQgdGhlIGluc3RhbmNlIGluIHRpbWVcbiAgICAvLyByZXByZXNlbnRlZCBieSB0aGlzIERhdGUgb2JqZWN0LiBUaGUgZm9ybWF0IG9mIHRoZSBTdHJpbmcgaXMgdGhlIERhdGUgVGltZVxuICAgIC8vIHN0cmluZyBmb3JtYXQgZGVmaW5lZCBpbiAxNS45LjEuMTUuIEFsbCBmaWVsZHMgYXJlIHByZXNlbnQgaW4gdGhlIFN0cmluZy5cbiAgICAvLyBUaGUgdGltZSB6b25lIGlzIGFsd2F5cyBVVEMsIGRlbm90ZWQgYnkgdGhlIHN1ZmZpeCBaLiBJZiB0aGUgdGltZSB2YWx1ZSBvZlxuICAgIC8vIHRoaXMgb2JqZWN0IGlzIG5vdCBhIGZpbml0ZSBOdW1iZXIgYSBSYW5nZUVycm9yIGV4Y2VwdGlvbiBpcyB0aHJvd24uXG4gICAgdmFyIG5lZ2F0aXZlRGF0ZSA9IC02MjE5ODc1NTIwMDAwMDtcbiAgICB2YXIgbmVnYXRpdmVZZWFyU3RyaW5nID0gJy0wMDAwMDEnO1xuICAgIHZhciBoYXNOZWdhdGl2ZURhdGVCdWcgPSBEYXRlLnByb3RvdHlwZS50b0lTT1N0cmluZyAmJiBuZXcgRGF0ZShuZWdhdGl2ZURhdGUpLnRvSVNPU3RyaW5nKCkuaW5kZXhPZihuZWdhdGl2ZVllYXJTdHJpbmcpID09PSAtMTtcbiAgICB2YXIgaGFzU2FmYXJpNTFEYXRlQnVnID0gRGF0ZS5wcm90b3R5cGUudG9JU09TdHJpbmcgJiYgbmV3IERhdGUoLTEpLnRvSVNPU3RyaW5nKCkgIT09ICcxOTY5LTEyLTMxVDIzOjU5OjU5Ljk5OVonO1xuXG4gICAgdmFyIGdldFRpbWUgPSBjYWxsLmJpbmQoRGF0ZS5wcm90b3R5cGUuZ2V0VGltZSk7XG5cbiAgICBkZWZpbmVQcm9wZXJ0aWVzKERhdGUucHJvdG90eXBlLCB7XG4gICAgICAgIHRvSVNPU3RyaW5nOiBmdW5jdGlvbiB0b0lTT1N0cmluZygpIHtcbiAgICAgICAgICAgIGlmICghaXNGaW5pdGUodGhpcykgfHwgIWlzRmluaXRlKGdldFRpbWUodGhpcykpKSB7XG4gICAgICAgICAgICAgICAgLy8gQWRvcGUgUGhvdG9zaG9wIHJlcXVpcmVzIHRoZSBzZWNvbmQgY2hlY2suXG4gICAgICAgICAgICAgICAgdGhyb3cgbmV3IFJhbmdlRXJyb3IoJ0RhdGUucHJvdG90eXBlLnRvSVNPU3RyaW5nIGNhbGxlZCBvbiBub24tZmluaXRlIHZhbHVlLicpO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICB2YXIgeWVhciA9IG9yaWdpbmFsR2V0VVRDRnVsbFllYXIodGhpcyk7XG5cbiAgICAgICAgICAgIHZhciBtb250aCA9IG9yaWdpbmFsR2V0VVRDTW9udGgodGhpcyk7XG4gICAgICAgICAgICAvLyBzZWUgaHR0cHM6Ly9naXRodWIuY29tL2VzLXNoaW1zL2VzNS1zaGltL2lzc3Vlcy8xMTFcbiAgICAgICAgICAgIHllYXIgKz0gTWF0aC5mbG9vcihtb250aCAvIDEyKTtcbiAgICAgICAgICAgIG1vbnRoID0gKG1vbnRoICUgMTIgKyAxMikgJSAxMjtcblxuICAgICAgICAgICAgLy8gdGhlIGRhdGUgdGltZSBzdHJpbmcgZm9ybWF0IGlzIHNwZWNpZmllZCBpbiAxNS45LjEuMTUuXG4gICAgICAgICAgICB2YXIgcmVzdWx0ID0gW21vbnRoICsgMSwgb3JpZ2luYWxHZXRVVENEYXRlKHRoaXMpLCBvcmlnaW5hbEdldFVUQ0hvdXJzKHRoaXMpLCBvcmlnaW5hbEdldFVUQ01pbnV0ZXModGhpcyksIG9yaWdpbmFsR2V0VVRDU2Vjb25kcyh0aGlzKV07XG4gICAgICAgICAgICB5ZWFyID0gKFxuICAgICAgICAgICAgICAgICh5ZWFyIDwgMCA/ICctJyA6ICh5ZWFyID4gOTk5OSA/ICcrJyA6ICcnKSkgK1xuICAgICAgICAgICAgICAgIHN0clNsaWNlKCcwMDAwMCcgKyBNYXRoLmFicyh5ZWFyKSwgKDAgPD0geWVhciAmJiB5ZWFyIDw9IDk5OTkpID8gLTQgOiAtNilcbiAgICAgICAgICAgICk7XG5cbiAgICAgICAgICAgIGZvciAodmFyIGkgPSAwOyBpIDwgcmVzdWx0Lmxlbmd0aDsgKytpKSB7XG4gICAgICAgICAgICAgICAgLy8gcGFkIG1vbnRocywgZGF5cywgaG91cnMsIG1pbnV0ZXMsIGFuZCBzZWNvbmRzIHRvIGhhdmUgdHdvIGRpZ2l0cy5cbiAgICAgICAgICAgICAgICByZXN1bHRbaV0gPSBzdHJTbGljZSgnMDAnICsgcmVzdWx0W2ldLCAtMik7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICAvLyBwYWQgbWlsbGlzZWNvbmRzIHRvIGhhdmUgdGhyZWUgZGlnaXRzLlxuICAgICAgICAgICAgcmV0dXJuIChcbiAgICAgICAgICAgICAgICB5ZWFyICsgJy0nICsgYXJyYXlTbGljZShyZXN1bHQsIDAsIDIpLmpvaW4oJy0nKSArXG4gICAgICAgICAgICAgICAgJ1QnICsgYXJyYXlTbGljZShyZXN1bHQsIDIpLmpvaW4oJzonKSArICcuJyArXG4gICAgICAgICAgICAgICAgc3RyU2xpY2UoJzAwMCcgKyBvcmlnaW5hbEdldFVUQ01pbGxpc2Vjb25kcyh0aGlzKSwgLTMpICsgJ1onXG4gICAgICAgICAgICApO1xuICAgICAgICB9XG4gICAgfSwgaGFzTmVnYXRpdmVEYXRlQnVnIHx8IGhhc1NhZmFyaTUxRGF0ZUJ1Zyk7XG5cbiAgICAvLyBFUzUgMTUuOS41LjQ0XG4gICAgLy8gaHR0cDovL2VzNS5naXRodWIuY29tLyN4MTUuOS41LjQ0XG4gICAgLy8gVGhpcyBmdW5jdGlvbiBwcm92aWRlcyBhIFN0cmluZyByZXByZXNlbnRhdGlvbiBvZiBhIERhdGUgb2JqZWN0IGZvciB1c2UgYnlcbiAgICAvLyBKU09OLnN0cmluZ2lmeSAoMTUuMTIuMykuXG4gICAgdmFyIGRhdGVUb0pTT05Jc1N1cHBvcnRlZCA9IChmdW5jdGlvbiAoKSB7XG4gICAgICAgIHRyeSB7XG4gICAgICAgICAgICByZXR1cm4gRGF0ZS5wcm90b3R5cGUudG9KU09OICYmXG4gICAgICAgICAgICAgICAgbmV3IERhdGUoTmFOKS50b0pTT04oKSA9PT0gbnVsbCAmJlxuICAgICAgICAgICAgICAgIG5ldyBEYXRlKG5lZ2F0aXZlRGF0ZSkudG9KU09OKCkuaW5kZXhPZihuZWdhdGl2ZVllYXJTdHJpbmcpICE9PSAtMSAmJlxuICAgICAgICAgICAgICAgIERhdGUucHJvdG90eXBlLnRvSlNPTi5jYWxsKHsgLy8gZ2VuZXJpY1xuICAgICAgICAgICAgICAgICAgICB0b0lTT1N0cmluZzogZnVuY3Rpb24gKCkgeyByZXR1cm4gdHJ1ZTsgfVxuICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICB9IGNhdGNoIChlKSB7XG4gICAgICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICAgIH1cbiAgICB9KCkpO1xuICAgIGlmICghZGF0ZVRvSlNPTklzU3VwcG9ydGVkKSB7XG4gICAgICAgIERhdGUucHJvdG90eXBlLnRvSlNPTiA9IGZ1bmN0aW9uIHRvSlNPTihrZXkpIHtcbiAgICAgICAgICAgIC8vIFdoZW4gdGhlIHRvSlNPTiBtZXRob2QgaXMgY2FsbGVkIHdpdGggYXJndW1lbnQga2V5LCB0aGUgZm9sbG93aW5nXG4gICAgICAgICAgICAvLyBzdGVwcyBhcmUgdGFrZW46XG5cbiAgICAgICAgICAgIC8vIDEuICBMZXQgTyBiZSB0aGUgcmVzdWx0IG9mIGNhbGxpbmcgVG9PYmplY3QsIGdpdmluZyBpdCB0aGUgdGhpc1xuICAgICAgICAgICAgLy8gdmFsdWUgYXMgaXRzIGFyZ3VtZW50LlxuICAgICAgICAgICAgLy8gMi4gTGV0IHR2IGJlIEVTLlRvUHJpbWl0aXZlKE8sIGhpbnQgTnVtYmVyKS5cbiAgICAgICAgICAgIHZhciBPID0gJE9iamVjdCh0aGlzKTtcbiAgICAgICAgICAgIHZhciB0diA9IEVTLlRvUHJpbWl0aXZlKE8pO1xuICAgICAgICAgICAgLy8gMy4gSWYgdHYgaXMgYSBOdW1iZXIgYW5kIGlzIG5vdCBmaW5pdGUsIHJldHVybiBudWxsLlxuICAgICAgICAgICAgaWYgKHR5cGVvZiB0diA9PT0gJ251bWJlcicgJiYgIWlzRmluaXRlKHR2KSkge1xuICAgICAgICAgICAgICAgIHJldHVybiBudWxsO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgLy8gNC4gTGV0IHRvSVNPIGJlIHRoZSByZXN1bHQgb2YgY2FsbGluZyB0aGUgW1tHZXRdXSBpbnRlcm5hbCBtZXRob2Qgb2ZcbiAgICAgICAgICAgIC8vIE8gd2l0aCBhcmd1bWVudCBcInRvSVNPU3RyaW5nXCIuXG4gICAgICAgICAgICB2YXIgdG9JU08gPSBPLnRvSVNPU3RyaW5nO1xuICAgICAgICAgICAgLy8gNS4gSWYgSXNDYWxsYWJsZSh0b0lTTykgaXMgZmFsc2UsIHRocm93IGEgVHlwZUVycm9yIGV4Y2VwdGlvbi5cbiAgICAgICAgICAgIGlmICghaXNDYWxsYWJsZSh0b0lTTykpIHtcbiAgICAgICAgICAgICAgICB0aHJvdyBuZXcgVHlwZUVycm9yKCd0b0lTT1N0cmluZyBwcm9wZXJ0eSBpcyBub3QgY2FsbGFibGUnKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIC8vIDYuIFJldHVybiB0aGUgcmVzdWx0IG9mIGNhbGxpbmcgdGhlIFtbQ2FsbF1dIGludGVybmFsIG1ldGhvZCBvZlxuICAgICAgICAgICAgLy8gIHRvSVNPIHdpdGggTyBhcyB0aGUgdGhpcyB2YWx1ZSBhbmQgYW4gZW1wdHkgYXJndW1lbnQgbGlzdC5cbiAgICAgICAgICAgIHJldHVybiB0b0lTTy5jYWxsKE8pO1xuXG4gICAgICAgICAgICAvLyBOT1RFIDEgVGhlIGFyZ3VtZW50IGlzIGlnbm9yZWQuXG5cbiAgICAgICAgICAgIC8vIE5PVEUgMiBUaGUgdG9KU09OIGZ1bmN0aW9uIGlzIGludGVudGlvbmFsbHkgZ2VuZXJpYzsgaXQgZG9lcyBub3RcbiAgICAgICAgICAgIC8vIHJlcXVpcmUgdGhhdCBpdHMgdGhpcyB2YWx1ZSBiZSBhIERhdGUgb2JqZWN0LiBUaGVyZWZvcmUsIGl0IGNhbiBiZVxuICAgICAgICAgICAgLy8gdHJhbnNmZXJyZWQgdG8gb3RoZXIga2luZHMgb2Ygb2JqZWN0cyBmb3IgdXNlIGFzIGEgbWV0aG9kLiBIb3dldmVyLFxuICAgICAgICAgICAgLy8gaXQgZG9lcyByZXF1aXJlIHRoYXQgYW55IHN1Y2ggb2JqZWN0IGhhdmUgYSB0b0lTT1N0cmluZyBtZXRob2QuIEFuXG4gICAgICAgICAgICAvLyBvYmplY3QgaXMgZnJlZSB0byB1c2UgdGhlIGFyZ3VtZW50IGtleSB0byBmaWx0ZXIgaXRzXG4gICAgICAgICAgICAvLyBzdHJpbmdpZmljYXRpb24uXG4gICAgICAgIH07XG4gICAgfVxuXG4gICAgLy8gRVM1IDE1LjkuNC4yXG4gICAgLy8gaHR0cDovL2VzNS5naXRodWIuY29tLyN4MTUuOS40LjJcbiAgICAvLyBiYXNlZCBvbiB3b3JrIHNoYXJlZCBieSBEYW5pZWwgRnJpZXNlbiAoZGFudG1hbilcbiAgICAvLyBodHRwOi8vZ2lzdC5naXRodWIuY29tLzMwMzI0OVxuICAgIHZhciBzdXBwb3J0c0V4dGVuZGVkWWVhcnMgPSBEYXRlLnBhcnNlKCcrMDMzNjU4LTA5LTI3VDAxOjQ2OjQwLjAwMFonKSA9PT0gMWUxNTtcbiAgICB2YXIgYWNjZXB0c0ludmFsaWREYXRlcyA9ICFpc05hTihEYXRlLnBhcnNlKCcyMDEyLTA0LTA0VDI0OjAwOjAwLjUwMFonKSkgfHwgIWlzTmFOKERhdGUucGFyc2UoJzIwMTItMTEtMzFUMjM6NTk6NTkuMDAwWicpKSB8fCAhaXNOYU4oRGF0ZS5wYXJzZSgnMjAxMi0xMi0zMVQyMzo1OTo2MC4wMDBaJykpO1xuICAgIHZhciBkb2VzTm90UGFyc2VZMktOZXdZZWFyID0gaXNOYU4oRGF0ZS5wYXJzZSgnMjAwMC0wMS0wMVQwMDowMDowMC4wMDBaJykpO1xuICAgIGlmIChkb2VzTm90UGFyc2VZMktOZXdZZWFyIHx8IGFjY2VwdHNJbnZhbGlkRGF0ZXMgfHwgIXN1cHBvcnRzRXh0ZW5kZWRZZWFycykge1xuICAgICAgICAvLyBYWFggZ2xvYmFsIGFzc2lnbm1lbnQgd29uJ3Qgd29yayBpbiBlbWJlZGRpbmdzIHRoYXQgdXNlXG4gICAgICAgIC8vIGFuIGFsdGVybmF0ZSBvYmplY3QgZm9yIHRoZSBjb250ZXh0LlxuICAgICAgICAvKiBnbG9iYWwgRGF0ZTogdHJ1ZSAqL1xuICAgICAgICAvKiBlc2xpbnQtZGlzYWJsZSBuby11bmRlZiAqL1xuICAgICAgICB2YXIgbWF4U2FmZVVuc2lnbmVkMzJCaXQgPSBNYXRoLnBvdygyLCAzMSkgLSAxO1xuICAgICAgICB2YXIgaGFzU2FmYXJpU2lnbmVkSW50QnVnID0gaXNBY3R1YWxOYU4obmV3IERhdGUoMTk3MCwgMCwgMSwgMCwgMCwgMCwgbWF4U2FmZVVuc2lnbmVkMzJCaXQgKyAxKS5nZXRUaW1lKCkpO1xuICAgICAgICAvKiBlc2xpbnQtZGlzYWJsZSBuby1pbXBsaWNpdC1nbG9iYWxzICovXG4gICAgICAgIERhdGUgPSAoZnVuY3Rpb24gKE5hdGl2ZURhdGUpIHtcbiAgICAgICAgLyogZXNsaW50LWVuYWJsZSBuby1pbXBsaWNpdC1nbG9iYWxzICovXG4gICAgICAgIC8qIGVzbGludC1lbmFibGUgbm8tdW5kZWYgKi9cbiAgICAgICAgICAgIC8vIERhdGUubGVuZ3RoID09PSA3XG4gICAgICAgICAgICB2YXIgRGF0ZVNoaW0gPSBmdW5jdGlvbiBEYXRlKFksIE0sIEQsIGgsIG0sIHMsIG1zKSB7XG4gICAgICAgICAgICAgICAgdmFyIGxlbmd0aCA9IGFyZ3VtZW50cy5sZW5ndGg7XG4gICAgICAgICAgICAgICAgdmFyIGRhdGU7XG4gICAgICAgICAgICAgICAgaWYgKHRoaXMgaW5zdGFuY2VvZiBOYXRpdmVEYXRlKSB7XG4gICAgICAgICAgICAgICAgICAgIHZhciBzZWNvbmRzID0gcztcbiAgICAgICAgICAgICAgICAgICAgdmFyIG1pbGxpcyA9IG1zO1xuICAgICAgICAgICAgICAgICAgICBpZiAoaGFzU2FmYXJpU2lnbmVkSW50QnVnICYmIGxlbmd0aCA+PSA3ICYmIG1zID4gbWF4U2FmZVVuc2lnbmVkMzJCaXQpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIHdvcmsgYXJvdW5kIGEgU2FmYXJpIDgvOSBidWcgd2hlcmUgaXQgdHJlYXRzIHRoZSBzZWNvbmRzIGFzIHNpZ25lZFxuICAgICAgICAgICAgICAgICAgICAgICAgdmFyIG1zVG9TaGlmdCA9IE1hdGguZmxvb3IobXMgLyBtYXhTYWZlVW5zaWduZWQzMkJpdCkgKiBtYXhTYWZlVW5zaWduZWQzMkJpdDtcbiAgICAgICAgICAgICAgICAgICAgICAgIHZhciBzVG9TaGlmdCA9IE1hdGguZmxvb3IobXNUb1NoaWZ0IC8gMWUzKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIHNlY29uZHMgKz0gc1RvU2hpZnQ7XG4gICAgICAgICAgICAgICAgICAgICAgICBtaWxsaXMgLT0gc1RvU2hpZnQgKiAxZTM7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgZGF0ZSA9IGxlbmd0aCA9PT0gMSAmJiAkU3RyaW5nKFkpID09PSBZID8gLy8gaXNTdHJpbmcoWSlcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIFdlIGV4cGxpY2l0bHkgcGFzcyBpdCB0aHJvdWdoIHBhcnNlOlxuICAgICAgICAgICAgICAgICAgICAgICAgbmV3IE5hdGl2ZURhdGUoRGF0ZVNoaW0ucGFyc2UoWSkpIDpcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIFdlIGhhdmUgdG8gbWFudWFsbHkgbWFrZSBjYWxscyBkZXBlbmRpbmcgb24gYXJndW1lbnRcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIGxlbmd0aCBoZXJlXG4gICAgICAgICAgICAgICAgICAgICAgICBsZW5ndGggPj0gNyA/IG5ldyBOYXRpdmVEYXRlKFksIE0sIEQsIGgsIG0sIHNlY29uZHMsIG1pbGxpcykgOlxuICAgICAgICAgICAgICAgICAgICAgICAgbGVuZ3RoID49IDYgPyBuZXcgTmF0aXZlRGF0ZShZLCBNLCBELCBoLCBtLCBzZWNvbmRzKSA6XG4gICAgICAgICAgICAgICAgICAgICAgICBsZW5ndGggPj0gNSA/IG5ldyBOYXRpdmVEYXRlKFksIE0sIEQsIGgsIG0pIDpcbiAgICAgICAgICAgICAgICAgICAgICAgIGxlbmd0aCA+PSA0ID8gbmV3IE5hdGl2ZURhdGUoWSwgTSwgRCwgaCkgOlxuICAgICAgICAgICAgICAgICAgICAgICAgbGVuZ3RoID49IDMgPyBuZXcgTmF0aXZlRGF0ZShZLCBNLCBEKSA6XG4gICAgICAgICAgICAgICAgICAgICAgICBsZW5ndGggPj0gMiA/IG5ldyBOYXRpdmVEYXRlKFksIE0pIDpcbiAgICAgICAgICAgICAgICAgICAgICAgIGxlbmd0aCA+PSAxID8gbmV3IE5hdGl2ZURhdGUoWSBpbnN0YW5jZW9mIE5hdGl2ZURhdGUgPyArWSA6IFkpIDpcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbmV3IE5hdGl2ZURhdGUoKTtcbiAgICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICBkYXRlID0gTmF0aXZlRGF0ZS5hcHBseSh0aGlzLCBhcmd1bWVudHMpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBpZiAoIWlzUHJpbWl0aXZlKGRhdGUpKSB7XG4gICAgICAgICAgICAgICAgICAgIC8vIFByZXZlbnQgbWl4dXBzIHdpdGggdW5maXhlZCBEYXRlIG9iamVjdFxuICAgICAgICAgICAgICAgICAgICBkZWZpbmVQcm9wZXJ0aWVzKGRhdGUsIHsgY29uc3RydWN0b3I6IERhdGVTaGltIH0sIHRydWUpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICByZXR1cm4gZGF0ZTtcbiAgICAgICAgICAgIH07XG5cbiAgICAgICAgICAgIC8vIDE1LjkuMS4xNSBEYXRlIFRpbWUgU3RyaW5nIEZvcm1hdC5cbiAgICAgICAgICAgIHZhciBpc29EYXRlRXhwcmVzc2lvbiA9IG5ldyBSZWdFeHAoJ14nICtcbiAgICAgICAgICAgICAgICAnKFxcXFxkezR9fFsrLV1cXFxcZHs2fSknICsgLy8gZm91ci1kaWdpdCB5ZWFyIGNhcHR1cmUgb3Igc2lnbiArXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyA2LWRpZ2l0IGV4dGVuZGVkIHllYXJcbiAgICAgICAgICAgICAgICAnKD86LShcXFxcZHsyfSknICsgLy8gb3B0aW9uYWwgbW9udGggY2FwdHVyZVxuICAgICAgICAgICAgICAgICcoPzotKFxcXFxkezJ9KScgKyAvLyBvcHRpb25hbCBkYXkgY2FwdHVyZVxuICAgICAgICAgICAgICAgICcoPzonICsgLy8gY2FwdHVyZSBob3VyczptaW51dGVzOnNlY29uZHMubWlsbGlzZWNvbmRzXG4gICAgICAgICAgICAgICAgICAgICdUKFxcXFxkezJ9KScgKyAvLyBob3VycyBjYXB0dXJlXG4gICAgICAgICAgICAgICAgICAgICc6KFxcXFxkezJ9KScgKyAvLyBtaW51dGVzIGNhcHR1cmVcbiAgICAgICAgICAgICAgICAgICAgJyg/OicgKyAvLyBvcHRpb25hbCA6c2Vjb25kcy5taWxsaXNlY29uZHNcbiAgICAgICAgICAgICAgICAgICAgICAgICc6KFxcXFxkezJ9KScgKyAvLyBzZWNvbmRzIGNhcHR1cmVcbiAgICAgICAgICAgICAgICAgICAgICAgICcoPzooXFxcXC5cXFxcZHsxLH0pKT8nICsgLy8gbWlsbGlzZWNvbmRzIGNhcHR1cmVcbiAgICAgICAgICAgICAgICAgICAgJyk/JyArXG4gICAgICAgICAgICAgICAgJygnICsgLy8gY2FwdHVyZSBVVEMgb2Zmc2V0IGNvbXBvbmVudFxuICAgICAgICAgICAgICAgICAgICAnWnwnICsgLy8gVVRDIGNhcHR1cmVcbiAgICAgICAgICAgICAgICAgICAgJyg/OicgKyAvLyBvZmZzZXQgc3BlY2lmaWVyICsvLWhvdXJzOm1pbnV0ZXNcbiAgICAgICAgICAgICAgICAgICAgICAgICcoWy0rXSknICsgLy8gc2lnbiBjYXB0dXJlXG4gICAgICAgICAgICAgICAgICAgICAgICAnKFxcXFxkezJ9KScgKyAvLyBob3VycyBvZmZzZXQgY2FwdHVyZVxuICAgICAgICAgICAgICAgICAgICAgICAgJzooXFxcXGR7Mn0pJyArIC8vIG1pbnV0ZXMgb2Zmc2V0IGNhcHR1cmVcbiAgICAgICAgICAgICAgICAgICAgJyknICtcbiAgICAgICAgICAgICAgICAnKT8pPyk/KT8nICtcbiAgICAgICAgICAgICckJyk7XG5cbiAgICAgICAgICAgIHZhciBtb250aHMgPSBbMCwgMzEsIDU5LCA5MCwgMTIwLCAxNTEsIDE4MSwgMjEyLCAyNDMsIDI3MywgMzA0LCAzMzQsIDM2NV07XG5cbiAgICAgICAgICAgIHZhciBkYXlGcm9tTW9udGggPSBmdW5jdGlvbiBkYXlGcm9tTW9udGgoeWVhciwgbW9udGgpIHtcbiAgICAgICAgICAgICAgICB2YXIgdCA9IG1vbnRoID4gMSA/IDEgOiAwO1xuICAgICAgICAgICAgICAgIHJldHVybiAoXG4gICAgICAgICAgICAgICAgICAgIG1vbnRoc1ttb250aF0gK1xuICAgICAgICAgICAgICAgICAgICBNYXRoLmZsb29yKCh5ZWFyIC0gMTk2OSArIHQpIC8gNCkgLVxuICAgICAgICAgICAgICAgICAgICBNYXRoLmZsb29yKCh5ZWFyIC0gMTkwMSArIHQpIC8gMTAwKSArXG4gICAgICAgICAgICAgICAgICAgIE1hdGguZmxvb3IoKHllYXIgLSAxNjAxICsgdCkgLyA0MDApICtcbiAgICAgICAgICAgICAgICAgICAgMzY1ICogKHllYXIgLSAxOTcwKVxuICAgICAgICAgICAgICAgICk7XG4gICAgICAgICAgICB9O1xuXG4gICAgICAgICAgICB2YXIgdG9VVEMgPSBmdW5jdGlvbiB0b1VUQyh0KSB7XG4gICAgICAgICAgICAgICAgdmFyIHMgPSAwO1xuICAgICAgICAgICAgICAgIHZhciBtcyA9IHQ7XG4gICAgICAgICAgICAgICAgaWYgKGhhc1NhZmFyaVNpZ25lZEludEJ1ZyAmJiBtcyA+IG1heFNhZmVVbnNpZ25lZDMyQml0KSB7XG4gICAgICAgICAgICAgICAgICAgIC8vIHdvcmsgYXJvdW5kIGEgU2FmYXJpIDgvOSBidWcgd2hlcmUgaXQgdHJlYXRzIHRoZSBzZWNvbmRzIGFzIHNpZ25lZFxuICAgICAgICAgICAgICAgICAgICB2YXIgbXNUb1NoaWZ0ID0gTWF0aC5mbG9vcihtcyAvIG1heFNhZmVVbnNpZ25lZDMyQml0KSAqIG1heFNhZmVVbnNpZ25lZDMyQml0O1xuICAgICAgICAgICAgICAgICAgICB2YXIgc1RvU2hpZnQgPSBNYXRoLmZsb29yKG1zVG9TaGlmdCAvIDFlMyk7XG4gICAgICAgICAgICAgICAgICAgIHMgKz0gc1RvU2hpZnQ7XG4gICAgICAgICAgICAgICAgICAgIG1zIC09IHNUb1NoaWZ0ICogMWUzO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICByZXR1cm4gJE51bWJlcihuZXcgTmF0aXZlRGF0ZSgxOTcwLCAwLCAxLCAwLCAwLCBzLCBtcykpO1xuICAgICAgICAgICAgfTtcblxuICAgICAgICAgICAgLy8gQ29weSBhbnkgY3VzdG9tIG1ldGhvZHMgYSAzcmQgcGFydHkgbGlicmFyeSBtYXkgaGF2ZSBhZGRlZFxuICAgICAgICAgICAgZm9yICh2YXIga2V5IGluIE5hdGl2ZURhdGUpIHtcbiAgICAgICAgICAgICAgICBpZiAob3ducyhOYXRpdmVEYXRlLCBrZXkpKSB7XG4gICAgICAgICAgICAgICAgICAgIERhdGVTaGltW2tleV0gPSBOYXRpdmVEYXRlW2tleV07XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAvLyBDb3B5IFwibmF0aXZlXCIgbWV0aG9kcyBleHBsaWNpdGx5OyB0aGV5IG1heSBiZSBub24tZW51bWVyYWJsZVxuICAgICAgICAgICAgZGVmaW5lUHJvcGVydGllcyhEYXRlU2hpbSwge1xuICAgICAgICAgICAgICAgIG5vdzogTmF0aXZlRGF0ZS5ub3csXG4gICAgICAgICAgICAgICAgVVRDOiBOYXRpdmVEYXRlLlVUQ1xuICAgICAgICAgICAgfSwgdHJ1ZSk7XG4gICAgICAgICAgICBEYXRlU2hpbS5wcm90b3R5cGUgPSBOYXRpdmVEYXRlLnByb3RvdHlwZTtcbiAgICAgICAgICAgIGRlZmluZVByb3BlcnRpZXMoRGF0ZVNoaW0ucHJvdG90eXBlLCB7XG4gICAgICAgICAgICAgICAgY29uc3RydWN0b3I6IERhdGVTaGltXG4gICAgICAgICAgICB9LCB0cnVlKTtcblxuICAgICAgICAgICAgLy8gVXBncmFkZSBEYXRlLnBhcnNlIHRvIGhhbmRsZSBzaW1wbGlmaWVkIElTTyA4NjAxIHN0cmluZ3NcbiAgICAgICAgICAgIHZhciBwYXJzZVNoaW0gPSBmdW5jdGlvbiBwYXJzZShzdHJpbmcpIHtcbiAgICAgICAgICAgICAgICB2YXIgbWF0Y2ggPSBpc29EYXRlRXhwcmVzc2lvbi5leGVjKHN0cmluZyk7XG4gICAgICAgICAgICAgICAgaWYgKG1hdGNoKSB7XG4gICAgICAgICAgICAgICAgICAgIC8vIHBhcnNlIG1vbnRocywgZGF5cywgaG91cnMsIG1pbnV0ZXMsIHNlY29uZHMsIGFuZCBtaWxsaXNlY29uZHNcbiAgICAgICAgICAgICAgICAgICAgLy8gcHJvdmlkZSBkZWZhdWx0IHZhbHVlcyBpZiBuZWNlc3NhcnlcbiAgICAgICAgICAgICAgICAgICAgLy8gcGFyc2UgdGhlIFVUQyBvZmZzZXQgY29tcG9uZW50XG4gICAgICAgICAgICAgICAgICAgIHZhciB5ZWFyID0gJE51bWJlcihtYXRjaFsxXSksXG4gICAgICAgICAgICAgICAgICAgICAgICBtb250aCA9ICROdW1iZXIobWF0Y2hbMl0gfHwgMSkgLSAxLFxuICAgICAgICAgICAgICAgICAgICAgICAgZGF5ID0gJE51bWJlcihtYXRjaFszXSB8fCAxKSAtIDEsXG4gICAgICAgICAgICAgICAgICAgICAgICBob3VyID0gJE51bWJlcihtYXRjaFs0XSB8fCAwKSxcbiAgICAgICAgICAgICAgICAgICAgICAgIG1pbnV0ZSA9ICROdW1iZXIobWF0Y2hbNV0gfHwgMCksXG4gICAgICAgICAgICAgICAgICAgICAgICBzZWNvbmQgPSAkTnVtYmVyKG1hdGNoWzZdIHx8IDApLFxuICAgICAgICAgICAgICAgICAgICAgICAgbWlsbGlzZWNvbmQgPSBNYXRoLmZsb29yKCROdW1iZXIobWF0Y2hbN10gfHwgMCkgKiAxMDAwKSxcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIFdoZW4gdGltZSB6b25lIGlzIG1pc3NlZCwgbG9jYWwgb2Zmc2V0IHNob3VsZCBiZSB1c2VkXG4gICAgICAgICAgICAgICAgICAgICAgICAvLyAoRVMgNS4xIGJ1ZylcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIHNlZSBodHRwczovL2J1Z3MuZWNtYXNjcmlwdC5vcmcvc2hvd19idWcuY2dpP2lkPTExMlxuICAgICAgICAgICAgICAgICAgICAgICAgaXNMb2NhbFRpbWUgPSBCb29sZWFuKG1hdGNoWzRdICYmICFtYXRjaFs4XSksXG4gICAgICAgICAgICAgICAgICAgICAgICBzaWduT2Zmc2V0ID0gbWF0Y2hbOV0gPT09ICctJyA/IDEgOiAtMSxcbiAgICAgICAgICAgICAgICAgICAgICAgIGhvdXJPZmZzZXQgPSAkTnVtYmVyKG1hdGNoWzEwXSB8fCAwKSxcbiAgICAgICAgICAgICAgICAgICAgICAgIG1pbnV0ZU9mZnNldCA9ICROdW1iZXIobWF0Y2hbMTFdIHx8IDApLFxuICAgICAgICAgICAgICAgICAgICAgICAgcmVzdWx0O1xuICAgICAgICAgICAgICAgICAgICB2YXIgaGFzTWludXRlc09yU2Vjb25kc09yTWlsbGlzZWNvbmRzID0gbWludXRlID4gMCB8fCBzZWNvbmQgPiAwIHx8IG1pbGxpc2Vjb25kID4gMDtcbiAgICAgICAgICAgICAgICAgICAgaWYgKFxuICAgICAgICAgICAgICAgICAgICAgICAgaG91ciA8IChoYXNNaW51dGVzT3JTZWNvbmRzT3JNaWxsaXNlY29uZHMgPyAyNCA6IDI1KSAmJlxuICAgICAgICAgICAgICAgICAgICAgICAgbWludXRlIDwgNjAgJiYgc2Vjb25kIDwgNjAgJiYgbWlsbGlzZWNvbmQgPCAxMDAwICYmXG4gICAgICAgICAgICAgICAgICAgICAgICBtb250aCA+IC0xICYmIG1vbnRoIDwgMTIgJiYgaG91ck9mZnNldCA8IDI0ICYmXG4gICAgICAgICAgICAgICAgICAgICAgICBtaW51dGVPZmZzZXQgPCA2MCAmJiAvLyBkZXRlY3QgaW52YWxpZCBvZmZzZXRzXG4gICAgICAgICAgICAgICAgICAgICAgICBkYXkgPiAtMSAmJlxuICAgICAgICAgICAgICAgICAgICAgICAgZGF5IDwgKGRheUZyb21Nb250aCh5ZWFyLCBtb250aCArIDEpIC0gZGF5RnJvbU1vbnRoKHllYXIsIG1vbnRoKSlcbiAgICAgICAgICAgICAgICAgICAgKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICByZXN1bHQgPSAoXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgKGRheUZyb21Nb250aCh5ZWFyLCBtb250aCkgKyBkYXkpICogMjQgK1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGhvdXIgK1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGhvdXJPZmZzZXQgKiBzaWduT2Zmc2V0XG4gICAgICAgICAgICAgICAgICAgICAgICApICogNjA7XG4gICAgICAgICAgICAgICAgICAgICAgICByZXN1bHQgPSAoXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgKHJlc3VsdCArIG1pbnV0ZSArIG1pbnV0ZU9mZnNldCAqIHNpZ25PZmZzZXQpICogNjAgK1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNlY29uZFxuICAgICAgICAgICAgICAgICAgICAgICAgKSAqIDEwMDAgKyBtaWxsaXNlY29uZDtcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChpc0xvY2FsVGltZSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlc3VsdCA9IHRvVVRDKHJlc3VsdCk7XG4gICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAoLTguNjRlMTUgPD0gcmVzdWx0ICYmIHJlc3VsdCA8PSA4LjY0ZTE1KSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHJlc3VsdDtcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICByZXR1cm4gTmFOO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICByZXR1cm4gTmF0aXZlRGF0ZS5wYXJzZS5hcHBseSh0aGlzLCBhcmd1bWVudHMpO1xuICAgICAgICAgICAgfTtcbiAgICAgICAgICAgIGRlZmluZVByb3BlcnRpZXMoRGF0ZVNoaW0sIHsgcGFyc2U6IHBhcnNlU2hpbSB9KTtcblxuICAgICAgICAgICAgcmV0dXJuIERhdGVTaGltO1xuICAgICAgICB9KERhdGUpKTtcbiAgICAgICAgLyogZ2xvYmFsIERhdGU6IGZhbHNlICovXG4gICAgfVxuXG4gICAgLy8gRVM1IDE1LjkuNC40XG4gICAgLy8gaHR0cDovL2VzNS5naXRodWIuY29tLyN4MTUuOS40LjRcbiAgICBpZiAoIURhdGUubm93KSB7XG4gICAgICAgIERhdGUubm93ID0gZnVuY3Rpb24gbm93KCkge1xuICAgICAgICAgICAgcmV0dXJuIG5ldyBEYXRlKCkuZ2V0VGltZSgpO1xuICAgICAgICB9O1xuICAgIH1cblxuICAgIC8vXG4gICAgLy8gTnVtYmVyXG4gICAgLy8gPT09PT09XG4gICAgLy9cblxuICAgIC8vIEVTNS4xIDE1LjcuNC41XG4gICAgLy8gaHR0cDovL2VzNS5naXRodWIuY29tLyN4MTUuNy40LjVcbiAgICB2YXIgaGFzVG9GaXhlZEJ1Z3MgPSBOdW1iZXJQcm90b3R5cGUudG9GaXhlZCAmJiAoXG4gICAgICAoMC4wMDAwOCkudG9GaXhlZCgzKSAhPT0gJzAuMDAwJyB8fFxuICAgICAgKDAuOSkudG9GaXhlZCgwKSAhPT0gJzEnIHx8XG4gICAgICAoMS4yNTUpLnRvRml4ZWQoMikgIT09ICcxLjI1JyB8fFxuICAgICAgKDEwMDAwMDAwMDAwMDAwMDAxMjgpLnRvRml4ZWQoMCkgIT09ICcxMDAwMDAwMDAwMDAwMDAwMTI4J1xuICAgICk7XG5cbiAgICB2YXIgdG9GaXhlZEhlbHBlcnMgPSB7XG4gICAgICAgIGJhc2U6IDFlNyxcbiAgICAgICAgc2l6ZTogNixcbiAgICAgICAgZGF0YTogWzAsIDAsIDAsIDAsIDAsIDBdLFxuICAgICAgICBtdWx0aXBseTogZnVuY3Rpb24gbXVsdGlwbHkobiwgYykge1xuICAgICAgICAgICAgdmFyIGkgPSAtMTtcbiAgICAgICAgICAgIHZhciBjMiA9IGM7XG4gICAgICAgICAgICB3aGlsZSAoKytpIDwgdG9GaXhlZEhlbHBlcnMuc2l6ZSkge1xuICAgICAgICAgICAgICAgIGMyICs9IG4gKiB0b0ZpeGVkSGVscGVycy5kYXRhW2ldO1xuICAgICAgICAgICAgICAgIHRvRml4ZWRIZWxwZXJzLmRhdGFbaV0gPSBjMiAlIHRvRml4ZWRIZWxwZXJzLmJhc2U7XG4gICAgICAgICAgICAgICAgYzIgPSBNYXRoLmZsb29yKGMyIC8gdG9GaXhlZEhlbHBlcnMuYmFzZSk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH0sXG4gICAgICAgIGRpdmlkZTogZnVuY3Rpb24gZGl2aWRlKG4pIHtcbiAgICAgICAgICAgIHZhciBpID0gdG9GaXhlZEhlbHBlcnMuc2l6ZTtcbiAgICAgICAgICAgIHZhciBjID0gMDtcbiAgICAgICAgICAgIHdoaWxlICgtLWkgPj0gMCkge1xuICAgICAgICAgICAgICAgIGMgKz0gdG9GaXhlZEhlbHBlcnMuZGF0YVtpXTtcbiAgICAgICAgICAgICAgICB0b0ZpeGVkSGVscGVycy5kYXRhW2ldID0gTWF0aC5mbG9vcihjIC8gbik7XG4gICAgICAgICAgICAgICAgYyA9IChjICUgbikgKiB0b0ZpeGVkSGVscGVycy5iYXNlO1xuICAgICAgICAgICAgfVxuICAgICAgICB9LFxuICAgICAgICBudW1Ub1N0cmluZzogZnVuY3Rpb24gbnVtVG9TdHJpbmcoKSB7XG4gICAgICAgICAgICB2YXIgaSA9IHRvRml4ZWRIZWxwZXJzLnNpemU7XG4gICAgICAgICAgICB2YXIgcyA9ICcnO1xuICAgICAgICAgICAgd2hpbGUgKC0taSA+PSAwKSB7XG4gICAgICAgICAgICAgICAgaWYgKHMgIT09ICcnIHx8IGkgPT09IDAgfHwgdG9GaXhlZEhlbHBlcnMuZGF0YVtpXSAhPT0gMCkge1xuICAgICAgICAgICAgICAgICAgICB2YXIgdCA9ICRTdHJpbmcodG9GaXhlZEhlbHBlcnMuZGF0YVtpXSk7XG4gICAgICAgICAgICAgICAgICAgIGlmIChzID09PSAnJykge1xuICAgICAgICAgICAgICAgICAgICAgICAgcyA9IHQ7XG4gICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBzICs9IHN0clNsaWNlKCcwMDAwMDAwJywgMCwgNyAtIHQubGVuZ3RoKSArIHQ7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICByZXR1cm4gcztcbiAgICAgICAgfSxcbiAgICAgICAgcG93OiBmdW5jdGlvbiBwb3coeCwgbiwgYWNjKSB7XG4gICAgICAgICAgICByZXR1cm4gKG4gPT09IDAgPyBhY2MgOiAobiAlIDIgPT09IDEgPyBwb3coeCwgbiAtIDEsIGFjYyAqIHgpIDogcG93KHggKiB4LCBuIC8gMiwgYWNjKSkpO1xuICAgICAgICB9LFxuICAgICAgICBsb2c6IGZ1bmN0aW9uIGxvZyh4KSB7XG4gICAgICAgICAgICB2YXIgbiA9IDA7XG4gICAgICAgICAgICB2YXIgeDIgPSB4O1xuICAgICAgICAgICAgd2hpbGUgKHgyID49IDQwOTYpIHtcbiAgICAgICAgICAgICAgICBuICs9IDEyO1xuICAgICAgICAgICAgICAgIHgyIC89IDQwOTY7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICB3aGlsZSAoeDIgPj0gMikge1xuICAgICAgICAgICAgICAgIG4gKz0gMTtcbiAgICAgICAgICAgICAgICB4MiAvPSAyO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgcmV0dXJuIG47XG4gICAgICAgIH1cbiAgICB9O1xuXG4gICAgdmFyIHRvRml4ZWRTaGltID0gZnVuY3Rpb24gdG9GaXhlZChmcmFjdGlvbkRpZ2l0cykge1xuICAgICAgICB2YXIgZiwgeCwgcywgbSwgZSwgeiwgaiwgaztcblxuICAgICAgICAvLyBUZXN0IGZvciBOYU4gYW5kIHJvdW5kIGZyYWN0aW9uRGlnaXRzIGRvd25cbiAgICAgICAgZiA9ICROdW1iZXIoZnJhY3Rpb25EaWdpdHMpO1xuICAgICAgICBmID0gaXNBY3R1YWxOYU4oZikgPyAwIDogTWF0aC5mbG9vcihmKTtcblxuICAgICAgICBpZiAoZiA8IDAgfHwgZiA+IDIwKSB7XG4gICAgICAgICAgICB0aHJvdyBuZXcgUmFuZ2VFcnJvcignTnVtYmVyLnRvRml4ZWQgY2FsbGVkIHdpdGggaW52YWxpZCBudW1iZXIgb2YgZGVjaW1hbHMnKTtcbiAgICAgICAgfVxuXG4gICAgICAgIHggPSAkTnVtYmVyKHRoaXMpO1xuXG4gICAgICAgIGlmIChpc0FjdHVhbE5hTih4KSkge1xuICAgICAgICAgICAgcmV0dXJuICdOYU4nO1xuICAgICAgICB9XG5cbiAgICAgICAgLy8gSWYgaXQgaXMgdG9vIGJpZyBvciBzbWFsbCwgcmV0dXJuIHRoZSBzdHJpbmcgdmFsdWUgb2YgdGhlIG51bWJlclxuICAgICAgICBpZiAoeCA8PSAtMWUyMSB8fCB4ID49IDFlMjEpIHtcbiAgICAgICAgICAgIHJldHVybiAkU3RyaW5nKHgpO1xuICAgICAgICB9XG5cbiAgICAgICAgcyA9ICcnO1xuXG4gICAgICAgIGlmICh4IDwgMCkge1xuICAgICAgICAgICAgcyA9ICctJztcbiAgICAgICAgICAgIHggPSAteDtcbiAgICAgICAgfVxuXG4gICAgICAgIG0gPSAnMCc7XG5cbiAgICAgICAgaWYgKHggPiAxZS0yMSkge1xuICAgICAgICAgICAgLy8gMWUtMjEgPCB4IDwgMWUyMVxuICAgICAgICAgICAgLy8gLTcwIDwgbG9nMih4KSA8IDcwXG4gICAgICAgICAgICBlID0gdG9GaXhlZEhlbHBlcnMubG9nKHggKiB0b0ZpeGVkSGVscGVycy5wb3coMiwgNjksIDEpKSAtIDY5O1xuICAgICAgICAgICAgeiA9IChlIDwgMCA/IHggKiB0b0ZpeGVkSGVscGVycy5wb3coMiwgLWUsIDEpIDogeCAvIHRvRml4ZWRIZWxwZXJzLnBvdygyLCBlLCAxKSk7XG4gICAgICAgICAgICB6ICo9IDB4MTAwMDAwMDAwMDAwMDA7IC8vIE1hdGgucG93KDIsIDUyKTtcbiAgICAgICAgICAgIGUgPSA1MiAtIGU7XG5cbiAgICAgICAgICAgIC8vIC0xOCA8IGUgPCAxMjJcbiAgICAgICAgICAgIC8vIHggPSB6IC8gMiBeIGVcbiAgICAgICAgICAgIGlmIChlID4gMCkge1xuICAgICAgICAgICAgICAgIHRvRml4ZWRIZWxwZXJzLm11bHRpcGx5KDAsIHopO1xuICAgICAgICAgICAgICAgIGogPSBmO1xuXG4gICAgICAgICAgICAgICAgd2hpbGUgKGogPj0gNykge1xuICAgICAgICAgICAgICAgICAgICB0b0ZpeGVkSGVscGVycy5tdWx0aXBseSgxZTcsIDApO1xuICAgICAgICAgICAgICAgICAgICBqIC09IDc7XG4gICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgdG9GaXhlZEhlbHBlcnMubXVsdGlwbHkodG9GaXhlZEhlbHBlcnMucG93KDEwLCBqLCAxKSwgMCk7XG4gICAgICAgICAgICAgICAgaiA9IGUgLSAxO1xuXG4gICAgICAgICAgICAgICAgd2hpbGUgKGogPj0gMjMpIHtcbiAgICAgICAgICAgICAgICAgICAgdG9GaXhlZEhlbHBlcnMuZGl2aWRlKDEgPDwgMjMpO1xuICAgICAgICAgICAgICAgICAgICBqIC09IDIzO1xuICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAgIHRvRml4ZWRIZWxwZXJzLmRpdmlkZSgxIDw8IGopO1xuICAgICAgICAgICAgICAgIHRvRml4ZWRIZWxwZXJzLm11bHRpcGx5KDEsIDEpO1xuICAgICAgICAgICAgICAgIHRvRml4ZWRIZWxwZXJzLmRpdmlkZSgyKTtcbiAgICAgICAgICAgICAgICBtID0gdG9GaXhlZEhlbHBlcnMubnVtVG9TdHJpbmcoKTtcbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgdG9GaXhlZEhlbHBlcnMubXVsdGlwbHkoMCwgeik7XG4gICAgICAgICAgICAgICAgdG9GaXhlZEhlbHBlcnMubXVsdGlwbHkoMSA8PCAoLWUpLCAwKTtcbiAgICAgICAgICAgICAgICBtID0gdG9GaXhlZEhlbHBlcnMubnVtVG9TdHJpbmcoKSArIHN0clNsaWNlKCcwLjAwMDAwMDAwMDAwMDAwMDAwMDAwJywgMiwgMiArIGYpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG5cbiAgICAgICAgaWYgKGYgPiAwKSB7XG4gICAgICAgICAgICBrID0gbS5sZW5ndGg7XG5cbiAgICAgICAgICAgIGlmIChrIDw9IGYpIHtcbiAgICAgICAgICAgICAgICBtID0gcyArIHN0clNsaWNlKCcwLjAwMDAwMDAwMDAwMDAwMDAwMDAnLCAwLCBmIC0gayArIDIpICsgbTtcbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgbSA9IHMgKyBzdHJTbGljZShtLCAwLCBrIC0gZikgKyAnLicgKyBzdHJTbGljZShtLCBrIC0gZik7XG4gICAgICAgICAgICB9XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICBtID0gcyArIG07XG4gICAgICAgIH1cblxuICAgICAgICByZXR1cm4gbTtcbiAgICB9O1xuICAgIGRlZmluZVByb3BlcnRpZXMoTnVtYmVyUHJvdG90eXBlLCB7IHRvRml4ZWQ6IHRvRml4ZWRTaGltIH0sIGhhc1RvRml4ZWRCdWdzKTtcblxuICAgIHZhciBoYXNUb1ByZWNpc2lvblVuZGVmaW5lZEJ1ZyA9IChmdW5jdGlvbiAoKSB7XG4gICAgICAgIHRyeSB7XG4gICAgICAgICAgICByZXR1cm4gMS4wLnRvUHJlY2lzaW9uKHVuZGVmaW5lZCkgPT09ICcxJztcbiAgICAgICAgfSBjYXRjaCAoZSkge1xuICAgICAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgICAgIH1cbiAgICB9KCkpO1xuICAgIHZhciBvcmlnaW5hbFRvUHJlY2lzaW9uID0gTnVtYmVyUHJvdG90eXBlLnRvUHJlY2lzaW9uO1xuICAgIGRlZmluZVByb3BlcnRpZXMoTnVtYmVyUHJvdG90eXBlLCB7XG4gICAgICAgIHRvUHJlY2lzaW9uOiBmdW5jdGlvbiB0b1ByZWNpc2lvbihwcmVjaXNpb24pIHtcbiAgICAgICAgICAgIHJldHVybiB0eXBlb2YgcHJlY2lzaW9uID09PSAndW5kZWZpbmVkJyA/IG9yaWdpbmFsVG9QcmVjaXNpb24uY2FsbCh0aGlzKSA6IG9yaWdpbmFsVG9QcmVjaXNpb24uY2FsbCh0aGlzLCBwcmVjaXNpb24pO1xuICAgICAgICB9XG4gICAgfSwgaGFzVG9QcmVjaXNpb25VbmRlZmluZWRCdWcpO1xuXG4gICAgLy9cbiAgICAvLyBTdHJpbmdcbiAgICAvLyA9PT09PT1cbiAgICAvL1xuXG4gICAgLy8gRVM1IDE1LjUuNC4xNFxuICAgIC8vIGh0dHA6Ly9lczUuZ2l0aHViLmNvbS8jeDE1LjUuNC4xNFxuXG4gICAgLy8gW2J1Z2ZpeCwgSUUgbHQgOSwgZmlyZWZveCA0LCBLb25xdWVyb3IsIE9wZXJhLCBvYnNjdXJlIGJyb3dzZXJzXVxuICAgIC8vIE1hbnkgYnJvd3NlcnMgZG8gbm90IHNwbGl0IHByb3Blcmx5IHdpdGggcmVndWxhciBleHByZXNzaW9ucyBvciB0aGV5XG4gICAgLy8gZG8gbm90IHBlcmZvcm0gdGhlIHNwbGl0IGNvcnJlY3RseSB1bmRlciBvYnNjdXJlIGNvbmRpdGlvbnMuXG4gICAgLy8gU2VlIGh0dHA6Ly9ibG9nLnN0ZXZlbmxldml0aGFuLmNvbS9hcmNoaXZlcy9jcm9zcy1icm93c2VyLXNwbGl0XG4gICAgLy8gSSd2ZSB0ZXN0ZWQgaW4gbWFueSBicm93c2VycyBhbmQgdGhpcyBzZWVtcyB0byBjb3ZlciB0aGUgZGV2aWFudCBvbmVzOlxuICAgIC8vICAgICdhYicuc3BsaXQoLyg/OmFiKSovKSBzaG91bGQgYmUgW1wiXCIsIFwiXCJdLCBub3QgW1wiXCJdXG4gICAgLy8gICAgJy4nLnNwbGl0KC8oLj8pKC4/KS8pIHNob3VsZCBiZSBbXCJcIiwgXCIuXCIsIFwiXCIsIFwiXCJdLCBub3QgW1wiXCIsIFwiXCJdXG4gICAgLy8gICAgJ3Rlc3N0Jy5zcGxpdCgvKHMpKi8pIHNob3VsZCBiZSBbXCJ0XCIsIHVuZGVmaW5lZCwgXCJlXCIsIFwic1wiLCBcInRcIl0sIG5vdFxuICAgIC8vICAgICAgIFt1bmRlZmluZWQsIFwidFwiLCB1bmRlZmluZWQsIFwiZVwiLCAuLi5dXG4gICAgLy8gICAgJycuc3BsaXQoLy4/Lykgc2hvdWxkIGJlIFtdLCBub3QgW1wiXCJdXG4gICAgLy8gICAgJy4nLnNwbGl0KC8oKSgpLykgc2hvdWxkIGJlIFtcIi5cIl0sIG5vdCBbXCJcIiwgXCJcIiwgXCIuXCJdXG5cbiAgICBpZiAoXG4gICAgICAgICdhYicuc3BsaXQoLyg/OmFiKSovKS5sZW5ndGggIT09IDIgfHxcbiAgICAgICAgJy4nLnNwbGl0KC8oLj8pKC4/KS8pLmxlbmd0aCAhPT0gNCB8fFxuICAgICAgICAndGVzc3QnLnNwbGl0KC8ocykqLylbMV0gPT09ICd0JyB8fFxuICAgICAgICAndGVzdCcuc3BsaXQoLyg/OikvLCAtMSkubGVuZ3RoICE9PSA0IHx8XG4gICAgICAgICcnLnNwbGl0KC8uPy8pLmxlbmd0aCB8fFxuICAgICAgICAnLicuc3BsaXQoLygpKCkvKS5sZW5ndGggPiAxXG4gICAgKSB7XG4gICAgICAgIChmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgICB2YXIgY29tcGxpYW50RXhlY05wY2cgPSB0eXBlb2YgKC8oKT8/LykuZXhlYygnJylbMV0gPT09ICd1bmRlZmluZWQnOyAvLyBOUENHOiBub25wYXJ0aWNpcGF0aW5nIGNhcHR1cmluZyBncm91cFxuICAgICAgICAgICAgdmFyIG1heFNhZmUzMkJpdEludCA9IE1hdGgucG93KDIsIDMyKSAtIDE7XG5cbiAgICAgICAgICAgIFN0cmluZ1Byb3RvdHlwZS5zcGxpdCA9IGZ1bmN0aW9uIChzZXBhcmF0b3IsIGxpbWl0KSB7XG4gICAgICAgICAgICAgICAgdmFyIHN0cmluZyA9IFN0cmluZyh0aGlzKTtcbiAgICAgICAgICAgICAgICBpZiAodHlwZW9mIHNlcGFyYXRvciA9PT0gJ3VuZGVmaW5lZCcgJiYgbGltaXQgPT09IDApIHtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIFtdO1xuICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAgIC8vIElmIGBzZXBhcmF0b3JgIGlzIG5vdCBhIHJlZ2V4LCB1c2UgbmF0aXZlIHNwbGl0XG4gICAgICAgICAgICAgICAgaWYgKCFpc1JlZ2V4KHNlcGFyYXRvcikpIHtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHN0clNwbGl0KHRoaXMsIHNlcGFyYXRvciwgbGltaXQpO1xuICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAgIHZhciBvdXRwdXQgPSBbXTtcbiAgICAgICAgICAgICAgICB2YXIgZmxhZ3MgPSAoc2VwYXJhdG9yLmlnbm9yZUNhc2UgPyAnaScgOiAnJykgK1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIChzZXBhcmF0b3IubXVsdGlsaW5lID8gJ20nIDogJycpICtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAoc2VwYXJhdG9yLnVuaWNvZGUgPyAndScgOiAnJykgKyAvLyBpbiBFUzZcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAoc2VwYXJhdG9yLnN0aWNreSA/ICd5JyA6ICcnKSwgLy8gRmlyZWZveCAzKyBhbmQgRVM2XG4gICAgICAgICAgICAgICAgICAgIGxhc3RMYXN0SW5kZXggPSAwLFxuICAgICAgICAgICAgICAgICAgICAvLyBNYWtlIGBnbG9iYWxgIGFuZCBhdm9pZCBgbGFzdEluZGV4YCBpc3N1ZXMgYnkgd29ya2luZyB3aXRoIGEgY29weVxuICAgICAgICAgICAgICAgICAgICBzZXBhcmF0b3IyLCBtYXRjaCwgbGFzdEluZGV4LCBsYXN0TGVuZ3RoO1xuICAgICAgICAgICAgICAgIHZhciBzZXBhcmF0b3JDb3B5ID0gbmV3IFJlZ0V4cChzZXBhcmF0b3Iuc291cmNlLCBmbGFncyArICdnJyk7XG4gICAgICAgICAgICAgICAgaWYgKCFjb21wbGlhbnRFeGVjTnBjZykge1xuICAgICAgICAgICAgICAgICAgICAvLyBEb2Vzbid0IG5lZWQgZmxhZ3MgZ3ksIGJ1dCB0aGV5IGRvbid0IGh1cnRcbiAgICAgICAgICAgICAgICAgICAgc2VwYXJhdG9yMiA9IG5ldyBSZWdFeHAoJ14nICsgc2VwYXJhdG9yQ29weS5zb3VyY2UgKyAnJCg/IVxcXFxzKScsIGZsYWdzKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgLyogVmFsdWVzIGZvciBgbGltaXRgLCBwZXIgdGhlIHNwZWM6XG4gICAgICAgICAgICAgICAgICogSWYgdW5kZWZpbmVkOiA0Mjk0OTY3Mjk1IC8vIG1heFNhZmUzMkJpdEludFxuICAgICAgICAgICAgICAgICAqIElmIDAsIEluZmluaXR5LCBvciBOYU46IDBcbiAgICAgICAgICAgICAgICAgKiBJZiBwb3NpdGl2ZSBudW1iZXI6IGxpbWl0ID0gTWF0aC5mbG9vcihsaW1pdCk7IGlmIChsaW1pdCA+IDQyOTQ5NjcyOTUpIGxpbWl0IC09IDQyOTQ5NjcyOTY7XG4gICAgICAgICAgICAgICAgICogSWYgbmVnYXRpdmUgbnVtYmVyOiA0Mjk0OTY3Mjk2IC0gTWF0aC5mbG9vcihNYXRoLmFicyhsaW1pdCkpXG4gICAgICAgICAgICAgICAgICogSWYgb3RoZXI6IFR5cGUtY29udmVydCwgdGhlbiB1c2UgdGhlIGFib3ZlIHJ1bGVzXG4gICAgICAgICAgICAgICAgICovXG4gICAgICAgICAgICAgICAgdmFyIHNwbGl0TGltaXQgPSB0eXBlb2YgbGltaXQgPT09ICd1bmRlZmluZWQnID8gbWF4U2FmZTMyQml0SW50IDogRVMuVG9VaW50MzIobGltaXQpO1xuICAgICAgICAgICAgICAgIG1hdGNoID0gc2VwYXJhdG9yQ29weS5leGVjKHN0cmluZyk7XG4gICAgICAgICAgICAgICAgd2hpbGUgKG1hdGNoKSB7XG4gICAgICAgICAgICAgICAgICAgIC8vIGBzZXBhcmF0b3JDb3B5Lmxhc3RJbmRleGAgaXMgbm90IHJlbGlhYmxlIGNyb3NzLWJyb3dzZXJcbiAgICAgICAgICAgICAgICAgICAgbGFzdEluZGV4ID0gbWF0Y2guaW5kZXggKyBtYXRjaFswXS5sZW5ndGg7XG4gICAgICAgICAgICAgICAgICAgIGlmIChsYXN0SW5kZXggPiBsYXN0TGFzdEluZGV4KSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBwdXNoQ2FsbChvdXRwdXQsIHN0clNsaWNlKHN0cmluZywgbGFzdExhc3RJbmRleCwgbWF0Y2guaW5kZXgpKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIEZpeCBicm93c2VycyB3aG9zZSBgZXhlY2AgbWV0aG9kcyBkb24ndCBjb25zaXN0ZW50bHkgcmV0dXJuIGB1bmRlZmluZWRgIGZvclxuICAgICAgICAgICAgICAgICAgICAgICAgLy8gbm9ucGFydGljaXBhdGluZyBjYXB0dXJpbmcgZ3JvdXBzXG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAoIWNvbXBsaWFudEV4ZWNOcGNnICYmIG1hdGNoLmxlbmd0aCA+IDEpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBlc2xpbnQtZGlzYWJsZSBuby1sb29wLWZ1bmMgKi9cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBtYXRjaFswXS5yZXBsYWNlKHNlcGFyYXRvcjIsIGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZm9yICh2YXIgaSA9IDE7IGkgPCBhcmd1bWVudHMubGVuZ3RoIC0gMjsgaSsrKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAodHlwZW9mIGFyZ3VtZW50c1tpXSA9PT0gJ3VuZGVmaW5lZCcpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtYXRjaFtpXSA9IHZvaWQgMDtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIGVzbGludC1lbmFibGUgbm8tbG9vcC1mdW5jICovXG4gICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAobWF0Y2gubGVuZ3RoID4gMSAmJiBtYXRjaC5pbmRleCA8IHN0cmluZy5sZW5ndGgpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBhcnJheV9wdXNoLmFwcGx5KG91dHB1dCwgYXJyYXlTbGljZShtYXRjaCwgMSkpO1xuICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgbGFzdExlbmd0aCA9IG1hdGNoWzBdLmxlbmd0aDtcbiAgICAgICAgICAgICAgICAgICAgICAgIGxhc3RMYXN0SW5kZXggPSBsYXN0SW5kZXg7XG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAob3V0cHV0Lmxlbmd0aCA+PSBzcGxpdExpbWl0KSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgaWYgKHNlcGFyYXRvckNvcHkubGFzdEluZGV4ID09PSBtYXRjaC5pbmRleCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgc2VwYXJhdG9yQ29weS5sYXN0SW5kZXgrKzsgLy8gQXZvaWQgYW4gaW5maW5pdGUgbG9vcFxuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIG1hdGNoID0gc2VwYXJhdG9yQ29weS5leGVjKHN0cmluZyk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGlmIChsYXN0TGFzdEluZGV4ID09PSBzdHJpbmcubGVuZ3RoKSB7XG4gICAgICAgICAgICAgICAgICAgIGlmIChsYXN0TGVuZ3RoIHx8ICFzZXBhcmF0b3JDb3B5LnRlc3QoJycpKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBwdXNoQ2FsbChvdXRwdXQsICcnKTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgIHB1c2hDYWxsKG91dHB1dCwgc3RyU2xpY2Uoc3RyaW5nLCBsYXN0TGFzdEluZGV4KSk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIHJldHVybiBvdXRwdXQubGVuZ3RoID4gc3BsaXRMaW1pdCA/IGFycmF5U2xpY2Uob3V0cHV0LCAwLCBzcGxpdExpbWl0KSA6IG91dHB1dDtcbiAgICAgICAgICAgIH07XG4gICAgICAgIH0oKSk7XG5cbiAgICAvLyBbYnVnZml4LCBjaHJvbWVdXG4gICAgLy8gSWYgc2VwYXJhdG9yIGlzIHVuZGVmaW5lZCwgdGhlbiB0aGUgcmVzdWx0IGFycmF5IGNvbnRhaW5zIGp1c3Qgb25lIFN0cmluZyxcbiAgICAvLyB3aGljaCBpcyB0aGUgdGhpcyB2YWx1ZSAoY29udmVydGVkIHRvIGEgU3RyaW5nKS4gSWYgbGltaXQgaXMgbm90IHVuZGVmaW5lZCxcbiAgICAvLyB0aGVuIHRoZSBvdXRwdXQgYXJyYXkgaXMgdHJ1bmNhdGVkIHNvIHRoYXQgaXQgY29udGFpbnMgbm8gbW9yZSB0aGFuIGxpbWl0XG4gICAgLy8gZWxlbWVudHMuXG4gICAgLy8gXCIwXCIuc3BsaXQodW5kZWZpbmVkLCAwKSAtPiBbXVxuICAgIH0gZWxzZSBpZiAoJzAnLnNwbGl0KHZvaWQgMCwgMCkubGVuZ3RoKSB7XG4gICAgICAgIFN0cmluZ1Byb3RvdHlwZS5zcGxpdCA9IGZ1bmN0aW9uIHNwbGl0KHNlcGFyYXRvciwgbGltaXQpIHtcbiAgICAgICAgICAgIGlmICh0eXBlb2Ygc2VwYXJhdG9yID09PSAndW5kZWZpbmVkJyAmJiBsaW1pdCA9PT0gMCkge1xuICAgICAgICAgICAgICAgIHJldHVybiBbXTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHJldHVybiBzdHJTcGxpdCh0aGlzLCBzZXBhcmF0b3IsIGxpbWl0KTtcbiAgICAgICAgfTtcbiAgICB9XG5cbiAgICB2YXIgc3RyX3JlcGxhY2UgPSBTdHJpbmdQcm90b3R5cGUucmVwbGFjZTtcbiAgICB2YXIgcmVwbGFjZVJlcG9ydHNHcm91cHNDb3JyZWN0bHkgPSAoZnVuY3Rpb24gKCkge1xuICAgICAgICB2YXIgZ3JvdXBzID0gW107XG4gICAgICAgICd4Jy5yZXBsYWNlKC94KC4pPy9nLCBmdW5jdGlvbiAobWF0Y2gsIGdyb3VwKSB7XG4gICAgICAgICAgICBwdXNoQ2FsbChncm91cHMsIGdyb3VwKTtcbiAgICAgICAgfSk7XG4gICAgICAgIHJldHVybiBncm91cHMubGVuZ3RoID09PSAxICYmIHR5cGVvZiBncm91cHNbMF0gPT09ICd1bmRlZmluZWQnO1xuICAgIH0oKSk7XG5cbiAgICBpZiAoIXJlcGxhY2VSZXBvcnRzR3JvdXBzQ29ycmVjdGx5KSB7XG4gICAgICAgIFN0cmluZ1Byb3RvdHlwZS5yZXBsYWNlID0gZnVuY3Rpb24gcmVwbGFjZShzZWFyY2hWYWx1ZSwgcmVwbGFjZVZhbHVlKSB7XG4gICAgICAgICAgICB2YXIgaXNGbiA9IGlzQ2FsbGFibGUocmVwbGFjZVZhbHVlKTtcbiAgICAgICAgICAgIHZhciBoYXNDYXB0dXJpbmdHcm91cHMgPSBpc1JlZ2V4KHNlYXJjaFZhbHVlKSAmJiAoL1xcKVsqP10vKS50ZXN0KHNlYXJjaFZhbHVlLnNvdXJjZSk7XG4gICAgICAgICAgICBpZiAoIWlzRm4gfHwgIWhhc0NhcHR1cmluZ0dyb3Vwcykge1xuICAgICAgICAgICAgICAgIHJldHVybiBzdHJfcmVwbGFjZS5jYWxsKHRoaXMsIHNlYXJjaFZhbHVlLCByZXBsYWNlVmFsdWUpO1xuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICB2YXIgd3JhcHBlZFJlcGxhY2VWYWx1ZSA9IGZ1bmN0aW9uIChtYXRjaCkge1xuICAgICAgICAgICAgICAgICAgICB2YXIgbGVuZ3RoID0gYXJndW1lbnRzLmxlbmd0aDtcbiAgICAgICAgICAgICAgICAgICAgdmFyIG9yaWdpbmFsTGFzdEluZGV4ID0gc2VhcmNoVmFsdWUubGFzdEluZGV4O1xuICAgICAgICAgICAgICAgICAgICBzZWFyY2hWYWx1ZS5sYXN0SW5kZXggPSAwO1xuICAgICAgICAgICAgICAgICAgICB2YXIgYXJncyA9IHNlYXJjaFZhbHVlLmV4ZWMobWF0Y2gpIHx8IFtdO1xuICAgICAgICAgICAgICAgICAgICBzZWFyY2hWYWx1ZS5sYXN0SW5kZXggPSBvcmlnaW5hbExhc3RJbmRleDtcbiAgICAgICAgICAgICAgICAgICAgcHVzaENhbGwoYXJncywgYXJndW1lbnRzW2xlbmd0aCAtIDJdLCBhcmd1bWVudHNbbGVuZ3RoIC0gMV0pO1xuICAgICAgICAgICAgICAgICAgICByZXR1cm4gcmVwbGFjZVZhbHVlLmFwcGx5KHRoaXMsIGFyZ3MpO1xuICAgICAgICAgICAgICAgIH07XG4gICAgICAgICAgICAgICAgcmV0dXJuIHN0cl9yZXBsYWNlLmNhbGwodGhpcywgc2VhcmNoVmFsdWUsIHdyYXBwZWRSZXBsYWNlVmFsdWUpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9O1xuICAgIH1cblxuICAgIC8vIEVDTUEtMjYyLCAzcmQgQi4yLjNcbiAgICAvLyBOb3QgYW4gRUNNQVNjcmlwdCBzdGFuZGFyZCwgYWx0aG91Z2ggRUNNQVNjcmlwdCAzcmQgRWRpdGlvbiBoYXMgYVxuICAgIC8vIG5vbi1ub3JtYXRpdmUgc2VjdGlvbiBzdWdnZXN0aW5nIHVuaWZvcm0gc2VtYW50aWNzIGFuZCBpdCBzaG91bGQgYmVcbiAgICAvLyBub3JtYWxpemVkIGFjcm9zcyBhbGwgYnJvd3NlcnNcbiAgICAvLyBbYnVnZml4LCBJRSBsdCA5XSBJRSA8IDkgc3Vic3RyKCkgd2l0aCBuZWdhdGl2ZSB2YWx1ZSBub3Qgd29ya2luZyBpbiBJRVxuICAgIHZhciBzdHJpbmdfc3Vic3RyID0gU3RyaW5nUHJvdG90eXBlLnN1YnN0cjtcbiAgICB2YXIgaGFzTmVnYXRpdmVTdWJzdHJCdWcgPSAnJy5zdWJzdHIgJiYgJzBiJy5zdWJzdHIoLTEpICE9PSAnYic7XG4gICAgZGVmaW5lUHJvcGVydGllcyhTdHJpbmdQcm90b3R5cGUsIHtcbiAgICAgICAgc3Vic3RyOiBmdW5jdGlvbiBzdWJzdHIoc3RhcnQsIGxlbmd0aCkge1xuICAgICAgICAgICAgdmFyIG5vcm1hbGl6ZWRTdGFydCA9IHN0YXJ0O1xuICAgICAgICAgICAgaWYgKHN0YXJ0IDwgMCkge1xuICAgICAgICAgICAgICAgIG5vcm1hbGl6ZWRTdGFydCA9IG1heCh0aGlzLmxlbmd0aCArIHN0YXJ0LCAwKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHJldHVybiBzdHJpbmdfc3Vic3RyLmNhbGwodGhpcywgbm9ybWFsaXplZFN0YXJ0LCBsZW5ndGgpO1xuICAgICAgICB9XG4gICAgfSwgaGFzTmVnYXRpdmVTdWJzdHJCdWcpO1xuXG4gICAgLy8gRVM1IDE1LjUuNC4yMFxuICAgIC8vIHdoaXRlc3BhY2UgZnJvbTogaHR0cDovL2VzNS5naXRodWIuaW8vI3gxNS41LjQuMjBcbiAgICB2YXIgd3MgPSAnXFx4MDlcXHgwQVxceDBCXFx4MENcXHgwRFxceDIwXFx4QTBcXHUxNjgwXFx1MTgwRVxcdTIwMDBcXHUyMDAxXFx1MjAwMlxcdTIwMDMnICtcbiAgICAgICAgJ1xcdTIwMDRcXHUyMDA1XFx1MjAwNlxcdTIwMDdcXHUyMDA4XFx1MjAwOVxcdTIwMEFcXHUyMDJGXFx1MjA1RlxcdTMwMDBcXHUyMDI4JyArXG4gICAgICAgICdcXHUyMDI5XFx1RkVGRic7XG4gICAgdmFyIHplcm9XaWR0aCA9ICdcXHUyMDBiJztcbiAgICB2YXIgd3NSZWdleENoYXJzID0gJ1snICsgd3MgKyAnXSc7XG4gICAgdmFyIHRyaW1CZWdpblJlZ2V4cCA9IG5ldyBSZWdFeHAoJ14nICsgd3NSZWdleENoYXJzICsgd3NSZWdleENoYXJzICsgJyonKTtcbiAgICB2YXIgdHJpbUVuZFJlZ2V4cCA9IG5ldyBSZWdFeHAod3NSZWdleENoYXJzICsgd3NSZWdleENoYXJzICsgJyokJyk7XG4gICAgdmFyIGhhc1RyaW1XaGl0ZXNwYWNlQnVnID0gU3RyaW5nUHJvdG90eXBlLnRyaW0gJiYgKHdzLnRyaW0oKSB8fCAhemVyb1dpZHRoLnRyaW0oKSk7XG4gICAgZGVmaW5lUHJvcGVydGllcyhTdHJpbmdQcm90b3R5cGUsIHtcbiAgICAgICAgLy8gaHR0cDovL2Jsb2cuc3RldmVubGV2aXRoYW4uY29tL2FyY2hpdmVzL2Zhc3Rlci10cmltLWphdmFzY3JpcHRcbiAgICAgICAgLy8gaHR0cDovL3BlcmZlY3Rpb25raWxscy5jb20vd2hpdGVzcGFjZS1kZXZpYXRpb25zL1xuICAgICAgICB0cmltOiBmdW5jdGlvbiB0cmltKCkge1xuICAgICAgICAgICAgaWYgKHR5cGVvZiB0aGlzID09PSAndW5kZWZpbmVkJyB8fCB0aGlzID09PSBudWxsKSB7XG4gICAgICAgICAgICAgICAgdGhyb3cgbmV3IFR5cGVFcnJvcihcImNhbid0IGNvbnZlcnQgXCIgKyB0aGlzICsgJyB0byBvYmplY3QnKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHJldHVybiAkU3RyaW5nKHRoaXMpLnJlcGxhY2UodHJpbUJlZ2luUmVnZXhwLCAnJykucmVwbGFjZSh0cmltRW5kUmVnZXhwLCAnJyk7XG4gICAgICAgIH1cbiAgICB9LCBoYXNUcmltV2hpdGVzcGFjZUJ1Zyk7XG4gICAgdmFyIHRyaW0gPSBjYWxsLmJpbmQoU3RyaW5nLnByb3RvdHlwZS50cmltKTtcblxuICAgIHZhciBoYXNMYXN0SW5kZXhCdWcgPSBTdHJpbmdQcm90b3R5cGUubGFzdEluZGV4T2YgJiYgJ2FiY+OBguOBhCcubGFzdEluZGV4T2YoJ+OBguOBhCcsIDIpICE9PSAtMTtcbiAgICBkZWZpbmVQcm9wZXJ0aWVzKFN0cmluZ1Byb3RvdHlwZSwge1xuICAgICAgICBsYXN0SW5kZXhPZjogZnVuY3Rpb24gbGFzdEluZGV4T2Yoc2VhcmNoU3RyaW5nKSB7XG4gICAgICAgICAgICBpZiAodHlwZW9mIHRoaXMgPT09ICd1bmRlZmluZWQnIHx8IHRoaXMgPT09IG51bGwpIHtcbiAgICAgICAgICAgICAgICB0aHJvdyBuZXcgVHlwZUVycm9yKFwiY2FuJ3QgY29udmVydCBcIiArIHRoaXMgKyAnIHRvIG9iamVjdCcpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgdmFyIFMgPSAkU3RyaW5nKHRoaXMpO1xuICAgICAgICAgICAgdmFyIHNlYXJjaFN0ciA9ICRTdHJpbmcoc2VhcmNoU3RyaW5nKTtcbiAgICAgICAgICAgIHZhciBudW1Qb3MgPSBhcmd1bWVudHMubGVuZ3RoID4gMSA/ICROdW1iZXIoYXJndW1lbnRzWzFdKSA6IE5hTjtcbiAgICAgICAgICAgIHZhciBwb3MgPSBpc0FjdHVhbE5hTihudW1Qb3MpID8gSW5maW5pdHkgOiBFUy5Ub0ludGVnZXIobnVtUG9zKTtcbiAgICAgICAgICAgIHZhciBzdGFydCA9IG1pbihtYXgocG9zLCAwKSwgUy5sZW5ndGgpO1xuICAgICAgICAgICAgdmFyIHNlYXJjaExlbiA9IHNlYXJjaFN0ci5sZW5ndGg7XG4gICAgICAgICAgICB2YXIgayA9IHN0YXJ0ICsgc2VhcmNoTGVuO1xuICAgICAgICAgICAgd2hpbGUgKGsgPiAwKSB7XG4gICAgICAgICAgICAgICAgayA9IG1heCgwLCBrIC0gc2VhcmNoTGVuKTtcbiAgICAgICAgICAgICAgICB2YXIgaW5kZXggPSBzdHJJbmRleE9mKHN0clNsaWNlKFMsIGssIHN0YXJ0ICsgc2VhcmNoTGVuKSwgc2VhcmNoU3RyKTtcbiAgICAgICAgICAgICAgICBpZiAoaW5kZXggIT09IC0xKSB7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiBrICsgaW5kZXg7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICAgICAgcmV0dXJuIC0xO1xuICAgICAgICB9XG4gICAgfSwgaGFzTGFzdEluZGV4QnVnKTtcblxuICAgIHZhciBvcmlnaW5hbExhc3RJbmRleE9mID0gU3RyaW5nUHJvdG90eXBlLmxhc3RJbmRleE9mO1xuICAgIGRlZmluZVByb3BlcnRpZXMoU3RyaW5nUHJvdG90eXBlLCB7XG4gICAgICAgIGxhc3RJbmRleE9mOiBmdW5jdGlvbiBsYXN0SW5kZXhPZihzZWFyY2hTdHJpbmcpIHtcbiAgICAgICAgICAgIHJldHVybiBvcmlnaW5hbExhc3RJbmRleE9mLmFwcGx5KHRoaXMsIGFyZ3VtZW50cyk7XG4gICAgICAgIH1cbiAgICB9LCBTdHJpbmdQcm90b3R5cGUubGFzdEluZGV4T2YubGVuZ3RoICE9PSAxKTtcblxuICAgIC8vIEVTLTUgMTUuMS4yLjJcbiAgICAvKiBlc2xpbnQtZGlzYWJsZSByYWRpeCAqL1xuICAgIGlmIChwYXJzZUludCh3cyArICcwOCcpICE9PSA4IHx8IHBhcnNlSW50KHdzICsgJzB4MTYnKSAhPT0gMjIpIHtcbiAgICAvKiBlc2xpbnQtZW5hYmxlIHJhZGl4ICovXG4gICAgICAgIC8qIGdsb2JhbCBwYXJzZUludDogdHJ1ZSAqL1xuICAgICAgICBwYXJzZUludCA9IChmdW5jdGlvbiAob3JpZ1BhcnNlSW50KSB7XG4gICAgICAgICAgICB2YXIgaGV4UmVnZXggPSAvXltcXC0rXT8wW3hYXS87XG4gICAgICAgICAgICByZXR1cm4gZnVuY3Rpb24gcGFyc2VJbnQoc3RyLCByYWRpeCkge1xuICAgICAgICAgICAgICAgIHZhciBzdHJpbmcgPSB0cmltKFN0cmluZyhzdHIpKTtcbiAgICAgICAgICAgICAgICB2YXIgZGVmYXVsdGVkUmFkaXggPSAkTnVtYmVyKHJhZGl4KSB8fCAoaGV4UmVnZXgudGVzdChzdHJpbmcpID8gMTYgOiAxMCk7XG4gICAgICAgICAgICAgICAgcmV0dXJuIG9yaWdQYXJzZUludChzdHJpbmcsIGRlZmF1bHRlZFJhZGl4KTtcbiAgICAgICAgICAgIH07XG4gICAgICAgIH0ocGFyc2VJbnQpKTtcbiAgICB9XG5cbiAgICAvLyBodHRwczovL2VzNS5naXRodWIuaW8vI3gxNS4xLjIuM1xuICAgIGlmICgxIC8gcGFyc2VGbG9hdCgnLTAnKSAhPT0gLUluZmluaXR5KSB7XG4gICAgICAgIC8qIGdsb2JhbCBwYXJzZUZsb2F0OiB0cnVlICovXG4gICAgICAgIHBhcnNlRmxvYXQgPSAoZnVuY3Rpb24gKG9yaWdQYXJzZUZsb2F0KSB7XG4gICAgICAgICAgICByZXR1cm4gZnVuY3Rpb24gcGFyc2VGbG9hdChzdHJpbmcpIHtcbiAgICAgICAgICAgICAgICB2YXIgaW5wdXRTdHJpbmcgPSB0cmltKFN0cmluZyhzdHJpbmcpKTtcbiAgICAgICAgICAgICAgICB2YXIgcmVzdWx0ID0gb3JpZ1BhcnNlRmxvYXQoaW5wdXRTdHJpbmcpO1xuICAgICAgICAgICAgICAgIHJldHVybiByZXN1bHQgPT09IDAgJiYgc3RyU2xpY2UoaW5wdXRTdHJpbmcsIDAsIDEpID09PSAnLScgPyAtMCA6IHJlc3VsdDtcbiAgICAgICAgICAgIH07XG4gICAgICAgIH0ocGFyc2VGbG9hdCkpO1xuICAgIH1cblxuICAgIGlmIChTdHJpbmcobmV3IFJhbmdlRXJyb3IoJ3Rlc3QnKSkgIT09ICdSYW5nZUVycm9yOiB0ZXN0Jykge1xuICAgICAgICB2YXIgZXJyb3JUb1N0cmluZ1NoaW0gPSBmdW5jdGlvbiB0b1N0cmluZygpIHtcbiAgICAgICAgICAgIGlmICh0eXBlb2YgdGhpcyA9PT0gJ3VuZGVmaW5lZCcgfHwgdGhpcyA9PT0gbnVsbCkge1xuICAgICAgICAgICAgICAgIHRocm93IG5ldyBUeXBlRXJyb3IoXCJjYW4ndCBjb252ZXJ0IFwiICsgdGhpcyArICcgdG8gb2JqZWN0Jyk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICB2YXIgbmFtZSA9IHRoaXMubmFtZTtcbiAgICAgICAgICAgIGlmICh0eXBlb2YgbmFtZSA9PT0gJ3VuZGVmaW5lZCcpIHtcbiAgICAgICAgICAgICAgICBuYW1lID0gJ0Vycm9yJztcbiAgICAgICAgICAgIH0gZWxzZSBpZiAodHlwZW9mIG5hbWUgIT09ICdzdHJpbmcnKSB7XG4gICAgICAgICAgICAgICAgbmFtZSA9ICRTdHJpbmcobmFtZSk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICB2YXIgbXNnID0gdGhpcy5tZXNzYWdlO1xuICAgICAgICAgICAgaWYgKHR5cGVvZiBtc2cgPT09ICd1bmRlZmluZWQnKSB7XG4gICAgICAgICAgICAgICAgbXNnID0gJyc7XG4gICAgICAgICAgICB9IGVsc2UgaWYgKHR5cGVvZiBtc2cgIT09ICdzdHJpbmcnKSB7XG4gICAgICAgICAgICAgICAgbXNnID0gJFN0cmluZyhtc2cpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgaWYgKCFuYW1lKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIG1zZztcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGlmICghbXNnKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIG5hbWU7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICByZXR1cm4gbmFtZSArICc6ICcgKyBtc2c7XG4gICAgICAgIH07XG4gICAgICAgIC8vIGNhbid0IHVzZSBkZWZpbmVQcm9wZXJ0aWVzIGhlcmUgYmVjYXVzZSBvZiB0b1N0cmluZyBlbnVtZXJhdGlvbiBpc3N1ZSBpbiBJRSA8PSA4XG4gICAgICAgIEVycm9yLnByb3RvdHlwZS50b1N0cmluZyA9IGVycm9yVG9TdHJpbmdTaGltO1xuICAgIH1cblxuICAgIGlmIChzdXBwb3J0c0Rlc2NyaXB0b3JzKSB7XG4gICAgICAgIHZhciBlbnN1cmVOb25FbnVtZXJhYmxlID0gZnVuY3Rpb24gKG9iaiwgcHJvcCkge1xuICAgICAgICAgICAgaWYgKGlzRW51bShvYmosIHByb3ApKSB7XG4gICAgICAgICAgICAgICAgdmFyIGRlc2MgPSBPYmplY3QuZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9yKG9iaiwgcHJvcCk7XG4gICAgICAgICAgICAgICAgaWYgKGRlc2MuY29uZmlndXJhYmxlKSB7XG4gICAgICAgICAgICAgICAgICAgIGRlc2MuZW51bWVyYWJsZSA9IGZhbHNlO1xuICAgICAgICAgICAgICAgICAgICBPYmplY3QuZGVmaW5lUHJvcGVydHkob2JqLCBwcm9wLCBkZXNjKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgIH07XG4gICAgICAgIGVuc3VyZU5vbkVudW1lcmFibGUoRXJyb3IucHJvdG90eXBlLCAnbWVzc2FnZScpO1xuICAgICAgICBpZiAoRXJyb3IucHJvdG90eXBlLm1lc3NhZ2UgIT09ICcnKSB7XG4gICAgICAgICAgICBFcnJvci5wcm90b3R5cGUubWVzc2FnZSA9ICcnO1xuICAgICAgICB9XG4gICAgICAgIGVuc3VyZU5vbkVudW1lcmFibGUoRXJyb3IucHJvdG90eXBlLCAnbmFtZScpO1xuICAgIH1cblxuICAgIGlmIChTdHJpbmcoL2EvbWlnKSAhPT0gJy9hL2dpbScpIHtcbiAgICAgICAgdmFyIHJlZ2V4VG9TdHJpbmcgPSBmdW5jdGlvbiB0b1N0cmluZygpIHtcbiAgICAgICAgICAgIHZhciBzdHIgPSAnLycgKyB0aGlzLnNvdXJjZSArICcvJztcbiAgICAgICAgICAgIGlmICh0aGlzLmdsb2JhbCkge1xuICAgICAgICAgICAgICAgIHN0ciArPSAnZyc7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBpZiAodGhpcy5pZ25vcmVDYXNlKSB7XG4gICAgICAgICAgICAgICAgc3RyICs9ICdpJztcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGlmICh0aGlzLm11bHRpbGluZSkge1xuICAgICAgICAgICAgICAgIHN0ciArPSAnbSc7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICByZXR1cm4gc3RyO1xuICAgICAgICB9O1xuICAgICAgICAvLyBjYW4ndCB1c2UgZGVmaW5lUHJvcGVydGllcyBoZXJlIGJlY2F1c2Ugb2YgdG9TdHJpbmcgZW51bWVyYXRpb24gaXNzdWUgaW4gSUUgPD0gOFxuICAgICAgICBSZWdFeHAucHJvdG90eXBlLnRvU3RyaW5nID0gcmVnZXhUb1N0cmluZztcbiAgICB9XG59KSk7XG4iLCIndXNlIHN0cmljdCc7XG4vKmpzbGludCBlcWVxOiB0cnVlKi9cblxuSGFuZGxlYmFycy5yZWdpc3RlckhlbHBlcignc2FuaXRpemUnLCBmdW5jdGlvbiAodGV4dCkge1xuICAgIHZhciByZXN1bHQ7XG5cbiAgICBpZiAodGV4dCA9PT0gdW5kZWZpbmVkKSB7IHJldHVybiAnJzsgfVxuXG4gICAgcmVzdWx0ID0gc2FuaXRpemVIdG1sKHRleHQsIHtcbiAgICAgICAgYWxsb3dlZFRhZ3M6IFsgJ2RpdicsICdzcGFuJywgJ2InLCAnaScsICdlbScsICdzdHJvbmcnLCAnYScsICdicicsICd0YWJsZScsICd0Ym9keScsICd0cicsICd0aCcsICd0ZCcgXSxcbiAgICAgICAgYWxsb3dlZEF0dHJpYnV0ZXM6IHtcbiAgICAgICAgICAgICdkaXYnOiBbICdjbGFzcycgXSxcbiAgICAgICAgICAgICdzcGFuJzogWyAnY2xhc3MnIF0sXG4gICAgICAgICAgICAndGFibGUnOiBbICdjbGFzcycgXSxcbiAgICAgICAgICAgICd0ZCc6IFsgJ2NsYXNzJyBdLFxuICAgICAgICAgICAgJ3RoJzogWyAnY29sc3BhbicgXSxcbiAgICAgICAgICAgICdhJzogWyAnaHJlZicgXVxuICAgICAgICB9XG4gICAgfSk7XG5cbiAgICByZXR1cm4gbmV3IEhhbmRsZWJhcnMuU2FmZVN0cmluZyhyZXN1bHQpO1xufSk7XG5cbkhhbmRsZWJhcnMucmVnaXN0ZXJIZWxwZXIoJ3JlbmRlclRleHRQYXJhbScsIGZ1bmN0aW9uKHBhcmFtKSB7XG4gICAgdmFyIHJlc3VsdCwgdHlwZSA9ICd0ZXh0JywgaWRBdHQgPSAnJztcbiAgICB2YXIgcGFyYW1UeXBlID0gcGFyYW0udHlwZSB8fCBwYXJhbS5zY2hlbWEgJiYgcGFyYW0uc2NoZW1hLnR5cGUgfHwgJyc7XG4gICAgdmFyIGlzQXJyYXkgPSBwYXJhbVR5cGUudG9Mb3dlckNhc2UoKSA9PT0gJ2FycmF5JyB8fCBwYXJhbS5hbGxvd011bHRpcGxlO1xuICAgIHZhciBkZWZhdWx0VmFsdWUgPSBpc0FycmF5ICYmIEFycmF5LmlzQXJyYXkocGFyYW0uZGVmYXVsdCkgPyBwYXJhbS5kZWZhdWx0LmpvaW4oJ1xcbicpIDogcGFyYW0uZGVmYXVsdDtcbiAgICB2YXIgbmFtZSA9IEhhbmRsZWJhcnMuVXRpbHMuZXNjYXBlRXhwcmVzc2lvbihwYXJhbS5uYW1lKTtcbiAgICB2YXIgdmFsdWVJZCA9IEhhbmRsZWJhcnMuVXRpbHMuZXNjYXBlRXhwcmVzc2lvbihwYXJhbS52YWx1ZUlkKTtcbiAgICBwYXJhbVR5cGUgPSBIYW5kbGViYXJzLlV0aWxzLmVzY2FwZUV4cHJlc3Npb24ocGFyYW1UeXBlKTtcblxuICAgIHZhciBkYXRhVmVuZG9yRXh0ZW5zaW9ucyA9IE9iamVjdC5rZXlzKHBhcmFtKS5maWx0ZXIoZnVuY3Rpb24ocHJvcGVydHkpIHtcbiAgICAgICAgLy8gZmlsdGVyIFgtZGF0YS0gcHJvcGVydGllc1xuICAgICAgICByZXR1cm4gcHJvcGVydHkubWF0Y2goL15YLWRhdGEtL2kpICE9PSBudWxsO1xuICAgIH0pLnJlZHVjZShmdW5jdGlvbihyZXN1bHQsIHByb3BlcnR5KSB7XG4gICAgICAgIC8vIHJlbW92ZSBYLSBmcm9tIHByb3BlcnR5IG5hbWUsIHNvIGl0IHJlc3VsdHMgaW4gaHRtbCBhdHRyaWJ1dGVzIGxpa2UgZGF0YS1mb289J2JhcidcbiAgICAgICAgcmV0dXJuIHJlc3VsdCArPSAnICcgKyBwcm9wZXJ0eS5zdWJzdHJpbmcoMiwgcHJvcGVydHkubGVuZ3RoKSArICc9XFwnJyArIHBhcmFtW3Byb3BlcnR5XSArICdcXCcnO1xuICAgIH0sICcnKTtcblxuICAgIGlmKHBhcmFtLmZvcm1hdCAmJiBwYXJhbS5mb3JtYXQgPT09ICdwYXNzd29yZCcpIHtcbiAgICAgICAgdHlwZSA9ICdwYXNzd29yZCc7XG4gICAgfVxuXG4gICAgaWYodmFsdWVJZCkge1xuICAgICAgICBpZEF0dCA9ICcgaWQ9XFwnJyArIHZhbHVlSWQgKyAnXFwnJztcbiAgICB9XG5cbiAgICBpZiAoZGVmYXVsdFZhbHVlKSB7XG4gICAgICBkZWZhdWx0VmFsdWUgPSBzYW5pdGl6ZUh0bWwoZGVmYXVsdFZhbHVlKTtcbiAgICB9IGVsc2Uge1xuICAgICAgZGVmYXVsdFZhbHVlID0gJyc7XG4gICAgfVxuXG4gICAgaWYoaXNBcnJheSkge1xuICAgICAgICByZXN1bHQgPSAnPHRleHRhcmVhIGNsYXNzPVxcJ2JvZHktdGV4dGFyZWEnICsgKHBhcmFtLnJlcXVpcmVkID8gJyByZXF1aXJlZCcgOiAnJykgKyAnXFwnIG5hbWU9XFwnJyArIG5hbWUgKyAnXFwnJyArIGlkQXR0ICsgZGF0YVZlbmRvckV4dGVuc2lvbnM7XG4gICAgICAgIHJlc3VsdCArPSAnIHBsYWNlaG9sZGVyPVxcJ1Byb3ZpZGUgbXVsdGlwbGUgdmFsdWVzIGluIG5ldyBsaW5lcycgKyAocGFyYW0ucmVxdWlyZWQgPyAnIChhdCBsZWFzdCBvbmUgcmVxdWlyZWQpLicgOiAnLicpICsgJ1xcJz4nO1xuICAgICAgICByZXN1bHQgKz0gZGVmYXVsdFZhbHVlICsgJzwvdGV4dGFyZWE+JztcbiAgICB9IGVsc2Uge1xuICAgICAgICB2YXIgcGFyYW1ldGVyQ2xhc3MgPSAncGFyYW1ldGVyJztcbiAgICAgICAgaWYocGFyYW0ucmVxdWlyZWQpIHtcbiAgICAgICAgICBwYXJhbWV0ZXJDbGFzcyArPSAnIHJlcXVpcmVkJztcbiAgICAgICAgfVxuICAgICAgICByZXN1bHQgPSAnPGlucHV0IGNsYXNzPVxcJycgKyBwYXJhbWV0ZXJDbGFzcyArICdcXCcgbWlubGVuZ3RoPVxcJycgKyAocGFyYW0ucmVxdWlyZWQgPyAxIDogMCkgKyAnXFwnJztcbiAgICAgICAgcmVzdWx0ICs9ICcgbmFtZT1cXCcnICsgbmFtZSArJ1xcJyBwbGFjZWhvbGRlcj1cXCcnICsgKHBhcmFtLnJlcXVpcmVkID8gJyhyZXF1aXJlZCknIDogJycpICsgJ1xcJycgKyBpZEF0dCArIGRhdGFWZW5kb3JFeHRlbnNpb25zO1xuICAgICAgICByZXN1bHQgKz0gJyB0eXBlPVxcJycgKyB0eXBlICsgJ1xcJyB2YWx1ZT1cXCcnICsgZGVmYXVsdFZhbHVlICsgJ1xcJy8+JztcbiAgICB9XG4gICAgcmV0dXJuIG5ldyBIYW5kbGViYXJzLlNhZmVTdHJpbmcocmVzdWx0KTtcbn0pO1xuXG5IYW5kbGViYXJzLnJlZ2lzdGVySGVscGVyKCdpZkNvbmQnLCBmdW5jdGlvbiAodjEsIG9wZXJhdG9yLCB2Miwgb3B0aW9ucykge1xuXG4gICAgc3dpdGNoIChvcGVyYXRvcikge1xuICAgICAgICBjYXNlICc9PSc6XG4gICAgICAgICAgICByZXR1cm4gKHYxID09IHYyKSA/IG9wdGlvbnMuZm4odGhpcykgOiBvcHRpb25zLmludmVyc2UodGhpcyk7XG4gICAgICAgIGNhc2UgJz09PSc6XG4gICAgICAgICAgICByZXR1cm4gKHYxID09PSB2MikgPyBvcHRpb25zLmZuKHRoaXMpIDogb3B0aW9ucy5pbnZlcnNlKHRoaXMpO1xuICAgICAgICBjYXNlICc8JzpcbiAgICAgICAgICAgIHJldHVybiAodjEgPCB2MikgPyBvcHRpb25zLmZuKHRoaXMpIDogb3B0aW9ucy5pbnZlcnNlKHRoaXMpO1xuICAgICAgICBjYXNlICc8PSc6XG4gICAgICAgICAgICByZXR1cm4gKHYxIDw9IHYyKSA/IG9wdGlvbnMuZm4odGhpcykgOiBvcHRpb25zLmludmVyc2UodGhpcyk7XG4gICAgICAgIGNhc2UgJz4nOlxuICAgICAgICAgICAgcmV0dXJuICh2MSA+IHYyKSA/IG9wdGlvbnMuZm4odGhpcykgOiBvcHRpb25zLmludmVyc2UodGhpcyk7XG4gICAgICAgIGNhc2UgJz49JzpcbiAgICAgICAgICAgIHJldHVybiAodjEgPj0gdjIpID8gb3B0aW9ucy5mbih0aGlzKSA6IG9wdGlvbnMuaW52ZXJzZSh0aGlzKTtcbiAgICAgICAgY2FzZSAnJiYnOlxuICAgICAgICAgICAgcmV0dXJuICh2MSAmJiB2MikgPyBvcHRpb25zLmZuKHRoaXMpIDogb3B0aW9ucy5pbnZlcnNlKHRoaXMpO1xuICAgICAgICBjYXNlICd8fCc6XG4gICAgICAgICAgICByZXR1cm4gKHYxIHx8IHYyKSA/IG9wdGlvbnMuZm4odGhpcykgOiBvcHRpb25zLmludmVyc2UodGhpcyk7XG4gICAgICAgIGRlZmF1bHQ6XG4gICAgICAgICAgICByZXR1cm4gb3B0aW9ucy5pbnZlcnNlKHRoaXMpO1xuICAgIH1cbn0pO1xuXG5IYW5kbGViYXJzLnJlZ2lzdGVySGVscGVyKCdlc2NhcGUnLCBmdW5jdGlvbiAodmFsdWUpIHtcbiAgICB2YXIgdGV4dCA9IEhhbmRsZWJhcnMuVXRpbHMuZXNjYXBlRXhwcmVzc2lvbih2YWx1ZSk7XG5cbiAgICByZXR1cm4gbmV3IEhhbmRsZWJhcnMuU2FmZVN0cmluZyh0ZXh0KTtcbn0pO1xuIiwiKGZ1bmN0aW9uKGYpe2lmKHR5cGVvZiBleHBvcnRzPT09XCJvYmplY3RcIiYmdHlwZW9mIG1vZHVsZSE9PVwidW5kZWZpbmVkXCIpe21vZHVsZS5leHBvcnRzPWYoKX1lbHNlIGlmKHR5cGVvZiBkZWZpbmU9PT1cImZ1bmN0aW9uXCImJmRlZmluZS5hbWQpe2RlZmluZShbXSxmKX1lbHNle3ZhciBnO2lmKHR5cGVvZiB3aW5kb3chPT1cInVuZGVmaW5lZFwiKXtnPXdpbmRvd31lbHNlIGlmKHR5cGVvZiBnbG9iYWwhPT1cInVuZGVmaW5lZFwiKXtnPWdsb2JhbH1lbHNlIGlmKHR5cGVvZiBzZWxmIT09XCJ1bmRlZmluZWRcIil7Zz1zZWxmfWVsc2V7Zz10aGlzfWcuc2FuaXRpemVIdG1sPWYoKX19KShmdW5jdGlvbigpe3ZhciBkZWZpbmUsbW9kdWxlLGV4cG9ydHM7cmV0dXJuIGZ1bmN0aW9uIGUodCxuLHIpe2Z1bmN0aW9uIHMobyx1KXtpZighbltvXSl7aWYoIXRbb10pe3ZhciBhPXR5cGVvZiByZXF1aXJlPT1cImZ1bmN0aW9uXCImJnJlcXVpcmU7aWYoIXUmJmEpcmV0dXJuIGEobywhMCk7aWYoaSlyZXR1cm4gaShvLCEwKTt2YXIgZj1uZXcgRXJyb3IoXCJDYW5ub3QgZmluZCBtb2R1bGUgJ1wiK28rXCInXCIpO3Rocm93IGYuY29kZT1cIk1PRFVMRV9OT1RfRk9VTkRcIixmfXZhciBsPW5bb109e2V4cG9ydHM6e319O3Rbb11bMF0uY2FsbChsLmV4cG9ydHMsZnVuY3Rpb24oZSl7dmFyIG49dFtvXVsxXVtlXTtyZXR1cm4gcyhuP246ZSl9LGwsbC5leHBvcnRzLGUsdCxuLHIpfXJldHVybiBuW29dLmV4cG9ydHN9dmFyIGk9dHlwZW9mIHJlcXVpcmU9PVwiZnVuY3Rpb25cIiYmcmVxdWlyZTtmb3IodmFyIG89MDtvPHIubGVuZ3RoO28rKylzKHJbb10pO3JldHVybiBzfSh7MTpbZnVuY3Rpb24ocmVxdWlyZSxtb2R1bGUsZXhwb3J0cyl7dmFyIGh0bWxwYXJzZXI9cmVxdWlyZShcImh0bWxwYXJzZXIyXCIpO3ZhciBleHRlbmQ9cmVxdWlyZShcInh0ZW5kXCIpO3ZhciBxdW90ZVJlZ2V4cD1yZXF1aXJlKFwicmVnZXhwLXF1b3RlXCIpO2Z1bmN0aW9uIGVhY2gob2JqLGNiKXtpZihvYmopT2JqZWN0LmtleXMob2JqKS5mb3JFYWNoKGZ1bmN0aW9uKGtleSl7Y2Iob2JqW2tleV0sa2V5KX0pfWZ1bmN0aW9uIGhhcyhvYmosa2V5KXtyZXR1cm57fS5oYXNPd25Qcm9wZXJ0eS5jYWxsKG9iaixrZXkpfW1vZHVsZS5leHBvcnRzPXNhbml0aXplSHRtbDtmdW5jdGlvbiBzYW5pdGl6ZUh0bWwoaHRtbCxvcHRpb25zLF9yZWN1cnNpbmcpe3ZhciByZXN1bHQ9XCJcIjtmdW5jdGlvbiBGcmFtZSh0YWcsYXR0cmlicyl7dmFyIHRoYXQ9dGhpczt0aGlzLnRhZz10YWc7dGhpcy5hdHRyaWJzPWF0dHJpYnN8fHt9O3RoaXMudGFnUG9zaXRpb249cmVzdWx0Lmxlbmd0aDt0aGlzLnRleHQ9XCJcIjt0aGlzLnVwZGF0ZVBhcmVudE5vZGVUZXh0PWZ1bmN0aW9uKCl7aWYoc3RhY2subGVuZ3RoKXt2YXIgcGFyZW50RnJhbWU9c3RhY2tbc3RhY2subGVuZ3RoLTFdO3BhcmVudEZyYW1lLnRleHQrPXRoYXQudGV4dH19fWlmKCFvcHRpb25zKXtvcHRpb25zPXNhbml0aXplSHRtbC5kZWZhdWx0cztvcHRpb25zLnBhcnNlcj1odG1sUGFyc2VyRGVmYXVsdHN9ZWxzZXtvcHRpb25zPWV4dGVuZChzYW5pdGl6ZUh0bWwuZGVmYXVsdHMsb3B0aW9ucyk7aWYob3B0aW9ucy5wYXJzZXIpe29wdGlvbnMucGFyc2VyPWV4dGVuZChodG1sUGFyc2VyRGVmYXVsdHMsb3B0aW9ucy5wYXJzZXIpfWVsc2V7b3B0aW9ucy5wYXJzZXI9aHRtbFBhcnNlckRlZmF1bHRzfX12YXIgbm9uVGV4dFRhZ3NBcnJheT1vcHRpb25zLm5vblRleHRUYWdzfHxbXCJzY3JpcHRcIixcInN0eWxlXCIsXCJ0ZXh0YXJlYVwiXTt2YXIgYWxsb3dlZEF0dHJpYnV0ZXNNYXA7dmFyIGFsbG93ZWRBdHRyaWJ1dGVzR2xvYk1hcDtpZihvcHRpb25zLmFsbG93ZWRBdHRyaWJ1dGVzKXthbGxvd2VkQXR0cmlidXRlc01hcD17fTthbGxvd2VkQXR0cmlidXRlc0dsb2JNYXA9e307ZWFjaChvcHRpb25zLmFsbG93ZWRBdHRyaWJ1dGVzLGZ1bmN0aW9uKGF0dHJpYnV0ZXMsdGFnKXthbGxvd2VkQXR0cmlidXRlc01hcFt0YWddPVtdO3ZhciBnbG9iUmVnZXg9W107YXR0cmlidXRlcy5mb3JFYWNoKGZ1bmN0aW9uKG5hbWUpe2lmKG5hbWUuaW5kZXhPZihcIipcIik+PTApe2dsb2JSZWdleC5wdXNoKHF1b3RlUmVnZXhwKG5hbWUpLnJlcGxhY2UoL1xcXFxcXCovZyxcIi4qXCIpKX1lbHNle2FsbG93ZWRBdHRyaWJ1dGVzTWFwW3RhZ10ucHVzaChuYW1lKX19KTthbGxvd2VkQXR0cmlidXRlc0dsb2JNYXBbdGFnXT1uZXcgUmVnRXhwKFwiXihcIitnbG9iUmVnZXguam9pbihcInxcIikrXCIpJFwiKX0pfXZhciBhbGxvd2VkQ2xhc3Nlc01hcD17fTtlYWNoKG9wdGlvbnMuYWxsb3dlZENsYXNzZXMsZnVuY3Rpb24oY2xhc3Nlcyx0YWcpe2lmKGFsbG93ZWRBdHRyaWJ1dGVzTWFwKXtpZighaGFzKGFsbG93ZWRBdHRyaWJ1dGVzTWFwLHRhZykpe2FsbG93ZWRBdHRyaWJ1dGVzTWFwW3RhZ109W119YWxsb3dlZEF0dHJpYnV0ZXNNYXBbdGFnXS5wdXNoKFwiY2xhc3NcIil9YWxsb3dlZENsYXNzZXNNYXBbdGFnXT1jbGFzc2VzfSk7dmFyIHRyYW5zZm9ybVRhZ3NNYXA9e307dmFyIHRyYW5zZm9ybVRhZ3NBbGw7ZWFjaChvcHRpb25zLnRyYW5zZm9ybVRhZ3MsZnVuY3Rpb24odHJhbnNmb3JtLHRhZyl7dmFyIHRyYW5zRnVuO2lmKHR5cGVvZiB0cmFuc2Zvcm09PT1cImZ1bmN0aW9uXCIpe3RyYW5zRnVuPXRyYW5zZm9ybX1lbHNlIGlmKHR5cGVvZiB0cmFuc2Zvcm09PT1cInN0cmluZ1wiKXt0cmFuc0Z1bj1zYW5pdGl6ZUh0bWwuc2ltcGxlVHJhbnNmb3JtKHRyYW5zZm9ybSl9aWYodGFnPT09XCIqXCIpe3RyYW5zZm9ybVRhZ3NBbGw9dHJhbnNGdW59ZWxzZXt0cmFuc2Zvcm1UYWdzTWFwW3RhZ109dHJhbnNGdW59fSk7dmFyIGRlcHRoPTA7dmFyIHN0YWNrPVtdO3ZhciBza2lwTWFwPXt9O3ZhciB0cmFuc2Zvcm1NYXA9e307dmFyIHNraXBUZXh0PWZhbHNlO3ZhciBza2lwVGV4dERlcHRoPTA7dmFyIHBhcnNlcj1uZXcgaHRtbHBhcnNlci5QYXJzZXIoe29ub3BlbnRhZzpmdW5jdGlvbihuYW1lLGF0dHJpYnMpe2lmKHNraXBUZXh0KXtza2lwVGV4dERlcHRoKys7cmV0dXJufXZhciBmcmFtZT1uZXcgRnJhbWUobmFtZSxhdHRyaWJzKTtzdGFjay5wdXNoKGZyYW1lKTt2YXIgc2tpcD1mYWxzZTt2YXIgaGFzVGV4dD1mcmFtZS50ZXh0P3RydWU6ZmFsc2U7dmFyIHRyYW5zZm9ybWVkVGFnO2lmKGhhcyh0cmFuc2Zvcm1UYWdzTWFwLG5hbWUpKXt0cmFuc2Zvcm1lZFRhZz10cmFuc2Zvcm1UYWdzTWFwW25hbWVdKG5hbWUsYXR0cmlicyk7ZnJhbWUuYXR0cmlicz1hdHRyaWJzPXRyYW5zZm9ybWVkVGFnLmF0dHJpYnM7aWYodHJhbnNmb3JtZWRUYWcudGV4dCE9PXVuZGVmaW5lZCl7ZnJhbWUuaW5uZXJUZXh0PXRyYW5zZm9ybWVkVGFnLnRleHR9aWYobmFtZSE9PXRyYW5zZm9ybWVkVGFnLnRhZ05hbWUpe2ZyYW1lLm5hbWU9bmFtZT10cmFuc2Zvcm1lZFRhZy50YWdOYW1lO3RyYW5zZm9ybU1hcFtkZXB0aF09dHJhbnNmb3JtZWRUYWcudGFnTmFtZX19aWYodHJhbnNmb3JtVGFnc0FsbCl7dHJhbnNmb3JtZWRUYWc9dHJhbnNmb3JtVGFnc0FsbChuYW1lLGF0dHJpYnMpO2ZyYW1lLmF0dHJpYnM9YXR0cmlicz10cmFuc2Zvcm1lZFRhZy5hdHRyaWJzO2lmKG5hbWUhPT10cmFuc2Zvcm1lZFRhZy50YWdOYW1lKXtmcmFtZS5uYW1lPW5hbWU9dHJhbnNmb3JtZWRUYWcudGFnTmFtZTt0cmFuc2Zvcm1NYXBbZGVwdGhdPXRyYW5zZm9ybWVkVGFnLnRhZ05hbWV9fWlmKG9wdGlvbnMuYWxsb3dlZFRhZ3MmJm9wdGlvbnMuYWxsb3dlZFRhZ3MuaW5kZXhPZihuYW1lKT09PS0xKXtza2lwPXRydWU7aWYobm9uVGV4dFRhZ3NBcnJheS5pbmRleE9mKG5hbWUpIT09LTEpe3NraXBUZXh0PXRydWU7c2tpcFRleHREZXB0aD0xfXNraXBNYXBbZGVwdGhdPXRydWV9ZGVwdGgrKztpZihza2lwKXtyZXR1cm59cmVzdWx0Kz1cIjxcIituYW1lO2lmKCFhbGxvd2VkQXR0cmlidXRlc01hcHx8aGFzKGFsbG93ZWRBdHRyaWJ1dGVzTWFwLG5hbWUpfHxhbGxvd2VkQXR0cmlidXRlc01hcFtcIipcIl0pe2VhY2goYXR0cmlicyxmdW5jdGlvbih2YWx1ZSxhKXtpZighYWxsb3dlZEF0dHJpYnV0ZXNNYXB8fGhhcyhhbGxvd2VkQXR0cmlidXRlc01hcCxuYW1lKSYmYWxsb3dlZEF0dHJpYnV0ZXNNYXBbbmFtZV0uaW5kZXhPZihhKSE9PS0xfHxhbGxvd2VkQXR0cmlidXRlc01hcFtcIipcIl0mJmFsbG93ZWRBdHRyaWJ1dGVzTWFwW1wiKlwiXS5pbmRleE9mKGEpIT09LTF8fGhhcyhhbGxvd2VkQXR0cmlidXRlc0dsb2JNYXAsbmFtZSkmJmFsbG93ZWRBdHRyaWJ1dGVzR2xvYk1hcFtuYW1lXS50ZXN0KGEpfHxhbGxvd2VkQXR0cmlidXRlc0dsb2JNYXBbXCIqXCJdJiZhbGxvd2VkQXR0cmlidXRlc0dsb2JNYXBbXCIqXCJdLnRlc3QoYSkpe2lmKGE9PT1cImhyZWZcInx8YT09PVwic3JjXCIpe2lmKG5hdWdodHlIcmVmKG5hbWUsdmFsdWUpKXtkZWxldGUgZnJhbWUuYXR0cmlic1thXTtyZXR1cm59fWlmKGE9PT1cImNsYXNzXCIpe3ZhbHVlPWZpbHRlckNsYXNzZXModmFsdWUsYWxsb3dlZENsYXNzZXNNYXBbbmFtZV0pO2lmKCF2YWx1ZS5sZW5ndGgpe2RlbGV0ZSBmcmFtZS5hdHRyaWJzW2FdO3JldHVybn19cmVzdWx0Kz1cIiBcIithO2lmKHZhbHVlLmxlbmd0aCl7cmVzdWx0Kz0nPVwiJytlc2NhcGVIdG1sKHZhbHVlKSsnXCInfX1lbHNle2RlbGV0ZSBmcmFtZS5hdHRyaWJzW2FdfX0pfWlmKG9wdGlvbnMuc2VsZkNsb3NpbmcuaW5kZXhPZihuYW1lKSE9PS0xKXtyZXN1bHQrPVwiIC8+XCJ9ZWxzZXtyZXN1bHQrPVwiPlwiO2lmKGZyYW1lLmlubmVyVGV4dCYmIWhhc1RleHQmJiFvcHRpb25zLnRleHRGaWx0ZXIpe3Jlc3VsdCs9ZnJhbWUuaW5uZXJUZXh0fX19LG9udGV4dDpmdW5jdGlvbih0ZXh0KXtpZihza2lwVGV4dCl7cmV0dXJufXZhciBsYXN0RnJhbWU9c3RhY2tbc3RhY2subGVuZ3RoLTFdO3ZhciB0YWc7aWYobGFzdEZyYW1lKXt0YWc9bGFzdEZyYW1lLnRhZzt0ZXh0PWxhc3RGcmFtZS5pbm5lclRleHQhPT11bmRlZmluZWQ/bGFzdEZyYW1lLmlubmVyVGV4dDp0ZXh0fWlmKHRhZz09PVwic2NyaXB0XCJ8fHRhZz09PVwic3R5bGVcIil7cmVzdWx0Kz10ZXh0fWVsc2V7dmFyIGVzY2FwZWQ9ZXNjYXBlSHRtbCh0ZXh0KTtpZihvcHRpb25zLnRleHRGaWx0ZXIpe3Jlc3VsdCs9b3B0aW9ucy50ZXh0RmlsdGVyKGVzY2FwZWQpfWVsc2V7cmVzdWx0Kz1lc2NhcGVkfX1pZihzdGFjay5sZW5ndGgpe3ZhciBmcmFtZT1zdGFja1tzdGFjay5sZW5ndGgtMV07ZnJhbWUudGV4dCs9dGV4dH19LG9uY2xvc2V0YWc6ZnVuY3Rpb24obmFtZSl7aWYoc2tpcFRleHQpe3NraXBUZXh0RGVwdGgtLTtpZighc2tpcFRleHREZXB0aCl7c2tpcFRleHQ9ZmFsc2V9ZWxzZXtyZXR1cm59fXZhciBmcmFtZT1zdGFjay5wb3AoKTtpZighZnJhbWUpe3JldHVybn1za2lwVGV4dD1mYWxzZTtkZXB0aC0tO2lmKHNraXBNYXBbZGVwdGhdKXtkZWxldGUgc2tpcE1hcFtkZXB0aF07ZnJhbWUudXBkYXRlUGFyZW50Tm9kZVRleHQoKTtyZXR1cm59aWYodHJhbnNmb3JtTWFwW2RlcHRoXSl7bmFtZT10cmFuc2Zvcm1NYXBbZGVwdGhdO2RlbGV0ZSB0cmFuc2Zvcm1NYXBbZGVwdGhdfWlmKG9wdGlvbnMuZXhjbHVzaXZlRmlsdGVyJiZvcHRpb25zLmV4Y2x1c2l2ZUZpbHRlcihmcmFtZSkpe3Jlc3VsdD1yZXN1bHQuc3Vic3RyKDAsZnJhbWUudGFnUG9zaXRpb24pO3JldHVybn1mcmFtZS51cGRhdGVQYXJlbnROb2RlVGV4dCgpO2lmKG9wdGlvbnMuc2VsZkNsb3NpbmcuaW5kZXhPZihuYW1lKSE9PS0xKXtyZXR1cm59cmVzdWx0Kz1cIjwvXCIrbmFtZStcIj5cIn19LG9wdGlvbnMucGFyc2VyKTtwYXJzZXIud3JpdGUoaHRtbCk7cGFyc2VyLmVuZCgpO3JldHVybiByZXN1bHQ7ZnVuY3Rpb24gZXNjYXBlSHRtbChzKXtpZih0eXBlb2YgcyE9PVwic3RyaW5nXCIpe3M9cytcIlwifXJldHVybiBzLnJlcGxhY2UoL1xcJi9nLFwiJmFtcDtcIikucmVwbGFjZSgvPC9nLFwiJmx0O1wiKS5yZXBsYWNlKC9cXD4vZyxcIiZndDtcIikucmVwbGFjZSgvXFxcIi9nLFwiJnF1b3Q7XCIpfWZ1bmN0aW9uIG5hdWdodHlIcmVmKG5hbWUsaHJlZil7aHJlZj1ocmVmLnJlcGxhY2UoL1tcXHgwMC1cXHgyMF0rL2csXCJcIik7aHJlZj1ocmVmLnJlcGxhY2UoLzxcXCFcXC1cXC0uKj9cXC1cXC1cXD4vZyxcIlwiKTt2YXIgbWF0Y2hlcz1ocmVmLm1hdGNoKC9eKFthLXpBLVpdKylcXDovKTtpZighbWF0Y2hlcyl7cmV0dXJuIGZhbHNlfXZhciBzY2hlbWU9bWF0Y2hlc1sxXS50b0xvd2VyQ2FzZSgpO2lmKGhhcyhvcHRpb25zLmFsbG93ZWRTY2hlbWVzQnlUYWcsbmFtZSkpe3JldHVybiBvcHRpb25zLmFsbG93ZWRTY2hlbWVzQnlUYWdbbmFtZV0uaW5kZXhPZihzY2hlbWUpPT09LTF9cmV0dXJuIW9wdGlvbnMuYWxsb3dlZFNjaGVtZXN8fG9wdGlvbnMuYWxsb3dlZFNjaGVtZXMuaW5kZXhPZihzY2hlbWUpPT09LTF9ZnVuY3Rpb24gZmlsdGVyQ2xhc3NlcyhjbGFzc2VzLGFsbG93ZWQpe2lmKCFhbGxvd2VkKXtyZXR1cm4gY2xhc3Nlc31jbGFzc2VzPWNsYXNzZXMuc3BsaXQoL1xccysvKTtyZXR1cm4gY2xhc3Nlcy5maWx0ZXIoZnVuY3Rpb24oY2xzcyl7cmV0dXJuIGFsbG93ZWQuaW5kZXhPZihjbHNzKSE9PS0xfSkuam9pbihcIiBcIil9fXZhciBodG1sUGFyc2VyRGVmYXVsdHM9e2RlY29kZUVudGl0aWVzOnRydWV9O3Nhbml0aXplSHRtbC5kZWZhdWx0cz17YWxsb3dlZFRhZ3M6W1wiaDNcIixcImg0XCIsXCJoNVwiLFwiaDZcIixcImJsb2NrcXVvdGVcIixcInBcIixcImFcIixcInVsXCIsXCJvbFwiLFwibmxcIixcImxpXCIsXCJiXCIsXCJpXCIsXCJzdHJvbmdcIixcImVtXCIsXCJzdHJpa2VcIixcImNvZGVcIixcImhyXCIsXCJiclwiLFwiZGl2XCIsXCJ0YWJsZVwiLFwidGhlYWRcIixcImNhcHRpb25cIixcInRib2R5XCIsXCJ0clwiLFwidGhcIixcInRkXCIsXCJwcmVcIl0sYWxsb3dlZEF0dHJpYnV0ZXM6e2E6W1wiaHJlZlwiLFwibmFtZVwiLFwidGFyZ2V0XCJdLGltZzpbXCJzcmNcIl19LHNlbGZDbG9zaW5nOltcImltZ1wiLFwiYnJcIixcImhyXCIsXCJhcmVhXCIsXCJiYXNlXCIsXCJiYXNlZm9udFwiLFwiaW5wdXRcIixcImxpbmtcIixcIm1ldGFcIl0sYWxsb3dlZFNjaGVtZXM6W1wiaHR0cFwiLFwiaHR0cHNcIixcImZ0cFwiLFwibWFpbHRvXCJdLGFsbG93ZWRTY2hlbWVzQnlUYWc6e319O3Nhbml0aXplSHRtbC5zaW1wbGVUcmFuc2Zvcm09ZnVuY3Rpb24obmV3VGFnTmFtZSxuZXdBdHRyaWJzLG1lcmdlKXttZXJnZT1tZXJnZT09PXVuZGVmaW5lZD90cnVlOm1lcmdlO25ld0F0dHJpYnM9bmV3QXR0cmlic3x8e307cmV0dXJuIGZ1bmN0aW9uKHRhZ05hbWUsYXR0cmlicyl7dmFyIGF0dHJpYjtpZihtZXJnZSl7Zm9yKGF0dHJpYiBpbiBuZXdBdHRyaWJzKXthdHRyaWJzW2F0dHJpYl09bmV3QXR0cmlic1thdHRyaWJdfX1lbHNle2F0dHJpYnM9bmV3QXR0cmlic31yZXR1cm57dGFnTmFtZTpuZXdUYWdOYW1lLGF0dHJpYnM6YXR0cmlic319fX0se2h0bWxwYXJzZXIyOjM2LFwicmVnZXhwLXF1b3RlXCI6NTQseHRlbmQ6NTh9XSwyOltmdW5jdGlvbihyZXF1aXJlLG1vZHVsZSxleHBvcnRzKXtcInVzZSBzdHJpY3RcIjtleHBvcnRzLnRvQnl0ZUFycmF5PXRvQnl0ZUFycmF5O2V4cG9ydHMuZnJvbUJ5dGVBcnJheT1mcm9tQnl0ZUFycmF5O3ZhciBsb29rdXA9W107dmFyIHJldkxvb2t1cD1bXTt2YXIgQXJyPXR5cGVvZiBVaW50OEFycmF5IT09XCJ1bmRlZmluZWRcIj9VaW50OEFycmF5OkFycmF5O2Z1bmN0aW9uIGluaXQoKXt2YXIgY29kZT1cIkFCQ0RFRkdISUpLTE1OT1BRUlNUVVZXWFlaYWJjZGVmZ2hpamtsbW5vcHFyc3R1dnd4eXowMTIzNDU2Nzg5Ky9cIjtmb3IodmFyIGk9MCxsZW49Y29kZS5sZW5ndGg7aTxsZW47KytpKXtsb29rdXBbaV09Y29kZVtpXTtyZXZMb29rdXBbY29kZS5jaGFyQ29kZUF0KGkpXT1pfXJldkxvb2t1cFtcIi1cIi5jaGFyQ29kZUF0KDApXT02MjtyZXZMb29rdXBbXCJfXCIuY2hhckNvZGVBdCgwKV09NjN9aW5pdCgpO2Z1bmN0aW9uIHRvQnl0ZUFycmF5KGI2NCl7dmFyIGksaixsLHRtcCxwbGFjZUhvbGRlcnMsYXJyO3ZhciBsZW49YjY0Lmxlbmd0aDtpZihsZW4lND4wKXt0aHJvdyBuZXcgRXJyb3IoXCJJbnZhbGlkIHN0cmluZy4gTGVuZ3RoIG11c3QgYmUgYSBtdWx0aXBsZSBvZiA0XCIpfXBsYWNlSG9sZGVycz1iNjRbbGVuLTJdPT09XCI9XCI/MjpiNjRbbGVuLTFdPT09XCI9XCI/MTowO2Fycj1uZXcgQXJyKGxlbiozLzQtcGxhY2VIb2xkZXJzKTtsPXBsYWNlSG9sZGVycz4wP2xlbi00Omxlbjt2YXIgTD0wO2ZvcihpPTAsaj0wO2k8bDtpKz00LGorPTMpe3RtcD1yZXZMb29rdXBbYjY0LmNoYXJDb2RlQXQoaSldPDwxOHxyZXZMb29rdXBbYjY0LmNoYXJDb2RlQXQoaSsxKV08PDEyfHJldkxvb2t1cFtiNjQuY2hhckNvZGVBdChpKzIpXTw8NnxyZXZMb29rdXBbYjY0LmNoYXJDb2RlQXQoaSszKV07YXJyW0wrK109dG1wPj4xNiYyNTU7YXJyW0wrK109dG1wPj44JjI1NTthcnJbTCsrXT10bXAmMjU1fWlmKHBsYWNlSG9sZGVycz09PTIpe3RtcD1yZXZMb29rdXBbYjY0LmNoYXJDb2RlQXQoaSldPDwyfHJldkxvb2t1cFtiNjQuY2hhckNvZGVBdChpKzEpXT4+NDthcnJbTCsrXT10bXAmMjU1fWVsc2UgaWYocGxhY2VIb2xkZXJzPT09MSl7dG1wPXJldkxvb2t1cFtiNjQuY2hhckNvZGVBdChpKV08PDEwfHJldkxvb2t1cFtiNjQuY2hhckNvZGVBdChpKzEpXTw8NHxyZXZMb29rdXBbYjY0LmNoYXJDb2RlQXQoaSsyKV0+PjI7YXJyW0wrK109dG1wPj44JjI1NTthcnJbTCsrXT10bXAmMjU1fXJldHVybiBhcnJ9ZnVuY3Rpb24gdHJpcGxldFRvQmFzZTY0KG51bSl7cmV0dXJuIGxvb2t1cFtudW0+PjE4JjYzXStsb29rdXBbbnVtPj4xMiY2M10rbG9va3VwW251bT4+NiY2M10rbG9va3VwW251bSY2M119ZnVuY3Rpb24gZW5jb2RlQ2h1bmsodWludDgsc3RhcnQsZW5kKXt2YXIgdG1wO3ZhciBvdXRwdXQ9W107Zm9yKHZhciBpPXN0YXJ0O2k8ZW5kO2krPTMpe3RtcD0odWludDhbaV08PDE2KSsodWludDhbaSsxXTw8OCkrdWludDhbaSsyXTtvdXRwdXQucHVzaCh0cmlwbGV0VG9CYXNlNjQodG1wKSl9cmV0dXJuIG91dHB1dC5qb2luKFwiXCIpfWZ1bmN0aW9uIGZyb21CeXRlQXJyYXkodWludDgpe3ZhciB0bXA7dmFyIGxlbj11aW50OC5sZW5ndGg7dmFyIGV4dHJhQnl0ZXM9bGVuJTM7dmFyIG91dHB1dD1cIlwiO3ZhciBwYXJ0cz1bXTt2YXIgbWF4Q2h1bmtMZW5ndGg9MTYzODM7Zm9yKHZhciBpPTAsbGVuMj1sZW4tZXh0cmFCeXRlcztpPGxlbjI7aSs9bWF4Q2h1bmtMZW5ndGgpe3BhcnRzLnB1c2goZW5jb2RlQ2h1bmsodWludDgsaSxpK21heENodW5rTGVuZ3RoPmxlbjI/bGVuMjppK21heENodW5rTGVuZ3RoKSl9aWYoZXh0cmFCeXRlcz09PTEpe3RtcD11aW50OFtsZW4tMV07b3V0cHV0Kz1sb29rdXBbdG1wPj4yXTtvdXRwdXQrPWxvb2t1cFt0bXA8PDQmNjNdO291dHB1dCs9XCI9PVwifWVsc2UgaWYoZXh0cmFCeXRlcz09PTIpe3RtcD0odWludDhbbGVuLTJdPDw4KSt1aW50OFtsZW4tMV07b3V0cHV0Kz1sb29rdXBbdG1wPj4xMF07b3V0cHV0Kz1sb29rdXBbdG1wPj40JjYzXTtvdXRwdXQrPWxvb2t1cFt0bXA8PDImNjNdO291dHB1dCs9XCI9XCJ9cGFydHMucHVzaChvdXRwdXQpO3JldHVybiBwYXJ0cy5qb2luKFwiXCIpfX0se31dLDM6W2Z1bmN0aW9uKHJlcXVpcmUsbW9kdWxlLGV4cG9ydHMpe30se31dLDQ6W2Z1bmN0aW9uKHJlcXVpcmUsbW9kdWxlLGV4cG9ydHMpeyhmdW5jdGlvbihnbG9iYWwpe1widXNlIHN0cmljdFwiO3ZhciBidWZmZXI9cmVxdWlyZShcImJ1ZmZlclwiKTt2YXIgQnVmZmVyPWJ1ZmZlci5CdWZmZXI7dmFyIFNsb3dCdWZmZXI9YnVmZmVyLlNsb3dCdWZmZXI7dmFyIE1BWF9MRU49YnVmZmVyLmtNYXhMZW5ndGh8fDIxNDc0ODM2NDc7ZXhwb3J0cy5hbGxvYz1mdW5jdGlvbiBhbGxvYyhzaXplLGZpbGwsZW5jb2Rpbmcpe2lmKHR5cGVvZiBCdWZmZXIuYWxsb2M9PT1cImZ1bmN0aW9uXCIpe3JldHVybiBCdWZmZXIuYWxsb2Moc2l6ZSxmaWxsLGVuY29kaW5nKX1pZih0eXBlb2YgZW5jb2Rpbmc9PT1cIm51bWJlclwiKXt0aHJvdyBuZXcgVHlwZUVycm9yKFwiZW5jb2RpbmcgbXVzdCBub3QgYmUgbnVtYmVyXCIpfWlmKHR5cGVvZiBzaXplIT09XCJudW1iZXJcIil7dGhyb3cgbmV3IFR5cGVFcnJvcihcInNpemUgbXVzdCBiZSBhIG51bWJlclwiKX1pZihzaXplPk1BWF9MRU4pe3Rocm93IG5ldyBSYW5nZUVycm9yKFwic2l6ZSBpcyB0b28gbGFyZ2VcIil9dmFyIGVuYz1lbmNvZGluZzt2YXIgX2ZpbGw9ZmlsbDtpZihfZmlsbD09PXVuZGVmaW5lZCl7ZW5jPXVuZGVmaW5lZDtfZmlsbD0wfXZhciBidWY9bmV3IEJ1ZmZlcihzaXplKTtpZih0eXBlb2YgX2ZpbGw9PT1cInN0cmluZ1wiKXt2YXIgZmlsbEJ1Zj1uZXcgQnVmZmVyKF9maWxsLGVuYyk7dmFyIGZsZW49ZmlsbEJ1Zi5sZW5ndGg7dmFyIGk9LTE7d2hpbGUoKytpPHNpemUpe2J1ZltpXT1maWxsQnVmW2klZmxlbl19fWVsc2V7YnVmLmZpbGwoX2ZpbGwpfXJldHVybiBidWZ9O2V4cG9ydHMuYWxsb2NVbnNhZmU9ZnVuY3Rpb24gYWxsb2NVbnNhZmUoc2l6ZSl7aWYodHlwZW9mIEJ1ZmZlci5hbGxvY1Vuc2FmZT09PVwiZnVuY3Rpb25cIil7cmV0dXJuIEJ1ZmZlci5hbGxvY1Vuc2FmZShzaXplKX1pZih0eXBlb2Ygc2l6ZSE9PVwibnVtYmVyXCIpe3Rocm93IG5ldyBUeXBlRXJyb3IoXCJzaXplIG11c3QgYmUgYSBudW1iZXJcIil9aWYoc2l6ZT5NQVhfTEVOKXt0aHJvdyBuZXcgUmFuZ2VFcnJvcihcInNpemUgaXMgdG9vIGxhcmdlXCIpfXJldHVybiBuZXcgQnVmZmVyKHNpemUpfTtleHBvcnRzLmZyb209ZnVuY3Rpb24gZnJvbSh2YWx1ZSxlbmNvZGluZ09yT2Zmc2V0LGxlbmd0aCl7aWYodHlwZW9mIEJ1ZmZlci5mcm9tPT09XCJmdW5jdGlvblwiJiYoIWdsb2JhbC5VaW50OEFycmF5fHxVaW50OEFycmF5LmZyb20hPT1CdWZmZXIuZnJvbSkpe3JldHVybiBCdWZmZXIuZnJvbSh2YWx1ZSxlbmNvZGluZ09yT2Zmc2V0LGxlbmd0aCl9aWYodHlwZW9mIHZhbHVlPT09XCJudW1iZXJcIil7dGhyb3cgbmV3IFR5cGVFcnJvcignXCJ2YWx1ZVwiIGFyZ3VtZW50IG11c3Qgbm90IGJlIGEgbnVtYmVyJyl9aWYodHlwZW9mIHZhbHVlPT09XCJzdHJpbmdcIil7cmV0dXJuIG5ldyBCdWZmZXIodmFsdWUsZW5jb2RpbmdPck9mZnNldCl9aWYodHlwZW9mIEFycmF5QnVmZmVyIT09XCJ1bmRlZmluZWRcIiYmdmFsdWUgaW5zdGFuY2VvZiBBcnJheUJ1ZmZlcil7dmFyIG9mZnNldD1lbmNvZGluZ09yT2Zmc2V0O2lmKGFyZ3VtZW50cy5sZW5ndGg9PT0xKXtyZXR1cm4gbmV3IEJ1ZmZlcih2YWx1ZSl9aWYodHlwZW9mIG9mZnNldD09PVwidW5kZWZpbmVkXCIpe29mZnNldD0wfXZhciBsZW49bGVuZ3RoO2lmKHR5cGVvZiBsZW49PT1cInVuZGVmaW5lZFwiKXtsZW49dmFsdWUuYnl0ZUxlbmd0aC1vZmZzZXR9aWYob2Zmc2V0Pj12YWx1ZS5ieXRlTGVuZ3RoKXt0aHJvdyBuZXcgUmFuZ2VFcnJvcihcIidvZmZzZXQnIGlzIG91dCBvZiBib3VuZHNcIil9aWYobGVuPnZhbHVlLmJ5dGVMZW5ndGgtb2Zmc2V0KXt0aHJvdyBuZXcgUmFuZ2VFcnJvcihcIidsZW5ndGgnIGlzIG91dCBvZiBib3VuZHNcIil9cmV0dXJuIG5ldyBCdWZmZXIodmFsdWUuc2xpY2Uob2Zmc2V0LG9mZnNldCtsZW4pKX1pZihCdWZmZXIuaXNCdWZmZXIodmFsdWUpKXt2YXIgb3V0PW5ldyBCdWZmZXIodmFsdWUubGVuZ3RoKTt2YWx1ZS5jb3B5KG91dCwwLDAsdmFsdWUubGVuZ3RoKTtyZXR1cm4gb3V0fWlmKHZhbHVlKXtpZihBcnJheS5pc0FycmF5KHZhbHVlKXx8dHlwZW9mIEFycmF5QnVmZmVyIT09XCJ1bmRlZmluZWRcIiYmdmFsdWUuYnVmZmVyIGluc3RhbmNlb2YgQXJyYXlCdWZmZXJ8fFwibGVuZ3RoXCJpbiB2YWx1ZSl7cmV0dXJuIG5ldyBCdWZmZXIodmFsdWUpfWlmKHZhbHVlLnR5cGU9PT1cIkJ1ZmZlclwiJiZBcnJheS5pc0FycmF5KHZhbHVlLmRhdGEpKXtyZXR1cm4gbmV3IEJ1ZmZlcih2YWx1ZS5kYXRhKX19dGhyb3cgbmV3IFR5cGVFcnJvcihcIkZpcnN0IGFyZ3VtZW50IG11c3QgYmUgYSBzdHJpbmcsIEJ1ZmZlciwgXCIrXCJBcnJheUJ1ZmZlciwgQXJyYXksIG9yIGFycmF5LWxpa2Ugb2JqZWN0LlwiKX07ZXhwb3J0cy5hbGxvY1Vuc2FmZVNsb3c9ZnVuY3Rpb24gYWxsb2NVbnNhZmVTbG93KHNpemUpe2lmKHR5cGVvZiBCdWZmZXIuYWxsb2NVbnNhZmVTbG93PT09XCJmdW5jdGlvblwiKXtyZXR1cm4gQnVmZmVyLmFsbG9jVW5zYWZlU2xvdyhzaXplKX1pZih0eXBlb2Ygc2l6ZSE9PVwibnVtYmVyXCIpe3Rocm93IG5ldyBUeXBlRXJyb3IoXCJzaXplIG11c3QgYmUgYSBudW1iZXJcIil9aWYoc2l6ZT49TUFYX0xFTil7dGhyb3cgbmV3IFJhbmdlRXJyb3IoXCJzaXplIGlzIHRvbyBsYXJnZVwiKX1yZXR1cm4gbmV3IFNsb3dCdWZmZXIoc2l6ZSl9fSkuY2FsbCh0aGlzLHR5cGVvZiBnbG9iYWwhPT1cInVuZGVmaW5lZFwiP2dsb2JhbDp0eXBlb2Ygc2VsZiE9PVwidW5kZWZpbmVkXCI/c2VsZjp0eXBlb2Ygd2luZG93IT09XCJ1bmRlZmluZWRcIj93aW5kb3c6e30pfSx7YnVmZmVyOjV9XSw1OltmdW5jdGlvbihyZXF1aXJlLG1vZHVsZSxleHBvcnRzKXsoZnVuY3Rpb24oZ2xvYmFsKXtcInVzZSBzdHJpY3RcIjt2YXIgYmFzZTY0PXJlcXVpcmUoXCJiYXNlNjQtanNcIik7dmFyIGllZWU3NTQ9cmVxdWlyZShcImllZWU3NTRcIik7dmFyIGlzQXJyYXk9cmVxdWlyZShcImlzYXJyYXlcIik7ZXhwb3J0cy5CdWZmZXI9QnVmZmVyO2V4cG9ydHMuU2xvd0J1ZmZlcj1TbG93QnVmZmVyO2V4cG9ydHMuSU5TUEVDVF9NQVhfQllURVM9NTA7QnVmZmVyLlRZUEVEX0FSUkFZX1NVUFBPUlQ9Z2xvYmFsLlRZUEVEX0FSUkFZX1NVUFBPUlQhPT11bmRlZmluZWQ/Z2xvYmFsLlRZUEVEX0FSUkFZX1NVUFBPUlQ6dHlwZWRBcnJheVN1cHBvcnQoKTtleHBvcnRzLmtNYXhMZW5ndGg9a01heExlbmd0aCgpO2Z1bmN0aW9uIHR5cGVkQXJyYXlTdXBwb3J0KCl7dHJ5e3ZhciBhcnI9bmV3IFVpbnQ4QXJyYXkoMSk7YXJyLl9fcHJvdG9fXz17X19wcm90b19fOlVpbnQ4QXJyYXkucHJvdG90eXBlLGZvbzpmdW5jdGlvbigpe3JldHVybiA0Mn19O3JldHVybiBhcnIuZm9vKCk9PT00MiYmdHlwZW9mIGFyci5zdWJhcnJheT09PVwiZnVuY3Rpb25cIiYmYXJyLnN1YmFycmF5KDEsMSkuYnl0ZUxlbmd0aD09PTB9Y2F0Y2goZSl7cmV0dXJuIGZhbHNlfX1mdW5jdGlvbiBrTWF4TGVuZ3RoKCl7cmV0dXJuIEJ1ZmZlci5UWVBFRF9BUlJBWV9TVVBQT1JUPzIxNDc0ODM2NDc6MTA3Mzc0MTgyM31mdW5jdGlvbiBjcmVhdGVCdWZmZXIodGhhdCxsZW5ndGgpe2lmKGtNYXhMZW5ndGgoKTxsZW5ndGgpe3Rocm93IG5ldyBSYW5nZUVycm9yKFwiSW52YWxpZCB0eXBlZCBhcnJheSBsZW5ndGhcIil9aWYoQnVmZmVyLlRZUEVEX0FSUkFZX1NVUFBPUlQpe3RoYXQ9bmV3IFVpbnQ4QXJyYXkobGVuZ3RoKTt0aGF0Ll9fcHJvdG9fXz1CdWZmZXIucHJvdG90eXBlfWVsc2V7aWYodGhhdD09PW51bGwpe3RoYXQ9bmV3IEJ1ZmZlcihsZW5ndGgpfXRoYXQubGVuZ3RoPWxlbmd0aH1yZXR1cm4gdGhhdH1mdW5jdGlvbiBCdWZmZXIoYXJnLGVuY29kaW5nT3JPZmZzZXQsbGVuZ3RoKXtpZighQnVmZmVyLlRZUEVEX0FSUkFZX1NVUFBPUlQmJiEodGhpcyBpbnN0YW5jZW9mIEJ1ZmZlcikpe3JldHVybiBuZXcgQnVmZmVyKGFyZyxlbmNvZGluZ09yT2Zmc2V0LGxlbmd0aCl9aWYodHlwZW9mIGFyZz09PVwibnVtYmVyXCIpe2lmKHR5cGVvZiBlbmNvZGluZ09yT2Zmc2V0PT09XCJzdHJpbmdcIil7dGhyb3cgbmV3IEVycm9yKFwiSWYgZW5jb2RpbmcgaXMgc3BlY2lmaWVkIHRoZW4gdGhlIGZpcnN0IGFyZ3VtZW50IG11c3QgYmUgYSBzdHJpbmdcIil9cmV0dXJuIGFsbG9jVW5zYWZlKHRoaXMsYXJnKX1yZXR1cm4gZnJvbSh0aGlzLGFyZyxlbmNvZGluZ09yT2Zmc2V0LGxlbmd0aCl9QnVmZmVyLnBvb2xTaXplPTgxOTI7QnVmZmVyLl9hdWdtZW50PWZ1bmN0aW9uKGFycil7YXJyLl9fcHJvdG9fXz1CdWZmZXIucHJvdG90eXBlO3JldHVybiBhcnJ9O2Z1bmN0aW9uIGZyb20odGhhdCx2YWx1ZSxlbmNvZGluZ09yT2Zmc2V0LGxlbmd0aCl7aWYodHlwZW9mIHZhbHVlPT09XCJudW1iZXJcIil7dGhyb3cgbmV3IFR5cGVFcnJvcignXCJ2YWx1ZVwiIGFyZ3VtZW50IG11c3Qgbm90IGJlIGEgbnVtYmVyJyl9aWYodHlwZW9mIEFycmF5QnVmZmVyIT09XCJ1bmRlZmluZWRcIiYmdmFsdWUgaW5zdGFuY2VvZiBBcnJheUJ1ZmZlcil7cmV0dXJuIGZyb21BcnJheUJ1ZmZlcih0aGF0LHZhbHVlLGVuY29kaW5nT3JPZmZzZXQsbGVuZ3RoKX1pZih0eXBlb2YgdmFsdWU9PT1cInN0cmluZ1wiKXtyZXR1cm4gZnJvbVN0cmluZyh0aGF0LHZhbHVlLGVuY29kaW5nT3JPZmZzZXQpfXJldHVybiBmcm9tT2JqZWN0KHRoYXQsdmFsdWUpfUJ1ZmZlci5mcm9tPWZ1bmN0aW9uKHZhbHVlLGVuY29kaW5nT3JPZmZzZXQsbGVuZ3RoKXtyZXR1cm4gZnJvbShudWxsLHZhbHVlLGVuY29kaW5nT3JPZmZzZXQsbGVuZ3RoKX07aWYoQnVmZmVyLlRZUEVEX0FSUkFZX1NVUFBPUlQpe0J1ZmZlci5wcm90b3R5cGUuX19wcm90b19fPVVpbnQ4QXJyYXkucHJvdG90eXBlO0J1ZmZlci5fX3Byb3RvX189VWludDhBcnJheTtpZih0eXBlb2YgU3ltYm9sIT09XCJ1bmRlZmluZWRcIiYmU3ltYm9sLnNwZWNpZXMmJkJ1ZmZlcltTeW1ib2wuc3BlY2llc109PT1CdWZmZXIpe09iamVjdC5kZWZpbmVQcm9wZXJ0eShCdWZmZXIsU3ltYm9sLnNwZWNpZXMse3ZhbHVlOm51bGwsY29uZmlndXJhYmxlOnRydWV9KX19ZnVuY3Rpb24gYXNzZXJ0U2l6ZShzaXplKXtpZih0eXBlb2Ygc2l6ZSE9PVwibnVtYmVyXCIpe3Rocm93IG5ldyBUeXBlRXJyb3IoJ1wic2l6ZVwiIGFyZ3VtZW50IG11c3QgYmUgYSBudW1iZXInKX1lbHNlIGlmKHNpemU8MCl7dGhyb3cgbmV3IFJhbmdlRXJyb3IoJ1wic2l6ZVwiIGFyZ3VtZW50IG11c3Qgbm90IGJlIG5lZ2F0aXZlJyl9fWZ1bmN0aW9uIGFsbG9jKHRoYXQsc2l6ZSxmaWxsLGVuY29kaW5nKXthc3NlcnRTaXplKHNpemUpO2lmKHNpemU8PTApe3JldHVybiBjcmVhdGVCdWZmZXIodGhhdCxzaXplKX1pZihmaWxsIT09dW5kZWZpbmVkKXtyZXR1cm4gdHlwZW9mIGVuY29kaW5nPT09XCJzdHJpbmdcIj9jcmVhdGVCdWZmZXIodGhhdCxzaXplKS5maWxsKGZpbGwsZW5jb2RpbmcpOmNyZWF0ZUJ1ZmZlcih0aGF0LHNpemUpLmZpbGwoZmlsbCl9cmV0dXJuIGNyZWF0ZUJ1ZmZlcih0aGF0LHNpemUpfUJ1ZmZlci5hbGxvYz1mdW5jdGlvbihzaXplLGZpbGwsZW5jb2Rpbmcpe3JldHVybiBhbGxvYyhudWxsLHNpemUsZmlsbCxlbmNvZGluZyl9O2Z1bmN0aW9uIGFsbG9jVW5zYWZlKHRoYXQsc2l6ZSl7YXNzZXJ0U2l6ZShzaXplKTt0aGF0PWNyZWF0ZUJ1ZmZlcih0aGF0LHNpemU8MD8wOmNoZWNrZWQoc2l6ZSl8MCk7aWYoIUJ1ZmZlci5UWVBFRF9BUlJBWV9TVVBQT1JUKXtmb3IodmFyIGk9MDtpPHNpemU7KytpKXt0aGF0W2ldPTB9fXJldHVybiB0aGF0fUJ1ZmZlci5hbGxvY1Vuc2FmZT1mdW5jdGlvbihzaXplKXtyZXR1cm4gYWxsb2NVbnNhZmUobnVsbCxzaXplKX07QnVmZmVyLmFsbG9jVW5zYWZlU2xvdz1mdW5jdGlvbihzaXplKXtyZXR1cm4gYWxsb2NVbnNhZmUobnVsbCxzaXplKX07ZnVuY3Rpb24gZnJvbVN0cmluZyh0aGF0LHN0cmluZyxlbmNvZGluZyl7aWYodHlwZW9mIGVuY29kaW5nIT09XCJzdHJpbmdcInx8ZW5jb2Rpbmc9PT1cIlwiKXtlbmNvZGluZz1cInV0ZjhcIn1pZighQnVmZmVyLmlzRW5jb2RpbmcoZW5jb2RpbmcpKXt0aHJvdyBuZXcgVHlwZUVycm9yKCdcImVuY29kaW5nXCIgbXVzdCBiZSBhIHZhbGlkIHN0cmluZyBlbmNvZGluZycpfXZhciBsZW5ndGg9Ynl0ZUxlbmd0aChzdHJpbmcsZW5jb2RpbmcpfDA7dGhhdD1jcmVhdGVCdWZmZXIodGhhdCxsZW5ndGgpO3ZhciBhY3R1YWw9dGhhdC53cml0ZShzdHJpbmcsZW5jb2RpbmcpO2lmKGFjdHVhbCE9PWxlbmd0aCl7dGhhdD10aGF0LnNsaWNlKDAsYWN0dWFsKX1yZXR1cm4gdGhhdH1mdW5jdGlvbiBmcm9tQXJyYXlMaWtlKHRoYXQsYXJyYXkpe3ZhciBsZW5ndGg9YXJyYXkubGVuZ3RoPDA/MDpjaGVja2VkKGFycmF5Lmxlbmd0aCl8MDt0aGF0PWNyZWF0ZUJ1ZmZlcih0aGF0LGxlbmd0aCk7Zm9yKHZhciBpPTA7aTxsZW5ndGg7aSs9MSl7dGhhdFtpXT1hcnJheVtpXSYyNTV9cmV0dXJuIHRoYXR9ZnVuY3Rpb24gZnJvbUFycmF5QnVmZmVyKHRoYXQsYXJyYXksYnl0ZU9mZnNldCxsZW5ndGgpe2FycmF5LmJ5dGVMZW5ndGg7aWYoYnl0ZU9mZnNldDwwfHxhcnJheS5ieXRlTGVuZ3RoPGJ5dGVPZmZzZXQpe3Rocm93IG5ldyBSYW5nZUVycm9yKFwiJ29mZnNldCcgaXMgb3V0IG9mIGJvdW5kc1wiKX1pZihhcnJheS5ieXRlTGVuZ3RoPGJ5dGVPZmZzZXQrKGxlbmd0aHx8MCkpe3Rocm93IG5ldyBSYW5nZUVycm9yKFwiJ2xlbmd0aCcgaXMgb3V0IG9mIGJvdW5kc1wiKX1pZihieXRlT2Zmc2V0PT09dW5kZWZpbmVkJiZsZW5ndGg9PT11bmRlZmluZWQpe2FycmF5PW5ldyBVaW50OEFycmF5KGFycmF5KX1lbHNlIGlmKGxlbmd0aD09PXVuZGVmaW5lZCl7YXJyYXk9bmV3IFVpbnQ4QXJyYXkoYXJyYXksYnl0ZU9mZnNldCl9ZWxzZXthcnJheT1uZXcgVWludDhBcnJheShhcnJheSxieXRlT2Zmc2V0LGxlbmd0aCl9aWYoQnVmZmVyLlRZUEVEX0FSUkFZX1NVUFBPUlQpe3RoYXQ9YXJyYXk7dGhhdC5fX3Byb3RvX189QnVmZmVyLnByb3RvdHlwZX1lbHNle3RoYXQ9ZnJvbUFycmF5TGlrZSh0aGF0LGFycmF5KX1yZXR1cm4gdGhhdH1mdW5jdGlvbiBmcm9tT2JqZWN0KHRoYXQsb2JqKXtpZihCdWZmZXIuaXNCdWZmZXIob2JqKSl7dmFyIGxlbj1jaGVja2VkKG9iai5sZW5ndGgpfDA7dGhhdD1jcmVhdGVCdWZmZXIodGhhdCxsZW4pO2lmKHRoYXQubGVuZ3RoPT09MCl7cmV0dXJuIHRoYXR9b2JqLmNvcHkodGhhdCwwLDAsbGVuKTtyZXR1cm4gdGhhdH1pZihvYmope2lmKHR5cGVvZiBBcnJheUJ1ZmZlciE9PVwidW5kZWZpbmVkXCImJm9iai5idWZmZXIgaW5zdGFuY2VvZiBBcnJheUJ1ZmZlcnx8XCJsZW5ndGhcImluIG9iail7aWYodHlwZW9mIG9iai5sZW5ndGghPT1cIm51bWJlclwifHxpc25hbihvYmoubGVuZ3RoKSl7cmV0dXJuIGNyZWF0ZUJ1ZmZlcih0aGF0LDApfXJldHVybiBmcm9tQXJyYXlMaWtlKHRoYXQsb2JqKX1pZihvYmoudHlwZT09PVwiQnVmZmVyXCImJmlzQXJyYXkob2JqLmRhdGEpKXtyZXR1cm4gZnJvbUFycmF5TGlrZSh0aGF0LG9iai5kYXRhKX19dGhyb3cgbmV3IFR5cGVFcnJvcihcIkZpcnN0IGFyZ3VtZW50IG11c3QgYmUgYSBzdHJpbmcsIEJ1ZmZlciwgQXJyYXlCdWZmZXIsIEFycmF5LCBvciBhcnJheS1saWtlIG9iamVjdC5cIil9ZnVuY3Rpb24gY2hlY2tlZChsZW5ndGgpe2lmKGxlbmd0aD49a01heExlbmd0aCgpKXt0aHJvdyBuZXcgUmFuZ2VFcnJvcihcIkF0dGVtcHQgdG8gYWxsb2NhdGUgQnVmZmVyIGxhcmdlciB0aGFuIG1heGltdW0gXCIrXCJzaXplOiAweFwiK2tNYXhMZW5ndGgoKS50b1N0cmluZygxNikrXCIgYnl0ZXNcIil9cmV0dXJuIGxlbmd0aHwwfWZ1bmN0aW9uIFNsb3dCdWZmZXIobGVuZ3RoKXtpZigrbGVuZ3RoIT1sZW5ndGgpe2xlbmd0aD0wfXJldHVybiBCdWZmZXIuYWxsb2MoK2xlbmd0aCl9QnVmZmVyLmlzQnVmZmVyPWZ1bmN0aW9uIGlzQnVmZmVyKGIpe3JldHVybiEhKGIhPW51bGwmJmIuX2lzQnVmZmVyKX07QnVmZmVyLmNvbXBhcmU9ZnVuY3Rpb24gY29tcGFyZShhLGIpe2lmKCFCdWZmZXIuaXNCdWZmZXIoYSl8fCFCdWZmZXIuaXNCdWZmZXIoYikpe3Rocm93IG5ldyBUeXBlRXJyb3IoXCJBcmd1bWVudHMgbXVzdCBiZSBCdWZmZXJzXCIpfWlmKGE9PT1iKXJldHVybiAwO3ZhciB4PWEubGVuZ3RoO3ZhciB5PWIubGVuZ3RoO2Zvcih2YXIgaT0wLGxlbj1NYXRoLm1pbih4LHkpO2k8bGVuOysraSl7aWYoYVtpXSE9PWJbaV0pe3g9YVtpXTt5PWJbaV07YnJlYWt9fWlmKHg8eSlyZXR1cm4tMTtpZih5PHgpcmV0dXJuIDE7cmV0dXJuIDB9O0J1ZmZlci5pc0VuY29kaW5nPWZ1bmN0aW9uIGlzRW5jb2RpbmcoZW5jb2Rpbmcpe3N3aXRjaChTdHJpbmcoZW5jb2RpbmcpLnRvTG93ZXJDYXNlKCkpe2Nhc2VcImhleFwiOmNhc2VcInV0ZjhcIjpjYXNlXCJ1dGYtOFwiOmNhc2VcImFzY2lpXCI6Y2FzZVwibGF0aW4xXCI6Y2FzZVwiYmluYXJ5XCI6Y2FzZVwiYmFzZTY0XCI6Y2FzZVwidWNzMlwiOmNhc2VcInVjcy0yXCI6Y2FzZVwidXRmMTZsZVwiOmNhc2VcInV0Zi0xNmxlXCI6cmV0dXJuIHRydWU7ZGVmYXVsdDpyZXR1cm4gZmFsc2V9fTtCdWZmZXIuY29uY2F0PWZ1bmN0aW9uIGNvbmNhdChsaXN0LGxlbmd0aCl7aWYoIWlzQXJyYXkobGlzdCkpe3Rocm93IG5ldyBUeXBlRXJyb3IoJ1wibGlzdFwiIGFyZ3VtZW50IG11c3QgYmUgYW4gQXJyYXkgb2YgQnVmZmVycycpfWlmKGxpc3QubGVuZ3RoPT09MCl7cmV0dXJuIEJ1ZmZlci5hbGxvYygwKX12YXIgaTtpZihsZW5ndGg9PT11bmRlZmluZWQpe2xlbmd0aD0wO2ZvcihpPTA7aTxsaXN0Lmxlbmd0aDsrK2kpe2xlbmd0aCs9bGlzdFtpXS5sZW5ndGh9fXZhciBidWZmZXI9QnVmZmVyLmFsbG9jVW5zYWZlKGxlbmd0aCk7dmFyIHBvcz0wO2ZvcihpPTA7aTxsaXN0Lmxlbmd0aDsrK2kpe3ZhciBidWY9bGlzdFtpXTtpZighQnVmZmVyLmlzQnVmZmVyKGJ1Zikpe3Rocm93IG5ldyBUeXBlRXJyb3IoJ1wibGlzdFwiIGFyZ3VtZW50IG11c3QgYmUgYW4gQXJyYXkgb2YgQnVmZmVycycpfWJ1Zi5jb3B5KGJ1ZmZlcixwb3MpO3Bvcys9YnVmLmxlbmd0aH1yZXR1cm4gYnVmZmVyfTtmdW5jdGlvbiBieXRlTGVuZ3RoKHN0cmluZyxlbmNvZGluZyl7aWYoQnVmZmVyLmlzQnVmZmVyKHN0cmluZykpe3JldHVybiBzdHJpbmcubGVuZ3RofWlmKHR5cGVvZiBBcnJheUJ1ZmZlciE9PVwidW5kZWZpbmVkXCImJnR5cGVvZiBBcnJheUJ1ZmZlci5pc1ZpZXc9PT1cImZ1bmN0aW9uXCImJihBcnJheUJ1ZmZlci5pc1ZpZXcoc3RyaW5nKXx8c3RyaW5nIGluc3RhbmNlb2YgQXJyYXlCdWZmZXIpKXtyZXR1cm4gc3RyaW5nLmJ5dGVMZW5ndGh9aWYodHlwZW9mIHN0cmluZyE9PVwic3RyaW5nXCIpe3N0cmluZz1cIlwiK3N0cmluZ312YXIgbGVuPXN0cmluZy5sZW5ndGg7aWYobGVuPT09MClyZXR1cm4gMDt2YXIgbG93ZXJlZENhc2U9ZmFsc2U7Zm9yKDs7KXtzd2l0Y2goZW5jb2Rpbmcpe2Nhc2VcImFzY2lpXCI6Y2FzZVwibGF0aW4xXCI6Y2FzZVwiYmluYXJ5XCI6cmV0dXJuIGxlbjtjYXNlXCJ1dGY4XCI6Y2FzZVwidXRmLThcIjpjYXNlIHVuZGVmaW5lZDpyZXR1cm4gdXRmOFRvQnl0ZXMoc3RyaW5nKS5sZW5ndGg7Y2FzZVwidWNzMlwiOmNhc2VcInVjcy0yXCI6Y2FzZVwidXRmMTZsZVwiOmNhc2VcInV0Zi0xNmxlXCI6cmV0dXJuIGxlbioyO2Nhc2VcImhleFwiOnJldHVybiBsZW4+Pj4xO2Nhc2VcImJhc2U2NFwiOnJldHVybiBiYXNlNjRUb0J5dGVzKHN0cmluZykubGVuZ3RoO2RlZmF1bHQ6aWYobG93ZXJlZENhc2UpcmV0dXJuIHV0ZjhUb0J5dGVzKHN0cmluZykubGVuZ3RoO2VuY29kaW5nPShcIlwiK2VuY29kaW5nKS50b0xvd2VyQ2FzZSgpO2xvd2VyZWRDYXNlPXRydWV9fX1CdWZmZXIuYnl0ZUxlbmd0aD1ieXRlTGVuZ3RoO2Z1bmN0aW9uIHNsb3dUb1N0cmluZyhlbmNvZGluZyxzdGFydCxlbmQpe3ZhciBsb3dlcmVkQ2FzZT1mYWxzZTtpZihzdGFydD09PXVuZGVmaW5lZHx8c3RhcnQ8MCl7c3RhcnQ9MH1pZihzdGFydD50aGlzLmxlbmd0aCl7cmV0dXJuXCJcIn1pZihlbmQ9PT11bmRlZmluZWR8fGVuZD50aGlzLmxlbmd0aCl7ZW5kPXRoaXMubGVuZ3RofWlmKGVuZDw9MCl7cmV0dXJuXCJcIn1lbmQ+Pj49MDtzdGFydD4+Pj0wO2lmKGVuZDw9c3RhcnQpe3JldHVyblwiXCJ9aWYoIWVuY29kaW5nKWVuY29kaW5nPVwidXRmOFwiO3doaWxlKHRydWUpe3N3aXRjaChlbmNvZGluZyl7Y2FzZVwiaGV4XCI6cmV0dXJuIGhleFNsaWNlKHRoaXMsc3RhcnQsZW5kKTtjYXNlXCJ1dGY4XCI6Y2FzZVwidXRmLThcIjpyZXR1cm4gdXRmOFNsaWNlKHRoaXMsc3RhcnQsZW5kKTtjYXNlXCJhc2NpaVwiOnJldHVybiBhc2NpaVNsaWNlKHRoaXMsc3RhcnQsZW5kKTtjYXNlXCJsYXRpbjFcIjpjYXNlXCJiaW5hcnlcIjpyZXR1cm4gbGF0aW4xU2xpY2UodGhpcyxzdGFydCxlbmQpO2Nhc2VcImJhc2U2NFwiOnJldHVybiBiYXNlNjRTbGljZSh0aGlzLHN0YXJ0LGVuZCk7Y2FzZVwidWNzMlwiOmNhc2VcInVjcy0yXCI6Y2FzZVwidXRmMTZsZVwiOmNhc2VcInV0Zi0xNmxlXCI6cmV0dXJuIHV0ZjE2bGVTbGljZSh0aGlzLHN0YXJ0LGVuZCk7ZGVmYXVsdDppZihsb3dlcmVkQ2FzZSl0aHJvdyBuZXcgVHlwZUVycm9yKFwiVW5rbm93biBlbmNvZGluZzogXCIrZW5jb2RpbmcpO2VuY29kaW5nPShlbmNvZGluZytcIlwiKS50b0xvd2VyQ2FzZSgpO2xvd2VyZWRDYXNlPXRydWV9fX1CdWZmZXIucHJvdG90eXBlLl9pc0J1ZmZlcj10cnVlO2Z1bmN0aW9uIHN3YXAoYixuLG0pe3ZhciBpPWJbbl07YltuXT1iW21dO2JbbV09aX1CdWZmZXIucHJvdG90eXBlLnN3YXAxNj1mdW5jdGlvbiBzd2FwMTYoKXt2YXIgbGVuPXRoaXMubGVuZ3RoO2lmKGxlbiUyIT09MCl7dGhyb3cgbmV3IFJhbmdlRXJyb3IoXCJCdWZmZXIgc2l6ZSBtdXN0IGJlIGEgbXVsdGlwbGUgb2YgMTYtYml0c1wiKX1mb3IodmFyIGk9MDtpPGxlbjtpKz0yKXtzd2FwKHRoaXMsaSxpKzEpfXJldHVybiB0aGlzfTtCdWZmZXIucHJvdG90eXBlLnN3YXAzMj1mdW5jdGlvbiBzd2FwMzIoKXt2YXIgbGVuPXRoaXMubGVuZ3RoO2lmKGxlbiU0IT09MCl7dGhyb3cgbmV3IFJhbmdlRXJyb3IoXCJCdWZmZXIgc2l6ZSBtdXN0IGJlIGEgbXVsdGlwbGUgb2YgMzItYml0c1wiKX1mb3IodmFyIGk9MDtpPGxlbjtpKz00KXtzd2FwKHRoaXMsaSxpKzMpO3N3YXAodGhpcyxpKzEsaSsyKX1yZXR1cm4gdGhpc307QnVmZmVyLnByb3RvdHlwZS5zd2FwNjQ9ZnVuY3Rpb24gc3dhcDY0KCl7dmFyIGxlbj10aGlzLmxlbmd0aDtpZihsZW4lOCE9PTApe3Rocm93IG5ldyBSYW5nZUVycm9yKFwiQnVmZmVyIHNpemUgbXVzdCBiZSBhIG11bHRpcGxlIG9mIDY0LWJpdHNcIil9Zm9yKHZhciBpPTA7aTxsZW47aSs9OCl7c3dhcCh0aGlzLGksaSs3KTtzd2FwKHRoaXMsaSsxLGkrNik7c3dhcCh0aGlzLGkrMixpKzUpO3N3YXAodGhpcyxpKzMsaSs0KX1yZXR1cm4gdGhpc307QnVmZmVyLnByb3RvdHlwZS50b1N0cmluZz1mdW5jdGlvbiB0b1N0cmluZygpe3ZhciBsZW5ndGg9dGhpcy5sZW5ndGh8MDtpZihsZW5ndGg9PT0wKXJldHVyblwiXCI7aWYoYXJndW1lbnRzLmxlbmd0aD09PTApcmV0dXJuIHV0ZjhTbGljZSh0aGlzLDAsbGVuZ3RoKTtyZXR1cm4gc2xvd1RvU3RyaW5nLmFwcGx5KHRoaXMsYXJndW1lbnRzKX07QnVmZmVyLnByb3RvdHlwZS5lcXVhbHM9ZnVuY3Rpb24gZXF1YWxzKGIpe2lmKCFCdWZmZXIuaXNCdWZmZXIoYikpdGhyb3cgbmV3IFR5cGVFcnJvcihcIkFyZ3VtZW50IG11c3QgYmUgYSBCdWZmZXJcIik7aWYodGhpcz09PWIpcmV0dXJuIHRydWU7cmV0dXJuIEJ1ZmZlci5jb21wYXJlKHRoaXMsYik9PT0wfTtCdWZmZXIucHJvdG90eXBlLmluc3BlY3Q9ZnVuY3Rpb24gaW5zcGVjdCgpe3ZhciBzdHI9XCJcIjt2YXIgbWF4PWV4cG9ydHMuSU5TUEVDVF9NQVhfQllURVM7aWYodGhpcy5sZW5ndGg+MCl7c3RyPXRoaXMudG9TdHJpbmcoXCJoZXhcIiwwLG1heCkubWF0Y2goLy57Mn0vZykuam9pbihcIiBcIik7aWYodGhpcy5sZW5ndGg+bWF4KXN0cis9XCIgLi4uIFwifXJldHVyblwiPEJ1ZmZlciBcIitzdHIrXCI+XCJ9O0J1ZmZlci5wcm90b3R5cGUuY29tcGFyZT1mdW5jdGlvbiBjb21wYXJlKHRhcmdldCxzdGFydCxlbmQsdGhpc1N0YXJ0LHRoaXNFbmQpe2lmKCFCdWZmZXIuaXNCdWZmZXIodGFyZ2V0KSl7dGhyb3cgbmV3IFR5cGVFcnJvcihcIkFyZ3VtZW50IG11c3QgYmUgYSBCdWZmZXJcIil9aWYoc3RhcnQ9PT11bmRlZmluZWQpe3N0YXJ0PTB9aWYoZW5kPT09dW5kZWZpbmVkKXtlbmQ9dGFyZ2V0P3RhcmdldC5sZW5ndGg6MH1pZih0aGlzU3RhcnQ9PT11bmRlZmluZWQpe3RoaXNTdGFydD0wfWlmKHRoaXNFbmQ9PT11bmRlZmluZWQpe3RoaXNFbmQ9dGhpcy5sZW5ndGh9aWYoc3RhcnQ8MHx8ZW5kPnRhcmdldC5sZW5ndGh8fHRoaXNTdGFydDwwfHx0aGlzRW5kPnRoaXMubGVuZ3RoKXt0aHJvdyBuZXcgUmFuZ2VFcnJvcihcIm91dCBvZiByYW5nZSBpbmRleFwiKX1pZih0aGlzU3RhcnQ+PXRoaXNFbmQmJnN0YXJ0Pj1lbmQpe3JldHVybiAwfWlmKHRoaXNTdGFydD49dGhpc0VuZCl7cmV0dXJuLTF9aWYoc3RhcnQ+PWVuZCl7cmV0dXJuIDF9c3RhcnQ+Pj49MDtlbmQ+Pj49MDt0aGlzU3RhcnQ+Pj49MDt0aGlzRW5kPj4+PTA7aWYodGhpcz09PXRhcmdldClyZXR1cm4gMDt2YXIgeD10aGlzRW5kLXRoaXNTdGFydDt2YXIgeT1lbmQtc3RhcnQ7dmFyIGxlbj1NYXRoLm1pbih4LHkpO3ZhciB0aGlzQ29weT10aGlzLnNsaWNlKHRoaXNTdGFydCx0aGlzRW5kKTt2YXIgdGFyZ2V0Q29weT10YXJnZXQuc2xpY2Uoc3RhcnQsZW5kKTtmb3IodmFyIGk9MDtpPGxlbjsrK2kpe2lmKHRoaXNDb3B5W2ldIT09dGFyZ2V0Q29weVtpXSl7eD10aGlzQ29weVtpXTt5PXRhcmdldENvcHlbaV07YnJlYWt9fWlmKHg8eSlyZXR1cm4tMTtpZih5PHgpcmV0dXJuIDE7cmV0dXJuIDB9O2Z1bmN0aW9uIGJpZGlyZWN0aW9uYWxJbmRleE9mKGJ1ZmZlcix2YWwsYnl0ZU9mZnNldCxlbmNvZGluZyxkaXIpe2lmKGJ1ZmZlci5sZW5ndGg9PT0wKXJldHVybi0xO2lmKHR5cGVvZiBieXRlT2Zmc2V0PT09XCJzdHJpbmdcIil7ZW5jb2Rpbmc9Ynl0ZU9mZnNldDtieXRlT2Zmc2V0PTB9ZWxzZSBpZihieXRlT2Zmc2V0PjIxNDc0ODM2NDcpe2J5dGVPZmZzZXQ9MjE0NzQ4MzY0N31lbHNlIGlmKGJ5dGVPZmZzZXQ8LTIxNDc0ODM2NDgpe2J5dGVPZmZzZXQ9LTIxNDc0ODM2NDh9Ynl0ZU9mZnNldD0rYnl0ZU9mZnNldDtpZihpc05hTihieXRlT2Zmc2V0KSl7Ynl0ZU9mZnNldD1kaXI/MDpidWZmZXIubGVuZ3RoLTF9aWYoYnl0ZU9mZnNldDwwKWJ5dGVPZmZzZXQ9YnVmZmVyLmxlbmd0aCtieXRlT2Zmc2V0O2lmKGJ5dGVPZmZzZXQ+PWJ1ZmZlci5sZW5ndGgpe2lmKGRpcilyZXR1cm4tMTtlbHNlIGJ5dGVPZmZzZXQ9YnVmZmVyLmxlbmd0aC0xfWVsc2UgaWYoYnl0ZU9mZnNldDwwKXtpZihkaXIpYnl0ZU9mZnNldD0wO2Vsc2UgcmV0dXJuLTF9aWYodHlwZW9mIHZhbD09PVwic3RyaW5nXCIpe3ZhbD1CdWZmZXIuZnJvbSh2YWwsZW5jb2RpbmcpfWlmKEJ1ZmZlci5pc0J1ZmZlcih2YWwpKXtpZih2YWwubGVuZ3RoPT09MCl7cmV0dXJuLTF9cmV0dXJuIGFycmF5SW5kZXhPZihidWZmZXIsdmFsLGJ5dGVPZmZzZXQsZW5jb2RpbmcsZGlyKX1lbHNlIGlmKHR5cGVvZiB2YWw9PT1cIm51bWJlclwiKXt2YWw9dmFsJjI1NTtpZihCdWZmZXIuVFlQRURfQVJSQVlfU1VQUE9SVCYmdHlwZW9mIFVpbnQ4QXJyYXkucHJvdG90eXBlLmluZGV4T2Y9PT1cImZ1bmN0aW9uXCIpe2lmKGRpcil7cmV0dXJuIFVpbnQ4QXJyYXkucHJvdG90eXBlLmluZGV4T2YuY2FsbChidWZmZXIsdmFsLGJ5dGVPZmZzZXQpfWVsc2V7cmV0dXJuIFVpbnQ4QXJyYXkucHJvdG90eXBlLmxhc3RJbmRleE9mLmNhbGwoYnVmZmVyLHZhbCxieXRlT2Zmc2V0KX19cmV0dXJuIGFycmF5SW5kZXhPZihidWZmZXIsW3ZhbF0sYnl0ZU9mZnNldCxlbmNvZGluZyxkaXIpfXRocm93IG5ldyBUeXBlRXJyb3IoXCJ2YWwgbXVzdCBiZSBzdHJpbmcsIG51bWJlciBvciBCdWZmZXJcIil9ZnVuY3Rpb24gYXJyYXlJbmRleE9mKGFycix2YWwsYnl0ZU9mZnNldCxlbmNvZGluZyxkaXIpe3ZhciBpbmRleFNpemU9MTt2YXIgYXJyTGVuZ3RoPWFyci5sZW5ndGg7dmFyIHZhbExlbmd0aD12YWwubGVuZ3RoO2lmKGVuY29kaW5nIT09dW5kZWZpbmVkKXtlbmNvZGluZz1TdHJpbmcoZW5jb2RpbmcpLnRvTG93ZXJDYXNlKCk7aWYoZW5jb2Rpbmc9PT1cInVjczJcInx8ZW5jb2Rpbmc9PT1cInVjcy0yXCJ8fGVuY29kaW5nPT09XCJ1dGYxNmxlXCJ8fGVuY29kaW5nPT09XCJ1dGYtMTZsZVwiKXtpZihhcnIubGVuZ3RoPDJ8fHZhbC5sZW5ndGg8Mil7cmV0dXJuLTF9aW5kZXhTaXplPTI7YXJyTGVuZ3RoLz0yO3ZhbExlbmd0aC89MjtieXRlT2Zmc2V0Lz0yfX1mdW5jdGlvbiByZWFkKGJ1ZixpKXtpZihpbmRleFNpemU9PT0xKXtyZXR1cm4gYnVmW2ldfWVsc2V7cmV0dXJuIGJ1Zi5yZWFkVUludDE2QkUoaSppbmRleFNpemUpfX12YXIgaTtpZihkaXIpe3ZhciBmb3VuZEluZGV4PS0xO2ZvcihpPWJ5dGVPZmZzZXQ7aTxhcnJMZW5ndGg7aSsrKXtpZihyZWFkKGFycixpKT09PXJlYWQodmFsLGZvdW5kSW5kZXg9PT0tMT8wOmktZm91bmRJbmRleCkpe2lmKGZvdW5kSW5kZXg9PT0tMSlmb3VuZEluZGV4PWk7aWYoaS1mb3VuZEluZGV4KzE9PT12YWxMZW5ndGgpcmV0dXJuIGZvdW5kSW5kZXgqaW5kZXhTaXplfWVsc2V7aWYoZm91bmRJbmRleCE9PS0xKWktPWktZm91bmRJbmRleDtmb3VuZEluZGV4PS0xfX19ZWxzZXtpZihieXRlT2Zmc2V0K3ZhbExlbmd0aD5hcnJMZW5ndGgpYnl0ZU9mZnNldD1hcnJMZW5ndGgtdmFsTGVuZ3RoO2ZvcihpPWJ5dGVPZmZzZXQ7aT49MDtpLS0pe3ZhciBmb3VuZD10cnVlO2Zvcih2YXIgaj0wO2o8dmFsTGVuZ3RoO2orKyl7aWYocmVhZChhcnIsaStqKSE9PXJlYWQodmFsLGopKXtmb3VuZD1mYWxzZTticmVha319aWYoZm91bmQpcmV0dXJuIGl9fXJldHVybi0xfUJ1ZmZlci5wcm90b3R5cGUuaW5jbHVkZXM9ZnVuY3Rpb24gaW5jbHVkZXModmFsLGJ5dGVPZmZzZXQsZW5jb2Rpbmcpe3JldHVybiB0aGlzLmluZGV4T2YodmFsLGJ5dGVPZmZzZXQsZW5jb2RpbmcpIT09LTF9O0J1ZmZlci5wcm90b3R5cGUuaW5kZXhPZj1mdW5jdGlvbiBpbmRleE9mKHZhbCxieXRlT2Zmc2V0LGVuY29kaW5nKXtyZXR1cm4gYmlkaXJlY3Rpb25hbEluZGV4T2YodGhpcyx2YWwsYnl0ZU9mZnNldCxlbmNvZGluZyx0cnVlKX07QnVmZmVyLnByb3RvdHlwZS5sYXN0SW5kZXhPZj1mdW5jdGlvbiBsYXN0SW5kZXhPZih2YWwsYnl0ZU9mZnNldCxlbmNvZGluZyl7cmV0dXJuIGJpZGlyZWN0aW9uYWxJbmRleE9mKHRoaXMsdmFsLGJ5dGVPZmZzZXQsZW5jb2RpbmcsZmFsc2UpfTtmdW5jdGlvbiBoZXhXcml0ZShidWYsc3RyaW5nLG9mZnNldCxsZW5ndGgpe29mZnNldD1OdW1iZXIob2Zmc2V0KXx8MDt2YXIgcmVtYWluaW5nPWJ1Zi5sZW5ndGgtb2Zmc2V0O2lmKCFsZW5ndGgpe2xlbmd0aD1yZW1haW5pbmd9ZWxzZXtsZW5ndGg9TnVtYmVyKGxlbmd0aCk7aWYobGVuZ3RoPnJlbWFpbmluZyl7bGVuZ3RoPXJlbWFpbmluZ319dmFyIHN0ckxlbj1zdHJpbmcubGVuZ3RoO2lmKHN0ckxlbiUyIT09MCl0aHJvdyBuZXcgVHlwZUVycm9yKFwiSW52YWxpZCBoZXggc3RyaW5nXCIpO2lmKGxlbmd0aD5zdHJMZW4vMil7bGVuZ3RoPXN0ckxlbi8yfWZvcih2YXIgaT0wO2k8bGVuZ3RoOysraSl7dmFyIHBhcnNlZD1wYXJzZUludChzdHJpbmcuc3Vic3RyKGkqMiwyKSwxNik7aWYoaXNOYU4ocGFyc2VkKSlyZXR1cm4gaTtidWZbb2Zmc2V0K2ldPXBhcnNlZH1yZXR1cm4gaX1mdW5jdGlvbiB1dGY4V3JpdGUoYnVmLHN0cmluZyxvZmZzZXQsbGVuZ3RoKXtyZXR1cm4gYmxpdEJ1ZmZlcih1dGY4VG9CeXRlcyhzdHJpbmcsYnVmLmxlbmd0aC1vZmZzZXQpLGJ1ZixvZmZzZXQsbGVuZ3RoKX1mdW5jdGlvbiBhc2NpaVdyaXRlKGJ1ZixzdHJpbmcsb2Zmc2V0LGxlbmd0aCl7cmV0dXJuIGJsaXRCdWZmZXIoYXNjaWlUb0J5dGVzKHN0cmluZyksYnVmLG9mZnNldCxsZW5ndGgpfWZ1bmN0aW9uIGxhdGluMVdyaXRlKGJ1ZixzdHJpbmcsb2Zmc2V0LGxlbmd0aCl7cmV0dXJuIGFzY2lpV3JpdGUoYnVmLHN0cmluZyxvZmZzZXQsbGVuZ3RoKX1mdW5jdGlvbiBiYXNlNjRXcml0ZShidWYsc3RyaW5nLG9mZnNldCxsZW5ndGgpe3JldHVybiBibGl0QnVmZmVyKGJhc2U2NFRvQnl0ZXMoc3RyaW5nKSxidWYsb2Zmc2V0LGxlbmd0aCl9ZnVuY3Rpb24gdWNzMldyaXRlKGJ1ZixzdHJpbmcsb2Zmc2V0LGxlbmd0aCl7cmV0dXJuIGJsaXRCdWZmZXIodXRmMTZsZVRvQnl0ZXMoc3RyaW5nLGJ1Zi5sZW5ndGgtb2Zmc2V0KSxidWYsb2Zmc2V0LGxlbmd0aCl9QnVmZmVyLnByb3RvdHlwZS53cml0ZT1mdW5jdGlvbiB3cml0ZShzdHJpbmcsb2Zmc2V0LGxlbmd0aCxlbmNvZGluZyl7aWYob2Zmc2V0PT09dW5kZWZpbmVkKXtlbmNvZGluZz1cInV0ZjhcIjtsZW5ndGg9dGhpcy5sZW5ndGg7b2Zmc2V0PTB9ZWxzZSBpZihsZW5ndGg9PT11bmRlZmluZWQmJnR5cGVvZiBvZmZzZXQ9PT1cInN0cmluZ1wiKXtlbmNvZGluZz1vZmZzZXQ7bGVuZ3RoPXRoaXMubGVuZ3RoO29mZnNldD0wfWVsc2UgaWYoaXNGaW5pdGUob2Zmc2V0KSl7b2Zmc2V0PW9mZnNldHwwO2lmKGlzRmluaXRlKGxlbmd0aCkpe2xlbmd0aD1sZW5ndGh8MDtpZihlbmNvZGluZz09PXVuZGVmaW5lZCllbmNvZGluZz1cInV0ZjhcIn1lbHNle2VuY29kaW5nPWxlbmd0aDtsZW5ndGg9dW5kZWZpbmVkfX1lbHNle3Rocm93IG5ldyBFcnJvcihcIkJ1ZmZlci53cml0ZShzdHJpbmcsIGVuY29kaW5nLCBvZmZzZXRbLCBsZW5ndGhdKSBpcyBubyBsb25nZXIgc3VwcG9ydGVkXCIpfXZhciByZW1haW5pbmc9dGhpcy5sZW5ndGgtb2Zmc2V0O2lmKGxlbmd0aD09PXVuZGVmaW5lZHx8bGVuZ3RoPnJlbWFpbmluZylsZW5ndGg9cmVtYWluaW5nO2lmKHN0cmluZy5sZW5ndGg+MCYmKGxlbmd0aDwwfHxvZmZzZXQ8MCl8fG9mZnNldD50aGlzLmxlbmd0aCl7dGhyb3cgbmV3IFJhbmdlRXJyb3IoXCJBdHRlbXB0IHRvIHdyaXRlIG91dHNpZGUgYnVmZmVyIGJvdW5kc1wiKX1pZighZW5jb2RpbmcpZW5jb2Rpbmc9XCJ1dGY4XCI7dmFyIGxvd2VyZWRDYXNlPWZhbHNlO2Zvcig7Oyl7c3dpdGNoKGVuY29kaW5nKXtjYXNlXCJoZXhcIjpyZXR1cm4gaGV4V3JpdGUodGhpcyxzdHJpbmcsb2Zmc2V0LGxlbmd0aCk7Y2FzZVwidXRmOFwiOmNhc2VcInV0Zi04XCI6cmV0dXJuIHV0ZjhXcml0ZSh0aGlzLHN0cmluZyxvZmZzZXQsbGVuZ3RoKTtjYXNlXCJhc2NpaVwiOnJldHVybiBhc2NpaVdyaXRlKHRoaXMsc3RyaW5nLG9mZnNldCxsZW5ndGgpO2Nhc2VcImxhdGluMVwiOmNhc2VcImJpbmFyeVwiOnJldHVybiBsYXRpbjFXcml0ZSh0aGlzLHN0cmluZyxvZmZzZXQsbGVuZ3RoKTtjYXNlXCJiYXNlNjRcIjpyZXR1cm4gYmFzZTY0V3JpdGUodGhpcyxzdHJpbmcsb2Zmc2V0LGxlbmd0aCk7Y2FzZVwidWNzMlwiOmNhc2VcInVjcy0yXCI6Y2FzZVwidXRmMTZsZVwiOmNhc2VcInV0Zi0xNmxlXCI6cmV0dXJuIHVjczJXcml0ZSh0aGlzLHN0cmluZyxvZmZzZXQsbGVuZ3RoKTtkZWZhdWx0OmlmKGxvd2VyZWRDYXNlKXRocm93IG5ldyBUeXBlRXJyb3IoXCJVbmtub3duIGVuY29kaW5nOiBcIitlbmNvZGluZyk7ZW5jb2Rpbmc9KFwiXCIrZW5jb2RpbmcpLnRvTG93ZXJDYXNlKCk7bG93ZXJlZENhc2U9dHJ1ZX19fTtCdWZmZXIucHJvdG90eXBlLnRvSlNPTj1mdW5jdGlvbiB0b0pTT04oKXtyZXR1cm57dHlwZTpcIkJ1ZmZlclwiLGRhdGE6QXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwodGhpcy5fYXJyfHx0aGlzLDApfX07ZnVuY3Rpb24gYmFzZTY0U2xpY2UoYnVmLHN0YXJ0LGVuZCl7aWYoc3RhcnQ9PT0wJiZlbmQ9PT1idWYubGVuZ3RoKXtyZXR1cm4gYmFzZTY0LmZyb21CeXRlQXJyYXkoYnVmKX1lbHNle3JldHVybiBiYXNlNjQuZnJvbUJ5dGVBcnJheShidWYuc2xpY2Uoc3RhcnQsZW5kKSl9fWZ1bmN0aW9uIHV0ZjhTbGljZShidWYsc3RhcnQsZW5kKXtlbmQ9TWF0aC5taW4oYnVmLmxlbmd0aCxlbmQpO3ZhciByZXM9W107dmFyIGk9c3RhcnQ7d2hpbGUoaTxlbmQpe3ZhciBmaXJzdEJ5dGU9YnVmW2ldO3ZhciBjb2RlUG9pbnQ9bnVsbDt2YXIgYnl0ZXNQZXJTZXF1ZW5jZT1maXJzdEJ5dGU+MjM5PzQ6Zmlyc3RCeXRlPjIyMz8zOmZpcnN0Qnl0ZT4xOTE/MjoxO2lmKGkrYnl0ZXNQZXJTZXF1ZW5jZTw9ZW5kKXt2YXIgc2Vjb25kQnl0ZSx0aGlyZEJ5dGUsZm91cnRoQnl0ZSx0ZW1wQ29kZVBvaW50O3N3aXRjaChieXRlc1BlclNlcXVlbmNlKXtjYXNlIDE6aWYoZmlyc3RCeXRlPDEyOCl7Y29kZVBvaW50PWZpcnN0Qnl0ZX1icmVhaztjYXNlIDI6c2Vjb25kQnl0ZT1idWZbaSsxXTtpZigoc2Vjb25kQnl0ZSYxOTIpPT09MTI4KXt0ZW1wQ29kZVBvaW50PShmaXJzdEJ5dGUmMzEpPDw2fHNlY29uZEJ5dGUmNjM7aWYodGVtcENvZGVQb2ludD4xMjcpe2NvZGVQb2ludD10ZW1wQ29kZVBvaW50fX1icmVhaztjYXNlIDM6c2Vjb25kQnl0ZT1idWZbaSsxXTt0aGlyZEJ5dGU9YnVmW2krMl07aWYoKHNlY29uZEJ5dGUmMTkyKT09PTEyOCYmKHRoaXJkQnl0ZSYxOTIpPT09MTI4KXt0ZW1wQ29kZVBvaW50PShmaXJzdEJ5dGUmMTUpPDwxMnwoc2Vjb25kQnl0ZSY2Myk8PDZ8dGhpcmRCeXRlJjYzO2lmKHRlbXBDb2RlUG9pbnQ+MjA0NyYmKHRlbXBDb2RlUG9pbnQ8NTUyOTZ8fHRlbXBDb2RlUG9pbnQ+NTczNDMpKXtjb2RlUG9pbnQ9dGVtcENvZGVQb2ludH19YnJlYWs7Y2FzZSA0OnNlY29uZEJ5dGU9YnVmW2krMV07dGhpcmRCeXRlPWJ1ZltpKzJdO2ZvdXJ0aEJ5dGU9YnVmW2krM107aWYoKHNlY29uZEJ5dGUmMTkyKT09PTEyOCYmKHRoaXJkQnl0ZSYxOTIpPT09MTI4JiYoZm91cnRoQnl0ZSYxOTIpPT09MTI4KXt0ZW1wQ29kZVBvaW50PShmaXJzdEJ5dGUmMTUpPDwxOHwoc2Vjb25kQnl0ZSY2Myk8PDEyfCh0aGlyZEJ5dGUmNjMpPDw2fGZvdXJ0aEJ5dGUmNjM7aWYodGVtcENvZGVQb2ludD42NTUzNSYmdGVtcENvZGVQb2ludDwxMTE0MTEyKXtjb2RlUG9pbnQ9dGVtcENvZGVQb2ludH19fX1pZihjb2RlUG9pbnQ9PT1udWxsKXtjb2RlUG9pbnQ9NjU1MzM7Ynl0ZXNQZXJTZXF1ZW5jZT0xfWVsc2UgaWYoY29kZVBvaW50PjY1NTM1KXtjb2RlUG9pbnQtPTY1NTM2O3Jlcy5wdXNoKGNvZGVQb2ludD4+PjEwJjEwMjN8NTUyOTYpO2NvZGVQb2ludD01NjMyMHxjb2RlUG9pbnQmMTAyM31yZXMucHVzaChjb2RlUG9pbnQpO2krPWJ5dGVzUGVyU2VxdWVuY2V9cmV0dXJuIGRlY29kZUNvZGVQb2ludHNBcnJheShyZXMpfXZhciBNQVhfQVJHVU1FTlRTX0xFTkdUSD00MDk2O2Z1bmN0aW9uIGRlY29kZUNvZGVQb2ludHNBcnJheShjb2RlUG9pbnRzKXt2YXIgbGVuPWNvZGVQb2ludHMubGVuZ3RoO2lmKGxlbjw9TUFYX0FSR1VNRU5UU19MRU5HVEgpe3JldHVybiBTdHJpbmcuZnJvbUNoYXJDb2RlLmFwcGx5KFN0cmluZyxjb2RlUG9pbnRzKX12YXIgcmVzPVwiXCI7dmFyIGk9MDt3aGlsZShpPGxlbil7cmVzKz1TdHJpbmcuZnJvbUNoYXJDb2RlLmFwcGx5KFN0cmluZyxjb2RlUG9pbnRzLnNsaWNlKGksaSs9TUFYX0FSR1VNRU5UU19MRU5HVEgpKX1yZXR1cm4gcmVzfWZ1bmN0aW9uIGFzY2lpU2xpY2UoYnVmLHN0YXJ0LGVuZCl7dmFyIHJldD1cIlwiO2VuZD1NYXRoLm1pbihidWYubGVuZ3RoLGVuZCk7Zm9yKHZhciBpPXN0YXJ0O2k8ZW5kOysraSl7cmV0Kz1TdHJpbmcuZnJvbUNoYXJDb2RlKGJ1ZltpXSYxMjcpfXJldHVybiByZXR9ZnVuY3Rpb24gbGF0aW4xU2xpY2UoYnVmLHN0YXJ0LGVuZCl7dmFyIHJldD1cIlwiO2VuZD1NYXRoLm1pbihidWYubGVuZ3RoLGVuZCk7Zm9yKHZhciBpPXN0YXJ0O2k8ZW5kOysraSl7cmV0Kz1TdHJpbmcuZnJvbUNoYXJDb2RlKGJ1ZltpXSl9cmV0dXJuIHJldH1mdW5jdGlvbiBoZXhTbGljZShidWYsc3RhcnQsZW5kKXt2YXIgbGVuPWJ1Zi5sZW5ndGg7aWYoIXN0YXJ0fHxzdGFydDwwKXN0YXJ0PTA7aWYoIWVuZHx8ZW5kPDB8fGVuZD5sZW4pZW5kPWxlbjt2YXIgb3V0PVwiXCI7Zm9yKHZhciBpPXN0YXJ0O2k8ZW5kOysraSl7b3V0Kz10b0hleChidWZbaV0pfXJldHVybiBvdXR9ZnVuY3Rpb24gdXRmMTZsZVNsaWNlKGJ1ZixzdGFydCxlbmQpe3ZhciBieXRlcz1idWYuc2xpY2Uoc3RhcnQsZW5kKTt2YXIgcmVzPVwiXCI7Zm9yKHZhciBpPTA7aTxieXRlcy5sZW5ndGg7aSs9Mil7cmVzKz1TdHJpbmcuZnJvbUNoYXJDb2RlKGJ5dGVzW2ldK2J5dGVzW2krMV0qMjU2KX1yZXR1cm4gcmVzfUJ1ZmZlci5wcm90b3R5cGUuc2xpY2U9ZnVuY3Rpb24gc2xpY2Uoc3RhcnQsZW5kKXt2YXIgbGVuPXRoaXMubGVuZ3RoO3N0YXJ0PX5+c3RhcnQ7ZW5kPWVuZD09PXVuZGVmaW5lZD9sZW46fn5lbmQ7aWYoc3RhcnQ8MCl7c3RhcnQrPWxlbjtpZihzdGFydDwwKXN0YXJ0PTB9ZWxzZSBpZihzdGFydD5sZW4pe3N0YXJ0PWxlbn1pZihlbmQ8MCl7ZW5kKz1sZW47aWYoZW5kPDApZW5kPTB9ZWxzZSBpZihlbmQ+bGVuKXtlbmQ9bGVufWlmKGVuZDxzdGFydCllbmQ9c3RhcnQ7dmFyIG5ld0J1ZjtpZihCdWZmZXIuVFlQRURfQVJSQVlfU1VQUE9SVCl7bmV3QnVmPXRoaXMuc3ViYXJyYXkoc3RhcnQsZW5kKTtuZXdCdWYuX19wcm90b19fPUJ1ZmZlci5wcm90b3R5cGV9ZWxzZXt2YXIgc2xpY2VMZW49ZW5kLXN0YXJ0O25ld0J1Zj1uZXcgQnVmZmVyKHNsaWNlTGVuLHVuZGVmaW5lZCk7Zm9yKHZhciBpPTA7aTxzbGljZUxlbjsrK2kpe25ld0J1ZltpXT10aGlzW2krc3RhcnRdfX1yZXR1cm4gbmV3QnVmfTtmdW5jdGlvbiBjaGVja09mZnNldChvZmZzZXQsZXh0LGxlbmd0aCl7aWYob2Zmc2V0JTEhPT0wfHxvZmZzZXQ8MCl0aHJvdyBuZXcgUmFuZ2VFcnJvcihcIm9mZnNldCBpcyBub3QgdWludFwiKTtpZihvZmZzZXQrZXh0Pmxlbmd0aCl0aHJvdyBuZXcgUmFuZ2VFcnJvcihcIlRyeWluZyB0byBhY2Nlc3MgYmV5b25kIGJ1ZmZlciBsZW5ndGhcIil9QnVmZmVyLnByb3RvdHlwZS5yZWFkVUludExFPWZ1bmN0aW9uIHJlYWRVSW50TEUob2Zmc2V0LGJ5dGVMZW5ndGgsbm9Bc3NlcnQpe29mZnNldD1vZmZzZXR8MDtieXRlTGVuZ3RoPWJ5dGVMZW5ndGh8MDtpZighbm9Bc3NlcnQpY2hlY2tPZmZzZXQob2Zmc2V0LGJ5dGVMZW5ndGgsdGhpcy5sZW5ndGgpO3ZhciB2YWw9dGhpc1tvZmZzZXRdO3ZhciBtdWw9MTt2YXIgaT0wO3doaWxlKCsraTxieXRlTGVuZ3RoJiYobXVsKj0yNTYpKXt2YWwrPXRoaXNbb2Zmc2V0K2ldKm11bH1yZXR1cm4gdmFsfTtCdWZmZXIucHJvdG90eXBlLnJlYWRVSW50QkU9ZnVuY3Rpb24gcmVhZFVJbnRCRShvZmZzZXQsYnl0ZUxlbmd0aCxub0Fzc2VydCl7b2Zmc2V0PW9mZnNldHwwO2J5dGVMZW5ndGg9Ynl0ZUxlbmd0aHwwO2lmKCFub0Fzc2VydCl7Y2hlY2tPZmZzZXQob2Zmc2V0LGJ5dGVMZW5ndGgsdGhpcy5sZW5ndGgpfXZhciB2YWw9dGhpc1tvZmZzZXQrLS1ieXRlTGVuZ3RoXTt2YXIgbXVsPTE7d2hpbGUoYnl0ZUxlbmd0aD4wJiYobXVsKj0yNTYpKXt2YWwrPXRoaXNbb2Zmc2V0Ky0tYnl0ZUxlbmd0aF0qbXVsfXJldHVybiB2YWx9O0J1ZmZlci5wcm90b3R5cGUucmVhZFVJbnQ4PWZ1bmN0aW9uIHJlYWRVSW50OChvZmZzZXQsbm9Bc3NlcnQpe2lmKCFub0Fzc2VydCljaGVja09mZnNldChvZmZzZXQsMSx0aGlzLmxlbmd0aCk7cmV0dXJuIHRoaXNbb2Zmc2V0XX07QnVmZmVyLnByb3RvdHlwZS5yZWFkVUludDE2TEU9ZnVuY3Rpb24gcmVhZFVJbnQxNkxFKG9mZnNldCxub0Fzc2VydCl7aWYoIW5vQXNzZXJ0KWNoZWNrT2Zmc2V0KG9mZnNldCwyLHRoaXMubGVuZ3RoKTtyZXR1cm4gdGhpc1tvZmZzZXRdfHRoaXNbb2Zmc2V0KzFdPDw4fTtCdWZmZXIucHJvdG90eXBlLnJlYWRVSW50MTZCRT1mdW5jdGlvbiByZWFkVUludDE2QkUob2Zmc2V0LG5vQXNzZXJ0KXtpZighbm9Bc3NlcnQpY2hlY2tPZmZzZXQob2Zmc2V0LDIsdGhpcy5sZW5ndGgpO3JldHVybiB0aGlzW29mZnNldF08PDh8dGhpc1tvZmZzZXQrMV19O0J1ZmZlci5wcm90b3R5cGUucmVhZFVJbnQzMkxFPWZ1bmN0aW9uIHJlYWRVSW50MzJMRShvZmZzZXQsbm9Bc3NlcnQpe2lmKCFub0Fzc2VydCljaGVja09mZnNldChvZmZzZXQsNCx0aGlzLmxlbmd0aCk7cmV0dXJuKHRoaXNbb2Zmc2V0XXx0aGlzW29mZnNldCsxXTw8OHx0aGlzW29mZnNldCsyXTw8MTYpK3RoaXNbb2Zmc2V0KzNdKjE2Nzc3MjE2fTtCdWZmZXIucHJvdG90eXBlLnJlYWRVSW50MzJCRT1mdW5jdGlvbiByZWFkVUludDMyQkUob2Zmc2V0LG5vQXNzZXJ0KXtpZighbm9Bc3NlcnQpY2hlY2tPZmZzZXQob2Zmc2V0LDQsdGhpcy5sZW5ndGgpO3JldHVybiB0aGlzW29mZnNldF0qMTY3NzcyMTYrKHRoaXNbb2Zmc2V0KzFdPDwxNnx0aGlzW29mZnNldCsyXTw8OHx0aGlzW29mZnNldCszXSl9O0J1ZmZlci5wcm90b3R5cGUucmVhZEludExFPWZ1bmN0aW9uIHJlYWRJbnRMRShvZmZzZXQsYnl0ZUxlbmd0aCxub0Fzc2VydCl7b2Zmc2V0PW9mZnNldHwwO2J5dGVMZW5ndGg9Ynl0ZUxlbmd0aHwwO2lmKCFub0Fzc2VydCljaGVja09mZnNldChvZmZzZXQsYnl0ZUxlbmd0aCx0aGlzLmxlbmd0aCk7dmFyIHZhbD10aGlzW29mZnNldF07dmFyIG11bD0xO3ZhciBpPTA7d2hpbGUoKytpPGJ5dGVMZW5ndGgmJihtdWwqPTI1Nikpe3ZhbCs9dGhpc1tvZmZzZXQraV0qbXVsfW11bCo9MTI4O2lmKHZhbD49bXVsKXZhbC09TWF0aC5wb3coMiw4KmJ5dGVMZW5ndGgpO3JldHVybiB2YWx9O0J1ZmZlci5wcm90b3R5cGUucmVhZEludEJFPWZ1bmN0aW9uIHJlYWRJbnRCRShvZmZzZXQsYnl0ZUxlbmd0aCxub0Fzc2VydCl7b2Zmc2V0PW9mZnNldHwwO2J5dGVMZW5ndGg9Ynl0ZUxlbmd0aHwwO2lmKCFub0Fzc2VydCljaGVja09mZnNldChvZmZzZXQsYnl0ZUxlbmd0aCx0aGlzLmxlbmd0aCk7XG52YXIgaT1ieXRlTGVuZ3RoO3ZhciBtdWw9MTt2YXIgdmFsPXRoaXNbb2Zmc2V0Ky0taV07d2hpbGUoaT4wJiYobXVsKj0yNTYpKXt2YWwrPXRoaXNbb2Zmc2V0Ky0taV0qbXVsfW11bCo9MTI4O2lmKHZhbD49bXVsKXZhbC09TWF0aC5wb3coMiw4KmJ5dGVMZW5ndGgpO3JldHVybiB2YWx9O0J1ZmZlci5wcm90b3R5cGUucmVhZEludDg9ZnVuY3Rpb24gcmVhZEludDgob2Zmc2V0LG5vQXNzZXJ0KXtpZighbm9Bc3NlcnQpY2hlY2tPZmZzZXQob2Zmc2V0LDEsdGhpcy5sZW5ndGgpO2lmKCEodGhpc1tvZmZzZXRdJjEyOCkpcmV0dXJuIHRoaXNbb2Zmc2V0XTtyZXR1cm4oMjU1LXRoaXNbb2Zmc2V0XSsxKSotMX07QnVmZmVyLnByb3RvdHlwZS5yZWFkSW50MTZMRT1mdW5jdGlvbiByZWFkSW50MTZMRShvZmZzZXQsbm9Bc3NlcnQpe2lmKCFub0Fzc2VydCljaGVja09mZnNldChvZmZzZXQsMix0aGlzLmxlbmd0aCk7dmFyIHZhbD10aGlzW29mZnNldF18dGhpc1tvZmZzZXQrMV08PDg7cmV0dXJuIHZhbCYzMjc2OD92YWx8NDI5NDkwMTc2MDp2YWx9O0J1ZmZlci5wcm90b3R5cGUucmVhZEludDE2QkU9ZnVuY3Rpb24gcmVhZEludDE2QkUob2Zmc2V0LG5vQXNzZXJ0KXtpZighbm9Bc3NlcnQpY2hlY2tPZmZzZXQob2Zmc2V0LDIsdGhpcy5sZW5ndGgpO3ZhciB2YWw9dGhpc1tvZmZzZXQrMV18dGhpc1tvZmZzZXRdPDw4O3JldHVybiB2YWwmMzI3Njg/dmFsfDQyOTQ5MDE3NjA6dmFsfTtCdWZmZXIucHJvdG90eXBlLnJlYWRJbnQzMkxFPWZ1bmN0aW9uIHJlYWRJbnQzMkxFKG9mZnNldCxub0Fzc2VydCl7aWYoIW5vQXNzZXJ0KWNoZWNrT2Zmc2V0KG9mZnNldCw0LHRoaXMubGVuZ3RoKTtyZXR1cm4gdGhpc1tvZmZzZXRdfHRoaXNbb2Zmc2V0KzFdPDw4fHRoaXNbb2Zmc2V0KzJdPDwxNnx0aGlzW29mZnNldCszXTw8MjR9O0J1ZmZlci5wcm90b3R5cGUucmVhZEludDMyQkU9ZnVuY3Rpb24gcmVhZEludDMyQkUob2Zmc2V0LG5vQXNzZXJ0KXtpZighbm9Bc3NlcnQpY2hlY2tPZmZzZXQob2Zmc2V0LDQsdGhpcy5sZW5ndGgpO3JldHVybiB0aGlzW29mZnNldF08PDI0fHRoaXNbb2Zmc2V0KzFdPDwxNnx0aGlzW29mZnNldCsyXTw8OHx0aGlzW29mZnNldCszXX07QnVmZmVyLnByb3RvdHlwZS5yZWFkRmxvYXRMRT1mdW5jdGlvbiByZWFkRmxvYXRMRShvZmZzZXQsbm9Bc3NlcnQpe2lmKCFub0Fzc2VydCljaGVja09mZnNldChvZmZzZXQsNCx0aGlzLmxlbmd0aCk7cmV0dXJuIGllZWU3NTQucmVhZCh0aGlzLG9mZnNldCx0cnVlLDIzLDQpfTtCdWZmZXIucHJvdG90eXBlLnJlYWRGbG9hdEJFPWZ1bmN0aW9uIHJlYWRGbG9hdEJFKG9mZnNldCxub0Fzc2VydCl7aWYoIW5vQXNzZXJ0KWNoZWNrT2Zmc2V0KG9mZnNldCw0LHRoaXMubGVuZ3RoKTtyZXR1cm4gaWVlZTc1NC5yZWFkKHRoaXMsb2Zmc2V0LGZhbHNlLDIzLDQpfTtCdWZmZXIucHJvdG90eXBlLnJlYWREb3VibGVMRT1mdW5jdGlvbiByZWFkRG91YmxlTEUob2Zmc2V0LG5vQXNzZXJ0KXtpZighbm9Bc3NlcnQpY2hlY2tPZmZzZXQob2Zmc2V0LDgsdGhpcy5sZW5ndGgpO3JldHVybiBpZWVlNzU0LnJlYWQodGhpcyxvZmZzZXQsdHJ1ZSw1Miw4KX07QnVmZmVyLnByb3RvdHlwZS5yZWFkRG91YmxlQkU9ZnVuY3Rpb24gcmVhZERvdWJsZUJFKG9mZnNldCxub0Fzc2VydCl7aWYoIW5vQXNzZXJ0KWNoZWNrT2Zmc2V0KG9mZnNldCw4LHRoaXMubGVuZ3RoKTtyZXR1cm4gaWVlZTc1NC5yZWFkKHRoaXMsb2Zmc2V0LGZhbHNlLDUyLDgpfTtmdW5jdGlvbiBjaGVja0ludChidWYsdmFsdWUsb2Zmc2V0LGV4dCxtYXgsbWluKXtpZighQnVmZmVyLmlzQnVmZmVyKGJ1ZikpdGhyb3cgbmV3IFR5cGVFcnJvcignXCJidWZmZXJcIiBhcmd1bWVudCBtdXN0IGJlIGEgQnVmZmVyIGluc3RhbmNlJyk7aWYodmFsdWU+bWF4fHx2YWx1ZTxtaW4pdGhyb3cgbmV3IFJhbmdlRXJyb3IoJ1widmFsdWVcIiBhcmd1bWVudCBpcyBvdXQgb2YgYm91bmRzJyk7aWYob2Zmc2V0K2V4dD5idWYubGVuZ3RoKXRocm93IG5ldyBSYW5nZUVycm9yKFwiSW5kZXggb3V0IG9mIHJhbmdlXCIpfUJ1ZmZlci5wcm90b3R5cGUud3JpdGVVSW50TEU9ZnVuY3Rpb24gd3JpdGVVSW50TEUodmFsdWUsb2Zmc2V0LGJ5dGVMZW5ndGgsbm9Bc3NlcnQpe3ZhbHVlPSt2YWx1ZTtvZmZzZXQ9b2Zmc2V0fDA7Ynl0ZUxlbmd0aD1ieXRlTGVuZ3RofDA7aWYoIW5vQXNzZXJ0KXt2YXIgbWF4Qnl0ZXM9TWF0aC5wb3coMiw4KmJ5dGVMZW5ndGgpLTE7Y2hlY2tJbnQodGhpcyx2YWx1ZSxvZmZzZXQsYnl0ZUxlbmd0aCxtYXhCeXRlcywwKX12YXIgbXVsPTE7dmFyIGk9MDt0aGlzW29mZnNldF09dmFsdWUmMjU1O3doaWxlKCsraTxieXRlTGVuZ3RoJiYobXVsKj0yNTYpKXt0aGlzW29mZnNldCtpXT12YWx1ZS9tdWwmMjU1fXJldHVybiBvZmZzZXQrYnl0ZUxlbmd0aH07QnVmZmVyLnByb3RvdHlwZS53cml0ZVVJbnRCRT1mdW5jdGlvbiB3cml0ZVVJbnRCRSh2YWx1ZSxvZmZzZXQsYnl0ZUxlbmd0aCxub0Fzc2VydCl7dmFsdWU9K3ZhbHVlO29mZnNldD1vZmZzZXR8MDtieXRlTGVuZ3RoPWJ5dGVMZW5ndGh8MDtpZighbm9Bc3NlcnQpe3ZhciBtYXhCeXRlcz1NYXRoLnBvdygyLDgqYnl0ZUxlbmd0aCktMTtjaGVja0ludCh0aGlzLHZhbHVlLG9mZnNldCxieXRlTGVuZ3RoLG1heEJ5dGVzLDApfXZhciBpPWJ5dGVMZW5ndGgtMTt2YXIgbXVsPTE7dGhpc1tvZmZzZXQraV09dmFsdWUmMjU1O3doaWxlKC0taT49MCYmKG11bCo9MjU2KSl7dGhpc1tvZmZzZXQraV09dmFsdWUvbXVsJjI1NX1yZXR1cm4gb2Zmc2V0K2J5dGVMZW5ndGh9O0J1ZmZlci5wcm90b3R5cGUud3JpdGVVSW50OD1mdW5jdGlvbiB3cml0ZVVJbnQ4KHZhbHVlLG9mZnNldCxub0Fzc2VydCl7dmFsdWU9K3ZhbHVlO29mZnNldD1vZmZzZXR8MDtpZighbm9Bc3NlcnQpY2hlY2tJbnQodGhpcyx2YWx1ZSxvZmZzZXQsMSwyNTUsMCk7aWYoIUJ1ZmZlci5UWVBFRF9BUlJBWV9TVVBQT1JUKXZhbHVlPU1hdGguZmxvb3IodmFsdWUpO3RoaXNbb2Zmc2V0XT12YWx1ZSYyNTU7cmV0dXJuIG9mZnNldCsxfTtmdW5jdGlvbiBvYmplY3RXcml0ZVVJbnQxNihidWYsdmFsdWUsb2Zmc2V0LGxpdHRsZUVuZGlhbil7aWYodmFsdWU8MCl2YWx1ZT02NTUzNSt2YWx1ZSsxO2Zvcih2YXIgaT0wLGo9TWF0aC5taW4oYnVmLmxlbmd0aC1vZmZzZXQsMik7aTxqOysraSl7YnVmW29mZnNldCtpXT0odmFsdWUmMjU1PDw4KihsaXR0bGVFbmRpYW4/aToxLWkpKT4+PihsaXR0bGVFbmRpYW4/aToxLWkpKjh9fUJ1ZmZlci5wcm90b3R5cGUud3JpdGVVSW50MTZMRT1mdW5jdGlvbiB3cml0ZVVJbnQxNkxFKHZhbHVlLG9mZnNldCxub0Fzc2VydCl7dmFsdWU9K3ZhbHVlO29mZnNldD1vZmZzZXR8MDtpZighbm9Bc3NlcnQpY2hlY2tJbnQodGhpcyx2YWx1ZSxvZmZzZXQsMiw2NTUzNSwwKTtpZihCdWZmZXIuVFlQRURfQVJSQVlfU1VQUE9SVCl7dGhpc1tvZmZzZXRdPXZhbHVlJjI1NTt0aGlzW29mZnNldCsxXT12YWx1ZT4+Pjh9ZWxzZXtvYmplY3RXcml0ZVVJbnQxNih0aGlzLHZhbHVlLG9mZnNldCx0cnVlKX1yZXR1cm4gb2Zmc2V0KzJ9O0J1ZmZlci5wcm90b3R5cGUud3JpdGVVSW50MTZCRT1mdW5jdGlvbiB3cml0ZVVJbnQxNkJFKHZhbHVlLG9mZnNldCxub0Fzc2VydCl7dmFsdWU9K3ZhbHVlO29mZnNldD1vZmZzZXR8MDtpZighbm9Bc3NlcnQpY2hlY2tJbnQodGhpcyx2YWx1ZSxvZmZzZXQsMiw2NTUzNSwwKTtpZihCdWZmZXIuVFlQRURfQVJSQVlfU1VQUE9SVCl7dGhpc1tvZmZzZXRdPXZhbHVlPj4+ODt0aGlzW29mZnNldCsxXT12YWx1ZSYyNTV9ZWxzZXtvYmplY3RXcml0ZVVJbnQxNih0aGlzLHZhbHVlLG9mZnNldCxmYWxzZSl9cmV0dXJuIG9mZnNldCsyfTtmdW5jdGlvbiBvYmplY3RXcml0ZVVJbnQzMihidWYsdmFsdWUsb2Zmc2V0LGxpdHRsZUVuZGlhbil7aWYodmFsdWU8MCl2YWx1ZT00Mjk0OTY3Mjk1K3ZhbHVlKzE7Zm9yKHZhciBpPTAsaj1NYXRoLm1pbihidWYubGVuZ3RoLW9mZnNldCw0KTtpPGo7KytpKXtidWZbb2Zmc2V0K2ldPXZhbHVlPj4+KGxpdHRsZUVuZGlhbj9pOjMtaSkqOCYyNTV9fUJ1ZmZlci5wcm90b3R5cGUud3JpdGVVSW50MzJMRT1mdW5jdGlvbiB3cml0ZVVJbnQzMkxFKHZhbHVlLG9mZnNldCxub0Fzc2VydCl7dmFsdWU9K3ZhbHVlO29mZnNldD1vZmZzZXR8MDtpZighbm9Bc3NlcnQpY2hlY2tJbnQodGhpcyx2YWx1ZSxvZmZzZXQsNCw0Mjk0OTY3Mjk1LDApO2lmKEJ1ZmZlci5UWVBFRF9BUlJBWV9TVVBQT1JUKXt0aGlzW29mZnNldCszXT12YWx1ZT4+PjI0O3RoaXNbb2Zmc2V0KzJdPXZhbHVlPj4+MTY7dGhpc1tvZmZzZXQrMV09dmFsdWU+Pj44O3RoaXNbb2Zmc2V0XT12YWx1ZSYyNTV9ZWxzZXtvYmplY3RXcml0ZVVJbnQzMih0aGlzLHZhbHVlLG9mZnNldCx0cnVlKX1yZXR1cm4gb2Zmc2V0KzR9O0J1ZmZlci5wcm90b3R5cGUud3JpdGVVSW50MzJCRT1mdW5jdGlvbiB3cml0ZVVJbnQzMkJFKHZhbHVlLG9mZnNldCxub0Fzc2VydCl7dmFsdWU9K3ZhbHVlO29mZnNldD1vZmZzZXR8MDtpZighbm9Bc3NlcnQpY2hlY2tJbnQodGhpcyx2YWx1ZSxvZmZzZXQsNCw0Mjk0OTY3Mjk1LDApO2lmKEJ1ZmZlci5UWVBFRF9BUlJBWV9TVVBQT1JUKXt0aGlzW29mZnNldF09dmFsdWU+Pj4yNDt0aGlzW29mZnNldCsxXT12YWx1ZT4+PjE2O3RoaXNbb2Zmc2V0KzJdPXZhbHVlPj4+ODt0aGlzW29mZnNldCszXT12YWx1ZSYyNTV9ZWxzZXtvYmplY3RXcml0ZVVJbnQzMih0aGlzLHZhbHVlLG9mZnNldCxmYWxzZSl9cmV0dXJuIG9mZnNldCs0fTtCdWZmZXIucHJvdG90eXBlLndyaXRlSW50TEU9ZnVuY3Rpb24gd3JpdGVJbnRMRSh2YWx1ZSxvZmZzZXQsYnl0ZUxlbmd0aCxub0Fzc2VydCl7dmFsdWU9K3ZhbHVlO29mZnNldD1vZmZzZXR8MDtpZighbm9Bc3NlcnQpe3ZhciBsaW1pdD1NYXRoLnBvdygyLDgqYnl0ZUxlbmd0aC0xKTtjaGVja0ludCh0aGlzLHZhbHVlLG9mZnNldCxieXRlTGVuZ3RoLGxpbWl0LTEsLWxpbWl0KX12YXIgaT0wO3ZhciBtdWw9MTt2YXIgc3ViPTA7dGhpc1tvZmZzZXRdPXZhbHVlJjI1NTt3aGlsZSgrK2k8Ynl0ZUxlbmd0aCYmKG11bCo9MjU2KSl7aWYodmFsdWU8MCYmc3ViPT09MCYmdGhpc1tvZmZzZXQraS0xXSE9PTApe3N1Yj0xfXRoaXNbb2Zmc2V0K2ldPSh2YWx1ZS9tdWw+PjApLXN1YiYyNTV9cmV0dXJuIG9mZnNldCtieXRlTGVuZ3RofTtCdWZmZXIucHJvdG90eXBlLndyaXRlSW50QkU9ZnVuY3Rpb24gd3JpdGVJbnRCRSh2YWx1ZSxvZmZzZXQsYnl0ZUxlbmd0aCxub0Fzc2VydCl7dmFsdWU9K3ZhbHVlO29mZnNldD1vZmZzZXR8MDtpZighbm9Bc3NlcnQpe3ZhciBsaW1pdD1NYXRoLnBvdygyLDgqYnl0ZUxlbmd0aC0xKTtjaGVja0ludCh0aGlzLHZhbHVlLG9mZnNldCxieXRlTGVuZ3RoLGxpbWl0LTEsLWxpbWl0KX12YXIgaT1ieXRlTGVuZ3RoLTE7dmFyIG11bD0xO3ZhciBzdWI9MDt0aGlzW29mZnNldCtpXT12YWx1ZSYyNTU7d2hpbGUoLS1pPj0wJiYobXVsKj0yNTYpKXtpZih2YWx1ZTwwJiZzdWI9PT0wJiZ0aGlzW29mZnNldCtpKzFdIT09MCl7c3ViPTF9dGhpc1tvZmZzZXQraV09KHZhbHVlL211bD4+MCktc3ViJjI1NX1yZXR1cm4gb2Zmc2V0K2J5dGVMZW5ndGh9O0J1ZmZlci5wcm90b3R5cGUud3JpdGVJbnQ4PWZ1bmN0aW9uIHdyaXRlSW50OCh2YWx1ZSxvZmZzZXQsbm9Bc3NlcnQpe3ZhbHVlPSt2YWx1ZTtvZmZzZXQ9b2Zmc2V0fDA7aWYoIW5vQXNzZXJ0KWNoZWNrSW50KHRoaXMsdmFsdWUsb2Zmc2V0LDEsMTI3LC0xMjgpO2lmKCFCdWZmZXIuVFlQRURfQVJSQVlfU1VQUE9SVCl2YWx1ZT1NYXRoLmZsb29yKHZhbHVlKTtpZih2YWx1ZTwwKXZhbHVlPTI1NSt2YWx1ZSsxO3RoaXNbb2Zmc2V0XT12YWx1ZSYyNTU7cmV0dXJuIG9mZnNldCsxfTtCdWZmZXIucHJvdG90eXBlLndyaXRlSW50MTZMRT1mdW5jdGlvbiB3cml0ZUludDE2TEUodmFsdWUsb2Zmc2V0LG5vQXNzZXJ0KXt2YWx1ZT0rdmFsdWU7b2Zmc2V0PW9mZnNldHwwO2lmKCFub0Fzc2VydCljaGVja0ludCh0aGlzLHZhbHVlLG9mZnNldCwyLDMyNzY3LC0zMjc2OCk7aWYoQnVmZmVyLlRZUEVEX0FSUkFZX1NVUFBPUlQpe3RoaXNbb2Zmc2V0XT12YWx1ZSYyNTU7dGhpc1tvZmZzZXQrMV09dmFsdWU+Pj44fWVsc2V7b2JqZWN0V3JpdGVVSW50MTYodGhpcyx2YWx1ZSxvZmZzZXQsdHJ1ZSl9cmV0dXJuIG9mZnNldCsyfTtCdWZmZXIucHJvdG90eXBlLndyaXRlSW50MTZCRT1mdW5jdGlvbiB3cml0ZUludDE2QkUodmFsdWUsb2Zmc2V0LG5vQXNzZXJ0KXt2YWx1ZT0rdmFsdWU7b2Zmc2V0PW9mZnNldHwwO2lmKCFub0Fzc2VydCljaGVja0ludCh0aGlzLHZhbHVlLG9mZnNldCwyLDMyNzY3LC0zMjc2OCk7aWYoQnVmZmVyLlRZUEVEX0FSUkFZX1NVUFBPUlQpe3RoaXNbb2Zmc2V0XT12YWx1ZT4+Pjg7dGhpc1tvZmZzZXQrMV09dmFsdWUmMjU1fWVsc2V7b2JqZWN0V3JpdGVVSW50MTYodGhpcyx2YWx1ZSxvZmZzZXQsZmFsc2UpfXJldHVybiBvZmZzZXQrMn07QnVmZmVyLnByb3RvdHlwZS53cml0ZUludDMyTEU9ZnVuY3Rpb24gd3JpdGVJbnQzMkxFKHZhbHVlLG9mZnNldCxub0Fzc2VydCl7dmFsdWU9K3ZhbHVlO29mZnNldD1vZmZzZXR8MDtpZighbm9Bc3NlcnQpY2hlY2tJbnQodGhpcyx2YWx1ZSxvZmZzZXQsNCwyMTQ3NDgzNjQ3LC0yMTQ3NDgzNjQ4KTtpZihCdWZmZXIuVFlQRURfQVJSQVlfU1VQUE9SVCl7dGhpc1tvZmZzZXRdPXZhbHVlJjI1NTt0aGlzW29mZnNldCsxXT12YWx1ZT4+Pjg7dGhpc1tvZmZzZXQrMl09dmFsdWU+Pj4xNjt0aGlzW29mZnNldCszXT12YWx1ZT4+PjI0fWVsc2V7b2JqZWN0V3JpdGVVSW50MzIodGhpcyx2YWx1ZSxvZmZzZXQsdHJ1ZSl9cmV0dXJuIG9mZnNldCs0fTtCdWZmZXIucHJvdG90eXBlLndyaXRlSW50MzJCRT1mdW5jdGlvbiB3cml0ZUludDMyQkUodmFsdWUsb2Zmc2V0LG5vQXNzZXJ0KXt2YWx1ZT0rdmFsdWU7b2Zmc2V0PW9mZnNldHwwO2lmKCFub0Fzc2VydCljaGVja0ludCh0aGlzLHZhbHVlLG9mZnNldCw0LDIxNDc0ODM2NDcsLTIxNDc0ODM2NDgpO2lmKHZhbHVlPDApdmFsdWU9NDI5NDk2NzI5NSt2YWx1ZSsxO2lmKEJ1ZmZlci5UWVBFRF9BUlJBWV9TVVBQT1JUKXt0aGlzW29mZnNldF09dmFsdWU+Pj4yNDt0aGlzW29mZnNldCsxXT12YWx1ZT4+PjE2O3RoaXNbb2Zmc2V0KzJdPXZhbHVlPj4+ODt0aGlzW29mZnNldCszXT12YWx1ZSYyNTV9ZWxzZXtvYmplY3RXcml0ZVVJbnQzMih0aGlzLHZhbHVlLG9mZnNldCxmYWxzZSl9cmV0dXJuIG9mZnNldCs0fTtmdW5jdGlvbiBjaGVja0lFRUU3NTQoYnVmLHZhbHVlLG9mZnNldCxleHQsbWF4LG1pbil7aWYob2Zmc2V0K2V4dD5idWYubGVuZ3RoKXRocm93IG5ldyBSYW5nZUVycm9yKFwiSW5kZXggb3V0IG9mIHJhbmdlXCIpO2lmKG9mZnNldDwwKXRocm93IG5ldyBSYW5nZUVycm9yKFwiSW5kZXggb3V0IG9mIHJhbmdlXCIpfWZ1bmN0aW9uIHdyaXRlRmxvYXQoYnVmLHZhbHVlLG9mZnNldCxsaXR0bGVFbmRpYW4sbm9Bc3NlcnQpe2lmKCFub0Fzc2VydCl7Y2hlY2tJRUVFNzU0KGJ1Zix2YWx1ZSxvZmZzZXQsNCwzLjQwMjgyMzQ2NjM4NTI4ODZlMzgsLTMuNDAyODIzNDY2Mzg1Mjg4NmUzOCl9aWVlZTc1NC53cml0ZShidWYsdmFsdWUsb2Zmc2V0LGxpdHRsZUVuZGlhbiwyMyw0KTtyZXR1cm4gb2Zmc2V0KzR9QnVmZmVyLnByb3RvdHlwZS53cml0ZUZsb2F0TEU9ZnVuY3Rpb24gd3JpdGVGbG9hdExFKHZhbHVlLG9mZnNldCxub0Fzc2VydCl7cmV0dXJuIHdyaXRlRmxvYXQodGhpcyx2YWx1ZSxvZmZzZXQsdHJ1ZSxub0Fzc2VydCl9O0J1ZmZlci5wcm90b3R5cGUud3JpdGVGbG9hdEJFPWZ1bmN0aW9uIHdyaXRlRmxvYXRCRSh2YWx1ZSxvZmZzZXQsbm9Bc3NlcnQpe3JldHVybiB3cml0ZUZsb2F0KHRoaXMsdmFsdWUsb2Zmc2V0LGZhbHNlLG5vQXNzZXJ0KX07ZnVuY3Rpb24gd3JpdGVEb3VibGUoYnVmLHZhbHVlLG9mZnNldCxsaXR0bGVFbmRpYW4sbm9Bc3NlcnQpe2lmKCFub0Fzc2VydCl7Y2hlY2tJRUVFNzU0KGJ1Zix2YWx1ZSxvZmZzZXQsOCwxLjc5NzY5MzEzNDg2MjMxNTdlMzA4LC0xLjc5NzY5MzEzNDg2MjMxNTdlMzA4KX1pZWVlNzU0LndyaXRlKGJ1Zix2YWx1ZSxvZmZzZXQsbGl0dGxlRW5kaWFuLDUyLDgpO3JldHVybiBvZmZzZXQrOH1CdWZmZXIucHJvdG90eXBlLndyaXRlRG91YmxlTEU9ZnVuY3Rpb24gd3JpdGVEb3VibGVMRSh2YWx1ZSxvZmZzZXQsbm9Bc3NlcnQpe3JldHVybiB3cml0ZURvdWJsZSh0aGlzLHZhbHVlLG9mZnNldCx0cnVlLG5vQXNzZXJ0KX07QnVmZmVyLnByb3RvdHlwZS53cml0ZURvdWJsZUJFPWZ1bmN0aW9uIHdyaXRlRG91YmxlQkUodmFsdWUsb2Zmc2V0LG5vQXNzZXJ0KXtyZXR1cm4gd3JpdGVEb3VibGUodGhpcyx2YWx1ZSxvZmZzZXQsZmFsc2Usbm9Bc3NlcnQpfTtCdWZmZXIucHJvdG90eXBlLmNvcHk9ZnVuY3Rpb24gY29weSh0YXJnZXQsdGFyZ2V0U3RhcnQsc3RhcnQsZW5kKXtpZighc3RhcnQpc3RhcnQ9MDtpZighZW5kJiZlbmQhPT0wKWVuZD10aGlzLmxlbmd0aDtpZih0YXJnZXRTdGFydD49dGFyZ2V0Lmxlbmd0aCl0YXJnZXRTdGFydD10YXJnZXQubGVuZ3RoO2lmKCF0YXJnZXRTdGFydCl0YXJnZXRTdGFydD0wO2lmKGVuZD4wJiZlbmQ8c3RhcnQpZW5kPXN0YXJ0O2lmKGVuZD09PXN0YXJ0KXJldHVybiAwO2lmKHRhcmdldC5sZW5ndGg9PT0wfHx0aGlzLmxlbmd0aD09PTApcmV0dXJuIDA7aWYodGFyZ2V0U3RhcnQ8MCl7dGhyb3cgbmV3IFJhbmdlRXJyb3IoXCJ0YXJnZXRTdGFydCBvdXQgb2YgYm91bmRzXCIpfWlmKHN0YXJ0PDB8fHN0YXJ0Pj10aGlzLmxlbmd0aCl0aHJvdyBuZXcgUmFuZ2VFcnJvcihcInNvdXJjZVN0YXJ0IG91dCBvZiBib3VuZHNcIik7aWYoZW5kPDApdGhyb3cgbmV3IFJhbmdlRXJyb3IoXCJzb3VyY2VFbmQgb3V0IG9mIGJvdW5kc1wiKTtpZihlbmQ+dGhpcy5sZW5ndGgpZW5kPXRoaXMubGVuZ3RoO2lmKHRhcmdldC5sZW5ndGgtdGFyZ2V0U3RhcnQ8ZW5kLXN0YXJ0KXtlbmQ9dGFyZ2V0Lmxlbmd0aC10YXJnZXRTdGFydCtzdGFydH12YXIgbGVuPWVuZC1zdGFydDt2YXIgaTtpZih0aGlzPT09dGFyZ2V0JiZzdGFydDx0YXJnZXRTdGFydCYmdGFyZ2V0U3RhcnQ8ZW5kKXtmb3IoaT1sZW4tMTtpPj0wOy0taSl7dGFyZ2V0W2krdGFyZ2V0U3RhcnRdPXRoaXNbaStzdGFydF19fWVsc2UgaWYobGVuPDFlM3x8IUJ1ZmZlci5UWVBFRF9BUlJBWV9TVVBQT1JUKXtmb3IoaT0wO2k8bGVuOysraSl7dGFyZ2V0W2krdGFyZ2V0U3RhcnRdPXRoaXNbaStzdGFydF19fWVsc2V7VWludDhBcnJheS5wcm90b3R5cGUuc2V0LmNhbGwodGFyZ2V0LHRoaXMuc3ViYXJyYXkoc3RhcnQsc3RhcnQrbGVuKSx0YXJnZXRTdGFydCl9cmV0dXJuIGxlbn07QnVmZmVyLnByb3RvdHlwZS5maWxsPWZ1bmN0aW9uIGZpbGwodmFsLHN0YXJ0LGVuZCxlbmNvZGluZyl7aWYodHlwZW9mIHZhbD09PVwic3RyaW5nXCIpe2lmKHR5cGVvZiBzdGFydD09PVwic3RyaW5nXCIpe2VuY29kaW5nPXN0YXJ0O3N0YXJ0PTA7ZW5kPXRoaXMubGVuZ3RofWVsc2UgaWYodHlwZW9mIGVuZD09PVwic3RyaW5nXCIpe2VuY29kaW5nPWVuZDtlbmQ9dGhpcy5sZW5ndGh9aWYodmFsLmxlbmd0aD09PTEpe3ZhciBjb2RlPXZhbC5jaGFyQ29kZUF0KDApO2lmKGNvZGU8MjU2KXt2YWw9Y29kZX19aWYoZW5jb2RpbmchPT11bmRlZmluZWQmJnR5cGVvZiBlbmNvZGluZyE9PVwic3RyaW5nXCIpe3Rocm93IG5ldyBUeXBlRXJyb3IoXCJlbmNvZGluZyBtdXN0IGJlIGEgc3RyaW5nXCIpfWlmKHR5cGVvZiBlbmNvZGluZz09PVwic3RyaW5nXCImJiFCdWZmZXIuaXNFbmNvZGluZyhlbmNvZGluZykpe3Rocm93IG5ldyBUeXBlRXJyb3IoXCJVbmtub3duIGVuY29kaW5nOiBcIitlbmNvZGluZyl9fWVsc2UgaWYodHlwZW9mIHZhbD09PVwibnVtYmVyXCIpe3ZhbD12YWwmMjU1fWlmKHN0YXJ0PDB8fHRoaXMubGVuZ3RoPHN0YXJ0fHx0aGlzLmxlbmd0aDxlbmQpe3Rocm93IG5ldyBSYW5nZUVycm9yKFwiT3V0IG9mIHJhbmdlIGluZGV4XCIpfWlmKGVuZDw9c3RhcnQpe3JldHVybiB0aGlzfXN0YXJ0PXN0YXJ0Pj4+MDtlbmQ9ZW5kPT09dW5kZWZpbmVkP3RoaXMubGVuZ3RoOmVuZD4+PjA7aWYoIXZhbCl2YWw9MDt2YXIgaTtpZih0eXBlb2YgdmFsPT09XCJudW1iZXJcIil7Zm9yKGk9c3RhcnQ7aTxlbmQ7KytpKXt0aGlzW2ldPXZhbH19ZWxzZXt2YXIgYnl0ZXM9QnVmZmVyLmlzQnVmZmVyKHZhbCk/dmFsOnV0ZjhUb0J5dGVzKG5ldyBCdWZmZXIodmFsLGVuY29kaW5nKS50b1N0cmluZygpKTt2YXIgbGVuPWJ5dGVzLmxlbmd0aDtmb3IoaT0wO2k8ZW5kLXN0YXJ0OysraSl7dGhpc1tpK3N0YXJ0XT1ieXRlc1tpJWxlbl19fXJldHVybiB0aGlzfTt2YXIgSU5WQUxJRF9CQVNFNjRfUkU9L1teK1xcLzAtOUEtWmEtei1fXS9nO2Z1bmN0aW9uIGJhc2U2NGNsZWFuKHN0cil7c3RyPXN0cmluZ3RyaW0oc3RyKS5yZXBsYWNlKElOVkFMSURfQkFTRTY0X1JFLFwiXCIpO2lmKHN0ci5sZW5ndGg8MilyZXR1cm5cIlwiO3doaWxlKHN0ci5sZW5ndGglNCE9PTApe3N0cj1zdHIrXCI9XCJ9cmV0dXJuIHN0cn1mdW5jdGlvbiBzdHJpbmd0cmltKHN0cil7aWYoc3RyLnRyaW0pcmV0dXJuIHN0ci50cmltKCk7cmV0dXJuIHN0ci5yZXBsYWNlKC9eXFxzK3xcXHMrJC9nLFwiXCIpfWZ1bmN0aW9uIHRvSGV4KG4pe2lmKG48MTYpcmV0dXJuXCIwXCIrbi50b1N0cmluZygxNik7cmV0dXJuIG4udG9TdHJpbmcoMTYpfWZ1bmN0aW9uIHV0ZjhUb0J5dGVzKHN0cmluZyx1bml0cyl7dW5pdHM9dW5pdHN8fEluZmluaXR5O3ZhciBjb2RlUG9pbnQ7dmFyIGxlbmd0aD1zdHJpbmcubGVuZ3RoO3ZhciBsZWFkU3Vycm9nYXRlPW51bGw7dmFyIGJ5dGVzPVtdO2Zvcih2YXIgaT0wO2k8bGVuZ3RoOysraSl7Y29kZVBvaW50PXN0cmluZy5jaGFyQ29kZUF0KGkpO2lmKGNvZGVQb2ludD41NTI5NSYmY29kZVBvaW50PDU3MzQ0KXtpZighbGVhZFN1cnJvZ2F0ZSl7aWYoY29kZVBvaW50PjU2MzE5KXtpZigodW5pdHMtPTMpPi0xKWJ5dGVzLnB1c2goMjM5LDE5MSwxODkpO2NvbnRpbnVlfWVsc2UgaWYoaSsxPT09bGVuZ3RoKXtpZigodW5pdHMtPTMpPi0xKWJ5dGVzLnB1c2goMjM5LDE5MSwxODkpO2NvbnRpbnVlfWxlYWRTdXJyb2dhdGU9Y29kZVBvaW50O2NvbnRpbnVlfWlmKGNvZGVQb2ludDw1NjMyMCl7aWYoKHVuaXRzLT0zKT4tMSlieXRlcy5wdXNoKDIzOSwxOTEsMTg5KTtsZWFkU3Vycm9nYXRlPWNvZGVQb2ludDtjb250aW51ZX1jb2RlUG9pbnQ9KGxlYWRTdXJyb2dhdGUtNTUyOTY8PDEwfGNvZGVQb2ludC01NjMyMCkrNjU1MzZ9ZWxzZSBpZihsZWFkU3Vycm9nYXRlKXtpZigodW5pdHMtPTMpPi0xKWJ5dGVzLnB1c2goMjM5LDE5MSwxODkpfWxlYWRTdXJyb2dhdGU9bnVsbDtpZihjb2RlUG9pbnQ8MTI4KXtpZigodW5pdHMtPTEpPDApYnJlYWs7Ynl0ZXMucHVzaChjb2RlUG9pbnQpfWVsc2UgaWYoY29kZVBvaW50PDIwNDgpe2lmKCh1bml0cy09Mik8MClicmVhaztieXRlcy5wdXNoKGNvZGVQb2ludD4+NnwxOTIsY29kZVBvaW50JjYzfDEyOCl9ZWxzZSBpZihjb2RlUG9pbnQ8NjU1MzYpe2lmKCh1bml0cy09Myk8MClicmVhaztieXRlcy5wdXNoKGNvZGVQb2ludD4+MTJ8MjI0LGNvZGVQb2ludD4+NiY2M3wxMjgsY29kZVBvaW50JjYzfDEyOCl9ZWxzZSBpZihjb2RlUG9pbnQ8MTExNDExMil7aWYoKHVuaXRzLT00KTwwKWJyZWFrO2J5dGVzLnB1c2goY29kZVBvaW50Pj4xOHwyNDAsY29kZVBvaW50Pj4xMiY2M3wxMjgsY29kZVBvaW50Pj42JjYzfDEyOCxjb2RlUG9pbnQmNjN8MTI4KX1lbHNle3Rocm93IG5ldyBFcnJvcihcIkludmFsaWQgY29kZSBwb2ludFwiKX19cmV0dXJuIGJ5dGVzfWZ1bmN0aW9uIGFzY2lpVG9CeXRlcyhzdHIpe3ZhciBieXRlQXJyYXk9W107Zm9yKHZhciBpPTA7aTxzdHIubGVuZ3RoOysraSl7Ynl0ZUFycmF5LnB1c2goc3RyLmNoYXJDb2RlQXQoaSkmMjU1KX1yZXR1cm4gYnl0ZUFycmF5fWZ1bmN0aW9uIHV0ZjE2bGVUb0J5dGVzKHN0cix1bml0cyl7dmFyIGMsaGksbG87dmFyIGJ5dGVBcnJheT1bXTtmb3IodmFyIGk9MDtpPHN0ci5sZW5ndGg7KytpKXtpZigodW5pdHMtPTIpPDApYnJlYWs7Yz1zdHIuY2hhckNvZGVBdChpKTtoaT1jPj44O2xvPWMlMjU2O2J5dGVBcnJheS5wdXNoKGxvKTtieXRlQXJyYXkucHVzaChoaSl9cmV0dXJuIGJ5dGVBcnJheX1mdW5jdGlvbiBiYXNlNjRUb0J5dGVzKHN0cil7cmV0dXJuIGJhc2U2NC50b0J5dGVBcnJheShiYXNlNjRjbGVhbihzdHIpKX1mdW5jdGlvbiBibGl0QnVmZmVyKHNyYyxkc3Qsb2Zmc2V0LGxlbmd0aCl7Zm9yKHZhciBpPTA7aTxsZW5ndGg7KytpKXtpZihpK29mZnNldD49ZHN0Lmxlbmd0aHx8aT49c3JjLmxlbmd0aClicmVhaztkc3RbaStvZmZzZXRdPXNyY1tpXX1yZXR1cm4gaX1mdW5jdGlvbiBpc25hbih2YWwpe3JldHVybiB2YWwhPT12YWx9fSkuY2FsbCh0aGlzLHR5cGVvZiBnbG9iYWwhPT1cInVuZGVmaW5lZFwiP2dsb2JhbDp0eXBlb2Ygc2VsZiE9PVwidW5kZWZpbmVkXCI/c2VsZjp0eXBlb2Ygd2luZG93IT09XCJ1bmRlZmluZWRcIj93aW5kb3c6e30pfSx7XCJiYXNlNjQtanNcIjoyLGllZWU3NTQ6MzcsaXNhcnJheTo0MH1dLDY6W2Z1bmN0aW9uKHJlcXVpcmUsbW9kdWxlLGV4cG9ydHMpeyhmdW5jdGlvbihCdWZmZXIpe2Z1bmN0aW9uIGlzQXJyYXkoYXJnKXtpZihBcnJheS5pc0FycmF5KXtyZXR1cm4gQXJyYXkuaXNBcnJheShhcmcpfXJldHVybiBvYmplY3RUb1N0cmluZyhhcmcpPT09XCJbb2JqZWN0IEFycmF5XVwifWV4cG9ydHMuaXNBcnJheT1pc0FycmF5O2Z1bmN0aW9uIGlzQm9vbGVhbihhcmcpe3JldHVybiB0eXBlb2YgYXJnPT09XCJib29sZWFuXCJ9ZXhwb3J0cy5pc0Jvb2xlYW49aXNCb29sZWFuO2Z1bmN0aW9uIGlzTnVsbChhcmcpe3JldHVybiBhcmc9PT1udWxsfWV4cG9ydHMuaXNOdWxsPWlzTnVsbDtmdW5jdGlvbiBpc051bGxPclVuZGVmaW5lZChhcmcpe3JldHVybiBhcmc9PW51bGx9ZXhwb3J0cy5pc051bGxPclVuZGVmaW5lZD1pc051bGxPclVuZGVmaW5lZDtmdW5jdGlvbiBpc051bWJlcihhcmcpe3JldHVybiB0eXBlb2YgYXJnPT09XCJudW1iZXJcIn1leHBvcnRzLmlzTnVtYmVyPWlzTnVtYmVyO2Z1bmN0aW9uIGlzU3RyaW5nKGFyZyl7cmV0dXJuIHR5cGVvZiBhcmc9PT1cInN0cmluZ1wifWV4cG9ydHMuaXNTdHJpbmc9aXNTdHJpbmc7ZnVuY3Rpb24gaXNTeW1ib2woYXJnKXtyZXR1cm4gdHlwZW9mIGFyZz09PVwic3ltYm9sXCJ9ZXhwb3J0cy5pc1N5bWJvbD1pc1N5bWJvbDtmdW5jdGlvbiBpc1VuZGVmaW5lZChhcmcpe3JldHVybiBhcmc9PT12b2lkIDB9ZXhwb3J0cy5pc1VuZGVmaW5lZD1pc1VuZGVmaW5lZDtmdW5jdGlvbiBpc1JlZ0V4cChyZSl7cmV0dXJuIG9iamVjdFRvU3RyaW5nKHJlKT09PVwiW29iamVjdCBSZWdFeHBdXCJ9ZXhwb3J0cy5pc1JlZ0V4cD1pc1JlZ0V4cDtmdW5jdGlvbiBpc09iamVjdChhcmcpe3JldHVybiB0eXBlb2YgYXJnPT09XCJvYmplY3RcIiYmYXJnIT09bnVsbH1leHBvcnRzLmlzT2JqZWN0PWlzT2JqZWN0O2Z1bmN0aW9uIGlzRGF0ZShkKXtyZXR1cm4gb2JqZWN0VG9TdHJpbmcoZCk9PT1cIltvYmplY3QgRGF0ZV1cIn1leHBvcnRzLmlzRGF0ZT1pc0RhdGU7ZnVuY3Rpb24gaXNFcnJvcihlKXtyZXR1cm4gb2JqZWN0VG9TdHJpbmcoZSk9PT1cIltvYmplY3QgRXJyb3JdXCJ8fGUgaW5zdGFuY2VvZiBFcnJvcn1leHBvcnRzLmlzRXJyb3I9aXNFcnJvcjtmdW5jdGlvbiBpc0Z1bmN0aW9uKGFyZyl7cmV0dXJuIHR5cGVvZiBhcmc9PT1cImZ1bmN0aW9uXCJ9ZXhwb3J0cy5pc0Z1bmN0aW9uPWlzRnVuY3Rpb247ZnVuY3Rpb24gaXNQcmltaXRpdmUoYXJnKXtyZXR1cm4gYXJnPT09bnVsbHx8dHlwZW9mIGFyZz09PVwiYm9vbGVhblwifHx0eXBlb2YgYXJnPT09XCJudW1iZXJcInx8dHlwZW9mIGFyZz09PVwic3RyaW5nXCJ8fHR5cGVvZiBhcmc9PT1cInN5bWJvbFwifHx0eXBlb2YgYXJnPT09XCJ1bmRlZmluZWRcIn1leHBvcnRzLmlzUHJpbWl0aXZlPWlzUHJpbWl0aXZlO2V4cG9ydHMuaXNCdWZmZXI9QnVmZmVyLmlzQnVmZmVyO2Z1bmN0aW9uIG9iamVjdFRvU3RyaW5nKG8pe3JldHVybiBPYmplY3QucHJvdG90eXBlLnRvU3RyaW5nLmNhbGwobyl9fSkuY2FsbCh0aGlzLHtpc0J1ZmZlcjpyZXF1aXJlKFwiLi4vLi4vaXMtYnVmZmVyL2luZGV4LmpzXCIpfSl9LHtcIi4uLy4uL2lzLWJ1ZmZlci9pbmRleC5qc1wiOjM5fV0sNzpbZnVuY3Rpb24ocmVxdWlyZSxtb2R1bGUsZXhwb3J0cyl7dmFyIEVsZW1lbnRUeXBlPXJlcXVpcmUoXCJkb21lbGVtZW50dHlwZVwiKTt2YXIgZW50aXRpZXM9cmVxdWlyZShcImVudGl0aWVzXCIpO3ZhciBib29sZWFuQXR0cmlidXRlcz17X19wcm90b19fOm51bGwsYWxsb3dmdWxsc2NyZWVuOnRydWUsYXN5bmM6dHJ1ZSxhdXRvZm9jdXM6dHJ1ZSxhdXRvcGxheTp0cnVlLGNoZWNrZWQ6dHJ1ZSxjb250cm9sczp0cnVlLGRlZmF1bHQ6dHJ1ZSxkZWZlcjp0cnVlLGRpc2FibGVkOnRydWUsaGlkZGVuOnRydWUsaXNtYXA6dHJ1ZSxsb29wOnRydWUsbXVsdGlwbGU6dHJ1ZSxtdXRlZDp0cnVlLG9wZW46dHJ1ZSxyZWFkb25seTp0cnVlLHJlcXVpcmVkOnRydWUscmV2ZXJzZWQ6dHJ1ZSxzY29wZWQ6dHJ1ZSxzZWFtbGVzczp0cnVlLHNlbGVjdGVkOnRydWUsdHlwZW11c3RtYXRjaDp0cnVlfTt2YXIgdW5lbmNvZGVkRWxlbWVudHM9e19fcHJvdG9fXzpudWxsLHN0eWxlOnRydWUsc2NyaXB0OnRydWUseG1wOnRydWUsaWZyYW1lOnRydWUsbm9lbWJlZDp0cnVlLG5vZnJhbWVzOnRydWUscGxhaW50ZXh0OnRydWUsbm9zY3JpcHQ6dHJ1ZX07ZnVuY3Rpb24gZm9ybWF0QXR0cnMoYXR0cmlidXRlcyxvcHRzKXtpZighYXR0cmlidXRlcylyZXR1cm47dmFyIG91dHB1dD1cIlwiLHZhbHVlO2Zvcih2YXIga2V5IGluIGF0dHJpYnV0ZXMpe3ZhbHVlPWF0dHJpYnV0ZXNba2V5XTtpZihvdXRwdXQpe291dHB1dCs9XCIgXCJ9aWYoIXZhbHVlJiZib29sZWFuQXR0cmlidXRlc1trZXldKXtvdXRwdXQrPWtleX1lbHNle291dHB1dCs9a2V5Kyc9XCInKyhvcHRzLmRlY29kZUVudGl0aWVzP2VudGl0aWVzLmVuY29kZVhNTCh2YWx1ZSk6dmFsdWUpKydcIid9fXJldHVybiBvdXRwdXR9dmFyIHNpbmdsZVRhZz17X19wcm90b19fOm51bGwsYXJlYTp0cnVlLGJhc2U6dHJ1ZSxiYXNlZm9udDp0cnVlLGJyOnRydWUsY29sOnRydWUsY29tbWFuZDp0cnVlLGVtYmVkOnRydWUsZnJhbWU6dHJ1ZSxocjp0cnVlLGltZzp0cnVlLGlucHV0OnRydWUsaXNpbmRleDp0cnVlLGtleWdlbjp0cnVlLGxpbms6dHJ1ZSxtZXRhOnRydWUscGFyYW06dHJ1ZSxzb3VyY2U6dHJ1ZSx0cmFjazp0cnVlLHdicjp0cnVlfTt2YXIgcmVuZGVyPW1vZHVsZS5leHBvcnRzPWZ1bmN0aW9uKGRvbSxvcHRzKXtpZighQXJyYXkuaXNBcnJheShkb20pJiYhZG9tLmNoZWVyaW8pZG9tPVtkb21dO29wdHM9b3B0c3x8e307dmFyIG91dHB1dD1cIlwiO2Zvcih2YXIgaT0wO2k8ZG9tLmxlbmd0aDtpKyspe3ZhciBlbGVtPWRvbVtpXTtpZihlbGVtLnR5cGU9PT1cInJvb3RcIilvdXRwdXQrPXJlbmRlcihlbGVtLmNoaWxkcmVuLG9wdHMpO2Vsc2UgaWYoRWxlbWVudFR5cGUuaXNUYWcoZWxlbSkpb3V0cHV0Kz1yZW5kZXJUYWcoZWxlbSxvcHRzKTtlbHNlIGlmKGVsZW0udHlwZT09PUVsZW1lbnRUeXBlLkRpcmVjdGl2ZSlvdXRwdXQrPXJlbmRlckRpcmVjdGl2ZShlbGVtKTtlbHNlIGlmKGVsZW0udHlwZT09PUVsZW1lbnRUeXBlLkNvbW1lbnQpb3V0cHV0Kz1yZW5kZXJDb21tZW50KGVsZW0pO2Vsc2UgaWYoZWxlbS50eXBlPT09RWxlbWVudFR5cGUuQ0RBVEEpb3V0cHV0Kz1yZW5kZXJDZGF0YShlbGVtKTtlbHNlIG91dHB1dCs9cmVuZGVyVGV4dChlbGVtLG9wdHMpfXJldHVybiBvdXRwdXR9O2Z1bmN0aW9uIHJlbmRlclRhZyhlbGVtLG9wdHMpe2lmKGVsZW0ubmFtZT09PVwic3ZnXCIpb3B0cz17ZGVjb2RlRW50aXRpZXM6b3B0cy5kZWNvZGVFbnRpdGllcyx4bWxNb2RlOnRydWV9O3ZhciB0YWc9XCI8XCIrZWxlbS5uYW1lLGF0dHJpYnM9Zm9ybWF0QXR0cnMoZWxlbS5hdHRyaWJzLG9wdHMpO2lmKGF0dHJpYnMpe3RhZys9XCIgXCIrYXR0cmlic31pZihvcHRzLnhtbE1vZGUmJighZWxlbS5jaGlsZHJlbnx8ZWxlbS5jaGlsZHJlbi5sZW5ndGg9PT0wKSl7dGFnKz1cIi8+XCJ9ZWxzZXt0YWcrPVwiPlwiO2lmKGVsZW0uY2hpbGRyZW4pe3RhZys9cmVuZGVyKGVsZW0uY2hpbGRyZW4sb3B0cyl9aWYoIXNpbmdsZVRhZ1tlbGVtLm5hbWVdfHxvcHRzLnhtbE1vZGUpe3RhZys9XCI8L1wiK2VsZW0ubmFtZStcIj5cIn19cmV0dXJuIHRhZ31mdW5jdGlvbiByZW5kZXJEaXJlY3RpdmUoZWxlbSl7cmV0dXJuXCI8XCIrZWxlbS5kYXRhK1wiPlwifWZ1bmN0aW9uIHJlbmRlclRleHQoZWxlbSxvcHRzKXt2YXIgZGF0YT1lbGVtLmRhdGF8fFwiXCI7aWYob3B0cy5kZWNvZGVFbnRpdGllcyYmIShlbGVtLnBhcmVudCYmZWxlbS5wYXJlbnQubmFtZSBpbiB1bmVuY29kZWRFbGVtZW50cykpe2RhdGE9ZW50aXRpZXMuZW5jb2RlWE1MKGRhdGEpfXJldHVybiBkYXRhfWZ1bmN0aW9uIHJlbmRlckNkYXRhKGVsZW0pe3JldHVyblwiPCFbQ0RBVEFbXCIrZWxlbS5jaGlsZHJlblswXS5kYXRhK1wiXV0+XCJ9ZnVuY3Rpb24gcmVuZGVyQ29tbWVudChlbGVtKXtyZXR1cm5cIjwhLS1cIitlbGVtLmRhdGErXCItLT5cIn19LHtkb21lbGVtZW50dHlwZTo4LGVudGl0aWVzOjIwfV0sODpbZnVuY3Rpb24ocmVxdWlyZSxtb2R1bGUsZXhwb3J0cyl7bW9kdWxlLmV4cG9ydHM9e1RleHQ6XCJ0ZXh0XCIsRGlyZWN0aXZlOlwiZGlyZWN0aXZlXCIsQ29tbWVudDpcImNvbW1lbnRcIixTY3JpcHQ6XCJzY3JpcHRcIixTdHlsZTpcInN0eWxlXCIsVGFnOlwidGFnXCIsQ0RBVEE6XCJjZGF0YVwiLGlzVGFnOmZ1bmN0aW9uKGVsZW0pe3JldHVybiBlbGVtLnR5cGU9PT1cInRhZ1wifHxlbGVtLnR5cGU9PT1cInNjcmlwdFwifHxlbGVtLnR5cGU9PT1cInN0eWxlXCJ9fX0se31dLDk6W2Z1bmN0aW9uKHJlcXVpcmUsbW9kdWxlLGV4cG9ydHMpe21vZHVsZS5leHBvcnRzPXtUZXh0OlwidGV4dFwiLERpcmVjdGl2ZTpcImRpcmVjdGl2ZVwiLENvbW1lbnQ6XCJjb21tZW50XCIsU2NyaXB0Olwic2NyaXB0XCIsU3R5bGU6XCJzdHlsZVwiLFRhZzpcInRhZ1wiLENEQVRBOlwiY2RhdGFcIixEb2N0eXBlOlwiZG9jdHlwZVwiLGlzVGFnOmZ1bmN0aW9uKGVsZW0pe3JldHVybiBlbGVtLnR5cGU9PT1cInRhZ1wifHxlbGVtLnR5cGU9PT1cInNjcmlwdFwifHxlbGVtLnR5cGU9PT1cInN0eWxlXCJ9fX0se31dLDEwOltmdW5jdGlvbihyZXF1aXJlLG1vZHVsZSxleHBvcnRzKXt2YXIgRWxlbWVudFR5cGU9cmVxdWlyZShcImRvbWVsZW1lbnR0eXBlXCIpO3ZhciByZV93aGl0ZXNwYWNlPS9cXHMrL2c7dmFyIE5vZGVQcm90b3R5cGU9cmVxdWlyZShcIi4vbGliL25vZGVcIik7dmFyIEVsZW1lbnRQcm90b3R5cGU9cmVxdWlyZShcIi4vbGliL2VsZW1lbnRcIik7ZnVuY3Rpb24gRG9tSGFuZGxlcihjYWxsYmFjayxvcHRpb25zLGVsZW1lbnRDQil7aWYodHlwZW9mIGNhbGxiYWNrPT09XCJvYmplY3RcIil7ZWxlbWVudENCPW9wdGlvbnM7b3B0aW9ucz1jYWxsYmFjaztjYWxsYmFjaz1udWxsfWVsc2UgaWYodHlwZW9mIG9wdGlvbnM9PT1cImZ1bmN0aW9uXCIpe2VsZW1lbnRDQj1vcHRpb25zO29wdGlvbnM9ZGVmYXVsdE9wdHN9dGhpcy5fY2FsbGJhY2s9Y2FsbGJhY2s7dGhpcy5fb3B0aW9ucz1vcHRpb25zfHxkZWZhdWx0T3B0czt0aGlzLl9lbGVtZW50Q0I9ZWxlbWVudENCO3RoaXMuZG9tPVtdO3RoaXMuX2RvbmU9ZmFsc2U7dGhpcy5fdGFnU3RhY2s9W107dGhpcy5fcGFyc2VyPXRoaXMuX3BhcnNlcnx8bnVsbH12YXIgZGVmYXVsdE9wdHM9e25vcm1hbGl6ZVdoaXRlc3BhY2U6ZmFsc2Usd2l0aFN0YXJ0SW5kaWNlczpmYWxzZX07RG9tSGFuZGxlci5wcm90b3R5cGUub25wYXJzZXJpbml0PWZ1bmN0aW9uKHBhcnNlcil7dGhpcy5fcGFyc2VyPXBhcnNlcn07RG9tSGFuZGxlci5wcm90b3R5cGUub25yZXNldD1mdW5jdGlvbigpe0RvbUhhbmRsZXIuY2FsbCh0aGlzLHRoaXMuX2NhbGxiYWNrLHRoaXMuX29wdGlvbnMsdGhpcy5fZWxlbWVudENCKX07RG9tSGFuZGxlci5wcm90b3R5cGUub25lbmQ9ZnVuY3Rpb24oKXtpZih0aGlzLl9kb25lKXJldHVybjt0aGlzLl9kb25lPXRydWU7dGhpcy5fcGFyc2VyPW51bGw7dGhpcy5faGFuZGxlQ2FsbGJhY2sobnVsbCl9O0RvbUhhbmRsZXIucHJvdG90eXBlLl9oYW5kbGVDYWxsYmFjaz1Eb21IYW5kbGVyLnByb3RvdHlwZS5vbmVycm9yPWZ1bmN0aW9uKGVycm9yKXtpZih0eXBlb2YgdGhpcy5fY2FsbGJhY2s9PT1cImZ1bmN0aW9uXCIpe3RoaXMuX2NhbGxiYWNrKGVycm9yLHRoaXMuZG9tKX1lbHNle2lmKGVycm9yKXRocm93IGVycm9yfX07RG9tSGFuZGxlci5wcm90b3R5cGUub25jbG9zZXRhZz1mdW5jdGlvbigpe3ZhciBlbGVtPXRoaXMuX3RhZ1N0YWNrLnBvcCgpO2lmKHRoaXMuX2VsZW1lbnRDQil0aGlzLl9lbGVtZW50Q0IoZWxlbSl9O0RvbUhhbmRsZXIucHJvdG90eXBlLl9hZGREb21FbGVtZW50PWZ1bmN0aW9uKGVsZW1lbnQpe3ZhciBwYXJlbnQ9dGhpcy5fdGFnU3RhY2tbdGhpcy5fdGFnU3RhY2subGVuZ3RoLTFdO3ZhciBzaWJsaW5ncz1wYXJlbnQ/cGFyZW50LmNoaWxkcmVuOnRoaXMuZG9tO3ZhciBwcmV2aW91c1NpYmxpbmc9c2libGluZ3Nbc2libGluZ3MubGVuZ3RoLTFdO2VsZW1lbnQubmV4dD1udWxsO2lmKHRoaXMuX29wdGlvbnMud2l0aFN0YXJ0SW5kaWNlcyl7ZWxlbWVudC5zdGFydEluZGV4PXRoaXMuX3BhcnNlci5zdGFydEluZGV4fWlmKHRoaXMuX29wdGlvbnMud2l0aERvbUx2bDEpe2VsZW1lbnQuX19wcm90b19fPWVsZW1lbnQudHlwZT09PVwidGFnXCI/RWxlbWVudFByb3RvdHlwZTpOb2RlUHJvdG90eXBlfWlmKHByZXZpb3VzU2libGluZyl7ZWxlbWVudC5wcmV2PXByZXZpb3VzU2libGluZztwcmV2aW91c1NpYmxpbmcubmV4dD1lbGVtZW50fWVsc2V7ZWxlbWVudC5wcmV2PW51bGx9c2libGluZ3MucHVzaChlbGVtZW50KTtlbGVtZW50LnBhcmVudD1wYXJlbnR8fG51bGx9O0RvbUhhbmRsZXIucHJvdG90eXBlLm9ub3BlbnRhZz1mdW5jdGlvbihuYW1lLGF0dHJpYnMpe3ZhciBlbGVtZW50PXt0eXBlOm5hbWU9PT1cInNjcmlwdFwiP0VsZW1lbnRUeXBlLlNjcmlwdDpuYW1lPT09XCJzdHlsZVwiP0VsZW1lbnRUeXBlLlN0eWxlOkVsZW1lbnRUeXBlLlRhZyxuYW1lOm5hbWUsYXR0cmliczphdHRyaWJzLGNoaWxkcmVuOltdfTt0aGlzLl9hZGREb21FbGVtZW50KGVsZW1lbnQpO3RoaXMuX3RhZ1N0YWNrLnB1c2goZWxlbWVudCl9O0RvbUhhbmRsZXIucHJvdG90eXBlLm9udGV4dD1mdW5jdGlvbihkYXRhKXt2YXIgbm9ybWFsaXplPXRoaXMuX29wdGlvbnMubm9ybWFsaXplV2hpdGVzcGFjZXx8dGhpcy5fb3B0aW9ucy5pZ25vcmVXaGl0ZXNwYWNlO3ZhciBsYXN0VGFnO2lmKCF0aGlzLl90YWdTdGFjay5sZW5ndGgmJnRoaXMuZG9tLmxlbmd0aCYmKGxhc3RUYWc9dGhpcy5kb21bdGhpcy5kb20ubGVuZ3RoLTFdKS50eXBlPT09RWxlbWVudFR5cGUuVGV4dCl7aWYobm9ybWFsaXplKXtsYXN0VGFnLmRhdGE9KGxhc3RUYWcuZGF0YStkYXRhKS5yZXBsYWNlKHJlX3doaXRlc3BhY2UsXCIgXCIpfWVsc2V7bGFzdFRhZy5kYXRhKz1kYXRhfX1lbHNle2lmKHRoaXMuX3RhZ1N0YWNrLmxlbmd0aCYmKGxhc3RUYWc9dGhpcy5fdGFnU3RhY2tbdGhpcy5fdGFnU3RhY2subGVuZ3RoLTFdKSYmKGxhc3RUYWc9bGFzdFRhZy5jaGlsZHJlbltsYXN0VGFnLmNoaWxkcmVuLmxlbmd0aC0xXSkmJmxhc3RUYWcudHlwZT09PUVsZW1lbnRUeXBlLlRleHQpe2lmKG5vcm1hbGl6ZSl7bGFzdFRhZy5kYXRhPShsYXN0VGFnLmRhdGErZGF0YSkucmVwbGFjZShyZV93aGl0ZXNwYWNlLFwiIFwiKX1lbHNle2xhc3RUYWcuZGF0YSs9ZGF0YX19ZWxzZXtpZihub3JtYWxpemUpe2RhdGE9ZGF0YS5yZXBsYWNlKHJlX3doaXRlc3BhY2UsXCIgXCIpfXRoaXMuX2FkZERvbUVsZW1lbnQoe2RhdGE6ZGF0YSx0eXBlOkVsZW1lbnRUeXBlLlRleHR9KX19fTtEb21IYW5kbGVyLnByb3RvdHlwZS5vbmNvbW1lbnQ9ZnVuY3Rpb24oZGF0YSl7dmFyIGxhc3RUYWc9dGhpcy5fdGFnU3RhY2tbdGhpcy5fdGFnU3RhY2subGVuZ3RoLTFdO2lmKGxhc3RUYWcmJmxhc3RUYWcudHlwZT09PUVsZW1lbnRUeXBlLkNvbW1lbnQpe2xhc3RUYWcuZGF0YSs9ZGF0YTtyZXR1cm59dmFyIGVsZW1lbnQ9e2RhdGE6ZGF0YSx0eXBlOkVsZW1lbnRUeXBlLkNvbW1lbnR9O3RoaXMuX2FkZERvbUVsZW1lbnQoZWxlbWVudCk7dGhpcy5fdGFnU3RhY2sucHVzaChlbGVtZW50KX07RG9tSGFuZGxlci5wcm90b3R5cGUub25jZGF0YXN0YXJ0PWZ1bmN0aW9uKCl7dmFyIGVsZW1lbnQ9e2NoaWxkcmVuOlt7ZGF0YTpcIlwiLHR5cGU6RWxlbWVudFR5cGUuVGV4dH1dLHR5cGU6RWxlbWVudFR5cGUuQ0RBVEF9O3RoaXMuX2FkZERvbUVsZW1lbnQoZWxlbWVudCk7dGhpcy5fdGFnU3RhY2sucHVzaChlbGVtZW50KX07RG9tSGFuZGxlci5wcm90b3R5cGUub25jb21tZW50ZW5kPURvbUhhbmRsZXIucHJvdG90eXBlLm9uY2RhdGFlbmQ9ZnVuY3Rpb24oKXt0aGlzLl90YWdTdGFjay5wb3AoKX07RG9tSGFuZGxlci5wcm90b3R5cGUub25wcm9jZXNzaW5naW5zdHJ1Y3Rpb249ZnVuY3Rpb24obmFtZSxkYXRhKXt0aGlzLl9hZGREb21FbGVtZW50KHtuYW1lOm5hbWUsZGF0YTpkYXRhLHR5cGU6RWxlbWVudFR5cGUuRGlyZWN0aXZlfSl9O21vZHVsZS5leHBvcnRzPURvbUhhbmRsZXJ9LHtcIi4vbGliL2VsZW1lbnRcIjoxMSxcIi4vbGliL25vZGVcIjoxMixkb21lbGVtZW50dHlwZTo5fV0sMTE6W2Z1bmN0aW9uKHJlcXVpcmUsbW9kdWxlLGV4cG9ydHMpe3ZhciBOb2RlUHJvdG90eXBlPXJlcXVpcmUoXCIuL25vZGVcIik7dmFyIEVsZW1lbnRQcm90b3R5cGU9bW9kdWxlLmV4cG9ydHM9T2JqZWN0LmNyZWF0ZShOb2RlUHJvdG90eXBlKTt2YXIgZG9tTHZsMT17dGFnTmFtZTpcIm5hbWVcIn07T2JqZWN0LmtleXMoZG9tTHZsMSkuZm9yRWFjaChmdW5jdGlvbihrZXkpe3ZhciBzaG9ydGhhbmQ9ZG9tTHZsMVtrZXldO09iamVjdC5kZWZpbmVQcm9wZXJ0eShFbGVtZW50UHJvdG90eXBlLGtleSx7Z2V0OmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXNbc2hvcnRoYW5kXXx8bnVsbH0sc2V0OmZ1bmN0aW9uKHZhbCl7dGhpc1tzaG9ydGhhbmRdPXZhbDtyZXR1cm4gdmFsfX0pfSl9LHtcIi4vbm9kZVwiOjEyfV0sMTI6W2Z1bmN0aW9uKHJlcXVpcmUsbW9kdWxlLGV4cG9ydHMpe3ZhciBOb2RlUHJvdG90eXBlPW1vZHVsZS5leHBvcnRzPXtnZXQgZmlyc3RDaGlsZCgpe3ZhciBjaGlsZHJlbj10aGlzLmNoaWxkcmVuO3JldHVybiBjaGlsZHJlbiYmY2hpbGRyZW5bMF18fG51bGx9LGdldCBsYXN0Q2hpbGQoKXt2YXIgY2hpbGRyZW49dGhpcy5jaGlsZHJlbjtyZXR1cm4gY2hpbGRyZW4mJmNoaWxkcmVuW2NoaWxkcmVuLmxlbmd0aC0xXXx8bnVsbH0sZ2V0IG5vZGVUeXBlKCl7cmV0dXJuIG5vZGVUeXBlc1t0aGlzLnR5cGVdfHxub2RlVHlwZXMuZWxlbWVudH19O3ZhciBkb21MdmwxPXt0YWdOYW1lOlwibmFtZVwiLGNoaWxkTm9kZXM6XCJjaGlsZHJlblwiLHBhcmVudE5vZGU6XCJwYXJlbnRcIixwcmV2aW91c1NpYmxpbmc6XCJwcmV2XCIsbmV4dFNpYmxpbmc6XCJuZXh0XCIsbm9kZVZhbHVlOlwiZGF0YVwifTt2YXIgbm9kZVR5cGVzPXtlbGVtZW50OjEsdGV4dDozLGNkYXRhOjQsY29tbWVudDo4fTtPYmplY3Qua2V5cyhkb21MdmwxKS5mb3JFYWNoKGZ1bmN0aW9uKGtleSl7dmFyIHNob3J0aGFuZD1kb21MdmwxW2tleV07T2JqZWN0LmRlZmluZVByb3BlcnR5KE5vZGVQcm90b3R5cGUsa2V5LHtnZXQ6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpc1tzaG9ydGhhbmRdfHxudWxsfSxzZXQ6ZnVuY3Rpb24odmFsKXt0aGlzW3Nob3J0aGFuZF09dmFsO3JldHVybiB2YWx9fSl9KX0se31dLDEzOltmdW5jdGlvbihyZXF1aXJlLG1vZHVsZSxleHBvcnRzKXt2YXIgRG9tVXRpbHM9bW9kdWxlLmV4cG9ydHM7W3JlcXVpcmUoXCIuL2xpYi9zdHJpbmdpZnlcIikscmVxdWlyZShcIi4vbGliL3RyYXZlcnNhbFwiKSxyZXF1aXJlKFwiLi9saWIvbWFuaXB1bGF0aW9uXCIpLHJlcXVpcmUoXCIuL2xpYi9xdWVyeWluZ1wiKSxyZXF1aXJlKFwiLi9saWIvbGVnYWN5XCIpLHJlcXVpcmUoXCIuL2xpYi9oZWxwZXJzXCIpXS5mb3JFYWNoKGZ1bmN0aW9uKGV4dCl7T2JqZWN0LmtleXMoZXh0KS5mb3JFYWNoKGZ1bmN0aW9uKGtleSl7RG9tVXRpbHNba2V5XT1leHRba2V5XS5iaW5kKERvbVV0aWxzKX0pfSl9LHtcIi4vbGliL2hlbHBlcnNcIjoxNCxcIi4vbGliL2xlZ2FjeVwiOjE1LFwiLi9saWIvbWFuaXB1bGF0aW9uXCI6MTYsXCIuL2xpYi9xdWVyeWluZ1wiOjE3LFwiLi9saWIvc3RyaW5naWZ5XCI6MTgsXCIuL2xpYi90cmF2ZXJzYWxcIjoxOX1dLDE0OltmdW5jdGlvbihyZXF1aXJlLG1vZHVsZSxleHBvcnRzKXtleHBvcnRzLnJlbW92ZVN1YnNldHM9ZnVuY3Rpb24obm9kZXMpe3ZhciBpZHg9bm9kZXMubGVuZ3RoLG5vZGUsYW5jZXN0b3IscmVwbGFjZTt3aGlsZSgtLWlkeD4tMSl7bm9kZT1hbmNlc3Rvcj1ub2Rlc1tpZHhdO25vZGVzW2lkeF09bnVsbDtyZXBsYWNlPXRydWU7d2hpbGUoYW5jZXN0b3Ipe2lmKG5vZGVzLmluZGV4T2YoYW5jZXN0b3IpPi0xKXtyZXBsYWNlPWZhbHNlO25vZGVzLnNwbGljZShpZHgsMSk7YnJlYWt9YW5jZXN0b3I9YW5jZXN0b3IucGFyZW50fWlmKHJlcGxhY2Upe25vZGVzW2lkeF09bm9kZX19cmV0dXJuIG5vZGVzfTt2YXIgUE9TSVRJT049e0RJU0NPTk5FQ1RFRDoxLFBSRUNFRElORzoyLEZPTExPV0lORzo0LENPTlRBSU5TOjgsQ09OVEFJTkVEX0JZOjE2fTt2YXIgY29tcGFyZVBvcz1leHBvcnRzLmNvbXBhcmVEb2N1bWVudFBvc2l0aW9uPWZ1bmN0aW9uKG5vZGVBLG5vZGVCKXt2YXIgYVBhcmVudHM9W107dmFyIGJQYXJlbnRzPVtdO3ZhciBjdXJyZW50LHNoYXJlZFBhcmVudCxzaWJsaW5ncyxhU2libGluZyxiU2libGluZyxpZHg7aWYobm9kZUE9PT1ub2RlQil7cmV0dXJuIDB9Y3VycmVudD1ub2RlQTt3aGlsZShjdXJyZW50KXthUGFyZW50cy51bnNoaWZ0KGN1cnJlbnQpO2N1cnJlbnQ9Y3VycmVudC5wYXJlbnR9Y3VycmVudD1ub2RlQjt3aGlsZShjdXJyZW50KXtiUGFyZW50cy51bnNoaWZ0KGN1cnJlbnQpO2N1cnJlbnQ9Y3VycmVudC5wYXJlbnR9aWR4PTA7d2hpbGUoYVBhcmVudHNbaWR4XT09PWJQYXJlbnRzW2lkeF0pe2lkeCsrfWlmKGlkeD09PTApe3JldHVybiBQT1NJVElPTi5ESVNDT05ORUNURUR9c2hhcmVkUGFyZW50PWFQYXJlbnRzW2lkeC0xXTtzaWJsaW5ncz1zaGFyZWRQYXJlbnQuY2hpbGRyZW47YVNpYmxpbmc9YVBhcmVudHNbaWR4XTtiU2libGluZz1iUGFyZW50c1tpZHhdO2lmKHNpYmxpbmdzLmluZGV4T2YoYVNpYmxpbmcpPnNpYmxpbmdzLmluZGV4T2YoYlNpYmxpbmcpKXtpZihzaGFyZWRQYXJlbnQ9PT1ub2RlQil7cmV0dXJuIFBPU0lUSU9OLkZPTExPV0lOR3xQT1NJVElPTi5DT05UQUlORURfQll9cmV0dXJuIFBPU0lUSU9OLkZPTExPV0lOR31lbHNle2lmKHNoYXJlZFBhcmVudD09PW5vZGVBKXtyZXR1cm4gUE9TSVRJT04uUFJFQ0VESU5HfFBPU0lUSU9OLkNPTlRBSU5TfXJldHVybiBQT1NJVElPTi5QUkVDRURJTkd9fTtleHBvcnRzLnVuaXF1ZVNvcnQ9ZnVuY3Rpb24obm9kZXMpe3ZhciBpZHg9bm9kZXMubGVuZ3RoLG5vZGUscG9zaXRpb247bm9kZXM9bm9kZXMuc2xpY2UoKTt3aGlsZSgtLWlkeD4tMSl7bm9kZT1ub2Rlc1tpZHhdO3Bvc2l0aW9uPW5vZGVzLmluZGV4T2Yobm9kZSk7aWYocG9zaXRpb24+LTEmJnBvc2l0aW9uPGlkeCl7bm9kZXMuc3BsaWNlKGlkeCwxKX19bm9kZXMuc29ydChmdW5jdGlvbihhLGIpe3ZhciByZWxhdGl2ZT1jb21wYXJlUG9zKGEsYik7aWYocmVsYXRpdmUmUE9TSVRJT04uUFJFQ0VESU5HKXtyZXR1cm4tMX1lbHNlIGlmKHJlbGF0aXZlJlBPU0lUSU9OLkZPTExPV0lORyl7cmV0dXJuIDF9cmV0dXJuIDB9KTtyZXR1cm4gbm9kZXN9fSx7fV0sMTU6W2Z1bmN0aW9uKHJlcXVpcmUsbW9kdWxlLGV4cG9ydHMpe3ZhciBFbGVtZW50VHlwZT1yZXF1aXJlKFwiZG9tZWxlbWVudHR5cGVcIik7dmFyIGlzVGFnPWV4cG9ydHMuaXNUYWc9RWxlbWVudFR5cGUuaXNUYWc7ZXhwb3J0cy50ZXN0RWxlbWVudD1mdW5jdGlvbihvcHRpb25zLGVsZW1lbnQpe2Zvcih2YXIga2V5IGluIG9wdGlvbnMpe2lmKCFvcHRpb25zLmhhc093blByb3BlcnR5KGtleSkpO2Vsc2UgaWYoa2V5PT09XCJ0YWdfbmFtZVwiKXtpZighaXNUYWcoZWxlbWVudCl8fCFvcHRpb25zLnRhZ19uYW1lKGVsZW1lbnQubmFtZSkpe3JldHVybiBmYWxzZX19ZWxzZSBpZihrZXk9PT1cInRhZ190eXBlXCIpe2lmKCFvcHRpb25zLnRhZ190eXBlKGVsZW1lbnQudHlwZSkpcmV0dXJuIGZhbHNlfWVsc2UgaWYoa2V5PT09XCJ0YWdfY29udGFpbnNcIil7aWYoaXNUYWcoZWxlbWVudCl8fCFvcHRpb25zLnRhZ19jb250YWlucyhlbGVtZW50LmRhdGEpKXtyZXR1cm4gZmFsc2V9fWVsc2UgaWYoIWVsZW1lbnQuYXR0cmlic3x8IW9wdGlvbnNba2V5XShlbGVtZW50LmF0dHJpYnNba2V5XSkpe3JldHVybiBmYWxzZX19cmV0dXJuIHRydWV9O3ZhciBDaGVja3M9e3RhZ19uYW1lOmZ1bmN0aW9uKG5hbWUpe2lmKHR5cGVvZiBuYW1lPT09XCJmdW5jdGlvblwiKXtyZXR1cm4gZnVuY3Rpb24oZWxlbSl7cmV0dXJuIGlzVGFnKGVsZW0pJiZuYW1lKGVsZW0ubmFtZSl9fWVsc2UgaWYobmFtZT09PVwiKlwiKXtyZXR1cm4gaXNUYWd9ZWxzZXtyZXR1cm4gZnVuY3Rpb24oZWxlbSl7cmV0dXJuIGlzVGFnKGVsZW0pJiZlbGVtLm5hbWU9PT1uYW1lfX19LHRhZ190eXBlOmZ1bmN0aW9uKHR5cGUpe2lmKHR5cGVvZiB0eXBlPT09XCJmdW5jdGlvblwiKXtyZXR1cm4gZnVuY3Rpb24oZWxlbSl7cmV0dXJuIHR5cGUoZWxlbS50eXBlKX19ZWxzZXtyZXR1cm4gZnVuY3Rpb24oZWxlbSl7cmV0dXJuIGVsZW0udHlwZT09PXR5cGV9fX0sdGFnX2NvbnRhaW5zOmZ1bmN0aW9uKGRhdGEpe2lmKHR5cGVvZiBkYXRhPT09XCJmdW5jdGlvblwiKXtyZXR1cm4gZnVuY3Rpb24oZWxlbSl7cmV0dXJuIWlzVGFnKGVsZW0pJiZkYXRhKGVsZW0uZGF0YSl9fWVsc2V7cmV0dXJuIGZ1bmN0aW9uKGVsZW0pe3JldHVybiFpc1RhZyhlbGVtKSYmZWxlbS5kYXRhPT09ZGF0YX19fX07ZnVuY3Rpb24gZ2V0QXR0cmliQ2hlY2soYXR0cmliLHZhbHVlKXtpZih0eXBlb2YgdmFsdWU9PT1cImZ1bmN0aW9uXCIpe3JldHVybiBmdW5jdGlvbihlbGVtKXtyZXR1cm4gZWxlbS5hdHRyaWJzJiZ2YWx1ZShlbGVtLmF0dHJpYnNbYXR0cmliXSl9fWVsc2V7cmV0dXJuIGZ1bmN0aW9uKGVsZW0pe3JldHVybiBlbGVtLmF0dHJpYnMmJmVsZW0uYXR0cmlic1thdHRyaWJdPT09dmFsdWV9fX1mdW5jdGlvbiBjb21iaW5lRnVuY3MoYSxiKXtyZXR1cm4gZnVuY3Rpb24oZWxlbSl7cmV0dXJuIGEoZWxlbSl8fGIoZWxlbSl9fWV4cG9ydHMuZ2V0RWxlbWVudHM9ZnVuY3Rpb24ob3B0aW9ucyxlbGVtZW50LHJlY3Vyc2UsbGltaXQpe3ZhciBmdW5jcz1PYmplY3Qua2V5cyhvcHRpb25zKS5tYXAoZnVuY3Rpb24oa2V5KXt2YXIgdmFsdWU9b3B0aW9uc1trZXldO3JldHVybiBrZXkgaW4gQ2hlY2tzP0NoZWNrc1trZXldKHZhbHVlKTpnZXRBdHRyaWJDaGVjayhrZXksdmFsdWUpfSk7cmV0dXJuIGZ1bmNzLmxlbmd0aD09PTA/W106dGhpcy5maWx0ZXIoZnVuY3MucmVkdWNlKGNvbWJpbmVGdW5jcyksZWxlbWVudCxyZWN1cnNlLGxpbWl0KX07ZXhwb3J0cy5nZXRFbGVtZW50QnlJZD1mdW5jdGlvbihpZCxlbGVtZW50LHJlY3Vyc2Upe2lmKCFBcnJheS5pc0FycmF5KGVsZW1lbnQpKWVsZW1lbnQ9W2VsZW1lbnRdO3JldHVybiB0aGlzLmZpbmRPbmUoZ2V0QXR0cmliQ2hlY2soXCJpZFwiLGlkKSxlbGVtZW50LHJlY3Vyc2UhPT1mYWxzZSl9O2V4cG9ydHMuZ2V0RWxlbWVudHNCeVRhZ05hbWU9ZnVuY3Rpb24obmFtZSxlbGVtZW50LHJlY3Vyc2UsbGltaXQpe3JldHVybiB0aGlzLmZpbHRlcihDaGVja3MudGFnX25hbWUobmFtZSksZWxlbWVudCxyZWN1cnNlLGxpbWl0KX07ZXhwb3J0cy5nZXRFbGVtZW50c0J5VGFnVHlwZT1mdW5jdGlvbih0eXBlLGVsZW1lbnQscmVjdXJzZSxsaW1pdCl7cmV0dXJuIHRoaXMuZmlsdGVyKENoZWNrcy50YWdfdHlwZSh0eXBlKSxlbGVtZW50LHJlY3Vyc2UsbGltaXQpfX0se2RvbWVsZW1lbnR0eXBlOjl9XSwxNjpbZnVuY3Rpb24ocmVxdWlyZSxtb2R1bGUsZXhwb3J0cyl7ZXhwb3J0cy5yZW1vdmVFbGVtZW50PWZ1bmN0aW9uKGVsZW0pe2lmKGVsZW0ucHJldillbGVtLnByZXYubmV4dD1lbGVtLm5leHQ7aWYoZWxlbS5uZXh0KWVsZW0ubmV4dC5wcmV2PWVsZW0ucHJldjtpZihlbGVtLnBhcmVudCl7dmFyIGNoaWxkcz1lbGVtLnBhcmVudC5jaGlsZHJlbjtjaGlsZHMuc3BsaWNlKGNoaWxkcy5sYXN0SW5kZXhPZihlbGVtKSwxKX19O2V4cG9ydHMucmVwbGFjZUVsZW1lbnQ9ZnVuY3Rpb24oZWxlbSxyZXBsYWNlbWVudCl7dmFyIHByZXY9cmVwbGFjZW1lbnQucHJldj1lbGVtLnByZXY7aWYocHJldil7cHJldi5uZXh0PXJlcGxhY2VtZW50fXZhciBuZXh0PXJlcGxhY2VtZW50Lm5leHQ9ZWxlbS5uZXh0O2lmKG5leHQpe25leHQucHJldj1yZXBsYWNlbWVudH12YXIgcGFyZW50PXJlcGxhY2VtZW50LnBhcmVudD1lbGVtLnBhcmVudDtpZihwYXJlbnQpe3ZhciBjaGlsZHM9cGFyZW50LmNoaWxkcmVuO2NoaWxkc1tjaGlsZHMubGFzdEluZGV4T2YoZWxlbSldPXJlcGxhY2VtZW50fX07ZXhwb3J0cy5hcHBlbmRDaGlsZD1mdW5jdGlvbihlbGVtLGNoaWxkKXtjaGlsZC5wYXJlbnQ9ZWxlbTtpZihlbGVtLmNoaWxkcmVuLnB1c2goY2hpbGQpIT09MSl7dmFyIHNpYmxpbmc9ZWxlbS5jaGlsZHJlbltlbGVtLmNoaWxkcmVuLmxlbmd0aC0yXTtzaWJsaW5nLm5leHQ9Y2hpbGQ7Y2hpbGQucHJldj1zaWJsaW5nO2NoaWxkLm5leHQ9bnVsbH19O2V4cG9ydHMuYXBwZW5kPWZ1bmN0aW9uKGVsZW0sbmV4dCl7dmFyIHBhcmVudD1lbGVtLnBhcmVudCxjdXJyTmV4dD1lbGVtLm5leHQ7bmV4dC5uZXh0PWN1cnJOZXh0O25leHQucHJldj1lbGVtO2VsZW0ubmV4dD1uZXh0O25leHQucGFyZW50PXBhcmVudDtpZihjdXJyTmV4dCl7Y3Vyck5leHQucHJldj1uZXh0O2lmKHBhcmVudCl7dmFyIGNoaWxkcz1wYXJlbnQuY2hpbGRyZW47Y2hpbGRzLnNwbGljZShjaGlsZHMubGFzdEluZGV4T2YoY3Vyck5leHQpLDAsbmV4dCl9fWVsc2UgaWYocGFyZW50KXtwYXJlbnQuY2hpbGRyZW4ucHVzaChuZXh0KX19O2V4cG9ydHMucHJlcGVuZD1mdW5jdGlvbihlbGVtLHByZXYpe3ZhciBwYXJlbnQ9ZWxlbS5wYXJlbnQ7aWYocGFyZW50KXt2YXIgY2hpbGRzPXBhcmVudC5jaGlsZHJlbjtjaGlsZHMuc3BsaWNlKGNoaWxkcy5sYXN0SW5kZXhPZihlbGVtKSwwLHByZXYpfWlmKGVsZW0ucHJldil7ZWxlbS5wcmV2Lm5leHQ9cHJldn1wcmV2LnBhcmVudD1wYXJlbnQ7cHJldi5wcmV2PWVsZW0ucHJldjtwcmV2Lm5leHQ9ZWxlbTtlbGVtLnByZXY9cHJldn19LHt9XSwxNzpbZnVuY3Rpb24ocmVxdWlyZSxtb2R1bGUsZXhwb3J0cyl7dmFyIGlzVGFnPXJlcXVpcmUoXCJkb21lbGVtZW50dHlwZVwiKS5pc1RhZzttb2R1bGUuZXhwb3J0cz17ZmlsdGVyOmZpbHRlcixmaW5kOmZpbmQsZmluZE9uZUNoaWxkOmZpbmRPbmVDaGlsZCxmaW5kT25lOmZpbmRPbmUsZXhpc3RzT25lOmV4aXN0c09uZSxmaW5kQWxsOmZpbmRBbGx9O2Z1bmN0aW9uIGZpbHRlcih0ZXN0LGVsZW1lbnQscmVjdXJzZSxsaW1pdCl7aWYoIUFycmF5LmlzQXJyYXkoZWxlbWVudCkpZWxlbWVudD1bZWxlbWVudF07aWYodHlwZW9mIGxpbWl0IT09XCJudW1iZXJcInx8IWlzRmluaXRlKGxpbWl0KSl7bGltaXQ9SW5maW5pdHl9cmV0dXJuIGZpbmQodGVzdCxlbGVtZW50LHJlY3Vyc2UhPT1mYWxzZSxsaW1pdCl9ZnVuY3Rpb24gZmluZCh0ZXN0LGVsZW1zLHJlY3Vyc2UsbGltaXQpe3ZhciByZXN1bHQ9W10sY2hpbGRzO2Zvcih2YXIgaT0wLGo9ZWxlbXMubGVuZ3RoO2k8ajtpKyspe2lmKHRlc3QoZWxlbXNbaV0pKXtyZXN1bHQucHVzaChlbGVtc1tpXSk7aWYoLS1saW1pdDw9MClicmVha31jaGlsZHM9ZWxlbXNbaV0uY2hpbGRyZW47aWYocmVjdXJzZSYmY2hpbGRzJiZjaGlsZHMubGVuZ3RoPjApe2NoaWxkcz1maW5kKHRlc3QsY2hpbGRzLHJlY3Vyc2UsbGltaXQpO3Jlc3VsdD1yZXN1bHQuY29uY2F0KGNoaWxkcyk7bGltaXQtPWNoaWxkcy5sZW5ndGg7aWYobGltaXQ8PTApYnJlYWt9fXJldHVybiByZXN1bHR9ZnVuY3Rpb24gZmluZE9uZUNoaWxkKHRlc3QsZWxlbXMpe2Zvcih2YXIgaT0wLGw9ZWxlbXMubGVuZ3RoO2k8bDtpKyspe2lmKHRlc3QoZWxlbXNbaV0pKXJldHVybiBlbGVtc1tpXX1yZXR1cm4gbnVsbH1mdW5jdGlvbiBmaW5kT25lKHRlc3QsZWxlbXMpe3ZhciBlbGVtPW51bGw7Zm9yKHZhciBpPTAsbD1lbGVtcy5sZW5ndGg7aTxsJiYhZWxlbTtpKyspe2lmKCFpc1RhZyhlbGVtc1tpXSkpe2NvbnRpbnVlfWVsc2UgaWYodGVzdChlbGVtc1tpXSkpe2VsZW09ZWxlbXNbaV19ZWxzZSBpZihlbGVtc1tpXS5jaGlsZHJlbi5sZW5ndGg+MCl7ZWxlbT1maW5kT25lKHRlc3QsZWxlbXNbaV0uY2hpbGRyZW4pfX1yZXR1cm4gZWxlbX1mdW5jdGlvbiBleGlzdHNPbmUodGVzdCxlbGVtcyl7Zm9yKHZhciBpPTAsbD1lbGVtcy5sZW5ndGg7aTxsO2krKyl7aWYoaXNUYWcoZWxlbXNbaV0pJiYodGVzdChlbGVtc1tpXSl8fGVsZW1zW2ldLmNoaWxkcmVuLmxlbmd0aD4wJiZleGlzdHNPbmUodGVzdCxlbGVtc1tpXS5jaGlsZHJlbikpKXtyZXR1cm4gdHJ1ZX19cmV0dXJuIGZhbHNlfWZ1bmN0aW9uIGZpbmRBbGwodGVzdCxlbGVtcyl7dmFyIHJlc3VsdD1bXTtmb3IodmFyIGk9MCxqPWVsZW1zLmxlbmd0aDtpPGo7aSsrKXtpZighaXNUYWcoZWxlbXNbaV0pKWNvbnRpbnVlO2lmKHRlc3QoZWxlbXNbaV0pKXJlc3VsdC5wdXNoKGVsZW1zW2ldKTtpZihlbGVtc1tpXS5jaGlsZHJlbi5sZW5ndGg+MCl7cmVzdWx0PXJlc3VsdC5jb25jYXQoZmluZEFsbCh0ZXN0LGVsZW1zW2ldLmNoaWxkcmVuKSl9fXJldHVybiByZXN1bHR9fSx7ZG9tZWxlbWVudHR5cGU6OX1dLDE4OltmdW5jdGlvbihyZXF1aXJlLG1vZHVsZSxleHBvcnRzKXt2YXIgRWxlbWVudFR5cGU9cmVxdWlyZShcImRvbWVsZW1lbnR0eXBlXCIpLGdldE91dGVySFRNTD1yZXF1aXJlKFwiZG9tLXNlcmlhbGl6ZXJcIiksaXNUYWc9RWxlbWVudFR5cGUuaXNUYWc7bW9kdWxlLmV4cG9ydHM9e2dldElubmVySFRNTDpnZXRJbm5lckhUTUwsZ2V0T3V0ZXJIVE1MOmdldE91dGVySFRNTCxnZXRUZXh0OmdldFRleHR9O2Z1bmN0aW9uIGdldElubmVySFRNTChlbGVtLG9wdHMpe3JldHVybiBlbGVtLmNoaWxkcmVuP2VsZW0uY2hpbGRyZW4ubWFwKGZ1bmN0aW9uKGVsZW0pe3JldHVybiBnZXRPdXRlckhUTUwoZWxlbSxvcHRzKX0pLmpvaW4oXCJcIik6XCJcIn1mdW5jdGlvbiBnZXRUZXh0KGVsZW0pe2lmKEFycmF5LmlzQXJyYXkoZWxlbSkpcmV0dXJuIGVsZW0ubWFwKGdldFRleHQpLmpvaW4oXCJcIik7aWYoaXNUYWcoZWxlbSl8fGVsZW0udHlwZT09PUVsZW1lbnRUeXBlLkNEQVRBKXJldHVybiBnZXRUZXh0KGVsZW0uY2hpbGRyZW4pO2lmKGVsZW0udHlwZT09PUVsZW1lbnRUeXBlLlRleHQpcmV0dXJuIGVsZW0uZGF0YTtyZXR1cm5cIlwifX0se1wiZG9tLXNlcmlhbGl6ZXJcIjo3LGRvbWVsZW1lbnR0eXBlOjl9XSwxOTpbZnVuY3Rpb24ocmVxdWlyZSxtb2R1bGUsZXhwb3J0cyl7dmFyIGdldENoaWxkcmVuPWV4cG9ydHMuZ2V0Q2hpbGRyZW49ZnVuY3Rpb24oZWxlbSl7cmV0dXJuIGVsZW0uY2hpbGRyZW59O3ZhciBnZXRQYXJlbnQ9ZXhwb3J0cy5nZXRQYXJlbnQ9ZnVuY3Rpb24oZWxlbSl7cmV0dXJuIGVsZW0ucGFyZW50fTtleHBvcnRzLmdldFNpYmxpbmdzPWZ1bmN0aW9uKGVsZW0pe3ZhciBwYXJlbnQ9Z2V0UGFyZW50KGVsZW0pO3JldHVybiBwYXJlbnQ/Z2V0Q2hpbGRyZW4ocGFyZW50KTpbZWxlbV19O2V4cG9ydHMuZ2V0QXR0cmlidXRlVmFsdWU9ZnVuY3Rpb24oZWxlbSxuYW1lKXtyZXR1cm4gZWxlbS5hdHRyaWJzJiZlbGVtLmF0dHJpYnNbbmFtZV19O2V4cG9ydHMuaGFzQXR0cmliPWZ1bmN0aW9uKGVsZW0sbmFtZSl7cmV0dXJuISFlbGVtLmF0dHJpYnMmJmhhc093blByb3BlcnR5LmNhbGwoZWxlbS5hdHRyaWJzLG5hbWUpfTtleHBvcnRzLmdldE5hbWU9ZnVuY3Rpb24oZWxlbSl7cmV0dXJuIGVsZW0ubmFtZX19LHt9XSwyMDpbZnVuY3Rpb24ocmVxdWlyZSxtb2R1bGUsZXhwb3J0cyl7dmFyIGVuY29kZT1yZXF1aXJlKFwiLi9saWIvZW5jb2RlLmpzXCIpLGRlY29kZT1yZXF1aXJlKFwiLi9saWIvZGVjb2RlLmpzXCIpO2V4cG9ydHMuZGVjb2RlPWZ1bmN0aW9uKGRhdGEsbGV2ZWwpe3JldHVybighbGV2ZWx8fGxldmVsPD0wP2RlY29kZS5YTUw6ZGVjb2RlLkhUTUwpKGRhdGEpfTtleHBvcnRzLmRlY29kZVN0cmljdD1mdW5jdGlvbihkYXRhLGxldmVsKXtyZXR1cm4oIWxldmVsfHxsZXZlbDw9MD9kZWNvZGUuWE1MOmRlY29kZS5IVE1MU3RyaWN0KShkYXRhKX07ZXhwb3J0cy5lbmNvZGU9ZnVuY3Rpb24oZGF0YSxsZXZlbCl7cmV0dXJuKCFsZXZlbHx8bGV2ZWw8PTA/ZW5jb2RlLlhNTDplbmNvZGUuSFRNTCkoZGF0YSl9O2V4cG9ydHMuZW5jb2RlWE1MPWVuY29kZS5YTUw7ZXhwb3J0cy5lbmNvZGVIVE1MND1leHBvcnRzLmVuY29kZUhUTUw1PWV4cG9ydHMuZW5jb2RlSFRNTD1lbmNvZGUuSFRNTDtleHBvcnRzLmRlY29kZVhNTD1leHBvcnRzLmRlY29kZVhNTFN0cmljdD1kZWNvZGUuWE1MO2V4cG9ydHMuZGVjb2RlSFRNTDQ9ZXhwb3J0cy5kZWNvZGVIVE1MNT1leHBvcnRzLmRlY29kZUhUTUw9ZGVjb2RlLkhUTUw7ZXhwb3J0cy5kZWNvZGVIVE1MNFN0cmljdD1leHBvcnRzLmRlY29kZUhUTUw1U3RyaWN0PWV4cG9ydHMuZGVjb2RlSFRNTFN0cmljdD1kZWNvZGUuSFRNTFN0cmljdDtleHBvcnRzLmVzY2FwZT1lbmNvZGUuZXNjYXBlfSx7XCIuL2xpYi9kZWNvZGUuanNcIjoyMSxcIi4vbGliL2VuY29kZS5qc1wiOjIzfV0sMjE6W2Z1bmN0aW9uKHJlcXVpcmUsbW9kdWxlLGV4cG9ydHMpe3ZhciBlbnRpdHlNYXA9cmVxdWlyZShcIi4uL21hcHMvZW50aXRpZXMuanNvblwiKSxsZWdhY3lNYXA9cmVxdWlyZShcIi4uL21hcHMvbGVnYWN5Lmpzb25cIikseG1sTWFwPXJlcXVpcmUoXCIuLi9tYXBzL3htbC5qc29uXCIpLGRlY29kZUNvZGVQb2ludD1yZXF1aXJlKFwiLi9kZWNvZGVfY29kZXBvaW50LmpzXCIpO3ZhciBkZWNvZGVYTUxTdHJpY3Q9Z2V0U3RyaWN0RGVjb2Rlcih4bWxNYXApLGRlY29kZUhUTUxTdHJpY3Q9Z2V0U3RyaWN0RGVjb2RlcihlbnRpdHlNYXApO2Z1bmN0aW9uIGdldFN0cmljdERlY29kZXIobWFwKXt2YXIga2V5cz1PYmplY3Qua2V5cyhtYXApLmpvaW4oXCJ8XCIpLHJlcGxhY2U9Z2V0UmVwbGFjZXIobWFwKTtrZXlzKz1cInwjW3hYXVtcXFxcZGEtZkEtRl0rfCNcXFxcZCtcIjt2YXIgcmU9bmV3IFJlZ0V4cChcIiYoPzpcIitrZXlzK1wiKTtcIixcImdcIik7cmV0dXJuIGZ1bmN0aW9uKHN0cil7cmV0dXJuIFN0cmluZyhzdHIpLnJlcGxhY2UocmUscmVwbGFjZSl9fXZhciBkZWNvZGVIVE1MPWZ1bmN0aW9uKCl7dmFyIGxlZ2FjeT1PYmplY3Qua2V5cyhsZWdhY3lNYXApLnNvcnQoc29ydGVyKTt2YXIga2V5cz1PYmplY3Qua2V5cyhlbnRpdHlNYXApLnNvcnQoc29ydGVyKTtmb3IodmFyIGk9MCxqPTA7aTxrZXlzLmxlbmd0aDtpKyspe2lmKGxlZ2FjeVtqXT09PWtleXNbaV0pe2tleXNbaV0rPVwiOz9cIjtqKyt9ZWxzZXtrZXlzW2ldKz1cIjtcIn19dmFyIHJlPW5ldyBSZWdFeHAoXCImKD86XCIra2V5cy5qb2luKFwifFwiKStcInwjW3hYXVtcXFxcZGEtZkEtRl0rOz98I1xcXFxkKzs/KVwiLFwiZ1wiKSxyZXBsYWNlPWdldFJlcGxhY2VyKGVudGl0eU1hcCk7ZnVuY3Rpb24gcmVwbGFjZXIoc3RyKXtpZihzdHIuc3Vic3RyKC0xKSE9PVwiO1wiKXN0cis9XCI7XCI7cmV0dXJuIHJlcGxhY2Uoc3RyKX1yZXR1cm4gZnVuY3Rpb24oc3RyKXtyZXR1cm4gU3RyaW5nKHN0cikucmVwbGFjZShyZSxyZXBsYWNlcil9fSgpO2Z1bmN0aW9uIHNvcnRlcihhLGIpe3JldHVybiBhPGI/MTotMX1mdW5jdGlvbiBnZXRSZXBsYWNlcihtYXApe3JldHVybiBmdW5jdGlvbiByZXBsYWNlKHN0cil7aWYoc3RyLmNoYXJBdCgxKT09PVwiI1wiKXtpZihzdHIuY2hhckF0KDIpPT09XCJYXCJ8fHN0ci5jaGFyQXQoMik9PT1cInhcIil7cmV0dXJuIGRlY29kZUNvZGVQb2ludChwYXJzZUludChzdHIuc3Vic3RyKDMpLDE2KSl9cmV0dXJuIGRlY29kZUNvZGVQb2ludChwYXJzZUludChzdHIuc3Vic3RyKDIpLDEwKSl9cmV0dXJuIG1hcFtzdHIuc2xpY2UoMSwtMSldO1xufX1tb2R1bGUuZXhwb3J0cz17WE1MOmRlY29kZVhNTFN0cmljdCxIVE1MOmRlY29kZUhUTUwsSFRNTFN0cmljdDpkZWNvZGVIVE1MU3RyaWN0fX0se1wiLi4vbWFwcy9lbnRpdGllcy5qc29uXCI6MjUsXCIuLi9tYXBzL2xlZ2FjeS5qc29uXCI6MjYsXCIuLi9tYXBzL3htbC5qc29uXCI6MjcsXCIuL2RlY29kZV9jb2RlcG9pbnQuanNcIjoyMn1dLDIyOltmdW5jdGlvbihyZXF1aXJlLG1vZHVsZSxleHBvcnRzKXt2YXIgZGVjb2RlTWFwPXJlcXVpcmUoXCIuLi9tYXBzL2RlY29kZS5qc29uXCIpO21vZHVsZS5leHBvcnRzPWRlY29kZUNvZGVQb2ludDtmdW5jdGlvbiBkZWNvZGVDb2RlUG9pbnQoY29kZVBvaW50KXtpZihjb2RlUG9pbnQ+PTU1Mjk2JiZjb2RlUG9pbnQ8PTU3MzQzfHxjb2RlUG9pbnQ+MTExNDExMSl7cmV0dXJuXCLvv71cIn1pZihjb2RlUG9pbnQgaW4gZGVjb2RlTWFwKXtjb2RlUG9pbnQ9ZGVjb2RlTWFwW2NvZGVQb2ludF19dmFyIG91dHB1dD1cIlwiO2lmKGNvZGVQb2ludD42NTUzNSl7Y29kZVBvaW50LT02NTUzNjtvdXRwdXQrPVN0cmluZy5mcm9tQ2hhckNvZGUoY29kZVBvaW50Pj4+MTAmMTAyM3w1NTI5Nik7Y29kZVBvaW50PTU2MzIwfGNvZGVQb2ludCYxMDIzfW91dHB1dCs9U3RyaW5nLmZyb21DaGFyQ29kZShjb2RlUG9pbnQpO3JldHVybiBvdXRwdXR9fSx7XCIuLi9tYXBzL2RlY29kZS5qc29uXCI6MjR9XSwyMzpbZnVuY3Rpb24ocmVxdWlyZSxtb2R1bGUsZXhwb3J0cyl7dmFyIGludmVyc2VYTUw9Z2V0SW52ZXJzZU9iaihyZXF1aXJlKFwiLi4vbWFwcy94bWwuanNvblwiKSkseG1sUmVwbGFjZXI9Z2V0SW52ZXJzZVJlcGxhY2VyKGludmVyc2VYTUwpO2V4cG9ydHMuWE1MPWdldEludmVyc2UoaW52ZXJzZVhNTCx4bWxSZXBsYWNlcik7dmFyIGludmVyc2VIVE1MPWdldEludmVyc2VPYmoocmVxdWlyZShcIi4uL21hcHMvZW50aXRpZXMuanNvblwiKSksaHRtbFJlcGxhY2VyPWdldEludmVyc2VSZXBsYWNlcihpbnZlcnNlSFRNTCk7ZXhwb3J0cy5IVE1MPWdldEludmVyc2UoaW52ZXJzZUhUTUwsaHRtbFJlcGxhY2VyKTtmdW5jdGlvbiBnZXRJbnZlcnNlT2JqKG9iail7cmV0dXJuIE9iamVjdC5rZXlzKG9iaikuc29ydCgpLnJlZHVjZShmdW5jdGlvbihpbnZlcnNlLG5hbWUpe2ludmVyc2Vbb2JqW25hbWVdXT1cIiZcIituYW1lK1wiO1wiO3JldHVybiBpbnZlcnNlfSx7fSl9ZnVuY3Rpb24gZ2V0SW52ZXJzZVJlcGxhY2VyKGludmVyc2Upe3ZhciBzaW5nbGU9W10sbXVsdGlwbGU9W107T2JqZWN0LmtleXMoaW52ZXJzZSkuZm9yRWFjaChmdW5jdGlvbihrKXtpZihrLmxlbmd0aD09PTEpe3NpbmdsZS5wdXNoKFwiXFxcXFwiK2spfWVsc2V7bXVsdGlwbGUucHVzaChrKX19KTttdWx0aXBsZS51bnNoaWZ0KFwiW1wiK3NpbmdsZS5qb2luKFwiXCIpK1wiXVwiKTtyZXR1cm4gbmV3IFJlZ0V4cChtdWx0aXBsZS5qb2luKFwifFwiKSxcImdcIil9dmFyIHJlX25vbkFTQ0lJPS9bXlxcMC1cXHg3Rl0vZyxyZV9hc3RyYWxTeW1ib2xzPS9bXFx1RDgwMC1cXHVEQkZGXVtcXHVEQzAwLVxcdURGRkZdL2c7ZnVuY3Rpb24gc2luZ2xlQ2hhclJlcGxhY2VyKGMpe3JldHVyblwiJiN4XCIrYy5jaGFyQ29kZUF0KDApLnRvU3RyaW5nKDE2KS50b1VwcGVyQ2FzZSgpK1wiO1wifWZ1bmN0aW9uIGFzdHJhbFJlcGxhY2VyKGMpe3ZhciBoaWdoPWMuY2hhckNvZGVBdCgwKTt2YXIgbG93PWMuY2hhckNvZGVBdCgxKTt2YXIgY29kZVBvaW50PShoaWdoLTU1Mjk2KSoxMDI0K2xvdy01NjMyMCs2NTUzNjtyZXR1cm5cIiYjeFwiK2NvZGVQb2ludC50b1N0cmluZygxNikudG9VcHBlckNhc2UoKStcIjtcIn1mdW5jdGlvbiBnZXRJbnZlcnNlKGludmVyc2UscmUpe2Z1bmN0aW9uIGZ1bmMobmFtZSl7cmV0dXJuIGludmVyc2VbbmFtZV19cmV0dXJuIGZ1bmN0aW9uKGRhdGEpe3JldHVybiBkYXRhLnJlcGxhY2UocmUsZnVuYykucmVwbGFjZShyZV9hc3RyYWxTeW1ib2xzLGFzdHJhbFJlcGxhY2VyKS5yZXBsYWNlKHJlX25vbkFTQ0lJLHNpbmdsZUNoYXJSZXBsYWNlcil9fXZhciByZV94bWxDaGFycz1nZXRJbnZlcnNlUmVwbGFjZXIoaW52ZXJzZVhNTCk7ZnVuY3Rpb24gZXNjYXBlWE1MKGRhdGEpe3JldHVybiBkYXRhLnJlcGxhY2UocmVfeG1sQ2hhcnMsc2luZ2xlQ2hhclJlcGxhY2VyKS5yZXBsYWNlKHJlX2FzdHJhbFN5bWJvbHMsYXN0cmFsUmVwbGFjZXIpLnJlcGxhY2UocmVfbm9uQVNDSUksc2luZ2xlQ2hhclJlcGxhY2VyKX1leHBvcnRzLmVzY2FwZT1lc2NhcGVYTUx9LHtcIi4uL21hcHMvZW50aXRpZXMuanNvblwiOjI1LFwiLi4vbWFwcy94bWwuanNvblwiOjI3fV0sMjQ6W2Z1bmN0aW9uKHJlcXVpcmUsbW9kdWxlLGV4cG9ydHMpe21vZHVsZS5leHBvcnRzPXswOjY1NTMzLDEyODo4MzY0LDEzMDo4MjE4LDEzMTo0MDIsMTMyOjgyMjIsMTMzOjgyMzAsMTM0OjgyMjQsMTM1OjgyMjUsMTM2OjcxMCwxMzc6ODI0MCwxMzg6MzUyLDEzOTo4MjQ5LDE0MDozMzgsMTQyOjM4MSwxNDU6ODIxNiwxNDY6ODIxNywxNDc6ODIyMCwxNDg6ODIyMSwxNDk6ODIyNiwxNTA6ODIxMSwxNTE6ODIxMiwxNTI6NzMyLDE1Mzo4NDgyLDE1NDozNTMsMTU1OjgyNTAsMTU2OjMzOSwxNTg6MzgyLDE1OTozNzZ9fSx7fV0sMjU6W2Z1bmN0aW9uKHJlcXVpcmUsbW9kdWxlLGV4cG9ydHMpe21vZHVsZS5leHBvcnRzPXtBYWN1dGU6XCLDgVwiLGFhY3V0ZTpcIsOhXCIsQWJyZXZlOlwixIJcIixhYnJldmU6XCLEg1wiLGFjOlwi4oi+XCIsYWNkOlwi4oi/XCIsYWNFOlwi4oi+zLNcIixBY2lyYzpcIsOCXCIsYWNpcmM6XCLDolwiLGFjdXRlOlwiwrRcIixBY3k6XCLQkFwiLGFjeTpcItCwXCIsQUVsaWc6XCLDhlwiLGFlbGlnOlwiw6ZcIixhZjpcIuKBoVwiLEFmcjpcIvCdlIRcIixhZnI6XCLwnZSeXCIsQWdyYXZlOlwiw4BcIixhZ3JhdmU6XCLDoFwiLGFsZWZzeW06XCLihLVcIixhbGVwaDpcIuKEtVwiLEFscGhhOlwizpFcIixhbHBoYTpcIs6xXCIsQW1hY3I6XCLEgFwiLGFtYWNyOlwixIFcIixhbWFsZzpcIuKov1wiLGFtcDpcIiZcIixBTVA6XCImXCIsYW5kYW5kOlwi4qmVXCIsQW5kOlwi4qmTXCIsYW5kOlwi4oinXCIsYW5kZDpcIuKpnFwiLGFuZHNsb3BlOlwi4qmYXCIsYW5kdjpcIuKpmlwiLGFuZzpcIuKIoFwiLGFuZ2U6XCLipqRcIixhbmdsZTpcIuKIoFwiLGFuZ21zZGFhOlwi4qaoXCIsYW5nbXNkYWI6XCLipqlcIixhbmdtc2RhYzpcIuKmqlwiLGFuZ21zZGFkOlwi4qarXCIsYW5nbXNkYWU6XCLipqxcIixhbmdtc2RhZjpcIuKmrVwiLGFuZ21zZGFnOlwi4qauXCIsYW5nbXNkYWg6XCLipq9cIixhbmdtc2Q6XCLiiKFcIixhbmdydDpcIuKIn1wiLGFuZ3J0dmI6XCLiir5cIixhbmdydHZiZDpcIuKmnVwiLGFuZ3NwaDpcIuKIolwiLGFuZ3N0Olwiw4VcIixhbmd6YXJyOlwi4o28XCIsQW9nb246XCLEhFwiLGFvZ29uOlwixIVcIixBb3BmOlwi8J2UuFwiLGFvcGY6XCLwnZWSXCIsYXBhY2lyOlwi4qmvXCIsYXA6XCLiiYhcIixhcEU6XCLiqbBcIixhcGU6XCLiiYpcIixhcGlkOlwi4omLXCIsYXBvczpcIidcIixBcHBseUZ1bmN0aW9uOlwi4oGhXCIsYXBwcm94Olwi4omIXCIsYXBwcm94ZXE6XCLiiYpcIixBcmluZzpcIsOFXCIsYXJpbmc6XCLDpVwiLEFzY3I6XCLwnZKcXCIsYXNjcjpcIvCdkrZcIixBc3NpZ246XCLiiZRcIixhc3Q6XCIqXCIsYXN5bXA6XCLiiYhcIixhc3ltcGVxOlwi4omNXCIsQXRpbGRlOlwiw4NcIixhdGlsZGU6XCLDo1wiLEF1bWw6XCLDhFwiLGF1bWw6XCLDpFwiLGF3Y29uaW50Olwi4oizXCIsYXdpbnQ6XCLiqJFcIixiYWNrY29uZzpcIuKJjFwiLGJhY2tlcHNpbG9uOlwiz7ZcIixiYWNrcHJpbWU6XCLigLVcIixiYWNrc2ltOlwi4oi9XCIsYmFja3NpbWVxOlwi4ouNXCIsQmFja3NsYXNoOlwi4oiWXCIsQmFydjpcIuKrp1wiLGJhcnZlZTpcIuKKvVwiLGJhcndlZDpcIuKMhVwiLEJhcndlZDpcIuKMhlwiLGJhcndlZGdlOlwi4oyFXCIsYmJyazpcIuKOtVwiLGJicmt0YnJrOlwi4o62XCIsYmNvbmc6XCLiiYxcIixCY3k6XCLQkVwiLGJjeTpcItCxXCIsYmRxdW86XCLigJ5cIixiZWNhdXM6XCLiiLVcIixiZWNhdXNlOlwi4oi1XCIsQmVjYXVzZTpcIuKItVwiLGJlbXB0eXY6XCLiprBcIixiZXBzaTpcIs+2XCIsYmVybm91Olwi4oSsXCIsQmVybm91bGxpczpcIuKErFwiLEJldGE6XCLOklwiLGJldGE6XCLOslwiLGJldGg6XCLihLZcIixiZXR3ZWVuOlwi4omsXCIsQmZyOlwi8J2UhVwiLGJmcjpcIvCdlJ9cIixiaWdjYXA6XCLii4JcIixiaWdjaXJjOlwi4pevXCIsYmlnY3VwOlwi4ouDXCIsYmlnb2RvdDpcIuKogFwiLGJpZ29wbHVzOlwi4qiBXCIsYmlnb3RpbWVzOlwi4qiCXCIsYmlnc3FjdXA6XCLiqIZcIixiaWdzdGFyOlwi4piFXCIsYmlndHJpYW5nbGVkb3duOlwi4pa9XCIsYmlndHJpYW5nbGV1cDpcIuKWs1wiLGJpZ3VwbHVzOlwi4qiEXCIsYmlndmVlOlwi4ouBXCIsYmlnd2VkZ2U6XCLii4BcIixia2Fyb3c6XCLipI1cIixibGFja2xvemVuZ2U6XCLip6tcIixibGFja3NxdWFyZTpcIuKWqlwiLGJsYWNrdHJpYW5nbGU6XCLilrRcIixibGFja3RyaWFuZ2xlZG93bjpcIuKWvlwiLGJsYWNrdHJpYW5nbGVsZWZ0Olwi4peCXCIsYmxhY2t0cmlhbmdsZXJpZ2h0Olwi4pa4XCIsYmxhbms6XCLikKNcIixibGsxMjpcIuKWklwiLGJsazE0Olwi4paRXCIsYmxrMzQ6XCLilpNcIixibG9jazpcIuKWiFwiLGJuZTpcIj3ig6VcIixibmVxdWl2Olwi4omh4oOlXCIsYk5vdDpcIuKrrVwiLGJub3Q6XCLijJBcIixCb3BmOlwi8J2UuVwiLGJvcGY6XCLwnZWTXCIsYm90Olwi4oqlXCIsYm90dG9tOlwi4oqlXCIsYm93dGllOlwi4ouIXCIsYm94Ym94Olwi4qeJXCIsYm94ZGw6XCLilJBcIixib3hkTDpcIuKVlVwiLGJveERsOlwi4pWWXCIsYm94REw6XCLilZdcIixib3hkcjpcIuKUjFwiLGJveGRSOlwi4pWSXCIsYm94RHI6XCLilZNcIixib3hEUjpcIuKVlFwiLGJveGg6XCLilIBcIixib3hIOlwi4pWQXCIsYm94aGQ6XCLilKxcIixib3hIZDpcIuKVpFwiLGJveGhEOlwi4pWlXCIsYm94SEQ6XCLilaZcIixib3hodTpcIuKUtFwiLGJveEh1Olwi4pWnXCIsYm94aFU6XCLilahcIixib3hIVTpcIuKVqVwiLGJveG1pbnVzOlwi4oqfXCIsYm94cGx1czpcIuKKnlwiLGJveHRpbWVzOlwi4oqgXCIsYm94dWw6XCLilJhcIixib3h1TDpcIuKVm1wiLGJveFVsOlwi4pWcXCIsYm94VUw6XCLilZ1cIixib3h1cjpcIuKUlFwiLGJveHVSOlwi4pWYXCIsYm94VXI6XCLilZlcIixib3hVUjpcIuKVmlwiLGJveHY6XCLilIJcIixib3hWOlwi4pWRXCIsYm94dmg6XCLilLxcIixib3h2SDpcIuKVqlwiLGJveFZoOlwi4pWrXCIsYm94Vkg6XCLilaxcIixib3h2bDpcIuKUpFwiLGJveHZMOlwi4pWhXCIsYm94Vmw6XCLilaJcIixib3hWTDpcIuKVo1wiLGJveHZyOlwi4pScXCIsYm94dlI6XCLilZ5cIixib3hWcjpcIuKVn1wiLGJveFZSOlwi4pWgXCIsYnByaW1lOlwi4oC1XCIsYnJldmU6XCLLmFwiLEJyZXZlOlwiy5hcIixicnZiYXI6XCLCplwiLGJzY3I6XCLwnZK3XCIsQnNjcjpcIuKErFwiLGJzZW1pOlwi4oGPXCIsYnNpbTpcIuKIvVwiLGJzaW1lOlwi4ouNXCIsYnNvbGI6XCLip4VcIixic29sOlwiXFxcXFwiLGJzb2xoc3ViOlwi4p+IXCIsYnVsbDpcIuKAolwiLGJ1bGxldDpcIuKAolwiLGJ1bXA6XCLiiY5cIixidW1wRTpcIuKqrlwiLGJ1bXBlOlwi4omPXCIsQnVtcGVxOlwi4omOXCIsYnVtcGVxOlwi4omPXCIsQ2FjdXRlOlwixIZcIixjYWN1dGU6XCLEh1wiLGNhcGFuZDpcIuKphFwiLGNhcGJyY3VwOlwi4qmJXCIsY2FwY2FwOlwi4qmLXCIsY2FwOlwi4oipXCIsQ2FwOlwi4ouSXCIsY2FwY3VwOlwi4qmHXCIsY2FwZG90Olwi4qmAXCIsQ2FwaXRhbERpZmZlcmVudGlhbEQ6XCLihYVcIixjYXBzOlwi4oip77iAXCIsY2FyZXQ6XCLigYFcIixjYXJvbjpcIsuHXCIsQ2F5bGV5czpcIuKErVwiLGNjYXBzOlwi4qmNXCIsQ2Nhcm9uOlwixIxcIixjY2Fyb246XCLEjVwiLENjZWRpbDpcIsOHXCIsY2NlZGlsOlwiw6dcIixDY2lyYzpcIsSIXCIsY2NpcmM6XCLEiVwiLENjb25pbnQ6XCLiiLBcIixjY3VwczpcIuKpjFwiLGNjdXBzc206XCLiqZBcIixDZG90OlwixIpcIixjZG90OlwixItcIixjZWRpbDpcIsK4XCIsQ2VkaWxsYTpcIsK4XCIsY2VtcHR5djpcIuKmslwiLGNlbnQ6XCLColwiLGNlbnRlcmRvdDpcIsK3XCIsQ2VudGVyRG90OlwiwrdcIixjZnI6XCLwnZSgXCIsQ2ZyOlwi4oStXCIsQ0hjeTpcItCnXCIsY2hjeTpcItGHXCIsY2hlY2s6XCLinJNcIixjaGVja21hcms6XCLinJNcIixDaGk6XCLOp1wiLGNoaTpcIs+HXCIsY2lyYzpcIsuGXCIsY2lyY2VxOlwi4omXXCIsY2lyY2xlYXJyb3dsZWZ0Olwi4oa6XCIsY2lyY2xlYXJyb3dyaWdodDpcIuKGu1wiLGNpcmNsZWRhc3Q6XCLiiptcIixjaXJjbGVkY2lyYzpcIuKKmlwiLGNpcmNsZWRkYXNoOlwi4oqdXCIsQ2lyY2xlRG90Olwi4oqZXCIsY2lyY2xlZFI6XCLCrlwiLGNpcmNsZWRTOlwi4pOIXCIsQ2lyY2xlTWludXM6XCLiipZcIixDaXJjbGVQbHVzOlwi4oqVXCIsQ2lyY2xlVGltZXM6XCLiipdcIixjaXI6XCLil4tcIixjaXJFOlwi4qeDXCIsY2lyZTpcIuKJl1wiLGNpcmZuaW50Olwi4qiQXCIsY2lybWlkOlwi4quvXCIsY2lyc2NpcjpcIuKnglwiLENsb2Nrd2lzZUNvbnRvdXJJbnRlZ3JhbDpcIuKIslwiLENsb3NlQ3VybHlEb3VibGVRdW90ZTpcIuKAnVwiLENsb3NlQ3VybHlRdW90ZTpcIuKAmVwiLGNsdWJzOlwi4pmjXCIsY2x1YnN1aXQ6XCLimaNcIixjb2xvbjpcIjpcIixDb2xvbjpcIuKIt1wiLENvbG9uZTpcIuKptFwiLGNvbG9uZTpcIuKJlFwiLGNvbG9uZXE6XCLiiZRcIixjb21tYTpcIixcIixjb21tYXQ6XCJAXCIsY29tcDpcIuKIgVwiLGNvbXBmbjpcIuKImFwiLGNvbXBsZW1lbnQ6XCLiiIFcIixjb21wbGV4ZXM6XCLihIJcIixjb25nOlwi4omFXCIsY29uZ2RvdDpcIuKprVwiLENvbmdydWVudDpcIuKJoVwiLGNvbmludDpcIuKIrlwiLENvbmludDpcIuKIr1wiLENvbnRvdXJJbnRlZ3JhbDpcIuKIrlwiLGNvcGY6XCLwnZWUXCIsQ29wZjpcIuKEglwiLGNvcHJvZDpcIuKIkFwiLENvcHJvZHVjdDpcIuKIkFwiLGNvcHk6XCLCqVwiLENPUFk6XCLCqVwiLGNvcHlzcjpcIuKEl1wiLENvdW50ZXJDbG9ja3dpc2VDb250b3VySW50ZWdyYWw6XCLiiLNcIixjcmFycjpcIuKGtVwiLGNyb3NzOlwi4pyXXCIsQ3Jvc3M6XCLiqK9cIixDc2NyOlwi8J2SnlwiLGNzY3I6XCLwnZK4XCIsY3N1YjpcIuKrj1wiLGNzdWJlOlwi4quRXCIsY3N1cDpcIuKrkFwiLGNzdXBlOlwi4quSXCIsY3Rkb3Q6XCLii69cIixjdWRhcnJsOlwi4qS4XCIsY3VkYXJycjpcIuKktVwiLGN1ZXByOlwi4oueXCIsY3Vlc2M6XCLii59cIixjdWxhcnI6XCLihrZcIixjdWxhcnJwOlwi4qS9XCIsY3VwYnJjYXA6XCLiqYhcIixjdXBjYXA6XCLiqYZcIixDdXBDYXA6XCLiiY1cIixjdXA6XCLiiKpcIixDdXA6XCLii5NcIixjdXBjdXA6XCLiqYpcIixjdXBkb3Q6XCLiio1cIixjdXBvcjpcIuKphVwiLGN1cHM6XCLiiKrvuIBcIixjdXJhcnI6XCLihrdcIixjdXJhcnJtOlwi4qS8XCIsY3VybHllcXByZWM6XCLii55cIixjdXJseWVxc3VjYzpcIuKLn1wiLGN1cmx5dmVlOlwi4ouOXCIsY3VybHl3ZWRnZTpcIuKLj1wiLGN1cnJlbjpcIsKkXCIsY3VydmVhcnJvd2xlZnQ6XCLihrZcIixjdXJ2ZWFycm93cmlnaHQ6XCLihrdcIixjdXZlZTpcIuKLjlwiLGN1d2VkOlwi4ouPXCIsY3djb25pbnQ6XCLiiLJcIixjd2ludDpcIuKIsVwiLGN5bGN0eTpcIuKMrVwiLGRhZ2dlcjpcIuKAoFwiLERhZ2dlcjpcIuKAoVwiLGRhbGV0aDpcIuKEuFwiLGRhcnI6XCLihpNcIixEYXJyOlwi4oahXCIsZEFycjpcIuKHk1wiLGRhc2g6XCLigJBcIixEYXNodjpcIuKrpFwiLGRhc2h2Olwi4oqjXCIsZGJrYXJvdzpcIuKkj1wiLGRibGFjOlwiy51cIixEY2Fyb246XCLEjlwiLGRjYXJvbjpcIsSPXCIsRGN5Olwi0JRcIixkY3k6XCLQtFwiLGRkYWdnZXI6XCLigKFcIixkZGFycjpcIuKHilwiLEREOlwi4oWFXCIsZGQ6XCLihYZcIixERG90cmFoZDpcIuKkkVwiLGRkb3RzZXE6XCLiqbdcIixkZWc6XCLCsFwiLERlbDpcIuKIh1wiLERlbHRhOlwizpRcIixkZWx0YTpcIs60XCIsZGVtcHR5djpcIuKmsVwiLGRmaXNodDpcIuKlv1wiLERmcjpcIvCdlIdcIixkZnI6XCLwnZShXCIsZEhhcjpcIuKlpVwiLGRoYXJsOlwi4oeDXCIsZGhhcnI6XCLih4JcIixEaWFjcml0aWNhbEFjdXRlOlwiwrRcIixEaWFjcml0aWNhbERvdDpcIsuZXCIsRGlhY3JpdGljYWxEb3VibGVBY3V0ZTpcIsudXCIsRGlhY3JpdGljYWxHcmF2ZTpcImBcIixEaWFjcml0aWNhbFRpbGRlOlwiy5xcIixkaWFtOlwi4ouEXCIsZGlhbW9uZDpcIuKLhFwiLERpYW1vbmQ6XCLii4RcIixkaWFtb25kc3VpdDpcIuKZplwiLGRpYW1zOlwi4pmmXCIsZGllOlwiwqhcIixEaWZmZXJlbnRpYWxEOlwi4oWGXCIsZGlnYW1tYTpcIs+dXCIsZGlzaW46XCLii7JcIixkaXY6XCLDt1wiLGRpdmlkZTpcIsO3XCIsZGl2aWRlb250aW1lczpcIuKLh1wiLGRpdm9ueDpcIuKLh1wiLERKY3k6XCLQglwiLGRqY3k6XCLRklwiLGRsY29ybjpcIuKMnlwiLGRsY3JvcDpcIuKMjVwiLGRvbGxhcjpcIiRcIixEb3BmOlwi8J2Uu1wiLGRvcGY6XCLwnZWVXCIsRG90OlwiwqhcIixkb3Q6XCLLmVwiLERvdERvdDpcIuKDnFwiLGRvdGVxOlwi4omQXCIsZG90ZXFkb3Q6XCLiiZFcIixEb3RFcXVhbDpcIuKJkFwiLGRvdG1pbnVzOlwi4oi4XCIsZG90cGx1czpcIuKIlFwiLGRvdHNxdWFyZTpcIuKKoVwiLGRvdWJsZWJhcndlZGdlOlwi4oyGXCIsRG91YmxlQ29udG91ckludGVncmFsOlwi4oivXCIsRG91YmxlRG90OlwiwqhcIixEb3VibGVEb3duQXJyb3c6XCLih5NcIixEb3VibGVMZWZ0QXJyb3c6XCLih5BcIixEb3VibGVMZWZ0UmlnaHRBcnJvdzpcIuKHlFwiLERvdWJsZUxlZnRUZWU6XCLiq6RcIixEb3VibGVMb25nTGVmdEFycm93Olwi4p+4XCIsRG91YmxlTG9uZ0xlZnRSaWdodEFycm93Olwi4p+6XCIsRG91YmxlTG9uZ1JpZ2h0QXJyb3c6XCLin7lcIixEb3VibGVSaWdodEFycm93Olwi4oeSXCIsRG91YmxlUmlnaHRUZWU6XCLiiqhcIixEb3VibGVVcEFycm93Olwi4oeRXCIsRG91YmxlVXBEb3duQXJyb3c6XCLih5VcIixEb3VibGVWZXJ0aWNhbEJhcjpcIuKIpVwiLERvd25BcnJvd0JhcjpcIuKkk1wiLGRvd25hcnJvdzpcIuKGk1wiLERvd25BcnJvdzpcIuKGk1wiLERvd25hcnJvdzpcIuKHk1wiLERvd25BcnJvd1VwQXJyb3c6XCLih7VcIixEb3duQnJldmU6XCLMkVwiLGRvd25kb3duYXJyb3dzOlwi4oeKXCIsZG93bmhhcnBvb25sZWZ0Olwi4oeDXCIsZG93bmhhcnBvb25yaWdodDpcIuKHglwiLERvd25MZWZ0UmlnaHRWZWN0b3I6XCLipZBcIixEb3duTGVmdFRlZVZlY3RvcjpcIuKlnlwiLERvd25MZWZ0VmVjdG9yQmFyOlwi4qWWXCIsRG93bkxlZnRWZWN0b3I6XCLihr1cIixEb3duUmlnaHRUZWVWZWN0b3I6XCLipZ9cIixEb3duUmlnaHRWZWN0b3JCYXI6XCLipZdcIixEb3duUmlnaHRWZWN0b3I6XCLih4FcIixEb3duVGVlQXJyb3c6XCLihqdcIixEb3duVGVlOlwi4oqkXCIsZHJia2Fyb3c6XCLipJBcIixkcmNvcm46XCLijJ9cIixkcmNyb3A6XCLijIxcIixEc2NyOlwi8J2Sn1wiLGRzY3I6XCLwnZK5XCIsRFNjeTpcItCFXCIsZHNjeTpcItGVXCIsZHNvbDpcIuKntlwiLERzdHJvazpcIsSQXCIsZHN0cm9rOlwixJFcIixkdGRvdDpcIuKLsVwiLGR0cmk6XCLilr9cIixkdHJpZjpcIuKWvlwiLGR1YXJyOlwi4oe1XCIsZHVoYXI6XCLipa9cIixkd2FuZ2xlOlwi4qamXCIsRFpjeTpcItCPXCIsZHpjeTpcItGfXCIsZHppZ3JhcnI6XCLin79cIixFYWN1dGU6XCLDiVwiLGVhY3V0ZTpcIsOpXCIsZWFzdGVyOlwi4qmuXCIsRWNhcm9uOlwixJpcIixlY2Fyb246XCLEm1wiLEVjaXJjOlwiw4pcIixlY2lyYzpcIsOqXCIsZWNpcjpcIuKJllwiLGVjb2xvbjpcIuKJlVwiLEVjeTpcItCtXCIsZWN5Olwi0Y1cIixlRERvdDpcIuKpt1wiLEVkb3Q6XCLEllwiLGVkb3Q6XCLEl1wiLGVEb3Q6XCLiiZFcIixlZTpcIuKFh1wiLGVmRG90Olwi4omSXCIsRWZyOlwi8J2UiFwiLGVmcjpcIvCdlKJcIixlZzpcIuKqmlwiLEVncmF2ZTpcIsOIXCIsZWdyYXZlOlwiw6hcIixlZ3M6XCLiqpZcIixlZ3Nkb3Q6XCLiqphcIixlbDpcIuKqmVwiLEVsZW1lbnQ6XCLiiIhcIixlbGludGVyczpcIuKPp1wiLGVsbDpcIuKEk1wiLGVsczpcIuKqlVwiLGVsc2RvdDpcIuKql1wiLEVtYWNyOlwixJJcIixlbWFjcjpcIsSTXCIsZW1wdHk6XCLiiIVcIixlbXB0eXNldDpcIuKIhVwiLEVtcHR5U21hbGxTcXVhcmU6XCLil7tcIixlbXB0eXY6XCLiiIVcIixFbXB0eVZlcnlTbWFsbFNxdWFyZTpcIuKWq1wiLGVtc3AxMzpcIuKAhFwiLGVtc3AxNDpcIuKAhVwiLGVtc3A6XCLigINcIixFTkc6XCLFilwiLGVuZzpcIsWLXCIsZW5zcDpcIuKAglwiLEVvZ29uOlwixJhcIixlb2dvbjpcIsSZXCIsRW9wZjpcIvCdlLxcIixlb3BmOlwi8J2VllwiLGVwYXI6XCLii5VcIixlcGFyc2w6XCLip6NcIixlcGx1czpcIuKpsVwiLGVwc2k6XCLOtVwiLEVwc2lsb246XCLOlVwiLGVwc2lsb246XCLOtVwiLGVwc2l2Olwiz7VcIixlcWNpcmM6XCLiiZZcIixlcWNvbG9uOlwi4omVXCIsZXFzaW06XCLiiYJcIixlcXNsYW50Z3RyOlwi4qqWXCIsZXFzbGFudGxlc3M6XCLiqpVcIixFcXVhbDpcIuKptVwiLGVxdWFsczpcIj1cIixFcXVhbFRpbGRlOlwi4omCXCIsZXF1ZXN0Olwi4omfXCIsRXF1aWxpYnJpdW06XCLih4xcIixlcXVpdjpcIuKJoVwiLGVxdWl2REQ6XCLiqbhcIixlcXZwYXJzbDpcIuKnpVwiLGVyYXJyOlwi4qWxXCIsZXJEb3Q6XCLiiZNcIixlc2NyOlwi4oSvXCIsRXNjcjpcIuKEsFwiLGVzZG90Olwi4omQXCIsRXNpbTpcIuKps1wiLGVzaW06XCLiiYJcIixFdGE6XCLOl1wiLGV0YTpcIs63XCIsRVRIOlwiw5BcIixldGg6XCLDsFwiLEV1bWw6XCLDi1wiLGV1bWw6XCLDq1wiLGV1cm86XCLigqxcIixleGNsOlwiIVwiLGV4aXN0Olwi4oiDXCIsRXhpc3RzOlwi4oiDXCIsZXhwZWN0YXRpb246XCLihLBcIixleHBvbmVudGlhbGU6XCLihYdcIixFeHBvbmVudGlhbEU6XCLihYdcIixmYWxsaW5nZG90c2VxOlwi4omSXCIsRmN5Olwi0KRcIixmY3k6XCLRhFwiLGZlbWFsZTpcIuKZgFwiLGZmaWxpZzpcIu+sg1wiLGZmbGlnOlwi76yAXCIsZmZsbGlnOlwi76yEXCIsRmZyOlwi8J2UiVwiLGZmcjpcIvCdlKNcIixmaWxpZzpcIu+sgVwiLEZpbGxlZFNtYWxsU3F1YXJlOlwi4pe8XCIsRmlsbGVkVmVyeVNtYWxsU3F1YXJlOlwi4paqXCIsZmpsaWc6XCJmalwiLGZsYXQ6XCLima1cIixmbGxpZzpcIu+sglwiLGZsdG5zOlwi4paxXCIsZm5vZjpcIsaSXCIsRm9wZjpcIvCdlL1cIixmb3BmOlwi8J2Vl1wiLGZvcmFsbDpcIuKIgFwiLEZvckFsbDpcIuKIgFwiLGZvcms6XCLii5RcIixmb3JrdjpcIuKrmVwiLEZvdXJpZXJ0cmY6XCLihLFcIixmcGFydGludDpcIuKojVwiLGZyYWMxMjpcIsK9XCIsZnJhYzEzOlwi4oWTXCIsZnJhYzE0OlwiwrxcIixmcmFjMTU6XCLihZVcIixmcmFjMTY6XCLihZlcIixmcmFjMTg6XCLihZtcIixmcmFjMjM6XCLihZRcIixmcmFjMjU6XCLihZZcIixmcmFjMzQ6XCLCvlwiLGZyYWMzNTpcIuKFl1wiLGZyYWMzODpcIuKFnFwiLGZyYWM0NTpcIuKFmFwiLGZyYWM1NjpcIuKFmlwiLGZyYWM1ODpcIuKFnVwiLGZyYWM3ODpcIuKFnlwiLGZyYXNsOlwi4oGEXCIsZnJvd246XCLijKJcIixmc2NyOlwi8J2Su1wiLEZzY3I6XCLihLFcIixnYWN1dGU6XCLHtVwiLEdhbW1hOlwizpNcIixnYW1tYTpcIs6zXCIsR2FtbWFkOlwiz5xcIixnYW1tYWQ6XCLPnVwiLGdhcDpcIuKqhlwiLEdicmV2ZTpcIsSeXCIsZ2JyZXZlOlwixJ9cIixHY2VkaWw6XCLEolwiLEdjaXJjOlwixJxcIixnY2lyYzpcIsSdXCIsR2N5Olwi0JNcIixnY3k6XCLQs1wiLEdkb3Q6XCLEoFwiLGdkb3Q6XCLEoVwiLGdlOlwi4omlXCIsZ0U6XCLiiadcIixnRWw6XCLiqoxcIixnZWw6XCLii5tcIixnZXE6XCLiiaVcIixnZXFxOlwi4omnXCIsZ2Vxc2xhbnQ6XCLiqb5cIixnZXNjYzpcIuKqqVwiLGdlczpcIuKpvlwiLGdlc2RvdDpcIuKqgFwiLGdlc2RvdG86XCLiqoJcIixnZXNkb3RvbDpcIuKqhFwiLGdlc2w6XCLii5vvuIBcIixnZXNsZXM6XCLiqpRcIixHZnI6XCLwnZSKXCIsZ2ZyOlwi8J2UpFwiLGdnOlwi4omrXCIsR2c6XCLii5lcIixnZ2c6XCLii5lcIixnaW1lbDpcIuKEt1wiLEdKY3k6XCLQg1wiLGdqY3k6XCLRk1wiLGdsYTpcIuKqpVwiLGdsOlwi4om3XCIsZ2xFOlwi4qqSXCIsZ2xqOlwi4qqkXCIsZ25hcDpcIuKqilwiLGduYXBwcm94Olwi4qqKXCIsZ25lOlwi4qqIXCIsZ25FOlwi4ompXCIsZ25lcTpcIuKqiFwiLGduZXFxOlwi4ompXCIsZ25zaW06XCLii6dcIixHb3BmOlwi8J2UvlwiLGdvcGY6XCLwnZWYXCIsZ3JhdmU6XCJgXCIsR3JlYXRlckVxdWFsOlwi4omlXCIsR3JlYXRlckVxdWFsTGVzczpcIuKLm1wiLEdyZWF0ZXJGdWxsRXF1YWw6XCLiiadcIixHcmVhdGVyR3JlYXRlcjpcIuKqolwiLEdyZWF0ZXJMZXNzOlwi4om3XCIsR3JlYXRlclNsYW50RXF1YWw6XCLiqb5cIixHcmVhdGVyVGlsZGU6XCLiibNcIixHc2NyOlwi8J2SolwiLGdzY3I6XCLihIpcIixnc2ltOlwi4omzXCIsZ3NpbWU6XCLiqo5cIixnc2ltbDpcIuKqkFwiLGd0Y2M6XCLiqqdcIixndGNpcjpcIuKpulwiLGd0OlwiPlwiLEdUOlwiPlwiLEd0Olwi4omrXCIsZ3Rkb3Q6XCLii5dcIixndGxQYXI6XCLippVcIixndHF1ZXN0Olwi4qm8XCIsZ3RyYXBwcm94Olwi4qqGXCIsZ3RyYXJyOlwi4qW4XCIsZ3RyZG90Olwi4ouXXCIsZ3RyZXFsZXNzOlwi4oubXCIsZ3RyZXFxbGVzczpcIuKqjFwiLGd0cmxlc3M6XCLiibdcIixndHJzaW06XCLiibNcIixndmVydG5lcXE6XCLiianvuIBcIixndm5FOlwi4omp77iAXCIsSGFjZWs6XCLLh1wiLGhhaXJzcDpcIuKAilwiLGhhbGY6XCLCvVwiLGhhbWlsdDpcIuKEi1wiLEhBUkRjeTpcItCqXCIsaGFyZGN5Olwi0YpcIixoYXJyY2lyOlwi4qWIXCIsaGFycjpcIuKGlFwiLGhBcnI6XCLih5RcIixoYXJydzpcIuKGrVwiLEhhdDpcIl5cIixoYmFyOlwi4oSPXCIsSGNpcmM6XCLEpFwiLGhjaXJjOlwixKVcIixoZWFydHM6XCLimaVcIixoZWFydHN1aXQ6XCLimaVcIixoZWxsaXA6XCLigKZcIixoZXJjb246XCLiirlcIixoZnI6XCLwnZSlXCIsSGZyOlwi4oSMXCIsSGlsYmVydFNwYWNlOlwi4oSLXCIsaGtzZWFyb3c6XCLipKVcIixoa3N3YXJvdzpcIuKkplwiLGhvYXJyOlwi4oe/XCIsaG9tdGh0Olwi4oi7XCIsaG9va2xlZnRhcnJvdzpcIuKGqVwiLGhvb2tyaWdodGFycm93Olwi4oaqXCIsaG9wZjpcIvCdlZlcIixIb3BmOlwi4oSNXCIsaG9yYmFyOlwi4oCVXCIsSG9yaXpvbnRhbExpbmU6XCLilIBcIixoc2NyOlwi8J2SvVwiLEhzY3I6XCLihItcIixoc2xhc2g6XCLihI9cIixIc3Ryb2s6XCLEplwiLGhzdHJvazpcIsSnXCIsSHVtcERvd25IdW1wOlwi4omOXCIsSHVtcEVxdWFsOlwi4omPXCIsaHlidWxsOlwi4oGDXCIsaHlwaGVuOlwi4oCQXCIsSWFjdXRlOlwiw41cIixpYWN1dGU6XCLDrVwiLGljOlwi4oGjXCIsSWNpcmM6XCLDjlwiLGljaXJjOlwiw65cIixJY3k6XCLQmFwiLGljeTpcItC4XCIsSWRvdDpcIsSwXCIsSUVjeTpcItCVXCIsaWVjeTpcItC1XCIsaWV4Y2w6XCLCoVwiLGlmZjpcIuKHlFwiLGlmcjpcIvCdlKZcIixJZnI6XCLihJFcIixJZ3JhdmU6XCLDjFwiLGlncmF2ZTpcIsOsXCIsaWk6XCLihYhcIixpaWlpbnQ6XCLiqIxcIixpaWludDpcIuKIrVwiLGlpbmZpbjpcIuKnnFwiLGlpb3RhOlwi4oSpXCIsSUpsaWc6XCLEslwiLGlqbGlnOlwixLNcIixJbWFjcjpcIsSqXCIsaW1hY3I6XCLEq1wiLGltYWdlOlwi4oSRXCIsSW1hZ2luYXJ5STpcIuKFiFwiLGltYWdsaW5lOlwi4oSQXCIsaW1hZ3BhcnQ6XCLihJFcIixpbWF0aDpcIsSxXCIsSW06XCLihJFcIixpbW9mOlwi4oq3XCIsaW1wZWQ6XCLGtVwiLEltcGxpZXM6XCLih5JcIixpbmNhcmU6XCLihIVcIixpbjpcIuKIiFwiLGluZmluOlwi4oieXCIsaW5maW50aWU6XCLip51cIixpbm9kb3Q6XCLEsVwiLGludGNhbDpcIuKKulwiLGludDpcIuKIq1wiLEludDpcIuKIrFwiLGludGVnZXJzOlwi4oSkXCIsSW50ZWdyYWw6XCLiiKtcIixpbnRlcmNhbDpcIuKKulwiLEludGVyc2VjdGlvbjpcIuKLglwiLGludGxhcmhrOlwi4qiXXCIsaW50cHJvZDpcIuKovFwiLEludmlzaWJsZUNvbW1hOlwi4oGjXCIsSW52aXNpYmxlVGltZXM6XCLigaJcIixJT2N5Olwi0IFcIixpb2N5Olwi0ZFcIixJb2dvbjpcIsSuXCIsaW9nb246XCLEr1wiLElvcGY6XCLwnZWAXCIsaW9wZjpcIvCdlZpcIixJb3RhOlwizplcIixpb3RhOlwizrlcIixpcHJvZDpcIuKovFwiLGlxdWVzdDpcIsK/XCIsaXNjcjpcIvCdkr5cIixJc2NyOlwi4oSQXCIsaXNpbjpcIuKIiFwiLGlzaW5kb3Q6XCLii7VcIixpc2luRTpcIuKLuVwiLGlzaW5zOlwi4ou0XCIsaXNpbnN2Olwi4ouzXCIsaXNpbnY6XCLiiIhcIixpdDpcIuKBolwiLEl0aWxkZTpcIsSoXCIsaXRpbGRlOlwixKlcIixJdWtjeTpcItCGXCIsaXVrY3k6XCLRllwiLEl1bWw6XCLDj1wiLGl1bWw6XCLDr1wiLEpjaXJjOlwixLRcIixqY2lyYzpcIsS1XCIsSmN5Olwi0JlcIixqY3k6XCLQuVwiLEpmcjpcIvCdlI1cIixqZnI6XCLwnZSnXCIsam1hdGg6XCLIt1wiLEpvcGY6XCLwnZWBXCIsam9wZjpcIvCdlZtcIixKc2NyOlwi8J2SpVwiLGpzY3I6XCLwnZK/XCIsSnNlcmN5Olwi0IhcIixqc2VyY3k6XCLRmFwiLEp1a2N5Olwi0IRcIixqdWtjeTpcItGUXCIsS2FwcGE6XCLOmlwiLGthcHBhOlwizrpcIixrYXBwYXY6XCLPsFwiLEtjZWRpbDpcIsS2XCIsa2NlZGlsOlwixLdcIixLY3k6XCLQmlwiLGtjeTpcItC6XCIsS2ZyOlwi8J2UjlwiLGtmcjpcIvCdlKhcIixrZ3JlZW46XCLEuFwiLEtIY3k6XCLQpVwiLGtoY3k6XCLRhVwiLEtKY3k6XCLQjFwiLGtqY3k6XCLRnFwiLEtvcGY6XCLwnZWCXCIsa29wZjpcIvCdlZxcIixLc2NyOlwi8J2SplwiLGtzY3I6XCLwnZOAXCIsbEFhcnI6XCLih5pcIixMYWN1dGU6XCLEuVwiLGxhY3V0ZTpcIsS6XCIsbGFlbXB0eXY6XCLiprRcIixsYWdyYW46XCLihJJcIixMYW1iZGE6XCLOm1wiLGxhbWJkYTpcIs67XCIsbGFuZzpcIuKfqFwiLExhbmc6XCLin6pcIixsYW5nZDpcIuKmkVwiLGxhbmdsZTpcIuKfqFwiLGxhcDpcIuKqhVwiLExhcGxhY2V0cmY6XCLihJJcIixsYXF1bzpcIsKrXCIsbGFycmI6XCLih6RcIixsYXJyYmZzOlwi4qSfXCIsbGFycjpcIuKGkFwiLExhcnI6XCLihp5cIixsQXJyOlwi4oeQXCIsbGFycmZzOlwi4qSdXCIsbGFycmhrOlwi4oapXCIsbGFycmxwOlwi4oarXCIsbGFycnBsOlwi4qS5XCIsbGFycnNpbTpcIuKls1wiLGxhcnJ0bDpcIuKGolwiLGxhdGFpbDpcIuKkmVwiLGxBdGFpbDpcIuKkm1wiLGxhdDpcIuKqq1wiLGxhdGU6XCLiqq1cIixsYXRlczpcIuKqre+4gFwiLGxiYXJyOlwi4qSMXCIsbEJhcnI6XCLipI5cIixsYmJyazpcIuKdslwiLGxicmFjZTpcIntcIixsYnJhY2s6XCJbXCIsbGJya2U6XCLipotcIixsYnJrc2xkOlwi4qaPXCIsbGJya3NsdTpcIuKmjVwiLExjYXJvbjpcIsS9XCIsbGNhcm9uOlwixL5cIixMY2VkaWw6XCLEu1wiLGxjZWRpbDpcIsS8XCIsbGNlaWw6XCLijIhcIixsY3ViOlwie1wiLExjeTpcItCbXCIsbGN5Olwi0LtcIixsZGNhOlwi4qS2XCIsbGRxdW86XCLigJxcIixsZHF1b3I6XCLigJ5cIixsZHJkaGFyOlwi4qWnXCIsbGRydXNoYXI6XCLipYtcIixsZHNoOlwi4oayXCIsbGU6XCLiiaRcIixsRTpcIuKJplwiLExlZnRBbmdsZUJyYWNrZXQ6XCLin6hcIixMZWZ0QXJyb3dCYXI6XCLih6RcIixsZWZ0YXJyb3c6XCLihpBcIixMZWZ0QXJyb3c6XCLihpBcIixMZWZ0YXJyb3c6XCLih5BcIixMZWZ0QXJyb3dSaWdodEFycm93Olwi4oeGXCIsbGVmdGFycm93dGFpbDpcIuKGolwiLExlZnRDZWlsaW5nOlwi4oyIXCIsTGVmdERvdWJsZUJyYWNrZXQ6XCLin6ZcIixMZWZ0RG93blRlZVZlY3RvcjpcIuKloVwiLExlZnREb3duVmVjdG9yQmFyOlwi4qWZXCIsTGVmdERvd25WZWN0b3I6XCLih4NcIixMZWZ0Rmxvb3I6XCLijIpcIixsZWZ0aGFycG9vbmRvd246XCLihr1cIixsZWZ0aGFycG9vbnVwOlwi4oa8XCIsbGVmdGxlZnRhcnJvd3M6XCLih4dcIixsZWZ0cmlnaHRhcnJvdzpcIuKGlFwiLExlZnRSaWdodEFycm93Olwi4oaUXCIsTGVmdHJpZ2h0YXJyb3c6XCLih5RcIixsZWZ0cmlnaHRhcnJvd3M6XCLih4ZcIixsZWZ0cmlnaHRoYXJwb29uczpcIuKHi1wiLGxlZnRyaWdodHNxdWlnYXJyb3c6XCLihq1cIixMZWZ0UmlnaHRWZWN0b3I6XCLipY5cIixMZWZ0VGVlQXJyb3c6XCLihqRcIixMZWZ0VGVlOlwi4oqjXCIsTGVmdFRlZVZlY3RvcjpcIuKlmlwiLGxlZnR0aHJlZXRpbWVzOlwi4ouLXCIsTGVmdFRyaWFuZ2xlQmFyOlwi4qePXCIsTGVmdFRyaWFuZ2xlOlwi4oqyXCIsTGVmdFRyaWFuZ2xlRXF1YWw6XCLiirRcIixMZWZ0VXBEb3duVmVjdG9yOlwi4qWRXCIsTGVmdFVwVGVlVmVjdG9yOlwi4qWgXCIsTGVmdFVwVmVjdG9yQmFyOlwi4qWYXCIsTGVmdFVwVmVjdG9yOlwi4oa/XCIsTGVmdFZlY3RvckJhcjpcIuKlklwiLExlZnRWZWN0b3I6XCLihrxcIixsRWc6XCLiqotcIixsZWc6XCLii5pcIixsZXE6XCLiiaRcIixsZXFxOlwi4ommXCIsbGVxc2xhbnQ6XCLiqb1cIixsZXNjYzpcIuKqqFwiLGxlczpcIuKpvVwiLGxlc2RvdDpcIuKpv1wiLGxlc2RvdG86XCLiqoFcIixsZXNkb3RvcjpcIuKqg1wiLGxlc2c6XCLii5rvuIBcIixsZXNnZXM6XCLiqpNcIixsZXNzYXBwcm94Olwi4qqFXCIsbGVzc2RvdDpcIuKLllwiLGxlc3NlcWd0cjpcIuKLmlwiLGxlc3NlcXFndHI6XCLiqotcIixMZXNzRXF1YWxHcmVhdGVyOlwi4ouaXCIsTGVzc0Z1bGxFcXVhbDpcIuKJplwiLExlc3NHcmVhdGVyOlwi4om2XCIsbGVzc2d0cjpcIuKJtlwiLExlc3NMZXNzOlwi4qqhXCIsbGVzc3NpbTpcIuKJslwiLExlc3NTbGFudEVxdWFsOlwi4qm9XCIsTGVzc1RpbGRlOlwi4omyXCIsbGZpc2h0Olwi4qW8XCIsbGZsb29yOlwi4oyKXCIsTGZyOlwi8J2Uj1wiLGxmcjpcIvCdlKlcIixsZzpcIuKJtlwiLGxnRTpcIuKqkVwiLGxIYXI6XCLipaJcIixsaGFyZDpcIuKGvVwiLGxoYXJ1Olwi4oa8XCIsbGhhcnVsOlwi4qWqXCIsbGhibGs6XCLiloRcIixMSmN5Olwi0IlcIixsamN5Olwi0ZlcIixsbGFycjpcIuKHh1wiLGxsOlwi4omqXCIsTGw6XCLii5hcIixsbGNvcm5lcjpcIuKMnlwiLExsZWZ0YXJyb3c6XCLih5pcIixsbGhhcmQ6XCLipatcIixsbHRyaTpcIuKXulwiLExtaWRvdDpcIsS/XCIsbG1pZG90OlwixYBcIixsbW91c3RhY2hlOlwi4o6wXCIsbG1vdXN0Olwi4o6wXCIsbG5hcDpcIuKqiVwiLGxuYXBwcm94Olwi4qqJXCIsbG5lOlwi4qqHXCIsbG5FOlwi4omoXCIsbG5lcTpcIuKqh1wiLGxuZXFxOlwi4omoXCIsbG5zaW06XCLii6ZcIixsb2FuZzpcIuKfrFwiLGxvYXJyOlwi4oe9XCIsbG9icms6XCLin6ZcIixsb25nbGVmdGFycm93Olwi4p+1XCIsTG9uZ0xlZnRBcnJvdzpcIuKftVwiLExvbmdsZWZ0YXJyb3c6XCLin7hcIixsb25nbGVmdHJpZ2h0YXJyb3c6XCLin7dcIixMb25nTGVmdFJpZ2h0QXJyb3c6XCLin7dcIixMb25nbGVmdHJpZ2h0YXJyb3c6XCLin7pcIixsb25nbWFwc3RvOlwi4p+8XCIsbG9uZ3JpZ2h0YXJyb3c6XCLin7ZcIixMb25nUmlnaHRBcnJvdzpcIuKftlwiLExvbmdyaWdodGFycm93Olwi4p+5XCIsbG9vcGFycm93bGVmdDpcIuKGq1wiLGxvb3BhcnJvd3JpZ2h0Olwi4oasXCIsbG9wYXI6XCLipoVcIixMb3BmOlwi8J2Vg1wiLGxvcGY6XCLwnZWdXCIsbG9wbHVzOlwi4qitXCIsbG90aW1lczpcIuKotFwiLGxvd2FzdDpcIuKIl1wiLGxvd2JhcjpcIl9cIixMb3dlckxlZnRBcnJvdzpcIuKGmVwiLExvd2VyUmlnaHRBcnJvdzpcIuKGmFwiLGxvejpcIuKXilwiLGxvemVuZ2U6XCLil4pcIixsb3pmOlwi4qerXCIsbHBhcjpcIihcIixscGFybHQ6XCLippNcIixscmFycjpcIuKHhlwiLGxyY29ybmVyOlwi4oyfXCIsbHJoYXI6XCLih4tcIixscmhhcmQ6XCLipa1cIixscm06XCLigI5cIixscnRyaTpcIuKKv1wiLGxzYXF1bzpcIuKAuVwiLGxzY3I6XCLwnZOBXCIsTHNjcjpcIuKEklwiLGxzaDpcIuKGsFwiLExzaDpcIuKGsFwiLGxzaW06XCLiibJcIixsc2ltZTpcIuKqjVwiLGxzaW1nOlwi4qqPXCIsbHNxYjpcIltcIixsc3F1bzpcIuKAmFwiLGxzcXVvcjpcIuKAmlwiLExzdHJvazpcIsWBXCIsbHN0cm9rOlwixYJcIixsdGNjOlwi4qqmXCIsbHRjaXI6XCLiqblcIixsdDpcIjxcIixMVDpcIjxcIixMdDpcIuKJqlwiLGx0ZG90Olwi4ouWXCIsbHRocmVlOlwi4ouLXCIsbHRpbWVzOlwi4ouJXCIsbHRsYXJyOlwi4qW2XCIsbHRxdWVzdDpcIuKpu1wiLGx0cmk6XCLil4NcIixsdHJpZTpcIuKKtFwiLGx0cmlmOlwi4peCXCIsbHRyUGFyOlwi4qaWXCIsbHVyZHNoYXI6XCLipYpcIixsdXJ1aGFyOlwi4qWmXCIsbHZlcnRuZXFxOlwi4omo77iAXCIsbHZuRTpcIuKJqO+4gFwiLG1hY3I6XCLCr1wiLG1hbGU6XCLimYJcIixtYWx0Olwi4pygXCIsbWFsdGVzZTpcIuKcoFwiLE1hcDpcIuKkhVwiLG1hcDpcIuKGplwiLG1hcHN0bzpcIuKGplwiLG1hcHN0b2Rvd246XCLihqdcIixtYXBzdG9sZWZ0Olwi4oakXCIsbWFwc3RvdXA6XCLihqVcIixtYXJrZXI6XCLilq5cIixtY29tbWE6XCLiqKlcIixNY3k6XCLQnFwiLG1jeTpcItC8XCIsbWRhc2g6XCLigJRcIixtRERvdDpcIuKIulwiLG1lYXN1cmVkYW5nbGU6XCLiiKFcIixNZWRpdW1TcGFjZTpcIuKBn1wiLE1lbGxpbnRyZjpcIuKEs1wiLE1mcjpcIvCdlJBcIixtZnI6XCLwnZSqXCIsbWhvOlwi4oSnXCIsbWljcm86XCLCtVwiLG1pZGFzdDpcIipcIixtaWRjaXI6XCLiq7BcIixtaWQ6XCLiiKNcIixtaWRkb3Q6XCLCt1wiLG1pbnVzYjpcIuKKn1wiLG1pbnVzOlwi4oiSXCIsbWludXNkOlwi4oi4XCIsbWludXNkdTpcIuKoqlwiLE1pbnVzUGx1czpcIuKIk1wiLG1sY3A6XCLiq5tcIixtbGRyOlwi4oCmXCIsbW5wbHVzOlwi4oiTXCIsbW9kZWxzOlwi4oqnXCIsTW9wZjpcIvCdlYRcIixtb3BmOlwi8J2VnlwiLG1wOlwi4oiTXCIsbXNjcjpcIvCdk4JcIixNc2NyOlwi4oSzXCIsbXN0cG9zOlwi4oi+XCIsTXU6XCLOnFwiLG11OlwizrxcIixtdWx0aW1hcDpcIuKKuFwiLG11bWFwOlwi4oq4XCIsbmFibGE6XCLiiIdcIixOYWN1dGU6XCLFg1wiLG5hY3V0ZTpcIsWEXCIsbmFuZzpcIuKIoOKDklwiLG5hcDpcIuKJiVwiLG5hcEU6XCLiqbDMuFwiLG5hcGlkOlwi4omLzLhcIixuYXBvczpcIsWJXCIsbmFwcHJveDpcIuKJiVwiLG5hdHVyYWw6XCLima5cIixuYXR1cmFsczpcIuKElVwiLG5hdHVyOlwi4pmuXCIsbmJzcDpcIsKgXCIsbmJ1bXA6XCLiiY7MuFwiLG5idW1wZTpcIuKJj8y4XCIsbmNhcDpcIuKpg1wiLE5jYXJvbjpcIsWHXCIsbmNhcm9uOlwixYhcIixOY2VkaWw6XCLFhVwiLG5jZWRpbDpcIsWGXCIsbmNvbmc6XCLiiYdcIixuY29uZ2RvdDpcIuKprcy4XCIsbmN1cDpcIuKpglwiLE5jeTpcItCdXCIsbmN5Olwi0L1cIixuZGFzaDpcIuKAk1wiLG5lYXJoazpcIuKkpFwiLG5lYXJyOlwi4oaXXCIsbmVBcnI6XCLih5dcIixuZWFycm93Olwi4oaXXCIsbmU6XCLiiaBcIixuZWRvdDpcIuKJkMy4XCIsTmVnYXRpdmVNZWRpdW1TcGFjZTpcIuKAi1wiLE5lZ2F0aXZlVGhpY2tTcGFjZTpcIuKAi1wiLE5lZ2F0aXZlVGhpblNwYWNlOlwi4oCLXCIsTmVnYXRpdmVWZXJ5VGhpblNwYWNlOlwi4oCLXCIsbmVxdWl2Olwi4omiXCIsbmVzZWFyOlwi4qSoXCIsbmVzaW06XCLiiYLMuFwiLE5lc3RlZEdyZWF0ZXJHcmVhdGVyOlwi4omrXCIsTmVzdGVkTGVzc0xlc3M6XCLiiapcIixOZXdMaW5lOlwiXFxuXCIsbmV4aXN0Olwi4oiEXCIsbmV4aXN0czpcIuKIhFwiLE5mcjpcIvCdlJFcIixuZnI6XCLwnZSrXCIsbmdFOlwi4omnzLhcIixuZ2U6XCLiibFcIixuZ2VxOlwi4omxXCIsbmdlcXE6XCLiiafMuFwiLG5nZXFzbGFudDpcIuKpvsy4XCIsbmdlczpcIuKpvsy4XCIsbkdnOlwi4ouZzLhcIixuZ3NpbTpcIuKJtVwiLG5HdDpcIuKJq+KDklwiLG5ndDpcIuKJr1wiLG5ndHI6XCLiia9cIixuR3R2Olwi4omrzLhcIixuaGFycjpcIuKGrlwiLG5oQXJyOlwi4oeOXCIsbmhwYXI6XCLiq7JcIixuaTpcIuKIi1wiLG5pczpcIuKLvFwiLG5pc2Q6XCLii7pcIixuaXY6XCLiiItcIixOSmN5Olwi0IpcIixuamN5Olwi0ZpcIixubGFycjpcIuKGmlwiLG5sQXJyOlwi4oeNXCIsbmxkcjpcIuKApVwiLG5sRTpcIuKJpsy4XCIsbmxlOlwi4omwXCIsbmxlZnRhcnJvdzpcIuKGmlwiLG5MZWZ0YXJyb3c6XCLih41cIixubGVmdHJpZ2h0YXJyb3c6XCLihq5cIixuTGVmdHJpZ2h0YXJyb3c6XCLih45cIixubGVxOlwi4omwXCIsbmxlcXE6XCLiiabMuFwiLG5sZXFzbGFudDpcIuKpvcy4XCIsbmxlczpcIuKpvcy4XCIsbmxlc3M6XCLiia5cIixuTGw6XCLii5jMuFwiLG5sc2ltOlwi4om0XCIsbkx0Olwi4omq4oOSXCIsbmx0Olwi4omuXCIsbmx0cmk6XCLii6pcIixubHRyaWU6XCLii6xcIixuTHR2Olwi4omqzLhcIixubWlkOlwi4oikXCIsTm9CcmVhazpcIuKBoFwiLE5vbkJyZWFraW5nU3BhY2U6XCLCoFwiLG5vcGY6XCLwnZWfXCIsTm9wZjpcIuKElVwiLE5vdDpcIuKrrFwiLG5vdDpcIsKsXCIsTm90Q29uZ3J1ZW50Olwi4omiXCIsTm90Q3VwQ2FwOlwi4omtXCIsTm90RG91YmxlVmVydGljYWxCYXI6XCLiiKZcIixOb3RFbGVtZW50Olwi4oiJXCIsTm90RXF1YWw6XCLiiaBcIixOb3RFcXVhbFRpbGRlOlwi4omCzLhcIixOb3RFeGlzdHM6XCLiiIRcIixOb3RHcmVhdGVyOlwi4omvXCIsTm90R3JlYXRlckVxdWFsOlwi4omxXCIsTm90R3JlYXRlckZ1bGxFcXVhbDpcIuKJp8y4XCIsTm90R3JlYXRlckdyZWF0ZXI6XCLiiavMuFwiLE5vdEdyZWF0ZXJMZXNzOlwi4om5XCIsTm90R3JlYXRlclNsYW50RXF1YWw6XCLiqb7MuFwiLE5vdEdyZWF0ZXJUaWxkZTpcIuKJtVwiLE5vdEh1bXBEb3duSHVtcDpcIuKJjsy4XCIsTm90SHVtcEVxdWFsOlwi4omPzLhcIixub3RpbjpcIuKIiVwiLG5vdGluZG90Olwi4ou1zLhcIixub3RpbkU6XCLii7nMuFwiLG5vdGludmE6XCLiiIlcIixub3RpbnZiOlwi4ou3XCIsbm90aW52YzpcIuKLtlwiLE5vdExlZnRUcmlhbmdsZUJhcjpcIuKnj8y4XCIsTm90TGVmdFRyaWFuZ2xlOlwi4ouqXCIsTm90TGVmdFRyaWFuZ2xlRXF1YWw6XCLii6xcIixOb3RMZXNzOlwi4omuXCIsTm90TGVzc0VxdWFsOlwi4omwXCIsTm90TGVzc0dyZWF0ZXI6XCLiibhcIixOb3RMZXNzTGVzczpcIuKJqsy4XCIsTm90TGVzc1NsYW50RXF1YWw6XCLiqb3MuFwiLE5vdExlc3NUaWxkZTpcIuKJtFwiLE5vdE5lc3RlZEdyZWF0ZXJHcmVhdGVyOlwi4qqizLhcIixOb3ROZXN0ZWRMZXNzTGVzczpcIuKqocy4XCIsbm90bmk6XCLiiIxcIixub3RuaXZhOlwi4oiMXCIsbm90bml2YjpcIuKLvlwiLG5vdG5pdmM6XCLii71cIixOb3RQcmVjZWRlczpcIuKKgFwiLE5vdFByZWNlZGVzRXF1YWw6XCLiqq/MuFwiLE5vdFByZWNlZGVzU2xhbnRFcXVhbDpcIuKLoFwiLE5vdFJldmVyc2VFbGVtZW50Olwi4oiMXCIsTm90UmlnaHRUcmlhbmdsZUJhcjpcIuKnkMy4XCIsTm90UmlnaHRUcmlhbmdsZTpcIuKLq1wiLE5vdFJpZ2h0VHJpYW5nbGVFcXVhbDpcIuKLrVwiLE5vdFNxdWFyZVN1YnNldDpcIuKKj8y4XCIsTm90U3F1YXJlU3Vic2V0RXF1YWw6XCLii6JcIixOb3RTcXVhcmVTdXBlcnNldDpcIuKKkMy4XCIsTm90U3F1YXJlU3VwZXJzZXRFcXVhbDpcIuKLo1wiLE5vdFN1YnNldDpcIuKKguKDklwiLE5vdFN1YnNldEVxdWFsOlwi4oqIXCIsTm90U3VjY2VlZHM6XCLiioFcIixOb3RTdWNjZWVkc0VxdWFsOlwi4qqwzLhcIixOb3RTdWNjZWVkc1NsYW50RXF1YWw6XCLii6FcIixOb3RTdWNjZWVkc1RpbGRlOlwi4om/zLhcIixOb3RTdXBlcnNldDpcIuKKg+KDklwiLE5vdFN1cGVyc2V0RXF1YWw6XCLiiolcIixOb3RUaWxkZTpcIuKJgVwiLE5vdFRpbGRlRXF1YWw6XCLiiYRcIixOb3RUaWxkZUZ1bGxFcXVhbDpcIuKJh1wiLE5vdFRpbGRlVGlsZGU6XCLiiYlcIixOb3RWZXJ0aWNhbEJhcjpcIuKIpFwiLG5wYXJhbGxlbDpcIuKIplwiLG5wYXI6XCLiiKZcIixucGFyc2w6XCLiq73ig6VcIixucGFydDpcIuKIgsy4XCIsbnBvbGludDpcIuKolFwiLG5wcjpcIuKKgFwiLG5wcmN1ZTpcIuKLoFwiLG5wcmVjOlwi4oqAXCIsbnByZWNlcTpcIuKqr8y4XCIsbnByZTpcIuKqr8y4XCIsbnJhcnJjOlwi4qSzzLhcIixucmFycjpcIuKGm1wiLG5yQXJyOlwi4oePXCIsbnJhcnJ3Olwi4oadzLhcIixucmlnaHRhcnJvdzpcIuKGm1wiLG5SaWdodGFycm93Olwi4oePXCIsbnJ0cmk6XCLii6tcIixucnRyaWU6XCLii61cIixuc2M6XCLiioFcIixuc2NjdWU6XCLii6FcIixuc2NlOlwi4qqwzLhcIixOc2NyOlwi8J2SqVwiLG5zY3I6XCLwnZODXCIsbnNob3J0bWlkOlwi4oikXCIsbnNob3J0cGFyYWxsZWw6XCLiiKZcIixuc2ltOlwi4omBXCIsbnNpbWU6XCLiiYRcIixuc2ltZXE6XCLiiYRcIixuc21pZDpcIuKIpFwiLG5zcGFyOlwi4oimXCIsbnNxc3ViZTpcIuKLolwiLG5zcXN1cGU6XCLii6NcIixuc3ViOlwi4oqEXCIsbnN1YkU6XCLiq4XMuFwiLG5zdWJlOlwi4oqIXCIsbnN1YnNldDpcIuKKguKDklwiLG5zdWJzZXRlcTpcIuKKiFwiLG5zdWJzZXRlcXE6XCLiq4XMuFwiLG5zdWNjOlwi4oqBXCIsbnN1Y2NlcTpcIuKqsMy4XCIsbnN1cDpcIuKKhVwiLG5zdXBFOlwi4quGzLhcIixuc3VwZTpcIuKKiVwiLG5zdXBzZXQ6XCLiioPig5JcIixuc3Vwc2V0ZXE6XCLiiolcIixuc3Vwc2V0ZXFxOlwi4quGzLhcIixudGdsOlwi4om5XCIsTnRpbGRlOlwiw5FcIixudGlsZGU6XCLDsVwiLG50bGc6XCLiibhcIixudHJpYW5nbGVsZWZ0Olwi4ouqXCIsbnRyaWFuZ2xlbGVmdGVxOlwi4ousXCIsbnRyaWFuZ2xlcmlnaHQ6XCLii6tcIixudHJpYW5nbGVyaWdodGVxOlwi4outXCIsTnU6XCLOnVwiLG51Olwizr1cIixudW06XCIjXCIsbnVtZXJvOlwi4oSWXCIsbnVtc3A6XCLigIdcIixudmFwOlwi4omN4oOSXCIsbnZkYXNoOlwi4oqsXCIsbnZEYXNoOlwi4oqtXCIsblZkYXNoOlwi4oquXCIsblZEYXNoOlwi4oqvXCIsbnZnZTpcIuKJpeKDklwiLG52Z3Q6XCI+4oOSXCIsbnZIYXJyOlwi4qSEXCIsbnZpbmZpbjpcIuKnnlwiLG52bEFycjpcIuKkglwiLG52bGU6XCLiiaTig5JcIixudmx0OlwiPOKDklwiLG52bHRyaWU6XCLiirTig5JcIixudnJBcnI6XCLipINcIixudnJ0cmllOlwi4oq14oOSXCIsbnZzaW06XCLiiLzig5JcIixud2FyaGs6XCLipKNcIixud2FycjpcIuKGllwiLG53QXJyOlwi4oeWXCIsbndhcnJvdzpcIuKGllwiLG53bmVhcjpcIuKkp1wiLE9hY3V0ZTpcIsOTXCIsb2FjdXRlOlwiw7NcIixvYXN0Olwi4oqbXCIsT2NpcmM6XCLDlFwiLG9jaXJjOlwiw7RcIixvY2lyOlwi4oqaXCIsT2N5Olwi0J5cIixvY3k6XCLQvlwiLG9kYXNoOlwi4oqdXCIsT2RibGFjOlwixZBcIixvZGJsYWM6XCLFkVwiLG9kaXY6XCLiqLhcIixvZG90Olwi4oqZXCIsb2Rzb2xkOlwi4qa8XCIsT0VsaWc6XCLFklwiLG9lbGlnOlwixZNcIixvZmNpcjpcIuKmv1wiLE9mcjpcIvCdlJJcIixvZnI6XCLwnZSsXCIsb2dvbjpcIsubXCIsT2dyYXZlOlwiw5JcIixvZ3JhdmU6XCLDslwiLG9ndDpcIuKngVwiLG9oYmFyOlwi4qa1XCIsb2htOlwizqlcIixvaW50Olwi4oiuXCIsb2xhcnI6XCLihrpcIixvbGNpcjpcIuKmvlwiLG9sY3Jvc3M6XCLiprtcIixvbGluZTpcIuKAvlwiLG9sdDpcIuKngFwiLE9tYWNyOlwixYxcIixvbWFjcjpcIsWNXCIsT21lZ2E6XCLOqVwiLG9tZWdhOlwiz4lcIixPbWljcm9uOlwizp9cIixvbWljcm9uOlwizr9cIixvbWlkOlwi4qa2XCIsb21pbnVzOlwi4oqWXCIsT29wZjpcIvCdlYZcIixvb3BmOlwi8J2VoFwiLG9wYXI6XCLiprdcIixPcGVuQ3VybHlEb3VibGVRdW90ZTpcIuKAnFwiLE9wZW5DdXJseVF1b3RlOlwi4oCYXCIsb3BlcnA6XCLiprlcIixvcGx1czpcIuKKlVwiLG9yYXJyOlwi4oa7XCIsT3I6XCLiqZRcIixvcjpcIuKIqFwiLG9yZDpcIuKpnVwiLG9yZGVyOlwi4oS0XCIsb3JkZXJvZjpcIuKEtFwiLG9yZGY6XCLCqlwiLG9yZG06XCLCulwiLG9yaWdvZjpcIuKKtlwiLG9yb3I6XCLiqZZcIixvcnNsb3BlOlwi4qmXXCIsb3J2Olwi4qmbXCIsb1M6XCLik4hcIixPc2NyOlwi8J2SqlwiLG9zY3I6XCLihLRcIixPc2xhc2g6XCLDmFwiLG9zbGFzaDpcIsO4XCIsb3NvbDpcIuKKmFwiLE90aWxkZTpcIsOVXCIsb3RpbGRlOlwiw7VcIixvdGltZXNhczpcIuKotlwiLE90aW1lczpcIuKot1wiLG90aW1lczpcIuKKl1wiLE91bWw6XCLDllwiLG91bWw6XCLDtlwiLG92YmFyOlwi4oy9XCIsT3ZlckJhcjpcIuKAvlwiLE92ZXJCcmFjZTpcIuKPnlwiLE92ZXJCcmFja2V0Olwi4o60XCIsT3ZlclBhcmVudGhlc2lzOlwi4o+cXCIscGFyYTpcIsK2XCIscGFyYWxsZWw6XCLiiKVcIixwYXI6XCLiiKVcIixwYXJzaW06XCLiq7NcIixwYXJzbDpcIuKrvVwiLHBhcnQ6XCLiiIJcIixQYXJ0aWFsRDpcIuKIglwiLFBjeTpcItCfXCIscGN5Olwi0L9cIixwZXJjbnQ6XCIlXCIscGVyaW9kOlwiLlwiLHBlcm1pbDpcIuKAsFwiLHBlcnA6XCLiiqVcIixwZXJ0ZW5rOlwi4oCxXCIsUGZyOlwi8J2Uk1wiLHBmcjpcIvCdlK1cIixQaGk6XCLOplwiLHBoaTpcIs+GXCIscGhpdjpcIs+VXCIscGhtbWF0Olwi4oSzXCIscGhvbmU6XCLimI5cIixQaTpcIs6gXCIscGk6XCLPgFwiLHBpdGNoZm9yazpcIuKLlFwiLHBpdjpcIs+WXCIscGxhbmNrOlwi4oSPXCIscGxhbmNraDpcIuKEjlwiLHBsYW5rdjpcIuKEj1wiLHBsdXNhY2lyOlwi4qijXCIscGx1c2I6XCLiip5cIixwbHVzY2lyOlwi4qiiXCIscGx1czpcIitcIixwbHVzZG86XCLiiJRcIixwbHVzZHU6XCLiqKVcIixwbHVzZTpcIuKpslwiLFBsdXNNaW51czpcIsKxXCIscGx1c21uOlwiwrFcIixwbHVzc2ltOlwi4qimXCIscGx1c3R3bzpcIuKop1wiLHBtOlwiwrFcIixQb2luY2FyZXBsYW5lOlwi4oSMXCIscG9pbnRpbnQ6XCLiqJVcIixwb3BmOlwi8J2VoVwiLFBvcGY6XCLihJlcIixwb3VuZDpcIsKjXCIscHJhcDpcIuKqt1wiLFByOlwi4qq7XCIscHI6XCLiibpcIixwcmN1ZTpcIuKJvFwiLHByZWNhcHByb3g6XCLiqrdcIixwcmVjOlwi4om6XCIscHJlY2N1cmx5ZXE6XCLiibxcIixQcmVjZWRlczpcIuKJulwiLFByZWNlZGVzRXF1YWw6XCLiqq9cIixQcmVjZWRlc1NsYW50RXF1YWw6XCLiibxcIixQcmVjZWRlc1RpbGRlOlwi4om+XCIscHJlY2VxOlwi4qqvXCIscHJlY25hcHByb3g6XCLiqrlcIixwcmVjbmVxcTpcIuKqtVwiLHByZWNuc2ltOlwi4ouoXCIscHJlOlwi4qqvXCIscHJFOlwi4qqzXCIscHJlY3NpbTpcIuKJvlwiLHByaW1lOlwi4oCyXCIsUHJpbWU6XCLigLNcIixwcmltZXM6XCLihJlcIixwcm5hcDpcIuKquVwiLHBybkU6XCLiqrVcIixwcm5zaW06XCLii6hcIixwcm9kOlwi4oiPXCIsUHJvZHVjdDpcIuKIj1wiLHByb2ZhbGFyOlwi4oyuXCIscHJvZmxpbmU6XCLijJJcIixwcm9mc3VyZjpcIuKMk1wiLHByb3A6XCLiiJ1cIixQcm9wb3J0aW9uYWw6XCLiiJ1cIixQcm9wb3J0aW9uOlwi4oi3XCIscHJvcHRvOlwi4oidXCIscHJzaW06XCLiib5cIixwcnVyZWw6XCLiirBcIixQc2NyOlwi8J2Sq1wiLHBzY3I6XCLwnZOFXCIsUHNpOlwizqhcIixwc2k6XCLPiFwiLHB1bmNzcDpcIuKAiFwiLFFmcjpcIvCdlJRcIixxZnI6XCLwnZSuXCIscWludDpcIuKojFwiLHFvcGY6XCLwnZWiXCIsUW9wZjpcIuKEmlwiLHFwcmltZTpcIuKBl1wiLFFzY3I6XCLwnZKsXCIscXNjcjpcIvCdk4ZcIixxdWF0ZXJuaW9uczpcIuKEjVwiLHF1YXRpbnQ6XCLiqJZcIixxdWVzdDpcIj9cIixxdWVzdGVxOlwi4omfXCIscXVvdDonXCInLFFVT1Q6J1wiJyxyQWFycjpcIuKHm1wiLHJhY2U6XCLiiL3MsVwiLFJhY3V0ZTpcIsWUXCIscmFjdXRlOlwixZVcIixyYWRpYzpcIuKImlwiLHJhZW1wdHl2Olwi4qazXCIscmFuZzpcIuKfqVwiLFJhbmc6XCLin6tcIixyYW5nZDpcIuKmklwiLHJhbmdlOlwi4qalXCIscmFuZ2xlOlwi4p+pXCIscmFxdW86XCLCu1wiLHJhcnJhcDpcIuKltVwiLHJhcnJiOlwi4oelXCIscmFycmJmczpcIuKkoFwiLHJhcnJjOlwi4qSzXCIscmFycjpcIuKGklwiLFJhcnI6XCLihqBcIixyQXJyOlwi4oeSXCIscmFycmZzOlwi4qSeXCIscmFycmhrOlwi4oaqXCIscmFycmxwOlwi4oasXCIscmFycnBsOlwi4qWFXCIscmFycnNpbTpcIuKltFwiLFJhcnJ0bDpcIuKkllwiLHJhcnJ0bDpcIuKGo1wiLHJhcnJ3Olwi4oadXCIscmF0YWlsOlwi4qSaXCIsckF0YWlsOlwi4qScXCIscmF0aW86XCLiiLZcIixyYXRpb25hbHM6XCLihJpcIixyYmFycjpcIuKkjVwiLHJCYXJyOlwi4qSPXCIsUkJhcnI6XCLipJBcIixyYmJyazpcIuKds1wiLHJicmFjZTpcIn1cIixyYnJhY2s6XCJdXCIscmJya2U6XCLipoxcIixyYnJrc2xkOlwi4qaOXCIscmJya3NsdTpcIuKmkFwiLFJjYXJvbjpcIsWYXCIscmNhcm9uOlwixZlcIixSY2VkaWw6XCLFllwiLHJjZWRpbDpcIsWXXCIscmNlaWw6XCLijIlcIixyY3ViOlwifVwiLFJjeTpcItCgXCIscmN5Olwi0YBcIixyZGNhOlwi4qS3XCIscmRsZGhhcjpcIuKlqVwiLHJkcXVvOlwi4oCdXCIscmRxdW9yOlwi4oCdXCIscmRzaDpcIuKGs1wiLHJlYWw6XCLihJxcIixyZWFsaW5lOlwi4oSbXCIscmVhbHBhcnQ6XCLihJxcIixyZWFsczpcIuKEnVwiLFJlOlwi4oScXCIscmVjdDpcIuKWrVwiLHJlZzpcIsKuXCIsUkVHOlwiwq5cIixSZXZlcnNlRWxlbWVudDpcIuKIi1wiLFJldmVyc2VFcXVpbGlicml1bTpcIuKHi1wiLFJldmVyc2VVcEVxdWlsaWJyaXVtOlwi4qWvXCIscmZpc2h0Olwi4qW9XCIscmZsb29yOlwi4oyLXCIscmZyOlwi8J2Ur1wiLFJmcjpcIuKEnFwiLHJIYXI6XCLipaRcIixyaGFyZDpcIuKHgVwiLHJoYXJ1Olwi4oeAXCIscmhhcnVsOlwi4qWsXCIsUmhvOlwizqFcIixyaG86XCLPgVwiLHJob3Y6XCLPsVwiLFJpZ2h0QW5nbGVCcmFja2V0Olwi4p+pXCIsUmlnaHRBcnJvd0JhcjpcIuKHpVwiLHJpZ2h0YXJyb3c6XCLihpJcIixSaWdodEFycm93Olwi4oaSXCIsUmlnaHRhcnJvdzpcIuKHklwiLFJpZ2h0QXJyb3dMZWZ0QXJyb3c6XCLih4RcIixyaWdodGFycm93dGFpbDpcIuKGo1wiLFJpZ2h0Q2VpbGluZzpcIuKMiVwiLFJpZ2h0RG91YmxlQnJhY2tldDpcIuKfp1wiLFJpZ2h0RG93blRlZVZlY3RvcjpcIuKlnVwiLFJpZ2h0RG93blZlY3RvckJhcjpcIuKllVwiLFJpZ2h0RG93blZlY3RvcjpcIuKHglwiLFJpZ2h0Rmxvb3I6XCLijItcIixyaWdodGhhcnBvb25kb3duOlwi4oeBXCIscmlnaHRoYXJwb29udXA6XCLih4BcIixyaWdodGxlZnRhcnJvd3M6XCLih4RcIixyaWdodGxlZnRoYXJwb29uczpcIuKHjFwiLHJpZ2h0cmlnaHRhcnJvd3M6XCLih4lcIixyaWdodHNxdWlnYXJyb3c6XCLihp1cIixSaWdodFRlZUFycm93Olwi4oamXCIsUmlnaHRUZWU6XCLiiqJcIixSaWdodFRlZVZlY3RvcjpcIuKlm1wiLHJpZ2h0dGhyZWV0aW1lczpcIuKLjFwiLFJpZ2h0VHJpYW5nbGVCYXI6XCLip5BcIixSaWdodFRyaWFuZ2xlOlwi4oqzXCIsUmlnaHRUcmlhbmdsZUVxdWFsOlwi4oq1XCIsUmlnaHRVcERvd25WZWN0b3I6XCLipY9cIixSaWdodFVwVGVlVmVjdG9yOlwi4qWcXCIsUmlnaHRVcFZlY3RvckJhcjpcIuKllFwiLFJpZ2h0VXBWZWN0b3I6XCLihr5cIixSaWdodFZlY3RvckJhcjpcIuKlk1wiLFJpZ2h0VmVjdG9yOlwi4oeAXCIscmluZzpcIsuaXCIscmlzaW5nZG90c2VxOlwi4omTXCIscmxhcnI6XCLih4RcIixybGhhcjpcIuKHjFwiLHJsbTpcIuKAj1wiLHJtb3VzdGFjaGU6XCLijrFcIixybW91c3Q6XCLijrFcIixybm1pZDpcIuKrrlwiLHJvYW5nOlwi4p+tXCIscm9hcnI6XCLih75cIixyb2JyazpcIuKfp1wiLHJvcGFyOlwi4qaGXCIscm9wZjpcIvCdlaNcIixSb3BmOlwi4oSdXCIscm9wbHVzOlwi4qiuXCIscm90aW1lczpcIuKotVwiLFJvdW5kSW1wbGllczpcIuKlsFwiLHJwYXI6XCIpXCIscnBhcmd0Olwi4qaUXCIscnBwb2xpbnQ6XCLiqJJcIixycmFycjpcIuKHiVwiLFJyaWdodGFycm93Olwi4oebXCIscnNhcXVvOlwi4oC6XCIscnNjcjpcIvCdk4dcIixSc2NyOlwi4oSbXCIscnNoOlwi4oaxXCIsUnNoOlwi4oaxXCIscnNxYjpcIl1cIixyc3F1bzpcIuKAmVwiLHJzcXVvcjpcIuKAmVwiLHJ0aHJlZTpcIuKLjFwiLHJ0aW1lczpcIuKLilwiLHJ0cmk6XCLilrlcIixydHJpZTpcIuKKtVwiLHJ0cmlmOlwi4pa4XCIscnRyaWx0cmk6XCLip45cIixSdWxlRGVsYXllZDpcIuKntFwiLHJ1bHVoYXI6XCLipahcIixyeDpcIuKEnlwiLFNhY3V0ZTpcIsWaXCIsc2FjdXRlOlwixZtcIixzYnF1bzpcIuKAmlwiLHNjYXA6XCLiqrhcIixTY2Fyb246XCLFoFwiLHNjYXJvbjpcIsWhXCIsU2M6XCLiqrxcIixzYzpcIuKJu1wiLHNjY3VlOlwi4om9XCIsc2NlOlwi4qqwXCIsc2NFOlwi4qq0XCIsU2NlZGlsOlwixZ5cIixzY2VkaWw6XCLFn1wiLFNjaXJjOlwixZxcIixzY2lyYzpcIsWdXCIsc2NuYXA6XCLiqrpcIixzY25FOlwi4qq2XCIsc2Nuc2ltOlwi4oupXCIsc2Nwb2xpbnQ6XCLiqJNcIixzY3NpbTpcIuKJv1wiLFNjeTpcItChXCIsc2N5Olwi0YFcIixzZG90YjpcIuKKoVwiLHNkb3Q6XCLii4VcIixzZG90ZTpcIuKpplwiLHNlYXJoazpcIuKkpVwiLHNlYXJyOlwi4oaYXCIsc2VBcnI6XCLih5hcIixzZWFycm93Olwi4oaYXCIsc2VjdDpcIsKnXCIsc2VtaTpcIjtcIixzZXN3YXI6XCLipKlcIixzZXRtaW51czpcIuKIllwiLHNldG1uOlwi4oiWXCIsc2V4dDpcIuKctlwiLFNmcjpcIvCdlJZcIixzZnI6XCLwnZSwXCIsc2Zyb3duOlwi4oyiXCIsc2hhcnA6XCLima9cIixTSENIY3k6XCLQqVwiLHNoY2hjeTpcItGJXCIsU0hjeTpcItCoXCIsc2hjeTpcItGIXCIsU2hvcnREb3duQXJyb3c6XCLihpNcIixTaG9ydExlZnRBcnJvdzpcIuKGkFwiLHNob3J0bWlkOlwi4oijXCIsc2hvcnRwYXJhbGxlbDpcIuKIpVwiLFNob3J0UmlnaHRBcnJvdzpcIuKGklwiLFNob3J0VXBBcnJvdzpcIuKGkVwiLHNoeTpcIsKtXCIsU2lnbWE6XCLOo1wiLHNpZ21hOlwiz4NcIixzaWdtYWY6XCLPglwiLHNpZ21hdjpcIs+CXCIsc2ltOlwi4oi8XCIsc2ltZG90Olwi4qmqXCIsc2ltZTpcIuKJg1wiLHNpbWVxOlwi4omDXCIsc2ltZzpcIuKqnlwiLHNpbWdFOlwi4qqgXCIsc2ltbDpcIuKqnVwiLHNpbWxFOlwi4qqfXCIsc2ltbmU6XCLiiYZcIixzaW1wbHVzOlwi4qikXCIsc2ltcmFycjpcIuKlslwiLHNsYXJyOlwi4oaQXCIsU21hbGxDaXJjbGU6XCLiiJhcIixzbWFsbHNldG1pbnVzOlwi4oiWXCIsc21hc2hwOlwi4qizXCIsc21lcGFyc2w6XCLip6RcIixzbWlkOlwi4oijXCIsc21pbGU6XCLijKNcIixzbXQ6XCLiqqpcIixzbXRlOlwi4qqsXCIsc210ZXM6XCLiqqzvuIBcIixTT0ZUY3k6XCLQrFwiLHNvZnRjeTpcItGMXCIsc29sYmFyOlwi4oy/XCIsc29sYjpcIuKnhFwiLHNvbDpcIi9cIixTb3BmOlwi8J2VilwiLHNvcGY6XCLwnZWkXCIsc3BhZGVzOlwi4pmgXCIsc3BhZGVzdWl0Olwi4pmgXCIsc3BhcjpcIuKIpVwiLHNxY2FwOlwi4oqTXCIsc3FjYXBzOlwi4oqT77iAXCIsc3FjdXA6XCLiipRcIixzcWN1cHM6XCLiipTvuIBcIixTcXJ0Olwi4oiaXCIsc3FzdWI6XCLiio9cIixzcXN1YmU6XCLiipFcIixzcXN1YnNldDpcIuKKj1wiLHNxc3Vic2V0ZXE6XCLiipFcIixzcXN1cDpcIuKKkFwiLHNxc3VwZTpcIuKKklwiLHNxc3Vwc2V0Olwi4oqQXCIsc3FzdXBzZXRlcTpcIuKKklwiLHNxdWFyZTpcIuKWoVwiLFNxdWFyZTpcIuKWoVwiLFNxdWFyZUludGVyc2VjdGlvbjpcIuKKk1wiLFNxdWFyZVN1YnNldDpcIuKKj1wiLFNxdWFyZVN1YnNldEVxdWFsOlwi4oqRXCIsU3F1YXJlU3VwZXJzZXQ6XCLiipBcIixTcXVhcmVTdXBlcnNldEVxdWFsOlwi4oqSXCIsU3F1YXJlVW5pb246XCLiipRcIixzcXVhcmY6XCLilqpcIixzcXU6XCLilqFcIixzcXVmOlwi4paqXCIsc3JhcnI6XCLihpJcIixTc2NyOlwi8J2SrlwiLHNzY3I6XCLwnZOIXCIsc3NldG1uOlwi4oiWXCIsc3NtaWxlOlwi4oyjXCIsc3N0YXJmOlwi4ouGXCIsU3RhcjpcIuKLhlwiLHN0YXI6XCLimIZcIixzdGFyZjpcIuKYhVwiLHN0cmFpZ2h0ZXBzaWxvbjpcIs+1XCIsc3RyYWlnaHRwaGk6XCLPlVwiLHN0cm5zOlwiwq9cIixzdWI6XCLiioJcIixTdWI6XCLii5BcIixzdWJkb3Q6XCLiqr1cIixzdWJFOlwi4quFXCIsc3ViZTpcIuKKhlwiLHN1YmVkb3Q6XCLiq4NcIixzdWJtdWx0Olwi4quBXCIsc3VibkU6XCLiq4tcIixzdWJuZTpcIuKKilwiLHN1YnBsdXM6XCLiqr9cIixzdWJyYXJyOlwi4qW5XCIsc3Vic2V0Olwi4oqCXCIsU3Vic2V0Olwi4ouQXCIsc3Vic2V0ZXE6XCLiioZcIixzdWJzZXRlcXE6XCLiq4VcIixTdWJzZXRFcXVhbDpcIuKKhlwiLHN1YnNldG5lcTpcIuKKilwiLHN1YnNldG5lcXE6XCLiq4tcIixzdWJzaW06XCLiq4dcIixzdWJzdWI6XCLiq5VcIixzdWJzdXA6XCLiq5NcIixzdWNjYXBwcm94Olwi4qq4XCIsc3VjYzpcIuKJu1wiLHN1Y2NjdXJseWVxOlwi4om9XCIsU3VjY2VlZHM6XCLiibtcIixTdWNjZWVkc0VxdWFsOlwi4qqwXCIsU3VjY2VlZHNTbGFudEVxdWFsOlwi4om9XCIsU3VjY2VlZHNUaWxkZTpcIuKJv1wiLHN1Y2NlcTpcIuKqsFwiLHN1Y2NuYXBwcm94Olwi4qq6XCIsc3VjY25lcXE6XCLiqrZcIixzdWNjbnNpbTpcIuKLqVwiLHN1Y2NzaW06XCLiib9cIixTdWNoVGhhdDpcIuKIi1wiLHN1bTpcIuKIkVwiLFN1bTpcIuKIkVwiLHN1bmc6XCLimapcIixzdXAxOlwiwrlcIixzdXAyOlwiwrJcIixzdXAzOlwiwrNcIixzdXA6XCLiioNcIixTdXA6XCLii5FcIixzdXBkb3Q6XCLiqr5cIixzdXBkc3ViOlwi4quYXCIsc3VwRTpcIuKrhlwiLHN1cGU6XCLiiodcIixzdXBlZG90Olwi4quEXCIsU3VwZXJzZXQ6XCLiioNcIixTdXBlcnNldEVxdWFsOlwi4oqHXCIsc3VwaHNvbDpcIuKfiVwiLHN1cGhzdWI6XCLiq5dcIixzdXBsYXJyOlwi4qW7XCIsc3VwbXVsdDpcIuKrglwiLHN1cG5FOlwi4quMXCIsc3VwbmU6XCLiiotcIixzdXBwbHVzOlwi4quAXCIsc3Vwc2V0Olwi4oqDXCIsU3Vwc2V0Olwi4ouRXCIsc3Vwc2V0ZXE6XCLiiodcIixzdXBzZXRlcXE6XCLiq4ZcIixzdXBzZXRuZXE6XCLiiotcIixzdXBzZXRuZXFxOlwi4quMXCIsc3Vwc2ltOlwi4quIXCIsc3Vwc3ViOlwi4quUXCIsc3Vwc3VwOlwi4quWXCIsc3dhcmhrOlwi4qSmXCIsc3dhcnI6XCLihplcIixzd0FycjpcIuKHmVwiLHN3YXJyb3c6XCLihplcIixzd253YXI6XCLipKpcIixzemxpZzpcIsOfXCIsVGFiOlwiXFx0XCIsdGFyZ2V0Olwi4oyWXCIsVGF1OlwizqRcIix0YXU6XCLPhFwiLHRicms6XCLijrRcIixUY2Fyb246XCLFpFwiLHRjYXJvbjpcIsWlXCIsVGNlZGlsOlwixaJcIix0Y2VkaWw6XCLFo1wiLFRjeTpcItCiXCIsdGN5Olwi0YJcIix0ZG90Olwi4oObXCIsdGVscmVjOlwi4oyVXCIsVGZyOlwi8J2Ul1wiLHRmcjpcIvCdlLFcIix0aGVyZTQ6XCLiiLRcIix0aGVyZWZvcmU6XCLiiLRcIixUaGVyZWZvcmU6XCLiiLRcIixUaGV0YTpcIs6YXCIsdGhldGE6XCLOuFwiLHRoZXRhc3ltOlwiz5FcIix0aGV0YXY6XCLPkVwiLHRoaWNrYXBwcm94Olwi4omIXCIsdGhpY2tzaW06XCLiiLxcIixUaGlja1NwYWNlOlwi4oGf4oCKXCIsVGhpblNwYWNlOlwi4oCJXCIsdGhpbnNwOlwi4oCJXCIsdGhrYXA6XCLiiYhcIix0aGtzaW06XCLiiLxcIixUSE9STjpcIsOeXCIsdGhvcm46XCLDvlwiLHRpbGRlOlwiy5xcIixUaWxkZTpcIuKIvFwiLFRpbGRlRXF1YWw6XCLiiYNcIixUaWxkZUZ1bGxFcXVhbDpcIuKJhVwiLFRpbGRlVGlsZGU6XCLiiYhcIix0aW1lc2JhcjpcIuKosVwiLHRpbWVzYjpcIuKKoFwiLHRpbWVzOlwiw5dcIix0aW1lc2Q6XCLiqLBcIix0aW50Olwi4oitXCIsdG9lYTpcIuKkqFwiLHRvcGJvdDpcIuKMtlwiLHRvcGNpcjpcIuKrsVwiLHRvcDpcIuKKpFwiLFRvcGY6XCLwnZWLXCIsdG9wZjpcIvCdlaVcIix0b3Bmb3JrOlwi4quaXCIsdG9zYTpcIuKkqVwiLHRwcmltZTpcIuKAtFwiLHRyYWRlOlwi4oSiXCIsVFJBREU6XCLihKJcIix0cmlhbmdsZTpcIuKWtVwiLHRyaWFuZ2xlZG93bjpcIuKWv1wiLHRyaWFuZ2xlbGVmdDpcIuKXg1wiLHRyaWFuZ2xlbGVmdGVxOlwi4oq0XCIsdHJpYW5nbGVxOlwi4omcXCIsdHJpYW5nbGVyaWdodDpcIuKWuVwiLHRyaWFuZ2xlcmlnaHRlcTpcIuKKtVwiLHRyaWRvdDpcIuKXrFwiLHRyaWU6XCLiiZxcIix0cmltaW51czpcIuKoulwiLFRyaXBsZURvdDpcIuKDm1wiLHRyaXBsdXM6XCLiqLlcIix0cmlzYjpcIuKnjVwiLHRyaXRpbWU6XCLiqLtcIix0cnBleml1bTpcIuKPolwiLFRzY3I6XCLwnZKvXCIsdHNjcjpcIvCdk4lcIixUU2N5Olwi0KZcIix0c2N5Olwi0YZcIixUU0hjeTpcItCLXCIsdHNoY3k6XCLRm1wiLFRzdHJvazpcIsWmXCIsdHN0cm9rOlwixadcIix0d2l4dDpcIuKJrFwiLHR3b2hlYWRsZWZ0YXJyb3c6XCLihp5cIix0d29oZWFkcmlnaHRhcnJvdzpcIuKGoFwiLFVhY3V0ZTpcIsOaXCIsdWFjdXRlOlwiw7pcIix1YXJyOlwi4oaRXCIsVWFycjpcIuKGn1wiLHVBcnI6XCLih5FcIixVYXJyb2NpcjpcIuKliVwiLFVicmN5Olwi0I5cIix1YnJjeTpcItGeXCIsVWJyZXZlOlwixaxcIix1YnJldmU6XCLFrVwiLFVjaXJjOlwiw5tcIix1Y2lyYzpcIsO7XCIsVWN5Olwi0KNcIix1Y3k6XCLRg1wiLHVkYXJyOlwi4oeFXCIsVWRibGFjOlwixbBcIix1ZGJsYWM6XCLFsVwiLHVkaGFyOlwi4qWuXCIsdWZpc2h0Olwi4qW+XCIsVWZyOlwi8J2UmFwiLHVmcjpcIvCdlLJcIixVZ3JhdmU6XCLDmVwiLHVncmF2ZTpcIsO5XCIsdUhhcjpcIuKlo1wiLHVoYXJsOlwi4oa/XCIsdWhhcnI6XCLihr5cIix1aGJsazpcIuKWgFwiLHVsY29ybjpcIuKMnFwiLHVsY29ybmVyOlwi4oycXCIsdWxjcm9wOlwi4oyPXCIsdWx0cmk6XCLil7hcIixVbWFjcjpcIsWqXCIsdW1hY3I6XCLFq1wiLHVtbDpcIsKoXCIsVW5kZXJCYXI6XCJfXCIsVW5kZXJCcmFjZTpcIuKPn1wiLFVuZGVyQnJhY2tldDpcIuKOtVwiLFVuZGVyUGFyZW50aGVzaXM6XCLij51cIixVbmlvbjpcIuKLg1wiLFVuaW9uUGx1czpcIuKKjlwiLFVvZ29uOlwixbJcIix1b2dvbjpcIsWzXCIsVW9wZjpcIvCdlYxcIix1b3BmOlwi8J2VplwiLFVwQXJyb3dCYXI6XCLipJJcIix1cGFycm93Olwi4oaRXCIsVXBBcnJvdzpcIuKGkVwiLFVwYXJyb3c6XCLih5FcIixVcEFycm93RG93bkFycm93Olwi4oeFXCIsdXBkb3duYXJyb3c6XCLihpVcIixVcERvd25BcnJvdzpcIuKGlVwiLFVwZG93bmFycm93Olwi4oeVXCIsVXBFcXVpbGlicml1bTpcIuKlrlwiLHVwaGFycG9vbmxlZnQ6XCLihr9cIix1cGhhcnBvb25yaWdodDpcIuKGvlwiLHVwbHVzOlwi4oqOXCIsVXBwZXJMZWZ0QXJyb3c6XCLihpZcIixVcHBlclJpZ2h0QXJyb3c6XCLihpdcIix1cHNpOlwiz4VcIixVcHNpOlwiz5JcIix1cHNpaDpcIs+SXCIsVXBzaWxvbjpcIs6lXCIsdXBzaWxvbjpcIs+FXCIsVXBUZWVBcnJvdzpcIuKGpVwiLFVwVGVlOlwi4oqlXCIsdXB1cGFycm93czpcIuKHiFwiLHVyY29ybjpcIuKMnVwiLHVyY29ybmVyOlwi4oydXCIsdXJjcm9wOlwi4oyOXCIsVXJpbmc6XCLFrlwiLHVyaW5nOlwixa9cIix1cnRyaTpcIuKXuVwiLFVzY3I6XCLwnZKwXCIsdXNjcjpcIvCdk4pcIix1dGRvdDpcIuKLsFwiLFV0aWxkZTpcIsWoXCIsdXRpbGRlOlwixalcIix1dHJpOlwi4pa1XCIsdXRyaWY6XCLilrRcIix1dWFycjpcIuKHiFwiLFV1bWw6XCLDnFwiLHV1bWw6XCLDvFwiLHV3YW5nbGU6XCLipqdcIix2YW5ncnQ6XCLippxcIix2YXJlcHNpbG9uOlwiz7VcIix2YXJrYXBwYTpcIs+wXCIsdmFybm90aGluZzpcIuKIhVwiLHZhcnBoaTpcIs+VXCIsdmFycGk6XCLPllwiLHZhcnByb3B0bzpcIuKInVwiLHZhcnI6XCLihpVcIix2QXJyOlwi4oeVXCIsdmFycmhvOlwiz7FcIix2YXJzaWdtYTpcIs+CXCIsdmFyc3Vic2V0bmVxOlwi4oqK77iAXCIsdmFyc3Vic2V0bmVxcTpcIuKri++4gFwiLHZhcnN1cHNldG5lcTpcIuKKi++4gFwiLHZhcnN1cHNldG5lcXE6XCLiq4zvuIBcIix2YXJ0aGV0YTpcIs+RXCIsdmFydHJpYW5nbGVsZWZ0Olwi4oqyXCIsdmFydHJpYW5nbGVyaWdodDpcIuKKs1wiLHZCYXI6XCLiq6hcIixWYmFyOlwi4qurXCIsdkJhcnY6XCLiq6lcIixWY3k6XCLQklwiLHZjeTpcItCyXCIsdmRhc2g6XCLiiqJcIix2RGFzaDpcIuKKqFwiLFZkYXNoOlwi4oqpXCIsVkRhc2g6XCLiiqtcIixWZGFzaGw6XCLiq6ZcIix2ZWViYXI6XCLiirtcIix2ZWU6XCLiiKhcIixWZWU6XCLii4FcIix2ZWVlcTpcIuKJmlwiLHZlbGxpcDpcIuKLrlwiLHZlcmJhcjpcInxcIixWZXJiYXI6XCLigJZcIix2ZXJ0OlwifFwiLFZlcnQ6XCLigJZcIixWZXJ0aWNhbEJhcjpcIuKIo1wiLFZlcnRpY2FsTGluZTpcInxcIixWZXJ0aWNhbFNlcGFyYXRvcjpcIuKdmFwiLFZlcnRpY2FsVGlsZGU6XCLiiYBcIixWZXJ5VGhpblNwYWNlOlwi4oCKXCIsVmZyOlwi8J2UmVwiLHZmcjpcIvCdlLNcIix2bHRyaTpcIuKKslwiLHZuc3ViOlwi4oqC4oOSXCIsdm5zdXA6XCLiioPig5JcIixWb3BmOlwi8J2VjVwiLHZvcGY6XCLwnZWnXCIsdnByb3A6XCLiiJ1cIix2cnRyaTpcIuKKs1wiLFZzY3I6XCLwnZKxXCIsdnNjcjpcIvCdk4tcIix2c3VibkU6XCLiq4vvuIBcIix2c3VibmU6XCLiiorvuIBcIix2c3VwbkU6XCLiq4zvuIBcIix2c3VwbmU6XCLiiovvuIBcIixWdmRhc2g6XCLiiqpcIix2emlnemFnOlwi4qaaXCIsV2NpcmM6XCLFtFwiLHdjaXJjOlwixbVcIix3ZWRiYXI6XCLiqZ9cIix3ZWRnZTpcIuKIp1wiLFdlZGdlOlwi4ouAXCIsd2VkZ2VxOlwi4omZXCIsd2VpZXJwOlwi4oSYXCIsV2ZyOlwi8J2UmlwiLHdmcjpcIvCdlLRcIixXb3BmOlwi8J2VjlwiLHdvcGY6XCLwnZWoXCIsd3A6XCLihJhcIix3cjpcIuKJgFwiLHdyZWF0aDpcIuKJgFwiLFdzY3I6XCLwnZKyXCIsd3NjcjpcIvCdk4xcIix4Y2FwOlwi4ouCXCIseGNpcmM6XCLil69cIix4Y3VwOlwi4ouDXCIseGR0cmk6XCLilr1cIixYZnI6XCLwnZSbXCIseGZyOlwi8J2UtVwiLHhoYXJyOlwi4p+3XCIseGhBcnI6XCLin7pcIixYaTpcIs6eXCIseGk6XCLOvlwiLHhsYXJyOlwi4p+1XCIseGxBcnI6XCLin7hcIix4bWFwOlwi4p+8XCIseG5pczpcIuKLu1wiLHhvZG90Olwi4qiAXCIsWG9wZjpcIvCdlY9cIix4b3BmOlwi8J2VqVwiLHhvcGx1czpcIuKogVwiLHhvdGltZTpcIuKoglwiLHhyYXJyOlwi4p+2XCIseHJBcnI6XCLin7lcIixYc2NyOlwi8J2Ss1wiLHhzY3I6XCLwnZONXCIseHNxY3VwOlwi4qiGXCIseHVwbHVzOlwi4qiEXCIseHV0cmk6XCLilrNcIix4dmVlOlwi4ouBXCIseHdlZGdlOlwi4ouAXCIsWWFjdXRlOlwiw51cIix5YWN1dGU6XCLDvVwiLFlBY3k6XCLQr1wiLHlhY3k6XCLRj1wiLFljaXJjOlwixbZcIix5Y2lyYzpcIsW3XCIsWWN5Olwi0KtcIix5Y3k6XCLRi1wiLHllbjpcIsKlXCIsWWZyOlwi8J2UnFwiLHlmcjpcIvCdlLZcIixZSWN5Olwi0IdcIix5aWN5Olwi0ZdcIixZb3BmOlwi8J2VkFwiLHlvcGY6XCLwnZWqXCIsWXNjcjpcIvCdkrRcIix5c2NyOlwi8J2TjlwiLFlVY3k6XCLQrlwiLHl1Y3k6XCLRjlwiLHl1bWw6XCLDv1wiLFl1bWw6XCLFuFwiLFphY3V0ZTpcIsW5XCIsemFjdXRlOlwixbpcIixaY2Fyb246XCLFvVwiLHpjYXJvbjpcIsW+XCIsWmN5Olwi0JdcIix6Y3k6XCLQt1wiLFpkb3Q6XCLFu1wiLHpkb3Q6XCLFvFwiLHplZXRyZjpcIuKEqFwiLFplcm9XaWR0aFNwYWNlOlwi4oCLXCIsWmV0YTpcIs6WXCIsemV0YTpcIs62XCIsemZyOlwi8J2Ut1wiLFpmcjpcIuKEqFwiLFpIY3k6XCLQllwiLHpoY3k6XCLQtlwiLHppZ3JhcnI6XCLih51cIix6b3BmOlwi8J2Vq1wiLFpvcGY6XCLihKRcIixac2NyOlwi8J2StVwiLHpzY3I6XCLwnZOPXCIsendqOlwi4oCNXCIsenduajpcIuKAjFwifX0se31dLDI2OltmdW5jdGlvbihyZXF1aXJlLG1vZHVsZSxleHBvcnRzKXttb2R1bGUuZXhwb3J0cz17QWFjdXRlOlwiw4FcIixhYWN1dGU6XCLDoVwiLEFjaXJjOlwiw4JcIixhY2lyYzpcIsOiXCIsYWN1dGU6XCLCtFwiLEFFbGlnOlwiw4ZcIixhZWxpZzpcIsOmXCIsQWdyYXZlOlwiw4BcIixhZ3JhdmU6XCLDoFwiLGFtcDpcIiZcIixBTVA6XCImXCIsQXJpbmc6XCLDhVwiLGFyaW5nOlwiw6VcIixBdGlsZGU6XCLDg1wiLGF0aWxkZTpcIsOjXCIsQXVtbDpcIsOEXCIsYXVtbDpcIsOkXCIsYnJ2YmFyOlwiwqZcIixDY2VkaWw6XCLDh1wiLGNjZWRpbDpcIsOnXCIsY2VkaWw6XCLCuFwiLGNlbnQ6XCLColwiLGNvcHk6XCLCqVwiLENPUFk6XCLCqVwiLGN1cnJlbjpcIsKkXCIsZGVnOlwiwrBcIixkaXZpZGU6XCLDt1wiLEVhY3V0ZTpcIsOJXCIsZWFjdXRlOlwiw6lcIixFY2lyYzpcIsOKXCIsZWNpcmM6XCLDqlwiLEVncmF2ZTpcIsOIXCIsZWdyYXZlOlwiw6hcIixFVEg6XCLDkFwiLGV0aDpcIsOwXCIsRXVtbDpcIsOLXCIsZXVtbDpcIsOrXCIsZnJhYzEyOlwiwr1cIixmcmFjMTQ6XCLCvFwiLGZyYWMzNDpcIsK+XCIsZ3Q6XCI+XCIsR1Q6XCI+XCIsSWFjdXRlOlwiw41cIixpYWN1dGU6XCLDrVwiLEljaXJjOlwiw45cIixpY2lyYzpcIsOuXCIsaWV4Y2w6XCLCoVwiLElncmF2ZTpcIsOMXCIsaWdyYXZlOlwiw6xcIixpcXVlc3Q6XCLCv1wiLEl1bWw6XCLDj1wiLGl1bWw6XCLDr1wiLGxhcXVvOlwiwqtcIixsdDpcIjxcIixMVDpcIjxcIixtYWNyOlwiwq9cIixtaWNybzpcIsK1XCIsbWlkZG90OlwiwrdcIixuYnNwOlwiwqBcIixub3Q6XCLCrFwiLE50aWxkZTpcIsORXCIsbnRpbGRlOlwiw7FcIixPYWN1dGU6XCLDk1wiLG9hY3V0ZTpcIsOzXCIsT2NpcmM6XCLDlFwiLG9jaXJjOlwiw7RcIixPZ3JhdmU6XCLDklwiLG9ncmF2ZTpcIsOyXCIsb3JkZjpcIsKqXCIsb3JkbTpcIsK6XCIsT3NsYXNoOlwiw5hcIixvc2xhc2g6XCLDuFwiLE90aWxkZTpcIsOVXCIsb3RpbGRlOlwiw7VcIixPdW1sOlwiw5ZcIixvdW1sOlwiw7ZcIixwYXJhOlwiwrZcIixwbHVzbW46XCLCsVwiLHBvdW5kOlwiwqNcIixxdW90OidcIicsUVVPVDonXCInLHJhcXVvOlwiwrtcIixyZWc6XCLCrlwiLFJFRzpcIsKuXCIsc2VjdDpcIsKnXCIsc2h5Olwiwq1cIixzdXAxOlwiwrlcIixzdXAyOlwiwrJcIixzdXAzOlwiwrNcIixzemxpZzpcIsOfXCIsVEhPUk46XCLDnlwiLHRob3JuOlwiw75cIix0aW1lczpcIsOXXCIsVWFjdXRlOlwiw5pcIix1YWN1dGU6XCLDulwiLFVjaXJjOlwiw5tcIix1Y2lyYzpcIsO7XCIsVWdyYXZlOlwiw5lcIix1Z3JhdmU6XCLDuVwiLHVtbDpcIsKoXCIsVXVtbDpcIsOcXCIsdXVtbDpcIsO8XCIsWWFjdXRlOlwiw51cIix5YWN1dGU6XCLDvVwiLHllbjpcIsKlXCIseXVtbDpcIsO/XCJ9fSx7fV0sMjc6W2Z1bmN0aW9uKHJlcXVpcmUsbW9kdWxlLGV4cG9ydHMpe21vZHVsZS5leHBvcnRzPXthbXA6XCImXCIsYXBvczpcIidcIixndDpcIj5cIixsdDpcIjxcIixxdW90OidcIid9fSx7fV0sMjg6W2Z1bmN0aW9uKHJlcXVpcmUsbW9kdWxlLGV4cG9ydHMpe2Z1bmN0aW9uIEV2ZW50RW1pdHRlcigpe3RoaXMuX2V2ZW50cz10aGlzLl9ldmVudHN8fHt9O3RoaXMuX21heExpc3RlbmVycz10aGlzLl9tYXhMaXN0ZW5lcnN8fHVuZGVmaW5lZH1tb2R1bGUuZXhwb3J0cz1FdmVudEVtaXR0ZXI7RXZlbnRFbWl0dGVyLkV2ZW50RW1pdHRlcj1FdmVudEVtaXR0ZXI7RXZlbnRFbWl0dGVyLnByb3RvdHlwZS5fZXZlbnRzPXVuZGVmaW5lZDtFdmVudEVtaXR0ZXIucHJvdG90eXBlLl9tYXhMaXN0ZW5lcnM9dW5kZWZpbmVkO0V2ZW50RW1pdHRlci5kZWZhdWx0TWF4TGlzdGVuZXJzPTEwO0V2ZW50RW1pdHRlci5wcm90b3R5cGUuc2V0TWF4TGlzdGVuZXJzPWZ1bmN0aW9uKG4pe2lmKCFpc051bWJlcihuKXx8bjwwfHxpc05hTihuKSl0aHJvdyBUeXBlRXJyb3IoXCJuIG11c3QgYmUgYSBwb3NpdGl2ZSBudW1iZXJcIik7dGhpcy5fbWF4TGlzdGVuZXJzPW47cmV0dXJuIHRoaXN9O0V2ZW50RW1pdHRlci5wcm90b3R5cGUuZW1pdD1mdW5jdGlvbih0eXBlKXt2YXIgZXIsaGFuZGxlcixsZW4sYXJncyxpLGxpc3RlbmVycztpZighdGhpcy5fZXZlbnRzKXRoaXMuX2V2ZW50cz17fTtpZih0eXBlPT09XCJlcnJvclwiKXtpZighdGhpcy5fZXZlbnRzLmVycm9yfHxpc09iamVjdCh0aGlzLl9ldmVudHMuZXJyb3IpJiYhdGhpcy5fZXZlbnRzLmVycm9yLmxlbmd0aCl7ZXI9YXJndW1lbnRzWzFdO2lmKGVyIGluc3RhbmNlb2YgRXJyb3Ipe3Rocm93IGVyfWVsc2V7dmFyIGVycj1uZXcgRXJyb3IoJ1VuY2F1Z2h0LCB1bnNwZWNpZmllZCBcImVycm9yXCIgZXZlbnQuICgnK2VyK1wiKVwiKTtlcnIuY29udGV4dD1lcjt0aHJvdyBlcnJ9fX1oYW5kbGVyPXRoaXMuX2V2ZW50c1t0eXBlXTtpZihpc1VuZGVmaW5lZChoYW5kbGVyKSlyZXR1cm4gZmFsc2U7aWYoaXNGdW5jdGlvbihoYW5kbGVyKSl7c3dpdGNoKGFyZ3VtZW50cy5sZW5ndGgpe2Nhc2UgMTpoYW5kbGVyLmNhbGwodGhpcyk7YnJlYWs7Y2FzZSAyOmhhbmRsZXIuY2FsbCh0aGlzLGFyZ3VtZW50c1sxXSk7YnJlYWs7Y2FzZSAzOmhhbmRsZXIuY2FsbCh0aGlzLGFyZ3VtZW50c1sxXSxhcmd1bWVudHNbMl0pO2JyZWFrO2RlZmF1bHQ6YXJncz1BcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChhcmd1bWVudHMsMSk7aGFuZGxlci5hcHBseSh0aGlzLGFyZ3MpfX1lbHNlIGlmKGlzT2JqZWN0KGhhbmRsZXIpKXthcmdzPUFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKGFyZ3VtZW50cywxKTtsaXN0ZW5lcnM9aGFuZGxlci5zbGljZSgpO2xlbj1saXN0ZW5lcnMubGVuZ3RoO2ZvcihpPTA7aTxsZW47aSsrKWxpc3RlbmVyc1tpXS5hcHBseSh0aGlzLGFyZ3MpfXJldHVybiB0cnVlfTtFdmVudEVtaXR0ZXIucHJvdG90eXBlLmFkZExpc3RlbmVyPWZ1bmN0aW9uKHR5cGUsbGlzdGVuZXIpe3ZhciBtO2lmKCFpc0Z1bmN0aW9uKGxpc3RlbmVyKSl0aHJvdyBUeXBlRXJyb3IoXCJsaXN0ZW5lciBtdXN0IGJlIGEgZnVuY3Rpb25cIik7aWYoIXRoaXMuX2V2ZW50cyl0aGlzLl9ldmVudHM9e307aWYodGhpcy5fZXZlbnRzLm5ld0xpc3RlbmVyKXRoaXMuZW1pdChcIm5ld0xpc3RlbmVyXCIsdHlwZSxpc0Z1bmN0aW9uKGxpc3RlbmVyLmxpc3RlbmVyKT9saXN0ZW5lci5saXN0ZW5lcjpsaXN0ZW5lcik7aWYoIXRoaXMuX2V2ZW50c1t0eXBlXSl0aGlzLl9ldmVudHNbdHlwZV09bGlzdGVuZXI7ZWxzZSBpZihpc09iamVjdCh0aGlzLl9ldmVudHNbdHlwZV0pKXRoaXMuX2V2ZW50c1t0eXBlXS5wdXNoKGxpc3RlbmVyKTtlbHNlIHRoaXMuX2V2ZW50c1t0eXBlXT1bdGhpcy5fZXZlbnRzW3R5cGVdLGxpc3RlbmVyXTtpZihpc09iamVjdCh0aGlzLl9ldmVudHNbdHlwZV0pJiYhdGhpcy5fZXZlbnRzW3R5cGVdLndhcm5lZCl7aWYoIWlzVW5kZWZpbmVkKHRoaXMuX21heExpc3RlbmVycykpe209dGhpcy5fbWF4TGlzdGVuZXJzfWVsc2V7bT1FdmVudEVtaXR0ZXIuZGVmYXVsdE1heExpc3RlbmVyc31pZihtJiZtPjAmJnRoaXMuX2V2ZW50c1t0eXBlXS5sZW5ndGg+bSl7dGhpcy5fZXZlbnRzW3R5cGVdLndhcm5lZD10cnVlO2NvbnNvbGUuZXJyb3IoXCIobm9kZSkgd2FybmluZzogcG9zc2libGUgRXZlbnRFbWl0dGVyIG1lbW9yeSBcIitcImxlYWsgZGV0ZWN0ZWQuICVkIGxpc3RlbmVycyBhZGRlZC4gXCIrXCJVc2UgZW1pdHRlci5zZXRNYXhMaXN0ZW5lcnMoKSB0byBpbmNyZWFzZSBsaW1pdC5cIix0aGlzLl9ldmVudHNbdHlwZV0ubGVuZ3RoKTtpZih0eXBlb2YgY29uc29sZS50cmFjZT09PVwiZnVuY3Rpb25cIil7Y29uc29sZS50cmFjZSgpfX19cmV0dXJuIHRoaXN9O0V2ZW50RW1pdHRlci5wcm90b3R5cGUub249RXZlbnRFbWl0dGVyLnByb3RvdHlwZS5hZGRMaXN0ZW5lcjtFdmVudEVtaXR0ZXIucHJvdG90eXBlLm9uY2U9ZnVuY3Rpb24odHlwZSxsaXN0ZW5lcil7aWYoIWlzRnVuY3Rpb24obGlzdGVuZXIpKXRocm93IFR5cGVFcnJvcihcImxpc3RlbmVyIG11c3QgYmUgYSBmdW5jdGlvblwiKTt2YXIgZmlyZWQ9ZmFsc2U7ZnVuY3Rpb24gZygpe3RoaXMucmVtb3ZlTGlzdGVuZXIodHlwZSxnKTtpZighZmlyZWQpe2ZpcmVkPXRydWU7bGlzdGVuZXIuYXBwbHkodGhpcyxhcmd1bWVudHMpfX1nLmxpc3RlbmVyPWxpc3RlbmVyO3RoaXMub24odHlwZSxnKTtyZXR1cm4gdGhpc307RXZlbnRFbWl0dGVyLnByb3RvdHlwZS5yZW1vdmVMaXN0ZW5lcj1mdW5jdGlvbih0eXBlLGxpc3RlbmVyKXt2YXIgbGlzdCxwb3NpdGlvbixsZW5ndGgsaTtpZighaXNGdW5jdGlvbihsaXN0ZW5lcikpdGhyb3cgVHlwZUVycm9yKFwibGlzdGVuZXIgbXVzdCBiZSBhIGZ1bmN0aW9uXCIpO2lmKCF0aGlzLl9ldmVudHN8fCF0aGlzLl9ldmVudHNbdHlwZV0pcmV0dXJuIHRoaXM7bGlzdD10aGlzLl9ldmVudHNbdHlwZV07bGVuZ3RoPWxpc3QubGVuZ3RoO3Bvc2l0aW9uPS0xO2lmKGxpc3Q9PT1saXN0ZW5lcnx8aXNGdW5jdGlvbihsaXN0Lmxpc3RlbmVyKSYmbGlzdC5saXN0ZW5lcj09PWxpc3RlbmVyKXtkZWxldGUgdGhpcy5fZXZlbnRzW3R5cGVdO2lmKHRoaXMuX2V2ZW50cy5yZW1vdmVMaXN0ZW5lcil0aGlzLmVtaXQoXCJyZW1vdmVMaXN0ZW5lclwiLHR5cGUsbGlzdGVuZXIpfWVsc2UgaWYoaXNPYmplY3QobGlzdCkpe2ZvcihpPWxlbmd0aDtpLS0gPjA7KXtpZihsaXN0W2ldPT09bGlzdGVuZXJ8fGxpc3RbaV0ubGlzdGVuZXImJmxpc3RbaV0ubGlzdGVuZXI9PT1saXN0ZW5lcil7cG9zaXRpb249aTticmVha319aWYocG9zaXRpb248MClyZXR1cm4gdGhpcztpZihsaXN0Lmxlbmd0aD09PTEpe2xpc3QubGVuZ3RoPTA7ZGVsZXRlIHRoaXMuX2V2ZW50c1t0eXBlXX1lbHNle2xpc3Quc3BsaWNlKHBvc2l0aW9uLDEpO1xufWlmKHRoaXMuX2V2ZW50cy5yZW1vdmVMaXN0ZW5lcil0aGlzLmVtaXQoXCJyZW1vdmVMaXN0ZW5lclwiLHR5cGUsbGlzdGVuZXIpfXJldHVybiB0aGlzfTtFdmVudEVtaXR0ZXIucHJvdG90eXBlLnJlbW92ZUFsbExpc3RlbmVycz1mdW5jdGlvbih0eXBlKXt2YXIga2V5LGxpc3RlbmVycztpZighdGhpcy5fZXZlbnRzKXJldHVybiB0aGlzO2lmKCF0aGlzLl9ldmVudHMucmVtb3ZlTGlzdGVuZXIpe2lmKGFyZ3VtZW50cy5sZW5ndGg9PT0wKXRoaXMuX2V2ZW50cz17fTtlbHNlIGlmKHRoaXMuX2V2ZW50c1t0eXBlXSlkZWxldGUgdGhpcy5fZXZlbnRzW3R5cGVdO3JldHVybiB0aGlzfWlmKGFyZ3VtZW50cy5sZW5ndGg9PT0wKXtmb3Ioa2V5IGluIHRoaXMuX2V2ZW50cyl7aWYoa2V5PT09XCJyZW1vdmVMaXN0ZW5lclwiKWNvbnRpbnVlO3RoaXMucmVtb3ZlQWxsTGlzdGVuZXJzKGtleSl9dGhpcy5yZW1vdmVBbGxMaXN0ZW5lcnMoXCJyZW1vdmVMaXN0ZW5lclwiKTt0aGlzLl9ldmVudHM9e307cmV0dXJuIHRoaXN9bGlzdGVuZXJzPXRoaXMuX2V2ZW50c1t0eXBlXTtpZihpc0Z1bmN0aW9uKGxpc3RlbmVycykpe3RoaXMucmVtb3ZlTGlzdGVuZXIodHlwZSxsaXN0ZW5lcnMpfWVsc2UgaWYobGlzdGVuZXJzKXt3aGlsZShsaXN0ZW5lcnMubGVuZ3RoKXRoaXMucmVtb3ZlTGlzdGVuZXIodHlwZSxsaXN0ZW5lcnNbbGlzdGVuZXJzLmxlbmd0aC0xXSl9ZGVsZXRlIHRoaXMuX2V2ZW50c1t0eXBlXTtyZXR1cm4gdGhpc307RXZlbnRFbWl0dGVyLnByb3RvdHlwZS5saXN0ZW5lcnM9ZnVuY3Rpb24odHlwZSl7dmFyIHJldDtpZighdGhpcy5fZXZlbnRzfHwhdGhpcy5fZXZlbnRzW3R5cGVdKXJldD1bXTtlbHNlIGlmKGlzRnVuY3Rpb24odGhpcy5fZXZlbnRzW3R5cGVdKSlyZXQ9W3RoaXMuX2V2ZW50c1t0eXBlXV07ZWxzZSByZXQ9dGhpcy5fZXZlbnRzW3R5cGVdLnNsaWNlKCk7cmV0dXJuIHJldH07RXZlbnRFbWl0dGVyLnByb3RvdHlwZS5saXN0ZW5lckNvdW50PWZ1bmN0aW9uKHR5cGUpe2lmKHRoaXMuX2V2ZW50cyl7dmFyIGV2bGlzdGVuZXI9dGhpcy5fZXZlbnRzW3R5cGVdO2lmKGlzRnVuY3Rpb24oZXZsaXN0ZW5lcikpcmV0dXJuIDE7ZWxzZSBpZihldmxpc3RlbmVyKXJldHVybiBldmxpc3RlbmVyLmxlbmd0aH1yZXR1cm4gMH07RXZlbnRFbWl0dGVyLmxpc3RlbmVyQ291bnQ9ZnVuY3Rpb24oZW1pdHRlcix0eXBlKXtyZXR1cm4gZW1pdHRlci5saXN0ZW5lckNvdW50KHR5cGUpfTtmdW5jdGlvbiBpc0Z1bmN0aW9uKGFyZyl7cmV0dXJuIHR5cGVvZiBhcmc9PT1cImZ1bmN0aW9uXCJ9ZnVuY3Rpb24gaXNOdW1iZXIoYXJnKXtyZXR1cm4gdHlwZW9mIGFyZz09PVwibnVtYmVyXCJ9ZnVuY3Rpb24gaXNPYmplY3QoYXJnKXtyZXR1cm4gdHlwZW9mIGFyZz09PVwib2JqZWN0XCImJmFyZyE9PW51bGx9ZnVuY3Rpb24gaXNVbmRlZmluZWQoYXJnKXtyZXR1cm4gYXJnPT09dm9pZCAwfX0se31dLDI5OltmdW5jdGlvbihyZXF1aXJlLG1vZHVsZSxleHBvcnRzKXttb2R1bGUuZXhwb3J0cz1Db2xsZWN0aW5nSGFuZGxlcjtmdW5jdGlvbiBDb2xsZWN0aW5nSGFuZGxlcihjYnMpe3RoaXMuX2Nicz1jYnN8fHt9O3RoaXMuZXZlbnRzPVtdfXZhciBFVkVOVFM9cmVxdWlyZShcIi4vXCIpLkVWRU5UUztPYmplY3Qua2V5cyhFVkVOVFMpLmZvckVhY2goZnVuY3Rpb24obmFtZSl7aWYoRVZFTlRTW25hbWVdPT09MCl7bmFtZT1cIm9uXCIrbmFtZTtDb2xsZWN0aW5nSGFuZGxlci5wcm90b3R5cGVbbmFtZV09ZnVuY3Rpb24oKXt0aGlzLmV2ZW50cy5wdXNoKFtuYW1lXSk7aWYodGhpcy5fY2JzW25hbWVdKXRoaXMuX2Nic1tuYW1lXSgpfX1lbHNlIGlmKEVWRU5UU1tuYW1lXT09PTEpe25hbWU9XCJvblwiK25hbWU7Q29sbGVjdGluZ0hhbmRsZXIucHJvdG90eXBlW25hbWVdPWZ1bmN0aW9uKGEpe3RoaXMuZXZlbnRzLnB1c2goW25hbWUsYV0pO2lmKHRoaXMuX2Nic1tuYW1lXSl0aGlzLl9jYnNbbmFtZV0oYSl9fWVsc2UgaWYoRVZFTlRTW25hbWVdPT09Mil7bmFtZT1cIm9uXCIrbmFtZTtDb2xsZWN0aW5nSGFuZGxlci5wcm90b3R5cGVbbmFtZV09ZnVuY3Rpb24oYSxiKXt0aGlzLmV2ZW50cy5wdXNoKFtuYW1lLGEsYl0pO2lmKHRoaXMuX2Nic1tuYW1lXSl0aGlzLl9jYnNbbmFtZV0oYSxiKX19ZWxzZXt0aHJvdyBFcnJvcihcIndyb25nIG51bWJlciBvZiBhcmd1bWVudHNcIil9fSk7Q29sbGVjdGluZ0hhbmRsZXIucHJvdG90eXBlLm9ucmVzZXQ9ZnVuY3Rpb24oKXt0aGlzLmV2ZW50cz1bXTtpZih0aGlzLl9jYnMub25yZXNldCl0aGlzLl9jYnMub25yZXNldCgpfTtDb2xsZWN0aW5nSGFuZGxlci5wcm90b3R5cGUucmVzdGFydD1mdW5jdGlvbigpe2lmKHRoaXMuX2Nicy5vbnJlc2V0KXRoaXMuX2Nicy5vbnJlc2V0KCk7Zm9yKHZhciBpPTAsbGVuPXRoaXMuZXZlbnRzLmxlbmd0aDtpPGxlbjtpKyspe2lmKHRoaXMuX2Nic1t0aGlzLmV2ZW50c1tpXVswXV0pe3ZhciBudW09dGhpcy5ldmVudHNbaV0ubGVuZ3RoO2lmKG51bT09PTEpe3RoaXMuX2Nic1t0aGlzLmV2ZW50c1tpXVswXV0oKX1lbHNlIGlmKG51bT09PTIpe3RoaXMuX2Nic1t0aGlzLmV2ZW50c1tpXVswXV0odGhpcy5ldmVudHNbaV1bMV0pfWVsc2V7dGhpcy5fY2JzW3RoaXMuZXZlbnRzW2ldWzBdXSh0aGlzLmV2ZW50c1tpXVsxXSx0aGlzLmV2ZW50c1tpXVsyXSl9fX19fSx7XCIuL1wiOjM2fV0sMzA6W2Z1bmN0aW9uKHJlcXVpcmUsbW9kdWxlLGV4cG9ydHMpe3ZhciBpbmRleD1yZXF1aXJlKFwiLi9pbmRleC5qc1wiKSxEb21IYW5kbGVyPWluZGV4LkRvbUhhbmRsZXIsRG9tVXRpbHM9aW5kZXguRG9tVXRpbHM7ZnVuY3Rpb24gRmVlZEhhbmRsZXIoY2FsbGJhY2ssb3B0aW9ucyl7dGhpcy5pbml0KGNhbGxiYWNrLG9wdGlvbnMpfXJlcXVpcmUoXCJpbmhlcml0c1wiKShGZWVkSGFuZGxlcixEb21IYW5kbGVyKTtGZWVkSGFuZGxlci5wcm90b3R5cGUuaW5pdD1Eb21IYW5kbGVyO2Z1bmN0aW9uIGdldEVsZW1lbnRzKHdoYXQsd2hlcmUpe3JldHVybiBEb21VdGlscy5nZXRFbGVtZW50c0J5VGFnTmFtZSh3aGF0LHdoZXJlLHRydWUpfWZ1bmN0aW9uIGdldE9uZUVsZW1lbnQod2hhdCx3aGVyZSl7cmV0dXJuIERvbVV0aWxzLmdldEVsZW1lbnRzQnlUYWdOYW1lKHdoYXQsd2hlcmUsdHJ1ZSwxKVswXX1mdW5jdGlvbiBmZXRjaCh3aGF0LHdoZXJlLHJlY3Vyc2Upe3JldHVybiBEb21VdGlscy5nZXRUZXh0KERvbVV0aWxzLmdldEVsZW1lbnRzQnlUYWdOYW1lKHdoYXQsd2hlcmUscmVjdXJzZSwxKSkudHJpbSgpfWZ1bmN0aW9uIGFkZENvbmRpdGlvbmFsbHkob2JqLHByb3Asd2hhdCx3aGVyZSxyZWN1cnNlKXt2YXIgdG1wPWZldGNoKHdoYXQsd2hlcmUscmVjdXJzZSk7aWYodG1wKW9ialtwcm9wXT10bXB9dmFyIGlzVmFsaWRGZWVkPWZ1bmN0aW9uKHZhbHVlKXtyZXR1cm4gdmFsdWU9PT1cInJzc1wifHx2YWx1ZT09PVwiZmVlZFwifHx2YWx1ZT09PVwicmRmOlJERlwifTtGZWVkSGFuZGxlci5wcm90b3R5cGUub25lbmQ9ZnVuY3Rpb24oKXt2YXIgZmVlZD17fSxmZWVkUm9vdD1nZXRPbmVFbGVtZW50KGlzVmFsaWRGZWVkLHRoaXMuZG9tKSx0bXAsY2hpbGRzO2lmKGZlZWRSb290KXtpZihmZWVkUm9vdC5uYW1lPT09XCJmZWVkXCIpe2NoaWxkcz1mZWVkUm9vdC5jaGlsZHJlbjtmZWVkLnR5cGU9XCJhdG9tXCI7YWRkQ29uZGl0aW9uYWxseShmZWVkLFwiaWRcIixcImlkXCIsY2hpbGRzKTthZGRDb25kaXRpb25hbGx5KGZlZWQsXCJ0aXRsZVwiLFwidGl0bGVcIixjaGlsZHMpO2lmKCh0bXA9Z2V0T25lRWxlbWVudChcImxpbmtcIixjaGlsZHMpKSYmKHRtcD10bXAuYXR0cmlicykmJih0bXA9dG1wLmhyZWYpKWZlZWQubGluaz10bXA7YWRkQ29uZGl0aW9uYWxseShmZWVkLFwiZGVzY3JpcHRpb25cIixcInN1YnRpdGxlXCIsY2hpbGRzKTtpZih0bXA9ZmV0Y2goXCJ1cGRhdGVkXCIsY2hpbGRzKSlmZWVkLnVwZGF0ZWQ9bmV3IERhdGUodG1wKTthZGRDb25kaXRpb25hbGx5KGZlZWQsXCJhdXRob3JcIixcImVtYWlsXCIsY2hpbGRzLHRydWUpO2ZlZWQuaXRlbXM9Z2V0RWxlbWVudHMoXCJlbnRyeVwiLGNoaWxkcykubWFwKGZ1bmN0aW9uKGl0ZW0pe3ZhciBlbnRyeT17fSx0bXA7aXRlbT1pdGVtLmNoaWxkcmVuO2FkZENvbmRpdGlvbmFsbHkoZW50cnksXCJpZFwiLFwiaWRcIixpdGVtKTthZGRDb25kaXRpb25hbGx5KGVudHJ5LFwidGl0bGVcIixcInRpdGxlXCIsaXRlbSk7aWYoKHRtcD1nZXRPbmVFbGVtZW50KFwibGlua1wiLGl0ZW0pKSYmKHRtcD10bXAuYXR0cmlicykmJih0bXA9dG1wLmhyZWYpKWVudHJ5Lmxpbms9dG1wO2lmKHRtcD1mZXRjaChcInN1bW1hcnlcIixpdGVtKXx8ZmV0Y2goXCJjb250ZW50XCIsaXRlbSkpZW50cnkuZGVzY3JpcHRpb249dG1wO2lmKHRtcD1mZXRjaChcInVwZGF0ZWRcIixpdGVtKSllbnRyeS5wdWJEYXRlPW5ldyBEYXRlKHRtcCk7cmV0dXJuIGVudHJ5fSl9ZWxzZXtjaGlsZHM9Z2V0T25lRWxlbWVudChcImNoYW5uZWxcIixmZWVkUm9vdC5jaGlsZHJlbikuY2hpbGRyZW47ZmVlZC50eXBlPWZlZWRSb290Lm5hbWUuc3Vic3RyKDAsMyk7ZmVlZC5pZD1cIlwiO2FkZENvbmRpdGlvbmFsbHkoZmVlZCxcInRpdGxlXCIsXCJ0aXRsZVwiLGNoaWxkcyk7YWRkQ29uZGl0aW9uYWxseShmZWVkLFwibGlua1wiLFwibGlua1wiLGNoaWxkcyk7YWRkQ29uZGl0aW9uYWxseShmZWVkLFwiZGVzY3JpcHRpb25cIixcImRlc2NyaXB0aW9uXCIsY2hpbGRzKTtpZih0bXA9ZmV0Y2goXCJsYXN0QnVpbGREYXRlXCIsY2hpbGRzKSlmZWVkLnVwZGF0ZWQ9bmV3IERhdGUodG1wKTthZGRDb25kaXRpb25hbGx5KGZlZWQsXCJhdXRob3JcIixcIm1hbmFnaW5nRWRpdG9yXCIsY2hpbGRzLHRydWUpO2ZlZWQuaXRlbXM9Z2V0RWxlbWVudHMoXCJpdGVtXCIsZmVlZFJvb3QuY2hpbGRyZW4pLm1hcChmdW5jdGlvbihpdGVtKXt2YXIgZW50cnk9e30sdG1wO2l0ZW09aXRlbS5jaGlsZHJlbjthZGRDb25kaXRpb25hbGx5KGVudHJ5LFwiaWRcIixcImd1aWRcIixpdGVtKTthZGRDb25kaXRpb25hbGx5KGVudHJ5LFwidGl0bGVcIixcInRpdGxlXCIsaXRlbSk7YWRkQ29uZGl0aW9uYWxseShlbnRyeSxcImxpbmtcIixcImxpbmtcIixpdGVtKTthZGRDb25kaXRpb25hbGx5KGVudHJ5LFwiZGVzY3JpcHRpb25cIixcImRlc2NyaXB0aW9uXCIsaXRlbSk7aWYodG1wPWZldGNoKFwicHViRGF0ZVwiLGl0ZW0pKWVudHJ5LnB1YkRhdGU9bmV3IERhdGUodG1wKTtyZXR1cm4gZW50cnl9KX19dGhpcy5kb209ZmVlZDtEb21IYW5kbGVyLnByb3RvdHlwZS5faGFuZGxlQ2FsbGJhY2suY2FsbCh0aGlzLGZlZWRSb290P251bGw6RXJyb3IoXCJjb3VsZG4ndCBmaW5kIHJvb3Qgb2YgZmVlZFwiKSl9O21vZHVsZS5leHBvcnRzPUZlZWRIYW5kbGVyfSx7XCIuL2luZGV4LmpzXCI6MzYsaW5oZXJpdHM6Mzh9XSwzMTpbZnVuY3Rpb24ocmVxdWlyZSxtb2R1bGUsZXhwb3J0cyl7dmFyIFRva2VuaXplcj1yZXF1aXJlKFwiLi9Ub2tlbml6ZXIuanNcIik7dmFyIGZvcm1UYWdzPXtpbnB1dDp0cnVlLG9wdGlvbjp0cnVlLG9wdGdyb3VwOnRydWUsc2VsZWN0OnRydWUsYnV0dG9uOnRydWUsZGF0YWxpc3Q6dHJ1ZSx0ZXh0YXJlYTp0cnVlfTt2YXIgb3BlbkltcGxpZXNDbG9zZT17dHI6e3RyOnRydWUsdGg6dHJ1ZSx0ZDp0cnVlfSx0aDp7dGg6dHJ1ZX0sdGQ6e3RoZWFkOnRydWUsdGg6dHJ1ZSx0ZDp0cnVlfSxib2R5OntoZWFkOnRydWUsbGluazp0cnVlLHNjcmlwdDp0cnVlfSxsaTp7bGk6dHJ1ZX0scDp7cDp0cnVlfSxoMTp7cDp0cnVlfSxoMjp7cDp0cnVlfSxoMzp7cDp0cnVlfSxoNDp7cDp0cnVlfSxoNTp7cDp0cnVlfSxoNjp7cDp0cnVlfSxzZWxlY3Q6Zm9ybVRhZ3MsaW5wdXQ6Zm9ybVRhZ3Msb3V0cHV0OmZvcm1UYWdzLGJ1dHRvbjpmb3JtVGFncyxkYXRhbGlzdDpmb3JtVGFncyx0ZXh0YXJlYTpmb3JtVGFncyxvcHRpb246e29wdGlvbjp0cnVlfSxvcHRncm91cDp7b3B0Z3JvdXA6dHJ1ZX19O3ZhciB2b2lkRWxlbWVudHM9e19fcHJvdG9fXzpudWxsLGFyZWE6dHJ1ZSxiYXNlOnRydWUsYmFzZWZvbnQ6dHJ1ZSxicjp0cnVlLGNvbDp0cnVlLGNvbW1hbmQ6dHJ1ZSxlbWJlZDp0cnVlLGZyYW1lOnRydWUsaHI6dHJ1ZSxpbWc6dHJ1ZSxpbnB1dDp0cnVlLGlzaW5kZXg6dHJ1ZSxrZXlnZW46dHJ1ZSxsaW5rOnRydWUsbWV0YTp0cnVlLHBhcmFtOnRydWUsc291cmNlOnRydWUsdHJhY2s6dHJ1ZSx3YnI6dHJ1ZSxwYXRoOnRydWUsY2lyY2xlOnRydWUsZWxsaXBzZTp0cnVlLGxpbmU6dHJ1ZSxyZWN0OnRydWUsdXNlOnRydWUsc3RvcDp0cnVlLHBvbHlsaW5lOnRydWUscG9seWdvbjp0cnVlfTt2YXIgcmVfbmFtZUVuZD0vXFxzfFxcLy87ZnVuY3Rpb24gUGFyc2VyKGNicyxvcHRpb25zKXt0aGlzLl9vcHRpb25zPW9wdGlvbnN8fHt9O3RoaXMuX2Nicz1jYnN8fHt9O3RoaXMuX3RhZ25hbWU9XCJcIjt0aGlzLl9hdHRyaWJuYW1lPVwiXCI7dGhpcy5fYXR0cmlidmFsdWU9XCJcIjt0aGlzLl9hdHRyaWJzPW51bGw7dGhpcy5fc3RhY2s9W107dGhpcy5zdGFydEluZGV4PTA7dGhpcy5lbmRJbmRleD1udWxsO3RoaXMuX2xvd2VyQ2FzZVRhZ05hbWVzPVwibG93ZXJDYXNlVGFnc1wiaW4gdGhpcy5fb3B0aW9ucz8hIXRoaXMuX29wdGlvbnMubG93ZXJDYXNlVGFnczohdGhpcy5fb3B0aW9ucy54bWxNb2RlO3RoaXMuX2xvd2VyQ2FzZUF0dHJpYnV0ZU5hbWVzPVwibG93ZXJDYXNlQXR0cmlidXRlTmFtZXNcImluIHRoaXMuX29wdGlvbnM/ISF0aGlzLl9vcHRpb25zLmxvd2VyQ2FzZUF0dHJpYnV0ZU5hbWVzOiF0aGlzLl9vcHRpb25zLnhtbE1vZGU7aWYodGhpcy5fb3B0aW9ucy5Ub2tlbml6ZXIpe1Rva2VuaXplcj10aGlzLl9vcHRpb25zLlRva2VuaXplcn10aGlzLl90b2tlbml6ZXI9bmV3IFRva2VuaXplcih0aGlzLl9vcHRpb25zLHRoaXMpO2lmKHRoaXMuX2Nicy5vbnBhcnNlcmluaXQpdGhpcy5fY2JzLm9ucGFyc2VyaW5pdCh0aGlzKX1yZXF1aXJlKFwiaW5oZXJpdHNcIikoUGFyc2VyLHJlcXVpcmUoXCJldmVudHNcIikuRXZlbnRFbWl0dGVyKTtQYXJzZXIucHJvdG90eXBlLl91cGRhdGVQb3NpdGlvbj1mdW5jdGlvbihpbml0aWFsT2Zmc2V0KXtpZih0aGlzLmVuZEluZGV4PT09bnVsbCl7aWYodGhpcy5fdG9rZW5pemVyLl9zZWN0aW9uU3RhcnQ8PWluaXRpYWxPZmZzZXQpe3RoaXMuc3RhcnRJbmRleD0wfWVsc2V7dGhpcy5zdGFydEluZGV4PXRoaXMuX3Rva2VuaXplci5fc2VjdGlvblN0YXJ0LWluaXRpYWxPZmZzZXR9fWVsc2UgdGhpcy5zdGFydEluZGV4PXRoaXMuZW5kSW5kZXgrMTt0aGlzLmVuZEluZGV4PXRoaXMuX3Rva2VuaXplci5nZXRBYnNvbHV0ZUluZGV4KCl9O1BhcnNlci5wcm90b3R5cGUub250ZXh0PWZ1bmN0aW9uKGRhdGEpe3RoaXMuX3VwZGF0ZVBvc2l0aW9uKDEpO3RoaXMuZW5kSW5kZXgtLTtpZih0aGlzLl9jYnMub250ZXh0KXRoaXMuX2Nicy5vbnRleHQoZGF0YSl9O1BhcnNlci5wcm90b3R5cGUub25vcGVudGFnbmFtZT1mdW5jdGlvbihuYW1lKXtpZih0aGlzLl9sb3dlckNhc2VUYWdOYW1lcyl7bmFtZT1uYW1lLnRvTG93ZXJDYXNlKCl9dGhpcy5fdGFnbmFtZT1uYW1lO2lmKCF0aGlzLl9vcHRpb25zLnhtbE1vZGUmJm5hbWUgaW4gb3BlbkltcGxpZXNDbG9zZSl7Zm9yKHZhciBlbDsoZWw9dGhpcy5fc3RhY2tbdGhpcy5fc3RhY2subGVuZ3RoLTFdKWluIG9wZW5JbXBsaWVzQ2xvc2VbbmFtZV07dGhpcy5vbmNsb3NldGFnKGVsKSk7fWlmKHRoaXMuX29wdGlvbnMueG1sTW9kZXx8IShuYW1lIGluIHZvaWRFbGVtZW50cykpe3RoaXMuX3N0YWNrLnB1c2gobmFtZSl9aWYodGhpcy5fY2JzLm9ub3BlbnRhZ25hbWUpdGhpcy5fY2JzLm9ub3BlbnRhZ25hbWUobmFtZSk7aWYodGhpcy5fY2JzLm9ub3BlbnRhZyl0aGlzLl9hdHRyaWJzPXt9fTtQYXJzZXIucHJvdG90eXBlLm9ub3BlbnRhZ2VuZD1mdW5jdGlvbigpe3RoaXMuX3VwZGF0ZVBvc2l0aW9uKDEpO2lmKHRoaXMuX2F0dHJpYnMpe2lmKHRoaXMuX2Nicy5vbm9wZW50YWcpdGhpcy5fY2JzLm9ub3BlbnRhZyh0aGlzLl90YWduYW1lLHRoaXMuX2F0dHJpYnMpO3RoaXMuX2F0dHJpYnM9bnVsbH1pZighdGhpcy5fb3B0aW9ucy54bWxNb2RlJiZ0aGlzLl9jYnMub25jbG9zZXRhZyYmdGhpcy5fdGFnbmFtZSBpbiB2b2lkRWxlbWVudHMpe3RoaXMuX2Nicy5vbmNsb3NldGFnKHRoaXMuX3RhZ25hbWUpfXRoaXMuX3RhZ25hbWU9XCJcIn07UGFyc2VyLnByb3RvdHlwZS5vbmNsb3NldGFnPWZ1bmN0aW9uKG5hbWUpe3RoaXMuX3VwZGF0ZVBvc2l0aW9uKDEpO2lmKHRoaXMuX2xvd2VyQ2FzZVRhZ05hbWVzKXtuYW1lPW5hbWUudG9Mb3dlckNhc2UoKX1pZih0aGlzLl9zdGFjay5sZW5ndGgmJighKG5hbWUgaW4gdm9pZEVsZW1lbnRzKXx8dGhpcy5fb3B0aW9ucy54bWxNb2RlKSl7dmFyIHBvcz10aGlzLl9zdGFjay5sYXN0SW5kZXhPZihuYW1lKTtpZihwb3MhPT0tMSl7aWYodGhpcy5fY2JzLm9uY2xvc2V0YWcpe3Bvcz10aGlzLl9zdGFjay5sZW5ndGgtcG9zO3doaWxlKHBvcy0tKXRoaXMuX2Nicy5vbmNsb3NldGFnKHRoaXMuX3N0YWNrLnBvcCgpKX1lbHNlIHRoaXMuX3N0YWNrLmxlbmd0aD1wb3N9ZWxzZSBpZihuYW1lPT09XCJwXCImJiF0aGlzLl9vcHRpb25zLnhtbE1vZGUpe3RoaXMub25vcGVudGFnbmFtZShuYW1lKTt0aGlzLl9jbG9zZUN1cnJlbnRUYWcoKX19ZWxzZSBpZighdGhpcy5fb3B0aW9ucy54bWxNb2RlJiYobmFtZT09PVwiYnJcInx8bmFtZT09PVwicFwiKSl7dGhpcy5vbm9wZW50YWduYW1lKG5hbWUpO3RoaXMuX2Nsb3NlQ3VycmVudFRhZygpfX07UGFyc2VyLnByb3RvdHlwZS5vbnNlbGZjbG9zaW5ndGFnPWZ1bmN0aW9uKCl7aWYodGhpcy5fb3B0aW9ucy54bWxNb2RlfHx0aGlzLl9vcHRpb25zLnJlY29nbml6ZVNlbGZDbG9zaW5nKXt0aGlzLl9jbG9zZUN1cnJlbnRUYWcoKX1lbHNle3RoaXMub25vcGVudGFnZW5kKCl9fTtQYXJzZXIucHJvdG90eXBlLl9jbG9zZUN1cnJlbnRUYWc9ZnVuY3Rpb24oKXt2YXIgbmFtZT10aGlzLl90YWduYW1lO3RoaXMub25vcGVudGFnZW5kKCk7aWYodGhpcy5fc3RhY2tbdGhpcy5fc3RhY2subGVuZ3RoLTFdPT09bmFtZSl7aWYodGhpcy5fY2JzLm9uY2xvc2V0YWcpe3RoaXMuX2Nicy5vbmNsb3NldGFnKG5hbWUpfXRoaXMuX3N0YWNrLnBvcCgpfX07UGFyc2VyLnByb3RvdHlwZS5vbmF0dHJpYm5hbWU9ZnVuY3Rpb24obmFtZSl7aWYodGhpcy5fbG93ZXJDYXNlQXR0cmlidXRlTmFtZXMpe25hbWU9bmFtZS50b0xvd2VyQ2FzZSgpfXRoaXMuX2F0dHJpYm5hbWU9bmFtZX07UGFyc2VyLnByb3RvdHlwZS5vbmF0dHJpYmRhdGE9ZnVuY3Rpb24odmFsdWUpe3RoaXMuX2F0dHJpYnZhbHVlKz12YWx1ZX07UGFyc2VyLnByb3RvdHlwZS5vbmF0dHJpYmVuZD1mdW5jdGlvbigpe2lmKHRoaXMuX2Nicy5vbmF0dHJpYnV0ZSl0aGlzLl9jYnMub25hdHRyaWJ1dGUodGhpcy5fYXR0cmlibmFtZSx0aGlzLl9hdHRyaWJ2YWx1ZSk7aWYodGhpcy5fYXR0cmlicyYmIU9iamVjdC5wcm90b3R5cGUuaGFzT3duUHJvcGVydHkuY2FsbCh0aGlzLl9hdHRyaWJzLHRoaXMuX2F0dHJpYm5hbWUpKXt0aGlzLl9hdHRyaWJzW3RoaXMuX2F0dHJpYm5hbWVdPXRoaXMuX2F0dHJpYnZhbHVlfXRoaXMuX2F0dHJpYm5hbWU9XCJcIjt0aGlzLl9hdHRyaWJ2YWx1ZT1cIlwifTtQYXJzZXIucHJvdG90eXBlLl9nZXRJbnN0cnVjdGlvbk5hbWU9ZnVuY3Rpb24odmFsdWUpe3ZhciBpZHg9dmFsdWUuc2VhcmNoKHJlX25hbWVFbmQpLG5hbWU9aWR4PDA/dmFsdWU6dmFsdWUuc3Vic3RyKDAsaWR4KTtpZih0aGlzLl9sb3dlckNhc2VUYWdOYW1lcyl7bmFtZT1uYW1lLnRvTG93ZXJDYXNlKCl9cmV0dXJuIG5hbWV9O1BhcnNlci5wcm90b3R5cGUub25kZWNsYXJhdGlvbj1mdW5jdGlvbih2YWx1ZSl7aWYodGhpcy5fY2JzLm9ucHJvY2Vzc2luZ2luc3RydWN0aW9uKXt2YXIgbmFtZT10aGlzLl9nZXRJbnN0cnVjdGlvbk5hbWUodmFsdWUpO3RoaXMuX2Nicy5vbnByb2Nlc3NpbmdpbnN0cnVjdGlvbihcIiFcIituYW1lLFwiIVwiK3ZhbHVlKX19O1BhcnNlci5wcm90b3R5cGUub25wcm9jZXNzaW5naW5zdHJ1Y3Rpb249ZnVuY3Rpb24odmFsdWUpe2lmKHRoaXMuX2Nicy5vbnByb2Nlc3NpbmdpbnN0cnVjdGlvbil7dmFyIG5hbWU9dGhpcy5fZ2V0SW5zdHJ1Y3Rpb25OYW1lKHZhbHVlKTt0aGlzLl9jYnMub25wcm9jZXNzaW5naW5zdHJ1Y3Rpb24oXCI/XCIrbmFtZSxcIj9cIit2YWx1ZSl9fTtQYXJzZXIucHJvdG90eXBlLm9uY29tbWVudD1mdW5jdGlvbih2YWx1ZSl7dGhpcy5fdXBkYXRlUG9zaXRpb24oNCk7aWYodGhpcy5fY2JzLm9uY29tbWVudCl0aGlzLl9jYnMub25jb21tZW50KHZhbHVlKTtpZih0aGlzLl9jYnMub25jb21tZW50ZW5kKXRoaXMuX2Nicy5vbmNvbW1lbnRlbmQoKX07UGFyc2VyLnByb3RvdHlwZS5vbmNkYXRhPWZ1bmN0aW9uKHZhbHVlKXt0aGlzLl91cGRhdGVQb3NpdGlvbigxKTtpZih0aGlzLl9vcHRpb25zLnhtbE1vZGV8fHRoaXMuX29wdGlvbnMucmVjb2duaXplQ0RBVEEpe2lmKHRoaXMuX2Nicy5vbmNkYXRhc3RhcnQpdGhpcy5fY2JzLm9uY2RhdGFzdGFydCgpO2lmKHRoaXMuX2Nicy5vbnRleHQpdGhpcy5fY2JzLm9udGV4dCh2YWx1ZSk7aWYodGhpcy5fY2JzLm9uY2RhdGFlbmQpdGhpcy5fY2JzLm9uY2RhdGFlbmQoKX1lbHNle3RoaXMub25jb21tZW50KFwiW0NEQVRBW1wiK3ZhbHVlK1wiXV1cIil9fTtQYXJzZXIucHJvdG90eXBlLm9uZXJyb3I9ZnVuY3Rpb24oZXJyKXtpZih0aGlzLl9jYnMub25lcnJvcil0aGlzLl9jYnMub25lcnJvcihlcnIpfTtQYXJzZXIucHJvdG90eXBlLm9uZW5kPWZ1bmN0aW9uKCl7aWYodGhpcy5fY2JzLm9uY2xvc2V0YWcpe2Zvcih2YXIgaT10aGlzLl9zdGFjay5sZW5ndGg7aT4wO3RoaXMuX2Nicy5vbmNsb3NldGFnKHRoaXMuX3N0YWNrWy0taV0pKTt9aWYodGhpcy5fY2JzLm9uZW5kKXRoaXMuX2Nicy5vbmVuZCgpfTtQYXJzZXIucHJvdG90eXBlLnJlc2V0PWZ1bmN0aW9uKCl7aWYodGhpcy5fY2JzLm9ucmVzZXQpdGhpcy5fY2JzLm9ucmVzZXQoKTt0aGlzLl90b2tlbml6ZXIucmVzZXQoKTt0aGlzLl90YWduYW1lPVwiXCI7dGhpcy5fYXR0cmlibmFtZT1cIlwiO3RoaXMuX2F0dHJpYnM9bnVsbDt0aGlzLl9zdGFjaz1bXTtpZih0aGlzLl9jYnMub25wYXJzZXJpbml0KXRoaXMuX2Nicy5vbnBhcnNlcmluaXQodGhpcyl9O1BhcnNlci5wcm90b3R5cGUucGFyc2VDb21wbGV0ZT1mdW5jdGlvbihkYXRhKXt0aGlzLnJlc2V0KCk7dGhpcy5lbmQoZGF0YSl9O1BhcnNlci5wcm90b3R5cGUud3JpdGU9ZnVuY3Rpb24oY2h1bmspe3RoaXMuX3Rva2VuaXplci53cml0ZShjaHVuayl9O1BhcnNlci5wcm90b3R5cGUuZW5kPWZ1bmN0aW9uKGNodW5rKXt0aGlzLl90b2tlbml6ZXIuZW5kKGNodW5rKX07UGFyc2VyLnByb3RvdHlwZS5wYXVzZT1mdW5jdGlvbigpe3RoaXMuX3Rva2VuaXplci5wYXVzZSgpfTtQYXJzZXIucHJvdG90eXBlLnJlc3VtZT1mdW5jdGlvbigpe3RoaXMuX3Rva2VuaXplci5yZXN1bWUoKX07UGFyc2VyLnByb3RvdHlwZS5wYXJzZUNodW5rPVBhcnNlci5wcm90b3R5cGUud3JpdGU7UGFyc2VyLnByb3RvdHlwZS5kb25lPVBhcnNlci5wcm90b3R5cGUuZW5kO21vZHVsZS5leHBvcnRzPVBhcnNlcn0se1wiLi9Ub2tlbml6ZXIuanNcIjozNCxldmVudHM6MjgsaW5oZXJpdHM6Mzh9XSwzMjpbZnVuY3Rpb24ocmVxdWlyZSxtb2R1bGUsZXhwb3J0cyl7bW9kdWxlLmV4cG9ydHM9UHJveHlIYW5kbGVyO2Z1bmN0aW9uIFByb3h5SGFuZGxlcihjYnMpe3RoaXMuX2Nicz1jYnN8fHt9fXZhciBFVkVOVFM9cmVxdWlyZShcIi4vXCIpLkVWRU5UUztPYmplY3Qua2V5cyhFVkVOVFMpLmZvckVhY2goZnVuY3Rpb24obmFtZSl7aWYoRVZFTlRTW25hbWVdPT09MCl7bmFtZT1cIm9uXCIrbmFtZTtQcm94eUhhbmRsZXIucHJvdG90eXBlW25hbWVdPWZ1bmN0aW9uKCl7aWYodGhpcy5fY2JzW25hbWVdKXRoaXMuX2Nic1tuYW1lXSgpfX1lbHNlIGlmKEVWRU5UU1tuYW1lXT09PTEpe25hbWU9XCJvblwiK25hbWU7UHJveHlIYW5kbGVyLnByb3RvdHlwZVtuYW1lXT1mdW5jdGlvbihhKXtpZih0aGlzLl9jYnNbbmFtZV0pdGhpcy5fY2JzW25hbWVdKGEpfX1lbHNlIGlmKEVWRU5UU1tuYW1lXT09PTIpe25hbWU9XCJvblwiK25hbWU7UHJveHlIYW5kbGVyLnByb3RvdHlwZVtuYW1lXT1mdW5jdGlvbihhLGIpe2lmKHRoaXMuX2Nic1tuYW1lXSl0aGlzLl9jYnNbbmFtZV0oYSxiKX19ZWxzZXt0aHJvdyBFcnJvcihcIndyb25nIG51bWJlciBvZiBhcmd1bWVudHNcIil9fSl9LHtcIi4vXCI6MzZ9XSwzMzpbZnVuY3Rpb24ocmVxdWlyZSxtb2R1bGUsZXhwb3J0cyl7bW9kdWxlLmV4cG9ydHM9U3RyZWFtO3ZhciBQYXJzZXI9cmVxdWlyZShcIi4vV3JpdGFibGVTdHJlYW0uanNcIik7ZnVuY3Rpb24gU3RyZWFtKG9wdGlvbnMpe1BhcnNlci5jYWxsKHRoaXMsbmV3IENicyh0aGlzKSxvcHRpb25zKX1yZXF1aXJlKFwiaW5oZXJpdHNcIikoU3RyZWFtLFBhcnNlcik7U3RyZWFtLnByb3RvdHlwZS5yZWFkYWJsZT10cnVlO2Z1bmN0aW9uIENicyhzY29wZSl7dGhpcy5zY29wZT1zY29wZX12YXIgRVZFTlRTPXJlcXVpcmUoXCIuLi9cIikuRVZFTlRTO09iamVjdC5rZXlzKEVWRU5UUykuZm9yRWFjaChmdW5jdGlvbihuYW1lKXtpZihFVkVOVFNbbmFtZV09PT0wKXtDYnMucHJvdG90eXBlW1wib25cIituYW1lXT1mdW5jdGlvbigpe3RoaXMuc2NvcGUuZW1pdChuYW1lKX19ZWxzZSBpZihFVkVOVFNbbmFtZV09PT0xKXtDYnMucHJvdG90eXBlW1wib25cIituYW1lXT1mdW5jdGlvbihhKXt0aGlzLnNjb3BlLmVtaXQobmFtZSxhKX19ZWxzZSBpZihFVkVOVFNbbmFtZV09PT0yKXtDYnMucHJvdG90eXBlW1wib25cIituYW1lXT1mdW5jdGlvbihhLGIpe3RoaXMuc2NvcGUuZW1pdChuYW1lLGEsYil9fWVsc2V7dGhyb3cgRXJyb3IoXCJ3cm9uZyBudW1iZXIgb2YgYXJndW1lbnRzIVwiKX19KX0se1wiLi4vXCI6MzYsXCIuL1dyaXRhYmxlU3RyZWFtLmpzXCI6MzUsaW5oZXJpdHM6Mzh9XSwzNDpbZnVuY3Rpb24ocmVxdWlyZSxtb2R1bGUsZXhwb3J0cyl7bW9kdWxlLmV4cG9ydHM9VG9rZW5pemVyO3ZhciBkZWNvZGVDb2RlUG9pbnQ9cmVxdWlyZShcImVudGl0aWVzL2xpYi9kZWNvZGVfY29kZXBvaW50LmpzXCIpLGVudGl0eU1hcD1yZXF1aXJlKFwiZW50aXRpZXMvbWFwcy9lbnRpdGllcy5qc29uXCIpLGxlZ2FjeU1hcD1yZXF1aXJlKFwiZW50aXRpZXMvbWFwcy9sZWdhY3kuanNvblwiKSx4bWxNYXA9cmVxdWlyZShcImVudGl0aWVzL21hcHMveG1sLmpzb25cIiksaT0wLFRFWFQ9aSsrLEJFRk9SRV9UQUdfTkFNRT1pKyssSU5fVEFHX05BTUU9aSsrLElOX1NFTEZfQ0xPU0lOR19UQUc9aSsrLEJFRk9SRV9DTE9TSU5HX1RBR19OQU1FPWkrKyxJTl9DTE9TSU5HX1RBR19OQU1FPWkrKyxBRlRFUl9DTE9TSU5HX1RBR19OQU1FPWkrKyxCRUZPUkVfQVRUUklCVVRFX05BTUU9aSsrLElOX0FUVFJJQlVURV9OQU1FPWkrKyxBRlRFUl9BVFRSSUJVVEVfTkFNRT1pKyssQkVGT1JFX0FUVFJJQlVURV9WQUxVRT1pKyssSU5fQVRUUklCVVRFX1ZBTFVFX0RRPWkrKyxJTl9BVFRSSUJVVEVfVkFMVUVfU1E9aSsrLElOX0FUVFJJQlVURV9WQUxVRV9OUT1pKyssQkVGT1JFX0RFQ0xBUkFUSU9OPWkrKyxJTl9ERUNMQVJBVElPTj1pKyssSU5fUFJPQ0VTU0lOR19JTlNUUlVDVElPTj1pKyssQkVGT1JFX0NPTU1FTlQ9aSsrLElOX0NPTU1FTlQ9aSsrLEFGVEVSX0NPTU1FTlRfMT1pKyssQUZURVJfQ09NTUVOVF8yPWkrKyxCRUZPUkVfQ0RBVEFfMT1pKyssQkVGT1JFX0NEQVRBXzI9aSsrLEJFRk9SRV9DREFUQV8zPWkrKyxCRUZPUkVfQ0RBVEFfND1pKyssQkVGT1JFX0NEQVRBXzU9aSsrLEJFRk9SRV9DREFUQV82PWkrKyxJTl9DREFUQT1pKyssQUZURVJfQ0RBVEFfMT1pKyssQUZURVJfQ0RBVEFfMj1pKyssQkVGT1JFX1NQRUNJQUw9aSsrLEJFRk9SRV9TUEVDSUFMX0VORD1pKyssQkVGT1JFX1NDUklQVF8xPWkrKyxCRUZPUkVfU0NSSVBUXzI9aSsrLEJFRk9SRV9TQ1JJUFRfMz1pKyssQkVGT1JFX1NDUklQVF80PWkrKyxCRUZPUkVfU0NSSVBUXzU9aSsrLEFGVEVSX1NDUklQVF8xPWkrKyxBRlRFUl9TQ1JJUFRfMj1pKyssQUZURVJfU0NSSVBUXzM9aSsrLEFGVEVSX1NDUklQVF80PWkrKyxBRlRFUl9TQ1JJUFRfNT1pKyssQkVGT1JFX1NUWUxFXzE9aSsrLEJFRk9SRV9TVFlMRV8yPWkrKyxCRUZPUkVfU1RZTEVfMz1pKyssQkVGT1JFX1NUWUxFXzQ9aSsrLEFGVEVSX1NUWUxFXzE9aSsrLEFGVEVSX1NUWUxFXzI9aSsrLEFGVEVSX1NUWUxFXzM9aSsrLEFGVEVSX1NUWUxFXzQ9aSsrLEJFRk9SRV9FTlRJVFk9aSsrLEJFRk9SRV9OVU1FUklDX0VOVElUWT1pKyssSU5fTkFNRURfRU5USVRZPWkrKyxJTl9OVU1FUklDX0VOVElUWT1pKyssSU5fSEVYX0VOVElUWT1pKyssaj0wLFNQRUNJQUxfTk9ORT1qKyssU1BFQ0lBTF9TQ1JJUFQ9aisrLFNQRUNJQUxfU1RZTEU9aisrO2Z1bmN0aW9uIHdoaXRlc3BhY2UoYyl7cmV0dXJuIGM9PT1cIiBcInx8Yz09PVwiXFxuXCJ8fGM9PT1cIlxcdFwifHxjPT09XCJcXGZcInx8Yz09PVwiXFxyXCJ9ZnVuY3Rpb24gY2hhcmFjdGVyU3RhdGUoY2hhcixTVUNDRVNTKXtyZXR1cm4gZnVuY3Rpb24oYyl7aWYoYz09PWNoYXIpdGhpcy5fc3RhdGU9U1VDQ0VTU319ZnVuY3Rpb24gaWZFbHNlU3RhdGUodXBwZXIsU1VDQ0VTUyxGQUlMVVJFKXt2YXIgbG93ZXI9dXBwZXIudG9Mb3dlckNhc2UoKTtpZih1cHBlcj09PWxvd2VyKXtyZXR1cm4gZnVuY3Rpb24oYyl7aWYoYz09PWxvd2VyKXt0aGlzLl9zdGF0ZT1TVUNDRVNTfWVsc2V7dGhpcy5fc3RhdGU9RkFJTFVSRTt0aGlzLl9pbmRleC0tfX19ZWxzZXtyZXR1cm4gZnVuY3Rpb24oYyl7aWYoYz09PWxvd2VyfHxjPT09dXBwZXIpe3RoaXMuX3N0YXRlPVNVQ0NFU1N9ZWxzZXt0aGlzLl9zdGF0ZT1GQUlMVVJFO3RoaXMuX2luZGV4LS19fX19ZnVuY3Rpb24gY29uc3VtZVNwZWNpYWxOYW1lQ2hhcih1cHBlcixORVhUX1NUQVRFKXt2YXIgbG93ZXI9dXBwZXIudG9Mb3dlckNhc2UoKTtyZXR1cm4gZnVuY3Rpb24oYyl7aWYoYz09PWxvd2VyfHxjPT09dXBwZXIpe3RoaXMuX3N0YXRlPU5FWFRfU1RBVEV9ZWxzZXt0aGlzLl9zdGF0ZT1JTl9UQUdfTkFNRTt0aGlzLl9pbmRleC0tfX19ZnVuY3Rpb24gVG9rZW5pemVyKG9wdGlvbnMsY2JzKXt0aGlzLl9zdGF0ZT1URVhUO3RoaXMuX2J1ZmZlcj1cIlwiO3RoaXMuX3NlY3Rpb25TdGFydD0wO3RoaXMuX2luZGV4PTA7dGhpcy5fYnVmZmVyT2Zmc2V0PTA7dGhpcy5fYmFzZVN0YXRlPVRFWFQ7dGhpcy5fc3BlY2lhbD1TUEVDSUFMX05PTkU7dGhpcy5fY2JzPWNiczt0aGlzLl9ydW5uaW5nPXRydWU7dGhpcy5fZW5kZWQ9ZmFsc2U7dGhpcy5feG1sTW9kZT0hIShvcHRpb25zJiZvcHRpb25zLnhtbE1vZGUpO3RoaXMuX2RlY29kZUVudGl0aWVzPSEhKG9wdGlvbnMmJm9wdGlvbnMuZGVjb2RlRW50aXRpZXMpfVRva2VuaXplci5wcm90b3R5cGUuX3N0YXRlVGV4dD1mdW5jdGlvbihjKXtpZihjPT09XCI8XCIpe2lmKHRoaXMuX2luZGV4PnRoaXMuX3NlY3Rpb25TdGFydCl7dGhpcy5fY2JzLm9udGV4dCh0aGlzLl9nZXRTZWN0aW9uKCkpfXRoaXMuX3N0YXRlPUJFRk9SRV9UQUdfTkFNRTt0aGlzLl9zZWN0aW9uU3RhcnQ9dGhpcy5faW5kZXh9ZWxzZSBpZih0aGlzLl9kZWNvZGVFbnRpdGllcyYmdGhpcy5fc3BlY2lhbD09PVNQRUNJQUxfTk9ORSYmYz09PVwiJlwiKXtpZih0aGlzLl9pbmRleD50aGlzLl9zZWN0aW9uU3RhcnQpe3RoaXMuX2Nicy5vbnRleHQodGhpcy5fZ2V0U2VjdGlvbigpKX10aGlzLl9iYXNlU3RhdGU9VEVYVDt0aGlzLl9zdGF0ZT1CRUZPUkVfRU5USVRZO3RoaXMuX3NlY3Rpb25TdGFydD10aGlzLl9pbmRleH19O1Rva2VuaXplci5wcm90b3R5cGUuX3N0YXRlQmVmb3JlVGFnTmFtZT1mdW5jdGlvbihjKXtpZihjPT09XCIvXCIpe3RoaXMuX3N0YXRlPUJFRk9SRV9DTE9TSU5HX1RBR19OQU1FfWVsc2UgaWYoYz09PVwiPFwiKXt0aGlzLl9jYnMub250ZXh0KHRoaXMuX2dldFNlY3Rpb24oKSk7dGhpcy5fc2VjdGlvblN0YXJ0PXRoaXMuX2luZGV4fWVsc2UgaWYoYz09PVwiPlwifHx0aGlzLl9zcGVjaWFsIT09U1BFQ0lBTF9OT05FfHx3aGl0ZXNwYWNlKGMpKXt0aGlzLl9zdGF0ZT1URVhUfWVsc2UgaWYoYz09PVwiIVwiKXt0aGlzLl9zdGF0ZT1CRUZPUkVfREVDTEFSQVRJT047dGhpcy5fc2VjdGlvblN0YXJ0PXRoaXMuX2luZGV4KzF9ZWxzZSBpZihjPT09XCI/XCIpe3RoaXMuX3N0YXRlPUlOX1BST0NFU1NJTkdfSU5TVFJVQ1RJT047dGhpcy5fc2VjdGlvblN0YXJ0PXRoaXMuX2luZGV4KzF9ZWxzZXt0aGlzLl9zdGF0ZT0hdGhpcy5feG1sTW9kZSYmKGM9PT1cInNcInx8Yz09PVwiU1wiKT9CRUZPUkVfU1BFQ0lBTDpJTl9UQUdfTkFNRTt0aGlzLl9zZWN0aW9uU3RhcnQ9dGhpcy5faW5kZXh9fTtUb2tlbml6ZXIucHJvdG90eXBlLl9zdGF0ZUluVGFnTmFtZT1mdW5jdGlvbihjKXtpZihjPT09XCIvXCJ8fGM9PT1cIj5cInx8d2hpdGVzcGFjZShjKSl7dGhpcy5fZW1pdFRva2VuKFwib25vcGVudGFnbmFtZVwiKTt0aGlzLl9zdGF0ZT1CRUZPUkVfQVRUUklCVVRFX05BTUU7dGhpcy5faW5kZXgtLX19O1Rva2VuaXplci5wcm90b3R5cGUuX3N0YXRlQmVmb3JlQ2xvc2VpbmdUYWdOYW1lPWZ1bmN0aW9uKGMpe2lmKHdoaXRlc3BhY2UoYykpO2Vsc2UgaWYoYz09PVwiPlwiKXt0aGlzLl9zdGF0ZT1URVhUfWVsc2UgaWYodGhpcy5fc3BlY2lhbCE9PVNQRUNJQUxfTk9ORSl7aWYoYz09PVwic1wifHxjPT09XCJTXCIpe3RoaXMuX3N0YXRlPUJFRk9SRV9TUEVDSUFMX0VORH1lbHNle3RoaXMuX3N0YXRlPVRFWFQ7dGhpcy5faW5kZXgtLX19ZWxzZXt0aGlzLl9zdGF0ZT1JTl9DTE9TSU5HX1RBR19OQU1FO3RoaXMuX3NlY3Rpb25TdGFydD10aGlzLl9pbmRleH19O1Rva2VuaXplci5wcm90b3R5cGUuX3N0YXRlSW5DbG9zZWluZ1RhZ05hbWU9ZnVuY3Rpb24oYyl7aWYoYz09PVwiPlwifHx3aGl0ZXNwYWNlKGMpKXt0aGlzLl9lbWl0VG9rZW4oXCJvbmNsb3NldGFnXCIpO3RoaXMuX3N0YXRlPUFGVEVSX0NMT1NJTkdfVEFHX05BTUU7dGhpcy5faW5kZXgtLX19O1Rva2VuaXplci5wcm90b3R5cGUuX3N0YXRlQWZ0ZXJDbG9zZWluZ1RhZ05hbWU9ZnVuY3Rpb24oYyl7aWYoYz09PVwiPlwiKXt0aGlzLl9zdGF0ZT1URVhUO3RoaXMuX3NlY3Rpb25TdGFydD10aGlzLl9pbmRleCsxfX07VG9rZW5pemVyLnByb3RvdHlwZS5fc3RhdGVCZWZvcmVBdHRyaWJ1dGVOYW1lPWZ1bmN0aW9uKGMpe2lmKGM9PT1cIj5cIil7dGhpcy5fY2JzLm9ub3BlbnRhZ2VuZCgpO3RoaXMuX3N0YXRlPVRFWFQ7dGhpcy5fc2VjdGlvblN0YXJ0PXRoaXMuX2luZGV4KzF9ZWxzZSBpZihjPT09XCIvXCIpe3RoaXMuX3N0YXRlPUlOX1NFTEZfQ0xPU0lOR19UQUd9ZWxzZSBpZighd2hpdGVzcGFjZShjKSl7dGhpcy5fc3RhdGU9SU5fQVRUUklCVVRFX05BTUU7dGhpcy5fc2VjdGlvblN0YXJ0PXRoaXMuX2luZGV4fX07VG9rZW5pemVyLnByb3RvdHlwZS5fc3RhdGVJblNlbGZDbG9zaW5nVGFnPWZ1bmN0aW9uKGMpe2lmKGM9PT1cIj5cIil7dGhpcy5fY2JzLm9uc2VsZmNsb3Npbmd0YWcoKTt0aGlzLl9zdGF0ZT1URVhUO3RoaXMuX3NlY3Rpb25TdGFydD10aGlzLl9pbmRleCsxfWVsc2UgaWYoIXdoaXRlc3BhY2UoYykpe3RoaXMuX3N0YXRlPUJFRk9SRV9BVFRSSUJVVEVfTkFNRTt0aGlzLl9pbmRleC0tfX07VG9rZW5pemVyLnByb3RvdHlwZS5fc3RhdGVJbkF0dHJpYnV0ZU5hbWU9ZnVuY3Rpb24oYyl7aWYoYz09PVwiPVwifHxjPT09XCIvXCJ8fGM9PT1cIj5cInx8d2hpdGVzcGFjZShjKSl7dGhpcy5fY2JzLm9uYXR0cmlibmFtZSh0aGlzLl9nZXRTZWN0aW9uKCkpO3RoaXMuX3NlY3Rpb25TdGFydD0tMTt0aGlzLl9zdGF0ZT1BRlRFUl9BVFRSSUJVVEVfTkFNRTt0aGlzLl9pbmRleC0tfX07VG9rZW5pemVyLnByb3RvdHlwZS5fc3RhdGVBZnRlckF0dHJpYnV0ZU5hbWU9ZnVuY3Rpb24oYyl7aWYoYz09PVwiPVwiKXt0aGlzLl9zdGF0ZT1CRUZPUkVfQVRUUklCVVRFX1ZBTFVFfWVsc2UgaWYoYz09PVwiL1wifHxjPT09XCI+XCIpe3RoaXMuX2Nicy5vbmF0dHJpYmVuZCgpO3RoaXMuX3N0YXRlPUJFRk9SRV9BVFRSSUJVVEVfTkFNRTt0aGlzLl9pbmRleC0tfWVsc2UgaWYoIXdoaXRlc3BhY2UoYykpe3RoaXMuX2Nicy5vbmF0dHJpYmVuZCgpO3RoaXMuX3N0YXRlPUlOX0FUVFJJQlVURV9OQU1FO3RoaXMuX3NlY3Rpb25TdGFydD10aGlzLl9pbmRleH19O1Rva2VuaXplci5wcm90b3R5cGUuX3N0YXRlQmVmb3JlQXR0cmlidXRlVmFsdWU9ZnVuY3Rpb24oYyl7aWYoYz09PSdcIicpe3RoaXMuX3N0YXRlPUlOX0FUVFJJQlVURV9WQUxVRV9EUTt0aGlzLl9zZWN0aW9uU3RhcnQ9dGhpcy5faW5kZXgrMX1lbHNlIGlmKGM9PT1cIidcIil7dGhpcy5fc3RhdGU9SU5fQVRUUklCVVRFX1ZBTFVFX1NRO3RoaXMuX3NlY3Rpb25TdGFydD10aGlzLl9pbmRleCsxfWVsc2UgaWYoIXdoaXRlc3BhY2UoYykpe3RoaXMuX3N0YXRlPUlOX0FUVFJJQlVURV9WQUxVRV9OUTt0aGlzLl9zZWN0aW9uU3RhcnQ9dGhpcy5faW5kZXg7dGhpcy5faW5kZXgtLX19O1Rva2VuaXplci5wcm90b3R5cGUuX3N0YXRlSW5BdHRyaWJ1dGVWYWx1ZURvdWJsZVF1b3Rlcz1mdW5jdGlvbihjKXtpZihjPT09J1wiJyl7dGhpcy5fZW1pdFRva2VuKFwib25hdHRyaWJkYXRhXCIpO3RoaXMuX2Nicy5vbmF0dHJpYmVuZCgpO3RoaXMuX3N0YXRlPUJFRk9SRV9BVFRSSUJVVEVfTkFNRX1lbHNlIGlmKHRoaXMuX2RlY29kZUVudGl0aWVzJiZjPT09XCImXCIpe3RoaXMuX2VtaXRUb2tlbihcIm9uYXR0cmliZGF0YVwiKTt0aGlzLl9iYXNlU3RhdGU9dGhpcy5fc3RhdGU7dGhpcy5fc3RhdGU9QkVGT1JFX0VOVElUWTt0aGlzLl9zZWN0aW9uU3RhcnQ9dGhpcy5faW5kZXh9fTtUb2tlbml6ZXIucHJvdG90eXBlLl9zdGF0ZUluQXR0cmlidXRlVmFsdWVTaW5nbGVRdW90ZXM9ZnVuY3Rpb24oYyl7aWYoYz09PVwiJ1wiKXt0aGlzLl9lbWl0VG9rZW4oXCJvbmF0dHJpYmRhdGFcIik7dGhpcy5fY2JzLm9uYXR0cmliZW5kKCk7dGhpcy5fc3RhdGU9QkVGT1JFX0FUVFJJQlVURV9OQU1FfWVsc2UgaWYodGhpcy5fZGVjb2RlRW50aXRpZXMmJmM9PT1cIiZcIil7dGhpcy5fZW1pdFRva2VuKFwib25hdHRyaWJkYXRhXCIpO3RoaXMuX2Jhc2VTdGF0ZT10aGlzLl9zdGF0ZTt0aGlzLl9zdGF0ZT1CRUZPUkVfRU5USVRZO3RoaXMuX3NlY3Rpb25TdGFydD10aGlzLl9pbmRleH19O1Rva2VuaXplci5wcm90b3R5cGUuX3N0YXRlSW5BdHRyaWJ1dGVWYWx1ZU5vUXVvdGVzPWZ1bmN0aW9uKGMpe2lmKHdoaXRlc3BhY2UoYyl8fGM9PT1cIj5cIil7dGhpcy5fZW1pdFRva2VuKFwib25hdHRyaWJkYXRhXCIpO3RoaXMuX2Nicy5vbmF0dHJpYmVuZCgpO3RoaXMuX3N0YXRlPUJFRk9SRV9BVFRSSUJVVEVfTkFNRTt0aGlzLl9pbmRleC0tfWVsc2UgaWYodGhpcy5fZGVjb2RlRW50aXRpZXMmJmM9PT1cIiZcIil7dGhpcy5fZW1pdFRva2VuKFwib25hdHRyaWJkYXRhXCIpO3RoaXMuX2Jhc2VTdGF0ZT10aGlzLl9zdGF0ZTt0aGlzLl9zdGF0ZT1CRUZPUkVfRU5USVRZO3RoaXMuX3NlY3Rpb25TdGFydD10aGlzLl9pbmRleH19O1Rva2VuaXplci5wcm90b3R5cGUuX3N0YXRlQmVmb3JlRGVjbGFyYXRpb249ZnVuY3Rpb24oYyl7dGhpcy5fc3RhdGU9Yz09PVwiW1wiP0JFRk9SRV9DREFUQV8xOmM9PT1cIi1cIj9CRUZPUkVfQ09NTUVOVDpJTl9ERUNMQVJBVElPTn07VG9rZW5pemVyLnByb3RvdHlwZS5fc3RhdGVJbkRlY2xhcmF0aW9uPWZ1bmN0aW9uKGMpe2lmKGM9PT1cIj5cIil7dGhpcy5fY2JzLm9uZGVjbGFyYXRpb24odGhpcy5fZ2V0U2VjdGlvbigpKTt0aGlzLl9zdGF0ZT1URVhUO3RoaXMuX3NlY3Rpb25TdGFydD10aGlzLl9pbmRleCsxfX07VG9rZW5pemVyLnByb3RvdHlwZS5fc3RhdGVJblByb2Nlc3NpbmdJbnN0cnVjdGlvbj1mdW5jdGlvbihjKXtpZihjPT09XCI+XCIpe3RoaXMuX2Nicy5vbnByb2Nlc3NpbmdpbnN0cnVjdGlvbih0aGlzLl9nZXRTZWN0aW9uKCkpO3RoaXMuX3N0YXRlPVRFWFQ7dGhpcy5fc2VjdGlvblN0YXJ0PXRoaXMuX2luZGV4KzF9fTtUb2tlbml6ZXIucHJvdG90eXBlLl9zdGF0ZUJlZm9yZUNvbW1lbnQ9ZnVuY3Rpb24oYyl7aWYoYz09PVwiLVwiKXt0aGlzLl9zdGF0ZT1JTl9DT01NRU5UO3RoaXMuX3NlY3Rpb25TdGFydD10aGlzLl9pbmRleCsxfWVsc2V7dGhpcy5fc3RhdGU9SU5fREVDTEFSQVRJT059fTtUb2tlbml6ZXIucHJvdG90eXBlLl9zdGF0ZUluQ29tbWVudD1mdW5jdGlvbihjKXtpZihjPT09XCItXCIpdGhpcy5fc3RhdGU9QUZURVJfQ09NTUVOVF8xfTtUb2tlbml6ZXIucHJvdG90eXBlLl9zdGF0ZUFmdGVyQ29tbWVudDE9ZnVuY3Rpb24oYyl7aWYoYz09PVwiLVwiKXt0aGlzLl9zdGF0ZT1BRlRFUl9DT01NRU5UXzJ9ZWxzZXt0aGlzLl9zdGF0ZT1JTl9DT01NRU5UfX07VG9rZW5pemVyLnByb3RvdHlwZS5fc3RhdGVBZnRlckNvbW1lbnQyPWZ1bmN0aW9uKGMpe2lmKGM9PT1cIj5cIil7dGhpcy5fY2JzLm9uY29tbWVudCh0aGlzLl9idWZmZXIuc3Vic3RyaW5nKHRoaXMuX3NlY3Rpb25TdGFydCx0aGlzLl9pbmRleC0yKSk7dGhpcy5fc3RhdGU9VEVYVDt0aGlzLl9zZWN0aW9uU3RhcnQ9dGhpcy5faW5kZXgrMX1lbHNlIGlmKGMhPT1cIi1cIil7dGhpcy5fc3RhdGU9SU5fQ09NTUVOVH19O1Rva2VuaXplci5wcm90b3R5cGUuX3N0YXRlQmVmb3JlQ2RhdGExPWlmRWxzZVN0YXRlKFwiQ1wiLEJFRk9SRV9DREFUQV8yLElOX0RFQ0xBUkFUSU9OKTtUb2tlbml6ZXIucHJvdG90eXBlLl9zdGF0ZUJlZm9yZUNkYXRhMj1pZkVsc2VTdGF0ZShcIkRcIixCRUZPUkVfQ0RBVEFfMyxJTl9ERUNMQVJBVElPTik7VG9rZW5pemVyLnByb3RvdHlwZS5fc3RhdGVCZWZvcmVDZGF0YTM9aWZFbHNlU3RhdGUoXCJBXCIsQkVGT1JFX0NEQVRBXzQsSU5fREVDTEFSQVRJT04pO1Rva2VuaXplci5wcm90b3R5cGUuX3N0YXRlQmVmb3JlQ2RhdGE0PWlmRWxzZVN0YXRlKFwiVFwiLEJFRk9SRV9DREFUQV81LElOX0RFQ0xBUkFUSU9OKTtUb2tlbml6ZXIucHJvdG90eXBlLl9zdGF0ZUJlZm9yZUNkYXRhNT1pZkVsc2VTdGF0ZShcIkFcIixCRUZPUkVfQ0RBVEFfNixJTl9ERUNMQVJBVElPTik7VG9rZW5pemVyLnByb3RvdHlwZS5fc3RhdGVCZWZvcmVDZGF0YTY9ZnVuY3Rpb24oYyl7aWYoYz09PVwiW1wiKXt0aGlzLl9zdGF0ZT1JTl9DREFUQTt0aGlzLl9zZWN0aW9uU3RhcnQ9dGhpcy5faW5kZXgrMX1lbHNle3RoaXMuX3N0YXRlPUlOX0RFQ0xBUkFUSU9OO3RoaXMuX2luZGV4LS19fTtUb2tlbml6ZXIucHJvdG90eXBlLl9zdGF0ZUluQ2RhdGE9ZnVuY3Rpb24oYyl7aWYoYz09PVwiXVwiKXRoaXMuX3N0YXRlPUFGVEVSX0NEQVRBXzF9O1Rva2VuaXplci5wcm90b3R5cGUuX3N0YXRlQWZ0ZXJDZGF0YTE9Y2hhcmFjdGVyU3RhdGUoXCJdXCIsQUZURVJfQ0RBVEFfMik7VG9rZW5pemVyLnByb3RvdHlwZS5fc3RhdGVBZnRlckNkYXRhMj1mdW5jdGlvbihjKXtpZihjPT09XCI+XCIpe3RoaXMuX2Nicy5vbmNkYXRhKHRoaXMuX2J1ZmZlci5zdWJzdHJpbmcodGhpcy5fc2VjdGlvblN0YXJ0LHRoaXMuX2luZGV4LTIpKTt0aGlzLl9zdGF0ZT1URVhUO3RoaXMuX3NlY3Rpb25TdGFydD10aGlzLl9pbmRleCsxfWVsc2UgaWYoYyE9PVwiXVwiKXt0aGlzLl9zdGF0ZT1JTl9DREFUQX19O1Rva2VuaXplci5wcm90b3R5cGUuX3N0YXRlQmVmb3JlU3BlY2lhbD1mdW5jdGlvbihjKXtpZihjPT09XCJjXCJ8fGM9PT1cIkNcIil7dGhpcy5fc3RhdGU9QkVGT1JFX1NDUklQVF8xfWVsc2UgaWYoYz09PVwidFwifHxjPT09XCJUXCIpe3RoaXMuX3N0YXRlPUJFRk9SRV9TVFlMRV8xfWVsc2V7dGhpcy5fc3RhdGU9SU5fVEFHX05BTUU7dGhpcy5faW5kZXgtLX19O1Rva2VuaXplci5wcm90b3R5cGUuX3N0YXRlQmVmb3JlU3BlY2lhbEVuZD1mdW5jdGlvbihjKXtpZih0aGlzLl9zcGVjaWFsPT09U1BFQ0lBTF9TQ1JJUFQmJihjPT09XCJjXCJ8fGM9PT1cIkNcIikpe3RoaXMuX3N0YXRlPUFGVEVSX1NDUklQVF8xfWVsc2UgaWYodGhpcy5fc3BlY2lhbD09PVNQRUNJQUxfU1RZTEUmJihjPT09XCJ0XCJ8fGM9PT1cIlRcIikpe3RoaXMuX3N0YXRlPUFGVEVSX1NUWUxFXzF9ZWxzZSB0aGlzLl9zdGF0ZT1URVhUfTtUb2tlbml6ZXIucHJvdG90eXBlLl9zdGF0ZUJlZm9yZVNjcmlwdDE9Y29uc3VtZVNwZWNpYWxOYW1lQ2hhcihcIlJcIixCRUZPUkVfU0NSSVBUXzIpO1Rva2VuaXplci5wcm90b3R5cGUuX3N0YXRlQmVmb3JlU2NyaXB0Mj1jb25zdW1lU3BlY2lhbE5hbWVDaGFyKFwiSVwiLEJFRk9SRV9TQ1JJUFRfMyk7VG9rZW5pemVyLnByb3RvdHlwZS5fc3RhdGVCZWZvcmVTY3JpcHQzPWNvbnN1bWVTcGVjaWFsTmFtZUNoYXIoXCJQXCIsQkVGT1JFX1NDUklQVF80KTtUb2tlbml6ZXIucHJvdG90eXBlLl9zdGF0ZUJlZm9yZVNjcmlwdDQ9Y29uc3VtZVNwZWNpYWxOYW1lQ2hhcihcIlRcIixCRUZPUkVfU0NSSVBUXzUpO1Rva2VuaXplci5wcm90b3R5cGUuX3N0YXRlQmVmb3JlU2NyaXB0NT1mdW5jdGlvbihjKXtpZihjPT09XCIvXCJ8fGM9PT1cIj5cInx8d2hpdGVzcGFjZShjKSl7dGhpcy5fc3BlY2lhbD1TUEVDSUFMX1NDUklQVH10aGlzLl9zdGF0ZT1JTl9UQUdfTkFNRTt0aGlzLl9pbmRleC0tfTtUb2tlbml6ZXIucHJvdG90eXBlLl9zdGF0ZUFmdGVyU2NyaXB0MT1pZkVsc2VTdGF0ZShcIlJcIixBRlRFUl9TQ1JJUFRfMixURVhUKTtUb2tlbml6ZXIucHJvdG90eXBlLl9zdGF0ZUFmdGVyU2NyaXB0Mj1pZkVsc2VTdGF0ZShcIklcIixBRlRFUl9TQ1JJUFRfMyxURVhUKTtUb2tlbml6ZXIucHJvdG90eXBlLl9zdGF0ZUFmdGVyU2NyaXB0Mz1pZkVsc2VTdGF0ZShcIlBcIixBRlRFUl9TQ1JJUFRfNCxURVhUKTtUb2tlbml6ZXIucHJvdG90eXBlLl9zdGF0ZUFmdGVyU2NyaXB0ND1pZkVsc2VTdGF0ZShcIlRcIixBRlRFUl9TQ1JJUFRfNSxURVhUKTtUb2tlbml6ZXIucHJvdG90eXBlLl9zdGF0ZUFmdGVyU2NyaXB0NT1mdW5jdGlvbihjKXtpZihjPT09XCI+XCJ8fHdoaXRlc3BhY2UoYykpe3RoaXMuX3NwZWNpYWw9U1BFQ0lBTF9OT05FO3RoaXMuX3N0YXRlPUlOX0NMT1NJTkdfVEFHX05BTUU7dGhpcy5fc2VjdGlvblN0YXJ0PXRoaXMuX2luZGV4LTY7dGhpcy5faW5kZXgtLX1lbHNlIHRoaXMuX3N0YXRlPVRFWFR9O1Rva2VuaXplci5wcm90b3R5cGUuX3N0YXRlQmVmb3JlU3R5bGUxPWNvbnN1bWVTcGVjaWFsTmFtZUNoYXIoXCJZXCIsQkVGT1JFX1NUWUxFXzIpO1Rva2VuaXplci5wcm90b3R5cGUuX3N0YXRlQmVmb3JlU3R5bGUyPWNvbnN1bWVTcGVjaWFsTmFtZUNoYXIoXCJMXCIsQkVGT1JFX1NUWUxFXzMpO1Rva2VuaXplci5wcm90b3R5cGUuX3N0YXRlQmVmb3JlU3R5bGUzPWNvbnN1bWVTcGVjaWFsTmFtZUNoYXIoXCJFXCIsQkVGT1JFX1NUWUxFXzQpO1Rva2VuaXplci5wcm90b3R5cGUuX3N0YXRlQmVmb3JlU3R5bGU0PWZ1bmN0aW9uKGMpe2lmKGM9PT1cIi9cInx8Yz09PVwiPlwifHx3aGl0ZXNwYWNlKGMpKXt0aGlzLl9zcGVjaWFsPVNQRUNJQUxfU1RZTEV9dGhpcy5fc3RhdGU9SU5fVEFHX05BTUU7dGhpcy5faW5kZXgtLX07VG9rZW5pemVyLnByb3RvdHlwZS5fc3RhdGVBZnRlclN0eWxlMT1pZkVsc2VTdGF0ZShcIllcIixBRlRFUl9TVFlMRV8yLFRFWFQpO1Rva2VuaXplci5wcm90b3R5cGUuX3N0YXRlQWZ0ZXJTdHlsZTI9aWZFbHNlU3RhdGUoXCJMXCIsQUZURVJfU1RZTEVfMyxURVhUKTtUb2tlbml6ZXIucHJvdG90eXBlLl9zdGF0ZUFmdGVyU3R5bGUzPWlmRWxzZVN0YXRlKFwiRVwiLEFGVEVSX1NUWUxFXzQsVEVYVCk7VG9rZW5pemVyLnByb3RvdHlwZS5fc3RhdGVBZnRlclN0eWxlND1mdW5jdGlvbihjKXtpZihjPT09XCI+XCJ8fHdoaXRlc3BhY2UoYykpe3RoaXMuX3NwZWNpYWw9U1BFQ0lBTF9OT05FO3RoaXMuX3N0YXRlPUlOX0NMT1NJTkdfVEFHX05BTUU7dGhpcy5fc2VjdGlvblN0YXJ0PXRoaXMuX2luZGV4LTU7dGhpcy5faW5kZXgtLX1lbHNlIHRoaXMuX3N0YXRlPVRFWFR9O1Rva2VuaXplci5wcm90b3R5cGUuX3N0YXRlQmVmb3JlRW50aXR5PWlmRWxzZVN0YXRlKFwiI1wiLEJFRk9SRV9OVU1FUklDX0VOVElUWSxJTl9OQU1FRF9FTlRJVFkpO1Rva2VuaXplci5wcm90b3R5cGUuX3N0YXRlQmVmb3JlTnVtZXJpY0VudGl0eT1pZkVsc2VTdGF0ZShcIlhcIixJTl9IRVhfRU5USVRZLElOX05VTUVSSUNfRU5USVRZKTtUb2tlbml6ZXIucHJvdG90eXBlLl9wYXJzZU5hbWVkRW50aXR5U3RyaWN0PWZ1bmN0aW9uKCl7aWYodGhpcy5fc2VjdGlvblN0YXJ0KzE8dGhpcy5faW5kZXgpe3ZhciBlbnRpdHk9dGhpcy5fYnVmZmVyLnN1YnN0cmluZyh0aGlzLl9zZWN0aW9uU3RhcnQrMSx0aGlzLl9pbmRleCksbWFwPXRoaXMuX3htbE1vZGU/eG1sTWFwOmVudGl0eU1hcDtpZihtYXAuaGFzT3duUHJvcGVydHkoZW50aXR5KSl7dGhpcy5fZW1pdFBhcnRpYWwobWFwW2VudGl0eV0pO3RoaXMuX3NlY3Rpb25TdGFydD10aGlzLl9pbmRleCsxfX19O1Rva2VuaXplci5wcm90b3R5cGUuX3BhcnNlTGVnYWN5RW50aXR5PWZ1bmN0aW9uKCl7dmFyIHN0YXJ0PXRoaXMuX3NlY3Rpb25TdGFydCsxLGxpbWl0PXRoaXMuX2luZGV4LXN0YXJ0O2lmKGxpbWl0PjYpbGltaXQ9Njt3aGlsZShsaW1pdD49Mil7dmFyIGVudGl0eT10aGlzLl9idWZmZXIuc3Vic3RyKHN0YXJ0LGxpbWl0KTtpZihsZWdhY3lNYXAuaGFzT3duUHJvcGVydHkoZW50aXR5KSl7dGhpcy5fZW1pdFBhcnRpYWwobGVnYWN5TWFwW2VudGl0eV0pO3RoaXMuX3NlY3Rpb25TdGFydCs9bGltaXQrMTtyZXR1cm59ZWxzZXtsaW1pdC0tfX19O1Rva2VuaXplci5wcm90b3R5cGUuX3N0YXRlSW5OYW1lZEVudGl0eT1mdW5jdGlvbihjKXtpZihjPT09XCI7XCIpe3RoaXMuX3BhcnNlTmFtZWRFbnRpdHlTdHJpY3QoKTtpZih0aGlzLl9zZWN0aW9uU3RhcnQrMTx0aGlzLl9pbmRleCYmIXRoaXMuX3htbE1vZGUpe3RoaXMuX3BhcnNlTGVnYWN5RW50aXR5KCl9dGhpcy5fc3RhdGU9dGhpcy5fYmFzZVN0YXRlfWVsc2UgaWYoKGM8XCJhXCJ8fGM+XCJ6XCIpJiYoYzxcIkFcInx8Yz5cIlpcIikmJihjPFwiMFwifHxjPlwiOVwiKSl7aWYodGhpcy5feG1sTW9kZSk7ZWxzZSBpZih0aGlzLl9zZWN0aW9uU3RhcnQrMT09PXRoaXMuX2luZGV4KTtlbHNlIGlmKHRoaXMuX2Jhc2VTdGF0ZSE9PVRFWFQpe2lmKGMhPT1cIj1cIil7dGhpcy5fcGFyc2VOYW1lZEVudGl0eVN0cmljdCgpfX1lbHNle3RoaXMuX3BhcnNlTGVnYWN5RW50aXR5KCl9dGhpcy5fc3RhdGU9dGhpcy5fYmFzZVN0YXRlO3RoaXMuX2luZGV4LS19fTtUb2tlbml6ZXIucHJvdG90eXBlLl9kZWNvZGVOdW1lcmljRW50aXR5PWZ1bmN0aW9uKG9mZnNldCxiYXNlKXt2YXIgc2VjdGlvblN0YXJ0PXRoaXMuX3NlY3Rpb25TdGFydCtvZmZzZXQ7aWYoc2VjdGlvblN0YXJ0IT09dGhpcy5faW5kZXgpe3ZhciBlbnRpdHk9dGhpcy5fYnVmZmVyLnN1YnN0cmluZyhzZWN0aW9uU3RhcnQsdGhpcy5faW5kZXgpO3ZhciBwYXJzZWQ9cGFyc2VJbnQoZW50aXR5LGJhc2UpO3RoaXMuX2VtaXRQYXJ0aWFsKGRlY29kZUNvZGVQb2ludChwYXJzZWQpKTt0aGlzLl9zZWN0aW9uU3RhcnQ9dGhpcy5faW5kZXh9ZWxzZXt0aGlzLl9zZWN0aW9uU3RhcnQtLX10aGlzLl9zdGF0ZT10aGlzLl9iYXNlU3RhdGV9O1Rva2VuaXplci5wcm90b3R5cGUuX3N0YXRlSW5OdW1lcmljRW50aXR5PWZ1bmN0aW9uKGMpe2lmKGM9PT1cIjtcIil7dGhpcy5fZGVjb2RlTnVtZXJpY0VudGl0eSgyLDEwKTt0aGlzLl9zZWN0aW9uU3RhcnQrK31lbHNlIGlmKGM8XCIwXCJ8fGM+XCI5XCIpe2lmKCF0aGlzLl94bWxNb2RlKXt0aGlzLl9kZWNvZGVOdW1lcmljRW50aXR5KDIsMTApfWVsc2V7dGhpcy5fc3RhdGU9dGhpcy5fYmFzZVN0YXRlfXRoaXMuX2luZGV4LS19fTtUb2tlbml6ZXIucHJvdG90eXBlLl9zdGF0ZUluSGV4RW50aXR5PWZ1bmN0aW9uKGMpe2lmKGM9PT1cIjtcIil7dGhpcy5fZGVjb2RlTnVtZXJpY0VudGl0eSgzLDE2KTt0aGlzLl9zZWN0aW9uU3RhcnQrK31lbHNlIGlmKChjPFwiYVwifHxjPlwiZlwiKSYmKGM8XCJBXCJ8fGM+XCJGXCIpJiYoYzxcIjBcInx8Yz5cIjlcIikpe2lmKCF0aGlzLl94bWxNb2RlKXt0aGlzLl9kZWNvZGVOdW1lcmljRW50aXR5KDMsMTYpfWVsc2V7dGhpcy5fc3RhdGU9dGhpcy5fYmFzZVN0YXRlfXRoaXMuX2luZGV4LS19fTtUb2tlbml6ZXIucHJvdG90eXBlLl9jbGVhbnVwPWZ1bmN0aW9uKCl7aWYodGhpcy5fc2VjdGlvblN0YXJ0PDApe3RoaXMuX2J1ZmZlcj1cIlwiO3RoaXMuX2luZGV4PTA7dGhpcy5fYnVmZmVyT2Zmc2V0Kz10aGlzLl9pbmRleH1lbHNlIGlmKHRoaXMuX3J1bm5pbmcpe2lmKHRoaXMuX3N0YXRlPT09VEVYVCl7aWYodGhpcy5fc2VjdGlvblN0YXJ0IT09dGhpcy5faW5kZXgpe3RoaXMuX2Nicy5vbnRleHQodGhpcy5fYnVmZmVyLnN1YnN0cih0aGlzLl9zZWN0aW9uU3RhcnQpKX10aGlzLl9idWZmZXI9XCJcIjt0aGlzLl9idWZmZXJPZmZzZXQrPXRoaXMuX2luZGV4O3RoaXMuX2luZGV4PTB9ZWxzZSBpZih0aGlzLl9zZWN0aW9uU3RhcnQ9PT10aGlzLl9pbmRleCl7dGhpcy5fYnVmZmVyPVwiXCI7dGhpcy5fYnVmZmVyT2Zmc2V0Kz10aGlzLl9pbmRleDt0aGlzLl9pbmRleD0wfWVsc2V7dGhpcy5fYnVmZmVyPXRoaXMuX2J1ZmZlci5zdWJzdHIodGhpcy5fc2VjdGlvblN0YXJ0KTt0aGlzLl9pbmRleC09dGhpcy5fc2VjdGlvblN0YXJ0O3RoaXMuX2J1ZmZlck9mZnNldCs9dGhpcy5fc2VjdGlvblN0YXJ0fXRoaXMuX3NlY3Rpb25TdGFydD0wfX07VG9rZW5pemVyLnByb3RvdHlwZS53cml0ZT1mdW5jdGlvbihjaHVuayl7aWYodGhpcy5fZW5kZWQpdGhpcy5fY2JzLm9uZXJyb3IoRXJyb3IoXCIud3JpdGUoKSBhZnRlciBkb25lIVwiKSk7dGhpcy5fYnVmZmVyKz1jaHVuazt0aGlzLl9wYXJzZSgpfTtUb2tlbml6ZXIucHJvdG90eXBlLl9wYXJzZT1mdW5jdGlvbigpe3doaWxlKHRoaXMuX2luZGV4PHRoaXMuX2J1ZmZlci5sZW5ndGgmJnRoaXMuX3J1bm5pbmcpe3ZhciBjPXRoaXMuX2J1ZmZlci5jaGFyQXQodGhpcy5faW5kZXgpO2lmKHRoaXMuX3N0YXRlPT09VEVYVCl7dGhpcy5fc3RhdGVUZXh0KGMpfWVsc2UgaWYodGhpcy5fc3RhdGU9PT1CRUZPUkVfVEFHX05BTUUpe3RoaXMuX3N0YXRlQmVmb3JlVGFnTmFtZShjKX1lbHNlIGlmKHRoaXMuX3N0YXRlPT09SU5fVEFHX05BTUUpe3RoaXMuX3N0YXRlSW5UYWdOYW1lKGMpfWVsc2UgaWYodGhpcy5fc3RhdGU9PT1CRUZPUkVfQ0xPU0lOR19UQUdfTkFNRSl7dGhpcy5fc3RhdGVCZWZvcmVDbG9zZWluZ1RhZ05hbWUoYyl9ZWxzZSBpZih0aGlzLl9zdGF0ZT09PUlOX0NMT1NJTkdfVEFHX05BTUUpe3RoaXMuX3N0YXRlSW5DbG9zZWluZ1RhZ05hbWUoYyl9ZWxzZSBpZih0aGlzLl9zdGF0ZT09PUFGVEVSX0NMT1NJTkdfVEFHX05BTUUpe3RoaXMuX3N0YXRlQWZ0ZXJDbG9zZWluZ1RhZ05hbWUoYyl9ZWxzZSBpZih0aGlzLl9zdGF0ZT09PUlOX1NFTEZfQ0xPU0lOR19UQUcpe3RoaXMuX3N0YXRlSW5TZWxmQ2xvc2luZ1RhZyhjKX1lbHNlIGlmKHRoaXMuX3N0YXRlPT09QkVGT1JFX0FUVFJJQlVURV9OQU1FKXt0aGlzLl9zdGF0ZUJlZm9yZUF0dHJpYnV0ZU5hbWUoYyl9ZWxzZSBpZih0aGlzLl9zdGF0ZT09PUlOX0FUVFJJQlVURV9OQU1FKXt0aGlzLl9zdGF0ZUluQXR0cmlidXRlTmFtZShjKX1lbHNlIGlmKHRoaXMuX3N0YXRlPT09QUZURVJfQVRUUklCVVRFX05BTUUpe3RoaXMuX3N0YXRlQWZ0ZXJBdHRyaWJ1dGVOYW1lKGMpfWVsc2UgaWYodGhpcy5fc3RhdGU9PT1CRUZPUkVfQVRUUklCVVRFX1ZBTFVFKXt0aGlzLl9zdGF0ZUJlZm9yZUF0dHJpYnV0ZVZhbHVlKGMpfWVsc2UgaWYodGhpcy5fc3RhdGU9PT1JTl9BVFRSSUJVVEVfVkFMVUVfRFEpe3RoaXMuX3N0YXRlSW5BdHRyaWJ1dGVWYWx1ZURvdWJsZVF1b3RlcyhjKX1lbHNlIGlmKHRoaXMuX3N0YXRlPT09SU5fQVRUUklCVVRFX1ZBTFVFX1NRKXt0aGlzLl9zdGF0ZUluQXR0cmlidXRlVmFsdWVTaW5nbGVRdW90ZXMoYyl9ZWxzZSBpZih0aGlzLl9zdGF0ZT09PUlOX0FUVFJJQlVURV9WQUxVRV9OUSl7dGhpcy5fc3RhdGVJbkF0dHJpYnV0ZVZhbHVlTm9RdW90ZXMoYyl9ZWxzZSBpZih0aGlzLl9zdGF0ZT09PUJFRk9SRV9ERUNMQVJBVElPTil7dGhpcy5fc3RhdGVCZWZvcmVEZWNsYXJhdGlvbihjKX1lbHNlIGlmKHRoaXMuX3N0YXRlPT09SU5fREVDTEFSQVRJT04pe3RoaXMuX3N0YXRlSW5EZWNsYXJhdGlvbihjKX1lbHNlIGlmKHRoaXMuX3N0YXRlPT09SU5fUFJPQ0VTU0lOR19JTlNUUlVDVElPTil7dGhpcy5fc3RhdGVJblByb2Nlc3NpbmdJbnN0cnVjdGlvbihjKX1lbHNlIGlmKHRoaXMuX3N0YXRlPT09QkVGT1JFX0NPTU1FTlQpe3RoaXMuX3N0YXRlQmVmb3JlQ29tbWVudChjKX1lbHNlIGlmKHRoaXMuX3N0YXRlPT09SU5fQ09NTUVOVCl7dGhpcy5fc3RhdGVJbkNvbW1lbnQoYyl9ZWxzZSBpZih0aGlzLl9zdGF0ZT09PUFGVEVSX0NPTU1FTlRfMSl7dGhpcy5fc3RhdGVBZnRlckNvbW1lbnQxKGMpfWVsc2UgaWYodGhpcy5fc3RhdGU9PT1BRlRFUl9DT01NRU5UXzIpe3RoaXMuX3N0YXRlQWZ0ZXJDb21tZW50MihjKX1lbHNlIGlmKHRoaXMuX3N0YXRlPT09QkVGT1JFX0NEQVRBXzEpe3RoaXMuX3N0YXRlQmVmb3JlQ2RhdGExKGMpfWVsc2UgaWYodGhpcy5fc3RhdGU9PT1CRUZPUkVfQ0RBVEFfMil7dGhpcy5fc3RhdGVCZWZvcmVDZGF0YTIoYyl9ZWxzZSBpZih0aGlzLl9zdGF0ZT09PUJFRk9SRV9DREFUQV8zKXt0aGlzLl9zdGF0ZUJlZm9yZUNkYXRhMyhjKX1lbHNlIGlmKHRoaXMuX3N0YXRlPT09QkVGT1JFX0NEQVRBXzQpe3RoaXMuX3N0YXRlQmVmb3JlQ2RhdGE0KGMpfWVsc2UgaWYodGhpcy5fc3RhdGU9PT1CRUZPUkVfQ0RBVEFfNSl7dGhpcy5fc3RhdGVCZWZvcmVDZGF0YTUoYyl9ZWxzZSBpZih0aGlzLl9zdGF0ZT09PUJFRk9SRV9DREFUQV82KXt0aGlzLl9zdGF0ZUJlZm9yZUNkYXRhNihjKX1lbHNlIGlmKHRoaXMuX3N0YXRlPT09SU5fQ0RBVEEpe3RoaXMuX3N0YXRlSW5DZGF0YShjKX1lbHNlIGlmKHRoaXMuX3N0YXRlPT09QUZURVJfQ0RBVEFfMSl7dGhpcy5fc3RhdGVBZnRlckNkYXRhMShjKX1lbHNlIGlmKHRoaXMuX3N0YXRlPT09QUZURVJfQ0RBVEFfMil7dGhpcy5fc3RhdGVBZnRlckNkYXRhMihjKX1lbHNlIGlmKHRoaXMuX3N0YXRlPT09QkVGT1JFX1NQRUNJQUwpe3RoaXMuX3N0YXRlQmVmb3JlU3BlY2lhbChjKX1lbHNlIGlmKHRoaXMuX3N0YXRlPT09QkVGT1JFX1NQRUNJQUxfRU5EKXt0aGlzLl9zdGF0ZUJlZm9yZVNwZWNpYWxFbmQoYyl9ZWxzZSBpZih0aGlzLl9zdGF0ZT09PUJFRk9SRV9TQ1JJUFRfMSl7dGhpcy5fc3RhdGVCZWZvcmVTY3JpcHQxKGMpfWVsc2UgaWYodGhpcy5fc3RhdGU9PT1CRUZPUkVfU0NSSVBUXzIpe3RoaXMuX3N0YXRlQmVmb3JlU2NyaXB0MihjKX1lbHNlIGlmKHRoaXMuX3N0YXRlPT09QkVGT1JFX1NDUklQVF8zKXt0aGlzLl9zdGF0ZUJlZm9yZVNjcmlwdDMoYyl9ZWxzZSBpZih0aGlzLl9zdGF0ZT09PUJFRk9SRV9TQ1JJUFRfNCl7dGhpcy5fc3RhdGVCZWZvcmVTY3JpcHQ0KGMpfWVsc2UgaWYodGhpcy5fc3RhdGU9PT1CRUZPUkVfU0NSSVBUXzUpe3RoaXMuX3N0YXRlQmVmb3JlU2NyaXB0NShjKX1lbHNlIGlmKHRoaXMuX3N0YXRlPT09QUZURVJfU0NSSVBUXzEpe3RoaXMuX3N0YXRlQWZ0ZXJTY3JpcHQxKGMpfWVsc2UgaWYodGhpcy5fc3RhdGU9PT1BRlRFUl9TQ1JJUFRfMil7dGhpcy5fc3RhdGVBZnRlclNjcmlwdDIoYyl9ZWxzZSBpZih0aGlzLl9zdGF0ZT09PUFGVEVSX1NDUklQVF8zKXt0aGlzLl9zdGF0ZUFmdGVyU2NyaXB0MyhjKX1lbHNlIGlmKHRoaXMuX3N0YXRlPT09QUZURVJfU0NSSVBUXzQpe3RoaXMuX3N0YXRlQWZ0ZXJTY3JpcHQ0KGMpfWVsc2UgaWYodGhpcy5fc3RhdGU9PT1BRlRFUl9TQ1JJUFRfNSl7dGhpcy5fc3RhdGVBZnRlclNjcmlwdDUoYyl9ZWxzZSBpZih0aGlzLl9zdGF0ZT09PUJFRk9SRV9TVFlMRV8xKXt0aGlzLl9zdGF0ZUJlZm9yZVN0eWxlMShjKX1lbHNlIGlmKHRoaXMuX3N0YXRlPT09QkVGT1JFX1NUWUxFXzIpe3RoaXMuX3N0YXRlQmVmb3JlU3R5bGUyKGMpfWVsc2UgaWYodGhpcy5fc3RhdGU9PT1CRUZPUkVfU1RZTEVfMyl7dGhpcy5fc3RhdGVCZWZvcmVTdHlsZTMoYyl9ZWxzZSBpZih0aGlzLl9zdGF0ZT09PUJFRk9SRV9TVFlMRV80KXt0aGlzLl9zdGF0ZUJlZm9yZVN0eWxlNChjKX1lbHNlIGlmKHRoaXMuX3N0YXRlPT09QUZURVJfU1RZTEVfMSl7dGhpcy5fc3RhdGVBZnRlclN0eWxlMShjKX1lbHNlIGlmKHRoaXMuX3N0YXRlPT09QUZURVJfU1RZTEVfMil7dGhpcy5fc3RhdGVBZnRlclN0eWxlMihjKX1lbHNlIGlmKHRoaXMuX3N0YXRlPT09QUZURVJfU1RZTEVfMyl7dGhpcy5fc3RhdGVBZnRlclN0eWxlMyhjKX1lbHNlIGlmKHRoaXMuX3N0YXRlPT09QUZURVJfU1RZTEVfNCl7dGhpcy5fc3RhdGVBZnRlclN0eWxlNChjKX1lbHNlIGlmKHRoaXMuX3N0YXRlPT09QkVGT1JFX0VOVElUWSl7dGhpcy5fc3RhdGVCZWZvcmVFbnRpdHkoYyl9ZWxzZSBpZih0aGlzLl9zdGF0ZT09PUJFRk9SRV9OVU1FUklDX0VOVElUWSl7dGhpcy5fc3RhdGVCZWZvcmVOdW1lcmljRW50aXR5KGMpfWVsc2UgaWYodGhpcy5fc3RhdGU9PT1JTl9OQU1FRF9FTlRJVFkpe3RoaXMuX3N0YXRlSW5OYW1lZEVudGl0eShjKX1lbHNlIGlmKHRoaXMuX3N0YXRlPT09SU5fTlVNRVJJQ19FTlRJVFkpe3RoaXMuX3N0YXRlSW5OdW1lcmljRW50aXR5KGMpfWVsc2UgaWYodGhpcy5fc3RhdGU9PT1JTl9IRVhfRU5USVRZKXt0aGlzLl9zdGF0ZUluSGV4RW50aXR5KGMpfWVsc2V7dGhpcy5fY2JzLm9uZXJyb3IoRXJyb3IoXCJ1bmtub3duIF9zdGF0ZVwiKSx0aGlzLl9zdGF0ZSl9dGhpcy5faW5kZXgrK310aGlzLl9jbGVhbnVwKCl9O1Rva2VuaXplci5wcm90b3R5cGUucGF1c2U9ZnVuY3Rpb24oKXt0aGlzLl9ydW5uaW5nPWZhbHNlfTtUb2tlbml6ZXIucHJvdG90eXBlLnJlc3VtZT1mdW5jdGlvbigpe3RoaXMuX3J1bm5pbmc9dHJ1ZTtpZih0aGlzLl9pbmRleDx0aGlzLl9idWZmZXIubGVuZ3RoKXt0aGlzLl9wYXJzZSgpfWlmKHRoaXMuX2VuZGVkKXt0aGlzLl9maW5pc2goKX19O1Rva2VuaXplci5wcm90b3R5cGUuZW5kPWZ1bmN0aW9uKGNodW5rKXtpZih0aGlzLl9lbmRlZCl0aGlzLl9jYnMub25lcnJvcihFcnJvcihcIi5lbmQoKSBhZnRlciBkb25lIVwiKSk7aWYoY2h1bmspdGhpcy53cml0ZShjaHVuayk7dGhpcy5fZW5kZWQ9dHJ1ZTtpZih0aGlzLl9ydW5uaW5nKXRoaXMuX2ZpbmlzaCgpfTtUb2tlbml6ZXIucHJvdG90eXBlLl9maW5pc2g9ZnVuY3Rpb24oKXtpZih0aGlzLl9zZWN0aW9uU3RhcnQ8dGhpcy5faW5kZXgpe3RoaXMuX2hhbmRsZVRyYWlsaW5nRGF0YSgpfXRoaXMuX2Nicy5vbmVuZCgpfTtUb2tlbml6ZXIucHJvdG90eXBlLl9oYW5kbGVUcmFpbGluZ0RhdGE9ZnVuY3Rpb24oKXt2YXIgZGF0YT10aGlzLl9idWZmZXIuc3Vic3RyKHRoaXMuX3NlY3Rpb25TdGFydCk7aWYodGhpcy5fc3RhdGU9PT1JTl9DREFUQXx8dGhpcy5fc3RhdGU9PT1BRlRFUl9DREFUQV8xfHx0aGlzLl9zdGF0ZT09PUFGVEVSX0NEQVRBXzIpe3RoaXMuX2Nicy5vbmNkYXRhKGRhdGEpfWVsc2UgaWYodGhpcy5fc3RhdGU9PT1JTl9DT01NRU5UfHx0aGlzLl9zdGF0ZT09PUFGVEVSX0NPTU1FTlRfMXx8dGhpcy5fc3RhdGU9PT1BRlRFUl9DT01NRU5UXzIpe3RoaXMuX2Nicy5vbmNvbW1lbnQoZGF0YSl9ZWxzZSBpZih0aGlzLl9zdGF0ZT09PUlOX05BTUVEX0VOVElUWSYmIXRoaXMuX3htbE1vZGUpe3RoaXMuX3BhcnNlTGVnYWN5RW50aXR5KCk7aWYodGhpcy5fc2VjdGlvblN0YXJ0PHRoaXMuX2luZGV4KXt0aGlzLl9zdGF0ZT10aGlzLl9iYXNlU3RhdGU7dGhpcy5faGFuZGxlVHJhaWxpbmdEYXRhKCl9fWVsc2UgaWYodGhpcy5fc3RhdGU9PT1JTl9OVU1FUklDX0VOVElUWSYmIXRoaXMuX3htbE1vZGUpe3RoaXMuX2RlY29kZU51bWVyaWNFbnRpdHkoMiwxMCk7aWYodGhpcy5fc2VjdGlvblN0YXJ0PHRoaXMuX2luZGV4KXt0aGlzLl9zdGF0ZT10aGlzLl9iYXNlU3RhdGU7dGhpcy5faGFuZGxlVHJhaWxpbmdEYXRhKCl9fWVsc2UgaWYodGhpcy5fc3RhdGU9PT1JTl9IRVhfRU5USVRZJiYhdGhpcy5feG1sTW9kZSl7dGhpcy5fZGVjb2RlTnVtZXJpY0VudGl0eSgzLDE2KTtpZih0aGlzLl9zZWN0aW9uU3RhcnQ8dGhpcy5faW5kZXgpe3RoaXMuX3N0YXRlPXRoaXMuX2Jhc2VTdGF0ZTt0aGlzLl9oYW5kbGVUcmFpbGluZ0RhdGEoKX19ZWxzZSBpZih0aGlzLl9zdGF0ZSE9PUlOX1RBR19OQU1FJiZ0aGlzLl9zdGF0ZSE9PUJFRk9SRV9BVFRSSUJVVEVfTkFNRSYmdGhpcy5fc3RhdGUhPT1CRUZPUkVfQVRUUklCVVRFX1ZBTFVFJiZ0aGlzLl9zdGF0ZSE9PUFGVEVSX0FUVFJJQlVURV9OQU1FJiZ0aGlzLl9zdGF0ZSE9PUlOX0FUVFJJQlVURV9OQU1FJiZ0aGlzLl9zdGF0ZSE9PUlOX0FUVFJJQlVURV9WQUxVRV9TUSYmdGhpcy5fc3RhdGUhPT1JTl9BVFRSSUJVVEVfVkFMVUVfRFEmJnRoaXMuX3N0YXRlIT09SU5fQVRUUklCVVRFX1ZBTFVFX05RJiZ0aGlzLl9zdGF0ZSE9PUlOX0NMT1NJTkdfVEFHX05BTUUpe1xudGhpcy5fY2JzLm9udGV4dChkYXRhKX19O1Rva2VuaXplci5wcm90b3R5cGUucmVzZXQ9ZnVuY3Rpb24oKXtUb2tlbml6ZXIuY2FsbCh0aGlzLHt4bWxNb2RlOnRoaXMuX3htbE1vZGUsZGVjb2RlRW50aXRpZXM6dGhpcy5fZGVjb2RlRW50aXRpZXN9LHRoaXMuX2Nicyl9O1Rva2VuaXplci5wcm90b3R5cGUuZ2V0QWJzb2x1dGVJbmRleD1mdW5jdGlvbigpe3JldHVybiB0aGlzLl9idWZmZXJPZmZzZXQrdGhpcy5faW5kZXh9O1Rva2VuaXplci5wcm90b3R5cGUuX2dldFNlY3Rpb249ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5fYnVmZmVyLnN1YnN0cmluZyh0aGlzLl9zZWN0aW9uU3RhcnQsdGhpcy5faW5kZXgpfTtUb2tlbml6ZXIucHJvdG90eXBlLl9lbWl0VG9rZW49ZnVuY3Rpb24obmFtZSl7dGhpcy5fY2JzW25hbWVdKHRoaXMuX2dldFNlY3Rpb24oKSk7dGhpcy5fc2VjdGlvblN0YXJ0PS0xfTtUb2tlbml6ZXIucHJvdG90eXBlLl9lbWl0UGFydGlhbD1mdW5jdGlvbih2YWx1ZSl7aWYodGhpcy5fYmFzZVN0YXRlIT09VEVYVCl7dGhpcy5fY2JzLm9uYXR0cmliZGF0YSh2YWx1ZSl9ZWxzZXt0aGlzLl9jYnMub250ZXh0KHZhbHVlKX19fSx7XCJlbnRpdGllcy9saWIvZGVjb2RlX2NvZGVwb2ludC5qc1wiOjIyLFwiZW50aXRpZXMvbWFwcy9lbnRpdGllcy5qc29uXCI6MjUsXCJlbnRpdGllcy9tYXBzL2xlZ2FjeS5qc29uXCI6MjYsXCJlbnRpdGllcy9tYXBzL3htbC5qc29uXCI6Mjd9XSwzNTpbZnVuY3Rpb24ocmVxdWlyZSxtb2R1bGUsZXhwb3J0cyl7bW9kdWxlLmV4cG9ydHM9U3RyZWFtO3ZhciBQYXJzZXI9cmVxdWlyZShcIi4vUGFyc2VyLmpzXCIpLFdyaXRhYmxlU3RyZWFtPXJlcXVpcmUoXCJzdHJlYW1cIikuV3JpdGFibGV8fHJlcXVpcmUoXCJyZWFkYWJsZS1zdHJlYW1cIikuV3JpdGFibGUsU3RyaW5nRGVjb2Rlcj1yZXF1aXJlKFwic3RyaW5nX2RlY29kZXJcIikuU3RyaW5nRGVjb2RlcixCdWZmZXI9cmVxdWlyZShcImJ1ZmZlclwiKS5CdWZmZXI7ZnVuY3Rpb24gU3RyZWFtKGNicyxvcHRpb25zKXt2YXIgcGFyc2VyPXRoaXMuX3BhcnNlcj1uZXcgUGFyc2VyKGNicyxvcHRpb25zKTt2YXIgZGVjb2Rlcj10aGlzLl9kZWNvZGVyPW5ldyBTdHJpbmdEZWNvZGVyO1dyaXRhYmxlU3RyZWFtLmNhbGwodGhpcyx7ZGVjb2RlU3RyaW5nczpmYWxzZX0pO3RoaXMub25jZShcImZpbmlzaFwiLGZ1bmN0aW9uKCl7cGFyc2VyLmVuZChkZWNvZGVyLmVuZCgpKX0pfXJlcXVpcmUoXCJpbmhlcml0c1wiKShTdHJlYW0sV3JpdGFibGVTdHJlYW0pO1dyaXRhYmxlU3RyZWFtLnByb3RvdHlwZS5fd3JpdGU9ZnVuY3Rpb24oY2h1bmssZW5jb2RpbmcsY2Ipe2lmKGNodW5rIGluc3RhbmNlb2YgQnVmZmVyKWNodW5rPXRoaXMuX2RlY29kZXIud3JpdGUoY2h1bmspO3RoaXMuX3BhcnNlci53cml0ZShjaHVuayk7Y2IoKX19LHtcIi4vUGFyc2VyLmpzXCI6MzEsYnVmZmVyOjUsaW5oZXJpdHM6MzgsXCJyZWFkYWJsZS1zdHJlYW1cIjozLHN0cmVhbTo1NSxzdHJpbmdfZGVjb2Rlcjo1Nn1dLDM2OltmdW5jdGlvbihyZXF1aXJlLG1vZHVsZSxleHBvcnRzKXt2YXIgUGFyc2VyPXJlcXVpcmUoXCIuL1BhcnNlci5qc1wiKSxEb21IYW5kbGVyPXJlcXVpcmUoXCJkb21oYW5kbGVyXCIpO2Z1bmN0aW9uIGRlZmluZVByb3AobmFtZSx2YWx1ZSl7ZGVsZXRlIG1vZHVsZS5leHBvcnRzW25hbWVdO21vZHVsZS5leHBvcnRzW25hbWVdPXZhbHVlO3JldHVybiB2YWx1ZX1tb2R1bGUuZXhwb3J0cz17UGFyc2VyOlBhcnNlcixUb2tlbml6ZXI6cmVxdWlyZShcIi4vVG9rZW5pemVyLmpzXCIpLEVsZW1lbnRUeXBlOnJlcXVpcmUoXCJkb21lbGVtZW50dHlwZVwiKSxEb21IYW5kbGVyOkRvbUhhbmRsZXIsZ2V0IEZlZWRIYW5kbGVyKCl7cmV0dXJuIGRlZmluZVByb3AoXCJGZWVkSGFuZGxlclwiLHJlcXVpcmUoXCIuL0ZlZWRIYW5kbGVyLmpzXCIpKX0sZ2V0IFN0cmVhbSgpe3JldHVybiBkZWZpbmVQcm9wKFwiU3RyZWFtXCIscmVxdWlyZShcIi4vU3RyZWFtLmpzXCIpKX0sZ2V0IFdyaXRhYmxlU3RyZWFtKCl7cmV0dXJuIGRlZmluZVByb3AoXCJXcml0YWJsZVN0cmVhbVwiLHJlcXVpcmUoXCIuL1dyaXRhYmxlU3RyZWFtLmpzXCIpKX0sZ2V0IFByb3h5SGFuZGxlcigpe3JldHVybiBkZWZpbmVQcm9wKFwiUHJveHlIYW5kbGVyXCIscmVxdWlyZShcIi4vUHJveHlIYW5kbGVyLmpzXCIpKX0sZ2V0IERvbVV0aWxzKCl7cmV0dXJuIGRlZmluZVByb3AoXCJEb21VdGlsc1wiLHJlcXVpcmUoXCJkb211dGlsc1wiKSl9LGdldCBDb2xsZWN0aW5nSGFuZGxlcigpe3JldHVybiBkZWZpbmVQcm9wKFwiQ29sbGVjdGluZ0hhbmRsZXJcIixyZXF1aXJlKFwiLi9Db2xsZWN0aW5nSGFuZGxlci5qc1wiKSl9LERlZmF1bHRIYW5kbGVyOkRvbUhhbmRsZXIsZ2V0IFJzc0hhbmRsZXIoKXtyZXR1cm4gZGVmaW5lUHJvcChcIlJzc0hhbmRsZXJcIix0aGlzLkZlZWRIYW5kbGVyKX0scGFyc2VET006ZnVuY3Rpb24oZGF0YSxvcHRpb25zKXt2YXIgaGFuZGxlcj1uZXcgRG9tSGFuZGxlcihvcHRpb25zKTtuZXcgUGFyc2VyKGhhbmRsZXIsb3B0aW9ucykuZW5kKGRhdGEpO3JldHVybiBoYW5kbGVyLmRvbX0scGFyc2VGZWVkOmZ1bmN0aW9uKGZlZWQsb3B0aW9ucyl7dmFyIGhhbmRsZXI9bmV3IG1vZHVsZS5leHBvcnRzLkZlZWRIYW5kbGVyKG9wdGlvbnMpO25ldyBQYXJzZXIoaGFuZGxlcixvcHRpb25zKS5lbmQoZmVlZCk7cmV0dXJuIGhhbmRsZXIuZG9tfSxjcmVhdGVEb21TdHJlYW06ZnVuY3Rpb24oY2Isb3B0aW9ucyxlbGVtZW50Q2Ipe3ZhciBoYW5kbGVyPW5ldyBEb21IYW5kbGVyKGNiLG9wdGlvbnMsZWxlbWVudENiKTtyZXR1cm4gbmV3IFBhcnNlcihoYW5kbGVyLG9wdGlvbnMpfSxFVkVOVFM6e2F0dHJpYnV0ZToyLGNkYXRhc3RhcnQ6MCxjZGF0YWVuZDowLHRleHQ6MSxwcm9jZXNzaW5naW5zdHJ1Y3Rpb246Mixjb21tZW50OjEsY29tbWVudGVuZDowLGNsb3NldGFnOjEsb3BlbnRhZzoyLG9wZW50YWduYW1lOjEsZXJyb3I6MSxlbmQ6MH19fSx7XCIuL0NvbGxlY3RpbmdIYW5kbGVyLmpzXCI6MjksXCIuL0ZlZWRIYW5kbGVyLmpzXCI6MzAsXCIuL1BhcnNlci5qc1wiOjMxLFwiLi9Qcm94eUhhbmRsZXIuanNcIjozMixcIi4vU3RyZWFtLmpzXCI6MzMsXCIuL1Rva2VuaXplci5qc1wiOjM0LFwiLi9Xcml0YWJsZVN0cmVhbS5qc1wiOjM1LGRvbWVsZW1lbnR0eXBlOjksZG9taGFuZGxlcjoxMCxkb211dGlsczoxM31dLDM3OltmdW5jdGlvbihyZXF1aXJlLG1vZHVsZSxleHBvcnRzKXtleHBvcnRzLnJlYWQ9ZnVuY3Rpb24oYnVmZmVyLG9mZnNldCxpc0xFLG1MZW4sbkJ5dGVzKXt2YXIgZSxtO3ZhciBlTGVuPW5CeXRlcyo4LW1MZW4tMTt2YXIgZU1heD0oMTw8ZUxlbiktMTt2YXIgZUJpYXM9ZU1heD4+MTt2YXIgbkJpdHM9LTc7dmFyIGk9aXNMRT9uQnl0ZXMtMTowO3ZhciBkPWlzTEU/LTE6MTt2YXIgcz1idWZmZXJbb2Zmc2V0K2ldO2krPWQ7ZT1zJigxPDwtbkJpdHMpLTE7cz4+PS1uQml0cztuQml0cys9ZUxlbjtmb3IoO25CaXRzPjA7ZT1lKjI1NitidWZmZXJbb2Zmc2V0K2ldLGkrPWQsbkJpdHMtPTgpe31tPWUmKDE8PC1uQml0cyktMTtlPj49LW5CaXRzO25CaXRzKz1tTGVuO2Zvcig7bkJpdHM+MDttPW0qMjU2K2J1ZmZlcltvZmZzZXQraV0saSs9ZCxuQml0cy09OCl7fWlmKGU9PT0wKXtlPTEtZUJpYXN9ZWxzZSBpZihlPT09ZU1heCl7cmV0dXJuIG0/TmFOOihzPy0xOjEpKkluZmluaXR5fWVsc2V7bT1tK01hdGgucG93KDIsbUxlbik7ZT1lLWVCaWFzfXJldHVybihzPy0xOjEpKm0qTWF0aC5wb3coMixlLW1MZW4pfTtleHBvcnRzLndyaXRlPWZ1bmN0aW9uKGJ1ZmZlcix2YWx1ZSxvZmZzZXQsaXNMRSxtTGVuLG5CeXRlcyl7dmFyIGUsbSxjO3ZhciBlTGVuPW5CeXRlcyo4LW1MZW4tMTt2YXIgZU1heD0oMTw8ZUxlbiktMTt2YXIgZUJpYXM9ZU1heD4+MTt2YXIgcnQ9bUxlbj09PTIzP01hdGgucG93KDIsLTI0KS1NYXRoLnBvdygyLC03Nyk6MDt2YXIgaT1pc0xFPzA6bkJ5dGVzLTE7dmFyIGQ9aXNMRT8xOi0xO3ZhciBzPXZhbHVlPDB8fHZhbHVlPT09MCYmMS92YWx1ZTwwPzE6MDt2YWx1ZT1NYXRoLmFicyh2YWx1ZSk7aWYoaXNOYU4odmFsdWUpfHx2YWx1ZT09PUluZmluaXR5KXttPWlzTmFOKHZhbHVlKT8xOjA7ZT1lTWF4fWVsc2V7ZT1NYXRoLmZsb29yKE1hdGgubG9nKHZhbHVlKS9NYXRoLkxOMik7aWYodmFsdWUqKGM9TWF0aC5wb3coMiwtZSkpPDEpe2UtLTtjKj0yfWlmKGUrZUJpYXM+PTEpe3ZhbHVlKz1ydC9jfWVsc2V7dmFsdWUrPXJ0Kk1hdGgucG93KDIsMS1lQmlhcyl9aWYodmFsdWUqYz49Mil7ZSsrO2MvPTJ9aWYoZStlQmlhcz49ZU1heCl7bT0wO2U9ZU1heH1lbHNlIGlmKGUrZUJpYXM+PTEpe209KHZhbHVlKmMtMSkqTWF0aC5wb3coMixtTGVuKTtlPWUrZUJpYXN9ZWxzZXttPXZhbHVlKk1hdGgucG93KDIsZUJpYXMtMSkqTWF0aC5wb3coMixtTGVuKTtlPTB9fWZvcig7bUxlbj49ODtidWZmZXJbb2Zmc2V0K2ldPW0mMjU1LGkrPWQsbS89MjU2LG1MZW4tPTgpe31lPWU8PG1MZW58bTtlTGVuKz1tTGVuO2Zvcig7ZUxlbj4wO2J1ZmZlcltvZmZzZXQraV09ZSYyNTUsaSs9ZCxlLz0yNTYsZUxlbi09OCl7fWJ1ZmZlcltvZmZzZXQraS1kXXw9cyoxMjh9fSx7fV0sMzg6W2Z1bmN0aW9uKHJlcXVpcmUsbW9kdWxlLGV4cG9ydHMpe2lmKHR5cGVvZiBPYmplY3QuY3JlYXRlPT09XCJmdW5jdGlvblwiKXttb2R1bGUuZXhwb3J0cz1mdW5jdGlvbiBpbmhlcml0cyhjdG9yLHN1cGVyQ3Rvcil7Y3Rvci5zdXBlcl89c3VwZXJDdG9yO2N0b3IucHJvdG90eXBlPU9iamVjdC5jcmVhdGUoc3VwZXJDdG9yLnByb3RvdHlwZSx7Y29uc3RydWN0b3I6e3ZhbHVlOmN0b3IsZW51bWVyYWJsZTpmYWxzZSx3cml0YWJsZTp0cnVlLGNvbmZpZ3VyYWJsZTp0cnVlfX0pfX1lbHNle21vZHVsZS5leHBvcnRzPWZ1bmN0aW9uIGluaGVyaXRzKGN0b3Isc3VwZXJDdG9yKXtjdG9yLnN1cGVyXz1zdXBlckN0b3I7dmFyIFRlbXBDdG9yPWZ1bmN0aW9uKCl7fTtUZW1wQ3Rvci5wcm90b3R5cGU9c3VwZXJDdG9yLnByb3RvdHlwZTtjdG9yLnByb3RvdHlwZT1uZXcgVGVtcEN0b3I7Y3Rvci5wcm90b3R5cGUuY29uc3RydWN0b3I9Y3Rvcn19fSx7fV0sMzk6W2Z1bmN0aW9uKHJlcXVpcmUsbW9kdWxlLGV4cG9ydHMpe21vZHVsZS5leHBvcnRzPWZ1bmN0aW9uKG9iail7cmV0dXJuIG9iaiE9bnVsbCYmKGlzQnVmZmVyKG9iail8fGlzU2xvd0J1ZmZlcihvYmopfHwhIW9iai5faXNCdWZmZXIpfTtmdW5jdGlvbiBpc0J1ZmZlcihvYmope3JldHVybiEhb2JqLmNvbnN0cnVjdG9yJiZ0eXBlb2Ygb2JqLmNvbnN0cnVjdG9yLmlzQnVmZmVyPT09XCJmdW5jdGlvblwiJiZvYmouY29uc3RydWN0b3IuaXNCdWZmZXIob2JqKX1mdW5jdGlvbiBpc1Nsb3dCdWZmZXIob2JqKXtyZXR1cm4gdHlwZW9mIG9iai5yZWFkRmxvYXRMRT09PVwiZnVuY3Rpb25cIiYmdHlwZW9mIG9iai5zbGljZT09PVwiZnVuY3Rpb25cIiYmaXNCdWZmZXIob2JqLnNsaWNlKDAsMCkpfX0se31dLDQwOltmdW5jdGlvbihyZXF1aXJlLG1vZHVsZSxleHBvcnRzKXt2YXIgdG9TdHJpbmc9e30udG9TdHJpbmc7bW9kdWxlLmV4cG9ydHM9QXJyYXkuaXNBcnJheXx8ZnVuY3Rpb24oYXJyKXtyZXR1cm4gdG9TdHJpbmcuY2FsbChhcnIpPT1cIltvYmplY3QgQXJyYXldXCJ9fSx7fV0sNDE6W2Z1bmN0aW9uKHJlcXVpcmUsbW9kdWxlLGV4cG9ydHMpeyhmdW5jdGlvbihwcm9jZXNzKXtcInVzZSBzdHJpY3RcIjtpZighcHJvY2Vzcy52ZXJzaW9ufHxwcm9jZXNzLnZlcnNpb24uaW5kZXhPZihcInYwLlwiKT09PTB8fHByb2Nlc3MudmVyc2lvbi5pbmRleE9mKFwidjEuXCIpPT09MCYmcHJvY2Vzcy52ZXJzaW9uLmluZGV4T2YoXCJ2MS44LlwiKSE9PTApe21vZHVsZS5leHBvcnRzPW5leHRUaWNrfWVsc2V7bW9kdWxlLmV4cG9ydHM9cHJvY2Vzcy5uZXh0VGlja31mdW5jdGlvbiBuZXh0VGljayhmbixhcmcxLGFyZzIsYXJnMyl7aWYodHlwZW9mIGZuIT09XCJmdW5jdGlvblwiKXt0aHJvdyBuZXcgVHlwZUVycm9yKCdcImNhbGxiYWNrXCIgYXJndW1lbnQgbXVzdCBiZSBhIGZ1bmN0aW9uJyl9dmFyIGxlbj1hcmd1bWVudHMubGVuZ3RoO3ZhciBhcmdzLGk7c3dpdGNoKGxlbil7Y2FzZSAwOmNhc2UgMTpyZXR1cm4gcHJvY2Vzcy5uZXh0VGljayhmbik7Y2FzZSAyOnJldHVybiBwcm9jZXNzLm5leHRUaWNrKGZ1bmN0aW9uIGFmdGVyVGlja09uZSgpe2ZuLmNhbGwobnVsbCxhcmcxKX0pO2Nhc2UgMzpyZXR1cm4gcHJvY2Vzcy5uZXh0VGljayhmdW5jdGlvbiBhZnRlclRpY2tUd28oKXtmbi5jYWxsKG51bGwsYXJnMSxhcmcyKX0pO2Nhc2UgNDpyZXR1cm4gcHJvY2Vzcy5uZXh0VGljayhmdW5jdGlvbiBhZnRlclRpY2tUaHJlZSgpe2ZuLmNhbGwobnVsbCxhcmcxLGFyZzIsYXJnMyl9KTtkZWZhdWx0OmFyZ3M9bmV3IEFycmF5KGxlbi0xKTtpPTA7d2hpbGUoaTxhcmdzLmxlbmd0aCl7YXJnc1tpKytdPWFyZ3VtZW50c1tpXX1yZXR1cm4gcHJvY2Vzcy5uZXh0VGljayhmdW5jdGlvbiBhZnRlclRpY2soKXtmbi5hcHBseShudWxsLGFyZ3MpfSl9fX0pLmNhbGwodGhpcyxyZXF1aXJlKFwiX3Byb2Nlc3NcIikpfSx7X3Byb2Nlc3M6NDJ9XSw0MjpbZnVuY3Rpb24ocmVxdWlyZSxtb2R1bGUsZXhwb3J0cyl7dmFyIHByb2Nlc3M9bW9kdWxlLmV4cG9ydHM9e307dmFyIGNhY2hlZFNldFRpbWVvdXQ7dmFyIGNhY2hlZENsZWFyVGltZW91dDtmdW5jdGlvbiBkZWZhdWx0U2V0VGltb3V0KCl7dGhyb3cgbmV3IEVycm9yKFwic2V0VGltZW91dCBoYXMgbm90IGJlZW4gZGVmaW5lZFwiKX1mdW5jdGlvbiBkZWZhdWx0Q2xlYXJUaW1lb3V0KCl7dGhyb3cgbmV3IEVycm9yKFwiY2xlYXJUaW1lb3V0IGhhcyBub3QgYmVlbiBkZWZpbmVkXCIpfShmdW5jdGlvbigpe3RyeXtpZih0eXBlb2Ygc2V0VGltZW91dD09PVwiZnVuY3Rpb25cIil7Y2FjaGVkU2V0VGltZW91dD1zZXRUaW1lb3V0fWVsc2V7Y2FjaGVkU2V0VGltZW91dD1kZWZhdWx0U2V0VGltb3V0fX1jYXRjaChlKXtjYWNoZWRTZXRUaW1lb3V0PWRlZmF1bHRTZXRUaW1vdXR9dHJ5e2lmKHR5cGVvZiBjbGVhclRpbWVvdXQ9PT1cImZ1bmN0aW9uXCIpe2NhY2hlZENsZWFyVGltZW91dD1jbGVhclRpbWVvdXR9ZWxzZXtjYWNoZWRDbGVhclRpbWVvdXQ9ZGVmYXVsdENsZWFyVGltZW91dH19Y2F0Y2goZSl7Y2FjaGVkQ2xlYXJUaW1lb3V0PWRlZmF1bHRDbGVhclRpbWVvdXR9fSkoKTtmdW5jdGlvbiBydW5UaW1lb3V0KGZ1bil7aWYoY2FjaGVkU2V0VGltZW91dD09PXNldFRpbWVvdXQpe3JldHVybiBzZXRUaW1lb3V0KGZ1biwwKX1pZigoY2FjaGVkU2V0VGltZW91dD09PWRlZmF1bHRTZXRUaW1vdXR8fCFjYWNoZWRTZXRUaW1lb3V0KSYmc2V0VGltZW91dCl7Y2FjaGVkU2V0VGltZW91dD1zZXRUaW1lb3V0O3JldHVybiBzZXRUaW1lb3V0KGZ1biwwKX10cnl7cmV0dXJuIGNhY2hlZFNldFRpbWVvdXQoZnVuLDApfWNhdGNoKGUpe3RyeXtyZXR1cm4gY2FjaGVkU2V0VGltZW91dC5jYWxsKG51bGwsZnVuLDApfWNhdGNoKGUpe3JldHVybiBjYWNoZWRTZXRUaW1lb3V0LmNhbGwodGhpcyxmdW4sMCl9fX1mdW5jdGlvbiBydW5DbGVhclRpbWVvdXQobWFya2VyKXtpZihjYWNoZWRDbGVhclRpbWVvdXQ9PT1jbGVhclRpbWVvdXQpe3JldHVybiBjbGVhclRpbWVvdXQobWFya2VyKX1pZigoY2FjaGVkQ2xlYXJUaW1lb3V0PT09ZGVmYXVsdENsZWFyVGltZW91dHx8IWNhY2hlZENsZWFyVGltZW91dCkmJmNsZWFyVGltZW91dCl7Y2FjaGVkQ2xlYXJUaW1lb3V0PWNsZWFyVGltZW91dDtyZXR1cm4gY2xlYXJUaW1lb3V0KG1hcmtlcil9dHJ5e3JldHVybiBjYWNoZWRDbGVhclRpbWVvdXQobWFya2VyKX1jYXRjaChlKXt0cnl7cmV0dXJuIGNhY2hlZENsZWFyVGltZW91dC5jYWxsKG51bGwsbWFya2VyKX1jYXRjaChlKXtyZXR1cm4gY2FjaGVkQ2xlYXJUaW1lb3V0LmNhbGwodGhpcyxtYXJrZXIpfX19dmFyIHF1ZXVlPVtdO3ZhciBkcmFpbmluZz1mYWxzZTt2YXIgY3VycmVudFF1ZXVlO3ZhciBxdWV1ZUluZGV4PS0xO2Z1bmN0aW9uIGNsZWFuVXBOZXh0VGljaygpe2lmKCFkcmFpbmluZ3x8IWN1cnJlbnRRdWV1ZSl7cmV0dXJufWRyYWluaW5nPWZhbHNlO2lmKGN1cnJlbnRRdWV1ZS5sZW5ndGgpe3F1ZXVlPWN1cnJlbnRRdWV1ZS5jb25jYXQocXVldWUpfWVsc2V7cXVldWVJbmRleD0tMX1pZihxdWV1ZS5sZW5ndGgpe2RyYWluUXVldWUoKX19ZnVuY3Rpb24gZHJhaW5RdWV1ZSgpe2lmKGRyYWluaW5nKXtyZXR1cm59dmFyIHRpbWVvdXQ9cnVuVGltZW91dChjbGVhblVwTmV4dFRpY2spO2RyYWluaW5nPXRydWU7dmFyIGxlbj1xdWV1ZS5sZW5ndGg7d2hpbGUobGVuKXtjdXJyZW50UXVldWU9cXVldWU7cXVldWU9W107d2hpbGUoKytxdWV1ZUluZGV4PGxlbil7aWYoY3VycmVudFF1ZXVlKXtjdXJyZW50UXVldWVbcXVldWVJbmRleF0ucnVuKCl9fXF1ZXVlSW5kZXg9LTE7bGVuPXF1ZXVlLmxlbmd0aH1jdXJyZW50UXVldWU9bnVsbDtkcmFpbmluZz1mYWxzZTtydW5DbGVhclRpbWVvdXQodGltZW91dCl9cHJvY2Vzcy5uZXh0VGljaz1mdW5jdGlvbihmdW4pe3ZhciBhcmdzPW5ldyBBcnJheShhcmd1bWVudHMubGVuZ3RoLTEpO2lmKGFyZ3VtZW50cy5sZW5ndGg+MSl7Zm9yKHZhciBpPTE7aTxhcmd1bWVudHMubGVuZ3RoO2krKyl7YXJnc1tpLTFdPWFyZ3VtZW50c1tpXX19cXVldWUucHVzaChuZXcgSXRlbShmdW4sYXJncykpO2lmKHF1ZXVlLmxlbmd0aD09PTEmJiFkcmFpbmluZyl7cnVuVGltZW91dChkcmFpblF1ZXVlKX19O2Z1bmN0aW9uIEl0ZW0oZnVuLGFycmF5KXt0aGlzLmZ1bj1mdW47dGhpcy5hcnJheT1hcnJheX1JdGVtLnByb3RvdHlwZS5ydW49ZnVuY3Rpb24oKXt0aGlzLmZ1bi5hcHBseShudWxsLHRoaXMuYXJyYXkpfTtwcm9jZXNzLnRpdGxlPVwiYnJvd3NlclwiO3Byb2Nlc3MuYnJvd3Nlcj10cnVlO3Byb2Nlc3MuZW52PXt9O3Byb2Nlc3MuYXJndj1bXTtwcm9jZXNzLnZlcnNpb249XCJcIjtwcm9jZXNzLnZlcnNpb25zPXt9O2Z1bmN0aW9uIG5vb3AoKXt9cHJvY2Vzcy5vbj1ub29wO3Byb2Nlc3MuYWRkTGlzdGVuZXI9bm9vcDtwcm9jZXNzLm9uY2U9bm9vcDtwcm9jZXNzLm9mZj1ub29wO3Byb2Nlc3MucmVtb3ZlTGlzdGVuZXI9bm9vcDtwcm9jZXNzLnJlbW92ZUFsbExpc3RlbmVycz1ub29wO3Byb2Nlc3MuZW1pdD1ub29wO3Byb2Nlc3MuYmluZGluZz1mdW5jdGlvbihuYW1lKXt0aHJvdyBuZXcgRXJyb3IoXCJwcm9jZXNzLmJpbmRpbmcgaXMgbm90IHN1cHBvcnRlZFwiKX07cHJvY2Vzcy5jd2Q9ZnVuY3Rpb24oKXtyZXR1cm5cIi9cIn07cHJvY2Vzcy5jaGRpcj1mdW5jdGlvbihkaXIpe3Rocm93IG5ldyBFcnJvcihcInByb2Nlc3MuY2hkaXIgaXMgbm90IHN1cHBvcnRlZFwiKX07cHJvY2Vzcy51bWFzaz1mdW5jdGlvbigpe3JldHVybiAwfX0se31dLDQzOltmdW5jdGlvbihyZXF1aXJlLG1vZHVsZSxleHBvcnRzKXttb2R1bGUuZXhwb3J0cz1yZXF1aXJlKFwiLi9saWIvX3N0cmVhbV9kdXBsZXguanNcIil9LHtcIi4vbGliL19zdHJlYW1fZHVwbGV4LmpzXCI6NDR9XSw0NDpbZnVuY3Rpb24ocmVxdWlyZSxtb2R1bGUsZXhwb3J0cyl7XCJ1c2Ugc3RyaWN0XCI7dmFyIG9iamVjdEtleXM9T2JqZWN0LmtleXN8fGZ1bmN0aW9uKG9iail7dmFyIGtleXM9W107Zm9yKHZhciBrZXkgaW4gb2JqKXtrZXlzLnB1c2goa2V5KX1yZXR1cm4ga2V5c307bW9kdWxlLmV4cG9ydHM9RHVwbGV4O3ZhciBwcm9jZXNzTmV4dFRpY2s9cmVxdWlyZShcInByb2Nlc3MtbmV4dGljay1hcmdzXCIpO3ZhciB1dGlsPXJlcXVpcmUoXCJjb3JlLXV0aWwtaXNcIik7dXRpbC5pbmhlcml0cz1yZXF1aXJlKFwiaW5oZXJpdHNcIik7dmFyIFJlYWRhYmxlPXJlcXVpcmUoXCIuL19zdHJlYW1fcmVhZGFibGVcIik7dmFyIFdyaXRhYmxlPXJlcXVpcmUoXCIuL19zdHJlYW1fd3JpdGFibGVcIik7dXRpbC5pbmhlcml0cyhEdXBsZXgsUmVhZGFibGUpO3ZhciBrZXlzPW9iamVjdEtleXMoV3JpdGFibGUucHJvdG90eXBlKTtmb3IodmFyIHY9MDt2PGtleXMubGVuZ3RoO3YrKyl7dmFyIG1ldGhvZD1rZXlzW3ZdO2lmKCFEdXBsZXgucHJvdG90eXBlW21ldGhvZF0pRHVwbGV4LnByb3RvdHlwZVttZXRob2RdPVdyaXRhYmxlLnByb3RvdHlwZVttZXRob2RdfWZ1bmN0aW9uIER1cGxleChvcHRpb25zKXtpZighKHRoaXMgaW5zdGFuY2VvZiBEdXBsZXgpKXJldHVybiBuZXcgRHVwbGV4KG9wdGlvbnMpO1JlYWRhYmxlLmNhbGwodGhpcyxvcHRpb25zKTtXcml0YWJsZS5jYWxsKHRoaXMsb3B0aW9ucyk7aWYob3B0aW9ucyYmb3B0aW9ucy5yZWFkYWJsZT09PWZhbHNlKXRoaXMucmVhZGFibGU9ZmFsc2U7aWYob3B0aW9ucyYmb3B0aW9ucy53cml0YWJsZT09PWZhbHNlKXRoaXMud3JpdGFibGU9ZmFsc2U7dGhpcy5hbGxvd0hhbGZPcGVuPXRydWU7aWYob3B0aW9ucyYmb3B0aW9ucy5hbGxvd0hhbGZPcGVuPT09ZmFsc2UpdGhpcy5hbGxvd0hhbGZPcGVuPWZhbHNlO3RoaXMub25jZShcImVuZFwiLG9uZW5kKX1mdW5jdGlvbiBvbmVuZCgpe2lmKHRoaXMuYWxsb3dIYWxmT3Blbnx8dGhpcy5fd3JpdGFibGVTdGF0ZS5lbmRlZClyZXR1cm47cHJvY2Vzc05leHRUaWNrKG9uRW5kTlQsdGhpcyl9ZnVuY3Rpb24gb25FbmROVChzZWxmKXtzZWxmLmVuZCgpfWZ1bmN0aW9uIGZvckVhY2goeHMsZil7Zm9yKHZhciBpPTAsbD14cy5sZW5ndGg7aTxsO2krKyl7Zih4c1tpXSxpKX19fSx7XCIuL19zdHJlYW1fcmVhZGFibGVcIjo0NixcIi4vX3N0cmVhbV93cml0YWJsZVwiOjQ4LFwiY29yZS11dGlsLWlzXCI6Nixpbmhlcml0czozOCxcInByb2Nlc3MtbmV4dGljay1hcmdzXCI6NDF9XSw0NTpbZnVuY3Rpb24ocmVxdWlyZSxtb2R1bGUsZXhwb3J0cyl7XCJ1c2Ugc3RyaWN0XCI7bW9kdWxlLmV4cG9ydHM9UGFzc1Rocm91Z2g7dmFyIFRyYW5zZm9ybT1yZXF1aXJlKFwiLi9fc3RyZWFtX3RyYW5zZm9ybVwiKTt2YXIgdXRpbD1yZXF1aXJlKFwiY29yZS11dGlsLWlzXCIpO3V0aWwuaW5oZXJpdHM9cmVxdWlyZShcImluaGVyaXRzXCIpO3V0aWwuaW5oZXJpdHMoUGFzc1Rocm91Z2gsVHJhbnNmb3JtKTtmdW5jdGlvbiBQYXNzVGhyb3VnaChvcHRpb25zKXtpZighKHRoaXMgaW5zdGFuY2VvZiBQYXNzVGhyb3VnaCkpcmV0dXJuIG5ldyBQYXNzVGhyb3VnaChvcHRpb25zKTtUcmFuc2Zvcm0uY2FsbCh0aGlzLG9wdGlvbnMpfVBhc3NUaHJvdWdoLnByb3RvdHlwZS5fdHJhbnNmb3JtPWZ1bmN0aW9uKGNodW5rLGVuY29kaW5nLGNiKXtjYihudWxsLGNodW5rKX19LHtcIi4vX3N0cmVhbV90cmFuc2Zvcm1cIjo0NyxcImNvcmUtdXRpbC1pc1wiOjYsaW5oZXJpdHM6Mzh9XSw0NjpbZnVuY3Rpb24ocmVxdWlyZSxtb2R1bGUsZXhwb3J0cyl7KGZ1bmN0aW9uKHByb2Nlc3Mpe1widXNlIHN0cmljdFwiO21vZHVsZS5leHBvcnRzPVJlYWRhYmxlO3ZhciBwcm9jZXNzTmV4dFRpY2s9cmVxdWlyZShcInByb2Nlc3MtbmV4dGljay1hcmdzXCIpO3ZhciBpc0FycmF5PXJlcXVpcmUoXCJpc2FycmF5XCIpO1JlYWRhYmxlLlJlYWRhYmxlU3RhdGU9UmVhZGFibGVTdGF0ZTt2YXIgRUU9cmVxdWlyZShcImV2ZW50c1wiKS5FdmVudEVtaXR0ZXI7dmFyIEVFbGlzdGVuZXJDb3VudD1mdW5jdGlvbihlbWl0dGVyLHR5cGUpe3JldHVybiBlbWl0dGVyLmxpc3RlbmVycyh0eXBlKS5sZW5ndGh9O3ZhciBTdHJlYW07KGZ1bmN0aW9uKCl7dHJ5e1N0cmVhbT1yZXF1aXJlKFwic3RcIitcInJlYW1cIil9Y2F0Y2goXyl7fWZpbmFsbHl7aWYoIVN0cmVhbSlTdHJlYW09cmVxdWlyZShcImV2ZW50c1wiKS5FdmVudEVtaXR0ZXJ9fSkoKTt2YXIgQnVmZmVyPXJlcXVpcmUoXCJidWZmZXJcIikuQnVmZmVyO3ZhciBidWZmZXJTaGltPXJlcXVpcmUoXCJidWZmZXItc2hpbXNcIik7dmFyIHV0aWw9cmVxdWlyZShcImNvcmUtdXRpbC1pc1wiKTt1dGlsLmluaGVyaXRzPXJlcXVpcmUoXCJpbmhlcml0c1wiKTt2YXIgZGVidWdVdGlsPXJlcXVpcmUoXCJ1dGlsXCIpO3ZhciBkZWJ1Zz12b2lkIDA7aWYoZGVidWdVdGlsJiZkZWJ1Z1V0aWwuZGVidWdsb2cpe2RlYnVnPWRlYnVnVXRpbC5kZWJ1Z2xvZyhcInN0cmVhbVwiKX1lbHNle2RlYnVnPWZ1bmN0aW9uKCl7fX12YXIgQnVmZmVyTGlzdD1yZXF1aXJlKFwiLi9pbnRlcm5hbC9zdHJlYW1zL0J1ZmZlckxpc3RcIik7dmFyIFN0cmluZ0RlY29kZXI7dXRpbC5pbmhlcml0cyhSZWFkYWJsZSxTdHJlYW0pO2Z1bmN0aW9uIHByZXBlbmRMaXN0ZW5lcihlbWl0dGVyLGV2ZW50LGZuKXtpZih0eXBlb2YgZW1pdHRlci5wcmVwZW5kTGlzdGVuZXI9PT1cImZ1bmN0aW9uXCIpe3JldHVybiBlbWl0dGVyLnByZXBlbmRMaXN0ZW5lcihldmVudCxmbil9ZWxzZXtpZighZW1pdHRlci5fZXZlbnRzfHwhZW1pdHRlci5fZXZlbnRzW2V2ZW50XSllbWl0dGVyLm9uKGV2ZW50LGZuKTtlbHNlIGlmKGlzQXJyYXkoZW1pdHRlci5fZXZlbnRzW2V2ZW50XSkpZW1pdHRlci5fZXZlbnRzW2V2ZW50XS51bnNoaWZ0KGZuKTtlbHNlIGVtaXR0ZXIuX2V2ZW50c1tldmVudF09W2ZuLGVtaXR0ZXIuX2V2ZW50c1tldmVudF1dfX12YXIgRHVwbGV4O2Z1bmN0aW9uIFJlYWRhYmxlU3RhdGUob3B0aW9ucyxzdHJlYW0pe0R1cGxleD1EdXBsZXh8fHJlcXVpcmUoXCIuL19zdHJlYW1fZHVwbGV4XCIpO29wdGlvbnM9b3B0aW9uc3x8e307dGhpcy5vYmplY3RNb2RlPSEhb3B0aW9ucy5vYmplY3RNb2RlO2lmKHN0cmVhbSBpbnN0YW5jZW9mIER1cGxleCl0aGlzLm9iamVjdE1vZGU9dGhpcy5vYmplY3RNb2RlfHwhIW9wdGlvbnMucmVhZGFibGVPYmplY3RNb2RlO3ZhciBod209b3B0aW9ucy5oaWdoV2F0ZXJNYXJrO3ZhciBkZWZhdWx0SHdtPXRoaXMub2JqZWN0TW9kZT8xNjoxNioxMDI0O3RoaXMuaGlnaFdhdGVyTWFyaz1od218fGh3bT09PTA/aHdtOmRlZmF1bHRId207dGhpcy5oaWdoV2F0ZXJNYXJrPX5+dGhpcy5oaWdoV2F0ZXJNYXJrO3RoaXMuYnVmZmVyPW5ldyBCdWZmZXJMaXN0O3RoaXMubGVuZ3RoPTA7dGhpcy5waXBlcz1udWxsO3RoaXMucGlwZXNDb3VudD0wO3RoaXMuZmxvd2luZz1udWxsO3RoaXMuZW5kZWQ9ZmFsc2U7dGhpcy5lbmRFbWl0dGVkPWZhbHNlO3RoaXMucmVhZGluZz1mYWxzZTt0aGlzLnN5bmM9dHJ1ZTt0aGlzLm5lZWRSZWFkYWJsZT1mYWxzZTt0aGlzLmVtaXR0ZWRSZWFkYWJsZT1mYWxzZTt0aGlzLnJlYWRhYmxlTGlzdGVuaW5nPWZhbHNlO3RoaXMucmVzdW1lU2NoZWR1bGVkPWZhbHNlO3RoaXMuZGVmYXVsdEVuY29kaW5nPW9wdGlvbnMuZGVmYXVsdEVuY29kaW5nfHxcInV0ZjhcIjt0aGlzLnJhbk91dD1mYWxzZTt0aGlzLmF3YWl0RHJhaW49MDt0aGlzLnJlYWRpbmdNb3JlPWZhbHNlO3RoaXMuZGVjb2Rlcj1udWxsO3RoaXMuZW5jb2Rpbmc9bnVsbDtpZihvcHRpb25zLmVuY29kaW5nKXtpZighU3RyaW5nRGVjb2RlcilTdHJpbmdEZWNvZGVyPXJlcXVpcmUoXCJzdHJpbmdfZGVjb2Rlci9cIikuU3RyaW5nRGVjb2Rlcjt0aGlzLmRlY29kZXI9bmV3IFN0cmluZ0RlY29kZXIob3B0aW9ucy5lbmNvZGluZyk7dGhpcy5lbmNvZGluZz1vcHRpb25zLmVuY29kaW5nfX12YXIgRHVwbGV4O2Z1bmN0aW9uIFJlYWRhYmxlKG9wdGlvbnMpe0R1cGxleD1EdXBsZXh8fHJlcXVpcmUoXCIuL19zdHJlYW1fZHVwbGV4XCIpO2lmKCEodGhpcyBpbnN0YW5jZW9mIFJlYWRhYmxlKSlyZXR1cm4gbmV3IFJlYWRhYmxlKG9wdGlvbnMpO3RoaXMuX3JlYWRhYmxlU3RhdGU9bmV3IFJlYWRhYmxlU3RhdGUob3B0aW9ucyx0aGlzKTt0aGlzLnJlYWRhYmxlPXRydWU7aWYob3B0aW9ucyYmdHlwZW9mIG9wdGlvbnMucmVhZD09PVwiZnVuY3Rpb25cIil0aGlzLl9yZWFkPW9wdGlvbnMucmVhZDtTdHJlYW0uY2FsbCh0aGlzKX1SZWFkYWJsZS5wcm90b3R5cGUucHVzaD1mdW5jdGlvbihjaHVuayxlbmNvZGluZyl7dmFyIHN0YXRlPXRoaXMuX3JlYWRhYmxlU3RhdGU7aWYoIXN0YXRlLm9iamVjdE1vZGUmJnR5cGVvZiBjaHVuaz09PVwic3RyaW5nXCIpe2VuY29kaW5nPWVuY29kaW5nfHxzdGF0ZS5kZWZhdWx0RW5jb2Rpbmc7aWYoZW5jb2RpbmchPT1zdGF0ZS5lbmNvZGluZyl7Y2h1bms9YnVmZmVyU2hpbS5mcm9tKGNodW5rLGVuY29kaW5nKTtlbmNvZGluZz1cIlwifX1yZXR1cm4gcmVhZGFibGVBZGRDaHVuayh0aGlzLHN0YXRlLGNodW5rLGVuY29kaW5nLGZhbHNlKX07UmVhZGFibGUucHJvdG90eXBlLnVuc2hpZnQ9ZnVuY3Rpb24oY2h1bmspe3ZhciBzdGF0ZT10aGlzLl9yZWFkYWJsZVN0YXRlO3JldHVybiByZWFkYWJsZUFkZENodW5rKHRoaXMsc3RhdGUsY2h1bmssXCJcIix0cnVlKX07UmVhZGFibGUucHJvdG90eXBlLmlzUGF1c2VkPWZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuX3JlYWRhYmxlU3RhdGUuZmxvd2luZz09PWZhbHNlfTtmdW5jdGlvbiByZWFkYWJsZUFkZENodW5rKHN0cmVhbSxzdGF0ZSxjaHVuayxlbmNvZGluZyxhZGRUb0Zyb250KXt2YXIgZXI9Y2h1bmtJbnZhbGlkKHN0YXRlLGNodW5rKTtpZihlcil7c3RyZWFtLmVtaXQoXCJlcnJvclwiLGVyKX1lbHNlIGlmKGNodW5rPT09bnVsbCl7c3RhdGUucmVhZGluZz1mYWxzZTtvbkVvZkNodW5rKHN0cmVhbSxzdGF0ZSl9ZWxzZSBpZihzdGF0ZS5vYmplY3RNb2RlfHxjaHVuayYmY2h1bmsubGVuZ3RoPjApe2lmKHN0YXRlLmVuZGVkJiYhYWRkVG9Gcm9udCl7dmFyIGU9bmV3IEVycm9yKFwic3RyZWFtLnB1c2goKSBhZnRlciBFT0ZcIik7c3RyZWFtLmVtaXQoXCJlcnJvclwiLGUpfWVsc2UgaWYoc3RhdGUuZW5kRW1pdHRlZCYmYWRkVG9Gcm9udCl7dmFyIF9lPW5ldyBFcnJvcihcInN0cmVhbS51bnNoaWZ0KCkgYWZ0ZXIgZW5kIGV2ZW50XCIpO3N0cmVhbS5lbWl0KFwiZXJyb3JcIixfZSl9ZWxzZXt2YXIgc2tpcEFkZDtpZihzdGF0ZS5kZWNvZGVyJiYhYWRkVG9Gcm9udCYmIWVuY29kaW5nKXtjaHVuaz1zdGF0ZS5kZWNvZGVyLndyaXRlKGNodW5rKTtza2lwQWRkPSFzdGF0ZS5vYmplY3RNb2RlJiZjaHVuay5sZW5ndGg9PT0wfWlmKCFhZGRUb0Zyb250KXN0YXRlLnJlYWRpbmc9ZmFsc2U7aWYoIXNraXBBZGQpe2lmKHN0YXRlLmZsb3dpbmcmJnN0YXRlLmxlbmd0aD09PTAmJiFzdGF0ZS5zeW5jKXtzdHJlYW0uZW1pdChcImRhdGFcIixjaHVuayk7c3RyZWFtLnJlYWQoMCl9ZWxzZXtzdGF0ZS5sZW5ndGgrPXN0YXRlLm9iamVjdE1vZGU/MTpjaHVuay5sZW5ndGg7aWYoYWRkVG9Gcm9udClzdGF0ZS5idWZmZXIudW5zaGlmdChjaHVuayk7ZWxzZSBzdGF0ZS5idWZmZXIucHVzaChjaHVuayk7aWYoc3RhdGUubmVlZFJlYWRhYmxlKWVtaXRSZWFkYWJsZShzdHJlYW0pfX1tYXliZVJlYWRNb3JlKHN0cmVhbSxzdGF0ZSl9fWVsc2UgaWYoIWFkZFRvRnJvbnQpe3N0YXRlLnJlYWRpbmc9ZmFsc2V9cmV0dXJuIG5lZWRNb3JlRGF0YShzdGF0ZSl9ZnVuY3Rpb24gbmVlZE1vcmVEYXRhKHN0YXRlKXtyZXR1cm4hc3RhdGUuZW5kZWQmJihzdGF0ZS5uZWVkUmVhZGFibGV8fHN0YXRlLmxlbmd0aDxzdGF0ZS5oaWdoV2F0ZXJNYXJrfHxzdGF0ZS5sZW5ndGg9PT0wKX1SZWFkYWJsZS5wcm90b3R5cGUuc2V0RW5jb2Rpbmc9ZnVuY3Rpb24oZW5jKXtpZighU3RyaW5nRGVjb2RlcilTdHJpbmdEZWNvZGVyPXJlcXVpcmUoXCJzdHJpbmdfZGVjb2Rlci9cIikuU3RyaW5nRGVjb2Rlcjt0aGlzLl9yZWFkYWJsZVN0YXRlLmRlY29kZXI9bmV3IFN0cmluZ0RlY29kZXIoZW5jKTt0aGlzLl9yZWFkYWJsZVN0YXRlLmVuY29kaW5nPWVuYztyZXR1cm4gdGhpc307dmFyIE1BWF9IV009ODM4ODYwODtmdW5jdGlvbiBjb21wdXRlTmV3SGlnaFdhdGVyTWFyayhuKXtpZihuPj1NQVhfSFdNKXtuPU1BWF9IV019ZWxzZXtuLS07bnw9bj4+PjE7bnw9bj4+PjI7bnw9bj4+PjQ7bnw9bj4+Pjg7bnw9bj4+PjE2O24rK31yZXR1cm4gbn1mdW5jdGlvbiBob3dNdWNoVG9SZWFkKG4sc3RhdGUpe2lmKG48PTB8fHN0YXRlLmxlbmd0aD09PTAmJnN0YXRlLmVuZGVkKXJldHVybiAwO2lmKHN0YXRlLm9iamVjdE1vZGUpcmV0dXJuIDE7aWYobiE9PW4pe2lmKHN0YXRlLmZsb3dpbmcmJnN0YXRlLmxlbmd0aClyZXR1cm4gc3RhdGUuYnVmZmVyLmhlYWQuZGF0YS5sZW5ndGg7ZWxzZSByZXR1cm4gc3RhdGUubGVuZ3RofWlmKG4+c3RhdGUuaGlnaFdhdGVyTWFyaylzdGF0ZS5oaWdoV2F0ZXJNYXJrPWNvbXB1dGVOZXdIaWdoV2F0ZXJNYXJrKG4pO2lmKG48PXN0YXRlLmxlbmd0aClyZXR1cm4gbjtpZighc3RhdGUuZW5kZWQpe3N0YXRlLm5lZWRSZWFkYWJsZT10cnVlO3JldHVybiAwfXJldHVybiBzdGF0ZS5sZW5ndGh9UmVhZGFibGUucHJvdG90eXBlLnJlYWQ9ZnVuY3Rpb24obil7ZGVidWcoXCJyZWFkXCIsbik7bj1wYXJzZUludChuLDEwKTt2YXIgc3RhdGU9dGhpcy5fcmVhZGFibGVTdGF0ZTt2YXIgbk9yaWc9bjtpZihuIT09MClzdGF0ZS5lbWl0dGVkUmVhZGFibGU9ZmFsc2U7aWYobj09PTAmJnN0YXRlLm5lZWRSZWFkYWJsZSYmKHN0YXRlLmxlbmd0aD49c3RhdGUuaGlnaFdhdGVyTWFya3x8c3RhdGUuZW5kZWQpKXtkZWJ1ZyhcInJlYWQ6IGVtaXRSZWFkYWJsZVwiLHN0YXRlLmxlbmd0aCxzdGF0ZS5lbmRlZCk7aWYoc3RhdGUubGVuZ3RoPT09MCYmc3RhdGUuZW5kZWQpZW5kUmVhZGFibGUodGhpcyk7ZWxzZSBlbWl0UmVhZGFibGUodGhpcyk7cmV0dXJuIG51bGx9bj1ob3dNdWNoVG9SZWFkKG4sc3RhdGUpO2lmKG49PT0wJiZzdGF0ZS5lbmRlZCl7aWYoc3RhdGUubGVuZ3RoPT09MCllbmRSZWFkYWJsZSh0aGlzKTtyZXR1cm4gbnVsbH12YXIgZG9SZWFkPXN0YXRlLm5lZWRSZWFkYWJsZTtkZWJ1ZyhcIm5lZWQgcmVhZGFibGVcIixkb1JlYWQpO2lmKHN0YXRlLmxlbmd0aD09PTB8fHN0YXRlLmxlbmd0aC1uPHN0YXRlLmhpZ2hXYXRlck1hcmspe2RvUmVhZD10cnVlO2RlYnVnKFwibGVuZ3RoIGxlc3MgdGhhbiB3YXRlcm1hcmtcIixkb1JlYWQpfWlmKHN0YXRlLmVuZGVkfHxzdGF0ZS5yZWFkaW5nKXtkb1JlYWQ9ZmFsc2U7ZGVidWcoXCJyZWFkaW5nIG9yIGVuZGVkXCIsZG9SZWFkKX1lbHNlIGlmKGRvUmVhZCl7ZGVidWcoXCJkbyByZWFkXCIpO3N0YXRlLnJlYWRpbmc9dHJ1ZTtzdGF0ZS5zeW5jPXRydWU7aWYoc3RhdGUubGVuZ3RoPT09MClzdGF0ZS5uZWVkUmVhZGFibGU9dHJ1ZTt0aGlzLl9yZWFkKHN0YXRlLmhpZ2hXYXRlck1hcmspO3N0YXRlLnN5bmM9ZmFsc2U7aWYoIXN0YXRlLnJlYWRpbmcpbj1ob3dNdWNoVG9SZWFkKG5PcmlnLHN0YXRlKX12YXIgcmV0O2lmKG4+MClyZXQ9ZnJvbUxpc3QobixzdGF0ZSk7ZWxzZSByZXQ9bnVsbDtpZihyZXQ9PT1udWxsKXtzdGF0ZS5uZWVkUmVhZGFibGU9dHJ1ZTtuPTB9ZWxzZXtzdGF0ZS5sZW5ndGgtPW59aWYoc3RhdGUubGVuZ3RoPT09MCl7aWYoIXN0YXRlLmVuZGVkKXN0YXRlLm5lZWRSZWFkYWJsZT10cnVlO2lmKG5PcmlnIT09biYmc3RhdGUuZW5kZWQpZW5kUmVhZGFibGUodGhpcyl9aWYocmV0IT09bnVsbCl0aGlzLmVtaXQoXCJkYXRhXCIscmV0KTtyZXR1cm4gcmV0fTtmdW5jdGlvbiBjaHVua0ludmFsaWQoc3RhdGUsY2h1bmspe3ZhciBlcj1udWxsO2lmKCFCdWZmZXIuaXNCdWZmZXIoY2h1bmspJiZ0eXBlb2YgY2h1bmshPT1cInN0cmluZ1wiJiZjaHVuayE9PW51bGwmJmNodW5rIT09dW5kZWZpbmVkJiYhc3RhdGUub2JqZWN0TW9kZSl7ZXI9bmV3IFR5cGVFcnJvcihcIkludmFsaWQgbm9uLXN0cmluZy9idWZmZXIgY2h1bmtcIil9cmV0dXJuIGVyfWZ1bmN0aW9uIG9uRW9mQ2h1bmsoc3RyZWFtLHN0YXRlKXtpZihzdGF0ZS5lbmRlZClyZXR1cm47aWYoc3RhdGUuZGVjb2Rlcil7dmFyIGNodW5rPXN0YXRlLmRlY29kZXIuZW5kKCk7aWYoY2h1bmsmJmNodW5rLmxlbmd0aCl7c3RhdGUuYnVmZmVyLnB1c2goY2h1bmspO3N0YXRlLmxlbmd0aCs9c3RhdGUub2JqZWN0TW9kZT8xOmNodW5rLmxlbmd0aH19c3RhdGUuZW5kZWQ9dHJ1ZTtlbWl0UmVhZGFibGUoc3RyZWFtKX1mdW5jdGlvbiBlbWl0UmVhZGFibGUoc3RyZWFtKXt2YXIgc3RhdGU9c3RyZWFtLl9yZWFkYWJsZVN0YXRlO3N0YXRlLm5lZWRSZWFkYWJsZT1mYWxzZTtpZighc3RhdGUuZW1pdHRlZFJlYWRhYmxlKXtkZWJ1ZyhcImVtaXRSZWFkYWJsZVwiLHN0YXRlLmZsb3dpbmcpO3N0YXRlLmVtaXR0ZWRSZWFkYWJsZT10cnVlO2lmKHN0YXRlLnN5bmMpcHJvY2Vzc05leHRUaWNrKGVtaXRSZWFkYWJsZV8sc3RyZWFtKTtlbHNlIGVtaXRSZWFkYWJsZV8oc3RyZWFtKX19ZnVuY3Rpb24gZW1pdFJlYWRhYmxlXyhzdHJlYW0pe2RlYnVnKFwiZW1pdCByZWFkYWJsZVwiKTtzdHJlYW0uZW1pdChcInJlYWRhYmxlXCIpO2Zsb3coc3RyZWFtKX1mdW5jdGlvbiBtYXliZVJlYWRNb3JlKHN0cmVhbSxzdGF0ZSl7aWYoIXN0YXRlLnJlYWRpbmdNb3JlKXtzdGF0ZS5yZWFkaW5nTW9yZT10cnVlO3Byb2Nlc3NOZXh0VGljayhtYXliZVJlYWRNb3JlXyxzdHJlYW0sc3RhdGUpfX1mdW5jdGlvbiBtYXliZVJlYWRNb3JlXyhzdHJlYW0sc3RhdGUpe3ZhciBsZW49c3RhdGUubGVuZ3RoO3doaWxlKCFzdGF0ZS5yZWFkaW5nJiYhc3RhdGUuZmxvd2luZyYmIXN0YXRlLmVuZGVkJiZzdGF0ZS5sZW5ndGg8c3RhdGUuaGlnaFdhdGVyTWFyayl7ZGVidWcoXCJtYXliZVJlYWRNb3JlIHJlYWQgMFwiKTtzdHJlYW0ucmVhZCgwKTtpZihsZW49PT1zdGF0ZS5sZW5ndGgpYnJlYWs7ZWxzZSBsZW49c3RhdGUubGVuZ3RofXN0YXRlLnJlYWRpbmdNb3JlPWZhbHNlfVJlYWRhYmxlLnByb3RvdHlwZS5fcmVhZD1mdW5jdGlvbihuKXt0aGlzLmVtaXQoXCJlcnJvclwiLG5ldyBFcnJvcihcIm5vdCBpbXBsZW1lbnRlZFwiKSl9O1JlYWRhYmxlLnByb3RvdHlwZS5waXBlPWZ1bmN0aW9uKGRlc3QscGlwZU9wdHMpe3ZhciBzcmM9dGhpczt2YXIgc3RhdGU9dGhpcy5fcmVhZGFibGVTdGF0ZTtzd2l0Y2goc3RhdGUucGlwZXNDb3VudCl7Y2FzZSAwOnN0YXRlLnBpcGVzPWRlc3Q7YnJlYWs7Y2FzZSAxOnN0YXRlLnBpcGVzPVtzdGF0ZS5waXBlcyxkZXN0XTticmVhaztkZWZhdWx0OnN0YXRlLnBpcGVzLnB1c2goZGVzdCk7YnJlYWt9c3RhdGUucGlwZXNDb3VudCs9MTtkZWJ1ZyhcInBpcGUgY291bnQ9JWQgb3B0cz0lalwiLHN0YXRlLnBpcGVzQ291bnQscGlwZU9wdHMpO3ZhciBkb0VuZD0oIXBpcGVPcHRzfHxwaXBlT3B0cy5lbmQhPT1mYWxzZSkmJmRlc3QhPT1wcm9jZXNzLnN0ZG91dCYmZGVzdCE9PXByb2Nlc3Muc3RkZXJyO3ZhciBlbmRGbj1kb0VuZD9vbmVuZDpjbGVhbnVwO2lmKHN0YXRlLmVuZEVtaXR0ZWQpcHJvY2Vzc05leHRUaWNrKGVuZEZuKTtlbHNlIHNyYy5vbmNlKFwiZW5kXCIsZW5kRm4pO2Rlc3Qub24oXCJ1bnBpcGVcIixvbnVucGlwZSk7ZnVuY3Rpb24gb251bnBpcGUocmVhZGFibGUpe2RlYnVnKFwib251bnBpcGVcIik7aWYocmVhZGFibGU9PT1zcmMpe2NsZWFudXAoKX19ZnVuY3Rpb24gb25lbmQoKXtkZWJ1ZyhcIm9uZW5kXCIpO2Rlc3QuZW5kKCl9dmFyIG9uZHJhaW49cGlwZU9uRHJhaW4oc3JjKTtkZXN0Lm9uKFwiZHJhaW5cIixvbmRyYWluKTt2YXIgY2xlYW5lZFVwPWZhbHNlO2Z1bmN0aW9uIGNsZWFudXAoKXtkZWJ1ZyhcImNsZWFudXBcIik7ZGVzdC5yZW1vdmVMaXN0ZW5lcihcImNsb3NlXCIsb25jbG9zZSk7ZGVzdC5yZW1vdmVMaXN0ZW5lcihcImZpbmlzaFwiLG9uZmluaXNoKTtkZXN0LnJlbW92ZUxpc3RlbmVyKFwiZHJhaW5cIixvbmRyYWluKTtkZXN0LnJlbW92ZUxpc3RlbmVyKFwiZXJyb3JcIixvbmVycm9yKTtkZXN0LnJlbW92ZUxpc3RlbmVyKFwidW5waXBlXCIsb251bnBpcGUpO3NyYy5yZW1vdmVMaXN0ZW5lcihcImVuZFwiLG9uZW5kKTtzcmMucmVtb3ZlTGlzdGVuZXIoXCJlbmRcIixjbGVhbnVwKTtzcmMucmVtb3ZlTGlzdGVuZXIoXCJkYXRhXCIsb25kYXRhKTtjbGVhbmVkVXA9dHJ1ZTtpZihzdGF0ZS5hd2FpdERyYWluJiYoIWRlc3QuX3dyaXRhYmxlU3RhdGV8fGRlc3QuX3dyaXRhYmxlU3RhdGUubmVlZERyYWluKSlvbmRyYWluKCl9dmFyIGluY3JlYXNlZEF3YWl0RHJhaW49ZmFsc2U7c3JjLm9uKFwiZGF0YVwiLG9uZGF0YSk7ZnVuY3Rpb24gb25kYXRhKGNodW5rKXtkZWJ1ZyhcIm9uZGF0YVwiKTtpbmNyZWFzZWRBd2FpdERyYWluPWZhbHNlO3ZhciByZXQ9ZGVzdC53cml0ZShjaHVuayk7aWYoZmFsc2U9PT1yZXQmJiFpbmNyZWFzZWRBd2FpdERyYWluKXtpZigoc3RhdGUucGlwZXNDb3VudD09PTEmJnN0YXRlLnBpcGVzPT09ZGVzdHx8c3RhdGUucGlwZXNDb3VudD4xJiZpbmRleE9mKHN0YXRlLnBpcGVzLGRlc3QpIT09LTEpJiYhY2xlYW5lZFVwKXtkZWJ1ZyhcImZhbHNlIHdyaXRlIHJlc3BvbnNlLCBwYXVzZVwiLHNyYy5fcmVhZGFibGVTdGF0ZS5hd2FpdERyYWluKTtzcmMuX3JlYWRhYmxlU3RhdGUuYXdhaXREcmFpbisrO2luY3JlYXNlZEF3YWl0RHJhaW49dHJ1ZX1zcmMucGF1c2UoKX19ZnVuY3Rpb24gb25lcnJvcihlcil7ZGVidWcoXCJvbmVycm9yXCIsZXIpO3VucGlwZSgpO2Rlc3QucmVtb3ZlTGlzdGVuZXIoXCJlcnJvclwiLG9uZXJyb3IpO2lmKEVFbGlzdGVuZXJDb3VudChkZXN0LFwiZXJyb3JcIik9PT0wKWRlc3QuZW1pdChcImVycm9yXCIsZXIpfXByZXBlbmRMaXN0ZW5lcihkZXN0LFwiZXJyb3JcIixvbmVycm9yKTtmdW5jdGlvbiBvbmNsb3NlKCl7ZGVzdC5yZW1vdmVMaXN0ZW5lcihcImZpbmlzaFwiLG9uZmluaXNoKTt1bnBpcGUoKX1kZXN0Lm9uY2UoXCJjbG9zZVwiLG9uY2xvc2UpO2Z1bmN0aW9uIG9uZmluaXNoKCl7ZGVidWcoXCJvbmZpbmlzaFwiKTtkZXN0LnJlbW92ZUxpc3RlbmVyKFwiY2xvc2VcIixvbmNsb3NlKTt1bnBpcGUoKX1kZXN0Lm9uY2UoXCJmaW5pc2hcIixvbmZpbmlzaCk7ZnVuY3Rpb24gdW5waXBlKCl7ZGVidWcoXCJ1bnBpcGVcIik7c3JjLnVucGlwZShkZXN0KX1kZXN0LmVtaXQoXCJwaXBlXCIsc3JjKTtpZighc3RhdGUuZmxvd2luZyl7ZGVidWcoXCJwaXBlIHJlc3VtZVwiKTtzcmMucmVzdW1lKCl9cmV0dXJuIGRlc3R9O2Z1bmN0aW9uIHBpcGVPbkRyYWluKHNyYyl7cmV0dXJuIGZ1bmN0aW9uKCl7dmFyIHN0YXRlPXNyYy5fcmVhZGFibGVTdGF0ZTtkZWJ1ZyhcInBpcGVPbkRyYWluXCIsc3RhdGUuYXdhaXREcmFpbik7aWYoc3RhdGUuYXdhaXREcmFpbilzdGF0ZS5hd2FpdERyYWluLS07aWYoc3RhdGUuYXdhaXREcmFpbj09PTAmJkVFbGlzdGVuZXJDb3VudChzcmMsXCJkYXRhXCIpKXtzdGF0ZS5mbG93aW5nPXRydWU7ZmxvdyhzcmMpfX19UmVhZGFibGUucHJvdG90eXBlLnVucGlwZT1mdW5jdGlvbihkZXN0KXt2YXIgc3RhdGU9dGhpcy5fcmVhZGFibGVTdGF0ZTtpZihzdGF0ZS5waXBlc0NvdW50PT09MClyZXR1cm4gdGhpcztpZihzdGF0ZS5waXBlc0NvdW50PT09MSl7aWYoZGVzdCYmZGVzdCE9PXN0YXRlLnBpcGVzKXJldHVybiB0aGlzO2lmKCFkZXN0KWRlc3Q9c3RhdGUucGlwZXM7c3RhdGUucGlwZXM9bnVsbDtzdGF0ZS5waXBlc0NvdW50PTA7c3RhdGUuZmxvd2luZz1mYWxzZTtpZihkZXN0KWRlc3QuZW1pdChcInVucGlwZVwiLHRoaXMpO3JldHVybiB0aGlzfWlmKCFkZXN0KXt2YXIgZGVzdHM9c3RhdGUucGlwZXM7dmFyIGxlbj1zdGF0ZS5waXBlc0NvdW50O3N0YXRlLnBpcGVzPW51bGw7c3RhdGUucGlwZXNDb3VudD0wO3N0YXRlLmZsb3dpbmc9ZmFsc2U7Zm9yKHZhciBfaT0wO19pPGxlbjtfaSsrKXtkZXN0c1tfaV0uZW1pdChcInVucGlwZVwiLHRoaXMpfXJldHVybiB0aGlzfXZhciBpPWluZGV4T2Yoc3RhdGUucGlwZXMsZGVzdCk7aWYoaT09PS0xKXJldHVybiB0aGlzO3N0YXRlLnBpcGVzLnNwbGljZShpLDEpO3N0YXRlLnBpcGVzQ291bnQtPTE7aWYoc3RhdGUucGlwZXNDb3VudD09PTEpc3RhdGUucGlwZXM9c3RhdGUucGlwZXNbMF07ZGVzdC5lbWl0KFwidW5waXBlXCIsdGhpcyk7cmV0dXJuIHRoaXN9O1JlYWRhYmxlLnByb3RvdHlwZS5vbj1mdW5jdGlvbihldixmbil7dmFyIHJlcz1TdHJlYW0ucHJvdG90eXBlLm9uLmNhbGwodGhpcyxldixmbik7aWYoZXY9PT1cImRhdGFcIil7aWYodGhpcy5fcmVhZGFibGVTdGF0ZS5mbG93aW5nIT09ZmFsc2UpdGhpcy5yZXN1bWUoKX1lbHNlIGlmKGV2PT09XCJyZWFkYWJsZVwiKXt2YXIgc3RhdGU9dGhpcy5fcmVhZGFibGVTdGF0ZTtpZighc3RhdGUuZW5kRW1pdHRlZCYmIXN0YXRlLnJlYWRhYmxlTGlzdGVuaW5nKXtzdGF0ZS5yZWFkYWJsZUxpc3RlbmluZz1zdGF0ZS5uZWVkUmVhZGFibGU9dHJ1ZTtzdGF0ZS5lbWl0dGVkUmVhZGFibGU9ZmFsc2U7aWYoIXN0YXRlLnJlYWRpbmcpe3Byb2Nlc3NOZXh0VGljayhuUmVhZGluZ05leHRUaWNrLHRoaXMpfWVsc2UgaWYoc3RhdGUubGVuZ3RoKXtlbWl0UmVhZGFibGUodGhpcyxzdGF0ZSl9fX1yZXR1cm4gcmVzfTtSZWFkYWJsZS5wcm90b3R5cGUuYWRkTGlzdGVuZXI9UmVhZGFibGUucHJvdG90eXBlLm9uO2Z1bmN0aW9uIG5SZWFkaW5nTmV4dFRpY2soc2VsZil7ZGVidWcoXCJyZWFkYWJsZSBuZXh0dGljayByZWFkIDBcIik7c2VsZi5yZWFkKDApfVJlYWRhYmxlLnByb3RvdHlwZS5yZXN1bWU9ZnVuY3Rpb24oKXt2YXIgc3RhdGU9dGhpcy5fcmVhZGFibGVTdGF0ZTtpZighc3RhdGUuZmxvd2luZyl7ZGVidWcoXCJyZXN1bWVcIik7c3RhdGUuZmxvd2luZz10cnVlO3Jlc3VtZSh0aGlzLHN0YXRlKX1yZXR1cm4gdGhpc307ZnVuY3Rpb24gcmVzdW1lKHN0cmVhbSxzdGF0ZSl7aWYoIXN0YXRlLnJlc3VtZVNjaGVkdWxlZCl7c3RhdGUucmVzdW1lU2NoZWR1bGVkPXRydWU7cHJvY2Vzc05leHRUaWNrKHJlc3VtZV8sc3RyZWFtLHN0YXRlKX19ZnVuY3Rpb24gcmVzdW1lXyhzdHJlYW0sc3RhdGUpe2lmKCFzdGF0ZS5yZWFkaW5nKXtkZWJ1ZyhcInJlc3VtZSByZWFkIDBcIik7c3RyZWFtLnJlYWQoMCl9c3RhdGUucmVzdW1lU2NoZWR1bGVkPWZhbHNlO3N0YXRlLmF3YWl0RHJhaW49MDtzdHJlYW0uZW1pdChcInJlc3VtZVwiKTtmbG93KHN0cmVhbSk7aWYoc3RhdGUuZmxvd2luZyYmIXN0YXRlLnJlYWRpbmcpc3RyZWFtLnJlYWQoMCl9UmVhZGFibGUucHJvdG90eXBlLnBhdXNlPWZ1bmN0aW9uKCl7ZGVidWcoXCJjYWxsIHBhdXNlIGZsb3dpbmc9JWpcIix0aGlzLl9yZWFkYWJsZVN0YXRlLmZsb3dpbmcpO2lmKGZhbHNlIT09dGhpcy5fcmVhZGFibGVTdGF0ZS5mbG93aW5nKXtkZWJ1ZyhcInBhdXNlXCIpO3RoaXMuX3JlYWRhYmxlU3RhdGUuZmxvd2luZz1mYWxzZTt0aGlzLmVtaXQoXCJwYXVzZVwiKX1yZXR1cm4gdGhpc307ZnVuY3Rpb24gZmxvdyhzdHJlYW0pe3ZhciBzdGF0ZT1zdHJlYW0uX3JlYWRhYmxlU3RhdGU7ZGVidWcoXCJmbG93XCIsc3RhdGUuZmxvd2luZyk7d2hpbGUoc3RhdGUuZmxvd2luZyYmc3RyZWFtLnJlYWQoKSE9PW51bGwpe319UmVhZGFibGUucHJvdG90eXBlLndyYXA9ZnVuY3Rpb24oc3RyZWFtKXt2YXIgc3RhdGU9dGhpcy5fcmVhZGFibGVTdGF0ZTt2YXIgcGF1c2VkPWZhbHNlO3ZhciBzZWxmPXRoaXM7c3RyZWFtLm9uKFwiZW5kXCIsZnVuY3Rpb24oKXtkZWJ1ZyhcIndyYXBwZWQgZW5kXCIpO2lmKHN0YXRlLmRlY29kZXImJiFzdGF0ZS5lbmRlZCl7dmFyIGNodW5rPXN0YXRlLmRlY29kZXIuZW5kKCk7aWYoY2h1bmsmJmNodW5rLmxlbmd0aClzZWxmLnB1c2goY2h1bmspfXNlbGYucHVzaChudWxsKX0pO3N0cmVhbS5vbihcImRhdGFcIixmdW5jdGlvbihjaHVuayl7ZGVidWcoXCJ3cmFwcGVkIGRhdGFcIik7aWYoc3RhdGUuZGVjb2RlciljaHVuaz1zdGF0ZS5kZWNvZGVyLndyaXRlKGNodW5rKTtpZihzdGF0ZS5vYmplY3RNb2RlJiYoY2h1bms9PT1udWxsfHxjaHVuaz09PXVuZGVmaW5lZCkpcmV0dXJuO2Vsc2UgaWYoIXN0YXRlLm9iamVjdE1vZGUmJighY2h1bmt8fCFjaHVuay5sZW5ndGgpKXJldHVybjt2YXIgcmV0PXNlbGYucHVzaChjaHVuayk7aWYoIXJldCl7cGF1c2VkPXRydWU7c3RyZWFtLnBhdXNlKCl9fSk7Zm9yKHZhciBpIGluIHN0cmVhbSl7aWYodGhpc1tpXT09PXVuZGVmaW5lZCYmdHlwZW9mIHN0cmVhbVtpXT09PVwiZnVuY3Rpb25cIil7dGhpc1tpXT1mdW5jdGlvbihtZXRob2Qpe3JldHVybiBmdW5jdGlvbigpe3JldHVybiBzdHJlYW1bbWV0aG9kXS5hcHBseShzdHJlYW0sYXJndW1lbnRzKX19KGkpfX12YXIgZXZlbnRzPVtcImVycm9yXCIsXCJjbG9zZVwiLFwiZGVzdHJveVwiLFwicGF1c2VcIixcInJlc3VtZVwiXTtmb3JFYWNoKGV2ZW50cyxmdW5jdGlvbihldil7c3RyZWFtLm9uKGV2LHNlbGYuZW1pdC5iaW5kKHNlbGYsZXYpKX0pO3NlbGYuX3JlYWQ9ZnVuY3Rpb24obil7ZGVidWcoXCJ3cmFwcGVkIF9yZWFkXCIsbik7aWYocGF1c2VkKXtwYXVzZWQ9ZmFsc2U7c3RyZWFtLnJlc3VtZSgpfX07cmV0dXJuIHNlbGZ9O1JlYWRhYmxlLl9mcm9tTGlzdD1mcm9tTGlzdDtmdW5jdGlvbiBmcm9tTGlzdChuLHN0YXRlKXtpZihzdGF0ZS5sZW5ndGg9PT0wKXJldHVybiBudWxsO3ZhciByZXQ7aWYoc3RhdGUub2JqZWN0TW9kZSlyZXQ9c3RhdGUuYnVmZmVyLnNoaWZ0KCk7ZWxzZSBpZighbnx8bj49c3RhdGUubGVuZ3RoKXtpZihzdGF0ZS5kZWNvZGVyKXJldD1zdGF0ZS5idWZmZXIuam9pbihcIlwiKTtlbHNlIGlmKHN0YXRlLmJ1ZmZlci5sZW5ndGg9PT0xKXJldD1zdGF0ZS5idWZmZXIuaGVhZC5kYXRhO2Vsc2UgcmV0PXN0YXRlLmJ1ZmZlci5jb25jYXQoc3RhdGUubGVuZ3RoKTtzdGF0ZS5idWZmZXIuY2xlYXIoKX1lbHNle3JldD1mcm9tTGlzdFBhcnRpYWwobixzdGF0ZS5idWZmZXIsc3RhdGUuZGVjb2Rlcil9cmV0dXJuIHJldH1mdW5jdGlvbiBmcm9tTGlzdFBhcnRpYWwobixsaXN0LGhhc1N0cmluZ3Mpe3ZhciByZXQ7aWYobjxsaXN0LmhlYWQuZGF0YS5sZW5ndGgpe3JldD1saXN0LmhlYWQuZGF0YS5zbGljZSgwLG4pO2xpc3QuaGVhZC5kYXRhPWxpc3QuaGVhZC5kYXRhLnNsaWNlKG4pfWVsc2UgaWYobj09PWxpc3QuaGVhZC5kYXRhLmxlbmd0aCl7cmV0PWxpc3Quc2hpZnQoKX1lbHNle3JldD1oYXNTdHJpbmdzP2NvcHlGcm9tQnVmZmVyU3RyaW5nKG4sbGlzdCk6Y29weUZyb21CdWZmZXIobixsaXN0KX1yZXR1cm4gcmV0fWZ1bmN0aW9uIGNvcHlGcm9tQnVmZmVyU3RyaW5nKG4sbGlzdCl7dmFyIHA9bGlzdC5oZWFkO3ZhciBjPTE7dmFyIHJldD1wLmRhdGE7bi09cmV0Lmxlbmd0aDt3aGlsZShwPXAubmV4dCl7dmFyIHN0cj1wLmRhdGE7dmFyIG5iPW4+c3RyLmxlbmd0aD9zdHIubGVuZ3RoOm47aWYobmI9PT1zdHIubGVuZ3RoKXJldCs9c3RyO2Vsc2UgcmV0Kz1zdHIuc2xpY2UoMCxuKTtuLT1uYjtpZihuPT09MCl7aWYobmI9PT1zdHIubGVuZ3RoKXsrK2M7aWYocC5uZXh0KWxpc3QuaGVhZD1wLm5leHQ7ZWxzZSBsaXN0LmhlYWQ9bGlzdC50YWlsPW51bGx9ZWxzZXtsaXN0LmhlYWQ9cDtwLmRhdGE9c3RyLnNsaWNlKG5iKX1icmVha30rK2N9bGlzdC5sZW5ndGgtPWM7cmV0dXJuIHJldH1mdW5jdGlvbiBjb3B5RnJvbUJ1ZmZlcihuLGxpc3Qpe3ZhciByZXQ9YnVmZmVyU2hpbS5hbGxvY1Vuc2FmZShuKTt2YXIgcD1saXN0LmhlYWQ7dmFyIGM9MTtwLmRhdGEuY29weShyZXQpO24tPXAuZGF0YS5sZW5ndGg7d2hpbGUocD1wLm5leHQpe3ZhciBidWY9cC5kYXRhO3ZhciBuYj1uPmJ1Zi5sZW5ndGg/YnVmLmxlbmd0aDpuO2J1Zi5jb3B5KHJldCxyZXQubGVuZ3RoLW4sMCxuYik7bi09bmI7aWYobj09PTApe2lmKG5iPT09YnVmLmxlbmd0aCl7KytjO2lmKHAubmV4dClsaXN0LmhlYWQ9cC5uZXh0O2Vsc2UgbGlzdC5oZWFkPWxpc3QudGFpbD1udWxsfWVsc2V7bGlzdC5oZWFkPXA7cC5kYXRhPWJ1Zi5zbGljZShuYil9YnJlYWt9KytjfWxpc3QubGVuZ3RoLT1jO3JldHVybiByZXR9ZnVuY3Rpb24gZW5kUmVhZGFibGUoc3RyZWFtKXt2YXIgc3RhdGU9c3RyZWFtLl9yZWFkYWJsZVN0YXRlO2lmKHN0YXRlLmxlbmd0aD4wKXRocm93IG5ldyBFcnJvcignXCJlbmRSZWFkYWJsZSgpXCIgY2FsbGVkIG9uIG5vbi1lbXB0eSBzdHJlYW0nKTtpZighc3RhdGUuZW5kRW1pdHRlZCl7c3RhdGUuZW5kZWQ9dHJ1ZTtwcm9jZXNzTmV4dFRpY2soZW5kUmVhZGFibGVOVCxzdGF0ZSxzdHJlYW0pfX1mdW5jdGlvbiBlbmRSZWFkYWJsZU5UKHN0YXRlLHN0cmVhbSl7aWYoIXN0YXRlLmVuZEVtaXR0ZWQmJnN0YXRlLmxlbmd0aD09PTApe3N0YXRlLmVuZEVtaXR0ZWQ9dHJ1ZTtzdHJlYW0ucmVhZGFibGU9ZmFsc2U7c3RyZWFtLmVtaXQoXCJlbmRcIil9fWZ1bmN0aW9uIGZvckVhY2goeHMsZil7Zm9yKHZhciBpPTAsbD14cy5sZW5ndGg7aTxsO2krKyl7Zih4c1tpXSxpKX19ZnVuY3Rpb24gaW5kZXhPZih4cyx4KXtmb3IodmFyIGk9MCxsPXhzLmxlbmd0aDtpPGw7aSsrKXtpZih4c1tpXT09PXgpcmV0dXJuIGl9cmV0dXJuLTF9fSkuY2FsbCh0aGlzLHJlcXVpcmUoXCJfcHJvY2Vzc1wiKSl9LHtcIi4vX3N0cmVhbV9kdXBsZXhcIjo0NCxcIi4vaW50ZXJuYWwvc3RyZWFtcy9CdWZmZXJMaXN0XCI6NDksX3Byb2Nlc3M6NDIsYnVmZmVyOjUsXCJidWZmZXItc2hpbXNcIjo0LFwiY29yZS11dGlsLWlzXCI6NixldmVudHM6MjgsaW5oZXJpdHM6MzgsaXNhcnJheTo0MCxcInByb2Nlc3MtbmV4dGljay1hcmdzXCI6NDEsXCJzdHJpbmdfZGVjb2Rlci9cIjo1Nix1dGlsOjN9XSw0NzpbZnVuY3Rpb24ocmVxdWlyZSxtb2R1bGUsZXhwb3J0cyl7XCJ1c2Ugc3RyaWN0XCI7bW9kdWxlLmV4cG9ydHM9VHJhbnNmb3JtO3ZhciBEdXBsZXg9cmVxdWlyZShcIi4vX3N0cmVhbV9kdXBsZXhcIik7dmFyIHV0aWw9cmVxdWlyZShcImNvcmUtdXRpbC1pc1wiKTt1dGlsLmluaGVyaXRzPXJlcXVpcmUoXCJpbmhlcml0c1wiKTt1dGlsLmluaGVyaXRzKFRyYW5zZm9ybSxEdXBsZXgpO2Z1bmN0aW9uIFRyYW5zZm9ybVN0YXRlKHN0cmVhbSl7dGhpcy5hZnRlclRyYW5zZm9ybT1mdW5jdGlvbihlcixkYXRhKXtyZXR1cm4gYWZ0ZXJUcmFuc2Zvcm0oc3RyZWFtLGVyLGRhdGEpfTt0aGlzLm5lZWRUcmFuc2Zvcm09ZmFsc2U7dGhpcy50cmFuc2Zvcm1pbmc9ZmFsc2U7dGhpcy53cml0ZWNiPW51bGw7dGhpcy53cml0ZWNodW5rPW51bGw7dGhpcy53cml0ZWVuY29kaW5nPW51bGx9ZnVuY3Rpb24gYWZ0ZXJUcmFuc2Zvcm0oc3RyZWFtLGVyLGRhdGEpe3ZhciB0cz1zdHJlYW0uX3RyYW5zZm9ybVN0YXRlO3RzLnRyYW5zZm9ybWluZz1mYWxzZTt2YXIgY2I9dHMud3JpdGVjYjtpZighY2IpcmV0dXJuIHN0cmVhbS5lbWl0KFwiZXJyb3JcIixuZXcgRXJyb3IoXCJubyB3cml0ZWNiIGluIFRyYW5zZm9ybSBjbGFzc1wiKSk7dHMud3JpdGVjaHVuaz1udWxsO3RzLndyaXRlY2I9bnVsbDtpZihkYXRhIT09bnVsbCYmZGF0YSE9PXVuZGVmaW5lZClzdHJlYW0ucHVzaChkYXRhKTtjYihlcik7dmFyIHJzPXN0cmVhbS5fcmVhZGFibGVTdGF0ZTtycy5yZWFkaW5nPWZhbHNlO2lmKHJzLm5lZWRSZWFkYWJsZXx8cnMubGVuZ3RoPHJzLmhpZ2hXYXRlck1hcmspe3N0cmVhbS5fcmVhZChycy5oaWdoV2F0ZXJNYXJrKX19ZnVuY3Rpb24gVHJhbnNmb3JtKG9wdGlvbnMpe2lmKCEodGhpcyBpbnN0YW5jZW9mIFRyYW5zZm9ybSkpcmV0dXJuIG5ldyBUcmFuc2Zvcm0ob3B0aW9ucyk7RHVwbGV4LmNhbGwodGhpcyxvcHRpb25zKTt0aGlzLl90cmFuc2Zvcm1TdGF0ZT1uZXcgVHJhbnNmb3JtU3RhdGUodGhpcyk7dmFyIHN0cmVhbT10aGlzO3RoaXMuX3JlYWRhYmxlU3RhdGUubmVlZFJlYWRhYmxlPXRydWU7dGhpcy5fcmVhZGFibGVTdGF0ZS5zeW5jPWZhbHNlO2lmKG9wdGlvbnMpe2lmKHR5cGVvZiBvcHRpb25zLnRyYW5zZm9ybT09PVwiZnVuY3Rpb25cIil0aGlzLl90cmFuc2Zvcm09b3B0aW9ucy50cmFuc2Zvcm07aWYodHlwZW9mIG9wdGlvbnMuZmx1c2g9PT1cImZ1bmN0aW9uXCIpdGhpcy5fZmx1c2g9b3B0aW9ucy5mbHVzaH10aGlzLm9uY2UoXCJwcmVmaW5pc2hcIixmdW5jdGlvbigpe2lmKHR5cGVvZiB0aGlzLl9mbHVzaD09PVwiZnVuY3Rpb25cIil0aGlzLl9mbHVzaChmdW5jdGlvbihlcil7ZG9uZShzdHJlYW0sZXIpfSk7ZWxzZSBkb25lKHN0cmVhbSl9KX1UcmFuc2Zvcm0ucHJvdG90eXBlLnB1c2g9ZnVuY3Rpb24oY2h1bmssZW5jb2Rpbmcpe3RoaXMuX3RyYW5zZm9ybVN0YXRlLm5lZWRUcmFuc2Zvcm09ZmFsc2U7cmV0dXJuIER1cGxleC5wcm90b3R5cGUucHVzaC5jYWxsKHRoaXMsY2h1bmssZW5jb2RpbmcpfTtUcmFuc2Zvcm0ucHJvdG90eXBlLl90cmFuc2Zvcm09ZnVuY3Rpb24oY2h1bmssZW5jb2RpbmcsY2Ipe3Rocm93IG5ldyBFcnJvcihcIk5vdCBpbXBsZW1lbnRlZFwiKX07VHJhbnNmb3JtLnByb3RvdHlwZS5fd3JpdGU9ZnVuY3Rpb24oY2h1bmssZW5jb2RpbmcsY2Ipe3ZhciB0cz10aGlzLl90cmFuc2Zvcm1TdGF0ZTt0cy53cml0ZWNiPWNiO3RzLndyaXRlY2h1bms9Y2h1bms7dHMud3JpdGVlbmNvZGluZz1lbmNvZGluZztpZighdHMudHJhbnNmb3JtaW5nKXt2YXIgcnM9dGhpcy5fcmVhZGFibGVTdGF0ZTtpZih0cy5uZWVkVHJhbnNmb3JtfHxycy5uZWVkUmVhZGFibGV8fHJzLmxlbmd0aDxycy5oaWdoV2F0ZXJNYXJrKXRoaXMuX3JlYWQocnMuaGlnaFdhdGVyTWFyayl9fTtUcmFuc2Zvcm0ucHJvdG90eXBlLl9yZWFkPWZ1bmN0aW9uKG4pe3ZhciB0cz10aGlzLl90cmFuc2Zvcm1TdGF0ZTtpZih0cy53cml0ZWNodW5rIT09bnVsbCYmdHMud3JpdGVjYiYmIXRzLnRyYW5zZm9ybWluZyl7dHMudHJhbnNmb3JtaW5nPXRydWU7dGhpcy5fdHJhbnNmb3JtKHRzLndyaXRlY2h1bmssdHMud3JpdGVlbmNvZGluZyx0cy5hZnRlclRyYW5zZm9ybSl9ZWxzZXt0cy5uZWVkVHJhbnNmb3JtPXRydWV9fTtmdW5jdGlvbiBkb25lKHN0cmVhbSxlcil7aWYoZXIpcmV0dXJuIHN0cmVhbS5lbWl0KFwiZXJyb3JcIixlcik7dmFyIHdzPXN0cmVhbS5fd3JpdGFibGVTdGF0ZTt2YXIgdHM9c3RyZWFtLl90cmFuc2Zvcm1TdGF0ZTtpZih3cy5sZW5ndGgpdGhyb3cgbmV3IEVycm9yKFwiQ2FsbGluZyB0cmFuc2Zvcm0gZG9uZSB3aGVuIHdzLmxlbmd0aCAhPSAwXCIpO2lmKHRzLnRyYW5zZm9ybWluZyl0aHJvdyBuZXcgRXJyb3IoXCJDYWxsaW5nIHRyYW5zZm9ybSBkb25lIHdoZW4gc3RpbGwgdHJhbnNmb3JtaW5nXCIpO3JldHVybiBzdHJlYW0ucHVzaChudWxsKX19LHtcIi4vX3N0cmVhbV9kdXBsZXhcIjo0NCxcImNvcmUtdXRpbC1pc1wiOjYsaW5oZXJpdHM6Mzh9XSw0ODpbZnVuY3Rpb24ocmVxdWlyZSxtb2R1bGUsZXhwb3J0cyl7KGZ1bmN0aW9uKHByb2Nlc3Mpe1widXNlIHN0cmljdFwiO21vZHVsZS5leHBvcnRzPVdyaXRhYmxlO3ZhciBwcm9jZXNzTmV4dFRpY2s9cmVxdWlyZShcInByb2Nlc3MtbmV4dGljay1hcmdzXCIpO3ZhciBhc3luY1dyaXRlPSFwcm9jZXNzLmJyb3dzZXImJltcInYwLjEwXCIsXCJ2MC45LlwiXS5pbmRleE9mKHByb2Nlc3MudmVyc2lvbi5zbGljZSgwLDUpKT4tMT9zZXRJbW1lZGlhdGU6cHJvY2Vzc05leHRUaWNrO1dyaXRhYmxlLldyaXRhYmxlU3RhdGU9V3JpdGFibGVTdGF0ZTt2YXIgdXRpbD1yZXF1aXJlKFwiY29yZS11dGlsLWlzXCIpO3V0aWwuaW5oZXJpdHM9cmVxdWlyZShcImluaGVyaXRzXCIpO3ZhciBpbnRlcm5hbFV0aWw9e2RlcHJlY2F0ZTpyZXF1aXJlKFwidXRpbC1kZXByZWNhdGVcIil9O3ZhciBTdHJlYW07KGZ1bmN0aW9uKCl7dHJ5e1N0cmVhbT1yZXF1aXJlKFwic3RcIitcInJlYW1cIil9Y2F0Y2goXyl7fWZpbmFsbHl7aWYoIVN0cmVhbSlTdHJlYW09cmVxdWlyZShcImV2ZW50c1wiKS5FdmVudEVtaXR0ZXJ9fSkoKTt2YXIgQnVmZmVyPXJlcXVpcmUoXCJidWZmZXJcIikuQnVmZmVyO3ZhciBidWZmZXJTaGltPXJlcXVpcmUoXCJidWZmZXItc2hpbXNcIik7dXRpbC5pbmhlcml0cyhXcml0YWJsZSxTdHJlYW0pO2Z1bmN0aW9uIG5vcCgpe31mdW5jdGlvbiBXcml0ZVJlcShjaHVuayxlbmNvZGluZyxjYil7dGhpcy5jaHVuaz1jaHVuazt0aGlzLmVuY29kaW5nPWVuY29kaW5nO3RoaXMuY2FsbGJhY2s9Y2I7dGhpcy5uZXh0PW51bGx9dmFyIER1cGxleDtmdW5jdGlvbiBXcml0YWJsZVN0YXRlKG9wdGlvbnMsc3RyZWFtKXtEdXBsZXg9RHVwbGV4fHxyZXF1aXJlKFwiLi9fc3RyZWFtX2R1cGxleFwiKTtvcHRpb25zPW9wdGlvbnN8fHt9O3RoaXMub2JqZWN0TW9kZT0hIW9wdGlvbnMub2JqZWN0TW9kZTtpZihzdHJlYW0gaW5zdGFuY2VvZiBEdXBsZXgpdGhpcy5vYmplY3RNb2RlPXRoaXMub2JqZWN0TW9kZXx8ISFvcHRpb25zLndyaXRhYmxlT2JqZWN0TW9kZTt2YXIgaHdtPW9wdGlvbnMuaGlnaFdhdGVyTWFyazt2YXIgZGVmYXVsdEh3bT10aGlzLm9iamVjdE1vZGU/MTY6MTYqMTAyNDt0aGlzLmhpZ2hXYXRlck1hcms9aHdtfHxod209PT0wP2h3bTpkZWZhdWx0SHdtO3RoaXMuaGlnaFdhdGVyTWFyaz1+fnRoaXMuaGlnaFdhdGVyTWFyazt0aGlzLm5lZWREcmFpbj1mYWxzZTt0aGlzLmVuZGluZz1mYWxzZTt0aGlzLmVuZGVkPWZhbHNlO3RoaXMuZmluaXNoZWQ9ZmFsc2U7dmFyIG5vRGVjb2RlPW9wdGlvbnMuZGVjb2RlU3RyaW5ncz09PWZhbHNlO3RoaXMuZGVjb2RlU3RyaW5ncz0hbm9EZWNvZGU7dGhpcy5kZWZhdWx0RW5jb2Rpbmc9b3B0aW9ucy5kZWZhdWx0RW5jb2Rpbmd8fFwidXRmOFwiO3RoaXMubGVuZ3RoPTA7dGhpcy53cml0aW5nPWZhbHNlO3RoaXMuY29ya2VkPTA7dGhpcy5zeW5jPXRydWU7dGhpcy5idWZmZXJQcm9jZXNzaW5nPWZhbHNlO3RoaXMub253cml0ZT1mdW5jdGlvbihlcil7b253cml0ZShzdHJlYW0sZXIpfTt0aGlzLndyaXRlY2I9bnVsbDt0aGlzLndyaXRlbGVuPTA7dGhpcy5idWZmZXJlZFJlcXVlc3Q9bnVsbDt0aGlzLmxhc3RCdWZmZXJlZFJlcXVlc3Q9bnVsbDt0aGlzLnBlbmRpbmdjYj0wO3RoaXMucHJlZmluaXNoZWQ9ZmFsc2U7dGhpcy5lcnJvckVtaXR0ZWQ9ZmFsc2U7dGhpcy5idWZmZXJlZFJlcXVlc3RDb3VudD0wO3RoaXMuY29ya2VkUmVxdWVzdHNGcmVlPW5ldyBDb3JrZWRSZXF1ZXN0KHRoaXMpfVdyaXRhYmxlU3RhdGUucHJvdG90eXBlLmdldEJ1ZmZlcj1mdW5jdGlvbiB3cml0YWJsZVN0YXRlR2V0QnVmZmVyKCl7dmFyIGN1cnJlbnQ9dGhpcy5idWZmZXJlZFJlcXVlc3Q7dmFyIG91dD1bXTt3aGlsZShjdXJyZW50KXtvdXQucHVzaChjdXJyZW50KTtjdXJyZW50PWN1cnJlbnQubmV4dH1yZXR1cm4gb3V0fTsoZnVuY3Rpb24oKXt0cnl7T2JqZWN0LmRlZmluZVByb3BlcnR5KFdyaXRhYmxlU3RhdGUucHJvdG90eXBlLFwiYnVmZmVyXCIse2dldDppbnRlcm5hbFV0aWwuZGVwcmVjYXRlKGZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuZ2V0QnVmZmVyKCl9LFwiX3dyaXRhYmxlU3RhdGUuYnVmZmVyIGlzIGRlcHJlY2F0ZWQuIFVzZSBfd3JpdGFibGVTdGF0ZS5nZXRCdWZmZXIgXCIrXCJpbnN0ZWFkLlwiKX0pfWNhdGNoKF8pe319KSgpO3ZhciBEdXBsZXg7ZnVuY3Rpb24gV3JpdGFibGUob3B0aW9ucyl7RHVwbGV4PUR1cGxleHx8cmVxdWlyZShcIi4vX3N0cmVhbV9kdXBsZXhcIik7aWYoISh0aGlzIGluc3RhbmNlb2YgV3JpdGFibGUpJiYhKHRoaXMgaW5zdGFuY2VvZiBEdXBsZXgpKXJldHVybiBuZXcgV3JpdGFibGUob3B0aW9ucyk7dGhpcy5fd3JpdGFibGVTdGF0ZT1uZXcgV3JpdGFibGVTdGF0ZShvcHRpb25zLHRoaXMpO3RoaXMud3JpdGFibGU9dHJ1ZTtpZihvcHRpb25zKXtpZih0eXBlb2Ygb3B0aW9ucy53cml0ZT09PVwiZnVuY3Rpb25cIil0aGlzLl93cml0ZT1vcHRpb25zLndyaXRlO2lmKHR5cGVvZiBvcHRpb25zLndyaXRldj09PVwiZnVuY3Rpb25cIil0aGlzLl93cml0ZXY9b3B0aW9ucy53cml0ZXZ9U3RyZWFtLmNhbGwodGhpcyl9V3JpdGFibGUucHJvdG90eXBlLnBpcGU9ZnVuY3Rpb24oKXt0aGlzLmVtaXQoXCJlcnJvclwiLG5ldyBFcnJvcihcIkNhbm5vdCBwaXBlLCBub3QgcmVhZGFibGVcIikpfTtmdW5jdGlvbiB3cml0ZUFmdGVyRW5kKHN0cmVhbSxjYil7dmFyIGVyPW5ldyBFcnJvcihcIndyaXRlIGFmdGVyIGVuZFwiKTtzdHJlYW0uZW1pdChcImVycm9yXCIsZXIpO3Byb2Nlc3NOZXh0VGljayhjYixlcil9ZnVuY3Rpb24gdmFsaWRDaHVuayhzdHJlYW0sc3RhdGUsY2h1bmssY2Ipe3ZhciB2YWxpZD10cnVlO3ZhciBlcj1mYWxzZTtpZihjaHVuaz09PW51bGwpe2VyPW5ldyBUeXBlRXJyb3IoXCJNYXkgbm90IHdyaXRlIG51bGwgdmFsdWVzIHRvIHN0cmVhbVwiKX1lbHNlIGlmKCFCdWZmZXIuaXNCdWZmZXIoY2h1bmspJiZ0eXBlb2YgY2h1bmshPT1cInN0cmluZ1wiJiZjaHVuayE9PXVuZGVmaW5lZCYmIXN0YXRlLm9iamVjdE1vZGUpe2VyPW5ldyBUeXBlRXJyb3IoXCJJbnZhbGlkIG5vbi1zdHJpbmcvYnVmZmVyIGNodW5rXCIpfWlmKGVyKXtzdHJlYW0uZW1pdChcImVycm9yXCIsZXIpO3Byb2Nlc3NOZXh0VGljayhjYixlcik7dmFsaWQ9ZmFsc2V9cmV0dXJuIHZhbGlkfVdyaXRhYmxlLnByb3RvdHlwZS53cml0ZT1mdW5jdGlvbihjaHVuayxlbmNvZGluZyxjYil7dmFyIHN0YXRlPXRoaXMuX3dyaXRhYmxlU3RhdGU7dmFyIHJldD1mYWxzZTtpZih0eXBlb2YgZW5jb2Rpbmc9PT1cImZ1bmN0aW9uXCIpe2NiPWVuY29kaW5nO2VuY29kaW5nPW51bGx9aWYoQnVmZmVyLmlzQnVmZmVyKGNodW5rKSllbmNvZGluZz1cImJ1ZmZlclwiO2Vsc2UgaWYoIWVuY29kaW5nKWVuY29kaW5nPXN0YXRlLmRlZmF1bHRFbmNvZGluZztpZih0eXBlb2YgY2IhPT1cImZ1bmN0aW9uXCIpY2I9bm9wO2lmKHN0YXRlLmVuZGVkKXdyaXRlQWZ0ZXJFbmQodGhpcyxjYik7ZWxzZSBpZih2YWxpZENodW5rKHRoaXMsc3RhdGUsY2h1bmssY2IpKXtcbnN0YXRlLnBlbmRpbmdjYisrO3JldD13cml0ZU9yQnVmZmVyKHRoaXMsc3RhdGUsY2h1bmssZW5jb2RpbmcsY2IpfXJldHVybiByZXR9O1dyaXRhYmxlLnByb3RvdHlwZS5jb3JrPWZ1bmN0aW9uKCl7dmFyIHN0YXRlPXRoaXMuX3dyaXRhYmxlU3RhdGU7c3RhdGUuY29ya2VkKyt9O1dyaXRhYmxlLnByb3RvdHlwZS51bmNvcms9ZnVuY3Rpb24oKXt2YXIgc3RhdGU9dGhpcy5fd3JpdGFibGVTdGF0ZTtpZihzdGF0ZS5jb3JrZWQpe3N0YXRlLmNvcmtlZC0tO2lmKCFzdGF0ZS53cml0aW5nJiYhc3RhdGUuY29ya2VkJiYhc3RhdGUuZmluaXNoZWQmJiFzdGF0ZS5idWZmZXJQcm9jZXNzaW5nJiZzdGF0ZS5idWZmZXJlZFJlcXVlc3QpY2xlYXJCdWZmZXIodGhpcyxzdGF0ZSl9fTtXcml0YWJsZS5wcm90b3R5cGUuc2V0RGVmYXVsdEVuY29kaW5nPWZ1bmN0aW9uIHNldERlZmF1bHRFbmNvZGluZyhlbmNvZGluZyl7aWYodHlwZW9mIGVuY29kaW5nPT09XCJzdHJpbmdcIillbmNvZGluZz1lbmNvZGluZy50b0xvd2VyQ2FzZSgpO2lmKCEoW1wiaGV4XCIsXCJ1dGY4XCIsXCJ1dGYtOFwiLFwiYXNjaWlcIixcImJpbmFyeVwiLFwiYmFzZTY0XCIsXCJ1Y3MyXCIsXCJ1Y3MtMlwiLFwidXRmMTZsZVwiLFwidXRmLTE2bGVcIixcInJhd1wiXS5pbmRleE9mKChlbmNvZGluZytcIlwiKS50b0xvd2VyQ2FzZSgpKT4tMSkpdGhyb3cgbmV3IFR5cGVFcnJvcihcIlVua25vd24gZW5jb2Rpbmc6IFwiK2VuY29kaW5nKTt0aGlzLl93cml0YWJsZVN0YXRlLmRlZmF1bHRFbmNvZGluZz1lbmNvZGluZztyZXR1cm4gdGhpc307ZnVuY3Rpb24gZGVjb2RlQ2h1bmsoc3RhdGUsY2h1bmssZW5jb2Rpbmcpe2lmKCFzdGF0ZS5vYmplY3RNb2RlJiZzdGF0ZS5kZWNvZGVTdHJpbmdzIT09ZmFsc2UmJnR5cGVvZiBjaHVuaz09PVwic3RyaW5nXCIpe2NodW5rPWJ1ZmZlclNoaW0uZnJvbShjaHVuayxlbmNvZGluZyl9cmV0dXJuIGNodW5rfWZ1bmN0aW9uIHdyaXRlT3JCdWZmZXIoc3RyZWFtLHN0YXRlLGNodW5rLGVuY29kaW5nLGNiKXtjaHVuaz1kZWNvZGVDaHVuayhzdGF0ZSxjaHVuayxlbmNvZGluZyk7aWYoQnVmZmVyLmlzQnVmZmVyKGNodW5rKSllbmNvZGluZz1cImJ1ZmZlclwiO3ZhciBsZW49c3RhdGUub2JqZWN0TW9kZT8xOmNodW5rLmxlbmd0aDtzdGF0ZS5sZW5ndGgrPWxlbjt2YXIgcmV0PXN0YXRlLmxlbmd0aDxzdGF0ZS5oaWdoV2F0ZXJNYXJrO2lmKCFyZXQpc3RhdGUubmVlZERyYWluPXRydWU7aWYoc3RhdGUud3JpdGluZ3x8c3RhdGUuY29ya2VkKXt2YXIgbGFzdD1zdGF0ZS5sYXN0QnVmZmVyZWRSZXF1ZXN0O3N0YXRlLmxhc3RCdWZmZXJlZFJlcXVlc3Q9bmV3IFdyaXRlUmVxKGNodW5rLGVuY29kaW5nLGNiKTtpZihsYXN0KXtsYXN0Lm5leHQ9c3RhdGUubGFzdEJ1ZmZlcmVkUmVxdWVzdH1lbHNle3N0YXRlLmJ1ZmZlcmVkUmVxdWVzdD1zdGF0ZS5sYXN0QnVmZmVyZWRSZXF1ZXN0fXN0YXRlLmJ1ZmZlcmVkUmVxdWVzdENvdW50Kz0xfWVsc2V7ZG9Xcml0ZShzdHJlYW0sc3RhdGUsZmFsc2UsbGVuLGNodW5rLGVuY29kaW5nLGNiKX1yZXR1cm4gcmV0fWZ1bmN0aW9uIGRvV3JpdGUoc3RyZWFtLHN0YXRlLHdyaXRldixsZW4sY2h1bmssZW5jb2RpbmcsY2Ipe3N0YXRlLndyaXRlbGVuPWxlbjtzdGF0ZS53cml0ZWNiPWNiO3N0YXRlLndyaXRpbmc9dHJ1ZTtzdGF0ZS5zeW5jPXRydWU7aWYod3JpdGV2KXN0cmVhbS5fd3JpdGV2KGNodW5rLHN0YXRlLm9ud3JpdGUpO2Vsc2Ugc3RyZWFtLl93cml0ZShjaHVuayxlbmNvZGluZyxzdGF0ZS5vbndyaXRlKTtzdGF0ZS5zeW5jPWZhbHNlfWZ1bmN0aW9uIG9ud3JpdGVFcnJvcihzdHJlYW0sc3RhdGUsc3luYyxlcixjYil7LS1zdGF0ZS5wZW5kaW5nY2I7aWYoc3luYylwcm9jZXNzTmV4dFRpY2soY2IsZXIpO2Vsc2UgY2IoZXIpO3N0cmVhbS5fd3JpdGFibGVTdGF0ZS5lcnJvckVtaXR0ZWQ9dHJ1ZTtzdHJlYW0uZW1pdChcImVycm9yXCIsZXIpfWZ1bmN0aW9uIG9ud3JpdGVTdGF0ZVVwZGF0ZShzdGF0ZSl7c3RhdGUud3JpdGluZz1mYWxzZTtzdGF0ZS53cml0ZWNiPW51bGw7c3RhdGUubGVuZ3RoLT1zdGF0ZS53cml0ZWxlbjtzdGF0ZS53cml0ZWxlbj0wfWZ1bmN0aW9uIG9ud3JpdGUoc3RyZWFtLGVyKXt2YXIgc3RhdGU9c3RyZWFtLl93cml0YWJsZVN0YXRlO3ZhciBzeW5jPXN0YXRlLnN5bmM7dmFyIGNiPXN0YXRlLndyaXRlY2I7b253cml0ZVN0YXRlVXBkYXRlKHN0YXRlKTtpZihlcilvbndyaXRlRXJyb3Ioc3RyZWFtLHN0YXRlLHN5bmMsZXIsY2IpO2Vsc2V7dmFyIGZpbmlzaGVkPW5lZWRGaW5pc2goc3RhdGUpO2lmKCFmaW5pc2hlZCYmIXN0YXRlLmNvcmtlZCYmIXN0YXRlLmJ1ZmZlclByb2Nlc3NpbmcmJnN0YXRlLmJ1ZmZlcmVkUmVxdWVzdCl7Y2xlYXJCdWZmZXIoc3RyZWFtLHN0YXRlKX1pZihzeW5jKXthc3luY1dyaXRlKGFmdGVyV3JpdGUsc3RyZWFtLHN0YXRlLGZpbmlzaGVkLGNiKX1lbHNle2FmdGVyV3JpdGUoc3RyZWFtLHN0YXRlLGZpbmlzaGVkLGNiKX19fWZ1bmN0aW9uIGFmdGVyV3JpdGUoc3RyZWFtLHN0YXRlLGZpbmlzaGVkLGNiKXtpZighZmluaXNoZWQpb253cml0ZURyYWluKHN0cmVhbSxzdGF0ZSk7c3RhdGUucGVuZGluZ2NiLS07Y2IoKTtmaW5pc2hNYXliZShzdHJlYW0sc3RhdGUpfWZ1bmN0aW9uIG9ud3JpdGVEcmFpbihzdHJlYW0sc3RhdGUpe2lmKHN0YXRlLmxlbmd0aD09PTAmJnN0YXRlLm5lZWREcmFpbil7c3RhdGUubmVlZERyYWluPWZhbHNlO3N0cmVhbS5lbWl0KFwiZHJhaW5cIil9fWZ1bmN0aW9uIGNsZWFyQnVmZmVyKHN0cmVhbSxzdGF0ZSl7c3RhdGUuYnVmZmVyUHJvY2Vzc2luZz10cnVlO3ZhciBlbnRyeT1zdGF0ZS5idWZmZXJlZFJlcXVlc3Q7aWYoc3RyZWFtLl93cml0ZXYmJmVudHJ5JiZlbnRyeS5uZXh0KXt2YXIgbD1zdGF0ZS5idWZmZXJlZFJlcXVlc3RDb3VudDt2YXIgYnVmZmVyPW5ldyBBcnJheShsKTt2YXIgaG9sZGVyPXN0YXRlLmNvcmtlZFJlcXVlc3RzRnJlZTtob2xkZXIuZW50cnk9ZW50cnk7dmFyIGNvdW50PTA7d2hpbGUoZW50cnkpe2J1ZmZlcltjb3VudF09ZW50cnk7ZW50cnk9ZW50cnkubmV4dDtjb3VudCs9MX1kb1dyaXRlKHN0cmVhbSxzdGF0ZSx0cnVlLHN0YXRlLmxlbmd0aCxidWZmZXIsXCJcIixob2xkZXIuZmluaXNoKTtzdGF0ZS5wZW5kaW5nY2IrKztzdGF0ZS5sYXN0QnVmZmVyZWRSZXF1ZXN0PW51bGw7aWYoaG9sZGVyLm5leHQpe3N0YXRlLmNvcmtlZFJlcXVlc3RzRnJlZT1ob2xkZXIubmV4dDtob2xkZXIubmV4dD1udWxsfWVsc2V7c3RhdGUuY29ya2VkUmVxdWVzdHNGcmVlPW5ldyBDb3JrZWRSZXF1ZXN0KHN0YXRlKX19ZWxzZXt3aGlsZShlbnRyeSl7dmFyIGNodW5rPWVudHJ5LmNodW5rO3ZhciBlbmNvZGluZz1lbnRyeS5lbmNvZGluZzt2YXIgY2I9ZW50cnkuY2FsbGJhY2s7dmFyIGxlbj1zdGF0ZS5vYmplY3RNb2RlPzE6Y2h1bmsubGVuZ3RoO2RvV3JpdGUoc3RyZWFtLHN0YXRlLGZhbHNlLGxlbixjaHVuayxlbmNvZGluZyxjYik7ZW50cnk9ZW50cnkubmV4dDtpZihzdGF0ZS53cml0aW5nKXticmVha319aWYoZW50cnk9PT1udWxsKXN0YXRlLmxhc3RCdWZmZXJlZFJlcXVlc3Q9bnVsbH1zdGF0ZS5idWZmZXJlZFJlcXVlc3RDb3VudD0wO3N0YXRlLmJ1ZmZlcmVkUmVxdWVzdD1lbnRyeTtzdGF0ZS5idWZmZXJQcm9jZXNzaW5nPWZhbHNlfVdyaXRhYmxlLnByb3RvdHlwZS5fd3JpdGU9ZnVuY3Rpb24oY2h1bmssZW5jb2RpbmcsY2Ipe2NiKG5ldyBFcnJvcihcIm5vdCBpbXBsZW1lbnRlZFwiKSl9O1dyaXRhYmxlLnByb3RvdHlwZS5fd3JpdGV2PW51bGw7V3JpdGFibGUucHJvdG90eXBlLmVuZD1mdW5jdGlvbihjaHVuayxlbmNvZGluZyxjYil7dmFyIHN0YXRlPXRoaXMuX3dyaXRhYmxlU3RhdGU7aWYodHlwZW9mIGNodW5rPT09XCJmdW5jdGlvblwiKXtjYj1jaHVuaztjaHVuaz1udWxsO2VuY29kaW5nPW51bGx9ZWxzZSBpZih0eXBlb2YgZW5jb2Rpbmc9PT1cImZ1bmN0aW9uXCIpe2NiPWVuY29kaW5nO2VuY29kaW5nPW51bGx9aWYoY2h1bmshPT1udWxsJiZjaHVuayE9PXVuZGVmaW5lZCl0aGlzLndyaXRlKGNodW5rLGVuY29kaW5nKTtpZihzdGF0ZS5jb3JrZWQpe3N0YXRlLmNvcmtlZD0xO3RoaXMudW5jb3JrKCl9aWYoIXN0YXRlLmVuZGluZyYmIXN0YXRlLmZpbmlzaGVkKWVuZFdyaXRhYmxlKHRoaXMsc3RhdGUsY2IpfTtmdW5jdGlvbiBuZWVkRmluaXNoKHN0YXRlKXtyZXR1cm4gc3RhdGUuZW5kaW5nJiZzdGF0ZS5sZW5ndGg9PT0wJiZzdGF0ZS5idWZmZXJlZFJlcXVlc3Q9PT1udWxsJiYhc3RhdGUuZmluaXNoZWQmJiFzdGF0ZS53cml0aW5nfWZ1bmN0aW9uIHByZWZpbmlzaChzdHJlYW0sc3RhdGUpe2lmKCFzdGF0ZS5wcmVmaW5pc2hlZCl7c3RhdGUucHJlZmluaXNoZWQ9dHJ1ZTtzdHJlYW0uZW1pdChcInByZWZpbmlzaFwiKX19ZnVuY3Rpb24gZmluaXNoTWF5YmUoc3RyZWFtLHN0YXRlKXt2YXIgbmVlZD1uZWVkRmluaXNoKHN0YXRlKTtpZihuZWVkKXtpZihzdGF0ZS5wZW5kaW5nY2I9PT0wKXtwcmVmaW5pc2goc3RyZWFtLHN0YXRlKTtzdGF0ZS5maW5pc2hlZD10cnVlO3N0cmVhbS5lbWl0KFwiZmluaXNoXCIpfWVsc2V7cHJlZmluaXNoKHN0cmVhbSxzdGF0ZSl9fXJldHVybiBuZWVkfWZ1bmN0aW9uIGVuZFdyaXRhYmxlKHN0cmVhbSxzdGF0ZSxjYil7c3RhdGUuZW5kaW5nPXRydWU7ZmluaXNoTWF5YmUoc3RyZWFtLHN0YXRlKTtpZihjYil7aWYoc3RhdGUuZmluaXNoZWQpcHJvY2Vzc05leHRUaWNrKGNiKTtlbHNlIHN0cmVhbS5vbmNlKFwiZmluaXNoXCIsY2IpfXN0YXRlLmVuZGVkPXRydWU7c3RyZWFtLndyaXRhYmxlPWZhbHNlfWZ1bmN0aW9uIENvcmtlZFJlcXVlc3Qoc3RhdGUpe3ZhciBfdGhpcz10aGlzO3RoaXMubmV4dD1udWxsO3RoaXMuZW50cnk9bnVsbDt0aGlzLmZpbmlzaD1mdW5jdGlvbihlcnIpe3ZhciBlbnRyeT1fdGhpcy5lbnRyeTtfdGhpcy5lbnRyeT1udWxsO3doaWxlKGVudHJ5KXt2YXIgY2I9ZW50cnkuY2FsbGJhY2s7c3RhdGUucGVuZGluZ2NiLS07Y2IoZXJyKTtlbnRyeT1lbnRyeS5uZXh0fWlmKHN0YXRlLmNvcmtlZFJlcXVlc3RzRnJlZSl7c3RhdGUuY29ya2VkUmVxdWVzdHNGcmVlLm5leHQ9X3RoaXN9ZWxzZXtzdGF0ZS5jb3JrZWRSZXF1ZXN0c0ZyZWU9X3RoaXN9fX19KS5jYWxsKHRoaXMscmVxdWlyZShcIl9wcm9jZXNzXCIpKX0se1wiLi9fc3RyZWFtX2R1cGxleFwiOjQ0LF9wcm9jZXNzOjQyLGJ1ZmZlcjo1LFwiYnVmZmVyLXNoaW1zXCI6NCxcImNvcmUtdXRpbC1pc1wiOjYsZXZlbnRzOjI4LGluaGVyaXRzOjM4LFwicHJvY2Vzcy1uZXh0aWNrLWFyZ3NcIjo0MSxcInV0aWwtZGVwcmVjYXRlXCI6NTd9XSw0OTpbZnVuY3Rpb24ocmVxdWlyZSxtb2R1bGUsZXhwb3J0cyl7XCJ1c2Ugc3RyaWN0XCI7dmFyIEJ1ZmZlcj1yZXF1aXJlKFwiYnVmZmVyXCIpLkJ1ZmZlcjt2YXIgYnVmZmVyU2hpbT1yZXF1aXJlKFwiYnVmZmVyLXNoaW1zXCIpO21vZHVsZS5leHBvcnRzPUJ1ZmZlckxpc3Q7ZnVuY3Rpb24gQnVmZmVyTGlzdCgpe3RoaXMuaGVhZD1udWxsO3RoaXMudGFpbD1udWxsO3RoaXMubGVuZ3RoPTB9QnVmZmVyTGlzdC5wcm90b3R5cGUucHVzaD1mdW5jdGlvbih2KXt2YXIgZW50cnk9e2RhdGE6dixuZXh0Om51bGx9O2lmKHRoaXMubGVuZ3RoPjApdGhpcy50YWlsLm5leHQ9ZW50cnk7ZWxzZSB0aGlzLmhlYWQ9ZW50cnk7dGhpcy50YWlsPWVudHJ5OysrdGhpcy5sZW5ndGh9O0J1ZmZlckxpc3QucHJvdG90eXBlLnVuc2hpZnQ9ZnVuY3Rpb24odil7dmFyIGVudHJ5PXtkYXRhOnYsbmV4dDp0aGlzLmhlYWR9O2lmKHRoaXMubGVuZ3RoPT09MCl0aGlzLnRhaWw9ZW50cnk7dGhpcy5oZWFkPWVudHJ5OysrdGhpcy5sZW5ndGh9O0J1ZmZlckxpc3QucHJvdG90eXBlLnNoaWZ0PWZ1bmN0aW9uKCl7aWYodGhpcy5sZW5ndGg9PT0wKXJldHVybjt2YXIgcmV0PXRoaXMuaGVhZC5kYXRhO2lmKHRoaXMubGVuZ3RoPT09MSl0aGlzLmhlYWQ9dGhpcy50YWlsPW51bGw7ZWxzZSB0aGlzLmhlYWQ9dGhpcy5oZWFkLm5leHQ7LS10aGlzLmxlbmd0aDtyZXR1cm4gcmV0fTtCdWZmZXJMaXN0LnByb3RvdHlwZS5jbGVhcj1mdW5jdGlvbigpe3RoaXMuaGVhZD10aGlzLnRhaWw9bnVsbDt0aGlzLmxlbmd0aD0wfTtCdWZmZXJMaXN0LnByb3RvdHlwZS5qb2luPWZ1bmN0aW9uKHMpe2lmKHRoaXMubGVuZ3RoPT09MClyZXR1cm5cIlwiO3ZhciBwPXRoaXMuaGVhZDt2YXIgcmV0PVwiXCIrcC5kYXRhO3doaWxlKHA9cC5uZXh0KXtyZXQrPXMrcC5kYXRhfXJldHVybiByZXR9O0J1ZmZlckxpc3QucHJvdG90eXBlLmNvbmNhdD1mdW5jdGlvbihuKXtpZih0aGlzLmxlbmd0aD09PTApcmV0dXJuIGJ1ZmZlclNoaW0uYWxsb2MoMCk7aWYodGhpcy5sZW5ndGg9PT0xKXJldHVybiB0aGlzLmhlYWQuZGF0YTt2YXIgcmV0PWJ1ZmZlclNoaW0uYWxsb2NVbnNhZmUobj4+PjApO3ZhciBwPXRoaXMuaGVhZDt2YXIgaT0wO3doaWxlKHApe3AuZGF0YS5jb3B5KHJldCxpKTtpKz1wLmRhdGEubGVuZ3RoO3A9cC5uZXh0fXJldHVybiByZXR9fSx7YnVmZmVyOjUsXCJidWZmZXItc2hpbXNcIjo0fV0sNTA6W2Z1bmN0aW9uKHJlcXVpcmUsbW9kdWxlLGV4cG9ydHMpe21vZHVsZS5leHBvcnRzPXJlcXVpcmUoXCIuL2xpYi9fc3RyZWFtX3Bhc3N0aHJvdWdoLmpzXCIpfSx7XCIuL2xpYi9fc3RyZWFtX3Bhc3N0aHJvdWdoLmpzXCI6NDV9XSw1MTpbZnVuY3Rpb24ocmVxdWlyZSxtb2R1bGUsZXhwb3J0cyl7KGZ1bmN0aW9uKHByb2Nlc3Mpe3ZhciBTdHJlYW09ZnVuY3Rpb24oKXt0cnl7cmV0dXJuIHJlcXVpcmUoXCJzdFwiK1wicmVhbVwiKX1jYXRjaChfKXt9fSgpO2V4cG9ydHM9bW9kdWxlLmV4cG9ydHM9cmVxdWlyZShcIi4vbGliL19zdHJlYW1fcmVhZGFibGUuanNcIik7ZXhwb3J0cy5TdHJlYW09U3RyZWFtfHxleHBvcnRzO2V4cG9ydHMuUmVhZGFibGU9ZXhwb3J0cztleHBvcnRzLldyaXRhYmxlPXJlcXVpcmUoXCIuL2xpYi9fc3RyZWFtX3dyaXRhYmxlLmpzXCIpO2V4cG9ydHMuRHVwbGV4PXJlcXVpcmUoXCIuL2xpYi9fc3RyZWFtX2R1cGxleC5qc1wiKTtleHBvcnRzLlRyYW5zZm9ybT1yZXF1aXJlKFwiLi9saWIvX3N0cmVhbV90cmFuc2Zvcm0uanNcIik7ZXhwb3J0cy5QYXNzVGhyb3VnaD1yZXF1aXJlKFwiLi9saWIvX3N0cmVhbV9wYXNzdGhyb3VnaC5qc1wiKTtpZighcHJvY2Vzcy5icm93c2VyJiZwcm9jZXNzLmVudi5SRUFEQUJMRV9TVFJFQU09PT1cImRpc2FibGVcIiYmU3RyZWFtKXttb2R1bGUuZXhwb3J0cz1TdHJlYW19fSkuY2FsbCh0aGlzLHJlcXVpcmUoXCJfcHJvY2Vzc1wiKSl9LHtcIi4vbGliL19zdHJlYW1fZHVwbGV4LmpzXCI6NDQsXCIuL2xpYi9fc3RyZWFtX3Bhc3N0aHJvdWdoLmpzXCI6NDUsXCIuL2xpYi9fc3RyZWFtX3JlYWRhYmxlLmpzXCI6NDYsXCIuL2xpYi9fc3RyZWFtX3RyYW5zZm9ybS5qc1wiOjQ3LFwiLi9saWIvX3N0cmVhbV93cml0YWJsZS5qc1wiOjQ4LF9wcm9jZXNzOjQyfV0sNTI6W2Z1bmN0aW9uKHJlcXVpcmUsbW9kdWxlLGV4cG9ydHMpe21vZHVsZS5leHBvcnRzPXJlcXVpcmUoXCIuL2xpYi9fc3RyZWFtX3RyYW5zZm9ybS5qc1wiKX0se1wiLi9saWIvX3N0cmVhbV90cmFuc2Zvcm0uanNcIjo0N31dLDUzOltmdW5jdGlvbihyZXF1aXJlLG1vZHVsZSxleHBvcnRzKXttb2R1bGUuZXhwb3J0cz1yZXF1aXJlKFwiLi9saWIvX3N0cmVhbV93cml0YWJsZS5qc1wiKX0se1wiLi9saWIvX3N0cmVhbV93cml0YWJsZS5qc1wiOjQ4fV0sNTQ6W2Z1bmN0aW9uKHJlcXVpcmUsbW9kdWxlLGV4cG9ydHMpe21vZHVsZS5leHBvcnRzPWZ1bmN0aW9uKHN0cmluZyl7cmV0dXJuIHN0cmluZy5yZXBsYWNlKC9bLVxcXFxeJCorPy4oKXxbXFxde31dL2csXCJcXFxcJCZcIil9fSx7fV0sNTU6W2Z1bmN0aW9uKHJlcXVpcmUsbW9kdWxlLGV4cG9ydHMpe21vZHVsZS5leHBvcnRzPVN0cmVhbTt2YXIgRUU9cmVxdWlyZShcImV2ZW50c1wiKS5FdmVudEVtaXR0ZXI7dmFyIGluaGVyaXRzPXJlcXVpcmUoXCJpbmhlcml0c1wiKTtpbmhlcml0cyhTdHJlYW0sRUUpO1N0cmVhbS5SZWFkYWJsZT1yZXF1aXJlKFwicmVhZGFibGUtc3RyZWFtL3JlYWRhYmxlLmpzXCIpO1N0cmVhbS5Xcml0YWJsZT1yZXF1aXJlKFwicmVhZGFibGUtc3RyZWFtL3dyaXRhYmxlLmpzXCIpO1N0cmVhbS5EdXBsZXg9cmVxdWlyZShcInJlYWRhYmxlLXN0cmVhbS9kdXBsZXguanNcIik7U3RyZWFtLlRyYW5zZm9ybT1yZXF1aXJlKFwicmVhZGFibGUtc3RyZWFtL3RyYW5zZm9ybS5qc1wiKTtTdHJlYW0uUGFzc1Rocm91Z2g9cmVxdWlyZShcInJlYWRhYmxlLXN0cmVhbS9wYXNzdGhyb3VnaC5qc1wiKTtTdHJlYW0uU3RyZWFtPVN0cmVhbTtmdW5jdGlvbiBTdHJlYW0oKXtFRS5jYWxsKHRoaXMpfVN0cmVhbS5wcm90b3R5cGUucGlwZT1mdW5jdGlvbihkZXN0LG9wdGlvbnMpe3ZhciBzb3VyY2U9dGhpcztmdW5jdGlvbiBvbmRhdGEoY2h1bmspe2lmKGRlc3Qud3JpdGFibGUpe2lmKGZhbHNlPT09ZGVzdC53cml0ZShjaHVuaykmJnNvdXJjZS5wYXVzZSl7c291cmNlLnBhdXNlKCl9fX1zb3VyY2Uub24oXCJkYXRhXCIsb25kYXRhKTtmdW5jdGlvbiBvbmRyYWluKCl7aWYoc291cmNlLnJlYWRhYmxlJiZzb3VyY2UucmVzdW1lKXtzb3VyY2UucmVzdW1lKCl9fWRlc3Qub24oXCJkcmFpblwiLG9uZHJhaW4pO2lmKCFkZXN0Ll9pc1N0ZGlvJiYoIW9wdGlvbnN8fG9wdGlvbnMuZW5kIT09ZmFsc2UpKXtzb3VyY2Uub24oXCJlbmRcIixvbmVuZCk7c291cmNlLm9uKFwiY2xvc2VcIixvbmNsb3NlKX12YXIgZGlkT25FbmQ9ZmFsc2U7ZnVuY3Rpb24gb25lbmQoKXtpZihkaWRPbkVuZClyZXR1cm47ZGlkT25FbmQ9dHJ1ZTtkZXN0LmVuZCgpfWZ1bmN0aW9uIG9uY2xvc2UoKXtpZihkaWRPbkVuZClyZXR1cm47ZGlkT25FbmQ9dHJ1ZTtpZih0eXBlb2YgZGVzdC5kZXN0cm95PT09XCJmdW5jdGlvblwiKWRlc3QuZGVzdHJveSgpfWZ1bmN0aW9uIG9uZXJyb3IoZXIpe2NsZWFudXAoKTtpZihFRS5saXN0ZW5lckNvdW50KHRoaXMsXCJlcnJvclwiKT09PTApe3Rocm93IGVyfX1zb3VyY2Uub24oXCJlcnJvclwiLG9uZXJyb3IpO2Rlc3Qub24oXCJlcnJvclwiLG9uZXJyb3IpO2Z1bmN0aW9uIGNsZWFudXAoKXtzb3VyY2UucmVtb3ZlTGlzdGVuZXIoXCJkYXRhXCIsb25kYXRhKTtkZXN0LnJlbW92ZUxpc3RlbmVyKFwiZHJhaW5cIixvbmRyYWluKTtzb3VyY2UucmVtb3ZlTGlzdGVuZXIoXCJlbmRcIixvbmVuZCk7c291cmNlLnJlbW92ZUxpc3RlbmVyKFwiY2xvc2VcIixvbmNsb3NlKTtzb3VyY2UucmVtb3ZlTGlzdGVuZXIoXCJlcnJvclwiLG9uZXJyb3IpO2Rlc3QucmVtb3ZlTGlzdGVuZXIoXCJlcnJvclwiLG9uZXJyb3IpO3NvdXJjZS5yZW1vdmVMaXN0ZW5lcihcImVuZFwiLGNsZWFudXApO3NvdXJjZS5yZW1vdmVMaXN0ZW5lcihcImNsb3NlXCIsY2xlYW51cCk7ZGVzdC5yZW1vdmVMaXN0ZW5lcihcImNsb3NlXCIsY2xlYW51cCl9c291cmNlLm9uKFwiZW5kXCIsY2xlYW51cCk7c291cmNlLm9uKFwiY2xvc2VcIixjbGVhbnVwKTtkZXN0Lm9uKFwiY2xvc2VcIixjbGVhbnVwKTtkZXN0LmVtaXQoXCJwaXBlXCIsc291cmNlKTtyZXR1cm4gZGVzdH19LHtldmVudHM6MjgsaW5oZXJpdHM6MzgsXCJyZWFkYWJsZS1zdHJlYW0vZHVwbGV4LmpzXCI6NDMsXCJyZWFkYWJsZS1zdHJlYW0vcGFzc3Rocm91Z2guanNcIjo1MCxcInJlYWRhYmxlLXN0cmVhbS9yZWFkYWJsZS5qc1wiOjUxLFwicmVhZGFibGUtc3RyZWFtL3RyYW5zZm9ybS5qc1wiOjUyLFwicmVhZGFibGUtc3RyZWFtL3dyaXRhYmxlLmpzXCI6NTN9XSw1NjpbZnVuY3Rpb24ocmVxdWlyZSxtb2R1bGUsZXhwb3J0cyl7dmFyIEJ1ZmZlcj1yZXF1aXJlKFwiYnVmZmVyXCIpLkJ1ZmZlcjt2YXIgaXNCdWZmZXJFbmNvZGluZz1CdWZmZXIuaXNFbmNvZGluZ3x8ZnVuY3Rpb24oZW5jb2Rpbmcpe3N3aXRjaChlbmNvZGluZyYmZW5jb2RpbmcudG9Mb3dlckNhc2UoKSl7Y2FzZVwiaGV4XCI6Y2FzZVwidXRmOFwiOmNhc2VcInV0Zi04XCI6Y2FzZVwiYXNjaWlcIjpjYXNlXCJiaW5hcnlcIjpjYXNlXCJiYXNlNjRcIjpjYXNlXCJ1Y3MyXCI6Y2FzZVwidWNzLTJcIjpjYXNlXCJ1dGYxNmxlXCI6Y2FzZVwidXRmLTE2bGVcIjpjYXNlXCJyYXdcIjpyZXR1cm4gdHJ1ZTtkZWZhdWx0OnJldHVybiBmYWxzZX19O2Z1bmN0aW9uIGFzc2VydEVuY29kaW5nKGVuY29kaW5nKXtpZihlbmNvZGluZyYmIWlzQnVmZmVyRW5jb2RpbmcoZW5jb2RpbmcpKXt0aHJvdyBuZXcgRXJyb3IoXCJVbmtub3duIGVuY29kaW5nOiBcIitlbmNvZGluZyl9fXZhciBTdHJpbmdEZWNvZGVyPWV4cG9ydHMuU3RyaW5nRGVjb2Rlcj1mdW5jdGlvbihlbmNvZGluZyl7dGhpcy5lbmNvZGluZz0oZW5jb2Rpbmd8fFwidXRmOFwiKS50b0xvd2VyQ2FzZSgpLnJlcGxhY2UoL1stX10vLFwiXCIpO2Fzc2VydEVuY29kaW5nKGVuY29kaW5nKTtzd2l0Y2godGhpcy5lbmNvZGluZyl7Y2FzZVwidXRmOFwiOnRoaXMuc3Vycm9nYXRlU2l6ZT0zO2JyZWFrO2Nhc2VcInVjczJcIjpjYXNlXCJ1dGYxNmxlXCI6dGhpcy5zdXJyb2dhdGVTaXplPTI7dGhpcy5kZXRlY3RJbmNvbXBsZXRlQ2hhcj11dGYxNkRldGVjdEluY29tcGxldGVDaGFyO2JyZWFrO2Nhc2VcImJhc2U2NFwiOnRoaXMuc3Vycm9nYXRlU2l6ZT0zO3RoaXMuZGV0ZWN0SW5jb21wbGV0ZUNoYXI9YmFzZTY0RGV0ZWN0SW5jb21wbGV0ZUNoYXI7YnJlYWs7ZGVmYXVsdDp0aGlzLndyaXRlPXBhc3NUaHJvdWdoV3JpdGU7cmV0dXJufXRoaXMuY2hhckJ1ZmZlcj1uZXcgQnVmZmVyKDYpO3RoaXMuY2hhclJlY2VpdmVkPTA7dGhpcy5jaGFyTGVuZ3RoPTB9O1N0cmluZ0RlY29kZXIucHJvdG90eXBlLndyaXRlPWZ1bmN0aW9uKGJ1ZmZlcil7dmFyIGNoYXJTdHI9XCJcIjt3aGlsZSh0aGlzLmNoYXJMZW5ndGgpe3ZhciBhdmFpbGFibGU9YnVmZmVyLmxlbmd0aD49dGhpcy5jaGFyTGVuZ3RoLXRoaXMuY2hhclJlY2VpdmVkP3RoaXMuY2hhckxlbmd0aC10aGlzLmNoYXJSZWNlaXZlZDpidWZmZXIubGVuZ3RoO2J1ZmZlci5jb3B5KHRoaXMuY2hhckJ1ZmZlcix0aGlzLmNoYXJSZWNlaXZlZCwwLGF2YWlsYWJsZSk7dGhpcy5jaGFyUmVjZWl2ZWQrPWF2YWlsYWJsZTtpZih0aGlzLmNoYXJSZWNlaXZlZDx0aGlzLmNoYXJMZW5ndGgpe3JldHVyblwiXCJ9YnVmZmVyPWJ1ZmZlci5zbGljZShhdmFpbGFibGUsYnVmZmVyLmxlbmd0aCk7Y2hhclN0cj10aGlzLmNoYXJCdWZmZXIuc2xpY2UoMCx0aGlzLmNoYXJMZW5ndGgpLnRvU3RyaW5nKHRoaXMuZW5jb2RpbmcpO3ZhciBjaGFyQ29kZT1jaGFyU3RyLmNoYXJDb2RlQXQoY2hhclN0ci5sZW5ndGgtMSk7aWYoY2hhckNvZGU+PTU1Mjk2JiZjaGFyQ29kZTw9NTYzMTkpe3RoaXMuY2hhckxlbmd0aCs9dGhpcy5zdXJyb2dhdGVTaXplO2NoYXJTdHI9XCJcIjtjb250aW51ZX10aGlzLmNoYXJSZWNlaXZlZD10aGlzLmNoYXJMZW5ndGg9MDtpZihidWZmZXIubGVuZ3RoPT09MCl7cmV0dXJuIGNoYXJTdHJ9YnJlYWt9dGhpcy5kZXRlY3RJbmNvbXBsZXRlQ2hhcihidWZmZXIpO3ZhciBlbmQ9YnVmZmVyLmxlbmd0aDtpZih0aGlzLmNoYXJMZW5ndGgpe2J1ZmZlci5jb3B5KHRoaXMuY2hhckJ1ZmZlciwwLGJ1ZmZlci5sZW5ndGgtdGhpcy5jaGFyUmVjZWl2ZWQsZW5kKTtlbmQtPXRoaXMuY2hhclJlY2VpdmVkfWNoYXJTdHIrPWJ1ZmZlci50b1N0cmluZyh0aGlzLmVuY29kaW5nLDAsZW5kKTt2YXIgZW5kPWNoYXJTdHIubGVuZ3RoLTE7dmFyIGNoYXJDb2RlPWNoYXJTdHIuY2hhckNvZGVBdChlbmQpO2lmKGNoYXJDb2RlPj01NTI5NiYmY2hhckNvZGU8PTU2MzE5KXt2YXIgc2l6ZT10aGlzLnN1cnJvZ2F0ZVNpemU7dGhpcy5jaGFyTGVuZ3RoKz1zaXplO3RoaXMuY2hhclJlY2VpdmVkKz1zaXplO3RoaXMuY2hhckJ1ZmZlci5jb3B5KHRoaXMuY2hhckJ1ZmZlcixzaXplLDAsc2l6ZSk7YnVmZmVyLmNvcHkodGhpcy5jaGFyQnVmZmVyLDAsMCxzaXplKTtyZXR1cm4gY2hhclN0ci5zdWJzdHJpbmcoMCxlbmQpfXJldHVybiBjaGFyU3RyfTtTdHJpbmdEZWNvZGVyLnByb3RvdHlwZS5kZXRlY3RJbmNvbXBsZXRlQ2hhcj1mdW5jdGlvbihidWZmZXIpe3ZhciBpPWJ1ZmZlci5sZW5ndGg+PTM/MzpidWZmZXIubGVuZ3RoO2Zvcig7aT4wO2ktLSl7dmFyIGM9YnVmZmVyW2J1ZmZlci5sZW5ndGgtaV07aWYoaT09MSYmYz4+NT09Nil7dGhpcy5jaGFyTGVuZ3RoPTI7YnJlYWt9aWYoaTw9MiYmYz4+ND09MTQpe3RoaXMuY2hhckxlbmd0aD0zO2JyZWFrfWlmKGk8PTMmJmM+PjM9PTMwKXt0aGlzLmNoYXJMZW5ndGg9NDticmVha319dGhpcy5jaGFyUmVjZWl2ZWQ9aX07U3RyaW5nRGVjb2Rlci5wcm90b3R5cGUuZW5kPWZ1bmN0aW9uKGJ1ZmZlcil7dmFyIHJlcz1cIlwiO2lmKGJ1ZmZlciYmYnVmZmVyLmxlbmd0aClyZXM9dGhpcy53cml0ZShidWZmZXIpO2lmKHRoaXMuY2hhclJlY2VpdmVkKXt2YXIgY3I9dGhpcy5jaGFyUmVjZWl2ZWQ7dmFyIGJ1Zj10aGlzLmNoYXJCdWZmZXI7dmFyIGVuYz10aGlzLmVuY29kaW5nO3Jlcys9YnVmLnNsaWNlKDAsY3IpLnRvU3RyaW5nKGVuYyl9cmV0dXJuIHJlc307ZnVuY3Rpb24gcGFzc1Rocm91Z2hXcml0ZShidWZmZXIpe3JldHVybiBidWZmZXIudG9TdHJpbmcodGhpcy5lbmNvZGluZyl9ZnVuY3Rpb24gdXRmMTZEZXRlY3RJbmNvbXBsZXRlQ2hhcihidWZmZXIpe3RoaXMuY2hhclJlY2VpdmVkPWJ1ZmZlci5sZW5ndGglMjt0aGlzLmNoYXJMZW5ndGg9dGhpcy5jaGFyUmVjZWl2ZWQ/MjowfWZ1bmN0aW9uIGJhc2U2NERldGVjdEluY29tcGxldGVDaGFyKGJ1ZmZlcil7dGhpcy5jaGFyUmVjZWl2ZWQ9YnVmZmVyLmxlbmd0aCUzO3RoaXMuY2hhckxlbmd0aD10aGlzLmNoYXJSZWNlaXZlZD8zOjB9fSx7YnVmZmVyOjV9XSw1NzpbZnVuY3Rpb24ocmVxdWlyZSxtb2R1bGUsZXhwb3J0cyl7KGZ1bmN0aW9uKGdsb2JhbCl7bW9kdWxlLmV4cG9ydHM9ZGVwcmVjYXRlO2Z1bmN0aW9uIGRlcHJlY2F0ZShmbixtc2cpe2lmKGNvbmZpZyhcIm5vRGVwcmVjYXRpb25cIikpe3JldHVybiBmbn12YXIgd2FybmVkPWZhbHNlO2Z1bmN0aW9uIGRlcHJlY2F0ZWQoKXtpZighd2FybmVkKXtpZihjb25maWcoXCJ0aHJvd0RlcHJlY2F0aW9uXCIpKXt0aHJvdyBuZXcgRXJyb3IobXNnKX1lbHNlIGlmKGNvbmZpZyhcInRyYWNlRGVwcmVjYXRpb25cIikpe2NvbnNvbGUudHJhY2UobXNnKX1lbHNle2NvbnNvbGUud2Fybihtc2cpfXdhcm5lZD10cnVlfXJldHVybiBmbi5hcHBseSh0aGlzLGFyZ3VtZW50cyl9cmV0dXJuIGRlcHJlY2F0ZWR9ZnVuY3Rpb24gY29uZmlnKG5hbWUpe3RyeXtpZighZ2xvYmFsLmxvY2FsU3RvcmFnZSlyZXR1cm4gZmFsc2V9Y2F0Y2goXyl7cmV0dXJuIGZhbHNlfXZhciB2YWw9Z2xvYmFsLmxvY2FsU3RvcmFnZVtuYW1lXTtpZihudWxsPT12YWwpcmV0dXJuIGZhbHNlO3JldHVybiBTdHJpbmcodmFsKS50b0xvd2VyQ2FzZSgpPT09XCJ0cnVlXCJ9fSkuY2FsbCh0aGlzLHR5cGVvZiBnbG9iYWwhPT1cInVuZGVmaW5lZFwiP2dsb2JhbDp0eXBlb2Ygc2VsZiE9PVwidW5kZWZpbmVkXCI/c2VsZjp0eXBlb2Ygd2luZG93IT09XCJ1bmRlZmluZWRcIj93aW5kb3c6e30pfSx7fV0sNTg6W2Z1bmN0aW9uKHJlcXVpcmUsbW9kdWxlLGV4cG9ydHMpe21vZHVsZS5leHBvcnRzPWV4dGVuZDt2YXIgaGFzT3duUHJvcGVydHk9T2JqZWN0LnByb3RvdHlwZS5oYXNPd25Qcm9wZXJ0eTtmdW5jdGlvbiBleHRlbmQoKXt2YXIgdGFyZ2V0PXt9O2Zvcih2YXIgaT0wO2k8YXJndW1lbnRzLmxlbmd0aDtpKyspe3ZhciBzb3VyY2U9YXJndW1lbnRzW2ldO2Zvcih2YXIga2V5IGluIHNvdXJjZSl7aWYoaGFzT3duUHJvcGVydHkuY2FsbChzb3VyY2Usa2V5KSl7dGFyZ2V0W2tleV09c291cmNlW2tleV19fX1yZXR1cm4gdGFyZ2V0fX0se31dfSx7fSxbMV0pKDEpfSk7XG4iLCIoZnVuY3Rpb24gZSh0LG4scil7ZnVuY3Rpb24gcyhvLHUpe2lmKCFuW29dKXtpZighdFtvXSl7dmFyIGE9dHlwZW9mIHJlcXVpcmU9PVwiZnVuY3Rpb25cIiYmcmVxdWlyZTtpZighdSYmYSlyZXR1cm4gYShvLCEwKTtpZihpKXJldHVybiBpKG8sITApO3ZhciBmPW5ldyBFcnJvcihcIkNhbm5vdCBmaW5kIG1vZHVsZSAnXCIrbytcIidcIik7dGhyb3cgZi5jb2RlPVwiTU9EVUxFX05PVF9GT1VORFwiLGZ9dmFyIGw9bltvXT17ZXhwb3J0czp7fX07dFtvXVswXS5jYWxsKGwuZXhwb3J0cyxmdW5jdGlvbihlKXt2YXIgbj10W29dWzFdW2VdO3JldHVybiBzKG4/bjplKX0sbCxsLmV4cG9ydHMsZSx0LG4scil9cmV0dXJuIG5bb10uZXhwb3J0c312YXIgaT10eXBlb2YgcmVxdWlyZT09XCJmdW5jdGlvblwiJiZyZXF1aXJlO2Zvcih2YXIgbz0wO288ci5sZW5ndGg7bysrKXMocltvXSk7cmV0dXJuIHN9KSIsIid1c2Ugc3RyaWN0JztcblxudmFyIGF1dGggPSByZXF1aXJlKCcuL2xpYi9hdXRoJyk7XG52YXIgaGVscGVycyA9IHJlcXVpcmUoJy4vbGliL2hlbHBlcnMnKTtcbnZhciBTd2FnZ2VyQ2xpZW50ID0gcmVxdWlyZSgnLi9saWIvY2xpZW50Jyk7XG52YXIgZGVwcmVjYXRpb25XcmFwcGVyID0gZnVuY3Rpb24gKHVybCwgb3B0aW9ucykge1xuICBoZWxwZXJzLmxvZygnVGhpcyBpcyBkZXByZWNhdGVkLCB1c2UgXCJuZXcgU3dhZ2dlckNsaWVudFwiIGluc3RlYWQuJyk7XG5cbiAgcmV0dXJuIG5ldyBTd2FnZ2VyQ2xpZW50KHVybCwgb3B0aW9ucyk7XG59O1xuXG4vKiBIZXJlIGZvciBJRTggU3VwcG9ydCAqL1xuaWYgKCFBcnJheS5wcm90b3R5cGUuaW5kZXhPZikge1xuICBBcnJheS5wcm90b3R5cGUuaW5kZXhPZiA9IGZ1bmN0aW9uKG9iaiwgc3RhcnQpIHtcbiAgICBmb3IgKHZhciBpID0gKHN0YXJ0IHx8IDApLCBqID0gdGhpcy5sZW5ndGg7IGkgPCBqOyBpKyspIHtcbiAgICAgIGlmICh0aGlzW2ldID09PSBvYmopIHsgcmV0dXJuIGk7IH1cbiAgICB9XG4gICAgcmV0dXJuIC0xO1xuICB9O1xufVxuXG4vKiBIZXJlIGZvciBJRTggU3VwcG9ydCAqL1xuaWYgKCFTdHJpbmcucHJvdG90eXBlLnRyaW0pIHtcbiAgU3RyaW5nLnByb3RvdHlwZS50cmltID0gZnVuY3Rpb24gKCkge1xuICAgIHJldHVybiB0aGlzLnJlcGxhY2UoL15cXHMrfFxccyskL2csICcnKTtcbiAgfTtcbn1cblxuLyogSGVyZSBmb3Igbm9kZSAxMC54IHN1cHBvcnQgKi9cbmlmICghU3RyaW5nLnByb3RvdHlwZS5lbmRzV2l0aCkge1xuICBTdHJpbmcucHJvdG90eXBlLmVuZHNXaXRoID0gZnVuY3Rpb24oc3VmZml4KSB7XG4gICAgcmV0dXJuIHRoaXMuaW5kZXhPZihzdWZmaXgsIHRoaXMubGVuZ3RoIC0gc3VmZml4Lmxlbmd0aCkgIT09IC0xO1xuICB9O1xufVxuXG5tb2R1bGUuZXhwb3J0cyA9IFN3YWdnZXJDbGllbnQ7XG5cblN3YWdnZXJDbGllbnQuQXBpS2V5QXV0aG9yaXphdGlvbiA9IGF1dGguQXBpS2V5QXV0aG9yaXphdGlvbjtcblN3YWdnZXJDbGllbnQuUGFzc3dvcmRBdXRob3JpemF0aW9uID0gYXV0aC5QYXNzd29yZEF1dGhvcml6YXRpb247XG5Td2FnZ2VyQ2xpZW50LkNvb2tpZUF1dGhvcml6YXRpb24gPSBhdXRoLkNvb2tpZUF1dGhvcml6YXRpb247XG5Td2FnZ2VyQ2xpZW50LlN3YWdnZXJBcGkgPSBkZXByZWNhdGlvbldyYXBwZXI7XG5Td2FnZ2VyQ2xpZW50LlN3YWdnZXJDbGllbnQgPSBkZXByZWNhdGlvbldyYXBwZXI7XG5Td2FnZ2VyQ2xpZW50LlNjaGVtYU1hcmt1cCA9IHJlcXVpcmUoJy4vbGliL3NjaGVtYS1tYXJrdXAnKTtcbiIsIid1c2Ugc3RyaWN0JztcblxudmFyIGhlbHBlcnMgPSByZXF1aXJlKCcuL2hlbHBlcnMnKTtcbnZhciBidG9hID0gcmVxdWlyZSgnYnRvYScpOyAvLyBqc2hpbnQgaWdub3JlOmxpbmVcbnZhciBDb29raWVKYXIgPSByZXF1aXJlKCdjb29raWVqYXInKS5Db29raWVKYXI7XG52YXIgXyA9IHtcbiAgZWFjaDogcmVxdWlyZSgnbG9kYXNoLWNvbXBhdC9jb2xsZWN0aW9uL2VhY2gnKSxcbiAgaW5jbHVkZXM6IHJlcXVpcmUoJ2xvZGFzaC1jb21wYXQvY29sbGVjdGlvbi9pbmNsdWRlcycpLFxuICBpc09iamVjdDogcmVxdWlyZSgnbG9kYXNoLWNvbXBhdC9sYW5nL2lzT2JqZWN0JyksXG4gIGlzQXJyYXk6IHJlcXVpcmUoJ2xvZGFzaC1jb21wYXQvbGFuZy9pc0FycmF5Jylcbn07XG5cbi8qKlxuICogU3dhZ2dlckF1dGhvcml6YXRpb25zIGFwcGxpZXMgdGhlIGNvcnJlY3QgYXV0aG9yaXphdGlvbiB0byBhbiBvcGVyYXRpb24gYmVpbmcgZXhlY3V0ZWRcbiAqL1xudmFyIFN3YWdnZXJBdXRob3JpemF0aW9ucyA9IG1vZHVsZS5leHBvcnRzLlN3YWdnZXJBdXRob3JpemF0aW9ucyA9IGZ1bmN0aW9uIChhdXRoeikge1xuICB0aGlzLmF1dGh6ID0gYXV0aHogfHwge307XG59O1xuXG4vKipcbiAqIEFkZCBhdXRocyB0byB0aGUgaGFzaFxuICogV2lsbCBvdmVyd3JpdGUgYW55IGV4aXN0aW5nXG4gKlxuICovXG5Td2FnZ2VyQXV0aG9yaXphdGlvbnMucHJvdG90eXBlLmFkZCA9IGZ1bmN0aW9uIChuYW1lLCBhdXRoKSB7XG4gIGlmKF8uaXNPYmplY3QobmFtZSkpIHtcbiAgICBmb3IgKHZhciBrZXkgaW4gbmFtZSkge1xuICAgICAgdGhpcy5hdXRoeltrZXldID0gbmFtZVtrZXldO1xuICAgIH1cbiAgfSBlbHNlIGlmKHR5cGVvZiBuYW1lID09PSAnc3RyaW5nJyApe1xuICAgIHRoaXMuYXV0aHpbbmFtZV0gPSBhdXRoO1xuICB9XG5cbiAgcmV0dXJuIGF1dGg7XG59O1xuXG5Td2FnZ2VyQXV0aG9yaXphdGlvbnMucHJvdG90eXBlLnJlbW92ZSA9IGZ1bmN0aW9uIChuYW1lKSB7XG4gIHJldHVybiBkZWxldGUgdGhpcy5hdXRoeltuYW1lXTtcbn07XG5cblN3YWdnZXJBdXRob3JpemF0aW9ucy5wcm90b3R5cGUuYXBwbHkgPSBmdW5jdGlvbiAob2JqLCBzZWN1cml0aWVzKSB7XG4gIHZhciBzdGF0dXMgPSB0cnVlO1xuICB2YXIgYXBwbHlBbGwgPSAhc2VjdXJpdGllcztcbiAgdmFyIGZsYXR0ZW5lZFNlY3VyaXRpZXMgPSBbXTtcblxuICAvLyBmYXZvciB0aGUgb2JqZWN0LWxldmVsIGF1dGhvcml6YXRpb25zIG92ZXIgZ2xvYmFsXG4gIHZhciBhdXRoeiA9IG9iai5jbGllbnRBdXRob3JpemF0aW9ucyB8fCB0aGlzLmF1dGh6O1xuXG4gIC8vIFNlY3VyaXRpZXMgY291bGQgYmUgWyB7fSBdXG4gIF8uZWFjaChzZWN1cml0aWVzLCBmdW5jdGlvbiAob2JqLCBrZXkpIHtcblxuICAgIC8vIE1ha2Ugc3VyZSB3ZSBhY2NvdW50IGZvciBzZWN1cml0aWVzIGJlaW5nIFsgc3RyIF1cbiAgICBpZih0eXBlb2Yga2V5ID09PSAnc3RyaW5nJykge1xuICAgICAgZmxhdHRlbmVkU2VjdXJpdGllcy5wdXNoKGtleSk7XG4gICAgfVxuXG4gICAgLy8gRmxhdHRlbiBrZXlzIGluIHRvIG91ciBhcnJheVxuICAgIF8uZWFjaChvYmosIGZ1bmN0aW9uICh2YWwsIGtleSkge1xuICAgICAgZmxhdHRlbmVkU2VjdXJpdGllcy5wdXNoKGtleSk7XG4gICAgfSk7XG4gIH0pO1xuXG4gIF8uZWFjaChhdXRoeiwgZnVuY3Rpb24gKGF1dGgsIGF1dGhOYW1lKSB7XG4gICAgaWYoYXBwbHlBbGwgfHwgXy5pbmNsdWRlcyhmbGF0dGVuZWRTZWN1cml0aWVzLCBhdXRoTmFtZSkpIHtcbiAgICAgIHZhciBuZXdTdGF0dXMgPSBhdXRoLmFwcGx5KG9iaik7XG4gICAgICBzdGF0dXMgPSBzdGF0dXMgJiYgISFuZXdTdGF0dXM7IC8vIGxvZ2ljYWwgT1JzIHJlZ2FyZGluZyBzdGF0dXNcbiAgICB9XG4gIH0pO1xuXG4gIHJldHVybiBzdGF0dXM7XG59O1xuXG4vKipcbiAqIEFwaUtleUF1dGhvcml6YXRpb24gYWxsb3dzIGEgcXVlcnkgcGFyYW0gb3IgaGVhZGVyIHRvIGJlIGluamVjdGVkXG4gKi9cbnZhciBBcGlLZXlBdXRob3JpemF0aW9uID0gbW9kdWxlLmV4cG9ydHMuQXBpS2V5QXV0aG9yaXphdGlvbiA9IGZ1bmN0aW9uIChuYW1lLCB2YWx1ZSwgdHlwZSkge1xuICB0aGlzLm5hbWUgPSBuYW1lO1xuICB0aGlzLnZhbHVlID0gdmFsdWU7XG4gIHRoaXMudHlwZSA9IHR5cGU7XG59O1xuXG5BcGlLZXlBdXRob3JpemF0aW9uLnByb3RvdHlwZS5hcHBseSA9IGZ1bmN0aW9uIChvYmopIHtcbiAgaWYgKHRoaXMudHlwZSA9PT0gJ3F1ZXJ5Jykge1xuICAgIC8vIHNlZSBpZiBhbHJlYWR5IGFwcGxpZWQuICBJZiBzbywgZG9uJ3QgZG8gaXQgYWdhaW5cblxuICAgIHZhciBxcDtcbiAgICBpZiAob2JqLnVybC5pbmRleE9mKCc/JykgPiAwKSB7XG4gICAgICBxcCA9IG9iai51cmwuc3Vic3RyaW5nKG9iai51cmwuaW5kZXhPZignPycpICsgMSk7XG4gICAgICB2YXIgcGFydHMgPSBxcC5zcGxpdCgnJicpO1xuICAgICAgaWYocGFydHMgJiYgcGFydHMubGVuZ3RoID4gMCkge1xuICAgICAgICBmb3IodmFyIGkgPSAwOyBpIDwgcGFydHMubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgICB2YXIga3YgPSBwYXJ0c1tpXS5zcGxpdCgnPScpO1xuICAgICAgICAgIGlmKGt2ICYmIGt2Lmxlbmd0aCA+IDApIHtcbiAgICAgICAgICAgIGlmIChrdlswXSA9PT0gdGhpcy5uYW1lKSB7XG4gICAgICAgICAgICAgIC8vIHNraXAgaXRcbiAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgICAgICAgfVxuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cblxuICAgIGlmIChvYmoudXJsLmluZGV4T2YoJz8nKSA+IDApIHtcbiAgICAgIG9iai51cmwgPSBvYmoudXJsICsgJyYnICsgdGhpcy5uYW1lICsgJz0nICsgdGhpcy52YWx1ZTtcbiAgICB9IGVsc2Uge1xuICAgICAgb2JqLnVybCA9IG9iai51cmwgKyAnPycgKyB0aGlzLm5hbWUgKyAnPScgKyB0aGlzLnZhbHVlO1xuICAgIH1cblxuICAgIHJldHVybiB0cnVlO1xuICB9IGVsc2UgaWYgKHRoaXMudHlwZSA9PT0gJ2hlYWRlcicpIHtcbiAgICBpZih0eXBlb2Ygb2JqLmhlYWRlcnNbdGhpcy5uYW1lXSA9PT0gJ3VuZGVmaW5lZCcpIHtcbiAgICAgIG9iai5oZWFkZXJzW3RoaXMubmFtZV0gPSB0aGlzLnZhbHVlO1xuICAgIH1cblxuICAgIHJldHVybiB0cnVlO1xuICB9XG59O1xuXG52YXIgQ29va2llQXV0aG9yaXphdGlvbiA9IG1vZHVsZS5leHBvcnRzLkNvb2tpZUF1dGhvcml6YXRpb24gPSBmdW5jdGlvbiAoY29va2llKSB7XG4gIHRoaXMuY29va2llID0gY29va2llO1xufTtcblxuQ29va2llQXV0aG9yaXphdGlvbi5wcm90b3R5cGUuYXBwbHkgPSBmdW5jdGlvbiAob2JqKSB7XG4gIG9iai5jb29raWVKYXIgPSBvYmouY29va2llSmFyIHx8IG5ldyBDb29raWVKYXIoKTtcbiAgb2JqLmNvb2tpZUphci5zZXRDb29raWUodGhpcy5jb29raWUpO1xuXG4gIHJldHVybiB0cnVlO1xufTtcblxuLyoqXG4gKiBQYXNzd29yZCBBdXRob3JpemF0aW9uIGlzIGEgYmFzaWMgYXV0aCBpbXBsZW1lbnRhdGlvblxuICovXG52YXIgUGFzc3dvcmRBdXRob3JpemF0aW9uID0gbW9kdWxlLmV4cG9ydHMuUGFzc3dvcmRBdXRob3JpemF0aW9uID0gZnVuY3Rpb24gKHVzZXJuYW1lLCBwYXNzd29yZCkge1xuICBpZiAoYXJndW1lbnRzLmxlbmd0aCA9PT0gMykge1xuICAgIGhlbHBlcnMubG9nKCdQYXNzd29yZEF1dGhvcml6YXRpb246IHRoZSBcXCduYW1lXFwnIGFyZ3VtZW50IGhhcyBiZWVuIHJlbW92ZWQsIHBhc3Mgb25seSB1c2VybmFtZSBhbmQgcGFzc3dvcmQnKTtcbiAgICB1c2VybmFtZSA9IGFyZ3VtZW50c1sxXTtcbiAgICBwYXNzd29yZCA9IGFyZ3VtZW50c1syXTtcbiAgfVxuICB0aGlzLnVzZXJuYW1lID0gdXNlcm5hbWU7XG4gIHRoaXMucGFzc3dvcmQgPSBwYXNzd29yZDtcbn07XG5cblBhc3N3b3JkQXV0aG9yaXphdGlvbi5wcm90b3R5cGUuYXBwbHkgPSBmdW5jdGlvbiAob2JqKSB7XG4gIGlmKHR5cGVvZiBvYmouaGVhZGVycy5BdXRob3JpemF0aW9uID09PSAndW5kZWZpbmVkJykge1xuICAgIG9iai5oZWFkZXJzLkF1dGhvcml6YXRpb24gPSAnQmFzaWMgJyArIGJ0b2EodGhpcy51c2VybmFtZSArICc6JyArIHRoaXMucGFzc3dvcmQpO1xuICB9XG5cbiAgcmV0dXJuIHRydWU7XG59O1xuIiwiJ3VzZSBzdHJpY3QnO1xuXG52YXIgXyA9IHtcbiAgYmluZDogcmVxdWlyZSgnbG9kYXNoLWNvbXBhdC9mdW5jdGlvbi9iaW5kJyksXG4gIGNsb25lRGVlcDogcmVxdWlyZSgnbG9kYXNoLWNvbXBhdC9sYW5nL2Nsb25lRGVlcCcpLFxuICBmaW5kOiByZXF1aXJlKCdsb2Rhc2gtY29tcGF0L2NvbGxlY3Rpb24vZmluZCcpLFxuICBmb3JFYWNoOiByZXF1aXJlKCdsb2Rhc2gtY29tcGF0L2NvbGxlY3Rpb24vZm9yRWFjaCcpLFxuICBpbmRleE9mOiByZXF1aXJlKCdsb2Rhc2gtY29tcGF0L2FycmF5L2luZGV4T2YnKSxcbiAgaXNBcnJheTogcmVxdWlyZSgnbG9kYXNoLWNvbXBhdC9sYW5nL2lzQXJyYXknKSxcbiAgaXNPYmplY3Q6IHJlcXVpcmUoJ2xvZGFzaC1jb21wYXQvbGFuZy9pc09iamVjdCcpLFxuICBpc0Z1bmN0aW9uOiByZXF1aXJlKCdsb2Rhc2gtY29tcGF0L2xhbmcvaXNGdW5jdGlvbicpLFxuICBpc1BsYWluT2JqZWN0OiByZXF1aXJlKCdsb2Rhc2gtY29tcGF0L2xhbmcvaXNQbGFpbk9iamVjdCcpLFxuICBpc1VuZGVmaW5lZDogcmVxdWlyZSgnbG9kYXNoLWNvbXBhdC9sYW5nL2lzVW5kZWZpbmVkJylcbn07XG52YXIgYXV0aCA9IHJlcXVpcmUoJy4vYXV0aCcpO1xudmFyIGhlbHBlcnMgPSByZXF1aXJlKCcuL2hlbHBlcnMnKTtcbnZhciBNb2RlbCA9IHJlcXVpcmUoJy4vdHlwZXMvbW9kZWwnKTtcbnZhciBPcGVyYXRpb24gPSByZXF1aXJlKCcuL3R5cGVzL29wZXJhdGlvbicpO1xudmFyIE9wZXJhdGlvbkdyb3VwID0gcmVxdWlyZSgnLi90eXBlcy9vcGVyYXRpb25Hcm91cCcpO1xudmFyIFJlc29sdmVyID0gcmVxdWlyZSgnLi9yZXNvbHZlcicpO1xudmFyIFN3YWdnZXJIdHRwID0gcmVxdWlyZSgnLi9odHRwJyk7XG52YXIgU3dhZ2dlclNwZWNDb252ZXJ0ZXIgPSByZXF1aXJlKCcuL3NwZWMtY29udmVydGVyJyk7XG52YXIgUSA9IHJlcXVpcmUoJ3EnKTtcblxuLy8gV2UgaGF2ZSB0byBrZWVwIHRyYWNrIG9mIHRoZSBmdW5jdGlvbi9wcm9wZXJ0eSBuYW1lcyB0byBhdm9pZCBjb2xsaXNpb25zIGZvciB0YWcgbmFtZXMgd2hpY2ggYXJlIHVzZWQgdG8gYWxsb3cgdGhlXG4vLyBmb2xsb3dpbmcgdXNhZ2U6ICdjbGllbnQue3RhZ05hbWV9J1xudmFyIHJlc2VydmVkQ2xpZW50VGFncyA9IFtcbiAgJ2FwaXMnLFxuICAnYXV0aG9yaXphdGlvblNjaGVtZScsXG4gICdhdXRob3JpemF0aW9ucycsXG4gICdiYXNlUGF0aCcsXG4gICdidWlsZCcsXG4gICdidWlsZEZyb20xXzFTcGVjJyxcbiAgJ2J1aWxkRnJvbTFfMlNwZWMnLFxuICAnYnVpbGRGcm9tU3BlYycsXG4gICdjbGllbnRBdXRob3JpemF0aW9ucycsXG4gICdjb252ZXJ0SW5mbycsXG4gICdkZWJ1ZycsXG4gICdkZWZhdWx0RXJyb3JDYWxsYmFjaycsXG4gICdkZWZhdWx0U3VjY2Vzc0NhbGxiYWNrJyxcbiAgJ2VuYWJsZUNvb2tpZXMnLFxuICAnZmFpbCcsXG4gICdmYWlsdXJlJyxcbiAgJ2ZpbmlzaCcsXG4gICdoZWxwJyxcbiAgJ2hvc3QnLFxuICAnaWRGcm9tT3AnLFxuICAnaW5mbycsXG4gICdpbml0aWFsaXplJyxcbiAgJ2lzQnVpbHQnLFxuICAnaXNWYWxpZCcsXG4gICdtb2RlbFByb3BlcnR5TWFjcm8nLFxuICAnbW9kZWxzJyxcbiAgJ21vZGVsc0FycmF5JyxcbiAgJ29wdGlvbnMnLFxuICAncGFyYW1ldGVyTWFjcm8nLFxuICAncGFyc2VVcmknLFxuICAncHJvZ3Jlc3MnLFxuICAncmVzb3VyY2VDb3VudCcsXG4gICdzYW1wbGVNb2RlbHMnLFxuICAnc2VsZlJlZmxlY3QnLFxuICAnc2V0Q29uc29saWRhdGVkTW9kZWxzJyxcbiAgJ3NwZWMnLFxuICAnc3VwcG9ydGVkU3VibWl0TWV0aG9kcycsXG4gICdzd2FnZ2VyUmVxdWVzdEhlYWRlcnMnLFxuICAndGFnRnJvbUxhYmVsJyxcbiAgJ3RpdGxlJyxcbiAgJ3VybCcsXG4gICd1c2VKUXVlcnknLFxuICAnanF1ZXJ5QWpheENhY2hlJ1xuXTtcbi8vIFdlIGhhdmUgdG8ga2VlcCB0cmFjayBvZiB0aGUgZnVuY3Rpb24vcHJvcGVydHkgbmFtZXMgdG8gYXZvaWQgY29sbGlzaW9ucyBmb3IgdGFnIG5hbWVzIHdoaWNoIGFyZSB1c2VkIHRvIGFsbG93IHRoZVxuLy8gZm9sbG93aW5nIHVzYWdlOiAnY2xpZW50LmFwaXMue3RhZ05hbWV9J1xudmFyIHJlc2VydmVkQXBpVGFncyA9IFtcbiAgJ2FwaXMnLFxuICAnYXNDdXJsJyxcbiAgJ2Rlc2NyaXB0aW9uJyxcbiAgJ2V4dGVybmFsRG9jcycsXG4gICdoZWxwJyxcbiAgJ2xhYmVsJyxcbiAgJ25hbWUnLFxuICAnb3BlcmF0aW9uJyxcbiAgJ29wZXJhdGlvbnMnLFxuICAnb3BlcmF0aW9uc0FycmF5JyxcbiAgJ3BhdGgnLFxuICAndGFnJ1xuXTtcbnZhciBzdXBwb3J0ZWRPcGVyYXRpb25NZXRob2RzID0gWydkZWxldGUnLCAnZ2V0JywgJ2hlYWQnLCAnb3B0aW9ucycsICdwYXRjaCcsICdwb3N0JywgJ3B1dCddO1xudmFyIFN3YWdnZXJDbGllbnQgPSBtb2R1bGUuZXhwb3J0cyA9IGZ1bmN0aW9uICh1cmwsIG9wdGlvbnMpIHtcbiAgdGhpcy5hdXRob3JpemF0aW9ucyA9IG51bGw7XG4gIHRoaXMuYXV0aG9yaXphdGlvblNjaGVtZSA9IG51bGw7XG4gIHRoaXMuYmFzZVBhdGggPSBudWxsO1xuICB0aGlzLmRlYnVnID0gZmFsc2U7XG4gIHRoaXMuZW5hYmxlQ29va2llcyA9IGZhbHNlO1xuICB0aGlzLmluZm8gPSBudWxsO1xuICB0aGlzLmlzQnVpbHQgPSBmYWxzZTtcbiAgdGhpcy5pc1ZhbGlkID0gZmFsc2U7XG4gIHRoaXMubW9kZWxzQXJyYXkgPSBbXTtcbiAgdGhpcy5yZXNvdXJjZUNvdW50ID0gMDtcbiAgdGhpcy51cmwgPSBudWxsO1xuICB0aGlzLnVzZUpRdWVyeSA9IGZhbHNlO1xuICB0aGlzLmpxdWVyeUFqYXhDYWNoZSA9IGZhbHNlO1xuICB0aGlzLnN3YWdnZXJPYmplY3QgPSB7fTtcbiAgdGhpcy5kZWZlcnJlZENsaWVudCA9IHVuZGVmaW5lZDtcblxuICB0aGlzLmNsaWVudEF1dGhvcml6YXRpb25zID0gbmV3IGF1dGguU3dhZ2dlckF1dGhvcml6YXRpb25zKCk7XG5cbiAgaWYgKHR5cGVvZiB1cmwgIT09ICd1bmRlZmluZWQnKSB7XG4gICAgcmV0dXJuIHRoaXMuaW5pdGlhbGl6ZSh1cmwsIG9wdGlvbnMpO1xuICB9IGVsc2Uge1xuICAgIHJldHVybiB0aGlzO1xuICB9XG59O1xuXG5Td2FnZ2VyQ2xpZW50LnByb3RvdHlwZS5pbml0aWFsaXplID0gZnVuY3Rpb24gKHVybCwgb3B0aW9ucykge1xuICB0aGlzLm1vZGVscyA9IHt9O1xuICB0aGlzLnNhbXBsZU1vZGVscyA9IHt9O1xuXG4gIGlmICh0eXBlb2YgdXJsID09PSAnc3RyaW5nJykge1xuICAgIHRoaXMudXJsID0gdXJsO1xuICB9IGVsc2UgaWYgKF8uaXNPYmplY3QodXJsKSkge1xuICAgIG9wdGlvbnMgPSB1cmw7XG4gICAgdGhpcy51cmwgPSBvcHRpb25zLnVybDtcbiAgfVxuXG4gIGlmKHRoaXMudXJsICYmIHRoaXMudXJsLmluZGV4T2YoJ2h0dHA6JykgPT09IC0xICYmIHRoaXMudXJsLmluZGV4T2YoJ2h0dHBzOicpID09PSAtMSkge1xuICAgIC8vIG5vIHByb3RvY29sLCBzbyB3ZSBjYW4gb25seSB1c2Ugd2luZG93IGlmIGl0IGV4aXN0c1xuICAgIGlmKHR5cGVvZih3aW5kb3cpICE9PSAndW5kZWZpbmVkJyAmJiB3aW5kb3cgJiYgd2luZG93LmxvY2F0aW9uKSB7XG4gICAgICB0aGlzLnVybCA9IHdpbmRvdy5sb2NhdGlvbi5vcmlnaW4gKyB0aGlzLnVybDtcbiAgICB9XG4gIH1cblxuICBvcHRpb25zID0gb3B0aW9ucyB8fCB7fTtcbiAgdGhpcy5jbGllbnRBdXRob3JpemF0aW9ucy5hZGQob3B0aW9ucy5hdXRob3JpemF0aW9ucyk7XG4gIHRoaXMuc3dhZ2dlclJlcXVlc3RIZWFkZXJzID0gb3B0aW9ucy5zd2FnZ2VyUmVxdWVzdEhlYWRlcnMgfHwgJ2FwcGxpY2F0aW9uL2pzb247Y2hhcnNldD11dGYtOCwqLyonO1xuICB0aGlzLmRlZmF1bHRTdWNjZXNzQ2FsbGJhY2sgPSBvcHRpb25zLmRlZmF1bHRTdWNjZXNzQ2FsbGJhY2sgfHwgbnVsbDtcbiAgdGhpcy5kZWZhdWx0RXJyb3JDYWxsYmFjayA9IG9wdGlvbnMuZGVmYXVsdEVycm9yQ2FsbGJhY2sgfHwgbnVsbDtcbiAgdGhpcy5tb2RlbFByb3BlcnR5TWFjcm8gPSBvcHRpb25zLm1vZGVsUHJvcGVydHlNYWNybyB8fCBudWxsO1xuICB0aGlzLmNvbm5lY3Rpb25BZ2VudCA9IG9wdGlvbnMuY29ubmVjdGlvbkFnZW50IHx8IG51bGw7XG4gIHRoaXMucGFyYW1ldGVyTWFjcm8gPSBvcHRpb25zLnBhcmFtZXRlck1hY3JvIHx8IG51bGw7XG4gIHRoaXMudXNlUHJvbWlzZSA9IG9wdGlvbnMudXNlUHJvbWlzZSB8fCBudWxsO1xuXG4gIC8vIG9wZXJhdGlvbiByZXF1ZXN0IHRpbWVvdXQgZGVmYXVsdFxuICB0aGlzLnRpbWVvdXQgPSBvcHRpb25zLnRpbWVvdXQgfHwgbnVsbDtcbiAgLy8gZGVmYXVsdCB0byByZXF1ZXN0IHRpbWVvdXQgd2hlbiBub3Qgc3BlY2lmaWVkXG4gIHRoaXMuZmV0Y2hTcGVjVGltZW91dCA9IHR5cGVvZiBvcHRpb25zLmZldGNoU3BlY1RpbWVvdXQgIT09ICd1bmRlZmluZWQnID9cbiAgICAgIG9wdGlvbnMuZmV0Y2hTcGVjVGltZW91dCA6IG9wdGlvbnMudGltZW91dCB8fCBudWxsO1xuXG4gIGlmKHRoaXMudXNlUHJvbWlzZSkge1xuICAgIHRoaXMuZGVmZXJyZWRDbGllbnQgPSBRLmRlZmVyKCk7XG4gIH1cblxuICBpZiAodHlwZW9mIG9wdGlvbnMuc3VjY2VzcyA9PT0gJ2Z1bmN0aW9uJykge1xuICAgIHRoaXMuc3VjY2VzcyA9IG9wdGlvbnMuc3VjY2VzcztcbiAgfVxuICBpZiAob3B0aW9ucy51c2VKUXVlcnkpIHtcbiAgICB0aGlzLnVzZUpRdWVyeSA9IG9wdGlvbnMudXNlSlF1ZXJ5O1xuICB9XG5cbiAgaWYgKG9wdGlvbnMuanF1ZXJ5QWpheENhY2hlKSB7XG4gICAgdGhpcy5qcXVlcnlBamF4Q2FjaGUgPSBvcHRpb25zLmpxdWVyeUFqYXhDYWNoZTtcbiAgfVxuXG4gIGlmIChvcHRpb25zLmVuYWJsZUNvb2tpZXMpIHtcbiAgICB0aGlzLmVuYWJsZUNvb2tpZXMgPSBvcHRpb25zLmVuYWJsZUNvb2tpZXM7XG4gIH1cblxuICB0aGlzLm9wdGlvbnMgPSBvcHRpb25zIHx8IHt9O1xuXG4gIC8vIG1heWJlIGRvbid0IG5lZWQgdGhpcz9cbiAgdGhpcy5vcHRpb25zLnRpbWVvdXQgPSB0aGlzLnRpbWVvdXQ7XG4gIHRoaXMub3B0aW9ucy5mZXRjaFNwZWNUaW1lb3V0ID0gdGhpcy5mZXRjaFNwZWNUaW1lb3V0O1xuXG4gIHRoaXMuc3VwcG9ydGVkU3VibWl0TWV0aG9kcyA9IG9wdGlvbnMuc3VwcG9ydGVkU3VibWl0TWV0aG9kcyB8fCBbXTtcbiAgdGhpcy5mYWlsdXJlID0gb3B0aW9ucy5mYWlsdXJlIHx8IGZ1bmN0aW9uIChlcnIpIHsgdGhyb3cgZXJyOyB9O1xuICB0aGlzLnByb2dyZXNzID0gb3B0aW9ucy5wcm9ncmVzcyB8fCBmdW5jdGlvbiAoKSB7fTtcbiAgdGhpcy5zcGVjID0gXy5jbG9uZURlZXAob3B0aW9ucy5zcGVjKTsgLy8gQ2xvbmUgc28gd2UgZG8gbm90IGFsdGVyIHRoZSBwcm92aWRlZCBkb2N1bWVudFxuXG4gIGlmIChvcHRpb25zLnNjaGVtZSkge1xuICAgIHRoaXMuc2NoZW1lID0gb3B0aW9ucy5zY2hlbWU7XG4gIH1cblxuICBpZiAodGhpcy51c2VQcm9taXNlIHx8IHR5cGVvZiBvcHRpb25zLnN1Y2Nlc3MgPT09ICdmdW5jdGlvbicpIHtcbiAgICB0aGlzLnJlYWR5ID0gdHJ1ZTtcbiAgICByZXR1cm4gdGhpcy5idWlsZCgpO1xuICB9XG59O1xuXG5Td2FnZ2VyQ2xpZW50LnByb3RvdHlwZS5idWlsZCA9IGZ1bmN0aW9uIChtb2NrKSB7XG4gIGlmICh0aGlzLmlzQnVpbHQpIHtcbiAgICByZXR1cm4gdGhpcztcbiAgfVxuXG4gIHZhciBzZWxmID0gdGhpcztcblxuICBpZiAodGhpcy5zcGVjKSB7XG4gICAgdGhpcy5wcm9ncmVzcygnZmV0Y2hpbmcgcmVzb3VyY2UgbGlzdDsgUGxlYXNlIHdhaXQuJyk7XG4gIH0gZWxzZSB7XG4gICAgdGhpcy5wcm9ncmVzcygnZmV0Y2hpbmcgcmVzb3VyY2UgbGlzdDogJyArIHRoaXMudXJsICsgJzsgUGxlYXNlIHdhaXQuJyk7XG4gIH1cblxuICB2YXIgb2JqID0ge1xuICAgIHVzZUpRdWVyeTogdGhpcy51c2VKUXVlcnksXG4gICAganF1ZXJ5QWpheENhY2hlOiB0aGlzLmpxdWVyeUFqYXhDYWNoZSxcbiAgICBjb25uZWN0aW9uQWdlbnQ6IHRoaXMuY29ubmVjdGlvbkFnZW50LFxuICAgIGVuYWJsZUNvb2tpZXM6IHRoaXMuZW5hYmxlQ29va2llcyxcbiAgICB1cmw6IHRoaXMudXJsLFxuICAgIG1ldGhvZDogJ2dldCcsXG4gICAgaGVhZGVyczoge1xuICAgICAgYWNjZXB0OiB0aGlzLnN3YWdnZXJSZXF1ZXN0SGVhZGVyc1xuICAgIH0sXG4gICAgb246IHtcbiAgICAgIGVycm9yOiBmdW5jdGlvbiAocmVzcG9uc2UpIHtcbiAgICAgICAgaWYgKHNlbGYudXJsLnN1YnN0cmluZygwLCA0KSAhPT0gJ2h0dHAnKSB7XG4gICAgICAgICAgcmV0dXJuIHNlbGYuZmFpbCgnUGxlYXNlIHNwZWNpZnkgdGhlIHByb3RvY29sIGZvciAnICsgc2VsZi51cmwpO1xuICAgICAgICB9IGVsc2UgaWYgKHJlc3BvbnNlLmVyck9iaiAmJiAocmVzcG9uc2UuZXJyT2JqLmNvZGUgPT09ICdFQ09OTkFCT1JURUQnIHx8IHJlc3BvbnNlLmVyck9iai5tZXNzYWdlLmluZGV4T2YoJ3RpbWVvdXQnKSAhPT0gLTEpKSB7XG4gICAgICAgICAgcmV0dXJuIHNlbGYuZmFpbCgnUmVxdWVzdCB0aW1lZCBvdXQgYWZ0ZXIgJyArIHNlbGYuZmV0Y2hTcGVjVGltZW91dCArICdtcycpO1xuICAgICAgICB9IGVsc2UgaWYgKHJlc3BvbnNlLnN0YXR1cyA9PT0gMCkge1xuICAgICAgICAgIHJldHVybiBzZWxmLmZhaWwoJ0NhblxcJ3QgcmVhZCBmcm9tIHNlcnZlci4gIEl0IG1heSBub3QgaGF2ZSB0aGUgYXBwcm9wcmlhdGUgYWNjZXNzLWNvbnRyb2wtb3JpZ2luIHNldHRpbmdzLicpO1xuICAgICAgICB9IGVsc2UgaWYgKHJlc3BvbnNlLnN0YXR1cyA9PT0gNDA0KSB7XG4gICAgICAgICAgcmV0dXJuIHNlbGYuZmFpbCgnQ2FuXFwndCByZWFkIHN3YWdnZXIgSlNPTiBmcm9tICcgKyBzZWxmLnVybCk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgcmV0dXJuIHNlbGYuZmFpbChyZXNwb25zZS5zdGF0dXMgKyAnIDogJyArIHJlc3BvbnNlLnN0YXR1c1RleHQgKyAnICcgKyBzZWxmLnVybCk7XG4gICAgICAgIH1cbiAgICAgIH0sXG4gICAgICByZXNwb25zZTogZnVuY3Rpb24gKHJlc3ApIHtcblxuICAgICAgICB2YXIgcmVzcG9uc2VPYmogPSByZXNwLm9iajtcbiAgICAgICAgaWYoIXJlc3BvbnNlT2JqKSB7XG4gICAgICAgICAgcmV0dXJuIHNlbGYuZmFpbCgnZmFpbGVkIHRvIHBhcnNlIEpTT04vWUFNTCByZXNwb25zZScpO1xuICAgICAgICB9XG5cbiAgICAgICAgc2VsZi5zd2FnZ2VyVmVyc2lvbiA9IHJlc3BvbnNlT2JqLnN3YWdnZXJWZXJzaW9uO1xuICAgICAgICBzZWxmLnN3YWdnZXJPYmplY3QgPSByZXNwb25zZU9iajtcblxuICAgICAgICBpZiAocmVzcG9uc2VPYmouc3dhZ2dlciAmJiBwYXJzZUludChyZXNwb25zZU9iai5zd2FnZ2VyKSA9PT0gMikge1xuICAgICAgICAgIHNlbGYuc3dhZ2dlclZlcnNpb24gPSByZXNwb25zZU9iai5zd2FnZ2VyO1xuXG4gICAgICAgICAgbmV3IFJlc29sdmVyKCkucmVzb2x2ZShyZXNwb25zZU9iaiwgc2VsZi51cmwsIHNlbGYuYnVpbGRGcm9tU3BlYywgc2VsZik7XG5cbiAgICAgICAgICBzZWxmLmlzVmFsaWQgPSB0cnVlO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIHZhciBjb252ZXJ0ZXIgPSBuZXcgU3dhZ2dlclNwZWNDb252ZXJ0ZXIoKTtcbiAgICAgICAgICBzZWxmLm9sZFN3YWdnZXJPYmplY3QgPSBzZWxmLnN3YWdnZXJPYmplY3Q7XG5cbiAgICAgICAgICBjb252ZXJ0ZXIuc2V0RG9jdW1lbnRhdGlvbkxvY2F0aW9uKHNlbGYudXJsKTtcbiAgICAgICAgICBjb252ZXJ0ZXIuY29udmVydChyZXNwb25zZU9iaiwgc2VsZi5jbGllbnRBdXRob3JpemF0aW9ucywgc2VsZi5vcHRpb25zLCBmdW5jdGlvbihzcGVjKSB7XG4gICAgICAgICAgICBzZWxmLnN3YWdnZXJPYmplY3QgPSBzcGVjO1xuICAgICAgICAgICAgbmV3IFJlc29sdmVyKCkucmVzb2x2ZShzcGVjLCBzZWxmLnVybCwgc2VsZi5idWlsZEZyb21TcGVjLCBzZWxmKTtcbiAgICAgICAgICAgIHNlbGYuaXNWYWxpZCA9IHRydWU7XG4gICAgICAgICAgfSk7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG4gIH07XG5cbiAgLy8gb25seSBzZXQgdGltZW91dCB3aGVuIHNwZWNpZmllZFxuICBpZiAodGhpcy5mZXRjaFNwZWNUaW1lb3V0KSB7XG4gICAgb2JqLnRpbWVvdXQgPSB0aGlzLmZldGNoU3BlY1RpbWVvdXQ7XG4gIH1cblxuICBpZiAodGhpcy5zcGVjKSB7XG4gICAgc2VsZi5zd2FnZ2VyT2JqZWN0ID0gdGhpcy5zcGVjO1xuICAgIHNldFRpbWVvdXQoZnVuY3Rpb24gKCkge1xuICAgICAgbmV3IFJlc29sdmVyKCkucmVzb2x2ZShzZWxmLnNwZWMsIHNlbGYudXJsLCBzZWxmLmJ1aWxkRnJvbVNwZWMsIHNlbGYpO1xuICAgIH0sIDEwKTtcbiAgfSBlbHNlIHtcbiAgICB0aGlzLmNsaWVudEF1dGhvcml6YXRpb25zLmFwcGx5KG9iaik7XG5cbiAgICBpZiAobW9jaykge1xuICAgICAgcmV0dXJuIG9iajtcbiAgICB9XG5cbiAgICBuZXcgU3dhZ2dlckh0dHAoKS5leGVjdXRlKG9iaiwgdGhpcy5vcHRpb25zKTtcbiAgfVxuXG4gIHJldHVybiAodGhpcy51c2VQcm9taXNlKSA/IHRoaXMuZGVmZXJyZWRDbGllbnQucHJvbWlzZSA6IHRoaXM7XG59O1xuXG5Td2FnZ2VyQ2xpZW50LnByb3RvdHlwZS5idWlsZEZyb21TcGVjID0gZnVuY3Rpb24gKHJlc3BvbnNlKSB7XG4gIGlmICh0aGlzLmlzQnVpbHQpIHtcbiAgICByZXR1cm4gdGhpcztcbiAgfVxuXG4gIHRoaXMuYXBpcyA9IHt9O1xuICB0aGlzLmFwaXNBcnJheSA9IFtdO1xuICB0aGlzLmJhc2VQYXRoID0gcmVzcG9uc2UuYmFzZVBhdGggfHwgJyc7XG4gIHRoaXMuY29uc3VtZXMgPSByZXNwb25zZS5jb25zdW1lcztcbiAgdGhpcy5ob3N0ID0gcmVzcG9uc2UuaG9zdCB8fCAnJztcbiAgdGhpcy5pbmZvID0gcmVzcG9uc2UuaW5mbyB8fCB7fTtcbiAgdGhpcy5wcm9kdWNlcyA9IHJlc3BvbnNlLnByb2R1Y2VzO1xuICB0aGlzLnNjaGVtZXMgPSByZXNwb25zZS5zY2hlbWVzIHx8IFtdO1xuICB0aGlzLnNlY3VyaXR5RGVmaW5pdGlvbnMgPSBfLmNsb25lRGVlcChyZXNwb25zZS5zZWN1cml0eURlZmluaXRpb25zKTtcbiAgdGhpcy5zZWN1cml0eSA9IHJlc3BvbnNlLnNlY3VyaXR5O1xuICB0aGlzLnRpdGxlID0gcmVzcG9uc2UudGl0bGUgfHwgJyc7XG5cbiAgdmFyIGtleSwgZGVmaW5lZFRhZ3MgPSB7fSwgaywgbG9jYXRpb24sIHNlbGYgPSB0aGlzLCBpO1xuXG4gIGlmIChyZXNwb25zZS5leHRlcm5hbERvY3MpIHtcbiAgICB0aGlzLmV4dGVybmFsRG9jcyA9IHJlc3BvbnNlLmV4dGVybmFsRG9jcztcbiAgfVxuXG4gIC8vIGxlZ2FjeSBzdXBwb3J0XG4gIHRoaXMuYXV0aFNjaGVtZXMgPSB0aGlzLnNlY3VyaXR5RGVmaW5pdGlvbnM7XG5cbiAgaWYodGhpcy5zZWN1cml0eURlZmluaXRpb25zKSB7XG4gICAgZm9yKGtleSBpbiB0aGlzLnNlY3VyaXR5RGVmaW5pdGlvbnMpIHtcbiAgICAgIHZhciBzZWN1cml0eURlZmluaXRpb24gPSB0aGlzLnNlY3VyaXR5RGVmaW5pdGlvbnNba2V5XTtcbiAgICAgIHNlY3VyaXR5RGVmaW5pdGlvbi52ZW5kb3JFeHRlbnNpb25zID0ge307XG4gICAgICBmb3IodmFyIGV4dCBpbiBzZWN1cml0eURlZmluaXRpb24pIHtcbiAgICAgICAgaGVscGVycy5leHRyYWN0RXh0ZW5zaW9ucyhleHQsIHNlY3VyaXR5RGVmaW5pdGlvbik7XG4gICAgICAgIGlmIChleHQgPT09ICdzY29wZXMnKSB7XG4gICAgICAgICAgdmFyIHNjb3BlcyA9IHNlY3VyaXR5RGVmaW5pdGlvbltleHRdO1xuICAgICAgICAgIGlmKHR5cGVvZiBzY29wZXMgPT09ICdvYmplY3QnKSB7XG4gICAgICAgICAgICBzY29wZXMudmVuZG9yRXh0ZW5zaW9ucyA9IHt9O1xuICAgICAgICAgICAgZm9yICh2YXIgcyBpbiBzY29wZXMpIHtcbiAgICAgICAgICAgICAgaGVscGVycy5leHRyYWN0RXh0ZW5zaW9ucyhzLCBzY29wZXMpO1xuICAgICAgICAgICAgICBpZihzLmluZGV4T2YoJ3gtJykgPT09IDApIHtcbiAgICAgICAgICAgICAgICBkZWxldGUgc2NvcGVzW3NdO1xuICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgaWYgKEFycmF5LmlzQXJyYXkocmVzcG9uc2UudGFncykpIHtcbiAgICBkZWZpbmVkVGFncyA9IHt9O1xuXG4gICAgZm9yIChrID0gMDsgayA8IHJlc3BvbnNlLnRhZ3MubGVuZ3RoOyBrKyspIHtcbiAgICAgIHZhciB0ID0gXy5jbG9uZURlZXAocmVzcG9uc2UudGFnc1trXSk7XG4gICAgICBkZWZpbmVkVGFnc1t0Lm5hbWVdID0gdDtcbiAgICAgIGZvcihpIGluIHQpIHtcbiAgICAgICAgaWYoaSA9PT0gJ2V4dGVybmFsRG9jcycgJiYgdHlwZW9mIHRbaV0gPT09ICdvYmplY3QnKSB7XG4gICAgICAgICAgZm9yKHZhciBqIGluIHRbaV0pIHtcbiAgICAgICAgICAgIGhlbHBlcnMuZXh0cmFjdEV4dGVuc2lvbnMoaiwgdFtpXSk7XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIGhlbHBlcnMuZXh0cmFjdEV4dGVuc2lvbnMoaSwgdCk7XG4gICAgICB9XG4gICAgfVxuICB9XG5cblxuICBpZiAodHlwZW9mIHRoaXMudXJsID09PSAnc3RyaW5nJykge1xuICAgIGxvY2F0aW9uID0gdGhpcy5wYXJzZVVyaSh0aGlzLnVybCk7XG4gICAgaWYgKHR5cGVvZiB0aGlzLnNjaGVtZSA9PT0gJ3VuZGVmaW5lZCcgJiYgdHlwZW9mIHRoaXMuc2NoZW1lcyA9PT0gJ3VuZGVmaW5lZCcgfHwgdGhpcy5zY2hlbWVzLmxlbmd0aCA9PT0gMCkge1xuICAgICAgaWYodHlwZW9mIHdpbmRvdyAhPT0gJ3VuZGVmaW5lZCcpIHtcbiAgICAgICAgLy8gdXNlIHRoZSB3aW5kb3cgc2NoZW1lXG4gICAgICAgIHRoaXMuc2NoZW1lID0gd2luZG93LmxvY2F0aW9uLnByb3RvY29sLnJlcGxhY2UoJzonLCcnKTtcbiAgICAgIH1cbiAgICAgIGVsc2Uge1xuICAgICAgICB0aGlzLnNjaGVtZSA9IGxvY2F0aW9uLnNjaGVtZSB8fCAnaHR0cCc7XG4gICAgICB9XG4gICAgfSBlbHNlIGlmICh0eXBlb2Ygd2luZG93ICE9PSAndW5kZWZpbmVkJyAmJiB3aW5kb3cubG9jYXRpb24ucHJvdG9jb2wuaW5kZXhPZignY2hyb21lLWV4dGVuc2lvbicpID09PSAwKSB7XG5cdFx0Ly8gaWYgaXQgaXMgY2hyb21lIHN3YWdnZXIgdWkgZXh0ZW5zaW9uIHNjaGVtZSB0aGVuIGxldCBzd2FnZ2VyIGRvYyB1cmwgc2NoZW1lIGRlY2lkZSB0aGUgcHJvdG9jb2xcblx0XHR0aGlzLnNjaGVtZSA9IGxvY2F0aW9uLnNjaGVtZTtcblx0fSBlbHNlIGlmICh0eXBlb2YgdGhpcy5zY2hlbWUgPT09ICd1bmRlZmluZWQnKSB7XG4gICAgICBpZih0eXBlb2Ygd2luZG93ICE9PSAndW5kZWZpbmVkJykge1xuICAgICAgICB2YXIgc2NoZW1lID0gd2luZG93LmxvY2F0aW9uLnByb3RvY29sLnJlcGxhY2UoJzonLCcnKTtcbiAgICAgICAgaWYoc2NoZW1lID09PSAnaHR0cHMnICYmIHRoaXMuc2NoZW1lcy5pbmRleE9mKHNjaGVtZSkgPT09IC0xKSB7XG4gICAgICAgICAgLy8gY2FuJ3QgY2FsbCBodHRwIGZyb20gaHR0cHMgc2VydmVkIHBhZ2UgaW4gYSBicm93c2VyIVxuICAgICAgICAgIGhlbHBlcnMubG9nKCdDYW5ub3QgY2FsbCBhIGh0dHAgc2VydmVyIGZyb20gaHR0cHMgaW5zaWRlIGEgYnJvd3NlciEnKTtcbiAgICAgICAgICB0aGlzLnNjaGVtZSA9ICdodHRwJztcbiAgICAgICAgfVxuICAgICAgICBlbHNlIGlmKHRoaXMuc2NoZW1lcy5pbmRleE9mKHNjaGVtZSkgIT09IC0xKSB7XG4gICAgICAgICAgdGhpcy5zY2hlbWUgPSBzY2hlbWU7XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSB7XG4gICAgICAgICAgaWYodGhpcy5zY2hlbWVzLmluZGV4T2YoJ2h0dHBzJykgIT09IC0xKSB7XG4gICAgICAgICAgICB0aGlzLnNjaGVtZSA9ICdodHRwcyc7XG4gICAgICAgICAgfVxuICAgICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgdGhpcy5zY2hlbWUgPSAnaHR0cCc7XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICB9XG4gICAgICBlbHNlIHtcbiAgICAgICAgdGhpcy5zY2hlbWUgPSB0aGlzLnNjaGVtZXNbMF0gfHwgbG9jYXRpb24uc2NoZW1lO1xuICAgICAgfVxuICAgIH1cblxuICAgIGlmICh0eXBlb2YgdGhpcy5ob3N0ID09PSAndW5kZWZpbmVkJyB8fCB0aGlzLmhvc3QgPT09ICcnKSB7XG4gICAgICB0aGlzLmhvc3QgPSBsb2NhdGlvbi5ob3N0O1xuXG4gICAgICBpZiAobG9jYXRpb24ucG9ydCkge1xuICAgICAgICB0aGlzLmhvc3QgPSB0aGlzLmhvc3QgKyAnOicgKyBsb2NhdGlvbi5wb3J0O1xuICAgICAgfVxuICAgIH1cbiAgfVxuICBlbHNlIHtcbiAgICBpZiAodHlwZW9mIHRoaXMuc2NoZW1lcyA9PT0gJ3VuZGVmaW5lZCcgfHwgdGhpcy5zY2hlbWVzLmxlbmd0aCA9PT0gMCkge1xuICAgICAgdGhpcy5zY2hlbWUgPSAnaHR0cCc7XG4gICAgfVxuICAgIGVsc2UgaWYgKHR5cGVvZiB0aGlzLnNjaGVtZSA9PT0gJ3VuZGVmaW5lZCcpIHtcbiAgICAgIHRoaXMuc2NoZW1lID0gdGhpcy5zY2hlbWVzWzBdO1xuICAgIH1cbiAgfVxuXG4gIHRoaXMuZGVmaW5pdGlvbnMgPSByZXNwb25zZS5kZWZpbml0aW9ucztcblxuICBmb3IgKGtleSBpbiB0aGlzLmRlZmluaXRpb25zKSB7XG4gICAgdmFyIG1vZGVsID0gbmV3IE1vZGVsKGtleSwgdGhpcy5kZWZpbml0aW9uc1trZXldLCB0aGlzLm1vZGVscywgdGhpcy5tb2RlbFByb3BlcnR5TWFjcm8pO1xuXG4gICAgaWYgKG1vZGVsKSB7XG4gICAgICB0aGlzLm1vZGVsc1trZXldID0gbW9kZWw7XG4gICAgfVxuICB9XG5cbiAgLy8gZ2V0IHBhdGhzLCBjcmVhdGUgZnVuY3Rpb25zIGZvciBlYWNoIG9wZXJhdGlvbklkXG5cbiAgLy8gQmluZCBoZWxwIHRvICdjbGllbnQuYXBpcydcbiAgc2VsZi5hcGlzLmhlbHAgPSBfLmJpbmQoc2VsZi5oZWxwLCBzZWxmKTtcblxuICBfLmZvckVhY2gocmVzcG9uc2UucGF0aHMsIGZ1bmN0aW9uIChwYXRoT2JqLCBwYXRoKSB7XG4gICAgLy8gT25seSBwcm9jZXNzIGEgcGF0aCBpZiBpdCdzIGFuIG9iamVjdFxuICAgIGlmICghXy5pc1BsYWluT2JqZWN0KHBhdGhPYmopKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgXy5mb3JFYWNoKHN1cHBvcnRlZE9wZXJhdGlvbk1ldGhvZHMsIGZ1bmN0aW9uIChtZXRob2QpIHtcbiAgICAgIHZhciBvcGVyYXRpb24gPSBwYXRoT2JqW21ldGhvZF07XG5cbiAgICAgIGlmIChfLmlzVW5kZWZpbmVkKG9wZXJhdGlvbikpIHtcbiAgICAgICAgLy8gT3BlcmF0aW9uIGRvZXMgbm90IGV4aXN0XG4gICAgICAgIHJldHVybjtcbiAgICAgIH0gZWxzZSBpZiAoIV8uaXNQbGFpbk9iamVjdChvcGVyYXRpb24pKSB7XG4gICAgICAgIC8vIE9wZXJhdGlvbiBleGlzdHMgYnV0IGl0IGlzIG5vdCBhbiBPcGVyYXRpb24gT2JqZWN0LiAgU2luY2UgdGhpcyBpcyBpbnZhbGlkLCBsb2cgaXQuXG4gICAgICAgIGhlbHBlcnMubG9nKCdUaGUgXFwnJyArIG1ldGhvZCArICdcXCcgb3BlcmF0aW9uIGZvciBcXCcnICsgcGF0aCArICdcXCcgcGF0aCBpcyBub3QgYW4gT3BlcmF0aW9uIE9iamVjdCcpO1xuXG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cblxuICAgICAgdmFyIHRhZ3MgPSBvcGVyYXRpb24udGFncztcblxuICAgICAgaWYgKF8uaXNVbmRlZmluZWQodGFncykgfHwgIV8uaXNBcnJheSh0YWdzKSB8fCB0YWdzLmxlbmd0aCA9PT0gMCkge1xuICAgICAgICB0YWdzID0gb3BlcmF0aW9uLnRhZ3MgPSBbICdkZWZhdWx0JyBdO1xuICAgICAgfVxuXG4gICAgICB2YXIgb3BlcmF0aW9uSWQgPSBzZWxmLmlkRnJvbU9wKHBhdGgsIG1ldGhvZCwgb3BlcmF0aW9uKTtcblxuICAgICAgdmFyIG9wZXJhdGlvbk9iamVjdCA9IG5ldyBPcGVyYXRpb24oc2VsZixcbiAgICAgICAgb3BlcmF0aW9uLnNjaGVtZSxcbiAgICAgICAgb3BlcmF0aW9uSWQsXG4gICAgICAgIG1ldGhvZCxcbiAgICAgICAgcGF0aCxcbiAgICAgICAgb3BlcmF0aW9uLFxuICAgICAgICBzZWxmLmRlZmluaXRpb25zLFxuICAgICAgICBzZWxmLm1vZGVscyxcbiAgICAgICAgc2VsZi5jbGllbnRBdXRob3JpemF0aW9ucyk7XG5cbiAgICAgIG9wZXJhdGlvbk9iamVjdC5jb25uZWN0aW9uQWdlbnQgPSBzZWxmLmNvbm5lY3Rpb25BZ2VudDtcbiAgICAgIG9wZXJhdGlvbk9iamVjdC52ZW5kb3JFeHRlbnNpb25zID0ge307XG4gICAgICBmb3IoaSBpbiBvcGVyYXRpb24pIHtcbiAgICAgICAgaGVscGVycy5leHRyYWN0RXh0ZW5zaW9ucyhpLCBvcGVyYXRpb25PYmplY3QsIG9wZXJhdGlvbltpXSk7XG4gICAgICB9XG4gICAgICBvcGVyYXRpb25PYmplY3QuZXh0ZXJuYWxEb2NzID0gb3BlcmF0aW9uLmV4dGVybmFsRG9jcztcbiAgICAgIGlmKG9wZXJhdGlvbk9iamVjdC5leHRlcm5hbERvY3MpIHtcbiAgICAgICAgb3BlcmF0aW9uT2JqZWN0LmV4dGVybmFsRG9jcyA9IF8uY2xvbmVEZWVwKG9wZXJhdGlvbk9iamVjdC5leHRlcm5hbERvY3MpO1xuICAgICAgICBvcGVyYXRpb25PYmplY3QuZXh0ZXJuYWxEb2NzLnZlbmRvckV4dGVuc2lvbnMgPSB7fTtcbiAgICAgICAgZm9yKGkgaW4gb3BlcmF0aW9uT2JqZWN0LmV4dGVybmFsRG9jcykge1xuICAgICAgICAgIGhlbHBlcnMuZXh0cmFjdEV4dGVuc2lvbnMoaSwgb3BlcmF0aW9uT2JqZWN0LmV4dGVybmFsRG9jcyk7XG4gICAgICAgIH1cbiAgICAgIH1cblxuICAgICAgLy8gYmluZCBzZWxmIG9wZXJhdGlvbidzIGV4ZWN1dGUgY29tbWFuZCB0byB0aGUgYXBpXG4gICAgICBfLmZvckVhY2godGFncywgZnVuY3Rpb24gKHRhZykge1xuICAgICAgICB2YXIgY2xpZW50UHJvcGVydHkgPSBfLmluZGV4T2YocmVzZXJ2ZWRDbGllbnRUYWdzLCB0YWcpID4gLTEgPyAnXycgKyB0YWcgOiB0YWc7XG4gICAgICAgIHZhciBhcGlQcm9wZXJ0eSA9IF8uaW5kZXhPZihyZXNlcnZlZEFwaVRhZ3MsIHRhZykgPiAtMSA/ICdfJyArIHRhZyA6IHRhZztcbiAgICAgICAgdmFyIG9wZXJhdGlvbkdyb3VwID0gc2VsZltjbGllbnRQcm9wZXJ0eV07XG5cbiAgICAgICAgaWYgKGNsaWVudFByb3BlcnR5ICE9PSB0YWcpIHtcbiAgICAgICAgICBoZWxwZXJzLmxvZygnVGhlIFxcJycgKyB0YWcgKyAnXFwnIHRhZyBjb25mbGljdHMgd2l0aCBhIFN3YWdnZXJDbGllbnQgZnVuY3Rpb24vcHJvcGVydHkgbmFtZS4gIFVzZSBcXCdjbGllbnQuJyArXG4gICAgICAgICAgICAgICAgICAgICAgY2xpZW50UHJvcGVydHkgKyAnXFwnIG9yIFxcJ2NsaWVudC5hcGlzLicgKyB0YWcgKyAnXFwnIGluc3RlYWQgb2YgXFwnY2xpZW50LicgKyB0YWcgKyAnXFwnLicpO1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKGFwaVByb3BlcnR5ICE9PSB0YWcpIHtcbiAgICAgICAgICBoZWxwZXJzLmxvZygnVGhlIFxcJycgKyB0YWcgKyAnXFwnIHRhZyBjb25mbGljdHMgd2l0aCBhIFN3YWdnZXJDbGllbnQgb3BlcmF0aW9uIGZ1bmN0aW9uL3Byb3BlcnR5IG5hbWUuICBVc2UgJyArXG4gICAgICAgICAgICAgICAgICAgICAgJ1xcJ2NsaWVudC5hcGlzLicgKyBhcGlQcm9wZXJ0eSArICdcXCcgaW5zdGVhZCBvZiBcXCdjbGllbnQuYXBpcy4nICsgdGFnICsgJ1xcJy4nKTtcbiAgICAgICAgfVxuXG4gICAgICAgIGlmIChfLmluZGV4T2YocmVzZXJ2ZWRBcGlUYWdzLCBvcGVyYXRpb25JZCkgPiAtMSkge1xuICAgICAgICAgIGhlbHBlcnMubG9nKCdUaGUgXFwnJyArIG9wZXJhdGlvbklkICsgJ1xcJyBvcGVyYXRpb25JZCBjb25mbGljdHMgd2l0aCBhIFN3YWdnZXJDbGllbnQgb3BlcmF0aW9uICcgK1xuICAgICAgICAgICAgICAgICAgICAgICdmdW5jdGlvbi9wcm9wZXJ0eSBuYW1lLiAgVXNlIFxcJ2NsaWVudC5hcGlzLicgKyBhcGlQcm9wZXJ0eSArICcuXycgKyBvcGVyYXRpb25JZCArXG4gICAgICAgICAgICAgICAgICAgICAgJ1xcJyBpbnN0ZWFkIG9mIFxcJ2NsaWVudC5hcGlzLicgKyBhcGlQcm9wZXJ0eSArICcuJyArIG9wZXJhdGlvbklkICsgJ1xcJy4nKTtcblxuICAgICAgICAgIG9wZXJhdGlvbklkID0gJ18nICsgb3BlcmF0aW9uSWQ7XG4gICAgICAgICAgb3BlcmF0aW9uT2JqZWN0Lm5pY2tuYW1lID0gb3BlcmF0aW9uSWQ7IC8vIFNvICdjbGllbnQuYXBpcy5bdGFnXS5vcGVyYXRpb25JZC5oZWxwKCkgd29ya3MgcHJvcGVybHlcbiAgICAgICAgfVxuXG4gICAgICAgIGlmIChfLmlzVW5kZWZpbmVkKG9wZXJhdGlvbkdyb3VwKSkge1xuICAgICAgICAgIG9wZXJhdGlvbkdyb3VwID0gc2VsZltjbGllbnRQcm9wZXJ0eV0gPSBzZWxmLmFwaXNbYXBpUHJvcGVydHldID0ge307XG5cbiAgICAgICAgICBvcGVyYXRpb25Hcm91cC5vcGVyYXRpb25zID0ge307XG4gICAgICAgICAgb3BlcmF0aW9uR3JvdXAubGFiZWwgPSBhcGlQcm9wZXJ0eTtcbiAgICAgICAgICBvcGVyYXRpb25Hcm91cC5hcGlzID0ge307XG5cbiAgICAgICAgICB2YXIgdGFnRGVmID0gZGVmaW5lZFRhZ3NbdGFnXTtcblxuICAgICAgICAgIGlmICghXy5pc1VuZGVmaW5lZCh0YWdEZWYpKSB7XG4gICAgICAgICAgICBvcGVyYXRpb25Hcm91cC5kZXNjcmlwdGlvbiA9IHRhZ0RlZi5kZXNjcmlwdGlvbjtcbiAgICAgICAgICAgIG9wZXJhdGlvbkdyb3VwLmV4dGVybmFsRG9jcyA9IHRhZ0RlZi5leHRlcm5hbERvY3M7XG4gICAgICAgICAgICBvcGVyYXRpb25Hcm91cC52ZW5kb3JFeHRlbnNpb25zID0gdGFnRGVmLnZlbmRvckV4dGVuc2lvbnM7XG4gICAgICAgICAgfVxuXG4gICAgICAgICAgc2VsZltjbGllbnRQcm9wZXJ0eV0uaGVscCA9IF8uYmluZChzZWxmLmhlbHAsIG9wZXJhdGlvbkdyb3VwKTtcbiAgICAgICAgICBzZWxmLmFwaXNBcnJheS5wdXNoKG5ldyBPcGVyYXRpb25Hcm91cCh0YWcsIG9wZXJhdGlvbkdyb3VwLmRlc2NyaXB0aW9uLCBvcGVyYXRpb25Hcm91cC5leHRlcm5hbERvY3MsIG9wZXJhdGlvbk9iamVjdCkpO1xuICAgICAgICB9XG5cbiAgICAgICAgb3BlcmF0aW9uSWQgPSBzZWxmLm1ha2VVbmlxdWVPcGVyYXRpb25JZChvcGVyYXRpb25JZCwgc2VsZi5hcGlzW2FwaVByb3BlcnR5XSk7XG5cbiAgICAgICAgLy8gQmluZCB0YWcgaGVscFxuICAgICAgICBpZiAoIV8uaXNGdW5jdGlvbihvcGVyYXRpb25Hcm91cC5oZWxwKSkge1xuICAgICAgICAgIG9wZXJhdGlvbkdyb3VwLmhlbHAgPSBfLmJpbmQoc2VsZi5oZWxwLCBvcGVyYXRpb25Hcm91cCk7XG4gICAgICAgIH1cblxuICAgICAgICAvLyBiaW5kIHRvIHRoZSBhcGlzIG9iamVjdFxuICAgICAgICBzZWxmLmFwaXNbYXBpUHJvcGVydHldW29wZXJhdGlvbklkXSA9IG9wZXJhdGlvbkdyb3VwW29wZXJhdGlvbklkXSA9IF8uYmluZChvcGVyYXRpb25PYmplY3QuZXhlY3V0ZSxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvcGVyYXRpb25PYmplY3QpO1xuICAgICAgICBzZWxmLmFwaXNbYXBpUHJvcGVydHldW29wZXJhdGlvbklkXS5oZWxwID0gb3BlcmF0aW9uR3JvdXBbb3BlcmF0aW9uSWRdLmhlbHAgPSBfLmJpbmQob3BlcmF0aW9uT2JqZWN0LmhlbHAsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvcGVyYXRpb25PYmplY3QpO1xuICAgICAgICBzZWxmLmFwaXNbYXBpUHJvcGVydHldW29wZXJhdGlvbklkXS5hc0N1cmwgPSBvcGVyYXRpb25Hcm91cFtvcGVyYXRpb25JZF0uYXNDdXJsID0gXy5iaW5kKG9wZXJhdGlvbk9iamVjdC5hc0N1cmwsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3BlcmF0aW9uT2JqZWN0KTtcblxuICAgICAgICBvcGVyYXRpb25Hcm91cC5hcGlzW29wZXJhdGlvbklkXSA9IG9wZXJhdGlvbkdyb3VwLm9wZXJhdGlvbnNbb3BlcmF0aW9uSWRdID0gb3BlcmF0aW9uT2JqZWN0O1xuXG4gICAgICAgIC8vIGxlZ2FjeSBVSSBmZWF0dXJlXG4gICAgICAgIHZhciBhcGkgPSBfLmZpbmQoc2VsZi5hcGlzQXJyYXksIGZ1bmN0aW9uIChhcGkpIHtcbiAgICAgICAgICByZXR1cm4gYXBpLnRhZyA9PT0gdGFnO1xuICAgICAgICB9KTtcblxuICAgICAgICBpZiAoYXBpKSB7XG4gICAgICAgICAgYXBpLm9wZXJhdGlvbnNBcnJheS5wdXNoKG9wZXJhdGlvbk9iamVjdCk7XG4gICAgICAgIH1cbiAgICAgIH0pO1xuICAgIH0pO1xuICB9KTtcblxuICAvLyBzb3J0IHRoZSBhcGlzQXJyYXkgYWNjb3JkaW5nIHRvIHRoZSB0YWdzXG4gIHZhciBzb3J0ZWRBcGlzID0gW107XG4gIF8uZm9yRWFjaChPYmplY3Qua2V5cyhkZWZpbmVkVGFncyksIGZ1bmN0aW9uICh0YWcpIHtcbiAgICB2YXIgcG9zO1xuICAgIGZvcihwb3MgaW4gc2VsZi5hcGlzQXJyYXkpIHtcbiAgICAgIHZhciBfYXBpID0gc2VsZi5hcGlzQXJyYXlbcG9zXTtcbiAgICAgIGlmKF9hcGkgJiYgdGFnID09PSBfYXBpLm5hbWUpIHtcbiAgICAgICAgc29ydGVkQXBpcy5wdXNoKF9hcGkpO1xuICAgICAgICBzZWxmLmFwaXNBcnJheVtwb3NdID0gbnVsbDtcbiAgICAgIH1cbiAgICB9XG4gIH0pO1xuICAvLyBhZGQgYW55dGhpbmcgbGVmdFxuICBfLmZvckVhY2goc2VsZi5hcGlzQXJyYXksIGZ1bmN0aW9uIChhcGkpIHtcbiAgICBpZihhcGkpIHtcbiAgICAgIHNvcnRlZEFwaXMucHVzaChhcGkpO1xuICAgIH1cbiAgfSk7XG4gIHNlbGYuYXBpc0FycmF5ID0gc29ydGVkQXBpcztcblxuICBfLmZvckVhY2gocmVzcG9uc2UuZGVmaW5pdGlvbnMsIGZ1bmN0aW9uIChkZWZpbml0aW9uT2JqLCBkZWZpbml0aW9uKSB7XG4gICAgZGVmaW5pdGlvbk9iai5pZCA9IGRlZmluaXRpb24udG9Mb3dlckNhc2UoKTtcbiAgICBkZWZpbml0aW9uT2JqLm5hbWUgPSBkZWZpbml0aW9uO1xuICAgIHNlbGYubW9kZWxzQXJyYXkucHVzaChkZWZpbml0aW9uT2JqKTtcbiAgfSk7XG5cbiAgdGhpcy5pc0J1aWx0ID0gdHJ1ZTtcblxuICBpZiAodGhpcy51c2VQcm9taXNlKSB7XG4gICAgdGhpcy5pc1ZhbGlkID0gdHJ1ZTtcbiAgICB0aGlzLmlzQnVpbHQgPSB0cnVlO1xuICAgIHRoaXMuZGVmZXJyZWRDbGllbnQucmVzb2x2ZSh0aGlzKTtcblxuICAgIHJldHVybiB0aGlzLmRlZmVycmVkQ2xpZW50LnByb21pc2U7XG4gIH1cblxuICBpZiAodGhpcy5zdWNjZXNzKSB7XG4gICAgdGhpcy5zdWNjZXNzKCk7XG4gIH1cblxuICByZXR1cm4gdGhpcztcbn07XG5cblN3YWdnZXJDbGllbnQucHJvdG90eXBlLm1ha2VVbmlxdWVPcGVyYXRpb25JZCA9IGZ1bmN0aW9uKG9wZXJhdGlvbklkLCBhcGkpIHtcbiAgdmFyIGNvdW50ID0gMDtcbiAgdmFyIG5hbWUgPSBvcGVyYXRpb25JZDtcblxuICAvLyBtYWtlIHVuaXF1ZSBhY3Jvc3MgdGhpcyBvcGVyYXRpb24gZ3JvdXBcbiAgd2hpbGUodHJ1ZSkge1xuICAgIHZhciBtYXRjaGVkID0gZmFsc2U7XG4gICAgXy5mb3JFYWNoKGFwaS5vcGVyYXRpb25zLCBmdW5jdGlvbiAob3BlcmF0aW9uKSB7XG4gICAgICBpZihvcGVyYXRpb24ubmlja25hbWUgPT09IG5hbWUpIHtcbiAgICAgICAgbWF0Y2hlZCA9IHRydWU7XG4gICAgICB9XG4gICAgfSk7XG4gICAgaWYoIW1hdGNoZWQpIHtcbiAgICAgIHJldHVybiBuYW1lO1xuICAgIH1cbiAgICBuYW1lID0gb3BlcmF0aW9uSWQgKyAnXycgKyBjb3VudDtcbiAgICBjb3VudCArKztcbiAgfVxuXG4gIHJldHVybiBvcGVyYXRpb25JZDtcbn07XG5cblN3YWdnZXJDbGllbnQucHJvdG90eXBlLnBhcnNlVXJpID0gZnVuY3Rpb24gKHVyaSkge1xuICB2YXIgdXJsUGFyc2VSRSA9IC9eKCgoKFteOlxcLyNcXD9dKzopPyg/OihcXC9cXC8pKCg/OigoW146QFxcLyNcXD9dKykoPzpcXDooW146QFxcLyNcXD9dKykpPylAKT8oKFteOlxcLyNcXD9cXF1cXFtdK3xcXFtbXlxcL1xcXUAjP10rXFxdKSg/OlxcOihbMC05XSspKT8pKT8pPyk/KChcXC8/KD86W15cXC9cXD8jXStcXC8rKSopKFteXFw/I10qKSkpPyhcXD9bXiNdKyk/KSgjLiopPy87XG4gIHZhciBwYXJ0cyA9IHVybFBhcnNlUkUuZXhlYyh1cmkpO1xuXG4gIHJldHVybiB7XG4gICAgc2NoZW1lOiBwYXJ0c1s0XSA/IHBhcnRzWzRdLnJlcGxhY2UoJzonLCcnKSA6IHVuZGVmaW5lZCxcbiAgICBob3N0OiBwYXJ0c1sxMV0sXG4gICAgcG9ydDogcGFydHNbMTJdLFxuICAgIHBhdGg6IHBhcnRzWzE1XVxuICB9O1xufTtcblxuU3dhZ2dlckNsaWVudC5wcm90b3R5cGUuaGVscCA9IGZ1bmN0aW9uIChkb250UHJpbnQpIHtcbiAgdmFyIG91dHB1dCA9ICcnO1xuXG4gIGlmICh0aGlzIGluc3RhbmNlb2YgU3dhZ2dlckNsaWVudCkge1xuICAgIF8uZm9yRWFjaCh0aGlzLmFwaXMsIGZ1bmN0aW9uIChhcGksIG5hbWUpIHtcbiAgICAgIGlmIChfLmlzUGxhaW5PYmplY3QoYXBpKSkge1xuICAgICAgICBvdXRwdXQgKz0gJ29wZXJhdGlvbnMgZm9yIHRoZSBcXCcnICsgbmFtZSArICdcXCcgdGFnXFxuJztcblxuICAgICAgICBfLmZvckVhY2goYXBpLm9wZXJhdGlvbnMsIGZ1bmN0aW9uIChvcGVyYXRpb24sIG5hbWUpIHtcbiAgICAgICAgICBvdXRwdXQgKz0gJyAgKiAnICsgbmFtZSArICc6ICcgKyBvcGVyYXRpb24uc3VtbWFyeSArICdcXG4nO1xuICAgICAgICB9KTtcbiAgICAgIH1cbiAgICB9KTtcbiAgfSBlbHNlIGlmICh0aGlzIGluc3RhbmNlb2YgT3BlcmF0aW9uR3JvdXAgfHwgXy5pc1BsYWluT2JqZWN0KHRoaXMpKSB7XG4gICAgb3V0cHV0ICs9ICdvcGVyYXRpb25zIGZvciB0aGUgXFwnJyArIHRoaXMubGFiZWwgKyAnXFwnIHRhZ1xcbic7XG5cbiAgICBfLmZvckVhY2godGhpcy5hcGlzLCBmdW5jdGlvbiAob3BlcmF0aW9uLCBuYW1lKSB7XG4gICAgICBvdXRwdXQgKz0gJyAgKiAnICsgbmFtZSArICc6ICcgKyBvcGVyYXRpb24uc3VtbWFyeSArICdcXG4nO1xuICAgIH0pO1xuICB9XG5cbiAgaWYgKGRvbnRQcmludCkge1xuICAgIHJldHVybiBvdXRwdXQ7XG4gIH0gZWxzZSB7XG4gICAgaGVscGVycy5sb2cob3V0cHV0KTtcblxuICAgIHJldHVybiBvdXRwdXQ7XG4gIH1cbn07XG5cblN3YWdnZXJDbGllbnQucHJvdG90eXBlLnRhZ0Zyb21MYWJlbCA9IGZ1bmN0aW9uIChsYWJlbCkge1xuICByZXR1cm4gbGFiZWw7XG59O1xuXG5Td2FnZ2VyQ2xpZW50LnByb3RvdHlwZS5pZEZyb21PcCA9IGZ1bmN0aW9uIChwYXRoLCBodHRwTWV0aG9kLCBvcCkge1xuICBpZighb3AgfHwgIW9wLm9wZXJhdGlvbklkKSB7XG4gICAgb3AgPSBvcCB8fCB7fTtcbiAgICBvcC5vcGVyYXRpb25JZCA9IGh0dHBNZXRob2QgKyAnXycgKyBwYXRoO1xuICB9XG4gIHZhciBvcElkID0gb3Aub3BlcmF0aW9uSWQucmVwbGFjZSgvW1xccyFAIyQlXiYqKClfKz1cXFt7XFxdfTs6PD58LlxcLz8sXFxcXCdcIlwiLV0vZywgJ18nKSB8fCAocGF0aC5zdWJzdHJpbmcoMSkgKyAnXycgKyBodHRwTWV0aG9kKTtcblxuICBvcElkID0gb3BJZC5yZXBsYWNlKC8oKF8pezIsfSkvZywgJ18nKTtcbiAgb3BJZCA9IG9wSWQucmVwbGFjZSgvXihfKSovZywgJycpO1xuICBvcElkID0gb3BJZC5yZXBsYWNlKC8oW19dKSokL2csICcnKTtcblxuICByZXR1cm4gb3BJZDtcbn07XG5cblN3YWdnZXJDbGllbnQucHJvdG90eXBlLnNldEhvc3QgPSBmdW5jdGlvbiAoaG9zdCkge1xuICB0aGlzLmhvc3QgPSBob3N0O1xuXG4gIGlmKHRoaXMuYXBpcykge1xuICAgIF8uZm9yRWFjaCh0aGlzLmFwaXMsIGZ1bmN0aW9uKGFwaSkge1xuICAgICAgaWYoYXBpLm9wZXJhdGlvbnMpIHtcbiAgICAgICAgXy5mb3JFYWNoKGFwaS5vcGVyYXRpb25zLCBmdW5jdGlvbihvcGVyYXRpb24pIHtcbiAgICAgICAgICBvcGVyYXRpb24uaG9zdCA9IGhvc3Q7XG4gICAgICAgIH0pO1xuICAgICAgfVxuICAgIH0pO1xuICB9XG59O1xuXG5Td2FnZ2VyQ2xpZW50LnByb3RvdHlwZS5zZXRCYXNlUGF0aCA9IGZ1bmN0aW9uIChiYXNlUGF0aCkge1xuICB0aGlzLmJhc2VQYXRoID0gYmFzZVBhdGg7XG5cbiAgaWYodGhpcy5hcGlzKSB7XG4gICAgXy5mb3JFYWNoKHRoaXMuYXBpcywgZnVuY3Rpb24oYXBpKSB7XG4gICAgICBpZihhcGkub3BlcmF0aW9ucykge1xuICAgICAgICBfLmZvckVhY2goYXBpLm9wZXJhdGlvbnMsIGZ1bmN0aW9uKG9wZXJhdGlvbikge1xuICAgICAgICAgIG9wZXJhdGlvbi5iYXNlUGF0aCA9IGJhc2VQYXRoO1xuICAgICAgICB9KTtcbiAgICAgIH1cbiAgICB9KTtcbiAgfVxufTtcblxuU3dhZ2dlckNsaWVudC5wcm90b3R5cGUuc2V0U2NoZW1lcyA9IGZ1bmN0aW9uIChzY2hlbWVzKSB7XG4gIHRoaXMuc2NoZW1lcyA9IHNjaGVtZXM7XG5cbiAgaWYoc2NoZW1lcyAmJiBzY2hlbWVzLmxlbmd0aCA+IDApIHtcbiAgICBpZih0aGlzLmFwaXMpIHtcbiAgICAgIF8uZm9yRWFjaCh0aGlzLmFwaXMsIGZ1bmN0aW9uIChhcGkpIHtcbiAgICAgICAgaWYgKGFwaS5vcGVyYXRpb25zKSB7XG4gICAgICAgICAgXy5mb3JFYWNoKGFwaS5vcGVyYXRpb25zLCBmdW5jdGlvbiAob3BlcmF0aW9uKSB7XG4gICAgICAgICAgICBvcGVyYXRpb24uc2NoZW1lID0gc2NoZW1lc1swXTtcbiAgICAgICAgICB9KTtcbiAgICAgICAgfVxuICAgICAgfSk7XG4gICAgfVxuICB9XG59O1xuXG5Td2FnZ2VyQ2xpZW50LnByb3RvdHlwZS5mYWlsID0gZnVuY3Rpb24gKG1lc3NhZ2UpIHtcbiAgaWYgKHRoaXMudXNlUHJvbWlzZSkge1xuICAgIHRoaXMuZGVmZXJyZWRDbGllbnQucmVqZWN0KG1lc3NhZ2UpO1xuICAgIHJldHVybiB0aGlzLmRlZmVycmVkQ2xpZW50LnByb21pc2U7XG4gIH0gZWxzZSB7XG4gICAgaWYgKHRoaXMuZmFpbHVyZSkge1xuICAgICAgdGhpcy5mYWlsdXJlKG1lc3NhZ2UpO1xuICAgIH1cbiAgICBlbHNlIHtcbiAgICAgIHRoaXMuZmFpbHVyZShtZXNzYWdlKTtcbiAgICB9XG4gIH1cbn07XG4iLCIoZnVuY3Rpb24gKHByb2Nlc3Mpe1xuJ3VzZSBzdHJpY3QnO1xuXG52YXIgXyA9IHtcbiAgaXNQbGFpbk9iamVjdDogcmVxdWlyZSgnbG9kYXNoLWNvbXBhdC9sYW5nL2lzUGxhaW5PYmplY3QnKSxcbiAgaW5kZXhPZjogcmVxdWlyZSgnbG9kYXNoLWNvbXBhdC9hcnJheS9pbmRleE9mJylcbn07XG5cbm1vZHVsZS5leHBvcnRzLl9fYmluZCA9IGZ1bmN0aW9uIChmbiwgbWUpIHtcbiAgcmV0dXJuIGZ1bmN0aW9uKCl7XG4gICAgcmV0dXJuIGZuLmFwcGx5KG1lLCBhcmd1bWVudHMpO1xuICB9O1xufTtcblxudmFyIGxvZyA9IG1vZHVsZS5leHBvcnRzLmxvZyA9IGZ1bmN0aW9uKCkge1xuICAvLyBPbmx5IGxvZyBpZiBhdmFpbGFibGUgYW5kIHdlJ3JlIG5vdCB0ZXN0aW5nXG4gIGlmIChjb25zb2xlICYmIHByb2Nlc3MuZW52Lk5PREVfRU5WICE9PSAndGVzdCcpIHtcbiAgICBjb25zb2xlLmxvZyhBcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChhcmd1bWVudHMpWzBdKTtcbiAgfVxufTtcblxubW9kdWxlLmV4cG9ydHMuZmFpbCA9IGZ1bmN0aW9uIChtZXNzYWdlKSB7XG4gIGxvZyhtZXNzYWdlKTtcbn07XG5cbm1vZHVsZS5leHBvcnRzLm9wdGlvbkh0bWwgPSBmdW5jdGlvbiAobGFiZWwsIHZhbHVlKSB7XG4gIHJldHVybiAnPHRyPjx0ZCBjbGFzcz1cIm9wdGlvbk5hbWVcIj4nICsgbGFiZWwgKyAnOjwvdGQ+PHRkPicgKyB2YWx1ZSArICc8L3RkPjwvdHI+Jztcbn07XG5cbnZhciByZXNvbHZlU2NoZW1hID0gbW9kdWxlLmV4cG9ydHMucmVzb2x2ZVNjaGVtYSA9IGZ1bmN0aW9uIChzY2hlbWEpIHtcbiAgaWYgKF8uaXNQbGFpbk9iamVjdChzY2hlbWEuc2NoZW1hKSkge1xuICAgIHNjaGVtYSA9IHJlc29sdmVTY2hlbWEoc2NoZW1hLnNjaGVtYSk7XG4gIH1cblxuICByZXR1cm4gc2NoZW1hO1xufTtcblxubW9kdWxlLmV4cG9ydHMuc2ltcGxlUmVmID0gZnVuY3Rpb24gKG5hbWUpIHtcbiAgaWYgKHR5cGVvZiBuYW1lID09PSAndW5kZWZpbmVkJykge1xuICAgIHJldHVybiBudWxsO1xuICB9XG5cbiAgaWYgKG5hbWUuaW5kZXhPZignIy9kZWZpbml0aW9ucy8nKSA9PT0gMCkge1xuICAgIHJldHVybiBuYW1lLnN1YnN0cmluZygnIy9kZWZpbml0aW9ucy8nLmxlbmd0aCk7XG4gIH0gZWxzZSB7XG4gICAgcmV0dXJuIG5hbWU7XG4gIH1cbn07XG5cbi8qKlxuICogaGVscGVyIHRvIHJlbW92ZSBleHRlbnNpb25zIGFuZCBhZGQgdGhlbSB0byBhbiBvYmplY3RcbiAqXG4gKiBAcGFyYW0ga2V5bmFtZVxuICogQHBhcmFtIG9ialxuICovXG5tb2R1bGUuZXhwb3J0cy5leHRyYWN0RXh0ZW5zaW9ucyA9IGZ1bmN0aW9uIChrZXluYW1lLCBvYmosIHZhbHVlKSB7XG4gIGlmKCFrZXluYW1lIHx8ICFvYmopIHtcbiAgICByZXR1cm47XG4gIH1cblxuICBpZiAodHlwZW9mIGtleW5hbWUgPT09ICdzdHJpbmcnICYmIGtleW5hbWUuaW5kZXhPZigneC0nKSA9PT0gMCkge1xuICAgIG9iai52ZW5kb3JFeHRlbnNpb25zID0gb2JqLnZlbmRvckV4dGVuc2lvbnMgfHwge307XG4gICAgaWYodmFsdWUpIHtcbiAgICAgIG9iai52ZW5kb3JFeHRlbnNpb25zW2tleW5hbWVdID0gdmFsdWU7XG4gICAgfVxuICAgIGVsc2Uge1xuICAgICAgb2JqLnZlbmRvckV4dGVuc2lvbnNba2V5bmFtZV0gPSBvYmpba2V5bmFtZV07XG4gICAgfVxuICB9XG59O1xufSkuY2FsbCh0aGlzLHJlcXVpcmUoJ19wcm9jZXNzJykpXG4vLyMgc291cmNlTWFwcGluZ1VSTD1kYXRhOmFwcGxpY2F0aW9uL2pzb247Y2hhcnNldDp1dGYtODtiYXNlNjQsZXlKMlpYSnphVzl1SWpvekxDSnpiM1Z5WTJWeklqcGJJbXhwWWk5b1pXeHdaWEp6TG1weklsMHNJbTVoYldWeklqcGJYU3dpYldGd2NHbHVaM01pT2lJN1FVRkJRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRWlMQ0ptYVd4bElqb2laMlZ1WlhKaGRHVmtMbXB6SWl3aWMyOTFjbU5sVW05dmRDSTZJaUlzSW5OdmRYSmpaWE5EYjI1MFpXNTBJanBiSWlkMWMyVWdjM1J5YVdOMEp6dGNibHh1ZG1GeUlGOGdQU0I3WEc0Z0lHbHpVR3hoYVc1UFltcGxZM1E2SUhKbGNYVnBjbVVvSjJ4dlpHRnphQzFqYjIxd1lYUXZiR0Z1Wnk5cGMxQnNZV2x1VDJKcVpXTjBKeWtzWEc0Z0lHbHVaR1Y0VDJZNklISmxjWFZwY21Vb0oyeHZaR0Z6YUMxamIyMXdZWFF2WVhKeVlYa3ZhVzVrWlhoUFppY3BYRzU5TzF4dVhHNXRiMlIxYkdVdVpYaHdiM0owY3k1ZlgySnBibVFnUFNCbWRXNWpkR2x2YmlBb1ptNHNJRzFsS1NCN1hHNGdJSEpsZEhWeWJpQm1kVzVqZEdsdmJpZ3BlMXh1SUNBZ0lISmxkSFZ5YmlCbWJpNWhjSEJzZVNodFpTd2dZWEpuZFcxbGJuUnpLVHRjYmlBZ2ZUdGNibjA3WEc1Y2JuWmhjaUJzYjJjZ1BTQnRiMlIxYkdVdVpYaHdiM0owY3k1c2IyY2dQU0JtZFc1amRHbHZiaWdwSUh0Y2JpQWdMeThnVDI1c2VTQnNiMmNnYVdZZ1lYWmhhV3hoWW14bElHRnVaQ0IzWlNkeVpTQnViM1FnZEdWemRHbHVaMXh1SUNCcFppQW9ZMjl1YzI5c1pTQW1KaUJ3Y205alpYTnpMbVZ1ZGk1T1QwUkZYMFZPVmlBaFBUMGdKM1JsYzNRbktTQjdYRzRnSUNBZ1kyOXVjMjlzWlM1c2IyY29RWEp5WVhrdWNISnZkRzkwZVhCbExuTnNhV05sTG1OaGJHd29ZWEpuZFcxbGJuUnpLVnN3WFNrN1hHNGdJSDFjYm4wN1hHNWNibTF2WkhWc1pTNWxlSEJ2Y25SekxtWmhhV3dnUFNCbWRXNWpkR2x2YmlBb2JXVnpjMkZuWlNrZ2UxeHVJQ0JzYjJjb2JXVnpjMkZuWlNrN1hHNTlPMXh1WEc1dGIyUjFiR1V1Wlhod2IzSjBjeTV2Y0hScGIyNUlkRzFzSUQwZ1puVnVZM1JwYjI0Z0tHeGhZbVZzTENCMllXeDFaU2tnZTF4dUlDQnlaWFIxY200Z0p6eDBjajQ4ZEdRZ1kyeGhjM005WENKdmNIUnBiMjVPWVcxbFhDSStKeUFySUd4aFltVnNJQ3NnSnpvOEwzUmtQangwWkQ0bklDc2dkbUZzZFdVZ0t5QW5QQzkwWkQ0OEwzUnlQaWM3WEc1OU8xeHVYRzUyWVhJZ2NtVnpiMngyWlZOamFHVnRZU0E5SUcxdlpIVnNaUzVsZUhCdmNuUnpMbkpsYzI5c2RtVlRZMmhsYldFZ1BTQm1kVzVqZEdsdmJpQW9jMk5vWlcxaEtTQjdYRzRnSUdsbUlDaGZMbWx6VUd4aGFXNVBZbXBsWTNRb2MyTm9aVzFoTG5OamFHVnRZU2twSUh0Y2JpQWdJQ0J6WTJobGJXRWdQU0J5WlhOdmJIWmxVMk5vWlcxaEtITmphR1Z0WVM1elkyaGxiV0VwTzF4dUlDQjlYRzVjYmlBZ2NtVjBkWEp1SUhOamFHVnRZVHRjYm4wN1hHNWNibTF2WkhWc1pTNWxlSEJ2Y25SekxuTnBiWEJzWlZKbFppQTlJR1oxYm1OMGFXOXVJQ2h1WVcxbEtTQjdYRzRnSUdsbUlDaDBlWEJsYjJZZ2JtRnRaU0E5UFQwZ0ozVnVaR1ZtYVc1bFpDY3BJSHRjYmlBZ0lDQnlaWFIxY200Z2JuVnNiRHRjYmlBZ2ZWeHVYRzRnSUdsbUlDaHVZVzFsTG1sdVpHVjRUMllvSnlNdlpHVm1hVzVwZEdsdmJuTXZKeWtnUFQwOUlEQXBJSHRjYmlBZ0lDQnlaWFIxY200Z2JtRnRaUzV6ZFdKemRISnBibWNvSnlNdlpHVm1hVzVwZEdsdmJuTXZKeTVzWlc1bmRHZ3BPMXh1SUNCOUlHVnNjMlVnZTF4dUlDQWdJSEpsZEhWeWJpQnVZVzFsTzF4dUlDQjlYRzU5TzF4dVhHNHZLaXBjYmlBcUlHaGxiSEJsY2lCMGJ5QnlaVzF2ZG1VZ1pYaDBaVzV6YVc5dWN5QmhibVFnWVdSa0lIUm9aVzBnZEc4Z1lXNGdiMkpxWldOMFhHNGdLbHh1SUNvZ1FIQmhjbUZ0SUd0bGVXNWhiV1ZjYmlBcUlFQndZWEpoYlNCdlltcGNiaUFxTDF4dWJXOWtkV3hsTG1WNGNHOXlkSE11WlhoMGNtRmpkRVY0ZEdWdWMybHZibk1nUFNCbWRXNWpkR2x2YmlBb2EyVjVibUZ0WlN3Z2IySnFMQ0IyWVd4MVpTa2dlMXh1SUNCcFppZ2hhMlY1Ym1GdFpTQjhmQ0FoYjJKcUtTQjdYRzRnSUNBZ2NtVjBkWEp1TzF4dUlDQjlYRzVjYmlBZ2FXWWdLSFI1Y0dWdlppQnJaWGx1WVcxbElEMDlQU0FuYzNSeWFXNW5KeUFtSmlCclpYbHVZVzFsTG1sdVpHVjRUMllvSjNndEp5a2dQVDA5SURBcElIdGNiaUFnSUNCdlltb3VkbVZ1Wkc5eVJYaDBaVzV6YVc5dWN5QTlJRzlpYWk1MlpXNWtiM0pGZUhSbGJuTnBiMjV6SUh4OElIdDlPMXh1SUNBZ0lHbG1LSFpoYkhWbEtTQjdYRzRnSUNBZ0lDQnZZbW91ZG1WdVpHOXlSWGgwWlc1emFXOXVjMXRyWlhsdVlXMWxYU0E5SUhaaGJIVmxPMXh1SUNBZ0lIMWNiaUFnSUNCbGJITmxJSHRjYmlBZ0lDQWdJRzlpYWk1MlpXNWtiM0pGZUhSbGJuTnBiMjV6VzJ0bGVXNWhiV1ZkSUQwZ2IySnFXMnRsZVc1aGJXVmRPMXh1SUNBZ0lIMWNiaUFnZlZ4dWZUc2lYWDA9IiwiKGZ1bmN0aW9uIChCdWZmZXIpe1xuJ3VzZSBzdHJpY3QnO1xuXG52YXIgaGVscGVycyA9IHJlcXVpcmUoJy4vaGVscGVycycpO1xudmFyIHJlcXVlc3QgPSByZXF1aXJlKCdzdXBlcmFnZW50Jyk7XG52YXIganN5YW1sID0gcmVxdWlyZSgnanMteWFtbCcpO1xudmFyIF8gPSB7XG4gIGlzT2JqZWN0OiByZXF1aXJlKCdsb2Rhc2gtY29tcGF0L2xhbmcvaXNPYmplY3QnKSxcbiAga2V5czogcmVxdWlyZSgnbG9kYXNoLWNvbXBhdC9vYmplY3Qva2V5cycpXG59O1xuXG4vKlxuICogSlF1ZXJ5SHR0cENsaWVudCBpcyBhIGxpZ2h0LXdlaWdodCwgbm9kZSBvciBicm93c2VyIEhUVFAgY2xpZW50XG4gKi9cbnZhciBKUXVlcnlIdHRwQ2xpZW50ID0gZnVuY3Rpb24gKCkge1xuICB0aGlzLnR5cGUgPSAnSlF1ZXJ5SHR0cENsaWVudCc7XG59O1xuXG4vKlxuICogU3VwZXJhZ2VudEh0dHBDbGllbnQgaXMgYSBsaWdodC13ZWlnaHQsIG5vZGUgb3IgYnJvd3NlciBIVFRQIGNsaWVudFxuICovXG52YXIgU3VwZXJhZ2VudEh0dHBDbGllbnQgPSBmdW5jdGlvbiAoKSB7XG4gIHRoaXMudHlwZSA9ICdTdXBlcmFnZW50SHR0cENsaWVudCc7XG59O1xuXG4vKipcbiAqIFN3YWdnZXJIdHRwIGlzIGEgd3JhcHBlciBmb3IgZXhlY3V0aW5nIHJlcXVlc3RzXG4gKi9cbnZhciBTd2FnZ2VySHR0cCA9IG1vZHVsZS5leHBvcnRzID0gZnVuY3Rpb24gKCkge307XG5cblN3YWdnZXJIdHRwLnByb3RvdHlwZS5leGVjdXRlID0gZnVuY3Rpb24gKG9iaiwgb3B0cykge1xuICB2YXIgY2xpZW50O1xuXG4gIGlmKG9wdHMgJiYgb3B0cy5jbGllbnQpIHtcbiAgICBjbGllbnQgPSBvcHRzLmNsaWVudDtcbiAgfVxuICBlbHNlIHtcbiAgICBjbGllbnQgPSBuZXcgU3VwZXJhZ2VudEh0dHBDbGllbnQob3B0cyk7XG4gIH1cbiAgY2xpZW50Lm9wdHMgPSBvcHRzIHx8IHt9O1xuXG4gIGlmIChvcHRzICYmIG9wdHMucmVxdWVzdEFnZW50KSB7XG4gICAgcmVxdWVzdCA9IG9wdHMucmVxdWVzdEFnZW50O1xuICB9XG5cbiAgLy8gbGVnYWN5IHN1cHBvcnRcbiAgdmFyIGhhc0pRdWVyeSA9IGZhbHNlO1xuICBpZih0eXBlb2Ygd2luZG93ICE9PSAndW5kZWZpbmVkJykge1xuICAgIGlmKHR5cGVvZiB3aW5kb3cualF1ZXJ5ICE9PSAndW5kZWZpbmVkJykge1xuICAgICAgaGFzSlF1ZXJ5ID0gdHJ1ZTtcbiAgICB9XG4gIH1cbiAgLy8gT1BUSU9OUyBzdXBwb3J0XG4gIGlmKG9iai5tZXRob2QudG9Mb3dlckNhc2UoKSA9PT0gJ29wdGlvbnMnICYmIGNsaWVudC50eXBlID09PSAnU3VwZXJhZ2VudEh0dHBDbGllbnQnKSB7XG4gICAgbG9nKCdmb3JjaW5nIGpRdWVyeSBhcyBPUFRJT05TIGFyZSBub3Qgc3VwcG9ydGVkIGJ5IFN1cGVyQWdlbnQnKTtcbiAgICBvYmoudXNlSlF1ZXJ5ID0gdHJ1ZTtcbiAgfVxuICBpZih0aGlzLmlzSW50ZXJuZXRFeHBsb3JlcigpICYmIChvYmoudXNlSlF1ZXJ5ID09PSBmYWxzZSB8fCAhaGFzSlF1ZXJ5ICkpIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoJ1Vuc3VwcG9ydGVkIGNvbmZpZ3VyYXRpb24hIEpRdWVyeSBpcyByZXF1aXJlZCBidXQgbm90IGF2YWlsYWJsZScpO1xuICB9XG4gIGlmICgob2JqICYmIG9iai51c2VKUXVlcnkgPT09IHRydWUpIHx8IHRoaXMuaXNJbnRlcm5ldEV4cGxvcmVyKCkgJiYgaGFzSlF1ZXJ5KSB7XG4gICAgY2xpZW50ID0gbmV3IEpRdWVyeUh0dHBDbGllbnQob3B0cyk7XG4gIH1cblxuICB2YXIgc3VjY2VzcyA9IG9iai5vbi5yZXNwb25zZTtcbiAgdmFyIGVycm9yID0gb2JqLm9uLmVycm9yO1xuXG4gIHZhciByZXF1ZXN0SW50ZXJjZXB0b3IgPSBmdW5jdGlvbihkYXRhKSB7XG4gICAgaWYob3B0cyAmJiBvcHRzLnJlcXVlc3RJbnRlcmNlcHRvcikge1xuICAgICAgZGF0YSA9IG9wdHMucmVxdWVzdEludGVyY2VwdG9yLmFwcGx5KGRhdGEpO1xuICAgIH1cbiAgICByZXR1cm4gZGF0YTtcbiAgfTtcblxuICB2YXIgcmVzcG9uc2VJbnRlcmNlcHRvciA9IGZ1bmN0aW9uKGRhdGEpIHtcbiAgICBpZihvcHRzICYmIG9wdHMucmVzcG9uc2VJbnRlcmNlcHRvcikge1xuICAgICAgZGF0YSA9IG9wdHMucmVzcG9uc2VJbnRlcmNlcHRvci5hcHBseShkYXRhLCBbb2JqXSk7XG4gICAgfVxuICAgIHJldHVybiBzdWNjZXNzKGRhdGEpO1xuICB9O1xuXG4gIHZhciBlcnJvckludGVyY2VwdG9yID0gZnVuY3Rpb24oZGF0YSkge1xuICAgIGlmKG9wdHMgJiYgb3B0cy5yZXNwb25zZUludGVyY2VwdG9yKSB7XG4gICAgICBkYXRhID0gb3B0cy5yZXNwb25zZUludGVyY2VwdG9yLmFwcGx5KGRhdGEsIFtvYmpdKTtcbiAgICB9XG4gICAgZXJyb3IoZGF0YSk7XG4gIH07XG5cbiAgb2JqLm9uLmVycm9yID0gZnVuY3Rpb24oZGF0YSkge1xuICAgIGVycm9ySW50ZXJjZXB0b3IoZGF0YSk7XG4gIH07XG5cbiAgb2JqLm9uLnJlc3BvbnNlID0gZnVuY3Rpb24oZGF0YSkge1xuICAgIGlmKGRhdGEgJiYgZGF0YS5zdGF0dXMgPj0gNDAwKSB7XG4gICAgICBlcnJvckludGVyY2VwdG9yKGRhdGEpO1xuICAgIH1cbiAgICBlbHNlIHtcbiAgICAgIHJlc3BvbnNlSW50ZXJjZXB0b3IoZGF0YSk7XG4gICAgfVxuICB9O1xuXG4gIGlmIChfLmlzT2JqZWN0KG9iaikgJiYgXy5pc09iamVjdChvYmouYm9keSkpIHtcbiAgICAvLyBzcGVjaWFsIHByb2Nlc3NpbmcgZm9yIGZpbGUgdXBsb2FkcyB2aWEganF1ZXJ5XG4gICAgaWYgKG9iai5ib2R5LnR5cGUgJiYgb2JqLmJvZHkudHlwZSA9PT0gJ2Zvcm1EYXRhJyl7XG4gICAgICBpZihvcHRzLnVzZUpRdWVyeSkge1xuICAgICAgICBvYmouY29udGVudFR5cGUgPSBmYWxzZTtcbiAgICAgICAgb2JqLnByb2Nlc3NEYXRhID0gZmFsc2U7XG4gICAgICAgIGRlbGV0ZSBvYmouaGVhZGVyc1snQ29udGVudC1UeXBlJ107XG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgb2JqID0gcmVxdWVzdEludGVyY2VwdG9yKG9iaikgfHwgb2JqO1xuICBpZiAob2JqLmJlZm9yZVNlbmQpIHtcbiAgICBvYmouYmVmb3JlU2VuZChmdW5jdGlvbihfb2JqKSB7XG4gICAgICBjbGllbnQuZXhlY3V0ZShfb2JqIHx8IG9iaik7XG4gICAgfSk7XG4gIH0gZWxzZSB7XG4gICAgY2xpZW50LmV4ZWN1dGUob2JqKTtcbiAgfVxuXG4gIHJldHVybiAob2JqLmRlZmVycmVkKSA/IG9iai5kZWZlcnJlZC5wcm9taXNlIDogb2JqO1xufTtcblxuU3dhZ2dlckh0dHAucHJvdG90eXBlLmlzSW50ZXJuZXRFeHBsb3JlciA9IGZ1bmN0aW9uICgpIHtcbiAgdmFyIGRldGVjdGVkSUUgPSBmYWxzZTtcblxuICBpZiAodHlwZW9mIG5hdmlnYXRvciAhPT0gJ3VuZGVmaW5lZCcgJiYgbmF2aWdhdG9yLnVzZXJBZ2VudCkge1xuICAgIHZhciBuYXYgPSBuYXZpZ2F0b3IudXNlckFnZW50LnRvTG93ZXJDYXNlKCk7XG5cbiAgICBpZiAobmF2LmluZGV4T2YoJ21zaWUnKSAhPT0gLTEpIHtcbiAgICAgIHZhciB2ZXJzaW9uID0gcGFyc2VJbnQobmF2LnNwbGl0KCdtc2llJylbMV0pO1xuXG4gICAgICBpZiAodmVyc2lvbiA8PSA4KSB7XG4gICAgICAgIGRldGVjdGVkSUUgPSB0cnVlO1xuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIHJldHVybiBkZXRlY3RlZElFO1xufTtcblxuSlF1ZXJ5SHR0cENsaWVudC5wcm90b3R5cGUuZXhlY3V0ZSA9IGZ1bmN0aW9uIChvYmopIHtcbiAgdmFyIGpxID0gdGhpcy5qUXVlcnkgfHwgKHR5cGVvZiB3aW5kb3cgIT09ICd1bmRlZmluZWQnICYmIHdpbmRvdy5qUXVlcnkpO1xuICB2YXIgY2IgPSBvYmoub247XG4gIHZhciByZXF1ZXN0ID0gb2JqO1xuXG4gIGlmKHR5cGVvZiBqcSA9PT0gJ3VuZGVmaW5lZCcgfHwganEgPT09IGZhbHNlKSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKCdVbnN1cHBvcnRlZCBjb25maWd1cmF0aW9uISBKUXVlcnkgaXMgcmVxdWlyZWQgYnV0IG5vdCBhdmFpbGFibGUnKTtcbiAgfVxuXG4gIG9iai50eXBlID0gb2JqLm1ldGhvZDtcbiAgb2JqLmNhY2hlID0gb2JqLmpxdWVyeUFqYXhDYWNoZTtcbiAgb2JqLmRhdGEgPSBvYmouYm9keTtcbiAgZGVsZXRlIG9iai5qcXVlcnlBamF4Q2FjaGU7XG4gIGRlbGV0ZSBvYmoudXNlSlF1ZXJ5O1xuICBkZWxldGUgb2JqLmJvZHk7XG5cbiAgb2JqLmNvbXBsZXRlID0gZnVuY3Rpb24gKHJlc3BvbnNlKSB7XG4gICAgdmFyIGhlYWRlcnMgPSB7fTtcbiAgICB2YXIgaGVhZGVyQXJyYXkgPSByZXNwb25zZS5nZXRBbGxSZXNwb25zZUhlYWRlcnMoKS5zcGxpdCgnXFxuJyk7XG5cbiAgICBmb3IgKHZhciBpID0gMDsgaSA8IGhlYWRlckFycmF5Lmxlbmd0aDsgaSsrKSB7XG4gICAgICB2YXIgdG9TcGxpdCA9IGhlYWRlckFycmF5W2ldLnRyaW0oKTtcblxuICAgICAgaWYgKHRvU3BsaXQubGVuZ3RoID09PSAwKSB7XG4gICAgICAgIGNvbnRpbnVlO1xuICAgICAgfVxuXG4gICAgICB2YXIgc2VwYXJhdG9yID0gdG9TcGxpdC5pbmRleE9mKCc6Jyk7XG5cbiAgICAgIGlmIChzZXBhcmF0b3IgPT09IC0xKSB7XG4gICAgICAgIC8vIE5hbWUgYnV0IG5vIHZhbHVlIGluIHRoZSBoZWFkZXJcbiAgICAgICAgaGVhZGVyc1t0b1NwbGl0XSA9IG51bGw7XG5cbiAgICAgICAgY29udGludWU7XG4gICAgICB9XG5cbiAgICAgIHZhciBuYW1lID0gdG9TcGxpdC5zdWJzdHJpbmcoMCwgc2VwYXJhdG9yKS50cmltKCk7XG4gICAgICB2YXIgdmFsdWUgPSB0b1NwbGl0LnN1YnN0cmluZyhzZXBhcmF0b3IgKyAxKS50cmltKCk7XG5cbiAgICAgIGhlYWRlcnNbbmFtZV0gPSB2YWx1ZTtcbiAgICB9XG5cbiAgICB2YXIgb3V0ID0ge1xuICAgICAgdXJsOiByZXF1ZXN0LnVybCxcbiAgICAgIG1ldGhvZDogcmVxdWVzdC5tZXRob2QsXG4gICAgICBzdGF0dXM6IHJlc3BvbnNlLnN0YXR1cyxcbiAgICAgIHN0YXR1c1RleHQ6IHJlc3BvbnNlLnN0YXR1c1RleHQsXG4gICAgICBkYXRhOiByZXNwb25zZS5yZXNwb25zZVRleHQsXG4gICAgICBoZWFkZXJzOiBoZWFkZXJzXG4gICAgfTtcblxuICAgIHRyeSB7XG4gICAgICB2YXIgcG9zc2libGVPYmogPSAgcmVzcG9uc2UucmVzcG9uc2VKU09OIHx8IGpzeWFtbC5zYWZlTG9hZChyZXNwb25zZS5yZXNwb25zZVRleHQpO1xuICAgICAgb3V0Lm9iaiA9ICh0eXBlb2YgcG9zc2libGVPYmogPT09ICdzdHJpbmcnKSA/IHt9IDogcG9zc2libGVPYmo7XG4gICAgfSBjYXRjaCAoZXgpIHtcbiAgICAgIC8vIGRvIG5vdCBzZXQgb3V0Lm9ialxuICAgICAgaGVscGVycy5sb2coJ3VuYWJsZSB0byBwYXJzZSBKU09OL1lBTUwgY29udGVudCcpO1xuICAgIH1cblxuICAgIC8vIEkgY2FuIHRocm93LCBvciBwYXJzZSBudWxsP1xuICAgIG91dC5vYmogPSBvdXQub2JqIHx8IG51bGw7XG5cbiAgICBpZiAocmVzcG9uc2Uuc3RhdHVzID49IDIwMCAmJiByZXNwb25zZS5zdGF0dXMgPCAzMDApIHtcbiAgICAgIGNiLnJlc3BvbnNlKG91dCk7XG4gICAgfSBlbHNlIGlmIChyZXNwb25zZS5zdGF0dXMgPT09IDAgfHwgKHJlc3BvbnNlLnN0YXR1cyA+PSA0MDAgJiYgcmVzcG9uc2Uuc3RhdHVzIDwgNTk5KSkge1xuICAgICAgY2IuZXJyb3Iob3V0KTtcbiAgICB9IGVsc2Uge1xuICAgICAgcmV0dXJuIGNiLnJlc3BvbnNlKG91dCk7XG4gICAgfVxuICB9O1xuXG4gIGpxLnN1cHBvcnQuY29ycyA9IHRydWU7XG5cbiAgcmV0dXJuIGpxLmFqYXgob2JqKTtcbn07XG5cblN1cGVyYWdlbnRIdHRwQ2xpZW50LnByb3RvdHlwZS5leGVjdXRlID0gZnVuY3Rpb24gKG9iaikge1xuICB2YXIgbWV0aG9kID0gb2JqLm1ldGhvZC50b0xvd2VyQ2FzZSgpO1xuICB2YXIgdGltZW91dCA9IG9iai50aW1lb3V0O1xuXG4gIGlmIChtZXRob2QgPT09ICdkZWxldGUnKSB7XG4gICAgbWV0aG9kID0gJ2RlbCc7XG4gIH1cbiAgdmFyIGhlYWRlcnMgPSBvYmouaGVhZGVycyB8fCB7fTtcblxuICB2YXIgciA9IHJlcXVlc3RbbWV0aG9kXShvYmoudXJsKTtcblxuICBpZiAob2JqLmNvbm5lY3Rpb25BZ2VudCkge1xuICAgIHIuYWdlbnQob2JqLmNvbm5lY3Rpb25BZ2VudCk7XG4gIH1cblxuICBpZiAodGltZW91dCkge1xuICAgIHIudGltZW91dCh0aW1lb3V0KTtcbiAgfVxuXG4gIGlmIChvYmouZW5hYmxlQ29va2llcykge1xuICAgIHIud2l0aENyZWRlbnRpYWxzKCk7XG4gIH1cblxuICB2YXIgYWNjZXB0ID0gb2JqLmhlYWRlcnMuQWNjZXB0O1xuXG4gIGlmKHRoaXMuYmluYXJ5UmVxdWVzdChhY2NlcHQpKSB7XG4gICAgci5vbigncmVxdWVzdCcsIGZ1bmN0aW9uICgpIHtcbiAgICAgIGlmKHRoaXMueGhyKSB7XG4gICAgICAgIHRoaXMueGhyLnJlc3BvbnNlVHlwZSA9ICdibG9iJztcbiAgICAgIH1cbiAgICB9KTtcbiAgfVxuXG4gIGlmKG9iai5ib2R5KSB7XG4gICAgaWYoXy5pc09iamVjdChvYmouYm9keSkpIHtcbiAgICAgIHZhciBjb250ZW50VHlwZSA9IG9iai5oZWFkZXJzWydDb250ZW50LVR5cGUnXSB8fCAnJztcbiAgICAgIGlmIChjb250ZW50VHlwZS5pbmRleE9mKCdtdWx0aXBhcnQvZm9ybS1kYXRhJykgPT09IDApIHtcbiAgICAgICAgZGVsZXRlIGhlYWRlcnNbJ0NvbnRlbnQtVHlwZSddO1xuICAgICAgICBpZih7fS50b1N0cmluZy5hcHBseShvYmouYm9keSkgPT09ICdbb2JqZWN0IEZvcm1EYXRhXScpIHtcbiAgICAgICAgICByLnNlbmQob2JqLmJvZHkpO1xuICAgICAgICB9XG4gICAgICAgIGVsc2Uge1xuICAgICAgICAgIHZhciBrZXluYW1lLCB2YWx1ZSwgdjtcbiAgICAgICAgICBmb3IgKGtleW5hbWUgaW4gb2JqLmJvZHkpIHtcbiAgICAgICAgICAgIHZhbHVlID0gb2JqLmJvZHlba2V5bmFtZV07XG4gICAgICAgICAgICBpZihBcnJheS5pc0FycmF5KHZhbHVlKSkge1xuICAgICAgICAgICAgICBmb3IodiBpbiB2YWx1ZSkge1xuICAgICAgICAgICAgICAgIHIuZmllbGQoa2V5bmFtZSwgdik7XG4gICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgICByLmZpZWxkKGtleW5hbWUsIHZhbHVlKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICAgIGVsc2UgaWYgKF8uaXNPYmplY3Qob2JqLmJvZHkpKSB7XG4gICAgICAgIC8vIG5vbiBtdWx0aXBhcnQvZm9ybS1kYXRhXG4gICAgICAgIG9iai5ib2R5ID0gSlNPTi5zdHJpbmdpZnkob2JqLmJvZHkpO1xuICAgICAgICByLnNlbmQob2JqLmJvZHkpO1xuICAgICAgfVxuICAgIH1cbiAgICBlbHNlIHtcbiAgICAgIHIuc2VuZChvYmouYm9keSk7XG4gICAgfVxuICB9XG5cbiAgdmFyIG5hbWU7XG4gIGZvciAobmFtZSBpbiBoZWFkZXJzKSB7XG4gICAgci5zZXQobmFtZSwgaGVhZGVyc1tuYW1lXSk7XG4gIH1cblxuICBpZih0eXBlb2Ygci5idWZmZXIgPT09ICdmdW5jdGlvbicpIHtcbiAgICByLmJ1ZmZlcigpOyAvLyBmb3JjZSBzdXBlcmFnZW50IHRvIHBvcHVsYXRlIHJlcy50ZXh0IHdpdGggdGhlIHJhdyByZXNwb25zZSBkYXRhXG4gIH1cblxuICByLmVuZChmdW5jdGlvbiAoZXJyLCByZXMpIHtcbiAgICByZXMgPSByZXMgfHwge1xuICAgICAgc3RhdHVzOiAwLFxuICAgICAgaGVhZGVyczoge2Vycm9yOiAnbm8gcmVzcG9uc2UgZnJvbSBzZXJ2ZXInfVxuICAgIH07XG4gICAgdmFyIHJlc3BvbnNlID0ge1xuICAgICAgdXJsOiBvYmoudXJsLFxuICAgICAgbWV0aG9kOiBvYmoubWV0aG9kLFxuICAgICAgaGVhZGVyczogcmVzLmhlYWRlcnNcbiAgICB9O1xuICAgIHZhciBjYjtcblxuICAgIGlmICghZXJyICYmIHJlcy5lcnJvcikge1xuICAgICAgZXJyID0gcmVzLmVycm9yO1xuICAgIH1cblxuICAgIGlmIChlcnIgJiYgb2JqLm9uICYmIG9iai5vbi5lcnJvcikge1xuICAgICAgcmVzcG9uc2UuZXJyT2JqID0gZXJyO1xuICAgICAgcmVzcG9uc2Uuc3RhdHVzID0gcmVzID8gcmVzLnN0YXR1cyA6IDUwMDtcbiAgICAgIHJlc3BvbnNlLnN0YXR1c1RleHQgPSByZXMgPyByZXMudGV4dCA6IGVyci5tZXNzYWdlO1xuICAgICAgaWYgKHJlcy5oZWFkZXJzICYmIHJlcy5oZWFkZXJzWydjb250ZW50LXR5cGUnXSkge1xuICAgICAgICBpZiAocmVzLmhlYWRlcnNbJ2NvbnRlbnQtdHlwZSddLmluZGV4T2YoJ2FwcGxpY2F0aW9uL2pzb24nKSA+PSAwKSB7XG4gICAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgIHJlc3BvbnNlLm9iaiA9IEpTT04ucGFyc2UocmVzcG9uc2Uuc3RhdHVzVGV4dCk7XG4gICAgICAgICAgfVxuICAgICAgICAgIGNhdGNoIChlKSB7XG4gICAgICAgICAgICByZXNwb25zZS5vYmogPSBudWxsO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgfVxuICAgICAgY2IgPSBvYmoub24uZXJyb3I7XG4gICAgfSBlbHNlIGlmIChyZXMgJiYgb2JqLm9uICYmIG9iai5vbi5yZXNwb25zZSkge1xuICAgICAgdmFyIHBvc3NpYmxlT2JqO1xuXG4gICAgICAvLyBBbHJlYWR5IHBhcnNlZCBieSBieSBzdXBlcmFnZW50P1xuICAgICAgaWYgKHJlcy5ib2R5ICYmIF8ua2V5cyhyZXMuYm9keSkubGVuZ3RoID4gMCkge1xuICAgICAgICBwb3NzaWJsZU9iaiA9IHJlcy5ib2R5O1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgdHJ5IHtcbiAgICAgICAgICBwb3NzaWJsZU9iaiA9IGpzeWFtbC5zYWZlTG9hZChyZXMudGV4dCk7XG4gICAgICAgICAgLy8gY2FuIHBhcnNlIGludG8gYSBzdHJpbmcuLi4gd2hpY2ggd2UgZG9uJ3QgbmVlZCBydW5uaW5nIGFyb3VuZCBpbiB0aGUgc3lzdGVtXG4gICAgICAgICAgcG9zc2libGVPYmogPSAodHlwZW9mIHBvc3NpYmxlT2JqID09PSAnc3RyaW5nJykgPyBudWxsIDogcG9zc2libGVPYmo7XG4gICAgICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAgICAgICBoZWxwZXJzLmxvZygnY2Fubm90IHBhcnNlIEpTT04vWUFNTCBjb250ZW50Jyk7XG4gICAgICAgIH1cbiAgICAgIH1cblxuICAgICAgLy8gbnVsbCBtZWFucyB3ZSBjYW4ndCBwYXJzZSBpbnRvIG9iamVjdFxuICAgICAgaWYodHlwZW9mIEJ1ZmZlciA9PT0gJ2Z1bmN0aW9uJyAmJiBCdWZmZXIuaXNCdWZmZXIocG9zc2libGVPYmopKSB7XG4gICAgICAgIHJlc3BvbnNlLmRhdGEgPSBwb3NzaWJsZU9iajtcbiAgICAgIH1cbiAgICAgIGVsc2Uge1xuICAgICAgICByZXNwb25zZS5vYmogPSAodHlwZW9mIHBvc3NpYmxlT2JqID09PSAnb2JqZWN0JykgPyBwb3NzaWJsZU9iaiA6IG51bGw7XG4gICAgICB9XG5cbiAgICAgIHJlc3BvbnNlLnN0YXR1cyA9IHJlcy5zdGF0dXM7XG4gICAgICByZXNwb25zZS5zdGF0dXNUZXh0ID0gcmVzLnRleHQ7XG4gICAgICBjYiA9IG9iai5vbi5yZXNwb25zZTtcbiAgICB9XG4gICAgaWYgKHJlcy54aHIgJiYgcmVzLnhoci5yZXNwb25zZSkge1xuICAgICAgcmVzcG9uc2UuZGF0YSA9IHJlcy54aHIucmVzcG9uc2U7XG4gICAgfVxuICAgIGVsc2UgaWYoIXJlc3BvbnNlLmRhdGEpIHtcbiAgICAgIHJlc3BvbnNlLmRhdGEgPSByZXNwb25zZS5zdGF0dXNUZXh0O1xuICAgIH1cblxuICAgIGlmIChjYikge1xuICAgICAgY2IocmVzcG9uc2UpO1xuICAgIH1cbiAgfSk7XG59O1xuXG5TdXBlcmFnZW50SHR0cENsaWVudC5wcm90b3R5cGUuIGJpbmFyeVJlcXVlc3QgPSBmdW5jdGlvbiAoYWNjZXB0KSB7XG4gIGlmKCFhY2NlcHQpIHtcbiAgICByZXR1cm4gZmFsc2U7XG4gIH1cbiAgcmV0dXJuICgvXmltYWdlL2kpLnRlc3QoYWNjZXB0KVxuICAgIHx8ICgvXmFwcGxpY2F0aW9uXFwvcGRmLykudGVzdChhY2NlcHQpXG4gICAgfHwgKC9eYXBwbGljYXRpb25cXC9vY3RldC1zdHJlYW0vKS50ZXN0KGFjY2VwdCk7XG59O1xuXG59KS5jYWxsKHRoaXMscmVxdWlyZShcImJ1ZmZlclwiKS5CdWZmZXIpXG4vLyMgc291cmNlTWFwcGluZ1VSTD1kYXRhOmFwcGxpY2F0aW9uL2pzb247Y2hhcnNldDp1dGYtODtiYXNlNjQsZXlKMlpYSnphVzl1SWpvekxDSnpiM1Z5WTJWeklqcGJJbXhwWWk5b2RIUndMbXB6SWwwc0ltNWhiV1Z6SWpwYlhTd2liV0Z3Y0dsdVozTWlPaUk3UVVGQlFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJJaXdpWm1sc1pTSTZJbWRsYm1WeVlYUmxaQzVxY3lJc0luTnZkWEpqWlZKdmIzUWlPaUlpTENKemIzVnlZMlZ6UTI5dWRHVnVkQ0k2V3lJbmRYTmxJSE4wY21samRDYzdYRzVjYm5aaGNpQm9aV3h3WlhKeklEMGdjbVZ4ZFdseVpTZ25MaTlvWld4d1pYSnpKeWs3WEc1MllYSWdjbVZ4ZFdWemRDQTlJSEpsY1hWcGNtVW9KM04xY0dWeVlXZGxiblFuS1R0Y2JuWmhjaUJxYzNsaGJXd2dQU0J5WlhGMWFYSmxLQ2RxY3kxNVlXMXNKeWs3WEc1MllYSWdYeUE5SUh0Y2JpQWdhWE5QWW1wbFkzUTZJSEpsY1hWcGNtVW9KMnh2WkdGemFDMWpiMjF3WVhRdmJHRnVaeTlwYzA5aWFtVmpkQ2NwTEZ4dUlDQnJaWGx6T2lCeVpYRjFhWEpsS0Nkc2IyUmhjMmd0WTI5dGNHRjBMMjlpYW1WamRDOXJaWGx6SnlsY2JuMDdYRzVjYmk4cVhHNGdLaUJLVVhWbGNubElkSFJ3UTJ4cFpXNTBJR2x6SUdFZ2JHbG5hSFF0ZDJWcFoyaDBMQ0J1YjJSbElHOXlJR0p5YjNkelpYSWdTRlJVVUNCamJHbGxiblJjYmlBcUwxeHVkbUZ5SUVwUmRXVnllVWgwZEhCRGJHbGxiblFnUFNCbWRXNWpkR2x2YmlBb0tTQjdYRzRnSUhSb2FYTXVkSGx3WlNBOUlDZEtVWFZsY25sSWRIUndRMnhwWlc1MEp6dGNibjA3WEc1Y2JpOHFYRzRnS2lCVGRYQmxjbUZuWlc1MFNIUjBjRU5zYVdWdWRDQnBjeUJoSUd4cFoyaDBMWGRsYVdkb2RDd2dibTlrWlNCdmNpQmljbTkzYzJWeUlFaFVWRkFnWTJ4cFpXNTBYRzRnS2k5Y2JuWmhjaUJUZFhCbGNtRm5aVzUwU0hSMGNFTnNhV1Z1ZENBOUlHWjFibU4wYVc5dUlDZ3BJSHRjYmlBZ2RHaHBjeTUwZVhCbElEMGdKMU4xY0dWeVlXZGxiblJJZEhSd1EyeHBaVzUwSnp0Y2JuMDdYRzVjYmk4cUtseHVJQ29nVTNkaFoyZGxja2gwZEhBZ2FYTWdZU0IzY21Gd2NHVnlJR1p2Y2lCbGVHVmpkWFJwYm1jZ2NtVnhkV1Z6ZEhOY2JpQXFMMXh1ZG1GeUlGTjNZV2RuWlhKSWRIUndJRDBnYlc5a2RXeGxMbVY0Y0c5eWRITWdQU0JtZFc1amRHbHZiaUFvS1NCN2ZUdGNibHh1VTNkaFoyZGxja2gwZEhBdWNISnZkRzkwZVhCbExtVjRaV04xZEdVZ1BTQm1kVzVqZEdsdmJpQW9iMkpxTENCdmNIUnpLU0I3WEc0Z0lIWmhjaUJqYkdsbGJuUTdYRzVjYmlBZ2FXWW9iM0IwY3lBbUppQnZjSFJ6TG1Oc2FXVnVkQ2tnZTF4dUlDQWdJR05zYVdWdWRDQTlJRzl3ZEhNdVkyeHBaVzUwTzF4dUlDQjlYRzRnSUdWc2MyVWdlMXh1SUNBZ0lHTnNhV1Z1ZENBOUlHNWxkeUJUZFhCbGNtRm5aVzUwU0hSMGNFTnNhV1Z1ZENodmNIUnpLVHRjYmlBZ2ZWeHVJQ0JqYkdsbGJuUXViM0IwY3lBOUlHOXdkSE1nZkh3Z2UzMDdYRzVjYmlBZ2FXWWdLRzl3ZEhNZ0ppWWdiM0IwY3k1eVpYRjFaWE4wUVdkbGJuUXBJSHRjYmlBZ0lDQnlaWEYxWlhOMElEMGdiM0IwY3k1eVpYRjFaWE4wUVdkbGJuUTdYRzRnSUgxY2JseHVJQ0F2THlCc1pXZGhZM2tnYzNWd2NHOXlkRnh1SUNCMllYSWdhR0Z6U2xGMVpYSjVJRDBnWm1Gc2MyVTdYRzRnSUdsbUtIUjVjR1Z2WmlCM2FXNWtiM2NnSVQwOUlDZDFibVJsWm1sdVpXUW5LU0I3WEc0Z0lDQWdhV1lvZEhsd1pXOW1JSGRwYm1SdmR5NXFVWFZsY25rZ0lUMDlJQ2QxYm1SbFptbHVaV1FuS1NCN1hHNGdJQ0FnSUNCb1lYTktVWFZsY25rZ1BTQjBjblZsTzF4dUlDQWdJSDFjYmlBZ2ZWeHVJQ0F2THlCUFVGUkpUMDVUSUhOMWNIQnZjblJjYmlBZ2FXWW9iMkpxTG0xbGRHaHZaQzUwYjB4dmQyVnlRMkZ6WlNncElEMDlQU0FuYjNCMGFXOXVjeWNnSmlZZ1kyeHBaVzUwTG5SNWNHVWdQVDA5SUNkVGRYQmxjbUZuWlc1MFNIUjBjRU5zYVdWdWRDY3BJSHRjYmlBZ0lDQnNiMmNvSjJadmNtTnBibWNnYWxGMVpYSjVJR0Z6SUU5UVZFbFBUbE1nWVhKbElHNXZkQ0J6ZFhCd2IzSjBaV1FnWW5rZ1UzVndaWEpCWjJWdWRDY3BPMXh1SUNBZ0lHOWlhaTUxYzJWS1VYVmxjbmtnUFNCMGNuVmxPMXh1SUNCOVhHNGdJR2xtS0hSb2FYTXVhWE5KYm5SbGNtNWxkRVY0Y0d4dmNtVnlLQ2tnSmlZZ0tHOWlhaTUxYzJWS1VYVmxjbmtnUFQwOUlHWmhiSE5sSUh4OElDRm9ZWE5LVVhWbGNua2dLU2tnZTF4dUlDQWdJSFJvY205M0lHNWxkeUJGY25KdmNpZ25WVzV6ZFhCd2IzSjBaV1FnWTI5dVptbG5kWEpoZEdsdmJpRWdTbEYxWlhKNUlHbHpJSEpsY1hWcGNtVmtJR0oxZENCdWIzUWdZWFpoYVd4aFlteGxKeWs3WEc0Z0lIMWNiaUFnYVdZZ0tDaHZZbW9nSmlZZ2IySnFMblZ6WlVwUmRXVnllU0E5UFQwZ2RISjFaU2tnZkh3Z2RHaHBjeTVwYzBsdWRHVnlibVYwUlhod2JHOXlaWElvS1NBbUppQm9ZWE5LVVhWbGNua3BJSHRjYmlBZ0lDQmpiR2xsYm5RZ1BTQnVaWGNnU2xGMVpYSjVTSFIwY0VOc2FXVnVkQ2h2Y0hSektUdGNiaUFnZlZ4dVhHNGdJSFpoY2lCemRXTmpaWE56SUQwZ2IySnFMbTl1TG5KbGMzQnZibk5sTzF4dUlDQjJZWElnWlhKeWIzSWdQU0J2WW1vdWIyNHVaWEp5YjNJN1hHNWNiaUFnZG1GeUlISmxjWFZsYzNSSmJuUmxjbU5sY0hSdmNpQTlJR1oxYm1OMGFXOXVLR1JoZEdFcElIdGNiaUFnSUNCcFppaHZjSFJ6SUNZbUlHOXdkSE11Y21WeGRXVnpkRWx1ZEdWeVkyVndkRzl5S1NCN1hHNGdJQ0FnSUNCa1lYUmhJRDBnYjNCMGN5NXlaWEYxWlhOMFNXNTBaWEpqWlhCMGIzSXVZWEJ3Ykhrb1pHRjBZU2s3WEc0Z0lDQWdmVnh1SUNBZ0lISmxkSFZ5YmlCa1lYUmhPMXh1SUNCOU8xeHVYRzRnSUhaaGNpQnlaWE53YjI1elpVbHVkR1Z5WTJWd2RHOXlJRDBnWm5WdVkzUnBiMjRvWkdGMFlTa2dlMXh1SUNBZ0lHbG1LRzl3ZEhNZ0ppWWdiM0IwY3k1eVpYTndiMjV6WlVsdWRHVnlZMlZ3ZEc5eUtTQjdYRzRnSUNBZ0lDQmtZWFJoSUQwZ2IzQjBjeTV5WlhOd2IyNXpaVWx1ZEdWeVkyVndkRzl5TG1Gd2NHeDVLR1JoZEdFc0lGdHZZbXBkS1R0Y2JpQWdJQ0I5WEc0Z0lDQWdjbVYwZFhKdUlITjFZMk5sYzNNb1pHRjBZU2s3WEc0Z0lIMDdYRzVjYmlBZ2RtRnlJR1Z5Y205eVNXNTBaWEpqWlhCMGIzSWdQU0JtZFc1amRHbHZiaWhrWVhSaEtTQjdYRzRnSUNBZ2FXWW9iM0IwY3lBbUppQnZjSFJ6TG5KbGMzQnZibk5sU1c1MFpYSmpaWEIwYjNJcElIdGNiaUFnSUNBZ0lHUmhkR0VnUFNCdmNIUnpMbkpsYzNCdmJuTmxTVzUwWlhKalpYQjBiM0l1WVhCd2JIa29aR0YwWVN3Z1cyOWlhbDBwTzF4dUlDQWdJSDFjYmlBZ0lDQmxjbkp2Y2loa1lYUmhLVHRjYmlBZ2ZUdGNibHh1SUNCdlltb3ViMjR1WlhKeWIzSWdQU0JtZFc1amRHbHZiaWhrWVhSaEtTQjdYRzRnSUNBZ1pYSnliM0pKYm5SbGNtTmxjSFJ2Y2loa1lYUmhLVHRjYmlBZ2ZUdGNibHh1SUNCdlltb3ViMjR1Y21WemNHOXVjMlVnUFNCbWRXNWpkR2x2Ymloa1lYUmhLU0I3WEc0Z0lDQWdhV1lvWkdGMFlTQW1KaUJrWVhSaExuTjBZWFIxY3lBK1BTQTBNREFwSUh0Y2JpQWdJQ0FnSUdWeWNtOXlTVzUwWlhKalpYQjBiM0lvWkdGMFlTazdYRzRnSUNBZ2ZWeHVJQ0FnSUdWc2MyVWdlMXh1SUNBZ0lDQWdjbVZ6Y0c5dWMyVkpiblJsY21ObGNIUnZjaWhrWVhSaEtUdGNiaUFnSUNCOVhHNGdJSDA3WEc1Y2JpQWdhV1lnS0Y4dWFYTlBZbXBsWTNRb2IySnFLU0FtSmlCZkxtbHpUMkpxWldOMEtHOWlhaTVpYjJSNUtTa2dlMXh1SUNBZ0lDOHZJSE53WldOcFlXd2djSEp2WTJWemMybHVaeUJtYjNJZ1ptbHNaU0IxY0d4dllXUnpJSFpwWVNCcWNYVmxjbmxjYmlBZ0lDQnBaaUFvYjJKcUxtSnZaSGt1ZEhsd1pTQW1KaUJ2WW1vdVltOWtlUzUwZVhCbElEMDlQU0FuWm05eWJVUmhkR0VuS1h0Y2JpQWdJQ0FnSUdsbUtHOXdkSE11ZFhObFNsRjFaWEo1S1NCN1hHNGdJQ0FnSUNBZ0lHOWlhaTVqYjI1MFpXNTBWSGx3WlNBOUlHWmhiSE5sTzF4dUlDQWdJQ0FnSUNCdlltb3VjSEp2WTJWemMwUmhkR0VnUFNCbVlXeHpaVHRjYmlBZ0lDQWdJQ0FnWkdWc1pYUmxJRzlpYWk1b1pXRmtaWEp6V3lkRGIyNTBaVzUwTFZSNWNHVW5YVHRjYmlBZ0lDQWdJSDFjYmlBZ0lDQjlYRzRnSUgxY2JseHVJQ0J2WW1vZ1BTQnlaWEYxWlhOMFNXNTBaWEpqWlhCMGIzSW9iMkpxS1NCOGZDQnZZbW83WEc0Z0lHbG1JQ2h2WW1vdVltVm1iM0psVTJWdVpDa2dlMXh1SUNBZ0lHOWlhaTVpWldadmNtVlRaVzVrS0daMWJtTjBhVzl1S0Y5dlltb3BJSHRjYmlBZ0lDQWdJR05zYVdWdWRDNWxlR1ZqZFhSbEtGOXZZbW9nZkh3Z2IySnFLVHRjYmlBZ0lDQjlLVHRjYmlBZ2ZTQmxiSE5sSUh0Y2JpQWdJQ0JqYkdsbGJuUXVaWGhsWTNWMFpTaHZZbW9wTzF4dUlDQjlYRzVjYmlBZ2NtVjBkWEp1SUNodlltb3VaR1ZtWlhKeVpXUXBJRDhnYjJKcUxtUmxabVZ5Y21Wa0xuQnliMjFwYzJVZ09pQnZZbW83WEc1OU8xeHVYRzVUZDJGbloyVnlTSFIwY0M1d2NtOTBiM1I1Y0dVdWFYTkpiblJsY201bGRFVjRjR3h2Y21WeUlEMGdablZ1WTNScGIyNGdLQ2tnZTF4dUlDQjJZWElnWkdWMFpXTjBaV1JKUlNBOUlHWmhiSE5sTzF4dVhHNGdJR2xtSUNoMGVYQmxiMllnYm1GMmFXZGhkRzl5SUNFOVBTQW5kVzVrWldacGJtVmtKeUFtSmlCdVlYWnBaMkYwYjNJdWRYTmxja0ZuWlc1MEtTQjdYRzRnSUNBZ2RtRnlJRzVoZGlBOUlHNWhkbWxuWVhSdmNpNTFjMlZ5UVdkbGJuUXVkRzlNYjNkbGNrTmhjMlVvS1R0Y2JseHVJQ0FnSUdsbUlDaHVZWFl1YVc1a1pYaFBaaWduYlhOcFpTY3BJQ0U5UFNBdE1Ta2dlMXh1SUNBZ0lDQWdkbUZ5SUhabGNuTnBiMjRnUFNCd1lYSnpaVWx1ZENodVlYWXVjM0JzYVhRb0oyMXphV1VuS1ZzeFhTazdYRzVjYmlBZ0lDQWdJR2xtSUNoMlpYSnphVzl1SUR3OUlEZ3BJSHRjYmlBZ0lDQWdJQ0FnWkdWMFpXTjBaV1JKUlNBOUlIUnlkV1U3WEc0Z0lDQWdJQ0I5WEc0Z0lDQWdmVnh1SUNCOVhHNWNiaUFnY21WMGRYSnVJR1JsZEdWamRHVmtTVVU3WEc1OU8xeHVYRzVLVVhWbGNubElkSFJ3UTJ4cFpXNTBMbkJ5YjNSdmRIbHdaUzVsZUdWamRYUmxJRDBnWm5WdVkzUnBiMjRnS0c5aWFpa2dlMXh1SUNCMllYSWdhbkVnUFNCMGFHbHpMbXBSZFdWeWVTQjhmQ0FvZEhsd1pXOW1JSGRwYm1SdmR5QWhQVDBnSjNWdVpHVm1hVzVsWkNjZ0ppWWdkMmx1Wkc5M0xtcFJkV1Z5ZVNrN1hHNGdJSFpoY2lCallpQTlJRzlpYWk1dmJqdGNiaUFnZG1GeUlISmxjWFZsYzNRZ1BTQnZZbW83WEc1Y2JpQWdhV1lvZEhsd1pXOW1JR3B4SUQwOVBTQW5kVzVrWldacGJtVmtKeUI4ZkNCcWNTQTlQVDBnWm1Gc2MyVXBJSHRjYmlBZ0lDQjBhSEp2ZHlCdVpYY2dSWEp5YjNJb0oxVnVjM1Z3Y0c5eWRHVmtJR052Ym1acFozVnlZWFJwYjI0aElFcFJkV1Z5ZVNCcGN5QnlaWEYxYVhKbFpDQmlkWFFnYm05MElHRjJZV2xzWVdKc1pTY3BPMXh1SUNCOVhHNWNiaUFnYjJKcUxuUjVjR1VnUFNCdlltb3ViV1YwYUc5a08xeHVJQ0J2WW1vdVkyRmphR1VnUFNCdlltb3VhbkYxWlhKNVFXcGhlRU5oWTJobE8xeHVJQ0J2WW1vdVpHRjBZU0E5SUc5aWFpNWliMlI1TzF4dUlDQmtaV3hsZEdVZ2IySnFMbXB4ZFdWeWVVRnFZWGhEWVdOb1pUdGNiaUFnWkdWc1pYUmxJRzlpYWk1MWMyVktVWFZsY25rN1hHNGdJR1JsYkdWMFpTQnZZbW91WW05a2VUdGNibHh1SUNCdlltb3VZMjl0Y0d4bGRHVWdQU0JtZFc1amRHbHZiaUFvY21WemNHOXVjMlVwSUh0Y2JpQWdJQ0IyWVhJZ2FHVmhaR1Z5Y3lBOUlIdDlPMXh1SUNBZ0lIWmhjaUJvWldGa1pYSkJjbkpoZVNBOUlISmxjM0J2Ym5ObExtZGxkRUZzYkZKbGMzQnZibk5sU0dWaFpHVnljeWdwTG5Od2JHbDBLQ2RjWEc0bktUdGNibHh1SUNBZ0lHWnZjaUFvZG1GeUlHa2dQU0F3T3lCcElEd2dhR1ZoWkdWeVFYSnlZWGt1YkdWdVozUm9PeUJwS3lzcElIdGNiaUFnSUNBZ0lIWmhjaUIwYjFOd2JHbDBJRDBnYUdWaFpHVnlRWEp5WVhsYmFWMHVkSEpwYlNncE8xeHVYRzRnSUNBZ0lDQnBaaUFvZEc5VGNHeHBkQzVzWlc1bmRHZ2dQVDA5SURBcElIdGNiaUFnSUNBZ0lDQWdZMjl1ZEdsdWRXVTdYRzRnSUNBZ0lDQjlYRzVjYmlBZ0lDQWdJSFpoY2lCelpYQmhjbUYwYjNJZ1BTQjBiMU53YkdsMExtbHVaR1Y0VDJZb0p6b25LVHRjYmx4dUlDQWdJQ0FnYVdZZ0tITmxjR0Z5WVhSdmNpQTlQVDBnTFRFcElIdGNiaUFnSUNBZ0lDQWdMeThnVG1GdFpTQmlkWFFnYm04Z2RtRnNkV1VnYVc0Z2RHaGxJR2hsWVdSbGNseHVJQ0FnSUNBZ0lDQm9aV0ZrWlhKelczUnZVM0JzYVhSZElEMGdiblZzYkR0Y2JseHVJQ0FnSUNBZ0lDQmpiMjUwYVc1MVpUdGNiaUFnSUNBZ0lIMWNibHh1SUNBZ0lDQWdkbUZ5SUc1aGJXVWdQU0IwYjFOd2JHbDBMbk4xWW5OMGNtbHVaeWd3TENCelpYQmhjbUYwYjNJcExuUnlhVzBvS1R0Y2JpQWdJQ0FnSUhaaGNpQjJZV3gxWlNBOUlIUnZVM0JzYVhRdWMzVmljM1J5YVc1bktITmxjR0Z5WVhSdmNpQXJJREVwTG5SeWFXMG9LVHRjYmx4dUlDQWdJQ0FnYUdWaFpHVnljMXR1WVcxbFhTQTlJSFpoYkhWbE8xeHVJQ0FnSUgxY2JseHVJQ0FnSUhaaGNpQnZkWFFnUFNCN1hHNGdJQ0FnSUNCMWNtdzZJSEpsY1hWbGMzUXVkWEpzTEZ4dUlDQWdJQ0FnYldWMGFHOWtPaUJ5WlhGMVpYTjBMbTFsZEdodlpDeGNiaUFnSUNBZ0lITjBZWFIxY3pvZ2NtVnpjRzl1YzJVdWMzUmhkSFZ6TEZ4dUlDQWdJQ0FnYzNSaGRIVnpWR1Y0ZERvZ2NtVnpjRzl1YzJVdWMzUmhkSFZ6VkdWNGRDeGNiaUFnSUNBZ0lHUmhkR0U2SUhKbGMzQnZibk5sTG5KbGMzQnZibk5sVkdWNGRDeGNiaUFnSUNBZ0lHaGxZV1JsY25NNklHaGxZV1JsY25OY2JpQWdJQ0I5TzF4dVhHNGdJQ0FnZEhKNUlIdGNiaUFnSUNBZ0lIWmhjaUJ3YjNOemFXSnNaVTlpYWlBOUlDQnlaWE53YjI1elpTNXlaWE53YjI1elpVcFRUMDRnZkh3Z2FuTjVZVzFzTG5OaFptVk1iMkZrS0hKbGMzQnZibk5sTG5KbGMzQnZibk5sVkdWNGRDazdYRzRnSUNBZ0lDQnZkWFF1YjJKcUlEMGdLSFI1Y0dWdlppQndiM056YVdKc1pVOWlhaUE5UFQwZ0ozTjBjbWx1WnljcElEOGdlMzBnT2lCd2IzTnphV0pzWlU5aWFqdGNiaUFnSUNCOUlHTmhkR05vSUNobGVDa2dlMXh1SUNBZ0lDQWdMeThnWkc4Z2JtOTBJSE5sZENCdmRYUXViMkpxWEc0Z0lDQWdJQ0JvWld4d1pYSnpMbXh2WnlnbmRXNWhZbXhsSUhSdklIQmhjbk5sSUVwVFQwNHZXVUZOVENCamIyNTBaVzUwSnlrN1hHNGdJQ0FnZlZ4dVhHNGdJQ0FnTHk4Z1NTQmpZVzRnZEdoeWIzY3NJRzl5SUhCaGNuTmxJRzUxYkd3L1hHNGdJQ0FnYjNWMExtOWlhaUE5SUc5MWRDNXZZbW9nZkh3Z2JuVnNiRHRjYmx4dUlDQWdJR2xtSUNoeVpYTndiMjV6WlM1emRHRjBkWE1nUGowZ01qQXdJQ1ltSUhKbGMzQnZibk5sTG5OMFlYUjFjeUE4SURNd01Da2dlMXh1SUNBZ0lDQWdZMkl1Y21WemNHOXVjMlVvYjNWMEtUdGNiaUFnSUNCOUlHVnNjMlVnYVdZZ0tISmxjM0J2Ym5ObExuTjBZWFIxY3lBOVBUMGdNQ0I4ZkNBb2NtVnpjRzl1YzJVdWMzUmhkSFZ6SUQ0OUlEUXdNQ0FtSmlCeVpYTndiMjV6WlM1emRHRjBkWE1nUENBMU9Ua3BLU0I3WEc0Z0lDQWdJQ0JqWWk1bGNuSnZjaWh2ZFhRcE8xeHVJQ0FnSUgwZ1pXeHpaU0I3WEc0Z0lDQWdJQ0J5WlhSMWNtNGdZMkl1Y21WemNHOXVjMlVvYjNWMEtUdGNiaUFnSUNCOVhHNGdJSDA3WEc1Y2JpQWdhbkV1YzNWd2NHOXlkQzVqYjNKeklEMGdkSEoxWlR0Y2JseHVJQ0J5WlhSMWNtNGdhbkV1WVdwaGVDaHZZbW9wTzF4dWZUdGNibHh1VTNWd1pYSmhaMlZ1ZEVoMGRIQkRiR2xsYm5RdWNISnZkRzkwZVhCbExtVjRaV04xZEdVZ1BTQm1kVzVqZEdsdmJpQW9iMkpxS1NCN1hHNGdJSFpoY2lCdFpYUm9iMlFnUFNCdlltb3ViV1YwYUc5a0xuUnZURzkzWlhKRFlYTmxLQ2s3WEc0Z0lIWmhjaUIwYVcxbGIzVjBJRDBnYjJKcUxuUnBiV1Z2ZFhRN1hHNWNiaUFnYVdZZ0tHMWxkR2h2WkNBOVBUMGdKMlJsYkdWMFpTY3BJSHRjYmlBZ0lDQnRaWFJvYjJRZ1BTQW5aR1ZzSnp0Y2JpQWdmVnh1SUNCMllYSWdhR1ZoWkdWeWN5QTlJRzlpYWk1b1pXRmtaWEp6SUh4OElIdDlPMXh1WEc0Z0lIWmhjaUJ5SUQwZ2NtVnhkV1Z6ZEZ0dFpYUm9iMlJkS0c5aWFpNTFjbXdwTzF4dVhHNGdJR2xtSUNodlltb3VZMjl1Ym1WamRHbHZia0ZuWlc1MEtTQjdYRzRnSUNBZ2NpNWhaMlZ1ZENodlltb3VZMjl1Ym1WamRHbHZia0ZuWlc1MEtUdGNiaUFnZlZ4dVhHNGdJR2xtSUNoMGFXMWxiM1YwS1NCN1hHNGdJQ0FnY2k1MGFXMWxiM1YwS0hScGJXVnZkWFFwTzF4dUlDQjlYRzVjYmlBZ2FXWWdLRzlpYWk1bGJtRmliR1ZEYjI5cmFXVnpLU0I3WEc0Z0lDQWdjaTUzYVhSb1EzSmxaR1Z1ZEdsaGJITW9LVHRjYmlBZ2ZWeHVYRzRnSUhaaGNpQmhZMk5sY0hRZ1BTQnZZbW91YUdWaFpHVnljeTVCWTJObGNIUTdYRzVjYmlBZ2FXWW9kR2hwY3k1aWFXNWhjbmxTWlhGMVpYTjBLR0ZqWTJWd2RDa3BJSHRjYmlBZ0lDQnlMbTl1S0NkeVpYRjFaWE4wSnl3Z1puVnVZM1JwYjI0Z0tDa2dlMXh1SUNBZ0lDQWdhV1lvZEdocGN5NTRhSElwSUh0Y2JpQWdJQ0FnSUNBZ2RHaHBjeTU0YUhJdWNtVnpjRzl1YzJWVWVYQmxJRDBnSjJKc2IySW5PMXh1SUNBZ0lDQWdmVnh1SUNBZ0lIMHBPMXh1SUNCOVhHNWNiaUFnYVdZb2IySnFMbUp2WkhrcElIdGNiaUFnSUNCcFppaGZMbWx6VDJKcVpXTjBLRzlpYWk1aWIyUjVLU2tnZTF4dUlDQWdJQ0FnZG1GeUlHTnZiblJsYm5SVWVYQmxJRDBnYjJKcUxtaGxZV1JsY25OYkowTnZiblJsYm5RdFZIbHdaU2RkSUh4OElDY25PMXh1SUNBZ0lDQWdhV1lnS0dOdmJuUmxiblJVZVhCbExtbHVaR1Y0VDJZb0oyMTFiSFJwY0dGeWRDOW1iM0p0TFdSaGRHRW5LU0E5UFQwZ01Da2dlMXh1SUNBZ0lDQWdJQ0JrWld4bGRHVWdhR1ZoWkdWeWMxc25RMjl1ZEdWdWRDMVVlWEJsSjEwN1hHNGdJQ0FnSUNBZ0lHbG1LSHQ5TG5SdlUzUnlhVzVuTG1Gd2NHeDVLRzlpYWk1aWIyUjVLU0E5UFQwZ0oxdHZZbXBsWTNRZ1JtOXliVVJoZEdGZEp5a2dlMXh1SUNBZ0lDQWdJQ0FnSUhJdWMyVnVaQ2h2WW1vdVltOWtlU2s3WEc0Z0lDQWdJQ0FnSUgxY2JpQWdJQ0FnSUNBZ1pXeHpaU0I3WEc0Z0lDQWdJQ0FnSUNBZ2RtRnlJR3RsZVc1aGJXVXNJSFpoYkhWbExDQjJPMXh1SUNBZ0lDQWdJQ0FnSUdadmNpQW9hMlY1Ym1GdFpTQnBiaUJ2WW1vdVltOWtlU2tnZTF4dUlDQWdJQ0FnSUNBZ0lDQWdkbUZzZFdVZ1BTQnZZbW91WW05a2VWdHJaWGx1WVcxbFhUdGNiaUFnSUNBZ0lDQWdJQ0FnSUdsbUtFRnljbUY1TG1selFYSnlZWGtvZG1Gc2RXVXBLU0I3WEc0Z0lDQWdJQ0FnSUNBZ0lDQWdJR1p2Y2loMklHbHVJSFpoYkhWbEtTQjdYRzRnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdjaTVtYVdWc1pDaHJaWGx1WVcxbExDQjJLVHRjYmlBZ0lDQWdJQ0FnSUNBZ0lDQWdmVnh1SUNBZ0lDQWdJQ0FnSUNBZ2ZWeHVJQ0FnSUNBZ0lDQWdJQ0FnWld4elpTQjdYRzRnSUNBZ0lDQWdJQ0FnSUNBZ0lISXVabWxsYkdRb2EyVjVibUZ0WlN3Z2RtRnNkV1VwTzF4dUlDQWdJQ0FnSUNBZ0lDQWdmVnh1SUNBZ0lDQWdJQ0FnSUgxY2JpQWdJQ0FnSUNBZ2ZWeHVJQ0FnSUNBZ2ZWeHVJQ0FnSUNBZ1pXeHpaU0JwWmlBb1h5NXBjMDlpYW1WamRDaHZZbW91WW05a2VTa3BJSHRjYmlBZ0lDQWdJQ0FnTHk4Z2JtOXVJRzExYkhScGNHRnlkQzltYjNKdExXUmhkR0ZjYmlBZ0lDQWdJQ0FnYjJKcUxtSnZaSGtnUFNCS1UwOU9Mbk4wY21sdVoybG1lU2h2WW1vdVltOWtlU2s3WEc0Z0lDQWdJQ0FnSUhJdWMyVnVaQ2h2WW1vdVltOWtlU2s3WEc0Z0lDQWdJQ0I5WEc0Z0lDQWdmVnh1SUNBZ0lHVnNjMlVnZTF4dUlDQWdJQ0FnY2k1elpXNWtLRzlpYWk1aWIyUjVLVHRjYmlBZ0lDQjlYRzRnSUgxY2JseHVJQ0IyWVhJZ2JtRnRaVHRjYmlBZ1ptOXlJQ2h1WVcxbElHbHVJR2hsWVdSbGNuTXBJSHRjYmlBZ0lDQnlMbk5sZENodVlXMWxMQ0JvWldGa1pYSnpXMjVoYldWZEtUdGNiaUFnZlZ4dVhHNGdJR2xtS0hSNWNHVnZaaUJ5TG1KMVptWmxjaUE5UFQwZ0oyWjFibU4wYVc5dUp5a2dlMXh1SUNBZ0lISXVZblZtWm1WeUtDazdJQzh2SUdadmNtTmxJSE4xY0dWeVlXZGxiblFnZEc4Z2NHOXdkV3hoZEdVZ2NtVnpMblJsZUhRZ2QybDBhQ0IwYUdVZ2NtRjNJSEpsYzNCdmJuTmxJR1JoZEdGY2JpQWdmVnh1WEc0Z0lISXVaVzVrS0daMWJtTjBhVzl1SUNobGNuSXNJSEpsY3lrZ2UxeHVJQ0FnSUhKbGN5QTlJSEpsY3lCOGZDQjdYRzRnSUNBZ0lDQnpkR0YwZFhNNklEQXNYRzRnSUNBZ0lDQm9aV0ZrWlhKek9pQjdaWEp5YjNJNklDZHVieUJ5WlhOd2IyNXpaU0JtY205dElITmxjblpsY2lkOVhHNGdJQ0FnZlR0Y2JpQWdJQ0IyWVhJZ2NtVnpjRzl1YzJVZ1BTQjdYRzRnSUNBZ0lDQjFjbXc2SUc5aWFpNTFjbXdzWEc0Z0lDQWdJQ0J0WlhSb2IyUTZJRzlpYWk1dFpYUm9iMlFzWEc0Z0lDQWdJQ0JvWldGa1pYSnpPaUJ5WlhNdWFHVmhaR1Z5YzF4dUlDQWdJSDA3WEc0Z0lDQWdkbUZ5SUdOaU8xeHVYRzRnSUNBZ2FXWWdLQ0ZsY25JZ0ppWWdjbVZ6TG1WeWNtOXlLU0I3WEc0Z0lDQWdJQ0JsY25JZ1BTQnlaWE11WlhKeWIzSTdYRzRnSUNBZ2ZWeHVYRzRnSUNBZ2FXWWdLR1Z5Y2lBbUppQnZZbW91YjI0Z0ppWWdiMkpxTG05dUxtVnljbTl5S1NCN1hHNGdJQ0FnSUNCeVpYTndiMjV6WlM1bGNuSlBZbW9nUFNCbGNuSTdYRzRnSUNBZ0lDQnlaWE53YjI1elpTNXpkR0YwZFhNZ1BTQnlaWE1nUHlCeVpYTXVjM1JoZEhWeklEb2dOVEF3TzF4dUlDQWdJQ0FnY21WemNHOXVjMlV1YzNSaGRIVnpWR1Y0ZENBOUlISmxjeUEvSUhKbGN5NTBaWGgwSURvZ1pYSnlMbTFsYzNOaFoyVTdYRzRnSUNBZ0lDQnBaaUFvY21WekxtaGxZV1JsY25NZ0ppWWdjbVZ6TG1obFlXUmxjbk5iSjJOdmJuUmxiblF0ZEhsd1pTZGRLU0I3WEc0Z0lDQWdJQ0FnSUdsbUlDaHlaWE11YUdWaFpHVnljMXNuWTI5dWRHVnVkQzEwZVhCbEoxMHVhVzVrWlhoUFppZ25ZWEJ3YkdsallYUnBiMjR2YW5OdmJpY3BJRDQ5SURBcElIdGNiaUFnSUNBZ0lDQWdJQ0IwY25rZ2UxeHVJQ0FnSUNBZ0lDQWdJQ0FnY21WemNHOXVjMlV1YjJKcUlEMGdTbE5QVGk1d1lYSnpaU2h5WlhOd2IyNXpaUzV6ZEdGMGRYTlVaWGgwS1R0Y2JpQWdJQ0FnSUNBZ0lDQjlYRzRnSUNBZ0lDQWdJQ0FnWTJGMFkyZ2dLR1VwSUh0Y2JpQWdJQ0FnSUNBZ0lDQWdJSEpsYzNCdmJuTmxMbTlpYWlBOUlHNTFiR3c3WEc0Z0lDQWdJQ0FnSUNBZ2ZWeHVJQ0FnSUNBZ0lDQjlYRzRnSUNBZ0lDQjlYRzRnSUNBZ0lDQmpZaUE5SUc5aWFpNXZiaTVsY25KdmNqdGNiaUFnSUNCOUlHVnNjMlVnYVdZZ0tISmxjeUFtSmlCdlltb3ViMjRnSmlZZ2IySnFMbTl1TG5KbGMzQnZibk5sS1NCN1hHNGdJQ0FnSUNCMllYSWdjRzl6YzJsaWJHVlBZbW83WEc1Y2JpQWdJQ0FnSUM4dklFRnNjbVZoWkhrZ2NHRnljMlZrSUdKNUlHSjVJSE4xY0dWeVlXZGxiblEvWEc0Z0lDQWdJQ0JwWmlBb2NtVnpMbUp2WkhrZ0ppWWdYeTVyWlhsektISmxjeTVpYjJSNUtTNXNaVzVuZEdnZ1BpQXdLU0I3WEc0Z0lDQWdJQ0FnSUhCdmMzTnBZbXhsVDJKcUlEMGdjbVZ6TG1KdlpIazdYRzRnSUNBZ0lDQjlJR1ZzYzJVZ2UxeHVJQ0FnSUNBZ0lDQjBjbmtnZTF4dUlDQWdJQ0FnSUNBZ0lIQnZjM05wWW14bFQySnFJRDBnYW5ONVlXMXNMbk5oWm1WTWIyRmtLSEpsY3k1MFpYaDBLVHRjYmlBZ0lDQWdJQ0FnSUNBdkx5QmpZVzRnY0dGeWMyVWdhVzUwYnlCaElITjBjbWx1Wnk0dUxpQjNhR2xqYUNCM1pTQmtiMjRuZENCdVpXVmtJSEoxYm01cGJtY2dZWEp2ZFc1a0lHbHVJSFJvWlNCemVYTjBaVzFjYmlBZ0lDQWdJQ0FnSUNCd2IzTnphV0pzWlU5aWFpQTlJQ2gwZVhCbGIyWWdjRzl6YzJsaWJHVlBZbW9nUFQwOUlDZHpkSEpwYm1jbktTQS9JRzUxYkd3Z09pQndiM056YVdKc1pVOWlhanRjYmlBZ0lDQWdJQ0FnZlNCallYUmphQ0FvWlNrZ2UxeHVJQ0FnSUNBZ0lDQWdJR2hsYkhCbGNuTXViRzluS0NkallXNXViM1FnY0dGeWMyVWdTbE5QVGk5WlFVMU1JR052Ym5SbGJuUW5LVHRjYmlBZ0lDQWdJQ0FnZlZ4dUlDQWdJQ0FnZlZ4dVhHNGdJQ0FnSUNBdkx5QnVkV3hzSUcxbFlXNXpJSGRsSUdOaGJpZDBJSEJoY25ObElHbHVkRzhnYjJKcVpXTjBYRzRnSUNBZ0lDQnBaaWgwZVhCbGIyWWdRblZtWm1WeUlEMDlQU0FuWm5WdVkzUnBiMjRuSUNZbUlFSjFabVpsY2k1cGMwSjFabVpsY2lod2IzTnphV0pzWlU5aWFpa3BJSHRjYmlBZ0lDQWdJQ0FnY21WemNHOXVjMlV1WkdGMFlTQTlJSEJ2YzNOcFlteGxUMkpxTzF4dUlDQWdJQ0FnZlZ4dUlDQWdJQ0FnWld4elpTQjdYRzRnSUNBZ0lDQWdJSEpsYzNCdmJuTmxMbTlpYWlBOUlDaDBlWEJsYjJZZ2NHOXpjMmxpYkdWUFltb2dQVDA5SUNkdlltcGxZM1FuS1NBL0lIQnZjM05wWW14bFQySnFJRG9nYm5Wc2JEdGNiaUFnSUNBZ0lIMWNibHh1SUNBZ0lDQWdjbVZ6Y0c5dWMyVXVjM1JoZEhWeklEMGdjbVZ6TG5OMFlYUjFjenRjYmlBZ0lDQWdJSEpsYzNCdmJuTmxMbk4wWVhSMWMxUmxlSFFnUFNCeVpYTXVkR1Y0ZER0Y2JpQWdJQ0FnSUdOaUlEMGdiMkpxTG05dUxuSmxjM0J2Ym5ObE8xeHVJQ0FnSUgxY2JpQWdJQ0JwWmlBb2NtVnpMbmhvY2lBbUppQnlaWE11ZUdoeUxuSmxjM0J2Ym5ObEtTQjdYRzRnSUNBZ0lDQnlaWE53YjI1elpTNWtZWFJoSUQwZ2NtVnpMbmhvY2k1eVpYTndiMjV6WlR0Y2JpQWdJQ0I5WEc0Z0lDQWdaV3h6WlNCcFppZ2hjbVZ6Y0c5dWMyVXVaR0YwWVNrZ2UxeHVJQ0FnSUNBZ2NtVnpjRzl1YzJVdVpHRjBZU0E5SUhKbGMzQnZibk5sTG5OMFlYUjFjMVJsZUhRN1hHNGdJQ0FnZlZ4dVhHNGdJQ0FnYVdZZ0tHTmlLU0I3WEc0Z0lDQWdJQ0JqWWloeVpYTndiMjV6WlNrN1hHNGdJQ0FnZlZ4dUlDQjlLVHRjYm4wN1hHNWNibE4xY0dWeVlXZGxiblJJZEhSd1EyeHBaVzUwTG5CeWIzUnZkSGx3WlM0Z1ltbHVZWEo1VW1WeGRXVnpkQ0E5SUdaMWJtTjBhVzl1SUNoaFkyTmxjSFFwSUh0Y2JpQWdhV1lvSVdGalkyVndkQ2tnZTF4dUlDQWdJSEpsZEhWeWJpQm1ZV3h6WlR0Y2JpQWdmVnh1SUNCeVpYUjFjbTRnS0M5ZWFXMWhaMlV2YVNrdWRHVnpkQ2hoWTJObGNIUXBYRzRnSUNBZ2ZId2dLQzllWVhCd2JHbGpZWFJwYjI1Y1hDOXdaR1l2S1M1MFpYTjBLR0ZqWTJWd2RDbGNiaUFnSUNCOGZDQW9MMTVoY0hCc2FXTmhkR2x2Ymx4Y0wyOWpkR1YwTFhOMGNtVmhiUzhwTG5SbGMzUW9ZV05qWlhCMEtUdGNibjA3WEc0aVhYMD0iLCIndXNlIHN0cmljdCc7XG5cbnZhciBTd2FnZ2VySHR0cCA9IHJlcXVpcmUoJy4vaHR0cCcpO1xudmFyIF8gPSB7XG4gIGlzT2JqZWN0OiByZXF1aXJlKCdsb2Rhc2gtY29tcGF0L2xhbmcvaXNPYmplY3QnKSxcbiAgY2xvbmVEZWVwOiByZXF1aXJlKCdsb2Rhc2gtY29tcGF0L2xhbmcvY2xvbmVEZWVwJyksXG4gIGlzQXJyYXk6IHJlcXVpcmUoJ2xvZGFzaC1jb21wYXQvbGFuZy9pc0FycmF5JyksXG4gIGlzU3RyaW5nOiByZXF1aXJlKCdsb2Rhc2gtY29tcGF0L2xhbmcvaXNTdHJpbmcnKVxufTtcblxuXG4vKipcbiAqIFJlc29sdmVzIGEgc3BlYydzIHJlbW90ZSByZWZlcmVuY2VzXG4gKi9cbnZhciBSZXNvbHZlciA9IG1vZHVsZS5leHBvcnRzID0gZnVuY3Rpb24gKCkge1xuICB0aGlzLmZhaWxlZFVybHMgPSBbXTtcbiAgdGhpcy5yZXNvbHZlckNhY2hlID0ge307XG4gIHRoaXMucGVuZGluZ1VybHMgPSB7fTtcbn07XG5cblJlc29sdmVyLnByb3RvdHlwZS5wcm9jZXNzQWxsT2YgPSBmdW5jdGlvbihyb290LCBuYW1lLCBkZWZpbml0aW9uLCByZXNvbHV0aW9uVGFibGUsIHVucmVzb2x2ZWRSZWZzLCBzcGVjKSB7XG4gIHZhciBpLCBsb2NhdGlvbiwgcHJvcGVydHk7XG5cbiAgZGVmaW5pdGlvblsneC1yZXNvbHZlZC1mcm9tJ10gPSBbICcjL2RlZmluaXRpb25zLycgKyBuYW1lIF07XG4gIHZhciBhbGxPZiA9IGRlZmluaXRpb24uYWxsT2Y7XG4gIC8vIHRoZSByZWZzIGdvIGZpcnN0XG4gIGFsbE9mLnNvcnQoZnVuY3Rpb24oYSwgYikge1xuICAgIGlmKGEuJHJlZiAmJiBiLiRyZWYpIHsgcmV0dXJuIDA7IH1cbiAgICBlbHNlIGlmKGEuJHJlZikgeyByZXR1cm4gLTE7IH1cbiAgICBlbHNlIHsgcmV0dXJuIDE7IH1cbiAgfSk7XG4gIGZvciAoaSA9IDA7IGkgPCBhbGxPZi5sZW5ndGg7IGkrKykge1xuICAgIHByb3BlcnR5ID0gYWxsT2ZbaV07XG4gICAgbG9jYXRpb24gPSAnL2RlZmluaXRpb25zLycgKyBuYW1lICsgJy9hbGxPZic7XG4gICAgdGhpcy5yZXNvbHZlSW5saW5lKHJvb3QsIHNwZWMsIHByb3BlcnR5LCByZXNvbHV0aW9uVGFibGUsIHVucmVzb2x2ZWRSZWZzLCBsb2NhdGlvbik7XG4gIH1cbn07XG5cblJlc29sdmVyLnByb3RvdHlwZS5yZXNvbHZlID0gZnVuY3Rpb24gKHNwZWMsIGFyZzEsIGFyZzIsIGFyZzMpIHtcbiAgdGhpcy5zcGVjID0gc3BlYztcbiAgdmFyIHJvb3QgPSBhcmcxLCBjYWxsYmFjayA9IGFyZzIsIHNjb3BlID0gYXJnMywgb3B0cyA9IHt9LCBsb2NhdGlvbiwgaTtcbiAgaWYodHlwZW9mIGFyZzEgPT09ICdmdW5jdGlvbicpIHtcbiAgICByb290ID0gbnVsbDtcbiAgICBjYWxsYmFjayA9IGFyZzE7XG4gICAgc2NvcGUgPSBhcmcyO1xuICB9XG4gIHZhciBfcm9vdCA9IHJvb3QsIG1vZGVsTmFtZTtcbiAgdGhpcy5zY29wZSA9IChzY29wZSB8fCB0aGlzKTtcbiAgdGhpcy5pdGVyYXRpb24gPSB0aGlzLml0ZXJhdGlvbiB8fCAwO1xuXG4gIGlmKHRoaXMuc2NvcGUub3B0aW9ucyAmJiB0aGlzLnNjb3BlLm9wdGlvbnMucmVxdWVzdEludGVyY2VwdG9yKXtcbiAgICBvcHRzLnJlcXVlc3RJbnRlcmNlcHRvciA9IHRoaXMuc2NvcGUub3B0aW9ucy5yZXF1ZXN0SW50ZXJjZXB0b3I7XG4gIH1cblxuICBpZih0aGlzLnNjb3BlLm9wdGlvbnMgJiYgdGhpcy5zY29wZS5vcHRpb25zLnJlc3BvbnNlSW50ZXJjZXB0b3Ipe1xuICAgIG9wdHMucmVzcG9uc2VJbnRlcmNlcHRvciA9IHRoaXMuc2NvcGUub3B0aW9ucy5yZXNwb25zZUludGVyY2VwdG9yO1xuICB9XG5cbiAgdmFyIG5hbWUsIHBhdGgsIHByb3BlcnR5LCBwcm9wZXJ0eU5hbWUsIHBhcmFtZXRlciwgZG9uZSwgY291bnRlcjtcbiAgdmFyIHByb2Nlc3NlZENhbGxzID0gMCwgcmVzb2x2ZWRSZWZzID0ge30sIHVucmVzb2x2ZWRSZWZzID0ge307XG4gIHZhciByZXNvbHV0aW9uVGFibGUgPSBbXTsgLy8gc3RvcmUgb2JqZWN0cyBmb3IgZGVyZWZlcmVuY2luZ1xuXG4gIHNwZWMuZGVmaW5pdGlvbnMgPSBzcGVjLmRlZmluaXRpb25zIHx8IHt9O1xuICAvLyBkZWZpbml0aW9uc1xuICBmb3IgKG5hbWUgaW4gc3BlYy5kZWZpbml0aW9ucykge1xuICAgIHZhciBkZWZpbml0aW9uID0gc3BlYy5kZWZpbml0aW9uc1tuYW1lXTtcbiAgICBpZihkZWZpbml0aW9uLiRyZWYpIHtcbiAgICAgIHRoaXMucmVzb2x2ZUlubGluZShyb290LCBzcGVjLCBkZWZpbml0aW9uLCByZXNvbHV0aW9uVGFibGUsIHVucmVzb2x2ZWRSZWZzLCBkZWZpbml0aW9uKTtcbiAgICB9XG4gICAgZWxzZSB7XG4gICAgICBmb3IgKHByb3BlcnR5TmFtZSBpbiBkZWZpbml0aW9uLnByb3BlcnRpZXMpIHtcbiAgICAgICAgcHJvcGVydHkgPSBkZWZpbml0aW9uLnByb3BlcnRpZXNbcHJvcGVydHlOYW1lXTtcbiAgICAgICAgaWYgKF8uaXNBcnJheShwcm9wZXJ0eS5hbGxPZikpIHtcbiAgICAgICAgICB0aGlzLnByb2Nlc3NBbGxPZihyb290LCBuYW1lLCBwcm9wZXJ0eSwgcmVzb2x1dGlvblRhYmxlLCB1bnJlc29sdmVkUmVmcywgc3BlYyk7XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSB7XG4gICAgICAgICAgdGhpcy5yZXNvbHZlVG8ocm9vdCwgcHJvcGVydHksIHJlc29sdXRpb25UYWJsZSwgJy9kZWZpbml0aW9ucycpO1xuICAgICAgICB9XG4gICAgICB9XG5cbiAgICAgIGlmIChkZWZpbml0aW9uLmFsbE9mKSB7XG4gICAgICAgIHRoaXMucHJvY2Vzc0FsbE9mKHJvb3QsIG5hbWUsIGRlZmluaXRpb24sIHJlc29sdXRpb25UYWJsZSwgdW5yZXNvbHZlZFJlZnMsIHNwZWMpO1xuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIC8vIHNoYXJlZCBwYXJhbWV0ZXJzXG4gIHNwZWMucGFyYW1ldGVycyA9IHNwZWMucGFyYW1ldGVycyB8fCB7fTtcbiAgZm9yKG5hbWUgaW4gc3BlYy5wYXJhbWV0ZXJzKSB7XG4gICAgcGFyYW1ldGVyID0gc3BlYy5wYXJhbWV0ZXJzW25hbWVdO1xuICAgIGlmIChwYXJhbWV0ZXIuaW4gPT09ICdib2R5JyAmJiBwYXJhbWV0ZXIuc2NoZW1hKSB7XG4gICAgICBpZihfLmlzQXJyYXkocGFyYW1ldGVyLnNjaGVtYS5hbGxPZikpIHtcbiAgICAgICAgLy8gbW92ZSB0byBhIGRlZmluaXRpb25cbiAgICAgICAgbW9kZWxOYW1lID0gJ2lubGluZV9tb2RlbCc7XG4gICAgICAgIHZhciBfbmFtZSA9IG1vZGVsTmFtZTtcbiAgICAgICAgZG9uZSA9IGZhbHNlOyBjb3VudGVyID0gMDtcbiAgICAgICAgd2hpbGUoIWRvbmUpIHtcbiAgICAgICAgICBpZih0eXBlb2Ygc3BlYy5kZWZpbml0aW9uc1tfbmFtZV0gPT09ICd1bmRlZmluZWQnKSB7XG4gICAgICAgICAgICBkb25lID0gdHJ1ZTtcbiAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgIH1cbiAgICAgICAgICBfbmFtZSA9IG1vZGVsTmFtZSArICdfJyArIGNvdW50ZXI7XG4gICAgICAgICAgY291bnRlciArKztcbiAgICAgICAgfVxuICAgICAgICBzcGVjLmRlZmluaXRpb25zW19uYW1lXSA9IHsgYWxsT2Y6IHBhcmFtZXRlci5zY2hlbWEuYWxsT2YgfTtcbiAgICAgICAgZGVsZXRlIHBhcmFtZXRlci5zY2hlbWEuYWxsT2Y7XG4gICAgICAgIHBhcmFtZXRlci5zY2hlbWEuJHJlZiA9ICcjL2RlZmluaXRpb25zLycgKyBfbmFtZTtcbiAgICAgICAgdGhpcy5wcm9jZXNzQWxsT2Yocm9vdCwgX25hbWUsIHNwZWMuZGVmaW5pdGlvbnNbX25hbWVdLCByZXNvbHV0aW9uVGFibGUsIHVucmVzb2x2ZWRSZWZzLCBzcGVjKTtcbiAgICAgIH1cbiAgICAgIGVsc2Uge1xuICAgICAgICB0aGlzLnJlc29sdmVUbyhyb290LCBwYXJhbWV0ZXIuc2NoZW1hLCByZXNvbHV0aW9uVGFibGUsIGxvY2F0aW9uKTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICBpZiAocGFyYW1ldGVyLiRyZWYpIHtcbiAgICAgIC8vIHBhcmFtZXRlciByZWZlcmVuY2VcbiAgICAgIHRoaXMucmVzb2x2ZUlubGluZShyb290LCBzcGVjLCBwYXJhbWV0ZXIsIHJlc29sdXRpb25UYWJsZSwgdW5yZXNvbHZlZFJlZnMsIHBhcmFtZXRlci4kcmVmKTtcbiAgICB9XG4gIH1cblxuICAvLyBvcGVyYXRpb25zXG4gIGZvciAobmFtZSBpbiBzcGVjLnBhdGhzKSB7XG4gICAgdmFyIG1ldGhvZCwgb3BlcmF0aW9uLCByZXNwb25zZUNvZGU7XG4gICAgcGF0aCA9IHNwZWMucGF0aHNbbmFtZV07XG5cbiAgICBpZih0eXBlb2YgcGF0aCA9PT0gJ29iamVjdCcpIHtcbiAgICAgIGZvciAobWV0aG9kIGluIHBhdGgpIHtcbiAgICAgICAgLy8gb3BlcmF0aW9uIHJlZmVyZW5jZVxuICAgICAgICBpZiAobWV0aG9kID09PSAnJHJlZicpIHtcbiAgICAgICAgICAvLyBsb2NhdGlvbiA9IHBhdGhbbWV0aG9kXTtcbiAgICAgICAgICBsb2NhdGlvbiA9ICcvcGF0aHMnICsgbmFtZTtcbiAgICAgICAgICB0aGlzLnJlc29sdmVJbmxpbmUocm9vdCwgc3BlYywgcGF0aCwgcmVzb2x1dGlvblRhYmxlLCB1bnJlc29sdmVkUmVmcywgbG9jYXRpb24pO1xuICAgICAgICB9XG4gICAgICAgIGVsc2Uge1xuICAgICAgICAgIG9wZXJhdGlvbiA9IHBhdGhbbWV0aG9kXTtcbiAgICAgICAgICB2YXIgc2hhcmVkUGFyYW1ldGVycyA9IHBhdGgucGFyYW1ldGVycyB8fCBbXTtcbiAgICAgICAgICB2YXIgcGFyYW1ldGVycyA9IG9wZXJhdGlvbi5wYXJhbWV0ZXJzIHx8IFtdO1xuXG4gICAgICAgICAgc2hhcmVkUGFyYW1ldGVycy5mb3JFYWNoKGZ1bmN0aW9uKHBhcmFtZXRlcikge1xuICAgICAgICAgICAgcGFyYW1ldGVycy51bnNoaWZ0KHBhcmFtZXRlcik7XG4gICAgICAgICAgfSk7XG5cbiAgICAgICAgICBpZiAobWV0aG9kICE9PSAncGFyYW1ldGVycycgJiYgXy5pc09iamVjdChvcGVyYXRpb24pKSB7XG4gICAgICAgICAgICBvcGVyYXRpb24ucGFyYW1ldGVycyA9IG9wZXJhdGlvbi5wYXJhbWV0ZXJzIHx8IHBhcmFtZXRlcnM7XG4gICAgICAgICAgfVxuXG4gICAgICAgICAgZm9yIChpIGluIHBhcmFtZXRlcnMpIHtcbiAgICAgICAgICAgIHBhcmFtZXRlciA9IHBhcmFtZXRlcnNbaV07XG4gICAgICAgICAgICBsb2NhdGlvbiA9ICcvcGF0aHMnICsgbmFtZSArICcvJyArIG1ldGhvZCArICcvcGFyYW1ldGVycyc7XG5cbiAgICAgICAgICAgIGlmIChwYXJhbWV0ZXIuaW4gPT09ICdib2R5JyAmJiBwYXJhbWV0ZXIuc2NoZW1hKSB7XG4gICAgICAgICAgICAgIGlmIChfLmlzQXJyYXkocGFyYW1ldGVyLnNjaGVtYS5hbGxPZikpIHtcbiAgICAgICAgICAgICAgICAvLyBtb3ZlIHRvIGEgZGVmaW5pdGlvblxuICAgICAgICAgICAgICAgIG1vZGVsTmFtZSA9ICdpbmxpbmVfbW9kZWwnO1xuICAgICAgICAgICAgICAgIG5hbWUgPSBtb2RlbE5hbWU7XG4gICAgICAgICAgICAgICAgZG9uZSA9IGZhbHNlO1xuICAgICAgICAgICAgICAgIGNvdW50ZXIgPSAwO1xuICAgICAgICAgICAgICAgIHdoaWxlICghZG9uZSkge1xuICAgICAgICAgICAgICAgICAgaWYgKHR5cGVvZiBzcGVjLmRlZmluaXRpb25zW25hbWVdID09PSAndW5kZWZpbmVkJykge1xuICAgICAgICAgICAgICAgICAgICBkb25lID0gdHJ1ZTtcbiAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICBuYW1lID0gbW9kZWxOYW1lICsgJ18nICsgY291bnRlcjtcbiAgICAgICAgICAgICAgICAgIGNvdW50ZXIrKztcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgc3BlYy5kZWZpbml0aW9uc1tuYW1lXSA9IHthbGxPZjogcGFyYW1ldGVyLnNjaGVtYS5hbGxPZn07XG4gICAgICAgICAgICAgICAgZGVsZXRlIHBhcmFtZXRlci5zY2hlbWEuYWxsT2Y7XG4gICAgICAgICAgICAgICAgcGFyYW1ldGVyLnNjaGVtYS4kcmVmID0gJyMvZGVmaW5pdGlvbnMvJyArIG5hbWU7XG4gICAgICAgICAgICAgICAgdGhpcy5wcm9jZXNzQWxsT2Yocm9vdCwgbmFtZSwgc3BlYy5kZWZpbml0aW9uc1tuYW1lXSwgcmVzb2x1dGlvblRhYmxlLCB1bnJlc29sdmVkUmVmcywgc3BlYyk7XG4gICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICAgICAgdGhpcy5yZXNvbHZlVG8ocm9vdCwgcGFyYW1ldGVyLnNjaGVtYSwgcmVzb2x1dGlvblRhYmxlLCBsb2NhdGlvbik7XG4gICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgaWYgKHBhcmFtZXRlci4kcmVmKSB7XG4gICAgICAgICAgICAgIC8vIHBhcmFtZXRlciByZWZlcmVuY2VcbiAgICAgICAgICAgICAgdGhpcy5yZXNvbHZlSW5saW5lKHJvb3QsIHNwZWMsIHBhcmFtZXRlciwgcmVzb2x1dGlvblRhYmxlLCB1bnJlc29sdmVkUmVmcywgcGFyYW1ldGVyLiRyZWYpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgIH1cblxuICAgICAgICAgIGZvciAocmVzcG9uc2VDb2RlIGluIG9wZXJhdGlvbi5yZXNwb25zZXMpIHtcbiAgICAgICAgICAgIHZhciByZXNwb25zZSA9IG9wZXJhdGlvbi5yZXNwb25zZXNbcmVzcG9uc2VDb2RlXTtcbiAgICAgICAgICAgIGxvY2F0aW9uID0gJy9wYXRocycgKyBuYW1lICsgJy8nICsgbWV0aG9kICsgJy9yZXNwb25zZXMvJyArIHJlc3BvbnNlQ29kZTtcblxuICAgICAgICAgICAgaWYgKF8uaXNPYmplY3QocmVzcG9uc2UpKSB7XG4gICAgICAgICAgICAgIGlmIChyZXNwb25zZS4kcmVmKSB7XG4gICAgICAgICAgICAgICAgLy8gcmVzcG9uc2UgcmVmZXJlbmNlXG4gICAgICAgICAgICAgICAgdGhpcy5yZXNvbHZlSW5saW5lKHJvb3QsIHNwZWMsIHJlc3BvbnNlLCByZXNvbHV0aW9uVGFibGUsIHVucmVzb2x2ZWRSZWZzLCBsb2NhdGlvbik7XG4gICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgaWYgKHJlc3BvbnNlLnNjaGVtYSkge1xuICAgICAgICAgICAgICAgIHZhciByZXNwb25zZU9iaiA9IHJlc3BvbnNlO1xuICAgICAgICAgICAgICAgIGlmIChfLmlzQXJyYXkocmVzcG9uc2VPYmouc2NoZW1hLmFsbE9mKSkge1xuICAgICAgICAgICAgICAgICAgLy8gbW92ZSB0byBhIGRlZmluaXRpb25cbiAgICAgICAgICAgICAgICAgIG1vZGVsTmFtZSA9ICdpbmxpbmVfbW9kZWwnO1xuICAgICAgICAgICAgICAgICAgbmFtZSA9IG1vZGVsTmFtZTtcbiAgICAgICAgICAgICAgICAgIGRvbmUgPSBmYWxzZTtcbiAgICAgICAgICAgICAgICAgIGNvdW50ZXIgPSAwO1xuICAgICAgICAgICAgICAgICAgd2hpbGUgKCFkb25lKSB7XG4gICAgICAgICAgICAgICAgICAgIGlmICh0eXBlb2Ygc3BlYy5kZWZpbml0aW9uc1tuYW1lXSA9PT0gJ3VuZGVmaW5lZCcpIHtcbiAgICAgICAgICAgICAgICAgICAgICBkb25lID0gdHJ1ZTtcbiAgICAgICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICBuYW1lID0gbW9kZWxOYW1lICsgJ18nICsgY291bnRlcjtcbiAgICAgICAgICAgICAgICAgICAgY291bnRlcisrO1xuICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgc3BlYy5kZWZpbml0aW9uc1tuYW1lXSA9IHthbGxPZjogcmVzcG9uc2VPYmouc2NoZW1hLmFsbE9mfTtcbiAgICAgICAgICAgICAgICAgIGRlbGV0ZSByZXNwb25zZU9iai5zY2hlbWEuYWxsT2Y7XG4gICAgICAgICAgICAgICAgICBkZWxldGUgcmVzcG9uc2VPYmouc2NoZW1hLnR5cGU7XG4gICAgICAgICAgICAgICAgICByZXNwb25zZU9iai5zY2hlbWEuJHJlZiA9ICcjL2RlZmluaXRpb25zLycgKyBuYW1lO1xuICAgICAgICAgICAgICAgICAgdGhpcy5wcm9jZXNzQWxsT2Yocm9vdCwgbmFtZSwgc3BlYy5kZWZpbml0aW9uc1tuYW1lXSwgcmVzb2x1dGlvblRhYmxlLCB1bnJlc29sdmVkUmVmcywgc3BlYyk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGVsc2UgaWYgKCdhcnJheScgPT09IHJlc3BvbnNlT2JqLnNjaGVtYS50eXBlKSB7XG4gICAgICAgICAgICAgICAgICBpZiAocmVzcG9uc2VPYmouc2NoZW1hLml0ZW1zICYmIHJlc3BvbnNlT2JqLnNjaGVtYS5pdGVtcy4kcmVmKSB7XG4gICAgICAgICAgICAgICAgICAgIC8vIHJlc3BvbnNlIHJlZmVyZW5jZVxuICAgICAgICAgICAgICAgICAgICB0aGlzLnJlc29sdmVJbmxpbmUocm9vdCwgc3BlYywgcmVzcG9uc2VPYmouc2NoZW1hLml0ZW1zLCByZXNvbHV0aW9uVGFibGUsIHVucmVzb2x2ZWRSZWZzLCBsb2NhdGlvbik7XG4gICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgICAgICAgdGhpcy5yZXNvbHZlVG8ocm9vdCwgcmVzcG9uc2Uuc2NoZW1hLCByZXNvbHV0aW9uVGFibGUsIGxvY2F0aW9uKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICAgIC8vIGNsZWFyIHRoZW0gb3V0IHRvIGF2b2lkIG11bHRpcGxlIHJlc29sdXRpb25zXG4gICAgICBwYXRoLnBhcmFtZXRlcnMgPSBbXTtcbiAgICB9XG4gIH1cblxuICB2YXIgZXhwZWN0ZWRDYWxscyA9IDAsIHRvUmVzb2x2ZSA9IFtdO1xuICAvLyBpZiB0aGUgcm9vdCBpcyBzYW1lIGFzIG9ialtpXS5yb290IHdlIGNhbiByZXNvbHZlIGxvY2FsbHlcbiAgdmFyIGFsbCA9IHJlc29sdXRpb25UYWJsZTtcblxuICB2YXIgcGFydHM7XG4gIGZvcihpID0gMDsgaSA8IGFsbC5sZW5ndGg7IGkrKykge1xuICAgIHZhciBhID0gYWxsW2ldO1xuICAgIGlmKHJvb3QgPT09IGEucm9vdCkge1xuICAgICAgaWYoYS5yZXNvbHZlQXMgPT09ICdyZWYnKSB7XG4gICAgICAgIC8vIHJlc29sdmUgYW55IHBhdGggd2Fsa2luZ1xuICAgICAgICB2YXIgam9pbmVkID0gKChhLnJvb3QgfHwgJycpICsgJy8nICsgYS5rZXkpLnNwbGl0KCcvJyk7XG4gICAgICAgIHZhciBub3JtYWxpemVkID0gW107XG4gICAgICAgIHZhciB1cmwgPSAnJztcbiAgICAgICAgdmFyIGs7XG5cbiAgICAgICAgaWYoYS5rZXkuaW5kZXhPZignLi4vJykgPj0gMCkge1xuICAgICAgICAgIGZvcih2YXIgaiA9IDA7IGogPCBqb2luZWQubGVuZ3RoOyBqKyspIHtcbiAgICAgICAgICAgIGlmKGpvaW5lZFtqXSA9PT0gJy4uJykge1xuICAgICAgICAgICAgICBub3JtYWxpemVkID0gbm9ybWFsaXplZC5zbGljZSgwLCBub3JtYWxpemVkLmxlbmd0aC0xKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgICBub3JtYWxpemVkLnB1c2goam9pbmVkW2pdKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9XG4gICAgICAgICAgZm9yKGsgPSAwOyBrIDwgbm9ybWFsaXplZC5sZW5ndGg7IGsgKyspIHtcbiAgICAgICAgICAgIGlmKGsgPiAwKSB7XG4gICAgICAgICAgICAgIHVybCArPSAnLyc7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICB1cmwgKz0gbm9ybWFsaXplZFtrXTtcbiAgICAgICAgICB9XG4gICAgICAgICAgLy8gd2Ugbm93IGhhdmUgdG8gcmVtb3RlIHJlc29sdmUgdGhpcyBiZWNhdXNlIHRoZSBwYXRoIGhhcyBjaGFuZ2VkXG4gICAgICAgICAgYS5yb290ID0gdXJsO1xuICAgICAgICAgIHRvUmVzb2x2ZS5wdXNoKGEpO1xuICAgICAgICB9XG4gICAgICAgIGVsc2Uge1xuICAgICAgICAgIHBhcnRzID0gYS5rZXkuc3BsaXQoJyMnKTtcbiAgICAgICAgICBpZihwYXJ0cy5sZW5ndGggPT09IDIpIHtcbiAgICAgICAgICAgIGlmKHBhcnRzWzBdLmluZGV4T2YoJ2h0dHA6JykgPT09IDAgfHwgcGFydHNbMF0uaW5kZXhPZignaHR0cHM6JykgPT09IDApIHtcbiAgICAgICAgICAgICAgYS5yb290ID0gcGFydHNbMF07XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBsb2NhdGlvbiA9IHBhcnRzWzFdLnNwbGl0KCcvJyk7XG4gICAgICAgICAgICB2YXIgcjtcbiAgICAgICAgICAgIHZhciBzID0gc3BlYztcbiAgICAgICAgICAgIGZvcihrID0gMDsgayA8IGxvY2F0aW9uLmxlbmd0aDsgaysrKSB7XG4gICAgICAgICAgICAgIHZhciBwYXJ0ID0gbG9jYXRpb25ba107XG4gICAgICAgICAgICAgIGlmKHBhcnQgIT09ICcnKSB7XG4gICAgICAgICAgICAgICAgcyA9IHNbcGFydF07XG4gICAgICAgICAgICAgICAgaWYodHlwZW9mIHMgIT09ICd1bmRlZmluZWQnKSB7XG4gICAgICAgICAgICAgICAgICByID0gcztcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICAgICAgICByID0gbnVsbDtcbiAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICAgICAgaWYociA9PT0gbnVsbCkge1xuICAgICAgICAgICAgICAvLyBtdXN0IHJlc29sdmUgdGhpcyB0b29cbiAgICAgICAgICAgICAgdG9SZXNvbHZlLnB1c2goYSk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICB9XG4gICAgICBlbHNlIHtcbiAgICAgICAgaWYgKGEucmVzb2x2ZUFzID09PSAnaW5saW5lJykge1xuICAgICAgICAgIGlmKGEua2V5ICYmIGEua2V5LmluZGV4T2YoJyMnKSA9PT0gLTEgJiYgYS5rZXkuY2hhckF0KDApICE9PSAnLycpIHtcbiAgICAgICAgICAgIC8vIGhhbmRsZSByZWxhdGl2ZSBzY2hlbWFcbiAgICAgICAgICAgIHBhcnRzID0gYS5yb290LnNwbGl0KCcvJyk7XG4gICAgICAgICAgICBsb2NhdGlvbiA9ICcnO1xuICAgICAgICAgICAgZm9yKGkgPSAwOyBpIDwgcGFydHMubGVuZ3RoIC0gMTsgaSsrKSB7XG4gICAgICAgICAgICAgIGxvY2F0aW9uICs9IHBhcnRzW2ldICsgJy8nO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgbG9jYXRpb24gKz0gYS5rZXk7XG4gICAgICAgICAgICBhLnJvb3QgPSBsb2NhdGlvbjtcbiAgICAgICAgICAgIGEubG9jYXRpb24gPSAnJztcbiAgICAgICAgICB9XG4gICAgICAgICAgdG9SZXNvbHZlLnB1c2goYSk7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG4gICAgZWxzZSB7XG4gICAgICB0b1Jlc29sdmUucHVzaChhKTtcbiAgICB9XG4gIH1cbiAgZXhwZWN0ZWRDYWxscyA9IHRvUmVzb2x2ZS5sZW5ndGg7XG5cbiAgLy8gcmVzb2x2ZSBhbnl0aGluZyB0aGF0IGlzIGxvY2FsXG5cbiAgdmFyIGxvY2sgPSB7fTtcbiAgZm9yKHZhciBpaSA9IDA7IGlpIDwgdG9SZXNvbHZlLmxlbmd0aDsgaWkrKykge1xuICAgIChmdW5jdGlvbihpdGVtLCBzcGVjLCBzZWxmLCBsb2NrLCBpaSkge1xuICAgICAgaWYoIWl0ZW0ucm9vdCB8fCBpdGVtLnJvb3QgPT09IHJvb3QpIHtcbiAgICAgICAgLy8gbG9jYWwgcmVzb2x2ZVxuICAgICAgICBzZWxmLnJlc29sdmVJdGVtKHNwZWMsIF9yb290LCByZXNvbHV0aW9uVGFibGUsIHJlc29sdmVkUmVmcywgdW5yZXNvbHZlZFJlZnMsIGl0ZW0pO1xuICAgICAgICBwcm9jZXNzZWRDYWxscyArPSAxO1xuXG4gICAgICAgIGlmKHByb2Nlc3NlZENhbGxzID09PSBleHBlY3RlZENhbGxzKSB7XG4gICAgICAgICAgc2VsZi5maW5pc2goc3BlYywgcm9vdCwgcmVzb2x1dGlvblRhYmxlLCByZXNvbHZlZFJlZnMsIHVucmVzb2x2ZWRSZWZzLCBjYWxsYmFjaywgdHJ1ZSk7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICAgIGVsc2UgaWYoc2VsZi5mYWlsZWRVcmxzLmluZGV4T2YoaXRlbS5yb290KSA9PT0gLTEpIHtcbiAgICAgICAgdmFyIG9iaiA9IHtcbiAgICAgICAgICB1c2VKUXVlcnk6IGZhbHNlLCAgLy8gVE9ET1xuICAgICAgICAgIHVybDogaXRlbS5yb290LFxuICAgICAgICAgIG1ldGhvZDogJ2dldCcsXG4gICAgICAgICAgaGVhZGVyczoge1xuICAgICAgICAgICAgYWNjZXB0OiBzZWxmLnNjb3BlLnN3YWdnZXJSZXF1ZXN0SGVhZGVycyB8fCAnYXBwbGljYXRpb24vanNvbidcbiAgICAgICAgICB9LFxuICAgICAgICAgIG9uOiB7XG4gICAgICAgICAgICBlcnJvcjogZnVuY3Rpb24gKGVycm9yKSB7XG4gICAgICAgICAgICAgIHByb2Nlc3NlZENhbGxzICs9IDE7XG4gICAgICAgICAgICAgIGNvbnNvbGUubG9nKCdmYWlsZWQgdXJsOiAnICsgb2JqLnVybCk7XG4gICAgICAgICAgICAgIHNlbGYuZmFpbGVkVXJscy5wdXNoKG9iai51cmwpO1xuICAgICAgICAgICAgICBpZiAobG9jaykge1xuICAgICAgICAgICAgICAgIGRlbGV0ZSBsb2NrW2l0ZW0ucm9vdF07XG4gICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgdW5yZXNvbHZlZFJlZnNbaXRlbS5rZXldID0ge1xuICAgICAgICAgICAgICAgIHJvb3Q6IGl0ZW0ucm9vdCxcbiAgICAgICAgICAgICAgICBsb2NhdGlvbjogaXRlbS5sb2NhdGlvblxuICAgICAgICAgICAgICB9O1xuXG4gICAgICAgICAgICAgIGlmIChwcm9jZXNzZWRDYWxscyA9PT0gZXhwZWN0ZWRDYWxscykge1xuICAgICAgICAgICAgICAgIHNlbGYuZmluaXNoKHNwZWMsIF9yb290LCByZXNvbHV0aW9uVGFibGUsIHJlc29sdmVkUmVmcywgdW5yZXNvbHZlZFJlZnMsIGNhbGxiYWNrKTtcbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSwgIC8vIGpzaGludCBpZ25vcmU6bGluZVxuICAgICAgICAgICAgcmVzcG9uc2U6IGZ1bmN0aW9uIChyZXNwb25zZSkge1xuICAgICAgICAgICAgICB2YXIgc3dhZ2dlciA9IHJlc3BvbnNlLm9iajtcbiAgICAgICAgICAgICAgaWYgKGxvY2spIHtcbiAgICAgICAgICAgICAgICBkZWxldGUgbG9ja1tpdGVtLnJvb3RdO1xuICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgIGlmIChzZWxmLnJlc29sdmVyQ2FjaGUpIHtcbiAgICAgICAgICAgICAgICBzZWxmLnJlc29sdmVyQ2FjaGVbaXRlbS5yb290XSA9IHN3YWdnZXI7XG4gICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgc2VsZi5yZXNvbHZlSXRlbShzd2FnZ2VyLCBpdGVtLnJvb3QsIHJlc29sdXRpb25UYWJsZSwgcmVzb2x2ZWRSZWZzLCB1bnJlc29sdmVkUmVmcywgaXRlbSk7XG4gICAgICAgICAgICAgIHByb2Nlc3NlZENhbGxzICs9IDE7XG5cbiAgICAgICAgICAgICAgaWYgKHByb2Nlc3NlZENhbGxzID09PSBleHBlY3RlZENhbGxzKSB7XG4gICAgICAgICAgICAgICAgc2VsZi5maW5pc2goc3BlYywgX3Jvb3QsIHJlc29sdXRpb25UYWJsZSwgcmVzb2x2ZWRSZWZzLCB1bnJlc29sdmVkUmVmcywgY2FsbGJhY2spO1xuICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfSAvLyBqc2hpbnQgaWdub3JlOmxpbmVcbiAgICAgICAgfTtcblxuICAgICAgICAvLyBhcHBseSB0aW1lb3V0IG9ubHkgd2hlbiBzcGVjaWZpZWRcbiAgICAgICAgaWYgKHNjb3BlICYmIHNjb3BlLmZldGNoU3BlY1RpbWVvdXQpIHtcbiAgICAgICAgICBvYmoudGltZW91dCA9IHNjb3BlLmZldGNoU3BlY1RpbWVvdXQ7XG4gICAgICAgIH1cblxuICAgICAgICBpZiAoc2NvcGUgJiYgc2NvcGUuY2xpZW50QXV0aG9yaXphdGlvbnMpIHtcbiAgICAgICAgICBzY29wZS5jbGllbnRBdXRob3JpemF0aW9ucy5hcHBseShvYmopO1xuICAgICAgICB9XG5cbiAgICAgICAgKGZ1bmN0aW9uIHdhaXRGb3JVbmxvY2soKSB7XG4gICAgICAgICAgc2V0VGltZW91dChmdW5jdGlvbigpIHtcbiAgICAgICAgICAgIGlmIChsb2NrW29iai51cmxdKSB7XG4gICAgICAgICAgICAgIHdhaXRGb3JVbmxvY2soKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgICB2YXIgY2FjaGVkID0gc2VsZi5yZXNvbHZlckNhY2hlW29iai51cmxdO1xuICAgICAgICAgICAgICBpZiAoXy5pc09iamVjdChjYWNoZWQpKSB7XG4gICAgICAgICAgICAgICAgb2JqLm9uLnJlc3BvbnNlKHtvYmo6IGNhY2hlZH0pO1xuICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgICAgIGxvY2tbb2JqLnVybF0gPSB0cnVlO1xuICAgICAgICAgICAgICAgIG5ldyBTd2FnZ2VySHR0cCgpLmV4ZWN1dGUob2JqLCBvcHRzKTtcbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICAgIH0sIDApO1xuICAgICAgICB9KSgpO1xuICAgICAgfVxuXG4gICAgICBlbHNlIHtcbiAgICAgICAgcHJvY2Vzc2VkQ2FsbHMgKz0gMTtcbiAgICAgICAgdW5yZXNvbHZlZFJlZnNbaXRlbS5rZXldID0ge1xuICAgICAgICAgIHJvb3Q6IGl0ZW0ucm9vdCxcbiAgICAgICAgICBsb2NhdGlvbjogaXRlbS5sb2NhdGlvblxuICAgICAgICB9O1xuICAgICAgICBpZiAocHJvY2Vzc2VkQ2FsbHMgPT09IGV4cGVjdGVkQ2FsbHMpIHtcbiAgICAgICAgICBzZWxmLmZpbmlzaChzcGVjLCBfcm9vdCwgcmVzb2x1dGlvblRhYmxlLCByZXNvbHZlZFJlZnMsIHVucmVzb2x2ZWRSZWZzLCBjYWxsYmFjayk7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9KHRvUmVzb2x2ZVtpaV0sIHNwZWMsIHRoaXMsIGxvY2ssIGlpKSk7XG4gIH1cblxuICBpZiAoT2JqZWN0LmtleXModG9SZXNvbHZlKS5sZW5ndGggPT09IDApIHtcbiAgICB0aGlzLmZpbmlzaChzcGVjLCBfcm9vdCwgcmVzb2x1dGlvblRhYmxlLCByZXNvbHZlZFJlZnMsIHVucmVzb2x2ZWRSZWZzLCBjYWxsYmFjayk7XG4gIH1cbn07XG5cblJlc29sdmVyLnByb3RvdHlwZS5yZXNvbHZlSXRlbSA9IGZ1bmN0aW9uKHNwZWMsIHJvb3QsIHJlc29sdXRpb25UYWJsZSwgcmVzb2x2ZWRSZWZzLCB1bnJlc29sdmVkUmVmcywgaXRlbSkge1xuICB2YXIgcGF0aCA9IGl0ZW0ubG9jYXRpb247XG4gIHZhciBsb2NhdGlvbiA9IHNwZWMsIHBhcnRzID0gcGF0aC5zcGxpdCgnLycpO1xuICBpZihwYXRoICE9PSAnJykge1xuICAgIGZvciAodmFyIGogPSAwOyBqIDwgcGFydHMubGVuZ3RoOyBqKyspIHtcbiAgICAgIHZhciBzZWdtZW50ID0gcGFydHNbal07XG4gICAgICBpZiAoc2VnbWVudC5pbmRleE9mKCd+MScpICE9PSAtMSkge1xuICAgICAgICBzZWdtZW50ID0gcGFydHNbal0ucmVwbGFjZSgvfjAvZywgJ34nKS5yZXBsYWNlKC9+MS9nLCAnLycpO1xuICAgICAgICBpZiAoc2VnbWVudC5jaGFyQXQoMCkgIT09ICcvJykge1xuICAgICAgICAgIHNlZ21lbnQgPSAnLycgKyBzZWdtZW50O1xuICAgICAgICB9XG4gICAgICB9XG4gICAgICBpZiAodHlwZW9mIGxvY2F0aW9uID09PSAndW5kZWZpbmVkJyB8fCBsb2NhdGlvbiA9PT0gbnVsbCkge1xuICAgICAgICBicmVhaztcbiAgICAgIH1cbiAgICAgIGlmIChzZWdtZW50ID09PSAnJyAmJiBqID09PSAocGFydHMubGVuZ3RoIC0gMSkgJiYgcGFydHMubGVuZ3RoID4gMSkge1xuICAgICAgICBsb2NhdGlvbiA9IG51bGw7XG4gICAgICAgIGJyZWFrO1xuICAgICAgfVxuICAgICAgaWYgKHNlZ21lbnQubGVuZ3RoID4gMCkge1xuICAgICAgICBsb2NhdGlvbiA9IGxvY2F0aW9uW3NlZ21lbnRdO1xuICAgICAgfVxuICAgIH1cbiAgfVxuICB2YXIgcmVzb2x2ZWQgPSBpdGVtLmtleTtcbiAgcGFydHMgPSBpdGVtLmtleS5zcGxpdCgnLycpO1xuICB2YXIgcmVzb2x2ZWROYW1lID0gcGFydHNbcGFydHMubGVuZ3RoLTFdO1xuXG4gIGlmKHJlc29sdmVkTmFtZS5pbmRleE9mKCcjJykgPj0gMCkge1xuICAgIHJlc29sdmVkTmFtZSA9IHJlc29sdmVkTmFtZS5zcGxpdCgnIycpWzFdO1xuICB9XG5cbiAgaWYgKGxvY2F0aW9uICE9PSBudWxsICYmIHR5cGVvZiBsb2NhdGlvbiAhPT0gJ3VuZGVmaW5lZCcpIHtcbiAgICByZXNvbHZlZFJlZnNbcmVzb2x2ZWRdID0ge1xuICAgICAgbmFtZTogcmVzb2x2ZWROYW1lLFxuICAgICAgb2JqOiBsb2NhdGlvbixcbiAgICAgIGtleTogaXRlbS5rZXksXG4gICAgICByb290OiBpdGVtLnJvb3RcbiAgICB9O1xuICB9IGVsc2Uge1xuICAgIHVucmVzb2x2ZWRSZWZzW3Jlc29sdmVkXSA9IHtcbiAgICAgIHJvb3Q6IGl0ZW0ucm9vdCxcbiAgICAgIGxvY2F0aW9uOiBpdGVtLmxvY2F0aW9uXG4gICAgfTtcbiAgfVxufTtcblxuUmVzb2x2ZXIucHJvdG90eXBlLmZpbmlzaCA9IGZ1bmN0aW9uIChzcGVjLCByb290LCByZXNvbHV0aW9uVGFibGUsIHJlc29sdmVkUmVmcywgdW5yZXNvbHZlZFJlZnMsIGNhbGxiYWNrLCBsb2NhbFJlc29sdmUpIHtcbiAgLy8gd2FsayByZXNvbHV0aW9uIHRhYmxlIGFuZCByZXBsYWNlIHdpdGggcmVzb2x2ZWQgcmVmc1xuICB2YXIgcmVmLCBhYnM7XG4gIGZvciAocmVmIGluIHJlc29sdXRpb25UYWJsZSkge1xuICAgIHZhciBpdGVtID0gcmVzb2x1dGlvblRhYmxlW3JlZl07XG5cbiAgICB2YXIga2V5ID0gaXRlbS5rZXk7XG4gICAgdmFyIHJlc29sdmVkVG8gPSByZXNvbHZlZFJlZnNba2V5XTtcbiAgICBpZiAocmVzb2x2ZWRUbykge1xuICAgICAgc3BlYy5kZWZpbml0aW9ucyA9IHNwZWMuZGVmaW5pdGlvbnMgfHwge307XG4gICAgICBpZiAoaXRlbS5yZXNvbHZlQXMgPT09ICdyZWYnKSB7XG4gICAgICAgIGlmIChsb2NhbFJlc29sdmUgIT09IHRydWUpIHtcbiAgICAgICAgICAvLyBkb24ndCByZXRhaW4gcm9vdCBmb3IgbG9jYWwgZGVmaW5pdGlvbnNcbiAgICAgICAgICBmb3IgKGtleSBpbiByZXNvbHZlZFRvLm9iaikge1xuICAgICAgICAgICAgYWJzID0gdGhpcy5yZXRhaW5Sb290KGtleSwgcmVzb2x2ZWRUby5vYmpba2V5XSwgaXRlbS5yb290KTtcbiAgICAgICAgICAgIHJlc29sdmVkVG8ub2JqW2tleV0gPSBhYnM7XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIHNwZWMuZGVmaW5pdGlvbnNbcmVzb2x2ZWRUby5uYW1lXSA9IHJlc29sdmVkVG8ub2JqO1xuICAgICAgICBpdGVtLm9iai4kcmVmID0gJyMvZGVmaW5pdGlvbnMvJyArIHJlc29sdmVkVG8ubmFtZTtcbiAgICAgIH0gZWxzZSBpZiAoaXRlbS5yZXNvbHZlQXMgPT09ICdpbmxpbmUnKSB7XG4gICAgICAgIHZhciB0YXJnZXRPYmogPSBpdGVtLm9iajtcbiAgICAgICAgdGFyZ2V0T2JqWyd4LXJlc29sdmVkLWZyb20nXSA9IFsgaXRlbS5rZXkgXTtcbiAgICAgICAgZGVsZXRlIHRhcmdldE9iai4kcmVmO1xuXG4gICAgICAgIGZvciAoa2V5IGluIHJlc29sdmVkVG8ub2JqKSB7XG4gICAgICAgICAgYWJzID0gcmVzb2x2ZWRUby5vYmpba2V5XTtcblxuICAgICAgICAgIGlmIChsb2NhbFJlc29sdmUgIT09IHRydWUpIHtcbiAgICAgICAgICAgIC8vIGRvbid0IHJldGFpbiByb290IGZvciBsb2NhbCBkZWZpbml0aW9uc1xuICAgICAgICAgICAgYWJzID0gdGhpcy5yZXRhaW5Sb290KGtleSwgcmVzb2x2ZWRUby5vYmpba2V5XSwgaXRlbS5yb290KTtcbiAgICAgICAgICB9XG4gICAgICAgICAgdGFyZ2V0T2JqW2tleV0gPSBhYnM7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG4gIH1cbiAgdmFyIGV4aXN0aW5nVW5yZXNvbHZlZCA9IHRoaXMuY291bnRVbnJlc29sdmVkUmVmcyhzcGVjKTtcblxuICBpZihleGlzdGluZ1VucmVzb2x2ZWQgPT09IDAgfHwgdGhpcy5pdGVyYXRpb24gPiA1KSB7XG4gICAgdGhpcy5yZXNvbHZlQWxsT2Yoc3BlYy5kZWZpbml0aW9ucyk7XG4gICAgdGhpcy5yZXNvbHZlckNhY2hlID0gbnVsbDtcbiAgICBjYWxsYmFjay5jYWxsKHRoaXMuc2NvcGUsIHNwZWMsIHVucmVzb2x2ZWRSZWZzKTtcbiAgfVxuICBlbHNlIHtcbiAgICB0aGlzLml0ZXJhdGlvbiArPSAxO1xuICAgIHRoaXMucmVzb2x2ZShzcGVjLCByb290LCBjYWxsYmFjaywgdGhpcy5zY29wZSk7XG4gIH1cbn07XG5cblJlc29sdmVyLnByb3RvdHlwZS5jb3VudFVucmVzb2x2ZWRSZWZzID0gZnVuY3Rpb24oc3BlYykge1xuICB2YXIgaTtcbiAgdmFyIHJlZnMgPSB0aGlzLmdldFJlZnMoc3BlYyk7XG4gIHZhciBrZXlzID0gW107XG4gIHZhciB1bnJlc29sdmVkS2V5cyA9IFtdO1xuICBmb3IoaSBpbiByZWZzKSB7XG4gICAgaWYoaS5pbmRleE9mKCcjJykgPT09IDApIHtcbiAgICAgIGtleXMucHVzaChpLnN1YnN0cmluZygxKSk7XG4gICAgfVxuICAgIGVsc2Uge1xuICAgICAgdW5yZXNvbHZlZEtleXMucHVzaChpKTtcbiAgICB9XG4gIH1cblxuICAvLyB2ZXJpZnkgcG9zc2libGUga2V5c1xuICBmb3IgKGkgPSAwOyBpIDwga2V5cy5sZW5ndGg7IGkrKykge1xuICAgIHZhciBwYXJ0ID0ga2V5c1tpXTtcbiAgICB2YXIgcGFydHMgPSBwYXJ0LnNwbGl0KCcvJyk7XG4gICAgdmFyIG9iaiA9IHNwZWM7XG5cbiAgICBmb3IgKHZhciBrID0gMDsgayA8IHBhcnRzLmxlbmd0aDsgaysrKSB7XG4gICAgICB2YXIga2V5ID0gcGFydHNba107XG4gICAgICBpZihrZXkgIT09ICcnKSB7XG4gICAgICAgIG9iaiA9IG9ialtrZXldO1xuICAgICAgICBpZih0eXBlb2Ygb2JqID09PSAndW5kZWZpbmVkJykge1xuICAgICAgICAgIHVucmVzb2x2ZWRLZXlzLnB1c2gocGFydCk7XG4gICAgICAgICAgYnJlYWs7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG4gIH1cbiAgcmV0dXJuIHVucmVzb2x2ZWRLZXlzLmxlbmd0aDtcbn07XG5cblJlc29sdmVyLnByb3RvdHlwZS5nZXRSZWZzID0gZnVuY3Rpb24oc3BlYywgb2JqKSB7XG4gIG9iaiA9IG9iaiB8fCBzcGVjO1xuICB2YXIgb3V0cHV0ID0ge307XG4gIGZvcih2YXIga2V5IGluIG9iaikge1xuICAgIGlmICghb2JqLmhhc093blByb3BlcnR5KGtleSkpIHtcbiAgICAgIGNvbnRpbnVlO1xuICAgIH1cbiAgICB2YXIgaXRlbSA9IG9ialtrZXldO1xuICAgIGlmKGtleSA9PT0gJyRyZWYnICYmIHR5cGVvZiBpdGVtID09PSAnc3RyaW5nJykge1xuICAgICAgb3V0cHV0W2l0ZW1dID0gbnVsbDtcbiAgICB9XG4gICAgZWxzZSBpZihfLmlzT2JqZWN0KGl0ZW0pKSB7XG4gICAgICB2YXIgbyA9IHRoaXMuZ2V0UmVmcyhpdGVtKTtcbiAgICAgIGZvcih2YXIgayBpbiBvKSB7XG4gICAgICAgIG91dHB1dFtrXSA9IG51bGw7XG4gICAgICB9XG4gICAgfVxuICB9XG4gIHJldHVybiBvdXRwdXQ7XG59O1xuXG5mdW5jdGlvbiBzcGxpdFVybCh1cmwpIHtcbiAgdmFyIHJlc3VsdCA9IHt9O1xuICB2YXIgcHJvdG8gPSAvW2Etel0rOlxcL1xcLy9pLmV4ZWModXJsKTtcbiAgaWYgKHByb3RvKSB7XG4gICAgcmVzdWx0LnByb3RvID0gcHJvdG9bMF0uc2xpY2UoMCwgLTMpO1xuICAgIHVybCA9IHVybC5zbGljZShyZXN1bHQucHJvdG8ubGVuZ3RoICsgMSk7XG4gIH1cbiAgaWYgKHVybC5zbGljZSgwLCAyKSA9PT0gJy8vJykge1xuICAgIHJlc3VsdC5kb21haW4gPSB1cmwuc2xpY2UoMikuc3BsaXQoJy8nKVswXTtcbiAgICB1cmwgPSB1cmwuc2xpY2UoMiArIHJlc3VsdC5kb21haW4ubGVuZ3RoKTtcbiAgfVxuICB2YXIgcCA9IHVybC5zcGxpdCgnIycpO1xuICBpZiAocFswXS5sZW5ndGgpIHtcbiAgICByZXN1bHQucGF0aCA9IHBbMF07XG4gIH1cbiAgaWYgKHAubGVuZ3RoID4gMSkge1xuICAgIHJlc3VsdC5mcmFnbWVudCA9IHAuc2xpY2UoMSkuam9pbignIycpO1xuICB9XG4gIHJldHVybiByZXN1bHQ7XG59XG5cbmZ1bmN0aW9uIHVuc3BsaXRVcmwodXJsKSB7XG4gIHZhciByZXN1bHQgPSB1cmwucGF0aDtcbiAgaWYgKHJlc3VsdCA9PT0gdW5kZWZpbmVkKSB7XG4gICAgcmVzdWx0ID0gJyc7XG4gIH1cbiAgaWYgKHVybC5mcmFnbWVudCAhPT0gdW5kZWZpbmVkKSB7XG4gICAgcmVzdWx0ICs9ICcjJyArIHVybC5mcmFnbWVudDtcbiAgfVxuICBpZiAodXJsLmRvbWFpbiAhPT0gdW5kZWZpbmVkKSB7XG4gICAgaWYgKHJlc3VsdC5zbGljZSgwLCAxKSA9PT0gJy8nKSB7XG4gICAgICByZXN1bHQgPSByZXN1bHQuc2xpY2UoMSk7XG4gICAgfVxuICAgIHJlc3VsdCA9ICcvLycgKyB1cmwuZG9tYWluICsgJy8nICsgcmVzdWx0O1xuICAgIGlmICh1cmwucHJvdG8gIT09IHVuZGVmaW5lZCkge1xuICAgICAgcmVzdWx0ID0gdXJsLnByb3RvICsgJzonICsgcmVzdWx0O1xuICAgIH1cbiAgfVxuICByZXR1cm4gcmVzdWx0O1xufVxuXG5mdW5jdGlvbiBqb2luVXJsKGJhc2UsIHJlbCkge1xuICB2YXIgcmVsc3AgPSBzcGxpdFVybChyZWwpO1xuICBpZiAocmVsc3AuZG9tYWluICE9PSB1bmRlZmluZWQpIHtcbiAgICByZXR1cm4gcmVsO1xuICB9XG4gIHZhciByZXN1bHQgPSBzcGxpdFVybChiYXNlKTtcbiAgaWYgKHJlbHNwLnBhdGggPT09IHVuZGVmaW5lZCkge1xuICAgIC8vIGNoYW5nZSBvbmx5IGZyYWdtZW50IHBhcnRcbiAgICByZXN1bHQuZnJhZ21lbnQgPSByZWxzcC5mcmFnbWVudDtcbiAgfSBlbHNlIGlmIChyZWxzcC5wYXRoLnNsaWNlKDAsIDEpID09PSAnLycpIHtcbiAgICAvLyByZWxhdGl2ZSB0byBkb21haW5cbiAgICByZXN1bHQucGF0aCA9IHJlbHNwLnBhdGg7XG4gICAgcmVzdWx0LmZyYWdtZW50ID0gcmVsc3AuZnJhZ21lbnQ7XG4gIH0gZWxzZSB7XG4gICAgLy8gcmVsYXRpdmUgdG8gcGF0aFxuICAgIHZhciBwYXRoID0gcmVzdWx0LnBhdGggPT09IHVuZGVmaW5lZCA/IFtdIDogcmVzdWx0LnBhdGguc3BsaXQoJy8nKTtcbiAgICB2YXIgcmVscGF0aCA9IHJlbHNwLnBhdGguc3BsaXQoJy8nKTtcbiAgICBpZiAocGF0aC5sZW5ndGgpIHtcbiAgICAgIHBhdGgucG9wKCk7XG4gICAgfVxuICAgIHdoaWxlIChyZWxwYXRoWzBdID09PSAnLi4nIHx8IHJlbHBhdGhbMF0gPT09ICcuJykge1xuICAgICAgaWYgKHJlbHBhdGhbMF0gPT09ICcuLicpIHtcbiAgICAgICAgcGF0aC5wb3AoKTtcbiAgICAgIH1cbiAgICAgIHJlbHBhdGguc2hpZnQoKTtcbiAgICB9XG4gICAgcmVzdWx0LnBhdGggPSBwYXRoLmNvbmNhdChyZWxwYXRoKS5qb2luKCcvJyk7XG4gICAgcmVzdWx0LmZyYWdtZW50ID0gcmVsc3AuZnJhZ21lbnQ7XG4gIH1cbiAgcmV0dXJuIHVuc3BsaXRVcmwocmVzdWx0KTtcbn1cblxuUmVzb2x2ZXIucHJvdG90eXBlLnJldGFpblJvb3QgPSBmdW5jdGlvbihvcmlnS2V5LCBvYmosIHJvb3QpIHtcbiAgLy8gd2FsayBvYmplY3QgYW5kIGxvb2sgZm9yIHJlbGF0aXZlICRyZWZzXG4gIGlmKF8uaXNPYmplY3Qob2JqKSkge1xuICAgIGZvcih2YXIga2V5IGluIG9iaikge1xuICAgICAgdmFyIGl0ZW0gPSBvYmpba2V5XTtcbiAgICAgIGlmIChrZXkgPT09ICckcmVmJyAmJiB0eXBlb2YgaXRlbSA9PT0gJ3N0cmluZycpIHtcbiAgICAgICAgb2JqW2tleV0gPSBqb2luVXJsKHJvb3QsIGl0ZW0pO1xuICAgICAgfVxuICAgICAgZWxzZSBpZiAoXy5pc09iamVjdChpdGVtKSkge1xuICAgICAgICB0aGlzLnJldGFpblJvb3Qoa2V5LCBpdGVtLCByb290KTtcbiAgICAgIH1cbiAgICB9XG4gIH1cbiAgZWxzZSBpZihfLmlzU3RyaW5nKG9iaikgJiYgb3JpZ0tleSA9PT0gJyRyZWYnKSB7XG4gICAgb2JqID0gam9pblVybChyb290LCBvYmopO1xuICB9XG4gIHJldHVybiBvYmo7XG59O1xuXG4vKipcbiAqIGltbWVkaWF0ZWx5IGluLWxpbmVzIGxvY2FsIHJlZnMsIHF1ZXVlcyByZW1vdGUgcmVmc1xuICogZm9yIGlubGluZSByZXNvbHV0aW9uXG4gKi9cblJlc29sdmVyLnByb3RvdHlwZS5yZXNvbHZlSW5saW5lID0gZnVuY3Rpb24gKHJvb3QsIHNwZWMsIHByb3BlcnR5LCByZXNvbHV0aW9uVGFibGUsIHVucmVzb2x2ZWRSZWZzLCBsb2NhdGlvbikge1xuICB2YXIga2V5ID0gcHJvcGVydHkuJHJlZiwgcmVmID0gcHJvcGVydHkuJHJlZiwgaSwgcCwgcDIsIHJzO1xuICB2YXIgcm9vdFRyaW1tZWQgPSBmYWxzZTtcblxuICByb290ID0gcm9vdCB8fCAnJzsgLy8gR3VhcmQgYWdhaW5zdCAuc3BsaXQuIEBmZWhndXksIHlvdSdsbCBuZWVkIHRvIGNoZWNrIGlmIHRoaXMgbG9naWMgZml0c1xuICAvLyBNb3JlIGltcG9yYW50bHkgaXMgaG93IGRvIHdlIGdyYWNlZnVsbHkgaGFuZGxlIHJlbGF0aXZlIHVybHMsIHdoZW4gcHJvdmlkZWQganVzdCBhICdzcGVjJywgbm90IGEgJ3VybCcgP1xuXG4gIGlmIChyZWYpIHtcbiAgICBpZihyZWYuaW5kZXhPZignLi4vJykgPT09IDApIHtcbiAgICAgIC8vIHJlc2V0IHJvb3RcbiAgICAgIHAgPSByZWYuc3BsaXQoJy4uLycpO1xuICAgICAgcDIgPSByb290LnNwbGl0KCcvJyk7XG4gICAgICByZWYgPSAnJztcbiAgICAgIGZvcihpID0gMDsgaSA8IHAubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgaWYocFtpXSA9PT0gJycpIHtcbiAgICAgICAgICBwMiA9IHAyLnNsaWNlKDAsIHAyLmxlbmd0aC0xKTtcbiAgICAgICAgfVxuICAgICAgICBlbHNlIHtcbiAgICAgICAgICByZWYgKz0gcFtpXTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgICAgcm9vdCA9ICcnO1xuICAgICAgZm9yKGkgPSAwOyBpIDwgcDIubGVuZ3RoIC0gMTsgaSsrKSB7XG4gICAgICAgIGlmKGkgPiAwKSB7IHJvb3QgKz0gJy8nOyB9XG4gICAgICAgIHJvb3QgKz0gcDJbaV07XG4gICAgICB9XG4gICAgICByb290VHJpbW1lZCA9IHRydWU7XG4gICAgfVxuICAgIGlmKHJlZi5pbmRleE9mKCcjJykgPj0gMCkge1xuICAgICAgaWYocmVmLmluZGV4T2YoJy8nKSA9PT0gMCkge1xuICAgICAgICBycyA9IHJlZi5zcGxpdCgnIycpO1xuICAgICAgICBwICA9IHJvb3Quc3BsaXQoJy8vJyk7XG4gICAgICAgIHAyID0gcFsxXS5zcGxpdCgnLycpO1xuICAgICAgICByb290ID0gcFswXSArICcvLycgKyBwMlswXSArIHJzWzBdO1xuICAgICAgICBsb2NhdGlvbiA9IHJzWzFdO1xuICAgICAgfVxuICAgICAgZWxzZSB7XG4gICAgICAgIHJzID0gcmVmLnNwbGl0KCcjJyk7XG4gICAgICAgIGlmKHJzWzBdICE9PSAnJykge1xuICAgICAgICAgIHAyID0gcm9vdC5zcGxpdCgnLycpO1xuICAgICAgICAgIHAyID0gcDIuc2xpY2UoMCwgcDIubGVuZ3RoIC0gMSk7XG4gICAgICAgICAgaWYoIXJvb3RUcmltbWVkKSB7XG4gICAgICAgICAgICByb290ID0gJyc7XG4gICAgICAgICAgICBmb3IgKHZhciBrID0gMDsgayA8IHAyLmxlbmd0aDsgaysrKSB7XG4gICAgICAgICAgICAgIGlmKGsgPiAwKSB7IHJvb3QgKz0gJy8nOyB9XG4gICAgICAgICAgICAgIHJvb3QgKz0gcDJba107XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfVxuICAgICAgICAgIHJvb3QgKz0gJy8nICsgcmVmLnNwbGl0KCcjJylbMF07XG4gICAgICAgIH1cbiAgICAgICAgbG9jYXRpb24gPSByc1sxXTtcbiAgICAgIH1cbiAgICB9XG4gICAgaWYgKHJlZi5pbmRleE9mKCdodHRwOicpID09PSAwIHx8IHJlZi5pbmRleE9mKCdodHRwczonKSA9PT0gMCkge1xuICAgICAgaWYocmVmLmluZGV4T2YoJyMnKSA+PSAwKSB7XG4gICAgICAgIHJvb3QgPSByZWYuc3BsaXQoJyMnKVswXTtcbiAgICAgICAgbG9jYXRpb24gPSByZWYuc3BsaXQoJyMnKVsxXTtcbiAgICAgIH1cbiAgICAgIGVsc2Uge1xuICAgICAgICByb290ID0gcmVmO1xuICAgICAgICBsb2NhdGlvbiA9ICcnO1xuICAgICAgfVxuICAgICAgcmVzb2x1dGlvblRhYmxlLnB1c2goe29iajogcHJvcGVydHksIHJlc29sdmVBczogJ2lubGluZScsIHJvb3Q6IHJvb3QsIGtleToga2V5LCBsb2NhdGlvbjogbG9jYXRpb259KTtcbiAgICB9IGVsc2UgaWYgKHJlZi5pbmRleE9mKCcjJykgPT09IDApIHtcbiAgICAgIGxvY2F0aW9uID0gcmVmLnNwbGl0KCcjJylbMV07XG4gICAgICByZXNvbHV0aW9uVGFibGUucHVzaCh7b2JqOiBwcm9wZXJ0eSwgcmVzb2x2ZUFzOiAnaW5saW5lJywgcm9vdDogcm9vdCwga2V5OiBrZXksIGxvY2F0aW9uOiBsb2NhdGlvbn0pO1xuICAgIH0gZWxzZSBpZiAocmVmLmluZGV4T2YoJy8nKSA9PT0gMCAmJiByZWYuaW5kZXhPZignIycpID09PSAtMSkge1xuICAgICAgbG9jYXRpb24gPSByZWY7XG4gICAgICB2YXIgbWF0Y2hlcyA9IHJvb3QubWF0Y2goL15odHRwcz9cXDpcXC9cXC8oW15cXC8/I10rKSg/OltcXC8/I118JCkvaSk7XG4gICAgICBpZihtYXRjaGVzKSB7XG4gICAgICAgIHJvb3QgPSBtYXRjaGVzWzBdICsgcmVmLnN1YnN0cmluZygxKTtcbiAgICAgICAgbG9jYXRpb24gPSAnJztcbiAgICAgIH1cbiAgICAgIHJlc29sdXRpb25UYWJsZS5wdXNoKHtvYmo6IHByb3BlcnR5LCByZXNvbHZlQXM6ICdpbmxpbmUnLCByb290OiByb290LCBrZXk6IGtleSwgbG9jYXRpb246IGxvY2F0aW9ufSk7XG4gICAgfVxuICAgIGVsc2Uge1xuICAgICAgcmVzb2x1dGlvblRhYmxlLnB1c2goe29iajogcHJvcGVydHksIHJlc29sdmVBczogJ2lubGluZScsIHJvb3Q6IHJvb3QsIGtleToga2V5LCBsb2NhdGlvbjogbG9jYXRpb259KTtcbiAgICB9XG4gIH1cbiAgZWxzZSBpZiAocHJvcGVydHkudHlwZSA9PT0gJ2FycmF5Jykge1xuICAgIHRoaXMucmVzb2x2ZVRvKHJvb3QsIHByb3BlcnR5Lml0ZW1zLCByZXNvbHV0aW9uVGFibGUsIGxvY2F0aW9uKTtcbiAgfVxufTtcblxuUmVzb2x2ZXIucHJvdG90eXBlLnJlc29sdmVUbyA9IGZ1bmN0aW9uIChyb290LCBwcm9wZXJ0eSwgcmVzb2x1dGlvblRhYmxlLCBsb2NhdGlvbikge1xuICB2YXIgc3AsIGk7XG4gIHZhciByZWYgPSBwcm9wZXJ0eS4kcmVmO1xuICB2YXIgbHJvb3QgPSByb290O1xuICBpZiAoKHR5cGVvZiByZWYgIT09ICd1bmRlZmluZWQnKSAmJiAocmVmICE9PSBudWxsKSkge1xuICAgIGlmKHJlZi5pbmRleE9mKCcjJykgPj0gMCkge1xuICAgICAgdmFyIHBhcnRzID0gcmVmLnNwbGl0KCcjJyk7XG5cbiAgICAgIC8vICMvZGVmaW5pdGlvbnMvZm9vXG4gICAgICAvLyBmb28uanNvbiMvYmFyXG4gICAgICBpZihwYXJ0c1swXSAmJiByZWYuaW5kZXhPZignLycpID09PSAwKSB7XG5cbiAgICAgIH1cbiAgICAgIGVsc2UgaWYocGFydHNbMF0gJiYgKHBhcnRzWzBdLmluZGV4T2YoJ2h0dHA6JykgPT09IDAgfHwgcGFydHNbMF0uaW5kZXhPZignaHR0cHM6JykgPT09IDApKSB7XG4gICAgICAgIGxyb290ID0gcGFydHNbMF07XG4gICAgICAgIHJlZiA9IHBhcnRzWzFdO1xuICAgICAgfVxuICAgICAgZWxzZSBpZihwYXJ0c1swXSAmJiBwYXJ0c1swXS5sZW5ndGggPiAwKSB7XG4gICAgICAgIC8vIHJlbGF0aXZlIGZpbGVcbiAgICAgICAgc3AgPSByb290LnNwbGl0KCcvJyk7XG4gICAgICAgIGxyb290ID0gJyc7XG4gICAgICAgIGZvcihpID0gMDsgaSA8IHNwLmxlbmd0aCAtIDE7IGkrKykge1xuICAgICAgICAgIGxyb290ICs9IHNwW2ldICsgJy8nO1xuICAgICAgICB9XG4gICAgICAgIGxyb290ICs9IHBhcnRzWzBdO1xuICAgICAgfVxuICAgICAgZWxzZSB7XG5cbiAgICAgIH1cblxuICAgICAgbG9jYXRpb24gPSBwYXJ0c1sxXTtcbiAgICB9XG4gICAgZWxzZSBpZiAocmVmLmluZGV4T2YoJ2h0dHA6JykgPT09IDAgfHwgcmVmLmluZGV4T2YoJ2h0dHBzOicpID09PSAwKSB7XG4gICAgICBscm9vdCA9IHJlZjtcbiAgICAgIGxvY2F0aW9uID0gJyc7XG4gICAgfVxuICAgIGVsc2Uge1xuICAgICAgLy8gcmVsYXRpdmUgZmlsZVxuICAgICAgc3AgPSByb290LnNwbGl0KCcvJyk7XG4gICAgICBscm9vdCA9ICcnO1xuICAgICAgZm9yKGkgPSAwOyBpIDwgc3AubGVuZ3RoIC0gMTsgaSsrKSB7XG4gICAgICAgIGxyb290ICs9IHNwW2ldICsgJy8nO1xuICAgICAgfVxuICAgICAgbHJvb3QgKz0gcmVmO1xuICAgICAgbG9jYXRpb24gPSAnJztcbiAgICB9XG4gICAgcmVzb2x1dGlvblRhYmxlLnB1c2goe1xuICAgICAgb2JqOiBwcm9wZXJ0eSwgcmVzb2x2ZUFzOiAncmVmJywgcm9vdDogbHJvb3QsIGtleTogcmVmLCBsb2NhdGlvbjogbG9jYXRpb25cbiAgICB9KTtcbiAgfSBlbHNlIGlmIChwcm9wZXJ0eS50eXBlID09PSAnYXJyYXknKSB7XG4gICAgdmFyIGl0ZW1zID0gcHJvcGVydHkuaXRlbXM7XG4gICAgdGhpcy5yZXNvbHZlVG8ocm9vdCwgaXRlbXMsIHJlc29sdXRpb25UYWJsZSwgbG9jYXRpb24pO1xuICB9IGVsc2Uge1xuICAgIGlmKHByb3BlcnR5ICYmIChwcm9wZXJ0eS5wcm9wZXJ0aWVzIHx8IHByb3BlcnR5LmFkZGl0aW9uYWxQcm9wZXJ0aWVzKSkge1xuICAgICAgdmFyIG5hbWUgPSB0aGlzLnVuaXF1ZU5hbWUoJ2lubGluZV9tb2RlbCcpO1xuICAgICAgaWYgKHByb3BlcnR5LnRpdGxlKSB7XG4gICAgICAgIG5hbWUgPSB0aGlzLnVuaXF1ZU5hbWUocHJvcGVydHkudGl0bGUpO1xuICAgICAgfVxuICAgICAgZGVsZXRlIHByb3BlcnR5LnRpdGxlO1xuICAgICAgdGhpcy5zcGVjLmRlZmluaXRpb25zW25hbWVdID0gXy5jbG9uZURlZXAocHJvcGVydHkpO1xuICAgICAgcHJvcGVydHkuJHJlZiA9ICcjL2RlZmluaXRpb25zLycgKyBuYW1lO1xuICAgICAgZGVsZXRlIHByb3BlcnR5LnR5cGU7XG4gICAgICBkZWxldGUgcHJvcGVydHkucHJvcGVydGllcztcbiAgICB9XG4gIH1cbn07XG5cblJlc29sdmVyLnByb3RvdHlwZS51bmlxdWVOYW1lID0gZnVuY3Rpb24oYmFzZSkge1xuICB2YXIgbmFtZSA9IGJhc2U7XG4gIHZhciBjb3VudCA9IDA7XG4gIHdoaWxlKHRydWUpIHtcbiAgICBpZighXy5pc09iamVjdCh0aGlzLnNwZWMuZGVmaW5pdGlvbnNbbmFtZV0pKSB7XG4gICAgICByZXR1cm4gbmFtZTtcbiAgICB9XG4gICAgbmFtZSA9IGJhc2UgKyAnXycgKyBjb3VudDtcbiAgICBjb3VudCsrO1xuICB9XG59O1xuXG5SZXNvbHZlci5wcm90b3R5cGUucmVzb2x2ZUFsbE9mID0gZnVuY3Rpb24oc3BlYywgb2JqLCBkZXB0aCkge1xuICBkZXB0aCA9IGRlcHRoIHx8IDA7XG4gIG9iaiA9IG9iaiB8fCBzcGVjO1xuICB2YXIgbmFtZTtcbiAgZm9yKHZhciBrZXkgaW4gb2JqKSB7XG4gICAgaWYgKCFvYmouaGFzT3duUHJvcGVydHkoa2V5KSkge1xuICAgICAgY29udGludWU7XG4gICAgfVxuICAgIHZhciBpdGVtID0gb2JqW2tleV07XG4gICAgaWYoaXRlbSA9PT0gbnVsbCkge1xuICAgICAgdGhyb3cgbmV3IFR5cGVFcnJvcignU3dhZ2dlciAyLjAgZG9lcyBub3Qgc3VwcG9ydCBudWxsIHR5cGVzICgnICsgb2JqICsgJykuICBTZWUgaHR0cHM6Ly9naXRodWIuY29tL3N3YWdnZXItYXBpL3N3YWdnZXItc3BlYy9pc3N1ZXMvMjI5LicpO1xuICAgIH1cbiAgICBpZih0eXBlb2YgaXRlbSA9PT0gJ29iamVjdCcpIHtcbiAgICAgIHRoaXMucmVzb2x2ZUFsbE9mKHNwZWMsIGl0ZW0sIGRlcHRoICsgMSk7XG4gICAgfVxuICAgIGlmKGl0ZW0gJiYgdHlwZW9mIGl0ZW0uYWxsT2YgIT09ICd1bmRlZmluZWQnKSB7XG4gICAgICB2YXIgYWxsT2YgPSBpdGVtLmFsbE9mO1xuICAgICAgaWYoXy5pc0FycmF5KGFsbE9mKSkge1xuICAgICAgICB2YXIgb3V0cHV0ID0gXy5jbG9uZURlZXAoaXRlbSk7XG4gICAgICAgIGRlbGV0ZSBvdXRwdXQuYWxsT2Y7XG5cbiAgICAgICAgb3V0cHV0Wyd4LWNvbXBvc2VkJ10gPSB0cnVlO1xuICAgICAgICBpZiAodHlwZW9mIGl0ZW1bJ3gtcmVzb2x2ZWQtZnJvbSddICE9PSAndW5kZWZpbmVkJykge1xuICAgICAgICAgIG91dHB1dFsneC1yZXNvbHZlZC1mcm9tJ10gPSBpdGVtWyd4LXJlc29sdmVkLWZyb20nXTtcbiAgICAgICAgfVxuXG4gICAgICAgIGZvcih2YXIgaSA9IDA7IGkgPCBhbGxPZi5sZW5ndGg7IGkrKykge1xuICAgICAgICAgIHZhciBjb21wb25lbnQgPSBhbGxPZltpXTtcbiAgICAgICAgICB2YXIgc291cmNlID0gJ3NlbGYnO1xuICAgICAgICAgIGlmKHR5cGVvZiBjb21wb25lbnRbJ3gtcmVzb2x2ZWQtZnJvbSddICE9PSAndW5kZWZpbmVkJykge1xuICAgICAgICAgICAgc291cmNlID0gY29tcG9uZW50Wyd4LXJlc29sdmVkLWZyb20nXVswXTtcbiAgICAgICAgICB9XG5cbiAgICAgICAgICBmb3IodmFyIHBhcnQgaW4gY29tcG9uZW50KSB7XG4gICAgICAgICAgICBpZighb3V0cHV0Lmhhc093blByb3BlcnR5KHBhcnQpKSB7XG4gICAgICAgICAgICAgIG91dHB1dFtwYXJ0XSA9IF8uY2xvbmVEZWVwKGNvbXBvbmVudFtwYXJ0XSk7XG4gICAgICAgICAgICAgIGlmKHBhcnQgPT09ICdwcm9wZXJ0aWVzJykge1xuICAgICAgICAgICAgICAgIGZvcihuYW1lIGluIG91dHB1dFtwYXJ0XSkge1xuICAgICAgICAgICAgICAgICAgb3V0cHV0W3BhcnRdW25hbWVdWyd4LXJlc29sdmVkLWZyb20nXSA9IHNvdXJjZTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgICBpZihwYXJ0ID09PSAncHJvcGVydGllcycpIHtcbiAgICAgICAgICAgICAgICB2YXIgcHJvcGVydGllcyA9IGNvbXBvbmVudFtwYXJ0XTtcbiAgICAgICAgICAgICAgICBmb3IobmFtZSBpbiBwcm9wZXJ0aWVzKSB7XG4gICAgICAgICAgICAgICAgICBvdXRwdXQucHJvcGVydGllc1tuYW1lXSA9IF8uY2xvbmVEZWVwKHByb3BlcnRpZXNbbmFtZV0pO1xuICAgICAgICAgICAgICAgICAgdmFyIHJlc29sdmVkRnJvbSA9IHByb3BlcnRpZXNbbmFtZV1bJ3gtcmVzb2x2ZWQtZnJvbSddO1xuICAgICAgICAgICAgICAgICAgaWYgKHR5cGVvZiByZXNvbHZlZEZyb20gPT09ICd1bmRlZmluZWQnIHx8IHJlc29sdmVkRnJvbSA9PT0gJ3NlbGYnKSB7XG4gICAgICAgICAgICAgICAgICAgIHJlc29sdmVkRnJvbSA9IHNvdXJjZTtcbiAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgIG91dHB1dC5wcm9wZXJ0aWVzW25hbWVdWyd4LXJlc29sdmVkLWZyb20nXSA9IHJlc29sdmVkRnJvbTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgZWxzZSBpZihwYXJ0ID09PSAncmVxdWlyZWQnKSB7XG4gICAgICAgICAgICAgICAgLy8gbWVyZ2UgJiBkZWR1cCB0aGUgcmVxdWlyZWQgYXJyYXlcbiAgICAgICAgICAgICAgICB2YXIgYSA9IG91dHB1dC5yZXF1aXJlZC5jb25jYXQoY29tcG9uZW50W3BhcnRdKTtcbiAgICAgICAgICAgICAgICBmb3IodmFyIGsgPSAwOyBrIDwgYS5sZW5ndGg7ICsraykge1xuICAgICAgICAgICAgICAgICAgZm9yKHZhciBqID0gayArIDE7IGogPCBhLmxlbmd0aDsgKytqKSB7XG4gICAgICAgICAgICAgICAgICAgIGlmKGFba10gPT09IGFbal0pIHsgYS5zcGxpY2Uoai0tLCAxKTsgfVxuICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBvdXRwdXQucmVxdWlyZWQgPSBhO1xuICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgIGVsc2UgaWYocGFydCA9PT0gJ3gtcmVzb2x2ZWQtZnJvbScpIHtcbiAgICAgICAgICAgICAgICBvdXRwdXRbJ3gtcmVzb2x2ZWQtZnJvbSddLnB1c2goc291cmNlKTtcbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgICAgICAvLyBUT0RPOiBuZWVkIHRvIG1lcmdlIHRoaXMgcHJvcGVydHlcbiAgICAgICAgICAgICAgICAvLyBjb25zb2xlLmxvZygnd2hhdCB0byBkbyB3aXRoICcgKyBwYXJ0KVxuICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIG9ialtrZXldID0gb3V0cHV0O1xuICAgICAgfVxuICAgIH1cbiAgfVxufTtcbiIsIid1c2Ugc3RyaWN0JztcblxudmFyIEhlbHBlcnMgPSByZXF1aXJlKCcuL2hlbHBlcnMnKTtcblxudmFyIF8gPSB7XG4gIGlzUGxhaW5PYmplY3Q6IHJlcXVpcmUoJ2xvZGFzaC1jb21wYXQvbGFuZy9pc1BsYWluT2JqZWN0JyksXG4gIGlzVW5kZWZpbmVkOiByZXF1aXJlKCdsb2Rhc2gtY29tcGF0L2xhbmcvaXNVbmRlZmluZWQnKSxcbiAgaXNBcnJheTogcmVxdWlyZSgnbG9kYXNoLWNvbXBhdC9sYW5nL2lzQXJyYXknKSxcbiAgaXNPYmplY3Q6IHJlcXVpcmUoJ2xvZGFzaC1jb21wYXQvbGFuZy9pc09iamVjdCcpLFxuICBpc0VtcHR5OiByZXF1aXJlKCdsb2Rhc2gtY29tcGF0L2xhbmcvaXNFbXB0eScpLFxuICBtYXA6IHJlcXVpcmUoJ2xvZGFzaC1jb21wYXQvY29sbGVjdGlvbi9tYXAnKSxcbiAgaW5kZXhPZjogcmVxdWlyZSgnbG9kYXNoLWNvbXBhdC9hcnJheS9pbmRleE9mJyksXG4gIGNsb25lRGVlcDogcmVxdWlyZSgnbG9kYXNoLWNvbXBhdC9sYW5nL2Nsb25lRGVlcCcpLFxuICBrZXlzOiByZXF1aXJlKCdsb2Rhc2gtY29tcGF0L29iamVjdC9rZXlzJyksXG4gIGZvckVhY2g6IHJlcXVpcmUoJ2xvZGFzaC1jb21wYXQvY29sbGVjdGlvbi9mb3JFYWNoJylcbn07XG5cbnZhciBvcHRpb25IdG1sID0gbW9kdWxlLmV4cG9ydHMub3B0aW9uSHRtbCA9IGZ1bmN0aW9uICAobGFiZWwsIHZhbHVlKSB7XG4gIHJldHVybiAnPHRyPjx0ZCBjbGFzcz1cIm9wdGlvbk5hbWVcIj4nICsgbGFiZWwgKyAnOjwvdGQ+PHRkPicgKyB2YWx1ZSArICc8L3RkPjwvdHI+Jztcbn07XG5cbm1vZHVsZS5leHBvcnRzLnR5cGVGcm9tSnNvblNjaGVtYSA9IGZ1bmN0aW9uICh0eXBlLCBmb3JtYXQpIHtcbiAgdmFyIHN0cjtcblxuICBpZiAodHlwZSA9PT0gJ2ludGVnZXInICYmIGZvcm1hdCA9PT0gJ2ludDMyJykge1xuICAgIHN0ciA9ICdpbnRlZ2VyJztcbiAgfSBlbHNlIGlmICh0eXBlID09PSAnaW50ZWdlcicgJiYgZm9ybWF0ID09PSAnaW50NjQnKSB7XG4gICAgc3RyID0gJ2xvbmcnO1xuICB9IGVsc2UgaWYgKHR5cGUgPT09ICdpbnRlZ2VyJyAmJiB0eXBlb2YgZm9ybWF0ID09PSAndW5kZWZpbmVkJykge1xuICAgIHN0ciA9ICdsb25nJztcbiAgfSBlbHNlIGlmICh0eXBlID09PSAnc3RyaW5nJyAmJiBmb3JtYXQgPT09ICdkYXRlLXRpbWUnKSB7XG4gICAgc3RyID0gJ2RhdGUtdGltZSc7XG4gIH0gZWxzZSBpZiAodHlwZSA9PT0gJ3N0cmluZycgJiYgZm9ybWF0ID09PSAnZGF0ZScpIHtcbiAgICBzdHIgPSAnZGF0ZSc7XG4gIH0gZWxzZSBpZiAodHlwZSA9PT0gJ251bWJlcicgJiYgZm9ybWF0ID09PSAnZmxvYXQnKSB7XG4gICAgc3RyID0gJ2Zsb2F0JztcbiAgfSBlbHNlIGlmICh0eXBlID09PSAnbnVtYmVyJyAmJiBmb3JtYXQgPT09ICdkb3VibGUnKSB7XG4gICAgc3RyID0gJ2RvdWJsZSc7XG4gIH0gZWxzZSBpZiAodHlwZSA9PT0gJ251bWJlcicgJiYgdHlwZW9mIGZvcm1hdCA9PT0gJ3VuZGVmaW5lZCcpIHtcbiAgICBzdHIgPSAnZG91YmxlJztcbiAgfSBlbHNlIGlmICh0eXBlID09PSAnYm9vbGVhbicpIHtcbiAgICBzdHIgPSAnYm9vbGVhbic7XG4gIH0gZWxzZSBpZiAodHlwZSA9PT0gJ3N0cmluZycpIHtcbiAgICBzdHIgPSAnc3RyaW5nJztcbiAgfVxuXG4gIHJldHVybiBzdHI7XG59O1xuXG52YXIgZ2V0U3RyaW5nU2lnbmF0dXJlID0gbW9kdWxlLmV4cG9ydHMuZ2V0U3RyaW5nU2lnbmF0dXJlID0gZnVuY3Rpb24gKG9iaiwgYmFzZUNvbXBvbmVudCkge1xuICB2YXIgc3RyID0gJyc7XG5cbiAgaWYgKHR5cGVvZiBvYmouJHJlZiAhPT0gJ3VuZGVmaW5lZCcpIHtcbiAgICBzdHIgKz0gSGVscGVycy5zaW1wbGVSZWYob2JqLiRyZWYpO1xuICB9IGVsc2UgaWYgKHR5cGVvZiBvYmoudHlwZSA9PT0gJ3VuZGVmaW5lZCcpIHtcbiAgICBzdHIgKz0gJ29iamVjdCc7XG4gIH0gZWxzZSBpZiAob2JqLnR5cGUgPT09ICdhcnJheScpIHtcbiAgICBpZiAoYmFzZUNvbXBvbmVudCkge1xuICAgICAgc3RyICs9IGdldFN0cmluZ1NpZ25hdHVyZSgob2JqLml0ZW1zIHx8IG9iai4kcmVmIHx8IHt9KSk7XG4gICAgfSBlbHNlIHtcbiAgICAgIHN0ciArPSAnQXJyYXlbJztcbiAgICAgIHN0ciArPSBnZXRTdHJpbmdTaWduYXR1cmUoKG9iai5pdGVtcyB8fCBvYmouJHJlZiB8fCB7fSkpO1xuICAgICAgc3RyICs9ICddJztcbiAgICB9XG4gIH0gZWxzZSBpZiAob2JqLnR5cGUgPT09ICdpbnRlZ2VyJyAmJiBvYmouZm9ybWF0ID09PSAnaW50MzInKSB7XG4gICAgc3RyICs9ICdpbnRlZ2VyJztcbiAgfSBlbHNlIGlmIChvYmoudHlwZSA9PT0gJ2ludGVnZXInICYmIG9iai5mb3JtYXQgPT09ICdpbnQ2NCcpIHtcbiAgICBzdHIgKz0gJ2xvbmcnO1xuICB9IGVsc2UgaWYgKG9iai50eXBlID09PSAnaW50ZWdlcicgJiYgdHlwZW9mIG9iai5mb3JtYXQgPT09ICd1bmRlZmluZWQnKSB7XG4gICAgc3RyICs9ICdsb25nJztcbiAgfSBlbHNlIGlmIChvYmoudHlwZSA9PT0gJ3N0cmluZycgJiYgb2JqLmZvcm1hdCA9PT0gJ2RhdGUtdGltZScpIHtcbiAgICBzdHIgKz0gJ2RhdGUtdGltZSc7XG4gIH0gZWxzZSBpZiAob2JqLnR5cGUgPT09ICdzdHJpbmcnICYmIG9iai5mb3JtYXQgPT09ICdkYXRlJykge1xuICAgIHN0ciArPSAnZGF0ZSc7XG4gIH0gZWxzZSBpZiAob2JqLnR5cGUgPT09ICdzdHJpbmcnICYmIHR5cGVvZiBvYmouZm9ybWF0ID09PSAndW5kZWZpbmVkJykge1xuICAgIHN0ciArPSAnc3RyaW5nJztcbiAgfSBlbHNlIGlmIChvYmoudHlwZSA9PT0gJ251bWJlcicgJiYgb2JqLmZvcm1hdCA9PT0gJ2Zsb2F0Jykge1xuICAgIHN0ciArPSAnZmxvYXQnO1xuICB9IGVsc2UgaWYgKG9iai50eXBlID09PSAnbnVtYmVyJyAmJiBvYmouZm9ybWF0ID09PSAnZG91YmxlJykge1xuICAgIHN0ciArPSAnZG91YmxlJztcbiAgfSBlbHNlIGlmIChvYmoudHlwZSA9PT0gJ251bWJlcicgJiYgdHlwZW9mIG9iai5mb3JtYXQgPT09ICd1bmRlZmluZWQnKSB7XG4gICAgc3RyICs9ICdkb3VibGUnO1xuICB9IGVsc2UgaWYgKG9iai50eXBlID09PSAnYm9vbGVhbicpIHtcbiAgICBzdHIgKz0gJ2Jvb2xlYW4nO1xuICB9IGVsc2UgaWYgKG9iai4kcmVmKSB7XG4gICAgc3RyICs9IEhlbHBlcnMuc2ltcGxlUmVmKG9iai4kcmVmKTtcbiAgfSBlbHNlIHtcbiAgICBzdHIgKz0gb2JqLnR5cGU7XG4gIH1cblxuICByZXR1cm4gc3RyO1xufTtcblxudmFyIHNjaGVtYVRvSlNPTiA9IG1vZHVsZS5leHBvcnRzLnNjaGVtYVRvSlNPTiA9IGZ1bmN0aW9uIChzY2hlbWEsIG1vZGVscywgbW9kZWxzVG9JZ25vcmUsIG1vZGVsUHJvcGVydHlNYWNybykge1xuICAvLyBSZXNvbHZlIHRoZSBzY2hlbWEgKEhhbmRsZSBuZXN0ZWQgc2NoZW1hcylcbiAgc2NoZW1hID0gSGVscGVycy5yZXNvbHZlU2NoZW1hKHNjaGVtYSk7XG5cbiAgaWYodHlwZW9mIG1vZGVsUHJvcGVydHlNYWNybyAhPT0gJ2Z1bmN0aW9uJykge1xuICAgIG1vZGVsUHJvcGVydHlNYWNybyA9IGZ1bmN0aW9uKHByb3Ape1xuICAgICAgcmV0dXJuIChwcm9wIHx8IHt9KS5kZWZhdWx0O1xuICAgIH07XG4gIH1cblxuICBtb2RlbHNUb0lnbm9yZT0gbW9kZWxzVG9JZ25vcmUgfHwge307XG5cbiAgdmFyIHR5cGUgPSBzY2hlbWEudHlwZSB8fCAnb2JqZWN0JztcbiAgdmFyIGZvcm1hdCA9IHNjaGVtYS5mb3JtYXQ7XG4gIHZhciBtb2RlbDtcbiAgdmFyIG91dHB1dDtcblxuICBpZiAoIV8uaXNVbmRlZmluZWQoc2NoZW1hLmV4YW1wbGUpKSB7XG4gICAgb3V0cHV0ID0gc2NoZW1hLmV4YW1wbGU7XG4gIH0gZWxzZSBpZiAoXy5pc1VuZGVmaW5lZChzY2hlbWEuaXRlbXMpICYmIF8uaXNBcnJheShzY2hlbWEuZW51bSkpIHtcbiAgICBvdXRwdXQgPSBzY2hlbWEuZW51bVswXTtcbiAgfVxuXG4gIGlmIChfLmlzVW5kZWZpbmVkKG91dHB1dCkpIHtcbiAgICBpZiAoc2NoZW1hLiRyZWYpIHtcbiAgICAgIG1vZGVsID0gbW9kZWxzW0hlbHBlcnMuc2ltcGxlUmVmKHNjaGVtYS4kcmVmKV07XG5cbiAgICAgIGlmICghXy5pc1VuZGVmaW5lZChtb2RlbCkpIHtcbiAgICAgICAgaWYgKF8uaXNVbmRlZmluZWQobW9kZWxzVG9JZ25vcmVbbW9kZWwubmFtZV0pKSB7XG4gICAgICAgICAgbW9kZWxzVG9JZ25vcmVbbW9kZWwubmFtZV0gPSBtb2RlbDtcbiAgICAgICAgICBvdXRwdXQgPSBzY2hlbWFUb0pTT04obW9kZWwuZGVmaW5pdGlvbiwgbW9kZWxzLCBtb2RlbHNUb0lnbm9yZSwgbW9kZWxQcm9wZXJ0eU1hY3JvKTtcbiAgICAgICAgICBkZWxldGUgbW9kZWxzVG9JZ25vcmVbbW9kZWwubmFtZV07XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgaWYgKG1vZGVsLnR5cGUgPT09ICdhcnJheScpIHtcbiAgICAgICAgICAgIG91dHB1dCA9IFtdO1xuICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICBvdXRwdXQgPSB7fTtcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9IGVsc2UgaWYgKCFfLmlzVW5kZWZpbmVkKHNjaGVtYS5kZWZhdWx0KSkge1xuICAgICAgb3V0cHV0ID0gc2NoZW1hLmRlZmF1bHQ7XG4gICAgfSBlbHNlIGlmICh0eXBlID09PSAnc3RyaW5nJykge1xuICAgICAgaWYgKGZvcm1hdCA9PT0gJ2RhdGUtdGltZScpIHtcbiAgICAgICAgb3V0cHV0ID0gbmV3IERhdGUoKS50b0lTT1N0cmluZygpO1xuICAgICAgfSBlbHNlIGlmIChmb3JtYXQgPT09ICdkYXRlJykge1xuICAgICAgICBvdXRwdXQgPSBuZXcgRGF0ZSgpLnRvSVNPU3RyaW5nKCkuc3BsaXQoJ1QnKVswXTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIG91dHB1dCA9ICdzdHJpbmcnO1xuICAgICAgfVxuICAgIH0gZWxzZSBpZiAodHlwZSA9PT0gJ2ludGVnZXInKSB7XG4gICAgICBvdXRwdXQgPSAwO1xuICAgIH0gZWxzZSBpZiAodHlwZSA9PT0gJ251bWJlcicpIHtcbiAgICAgIG91dHB1dCA9IDAuMDtcbiAgICB9IGVsc2UgaWYgKHR5cGUgPT09ICdib29sZWFuJykge1xuICAgICAgb3V0cHV0ID0gdHJ1ZTtcbiAgICB9IGVsc2UgaWYgKHR5cGUgPT09ICdvYmplY3QnKSB7XG4gICAgICBvdXRwdXQgPSB7fTtcblxuICAgICAgXy5mb3JFYWNoKHNjaGVtYS5wcm9wZXJ0aWVzLCBmdW5jdGlvbiAocHJvcGVydHksIG5hbWUpIHtcbiAgICAgICAgdmFyIGNQcm9wZXJ0eSA9IF8uY2xvbmVEZWVwKHByb3BlcnR5KTtcblxuICAgICAgICAvLyBBbGxvdyBtYWNybyB0byBzZXQgdGhlIGRlZmF1bHQgdmFsdWVcbiAgICAgICAgY1Byb3BlcnR5LmRlZmF1bHQgPSBtb2RlbFByb3BlcnR5TWFjcm8ocHJvcGVydHkpO1xuXG4gICAgICAgIG91dHB1dFtuYW1lXSA9IHNjaGVtYVRvSlNPTihjUHJvcGVydHksIG1vZGVscywgbW9kZWxzVG9JZ25vcmUsIG1vZGVsUHJvcGVydHlNYWNybyk7XG4gICAgICB9KTtcbiAgICB9IGVsc2UgaWYgKHR5cGUgPT09ICdhcnJheScpIHtcbiAgICAgIG91dHB1dCA9IFtdO1xuXG4gICAgICBpZiAoXy5pc0FycmF5KHNjaGVtYS5pdGVtcykpIHtcbiAgICAgICAgXy5mb3JFYWNoKHNjaGVtYS5pdGVtcywgZnVuY3Rpb24gKGl0ZW0pIHtcbiAgICAgICAgICBvdXRwdXQucHVzaChzY2hlbWFUb0pTT04oaXRlbSwgbW9kZWxzLCBtb2RlbHNUb0lnbm9yZSwgbW9kZWxQcm9wZXJ0eU1hY3JvKSk7XG4gICAgICAgIH0pO1xuICAgICAgfSBlbHNlIGlmIChfLmlzUGxhaW5PYmplY3Qoc2NoZW1hLml0ZW1zKSkge1xuICAgICAgICBvdXRwdXQucHVzaChzY2hlbWFUb0pTT04oc2NoZW1hLml0ZW1zLCBtb2RlbHMsIG1vZGVsc1RvSWdub3JlLCBtb2RlbFByb3BlcnR5TWFjcm8pKTtcbiAgICAgIH0gZWxzZSBpZiAoXy5pc1VuZGVmaW5lZChzY2hlbWEuaXRlbXMpKSB7XG4gICAgICAgIG91dHB1dC5wdXNoKHt9KTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIEhlbHBlcnMubG9nKCdBcnJheSB0eXBlXFwncyBcXCdpdGVtc1xcJyBwcm9wZXJ0eSBpcyBub3QgYW4gYXJyYXkgb3IgYW4gb2JqZWN0LCBjYW5ub3QgcHJvY2VzcycpO1xuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIHJldHVybiBvdXRwdXQ7XG59O1xuXG5tb2R1bGUuZXhwb3J0cy5zY2hlbWFUb0hUTUwgPWZ1bmN0aW9uIChuYW1lLCBzY2hlbWEsIG1vZGVscywgbW9kZWxQcm9wZXJ0eU1hY3JvKSB7XG4gIHZhciBzdHJvbmdPcGVuID0gJzxzcGFuIGNsYXNzPVwic3Ryb25nXCI+JztcbiAgdmFyIHN0cm9uZ0Nsb3NlID0gJzwvc3Bhbj4nO1xuXG4gIC8vIEFsbG93IGZvciBpZ25vcmluZyB0aGUgJ25hbWUnIGFyZ3VtZW50Li4uLiBzaGlmdGluZyB0aGUgcmVzdFxuICBpZihfLmlzT2JqZWN0KGFyZ3VtZW50c1swXSkpIHtcbiAgICBuYW1lID0gdm9pZCAwO1xuICAgIHNjaGVtYSA9IGFyZ3VtZW50c1swXTtcbiAgICBtb2RlbHMgPSBhcmd1bWVudHNbMV07XG4gICAgbW9kZWxQcm9wZXJ0eU1hY3JvID0gYXJndW1lbnRzWzJdO1xuICB9XG5cbiAgbW9kZWxzID0gbW9kZWxzIHx8IHt9O1xuXG4gIC8vIFJlc29sdmUgdGhlIHNjaGVtYSAoSGFuZGxlIG5lc3RlZCBzY2hlbWFzKVxuICBzY2hlbWEgPSBIZWxwZXJzLnJlc29sdmVTY2hlbWEoc2NoZW1hKTtcblxuICAvLyBSZXR1cm4gZm9yIGVtcHR5IG9iamVjdFxuICBpZihfLmlzRW1wdHkoc2NoZW1hKSkge1xuICAgIHJldHVybiBzdHJvbmdPcGVuICsgJ0VtcHR5JyArIHN0cm9uZ0Nsb3NlO1xuICB9XG5cbiAgLy8gRGVyZWZlcmVuY2UgJHJlZiBmcm9tICdtb2RlbHMnXG4gIGlmKHR5cGVvZiBzY2hlbWEuJHJlZiA9PT0gJ3N0cmluZycpIHtcbiAgICBuYW1lID0gSGVscGVycy5zaW1wbGVSZWYoc2NoZW1hLiRyZWYpO1xuICAgIHNjaGVtYSA9IG1vZGVsc1tuYW1lXTtcbiAgICBpZih0eXBlb2Ygc2NoZW1hID09PSAndW5kZWZpbmVkJylcbiAgICB7XG4gICAgICByZXR1cm4gc3Ryb25nT3BlbiArIG5hbWUgKyAnIGlzIG5vdCBkZWZpbmVkIScgKyBzdHJvbmdDbG9zZTtcbiAgICB9XG4gIH1cblxuICBpZih0eXBlb2YgbmFtZSAhPT0gJ3N0cmluZycpIHtcbiAgICBuYW1lID0gc2NoZW1hLnRpdGxlIHx8ICdJbmxpbmUgTW9kZWwnO1xuICB9XG5cbiAgLy8gSWYgd2UgYXJlIGEgTW9kZWwgb2JqZWN0Li4uIGFkanVzdCBhY2NvcmRpbmdseVxuICBpZihzY2hlbWEuZGVmaW5pdGlvbikge1xuICAgIHNjaGVtYSA9IHNjaGVtYS5kZWZpbml0aW9uO1xuICB9XG5cbiAgaWYodHlwZW9mIG1vZGVsUHJvcGVydHlNYWNybyAhPT0gJ2Z1bmN0aW9uJykge1xuICAgIG1vZGVsUHJvcGVydHlNYWNybyA9IGZ1bmN0aW9uKHByb3Ape1xuICAgICAgcmV0dXJuIChwcm9wIHx8IHt9KS5kZWZhdWx0O1xuICAgIH07XG4gIH1cblxuICB2YXIgcmVmZXJlbmNlcyA9IHt9O1xuICB2YXIgc2Vlbk1vZGVscyA9IFtdO1xuICB2YXIgaW5saW5lTW9kZWxzID0gMDtcblxuXG5cbiAgLy8gR2VuZXJhdGUgY3VycmVudCBIVE1MXG4gIHZhciBodG1sID0gcHJvY2Vzc01vZGVsKHNjaGVtYSwgbmFtZSk7XG5cbiAgLy8gR2VuZXJhdGUgcmVmZXJlbmNlcyBIVE1MXG4gIHdoaWxlIChfLmtleXMocmVmZXJlbmNlcykubGVuZ3RoID4gMCkge1xuICAgIC8qIGpzaGludCBpZ25vcmU6c3RhcnQgKi9cbiAgICBfLmZvckVhY2gocmVmZXJlbmNlcywgZnVuY3Rpb24gKHNjaGVtYSwgbmFtZSkge1xuICAgICAgdmFyIHNlZW5Nb2RlbCA9IF8uaW5kZXhPZihzZWVuTW9kZWxzLCBuYW1lKSA+IC0xO1xuXG4gICAgICBkZWxldGUgcmVmZXJlbmNlc1tuYW1lXTtcblxuICAgICAgaWYgKCFzZWVuTW9kZWwpIHtcbiAgICAgICAgc2Vlbk1vZGVscy5wdXNoKG5hbWUpO1xuXG4gICAgICAgIGh0bWwgKz0gJzxiciAvPicgKyBwcm9jZXNzTW9kZWwoc2NoZW1hLCBuYW1lKTtcbiAgICAgIH1cbiAgICB9KTtcbiAgICAvKiBqc2hpbnQgaWdub3JlOmVuZCAqL1xuICB9XG5cbiAgcmV0dXJuIGh0bWw7XG5cbiAgLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vXG5cbiAgZnVuY3Rpb24gYWRkUmVmZXJlbmNlKHNjaGVtYSwgbmFtZSwgc2tpcFJlZikge1xuICAgIHZhciBtb2RlbE5hbWUgPSBuYW1lO1xuICAgIHZhciBtb2RlbDtcblxuICAgIGlmIChzY2hlbWEuJHJlZikge1xuICAgICAgbW9kZWxOYW1lID0gc2NoZW1hLnRpdGxlIHx8IEhlbHBlcnMuc2ltcGxlUmVmKHNjaGVtYS4kcmVmKTtcbiAgICAgIG1vZGVsID0gbW9kZWxzW21vZGVsTmFtZV07XG4gICAgfSBlbHNlIGlmIChfLmlzVW5kZWZpbmVkKG5hbWUpKSB7XG4gICAgICBtb2RlbE5hbWUgPSBzY2hlbWEudGl0bGUgfHwgJ0lubGluZSBNb2RlbCAnICsgKCsraW5saW5lTW9kZWxzKTtcbiAgICAgIG1vZGVsID0ge2RlZmluaXRpb246IHNjaGVtYX07XG4gICAgfVxuXG4gICAgaWYgKHNraXBSZWYgIT09IHRydWUpIHtcbiAgICAgIHJlZmVyZW5jZXNbbW9kZWxOYW1lXSA9IF8uaXNVbmRlZmluZWQobW9kZWwpID8ge30gOiBtb2RlbC5kZWZpbml0aW9uO1xuICAgIH1cblxuICAgIHJldHVybiBtb2RlbE5hbWU7XG4gIH1cblxuICBmdW5jdGlvbiBwcmltaXRpdmVUb0hUTUwoc2NoZW1hKSB7XG4gICAgdmFyIGh0bWwgPSAnPHNwYW4gY2xhc3M9XCJwcm9wVHlwZVwiPic7XG4gICAgdmFyIHR5cGUgPSBzY2hlbWEudHlwZSB8fCAnb2JqZWN0JztcblxuICAgIGlmIChzY2hlbWEuJHJlZikge1xuICAgICAgaHRtbCArPSBhZGRSZWZlcmVuY2Uoc2NoZW1hLCBIZWxwZXJzLnNpbXBsZVJlZihzY2hlbWEuJHJlZikpO1xuICAgIH0gZWxzZSBpZiAodHlwZSA9PT0gJ29iamVjdCcpIHtcbiAgICAgIGlmICghXy5pc1VuZGVmaW5lZChzY2hlbWEucHJvcGVydGllcykpIHtcbiAgICAgICAgaHRtbCArPSBhZGRSZWZlcmVuY2Uoc2NoZW1hKTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIGh0bWwgKz0gJ29iamVjdCc7XG4gICAgICB9XG4gICAgfSBlbHNlIGlmICh0eXBlID09PSAnYXJyYXknKSB7XG4gICAgICBodG1sICs9ICdBcnJheVsnO1xuXG4gICAgICBpZiAoXy5pc0FycmF5KHNjaGVtYS5pdGVtcykpIHtcbiAgICAgICAgaHRtbCArPSBfLm1hcChzY2hlbWEuaXRlbXMsIGFkZFJlZmVyZW5jZSkuam9pbignLCcpO1xuICAgICAgfSBlbHNlIGlmIChfLmlzUGxhaW5PYmplY3Qoc2NoZW1hLml0ZW1zKSkge1xuICAgICAgICBpZiAoXy5pc1VuZGVmaW5lZChzY2hlbWEuaXRlbXMuJHJlZikpIHtcbiAgICAgICAgICBpZiAoIV8uaXNVbmRlZmluZWQoc2NoZW1hLml0ZW1zLnR5cGUpICYmIF8uaW5kZXhPZihbJ2FycmF5JywgJ29iamVjdCddLCBzY2hlbWEuaXRlbXMudHlwZSkgPT09IC0xKSB7XG4gICAgICAgICAgICBodG1sICs9IHNjaGVtYS5pdGVtcy50eXBlO1xuICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICBodG1sICs9IGFkZFJlZmVyZW5jZShzY2hlbWEuaXRlbXMpO1xuICAgICAgICAgIH1cbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICBodG1sICs9IGFkZFJlZmVyZW5jZShzY2hlbWEuaXRlbXMsIEhlbHBlcnMuc2ltcGxlUmVmKHNjaGVtYS5pdGVtcy4kcmVmKSk7XG4gICAgICAgIH1cbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIEhlbHBlcnMubG9nKCdBcnJheSB0eXBlXFwncyBcXCdpdGVtc1xcJyBzY2hlbWEgaXMgbm90IGFuIGFycmF5IG9yIGFuIG9iamVjdCwgY2Fubm90IHByb2Nlc3MnKTtcbiAgICAgICAgaHRtbCArPSAnb2JqZWN0JztcbiAgICAgIH1cblxuICAgICAgaHRtbCArPSAnXSc7XG4gICAgfSBlbHNlIHtcbiAgICAgIGh0bWwgKz0gc2NoZW1hLnR5cGU7XG4gICAgfVxuXG4gICAgaHRtbCArPSAnPC9zcGFuPic7XG5cbiAgICByZXR1cm4gaHRtbDtcbiAgfVxuXG4gIGZ1bmN0aW9uIHByaW1pdGl2ZVRvT3B0aW9uc0hUTUwoc2NoZW1hLCBodG1sKSB7XG4gICAgdmFyIG9wdGlvbnMgPSAnJztcbiAgICB2YXIgdHlwZSA9IHNjaGVtYS50eXBlIHx8ICdvYmplY3QnO1xuICAgIHZhciBpc0FycmF5ID0gdHlwZSA9PT0gJ2FycmF5JztcblxuICAgIGlmIChpc0FycmF5KSB7XG4gICAgICBpZiAoXy5pc1BsYWluT2JqZWN0KHNjaGVtYS5pdGVtcykgJiYgIV8uaXNVbmRlZmluZWQoc2NoZW1hLml0ZW1zLnR5cGUpKSB7XG4gICAgICAgIHR5cGUgPSBzY2hlbWEuaXRlbXMudHlwZTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHR5cGUgPSAnb2JqZWN0JztcbiAgICAgIH1cbiAgICB9XG5cbiAgICBpZiAoIV8uaXNVbmRlZmluZWQoc2NoZW1hLmRlZmF1bHQpKSB7XG4gICAgICBvcHRpb25zICs9IG9wdGlvbkh0bWwoJ0RlZmF1bHQnLCBzY2hlbWEuZGVmYXVsdCk7XG4gICAgfVxuXG4gICAgc3dpdGNoICh0eXBlKSB7XG4gICAgY2FzZSAnc3RyaW5nJzpcbiAgICAgIGlmIChzY2hlbWEubWluTGVuZ3RoKSB7XG4gICAgICAgIG9wdGlvbnMgKz0gb3B0aW9uSHRtbCgnTWluLiBMZW5ndGgnLCBzY2hlbWEubWluTGVuZ3RoKTtcbiAgICAgIH1cblxuICAgICAgaWYgKHNjaGVtYS5tYXhMZW5ndGgpIHtcbiAgICAgICAgb3B0aW9ucyArPSBvcHRpb25IdG1sKCdNYXguIExlbmd0aCcsIHNjaGVtYS5tYXhMZW5ndGgpO1xuICAgICAgfVxuXG4gICAgICBpZiAoc2NoZW1hLnBhdHRlcm4pIHtcbiAgICAgICAgb3B0aW9ucyArPSBvcHRpb25IdG1sKCdSZWcuIEV4cC4nLCBzY2hlbWEucGF0dGVybik7XG4gICAgICB9XG4gICAgICBicmVhaztcbiAgICBjYXNlICdpbnRlZ2VyJzpcbiAgICBjYXNlICdudW1iZXInOlxuICAgICAgaWYgKHNjaGVtYS5taW5pbXVtKSB7XG4gICAgICAgIG9wdGlvbnMgKz0gb3B0aW9uSHRtbCgnTWluLiBWYWx1ZScsIHNjaGVtYS5taW5pbXVtKTtcbiAgICAgIH1cblxuICAgICAgaWYgKHNjaGVtYS5leGNsdXNpdmVNaW5pbXVtKSB7XG4gICAgICAgIG9wdGlvbnMgKz0gb3B0aW9uSHRtbCgnRXhjbHVzaXZlIE1pbi4nLCAndHJ1ZScpO1xuICAgICAgfVxuXG4gICAgICBpZiAoc2NoZW1hLm1heGltdW0pIHtcbiAgICAgICAgb3B0aW9ucyArPSBvcHRpb25IdG1sKCdNYXguIFZhbHVlJywgc2NoZW1hLm1heGltdW0pO1xuICAgICAgfVxuXG4gICAgICBpZiAoc2NoZW1hLmV4Y2x1c2l2ZU1heGltdW0pIHtcbiAgICAgICAgb3B0aW9ucyArPSBvcHRpb25IdG1sKCdFeGNsdXNpdmUgTWF4LicsICd0cnVlJyk7XG4gICAgICB9XG5cbiAgICAgIGlmIChzY2hlbWEubXVsdGlwbGVPZikge1xuICAgICAgICBvcHRpb25zICs9IG9wdGlvbkh0bWwoJ011bHRpcGxlIE9mJywgc2NoZW1hLm11bHRpcGxlT2YpO1xuICAgICAgfVxuXG4gICAgICBicmVhaztcbiAgICB9XG5cbiAgICBpZiAoaXNBcnJheSkge1xuICAgICAgaWYgKHNjaGVtYS5taW5JdGVtcykge1xuICAgICAgICBvcHRpb25zICs9IG9wdGlvbkh0bWwoJ01pbi4gSXRlbXMnLCBzY2hlbWEubWluSXRlbXMpO1xuICAgICAgfVxuXG4gICAgICBpZiAoc2NoZW1hLm1heEl0ZW1zKSB7XG4gICAgICAgIG9wdGlvbnMgKz0gb3B0aW9uSHRtbCgnTWF4LiBJdGVtcycsIHNjaGVtYS5tYXhJdGVtcyk7XG4gICAgICB9XG5cbiAgICAgIGlmIChzY2hlbWEudW5pcXVlSXRlbXMpIHtcbiAgICAgICAgb3B0aW9ucyArPSBvcHRpb25IdG1sKCdVbmlxdWUgSXRlbXMnLCAndHJ1ZScpO1xuICAgICAgfVxuXG4gICAgICBpZiAoc2NoZW1hLmNvbGxlY3Rpb25Gb3JtYXQpIHtcbiAgICAgICAgb3B0aW9ucyArPSBvcHRpb25IdG1sKCdDb2xsLiBGb3JtYXQnLCBzY2hlbWEuY29sbGVjdGlvbkZvcm1hdCk7XG4gICAgICB9XG4gICAgfVxuXG4gICAgaWYgKF8uaXNVbmRlZmluZWQoc2NoZW1hLml0ZW1zKSkge1xuICAgICAgaWYgKF8uaXNBcnJheShzY2hlbWEuZW51bSkpIHtcbiAgICAgICAgdmFyIGVudW1TdHJpbmc7XG5cbiAgICAgICAgaWYgKHR5cGUgPT09ICdudW1iZXInIHx8IHR5cGUgPT09ICdpbnRlZ2VyJykge1xuICAgICAgICAgIGVudW1TdHJpbmcgPSBzY2hlbWEuZW51bS5qb2luKCcsICcpO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIGVudW1TdHJpbmcgPSAnXCInICsgc2NoZW1hLmVudW0uam9pbignXCIsIFwiJykgKyAnXCInO1xuICAgICAgICB9XG5cbiAgICAgICAgb3B0aW9ucyArPSBvcHRpb25IdG1sKCdFbnVtJywgZW51bVN0cmluZyk7XG4gICAgICB9XG4gICAgfVxuXG4gICAgaWYgKG9wdGlvbnMubGVuZ3RoID4gMCkge1xuICAgICAgaHRtbCA9ICc8c3BhbiBjbGFzcz1cInByb3BXcmFwXCI+JyArIGh0bWwgKyAnPHRhYmxlIGNsYXNzPVwib3B0aW9uc1dyYXBwZXJcIj48dHI+PHRoIGNvbHNwYW49XCIyXCI+JyArIHR5cGUgKyAnPC90aD48L3RyPicgKyBvcHRpb25zICsgJzwvdGFibGU+PC9zcGFuPic7XG4gICAgfVxuXG4gICAgcmV0dXJuIGh0bWw7XG4gIH1cblxuICBmdW5jdGlvbiBwcm9jZXNzTW9kZWwoc2NoZW1hLCBuYW1lKSB7XG4gICAgdmFyIHR5cGUgPSBzY2hlbWEudHlwZSB8fCAnb2JqZWN0JztcbiAgICB2YXIgaXNBcnJheSA9IHNjaGVtYS50eXBlID09PSAnYXJyYXknO1xuICAgIHZhciBodG1sID0gc3Ryb25nT3BlbiArIG5hbWUgKyAnICcgKyAoaXNBcnJheSA/ICdbJyA6ICd7JykgKyBzdHJvbmdDbG9zZTtcblxuICAgIGlmIChuYW1lKSB7XG4gICAgICBzZWVuTW9kZWxzLnB1c2gobmFtZSk7XG4gICAgfVxuXG4gICAgaWYgKGlzQXJyYXkpIHtcbiAgICAgIGlmIChfLmlzQXJyYXkoc2NoZW1hLml0ZW1zKSkge1xuICAgICAgICBodG1sICs9ICc8ZGl2PicgKyBfLm1hcChzY2hlbWEuaXRlbXMsIGZ1bmN0aW9uIChpdGVtKSB7XG4gICAgICAgICAgdmFyIHR5cGUgPSBpdGVtLnR5cGUgfHwgJ29iamVjdCc7XG5cbiAgICAgICAgICBpZiAoXy5pc1VuZGVmaW5lZChpdGVtLiRyZWYpKSB7XG4gICAgICAgICAgICBpZiAoXy5pbmRleE9mKFsnYXJyYXknLCAnb2JqZWN0J10sIHR5cGUpID4gLTEpIHtcbiAgICAgICAgICAgICAgaWYgKHR5cGUgPT09ICdvYmplY3QnICYmIF8uaXNVbmRlZmluZWQoaXRlbS5wcm9wZXJ0aWVzKSkge1xuICAgICAgICAgICAgICAgIHJldHVybiAnb2JqZWN0JztcbiAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gYWRkUmVmZXJlbmNlKGl0ZW0pO1xuICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICByZXR1cm4gcHJpbWl0aXZlVG9PcHRpb25zSFRNTChpdGVtLCB0eXBlKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgcmV0dXJuIGFkZFJlZmVyZW5jZShpdGVtLCBIZWxwZXJzLnNpbXBsZVJlZihpdGVtLiRyZWYpKTtcbiAgICAgICAgICB9XG4gICAgICAgIH0pLmpvaW4oJyw8L2Rpdj48ZGl2PicpO1xuICAgICAgfSBlbHNlIGlmIChfLmlzUGxhaW5PYmplY3Qoc2NoZW1hLml0ZW1zKSkge1xuICAgICAgICBpZiAoXy5pc1VuZGVmaW5lZChzY2hlbWEuaXRlbXMuJHJlZikpIHtcbiAgICAgICAgICBpZiAoXy5pbmRleE9mKFsnYXJyYXknLCAnb2JqZWN0J10sIHNjaGVtYS5pdGVtcy50eXBlIHx8ICdvYmplY3QnKSA+IC0xKSB7XG4gICAgICAgICAgICBpZiAoKF8uaXNVbmRlZmluZWQoc2NoZW1hLml0ZW1zLnR5cGUpIHx8IHNjaGVtYS5pdGVtcy50eXBlID09PSAnb2JqZWN0JykgJiYgXy5pc1VuZGVmaW5lZChzY2hlbWEuaXRlbXMucHJvcGVydGllcykpIHtcbiAgICAgICAgICAgICAgaHRtbCArPSAnPGRpdj5vYmplY3Q8L2Rpdj4nO1xuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgaHRtbCArPSAnPGRpdj4nICsgYWRkUmVmZXJlbmNlKHNjaGVtYS5pdGVtcykgKyAnPC9kaXY+JztcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgaHRtbCArPSAnPGRpdj4nICsgcHJpbWl0aXZlVG9PcHRpb25zSFRNTChzY2hlbWEuaXRlbXMsIHNjaGVtYS5pdGVtcy50eXBlKSArICc8L2Rpdj4nO1xuICAgICAgICAgIH1cbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICBodG1sICs9ICc8ZGl2PicgKyBhZGRSZWZlcmVuY2Uoc2NoZW1hLml0ZW1zLCBIZWxwZXJzLnNpbXBsZVJlZihzY2hlbWEuaXRlbXMuJHJlZikpICsgJzwvZGl2Pic7XG4gICAgICAgIH1cbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIEhlbHBlcnMubG9nKCdBcnJheSB0eXBlXFwncyBcXCdpdGVtc1xcJyBwcm9wZXJ0eSBpcyBub3QgYW4gYXJyYXkgb3IgYW4gb2JqZWN0LCBjYW5ub3QgcHJvY2VzcycpO1xuICAgICAgICBodG1sICs9ICc8ZGl2Pm9iamVjdDwvZGl2Pic7XG4gICAgICB9XG4gICAgfSBlbHNlIHtcbiAgICAgIGlmIChzY2hlbWEuJHJlZikge1xuICAgICAgICBodG1sICs9ICc8ZGl2PicgKyBhZGRSZWZlcmVuY2Uoc2NoZW1hLCBuYW1lKSArICc8L2Rpdj4nO1xuICAgICAgfSBlbHNlIGlmICh0eXBlID09PSAnb2JqZWN0Jykge1xuICAgICAgICBpZiAoXy5pc1BsYWluT2JqZWN0KHNjaGVtYS5wcm9wZXJ0aWVzKSkge1xuICAgICAgICAgIHZhciBjb250ZW50cyA9IF8ubWFwKHNjaGVtYS5wcm9wZXJ0aWVzLCBmdW5jdGlvbiAocHJvcGVydHksIG5hbWUpIHtcbiAgICAgICAgICAgIHZhciBwcm9wZXJ0eUlzUmVxdWlyZWQgPSAoXy5pbmRleE9mKHNjaGVtYS5yZXF1aXJlZCwgbmFtZSkgPj0gMCk7XG4gICAgICAgICAgICB2YXIgY1Byb3BlcnR5ID0gXy5jbG9uZURlZXAocHJvcGVydHkpO1xuXG4gICAgICAgICAgICB2YXIgcmVxdWlyZWRDbGFzcyA9IHByb3BlcnR5SXNSZXF1aXJlZCA/ICdyZXF1aXJlZCcgOiAnJztcbiAgICAgICAgICAgIHZhciBodG1sID0gJzxzcGFuIGNsYXNzPVwicHJvcE5hbWUgJyArIHJlcXVpcmVkQ2xhc3MgKyAnXCI+JyArIG5hbWUgKyAnPC9zcGFuPiAoJztcbiAgICAgICAgICAgIHZhciBtb2RlbDtcbiAgICAgICAgICAgIHZhciBwcm9wRGVzY3JpcHRpb247XG5cbiAgICAgICAgICAgIC8vIEFsbG93IG1hY3JvIHRvIHNldCB0aGUgZGVmYXVsdCB2YWx1ZVxuICAgICAgICAgICAgY1Byb3BlcnR5LmRlZmF1bHQgPSBtb2RlbFByb3BlcnR5TWFjcm8oY1Byb3BlcnR5KTtcblxuICAgICAgICAgICAgLy8gUmVzb2x2ZSB0aGUgc2NoZW1hIChIYW5kbGUgbmVzdGVkIHNjaGVtYXMpXG4gICAgICAgICAgICBjUHJvcGVydHkgPSBIZWxwZXJzLnJlc29sdmVTY2hlbWEoY1Byb3BlcnR5KTtcblxuICAgICAgICAgICAgcHJvcERlc2NyaXB0aW9uID0gcHJvcGVydHkuZGVzY3JpcHRpb24gfHwgY1Byb3BlcnR5LmRlc2NyaXB0aW9uO1xuXG4gICAgICAgICAgICAvLyBXZSBuZWVkIHRvIGhhbmRsZSBwcm9wZXJ0eSByZWZlcmVuY2VzIHRvIHByaW1pdGl2ZXMgKElzc3VlIDMzOSlcbiAgICAgICAgICAgIGlmICghXy5pc1VuZGVmaW5lZChjUHJvcGVydHkuJHJlZikpIHtcbiAgICAgICAgICAgICAgbW9kZWwgPSBtb2RlbHNbSGVscGVycy5zaW1wbGVSZWYoY1Byb3BlcnR5LiRyZWYpXTtcblxuICAgICAgICAgICAgICBpZiAoIV8uaXNVbmRlZmluZWQobW9kZWwpICYmIF8uaW5kZXhPZihbdW5kZWZpbmVkLCAnYXJyYXknLCAnb2JqZWN0J10sIG1vZGVsLmRlZmluaXRpb24udHlwZSkgPT09IC0xKSB7XG4gICAgICAgICAgICAgICAgLy8gVXNlIHJlZmVyZW5jZWQgc2NoZW1hXG4gICAgICAgICAgICAgICAgY1Byb3BlcnR5ID0gSGVscGVycy5yZXNvbHZlU2NoZW1hKG1vZGVsLmRlZmluaXRpb24pO1xuICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIGh0bWwgKz0gcHJpbWl0aXZlVG9IVE1MKGNQcm9wZXJ0eSk7XG5cbiAgICAgICAgICAgIGlmKCFwcm9wZXJ0eUlzUmVxdWlyZWQpIHtcbiAgICAgICAgICAgICAgaHRtbCArPSAnLCA8c3BhbiBjbGFzcz1cInByb3BPcHRLZXlcIj5vcHRpb25hbDwvc3Bhbj4nO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBpZihwcm9wZXJ0eS5yZWFkT25seSkge1xuICAgICAgICAgICAgICAgIGh0bWwgKz0gJywgPHNwYW4gY2xhc3M9XCJwcm9wUmVhZE9ubHlcIj5yZWFkIG9ubHk8L3NwYW4+JztcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgaHRtbCArPSAnKSc7XG5cbiAgICAgICAgICAgIGlmICghXy5pc1VuZGVmaW5lZChwcm9wRGVzY3JpcHRpb24pKSB7XG4gICAgICAgICAgICAgIGh0bWwgKz0gJzogJyArICc8c3BhbiBjbGFzcz1cInByb3BEZXNjXCI+JyArIHByb3BEZXNjcmlwdGlvbiArICc8L3NwYW4+JztcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgaWYgKGNQcm9wZXJ0eS5lbnVtKSB7XG4gICAgICAgICAgICAgIGh0bWwgKz0gJyA9IDxzcGFuIGNsYXNzPVwicHJvcFZhbHNcIj5bXFwnJyArIGNQcm9wZXJ0eS5lbnVtLmpvaW4oJ1xcJywgXFwnJykgKyAnXFwnXTwvc3Bhbj4nO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICByZXR1cm4gJzxkaXYnICsgKHByb3BlcnR5LnJlYWRPbmx5ID8gJyBjbGFzcz1cInJlYWRPbmx5XCInIDogJycpICsgJz4nICsgcHJpbWl0aXZlVG9PcHRpb25zSFRNTChjUHJvcGVydHksIGh0bWwpO1xuICAgICAgICAgIH0pLmpvaW4oJyw8L2Rpdj4nKTtcblxuICAgICAgICAgIGlmIChjb250ZW50cykge1xuICAgICAgICAgICAgaHRtbCArPSBjb250ZW50cyArICc8L2Rpdj4nO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgfSBlbHNlIHtcbiAgICAgICAgaHRtbCArPSAnPGRpdj4nICsgcHJpbWl0aXZlVG9PcHRpb25zSFRNTChzY2hlbWEsIHR5cGUpICsgJzwvZGl2Pic7XG4gICAgICB9XG4gICAgfVxuXG4gICAgcmV0dXJuIGh0bWwgKyBzdHJvbmdPcGVuICsgKGlzQXJyYXkgPyAnXScgOiAnfScpICsgc3Ryb25nQ2xvc2U7XG4gIH1cbn07IiwiJ3VzZSBzdHJpY3QnO1xuXG52YXIgU3dhZ2dlckh0dHAgPSByZXF1aXJlKCcuL2h0dHAnKTtcbnZhciBfID0ge1xuICBpc09iamVjdDogcmVxdWlyZSgnbG9kYXNoLWNvbXBhdC9sYW5nL2lzT2JqZWN0Jylcbn07XG5cbnZhciBTd2FnZ2VyU3BlY0NvbnZlcnRlciA9IG1vZHVsZS5leHBvcnRzID0gZnVuY3Rpb24gKCkge1xuICB0aGlzLmVycm9ycyA9IFtdO1xuICB0aGlzLndhcm5pbmdzID0gW107XG4gIHRoaXMubW9kZWxNYXAgPSB7fTtcbn07XG5cblN3YWdnZXJTcGVjQ29udmVydGVyLnByb3RvdHlwZS5zZXREb2N1bWVudGF0aW9uTG9jYXRpb24gPSBmdW5jdGlvbiAobG9jYXRpb24pIHtcbiAgdGhpcy5kb2NMb2NhdGlvbiA9IGxvY2F0aW9uO1xufTtcblxuLyoqXG4gKiBjb252ZXJ0cyBhIHJlc291cmNlIGxpc3RpbmcgT1IgYXBpIGRlY2xhcmF0aW9uXG4gKiovXG5Td2FnZ2VyU3BlY0NvbnZlcnRlci5wcm90b3R5cGUuY29udmVydCA9IGZ1bmN0aW9uIChvYmosIGNsaWVudEF1dGhvcml6YXRpb25zLCBvcHRzLCBjYWxsYmFjaykge1xuICAvLyBub3QgYSB2YWxpZCBzcGVjXG4gIGlmKCFvYmogfHwgIUFycmF5LmlzQXJyYXkob2JqLmFwaXMpKSB7XG4gICAgcmV0dXJuIHRoaXMuZmluaXNoKGNhbGxiYWNrLCBudWxsKTtcbiAgfVxuICB0aGlzLmNsaWVudEF1dGhvcml6YXRpb25zID0gY2xpZW50QXV0aG9yaXphdGlvbnM7XG5cbiAgLy8gY3JlYXRlIGEgbmV3IHN3YWdnZXIgb2JqZWN0IHRvIHJldHVyblxuICB2YXIgc3dhZ2dlciA9IHsgc3dhZ2dlcjogJzIuMCcgfTtcblxuICBzd2FnZ2VyLm9yaWdpbmFsVmVyc2lvbiA9IG9iai5zd2FnZ2VyVmVyc2lvbjtcblxuICAvLyBhZGQgdGhlIGluZm9cbiAgdGhpcy5hcGlJbmZvKG9iaiwgc3dhZ2dlcik7XG5cbiAgLy8gYWRkIHNlY3VyaXR5IGRlZmluaXRpb25zXG4gIHRoaXMuc2VjdXJpdHlEZWZpbml0aW9ucyhvYmosIHN3YWdnZXIpO1xuXG4gIC8vIHRha2UgYmFzZVBhdGggaW50byBhY2NvdW50XG4gIGlmIChvYmouYmFzZVBhdGgpIHtcbiAgICB0aGlzLnNldERvY3VtZW50YXRpb25Mb2NhdGlvbihvYmouYmFzZVBhdGgpO1xuICB9XG5cbiAgLy8gc2VlIGlmIHRoaXMgaXMgYSBzaW5nbGUtZmlsZSBzd2FnZ2VyIGRlZmluaXRpb25cbiAgdmFyIGlzU2luZ2xlRmlsZVN3YWdnZXIgPSBmYWxzZTtcbiAgdmFyIGk7XG4gIGZvcihpID0gMDsgaSA8IG9iai5hcGlzLmxlbmd0aDsgaSsrKSB7XG4gICAgdmFyIGFwaSA9IG9iai5hcGlzW2ldO1xuICAgIGlmKEFycmF5LmlzQXJyYXkoYXBpLm9wZXJhdGlvbnMpKSB7XG4gICAgICBpc1NpbmdsZUZpbGVTd2FnZ2VyID0gdHJ1ZTtcbiAgICB9XG4gIH1cbiAgaWYoaXNTaW5nbGVGaWxlU3dhZ2dlcikge1xuICAgIHRoaXMuZGVjbGFyYXRpb24ob2JqLCBzd2FnZ2VyKTtcbiAgICB0aGlzLmZpbmlzaChjYWxsYmFjaywgc3dhZ2dlcik7XG4gIH1cbiAgZWxzZSB7XG4gICAgdGhpcy5yZXNvdXJjZUxpc3Rpbmcob2JqLCBzd2FnZ2VyLCBvcHRzLCBjYWxsYmFjayk7XG4gIH1cbn07XG5cblN3YWdnZXJTcGVjQ29udmVydGVyLnByb3RvdHlwZS5kZWNsYXJhdGlvbiA9IGZ1bmN0aW9uKG9iaiwgc3dhZ2dlcikge1xuICB2YXIgbmFtZSwgaSwgcCwgcG9zO1xuICBpZighb2JqLmFwaXMpIHtcbiAgICByZXR1cm47XG4gIH1cblxuICBpZiAob2JqLmJhc2VQYXRoLmluZGV4T2YoJ2h0dHA6Ly8nKSA9PT0gMCkge1xuICAgIHAgPSBvYmouYmFzZVBhdGguc3Vic3RyaW5nKCdodHRwOi8vJy5sZW5ndGgpO1xuICAgIHBvcyA9IHAuaW5kZXhPZignLycpO1xuICAgIGlmIChwb3MgPiAwKSB7XG4gICAgICBzd2FnZ2VyLmhvc3QgPSBwLnN1YnN0cmluZygwLCBwb3MpO1xuICAgICAgc3dhZ2dlci5iYXNlUGF0aCA9IHAuc3Vic3RyaW5nKHBvcyk7XG4gICAgfVxuICAgIGVsc2Uge1xuICAgICAgc3dhZ2dlci5ob3N0ID0gcDtcbiAgICAgIHN3YWdnZXIuYmFzZVBhdGggPSAnLyc7XG4gICAgfVxuICB9IGVsc2UgaWYgKG9iai5iYXNlUGF0aC5pbmRleE9mKCdodHRwczovLycpID09PSAwKSB7XG4gICAgcCA9IG9iai5iYXNlUGF0aC5zdWJzdHJpbmcoJ2h0dHBzOi8vJy5sZW5ndGgpO1xuICAgIHBvcyA9IHAuaW5kZXhPZignLycpO1xuICAgIGlmIChwb3MgPiAwKSB7XG4gICAgICBzd2FnZ2VyLmhvc3QgPSBwLnN1YnN0cmluZygwLCBwb3MpO1xuICAgICAgc3dhZ2dlci5iYXNlUGF0aCA9IHAuc3Vic3RyaW5nKHBvcyk7XG4gICAgfVxuICAgIGVsc2Uge1xuICAgICAgc3dhZ2dlci5ob3N0ID0gcDtcbiAgICAgIHN3YWdnZXIuYmFzZVBhdGggPSAnLyc7XG4gICAgfVxuICB9IGVsc2Uge1xuICAgIHN3YWdnZXIuYmFzZVBhdGggPSBvYmouYmFzZVBhdGg7XG4gIH1cblxuICB2YXIgcmVzb3VyY2VMZXZlbEF1dGg7XG4gIGlmKG9iai5hdXRob3JpemF0aW9ucykge1xuICAgIHJlc291cmNlTGV2ZWxBdXRoID0gb2JqLmF1dGhvcml6YXRpb25zO1xuICB9XG4gIGlmKG9iai5jb25zdW1lcykge1xuICAgIHN3YWdnZXIuY29uc3VtZXMgPSBvYmouY29uc3VtZXM7XG4gIH1cbiAgaWYob2JqLnByb2R1Y2VzKSB7XG4gICAgc3dhZ2dlci5wcm9kdWNlcyA9IG9iai5wcm9kdWNlcztcbiAgfVxuXG4gIC8vIGJ1aWxkIGEgbWFwcGluZyBvZiBpZCB0byBuYW1lIGZvciAxLjAgbW9kZWwgcmVzb2x1dGlvbnNcbiAgaWYoXy5pc09iamVjdChvYmopKSB7XG4gICAgZm9yKG5hbWUgaW4gb2JqLm1vZGVscykge1xuICAgICAgdmFyIGV4aXN0aW5nTW9kZWwgPSBvYmoubW9kZWxzW25hbWVdO1xuICAgICAgdmFyIGtleSA9IChleGlzdGluZ01vZGVsLmlkIHx8IG5hbWUpO1xuICAgICAgdGhpcy5tb2RlbE1hcFtrZXldID0gbmFtZTtcbiAgICB9XG4gIH1cblxuICBmb3IoaSA9IDA7IGkgPCBvYmouYXBpcy5sZW5ndGg7IGkrKykge1xuICAgIHZhciBhcGkgPSBvYmouYXBpc1tpXTtcbiAgICB2YXIgcGF0aCA9IGFwaS5wYXRoO1xuICAgIHZhciBvcGVyYXRpb25zID0gYXBpLm9wZXJhdGlvbnM7XG4gICAgdGhpcy5vcGVyYXRpb25zKHBhdGgsIG9iai5yZXNvdXJjZVBhdGgsIG9wZXJhdGlvbnMsIHJlc291cmNlTGV2ZWxBdXRoLCBzd2FnZ2VyKTtcbiAgfVxuXG4gIHZhciBtb2RlbHMgPSBvYmoubW9kZWxzIHx8IHt9O1xuICB0aGlzLm1vZGVscyhtb2RlbHMsIHN3YWdnZXIpO1xufTtcblxuU3dhZ2dlclNwZWNDb252ZXJ0ZXIucHJvdG90eXBlLm1vZGVscyA9IGZ1bmN0aW9uKG9iaiwgc3dhZ2dlcikge1xuICBpZighXy5pc09iamVjdChvYmopKSB7XG4gICAgcmV0dXJuO1xuICB9XG4gIHZhciBuYW1lO1xuXG4gIHN3YWdnZXIuZGVmaW5pdGlvbnMgPSBzd2FnZ2VyLmRlZmluaXRpb25zIHx8IHt9O1xuICBmb3IobmFtZSBpbiBvYmopIHtcbiAgICB2YXIgZXhpc3RpbmdNb2RlbCA9IG9ialtuYW1lXTtcbiAgICB2YXIgX3JlcXVpcmVkID0gW107XG4gICAgdmFyIHNjaGVtYSA9IHsgcHJvcGVydGllczoge319O1xuICAgIHZhciBwcm9wZXJ0eU5hbWU7XG4gICAgZm9yKHByb3BlcnR5TmFtZSBpbiBleGlzdGluZ01vZGVsLnByb3BlcnRpZXMpIHtcbiAgICAgIHZhciBleGlzdGluZ1Byb3BlcnR5ID0gZXhpc3RpbmdNb2RlbC5wcm9wZXJ0aWVzW3Byb3BlcnR5TmFtZV07XG4gICAgICB2YXIgcHJvcGVydHkgPSB7fTtcbiAgICAgIHRoaXMuZGF0YVR5cGUoZXhpc3RpbmdQcm9wZXJ0eSwgcHJvcGVydHkpO1xuICAgICAgaWYoZXhpc3RpbmdQcm9wZXJ0eS5kZXNjcmlwdGlvbikge1xuICAgICAgICBwcm9wZXJ0eS5kZXNjcmlwdGlvbiA9IGV4aXN0aW5nUHJvcGVydHkuZGVzY3JpcHRpb247XG4gICAgICB9XG4gICAgICBpZihleGlzdGluZ1Byb3BlcnR5WydlbnVtJ10pIHtcbiAgICAgICAgcHJvcGVydHlbJ2VudW0nXSA9IGV4aXN0aW5nUHJvcGVydHlbJ2VudW0nXTtcbiAgICAgIH1cbiAgICAgIGlmKHR5cGVvZiBleGlzdGluZ1Byb3BlcnR5LnJlcXVpcmVkID09PSAnYm9vbGVhbicgJiYgZXhpc3RpbmdQcm9wZXJ0eS5yZXF1aXJlZCA9PT0gdHJ1ZSkge1xuICAgICAgICBfcmVxdWlyZWQucHVzaChwcm9wZXJ0eU5hbWUpO1xuICAgICAgfVxuICAgICAgaWYodHlwZW9mIGV4aXN0aW5nUHJvcGVydHkucmVxdWlyZWQgPT09ICdzdHJpbmcnICYmIGV4aXN0aW5nUHJvcGVydHkucmVxdWlyZWQgPT09ICd0cnVlJykge1xuICAgICAgICBfcmVxdWlyZWQucHVzaChwcm9wZXJ0eU5hbWUpO1xuICAgICAgfVxuICAgICAgc2NoZW1hLnByb3BlcnRpZXNbcHJvcGVydHlOYW1lXSA9IHByb3BlcnR5O1xuICAgIH1cbiAgICBpZihfcmVxdWlyZWQubGVuZ3RoID4gMCkge1xuICAgICAgc2NoZW1hLnJlcXVpcmVkID0gX3JlcXVpcmVkO1xuICAgIH0gZWxzZSB7XG4gICAgICBzY2hlbWEucmVxdWlyZWQgPSBleGlzdGluZ01vZGVsLnJlcXVpcmVkO1xuICAgIH1cbiAgICBzd2FnZ2VyLmRlZmluaXRpb25zW25hbWVdID0gc2NoZW1hO1xuICB9XG59O1xuXG5Td2FnZ2VyU3BlY0NvbnZlcnRlci5wcm90b3R5cGUuZXh0cmFjdFRhZyA9IGZ1bmN0aW9uKHJlc291cmNlUGF0aCkge1xuICB2YXIgcGF0aFN0cmluZyA9IHJlc291cmNlUGF0aCB8fCAnZGVmYXVsdCc7XG4gIGlmKHBhdGhTdHJpbmcuaW5kZXhPZignaHR0cDonKSA9PT0gMCB8fCBwYXRoU3RyaW5nLmluZGV4T2YoJ2h0dHBzOicpID09PSAwKSB7XG4gICAgcGF0aFN0cmluZyA9IHBhdGhTdHJpbmcuc3BsaXQoWycvJ10pO1xuICAgIHBhdGhTdHJpbmcgPSBwYXRoU3RyaW5nW3BhdGhTdHJpbmcubGVuZ3RoIC0xXS5zdWJzdHJpbmcoKTtcbiAgfVxuICBpZihwYXRoU3RyaW5nLmVuZHNXaXRoKCcuanNvbicpKSB7XG4gICAgcGF0aFN0cmluZyA9IHBhdGhTdHJpbmcuc3Vic3RyaW5nKDAsIHBhdGhTdHJpbmcubGVuZ3RoIC0gJy5qc29uJy5sZW5ndGgpO1xuICB9XG4gIHJldHVybiBwYXRoU3RyaW5nLnJlcGxhY2UoJy8nLCcnKTtcbn07XG5cblN3YWdnZXJTcGVjQ29udmVydGVyLnByb3RvdHlwZS5vcGVyYXRpb25zID0gZnVuY3Rpb24ocGF0aCwgcmVzb3VyY2VQYXRoLCBvYmosIHJlc291cmNlTGV2ZWxBdXRoLCBzd2FnZ2VyKSB7XG4gIGlmKCFBcnJheS5pc0FycmF5KG9iaikpIHtcbiAgICByZXR1cm47XG4gIH1cbiAgdmFyIGk7XG5cbiAgaWYoIXN3YWdnZXIucGF0aHMpIHtcbiAgICBzd2FnZ2VyLnBhdGhzID0ge307XG4gIH1cblxuICB2YXIgcGF0aE9iaiA9IHN3YWdnZXIucGF0aHNbcGF0aF0gfHwge307XG4gIHZhciB0YWcgPSB0aGlzLmV4dHJhY3RUYWcocmVzb3VyY2VQYXRoKTtcbiAgc3dhZ2dlci50YWdzID0gc3dhZ2dlci50YWdzIHx8IFtdO1xuICB2YXIgbWF0Y2hlZCA9IGZhbHNlO1xuICBmb3IoaSA9IDA7IGkgPCBzd2FnZ2VyLnRhZ3MubGVuZ3RoOyBpKyspIHtcbiAgICB2YXIgdGFnT2JqZWN0ID0gc3dhZ2dlci50YWdzW2ldO1xuICAgIGlmKHRhZ09iamVjdC5uYW1lID09PSB0YWcpIHtcbiAgICAgIG1hdGNoZWQgPSB0cnVlO1xuICAgIH1cbiAgfVxuICBpZighbWF0Y2hlZCkge1xuICAgIHN3YWdnZXIudGFncy5wdXNoKHtuYW1lOiB0YWd9KTtcbiAgfVxuXG4gIGZvcihpID0gMDsgaSA8IG9iai5sZW5ndGg7IGkrKykge1xuICAgIHZhciBleGlzdGluZ09wZXJhdGlvbiA9IG9ialtpXTtcbiAgICB2YXIgbWV0aG9kID0gKGV4aXN0aW5nT3BlcmF0aW9uLm1ldGhvZCB8fCBleGlzdGluZ09wZXJhdGlvbi5odHRwTWV0aG9kKS50b0xvd2VyQ2FzZSgpO1xuICAgIHZhciBvcGVyYXRpb24gPSB7dGFnczogW3RhZ119O1xuICAgIHZhciBleGlzdGluZ0F1dGhvcml6YXRpb25zID0gZXhpc3RpbmdPcGVyYXRpb24uYXV0aG9yaXphdGlvbnM7XG5cbiAgICBpZihleGlzdGluZ0F1dGhvcml6YXRpb25zICYmIE9iamVjdC5rZXlzKGV4aXN0aW5nQXV0aG9yaXphdGlvbnMpLmxlbmd0aCA9PT0gMCkge1xuICAgICAgZXhpc3RpbmdBdXRob3JpemF0aW9ucyA9IHJlc291cmNlTGV2ZWxBdXRoO1xuICAgIH1cblxuICAgIGlmKHR5cGVvZiBleGlzdGluZ0F1dGhvcml6YXRpb25zICE9PSAndW5kZWZpbmVkJykge1xuICAgICAgdmFyIHNjb3Blc09iamVjdDtcbiAgICAgIGZvcih2YXIga2V5IGluIGV4aXN0aW5nQXV0aG9yaXphdGlvbnMpIHtcbiAgICAgICAgb3BlcmF0aW9uLnNlY3VyaXR5ID0gb3BlcmF0aW9uLnNlY3VyaXR5IHx8IFtdO1xuICAgICAgICB2YXIgc2NvcGVzID0gZXhpc3RpbmdBdXRob3JpemF0aW9uc1trZXldO1xuICAgICAgICBpZihzY29wZXMpIHtcbiAgICAgICAgICB2YXIgc2VjdXJpdHlTY29wZXMgPSBbXTtcbiAgICAgICAgICBmb3IodmFyIGogaW4gc2NvcGVzKSB7XG4gICAgICAgICAgICBzZWN1cml0eVNjb3Blcy5wdXNoKHNjb3Blc1tqXS5zY29wZSk7XG4gICAgICAgICAgfVxuICAgICAgICAgIHNjb3Blc09iamVjdCA9IHt9O1xuICAgICAgICAgIHNjb3Blc09iamVjdFtrZXldID0gc2VjdXJpdHlTY29wZXM7XG4gICAgICAgICAgb3BlcmF0aW9uLnNlY3VyaXR5LnB1c2goc2NvcGVzT2JqZWN0KTtcbiAgICAgICAgfVxuICAgICAgICBlbHNlIHtcbiAgICAgICAgICBzY29wZXNPYmplY3QgPSB7fTtcbiAgICAgICAgICBzY29wZXNPYmplY3Rba2V5XSA9IFtdO1xuICAgICAgICAgIG9wZXJhdGlvbi5zZWN1cml0eS5wdXNoKHNjb3Blc09iamVjdCk7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG5cbiAgICBpZihleGlzdGluZ09wZXJhdGlvbi5jb25zdW1lcykge1xuICAgICAgb3BlcmF0aW9uLmNvbnN1bWVzID0gZXhpc3RpbmdPcGVyYXRpb24uY29uc3VtZXM7XG4gICAgfVxuICAgIGVsc2UgaWYoc3dhZ2dlci5jb25zdW1lcykge1xuICAgICAgb3BlcmF0aW9uLmNvbnN1bWVzID0gc3dhZ2dlci5jb25zdW1lcztcbiAgICB9XG4gICAgaWYoZXhpc3RpbmdPcGVyYXRpb24ucHJvZHVjZXMpIHtcbiAgICAgIG9wZXJhdGlvbi5wcm9kdWNlcyA9IGV4aXN0aW5nT3BlcmF0aW9uLnByb2R1Y2VzO1xuICAgIH1cbiAgICBlbHNlIGlmKHN3YWdnZXIucHJvZHVjZXMpIHtcbiAgICAgIG9wZXJhdGlvbi5wcm9kdWNlcyA9IHN3YWdnZXIucHJvZHVjZXM7XG4gICAgfVxuICAgIGlmKGV4aXN0aW5nT3BlcmF0aW9uLnN1bW1hcnkpIHtcbiAgICAgIG9wZXJhdGlvbi5zdW1tYXJ5ID0gZXhpc3RpbmdPcGVyYXRpb24uc3VtbWFyeTtcbiAgICB9XG4gICAgaWYoZXhpc3RpbmdPcGVyYXRpb24ubm90ZXMpIHtcbiAgICAgIG9wZXJhdGlvbi5kZXNjcmlwdGlvbiA9IGV4aXN0aW5nT3BlcmF0aW9uLm5vdGVzO1xuICAgIH1cbiAgICBpZihleGlzdGluZ09wZXJhdGlvbi5uaWNrbmFtZSkge1xuICAgICAgb3BlcmF0aW9uLm9wZXJhdGlvbklkID0gZXhpc3RpbmdPcGVyYXRpb24ubmlja25hbWU7XG4gICAgfVxuICAgIGlmKGV4aXN0aW5nT3BlcmF0aW9uLmRlcHJlY2F0ZWQpIHtcbiAgICAgIG9wZXJhdGlvbi5kZXByZWNhdGVkID0gZXhpc3RpbmdPcGVyYXRpb24uZGVwcmVjYXRlZDtcbiAgICB9XG5cbiAgICB0aGlzLmF1dGhvcml6YXRpb25zKGV4aXN0aW5nQXV0aG9yaXphdGlvbnMsIHN3YWdnZXIpO1xuICAgIHRoaXMucGFyYW1ldGVycyhvcGVyYXRpb24sIGV4aXN0aW5nT3BlcmF0aW9uLnBhcmFtZXRlcnMsIHN3YWdnZXIpO1xuICAgIHRoaXMucmVzcG9uc2VNZXNzYWdlcyhvcGVyYXRpb24sIGV4aXN0aW5nT3BlcmF0aW9uLCBzd2FnZ2VyKTtcblxuICAgIHBhdGhPYmpbbWV0aG9kXSA9IG9wZXJhdGlvbjtcbiAgfVxuXG4gIHN3YWdnZXIucGF0aHNbcGF0aF0gPSBwYXRoT2JqO1xufTtcblxuU3dhZ2dlclNwZWNDb252ZXJ0ZXIucHJvdG90eXBlLnJlc3BvbnNlTWVzc2FnZXMgPSBmdW5jdGlvbihvcGVyYXRpb24sIGV4aXN0aW5nT3BlcmF0aW9uKSB7XG4gIGlmKCFfLmlzT2JqZWN0KGV4aXN0aW5nT3BlcmF0aW9uKSkge1xuICAgIHJldHVybjtcbiAgfVxuICAvLyBidWlsZCBkZWZhdWx0IHJlc3BvbnNlIGZyb20gdGhlIG9wZXJhdGlvbiAoMS54KVxuICB2YXIgZGVmYXVsdFJlc3BvbnNlID0ge307XG4gIHRoaXMuZGF0YVR5cGUoZXhpc3RpbmdPcGVyYXRpb24sIGRlZmF1bHRSZXNwb25zZSk7XG4gIC8vIFRPRE86IGxvb2sgaW50byB0aGUgcmVhbCBwcm9ibGVtIG9mIHJlbmRlcmluZyByZXNwb25zZXMgaW4gc3dhZ2dlci11aVxuICAvLyAuLi4uc2hvdWxkIHJlcG9uc2VUeXBlIGhhdmUgYW4gaW1wbGljaXQgc2NoZW1hP1xuICBpZighZGVmYXVsdFJlc3BvbnNlLnNjaGVtYSAmJiBkZWZhdWx0UmVzcG9uc2UudHlwZSkge1xuICAgIGRlZmF1bHRSZXNwb25zZSA9IHtzY2hlbWE6IGRlZmF1bHRSZXNwb25zZX07XG4gIH1cblxuICBvcGVyYXRpb24ucmVzcG9uc2VzID0gb3BlcmF0aW9uLnJlc3BvbnNlcyB8fCB7fTtcblxuICAvLyBncmFiIGZyb20gcmVzcG9uc2VNZXNzYWdlcyAoMS4yKVxuICB2YXIgaGFzMjAwID0gZmFsc2U7XG4gIGlmKEFycmF5LmlzQXJyYXkoZXhpc3RpbmdPcGVyYXRpb24ucmVzcG9uc2VNZXNzYWdlcykpIHtcbiAgICB2YXIgaTtcbiAgICB2YXIgZXhpc3RpbmdSZXNwb25zZXMgPSBleGlzdGluZ09wZXJhdGlvbi5yZXNwb25zZU1lc3NhZ2VzO1xuICAgIGZvcihpID0gMDsgaSA8IGV4aXN0aW5nUmVzcG9uc2VzLmxlbmd0aDsgaSsrKSB7XG4gICAgICB2YXIgZXhpc3RpbmdSZXNwb25zZSA9IGV4aXN0aW5nUmVzcG9uc2VzW2ldO1xuICAgICAgdmFyIHJlc3BvbnNlID0geyBkZXNjcmlwdGlvbjogZXhpc3RpbmdSZXNwb25zZS5tZXNzYWdlIH07XG4gICAgICBpZihleGlzdGluZ1Jlc3BvbnNlLmNvZGUgPT09IDIwMCkge1xuICAgICAgICBoYXMyMDAgPSB0cnVlO1xuICAgICAgfVxuICAgICAgLy8gQ29udmVydCByZXNwb25zZU1vZGVsIC0+IHNjaGVtYXskcmVmOiByZXNwb25zZU1vZGVsfVxuICAgICAgaWYoZXhpc3RpbmdSZXNwb25zZS5yZXNwb25zZU1vZGVsKSB7XG4gICAgICAgIHJlc3BvbnNlLnNjaGVtYSA9IHsnJHJlZic6ICcjL2RlZmluaXRpb25zLycgKyBleGlzdGluZ1Jlc3BvbnNlLnJlc3BvbnNlTW9kZWx9O1xuICAgICAgfVxuICAgICAgb3BlcmF0aW9uLnJlc3BvbnNlc1snJyArIGV4aXN0aW5nUmVzcG9uc2UuY29kZV0gPSByZXNwb25zZTtcbiAgICB9XG4gIH1cblxuICBpZihoYXMyMDApIHtcbiAgICBvcGVyYXRpb24ucmVzcG9uc2VzWydkZWZhdWx0J10gPSBkZWZhdWx0UmVzcG9uc2U7XG4gIH1cbiAgZWxzZSB7XG4gICAgb3BlcmF0aW9uLnJlc3BvbnNlc1snMjAwJ10gPSBkZWZhdWx0UmVzcG9uc2U7XG4gIH1cbn07XG5cblN3YWdnZXJTcGVjQ29udmVydGVyLnByb3RvdHlwZS5hdXRob3JpemF0aW9ucyA9IGZ1bmN0aW9uKG9iaikge1xuICAvLyBUT0RPXG4gIGlmKCFfLmlzT2JqZWN0KG9iaikpIHtcbiAgICByZXR1cm47XG4gIH1cbn07XG5cblN3YWdnZXJTcGVjQ29udmVydGVyLnByb3RvdHlwZS5wYXJhbWV0ZXJzID0gZnVuY3Rpb24ob3BlcmF0aW9uLCBvYmopIHtcbiAgaWYoIUFycmF5LmlzQXJyYXkob2JqKSkge1xuICAgIHJldHVybjtcbiAgfVxuICB2YXIgaTtcbiAgZm9yKGkgPSAwOyBpIDwgb2JqLmxlbmd0aDsgaSsrKSB7XG4gICAgdmFyIGV4aXN0aW5nUGFyYW1ldGVyID0gb2JqW2ldO1xuICAgIHZhciBwYXJhbWV0ZXIgPSB7fTtcbiAgICBwYXJhbWV0ZXIubmFtZSA9IGV4aXN0aW5nUGFyYW1ldGVyLm5hbWU7XG4gICAgcGFyYW1ldGVyLmRlc2NyaXB0aW9uID0gZXhpc3RpbmdQYXJhbWV0ZXIuZGVzY3JpcHRpb247XG4gICAgcGFyYW1ldGVyLnJlcXVpcmVkID0gZXhpc3RpbmdQYXJhbWV0ZXIucmVxdWlyZWQ7XG4gICAgcGFyYW1ldGVyLmluID0gZXhpc3RpbmdQYXJhbWV0ZXIucGFyYW1UeXBlO1xuXG4gICAgLy8gcGVyICMxNjhcbiAgICBpZihwYXJhbWV0ZXIuaW4gPT09ICdib2R5Jykge1xuICAgICAgcGFyYW1ldGVyLm5hbWUgPSAnYm9keSc7XG4gICAgfVxuICAgIGlmKHBhcmFtZXRlci5pbiA9PT0gJ2Zvcm0nKSB7XG4gICAgICBwYXJhbWV0ZXIuaW4gPSAnZm9ybURhdGEnO1xuICAgIH1cblxuICAgIGlmKGV4aXN0aW5nUGFyYW1ldGVyLmVudW0pIHtcbiAgICAgIHBhcmFtZXRlci5lbnVtID0gZXhpc3RpbmdQYXJhbWV0ZXIuZW51bTtcbiAgICB9XG5cbiAgICBpZihleGlzdGluZ1BhcmFtZXRlci5hbGxvd011bHRpcGxlID09PSB0cnVlIHx8IGV4aXN0aW5nUGFyYW1ldGVyLmFsbG93TXVsdGlwbGUgPT09ICd0cnVlJykge1xuICAgICAgdmFyIGlubmVyVHlwZSA9IHt9O1xuICAgICAgdGhpcy5kYXRhVHlwZShleGlzdGluZ1BhcmFtZXRlciwgaW5uZXJUeXBlKTtcbiAgICAgIHBhcmFtZXRlci50eXBlID0gJ2FycmF5JztcbiAgICAgIHBhcmFtZXRlci5pdGVtcyA9IGlubmVyVHlwZTtcblxuICAgICAgaWYoZXhpc3RpbmdQYXJhbWV0ZXIuYWxsb3dhYmxlVmFsdWVzKSB7XG4gICAgICAgIHZhciBhdiA9IGV4aXN0aW5nUGFyYW1ldGVyLmFsbG93YWJsZVZhbHVlcztcbiAgICAgICAgaWYoYXYudmFsdWVUeXBlID09PSAnTElTVCcpIHtcbiAgICAgICAgICBwYXJhbWV0ZXJbJ2VudW0nXSA9IGF2LnZhbHVlcztcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cbiAgICBlbHNlIHtcbiAgICAgIHRoaXMuZGF0YVR5cGUoZXhpc3RpbmdQYXJhbWV0ZXIsIHBhcmFtZXRlcik7XG4gICAgfVxuICAgIGlmKHR5cGVvZiBleGlzdGluZ1BhcmFtZXRlci5kZWZhdWx0VmFsdWUgIT09ICd1bmRlZmluZWQnKSB7XG4gICAgICBwYXJhbWV0ZXIuZGVmYXVsdCA9IGV4aXN0aW5nUGFyYW1ldGVyLmRlZmF1bHRWYWx1ZTtcbiAgICB9XG5cbiAgICBvcGVyYXRpb24ucGFyYW1ldGVycyA9IG9wZXJhdGlvbi5wYXJhbWV0ZXJzIHx8IFtdO1xuICAgIG9wZXJhdGlvbi5wYXJhbWV0ZXJzLnB1c2gocGFyYW1ldGVyKTtcbiAgfVxufTtcblxuU3dhZ2dlclNwZWNDb252ZXJ0ZXIucHJvdG90eXBlLmRhdGFUeXBlID0gZnVuY3Rpb24oc291cmNlLCB0YXJnZXQpIHtcbiAgaWYoIV8uaXNPYmplY3Qoc291cmNlKSkge1xuICAgIHJldHVybjtcbiAgfVxuXG4gIGlmKHNvdXJjZS5taW5pbXVtKSB7XG4gICAgdGFyZ2V0Lm1pbmltdW0gPSBzb3VyY2UubWluaW11bTtcbiAgfVxuICBpZihzb3VyY2UubWF4aW11bSkge1xuICAgIHRhcmdldC5tYXhpbXVtID0gc291cmNlLm1heGltdW07XG4gIH1cbiAgaWYgKHNvdXJjZS5mb3JtYXQpIHtcbiAgICB0YXJnZXQuZm9ybWF0ID0gc291cmNlLmZvcm1hdDtcbiAgfVxuXG4gIC8vIGRlZmF1bHQgY2FuIGJlICdmYWxzZSdcbiAgaWYodHlwZW9mIHNvdXJjZS5kZWZhdWx0VmFsdWUgIT09ICd1bmRlZmluZWQnKSB7XG4gICAgdGFyZ2V0LmRlZmF1bHQgPSBzb3VyY2UuZGVmYXVsdFZhbHVlO1xuICB9XG5cbiAgdmFyIGpzb25TY2hlbWFUeXBlID0gdGhpcy50b0pzb25TY2hlbWEoc291cmNlKTtcbiAgaWYoanNvblNjaGVtYVR5cGUpIHtcbiAgICB0YXJnZXQgPSB0YXJnZXQgfHwge307XG4gICAgaWYoanNvblNjaGVtYVR5cGUudHlwZSkge1xuICAgICAgdGFyZ2V0LnR5cGUgPSBqc29uU2NoZW1hVHlwZS50eXBlO1xuICAgIH1cbiAgICBpZihqc29uU2NoZW1hVHlwZS5mb3JtYXQpIHtcbiAgICAgIHRhcmdldC5mb3JtYXQgPSBqc29uU2NoZW1hVHlwZS5mb3JtYXQ7XG4gICAgfVxuICAgIGlmKGpzb25TY2hlbWFUeXBlLiRyZWYpIHtcbiAgICAgIHRhcmdldC5zY2hlbWEgPSB7JHJlZjoganNvblNjaGVtYVR5cGUuJHJlZn07XG4gICAgfVxuICAgIGlmKGpzb25TY2hlbWFUeXBlLml0ZW1zKSB7XG4gICAgICB0YXJnZXQuaXRlbXMgPSBqc29uU2NoZW1hVHlwZS5pdGVtcztcbiAgICB9XG4gIH1cbn07XG5cblN3YWdnZXJTcGVjQ29udmVydGVyLnByb3RvdHlwZS50b0pzb25TY2hlbWEgPSBmdW5jdGlvbihzb3VyY2UpIHtcbiAgaWYoIXNvdXJjZSkge1xuICAgIHJldHVybiAnb2JqZWN0JztcbiAgfVxuICB2YXIgZGV0ZWN0ZWRUeXBlID0gKHNvdXJjZS50eXBlIHx8IHNvdXJjZS5kYXRhVHlwZSB8fCBzb3VyY2UucmVzcG9uc2VDbGFzcyB8fCAnJyk7XG4gIHZhciBsY1R5cGUgPSBkZXRlY3RlZFR5cGUudG9Mb3dlckNhc2UoKTtcbiAgdmFyIGZvcm1hdCA9IChzb3VyY2UuZm9ybWF0IHx8ICcnKS50b0xvd2VyQ2FzZSgpO1xuXG4gIGlmKGxjVHlwZS5pbmRleE9mKCdsaXN0WycpID09PSAwKSB7XG4gICAgdmFyIGlubmVyVHlwZSA9IGRldGVjdGVkVHlwZS5zdWJzdHJpbmcoNSwgZGV0ZWN0ZWRUeXBlLmxlbmd0aCAtIDEpO1xuICAgIHZhciBqc29uVHlwZSA9IHRoaXMudG9Kc29uU2NoZW1hKHt0eXBlOiBpbm5lclR5cGV9KTtcbiAgICByZXR1cm4ge3R5cGU6ICdhcnJheScsIGl0ZW1zOiBqc29uVHlwZX07XG4gIH0gZWxzZSBpZihsY1R5cGUgPT09ICdpbnQnIHx8IChsY1R5cGUgPT09ICdpbnRlZ2VyJyAmJiBmb3JtYXQgPT09ICdpbnQzMicpKSB7XG4gICAge3JldHVybiB7dHlwZTogJ2ludGVnZXInLCBmb3JtYXQ6ICdpbnQzMid9O31cbiAgfSBlbHNlIGlmKGxjVHlwZSA9PT0gJ2xvbmcnIHx8IChsY1R5cGUgPT09ICdpbnRlZ2VyJyAmJiBmb3JtYXQgPT09ICdpbnQ2NCcpKSB7XG4gICAge3JldHVybiB7dHlwZTogJ2ludGVnZXInLCBmb3JtYXQ6ICdpbnQ2NCd9O31cbiAgfSBlbHNlIGlmKGxjVHlwZSA9PT0gJ2ludGVnZXInKSB7XG4gICAge3JldHVybiB7dHlwZTogJ2ludGVnZXInLCBmb3JtYXQ6ICdpbnQ2NCd9O31cbiAgfSBlbHNlIGlmKGxjVHlwZSA9PT0gJ2Zsb2F0JyB8fCAobGNUeXBlID09PSAnbnVtYmVyJyAmJiBmb3JtYXQgPT09ICdmbG9hdCcpKSB7XG4gICAge3JldHVybiB7dHlwZTogJ251bWJlcicsIGZvcm1hdDogJ2Zsb2F0J307fVxuICB9IGVsc2UgaWYobGNUeXBlID09PSAnZG91YmxlJyB8fCAobGNUeXBlID09PSAnbnVtYmVyJyAmJiBmb3JtYXQgPT09ICdkb3VibGUnKSkge1xuICAgIHtyZXR1cm4ge3R5cGU6ICdudW1iZXInLCBmb3JtYXQ6ICdkb3VibGUnfTt9XG4gIH0gZWxzZSBpZigobGNUeXBlID09PSAnc3RyaW5nJyAmJiBmb3JtYXQgPT09ICdkYXRlLXRpbWUnKSB8fCAobGNUeXBlID09PSAnZGF0ZScpKSB7XG4gICAge3JldHVybiB7dHlwZTogJ3N0cmluZycsIGZvcm1hdDogJ2RhdGUtdGltZSd9O31cbiAgfSBlbHNlIGlmKGxjVHlwZSA9PT0gJ3N0cmluZycpIHtcbiAgICB7cmV0dXJuIHt0eXBlOiAnc3RyaW5nJ307fVxuICB9IGVsc2UgaWYobGNUeXBlID09PSAnZmlsZScpIHtcbiAgICB7cmV0dXJuIHt0eXBlOiAnZmlsZSd9O31cbiAgfSBlbHNlIGlmKGxjVHlwZSA9PT0gJ2Jvb2xlYW4nKSB7XG4gICAge3JldHVybiB7dHlwZTogJ2Jvb2xlYW4nfTt9XG4gIH0gZWxzZSBpZihsY1R5cGUgPT09ICdib29sZWFuJykge1xuICAgIHtyZXR1cm4ge3R5cGU6ICdib29sZWFuJ307fVxuICB9IGVsc2UgaWYobGNUeXBlID09PSAnYXJyYXknIHx8IGxjVHlwZSA9PT0gJ2xpc3QnKSB7XG4gICAgaWYoc291cmNlLml0ZW1zKSB7XG4gICAgICB2YXIgaXQgPSB0aGlzLnRvSnNvblNjaGVtYShzb3VyY2UuaXRlbXMpO1xuICAgICAgcmV0dXJuIHt0eXBlOiAnYXJyYXknLCBpdGVtczogaXR9O1xuICAgIH1cbiAgICBlbHNlIHtcbiAgICAgIHJldHVybiB7dHlwZTogJ2FycmF5JywgaXRlbXM6IHt0eXBlOiAnb2JqZWN0J319O1xuICAgIH1cbiAgfSBlbHNlIGlmKHNvdXJjZS4kcmVmKSB7XG4gICAgcmV0dXJuIHskcmVmOiB0aGlzLm1vZGVsTWFwW3NvdXJjZS4kcmVmXSA/ICcjL2RlZmluaXRpb25zLycgKyB0aGlzLm1vZGVsTWFwW3NvdXJjZS4kcmVmXSA6IHNvdXJjZS4kcmVmfTtcbiAgfSBlbHNlIGlmKGxjVHlwZSA9PT0gJ3ZvaWQnIHx8IGxjVHlwZSA9PT0gJycpIHtcbiAgICB7cmV0dXJuIHt9O31cbiAgfSBlbHNlIGlmICh0aGlzLm1vZGVsTWFwW3NvdXJjZS50eXBlXSkge1xuICAgIC8vIElmIHRoaXMgYSBtb2RlbCB1c2luZyBgdHlwZWAgaW5zdGVhZCBvZiBgJHJlZmAsIHRoYXQncyBmaW5lLlxuICAgIHJldHVybiB7JHJlZjogJyMvZGVmaW5pdGlvbnMvJyArIHRoaXMubW9kZWxNYXBbc291cmNlLnR5cGVdfTtcbiAgfSBlbHNlIHtcbiAgICAvLyBVbmtub3duIG1vZGVsIHR5cGUgb3IgJ29iamVjdCcsIHBhc3MgaXQgYWxvbmcuXG4gICAgcmV0dXJuIHt0eXBlOiBzb3VyY2UudHlwZX07XG4gIH1cbn07XG5cblN3YWdnZXJTcGVjQ29udmVydGVyLnByb3RvdHlwZS5yZXNvdXJjZUxpc3RpbmcgPSBmdW5jdGlvbihvYmosIHN3YWdnZXIsIG9wdHMsIGNhbGxiYWNrKSB7XG4gIHZhciBpO1xuICB2YXIgcHJvY2Vzc2VkQ291bnQgPSAwOyAgIC8vIGpzaGludCBpZ25vcmU6bGluZVxuICB2YXIgc2VsZiA9IHRoaXM7ICAgICAgICAgIC8vIGpzaGludCBpZ25vcmU6bGluZVxuICB2YXIgZXhwZWN0ZWRDb3VudCA9IG9iai5hcGlzLmxlbmd0aDtcbiAgdmFyIF9zd2FnZ2VyID0gc3dhZ2dlcjsgICAvLyBqc2hpbnQgaWdub3JlOmxpbmVcbiAgdmFyIF9vcHRzID0ge307XG5cbiAgaWYob3B0cyAmJiBvcHRzLnJlcXVlc3RJbnRlcmNlcHRvcil7XG4gICAgX29wdHMucmVxdWVzdEludGVyY2VwdG9yID0gb3B0cy5yZXF1ZXN0SW50ZXJjZXB0b3I7XG4gIH1cblxuICBpZihvcHRzICYmIG9wdHMucmVzcG9uc2VJbnRlcmNlcHRvcil7XG4gICAgX29wdHMucmVzcG9uc2VJbnRlcmNlcHRvciA9IG9wdHMucmVzcG9uc2VJbnRlcmNlcHRvcjtcbiAgfVxuXG4gIHZhciBzd2FnZ2VyUmVxdWVzdEhlYWRlcnMgPSAnYXBwbGljYXRpb24vanNvbic7XG5cbiAgaWYob3B0cyAmJiBvcHRzLnN3YWdnZXJSZXF1ZXN0SGVhZGVycykge1xuICAgIHN3YWdnZXJSZXF1ZXN0SGVhZGVycyA9IG9wdHMuc3dhZ2dlclJlcXVlc3RIZWFkZXJzO1xuICB9XG5cbiAgaWYoZXhwZWN0ZWRDb3VudCA9PT0gMCkge1xuICAgIHRoaXMuZmluaXNoKGNhbGxiYWNrLCBzd2FnZ2VyKTtcbiAgfVxuXG4gIGZvcihpID0gMDsgaSA8IGV4cGVjdGVkQ291bnQ7IGkrKykge1xuICAgIHZhciBhcGkgPSBvYmouYXBpc1tpXTtcbiAgICB2YXIgcGF0aCA9IGFwaS5wYXRoO1xuICAgIHZhciBhYnNvbHV0ZVBhdGggPSB0aGlzLmdldEFic29sdXRlUGF0aChvYmouc3dhZ2dlclZlcnNpb24sIHRoaXMuZG9jTG9jYXRpb24sIHBhdGgpO1xuXG4gICAgaWYoYXBpLmRlc2NyaXB0aW9uKSB7XG4gICAgICBzd2FnZ2VyLnRhZ3MgPSBzd2FnZ2VyLnRhZ3MgfHwgW107XG4gICAgICBzd2FnZ2VyLnRhZ3MucHVzaCh7XG4gICAgICAgIG5hbWUgOiB0aGlzLmV4dHJhY3RUYWcoYXBpLnBhdGgpLFxuICAgICAgICBkZXNjcmlwdGlvbiA6IGFwaS5kZXNjcmlwdGlvbiB8fCAnJ1xuICAgICAgfSk7XG4gICAgfVxuICAgIHZhciBodHRwID0ge1xuICAgICAgdXJsOiBhYnNvbHV0ZVBhdGgsXG4gICAgICBoZWFkZXJzOiB7IGFjY2VwdDogc3dhZ2dlclJlcXVlc3RIZWFkZXJzIH0sXG4gICAgICBvbjoge30sXG4gICAgICBtZXRob2Q6ICdnZXQnLFxuICAgICAgdGltZW91dDogb3B0cy50aW1lb3V0XG4gICAgfTtcbiAgICAvKiBqc2hpbnQgaWdub3JlOnN0YXJ0ICovXG4gICAgaHR0cC5vbi5yZXNwb25zZSA9IGZ1bmN0aW9uKGRhdGEpIHtcbiAgICAgIHByb2Nlc3NlZENvdW50ICs9IDE7XG4gICAgICB2YXIgb2JqID0gZGF0YS5vYmo7XG4gICAgICBpZihvYmopIHtcbiAgICAgICAgc2VsZi5kZWNsYXJhdGlvbihvYmosIF9zd2FnZ2VyKTtcbiAgICAgIH1cbiAgICAgIGlmKHByb2Nlc3NlZENvdW50ID09PSBleHBlY3RlZENvdW50KSB7XG4gICAgICAgIHNlbGYuZmluaXNoKGNhbGxiYWNrLCBfc3dhZ2dlcik7XG4gICAgICB9XG4gICAgfTtcbiAgICBodHRwLm9uLmVycm9yID0gZnVuY3Rpb24oZGF0YSkge1xuICAgICAgY29uc29sZS5lcnJvcihkYXRhKTtcbiAgICAgIHByb2Nlc3NlZENvdW50ICs9IDE7XG4gICAgICBpZihwcm9jZXNzZWRDb3VudCA9PT0gZXhwZWN0ZWRDb3VudCkge1xuICAgICAgICBzZWxmLmZpbmlzaChjYWxsYmFjaywgX3N3YWdnZXIpO1xuICAgICAgfVxuICAgIH07XG4gICAgLyoganNoaW50IGlnbm9yZTplbmQgKi9cblxuICAgIGlmKHRoaXMuY2xpZW50QXV0aG9yaXphdGlvbnMgJiYgdHlwZW9mIHRoaXMuY2xpZW50QXV0aG9yaXphdGlvbnMuYXBwbHkgPT09ICdmdW5jdGlvbicpIHtcbiAgICAgIHRoaXMuY2xpZW50QXV0aG9yaXphdGlvbnMuYXBwbHkoaHR0cCk7XG4gICAgfVxuXG4gICAgbmV3IFN3YWdnZXJIdHRwKCkuZXhlY3V0ZShodHRwLCBfb3B0cyk7XG4gIH1cbn07XG5cblN3YWdnZXJTcGVjQ29udmVydGVyLnByb3RvdHlwZS5nZXRBYnNvbHV0ZVBhdGggPSBmdW5jdGlvbih2ZXJzaW9uLCBkb2NMb2NhdGlvbiwgcGF0aCkgIHtcbiAgaWYodmVyc2lvbiA9PT0gJzEuMCcpIHtcbiAgICBpZihkb2NMb2NhdGlvbi5lbmRzV2l0aCgnLmpzb24nKSkge1xuICAgICAgLy8gZ2V0IHJvb3QgcGF0aFxuICAgICAgdmFyIHBvcyA9IGRvY0xvY2F0aW9uLmxhc3RJbmRleE9mKCcvJyk7XG4gICAgICBpZihwb3MgPiAwKSB7XG4gICAgICAgIGRvY0xvY2F0aW9uID0gZG9jTG9jYXRpb24uc3Vic3RyaW5nKDAsIHBvcyk7XG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgdmFyIGxvY2F0aW9uID0gZG9jTG9jYXRpb247XG4gIGlmKHBhdGguaW5kZXhPZignaHR0cDonKSA9PT0gMCB8fCBwYXRoLmluZGV4T2YoJ2h0dHBzOicpID09PSAwKSB7XG4gICAgbG9jYXRpb24gPSBwYXRoO1xuICB9XG4gIGVsc2Uge1xuICAgIGlmKGRvY0xvY2F0aW9uLmVuZHNXaXRoKCcvJykpIHtcbiAgICAgIGxvY2F0aW9uID0gZG9jTG9jYXRpb24uc3Vic3RyaW5nKDAsIGRvY0xvY2F0aW9uLmxlbmd0aCAtIDEpO1xuICAgIH1cbiAgICBsb2NhdGlvbiArPSBwYXRoO1xuICB9XG4gIGxvY2F0aW9uID0gbG9jYXRpb24ucmVwbGFjZSgne2Zvcm1hdH0nLCAnanNvbicpO1xuICByZXR1cm4gbG9jYXRpb247XG59O1xuXG5Td2FnZ2VyU3BlY0NvbnZlcnRlci5wcm90b3R5cGUuc2VjdXJpdHlEZWZpbml0aW9ucyA9IGZ1bmN0aW9uKG9iaiwgc3dhZ2dlcikge1xuICBpZihvYmouYXV0aG9yaXphdGlvbnMpIHtcbiAgICB2YXIgbmFtZTtcbiAgICBmb3IobmFtZSBpbiBvYmouYXV0aG9yaXphdGlvbnMpIHtcbiAgICAgIHZhciBpc1ZhbGlkID0gZmFsc2U7XG4gICAgICB2YXIgc2VjdXJpdHlEZWZpbml0aW9uID0ge1xuICAgICAgICB2ZW5kb3JFeHRlbnNpb25zOiB7fVxuICAgICAgfTtcbiAgICAgIHZhciBkZWZpbml0aW9uID0gb2JqLmF1dGhvcml6YXRpb25zW25hbWVdO1xuICAgICAgaWYoZGVmaW5pdGlvbi50eXBlID09PSAnYXBpS2V5Jykge1xuICAgICAgICBzZWN1cml0eURlZmluaXRpb24udHlwZSA9ICdhcGlLZXknO1xuICAgICAgICBzZWN1cml0eURlZmluaXRpb24uaW4gPSBkZWZpbml0aW9uLnBhc3NBcztcbiAgICAgICAgc2VjdXJpdHlEZWZpbml0aW9uLm5hbWUgPSBkZWZpbml0aW9uLmtleW5hbWUgfHwgbmFtZTtcbiAgICAgICAgaXNWYWxpZCA9IHRydWU7XG4gICAgICB9XG4gICAgICBlbHNlIGlmKGRlZmluaXRpb24udHlwZSA9PT0gJ2Jhc2ljQXV0aCcpIHtcbiAgICAgICAgc2VjdXJpdHlEZWZpbml0aW9uLnR5cGUgPSAnYmFzaWNBdXRoJztcbiAgICAgICAgaXNWYWxpZCA9IHRydWU7XG4gICAgICB9XG4gICAgICBlbHNlIGlmKGRlZmluaXRpb24udHlwZSA9PT0gJ29hdXRoMicpIHtcbiAgICAgICAgdmFyIGV4aXN0aW5nU2NvcGVzID0gZGVmaW5pdGlvbi5zY29wZXMgfHwgW107XG4gICAgICAgIHZhciBzY29wZXMgPSB7fTtcbiAgICAgICAgdmFyIGk7XG4gICAgICAgIGZvcihpIGluIGV4aXN0aW5nU2NvcGVzKSB7XG4gICAgICAgICAgdmFyIHNjb3BlID0gZXhpc3RpbmdTY29wZXNbaV07XG4gICAgICAgICAgc2NvcGVzW3Njb3BlLnNjb3BlXSA9IHNjb3BlLmRlc2NyaXB0aW9uO1xuICAgICAgICB9XG4gICAgICAgIHNlY3VyaXR5RGVmaW5pdGlvbi50eXBlID0gJ29hdXRoMic7XG4gICAgICAgIGlmKGkgPiAwKSB7XG4gICAgICAgICAgc2VjdXJpdHlEZWZpbml0aW9uLnNjb3BlcyA9IHNjb3BlcztcbiAgICAgICAgfVxuICAgICAgICBpZihkZWZpbml0aW9uLmdyYW50VHlwZXMpIHtcbiAgICAgICAgICBpZihkZWZpbml0aW9uLmdyYW50VHlwZXMuaW1wbGljaXQpIHtcbiAgICAgICAgICAgIHZhciBpbXBsaWNpdCA9IGRlZmluaXRpb24uZ3JhbnRUeXBlcy5pbXBsaWNpdDtcbiAgICAgICAgICAgIHNlY3VyaXR5RGVmaW5pdGlvbi5mbG93ID0gJ2ltcGxpY2l0JztcbiAgICAgICAgICAgIHNlY3VyaXR5RGVmaW5pdGlvbi5hdXRob3JpemF0aW9uVXJsID0gaW1wbGljaXQubG9naW5FbmRwb2ludDtcbiAgICAgICAgICAgIGlzVmFsaWQgPSB0cnVlO1xuICAgICAgICAgIH1cbiAgICAgICAgICAvKiBqc2hpbnQgaWdub3JlOnN0YXJ0ICovXG4gICAgICAgICAgaWYoZGVmaW5pdGlvbi5ncmFudFR5cGVzWydhdXRob3JpemF0aW9uX2NvZGUnXSkge1xuICAgICAgICAgICAgaWYoIXNlY3VyaXR5RGVmaW5pdGlvbi5mbG93KSB7XG4gICAgICAgICAgICAgIC8vIGNhbm5vdCBzZXQgaWYgZmxvdyBpcyBhbHJlYWR5IGRlZmluZWRcbiAgICAgICAgICAgICAgdmFyIGF1dGhDb2RlID0gZGVmaW5pdGlvbi5ncmFudFR5cGVzWydhdXRob3JpemF0aW9uX2NvZGUnXTtcbiAgICAgICAgICAgICAgc2VjdXJpdHlEZWZpbml0aW9uLmZsb3cgPSAnYWNjZXNzQ29kZSc7XG4gICAgICAgICAgICAgIHNlY3VyaXR5RGVmaW5pdGlvbi5hdXRob3JpemF0aW9uVXJsID0gYXV0aENvZGUudG9rZW5SZXF1ZXN0RW5kcG9pbnQudXJsO1xuICAgICAgICAgICAgICBzZWN1cml0eURlZmluaXRpb24udG9rZW5VcmwgPSBhdXRoQ29kZS50b2tlbkVuZHBvaW50LnVybDtcbiAgICAgICAgICAgICAgaXNWYWxpZCA9IHRydWU7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfVxuICAgICAgICAgIC8qIGpzaGludCBpZ25vcmU6ZW5kICovXG4gICAgICAgIH1cbiAgICAgIH1cbiAgICAgIGlmKGlzVmFsaWQpIHtcbiAgICAgICAgc3dhZ2dlci5zZWN1cml0eURlZmluaXRpb25zID0gc3dhZ2dlci5zZWN1cml0eURlZmluaXRpb25zIHx8IHt9O1xuICAgICAgICBzd2FnZ2VyLnNlY3VyaXR5RGVmaW5pdGlvbnNbbmFtZV0gPSBzZWN1cml0eURlZmluaXRpb247XG4gICAgICB9XG4gICAgfVxuICB9XG59O1xuXG5Td2FnZ2VyU3BlY0NvbnZlcnRlci5wcm90b3R5cGUuYXBpSW5mbyA9IGZ1bmN0aW9uKG9iaiwgc3dhZ2dlcikge1xuICAvLyBpbmZvIHNlY3Rpb25cbiAgaWYob2JqLmluZm8pIHtcbiAgICB2YXIgaW5mbyA9IG9iai5pbmZvO1xuICAgIHN3YWdnZXIuaW5mbyA9IHt9O1xuXG4gICAgaWYoaW5mby5jb250YWN0KSB7XG4gICAgICBzd2FnZ2VyLmluZm8uY29udGFjdCA9IHt9O1xuICAgICAgc3dhZ2dlci5pbmZvLmNvbnRhY3QuZW1haWwgPSBpbmZvLmNvbnRhY3Q7XG4gICAgfVxuICAgIGlmKGluZm8uZGVzY3JpcHRpb24pIHtcbiAgICAgIHN3YWdnZXIuaW5mby5kZXNjcmlwdGlvbiA9IGluZm8uZGVzY3JpcHRpb247XG4gICAgfVxuICAgIGlmKGluZm8udGl0bGUpIHtcbiAgICAgIHN3YWdnZXIuaW5mby50aXRsZSA9IGluZm8udGl0bGU7XG4gICAgfVxuICAgIGlmKGluZm8udGVybXNPZlNlcnZpY2VVcmwpIHtcbiAgICAgIHN3YWdnZXIuaW5mby50ZXJtc09mU2VydmljZSA9IGluZm8udGVybXNPZlNlcnZpY2VVcmw7XG4gICAgfVxuICAgIGlmKGluZm8ubGljZW5zZSB8fCBpbmZvLmxpY2Vuc2VVcmwpIHtcbiAgICAgIHN3YWdnZXIubGljZW5zZSA9IHt9O1xuICAgICAgaWYoaW5mby5saWNlbnNlKSB7XG4gICAgICAgIHN3YWdnZXIubGljZW5zZS5uYW1lID0gaW5mby5saWNlbnNlO1xuICAgICAgfVxuICAgICAgaWYoaW5mby5saWNlbnNlVXJsKSB7XG4gICAgICAgIHN3YWdnZXIubGljZW5zZS51cmwgPSBpbmZvLmxpY2Vuc2VVcmw7XG4gICAgICB9XG4gICAgfVxuICB9XG4gIGVsc2Uge1xuICAgIHRoaXMud2FybmluZ3MucHVzaCgnbWlzc2luZyBpbmZvIHNlY3Rpb24nKTtcbiAgfVxufTtcblxuU3dhZ2dlclNwZWNDb252ZXJ0ZXIucHJvdG90eXBlLmZpbmlzaCA9IGZ1bmN0aW9uIChjYWxsYmFjaywgb2JqKSB7XG4gIGNhbGxiYWNrKG9iaik7XG59O1xuIiwiJ3VzZSBzdHJpY3QnO1xuXG52YXIgbG9nID0gcmVxdWlyZSgnLi4vaGVscGVycycpLmxvZztcbnZhciBfID0ge1xuICBpc1BsYWluT2JqZWN0OiByZXF1aXJlKCdsb2Rhc2gtY29tcGF0L2xhbmcvaXNQbGFpbk9iamVjdCcpLFxuICBpc1N0cmluZzogcmVxdWlyZSgnbG9kYXNoLWNvbXBhdC9sYW5nL2lzU3RyaW5nJyksXG59O1xuXG52YXIgU2NoZW1hTWFya3VwID0gcmVxdWlyZSgnLi4vc2NoZW1hLW1hcmt1cC5qcycpO1xudmFyIGpzeWFtbCA9IHJlcXVpcmUoJ2pzLXlhbWwnKTtcblxudmFyIE1vZGVsID0gbW9kdWxlLmV4cG9ydHMgPSBmdW5jdGlvbiAobmFtZSwgZGVmaW5pdGlvbiwgbW9kZWxzLCBtb2RlbFByb3BlcnR5TWFjcm8pIHtcbiAgdGhpcy5kZWZpbml0aW9uID0gZGVmaW5pdGlvbiB8fCB7fTtcbiAgdGhpcy5pc0FycmF5ID0gZGVmaW5pdGlvbi50eXBlID09PSAnYXJyYXknO1xuICB0aGlzLm1vZGVscyA9IG1vZGVscyB8fCB7fTtcbiAgdGhpcy5uYW1lID0gbmFtZSB8fCBkZWZpbml0aW9uLnRpdGxlIHx8ICdJbmxpbmUgTW9kZWwnO1xuICB0aGlzLm1vZGVsUHJvcGVydHlNYWNybyA9IG1vZGVsUHJvcGVydHlNYWNybyB8fCBmdW5jdGlvbiAocHJvcGVydHkpIHtcbiAgICByZXR1cm4gcHJvcGVydHkuZGVmYXVsdDtcbiAgfTtcblxuICByZXR1cm4gdGhpcztcbn07XG5cbi8vIE5vdGUhICBUaGlzIGZ1bmN0aW9uIHdpbGwgYmUgcmVtb3ZlZCBpbiAyLjIueCFcbk1vZGVsLnByb3RvdHlwZS5jcmVhdGVKU09OU2FtcGxlID0gTW9kZWwucHJvdG90eXBlLmdldFNhbXBsZVZhbHVlID0gZnVuY3Rpb24gKG1vZGVsc1RvSWdub3JlKSB7XG4gIG1vZGVsc1RvSWdub3JlID0gbW9kZWxzVG9JZ25vcmUgfHwge307XG5cbiAgbW9kZWxzVG9JZ25vcmVbdGhpcy5uYW1lXSA9IHRoaXM7XG5cbiAgLy8gUmVzcG9uc2Ugc3VwcG9ydFxuICBpZiAodGhpcy5leGFtcGxlcyAmJiBfLmlzUGxhaW5PYmplY3QodGhpcy5leGFtcGxlcykgJiYgdGhpcy5leGFtcGxlc1snYXBwbGljYXRpb24vanNvbiddKSB7XG4gICAgdGhpcy5kZWZpbml0aW9uLmV4YW1wbGUgPSB0aGlzLmV4YW1wbGVzWydhcHBsaWNhdGlvbi9qc29uJ107XG5cbiAgICBpZiAoXy5pc1N0cmluZyh0aGlzLmRlZmluaXRpb24uZXhhbXBsZSkpIHtcbiAgICAgIHRoaXMuZGVmaW5pdGlvbi5leGFtcGxlID0ganN5YW1sLnNhZmVMb2FkKHRoaXMuZGVmaW5pdGlvbi5leGFtcGxlKTtcbiAgICB9XG4gIH0gZWxzZSBpZiAoIXRoaXMuZGVmaW5pdGlvbi5leGFtcGxlKSB7XG4gICAgdGhpcy5kZWZpbml0aW9uLmV4YW1wbGUgPSB0aGlzLmV4YW1wbGVzO1xuICB9XG5cbiAgcmV0dXJuIFNjaGVtYU1hcmt1cC5zY2hlbWFUb0pTT04odGhpcy5kZWZpbml0aW9uLCB0aGlzLm1vZGVscywgbW9kZWxzVG9JZ25vcmUsIHRoaXMubW9kZWxQcm9wZXJ0eU1hY3JvKTtcbn07XG5cbk1vZGVsLnByb3RvdHlwZS5nZXRNb2NrU2lnbmF0dXJlID0gZnVuY3Rpb24gKCkge1xuICByZXR1cm4gU2NoZW1hTWFya3VwLnNjaGVtYVRvSFRNTCh0aGlzLm5hbWUsIHRoaXMuZGVmaW5pdGlvbiwgdGhpcy5tb2RlbHMsIHRoaXMubW9kZWxQcm9wZXJ0eU1hY3JvKTtcbn07XG4iLCIndXNlIHN0cmljdCc7XG5cbnZhciBfID0ge1xuICBjbG9uZURlZXA6IHJlcXVpcmUoJ2xvZGFzaC1jb21wYXQvbGFuZy9jbG9uZURlZXAnKSxcbiAgaXNVbmRlZmluZWQ6IHJlcXVpcmUoJ2xvZGFzaC1jb21wYXQvbGFuZy9pc1VuZGVmaW5lZCcpLFxuICBpc0VtcHR5OiByZXF1aXJlKCdsb2Rhc2gtY29tcGF0L2xhbmcvaXNFbXB0eScpLFxuICBpc09iamVjdDogcmVxdWlyZSgnbG9kYXNoLWNvbXBhdC9sYW5nL2lzT2JqZWN0Jylcbn07XG52YXIgaGVscGVycyA9IHJlcXVpcmUoJy4uL2hlbHBlcnMnKTtcbnZhciBNb2RlbCA9IHJlcXVpcmUoJy4vbW9kZWwnKTtcbnZhciBTd2FnZ2VySHR0cCA9IHJlcXVpcmUoJy4uL2h0dHAnKTtcbnZhciBRID0gcmVxdWlyZSgncScpO1xuXG52YXIgT3BlcmF0aW9uID0gbW9kdWxlLmV4cG9ydHMgPSBmdW5jdGlvbiAocGFyZW50LCBzY2hlbWUsIG9wZXJhdGlvbklkLCBodHRwTWV0aG9kLCBwYXRoLCBhcmdzLCBkZWZpbml0aW9ucywgbW9kZWxzLCBjbGllbnRBdXRob3JpemF0aW9ucykge1xuICB2YXIgZXJyb3JzID0gW107XG5cbiAgcGFyZW50ID0gcGFyZW50IHx8IHt9O1xuICBhcmdzID0gYXJncyB8fCB7fTtcblxuICBpZihwYXJlbnQgJiYgcGFyZW50Lm9wdGlvbnMpIHtcbiAgICB0aGlzLmNsaWVudCA9IHBhcmVudC5vcHRpb25zLmNsaWVudCB8fCBudWxsO1xuICAgIHRoaXMucmVxdWVzdEludGVyY2VwdG9yID0gcGFyZW50Lm9wdGlvbnMucmVxdWVzdEludGVyY2VwdG9yIHx8IG51bGw7XG4gICAgdGhpcy5yZXNwb25zZUludGVyY2VwdG9yID0gcGFyZW50Lm9wdGlvbnMucmVzcG9uc2VJbnRlcmNlcHRvciB8fCBudWxsO1xuICAgIHRoaXMucmVxdWVzdEFnZW50ID0gcGFyZW50Lm9wdGlvbnMucmVxdWVzdEFnZW50O1xuICB9XG4gIHRoaXMuYXV0aG9yaXphdGlvbnMgPSBhcmdzLnNlY3VyaXR5O1xuICB0aGlzLmJhc2VQYXRoID0gcGFyZW50LmJhc2VQYXRoIHx8ICcvJztcbiAgdGhpcy5jbGllbnRBdXRob3JpemF0aW9ucyA9IGNsaWVudEF1dGhvcml6YXRpb25zO1xuICB0aGlzLmNvbnN1bWVzID0gYXJncy5jb25zdW1lcyB8fCBwYXJlbnQuY29uc3VtZXMgfHwgWydhcHBsaWNhdGlvbi9qc29uJ107XG4gIHRoaXMucHJvZHVjZXMgPSBhcmdzLnByb2R1Y2VzIHx8IHBhcmVudC5wcm9kdWNlcyB8fCBbJ2FwcGxpY2F0aW9uL2pzb24nXTtcbiAgdGhpcy5kZXByZWNhdGVkID0gYXJncy5kZXByZWNhdGVkO1xuICB0aGlzLmRlc2NyaXB0aW9uID0gYXJncy5kZXNjcmlwdGlvbjtcbiAgdGhpcy5ob3N0ID0gcGFyZW50Lmhvc3Q7XG4gIHRoaXMubWV0aG9kID0gKGh0dHBNZXRob2QgfHwgZXJyb3JzLnB1c2goJ09wZXJhdGlvbiAnICsgb3BlcmF0aW9uSWQgKyAnIGlzIG1pc3NpbmcgbWV0aG9kLicpKTtcbiAgdGhpcy5tb2RlbHMgPSBtb2RlbHMgfHwge307XG4gIHRoaXMubmlja25hbWUgPSAob3BlcmF0aW9uSWQgfHwgZXJyb3JzLnB1c2goJ09wZXJhdGlvbnMgbXVzdCBoYXZlIGEgbmlja25hbWUuJykpO1xuICB0aGlzLm9wZXJhdGlvbiA9IGFyZ3M7XG4gIHRoaXMub3BlcmF0aW9ucyA9IHt9O1xuICB0aGlzLnBhcmFtZXRlcnMgPSBhcmdzICE9PSBudWxsID8gKGFyZ3MucGFyYW1ldGVycyB8fCBbXSkgOiB7fTtcbiAgdGhpcy5wYXJlbnQgPSBwYXJlbnQ7XG4gIHRoaXMucGF0aCA9IChwYXRoIHx8IGVycm9ycy5wdXNoKCdPcGVyYXRpb24gJyArIHRoaXMubmlja25hbWUgKyAnIGlzIG1pc3NpbmcgcGF0aC4nKSk7XG4gIHRoaXMucmVzcG9uc2VzID0gKGFyZ3MucmVzcG9uc2VzIHx8IHt9KTtcbiAgdGhpcy5zY2hlbWUgPSBzY2hlbWUgfHwgcGFyZW50LnNjaGVtZSB8fCAnaHR0cCc7XG4gIHRoaXMuc2NoZW1lcyA9IGFyZ3Muc2NoZW1lcyB8fCBwYXJlbnQuc2NoZW1lcztcbiAgdGhpcy5zZWN1cml0eSA9IGFyZ3Muc2VjdXJpdHkgfHwgcGFyZW50LnNlY3VyaXR5O1xuICB0aGlzLnN1bW1hcnkgPSBhcmdzLnN1bW1hcnkgfHwgJyc7XG4gIHRoaXMudGltZW91dCA9IHBhcmVudC50aW1lb3V0O1xuICB0aGlzLnR5cGUgPSBudWxsO1xuICB0aGlzLnVzZUpRdWVyeSA9IHBhcmVudC51c2VKUXVlcnk7XG4gIHRoaXMuanF1ZXJ5QWpheENhY2hlID0gcGFyZW50LmpxdWVyeUFqYXhDYWNoZTtcbiAgdGhpcy5lbmFibGVDb29raWVzID0gcGFyZW50LmVuYWJsZUNvb2tpZXM7XG5cbiAgdmFyIGtleTtcblxuICBpZighdGhpcy5ob3N0KSB7XG4gICAgaWYodHlwZW9mIHdpbmRvdyAhPT0gJ3VuZGVmaW5lZCcpIHtcbiAgICAgIHRoaXMuaG9zdCA9IHdpbmRvdy5sb2NhdGlvbi5ob3N0O1xuICAgIH1cbiAgICBlbHNlIHtcbiAgICAgIHRoaXMuaG9zdCA9ICdsb2NhbGhvc3QnO1xuICAgIH1cbiAgfVxuICB0aGlzLnBhcmFtZXRlck1hY3JvID0gcGFyZW50LnBhcmFtZXRlck1hY3JvIHx8IGZ1bmN0aW9uIChvcGVyYXRpb24sIHBhcmFtZXRlcikge1xuICAgIHJldHVybiBwYXJhbWV0ZXIuZGVmYXVsdDtcbiAgfTtcblxuICB0aGlzLmlubGluZU1vZGVscyA9IFtdO1xuXG4gIGlmKHRoaXMuYmFzZVBhdGggIT09ICcvJyAmJiB0aGlzLmJhc2VQYXRoLnNsaWNlKC0xKSA9PT0gJy8nKSB7XG4gICAgdGhpcy5iYXNlUGF0aCA9IHRoaXMuYmFzZVBhdGguc2xpY2UoMCwgLTEpO1xuICB9XG5cbiAgaWYgKHR5cGVvZiB0aGlzLmRlcHJlY2F0ZWQgPT09ICdzdHJpbmcnKSB7XG4gICAgc3dpdGNoKHRoaXMuZGVwcmVjYXRlZC50b0xvd2VyQ2FzZSgpKSB7XG4gICAgICBjYXNlICd0cnVlJzogY2FzZSAneWVzJzogY2FzZSAnMSc6IHtcbiAgICAgICAgdGhpcy5kZXByZWNhdGVkID0gdHJ1ZTtcbiAgICAgICAgYnJlYWs7XG4gICAgICB9XG5cbiAgICAgIGNhc2UgJ2ZhbHNlJzogY2FzZSAnbm8nOiBjYXNlICcwJzogY2FzZSBudWxsOiB7XG4gICAgICAgIHRoaXMuZGVwcmVjYXRlZCA9IGZhbHNlO1xuICAgICAgICBicmVhaztcbiAgICAgIH1cblxuICAgICAgZGVmYXVsdDogdGhpcy5kZXByZWNhdGVkID0gQm9vbGVhbih0aGlzLmRlcHJlY2F0ZWQpO1xuICAgIH1cbiAgfVxuXG4gIHZhciBpLCBtb2RlbDtcblxuICBpZiAoZGVmaW5pdGlvbnMpIHtcbiAgICAvLyBhZGQgdG8gZ2xvYmFsIG1vZGVsc1xuICAgIGZvciAoa2V5IGluIGRlZmluaXRpb25zKSB7XG4gICAgICBtb2RlbCA9IG5ldyBNb2RlbChrZXksIGRlZmluaXRpb25zW2tleV0sIHRoaXMubW9kZWxzLCBwYXJlbnQubW9kZWxQcm9wZXJ0eU1hY3JvKTtcblxuICAgICAgaWYgKG1vZGVsKSB7XG4gICAgICAgIHRoaXMubW9kZWxzW2tleV0gPSBtb2RlbDtcbiAgICAgIH1cbiAgICB9XG4gIH1cbiAgZWxzZSB7XG4gICAgZGVmaW5pdGlvbnMgPSB7fTtcbiAgfVxuXG4gIGZvciAoaSA9IDA7IGkgPCB0aGlzLnBhcmFtZXRlcnMubGVuZ3RoOyBpKyspIHtcbiAgICB2YXIgZCwgcGFyYW0gPSB0aGlzLnBhcmFtZXRlcnNbaV07XG5cbiAgICAvLyBBbGxvdyBtYWNybyB0byBzZXQgdGhlIGRlZmF1bHQgdmFsdWVcbiAgICBwYXJhbS5kZWZhdWx0ID0gdGhpcy5wYXJhbWV0ZXJNYWNybyh0aGlzLCBwYXJhbSk7XG5cbiAgICBpZiAocGFyYW0udHlwZSA9PT0gJ2FycmF5Jykge1xuICAgICAgcGFyYW0uaXNMaXN0ID0gdHJ1ZTtcbiAgICAgIHBhcmFtLmFsbG93TXVsdGlwbGUgPSB0cnVlO1xuICAgIH1cblxuICAgIHZhciBpbm5lclR5cGUgPSB0aGlzLmdldFR5cGUocGFyYW0pO1xuXG4gICAgaWYgKGlubmVyVHlwZSAmJiBpbm5lclR5cGUudG9TdHJpbmcoKS50b0xvd2VyQ2FzZSgpID09PSAnYm9vbGVhbicpIHtcbiAgICAgIHBhcmFtLmFsbG93YWJsZVZhbHVlcyA9IHt9O1xuICAgICAgcGFyYW0uaXNMaXN0ID0gdHJ1ZTtcbiAgICAgIHBhcmFtWydlbnVtJ10gPSBbdHJ1ZSwgZmFsc2VdOyAvLyB1c2UgYWN0dWFsIHByaW1pdGl2ZXNcbiAgICB9XG5cbiAgICBmb3Ioa2V5IGluIHBhcmFtKSB7XG4gICAgICBoZWxwZXJzLmV4dHJhY3RFeHRlbnNpb25zKGtleSwgcGFyYW0pO1xuICAgIH1cbiAgICBpZih0eXBlb2YgcGFyYW1bJ3gtZXhhbXBsZSddICE9PSAndW5kZWZpbmVkJykge1xuICAgICAgZCA9IHBhcmFtWyd4LWV4YW1wbGUnXTtcbiAgICAgIHBhcmFtLmRlZmF1bHQgPSBkO1xuICAgIH1cbiAgICBpZihwYXJhbVsneC1leGFtcGxlcyddKSB7XG4gICAgICBkID0gcGFyYW1bJ3gtZXhhbXBsZXMnXS5kZWZhdWx0O1xuICAgICAgaWYodHlwZW9mIGQgIT09ICd1bmRlZmluZWQnKSB7XG4gICAgICAgIHBhcmFtLmRlZmF1bHQgPSBkO1xuICAgICAgfVxuICAgIH1cblxuICAgIHZhciBlbnVtVmFsdWVzID0gcGFyYW1bJ2VudW0nXSB8fCAocGFyYW0uaXRlbXMgJiYgcGFyYW0uaXRlbXNbJ2VudW0nXSk7XG5cbiAgICBpZiAodHlwZW9mIGVudW1WYWx1ZXMgIT09ICd1bmRlZmluZWQnKSB7XG4gICAgICB2YXIgaWQ7XG5cbiAgICAgIHBhcmFtLmFsbG93YWJsZVZhbHVlcyA9IHt9O1xuICAgICAgcGFyYW0uYWxsb3dhYmxlVmFsdWVzLnZhbHVlcyA9IFtdO1xuICAgICAgcGFyYW0uYWxsb3dhYmxlVmFsdWVzLmRlc2NyaXB0aXZlVmFsdWVzID0gW107XG5cbiAgICAgIGZvciAoaWQgPSAwOyBpZCA8IGVudW1WYWx1ZXMubGVuZ3RoOyBpZCsrKSB7XG4gICAgICAgIHZhciB2YWx1ZSA9IGVudW1WYWx1ZXNbaWRdO1xuICAgICAgICB2YXIgaXNEZWZhdWx0ID0gKHZhbHVlID09PSBwYXJhbS5kZWZhdWx0IHx8IHZhbHVlKycnID09PSBwYXJhbS5kZWZhdWx0KTtcblxuICAgICAgICBwYXJhbS5hbGxvd2FibGVWYWx1ZXMudmFsdWVzLnB1c2godmFsdWUpO1xuICAgICAgICAvLyBBbHdheXMgaGF2ZSBzdHJpbmcgZm9yIGRlc2NyaXB0aXZlIHZhbHVlcy4uLi5cbiAgICAgICAgcGFyYW0uYWxsb3dhYmxlVmFsdWVzLmRlc2NyaXB0aXZlVmFsdWVzLnB1c2goe3ZhbHVlIDogdmFsdWUrJycsIGlzRGVmYXVsdDogaXNEZWZhdWx0fSk7XG4gICAgICB9XG4gICAgfVxuXG4gICAgaWYgKHBhcmFtLnR5cGUgPT09ICdhcnJheScpIHtcbiAgICAgIGlubmVyVHlwZSA9IFtpbm5lclR5cGVdO1xuXG4gICAgICBpZiAodHlwZW9mIHBhcmFtLmFsbG93YWJsZVZhbHVlcyA9PT0gJ3VuZGVmaW5lZCcpIHtcbiAgICAgICAgLy8gY2FuJ3Qgc2hvdyBhcyBhIGxpc3QgaWYgbm8gdmFsdWVzIHRvIHNlbGVjdCBmcm9tXG4gICAgICAgIGRlbGV0ZSBwYXJhbS5pc0xpc3Q7XG4gICAgICAgIGRlbGV0ZSBwYXJhbS5hbGxvd011bHRpcGxlO1xuICAgICAgfVxuICAgIH1cblxuICAgIHBhcmFtLm1vZGVsU2lnbmF0dXJlID0ge3R5cGU6IGlubmVyVHlwZSwgZGVmaW5pdGlvbnM6IHRoaXMubW9kZWxzfTtcbiAgICBwYXJhbS5zaWduYXR1cmUgPSB0aGlzLmdldE1vZGVsU2lnbmF0dXJlKGlubmVyVHlwZSwgdGhpcy5tb2RlbHMpLnRvU3RyaW5nKCk7XG4gICAgcGFyYW0uc2FtcGxlSlNPTiA9IHRoaXMuZ2V0TW9kZWxTYW1wbGVKU09OKGlubmVyVHlwZSwgdGhpcy5tb2RlbHMpO1xuICAgIHBhcmFtLnJlc3BvbnNlQ2xhc3NTaWduYXR1cmUgPSBwYXJhbS5zaWduYXR1cmU7XG4gIH1cblxuICB2YXIga2V5bmFtZSwgZGVmYXVsdFJlc3BvbnNlQ29kZSwgcmVzcG9uc2UsIHJlc3BvbnNlcyA9IHRoaXMucmVzcG9uc2VzO1xuXG4gIGlmIChyZXNwb25zZXNbJzIwMCddKSB7XG4gICAgcmVzcG9uc2UgPSByZXNwb25zZXNbJzIwMCddO1xuICAgIGRlZmF1bHRSZXNwb25zZUNvZGUgPSAnMjAwJztcbiAgfSBlbHNlIGlmIChyZXNwb25zZXNbJzIwMSddKSB7XG4gICAgcmVzcG9uc2UgPSByZXNwb25zZXNbJzIwMSddO1xuICAgIGRlZmF1bHRSZXNwb25zZUNvZGUgPSAnMjAxJztcbiAgfSBlbHNlIGlmIChyZXNwb25zZXNbJzIwMiddKSB7XG4gICAgcmVzcG9uc2UgPSByZXNwb25zZXNbJzIwMiddO1xuICAgIGRlZmF1bHRSZXNwb25zZUNvZGUgPSAnMjAyJztcbiAgfSBlbHNlIGlmIChyZXNwb25zZXNbJzIwMyddKSB7XG4gICAgcmVzcG9uc2UgPSByZXNwb25zZXNbJzIwMyddO1xuICAgIGRlZmF1bHRSZXNwb25zZUNvZGUgPSAnMjAzJztcbiAgfSBlbHNlIGlmIChyZXNwb25zZXNbJzIwNCddKSB7XG4gICAgcmVzcG9uc2UgPSByZXNwb25zZXNbJzIwNCddO1xuICAgIGRlZmF1bHRSZXNwb25zZUNvZGUgPSAnMjA0JztcbiAgfSBlbHNlIGlmIChyZXNwb25zZXNbJzIwNSddKSB7XG4gICAgcmVzcG9uc2UgPSByZXNwb25zZXNbJzIwNSddO1xuICAgIGRlZmF1bHRSZXNwb25zZUNvZGUgPSAnMjA1JztcbiAgfSBlbHNlIGlmIChyZXNwb25zZXNbJzIwNiddKSB7XG4gICAgcmVzcG9uc2UgPSByZXNwb25zZXNbJzIwNiddO1xuICAgIGRlZmF1bHRSZXNwb25zZUNvZGUgPSAnMjA2JztcbiAgfSBlbHNlIGlmIChyZXNwb25zZXNbJ2RlZmF1bHQnXSkge1xuICAgIHJlc3BvbnNlID0gcmVzcG9uc2VzWydkZWZhdWx0J107XG4gICAgZGVmYXVsdFJlc3BvbnNlQ29kZSA9ICdkZWZhdWx0JztcbiAgfVxuXG4gIGZvcihrZXluYW1lIGluIHJlc3BvbnNlcykge1xuICAgIGhlbHBlcnMuZXh0cmFjdEV4dGVuc2lvbnMoa2V5bmFtZSwgcmVzcG9uc2VzKTtcbiAgICBpZih0eXBlb2Yga2V5bmFtZSA9PT0gJ3N0cmluZycgJiYga2V5bmFtZS5pbmRleE9mKCd4LScpID09PSAtMSkge1xuICAgICAgdmFyIHJlc3BvbnNlT2JqZWN0ID0gcmVzcG9uc2VzW2tleW5hbWVdO1xuICAgICAgaWYodHlwZW9mIHJlc3BvbnNlT2JqZWN0ID09PSAnb2JqZWN0JyAmJiB0eXBlb2YgcmVzcG9uc2VPYmplY3QuaGVhZGVycyA9PT0gJ29iamVjdCcpIHtcbiAgICAgICAgdmFyIGhlYWRlcnMgPSByZXNwb25zZU9iamVjdC5oZWFkZXJzO1xuICAgICAgICBmb3IodmFyIGhlYWRlck5hbWUgaW4gaGVhZGVycykge1xuICAgICAgICAgIHZhciBoZWFkZXIgPSBoZWFkZXJzW2hlYWRlck5hbWVdO1xuICAgICAgICAgIGlmKHR5cGVvZiBoZWFkZXIgPT09ICdvYmplY3QnKSB7XG4gICAgICAgICAgICBmb3IodmFyIGhlYWRlcktleSBpbiBoZWFkZXIpIHtcbiAgICAgICAgICAgICAgaGVscGVycy5leHRyYWN0RXh0ZW5zaW9ucyhoZWFkZXJLZXksIGhlYWRlcik7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgaWYgKHJlc3BvbnNlKSB7XG4gICAgZm9yKGtleW5hbWUgaW4gcmVzcG9uc2UpIHtcbiAgICAgIGhlbHBlcnMuZXh0cmFjdEV4dGVuc2lvbnMoa2V5bmFtZSwgcmVzcG9uc2UpO1xuICAgIH1cbiAgfVxuXG4gIGlmIChyZXNwb25zZSAmJiByZXNwb25zZS5zY2hlbWEpIHtcbiAgICB2YXIgcmVzb2x2ZWRNb2RlbCA9IHRoaXMucmVzb2x2ZU1vZGVsKHJlc3BvbnNlLnNjaGVtYSwgZGVmaW5pdGlvbnMpO1xuICAgIHZhciBzdWNjZXNzUmVzcG9uc2U7XG5cbiAgICBkZWxldGUgcmVzcG9uc2VzW2RlZmF1bHRSZXNwb25zZUNvZGVdO1xuXG4gICAgaWYgKHJlc29sdmVkTW9kZWwpIHtcbiAgICAgIHRoaXMuc3VjY2Vzc1Jlc3BvbnNlID0ge307XG4gICAgICBzdWNjZXNzUmVzcG9uc2UgPSB0aGlzLnN1Y2Nlc3NSZXNwb25zZVtkZWZhdWx0UmVzcG9uc2VDb2RlXSA9IHJlc29sdmVkTW9kZWw7XG4gICAgfSBlbHNlIGlmICghcmVzcG9uc2Uuc2NoZW1hLnR5cGUgfHwgcmVzcG9uc2Uuc2NoZW1hLnR5cGUgPT09ICdvYmplY3QnIHx8IHJlc3BvbnNlLnNjaGVtYS50eXBlID09PSAnYXJyYXknKSB7XG4gICAgICAvLyBJbmxpbmUgbW9kZWxcbiAgICAgIHRoaXMuc3VjY2Vzc1Jlc3BvbnNlID0ge307XG4gICAgICBzdWNjZXNzUmVzcG9uc2UgPSB0aGlzLnN1Y2Nlc3NSZXNwb25zZVtkZWZhdWx0UmVzcG9uc2VDb2RlXSA9IG5ldyBNb2RlbCh1bmRlZmluZWQsIHJlc3BvbnNlLnNjaGVtYSB8fCB7fSwgdGhpcy5tb2RlbHMsIHBhcmVudC5tb2RlbFByb3BlcnR5TWFjcm8pO1xuICAgIH0gZWxzZSB7XG4gICAgICAvLyBQcmltaXRpdmVcbiAgICAgIHRoaXMuc3VjY2Vzc1Jlc3BvbnNlID0ge307XG4gICAgICBzdWNjZXNzUmVzcG9uc2UgPSB0aGlzLnN1Y2Nlc3NSZXNwb25zZVtkZWZhdWx0UmVzcG9uc2VDb2RlXSA9IHJlc3BvbnNlLnNjaGVtYTtcbiAgICB9XG5cbiAgICBpZiAoc3VjY2Vzc1Jlc3BvbnNlKSB7XG4gICAgICBzdWNjZXNzUmVzcG9uc2UudmVuZG9yRXh0ZW5zaW9ucyA9IHJlc3BvbnNlLnZlbmRvckV4dGVuc2lvbnM7XG4gICAgICAvLyBBdHRhY2ggcmVzcG9uc2UgcHJvcGVydGllc1xuICAgICAgaWYgKHJlc3BvbnNlLmRlc2NyaXB0aW9uKSB7XG4gICAgICAgIHN1Y2Nlc3NSZXNwb25zZS5kZXNjcmlwdGlvbiA9IHJlc3BvbnNlLmRlc2NyaXB0aW9uO1xuICAgICAgfVxuXG4gICAgICBpZiAocmVzcG9uc2UuZXhhbXBsZXMpIHtcbiAgICAgICAgc3VjY2Vzc1Jlc3BvbnNlLmV4YW1wbGVzID0gcmVzcG9uc2UuZXhhbXBsZXM7XG4gICAgICB9XG5cbiAgICAgIGlmIChyZXNwb25zZS5oZWFkZXJzKSB7XG4gICAgICAgIHN1Y2Nlc3NSZXNwb25zZS5oZWFkZXJzID0gcmVzcG9uc2UuaGVhZGVycztcbiAgICAgIH1cbiAgICB9XG5cbiAgICB0aGlzLnR5cGUgPSByZXNwb25zZTtcbiAgfVxuXG4gIGlmIChlcnJvcnMubGVuZ3RoID4gMCkge1xuICAgIGlmICh0aGlzLnJlc291cmNlICYmIHRoaXMucmVzb3VyY2UuYXBpICYmIHRoaXMucmVzb3VyY2UuYXBpLmZhaWwpIHtcbiAgICAgIHRoaXMucmVzb3VyY2UuYXBpLmZhaWwoZXJyb3JzKTtcbiAgICB9XG4gIH1cblxuICByZXR1cm4gdGhpcztcbn07XG5cbk9wZXJhdGlvbi5wcm90b3R5cGUuaXNEZWZhdWx0QXJyYXlJdGVtVmFsdWUgPSBmdW5jdGlvbih2YWx1ZSwgcGFyYW0pIHtcbiAgaWYgKHBhcmFtLmRlZmF1bHQgJiYgQXJyYXkuaXNBcnJheShwYXJhbS5kZWZhdWx0KSkge1xuICAgIHJldHVybiBwYXJhbS5kZWZhdWx0LmluZGV4T2YodmFsdWUpICE9PSAtMTtcbiAgfVxuICByZXR1cm4gdmFsdWUgPT09IHBhcmFtLmRlZmF1bHQ7XG59O1xuXG5PcGVyYXRpb24ucHJvdG90eXBlLmdldFR5cGUgPSBmdW5jdGlvbiAocGFyYW0pIHtcbiAgdmFyIHR5cGUgPSBwYXJhbS50eXBlO1xuICB2YXIgZm9ybWF0ID0gcGFyYW0uZm9ybWF0O1xuICB2YXIgaXNBcnJheSA9IGZhbHNlO1xuICB2YXIgc3RyO1xuXG4gIGlmICh0eXBlID09PSAnaW50ZWdlcicgJiYgZm9ybWF0ID09PSAnaW50MzInKSB7XG4gICAgc3RyID0gJ2ludGVnZXInO1xuICB9IGVsc2UgaWYgKHR5cGUgPT09ICdpbnRlZ2VyJyAmJiBmb3JtYXQgPT09ICdpbnQ2NCcpIHtcbiAgICBzdHIgPSAnbG9uZyc7XG4gIH0gZWxzZSBpZiAodHlwZSA9PT0gJ2ludGVnZXInKSB7XG4gICAgc3RyID0gJ2ludGVnZXInO1xuICB9IGVsc2UgaWYgKHR5cGUgPT09ICdzdHJpbmcnKSB7XG4gICAgaWYgKGZvcm1hdCA9PT0gJ2RhdGUtdGltZScpIHtcbiAgICAgIHN0ciA9ICdkYXRlLXRpbWUnO1xuICAgIH0gZWxzZSBpZiAoZm9ybWF0ID09PSAnZGF0ZScpIHtcbiAgICAgIHN0ciA9ICdkYXRlJztcbiAgICB9IGVsc2Uge1xuICAgICAgc3RyID0gJ3N0cmluZyc7XG4gICAgfVxuICB9IGVsc2UgaWYgKHR5cGUgPT09ICdudW1iZXInICYmIGZvcm1hdCA9PT0gJ2Zsb2F0Jykge1xuICAgIHN0ciA9ICdmbG9hdCc7XG4gIH0gZWxzZSBpZiAodHlwZSA9PT0gJ251bWJlcicgJiYgZm9ybWF0ID09PSAnZG91YmxlJykge1xuICAgIHN0ciA9ICdkb3VibGUnO1xuICB9IGVsc2UgaWYgKHR5cGUgPT09ICdudW1iZXInKSB7XG4gICAgc3RyID0gJ2RvdWJsZSc7XG4gIH0gZWxzZSBpZiAodHlwZSA9PT0gJ2Jvb2xlYW4nKSB7XG4gICAgc3RyID0gJ2Jvb2xlYW4nO1xuICB9IGVsc2UgaWYgKHR5cGUgPT09ICdhcnJheScpIHtcbiAgICBpc0FycmF5ID0gdHJ1ZTtcblxuICAgIGlmIChwYXJhbS5pdGVtcykge1xuICAgICAgc3RyID0gdGhpcy5nZXRUeXBlKHBhcmFtLml0ZW1zKTtcbiAgICB9XG4gIH0gZWxzZSBpZiAodHlwZSA9PT0gJ2ZpbGUnKSB7XG4gICAgc3RyID0gJ2ZpbGUnO1xuICB9XG5cbiAgaWYgKHBhcmFtLiRyZWYpIHtcbiAgICBzdHIgPSBoZWxwZXJzLnNpbXBsZVJlZihwYXJhbS4kcmVmKTtcbiAgfVxuXG4gIHZhciBzY2hlbWEgPSBwYXJhbS5zY2hlbWE7XG5cbiAgaWYgKHNjaGVtYSkge1xuICAgIHZhciByZWYgPSBzY2hlbWEuJHJlZjtcblxuICAgIGlmIChyZWYpIHtcbiAgICAgIHJlZiA9IGhlbHBlcnMuc2ltcGxlUmVmKHJlZik7XG5cbiAgICAgIGlmIChpc0FycmF5KSB7XG4gICAgICAgIHJldHVybiBbIHJlZiBdO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgcmV0dXJuIHJlZjtcbiAgICAgIH1cbiAgICB9IGVsc2Uge1xuICAgICAgLy8gSWYgaW5saW5lIHNjaGVtYSwgd2UgYWRkIGl0IG91ciBpbnRlcmFsIGhhc2ggLT4gd2hpY2ggZ2l2ZXMgdXMgaXQncyBJRCAoaW50KVxuICAgICAgaWYoc2NoZW1hLnR5cGUgPT09ICdvYmplY3QnKSB7XG4gICAgICAgIHJldHVybiB0aGlzLmFkZElubGluZU1vZGVsKHNjaGVtYSk7XG4gICAgICB9XG4gICAgICByZXR1cm4gdGhpcy5nZXRUeXBlKHNjaGVtYSk7XG4gICAgfVxuICB9XG4gIGlmIChpc0FycmF5KSB7XG4gICAgcmV0dXJuIFsgc3RyIF07XG4gIH0gZWxzZSB7XG4gICAgcmV0dXJuIHN0cjtcbiAgfVxufTtcblxuLyoqXG4gKiBhZGRzIGFuIGlubGluZSBzY2hlbWEgKG1vZGVsKSB0byBhIGhhc2gsIHdoZXJlIHdlIGNhbiByZWYgaXQgbGF0ZXJcbiAqIEBwYXJhbSB7b2JqZWN0fSBzY2hlbWEgYSBzY2hlbWFcbiAqIEByZXR1cm4ge251bWJlcn0gdGhlIElEIG9mIHRoZSBzY2hlbWEgYmVpbmcgYWRkZWQsIG9yIG51bGxcbiAqKi9cbk9wZXJhdGlvbi5wcm90b3R5cGUuYWRkSW5saW5lTW9kZWwgPSBmdW5jdGlvbiAoc2NoZW1hKSB7XG4gIHZhciBsZW4gPSB0aGlzLmlubGluZU1vZGVscy5sZW5ndGg7XG4gIHZhciBtb2RlbCA9IHRoaXMucmVzb2x2ZU1vZGVsKHNjaGVtYSwge30pO1xuICBpZihtb2RlbCkge1xuICAgIHRoaXMuaW5saW5lTW9kZWxzLnB1c2gobW9kZWwpO1xuICAgIHJldHVybiAnSW5saW5lIE1vZGVsICcrbGVuOyAvLyByZXR1cm4gc3RyaW5nIHJlZiBvZiB0aGUgaW5saW5lIG1vZGVsICh1c2VkIHdpdGggI2dldElubGluZU1vZGVsKVxuICB9XG4gIHJldHVybiBudWxsOyAvLyByZXBvcnQgZXJyb3JzP1xufTtcblxuLyoqXG4gKiBnZXRzIHRoZSBpbnRlcm5hbCByZWYgdG8gYW4gaW5saW5lIG1vZGVsXG4gKiBAcGFyYW0ge3N0cmluZ30gaW5saW5lX3N0ciBhIHN0cmluZyByZWZlcmVuY2UgdG8gYW4gaW5saW5lIG1vZGVsXG4gKiBAcmV0dXJuIHtNb2RlbH0gdGhlIG1vZGVsIGJlaW5nIHJlZmVyZW5jZWQuIE9yIG51bGxcbiAqKi9cbk9wZXJhdGlvbi5wcm90b3R5cGUuZ2V0SW5saW5lTW9kZWwgPSBmdW5jdGlvbihpbmxpbmVTdHIpIHtcbiAgaWYoL15JbmxpbmUgTW9kZWwgXFxkKyQvLnRlc3QoaW5saW5lU3RyKSkge1xuICAgIHZhciBpZCA9IHBhcnNlSW50KGlubGluZVN0ci5zdWJzdHIoJ0lubGluZSBNb2RlbCcubGVuZ3RoKS50cmltKCksMTApOyAvL1xuICAgIHZhciBtb2RlbCA9IHRoaXMuaW5saW5lTW9kZWxzW2lkXTtcbiAgICByZXR1cm4gbW9kZWw7XG4gIH1cbiAgLy8gSSdtIHJldHVybmluZyBudWxsIGhlcmUsIHNob3VsZCBJIHJhdGhlciB0aHJvdyBhbiBlcnJvcj9cbiAgcmV0dXJuIG51bGw7XG59O1xuXG5PcGVyYXRpb24ucHJvdG90eXBlLnJlc29sdmVNb2RlbCA9IGZ1bmN0aW9uIChzY2hlbWEsIGRlZmluaXRpb25zKSB7XG4gIGlmICh0eXBlb2Ygc2NoZW1hLiRyZWYgIT09ICd1bmRlZmluZWQnKSB7XG4gICAgdmFyIHJlZiA9IHNjaGVtYS4kcmVmO1xuXG4gICAgaWYgKHJlZi5pbmRleE9mKCcjL2RlZmluaXRpb25zLycpID09PSAwKSB7XG4gICAgICByZWYgPSByZWYuc3Vic3RyaW5nKCcjL2RlZmluaXRpb25zLycubGVuZ3RoKTtcbiAgICB9XG5cbiAgICBpZiAoZGVmaW5pdGlvbnNbcmVmXSkge1xuICAgICAgcmV0dXJuIG5ldyBNb2RlbChyZWYsIGRlZmluaXRpb25zW3JlZl0sIHRoaXMubW9kZWxzLCB0aGlzLnBhcmVudC5tb2RlbFByb3BlcnR5TWFjcm8pO1xuICAgIH1cbiAgLy8gc2NoZW1hIG11c3QgYXQgbGVhc3QgYmUgYW4gb2JqZWN0IHRvIGdldCByZXNvbHZlZCB0byBhbiBpbmxpbmUgTW9kZWxcbiAgfSBlbHNlIGlmIChzY2hlbWEgJiYgdHlwZW9mIHNjaGVtYSA9PT0gJ29iamVjdCcgJiZcbiAgICAgICAgICAgIChzY2hlbWEudHlwZSA9PT0gJ29iamVjdCcgfHwgXy5pc1VuZGVmaW5lZChzY2hlbWEudHlwZSkpKSB7XG4gICAgcmV0dXJuIG5ldyBNb2RlbCh1bmRlZmluZWQsIHNjaGVtYSwgdGhpcy5tb2RlbHMsIHRoaXMucGFyZW50Lm1vZGVsUHJvcGVydHlNYWNybyk7XG4gIH1cblxuICByZXR1cm4gbnVsbDtcbn07XG5cbk9wZXJhdGlvbi5wcm90b3R5cGUuaGVscCA9IGZ1bmN0aW9uIChkb250UHJpbnQpIHtcbiAgdmFyIG91dCA9IHRoaXMubmlja25hbWUgKyAnOiAnICsgdGhpcy5zdW1tYXJ5ICsgJ1xcbic7XG5cbiAgZm9yICh2YXIgaSA9IDA7IGkgPCB0aGlzLnBhcmFtZXRlcnMubGVuZ3RoOyBpKyspIHtcbiAgICB2YXIgcGFyYW0gPSB0aGlzLnBhcmFtZXRlcnNbaV07XG4gICAgdmFyIHR5cGVJbmZvID0gcGFyYW0uc2lnbmF0dXJlO1xuXG4gICAgb3V0ICs9ICdcXG4gICogJyArIHBhcmFtLm5hbWUgKyAnICgnICsgdHlwZUluZm8gKyAnKTogJyArIHBhcmFtLmRlc2NyaXB0aW9uO1xuICB9XG5cbiAgaWYgKHR5cGVvZiBkb250UHJpbnQgPT09ICd1bmRlZmluZWQnKSB7XG4gICAgaGVscGVycy5sb2cob3V0KTtcbiAgfVxuXG4gIHJldHVybiBvdXQ7XG59O1xuXG5PcGVyYXRpb24ucHJvdG90eXBlLmdldE1vZGVsU2lnbmF0dXJlID0gZnVuY3Rpb24gKHR5cGUsIGRlZmluaXRpb25zKSB7XG4gIHZhciBpc1ByaW1pdGl2ZSwgbGlzdFR5cGU7XG5cbiAgaWYgKHR5cGUgaW5zdGFuY2VvZiBBcnJheSkge1xuICAgIGxpc3RUeXBlID0gdHJ1ZTtcbiAgICB0eXBlID0gdHlwZVswXTtcbiAgfVxuXG4gIC8vIENvbnZlcnQgdW5kZWZpbmVkIHRvIHN0cmluZyBvZiAndW5kZWZpbmVkJ1xuICBpZiAodHlwZW9mIHR5cGUgPT09ICd1bmRlZmluZWQnKSB7XG4gICAgdHlwZSA9ICd1bmRlZmluZWQnO1xuICAgIGlzUHJpbWl0aXZlID0gdHJ1ZTtcblxuICB9IGVsc2UgaWYgKGRlZmluaXRpb25zW3R5cGVdKXtcbiAgICAvLyBhIG1vZGVsIGRlZiBleGlzdHM/XG4gICAgdHlwZSA9IGRlZmluaXRpb25zW3R5cGVdOyAvKiBNb2RlbCAqL1xuICAgIGlzUHJpbWl0aXZlID0gZmFsc2U7XG5cbiAgfSBlbHNlIGlmICh0aGlzLmdldElubGluZU1vZGVsKHR5cGUpKSB7XG4gICAgdHlwZSA9IHRoaXMuZ2V0SW5saW5lTW9kZWwodHlwZSk7IC8qIE1vZGVsICovXG4gICAgaXNQcmltaXRpdmUgPSBmYWxzZTtcblxuICB9IGVsc2Uge1xuICAgIC8vIFdlIGRlZmF1bHQgdG8gcHJpbWl0aXZlXG4gICAgaXNQcmltaXRpdmUgPSB0cnVlO1xuICB9XG5cbiAgaWYgKGlzUHJpbWl0aXZlKSB7XG4gICAgaWYgKGxpc3RUeXBlKSB7XG4gICAgICByZXR1cm4gJ0FycmF5WycgKyB0eXBlICsgJ10nO1xuICAgIH0gZWxzZSB7XG4gICAgICByZXR1cm4gdHlwZS50b1N0cmluZygpO1xuICAgIH1cbiAgfSBlbHNlIHtcbiAgICBpZiAobGlzdFR5cGUpIHtcbiAgICAgIHJldHVybiAnQXJyYXlbJyArIHR5cGUuZ2V0TW9ja1NpZ25hdHVyZSgpICsgJ10nO1xuICAgIH0gZWxzZSB7XG4gICAgICByZXR1cm4gdHlwZS5nZXRNb2NrU2lnbmF0dXJlKCk7XG4gICAgfVxuICB9XG59O1xuXG5PcGVyYXRpb24ucHJvdG90eXBlLnN1cHBvcnRIZWFkZXJQYXJhbXMgPSBmdW5jdGlvbiAoKSB7XG4gIHJldHVybiB0cnVlO1xufTtcblxuT3BlcmF0aW9uLnByb3RvdHlwZS5zdXBwb3J0ZWRTdWJtaXRNZXRob2RzID0gZnVuY3Rpb24gKCkge1xuICByZXR1cm4gdGhpcy5wYXJlbnQuc3VwcG9ydGVkU3VibWl0TWV0aG9kcztcbn07XG5cbk9wZXJhdGlvbi5wcm90b3R5cGUuZ2V0SGVhZGVyUGFyYW1zID0gZnVuY3Rpb24gKGFyZ3MpIHtcbiAgdmFyIGhlYWRlcnMgPSB0aGlzLnNldENvbnRlbnRUeXBlcyhhcmdzLCB7fSk7XG4gIHZhciBoZWFkZXJQYXJhbXNCeUxvd2VyQ2FzZSA9IHt9O1xuXG4gIGZvciAodmFyIGkgPSAwOyBpIDwgdGhpcy5wYXJhbWV0ZXJzLmxlbmd0aDsgaSsrKSB7XG4gICAgdmFyIHBhcmFtID0gdGhpcy5wYXJhbWV0ZXJzW2ldO1xuXG4gICAgaWYgKHBhcmFtLmluID09PSAnaGVhZGVyJykge1xuICAgICAgaGVhZGVyUGFyYW1zQnlMb3dlckNhc2VbcGFyYW0ubmFtZS50b0xvd2VyQ2FzZSgpXSA9IHBhcmFtO1xuICAgIH1cbiAgfVxuXG4gIGZvciAodmFyIGFyZyBpbiBhcmdzKSB7XG4gICAgdmFyIGhlYWRlclBhcmFtID0gaGVhZGVyUGFyYW1zQnlMb3dlckNhc2VbYXJnLnRvTG93ZXJDYXNlKCldO1xuICAgIGlmICh0eXBlb2YgaGVhZGVyUGFyYW0gIT09ICd1bmRlZmluZWQnKSB7XG4gICAgICB2YXIgdmFsdWUgPSBhcmdzW2FyZ107XG5cbiAgICAgIGlmIChBcnJheS5pc0FycmF5KHZhbHVlKSkge1xuICAgICAgICB2YWx1ZSA9IHZhbHVlLnRvU3RyaW5nKCk7XG4gICAgICB9XG5cbiAgICAgIGhlYWRlcnNbaGVhZGVyUGFyYW0ubmFtZV0gPSB2YWx1ZTtcbiAgICB9XG4gIH1cblxuICByZXR1cm4gaGVhZGVycztcbn07XG5cbk9wZXJhdGlvbi5wcm90b3R5cGUudXJsaWZ5ID0gZnVuY3Rpb24gKGFyZ3MsIG1hc2tQYXNzd29yZHMpIHtcbiAgdmFyIGZvcm1QYXJhbXMgPSB7fTtcbiAgdmFyIHJlcXVlc3RVcmwgPSB0aGlzLnBhdGgucmVwbGFjZSgvIy4qLywgJycpOyAvLyByZW1vdmUgVVJMIGZyYWdtZW50XG4gIHZhciBxdWVyeXN0cmluZyA9ICcnOyAvLyBncmFiIHBhcmFtcyBmcm9tIHRoZSBhcmdzLCBidWlsZCB0aGUgcXVlcnlzdHJpbmcgYWxvbmcgdGhlIHdheVxuXG4gIGZvciAodmFyIGkgPSAwOyBpIDwgdGhpcy5wYXJhbWV0ZXJzLmxlbmd0aDsgaSsrKSB7XG4gICAgdmFyIHBhcmFtID0gdGhpcy5wYXJhbWV0ZXJzW2ldO1xuXG4gICAgaWYgKHR5cGVvZiBhcmdzW3BhcmFtLm5hbWVdICE9PSAndW5kZWZpbmVkJykge1xuICAgICAgdmFyIGlzUGFzc3dvcmQ7XG4gICAgICBpZihwYXJhbS50eXBlID09PSAnc3RyaW5nJyAmJiBwYXJhbS5mb3JtYXQgPT09ICdwYXNzd29yZCcgJiYgbWFza1Bhc3N3b3Jkcykge1xuICAgICAgICBpc1Bhc3N3b3JkID0gdHJ1ZTtcbiAgICAgIH1cblxuICAgICAgaWYgKHBhcmFtLmluID09PSAncGF0aCcpIHtcbiAgICAgICAgdmFyIHJlZyA9IG5ldyBSZWdFeHAoJ1xceycgKyBwYXJhbS5uYW1lICsgJ1xcfScsICdnaScpO1xuICAgICAgICB2YXIgdmFsdWUgPSBhcmdzW3BhcmFtLm5hbWVdO1xuXG4gICAgICAgIGlmIChBcnJheS5pc0FycmF5KHZhbHVlKSkge1xuICAgICAgICAgIHZhbHVlID0gdGhpcy5lbmNvZGVQYXRoQ29sbGVjdGlvbihwYXJhbS5jb2xsZWN0aW9uRm9ybWF0LCBwYXJhbS5uYW1lLCB2YWx1ZSwgaXNQYXNzd29yZCk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgdmFsdWUgPSB0aGlzLmVuY29kZVBhdGhQYXJhbSh2YWx1ZSwgaXNQYXNzd29yZCk7XG4gICAgICAgIH1cblxuICAgICAgICByZXF1ZXN0VXJsID0gcmVxdWVzdFVybC5yZXBsYWNlKHJlZywgdmFsdWUpO1xuICAgICAgfSBlbHNlIGlmIChwYXJhbS5pbiA9PT0gJ3F1ZXJ5JyAmJiB0eXBlb2YgYXJnc1twYXJhbS5uYW1lXSAhPT0gJ3VuZGVmaW5lZCcpIHtcbiAgICAgICAgaWYgKHF1ZXJ5c3RyaW5nID09PSAnJyAmJiByZXF1ZXN0VXJsLmluZGV4T2YoJz8nKSA8IDApIHtcbiAgICAgICAgICBxdWVyeXN0cmluZyArPSAnPyc7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgcXVlcnlzdHJpbmcgKz0gJyYnO1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKHR5cGVvZiBwYXJhbS5jb2xsZWN0aW9uRm9ybWF0ICE9PSAndW5kZWZpbmVkJykge1xuICAgICAgICAgIHZhciBxcCA9IGFyZ3NbcGFyYW0ubmFtZV07XG5cbiAgICAgICAgICBpZiAoQXJyYXkuaXNBcnJheShxcCkpIHtcbiAgICAgICAgICAgIHF1ZXJ5c3RyaW5nICs9IHRoaXMuZW5jb2RlUXVlcnlDb2xsZWN0aW9uKHBhcmFtLmNvbGxlY3Rpb25Gb3JtYXQsIHBhcmFtLm5hbWUsIHFwLCBpc1Bhc3N3b3JkKTtcbiAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgcXVlcnlzdHJpbmcgKz0gdGhpcy5lbmNvZGVRdWVyeUtleShwYXJhbS5uYW1lKSArICc9JyArIHRoaXMuZW5jb2RlUXVlcnlQYXJhbShhcmdzW3BhcmFtLm5hbWVdLCBpc1Bhc3N3b3JkKTtcbiAgICAgICAgICB9XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgcXVlcnlzdHJpbmcgKz0gdGhpcy5lbmNvZGVRdWVyeUtleShwYXJhbS5uYW1lKSArICc9JyArIHRoaXMuZW5jb2RlUXVlcnlQYXJhbShhcmdzW3BhcmFtLm5hbWVdLCBpc1Bhc3N3b3JkKTtcbiAgICAgICAgfVxuICAgICAgfSBlbHNlIGlmIChwYXJhbS5pbiA9PT0gJ2Zvcm1EYXRhJykge1xuICAgICAgICBmb3JtUGFyYW1zW3BhcmFtLm5hbWVdID0gYXJnc1twYXJhbS5uYW1lXTtcbiAgICAgIH1cbiAgICB9XG4gIH1cbiAgdmFyIHVybCA9IHRoaXMuc2NoZW1lICsgJzovLycgKyB0aGlzLmhvc3Q7XG5cbiAgaWYgKHRoaXMuYmFzZVBhdGggIT09ICcvJykge1xuICAgIHVybCArPSB0aGlzLmJhc2VQYXRoO1xuICB9XG4gIHJldHVybiB1cmwgKyByZXF1ZXN0VXJsICsgcXVlcnlzdHJpbmc7XG59O1xuXG5PcGVyYXRpb24ucHJvdG90eXBlLmdldE1pc3NpbmdQYXJhbXMgPSBmdW5jdGlvbiAoYXJncykge1xuICB2YXIgbWlzc2luZ1BhcmFtcyA9IFtdOyAvLyBjaGVjayByZXF1aXJlZCBwYXJhbXMsIHRyYWNrIHRoZSBvbmVzIHRoYXQgYXJlIG1pc3NpbmdcbiAgdmFyIGk7XG5cbiAgZm9yIChpID0gMDsgaSA8IHRoaXMucGFyYW1ldGVycy5sZW5ndGg7IGkrKykge1xuICAgIHZhciBwYXJhbSA9IHRoaXMucGFyYW1ldGVyc1tpXTtcblxuICAgIGlmIChwYXJhbS5yZXF1aXJlZCA9PT0gdHJ1ZSkge1xuICAgICAgaWYgKHR5cGVvZiBhcmdzW3BhcmFtLm5hbWVdID09PSAndW5kZWZpbmVkJykge1xuICAgICAgICBtaXNzaW5nUGFyYW1zID0gcGFyYW0ubmFtZTtcbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICByZXR1cm4gbWlzc2luZ1BhcmFtcztcbn07XG5cbk9wZXJhdGlvbi5wcm90b3R5cGUuZ2V0Qm9keSA9IGZ1bmN0aW9uIChoZWFkZXJzLCBhcmdzLCBvcHRzKSB7XG4gIHZhciBmb3JtUGFyYW1zID0ge30sIGhhc0Zvcm1QYXJhbXMsIHBhcmFtLCBib2R5LCBrZXksIHZhbHVlLCBoYXNCb2R5ID0gZmFsc2U7XG5cbiAgLy8gbG9vayBhdCBlYWNoIHBhcmFtIGFuZCBwdXQgZm9ybSBwYXJhbXMgaW4gYW4gb2JqZWN0XG4gIGZvciAodmFyIGkgPSAwOyBpIDwgdGhpcy5wYXJhbWV0ZXJzLmxlbmd0aDsgaSsrKSB7XG4gICAgcGFyYW0gPSB0aGlzLnBhcmFtZXRlcnNbaV07XG4gICAgaWYgKHR5cGVvZiBhcmdzW3BhcmFtLm5hbWVdICE9PSAndW5kZWZpbmVkJykge1xuICAgICAgdmFyIGlzUGFzc3dvcmQ7XG4gICAgICBpZihwYXJhbS50eXBlID09PSAnc3RyaW5nJyAmJiBwYXJhbS5mb3JtYXQgPT09ICdwYXNzd29yZCcpIHtcbiAgICAgICAgaXNQYXNzd29yZCA9ICdwYXNzd29yZCc7XG4gICAgICB9XG4gICAgICBpZiAocGFyYW0uaW4gPT09ICdib2R5Jykge1xuICAgICAgICBib2R5ID0gYXJnc1twYXJhbS5uYW1lXTtcbiAgICAgIH0gZWxzZSBpZiAocGFyYW0uaW4gPT09ICdmb3JtRGF0YScpIHtcbiAgICAgICAgZm9ybVBhcmFtc1twYXJhbS5uYW1lXSA9IHtcbiAgICAgICAgICBwYXJhbTogcGFyYW0sXG4gICAgICAgICAgdmFsdWU6IGFyZ3NbcGFyYW0ubmFtZV0sXG4gICAgICAgICAgcGFzc3dvcmQ6IGlzUGFzc3dvcmRcbiAgICAgICAgfTtcbiAgICAgICAgaGFzRm9ybVBhcmFtcyA9IHRydWU7XG4gICAgICB9XG4gICAgfVxuICAgIGVsc2Uge1xuICAgICAgaWYocGFyYW0uaW4gPT09ICdib2R5Jykge1xuICAgICAgICBoYXNCb2R5ID0gdHJ1ZTtcbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICAvLyBpZiBib2R5IGlzIG51bGwgYW5kIGhhc0JvZHkgaXMgdHJ1ZSwgQU5EIGEgSlNPTiBib2R5IGlzIHJlcXVlc3RlZCwgc2VuZCBlbXB0eSB7fVxuICBpZihoYXNCb2R5ICYmIHR5cGVvZiBib2R5ID09PSAndW5kZWZpbmVkJykge1xuICAgIHZhciBjb250ZW50VHlwZSA9IGhlYWRlcnNbJ0NvbnRlbnQtVHlwZSddO1xuICAgIGlmKGNvbnRlbnRUeXBlICYmIGNvbnRlbnRUeXBlLmluZGV4T2YoJ2FwcGxpY2F0aW9uL2pzb24nKSA9PT0gMCkge1xuICAgICAgYm9keSA9ICd7fSc7XG4gICAgfVxuICB9XG5cbiAgdmFyIGlzTXVsdGlQYXJ0ID0gZmFsc2U7XG4gIGlmKGhlYWRlcnNbJ0NvbnRlbnQtVHlwZSddICYmIGhlYWRlcnNbJ0NvbnRlbnQtVHlwZSddLmluZGV4T2YoJ211bHRpcGFydC9mb3JtLWRhdGEnKSA+PSAwKSB7XG4gICAgaXNNdWx0aVBhcnQgPSB0cnVlO1xuICB9XG5cbiAgLy8gaGFuZGxlIGZvcm0gcGFyYW1zXG4gIGlmIChoYXNGb3JtUGFyYW1zICYmICFpc011bHRpUGFydCkge1xuICAgIHZhciBlbmNvZGVkID0gJyc7XG5cbiAgICBmb3IgKGtleSBpbiBmb3JtUGFyYW1zKSB7XG4gICAgICBwYXJhbSA9IGZvcm1QYXJhbXNba2V5XS5wYXJhbTtcbiAgICAgIHZhbHVlID0gZm9ybVBhcmFtc1trZXldLnZhbHVlO1xuICAgICAgdmFyIHBhc3N3b3JkO1xuXG4gICAgICBpZihvcHRzICYmIG9wdHMubWFza1Bhc3N3b3Jkcykge1xuICAgICAgICBwYXNzd29yZCA9IGZvcm1QYXJhbXNba2V5XS5wYXNzd29yZDtcbiAgICAgIH1cblxuICAgICAgaWYgKHR5cGVvZiB2YWx1ZSAhPT0gJ3VuZGVmaW5lZCcpIHtcbiAgICAgICAgaWYgKEFycmF5LmlzQXJyYXkodmFsdWUpKSB7XG4gICAgICAgICAgaWYgKGVuY29kZWQgIT09ICcnKSB7XG4gICAgICAgICAgICBlbmNvZGVkICs9ICcmJztcbiAgICAgICAgICB9XG4gICAgICAgICAgZW5jb2RlZCArPSB0aGlzLmVuY29kZVF1ZXJ5Q29sbGVjdGlvbihwYXJhbS5jb2xsZWN0aW9uRm9ybWF0LCBrZXksIHZhbHVlLCBwYXNzd29yZCk7XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSB7XG4gICAgICAgICAgaWYgKGVuY29kZWQgIT09ICcnKSB7XG4gICAgICAgICAgICBlbmNvZGVkICs9ICcmJztcbiAgICAgICAgICB9XG5cbiAgICAgICAgICBlbmNvZGVkICs9IGVuY29kZVVSSUNvbXBvbmVudChrZXkpICsgJz0nICsgbWFzayhlbmNvZGVVUklDb21wb25lbnQodmFsdWUpLCBwYXNzd29yZCk7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG5cbiAgICBib2R5ID0gZW5jb2RlZDtcbiAgfSBlbHNlIGlmIChpc011bHRpUGFydCkge1xuICAgIHZhciBib2R5UGFyYW07XG4gICAgaWYgKHR5cGVvZiBGb3JtRGF0YSA9PT0gJ2Z1bmN0aW9uJykge1xuICAgICAgYm9keVBhcmFtID0gbmV3IEZvcm1EYXRhKCk7XG5cbiAgICAgIGJvZHlQYXJhbS50eXBlID0gJ2Zvcm1EYXRhJztcblxuICAgICAgZm9yIChrZXkgaW4gZm9ybVBhcmFtcykge1xuICAgICAgICBwYXJhbSA9IGZvcm1QYXJhbXNba2V5XS5wYXJhbTtcbiAgICAgICAgdmFsdWUgPSBhcmdzW2tleV07XG5cbiAgICAgICAgaWYgKHR5cGVvZiB2YWx1ZSAhPT0gJ3VuZGVmaW5lZCcpIHtcbiAgICAgICAgICBpZih7fS50b1N0cmluZy5hcHBseSh2YWx1ZSkgPT09ICdbb2JqZWN0IEZpbGVdJykge1xuICAgICAgICAgICAgYm9keVBhcmFtLmFwcGVuZChrZXksIHZhbHVlKTtcbiAgICAgICAgICB9XG4gICAgICAgICAgZWxzZSBpZiAodmFsdWUudHlwZSA9PT0gJ2ZpbGUnICYmIHZhbHVlLnZhbHVlKSB7XG4gICAgICAgICAgICBib2R5UGFyYW0uYXBwZW5kKGtleSwgdmFsdWUudmFsdWUpO1xuICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICBpZiAoQXJyYXkuaXNBcnJheSh2YWx1ZSkpIHtcbiAgICAgICAgICAgICAgaWYocGFyYW0uY29sbGVjdGlvbkZvcm1hdCA9PT0gJ211bHRpJykge1xuICAgICAgICAgICAgICAgIGJvZHlQYXJhbS5kZWxldGUoa2V5KTtcbiAgICAgICAgICAgICAgICBmb3IodmFyIHYgaW4gdmFsdWUpIHtcbiAgICAgICAgICAgICAgICAgIGJvZHlQYXJhbS5hcHBlbmQoa2V5LCB2YWx1ZVt2XSk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgICAgIGJvZHlQYXJhbS5hcHBlbmQoa2V5LCB0aGlzLmVuY29kZVF1ZXJ5Q29sbGVjdGlvbihwYXJhbS5jb2xsZWN0aW9uRm9ybWF0LCBrZXksIHZhbHVlKS5zcGxpdCgnPScpLnNsaWNlKDEpLmpvaW4oJz0nKSk7XG4gICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgICBib2R5UGFyYW0uYXBwZW5kKGtleSwgdmFsdWUpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgfVxuICAgICAgYm9keSA9IGJvZHlQYXJhbTtcbiAgICB9XG4gICAgZWxzZSB7XG4gICAgICBib2R5UGFyYW0gPSB7fTtcbiAgICAgIGZvciAoa2V5IGluIGZvcm1QYXJhbXMpIHtcbiAgICAgICAgdmFsdWUgPSBhcmdzW2tleV07XG4gICAgICAgIGlmIChBcnJheS5pc0FycmF5KHZhbHVlKSkge1xuICAgICAgICAgIHZhciBkZWxpbWV0ZXI7XG4gICAgICAgICAgdmFyIGZvcm1hdCA9IHBhcmFtLmNvbGxlY3Rpb25Gb3JtYXQgfHwgJ211bHRpJztcbiAgICAgICAgICBpZihmb3JtYXQgPT09ICdzc3YnKSB7XG4gICAgICAgICAgICBkZWxpbWV0ZXIgPSAnICc7XG4gICAgICAgICAgfVxuICAgICAgICAgIGVsc2UgaWYoZm9ybWF0ID09PSAncGlwZXMnKSB7XG4gICAgICAgICAgICBkZWxpbWV0ZXIgPSAnfCc7XG4gICAgICAgICAgfVxuICAgICAgICAgIGVsc2UgaWYoZm9ybWF0ID09PSAndHN2Jykge1xuICAgICAgICAgICAgZGVsaW1ldGVyID0gJ1xcdCc7XG4gICAgICAgICAgfVxuICAgICAgICAgIGVsc2UgaWYoZm9ybWF0ID09PSAnbXVsdGknKSB7XG4gICAgICAgICAgICBib2R5UGFyYW1ba2V5XSA9IHZhbHVlO1xuICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgfVxuICAgICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgZGVsaW1ldGVyID0gJywnO1xuICAgICAgICAgIH1cbiAgICAgICAgICB2YXIgZGF0YTtcbiAgICAgICAgICB2YWx1ZS5mb3JFYWNoKGZ1bmN0aW9uKHYpIHtcbiAgICAgICAgICAgIGlmKGRhdGEpIHtcbiAgICAgICAgICAgICAgZGF0YSArPSBkZWxpbWV0ZXI7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgICAgZGF0YSA9ICcnO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgZGF0YSArPSB2O1xuICAgICAgICAgIH0pO1xuICAgICAgICAgIGJvZHlQYXJhbVtrZXldID0gZGF0YTtcbiAgICAgICAgfVxuICAgICAgICBlbHNlIHtcbiAgICAgICAgICBib2R5UGFyYW1ba2V5XSA9IHZhbHVlO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgICBib2R5ID0gYm9keVBhcmFtO1xuICAgIH1cbiAgICBoZWFkZXJzWydDb250ZW50LVR5cGUnXSA9ICdtdWx0aXBhcnQvZm9ybS1kYXRhJztcbiAgfVxuXG4gIHJldHVybiBib2R5O1xufTtcblxuLyoqXG4gKiBnZXRzIHNhbXBsZSByZXNwb25zZSBmb3IgYSBzaW5nbGUgb3BlcmF0aW9uXG4gKiovXG5PcGVyYXRpb24ucHJvdG90eXBlLmdldE1vZGVsU2FtcGxlSlNPTiA9IGZ1bmN0aW9uICh0eXBlLCBtb2RlbHMpIHtcbiAgdmFyIGxpc3RUeXBlLCBzYW1wbGVKc29uLCBpbm5lclR5cGU7XG4gIG1vZGVscyA9IG1vZGVscyB8fCB7fTtcblxuICBsaXN0VHlwZSA9ICh0eXBlIGluc3RhbmNlb2YgQXJyYXkpO1xuICBpbm5lclR5cGUgPSBsaXN0VHlwZSA/IHR5cGVbMF0gOiB0eXBlO1xuXG4gIGlmKG1vZGVsc1tpbm5lclR5cGVdKSB7XG4gICAgc2FtcGxlSnNvbiA9IG1vZGVsc1tpbm5lclR5cGVdLmNyZWF0ZUpTT05TYW1wbGUoKTtcbiAgfSBlbHNlIGlmICh0aGlzLmdldElubGluZU1vZGVsKGlubmVyVHlwZSkpe1xuICAgIHNhbXBsZUpzb24gPSB0aGlzLmdldElubGluZU1vZGVsKGlubmVyVHlwZSkuY3JlYXRlSlNPTlNhbXBsZSgpOyAvLyBtYXkgcmV0dXJuIG51bGwsIGlmIHR5cGUgaXNuJ3QgY29ycmVjdFxuICB9XG5cblxuICBpZiAoc2FtcGxlSnNvbikge1xuICAgIHNhbXBsZUpzb24gPSBsaXN0VHlwZSA/IFtzYW1wbGVKc29uXSA6IHNhbXBsZUpzb247XG5cbiAgICBpZiAodHlwZW9mIHNhbXBsZUpzb24gPT09ICdzdHJpbmcnKSB7XG4gICAgICByZXR1cm4gc2FtcGxlSnNvbjtcbiAgICB9IGVsc2UgaWYgKF8uaXNPYmplY3Qoc2FtcGxlSnNvbikpIHtcbiAgICAgIHZhciB0ID0gc2FtcGxlSnNvbjtcblxuICAgICAgaWYgKHNhbXBsZUpzb24gaW5zdGFuY2VvZiBBcnJheSAmJiBzYW1wbGVKc29uLmxlbmd0aCA+IDApIHtcbiAgICAgICAgdCA9IHNhbXBsZUpzb25bMF07XG4gICAgICB9XG5cbiAgICAgIGlmICh0Lm5vZGVOYW1lICYmIHR5cGVvZiB0ID09PSAnTm9kZScpIHtcbiAgICAgICAgdmFyIHhtbFN0cmluZyA9IG5ldyBYTUxTZXJpYWxpemVyKCkuc2VyaWFsaXplVG9TdHJpbmcodCk7XG5cbiAgICAgICAgcmV0dXJuIHRoaXMuZm9ybWF0WG1sKHhtbFN0cmluZyk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICByZXR1cm4gSlNPTi5zdHJpbmdpZnkoc2FtcGxlSnNvbiwgbnVsbCwgMik7XG4gICAgICB9XG4gICAgfSBlbHNlIHtcbiAgICAgIHJldHVybiBzYW1wbGVKc29uO1xuICAgIH1cbiAgfVxufTtcblxuLyoqXG4gKiBsZWdhY3kgYmluZGluZ1xuICoqL1xuT3BlcmF0aW9uLnByb3RvdHlwZS5kbyA9IGZ1bmN0aW9uIChhcmdzLCBvcHRzLCBjYWxsYmFjaywgZXJyb3IsIHBhcmVudCkge1xuICByZXR1cm4gdGhpcy5leGVjdXRlKGFyZ3MsIG9wdHMsIGNhbGxiYWNrLCBlcnJvciwgcGFyZW50KTtcbn07XG5cbi8qKlxuICogZXhlY3V0ZXMgYW4gb3BlcmF0aW9uXG4gKiovXG5PcGVyYXRpb24ucHJvdG90eXBlLmV4ZWN1dGUgPSBmdW5jdGlvbiAoYXJnMSwgYXJnMiwgYXJnMywgYXJnNCwgcGFyZW50KSB7XG4gIHZhciBhcmdzID0gYXJnMSB8fCB7fTtcbiAgdmFyIG9wdHMgPSB7fSwgc3VjY2VzcywgZXJyb3IsIGRlZmVycmVkLCB0aW1lb3V0O1xuXG4gIGlmIChfLmlzT2JqZWN0KGFyZzIpKSB7XG4gICAgb3B0cyA9IGFyZzI7XG4gICAgc3VjY2VzcyA9IGFyZzM7XG4gICAgZXJyb3IgPSBhcmc0O1xuICB9XG5cbiAgdGltZW91dCA9IHR5cGVvZiBvcHRzLnRpbWVvdXQgIT09ICd1bmRlZmluZWQnID8gb3B0cy50aW1lb3V0IDogdGhpcy50aW1lb3V0O1xuXG4gIGlmKHRoaXMuY2xpZW50KSB7XG4gICAgb3B0cy5jbGllbnQgPSB0aGlzLmNsaWVudDtcbiAgfVxuXG4gIGlmKHRoaXMucmVxdWVzdEFnZW50KSB7XG4gICAgb3B0cy5yZXF1ZXN0QWdlbnQgPSB0aGlzLnJlcXVlc3RBZ2VudDtcbiAgfVxuXG4gIC8vIGFkZCB0aGUgcmVxdWVzdCBpbnRlcmNlcHRvciBmcm9tIHBhcmVudCwgaWYgbm9uZSBzZW50IGZyb20gY2xpZW50XG4gIGlmKCFvcHRzLnJlcXVlc3RJbnRlcmNlcHRvciAmJiB0aGlzLnJlcXVlc3RJbnRlcmNlcHRvciApIHtcbiAgICBvcHRzLnJlcXVlc3RJbnRlcmNlcHRvciA9IHRoaXMucmVxdWVzdEludGVyY2VwdG9yIDtcbiAgfVxuXG4gIGlmKCFvcHRzLnJlc3BvbnNlSW50ZXJjZXB0b3IgJiYgdGhpcy5yZXNwb25zZUludGVyY2VwdG9yKSB7XG4gICAgb3B0cy5yZXNwb25zZUludGVyY2VwdG9yID0gdGhpcy5yZXNwb25zZUludGVyY2VwdG9yO1xuICB9XG5cbiAgaWYgKHR5cGVvZiBhcmcyID09PSAnZnVuY3Rpb24nKSB7XG4gICAgc3VjY2VzcyA9IGFyZzI7XG4gICAgZXJyb3IgPSBhcmczO1xuICB9XG5cbiAgaWYgKHRoaXMucGFyZW50LnVzZVByb21pc2UpIHtcbiAgICBkZWZlcnJlZCA9IFEuZGVmZXIoKTtcbiAgfSBlbHNlIHtcbiAgICBzdWNjZXNzID0gKHN1Y2Nlc3MgfHwgdGhpcy5wYXJlbnQuZGVmYXVsdFN1Y2Nlc3NDYWxsYmFjayB8fCBoZWxwZXJzLmxvZyk7XG4gICAgZXJyb3IgPSAoZXJyb3IgfHwgdGhpcy5wYXJlbnQuZGVmYXVsdEVycm9yQ2FsbGJhY2sgfHwgaGVscGVycy5sb2cpO1xuICB9XG5cbiAgaWYgKHR5cGVvZiBvcHRzLnVzZUpRdWVyeSA9PT0gJ3VuZGVmaW5lZCcpIHtcbiAgICBvcHRzLnVzZUpRdWVyeSA9IHRoaXMudXNlSlF1ZXJ5O1xuICB9XG5cbiAgaWYgKHR5cGVvZiBvcHRzLmpxdWVyeUFqYXhDYWNoZSA9PT0gJ3VuZGVmaW5lZCcpIHtcbiAgICBvcHRzLmpxdWVyeUFqYXhDYWNoZSA9IHRoaXMuanF1ZXJ5QWpheENhY2hlO1xuICB9XG5cbiAgaWYgKHR5cGVvZiBvcHRzLmVuYWJsZUNvb2tpZXMgPT09ICd1bmRlZmluZWQnKSB7XG4gICAgb3B0cy5lbmFibGVDb29raWVzID0gdGhpcy5lbmFibGVDb29raWVzO1xuICB9XG5cbiAgdmFyIG1pc3NpbmdQYXJhbXMgPSB0aGlzLmdldE1pc3NpbmdQYXJhbXMoYXJncyk7XG5cbiAgaWYgKG1pc3NpbmdQYXJhbXMubGVuZ3RoID4gMCkge1xuICAgIHZhciBtZXNzYWdlID0gJ21pc3NpbmcgcmVxdWlyZWQgcGFyYW1zOiAnICsgbWlzc2luZ1BhcmFtcztcblxuICAgIGhlbHBlcnMuZmFpbChtZXNzYWdlKTtcblxuICAgIGlmICh0aGlzLnBhcmVudC51c2VQcm9taXNlKSB7XG4gICAgICBkZWZlcnJlZC5yZWplY3QobWVzc2FnZSk7XG4gICAgICByZXR1cm4gZGVmZXJyZWQucHJvbWlzZTtcbiAgICB9IGVsc2Uge1xuICAgICAgZXJyb3IobWVzc2FnZSwgcGFyZW50KTtcbiAgICAgIHJldHVybiB7fTtcbiAgICB9XG4gIH1cblxuICB2YXIgYWxsSGVhZGVycyA9IHRoaXMuZ2V0SGVhZGVyUGFyYW1zKGFyZ3MpO1xuICB2YXIgY29udGVudFR5cGVIZWFkZXJzID0gdGhpcy5zZXRDb250ZW50VHlwZXMoYXJncywgb3B0cyk7XG4gIHZhciBoZWFkZXJzID0ge30sIGF0dHJuYW1lO1xuXG4gIGZvciAoYXR0cm5hbWUgaW4gYWxsSGVhZGVycykgeyBoZWFkZXJzW2F0dHJuYW1lXSA9IGFsbEhlYWRlcnNbYXR0cm5hbWVdOyB9XG4gIGZvciAoYXR0cm5hbWUgaW4gY29udGVudFR5cGVIZWFkZXJzKSB7IGhlYWRlcnNbYXR0cm5hbWVdID0gY29udGVudFR5cGVIZWFkZXJzW2F0dHJuYW1lXTsgfVxuXG4gIHZhciBib2R5ID0gdGhpcy5nZXRCb2R5KGNvbnRlbnRUeXBlSGVhZGVycywgYXJncywgb3B0cyk7XG4gIHZhciB1cmwgPSB0aGlzLnVybGlmeShhcmdzLCBvcHRzLm1hc2tQYXNzd29yZHMpO1xuXG4gIGlmKHVybC5pbmRleE9mKCcue2Zvcm1hdH0nKSA+IDApIHtcbiAgICBpZihoZWFkZXJzKSB7XG4gICAgICB2YXIgZm9ybWF0ID0gaGVhZGVycy5BY2NlcHQgfHwgaGVhZGVycy5hY2NlcHQ7XG4gICAgICBpZihmb3JtYXQgJiYgZm9ybWF0LmluZGV4T2YoJ2pzb24nKSA+IDApIHtcbiAgICAgICAgdXJsID0gdXJsLnJlcGxhY2UoJy57Zm9ybWF0fScsICcuanNvbicpO1xuICAgICAgfVxuICAgICAgZWxzZSBpZihmb3JtYXQgJiYgZm9ybWF0LmluZGV4T2YoJ3htbCcpID4gMCkge1xuICAgICAgICB1cmwgPSB1cmwucmVwbGFjZSgnLntmb3JtYXR9JywgJy54bWwnKTtcbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICB2YXIgb2JqID0ge1xuICAgIHVybDogdXJsLFxuICAgIG1ldGhvZDogdGhpcy5tZXRob2QudG9VcHBlckNhc2UoKSxcbiAgICBib2R5OiBib2R5LFxuICAgIGVuYWJsZUNvb2tpZXM6IG9wdHMuZW5hYmxlQ29va2llcyxcbiAgICB1c2VKUXVlcnk6IG9wdHMudXNlSlF1ZXJ5LFxuICAgIGpxdWVyeUFqYXhDYWNoZTogb3B0cy5qcXVlcnlBamF4Q2FjaGUsXG4gICAgZGVmZXJyZWQ6IGRlZmVycmVkLFxuICAgIGhlYWRlcnM6IGhlYWRlcnMsXG4gICAgY2xpZW50QXV0aG9yaXphdGlvbnM6IG9wdHMuY2xpZW50QXV0aG9yaXphdGlvbnMsXG4gICAgb3BlcmF0aW9uOiB0aGlzLFxuICAgIGNvbm5lY3Rpb25BZ2VudDogdGhpcy5jb25uZWN0aW9uQWdlbnQsXG4gICAgb246IHtcbiAgICAgIHJlc3BvbnNlOiBmdW5jdGlvbiAocmVzcG9uc2UpIHtcbiAgICAgICAgaWYgKGRlZmVycmVkKSB7XG4gICAgICAgICAgZGVmZXJyZWQucmVzb2x2ZShyZXNwb25zZSk7XG4gICAgICAgICAgcmV0dXJuIGRlZmVycmVkLnByb21pc2U7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgcmV0dXJuIHN1Y2Nlc3MocmVzcG9uc2UsIHBhcmVudCk7XG4gICAgICAgIH1cbiAgICAgIH0sXG4gICAgICBlcnJvcjogZnVuY3Rpb24gKHJlc3BvbnNlKSB7XG4gICAgICAgIGlmIChkZWZlcnJlZCkge1xuICAgICAgICAgIGRlZmVycmVkLnJlamVjdChyZXNwb25zZSk7XG4gICAgICAgICAgcmV0dXJuIGRlZmVycmVkLnByb21pc2U7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgcmV0dXJuIGVycm9yKHJlc3BvbnNlLCBwYXJlbnQpO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuICB9O1xuXG4gIGlmICh0aW1lb3V0KSB7XG4gICAgb2JqLnRpbWVvdXQgPSB0aW1lb3V0O1xuICB9XG5cbiAgdGhpcy5jbGllbnRBdXRob3JpemF0aW9ucy5hcHBseShvYmosIHRoaXMub3BlcmF0aW9uLnNlY3VyaXR5KTtcbiAgaWYgKG9wdHMubW9jayA9PT0gdHJ1ZSkge1xuICAgIHJldHVybiBvYmo7XG4gIH0gZWxzZSB7XG4gICAgcmV0dXJuIG5ldyBTd2FnZ2VySHR0cCgpLmV4ZWN1dGUob2JqLCBvcHRzKTtcbiAgfVxufTtcblxuZnVuY3Rpb24gaXRlbUJ5UHJpb3JpdHkoY29sLCBpdGVtUHJpb3JpdHkpIHtcblxuICAvLyBObyBwcmlvcml0aWVzPyByZXR1cm4gZmlyc3QuLi5cbiAgaWYoXy5pc0VtcHR5KGl0ZW1Qcmlvcml0eSkpIHtcbiAgICByZXR1cm4gY29sWzBdO1xuICB9XG5cbiAgZm9yICh2YXIgaSA9IDAsIGxlbiA9IGl0ZW1Qcmlvcml0eS5sZW5ndGg7IGkgPCBsZW47IGkrKykge1xuICAgIGlmKGNvbC5pbmRleE9mKGl0ZW1Qcmlvcml0eVtpXSkgPiAtMSkge1xuICAgICAgcmV0dXJuIGl0ZW1Qcmlvcml0eVtpXTtcbiAgICB9XG4gIH1cblxuICAvLyBPdGhlcndpc2UgcmV0dXJuIGZpcnN0XG4gIHJldHVybiBjb2xbMF07XG59XG5cbk9wZXJhdGlvbi5wcm90b3R5cGUuc2V0Q29udGVudFR5cGVzID0gZnVuY3Rpb24gKGFyZ3MsIG9wdHMpIHtcbiAgLy8gZGVmYXVsdCB0eXBlXG4gIHZhciBhbGxEZWZpbmVkUGFyYW1zID0gdGhpcy5wYXJhbWV0ZXJzO1xuICB2YXIgYm9keTtcbiAgdmFyIGNvbnN1bWVzID0gYXJncy5wYXJhbWV0ZXJDb250ZW50VHlwZSB8fCBpdGVtQnlQcmlvcml0eSh0aGlzLmNvbnN1bWVzLCBbJ2FwcGxpY2F0aW9uL2pzb24nLCAnYXBwbGljYXRpb24veWFtbCddKTtcbiAgdmFyIGFjY2VwdHMgPSBvcHRzLnJlc3BvbnNlQ29udGVudFR5cGUgfHwgaXRlbUJ5UHJpb3JpdHkodGhpcy5wcm9kdWNlcywgWydhcHBsaWNhdGlvbi9qc29uJywgJ2FwcGxpY2F0aW9uL3lhbWwnXSk7XG4gIHZhciBkZWZpbmVkRmlsZVBhcmFtcyA9IFtdO1xuICB2YXIgZGVmaW5lZEZvcm1QYXJhbXMgPSBbXTtcbiAgdmFyIGhlYWRlcnMgPSB7fTtcbiAgdmFyIGk7XG5cbiAgLy8gZ2V0IHBhcmFtcyBmcm9tIHRoZSBvcGVyYXRpb24gYW5kIHNldCB0aGVtIGluIGRlZmluZWRGaWxlUGFyYW1zLCBkZWZpbmVkRm9ybVBhcmFtcywgaGVhZGVyc1xuICBmb3IgKGkgPSAwOyBpIDwgYWxsRGVmaW5lZFBhcmFtcy5sZW5ndGg7IGkrKykge1xuICAgIHZhciBwYXJhbSA9IGFsbERlZmluZWRQYXJhbXNbaV07XG5cbiAgICBpZiAocGFyYW0uaW4gPT09ICdmb3JtRGF0YScpIHtcbiAgICAgIGlmIChwYXJhbS50eXBlID09PSAnZmlsZScpIHtcbiAgICAgICAgZGVmaW5lZEZpbGVQYXJhbXMucHVzaChwYXJhbSk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBkZWZpbmVkRm9ybVBhcmFtcy5wdXNoKHBhcmFtKTtcbiAgICAgIH1cbiAgICB9IGVsc2UgaWYgKHBhcmFtLmluID09PSAnaGVhZGVyJyAmJiBvcHRzKSB7XG4gICAgICB2YXIga2V5ID0gcGFyYW0ubmFtZTtcbiAgICAgIHZhciBoZWFkZXJWYWx1ZSA9IG9wdHNbcGFyYW0ubmFtZV07XG5cbiAgICAgIGlmICh0eXBlb2Ygb3B0c1twYXJhbS5uYW1lXSAhPT0gJ3VuZGVmaW5lZCcpIHtcbiAgICAgICAgaGVhZGVyc1trZXldID0gaGVhZGVyVmFsdWU7XG4gICAgICB9XG4gICAgfSBlbHNlIGlmIChwYXJhbS5pbiA9PT0gJ2JvZHknICYmIHR5cGVvZiBhcmdzW3BhcmFtLm5hbWVdICE9PSAndW5kZWZpbmVkJykge1xuICAgICAgYm9keSA9IGFyZ3NbcGFyYW0ubmFtZV07XG4gICAgfVxuICB9XG5cbiAgLy8gaWYgdGhlcmUncyBhIGJvZHksIG5lZWQgdG8gc2V0IHRoZSBjb25zdW1lcyBoZWFkZXIgdmlhIHJlcXVlc3RDb250ZW50VHlwZVxuICB2YXIgaGFzQm9keSA9IGJvZHkgfHwgZGVmaW5lZEZpbGVQYXJhbXMubGVuZ3RoIHx8IGRlZmluZWRGb3JtUGFyYW1zLmxlbmd0aDtcbiAgaWYgKHRoaXMubWV0aG9kID09PSAncG9zdCcgfHwgdGhpcy5tZXRob2QgPT09ICdwdXQnIHx8IHRoaXMubWV0aG9kID09PSAncGF0Y2gnIHx8XG4gICAgICAoKHRoaXMubWV0aG9kID09PSAnZGVsZXRlJyB8fCB0aGlzLm1ldGhvZCA9PT0gJ2dldCcpICYmIGhhc0JvZHkpKSB7XG4gICAgaWYgKG9wdHMucmVxdWVzdENvbnRlbnRUeXBlKSB7XG4gICAgICBjb25zdW1lcyA9IG9wdHMucmVxdWVzdENvbnRlbnRUeXBlO1xuICAgIH1cbiAgICAvLyBpZiBhbnkgZm9ybSBwYXJhbXMsIGNvbnRlbnQgdHlwZSBtdXN0IGJlIHNldFxuICAgIGlmIChkZWZpbmVkRm9ybVBhcmFtcy5sZW5ndGggPiAwKSB7XG4gICAgICBjb25zdW1lcyA9IHVuZGVmaW5lZDtcbiAgICAgIGlmIChvcHRzLnJlcXVlc3RDb250ZW50VHlwZSkgeyAgICAgICAgICAgICAvLyBvdmVycmlkZSBpZiBzZXRcbiAgICAgICAgY29uc3VtZXMgPSBvcHRzLnJlcXVlc3RDb250ZW50VHlwZTtcbiAgICAgIH0gZWxzZSBpZiAoZGVmaW5lZEZpbGVQYXJhbXMubGVuZ3RoID4gMCkgeyAvLyBpZiBhIGZpbGUsIG11c3QgYmUgbXVsdGlwYXJ0L2Zvcm0tZGF0YVxuICAgICAgICBjb25zdW1lcyA9ICdtdWx0aXBhcnQvZm9ybS1kYXRhJztcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIGlmICh0aGlzLmNvbnN1bWVzICYmIHRoaXMuY29uc3VtZXMubGVuZ3RoID4gMCkge1xuICAgICAgICAgIC8vIHVzZSB0aGUgY29uc3VtZXMgc2V0dGluZ1xuICAgICAgICAgIGZvcih2YXIgYyBpbiB0aGlzLmNvbnN1bWVzKSB7XG4gICAgICAgICAgICB2YXIgY2hrID0gdGhpcy5jb25zdW1lc1tjXTtcbiAgICAgICAgICAgIGlmKGNoay5pbmRleE9mKCdhcHBsaWNhdGlvbi94LXd3dy1mb3JtLXVybGVuY29kZWQnKSA9PT0gMCB8fCBjaGsuaW5kZXhPZignbXVsdGlwYXJ0L2Zvcm0tZGF0YScpID09PSAwKSB7XG4gICAgICAgICAgICAgIGNvbnN1bWVzID0gY2hrO1xuICAgICAgICAgICAgfVxuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgfVxuICAgICAgaWYodHlwZW9mIGNvbnN1bWVzID09PSAndW5kZWZpbmVkJykge1xuICAgICAgICAvLyBkZWZhdWx0IHRvIHgtd3d3LWZyb20tdXJsZW5jb2RlZFxuICAgICAgICBjb25zdW1lcyA9ICdhcHBsaWNhdGlvbi94LXd3dy1mb3JtLXVybGVuY29kZWQnO1xuICAgICAgfVxuICAgIH1cbiAgfVxuICBlbHNlIHtcbiAgICBjb25zdW1lcyA9IG51bGw7XG4gIH1cblxuICBpZiAoY29uc3VtZXMgJiYgdGhpcy5jb25zdW1lcykge1xuICAgIGlmICh0aGlzLmNvbnN1bWVzLmluZGV4T2YoY29uc3VtZXMpID09PSAtMSkge1xuICAgICAgaGVscGVycy5sb2coJ3NlcnZlciBkb2VzblxcJ3QgY29uc3VtZSAnICsgY29uc3VtZXMgKyAnLCB0cnkgJyArIEpTT04uc3RyaW5naWZ5KHRoaXMuY29uc3VtZXMpKTtcbiAgICB9XG4gIH1cblxuICBpZiAoIXRoaXMubWF0Y2hlc0FjY2VwdChhY2NlcHRzKSkge1xuICAgIGhlbHBlcnMubG9nKCdzZXJ2ZXIgY2FuXFwndCBwcm9kdWNlICcgKyBhY2NlcHRzKTtcbiAgfVxuXG4gIGlmICgoY29uc3VtZXMgJiYgYm9keSAhPT0gJycpIHx8IChjb25zdW1lcyA9PT0gJ2FwcGxpY2F0aW9uL3gtd3d3LWZvcm0tdXJsZW5jb2RlZCcpKSB7XG4gICAgaGVhZGVyc1snQ29udGVudC1UeXBlJ10gPSBjb25zdW1lcztcbiAgfVxuICBlbHNlIGlmKHRoaXMuY29uc3VtZXMgJiYgdGhpcy5jb25zdW1lcy5sZW5ndGggPiAwICYmIHRoaXMuY29uc3VtZXNbMF0gPT09ICdhcHBsaWNhdGlvbi94LXd3dy1mb3JtLXVybGVuY29kZWQnKSB7XG4gICAgaGVhZGVyc1snQ29udGVudC1UeXBlJ10gPSB0aGlzLmNvbnN1bWVzWzBdO1xuICB9XG5cbiAgaWYgKGFjY2VwdHMpIHtcbiAgICBoZWFkZXJzLkFjY2VwdCA9IGFjY2VwdHM7XG4gIH1cblxuICByZXR1cm4gaGVhZGVycztcbn07XG5cbi8qKlxuICogUmV0dXJucyB0cnVlIGlmIHRoZSByZXF1ZXN0IGFjY2VwdHMgaGVhZGVyIG1hdGNoZXMgYW55dGhpbmcgaW4gdGhpcy5wcm9kdWNlcy5cbiAqICBJZiB0aGlzLnByb2R1Y2VzIGNvbnRhaW5zICogLyAqLCBpZ25vcmUgdGhlIGFjY2VwdCBoZWFkZXIuXG4gKiBAcGFyYW0ge3N0cmluZz19IGFjY2VwdHMgVGhlIGNsaWVudCByZXF1ZXN0IGFjY2VwdCBoZWFkZXIuXG4gKiBAcmV0dXJuIHtib29sZWFufVxuICovXG5PcGVyYXRpb24ucHJvdG90eXBlLm1hdGNoZXNBY2NlcHQgPSBmdW5jdGlvbihhY2NlcHRzKSB7XG4gIC8vIG5vIGFjY2VwdHMgb3IgcHJvZHVjZXMsIG5vIHByb2JsZW0hXG4gIGlmICghYWNjZXB0cyB8fCAhdGhpcy5wcm9kdWNlcykge1xuICAgIHJldHVybiB0cnVlO1xuICB9XG4gIHJldHVybiB0aGlzLnByb2R1Y2VzLmluZGV4T2YoYWNjZXB0cykgIT09IC0xIHx8IHRoaXMucHJvZHVjZXMuaW5kZXhPZignKi8qJykgIT09IC0xO1xufTtcblxuT3BlcmF0aW9uLnByb3RvdHlwZS5hc0N1cmwgPSBmdW5jdGlvbiAoYXJnczEsIGFyZ3MyKSB7XG4gIHZhciBvcHRzID0ge21vY2s6IHRydWUsIG1hc2tQYXNzd29yZHM6IHRydWV9O1xuICBpZiAodHlwZW9mIGFyZ3MyID09PSAnb2JqZWN0Jykge1xuICAgIGZvciAodmFyIGFyZ0tleSBpbiBhcmdzMikge1xuICAgICAgb3B0c1thcmdLZXldID0gYXJnczJbYXJnS2V5XTtcbiAgICB9XG4gIH1cbiAgdmFyIG9iaiA9IHRoaXMuZXhlY3V0ZShhcmdzMSwgb3B0cyk7XG5cbiAgdGhpcy5jbGllbnRBdXRob3JpemF0aW9ucy5hcHBseShvYmosIHRoaXMub3BlcmF0aW9uLnNlY3VyaXR5KTtcblxuICB2YXIgcmVzdWx0cyA9IFtdO1xuXG4gIHJlc3VsdHMucHVzaCgnLVggJyArIHRoaXMubWV0aG9kLnRvVXBwZXJDYXNlKCkpO1xuXG4gIGlmICh0eXBlb2Ygb2JqLmhlYWRlcnMgIT09ICd1bmRlZmluZWQnKSB7XG4gICAgdmFyIGtleTtcblxuICAgIGZvciAoa2V5IGluIG9iai5oZWFkZXJzKSB7XG4gICAgICB2YXIgdmFsdWUgPSBvYmouaGVhZGVyc1trZXldO1xuICAgICAgaWYodHlwZW9mIHZhbHVlID09PSAnc3RyaW5nJyl7XG4gICAgICAgIHZhbHVlID0gdmFsdWUucmVwbGFjZSgvXFwnL2csICdcXFxcdTAwMjcnKTtcbiAgICAgIH1cbiAgICAgIHJlc3VsdHMucHVzaCgnLS1oZWFkZXIgXFwnJyArIGtleSArICc6ICcgKyB2YWx1ZSArICdcXCcnKTtcbiAgICB9XG4gIH1cbiAgdmFyIGlzRm9ybURhdGEgPSBmYWxzZTtcbiAgdmFyIGlzTXVsdGlwYXJ0ID0gZmFsc2U7XG5cbiAgdmFyIHR5cGUgPSBvYmouaGVhZGVyc1snQ29udGVudC1UeXBlJ107XG4gIGlmKHR5cGUgJiYgdHlwZS5pbmRleE9mKCdhcHBsaWNhdGlvbi94LXd3dy1mb3JtLXVybGVuY29kZWQnKSA9PT0gMCkge1xuICAgIGlzRm9ybURhdGEgPSB0cnVlO1xuICB9XG4gIGVsc2UgaWYgKHR5cGUgJiYgdHlwZS5pbmRleE9mKCdtdWx0aXBhcnQvZm9ybS1kYXRhJykgPT09IDApIHtcbiAgICBpc0Zvcm1EYXRhID0gdHJ1ZTtcbiAgICBpc011bHRpcGFydCA9IHRydWU7XG4gIH1cblxuICBpZiAob2JqLmJvZHkpIHtcbiAgICB2YXIgYm9keTtcbiAgICBpZiAoXy5pc09iamVjdChvYmouYm9keSkpIHtcbiAgICAgIGlmKGlzTXVsdGlwYXJ0KSB7XG4gICAgICAgIGlzTXVsdGlwYXJ0ID0gdHJ1ZTtcbiAgICAgICAgLy8gYWRkIHRoZSBmb3JtIGRhdGFcbiAgICAgICAgZm9yKHZhciBpID0gMDsgaSA8IHRoaXMucGFyYW1ldGVycy5sZW5ndGg7IGkrKykge1xuICAgICAgICAgIHZhciBwYXJhbWV0ZXIgPSB0aGlzLnBhcmFtZXRlcnNbaV07XG4gICAgICAgICAgaWYocGFyYW1ldGVyLmluID09PSAnZm9ybURhdGEnKSB7XG4gICAgICAgICAgICBpZiAoIWJvZHkpIHtcbiAgICAgICAgICAgICAgYm9keSA9ICcnO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICB2YXIgcGFyYW1WYWx1ZTtcbiAgICAgICAgICAgIGlmKHR5cGVvZiBGb3JtRGF0YSA9PT0gJ2Z1bmN0aW9uJyAmJiBvYmouYm9keSBpbnN0YW5jZW9mIEZvcm1EYXRhKSB7XG4gICAgICAgICAgICAgIHBhcmFtVmFsdWUgPSBvYmouYm9keS5nZXRBbGwocGFyYW1ldGVyLm5hbWUpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICAgIHBhcmFtVmFsdWUgPSBvYmouYm9keVtwYXJhbWV0ZXIubmFtZV07XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBpZiAocGFyYW1WYWx1ZSkge1xuICAgICAgICAgICAgICBpZiAocGFyYW1ldGVyLnR5cGUgPT09ICdmaWxlJykge1xuICAgICAgICAgICAgICAgIGlmKHBhcmFtVmFsdWUubmFtZSkge1xuICAgICAgICAgICAgICAgICAgYm9keSArPSAnLUYgJyArIHBhcmFtZXRlci5uYW1lICsgJz1AXCInICsgcGFyYW1WYWx1ZS5uYW1lICsgJ1wiICc7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgICAgIGlmIChBcnJheS5pc0FycmF5KHBhcmFtVmFsdWUpKSB7XG4gICAgICAgICAgICAgICAgICBpZihwYXJhbWV0ZXIuY29sbGVjdGlvbkZvcm1hdCA9PT0gJ211bHRpJykge1xuICAgICAgICAgICAgICAgICAgICBmb3IodmFyIHYgaW4gcGFyYW1WYWx1ZSkge1xuICAgICAgICAgICAgICAgICAgICAgIGJvZHkgKz0gJy1GICcgKyB0aGlzLmVuY29kZVF1ZXJ5S2V5KHBhcmFtZXRlci5uYW1lKSArICc9JyArIG1hc2socGFyYW1WYWx1ZVt2XSwgcGFyYW1ldGVyLmZvcm1hdCkgKyAnICc7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICBib2R5ICs9ICctRiAnICsgdGhpcy5lbmNvZGVRdWVyeUNvbGxlY3Rpb24ocGFyYW1ldGVyLmNvbGxlY3Rpb25Gb3JtYXQsIHBhcmFtZXRlci5uYW1lLCBtYXNrKHBhcmFtVmFsdWUsIHBhcmFtZXRlci5mb3JtYXQpKSArICcgJztcbiAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgICAgYm9keSArPSAnLUYgJyArIHRoaXMuZW5jb2RlUXVlcnlLZXkocGFyYW1ldGVyLm5hbWUpICsgJz0nICsgbWFzayhwYXJhbVZhbHVlLCBwYXJhbWV0ZXIuZm9ybWF0KSArICcgJztcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICAgIGlmKCFib2R5KSB7XG4gICAgICAgIGJvZHkgPSBKU09OLnN0cmluZ2lmeShvYmouYm9keSk7XG4gICAgICB9XG4gICAgfSBlbHNlIHtcbiAgICAgIGJvZHkgPSBvYmouYm9keTtcbiAgICB9XG4gICAgLy8gZXNjYXBlIEAgPT4gJTQwLCAnID0+ICUyN1xuICAgIGJvZHkgPSBib2R5LnJlcGxhY2UoL1xcJy9nLCAnJTI3JykucmVwbGFjZSgvXFxuL2csICcgXFxcXCBcXG4gJyk7XG5cbiAgICBpZighaXNGb3JtRGF0YSkge1xuICAgICAgLy8gZXNjYXBlICYgPT4gJTI2XG4gICAgICBib2R5ID0gYm9keS5yZXBsYWNlKC8mL2csICclMjYnKTtcbiAgICB9XG4gICAgaWYoaXNNdWx0aXBhcnQpIHtcbiAgICAgIHJlc3VsdHMucHVzaChib2R5KTtcbiAgICB9XG4gICAgZWxzZSB7XG4gICAgICByZXN1bHRzLnB1c2goJy1kIFxcJycgKyBib2R5LnJlcGxhY2UoL0AvZywgJyU0MCcpICsgJ1xcJycpO1xuICAgIH1cbiAgfVxuXG4gIHJldHVybiAnY3VybCAnICsgKHJlc3VsdHMuam9pbignICcpKSArICcgXFwnJyArIG9iai51cmwgKyAnXFwnJztcbn07XG5cbk9wZXJhdGlvbi5wcm90b3R5cGUuZW5jb2RlUGF0aENvbGxlY3Rpb24gPSBmdW5jdGlvbiAodHlwZSwgbmFtZSwgdmFsdWUsIG1hc2tQYXNzd29yZHMpIHtcbiAgdmFyIGVuY29kZWQgPSAnJztcbiAgdmFyIGk7XG4gIHZhciBzZXBhcmF0b3IgPSAnJztcblxuICBpZiAodHlwZSA9PT0gJ3NzdicpIHtcbiAgICBzZXBhcmF0b3IgPSAnJTIwJztcbiAgfSBlbHNlIGlmICh0eXBlID09PSAndHN2Jykge1xuICAgIHNlcGFyYXRvciA9ICclMDknO1xuICB9IGVsc2UgaWYgKHR5cGUgPT09ICdwaXBlcycpIHtcbiAgICBzZXBhcmF0b3IgPSAnfCc7XG4gIH0gZWxzZSB7XG4gICAgc2VwYXJhdG9yID0gJywnO1xuICB9XG5cbiAgZm9yIChpID0gMDsgaSA8IHZhbHVlLmxlbmd0aDsgaSsrKSB7XG4gICAgaWYgKGkgPT09IDApIHtcbiAgICAgIGVuY29kZWQgPSB0aGlzLmVuY29kZVF1ZXJ5UGFyYW0odmFsdWVbaV0sIG1hc2tQYXNzd29yZHMpO1xuICAgIH0gZWxzZSB7XG4gICAgICBlbmNvZGVkICs9IHNlcGFyYXRvciArIHRoaXMuZW5jb2RlUXVlcnlQYXJhbSh2YWx1ZVtpXSwgbWFza1Bhc3N3b3Jkcyk7XG4gICAgfVxuICB9XG5cbiAgcmV0dXJuIGVuY29kZWQ7XG59O1xuXG5PcGVyYXRpb24ucHJvdG90eXBlLmVuY29kZVF1ZXJ5Q29sbGVjdGlvbiA9IGZ1bmN0aW9uICh0eXBlLCBuYW1lLCB2YWx1ZSwgbWFza1Bhc3N3b3Jkcykge1xuICB2YXIgZW5jb2RlZCA9ICcnO1xuICB2YXIgaTtcblxuICB0eXBlID0gdHlwZSB8fCAnZGVmYXVsdCc7XG4gIGlmICh0eXBlID09PSAnZGVmYXVsdCcgfHwgdHlwZSA9PT0gJ211bHRpJykge1xuICAgIGZvciAoaSA9IDA7IGkgPCB2YWx1ZS5sZW5ndGg7IGkrKykge1xuICAgICAgaWYgKGkgPiAwKSB7ZW5jb2RlZCArPSAnJic7fVxuXG4gICAgICBlbmNvZGVkICs9IHRoaXMuZW5jb2RlUXVlcnlLZXkobmFtZSkgKyAnPScgKyBtYXNrKHRoaXMuZW5jb2RlUXVlcnlQYXJhbSh2YWx1ZVtpXSksIG1hc2tQYXNzd29yZHMpO1xuICAgIH1cbiAgfSBlbHNlIHtcbiAgICB2YXIgc2VwYXJhdG9yID0gJyc7XG5cbiAgICBpZiAodHlwZSA9PT0gJ2NzdicpIHtcbiAgICAgIHNlcGFyYXRvciA9ICcsJztcbiAgICB9IGVsc2UgaWYgKHR5cGUgPT09ICdzc3YnKSB7XG4gICAgICBzZXBhcmF0b3IgPSAnJTIwJztcbiAgICB9IGVsc2UgaWYgKHR5cGUgPT09ICd0c3YnKSB7XG4gICAgICBzZXBhcmF0b3IgPSAnJTA5JztcbiAgICB9IGVsc2UgaWYgKHR5cGUgPT09ICdwaXBlcycpIHtcbiAgICAgIHNlcGFyYXRvciA9ICd8JztcbiAgICB9IGVsc2UgaWYgKHR5cGUgPT09ICdicmFja2V0cycpIHtcbiAgICAgIGZvciAoaSA9IDA7IGkgPCB2YWx1ZS5sZW5ndGg7IGkrKykge1xuICAgICAgICBpZiAoaSAhPT0gMCkge1xuICAgICAgICAgIGVuY29kZWQgKz0gJyYnO1xuICAgICAgICB9XG4gICAgICAgIGVuY29kZWQgKz0gdGhpcy5lbmNvZGVRdWVyeUtleShuYW1lKSArICdbXT0nICsgbWFzayh0aGlzLmVuY29kZVF1ZXJ5UGFyYW0odmFsdWVbaV0pLCBtYXNrUGFzc3dvcmRzKTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICBpZiAoc2VwYXJhdG9yICE9PSAnJykge1xuICAgICAgZm9yIChpID0gMDsgaSA8IHZhbHVlLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgIGlmIChpID09PSAwKSB7XG4gICAgICAgICAgZW5jb2RlZCA9IHRoaXMuZW5jb2RlUXVlcnlLZXkobmFtZSkgKyAnPScgKyB0aGlzLmVuY29kZVF1ZXJ5UGFyYW0odmFsdWVbaV0pO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIGVuY29kZWQgKz0gc2VwYXJhdG9yICsgdGhpcy5lbmNvZGVRdWVyeVBhcmFtKHZhbHVlW2ldKTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIHJldHVybiBlbmNvZGVkO1xufTtcblxuT3BlcmF0aW9uLnByb3RvdHlwZS5lbmNvZGVRdWVyeUtleSA9IGZ1bmN0aW9uIChhcmcpIHtcbiAgcmV0dXJuIGVuY29kZVVSSUNvbXBvbmVudChhcmcpXG4gICAgICAucmVwbGFjZSgnJTVCJywnWycpLnJlcGxhY2UoJyU1RCcsICddJykucmVwbGFjZSgnJTI0JywgJyQnKTtcbn07XG5cbk9wZXJhdGlvbi5wcm90b3R5cGUuZW5jb2RlUXVlcnlQYXJhbSA9IGZ1bmN0aW9uIChhcmcsIG1hc2tQYXNzd29yZHMpIHtcbiAgaWYobWFza1Bhc3N3b3Jkcykge1xuICAgIHJldHVybiBcIioqKioqKlwiO1xuICB9XG4gIHJldHVybiBlbmNvZGVVUklDb21wb25lbnQoYXJnKTtcbn07XG5cbi8qKlxuICogVE9ETyByZXZpc2l0LCBtaWdodCBub3Qgd2FudCB0byBsZWF2ZSAnLydcbiAqKi9cbk9wZXJhdGlvbi5wcm90b3R5cGUuZW5jb2RlUGF0aFBhcmFtID0gZnVuY3Rpb24gKHBhdGhQYXJhbSwgbWFza1Bhc3N3b3Jkcykge1xuICByZXR1cm4gZW5jb2RlVVJJQ29tcG9uZW50KHBhdGhQYXJhbSwgbWFza1Bhc3N3b3Jkcyk7XG59O1xuXG52YXIgbWFzayA9IGZ1bmN0aW9uKHZhbHVlLCBmb3JtYXQpIHtcbiAgaWYodHlwZW9mIGZvcm1hdCA9PT0gJ3N0cmluZycgJiYgZm9ybWF0ID09PSAncGFzc3dvcmQnKSB7XG4gICAgcmV0dXJuICcqKioqKionO1xuICB9XG4gIHJldHVybiB2YWx1ZTtcbn0iLCIndXNlIHN0cmljdCc7XG5cbnZhciBPcGVyYXRpb25Hcm91cCA9IG1vZHVsZS5leHBvcnRzID0gZnVuY3Rpb24gKHRhZywgZGVzY3JpcHRpb24sIGV4dGVybmFsRG9jcywgb3BlcmF0aW9uKSB7XG4gIHRoaXMuZGVzY3JpcHRpb24gPSBkZXNjcmlwdGlvbjtcbiAgdGhpcy5leHRlcm5hbERvY3MgPSBleHRlcm5hbERvY3M7XG4gIHRoaXMubmFtZSA9IHRhZztcbiAgdGhpcy5vcGVyYXRpb24gPSBvcGVyYXRpb247XG4gIHRoaXMub3BlcmF0aW9uc0FycmF5ID0gW107XG4gIHRoaXMucGF0aCA9IHRhZztcbiAgdGhpcy50YWcgPSB0YWc7XG59O1xuXG5PcGVyYXRpb25Hcm91cC5wcm90b3R5cGUuc29ydCA9IGZ1bmN0aW9uICgpIHtcblxufTtcblxuIiwiLy8gc2hpbSBmb3IgdXNpbmcgcHJvY2VzcyBpbiBicm93c2VyXG5cbnZhciBwcm9jZXNzID0gbW9kdWxlLmV4cG9ydHMgPSB7fTtcbnZhciBxdWV1ZSA9IFtdO1xudmFyIGRyYWluaW5nID0gZmFsc2U7XG5cbmZ1bmN0aW9uIGRyYWluUXVldWUoKSB7XG4gICAgaWYgKGRyYWluaW5nKSB7XG4gICAgICAgIHJldHVybjtcbiAgICB9XG4gICAgZHJhaW5pbmcgPSB0cnVlO1xuICAgIHZhciBjdXJyZW50UXVldWU7XG4gICAgdmFyIGxlbiA9IHF1ZXVlLmxlbmd0aDtcbiAgICB3aGlsZShsZW4pIHtcbiAgICAgICAgY3VycmVudFF1ZXVlID0gcXVldWU7XG4gICAgICAgIHF1ZXVlID0gW107XG4gICAgICAgIHZhciBpID0gLTE7XG4gICAgICAgIHdoaWxlICgrK2kgPCBsZW4pIHtcbiAgICAgICAgICAgIGN1cnJlbnRRdWV1ZVtpXSgpO1xuICAgICAgICB9XG4gICAgICAgIGxlbiA9IHF1ZXVlLmxlbmd0aDtcbiAgICB9XG4gICAgZHJhaW5pbmcgPSBmYWxzZTtcbn1cbnByb2Nlc3MubmV4dFRpY2sgPSBmdW5jdGlvbiAoZnVuKSB7XG4gICAgcXVldWUucHVzaChmdW4pO1xuICAgIGlmICghZHJhaW5pbmcpIHtcbiAgICAgICAgc2V0VGltZW91dChkcmFpblF1ZXVlLCAwKTtcbiAgICB9XG59O1xuXG5wcm9jZXNzLnRpdGxlID0gJ2Jyb3dzZXInO1xucHJvY2Vzcy5icm93c2VyID0gdHJ1ZTtcbnByb2Nlc3MuZW52ID0ge307XG5wcm9jZXNzLmFyZ3YgPSBbXTtcbnByb2Nlc3MudmVyc2lvbiA9ICcnOyAvLyBlbXB0eSBzdHJpbmcgdG8gYXZvaWQgcmVnZXhwIGlzc3Vlc1xucHJvY2Vzcy52ZXJzaW9ucyA9IHt9O1xuXG5mdW5jdGlvbiBub29wKCkge31cblxucHJvY2Vzcy5vbiA9IG5vb3A7XG5wcm9jZXNzLmFkZExpc3RlbmVyID0gbm9vcDtcbnByb2Nlc3Mub25jZSA9IG5vb3A7XG5wcm9jZXNzLm9mZiA9IG5vb3A7XG5wcm9jZXNzLnJlbW92ZUxpc3RlbmVyID0gbm9vcDtcbnByb2Nlc3MucmVtb3ZlQWxsTGlzdGVuZXJzID0gbm9vcDtcbnByb2Nlc3MuZW1pdCA9IG5vb3A7XG5cbnByb2Nlc3MuYmluZGluZyA9IGZ1bmN0aW9uIChuYW1lKSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKCdwcm9jZXNzLmJpbmRpbmcgaXMgbm90IHN1cHBvcnRlZCcpO1xufTtcblxuLy8gVE9ETyhzaHR5bG1hbilcbnByb2Nlc3MuY3dkID0gZnVuY3Rpb24gKCkgeyByZXR1cm4gJy8nIH07XG5wcm9jZXNzLmNoZGlyID0gZnVuY3Rpb24gKGRpcikge1xuICAgIHRocm93IG5ldyBFcnJvcigncHJvY2Vzcy5jaGRpciBpcyBub3Qgc3VwcG9ydGVkJyk7XG59O1xucHJvY2Vzcy51bWFzayA9IGZ1bmN0aW9uKCkgeyByZXR1cm4gMDsgfTtcbiIsIihmdW5jdGlvbiAoQnVmZmVyKXtcbihmdW5jdGlvbiAoKSB7XG4gIFwidXNlIHN0cmljdFwiO1xuXG4gIGZ1bmN0aW9uIGJ0b2Eoc3RyKSB7XG4gICAgdmFyIGJ1ZmZlclxuICAgICAgO1xuXG4gICAgaWYgKHN0ciBpbnN0YW5jZW9mIEJ1ZmZlcikge1xuICAgICAgYnVmZmVyID0gc3RyO1xuICAgIH0gZWxzZSB7XG4gICAgICBidWZmZXIgPSBuZXcgQnVmZmVyKHN0ci50b1N0cmluZygpLCAnYmluYXJ5Jyk7XG4gICAgfVxuXG4gICAgcmV0dXJuIGJ1ZmZlci50b1N0cmluZygnYmFzZTY0Jyk7XG4gIH1cblxuICBtb2R1bGUuZXhwb3J0cyA9IGJ0b2E7XG59KCkpO1xuXG59KS5jYWxsKHRoaXMscmVxdWlyZShcImJ1ZmZlclwiKS5CdWZmZXIpXG4vLyMgc291cmNlTWFwcGluZ1VSTD1kYXRhOmFwcGxpY2F0aW9uL2pzb247Y2hhcnNldDp1dGYtODtiYXNlNjQsZXlKMlpYSnphVzl1SWpvekxDSnpiM1Z5WTJWeklqcGJJbTV2WkdWZmJXOWtkV3hsY3k5aWRHOWhMMmx1WkdWNExtcHpJbDBzSW01aGJXVnpJanBiWFN3aWJXRndjR2x1WjNNaU9pSTdRVUZCUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVNJc0ltWnBiR1VpT2lKblpXNWxjbUYwWldRdWFuTWlMQ0p6YjNWeVkyVlNiMjkwSWpvaUlpd2ljMjkxY21ObGMwTnZiblJsYm5RaU9sc2lLR1oxYm1OMGFXOXVJQ2dwSUh0Y2JpQWdYQ0oxYzJVZ2MzUnlhV04wWENJN1hHNWNiaUFnWm5WdVkzUnBiMjRnWW5SdllTaHpkSElwSUh0Y2JpQWdJQ0IyWVhJZ1luVm1abVZ5WEc0Z0lDQWdJQ0E3WEc1Y2JpQWdJQ0JwWmlBb2MzUnlJR2x1YzNSaGJtTmxiMllnUW5WbVptVnlLU0I3WEc0Z0lDQWdJQ0JpZFdabVpYSWdQU0J6ZEhJN1hHNGdJQ0FnZlNCbGJITmxJSHRjYmlBZ0lDQWdJR0oxWm1abGNpQTlJRzVsZHlCQ2RXWm1aWElvYzNSeUxuUnZVM1J5YVc1bktDa3NJQ2RpYVc1aGNua25LVHRjYmlBZ0lDQjlYRzVjYmlBZ0lDQnlaWFIxY200Z1luVm1abVZ5TG5SdlUzUnlhVzVuS0NkaVlYTmxOalFuS1R0Y2JpQWdmVnh1WEc0Z0lHMXZaSFZzWlM1bGVIQnZjblJ6SUQwZ1luUnZZVHRjYm4wb0tTazdYRzRpWFgwPSIsIi8qIVxuICogVGhlIGJ1ZmZlciBtb2R1bGUgZnJvbSBub2RlLmpzLCBmb3IgdGhlIGJyb3dzZXIuXG4gKlxuICogQGF1dGhvciAgIEZlcm9zcyBBYm91a2hhZGlqZWggPGZlcm9zc0BmZXJvc3Mub3JnPiA8aHR0cDovL2Zlcm9zcy5vcmc+XG4gKiBAbGljZW5zZSAgTUlUXG4gKi9cblxudmFyIGJhc2U2NCA9IHJlcXVpcmUoJ2Jhc2U2NC1qcycpXG52YXIgaWVlZTc1NCA9IHJlcXVpcmUoJ2llZWU3NTQnKVxudmFyIGlzQXJyYXkgPSByZXF1aXJlKCdpcy1hcnJheScpXG5cbmV4cG9ydHMuQnVmZmVyID0gQnVmZmVyXG5leHBvcnRzLlNsb3dCdWZmZXIgPSBTbG93QnVmZmVyXG5leHBvcnRzLklOU1BFQ1RfTUFYX0JZVEVTID0gNTBcbkJ1ZmZlci5wb29sU2l6ZSA9IDgxOTIgLy8gbm90IHVzZWQgYnkgdGhpcyBpbXBsZW1lbnRhdGlvblxuXG52YXIgcm9vdFBhcmVudCA9IHt9XG5cbi8qKlxuICogSWYgYEJ1ZmZlci5UWVBFRF9BUlJBWV9TVVBQT1JUYDpcbiAqICAgPT09IHRydWUgICAgVXNlIFVpbnQ4QXJyYXkgaW1wbGVtZW50YXRpb24gKGZhc3Rlc3QpXG4gKiAgID09PSBmYWxzZSAgIFVzZSBPYmplY3QgaW1wbGVtZW50YXRpb24gKG1vc3QgY29tcGF0aWJsZSwgZXZlbiBJRTYpXG4gKlxuICogQnJvd3NlcnMgdGhhdCBzdXBwb3J0IHR5cGVkIGFycmF5cyBhcmUgSUUgMTArLCBGaXJlZm94IDQrLCBDaHJvbWUgNyssIFNhZmFyaSA1LjErLFxuICogT3BlcmEgMTEuNissIGlPUyA0LjIrLlxuICpcbiAqIER1ZSB0byB2YXJpb3VzIGJyb3dzZXIgYnVncywgc29tZXRpbWVzIHRoZSBPYmplY3QgaW1wbGVtZW50YXRpb24gd2lsbCBiZSB1c2VkIGV2ZW5cbiAqIHdoZW4gdGhlIGJyb3dzZXIgc3VwcG9ydHMgdHlwZWQgYXJyYXlzLlxuICpcbiAqIE5vdGU6XG4gKlxuICogICAtIEZpcmVmb3ggNC0yOSBsYWNrcyBzdXBwb3J0IGZvciBhZGRpbmcgbmV3IHByb3BlcnRpZXMgdG8gYFVpbnQ4QXJyYXlgIGluc3RhbmNlcyxcbiAqICAgICBTZWU6IGh0dHBzOi8vYnVnemlsbGEubW96aWxsYS5vcmcvc2hvd19idWcuY2dpP2lkPTY5NTQzOC5cbiAqXG4gKiAgIC0gU2FmYXJpIDUtNyBsYWNrcyBzdXBwb3J0IGZvciBjaGFuZ2luZyB0aGUgYE9iamVjdC5wcm90b3R5cGUuY29uc3RydWN0b3JgIHByb3BlcnR5XG4gKiAgICAgb24gb2JqZWN0cy5cbiAqXG4gKiAgIC0gQ2hyb21lIDktMTAgaXMgbWlzc2luZyB0aGUgYFR5cGVkQXJyYXkucHJvdG90eXBlLnN1YmFycmF5YCBmdW5jdGlvbi5cbiAqXG4gKiAgIC0gSUUxMCBoYXMgYSBicm9rZW4gYFR5cGVkQXJyYXkucHJvdG90eXBlLnN1YmFycmF5YCBmdW5jdGlvbiB3aGljaCByZXR1cm5zIGFycmF5cyBvZlxuICogICAgIGluY29ycmVjdCBsZW5ndGggaW4gc29tZSBzaXR1YXRpb25zLlxuXG4gKiBXZSBkZXRlY3QgdGhlc2UgYnVnZ3kgYnJvd3NlcnMgYW5kIHNldCBgQnVmZmVyLlRZUEVEX0FSUkFZX1NVUFBPUlRgIHRvIGBmYWxzZWAgc28gdGhleVxuICogZ2V0IHRoZSBPYmplY3QgaW1wbGVtZW50YXRpb24sIHdoaWNoIGlzIHNsb3dlciBidXQgYmVoYXZlcyBjb3JyZWN0bHkuXG4gKi9cbkJ1ZmZlci5UWVBFRF9BUlJBWV9TVVBQT1JUID0gKGZ1bmN0aW9uICgpIHtcbiAgZnVuY3Rpb24gQmFyICgpIHt9XG4gIHRyeSB7XG4gICAgdmFyIGFyciA9IG5ldyBVaW50OEFycmF5KDEpXG4gICAgYXJyLmZvbyA9IGZ1bmN0aW9uICgpIHsgcmV0dXJuIDQyIH1cbiAgICBhcnIuY29uc3RydWN0b3IgPSBCYXJcbiAgICByZXR1cm4gYXJyLmZvbygpID09PSA0MiAmJiAvLyB0eXBlZCBhcnJheSBpbnN0YW5jZXMgY2FuIGJlIGF1Z21lbnRlZFxuICAgICAgICBhcnIuY29uc3RydWN0b3IgPT09IEJhciAmJiAvLyBjb25zdHJ1Y3RvciBjYW4gYmUgc2V0XG4gICAgICAgIHR5cGVvZiBhcnIuc3ViYXJyYXkgPT09ICdmdW5jdGlvbicgJiYgLy8gY2hyb21lIDktMTAgbGFjayBgc3ViYXJyYXlgXG4gICAgICAgIGFyci5zdWJhcnJheSgxLCAxKS5ieXRlTGVuZ3RoID09PSAwIC8vIGllMTAgaGFzIGJyb2tlbiBgc3ViYXJyYXlgXG4gIH0gY2F0Y2ggKGUpIHtcbiAgICByZXR1cm4gZmFsc2VcbiAgfVxufSkoKVxuXG5mdW5jdGlvbiBrTWF4TGVuZ3RoICgpIHtcbiAgcmV0dXJuIEJ1ZmZlci5UWVBFRF9BUlJBWV9TVVBQT1JUXG4gICAgPyAweDdmZmZmZmZmXG4gICAgOiAweDNmZmZmZmZmXG59XG5cbi8qKlxuICogQ2xhc3M6IEJ1ZmZlclxuICogPT09PT09PT09PT09PVxuICpcbiAqIFRoZSBCdWZmZXIgY29uc3RydWN0b3IgcmV0dXJucyBpbnN0YW5jZXMgb2YgYFVpbnQ4QXJyYXlgIHRoYXQgYXJlIGF1Z21lbnRlZFxuICogd2l0aCBmdW5jdGlvbiBwcm9wZXJ0aWVzIGZvciBhbGwgdGhlIG5vZGUgYEJ1ZmZlcmAgQVBJIGZ1bmN0aW9ucy4gV2UgdXNlXG4gKiBgVWludDhBcnJheWAgc28gdGhhdCBzcXVhcmUgYnJhY2tldCBub3RhdGlvbiB3b3JrcyBhcyBleHBlY3RlZCAtLSBpdCByZXR1cm5zXG4gKiBhIHNpbmdsZSBvY3RldC5cbiAqXG4gKiBCeSBhdWdtZW50aW5nIHRoZSBpbnN0YW5jZXMsIHdlIGNhbiBhdm9pZCBtb2RpZnlpbmcgdGhlIGBVaW50OEFycmF5YFxuICogcHJvdG90eXBlLlxuICovXG5mdW5jdGlvbiBCdWZmZXIgKGFyZykge1xuICBpZiAoISh0aGlzIGluc3RhbmNlb2YgQnVmZmVyKSkge1xuICAgIC8vIEF2b2lkIGdvaW5nIHRocm91Z2ggYW4gQXJndW1lbnRzQWRhcHRvclRyYW1wb2xpbmUgaW4gdGhlIGNvbW1vbiBjYXNlLlxuICAgIGlmIChhcmd1bWVudHMubGVuZ3RoID4gMSkgcmV0dXJuIG5ldyBCdWZmZXIoYXJnLCBhcmd1bWVudHNbMV0pXG4gICAgcmV0dXJuIG5ldyBCdWZmZXIoYXJnKVxuICB9XG5cbiAgdGhpcy5sZW5ndGggPSAwXG4gIHRoaXMucGFyZW50ID0gdW5kZWZpbmVkXG5cbiAgLy8gQ29tbW9uIGNhc2UuXG4gIGlmICh0eXBlb2YgYXJnID09PSAnbnVtYmVyJykge1xuICAgIHJldHVybiBmcm9tTnVtYmVyKHRoaXMsIGFyZylcbiAgfVxuXG4gIC8vIFNsaWdodGx5IGxlc3MgY29tbW9uIGNhc2UuXG4gIGlmICh0eXBlb2YgYXJnID09PSAnc3RyaW5nJykge1xuICAgIHJldHVybiBmcm9tU3RyaW5nKHRoaXMsIGFyZywgYXJndW1lbnRzLmxlbmd0aCA+IDEgPyBhcmd1bWVudHNbMV0gOiAndXRmOCcpXG4gIH1cblxuICAvLyBVbnVzdWFsLlxuICByZXR1cm4gZnJvbU9iamVjdCh0aGlzLCBhcmcpXG59XG5cbmZ1bmN0aW9uIGZyb21OdW1iZXIgKHRoYXQsIGxlbmd0aCkge1xuICB0aGF0ID0gYWxsb2NhdGUodGhhdCwgbGVuZ3RoIDwgMCA/IDAgOiBjaGVja2VkKGxlbmd0aCkgfCAwKVxuICBpZiAoIUJ1ZmZlci5UWVBFRF9BUlJBWV9TVVBQT1JUKSB7XG4gICAgZm9yICh2YXIgaSA9IDA7IGkgPCBsZW5ndGg7IGkrKykge1xuICAgICAgdGhhdFtpXSA9IDBcbiAgICB9XG4gIH1cbiAgcmV0dXJuIHRoYXRcbn1cblxuZnVuY3Rpb24gZnJvbVN0cmluZyAodGhhdCwgc3RyaW5nLCBlbmNvZGluZykge1xuICBpZiAodHlwZW9mIGVuY29kaW5nICE9PSAnc3RyaW5nJyB8fCBlbmNvZGluZyA9PT0gJycpIGVuY29kaW5nID0gJ3V0ZjgnXG5cbiAgLy8gQXNzdW1wdGlvbjogYnl0ZUxlbmd0aCgpIHJldHVybiB2YWx1ZSBpcyBhbHdheXMgPCBrTWF4TGVuZ3RoLlxuICB2YXIgbGVuZ3RoID0gYnl0ZUxlbmd0aChzdHJpbmcsIGVuY29kaW5nKSB8IDBcbiAgdGhhdCA9IGFsbG9jYXRlKHRoYXQsIGxlbmd0aClcblxuICB0aGF0LndyaXRlKHN0cmluZywgZW5jb2RpbmcpXG4gIHJldHVybiB0aGF0XG59XG5cbmZ1bmN0aW9uIGZyb21PYmplY3QgKHRoYXQsIG9iamVjdCkge1xuICBpZiAoQnVmZmVyLmlzQnVmZmVyKG9iamVjdCkpIHJldHVybiBmcm9tQnVmZmVyKHRoYXQsIG9iamVjdClcblxuICBpZiAoaXNBcnJheShvYmplY3QpKSByZXR1cm4gZnJvbUFycmF5KHRoYXQsIG9iamVjdClcblxuICBpZiAob2JqZWN0ID09IG51bGwpIHtcbiAgICB0aHJvdyBuZXcgVHlwZUVycm9yKCdtdXN0IHN0YXJ0IHdpdGggbnVtYmVyLCBidWZmZXIsIGFycmF5IG9yIHN0cmluZycpXG4gIH1cblxuICBpZiAodHlwZW9mIEFycmF5QnVmZmVyICE9PSAndW5kZWZpbmVkJykge1xuICAgIGlmIChvYmplY3QuYnVmZmVyIGluc3RhbmNlb2YgQXJyYXlCdWZmZXIpIHtcbiAgICAgIHJldHVybiBmcm9tVHlwZWRBcnJheSh0aGF0LCBvYmplY3QpXG4gICAgfVxuICAgIGlmIChvYmplY3QgaW5zdGFuY2VvZiBBcnJheUJ1ZmZlcikge1xuICAgICAgcmV0dXJuIGZyb21BcnJheUJ1ZmZlcih0aGF0LCBvYmplY3QpXG4gICAgfVxuICB9XG5cbiAgaWYgKG9iamVjdC5sZW5ndGgpIHJldHVybiBmcm9tQXJyYXlMaWtlKHRoYXQsIG9iamVjdClcblxuICByZXR1cm4gZnJvbUpzb25PYmplY3QodGhhdCwgb2JqZWN0KVxufVxuXG5mdW5jdGlvbiBmcm9tQnVmZmVyICh0aGF0LCBidWZmZXIpIHtcbiAgdmFyIGxlbmd0aCA9IGNoZWNrZWQoYnVmZmVyLmxlbmd0aCkgfCAwXG4gIHRoYXQgPSBhbGxvY2F0ZSh0aGF0LCBsZW5ndGgpXG4gIGJ1ZmZlci5jb3B5KHRoYXQsIDAsIDAsIGxlbmd0aClcbiAgcmV0dXJuIHRoYXRcbn1cblxuZnVuY3Rpb24gZnJvbUFycmF5ICh0aGF0LCBhcnJheSkge1xuICB2YXIgbGVuZ3RoID0gY2hlY2tlZChhcnJheS5sZW5ndGgpIHwgMFxuICB0aGF0ID0gYWxsb2NhdGUodGhhdCwgbGVuZ3RoKVxuICBmb3IgKHZhciBpID0gMDsgaSA8IGxlbmd0aDsgaSArPSAxKSB7XG4gICAgdGhhdFtpXSA9IGFycmF5W2ldICYgMjU1XG4gIH1cbiAgcmV0dXJuIHRoYXRcbn1cblxuLy8gRHVwbGljYXRlIG9mIGZyb21BcnJheSgpIHRvIGtlZXAgZnJvbUFycmF5KCkgbW9ub21vcnBoaWMuXG5mdW5jdGlvbiBmcm9tVHlwZWRBcnJheSAodGhhdCwgYXJyYXkpIHtcbiAgdmFyIGxlbmd0aCA9IGNoZWNrZWQoYXJyYXkubGVuZ3RoKSB8IDBcbiAgdGhhdCA9IGFsbG9jYXRlKHRoYXQsIGxlbmd0aClcbiAgLy8gVHJ1bmNhdGluZyB0aGUgZWxlbWVudHMgaXMgcHJvYmFibHkgbm90IHdoYXQgcGVvcGxlIGV4cGVjdCBmcm9tIHR5cGVkXG4gIC8vIGFycmF5cyB3aXRoIEJZVEVTX1BFUl9FTEVNRU5UID4gMSBidXQgaXQncyBjb21wYXRpYmxlIHdpdGggdGhlIGJlaGF2aW9yXG4gIC8vIG9mIHRoZSBvbGQgQnVmZmVyIGNvbnN0cnVjdG9yLlxuICBmb3IgKHZhciBpID0gMDsgaSA8IGxlbmd0aDsgaSArPSAxKSB7XG4gICAgdGhhdFtpXSA9IGFycmF5W2ldICYgMjU1XG4gIH1cbiAgcmV0dXJuIHRoYXRcbn1cblxuZnVuY3Rpb24gZnJvbUFycmF5QnVmZmVyICh0aGF0LCBhcnJheSkge1xuICBpZiAoQnVmZmVyLlRZUEVEX0FSUkFZX1NVUFBPUlQpIHtcbiAgICAvLyBSZXR1cm4gYW4gYXVnbWVudGVkIGBVaW50OEFycmF5YCBpbnN0YW5jZSwgZm9yIGJlc3QgcGVyZm9ybWFuY2VcbiAgICBhcnJheS5ieXRlTGVuZ3RoXG4gICAgdGhhdCA9IEJ1ZmZlci5fYXVnbWVudChuZXcgVWludDhBcnJheShhcnJheSkpXG4gIH0gZWxzZSB7XG4gICAgLy8gRmFsbGJhY2s6IFJldHVybiBhbiBvYmplY3QgaW5zdGFuY2Ugb2YgdGhlIEJ1ZmZlciBjbGFzc1xuICAgIHRoYXQgPSBmcm9tVHlwZWRBcnJheSh0aGF0LCBuZXcgVWludDhBcnJheShhcnJheSkpXG4gIH1cbiAgcmV0dXJuIHRoYXRcbn1cblxuZnVuY3Rpb24gZnJvbUFycmF5TGlrZSAodGhhdCwgYXJyYXkpIHtcbiAgdmFyIGxlbmd0aCA9IGNoZWNrZWQoYXJyYXkubGVuZ3RoKSB8IDBcbiAgdGhhdCA9IGFsbG9jYXRlKHRoYXQsIGxlbmd0aClcbiAgZm9yICh2YXIgaSA9IDA7IGkgPCBsZW5ndGg7IGkgKz0gMSkge1xuICAgIHRoYXRbaV0gPSBhcnJheVtpXSAmIDI1NVxuICB9XG4gIHJldHVybiB0aGF0XG59XG5cbi8vIERlc2VyaWFsaXplIHsgdHlwZTogJ0J1ZmZlcicsIGRhdGE6IFsxLDIsMywuLi5dIH0gaW50byBhIEJ1ZmZlciBvYmplY3QuXG4vLyBSZXR1cm5zIGEgemVyby1sZW5ndGggYnVmZmVyIGZvciBpbnB1dHMgdGhhdCBkb24ndCBjb25mb3JtIHRvIHRoZSBzcGVjLlxuZnVuY3Rpb24gZnJvbUpzb25PYmplY3QgKHRoYXQsIG9iamVjdCkge1xuICB2YXIgYXJyYXlcbiAgdmFyIGxlbmd0aCA9IDBcblxuICBpZiAob2JqZWN0LnR5cGUgPT09ICdCdWZmZXInICYmIGlzQXJyYXkob2JqZWN0LmRhdGEpKSB7XG4gICAgYXJyYXkgPSBvYmplY3QuZGF0YVxuICAgIGxlbmd0aCA9IGNoZWNrZWQoYXJyYXkubGVuZ3RoKSB8IDBcbiAgfVxuICB0aGF0ID0gYWxsb2NhdGUodGhhdCwgbGVuZ3RoKVxuXG4gIGZvciAodmFyIGkgPSAwOyBpIDwgbGVuZ3RoOyBpICs9IDEpIHtcbiAgICB0aGF0W2ldID0gYXJyYXlbaV0gJiAyNTVcbiAgfVxuICByZXR1cm4gdGhhdFxufVxuXG5mdW5jdGlvbiBhbGxvY2F0ZSAodGhhdCwgbGVuZ3RoKSB7XG4gIGlmIChCdWZmZXIuVFlQRURfQVJSQVlfU1VQUE9SVCkge1xuICAgIC8vIFJldHVybiBhbiBhdWdtZW50ZWQgYFVpbnQ4QXJyYXlgIGluc3RhbmNlLCBmb3IgYmVzdCBwZXJmb3JtYW5jZVxuICAgIHRoYXQgPSBCdWZmZXIuX2F1Z21lbnQobmV3IFVpbnQ4QXJyYXkobGVuZ3RoKSlcbiAgfSBlbHNlIHtcbiAgICAvLyBGYWxsYmFjazogUmV0dXJuIGFuIG9iamVjdCBpbnN0YW5jZSBvZiB0aGUgQnVmZmVyIGNsYXNzXG4gICAgdGhhdC5sZW5ndGggPSBsZW5ndGhcbiAgICB0aGF0Ll9pc0J1ZmZlciA9IHRydWVcbiAgfVxuXG4gIHZhciBmcm9tUG9vbCA9IGxlbmd0aCAhPT0gMCAmJiBsZW5ndGggPD0gQnVmZmVyLnBvb2xTaXplID4+PiAxXG4gIGlmIChmcm9tUG9vbCkgdGhhdC5wYXJlbnQgPSByb290UGFyZW50XG5cbiAgcmV0dXJuIHRoYXRcbn1cblxuZnVuY3Rpb24gY2hlY2tlZCAobGVuZ3RoKSB7XG4gIC8vIE5vdGU6IGNhbm5vdCB1c2UgYGxlbmd0aCA8IGtNYXhMZW5ndGhgIGhlcmUgYmVjYXVzZSB0aGF0IGZhaWxzIHdoZW5cbiAgLy8gbGVuZ3RoIGlzIE5hTiAod2hpY2ggaXMgb3RoZXJ3aXNlIGNvZXJjZWQgdG8gemVyby4pXG4gIGlmIChsZW5ndGggPj0ga01heExlbmd0aCgpKSB7XG4gICAgdGhyb3cgbmV3IFJhbmdlRXJyb3IoJ0F0dGVtcHQgdG8gYWxsb2NhdGUgQnVmZmVyIGxhcmdlciB0aGFuIG1heGltdW0gJyArXG4gICAgICAgICAgICAgICAgICAgICAgICAgJ3NpemU6IDB4JyArIGtNYXhMZW5ndGgoKS50b1N0cmluZygxNikgKyAnIGJ5dGVzJylcbiAgfVxuICByZXR1cm4gbGVuZ3RoIHwgMFxufVxuXG5mdW5jdGlvbiBTbG93QnVmZmVyIChzdWJqZWN0LCBlbmNvZGluZykge1xuICBpZiAoISh0aGlzIGluc3RhbmNlb2YgU2xvd0J1ZmZlcikpIHJldHVybiBuZXcgU2xvd0J1ZmZlcihzdWJqZWN0LCBlbmNvZGluZylcblxuICB2YXIgYnVmID0gbmV3IEJ1ZmZlcihzdWJqZWN0LCBlbmNvZGluZylcbiAgZGVsZXRlIGJ1Zi5wYXJlbnRcbiAgcmV0dXJuIGJ1ZlxufVxuXG5CdWZmZXIuaXNCdWZmZXIgPSBmdW5jdGlvbiBpc0J1ZmZlciAoYikge1xuICByZXR1cm4gISEoYiAhPSBudWxsICYmIGIuX2lzQnVmZmVyKVxufVxuXG5CdWZmZXIuY29tcGFyZSA9IGZ1bmN0aW9uIGNvbXBhcmUgKGEsIGIpIHtcbiAgaWYgKCFCdWZmZXIuaXNCdWZmZXIoYSkgfHwgIUJ1ZmZlci5pc0J1ZmZlcihiKSkge1xuICAgIHRocm93IG5ldyBUeXBlRXJyb3IoJ0FyZ3VtZW50cyBtdXN0IGJlIEJ1ZmZlcnMnKVxuICB9XG5cbiAgaWYgKGEgPT09IGIpIHJldHVybiAwXG5cbiAgdmFyIHggPSBhLmxlbmd0aFxuICB2YXIgeSA9IGIubGVuZ3RoXG5cbiAgdmFyIGkgPSAwXG4gIHZhciBsZW4gPSBNYXRoLm1pbih4LCB5KVxuICB3aGlsZSAoaSA8IGxlbikge1xuICAgIGlmIChhW2ldICE9PSBiW2ldKSBicmVha1xuXG4gICAgKytpXG4gIH1cblxuICBpZiAoaSAhPT0gbGVuKSB7XG4gICAgeCA9IGFbaV1cbiAgICB5ID0gYltpXVxuICB9XG5cbiAgaWYgKHggPCB5KSByZXR1cm4gLTFcbiAgaWYgKHkgPCB4KSByZXR1cm4gMVxuICByZXR1cm4gMFxufVxuXG5CdWZmZXIuaXNFbmNvZGluZyA9IGZ1bmN0aW9uIGlzRW5jb2RpbmcgKGVuY29kaW5nKSB7XG4gIHN3aXRjaCAoU3RyaW5nKGVuY29kaW5nKS50b0xvd2VyQ2FzZSgpKSB7XG4gICAgY2FzZSAnaGV4JzpcbiAgICBjYXNlICd1dGY4JzpcbiAgICBjYXNlICd1dGYtOCc6XG4gICAgY2FzZSAnYXNjaWknOlxuICAgIGNhc2UgJ2JpbmFyeSc6XG4gICAgY2FzZSAnYmFzZTY0JzpcbiAgICBjYXNlICdyYXcnOlxuICAgIGNhc2UgJ3VjczInOlxuICAgIGNhc2UgJ3Vjcy0yJzpcbiAgICBjYXNlICd1dGYxNmxlJzpcbiAgICBjYXNlICd1dGYtMTZsZSc6XG4gICAgICByZXR1cm4gdHJ1ZVxuICAgIGRlZmF1bHQ6XG4gICAgICByZXR1cm4gZmFsc2VcbiAgfVxufVxuXG5CdWZmZXIuY29uY2F0ID0gZnVuY3Rpb24gY29uY2F0IChsaXN0LCBsZW5ndGgpIHtcbiAgaWYgKCFpc0FycmF5KGxpc3QpKSB0aHJvdyBuZXcgVHlwZUVycm9yKCdsaXN0IGFyZ3VtZW50IG11c3QgYmUgYW4gQXJyYXkgb2YgQnVmZmVycy4nKVxuXG4gIGlmIChsaXN0Lmxlbmd0aCA9PT0gMCkge1xuICAgIHJldHVybiBuZXcgQnVmZmVyKDApXG4gIH1cblxuICB2YXIgaVxuICBpZiAobGVuZ3RoID09PSB1bmRlZmluZWQpIHtcbiAgICBsZW5ndGggPSAwXG4gICAgZm9yIChpID0gMDsgaSA8IGxpc3QubGVuZ3RoOyBpKyspIHtcbiAgICAgIGxlbmd0aCArPSBsaXN0W2ldLmxlbmd0aFxuICAgIH1cbiAgfVxuXG4gIHZhciBidWYgPSBuZXcgQnVmZmVyKGxlbmd0aClcbiAgdmFyIHBvcyA9IDBcbiAgZm9yIChpID0gMDsgaSA8IGxpc3QubGVuZ3RoOyBpKyspIHtcbiAgICB2YXIgaXRlbSA9IGxpc3RbaV1cbiAgICBpdGVtLmNvcHkoYnVmLCBwb3MpXG4gICAgcG9zICs9IGl0ZW0ubGVuZ3RoXG4gIH1cbiAgcmV0dXJuIGJ1ZlxufVxuXG5mdW5jdGlvbiBieXRlTGVuZ3RoIChzdHJpbmcsIGVuY29kaW5nKSB7XG4gIGlmICh0eXBlb2Ygc3RyaW5nICE9PSAnc3RyaW5nJykgc3RyaW5nID0gJycgKyBzdHJpbmdcblxuICB2YXIgbGVuID0gc3RyaW5nLmxlbmd0aFxuICBpZiAobGVuID09PSAwKSByZXR1cm4gMFxuXG4gIC8vIFVzZSBhIGZvciBsb29wIHRvIGF2b2lkIHJlY3Vyc2lvblxuICB2YXIgbG93ZXJlZENhc2UgPSBmYWxzZVxuICBmb3IgKDs7KSB7XG4gICAgc3dpdGNoIChlbmNvZGluZykge1xuICAgICAgY2FzZSAnYXNjaWknOlxuICAgICAgY2FzZSAnYmluYXJ5JzpcbiAgICAgIC8vIERlcHJlY2F0ZWRcbiAgICAgIGNhc2UgJ3Jhdyc6XG4gICAgICBjYXNlICdyYXdzJzpcbiAgICAgICAgcmV0dXJuIGxlblxuICAgICAgY2FzZSAndXRmOCc6XG4gICAgICBjYXNlICd1dGYtOCc6XG4gICAgICAgIHJldHVybiB1dGY4VG9CeXRlcyhzdHJpbmcpLmxlbmd0aFxuICAgICAgY2FzZSAndWNzMic6XG4gICAgICBjYXNlICd1Y3MtMic6XG4gICAgICBjYXNlICd1dGYxNmxlJzpcbiAgICAgIGNhc2UgJ3V0Zi0xNmxlJzpcbiAgICAgICAgcmV0dXJuIGxlbiAqIDJcbiAgICAgIGNhc2UgJ2hleCc6XG4gICAgICAgIHJldHVybiBsZW4gPj4+IDFcbiAgICAgIGNhc2UgJ2Jhc2U2NCc6XG4gICAgICAgIHJldHVybiBiYXNlNjRUb0J5dGVzKHN0cmluZykubGVuZ3RoXG4gICAgICBkZWZhdWx0OlxuICAgICAgICBpZiAobG93ZXJlZENhc2UpIHJldHVybiB1dGY4VG9CeXRlcyhzdHJpbmcpLmxlbmd0aCAvLyBhc3N1bWUgdXRmOFxuICAgICAgICBlbmNvZGluZyA9ICgnJyArIGVuY29kaW5nKS50b0xvd2VyQ2FzZSgpXG4gICAgICAgIGxvd2VyZWRDYXNlID0gdHJ1ZVxuICAgIH1cbiAgfVxufVxuQnVmZmVyLmJ5dGVMZW5ndGggPSBieXRlTGVuZ3RoXG5cbi8vIHByZS1zZXQgZm9yIHZhbHVlcyB0aGF0IG1heSBleGlzdCBpbiB0aGUgZnV0dXJlXG5CdWZmZXIucHJvdG90eXBlLmxlbmd0aCA9IHVuZGVmaW5lZFxuQnVmZmVyLnByb3RvdHlwZS5wYXJlbnQgPSB1bmRlZmluZWRcblxuZnVuY3Rpb24gc2xvd1RvU3RyaW5nIChlbmNvZGluZywgc3RhcnQsIGVuZCkge1xuICB2YXIgbG93ZXJlZENhc2UgPSBmYWxzZVxuXG4gIHN0YXJ0ID0gc3RhcnQgfCAwXG4gIGVuZCA9IGVuZCA9PT0gdW5kZWZpbmVkIHx8IGVuZCA9PT0gSW5maW5pdHkgPyB0aGlzLmxlbmd0aCA6IGVuZCB8IDBcblxuICBpZiAoIWVuY29kaW5nKSBlbmNvZGluZyA9ICd1dGY4J1xuICBpZiAoc3RhcnQgPCAwKSBzdGFydCA9IDBcbiAgaWYgKGVuZCA+IHRoaXMubGVuZ3RoKSBlbmQgPSB0aGlzLmxlbmd0aFxuICBpZiAoZW5kIDw9IHN0YXJ0KSByZXR1cm4gJydcblxuICB3aGlsZSAodHJ1ZSkge1xuICAgIHN3aXRjaCAoZW5jb2RpbmcpIHtcbiAgICAgIGNhc2UgJ2hleCc6XG4gICAgICAgIHJldHVybiBoZXhTbGljZSh0aGlzLCBzdGFydCwgZW5kKVxuXG4gICAgICBjYXNlICd1dGY4JzpcbiAgICAgIGNhc2UgJ3V0Zi04JzpcbiAgICAgICAgcmV0dXJuIHV0ZjhTbGljZSh0aGlzLCBzdGFydCwgZW5kKVxuXG4gICAgICBjYXNlICdhc2NpaSc6XG4gICAgICAgIHJldHVybiBhc2NpaVNsaWNlKHRoaXMsIHN0YXJ0LCBlbmQpXG5cbiAgICAgIGNhc2UgJ2JpbmFyeSc6XG4gICAgICAgIHJldHVybiBiaW5hcnlTbGljZSh0aGlzLCBzdGFydCwgZW5kKVxuXG4gICAgICBjYXNlICdiYXNlNjQnOlxuICAgICAgICByZXR1cm4gYmFzZTY0U2xpY2UodGhpcywgc3RhcnQsIGVuZClcblxuICAgICAgY2FzZSAndWNzMic6XG4gICAgICBjYXNlICd1Y3MtMic6XG4gICAgICBjYXNlICd1dGYxNmxlJzpcbiAgICAgIGNhc2UgJ3V0Zi0xNmxlJzpcbiAgICAgICAgcmV0dXJuIHV0ZjE2bGVTbGljZSh0aGlzLCBzdGFydCwgZW5kKVxuXG4gICAgICBkZWZhdWx0OlxuICAgICAgICBpZiAobG93ZXJlZENhc2UpIHRocm93IG5ldyBUeXBlRXJyb3IoJ1Vua25vd24gZW5jb2Rpbmc6ICcgKyBlbmNvZGluZylcbiAgICAgICAgZW5jb2RpbmcgPSAoZW5jb2RpbmcgKyAnJykudG9Mb3dlckNhc2UoKVxuICAgICAgICBsb3dlcmVkQ2FzZSA9IHRydWVcbiAgICB9XG4gIH1cbn1cblxuQnVmZmVyLnByb3RvdHlwZS50b1N0cmluZyA9IGZ1bmN0aW9uIHRvU3RyaW5nICgpIHtcbiAgdmFyIGxlbmd0aCA9IHRoaXMubGVuZ3RoIHwgMFxuICBpZiAobGVuZ3RoID09PSAwKSByZXR1cm4gJydcbiAgaWYgKGFyZ3VtZW50cy5sZW5ndGggPT09IDApIHJldHVybiB1dGY4U2xpY2UodGhpcywgMCwgbGVuZ3RoKVxuICByZXR1cm4gc2xvd1RvU3RyaW5nLmFwcGx5KHRoaXMsIGFyZ3VtZW50cylcbn1cblxuQnVmZmVyLnByb3RvdHlwZS5lcXVhbHMgPSBmdW5jdGlvbiBlcXVhbHMgKGIpIHtcbiAgaWYgKCFCdWZmZXIuaXNCdWZmZXIoYikpIHRocm93IG5ldyBUeXBlRXJyb3IoJ0FyZ3VtZW50IG11c3QgYmUgYSBCdWZmZXInKVxuICBpZiAodGhpcyA9PT0gYikgcmV0dXJuIHRydWVcbiAgcmV0dXJuIEJ1ZmZlci5jb21wYXJlKHRoaXMsIGIpID09PSAwXG59XG5cbkJ1ZmZlci5wcm90b3R5cGUuaW5zcGVjdCA9IGZ1bmN0aW9uIGluc3BlY3QgKCkge1xuICB2YXIgc3RyID0gJydcbiAgdmFyIG1heCA9IGV4cG9ydHMuSU5TUEVDVF9NQVhfQllURVNcbiAgaWYgKHRoaXMubGVuZ3RoID4gMCkge1xuICAgIHN0ciA9IHRoaXMudG9TdHJpbmcoJ2hleCcsIDAsIG1heCkubWF0Y2goLy57Mn0vZykuam9pbignICcpXG4gICAgaWYgKHRoaXMubGVuZ3RoID4gbWF4KSBzdHIgKz0gJyAuLi4gJ1xuICB9XG4gIHJldHVybiAnPEJ1ZmZlciAnICsgc3RyICsgJz4nXG59XG5cbkJ1ZmZlci5wcm90b3R5cGUuY29tcGFyZSA9IGZ1bmN0aW9uIGNvbXBhcmUgKGIpIHtcbiAgaWYgKCFCdWZmZXIuaXNCdWZmZXIoYikpIHRocm93IG5ldyBUeXBlRXJyb3IoJ0FyZ3VtZW50IG11c3QgYmUgYSBCdWZmZXInKVxuICBpZiAodGhpcyA9PT0gYikgcmV0dXJuIDBcbiAgcmV0dXJuIEJ1ZmZlci5jb21wYXJlKHRoaXMsIGIpXG59XG5cbkJ1ZmZlci5wcm90b3R5cGUuaW5kZXhPZiA9IGZ1bmN0aW9uIGluZGV4T2YgKHZhbCwgYnl0ZU9mZnNldCkge1xuICBpZiAoYnl0ZU9mZnNldCA+IDB4N2ZmZmZmZmYpIGJ5dGVPZmZzZXQgPSAweDdmZmZmZmZmXG4gIGVsc2UgaWYgKGJ5dGVPZmZzZXQgPCAtMHg4MDAwMDAwMCkgYnl0ZU9mZnNldCA9IC0weDgwMDAwMDAwXG4gIGJ5dGVPZmZzZXQgPj49IDBcblxuICBpZiAodGhpcy5sZW5ndGggPT09IDApIHJldHVybiAtMVxuICBpZiAoYnl0ZU9mZnNldCA+PSB0aGlzLmxlbmd0aCkgcmV0dXJuIC0xXG5cbiAgLy8gTmVnYXRpdmUgb2Zmc2V0cyBzdGFydCBmcm9tIHRoZSBlbmQgb2YgdGhlIGJ1ZmZlclxuICBpZiAoYnl0ZU9mZnNldCA8IDApIGJ5dGVPZmZzZXQgPSBNYXRoLm1heCh0aGlzLmxlbmd0aCArIGJ5dGVPZmZzZXQsIDApXG5cbiAgaWYgKHR5cGVvZiB2YWwgPT09ICdzdHJpbmcnKSB7XG4gICAgaWYgKHZhbC5sZW5ndGggPT09IDApIHJldHVybiAtMSAvLyBzcGVjaWFsIGNhc2U6IGxvb2tpbmcgZm9yIGVtcHR5IHN0cmluZyBhbHdheXMgZmFpbHNcbiAgICByZXR1cm4gU3RyaW5nLnByb3RvdHlwZS5pbmRleE9mLmNhbGwodGhpcywgdmFsLCBieXRlT2Zmc2V0KVxuICB9XG4gIGlmIChCdWZmZXIuaXNCdWZmZXIodmFsKSkge1xuICAgIHJldHVybiBhcnJheUluZGV4T2YodGhpcywgdmFsLCBieXRlT2Zmc2V0KVxuICB9XG4gIGlmICh0eXBlb2YgdmFsID09PSAnbnVtYmVyJykge1xuICAgIGlmIChCdWZmZXIuVFlQRURfQVJSQVlfU1VQUE9SVCAmJiBVaW50OEFycmF5LnByb3RvdHlwZS5pbmRleE9mID09PSAnZnVuY3Rpb24nKSB7XG4gICAgICByZXR1cm4gVWludDhBcnJheS5wcm90b3R5cGUuaW5kZXhPZi5jYWxsKHRoaXMsIHZhbCwgYnl0ZU9mZnNldClcbiAgICB9XG4gICAgcmV0dXJuIGFycmF5SW5kZXhPZih0aGlzLCBbIHZhbCBdLCBieXRlT2Zmc2V0KVxuICB9XG5cbiAgZnVuY3Rpb24gYXJyYXlJbmRleE9mIChhcnIsIHZhbCwgYnl0ZU9mZnNldCkge1xuICAgIHZhciBmb3VuZEluZGV4ID0gLTFcbiAgICBmb3IgKHZhciBpID0gMDsgYnl0ZU9mZnNldCArIGkgPCBhcnIubGVuZ3RoOyBpKyspIHtcbiAgICAgIGlmIChhcnJbYnl0ZU9mZnNldCArIGldID09PSB2YWxbZm91bmRJbmRleCA9PT0gLTEgPyAwIDogaSAtIGZvdW5kSW5kZXhdKSB7XG4gICAgICAgIGlmIChmb3VuZEluZGV4ID09PSAtMSkgZm91bmRJbmRleCA9IGlcbiAgICAgICAgaWYgKGkgLSBmb3VuZEluZGV4ICsgMSA9PT0gdmFsLmxlbmd0aCkgcmV0dXJuIGJ5dGVPZmZzZXQgKyBmb3VuZEluZGV4XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBmb3VuZEluZGV4ID0gLTFcbiAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuIC0xXG4gIH1cblxuICB0aHJvdyBuZXcgVHlwZUVycm9yKCd2YWwgbXVzdCBiZSBzdHJpbmcsIG51bWJlciBvciBCdWZmZXInKVxufVxuXG4vLyBgZ2V0YCBpcyBkZXByZWNhdGVkXG5CdWZmZXIucHJvdG90eXBlLmdldCA9IGZ1bmN0aW9uIGdldCAob2Zmc2V0KSB7XG4gIGNvbnNvbGUubG9nKCcuZ2V0KCkgaXMgZGVwcmVjYXRlZC4gQWNjZXNzIHVzaW5nIGFycmF5IGluZGV4ZXMgaW5zdGVhZC4nKVxuICByZXR1cm4gdGhpcy5yZWFkVUludDgob2Zmc2V0KVxufVxuXG4vLyBgc2V0YCBpcyBkZXByZWNhdGVkXG5CdWZmZXIucHJvdG90eXBlLnNldCA9IGZ1bmN0aW9uIHNldCAodiwgb2Zmc2V0KSB7XG4gIGNvbnNvbGUubG9nKCcuc2V0KCkgaXMgZGVwcmVjYXRlZC4gQWNjZXNzIHVzaW5nIGFycmF5IGluZGV4ZXMgaW5zdGVhZC4nKVxuICByZXR1cm4gdGhpcy53cml0ZVVJbnQ4KHYsIG9mZnNldClcbn1cblxuZnVuY3Rpb24gaGV4V3JpdGUgKGJ1Ziwgc3RyaW5nLCBvZmZzZXQsIGxlbmd0aCkge1xuICBvZmZzZXQgPSBOdW1iZXIob2Zmc2V0KSB8fCAwXG4gIHZhciByZW1haW5pbmcgPSBidWYubGVuZ3RoIC0gb2Zmc2V0XG4gIGlmICghbGVuZ3RoKSB7XG4gICAgbGVuZ3RoID0gcmVtYWluaW5nXG4gIH0gZWxzZSB7XG4gICAgbGVuZ3RoID0gTnVtYmVyKGxlbmd0aClcbiAgICBpZiAobGVuZ3RoID4gcmVtYWluaW5nKSB7XG4gICAgICBsZW5ndGggPSByZW1haW5pbmdcbiAgICB9XG4gIH1cblxuICAvLyBtdXN0IGJlIGFuIGV2ZW4gbnVtYmVyIG9mIGRpZ2l0c1xuICB2YXIgc3RyTGVuID0gc3RyaW5nLmxlbmd0aFxuICBpZiAoc3RyTGVuICUgMiAhPT0gMCkgdGhyb3cgbmV3IEVycm9yKCdJbnZhbGlkIGhleCBzdHJpbmcnKVxuXG4gIGlmIChsZW5ndGggPiBzdHJMZW4gLyAyKSB7XG4gICAgbGVuZ3RoID0gc3RyTGVuIC8gMlxuICB9XG4gIGZvciAodmFyIGkgPSAwOyBpIDwgbGVuZ3RoOyBpKyspIHtcbiAgICB2YXIgcGFyc2VkID0gcGFyc2VJbnQoc3RyaW5nLnN1YnN0cihpICogMiwgMiksIDE2KVxuICAgIGlmIChpc05hTihwYXJzZWQpKSB0aHJvdyBuZXcgRXJyb3IoJ0ludmFsaWQgaGV4IHN0cmluZycpXG4gICAgYnVmW29mZnNldCArIGldID0gcGFyc2VkXG4gIH1cbiAgcmV0dXJuIGlcbn1cblxuZnVuY3Rpb24gdXRmOFdyaXRlIChidWYsIHN0cmluZywgb2Zmc2V0LCBsZW5ndGgpIHtcbiAgcmV0dXJuIGJsaXRCdWZmZXIodXRmOFRvQnl0ZXMoc3RyaW5nLCBidWYubGVuZ3RoIC0gb2Zmc2V0KSwgYnVmLCBvZmZzZXQsIGxlbmd0aClcbn1cblxuZnVuY3Rpb24gYXNjaWlXcml0ZSAoYnVmLCBzdHJpbmcsIG9mZnNldCwgbGVuZ3RoKSB7XG4gIHJldHVybiBibGl0QnVmZmVyKGFzY2lpVG9CeXRlcyhzdHJpbmcpLCBidWYsIG9mZnNldCwgbGVuZ3RoKVxufVxuXG5mdW5jdGlvbiBiaW5hcnlXcml0ZSAoYnVmLCBzdHJpbmcsIG9mZnNldCwgbGVuZ3RoKSB7XG4gIHJldHVybiBhc2NpaVdyaXRlKGJ1Ziwgc3RyaW5nLCBvZmZzZXQsIGxlbmd0aClcbn1cblxuZnVuY3Rpb24gYmFzZTY0V3JpdGUgKGJ1Ziwgc3RyaW5nLCBvZmZzZXQsIGxlbmd0aCkge1xuICByZXR1cm4gYmxpdEJ1ZmZlcihiYXNlNjRUb0J5dGVzKHN0cmluZyksIGJ1Ziwgb2Zmc2V0LCBsZW5ndGgpXG59XG5cbmZ1bmN0aW9uIHVjczJXcml0ZSAoYnVmLCBzdHJpbmcsIG9mZnNldCwgbGVuZ3RoKSB7XG4gIHJldHVybiBibGl0QnVmZmVyKHV0ZjE2bGVUb0J5dGVzKHN0cmluZywgYnVmLmxlbmd0aCAtIG9mZnNldCksIGJ1Ziwgb2Zmc2V0LCBsZW5ndGgpXG59XG5cbkJ1ZmZlci5wcm90b3R5cGUud3JpdGUgPSBmdW5jdGlvbiB3cml0ZSAoc3RyaW5nLCBvZmZzZXQsIGxlbmd0aCwgZW5jb2RpbmcpIHtcbiAgLy8gQnVmZmVyI3dyaXRlKHN0cmluZylcbiAgaWYgKG9mZnNldCA9PT0gdW5kZWZpbmVkKSB7XG4gICAgZW5jb2RpbmcgPSAndXRmOCdcbiAgICBsZW5ndGggPSB0aGlzLmxlbmd0aFxuICAgIG9mZnNldCA9IDBcbiAgLy8gQnVmZmVyI3dyaXRlKHN0cmluZywgZW5jb2RpbmcpXG4gIH0gZWxzZSBpZiAobGVuZ3RoID09PSB1bmRlZmluZWQgJiYgdHlwZW9mIG9mZnNldCA9PT0gJ3N0cmluZycpIHtcbiAgICBlbmNvZGluZyA9IG9mZnNldFxuICAgIGxlbmd0aCA9IHRoaXMubGVuZ3RoXG4gICAgb2Zmc2V0ID0gMFxuICAvLyBCdWZmZXIjd3JpdGUoc3RyaW5nLCBvZmZzZXRbLCBsZW5ndGhdWywgZW5jb2RpbmddKVxuICB9IGVsc2UgaWYgKGlzRmluaXRlKG9mZnNldCkpIHtcbiAgICBvZmZzZXQgPSBvZmZzZXQgfCAwXG4gICAgaWYgKGlzRmluaXRlKGxlbmd0aCkpIHtcbiAgICAgIGxlbmd0aCA9IGxlbmd0aCB8IDBcbiAgICAgIGlmIChlbmNvZGluZyA9PT0gdW5kZWZpbmVkKSBlbmNvZGluZyA9ICd1dGY4J1xuICAgIH0gZWxzZSB7XG4gICAgICBlbmNvZGluZyA9IGxlbmd0aFxuICAgICAgbGVuZ3RoID0gdW5kZWZpbmVkXG4gICAgfVxuICAvLyBsZWdhY3kgd3JpdGUoc3RyaW5nLCBlbmNvZGluZywgb2Zmc2V0LCBsZW5ndGgpIC0gcmVtb3ZlIGluIHYwLjEzXG4gIH0gZWxzZSB7XG4gICAgdmFyIHN3YXAgPSBlbmNvZGluZ1xuICAgIGVuY29kaW5nID0gb2Zmc2V0XG4gICAgb2Zmc2V0ID0gbGVuZ3RoIHwgMFxuICAgIGxlbmd0aCA9IHN3YXBcbiAgfVxuXG4gIHZhciByZW1haW5pbmcgPSB0aGlzLmxlbmd0aCAtIG9mZnNldFxuICBpZiAobGVuZ3RoID09PSB1bmRlZmluZWQgfHwgbGVuZ3RoID4gcmVtYWluaW5nKSBsZW5ndGggPSByZW1haW5pbmdcblxuICBpZiAoKHN0cmluZy5sZW5ndGggPiAwICYmIChsZW5ndGggPCAwIHx8IG9mZnNldCA8IDApKSB8fCBvZmZzZXQgPiB0aGlzLmxlbmd0aCkge1xuICAgIHRocm93IG5ldyBSYW5nZUVycm9yKCdhdHRlbXB0IHRvIHdyaXRlIG91dHNpZGUgYnVmZmVyIGJvdW5kcycpXG4gIH1cblxuICBpZiAoIWVuY29kaW5nKSBlbmNvZGluZyA9ICd1dGY4J1xuXG4gIHZhciBsb3dlcmVkQ2FzZSA9IGZhbHNlXG4gIGZvciAoOzspIHtcbiAgICBzd2l0Y2ggKGVuY29kaW5nKSB7XG4gICAgICBjYXNlICdoZXgnOlxuICAgICAgICByZXR1cm4gaGV4V3JpdGUodGhpcywgc3RyaW5nLCBvZmZzZXQsIGxlbmd0aClcblxuICAgICAgY2FzZSAndXRmOCc6XG4gICAgICBjYXNlICd1dGYtOCc6XG4gICAgICAgIHJldHVybiB1dGY4V3JpdGUodGhpcywgc3RyaW5nLCBvZmZzZXQsIGxlbmd0aClcblxuICAgICAgY2FzZSAnYXNjaWknOlxuICAgICAgICByZXR1cm4gYXNjaWlXcml0ZSh0aGlzLCBzdHJpbmcsIG9mZnNldCwgbGVuZ3RoKVxuXG4gICAgICBjYXNlICdiaW5hcnknOlxuICAgICAgICByZXR1cm4gYmluYXJ5V3JpdGUodGhpcywgc3RyaW5nLCBvZmZzZXQsIGxlbmd0aClcblxuICAgICAgY2FzZSAnYmFzZTY0JzpcbiAgICAgICAgLy8gV2FybmluZzogbWF4TGVuZ3RoIG5vdCB0YWtlbiBpbnRvIGFjY291bnQgaW4gYmFzZTY0V3JpdGVcbiAgICAgICAgcmV0dXJuIGJhc2U2NFdyaXRlKHRoaXMsIHN0cmluZywgb2Zmc2V0LCBsZW5ndGgpXG5cbiAgICAgIGNhc2UgJ3VjczInOlxuICAgICAgY2FzZSAndWNzLTInOlxuICAgICAgY2FzZSAndXRmMTZsZSc6XG4gICAgICBjYXNlICd1dGYtMTZsZSc6XG4gICAgICAgIHJldHVybiB1Y3MyV3JpdGUodGhpcywgc3RyaW5nLCBvZmZzZXQsIGxlbmd0aClcblxuICAgICAgZGVmYXVsdDpcbiAgICAgICAgaWYgKGxvd2VyZWRDYXNlKSB0aHJvdyBuZXcgVHlwZUVycm9yKCdVbmtub3duIGVuY29kaW5nOiAnICsgZW5jb2RpbmcpXG4gICAgICAgIGVuY29kaW5nID0gKCcnICsgZW5jb2RpbmcpLnRvTG93ZXJDYXNlKClcbiAgICAgICAgbG93ZXJlZENhc2UgPSB0cnVlXG4gICAgfVxuICB9XG59XG5cbkJ1ZmZlci5wcm90b3R5cGUudG9KU09OID0gZnVuY3Rpb24gdG9KU09OICgpIHtcbiAgcmV0dXJuIHtcbiAgICB0eXBlOiAnQnVmZmVyJyxcbiAgICBkYXRhOiBBcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbCh0aGlzLl9hcnIgfHwgdGhpcywgMClcbiAgfVxufVxuXG5mdW5jdGlvbiBiYXNlNjRTbGljZSAoYnVmLCBzdGFydCwgZW5kKSB7XG4gIGlmIChzdGFydCA9PT0gMCAmJiBlbmQgPT09IGJ1Zi5sZW5ndGgpIHtcbiAgICByZXR1cm4gYmFzZTY0LmZyb21CeXRlQXJyYXkoYnVmKVxuICB9IGVsc2Uge1xuICAgIHJldHVybiBiYXNlNjQuZnJvbUJ5dGVBcnJheShidWYuc2xpY2Uoc3RhcnQsIGVuZCkpXG4gIH1cbn1cblxuZnVuY3Rpb24gdXRmOFNsaWNlIChidWYsIHN0YXJ0LCBlbmQpIHtcbiAgZW5kID0gTWF0aC5taW4oYnVmLmxlbmd0aCwgZW5kKVxuICB2YXIgcmVzID0gW11cblxuICB2YXIgaSA9IHN0YXJ0XG4gIHdoaWxlIChpIDwgZW5kKSB7XG4gICAgdmFyIGZpcnN0Qnl0ZSA9IGJ1ZltpXVxuICAgIHZhciBjb2RlUG9pbnQgPSBudWxsXG4gICAgdmFyIGJ5dGVzUGVyU2VxdWVuY2UgPSAoZmlyc3RCeXRlID4gMHhFRikgPyA0XG4gICAgICA6IChmaXJzdEJ5dGUgPiAweERGKSA/IDNcbiAgICAgIDogKGZpcnN0Qnl0ZSA+IDB4QkYpID8gMlxuICAgICAgOiAxXG5cbiAgICBpZiAoaSArIGJ5dGVzUGVyU2VxdWVuY2UgPD0gZW5kKSB7XG4gICAgICB2YXIgc2Vjb25kQnl0ZSwgdGhpcmRCeXRlLCBmb3VydGhCeXRlLCB0ZW1wQ29kZVBvaW50XG5cbiAgICAgIHN3aXRjaCAoYnl0ZXNQZXJTZXF1ZW5jZSkge1xuICAgICAgICBjYXNlIDE6XG4gICAgICAgICAgaWYgKGZpcnN0Qnl0ZSA8IDB4ODApIHtcbiAgICAgICAgICAgIGNvZGVQb2ludCA9IGZpcnN0Qnl0ZVxuICAgICAgICAgIH1cbiAgICAgICAgICBicmVha1xuICAgICAgICBjYXNlIDI6XG4gICAgICAgICAgc2Vjb25kQnl0ZSA9IGJ1ZltpICsgMV1cbiAgICAgICAgICBpZiAoKHNlY29uZEJ5dGUgJiAweEMwKSA9PT0gMHg4MCkge1xuICAgICAgICAgICAgdGVtcENvZGVQb2ludCA9IChmaXJzdEJ5dGUgJiAweDFGKSA8PCAweDYgfCAoc2Vjb25kQnl0ZSAmIDB4M0YpXG4gICAgICAgICAgICBpZiAodGVtcENvZGVQb2ludCA+IDB4N0YpIHtcbiAgICAgICAgICAgICAgY29kZVBvaW50ID0gdGVtcENvZGVQb2ludFxuICAgICAgICAgICAgfVxuICAgICAgICAgIH1cbiAgICAgICAgICBicmVha1xuICAgICAgICBjYXNlIDM6XG4gICAgICAgICAgc2Vjb25kQnl0ZSA9IGJ1ZltpICsgMV1cbiAgICAgICAgICB0aGlyZEJ5dGUgPSBidWZbaSArIDJdXG4gICAgICAgICAgaWYgKChzZWNvbmRCeXRlICYgMHhDMCkgPT09IDB4ODAgJiYgKHRoaXJkQnl0ZSAmIDB4QzApID09PSAweDgwKSB7XG4gICAgICAgICAgICB0ZW1wQ29kZVBvaW50ID0gKGZpcnN0Qnl0ZSAmIDB4RikgPDwgMHhDIHwgKHNlY29uZEJ5dGUgJiAweDNGKSA8PCAweDYgfCAodGhpcmRCeXRlICYgMHgzRilcbiAgICAgICAgICAgIGlmICh0ZW1wQ29kZVBvaW50ID4gMHg3RkYgJiYgKHRlbXBDb2RlUG9pbnQgPCAweEQ4MDAgfHwgdGVtcENvZGVQb2ludCA+IDB4REZGRikpIHtcbiAgICAgICAgICAgICAgY29kZVBvaW50ID0gdGVtcENvZGVQb2ludFxuICAgICAgICAgICAgfVxuICAgICAgICAgIH1cbiAgICAgICAgICBicmVha1xuICAgICAgICBjYXNlIDQ6XG4gICAgICAgICAgc2Vjb25kQnl0ZSA9IGJ1ZltpICsgMV1cbiAgICAgICAgICB0aGlyZEJ5dGUgPSBidWZbaSArIDJdXG4gICAgICAgICAgZm91cnRoQnl0ZSA9IGJ1ZltpICsgM11cbiAgICAgICAgICBpZiAoKHNlY29uZEJ5dGUgJiAweEMwKSA9PT0gMHg4MCAmJiAodGhpcmRCeXRlICYgMHhDMCkgPT09IDB4ODAgJiYgKGZvdXJ0aEJ5dGUgJiAweEMwKSA9PT0gMHg4MCkge1xuICAgICAgICAgICAgdGVtcENvZGVQb2ludCA9IChmaXJzdEJ5dGUgJiAweEYpIDw8IDB4MTIgfCAoc2Vjb25kQnl0ZSAmIDB4M0YpIDw8IDB4QyB8ICh0aGlyZEJ5dGUgJiAweDNGKSA8PCAweDYgfCAoZm91cnRoQnl0ZSAmIDB4M0YpXG4gICAgICAgICAgICBpZiAodGVtcENvZGVQb2ludCA+IDB4RkZGRiAmJiB0ZW1wQ29kZVBvaW50IDwgMHgxMTAwMDApIHtcbiAgICAgICAgICAgICAgY29kZVBvaW50ID0gdGVtcENvZGVQb2ludFxuICAgICAgICAgICAgfVxuICAgICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG5cbiAgICBpZiAoY29kZVBvaW50ID09PSBudWxsKSB7XG4gICAgICAvLyB3ZSBkaWQgbm90IGdlbmVyYXRlIGEgdmFsaWQgY29kZVBvaW50IHNvIGluc2VydCBhXG4gICAgICAvLyByZXBsYWNlbWVudCBjaGFyIChVK0ZGRkQpIGFuZCBhZHZhbmNlIG9ubHkgMSBieXRlXG4gICAgICBjb2RlUG9pbnQgPSAweEZGRkRcbiAgICAgIGJ5dGVzUGVyU2VxdWVuY2UgPSAxXG4gICAgfSBlbHNlIGlmIChjb2RlUG9pbnQgPiAweEZGRkYpIHtcbiAgICAgIC8vIGVuY29kZSB0byB1dGYxNiAoc3Vycm9nYXRlIHBhaXIgZGFuY2UpXG4gICAgICBjb2RlUG9pbnQgLT0gMHgxMDAwMFxuICAgICAgcmVzLnB1c2goY29kZVBvaW50ID4+PiAxMCAmIDB4M0ZGIHwgMHhEODAwKVxuICAgICAgY29kZVBvaW50ID0gMHhEQzAwIHwgY29kZVBvaW50ICYgMHgzRkZcbiAgICB9XG5cbiAgICByZXMucHVzaChjb2RlUG9pbnQpXG4gICAgaSArPSBieXRlc1BlclNlcXVlbmNlXG4gIH1cblxuICByZXR1cm4gZGVjb2RlQ29kZVBvaW50c0FycmF5KHJlcylcbn1cblxuLy8gQmFzZWQgb24gaHR0cDovL3N0YWNrb3ZlcmZsb3cuY29tL2EvMjI3NDcyNzIvNjgwNzQyLCB0aGUgYnJvd3NlciB3aXRoXG4vLyB0aGUgbG93ZXN0IGxpbWl0IGlzIENocm9tZSwgd2l0aCAweDEwMDAwIGFyZ3MuXG4vLyBXZSBnbyAxIG1hZ25pdHVkZSBsZXNzLCBmb3Igc2FmZXR5XG52YXIgTUFYX0FSR1VNRU5UU19MRU5HVEggPSAweDEwMDBcblxuZnVuY3Rpb24gZGVjb2RlQ29kZVBvaW50c0FycmF5IChjb2RlUG9pbnRzKSB7XG4gIHZhciBsZW4gPSBjb2RlUG9pbnRzLmxlbmd0aFxuICBpZiAobGVuIDw9IE1BWF9BUkdVTUVOVFNfTEVOR1RIKSB7XG4gICAgcmV0dXJuIFN0cmluZy5mcm9tQ2hhckNvZGUuYXBwbHkoU3RyaW5nLCBjb2RlUG9pbnRzKSAvLyBhdm9pZCBleHRyYSBzbGljZSgpXG4gIH1cblxuICAvLyBEZWNvZGUgaW4gY2h1bmtzIHRvIGF2b2lkIFwiY2FsbCBzdGFjayBzaXplIGV4Y2VlZGVkXCIuXG4gIHZhciByZXMgPSAnJ1xuICB2YXIgaSA9IDBcbiAgd2hpbGUgKGkgPCBsZW4pIHtcbiAgICByZXMgKz0gU3RyaW5nLmZyb21DaGFyQ29kZS5hcHBseShcbiAgICAgIFN0cmluZyxcbiAgICAgIGNvZGVQb2ludHMuc2xpY2UoaSwgaSArPSBNQVhfQVJHVU1FTlRTX0xFTkdUSClcbiAgICApXG4gIH1cbiAgcmV0dXJuIHJlc1xufVxuXG5mdW5jdGlvbiBhc2NpaVNsaWNlIChidWYsIHN0YXJ0LCBlbmQpIHtcbiAgdmFyIHJldCA9ICcnXG4gIGVuZCA9IE1hdGgubWluKGJ1Zi5sZW5ndGgsIGVuZClcblxuICBmb3IgKHZhciBpID0gc3RhcnQ7IGkgPCBlbmQ7IGkrKykge1xuICAgIHJldCArPSBTdHJpbmcuZnJvbUNoYXJDb2RlKGJ1ZltpXSAmIDB4N0YpXG4gIH1cbiAgcmV0dXJuIHJldFxufVxuXG5mdW5jdGlvbiBiaW5hcnlTbGljZSAoYnVmLCBzdGFydCwgZW5kKSB7XG4gIHZhciByZXQgPSAnJ1xuICBlbmQgPSBNYXRoLm1pbihidWYubGVuZ3RoLCBlbmQpXG5cbiAgZm9yICh2YXIgaSA9IHN0YXJ0OyBpIDwgZW5kOyBpKyspIHtcbiAgICByZXQgKz0gU3RyaW5nLmZyb21DaGFyQ29kZShidWZbaV0pXG4gIH1cbiAgcmV0dXJuIHJldFxufVxuXG5mdW5jdGlvbiBoZXhTbGljZSAoYnVmLCBzdGFydCwgZW5kKSB7XG4gIHZhciBsZW4gPSBidWYubGVuZ3RoXG5cbiAgaWYgKCFzdGFydCB8fCBzdGFydCA8IDApIHN0YXJ0ID0gMFxuICBpZiAoIWVuZCB8fCBlbmQgPCAwIHx8IGVuZCA+IGxlbikgZW5kID0gbGVuXG5cbiAgdmFyIG91dCA9ICcnXG4gIGZvciAodmFyIGkgPSBzdGFydDsgaSA8IGVuZDsgaSsrKSB7XG4gICAgb3V0ICs9IHRvSGV4KGJ1ZltpXSlcbiAgfVxuICByZXR1cm4gb3V0XG59XG5cbmZ1bmN0aW9uIHV0ZjE2bGVTbGljZSAoYnVmLCBzdGFydCwgZW5kKSB7XG4gIHZhciBieXRlcyA9IGJ1Zi5zbGljZShzdGFydCwgZW5kKVxuICB2YXIgcmVzID0gJydcbiAgZm9yICh2YXIgaSA9IDA7IGkgPCBieXRlcy5sZW5ndGg7IGkgKz0gMikge1xuICAgIHJlcyArPSBTdHJpbmcuZnJvbUNoYXJDb2RlKGJ5dGVzW2ldICsgYnl0ZXNbaSArIDFdICogMjU2KVxuICB9XG4gIHJldHVybiByZXNcbn1cblxuQnVmZmVyLnByb3RvdHlwZS5zbGljZSA9IGZ1bmN0aW9uIHNsaWNlIChzdGFydCwgZW5kKSB7XG4gIHZhciBsZW4gPSB0aGlzLmxlbmd0aFxuICBzdGFydCA9IH5+c3RhcnRcbiAgZW5kID0gZW5kID09PSB1bmRlZmluZWQgPyBsZW4gOiB+fmVuZFxuXG4gIGlmIChzdGFydCA8IDApIHtcbiAgICBzdGFydCArPSBsZW5cbiAgICBpZiAoc3RhcnQgPCAwKSBzdGFydCA9IDBcbiAgfSBlbHNlIGlmIChzdGFydCA+IGxlbikge1xuICAgIHN0YXJ0ID0gbGVuXG4gIH1cblxuICBpZiAoZW5kIDwgMCkge1xuICAgIGVuZCArPSBsZW5cbiAgICBpZiAoZW5kIDwgMCkgZW5kID0gMFxuICB9IGVsc2UgaWYgKGVuZCA+IGxlbikge1xuICAgIGVuZCA9IGxlblxuICB9XG5cbiAgaWYgKGVuZCA8IHN0YXJ0KSBlbmQgPSBzdGFydFxuXG4gIHZhciBuZXdCdWZcbiAgaWYgKEJ1ZmZlci5UWVBFRF9BUlJBWV9TVVBQT1JUKSB7XG4gICAgbmV3QnVmID0gQnVmZmVyLl9hdWdtZW50KHRoaXMuc3ViYXJyYXkoc3RhcnQsIGVuZCkpXG4gIH0gZWxzZSB7XG4gICAgdmFyIHNsaWNlTGVuID0gZW5kIC0gc3RhcnRcbiAgICBuZXdCdWYgPSBuZXcgQnVmZmVyKHNsaWNlTGVuLCB1bmRlZmluZWQpXG4gICAgZm9yICh2YXIgaSA9IDA7IGkgPCBzbGljZUxlbjsgaSsrKSB7XG4gICAgICBuZXdCdWZbaV0gPSB0aGlzW2kgKyBzdGFydF1cbiAgICB9XG4gIH1cblxuICBpZiAobmV3QnVmLmxlbmd0aCkgbmV3QnVmLnBhcmVudCA9IHRoaXMucGFyZW50IHx8IHRoaXNcblxuICByZXR1cm4gbmV3QnVmXG59XG5cbi8qXG4gKiBOZWVkIHRvIG1ha2Ugc3VyZSB0aGF0IGJ1ZmZlciBpc24ndCB0cnlpbmcgdG8gd3JpdGUgb3V0IG9mIGJvdW5kcy5cbiAqL1xuZnVuY3Rpb24gY2hlY2tPZmZzZXQgKG9mZnNldCwgZXh0LCBsZW5ndGgpIHtcbiAgaWYgKChvZmZzZXQgJSAxKSAhPT0gMCB8fCBvZmZzZXQgPCAwKSB0aHJvdyBuZXcgUmFuZ2VFcnJvcignb2Zmc2V0IGlzIG5vdCB1aW50JylcbiAgaWYgKG9mZnNldCArIGV4dCA+IGxlbmd0aCkgdGhyb3cgbmV3IFJhbmdlRXJyb3IoJ1RyeWluZyB0byBhY2Nlc3MgYmV5b25kIGJ1ZmZlciBsZW5ndGgnKVxufVxuXG5CdWZmZXIucHJvdG90eXBlLnJlYWRVSW50TEUgPSBmdW5jdGlvbiByZWFkVUludExFIChvZmZzZXQsIGJ5dGVMZW5ndGgsIG5vQXNzZXJ0KSB7XG4gIG9mZnNldCA9IG9mZnNldCB8IDBcbiAgYnl0ZUxlbmd0aCA9IGJ5dGVMZW5ndGggfCAwXG4gIGlmICghbm9Bc3NlcnQpIGNoZWNrT2Zmc2V0KG9mZnNldCwgYnl0ZUxlbmd0aCwgdGhpcy5sZW5ndGgpXG5cbiAgdmFyIHZhbCA9IHRoaXNbb2Zmc2V0XVxuICB2YXIgbXVsID0gMVxuICB2YXIgaSA9IDBcbiAgd2hpbGUgKCsraSA8IGJ5dGVMZW5ndGggJiYgKG11bCAqPSAweDEwMCkpIHtcbiAgICB2YWwgKz0gdGhpc1tvZmZzZXQgKyBpXSAqIG11bFxuICB9XG5cbiAgcmV0dXJuIHZhbFxufVxuXG5CdWZmZXIucHJvdG90eXBlLnJlYWRVSW50QkUgPSBmdW5jdGlvbiByZWFkVUludEJFIChvZmZzZXQsIGJ5dGVMZW5ndGgsIG5vQXNzZXJ0KSB7XG4gIG9mZnNldCA9IG9mZnNldCB8IDBcbiAgYnl0ZUxlbmd0aCA9IGJ5dGVMZW5ndGggfCAwXG4gIGlmICghbm9Bc3NlcnQpIHtcbiAgICBjaGVja09mZnNldChvZmZzZXQsIGJ5dGVMZW5ndGgsIHRoaXMubGVuZ3RoKVxuICB9XG5cbiAgdmFyIHZhbCA9IHRoaXNbb2Zmc2V0ICsgLS1ieXRlTGVuZ3RoXVxuICB2YXIgbXVsID0gMVxuICB3aGlsZSAoYnl0ZUxlbmd0aCA+IDAgJiYgKG11bCAqPSAweDEwMCkpIHtcbiAgICB2YWwgKz0gdGhpc1tvZmZzZXQgKyAtLWJ5dGVMZW5ndGhdICogbXVsXG4gIH1cblxuICByZXR1cm4gdmFsXG59XG5cbkJ1ZmZlci5wcm90b3R5cGUucmVhZFVJbnQ4ID0gZnVuY3Rpb24gcmVhZFVJbnQ4IChvZmZzZXQsIG5vQXNzZXJ0KSB7XG4gIGlmICghbm9Bc3NlcnQpIGNoZWNrT2Zmc2V0KG9mZnNldCwgMSwgdGhpcy5sZW5ndGgpXG4gIHJldHVybiB0aGlzW29mZnNldF1cbn1cblxuQnVmZmVyLnByb3RvdHlwZS5yZWFkVUludDE2TEUgPSBmdW5jdGlvbiByZWFkVUludDE2TEUgKG9mZnNldCwgbm9Bc3NlcnQpIHtcbiAgaWYgKCFub0Fzc2VydCkgY2hlY2tPZmZzZXQob2Zmc2V0LCAyLCB0aGlzLmxlbmd0aClcbiAgcmV0dXJuIHRoaXNbb2Zmc2V0XSB8ICh0aGlzW29mZnNldCArIDFdIDw8IDgpXG59XG5cbkJ1ZmZlci5wcm90b3R5cGUucmVhZFVJbnQxNkJFID0gZnVuY3Rpb24gcmVhZFVJbnQxNkJFIChvZmZzZXQsIG5vQXNzZXJ0KSB7XG4gIGlmICghbm9Bc3NlcnQpIGNoZWNrT2Zmc2V0KG9mZnNldCwgMiwgdGhpcy5sZW5ndGgpXG4gIHJldHVybiAodGhpc1tvZmZzZXRdIDw8IDgpIHwgdGhpc1tvZmZzZXQgKyAxXVxufVxuXG5CdWZmZXIucHJvdG90eXBlLnJlYWRVSW50MzJMRSA9IGZ1bmN0aW9uIHJlYWRVSW50MzJMRSAob2Zmc2V0LCBub0Fzc2VydCkge1xuICBpZiAoIW5vQXNzZXJ0KSBjaGVja09mZnNldChvZmZzZXQsIDQsIHRoaXMubGVuZ3RoKVxuXG4gIHJldHVybiAoKHRoaXNbb2Zmc2V0XSkgfFxuICAgICAgKHRoaXNbb2Zmc2V0ICsgMV0gPDwgOCkgfFxuICAgICAgKHRoaXNbb2Zmc2V0ICsgMl0gPDwgMTYpKSArXG4gICAgICAodGhpc1tvZmZzZXQgKyAzXSAqIDB4MTAwMDAwMClcbn1cblxuQnVmZmVyLnByb3RvdHlwZS5yZWFkVUludDMyQkUgPSBmdW5jdGlvbiByZWFkVUludDMyQkUgKG9mZnNldCwgbm9Bc3NlcnQpIHtcbiAgaWYgKCFub0Fzc2VydCkgY2hlY2tPZmZzZXQob2Zmc2V0LCA0LCB0aGlzLmxlbmd0aClcblxuICByZXR1cm4gKHRoaXNbb2Zmc2V0XSAqIDB4MTAwMDAwMCkgK1xuICAgICgodGhpc1tvZmZzZXQgKyAxXSA8PCAxNikgfFxuICAgICh0aGlzW29mZnNldCArIDJdIDw8IDgpIHxcbiAgICB0aGlzW29mZnNldCArIDNdKVxufVxuXG5CdWZmZXIucHJvdG90eXBlLnJlYWRJbnRMRSA9IGZ1bmN0aW9uIHJlYWRJbnRMRSAob2Zmc2V0LCBieXRlTGVuZ3RoLCBub0Fzc2VydCkge1xuICBvZmZzZXQgPSBvZmZzZXQgfCAwXG4gIGJ5dGVMZW5ndGggPSBieXRlTGVuZ3RoIHwgMFxuICBpZiAoIW5vQXNzZXJ0KSBjaGVja09mZnNldChvZmZzZXQsIGJ5dGVMZW5ndGgsIHRoaXMubGVuZ3RoKVxuXG4gIHZhciB2YWwgPSB0aGlzW29mZnNldF1cbiAgdmFyIG11bCA9IDFcbiAgdmFyIGkgPSAwXG4gIHdoaWxlICgrK2kgPCBieXRlTGVuZ3RoICYmIChtdWwgKj0gMHgxMDApKSB7XG4gICAgdmFsICs9IHRoaXNbb2Zmc2V0ICsgaV0gKiBtdWxcbiAgfVxuICBtdWwgKj0gMHg4MFxuXG4gIGlmICh2YWwgPj0gbXVsKSB2YWwgLT0gTWF0aC5wb3coMiwgOCAqIGJ5dGVMZW5ndGgpXG5cbiAgcmV0dXJuIHZhbFxufVxuXG5CdWZmZXIucHJvdG90eXBlLnJlYWRJbnRCRSA9IGZ1bmN0aW9uIHJlYWRJbnRCRSAob2Zmc2V0LCBieXRlTGVuZ3RoLCBub0Fzc2VydCkge1xuICBvZmZzZXQgPSBvZmZzZXQgfCAwXG4gIGJ5dGVMZW5ndGggPSBieXRlTGVuZ3RoIHwgMFxuICBpZiAoIW5vQXNzZXJ0KSBjaGVja09mZnNldChvZmZzZXQsIGJ5dGVMZW5ndGgsIHRoaXMubGVuZ3RoKVxuXG4gIHZhciBpID0gYnl0ZUxlbmd0aFxuICB2YXIgbXVsID0gMVxuICB2YXIgdmFsID0gdGhpc1tvZmZzZXQgKyAtLWldXG4gIHdoaWxlIChpID4gMCAmJiAobXVsICo9IDB4MTAwKSkge1xuICAgIHZhbCArPSB0aGlzW29mZnNldCArIC0taV0gKiBtdWxcbiAgfVxuICBtdWwgKj0gMHg4MFxuXG4gIGlmICh2YWwgPj0gbXVsKSB2YWwgLT0gTWF0aC5wb3coMiwgOCAqIGJ5dGVMZW5ndGgpXG5cbiAgcmV0dXJuIHZhbFxufVxuXG5CdWZmZXIucHJvdG90eXBlLnJlYWRJbnQ4ID0gZnVuY3Rpb24gcmVhZEludDggKG9mZnNldCwgbm9Bc3NlcnQpIHtcbiAgaWYgKCFub0Fzc2VydCkgY2hlY2tPZmZzZXQob2Zmc2V0LCAxLCB0aGlzLmxlbmd0aClcbiAgaWYgKCEodGhpc1tvZmZzZXRdICYgMHg4MCkpIHJldHVybiAodGhpc1tvZmZzZXRdKVxuICByZXR1cm4gKCgweGZmIC0gdGhpc1tvZmZzZXRdICsgMSkgKiAtMSlcbn1cblxuQnVmZmVyLnByb3RvdHlwZS5yZWFkSW50MTZMRSA9IGZ1bmN0aW9uIHJlYWRJbnQxNkxFIChvZmZzZXQsIG5vQXNzZXJ0KSB7XG4gIGlmICghbm9Bc3NlcnQpIGNoZWNrT2Zmc2V0KG9mZnNldCwgMiwgdGhpcy5sZW5ndGgpXG4gIHZhciB2YWwgPSB0aGlzW29mZnNldF0gfCAodGhpc1tvZmZzZXQgKyAxXSA8PCA4KVxuICByZXR1cm4gKHZhbCAmIDB4ODAwMCkgPyB2YWwgfCAweEZGRkYwMDAwIDogdmFsXG59XG5cbkJ1ZmZlci5wcm90b3R5cGUucmVhZEludDE2QkUgPSBmdW5jdGlvbiByZWFkSW50MTZCRSAob2Zmc2V0LCBub0Fzc2VydCkge1xuICBpZiAoIW5vQXNzZXJ0KSBjaGVja09mZnNldChvZmZzZXQsIDIsIHRoaXMubGVuZ3RoKVxuICB2YXIgdmFsID0gdGhpc1tvZmZzZXQgKyAxXSB8ICh0aGlzW29mZnNldF0gPDwgOClcbiAgcmV0dXJuICh2YWwgJiAweDgwMDApID8gdmFsIHwgMHhGRkZGMDAwMCA6IHZhbFxufVxuXG5CdWZmZXIucHJvdG90eXBlLnJlYWRJbnQzMkxFID0gZnVuY3Rpb24gcmVhZEludDMyTEUgKG9mZnNldCwgbm9Bc3NlcnQpIHtcbiAgaWYgKCFub0Fzc2VydCkgY2hlY2tPZmZzZXQob2Zmc2V0LCA0LCB0aGlzLmxlbmd0aClcblxuICByZXR1cm4gKHRoaXNbb2Zmc2V0XSkgfFxuICAgICh0aGlzW29mZnNldCArIDFdIDw8IDgpIHxcbiAgICAodGhpc1tvZmZzZXQgKyAyXSA8PCAxNikgfFxuICAgICh0aGlzW29mZnNldCArIDNdIDw8IDI0KVxufVxuXG5CdWZmZXIucHJvdG90eXBlLnJlYWRJbnQzMkJFID0gZnVuY3Rpb24gcmVhZEludDMyQkUgKG9mZnNldCwgbm9Bc3NlcnQpIHtcbiAgaWYgKCFub0Fzc2VydCkgY2hlY2tPZmZzZXQob2Zmc2V0LCA0LCB0aGlzLmxlbmd0aClcblxuICByZXR1cm4gKHRoaXNbb2Zmc2V0XSA8PCAyNCkgfFxuICAgICh0aGlzW29mZnNldCArIDFdIDw8IDE2KSB8XG4gICAgKHRoaXNbb2Zmc2V0ICsgMl0gPDwgOCkgfFxuICAgICh0aGlzW29mZnNldCArIDNdKVxufVxuXG5CdWZmZXIucHJvdG90eXBlLnJlYWRGbG9hdExFID0gZnVuY3Rpb24gcmVhZEZsb2F0TEUgKG9mZnNldCwgbm9Bc3NlcnQpIHtcbiAgaWYgKCFub0Fzc2VydCkgY2hlY2tPZmZzZXQob2Zmc2V0LCA0LCB0aGlzLmxlbmd0aClcbiAgcmV0dXJuIGllZWU3NTQucmVhZCh0aGlzLCBvZmZzZXQsIHRydWUsIDIzLCA0KVxufVxuXG5CdWZmZXIucHJvdG90eXBlLnJlYWRGbG9hdEJFID0gZnVuY3Rpb24gcmVhZEZsb2F0QkUgKG9mZnNldCwgbm9Bc3NlcnQpIHtcbiAgaWYgKCFub0Fzc2VydCkgY2hlY2tPZmZzZXQob2Zmc2V0LCA0LCB0aGlzLmxlbmd0aClcbiAgcmV0dXJuIGllZWU3NTQucmVhZCh0aGlzLCBvZmZzZXQsIGZhbHNlLCAyMywgNClcbn1cblxuQnVmZmVyLnByb3RvdHlwZS5yZWFkRG91YmxlTEUgPSBmdW5jdGlvbiByZWFkRG91YmxlTEUgKG9mZnNldCwgbm9Bc3NlcnQpIHtcbiAgaWYgKCFub0Fzc2VydCkgY2hlY2tPZmZzZXQob2Zmc2V0LCA4LCB0aGlzLmxlbmd0aClcbiAgcmV0dXJuIGllZWU3NTQucmVhZCh0aGlzLCBvZmZzZXQsIHRydWUsIDUyLCA4KVxufVxuXG5CdWZmZXIucHJvdG90eXBlLnJlYWREb3VibGVCRSA9IGZ1bmN0aW9uIHJlYWREb3VibGVCRSAob2Zmc2V0LCBub0Fzc2VydCkge1xuICBpZiAoIW5vQXNzZXJ0KSBjaGVja09mZnNldChvZmZzZXQsIDgsIHRoaXMubGVuZ3RoKVxuICByZXR1cm4gaWVlZTc1NC5yZWFkKHRoaXMsIG9mZnNldCwgZmFsc2UsIDUyLCA4KVxufVxuXG5mdW5jdGlvbiBjaGVja0ludCAoYnVmLCB2YWx1ZSwgb2Zmc2V0LCBleHQsIG1heCwgbWluKSB7XG4gIGlmICghQnVmZmVyLmlzQnVmZmVyKGJ1ZikpIHRocm93IG5ldyBUeXBlRXJyb3IoJ2J1ZmZlciBtdXN0IGJlIGEgQnVmZmVyIGluc3RhbmNlJylcbiAgaWYgKHZhbHVlID4gbWF4IHx8IHZhbHVlIDwgbWluKSB0aHJvdyBuZXcgUmFuZ2VFcnJvcigndmFsdWUgaXMgb3V0IG9mIGJvdW5kcycpXG4gIGlmIChvZmZzZXQgKyBleHQgPiBidWYubGVuZ3RoKSB0aHJvdyBuZXcgUmFuZ2VFcnJvcignaW5kZXggb3V0IG9mIHJhbmdlJylcbn1cblxuQnVmZmVyLnByb3RvdHlwZS53cml0ZVVJbnRMRSA9IGZ1bmN0aW9uIHdyaXRlVUludExFICh2YWx1ZSwgb2Zmc2V0LCBieXRlTGVuZ3RoLCBub0Fzc2VydCkge1xuICB2YWx1ZSA9ICt2YWx1ZVxuICBvZmZzZXQgPSBvZmZzZXQgfCAwXG4gIGJ5dGVMZW5ndGggPSBieXRlTGVuZ3RoIHwgMFxuICBpZiAoIW5vQXNzZXJ0KSBjaGVja0ludCh0aGlzLCB2YWx1ZSwgb2Zmc2V0LCBieXRlTGVuZ3RoLCBNYXRoLnBvdygyLCA4ICogYnl0ZUxlbmd0aCksIDApXG5cbiAgdmFyIG11bCA9IDFcbiAgdmFyIGkgPSAwXG4gIHRoaXNbb2Zmc2V0XSA9IHZhbHVlICYgMHhGRlxuICB3aGlsZSAoKytpIDwgYnl0ZUxlbmd0aCAmJiAobXVsICo9IDB4MTAwKSkge1xuICAgIHRoaXNbb2Zmc2V0ICsgaV0gPSAodmFsdWUgLyBtdWwpICYgMHhGRlxuICB9XG5cbiAgcmV0dXJuIG9mZnNldCArIGJ5dGVMZW5ndGhcbn1cblxuQnVmZmVyLnByb3RvdHlwZS53cml0ZVVJbnRCRSA9IGZ1bmN0aW9uIHdyaXRlVUludEJFICh2YWx1ZSwgb2Zmc2V0LCBieXRlTGVuZ3RoLCBub0Fzc2VydCkge1xuICB2YWx1ZSA9ICt2YWx1ZVxuICBvZmZzZXQgPSBvZmZzZXQgfCAwXG4gIGJ5dGVMZW5ndGggPSBieXRlTGVuZ3RoIHwgMFxuICBpZiAoIW5vQXNzZXJ0KSBjaGVja0ludCh0aGlzLCB2YWx1ZSwgb2Zmc2V0LCBieXRlTGVuZ3RoLCBNYXRoLnBvdygyLCA4ICogYnl0ZUxlbmd0aCksIDApXG5cbiAgdmFyIGkgPSBieXRlTGVuZ3RoIC0gMVxuICB2YXIgbXVsID0gMVxuICB0aGlzW29mZnNldCArIGldID0gdmFsdWUgJiAweEZGXG4gIHdoaWxlICgtLWkgPj0gMCAmJiAobXVsICo9IDB4MTAwKSkge1xuICAgIHRoaXNbb2Zmc2V0ICsgaV0gPSAodmFsdWUgLyBtdWwpICYgMHhGRlxuICB9XG5cbiAgcmV0dXJuIG9mZnNldCArIGJ5dGVMZW5ndGhcbn1cblxuQnVmZmVyLnByb3RvdHlwZS53cml0ZVVJbnQ4ID0gZnVuY3Rpb24gd3JpdGVVSW50OCAodmFsdWUsIG9mZnNldCwgbm9Bc3NlcnQpIHtcbiAgdmFsdWUgPSArdmFsdWVcbiAgb2Zmc2V0ID0gb2Zmc2V0IHwgMFxuICBpZiAoIW5vQXNzZXJ0KSBjaGVja0ludCh0aGlzLCB2YWx1ZSwgb2Zmc2V0LCAxLCAweGZmLCAwKVxuICBpZiAoIUJ1ZmZlci5UWVBFRF9BUlJBWV9TVVBQT1JUKSB2YWx1ZSA9IE1hdGguZmxvb3IodmFsdWUpXG4gIHRoaXNbb2Zmc2V0XSA9IHZhbHVlXG4gIHJldHVybiBvZmZzZXQgKyAxXG59XG5cbmZ1bmN0aW9uIG9iamVjdFdyaXRlVUludDE2IChidWYsIHZhbHVlLCBvZmZzZXQsIGxpdHRsZUVuZGlhbikge1xuICBpZiAodmFsdWUgPCAwKSB2YWx1ZSA9IDB4ZmZmZiArIHZhbHVlICsgMVxuICBmb3IgKHZhciBpID0gMCwgaiA9IE1hdGgubWluKGJ1Zi5sZW5ndGggLSBvZmZzZXQsIDIpOyBpIDwgajsgaSsrKSB7XG4gICAgYnVmW29mZnNldCArIGldID0gKHZhbHVlICYgKDB4ZmYgPDwgKDggKiAobGl0dGxlRW5kaWFuID8gaSA6IDEgLSBpKSkpKSA+Pj5cbiAgICAgIChsaXR0bGVFbmRpYW4gPyBpIDogMSAtIGkpICogOFxuICB9XG59XG5cbkJ1ZmZlci5wcm90b3R5cGUud3JpdGVVSW50MTZMRSA9IGZ1bmN0aW9uIHdyaXRlVUludDE2TEUgKHZhbHVlLCBvZmZzZXQsIG5vQXNzZXJ0KSB7XG4gIHZhbHVlID0gK3ZhbHVlXG4gIG9mZnNldCA9IG9mZnNldCB8IDBcbiAgaWYgKCFub0Fzc2VydCkgY2hlY2tJbnQodGhpcywgdmFsdWUsIG9mZnNldCwgMiwgMHhmZmZmLCAwKVxuICBpZiAoQnVmZmVyLlRZUEVEX0FSUkFZX1NVUFBPUlQpIHtcbiAgICB0aGlzW29mZnNldF0gPSB2YWx1ZVxuICAgIHRoaXNbb2Zmc2V0ICsgMV0gPSAodmFsdWUgPj4+IDgpXG4gIH0gZWxzZSB7XG4gICAgb2JqZWN0V3JpdGVVSW50MTYodGhpcywgdmFsdWUsIG9mZnNldCwgdHJ1ZSlcbiAgfVxuICByZXR1cm4gb2Zmc2V0ICsgMlxufVxuXG5CdWZmZXIucHJvdG90eXBlLndyaXRlVUludDE2QkUgPSBmdW5jdGlvbiB3cml0ZVVJbnQxNkJFICh2YWx1ZSwgb2Zmc2V0LCBub0Fzc2VydCkge1xuICB2YWx1ZSA9ICt2YWx1ZVxuICBvZmZzZXQgPSBvZmZzZXQgfCAwXG4gIGlmICghbm9Bc3NlcnQpIGNoZWNrSW50KHRoaXMsIHZhbHVlLCBvZmZzZXQsIDIsIDB4ZmZmZiwgMClcbiAgaWYgKEJ1ZmZlci5UWVBFRF9BUlJBWV9TVVBQT1JUKSB7XG4gICAgdGhpc1tvZmZzZXRdID0gKHZhbHVlID4+PiA4KVxuICAgIHRoaXNbb2Zmc2V0ICsgMV0gPSB2YWx1ZVxuICB9IGVsc2Uge1xuICAgIG9iamVjdFdyaXRlVUludDE2KHRoaXMsIHZhbHVlLCBvZmZzZXQsIGZhbHNlKVxuICB9XG4gIHJldHVybiBvZmZzZXQgKyAyXG59XG5cbmZ1bmN0aW9uIG9iamVjdFdyaXRlVUludDMyIChidWYsIHZhbHVlLCBvZmZzZXQsIGxpdHRsZUVuZGlhbikge1xuICBpZiAodmFsdWUgPCAwKSB2YWx1ZSA9IDB4ZmZmZmZmZmYgKyB2YWx1ZSArIDFcbiAgZm9yICh2YXIgaSA9IDAsIGogPSBNYXRoLm1pbihidWYubGVuZ3RoIC0gb2Zmc2V0LCA0KTsgaSA8IGo7IGkrKykge1xuICAgIGJ1ZltvZmZzZXQgKyBpXSA9ICh2YWx1ZSA+Pj4gKGxpdHRsZUVuZGlhbiA/IGkgOiAzIC0gaSkgKiA4KSAmIDB4ZmZcbiAgfVxufVxuXG5CdWZmZXIucHJvdG90eXBlLndyaXRlVUludDMyTEUgPSBmdW5jdGlvbiB3cml0ZVVJbnQzMkxFICh2YWx1ZSwgb2Zmc2V0LCBub0Fzc2VydCkge1xuICB2YWx1ZSA9ICt2YWx1ZVxuICBvZmZzZXQgPSBvZmZzZXQgfCAwXG4gIGlmICghbm9Bc3NlcnQpIGNoZWNrSW50KHRoaXMsIHZhbHVlLCBvZmZzZXQsIDQsIDB4ZmZmZmZmZmYsIDApXG4gIGlmIChCdWZmZXIuVFlQRURfQVJSQVlfU1VQUE9SVCkge1xuICAgIHRoaXNbb2Zmc2V0ICsgM10gPSAodmFsdWUgPj4+IDI0KVxuICAgIHRoaXNbb2Zmc2V0ICsgMl0gPSAodmFsdWUgPj4+IDE2KVxuICAgIHRoaXNbb2Zmc2V0ICsgMV0gPSAodmFsdWUgPj4+IDgpXG4gICAgdGhpc1tvZmZzZXRdID0gdmFsdWVcbiAgfSBlbHNlIHtcbiAgICBvYmplY3RXcml0ZVVJbnQzMih0aGlzLCB2YWx1ZSwgb2Zmc2V0LCB0cnVlKVxuICB9XG4gIHJldHVybiBvZmZzZXQgKyA0XG59XG5cbkJ1ZmZlci5wcm90b3R5cGUud3JpdGVVSW50MzJCRSA9IGZ1bmN0aW9uIHdyaXRlVUludDMyQkUgKHZhbHVlLCBvZmZzZXQsIG5vQXNzZXJ0KSB7XG4gIHZhbHVlID0gK3ZhbHVlXG4gIG9mZnNldCA9IG9mZnNldCB8IDBcbiAgaWYgKCFub0Fzc2VydCkgY2hlY2tJbnQodGhpcywgdmFsdWUsIG9mZnNldCwgNCwgMHhmZmZmZmZmZiwgMClcbiAgaWYgKEJ1ZmZlci5UWVBFRF9BUlJBWV9TVVBQT1JUKSB7XG4gICAgdGhpc1tvZmZzZXRdID0gKHZhbHVlID4+PiAyNClcbiAgICB0aGlzW29mZnNldCArIDFdID0gKHZhbHVlID4+PiAxNilcbiAgICB0aGlzW29mZnNldCArIDJdID0gKHZhbHVlID4+PiA4KVxuICAgIHRoaXNbb2Zmc2V0ICsgM10gPSB2YWx1ZVxuICB9IGVsc2Uge1xuICAgIG9iamVjdFdyaXRlVUludDMyKHRoaXMsIHZhbHVlLCBvZmZzZXQsIGZhbHNlKVxuICB9XG4gIHJldHVybiBvZmZzZXQgKyA0XG59XG5cbkJ1ZmZlci5wcm90b3R5cGUud3JpdGVJbnRMRSA9IGZ1bmN0aW9uIHdyaXRlSW50TEUgKHZhbHVlLCBvZmZzZXQsIGJ5dGVMZW5ndGgsIG5vQXNzZXJ0KSB7XG4gIHZhbHVlID0gK3ZhbHVlXG4gIG9mZnNldCA9IG9mZnNldCB8IDBcbiAgaWYgKCFub0Fzc2VydCkge1xuICAgIHZhciBsaW1pdCA9IE1hdGgucG93KDIsIDggKiBieXRlTGVuZ3RoIC0gMSlcblxuICAgIGNoZWNrSW50KHRoaXMsIHZhbHVlLCBvZmZzZXQsIGJ5dGVMZW5ndGgsIGxpbWl0IC0gMSwgLWxpbWl0KVxuICB9XG5cbiAgdmFyIGkgPSAwXG4gIHZhciBtdWwgPSAxXG4gIHZhciBzdWIgPSB2YWx1ZSA8IDAgPyAxIDogMFxuICB0aGlzW29mZnNldF0gPSB2YWx1ZSAmIDB4RkZcbiAgd2hpbGUgKCsraSA8IGJ5dGVMZW5ndGggJiYgKG11bCAqPSAweDEwMCkpIHtcbiAgICB0aGlzW29mZnNldCArIGldID0gKCh2YWx1ZSAvIG11bCkgPj4gMCkgLSBzdWIgJiAweEZGXG4gIH1cblxuICByZXR1cm4gb2Zmc2V0ICsgYnl0ZUxlbmd0aFxufVxuXG5CdWZmZXIucHJvdG90eXBlLndyaXRlSW50QkUgPSBmdW5jdGlvbiB3cml0ZUludEJFICh2YWx1ZSwgb2Zmc2V0LCBieXRlTGVuZ3RoLCBub0Fzc2VydCkge1xuICB2YWx1ZSA9ICt2YWx1ZVxuICBvZmZzZXQgPSBvZmZzZXQgfCAwXG4gIGlmICghbm9Bc3NlcnQpIHtcbiAgICB2YXIgbGltaXQgPSBNYXRoLnBvdygyLCA4ICogYnl0ZUxlbmd0aCAtIDEpXG5cbiAgICBjaGVja0ludCh0aGlzLCB2YWx1ZSwgb2Zmc2V0LCBieXRlTGVuZ3RoLCBsaW1pdCAtIDEsIC1saW1pdClcbiAgfVxuXG4gIHZhciBpID0gYnl0ZUxlbmd0aCAtIDFcbiAgdmFyIG11bCA9IDFcbiAgdmFyIHN1YiA9IHZhbHVlIDwgMCA/IDEgOiAwXG4gIHRoaXNbb2Zmc2V0ICsgaV0gPSB2YWx1ZSAmIDB4RkZcbiAgd2hpbGUgKC0taSA+PSAwICYmIChtdWwgKj0gMHgxMDApKSB7XG4gICAgdGhpc1tvZmZzZXQgKyBpXSA9ICgodmFsdWUgLyBtdWwpID4+IDApIC0gc3ViICYgMHhGRlxuICB9XG5cbiAgcmV0dXJuIG9mZnNldCArIGJ5dGVMZW5ndGhcbn1cblxuQnVmZmVyLnByb3RvdHlwZS53cml0ZUludDggPSBmdW5jdGlvbiB3cml0ZUludDggKHZhbHVlLCBvZmZzZXQsIG5vQXNzZXJ0KSB7XG4gIHZhbHVlID0gK3ZhbHVlXG4gIG9mZnNldCA9IG9mZnNldCB8IDBcbiAgaWYgKCFub0Fzc2VydCkgY2hlY2tJbnQodGhpcywgdmFsdWUsIG9mZnNldCwgMSwgMHg3ZiwgLTB4ODApXG4gIGlmICghQnVmZmVyLlRZUEVEX0FSUkFZX1NVUFBPUlQpIHZhbHVlID0gTWF0aC5mbG9vcih2YWx1ZSlcbiAgaWYgKHZhbHVlIDwgMCkgdmFsdWUgPSAweGZmICsgdmFsdWUgKyAxXG4gIHRoaXNbb2Zmc2V0XSA9IHZhbHVlXG4gIHJldHVybiBvZmZzZXQgKyAxXG59XG5cbkJ1ZmZlci5wcm90b3R5cGUud3JpdGVJbnQxNkxFID0gZnVuY3Rpb24gd3JpdGVJbnQxNkxFICh2YWx1ZSwgb2Zmc2V0LCBub0Fzc2VydCkge1xuICB2YWx1ZSA9ICt2YWx1ZVxuICBvZmZzZXQgPSBvZmZzZXQgfCAwXG4gIGlmICghbm9Bc3NlcnQpIGNoZWNrSW50KHRoaXMsIHZhbHVlLCBvZmZzZXQsIDIsIDB4N2ZmZiwgLTB4ODAwMClcbiAgaWYgKEJ1ZmZlci5UWVBFRF9BUlJBWV9TVVBQT1JUKSB7XG4gICAgdGhpc1tvZmZzZXRdID0gdmFsdWVcbiAgICB0aGlzW29mZnNldCArIDFdID0gKHZhbHVlID4+PiA4KVxuICB9IGVsc2Uge1xuICAgIG9iamVjdFdyaXRlVUludDE2KHRoaXMsIHZhbHVlLCBvZmZzZXQsIHRydWUpXG4gIH1cbiAgcmV0dXJuIG9mZnNldCArIDJcbn1cblxuQnVmZmVyLnByb3RvdHlwZS53cml0ZUludDE2QkUgPSBmdW5jdGlvbiB3cml0ZUludDE2QkUgKHZhbHVlLCBvZmZzZXQsIG5vQXNzZXJ0KSB7XG4gIHZhbHVlID0gK3ZhbHVlXG4gIG9mZnNldCA9IG9mZnNldCB8IDBcbiAgaWYgKCFub0Fzc2VydCkgY2hlY2tJbnQodGhpcywgdmFsdWUsIG9mZnNldCwgMiwgMHg3ZmZmLCAtMHg4MDAwKVxuICBpZiAoQnVmZmVyLlRZUEVEX0FSUkFZX1NVUFBPUlQpIHtcbiAgICB0aGlzW29mZnNldF0gPSAodmFsdWUgPj4+IDgpXG4gICAgdGhpc1tvZmZzZXQgKyAxXSA9IHZhbHVlXG4gIH0gZWxzZSB7XG4gICAgb2JqZWN0V3JpdGVVSW50MTYodGhpcywgdmFsdWUsIG9mZnNldCwgZmFsc2UpXG4gIH1cbiAgcmV0dXJuIG9mZnNldCArIDJcbn1cblxuQnVmZmVyLnByb3RvdHlwZS53cml0ZUludDMyTEUgPSBmdW5jdGlvbiB3cml0ZUludDMyTEUgKHZhbHVlLCBvZmZzZXQsIG5vQXNzZXJ0KSB7XG4gIHZhbHVlID0gK3ZhbHVlXG4gIG9mZnNldCA9IG9mZnNldCB8IDBcbiAgaWYgKCFub0Fzc2VydCkgY2hlY2tJbnQodGhpcywgdmFsdWUsIG9mZnNldCwgNCwgMHg3ZmZmZmZmZiwgLTB4ODAwMDAwMDApXG4gIGlmIChCdWZmZXIuVFlQRURfQVJSQVlfU1VQUE9SVCkge1xuICAgIHRoaXNbb2Zmc2V0XSA9IHZhbHVlXG4gICAgdGhpc1tvZmZzZXQgKyAxXSA9ICh2YWx1ZSA+Pj4gOClcbiAgICB0aGlzW29mZnNldCArIDJdID0gKHZhbHVlID4+PiAxNilcbiAgICB0aGlzW29mZnNldCArIDNdID0gKHZhbHVlID4+PiAyNClcbiAgfSBlbHNlIHtcbiAgICBvYmplY3RXcml0ZVVJbnQzMih0aGlzLCB2YWx1ZSwgb2Zmc2V0LCB0cnVlKVxuICB9XG4gIHJldHVybiBvZmZzZXQgKyA0XG59XG5cbkJ1ZmZlci5wcm90b3R5cGUud3JpdGVJbnQzMkJFID0gZnVuY3Rpb24gd3JpdGVJbnQzMkJFICh2YWx1ZSwgb2Zmc2V0LCBub0Fzc2VydCkge1xuICB2YWx1ZSA9ICt2YWx1ZVxuICBvZmZzZXQgPSBvZmZzZXQgfCAwXG4gIGlmICghbm9Bc3NlcnQpIGNoZWNrSW50KHRoaXMsIHZhbHVlLCBvZmZzZXQsIDQsIDB4N2ZmZmZmZmYsIC0weDgwMDAwMDAwKVxuICBpZiAodmFsdWUgPCAwKSB2YWx1ZSA9IDB4ZmZmZmZmZmYgKyB2YWx1ZSArIDFcbiAgaWYgKEJ1ZmZlci5UWVBFRF9BUlJBWV9TVVBQT1JUKSB7XG4gICAgdGhpc1tvZmZzZXRdID0gKHZhbHVlID4+PiAyNClcbiAgICB0aGlzW29mZnNldCArIDFdID0gKHZhbHVlID4+PiAxNilcbiAgICB0aGlzW29mZnNldCArIDJdID0gKHZhbHVlID4+PiA4KVxuICAgIHRoaXNbb2Zmc2V0ICsgM10gPSB2YWx1ZVxuICB9IGVsc2Uge1xuICAgIG9iamVjdFdyaXRlVUludDMyKHRoaXMsIHZhbHVlLCBvZmZzZXQsIGZhbHNlKVxuICB9XG4gIHJldHVybiBvZmZzZXQgKyA0XG59XG5cbmZ1bmN0aW9uIGNoZWNrSUVFRTc1NCAoYnVmLCB2YWx1ZSwgb2Zmc2V0LCBleHQsIG1heCwgbWluKSB7XG4gIGlmICh2YWx1ZSA+IG1heCB8fCB2YWx1ZSA8IG1pbikgdGhyb3cgbmV3IFJhbmdlRXJyb3IoJ3ZhbHVlIGlzIG91dCBvZiBib3VuZHMnKVxuICBpZiAob2Zmc2V0ICsgZXh0ID4gYnVmLmxlbmd0aCkgdGhyb3cgbmV3IFJhbmdlRXJyb3IoJ2luZGV4IG91dCBvZiByYW5nZScpXG4gIGlmIChvZmZzZXQgPCAwKSB0aHJvdyBuZXcgUmFuZ2VFcnJvcignaW5kZXggb3V0IG9mIHJhbmdlJylcbn1cblxuZnVuY3Rpb24gd3JpdGVGbG9hdCAoYnVmLCB2YWx1ZSwgb2Zmc2V0LCBsaXR0bGVFbmRpYW4sIG5vQXNzZXJ0KSB7XG4gIGlmICghbm9Bc3NlcnQpIHtcbiAgICBjaGVja0lFRUU3NTQoYnVmLCB2YWx1ZSwgb2Zmc2V0LCA0LCAzLjQwMjgyMzQ2NjM4NTI4ODZlKzM4LCAtMy40MDI4MjM0NjYzODUyODg2ZSszOClcbiAgfVxuICBpZWVlNzU0LndyaXRlKGJ1ZiwgdmFsdWUsIG9mZnNldCwgbGl0dGxlRW5kaWFuLCAyMywgNClcbiAgcmV0dXJuIG9mZnNldCArIDRcbn1cblxuQnVmZmVyLnByb3RvdHlwZS53cml0ZUZsb2F0TEUgPSBmdW5jdGlvbiB3cml0ZUZsb2F0TEUgKHZhbHVlLCBvZmZzZXQsIG5vQXNzZXJ0KSB7XG4gIHJldHVybiB3cml0ZUZsb2F0KHRoaXMsIHZhbHVlLCBvZmZzZXQsIHRydWUsIG5vQXNzZXJ0KVxufVxuXG5CdWZmZXIucHJvdG90eXBlLndyaXRlRmxvYXRCRSA9IGZ1bmN0aW9uIHdyaXRlRmxvYXRCRSAodmFsdWUsIG9mZnNldCwgbm9Bc3NlcnQpIHtcbiAgcmV0dXJuIHdyaXRlRmxvYXQodGhpcywgdmFsdWUsIG9mZnNldCwgZmFsc2UsIG5vQXNzZXJ0KVxufVxuXG5mdW5jdGlvbiB3cml0ZURvdWJsZSAoYnVmLCB2YWx1ZSwgb2Zmc2V0LCBsaXR0bGVFbmRpYW4sIG5vQXNzZXJ0KSB7XG4gIGlmICghbm9Bc3NlcnQpIHtcbiAgICBjaGVja0lFRUU3NTQoYnVmLCB2YWx1ZSwgb2Zmc2V0LCA4LCAxLjc5NzY5MzEzNDg2MjMxNTdFKzMwOCwgLTEuNzk3NjkzMTM0ODYyMzE1N0UrMzA4KVxuICB9XG4gIGllZWU3NTQud3JpdGUoYnVmLCB2YWx1ZSwgb2Zmc2V0LCBsaXR0bGVFbmRpYW4sIDUyLCA4KVxuICByZXR1cm4gb2Zmc2V0ICsgOFxufVxuXG5CdWZmZXIucHJvdG90eXBlLndyaXRlRG91YmxlTEUgPSBmdW5jdGlvbiB3cml0ZURvdWJsZUxFICh2YWx1ZSwgb2Zmc2V0LCBub0Fzc2VydCkge1xuICByZXR1cm4gd3JpdGVEb3VibGUodGhpcywgdmFsdWUsIG9mZnNldCwgdHJ1ZSwgbm9Bc3NlcnQpXG59XG5cbkJ1ZmZlci5wcm90b3R5cGUud3JpdGVEb3VibGVCRSA9IGZ1bmN0aW9uIHdyaXRlRG91YmxlQkUgKHZhbHVlLCBvZmZzZXQsIG5vQXNzZXJ0KSB7XG4gIHJldHVybiB3cml0ZURvdWJsZSh0aGlzLCB2YWx1ZSwgb2Zmc2V0LCBmYWxzZSwgbm9Bc3NlcnQpXG59XG5cbi8vIGNvcHkodGFyZ2V0QnVmZmVyLCB0YXJnZXRTdGFydD0wLCBzb3VyY2VTdGFydD0wLCBzb3VyY2VFbmQ9YnVmZmVyLmxlbmd0aClcbkJ1ZmZlci5wcm90b3R5cGUuY29weSA9IGZ1bmN0aW9uIGNvcHkgKHRhcmdldCwgdGFyZ2V0U3RhcnQsIHN0YXJ0LCBlbmQpIHtcbiAgaWYgKCFzdGFydCkgc3RhcnQgPSAwXG4gIGlmICghZW5kICYmIGVuZCAhPT0gMCkgZW5kID0gdGhpcy5sZW5ndGhcbiAgaWYgKHRhcmdldFN0YXJ0ID49IHRhcmdldC5sZW5ndGgpIHRhcmdldFN0YXJ0ID0gdGFyZ2V0Lmxlbmd0aFxuICBpZiAoIXRhcmdldFN0YXJ0KSB0YXJnZXRTdGFydCA9IDBcbiAgaWYgKGVuZCA+IDAgJiYgZW5kIDwgc3RhcnQpIGVuZCA9IHN0YXJ0XG5cbiAgLy8gQ29weSAwIGJ5dGVzOyB3ZSdyZSBkb25lXG4gIGlmIChlbmQgPT09IHN0YXJ0KSByZXR1cm4gMFxuICBpZiAodGFyZ2V0Lmxlbmd0aCA9PT0gMCB8fCB0aGlzLmxlbmd0aCA9PT0gMCkgcmV0dXJuIDBcblxuICAvLyBGYXRhbCBlcnJvciBjb25kaXRpb25zXG4gIGlmICh0YXJnZXRTdGFydCA8IDApIHtcbiAgICB0aHJvdyBuZXcgUmFuZ2VFcnJvcigndGFyZ2V0U3RhcnQgb3V0IG9mIGJvdW5kcycpXG4gIH1cbiAgaWYgKHN0YXJ0IDwgMCB8fCBzdGFydCA+PSB0aGlzLmxlbmd0aCkgdGhyb3cgbmV3IFJhbmdlRXJyb3IoJ3NvdXJjZVN0YXJ0IG91dCBvZiBib3VuZHMnKVxuICBpZiAoZW5kIDwgMCkgdGhyb3cgbmV3IFJhbmdlRXJyb3IoJ3NvdXJjZUVuZCBvdXQgb2YgYm91bmRzJylcblxuICAvLyBBcmUgd2Ugb29iP1xuICBpZiAoZW5kID4gdGhpcy5sZW5ndGgpIGVuZCA9IHRoaXMubGVuZ3RoXG4gIGlmICh0YXJnZXQubGVuZ3RoIC0gdGFyZ2V0U3RhcnQgPCBlbmQgLSBzdGFydCkge1xuICAgIGVuZCA9IHRhcmdldC5sZW5ndGggLSB0YXJnZXRTdGFydCArIHN0YXJ0XG4gIH1cblxuICB2YXIgbGVuID0gZW5kIC0gc3RhcnRcbiAgdmFyIGlcblxuICBpZiAodGhpcyA9PT0gdGFyZ2V0ICYmIHN0YXJ0IDwgdGFyZ2V0U3RhcnQgJiYgdGFyZ2V0U3RhcnQgPCBlbmQpIHtcbiAgICAvLyBkZXNjZW5kaW5nIGNvcHkgZnJvbSBlbmRcbiAgICBmb3IgKGkgPSBsZW4gLSAxOyBpID49IDA7IGktLSkge1xuICAgICAgdGFyZ2V0W2kgKyB0YXJnZXRTdGFydF0gPSB0aGlzW2kgKyBzdGFydF1cbiAgICB9XG4gIH0gZWxzZSBpZiAobGVuIDwgMTAwMCB8fCAhQnVmZmVyLlRZUEVEX0FSUkFZX1NVUFBPUlQpIHtcbiAgICAvLyBhc2NlbmRpbmcgY29weSBmcm9tIHN0YXJ0XG4gICAgZm9yIChpID0gMDsgaSA8IGxlbjsgaSsrKSB7XG4gICAgICB0YXJnZXRbaSArIHRhcmdldFN0YXJ0XSA9IHRoaXNbaSArIHN0YXJ0XVxuICAgIH1cbiAgfSBlbHNlIHtcbiAgICB0YXJnZXQuX3NldCh0aGlzLnN1YmFycmF5KHN0YXJ0LCBzdGFydCArIGxlbiksIHRhcmdldFN0YXJ0KVxuICB9XG5cbiAgcmV0dXJuIGxlblxufVxuXG4vLyBmaWxsKHZhbHVlLCBzdGFydD0wLCBlbmQ9YnVmZmVyLmxlbmd0aClcbkJ1ZmZlci5wcm90b3R5cGUuZmlsbCA9IGZ1bmN0aW9uIGZpbGwgKHZhbHVlLCBzdGFydCwgZW5kKSB7XG4gIGlmICghdmFsdWUpIHZhbHVlID0gMFxuICBpZiAoIXN0YXJ0KSBzdGFydCA9IDBcbiAgaWYgKCFlbmQpIGVuZCA9IHRoaXMubGVuZ3RoXG5cbiAgaWYgKGVuZCA8IHN0YXJ0KSB0aHJvdyBuZXcgUmFuZ2VFcnJvcignZW5kIDwgc3RhcnQnKVxuXG4gIC8vIEZpbGwgMCBieXRlczsgd2UncmUgZG9uZVxuICBpZiAoZW5kID09PSBzdGFydCkgcmV0dXJuXG4gIGlmICh0aGlzLmxlbmd0aCA9PT0gMCkgcmV0dXJuXG5cbiAgaWYgKHN0YXJ0IDwgMCB8fCBzdGFydCA+PSB0aGlzLmxlbmd0aCkgdGhyb3cgbmV3IFJhbmdlRXJyb3IoJ3N0YXJ0IG91dCBvZiBib3VuZHMnKVxuICBpZiAoZW5kIDwgMCB8fCBlbmQgPiB0aGlzLmxlbmd0aCkgdGhyb3cgbmV3IFJhbmdlRXJyb3IoJ2VuZCBvdXQgb2YgYm91bmRzJylcblxuICB2YXIgaVxuICBpZiAodHlwZW9mIHZhbHVlID09PSAnbnVtYmVyJykge1xuICAgIGZvciAoaSA9IHN0YXJ0OyBpIDwgZW5kOyBpKyspIHtcbiAgICAgIHRoaXNbaV0gPSB2YWx1ZVxuICAgIH1cbiAgfSBlbHNlIHtcbiAgICB2YXIgYnl0ZXMgPSB1dGY4VG9CeXRlcyh2YWx1ZS50b1N0cmluZygpKVxuICAgIHZhciBsZW4gPSBieXRlcy5sZW5ndGhcbiAgICBmb3IgKGkgPSBzdGFydDsgaSA8IGVuZDsgaSsrKSB7XG4gICAgICB0aGlzW2ldID0gYnl0ZXNbaSAlIGxlbl1cbiAgICB9XG4gIH1cblxuICByZXR1cm4gdGhpc1xufVxuXG4vKipcbiAqIENyZWF0ZXMgYSBuZXcgYEFycmF5QnVmZmVyYCB3aXRoIHRoZSAqY29waWVkKiBtZW1vcnkgb2YgdGhlIGJ1ZmZlciBpbnN0YW5jZS5cbiAqIEFkZGVkIGluIE5vZGUgMC4xMi4gT25seSBhdmFpbGFibGUgaW4gYnJvd3NlcnMgdGhhdCBzdXBwb3J0IEFycmF5QnVmZmVyLlxuICovXG5CdWZmZXIucHJvdG90eXBlLnRvQXJyYXlCdWZmZXIgPSBmdW5jdGlvbiB0b0FycmF5QnVmZmVyICgpIHtcbiAgaWYgKHR5cGVvZiBVaW50OEFycmF5ICE9PSAndW5kZWZpbmVkJykge1xuICAgIGlmIChCdWZmZXIuVFlQRURfQVJSQVlfU1VQUE9SVCkge1xuICAgICAgcmV0dXJuIChuZXcgQnVmZmVyKHRoaXMpKS5idWZmZXJcbiAgICB9IGVsc2Uge1xuICAgICAgdmFyIGJ1ZiA9IG5ldyBVaW50OEFycmF5KHRoaXMubGVuZ3RoKVxuICAgICAgZm9yICh2YXIgaSA9IDAsIGxlbiA9IGJ1Zi5sZW5ndGg7IGkgPCBsZW47IGkgKz0gMSkge1xuICAgICAgICBidWZbaV0gPSB0aGlzW2ldXG4gICAgICB9XG4gICAgICByZXR1cm4gYnVmLmJ1ZmZlclxuICAgIH1cbiAgfSBlbHNlIHtcbiAgICB0aHJvdyBuZXcgVHlwZUVycm9yKCdCdWZmZXIudG9BcnJheUJ1ZmZlciBub3Qgc3VwcG9ydGVkIGluIHRoaXMgYnJvd3NlcicpXG4gIH1cbn1cblxuLy8gSEVMUEVSIEZVTkNUSU9OU1xuLy8gPT09PT09PT09PT09PT09PVxuXG52YXIgQlAgPSBCdWZmZXIucHJvdG90eXBlXG5cbi8qKlxuICogQXVnbWVudCBhIFVpbnQ4QXJyYXkgKmluc3RhbmNlKiAobm90IHRoZSBVaW50OEFycmF5IGNsYXNzISkgd2l0aCBCdWZmZXIgbWV0aG9kc1xuICovXG5CdWZmZXIuX2F1Z21lbnQgPSBmdW5jdGlvbiBfYXVnbWVudCAoYXJyKSB7XG4gIGFyci5jb25zdHJ1Y3RvciA9IEJ1ZmZlclxuICBhcnIuX2lzQnVmZmVyID0gdHJ1ZVxuXG4gIC8vIHNhdmUgcmVmZXJlbmNlIHRvIG9yaWdpbmFsIFVpbnQ4QXJyYXkgc2V0IG1ldGhvZCBiZWZvcmUgb3ZlcndyaXRpbmdcbiAgYXJyLl9zZXQgPSBhcnIuc2V0XG5cbiAgLy8gZGVwcmVjYXRlZFxuICBhcnIuZ2V0ID0gQlAuZ2V0XG4gIGFyci5zZXQgPSBCUC5zZXRcblxuICBhcnIud3JpdGUgPSBCUC53cml0ZVxuICBhcnIudG9TdHJpbmcgPSBCUC50b1N0cmluZ1xuICBhcnIudG9Mb2NhbGVTdHJpbmcgPSBCUC50b1N0cmluZ1xuICBhcnIudG9KU09OID0gQlAudG9KU09OXG4gIGFyci5lcXVhbHMgPSBCUC5lcXVhbHNcbiAgYXJyLmNvbXBhcmUgPSBCUC5jb21wYXJlXG4gIGFyci5pbmRleE9mID0gQlAuaW5kZXhPZlxuICBhcnIuY29weSA9IEJQLmNvcHlcbiAgYXJyLnNsaWNlID0gQlAuc2xpY2VcbiAgYXJyLnJlYWRVSW50TEUgPSBCUC5yZWFkVUludExFXG4gIGFyci5yZWFkVUludEJFID0gQlAucmVhZFVJbnRCRVxuICBhcnIucmVhZFVJbnQ4ID0gQlAucmVhZFVJbnQ4XG4gIGFyci5yZWFkVUludDE2TEUgPSBCUC5yZWFkVUludDE2TEVcbiAgYXJyLnJlYWRVSW50MTZCRSA9IEJQLnJlYWRVSW50MTZCRVxuICBhcnIucmVhZFVJbnQzMkxFID0gQlAucmVhZFVJbnQzMkxFXG4gIGFyci5yZWFkVUludDMyQkUgPSBCUC5yZWFkVUludDMyQkVcbiAgYXJyLnJlYWRJbnRMRSA9IEJQLnJlYWRJbnRMRVxuICBhcnIucmVhZEludEJFID0gQlAucmVhZEludEJFXG4gIGFyci5yZWFkSW50OCA9IEJQLnJlYWRJbnQ4XG4gIGFyci5yZWFkSW50MTZMRSA9IEJQLnJlYWRJbnQxNkxFXG4gIGFyci5yZWFkSW50MTZCRSA9IEJQLnJlYWRJbnQxNkJFXG4gIGFyci5yZWFkSW50MzJMRSA9IEJQLnJlYWRJbnQzMkxFXG4gIGFyci5yZWFkSW50MzJCRSA9IEJQLnJlYWRJbnQzMkJFXG4gIGFyci5yZWFkRmxvYXRMRSA9IEJQLnJlYWRGbG9hdExFXG4gIGFyci5yZWFkRmxvYXRCRSA9IEJQLnJlYWRGbG9hdEJFXG4gIGFyci5yZWFkRG91YmxlTEUgPSBCUC5yZWFkRG91YmxlTEVcbiAgYXJyLnJlYWREb3VibGVCRSA9IEJQLnJlYWREb3VibGVCRVxuICBhcnIud3JpdGVVSW50OCA9IEJQLndyaXRlVUludDhcbiAgYXJyLndyaXRlVUludExFID0gQlAud3JpdGVVSW50TEVcbiAgYXJyLndyaXRlVUludEJFID0gQlAud3JpdGVVSW50QkVcbiAgYXJyLndyaXRlVUludDE2TEUgPSBCUC53cml0ZVVJbnQxNkxFXG4gIGFyci53cml0ZVVJbnQxNkJFID0gQlAud3JpdGVVSW50MTZCRVxuICBhcnIud3JpdGVVSW50MzJMRSA9IEJQLndyaXRlVUludDMyTEVcbiAgYXJyLndyaXRlVUludDMyQkUgPSBCUC53cml0ZVVJbnQzMkJFXG4gIGFyci53cml0ZUludExFID0gQlAud3JpdGVJbnRMRVxuICBhcnIud3JpdGVJbnRCRSA9IEJQLndyaXRlSW50QkVcbiAgYXJyLndyaXRlSW50OCA9IEJQLndyaXRlSW50OFxuICBhcnIud3JpdGVJbnQxNkxFID0gQlAud3JpdGVJbnQxNkxFXG4gIGFyci53cml0ZUludDE2QkUgPSBCUC53cml0ZUludDE2QkVcbiAgYXJyLndyaXRlSW50MzJMRSA9IEJQLndyaXRlSW50MzJMRVxuICBhcnIud3JpdGVJbnQzMkJFID0gQlAud3JpdGVJbnQzMkJFXG4gIGFyci53cml0ZUZsb2F0TEUgPSBCUC53cml0ZUZsb2F0TEVcbiAgYXJyLndyaXRlRmxvYXRCRSA9IEJQLndyaXRlRmxvYXRCRVxuICBhcnIud3JpdGVEb3VibGVMRSA9IEJQLndyaXRlRG91YmxlTEVcbiAgYXJyLndyaXRlRG91YmxlQkUgPSBCUC53cml0ZURvdWJsZUJFXG4gIGFyci5maWxsID0gQlAuZmlsbFxuICBhcnIuaW5zcGVjdCA9IEJQLmluc3BlY3RcbiAgYXJyLnRvQXJyYXlCdWZmZXIgPSBCUC50b0FycmF5QnVmZmVyXG5cbiAgcmV0dXJuIGFyclxufVxuXG52YXIgSU5WQUxJRF9CQVNFNjRfUkUgPSAvW14rXFwvMC05QS1aYS16LV9dL2dcblxuZnVuY3Rpb24gYmFzZTY0Y2xlYW4gKHN0cikge1xuICAvLyBOb2RlIHN0cmlwcyBvdXQgaW52YWxpZCBjaGFyYWN0ZXJzIGxpa2UgXFxuIGFuZCBcXHQgZnJvbSB0aGUgc3RyaW5nLCBiYXNlNjQtanMgZG9lcyBub3RcbiAgc3RyID0gc3RyaW5ndHJpbShzdHIpLnJlcGxhY2UoSU5WQUxJRF9CQVNFNjRfUkUsICcnKVxuICAvLyBOb2RlIGNvbnZlcnRzIHN0cmluZ3Mgd2l0aCBsZW5ndGggPCAyIHRvICcnXG4gIGlmIChzdHIubGVuZ3RoIDwgMikgcmV0dXJuICcnXG4gIC8vIE5vZGUgYWxsb3dzIGZvciBub24tcGFkZGVkIGJhc2U2NCBzdHJpbmdzIChtaXNzaW5nIHRyYWlsaW5nID09PSksIGJhc2U2NC1qcyBkb2VzIG5vdFxuICB3aGlsZSAoc3RyLmxlbmd0aCAlIDQgIT09IDApIHtcbiAgICBzdHIgPSBzdHIgKyAnPSdcbiAgfVxuICByZXR1cm4gc3RyXG59XG5cbmZ1bmN0aW9uIHN0cmluZ3RyaW0gKHN0cikge1xuICBpZiAoc3RyLnRyaW0pIHJldHVybiBzdHIudHJpbSgpXG4gIHJldHVybiBzdHIucmVwbGFjZSgvXlxccyt8XFxzKyQvZywgJycpXG59XG5cbmZ1bmN0aW9uIHRvSGV4IChuKSB7XG4gIGlmIChuIDwgMTYpIHJldHVybiAnMCcgKyBuLnRvU3RyaW5nKDE2KVxuICByZXR1cm4gbi50b1N0cmluZygxNilcbn1cblxuZnVuY3Rpb24gdXRmOFRvQnl0ZXMgKHN0cmluZywgdW5pdHMpIHtcbiAgdW5pdHMgPSB1bml0cyB8fCBJbmZpbml0eVxuICB2YXIgY29kZVBvaW50XG4gIHZhciBsZW5ndGggPSBzdHJpbmcubGVuZ3RoXG4gIHZhciBsZWFkU3Vycm9nYXRlID0gbnVsbFxuICB2YXIgYnl0ZXMgPSBbXVxuXG4gIGZvciAodmFyIGkgPSAwOyBpIDwgbGVuZ3RoOyBpKyspIHtcbiAgICBjb2RlUG9pbnQgPSBzdHJpbmcuY2hhckNvZGVBdChpKVxuXG4gICAgLy8gaXMgc3Vycm9nYXRlIGNvbXBvbmVudFxuICAgIGlmIChjb2RlUG9pbnQgPiAweEQ3RkYgJiYgY29kZVBvaW50IDwgMHhFMDAwKSB7XG4gICAgICAvLyBsYXN0IGNoYXIgd2FzIGEgbGVhZFxuICAgICAgaWYgKCFsZWFkU3Vycm9nYXRlKSB7XG4gICAgICAgIC8vIG5vIGxlYWQgeWV0XG4gICAgICAgIGlmIChjb2RlUG9pbnQgPiAweERCRkYpIHtcbiAgICAgICAgICAvLyB1bmV4cGVjdGVkIHRyYWlsXG4gICAgICAgICAgaWYgKCh1bml0cyAtPSAzKSA+IC0xKSBieXRlcy5wdXNoKDB4RUYsIDB4QkYsIDB4QkQpXG4gICAgICAgICAgY29udGludWVcbiAgICAgICAgfSBlbHNlIGlmIChpICsgMSA9PT0gbGVuZ3RoKSB7XG4gICAgICAgICAgLy8gdW5wYWlyZWQgbGVhZFxuICAgICAgICAgIGlmICgodW5pdHMgLT0gMykgPiAtMSkgYnl0ZXMucHVzaCgweEVGLCAweEJGLCAweEJEKVxuICAgICAgICAgIGNvbnRpbnVlXG4gICAgICAgIH1cblxuICAgICAgICAvLyB2YWxpZCBsZWFkXG4gICAgICAgIGxlYWRTdXJyb2dhdGUgPSBjb2RlUG9pbnRcblxuICAgICAgICBjb250aW51ZVxuICAgICAgfVxuXG4gICAgICAvLyAyIGxlYWRzIGluIGEgcm93XG4gICAgICBpZiAoY29kZVBvaW50IDwgMHhEQzAwKSB7XG4gICAgICAgIGlmICgodW5pdHMgLT0gMykgPiAtMSkgYnl0ZXMucHVzaCgweEVGLCAweEJGLCAweEJEKVxuICAgICAgICBsZWFkU3Vycm9nYXRlID0gY29kZVBvaW50XG4gICAgICAgIGNvbnRpbnVlXG4gICAgICB9XG5cbiAgICAgIC8vIHZhbGlkIHN1cnJvZ2F0ZSBwYWlyXG4gICAgICBjb2RlUG9pbnQgPSBsZWFkU3Vycm9nYXRlIC0gMHhEODAwIDw8IDEwIHwgY29kZVBvaW50IC0gMHhEQzAwIHwgMHgxMDAwMFxuICAgIH0gZWxzZSBpZiAobGVhZFN1cnJvZ2F0ZSkge1xuICAgICAgLy8gdmFsaWQgYm1wIGNoYXIsIGJ1dCBsYXN0IGNoYXIgd2FzIGEgbGVhZFxuICAgICAgaWYgKCh1bml0cyAtPSAzKSA+IC0xKSBieXRlcy5wdXNoKDB4RUYsIDB4QkYsIDB4QkQpXG4gICAgfVxuXG4gICAgbGVhZFN1cnJvZ2F0ZSA9IG51bGxcblxuICAgIC8vIGVuY29kZSB1dGY4XG4gICAgaWYgKGNvZGVQb2ludCA8IDB4ODApIHtcbiAgICAgIGlmICgodW5pdHMgLT0gMSkgPCAwKSBicmVha1xuICAgICAgYnl0ZXMucHVzaChjb2RlUG9pbnQpXG4gICAgfSBlbHNlIGlmIChjb2RlUG9pbnQgPCAweDgwMCkge1xuICAgICAgaWYgKCh1bml0cyAtPSAyKSA8IDApIGJyZWFrXG4gICAgICBieXRlcy5wdXNoKFxuICAgICAgICBjb2RlUG9pbnQgPj4gMHg2IHwgMHhDMCxcbiAgICAgICAgY29kZVBvaW50ICYgMHgzRiB8IDB4ODBcbiAgICAgIClcbiAgICB9IGVsc2UgaWYgKGNvZGVQb2ludCA8IDB4MTAwMDApIHtcbiAgICAgIGlmICgodW5pdHMgLT0gMykgPCAwKSBicmVha1xuICAgICAgYnl0ZXMucHVzaChcbiAgICAgICAgY29kZVBvaW50ID4+IDB4QyB8IDB4RTAsXG4gICAgICAgIGNvZGVQb2ludCA+PiAweDYgJiAweDNGIHwgMHg4MCxcbiAgICAgICAgY29kZVBvaW50ICYgMHgzRiB8IDB4ODBcbiAgICAgIClcbiAgICB9IGVsc2UgaWYgKGNvZGVQb2ludCA8IDB4MTEwMDAwKSB7XG4gICAgICBpZiAoKHVuaXRzIC09IDQpIDwgMCkgYnJlYWtcbiAgICAgIGJ5dGVzLnB1c2goXG4gICAgICAgIGNvZGVQb2ludCA+PiAweDEyIHwgMHhGMCxcbiAgICAgICAgY29kZVBvaW50ID4+IDB4QyAmIDB4M0YgfCAweDgwLFxuICAgICAgICBjb2RlUG9pbnQgPj4gMHg2ICYgMHgzRiB8IDB4ODAsXG4gICAgICAgIGNvZGVQb2ludCAmIDB4M0YgfCAweDgwXG4gICAgICApXG4gICAgfSBlbHNlIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcignSW52YWxpZCBjb2RlIHBvaW50JylcbiAgICB9XG4gIH1cblxuICByZXR1cm4gYnl0ZXNcbn1cblxuZnVuY3Rpb24gYXNjaWlUb0J5dGVzIChzdHIpIHtcbiAgdmFyIGJ5dGVBcnJheSA9IFtdXG4gIGZvciAodmFyIGkgPSAwOyBpIDwgc3RyLmxlbmd0aDsgaSsrKSB7XG4gICAgLy8gTm9kZSdzIGNvZGUgc2VlbXMgdG8gYmUgZG9pbmcgdGhpcyBhbmQgbm90ICYgMHg3Ri4uXG4gICAgYnl0ZUFycmF5LnB1c2goc3RyLmNoYXJDb2RlQXQoaSkgJiAweEZGKVxuICB9XG4gIHJldHVybiBieXRlQXJyYXlcbn1cblxuZnVuY3Rpb24gdXRmMTZsZVRvQnl0ZXMgKHN0ciwgdW5pdHMpIHtcbiAgdmFyIGMsIGhpLCBsb1xuICB2YXIgYnl0ZUFycmF5ID0gW11cbiAgZm9yICh2YXIgaSA9IDA7IGkgPCBzdHIubGVuZ3RoOyBpKyspIHtcbiAgICBpZiAoKHVuaXRzIC09IDIpIDwgMCkgYnJlYWtcblxuICAgIGMgPSBzdHIuY2hhckNvZGVBdChpKVxuICAgIGhpID0gYyA+PiA4XG4gICAgbG8gPSBjICUgMjU2XG4gICAgYnl0ZUFycmF5LnB1c2gobG8pXG4gICAgYnl0ZUFycmF5LnB1c2goaGkpXG4gIH1cblxuICByZXR1cm4gYnl0ZUFycmF5XG59XG5cbmZ1bmN0aW9uIGJhc2U2NFRvQnl0ZXMgKHN0cikge1xuICByZXR1cm4gYmFzZTY0LnRvQnl0ZUFycmF5KGJhc2U2NGNsZWFuKHN0cikpXG59XG5cbmZ1bmN0aW9uIGJsaXRCdWZmZXIgKHNyYywgZHN0LCBvZmZzZXQsIGxlbmd0aCkge1xuICBmb3IgKHZhciBpID0gMDsgaSA8IGxlbmd0aDsgaSsrKSB7XG4gICAgaWYgKChpICsgb2Zmc2V0ID49IGRzdC5sZW5ndGgpIHx8IChpID49IHNyYy5sZW5ndGgpKSBicmVha1xuICAgIGRzdFtpICsgb2Zmc2V0XSA9IHNyY1tpXVxuICB9XG4gIHJldHVybiBpXG59XG4iLCJ2YXIgbG9va3VwID0gJ0FCQ0RFRkdISUpLTE1OT1BRUlNUVVZXWFlaYWJjZGVmZ2hpamtsbW5vcHFyc3R1dnd4eXowMTIzNDU2Nzg5Ky8nO1xuXG47KGZ1bmN0aW9uIChleHBvcnRzKSB7XG5cdCd1c2Ugc3RyaWN0JztcblxuICB2YXIgQXJyID0gKHR5cGVvZiBVaW50OEFycmF5ICE9PSAndW5kZWZpbmVkJylcbiAgICA/IFVpbnQ4QXJyYXlcbiAgICA6IEFycmF5XG5cblx0dmFyIFBMVVMgICA9ICcrJy5jaGFyQ29kZUF0KDApXG5cdHZhciBTTEFTSCAgPSAnLycuY2hhckNvZGVBdCgwKVxuXHR2YXIgTlVNQkVSID0gJzAnLmNoYXJDb2RlQXQoMClcblx0dmFyIExPV0VSICA9ICdhJy5jaGFyQ29kZUF0KDApXG5cdHZhciBVUFBFUiAgPSAnQScuY2hhckNvZGVBdCgwKVxuXHR2YXIgUExVU19VUkxfU0FGRSA9ICctJy5jaGFyQ29kZUF0KDApXG5cdHZhciBTTEFTSF9VUkxfU0FGRSA9ICdfJy5jaGFyQ29kZUF0KDApXG5cblx0ZnVuY3Rpb24gZGVjb2RlIChlbHQpIHtcblx0XHR2YXIgY29kZSA9IGVsdC5jaGFyQ29kZUF0KDApXG5cdFx0aWYgKGNvZGUgPT09IFBMVVMgfHxcblx0XHQgICAgY29kZSA9PT0gUExVU19VUkxfU0FGRSlcblx0XHRcdHJldHVybiA2MiAvLyAnKydcblx0XHRpZiAoY29kZSA9PT0gU0xBU0ggfHxcblx0XHQgICAgY29kZSA9PT0gU0xBU0hfVVJMX1NBRkUpXG5cdFx0XHRyZXR1cm4gNjMgLy8gJy8nXG5cdFx0aWYgKGNvZGUgPCBOVU1CRVIpXG5cdFx0XHRyZXR1cm4gLTEgLy9ubyBtYXRjaFxuXHRcdGlmIChjb2RlIDwgTlVNQkVSICsgMTApXG5cdFx0XHRyZXR1cm4gY29kZSAtIE5VTUJFUiArIDI2ICsgMjZcblx0XHRpZiAoY29kZSA8IFVQUEVSICsgMjYpXG5cdFx0XHRyZXR1cm4gY29kZSAtIFVQUEVSXG5cdFx0aWYgKGNvZGUgPCBMT1dFUiArIDI2KVxuXHRcdFx0cmV0dXJuIGNvZGUgLSBMT1dFUiArIDI2XG5cdH1cblxuXHRmdW5jdGlvbiBiNjRUb0J5dGVBcnJheSAoYjY0KSB7XG5cdFx0dmFyIGksIGosIGwsIHRtcCwgcGxhY2VIb2xkZXJzLCBhcnJcblxuXHRcdGlmIChiNjQubGVuZ3RoICUgNCA+IDApIHtcblx0XHRcdHRocm93IG5ldyBFcnJvcignSW52YWxpZCBzdHJpbmcuIExlbmd0aCBtdXN0IGJlIGEgbXVsdGlwbGUgb2YgNCcpXG5cdFx0fVxuXG5cdFx0Ly8gdGhlIG51bWJlciBvZiBlcXVhbCBzaWducyAocGxhY2UgaG9sZGVycylcblx0XHQvLyBpZiB0aGVyZSBhcmUgdHdvIHBsYWNlaG9sZGVycywgdGhhbiB0aGUgdHdvIGNoYXJhY3RlcnMgYmVmb3JlIGl0XG5cdFx0Ly8gcmVwcmVzZW50IG9uZSBieXRlXG5cdFx0Ly8gaWYgdGhlcmUgaXMgb25seSBvbmUsIHRoZW4gdGhlIHRocmVlIGNoYXJhY3RlcnMgYmVmb3JlIGl0IHJlcHJlc2VudCAyIGJ5dGVzXG5cdFx0Ly8gdGhpcyBpcyBqdXN0IGEgY2hlYXAgaGFjayB0byBub3QgZG8gaW5kZXhPZiB0d2ljZVxuXHRcdHZhciBsZW4gPSBiNjQubGVuZ3RoXG5cdFx0cGxhY2VIb2xkZXJzID0gJz0nID09PSBiNjQuY2hhckF0KGxlbiAtIDIpID8gMiA6ICc9JyA9PT0gYjY0LmNoYXJBdChsZW4gLSAxKSA/IDEgOiAwXG5cblx0XHQvLyBiYXNlNjQgaXMgNC8zICsgdXAgdG8gdHdvIGNoYXJhY3RlcnMgb2YgdGhlIG9yaWdpbmFsIGRhdGFcblx0XHRhcnIgPSBuZXcgQXJyKGI2NC5sZW5ndGggKiAzIC8gNCAtIHBsYWNlSG9sZGVycylcblxuXHRcdC8vIGlmIHRoZXJlIGFyZSBwbGFjZWhvbGRlcnMsIG9ubHkgZ2V0IHVwIHRvIHRoZSBsYXN0IGNvbXBsZXRlIDQgY2hhcnNcblx0XHRsID0gcGxhY2VIb2xkZXJzID4gMCA/IGI2NC5sZW5ndGggLSA0IDogYjY0Lmxlbmd0aFxuXG5cdFx0dmFyIEwgPSAwXG5cblx0XHRmdW5jdGlvbiBwdXNoICh2KSB7XG5cdFx0XHRhcnJbTCsrXSA9IHZcblx0XHR9XG5cblx0XHRmb3IgKGkgPSAwLCBqID0gMDsgaSA8IGw7IGkgKz0gNCwgaiArPSAzKSB7XG5cdFx0XHR0bXAgPSAoZGVjb2RlKGI2NC5jaGFyQXQoaSkpIDw8IDE4KSB8IChkZWNvZGUoYjY0LmNoYXJBdChpICsgMSkpIDw8IDEyKSB8IChkZWNvZGUoYjY0LmNoYXJBdChpICsgMikpIDw8IDYpIHwgZGVjb2RlKGI2NC5jaGFyQXQoaSArIDMpKVxuXHRcdFx0cHVzaCgodG1wICYgMHhGRjAwMDApID4+IDE2KVxuXHRcdFx0cHVzaCgodG1wICYgMHhGRjAwKSA+PiA4KVxuXHRcdFx0cHVzaCh0bXAgJiAweEZGKVxuXHRcdH1cblxuXHRcdGlmIChwbGFjZUhvbGRlcnMgPT09IDIpIHtcblx0XHRcdHRtcCA9IChkZWNvZGUoYjY0LmNoYXJBdChpKSkgPDwgMikgfCAoZGVjb2RlKGI2NC5jaGFyQXQoaSArIDEpKSA+PiA0KVxuXHRcdFx0cHVzaCh0bXAgJiAweEZGKVxuXHRcdH0gZWxzZSBpZiAocGxhY2VIb2xkZXJzID09PSAxKSB7XG5cdFx0XHR0bXAgPSAoZGVjb2RlKGI2NC5jaGFyQXQoaSkpIDw8IDEwKSB8IChkZWNvZGUoYjY0LmNoYXJBdChpICsgMSkpIDw8IDQpIHwgKGRlY29kZShiNjQuY2hhckF0KGkgKyAyKSkgPj4gMilcblx0XHRcdHB1c2goKHRtcCA+PiA4KSAmIDB4RkYpXG5cdFx0XHRwdXNoKHRtcCAmIDB4RkYpXG5cdFx0fVxuXG5cdFx0cmV0dXJuIGFyclxuXHR9XG5cblx0ZnVuY3Rpb24gdWludDhUb0Jhc2U2NCAodWludDgpIHtcblx0XHR2YXIgaSxcblx0XHRcdGV4dHJhQnl0ZXMgPSB1aW50OC5sZW5ndGggJSAzLCAvLyBpZiB3ZSBoYXZlIDEgYnl0ZSBsZWZ0LCBwYWQgMiBieXRlc1xuXHRcdFx0b3V0cHV0ID0gXCJcIixcblx0XHRcdHRlbXAsIGxlbmd0aFxuXG5cdFx0ZnVuY3Rpb24gZW5jb2RlIChudW0pIHtcblx0XHRcdHJldHVybiBsb29rdXAuY2hhckF0KG51bSlcblx0XHR9XG5cblx0XHRmdW5jdGlvbiB0cmlwbGV0VG9CYXNlNjQgKG51bSkge1xuXHRcdFx0cmV0dXJuIGVuY29kZShudW0gPj4gMTggJiAweDNGKSArIGVuY29kZShudW0gPj4gMTIgJiAweDNGKSArIGVuY29kZShudW0gPj4gNiAmIDB4M0YpICsgZW5jb2RlKG51bSAmIDB4M0YpXG5cdFx0fVxuXG5cdFx0Ly8gZ28gdGhyb3VnaCB0aGUgYXJyYXkgZXZlcnkgdGhyZWUgYnl0ZXMsIHdlJ2xsIGRlYWwgd2l0aCB0cmFpbGluZyBzdHVmZiBsYXRlclxuXHRcdGZvciAoaSA9IDAsIGxlbmd0aCA9IHVpbnQ4Lmxlbmd0aCAtIGV4dHJhQnl0ZXM7IGkgPCBsZW5ndGg7IGkgKz0gMykge1xuXHRcdFx0dGVtcCA9ICh1aW50OFtpXSA8PCAxNikgKyAodWludDhbaSArIDFdIDw8IDgpICsgKHVpbnQ4W2kgKyAyXSlcblx0XHRcdG91dHB1dCArPSB0cmlwbGV0VG9CYXNlNjQodGVtcClcblx0XHR9XG5cblx0XHQvLyBwYWQgdGhlIGVuZCB3aXRoIHplcm9zLCBidXQgbWFrZSBzdXJlIHRvIG5vdCBmb3JnZXQgdGhlIGV4dHJhIGJ5dGVzXG5cdFx0c3dpdGNoIChleHRyYUJ5dGVzKSB7XG5cdFx0XHRjYXNlIDE6XG5cdFx0XHRcdHRlbXAgPSB1aW50OFt1aW50OC5sZW5ndGggLSAxXVxuXHRcdFx0XHRvdXRwdXQgKz0gZW5jb2RlKHRlbXAgPj4gMilcblx0XHRcdFx0b3V0cHV0ICs9IGVuY29kZSgodGVtcCA8PCA0KSAmIDB4M0YpXG5cdFx0XHRcdG91dHB1dCArPSAnPT0nXG5cdFx0XHRcdGJyZWFrXG5cdFx0XHRjYXNlIDI6XG5cdFx0XHRcdHRlbXAgPSAodWludDhbdWludDgubGVuZ3RoIC0gMl0gPDwgOCkgKyAodWludDhbdWludDgubGVuZ3RoIC0gMV0pXG5cdFx0XHRcdG91dHB1dCArPSBlbmNvZGUodGVtcCA+PiAxMClcblx0XHRcdFx0b3V0cHV0ICs9IGVuY29kZSgodGVtcCA+PiA0KSAmIDB4M0YpXG5cdFx0XHRcdG91dHB1dCArPSBlbmNvZGUoKHRlbXAgPDwgMikgJiAweDNGKVxuXHRcdFx0XHRvdXRwdXQgKz0gJz0nXG5cdFx0XHRcdGJyZWFrXG5cdFx0fVxuXG5cdFx0cmV0dXJuIG91dHB1dFxuXHR9XG5cblx0ZXhwb3J0cy50b0J5dGVBcnJheSA9IGI2NFRvQnl0ZUFycmF5XG5cdGV4cG9ydHMuZnJvbUJ5dGVBcnJheSA9IHVpbnQ4VG9CYXNlNjRcbn0odHlwZW9mIGV4cG9ydHMgPT09ICd1bmRlZmluZWQnID8gKHRoaXMuYmFzZTY0anMgPSB7fSkgOiBleHBvcnRzKSlcbiIsImV4cG9ydHMucmVhZCA9IGZ1bmN0aW9uIChidWZmZXIsIG9mZnNldCwgaXNMRSwgbUxlbiwgbkJ5dGVzKSB7XG4gIHZhciBlLCBtXG4gIHZhciBlTGVuID0gbkJ5dGVzICogOCAtIG1MZW4gLSAxXG4gIHZhciBlTWF4ID0gKDEgPDwgZUxlbikgLSAxXG4gIHZhciBlQmlhcyA9IGVNYXggPj4gMVxuICB2YXIgbkJpdHMgPSAtN1xuICB2YXIgaSA9IGlzTEUgPyAobkJ5dGVzIC0gMSkgOiAwXG4gIHZhciBkID0gaXNMRSA/IC0xIDogMVxuICB2YXIgcyA9IGJ1ZmZlcltvZmZzZXQgKyBpXVxuXG4gIGkgKz0gZFxuXG4gIGUgPSBzICYgKCgxIDw8ICgtbkJpdHMpKSAtIDEpXG4gIHMgPj49ICgtbkJpdHMpXG4gIG5CaXRzICs9IGVMZW5cbiAgZm9yICg7IG5CaXRzID4gMDsgZSA9IGUgKiAyNTYgKyBidWZmZXJbb2Zmc2V0ICsgaV0sIGkgKz0gZCwgbkJpdHMgLT0gOCkge31cblxuICBtID0gZSAmICgoMSA8PCAoLW5CaXRzKSkgLSAxKVxuICBlID4+PSAoLW5CaXRzKVxuICBuQml0cyArPSBtTGVuXG4gIGZvciAoOyBuQml0cyA+IDA7IG0gPSBtICogMjU2ICsgYnVmZmVyW29mZnNldCArIGldLCBpICs9IGQsIG5CaXRzIC09IDgpIHt9XG5cbiAgaWYgKGUgPT09IDApIHtcbiAgICBlID0gMSAtIGVCaWFzXG4gIH0gZWxzZSBpZiAoZSA9PT0gZU1heCkge1xuICAgIHJldHVybiBtID8gTmFOIDogKChzID8gLTEgOiAxKSAqIEluZmluaXR5KVxuICB9IGVsc2Uge1xuICAgIG0gPSBtICsgTWF0aC5wb3coMiwgbUxlbilcbiAgICBlID0gZSAtIGVCaWFzXG4gIH1cbiAgcmV0dXJuIChzID8gLTEgOiAxKSAqIG0gKiBNYXRoLnBvdygyLCBlIC0gbUxlbilcbn1cblxuZXhwb3J0cy53cml0ZSA9IGZ1bmN0aW9uIChidWZmZXIsIHZhbHVlLCBvZmZzZXQsIGlzTEUsIG1MZW4sIG5CeXRlcykge1xuICB2YXIgZSwgbSwgY1xuICB2YXIgZUxlbiA9IG5CeXRlcyAqIDggLSBtTGVuIC0gMVxuICB2YXIgZU1heCA9ICgxIDw8IGVMZW4pIC0gMVxuICB2YXIgZUJpYXMgPSBlTWF4ID4+IDFcbiAgdmFyIHJ0ID0gKG1MZW4gPT09IDIzID8gTWF0aC5wb3coMiwgLTI0KSAtIE1hdGgucG93KDIsIC03NykgOiAwKVxuICB2YXIgaSA9IGlzTEUgPyAwIDogKG5CeXRlcyAtIDEpXG4gIHZhciBkID0gaXNMRSA/IDEgOiAtMVxuICB2YXIgcyA9IHZhbHVlIDwgMCB8fCAodmFsdWUgPT09IDAgJiYgMSAvIHZhbHVlIDwgMCkgPyAxIDogMFxuXG4gIHZhbHVlID0gTWF0aC5hYnModmFsdWUpXG5cbiAgaWYgKGlzTmFOKHZhbHVlKSB8fCB2YWx1ZSA9PT0gSW5maW5pdHkpIHtcbiAgICBtID0gaXNOYU4odmFsdWUpID8gMSA6IDBcbiAgICBlID0gZU1heFxuICB9IGVsc2Uge1xuICAgIGUgPSBNYXRoLmZsb29yKE1hdGgubG9nKHZhbHVlKSAvIE1hdGguTE4yKVxuICAgIGlmICh2YWx1ZSAqIChjID0gTWF0aC5wb3coMiwgLWUpKSA8IDEpIHtcbiAgICAgIGUtLVxuICAgICAgYyAqPSAyXG4gICAgfVxuICAgIGlmIChlICsgZUJpYXMgPj0gMSkge1xuICAgICAgdmFsdWUgKz0gcnQgLyBjXG4gICAgfSBlbHNlIHtcbiAgICAgIHZhbHVlICs9IHJ0ICogTWF0aC5wb3coMiwgMSAtIGVCaWFzKVxuICAgIH1cbiAgICBpZiAodmFsdWUgKiBjID49IDIpIHtcbiAgICAgIGUrK1xuICAgICAgYyAvPSAyXG4gICAgfVxuXG4gICAgaWYgKGUgKyBlQmlhcyA+PSBlTWF4KSB7XG4gICAgICBtID0gMFxuICAgICAgZSA9IGVNYXhcbiAgICB9IGVsc2UgaWYgKGUgKyBlQmlhcyA+PSAxKSB7XG4gICAgICBtID0gKHZhbHVlICogYyAtIDEpICogTWF0aC5wb3coMiwgbUxlbilcbiAgICAgIGUgPSBlICsgZUJpYXNcbiAgICB9IGVsc2Uge1xuICAgICAgbSA9IHZhbHVlICogTWF0aC5wb3coMiwgZUJpYXMgLSAxKSAqIE1hdGgucG93KDIsIG1MZW4pXG4gICAgICBlID0gMFxuICAgIH1cbiAgfVxuXG4gIGZvciAoOyBtTGVuID49IDg7IGJ1ZmZlcltvZmZzZXQgKyBpXSA9IG0gJiAweGZmLCBpICs9IGQsIG0gLz0gMjU2LCBtTGVuIC09IDgpIHt9XG5cbiAgZSA9IChlIDw8IG1MZW4pIHwgbVxuICBlTGVuICs9IG1MZW5cbiAgZm9yICg7IGVMZW4gPiAwOyBidWZmZXJbb2Zmc2V0ICsgaV0gPSBlICYgMHhmZiwgaSArPSBkLCBlIC89IDI1NiwgZUxlbiAtPSA4KSB7fVxuXG4gIGJ1ZmZlcltvZmZzZXQgKyBpIC0gZF0gfD0gcyAqIDEyOFxufVxuIiwiXG4vKipcbiAqIGlzQXJyYXlcbiAqL1xuXG52YXIgaXNBcnJheSA9IEFycmF5LmlzQXJyYXk7XG5cbi8qKlxuICogdG9TdHJpbmdcbiAqL1xuXG52YXIgc3RyID0gT2JqZWN0LnByb3RvdHlwZS50b1N0cmluZztcblxuLyoqXG4gKiBXaGV0aGVyIG9yIG5vdCB0aGUgZ2l2ZW4gYHZhbGBcbiAqIGlzIGFuIGFycmF5LlxuICpcbiAqIGV4YW1wbGU6XG4gKlxuICogICAgICAgIGlzQXJyYXkoW10pO1xuICogICAgICAgIC8vID4gdHJ1ZVxuICogICAgICAgIGlzQXJyYXkoYXJndW1lbnRzKTtcbiAqICAgICAgICAvLyA+IGZhbHNlXG4gKiAgICAgICAgaXNBcnJheSgnJyk7XG4gKiAgICAgICAgLy8gPiBmYWxzZVxuICpcbiAqIEBwYXJhbSB7bWl4ZWR9IHZhbFxuICogQHJldHVybiB7Ym9vbH1cbiAqL1xuXG5tb2R1bGUuZXhwb3J0cyA9IGlzQXJyYXkgfHwgZnVuY3Rpb24gKHZhbCkge1xuICByZXR1cm4gISEgdmFsICYmICdbb2JqZWN0IEFycmF5XScgPT0gc3RyLmNhbGwodmFsKTtcbn07XG4iLCIvKiBqc2hpbnQgbm9kZTogdHJ1ZSAqL1xuKGZ1bmN0aW9uICgpIHtcbiAgICBcInVzZSBzdHJpY3RcIjtcblxuICAgIGZ1bmN0aW9uIENvb2tpZUFjY2Vzc0luZm8oZG9tYWluLCBwYXRoLCBzZWN1cmUsIHNjcmlwdCkge1xuICAgICAgICBpZiAodGhpcyBpbnN0YW5jZW9mIENvb2tpZUFjY2Vzc0luZm8pIHtcbiAgICAgICAgICAgIHRoaXMuZG9tYWluID0gZG9tYWluIHx8IHVuZGVmaW5lZDtcbiAgICAgICAgICAgIHRoaXMucGF0aCA9IHBhdGggfHwgXCIvXCI7XG4gICAgICAgICAgICB0aGlzLnNlY3VyZSA9ICEhc2VjdXJlO1xuICAgICAgICAgICAgdGhpcy5zY3JpcHQgPSAhIXNjcmlwdDtcbiAgICAgICAgICAgIHJldHVybiB0aGlzO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBuZXcgQ29va2llQWNjZXNzSW5mbyhkb21haW4sIHBhdGgsIHNlY3VyZSwgc2NyaXB0KTtcbiAgICB9XG4gICAgZXhwb3J0cy5Db29raWVBY2Nlc3NJbmZvID0gQ29va2llQWNjZXNzSW5mbztcblxuICAgIGZ1bmN0aW9uIENvb2tpZShjb29raWVzdHIsIHJlcXVlc3RfZG9tYWluLCByZXF1ZXN0X3BhdGgpIHtcbiAgICAgICAgaWYgKGNvb2tpZXN0ciBpbnN0YW5jZW9mIENvb2tpZSkge1xuICAgICAgICAgICAgcmV0dXJuIGNvb2tpZXN0cjtcbiAgICAgICAgfVxuICAgICAgICBpZiAodGhpcyBpbnN0YW5jZW9mIENvb2tpZSkge1xuICAgICAgICAgICAgdGhpcy5uYW1lID0gbnVsbDtcbiAgICAgICAgICAgIHRoaXMudmFsdWUgPSBudWxsO1xuICAgICAgICAgICAgdGhpcy5leHBpcmF0aW9uX2RhdGUgPSBJbmZpbml0eTtcbiAgICAgICAgICAgIHRoaXMucGF0aCA9IFN0cmluZyhyZXF1ZXN0X3BhdGggfHwgXCIvXCIpO1xuICAgICAgICAgICAgdGhpcy5leHBsaWNpdF9wYXRoID0gZmFsc2U7XG4gICAgICAgICAgICB0aGlzLmRvbWFpbiA9IHJlcXVlc3RfZG9tYWluIHx8IG51bGw7XG4gICAgICAgICAgICB0aGlzLmV4cGxpY2l0X2RvbWFpbiA9IGZhbHNlO1xuICAgICAgICAgICAgdGhpcy5zZWN1cmUgPSBmYWxzZTsgLy9ob3cgdG8gZGVmaW5lIGRlZmF1bHQ/XG4gICAgICAgICAgICB0aGlzLm5vc2NyaXB0ID0gZmFsc2U7IC8vaHR0cG9ubHlcbiAgICAgICAgICAgIGlmIChjb29raWVzdHIpIHtcbiAgICAgICAgICAgICAgICB0aGlzLnBhcnNlKGNvb2tpZXN0ciwgcmVxdWVzdF9kb21haW4sIHJlcXVlc3RfcGF0aCk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICByZXR1cm4gdGhpcztcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gbmV3IENvb2tpZShjb29raWVzdHIsIHJlcXVlc3RfZG9tYWluLCByZXF1ZXN0X3BhdGgpO1xuICAgIH1cbiAgICBleHBvcnRzLkNvb2tpZSA9IENvb2tpZTtcblxuICAgIENvb2tpZS5wcm90b3R5cGUudG9TdHJpbmcgPSBmdW5jdGlvbiB0b1N0cmluZygpIHtcbiAgICAgICAgdmFyIHN0ciA9IFt0aGlzLm5hbWUgKyBcIj1cIiArIHRoaXMudmFsdWVdO1xuICAgICAgICBpZiAodGhpcy5leHBpcmF0aW9uX2RhdGUgIT09IEluZmluaXR5KSB7XG4gICAgICAgICAgICBzdHIucHVzaChcImV4cGlyZXM9XCIgKyAobmV3IERhdGUodGhpcy5leHBpcmF0aW9uX2RhdGUpKS50b0dNVFN0cmluZygpKTtcbiAgICAgICAgfVxuICAgICAgICBpZiAodGhpcy5kb21haW4pIHtcbiAgICAgICAgICAgIHN0ci5wdXNoKFwiZG9tYWluPVwiICsgdGhpcy5kb21haW4pO1xuICAgICAgICB9XG4gICAgICAgIGlmICh0aGlzLnBhdGgpIHtcbiAgICAgICAgICAgIHN0ci5wdXNoKFwicGF0aD1cIiArIHRoaXMucGF0aCk7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKHRoaXMuc2VjdXJlKSB7XG4gICAgICAgICAgICBzdHIucHVzaChcInNlY3VyZVwiKTtcbiAgICAgICAgfVxuICAgICAgICBpZiAodGhpcy5ub3NjcmlwdCkge1xuICAgICAgICAgICAgc3RyLnB1c2goXCJodHRwb25seVwiKTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gc3RyLmpvaW4oXCI7IFwiKTtcbiAgICB9O1xuXG4gICAgQ29va2llLnByb3RvdHlwZS50b1ZhbHVlU3RyaW5nID0gZnVuY3Rpb24gdG9WYWx1ZVN0cmluZygpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMubmFtZSArIFwiPVwiICsgdGhpcy52YWx1ZTtcbiAgICB9O1xuXG4gICAgdmFyIGNvb2tpZV9zdHJfc3BsaXR0ZXIgPSAvWzpdKD89XFxzKlthLXpBLVowLTlfXFwtXStcXHMqWz1dKS9nO1xuICAgIENvb2tpZS5wcm90b3R5cGUucGFyc2UgPSBmdW5jdGlvbiBwYXJzZShzdHIsIHJlcXVlc3RfZG9tYWluLCByZXF1ZXN0X3BhdGgpIHtcbiAgICAgICAgaWYgKHRoaXMgaW5zdGFuY2VvZiBDb29raWUpIHtcbiAgICAgICAgICAgIHZhciBwYXJ0cyA9IHN0ci5zcGxpdChcIjtcIikuZmlsdGVyKGZ1bmN0aW9uICh2YWx1ZSkge1xuICAgICAgICAgICAgICAgICAgICByZXR1cm4gISF2YWx1ZTtcbiAgICAgICAgICAgICAgICB9KSxcbiAgICAgICAgICAgICAgICBwYWlyID0gcGFydHNbMF0ubWF0Y2goLyhbXj1dKyk9KFtcXHNcXFNdKikvKSxcbiAgICAgICAgICAgICAgICBrZXkgPSBwYWlyWzFdLFxuICAgICAgICAgICAgICAgIHZhbHVlID0gcGFpclsyXSxcbiAgICAgICAgICAgICAgICBpO1xuICAgICAgICAgICAgdGhpcy5uYW1lID0ga2V5O1xuICAgICAgICAgICAgdGhpcy52YWx1ZSA9IHZhbHVlO1xuXG4gICAgICAgICAgICBmb3IgKGkgPSAxOyBpIDwgcGFydHMubGVuZ3RoOyBpICs9IDEpIHtcbiAgICAgICAgICAgICAgICBwYWlyID0gcGFydHNbaV0ubWF0Y2goLyhbXj1dKykoPzo9KFtcXHNcXFNdKikpPy8pO1xuICAgICAgICAgICAgICAgIGtleSA9IHBhaXJbMV0udHJpbSgpLnRvTG93ZXJDYXNlKCk7XG4gICAgICAgICAgICAgICAgdmFsdWUgPSBwYWlyWzJdO1xuICAgICAgICAgICAgICAgIHN3aXRjaCAoa2V5KSB7XG4gICAgICAgICAgICAgICAgY2FzZSBcImh0dHBvbmx5XCI6XG4gICAgICAgICAgICAgICAgICAgIHRoaXMubm9zY3JpcHQgPSB0cnVlO1xuICAgICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgICBjYXNlIFwiZXhwaXJlc1wiOlxuICAgICAgICAgICAgICAgICAgICB0aGlzLmV4cGlyYXRpb25fZGF0ZSA9IHZhbHVlID9cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBOdW1iZXIoRGF0ZS5wYXJzZSh2YWx1ZSkpIDpcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBJbmZpbml0eTtcbiAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgICAgY2FzZSBcInBhdGhcIjpcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5wYXRoID0gdmFsdWUgP1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhbHVlLnRyaW0oKSA6XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgXCJcIjtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5leHBsaWNpdF9wYXRoID0gdHJ1ZTtcbiAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgICAgY2FzZSBcImRvbWFpblwiOlxuICAgICAgICAgICAgICAgICAgICB0aGlzLmRvbWFpbiA9IHZhbHVlID9cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YWx1ZS50cmltKCkgOlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwiXCI7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMuZXhwbGljaXRfZG9tYWluID0gISF0aGlzLmRvbWFpbjtcbiAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgICAgY2FzZSBcInNlY3VyZVwiOlxuICAgICAgICAgICAgICAgICAgICB0aGlzLnNlY3VyZSA9IHRydWU7XG4gICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgaWYgKCF0aGlzLmV4cGxpY2l0X3BhdGgpIHtcbiAgICAgICAgICAgICAgIHRoaXMucGF0aCA9IHJlcXVlc3RfcGF0aCB8fCBcIi9cIjtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGlmICghdGhpcy5leHBsaWNpdF9kb21haW4pIHtcbiAgICAgICAgICAgICAgIHRoaXMuZG9tYWluID0gcmVxdWVzdF9kb21haW47XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIHJldHVybiB0aGlzO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBuZXcgQ29va2llKCkucGFyc2Uoc3RyLCByZXF1ZXN0X2RvbWFpbiwgcmVxdWVzdF9wYXRoKTtcbiAgICB9O1xuXG4gICAgQ29va2llLnByb3RvdHlwZS5tYXRjaGVzID0gZnVuY3Rpb24gbWF0Y2hlcyhhY2Nlc3NfaW5mbykge1xuICAgICAgICBpZiAodGhpcy5ub3NjcmlwdCAmJiBhY2Nlc3NfaW5mby5zY3JpcHQgfHxcbiAgICAgICAgICAgICAgICB0aGlzLnNlY3VyZSAmJiAhYWNjZXNzX2luZm8uc2VjdXJlIHx8XG4gICAgICAgICAgICAgICAgIXRoaXMuY29sbGlkZXNXaXRoKGFjY2Vzc19pbmZvKSkge1xuICAgICAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiB0cnVlO1xuICAgIH07XG5cbiAgICBDb29raWUucHJvdG90eXBlLmNvbGxpZGVzV2l0aCA9IGZ1bmN0aW9uIGNvbGxpZGVzV2l0aChhY2Nlc3NfaW5mbykge1xuICAgICAgICBpZiAoKHRoaXMucGF0aCAmJiAhYWNjZXNzX2luZm8ucGF0aCkgfHwgKHRoaXMuZG9tYWluICYmICFhY2Nlc3NfaW5mby5kb21haW4pKSB7XG4gICAgICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKHRoaXMucGF0aCAmJiBhY2Nlc3NfaW5mby5wYXRoLmluZGV4T2YodGhpcy5wYXRoKSAhPT0gMCkge1xuICAgICAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgICB9XG4gICAgICAgIGlmICh0aGlzLmV4cGxpY2l0X3BhdGggJiYgYWNjZXNzX2luZm8ucGF0aC5pbmRleE9mKCB0aGlzLnBhdGggKSAhPT0gMCkge1xuICAgICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICAgIH1cbiAgICAgICAgdmFyIGFjY2Vzc19kb21haW4gPSBhY2Nlc3NfaW5mby5kb21haW4gJiYgYWNjZXNzX2luZm8uZG9tYWluLnJlcGxhY2UoL15bXFwuXS8sJycpO1xuICAgICAgICB2YXIgY29va2llX2RvbWFpbiA9IHRoaXMuZG9tYWluICYmIHRoaXMuZG9tYWluLnJlcGxhY2UoL15bXFwuXS8sJycpO1xuICAgICAgICBpZiAoY29va2llX2RvbWFpbiA9PT0gYWNjZXNzX2RvbWFpbikge1xuICAgICAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKGNvb2tpZV9kb21haW4pIHtcbiAgICAgICAgICAgIGlmICghdGhpcy5leHBsaWNpdF9kb21haW4pIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7IC8vIHdlIGFscmVhZHkgY2hlY2tlZCBpZiB0aGUgZG9tYWlucyB3ZXJlIGV4YWN0bHkgdGhlIHNhbWVcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHZhciB3aWxkY2FyZCA9IGFjY2Vzc19kb21haW4uaW5kZXhPZihjb29raWVfZG9tYWluKTtcbiAgICAgICAgICAgIGlmICh3aWxkY2FyZCA9PT0gLTEgfHwgd2lsZGNhcmQgIT09IGFjY2Vzc19kb21haW4ubGVuZ3RoIC0gY29va2llX2RvbWFpbi5sZW5ndGgpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICB9O1xuXG4gICAgZnVuY3Rpb24gQ29va2llSmFyKCkge1xuICAgICAgICB2YXIgY29va2llcywgY29va2llc19saXN0LCBjb2xsaWRhYmxlX2Nvb2tpZTtcbiAgICAgICAgaWYgKHRoaXMgaW5zdGFuY2VvZiBDb29raWVKYXIpIHtcbiAgICAgICAgICAgIGNvb2tpZXMgPSBPYmplY3QuY3JlYXRlKG51bGwpOyAvL25hbWU6IFtDb29raWVdXG5cbiAgICAgICAgICAgIHRoaXMuc2V0Q29va2llID0gZnVuY3Rpb24gc2V0Q29va2llKGNvb2tpZSwgcmVxdWVzdF9kb21haW4sIHJlcXVlc3RfcGF0aCkge1xuICAgICAgICAgICAgICAgIHZhciByZW1vdmUsIGk7XG4gICAgICAgICAgICAgICAgY29va2llID0gbmV3IENvb2tpZShjb29raWUsIHJlcXVlc3RfZG9tYWluLCByZXF1ZXN0X3BhdGgpO1xuICAgICAgICAgICAgICAgIC8vRGVsZXRlIHRoZSBjb29raWUgaWYgdGhlIHNldCBpcyBwYXN0IHRoZSBjdXJyZW50IHRpbWVcbiAgICAgICAgICAgICAgICByZW1vdmUgPSBjb29raWUuZXhwaXJhdGlvbl9kYXRlIDw9IERhdGUubm93KCk7XG4gICAgICAgICAgICAgICAgaWYgKGNvb2tpZXNbY29va2llLm5hbWVdICE9PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICAgICAgICAgICAgY29va2llc19saXN0ID0gY29va2llc1tjb29raWUubmFtZV07XG4gICAgICAgICAgICAgICAgICAgIGZvciAoaSA9IDA7IGkgPCBjb29raWVzX2xpc3QubGVuZ3RoOyBpICs9IDEpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGNvbGxpZGFibGVfY29va2llID0gY29va2llc19saXN0W2ldO1xuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGNvbGxpZGFibGVfY29va2llLmNvbGxpZGVzV2l0aChjb29raWUpKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHJlbW92ZSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb29raWVzX2xpc3Quc3BsaWNlKGksIDEpO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoY29va2llc19saXN0Lmxlbmd0aCA9PT0gMCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGVsZXRlIGNvb2tpZXNbY29va2llLm5hbWVdO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgY29va2llc19saXN0W2ldID0gY29va2llO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBjb29raWU7XG4gICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgaWYgKHJlbW92ZSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIGNvb2tpZXNfbGlzdC5wdXNoKGNvb2tpZSk7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiBjb29raWU7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGlmIChyZW1vdmUpIHtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBjb29raWVzW2Nvb2tpZS5uYW1lXSA9IFtjb29raWVdO1xuICAgICAgICAgICAgICAgIHJldHVybiBjb29raWVzW2Nvb2tpZS5uYW1lXTtcbiAgICAgICAgICAgIH07XG4gICAgICAgICAgICAvL3JldHVybnMgYSBjb29raWVcbiAgICAgICAgICAgIHRoaXMuZ2V0Q29va2llID0gZnVuY3Rpb24gZ2V0Q29va2llKGNvb2tpZV9uYW1lLCBhY2Nlc3NfaW5mbykge1xuICAgICAgICAgICAgICAgIHZhciBjb29raWUsIGk7XG4gICAgICAgICAgICAgICAgY29va2llc19saXN0ID0gY29va2llc1tjb29raWVfbmFtZV07XG4gICAgICAgICAgICAgICAgaWYgKCFjb29raWVzX2xpc3QpIHtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBmb3IgKGkgPSAwOyBpIDwgY29va2llc19saXN0Lmxlbmd0aDsgaSArPSAxKSB7XG4gICAgICAgICAgICAgICAgICAgIGNvb2tpZSA9IGNvb2tpZXNfbGlzdFtpXTtcbiAgICAgICAgICAgICAgICAgICAgaWYgKGNvb2tpZS5leHBpcmF0aW9uX2RhdGUgPD0gRGF0ZS5ub3coKSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGNvb2tpZXNfbGlzdC5sZW5ndGggPT09IDApIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZWxldGUgY29va2llc1tjb29raWUubmFtZV07XG4gICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICBjb250aW51ZTtcbiAgICAgICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgICAgIGlmIChjb29raWUubWF0Y2hlcyhhY2Nlc3NfaW5mbykpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBjb29raWU7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9O1xuICAgICAgICAgICAgLy9yZXR1cm5zIGEgbGlzdCBvZiBjb29raWVzXG4gICAgICAgICAgICB0aGlzLmdldENvb2tpZXMgPSBmdW5jdGlvbiBnZXRDb29raWVzKGFjY2Vzc19pbmZvKSB7XG4gICAgICAgICAgICAgICAgdmFyIG1hdGNoZXMgPSBbXSwgY29va2llX25hbWUsIGNvb2tpZTtcbiAgICAgICAgICAgICAgICBmb3IgKGNvb2tpZV9uYW1lIGluIGNvb2tpZXMpIHtcbiAgICAgICAgICAgICAgICAgICAgY29va2llID0gdGhpcy5nZXRDb29raWUoY29va2llX25hbWUsIGFjY2Vzc19pbmZvKTtcbiAgICAgICAgICAgICAgICAgICAgaWYgKGNvb2tpZSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgbWF0Y2hlcy5wdXNoKGNvb2tpZSk7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgbWF0Y2hlcy50b1N0cmluZyA9IGZ1bmN0aW9uIHRvU3RyaW5nKCkge1xuICAgICAgICAgICAgICAgICAgICByZXR1cm4gbWF0Y2hlcy5qb2luKFwiOlwiKTtcbiAgICAgICAgICAgICAgICB9O1xuICAgICAgICAgICAgICAgIG1hdGNoZXMudG9WYWx1ZVN0cmluZyA9IGZ1bmN0aW9uIHRvVmFsdWVTdHJpbmcoKSB7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiBtYXRjaGVzLm1hcChmdW5jdGlvbiAoYykge1xuICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGMudG9WYWx1ZVN0cmluZygpO1xuICAgICAgICAgICAgICAgICAgICB9KS5qb2luKCc7Jyk7XG4gICAgICAgICAgICAgICAgfTtcbiAgICAgICAgICAgICAgICByZXR1cm4gbWF0Y2hlcztcbiAgICAgICAgICAgIH07XG5cbiAgICAgICAgICAgIHJldHVybiB0aGlzO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBuZXcgQ29va2llSmFyKCk7XG4gICAgfVxuICAgIGV4cG9ydHMuQ29va2llSmFyID0gQ29va2llSmFyO1xuXG4gICAgLy9yZXR1cm5zIGxpc3Qgb2YgY29va2llcyB0aGF0IHdlcmUgc2V0IGNvcnJlY3RseS4gQ29va2llcyB0aGF0IGFyZSBleHBpcmVkIGFuZCByZW1vdmVkIGFyZSBub3QgcmV0dXJuZWQuXG4gICAgQ29va2llSmFyLnByb3RvdHlwZS5zZXRDb29raWVzID0gZnVuY3Rpb24gc2V0Q29va2llcyhjb29raWVzLCByZXF1ZXN0X2RvbWFpbiwgcmVxdWVzdF9wYXRoKSB7XG4gICAgICAgIGNvb2tpZXMgPSBBcnJheS5pc0FycmF5KGNvb2tpZXMpID9cbiAgICAgICAgICAgICAgICBjb29raWVzIDpcbiAgICAgICAgICAgICAgICBjb29raWVzLnNwbGl0KGNvb2tpZV9zdHJfc3BsaXR0ZXIpO1xuICAgICAgICB2YXIgc3VjY2Vzc2Z1bCA9IFtdLFxuICAgICAgICAgICAgaSxcbiAgICAgICAgICAgIGNvb2tpZTtcbiAgICAgICAgY29va2llcyA9IGNvb2tpZXMubWFwKGZ1bmN0aW9uKGl0ZW0pe1xuICAgICAgICAgICAgcmV0dXJuIG5ldyBDb29raWUoaXRlbSwgcmVxdWVzdF9kb21haW4sIHJlcXVlc3RfcGF0aCk7XG4gICAgICAgIH0pO1xuICAgICAgICBmb3IgKGkgPSAwOyBpIDwgY29va2llcy5sZW5ndGg7IGkgKz0gMSkge1xuICAgICAgICAgICAgY29va2llID0gY29va2llc1tpXTtcbiAgICAgICAgICAgIGlmICh0aGlzLnNldENvb2tpZShjb29raWUsIHJlcXVlc3RfZG9tYWluLCByZXF1ZXN0X3BhdGgpKSB7XG4gICAgICAgICAgICAgICAgc3VjY2Vzc2Z1bC5wdXNoKGNvb2tpZSk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHN1Y2Nlc3NmdWw7XG4gICAgfTtcbn0oKSk7XG4iLCIndXNlIHN0cmljdCc7XG5cblxudmFyIHlhbWwgPSByZXF1aXJlKCcuL2xpYi9qcy15YW1sLmpzJyk7XG5cblxubW9kdWxlLmV4cG9ydHMgPSB5YW1sO1xuIiwiJ3VzZSBzdHJpY3QnO1xuXG5cbnZhciBsb2FkZXIgPSByZXF1aXJlKCcuL2pzLXlhbWwvbG9hZGVyJyk7XG52YXIgZHVtcGVyID0gcmVxdWlyZSgnLi9qcy15YW1sL2R1bXBlcicpO1xuXG5cbmZ1bmN0aW9uIGRlcHJlY2F0ZWQobmFtZSkge1xuICByZXR1cm4gZnVuY3Rpb24gKCkge1xuICAgIHRocm93IG5ldyBFcnJvcignRnVuY3Rpb24gJyArIG5hbWUgKyAnIGlzIGRlcHJlY2F0ZWQgYW5kIGNhbm5vdCBiZSB1c2VkLicpO1xuICB9O1xufVxuXG5cbm1vZHVsZS5leHBvcnRzLlR5cGUgICAgICAgICAgICAgICAgPSByZXF1aXJlKCcuL2pzLXlhbWwvdHlwZScpO1xubW9kdWxlLmV4cG9ydHMuU2NoZW1hICAgICAgICAgICAgICA9IHJlcXVpcmUoJy4vanMteWFtbC9zY2hlbWEnKTtcbm1vZHVsZS5leHBvcnRzLkZBSUxTQUZFX1NDSEVNQSAgICAgPSByZXF1aXJlKCcuL2pzLXlhbWwvc2NoZW1hL2ZhaWxzYWZlJyk7XG5tb2R1bGUuZXhwb3J0cy5KU09OX1NDSEVNQSAgICAgICAgID0gcmVxdWlyZSgnLi9qcy15YW1sL3NjaGVtYS9qc29uJyk7XG5tb2R1bGUuZXhwb3J0cy5DT1JFX1NDSEVNQSAgICAgICAgID0gcmVxdWlyZSgnLi9qcy15YW1sL3NjaGVtYS9jb3JlJyk7XG5tb2R1bGUuZXhwb3J0cy5ERUZBVUxUX1NBRkVfU0NIRU1BID0gcmVxdWlyZSgnLi9qcy15YW1sL3NjaGVtYS9kZWZhdWx0X3NhZmUnKTtcbm1vZHVsZS5leHBvcnRzLkRFRkFVTFRfRlVMTF9TQ0hFTUEgPSByZXF1aXJlKCcuL2pzLXlhbWwvc2NoZW1hL2RlZmF1bHRfZnVsbCcpO1xubW9kdWxlLmV4cG9ydHMubG9hZCAgICAgICAgICAgICAgICA9IGxvYWRlci5sb2FkO1xubW9kdWxlLmV4cG9ydHMubG9hZEFsbCAgICAgICAgICAgICA9IGxvYWRlci5sb2FkQWxsO1xubW9kdWxlLmV4cG9ydHMuc2FmZUxvYWQgICAgICAgICAgICA9IGxvYWRlci5zYWZlTG9hZDtcbm1vZHVsZS5leHBvcnRzLnNhZmVMb2FkQWxsICAgICAgICAgPSBsb2FkZXIuc2FmZUxvYWRBbGw7XG5tb2R1bGUuZXhwb3J0cy5kdW1wICAgICAgICAgICAgICAgID0gZHVtcGVyLmR1bXA7XG5tb2R1bGUuZXhwb3J0cy5zYWZlRHVtcCAgICAgICAgICAgID0gZHVtcGVyLnNhZmVEdW1wO1xubW9kdWxlLmV4cG9ydHMuWUFNTEV4Y2VwdGlvbiAgICAgICA9IHJlcXVpcmUoJy4vanMteWFtbC9leGNlcHRpb24nKTtcblxuLy8gRGVwcmVjYXRlZCBzY2hlbWEgbmFtZXMgZnJvbSBKUy1ZQU1MIDIuMC54XG5tb2R1bGUuZXhwb3J0cy5NSU5JTUFMX1NDSEVNQSA9IHJlcXVpcmUoJy4vanMteWFtbC9zY2hlbWEvZmFpbHNhZmUnKTtcbm1vZHVsZS5leHBvcnRzLlNBRkVfU0NIRU1BICAgID0gcmVxdWlyZSgnLi9qcy15YW1sL3NjaGVtYS9kZWZhdWx0X3NhZmUnKTtcbm1vZHVsZS5leHBvcnRzLkRFRkFVTFRfU0NIRU1BID0gcmVxdWlyZSgnLi9qcy15YW1sL3NjaGVtYS9kZWZhdWx0X2Z1bGwnKTtcblxuLy8gRGVwcmVjYXRlZCBmdW5jdGlvbnMgZnJvbSBKUy1ZQU1MIDEueC54XG5tb2R1bGUuZXhwb3J0cy5zY2FuICAgICAgICAgICA9IGRlcHJlY2F0ZWQoJ3NjYW4nKTtcbm1vZHVsZS5leHBvcnRzLnBhcnNlICAgICAgICAgID0gZGVwcmVjYXRlZCgncGFyc2UnKTtcbm1vZHVsZS5leHBvcnRzLmNvbXBvc2UgICAgICAgID0gZGVwcmVjYXRlZCgnY29tcG9zZScpO1xubW9kdWxlLmV4cG9ydHMuYWRkQ29uc3RydWN0b3IgPSBkZXByZWNhdGVkKCdhZGRDb25zdHJ1Y3RvcicpO1xuIiwiJ3VzZSBzdHJpY3QnO1xuXG5cbmZ1bmN0aW9uIGlzTm90aGluZyhzdWJqZWN0KSB7XG4gIHJldHVybiAodHlwZW9mIHN1YmplY3QgPT09ICd1bmRlZmluZWQnKSB8fCAoc3ViamVjdCA9PT0gbnVsbCk7XG59XG5cblxuZnVuY3Rpb24gaXNPYmplY3Qoc3ViamVjdCkge1xuICByZXR1cm4gKHR5cGVvZiBzdWJqZWN0ID09PSAnb2JqZWN0JykgJiYgKHN1YmplY3QgIT09IG51bGwpO1xufVxuXG5cbmZ1bmN0aW9uIHRvQXJyYXkoc2VxdWVuY2UpIHtcbiAgaWYgKEFycmF5LmlzQXJyYXkoc2VxdWVuY2UpKSByZXR1cm4gc2VxdWVuY2U7XG4gIGVsc2UgaWYgKGlzTm90aGluZyhzZXF1ZW5jZSkpIHJldHVybiBbXTtcblxuICByZXR1cm4gWyBzZXF1ZW5jZSBdO1xufVxuXG5cbmZ1bmN0aW9uIGV4dGVuZCh0YXJnZXQsIHNvdXJjZSkge1xuICB2YXIgaW5kZXgsIGxlbmd0aCwga2V5LCBzb3VyY2VLZXlzO1xuXG4gIGlmIChzb3VyY2UpIHtcbiAgICBzb3VyY2VLZXlzID0gT2JqZWN0LmtleXMoc291cmNlKTtcblxuICAgIGZvciAoaW5kZXggPSAwLCBsZW5ndGggPSBzb3VyY2VLZXlzLmxlbmd0aDsgaW5kZXggPCBsZW5ndGg7IGluZGV4ICs9IDEpIHtcbiAgICAgIGtleSA9IHNvdXJjZUtleXNbaW5kZXhdO1xuICAgICAgdGFyZ2V0W2tleV0gPSBzb3VyY2Vba2V5XTtcbiAgICB9XG4gIH1cblxuICByZXR1cm4gdGFyZ2V0O1xufVxuXG5cbmZ1bmN0aW9uIHJlcGVhdChzdHJpbmcsIGNvdW50KSB7XG4gIHZhciByZXN1bHQgPSAnJywgY3ljbGU7XG5cbiAgZm9yIChjeWNsZSA9IDA7IGN5Y2xlIDwgY291bnQ7IGN5Y2xlICs9IDEpIHtcbiAgICByZXN1bHQgKz0gc3RyaW5nO1xuICB9XG5cbiAgcmV0dXJuIHJlc3VsdDtcbn1cblxuXG5mdW5jdGlvbiBpc05lZ2F0aXZlWmVybyhudW1iZXIpIHtcbiAgcmV0dXJuIChudW1iZXIgPT09IDApICYmIChOdW1iZXIuTkVHQVRJVkVfSU5GSU5JVFkgPT09IDEgLyBudW1iZXIpO1xufVxuXG5cbm1vZHVsZS5leHBvcnRzLmlzTm90aGluZyAgICAgID0gaXNOb3RoaW5nO1xubW9kdWxlLmV4cG9ydHMuaXNPYmplY3QgICAgICAgPSBpc09iamVjdDtcbm1vZHVsZS5leHBvcnRzLnRvQXJyYXkgICAgICAgID0gdG9BcnJheTtcbm1vZHVsZS5leHBvcnRzLnJlcGVhdCAgICAgICAgID0gcmVwZWF0O1xubW9kdWxlLmV4cG9ydHMuaXNOZWdhdGl2ZVplcm8gPSBpc05lZ2F0aXZlWmVybztcbm1vZHVsZS5leHBvcnRzLmV4dGVuZCAgICAgICAgID0gZXh0ZW5kO1xuIiwiJ3VzZSBzdHJpY3QnO1xuXG4vKmVzbGludC1kaXNhYmxlIG5vLXVzZS1iZWZvcmUtZGVmaW5lKi9cblxudmFyIGNvbW1vbiAgICAgICAgICAgICAgPSByZXF1aXJlKCcuL2NvbW1vbicpO1xudmFyIFlBTUxFeGNlcHRpb24gICAgICAgPSByZXF1aXJlKCcuL2V4Y2VwdGlvbicpO1xudmFyIERFRkFVTFRfRlVMTF9TQ0hFTUEgPSByZXF1aXJlKCcuL3NjaGVtYS9kZWZhdWx0X2Z1bGwnKTtcbnZhciBERUZBVUxUX1NBRkVfU0NIRU1BID0gcmVxdWlyZSgnLi9zY2hlbWEvZGVmYXVsdF9zYWZlJyk7XG5cbnZhciBfdG9TdHJpbmcgICAgICAgPSBPYmplY3QucHJvdG90eXBlLnRvU3RyaW5nO1xudmFyIF9oYXNPd25Qcm9wZXJ0eSA9IE9iamVjdC5wcm90b3R5cGUuaGFzT3duUHJvcGVydHk7XG5cbnZhciBDSEFSX1RBQiAgICAgICAgICAgICAgICAgID0gMHgwOTsgLyogVGFiICovXG52YXIgQ0hBUl9MSU5FX0ZFRUQgICAgICAgICAgICA9IDB4MEE7IC8qIExGICovXG52YXIgQ0hBUl9TUEFDRSAgICAgICAgICAgICAgICA9IDB4MjA7IC8qIFNwYWNlICovXG52YXIgQ0hBUl9FWENMQU1BVElPTiAgICAgICAgICA9IDB4MjE7IC8qICEgKi9cbnZhciBDSEFSX0RPVUJMRV9RVU9URSAgICAgICAgID0gMHgyMjsgLyogXCIgKi9cbnZhciBDSEFSX1NIQVJQICAgICAgICAgICAgICAgID0gMHgyMzsgLyogIyAqL1xudmFyIENIQVJfUEVSQ0VOVCAgICAgICAgICAgICAgPSAweDI1OyAvKiAlICovXG52YXIgQ0hBUl9BTVBFUlNBTkQgICAgICAgICAgICA9IDB4MjY7IC8qICYgKi9cbnZhciBDSEFSX1NJTkdMRV9RVU9URSAgICAgICAgID0gMHgyNzsgLyogJyAqL1xudmFyIENIQVJfQVNURVJJU0sgICAgICAgICAgICAgPSAweDJBOyAvKiAqICovXG52YXIgQ0hBUl9DT01NQSAgICAgICAgICAgICAgICA9IDB4MkM7IC8qICwgKi9cbnZhciBDSEFSX01JTlVTICAgICAgICAgICAgICAgID0gMHgyRDsgLyogLSAqL1xudmFyIENIQVJfQ09MT04gICAgICAgICAgICAgICAgPSAweDNBOyAvKiA6ICovXG52YXIgQ0hBUl9HUkVBVEVSX1RIQU4gICAgICAgICA9IDB4M0U7IC8qID4gKi9cbnZhciBDSEFSX1FVRVNUSU9OICAgICAgICAgICAgID0gMHgzRjsgLyogPyAqL1xudmFyIENIQVJfQ09NTUVSQ0lBTF9BVCAgICAgICAgPSAweDQwOyAvKiBAICovXG52YXIgQ0hBUl9MRUZUX1NRVUFSRV9CUkFDS0VUICA9IDB4NUI7IC8qIFsgKi9cbnZhciBDSEFSX1JJR0hUX1NRVUFSRV9CUkFDS0VUID0gMHg1RDsgLyogXSAqL1xudmFyIENIQVJfR1JBVkVfQUNDRU5UICAgICAgICAgPSAweDYwOyAvKiBgICovXG52YXIgQ0hBUl9MRUZUX0NVUkxZX0JSQUNLRVQgICA9IDB4N0I7IC8qIHsgKi9cbnZhciBDSEFSX1ZFUlRJQ0FMX0xJTkUgICAgICAgID0gMHg3QzsgLyogfCAqL1xudmFyIENIQVJfUklHSFRfQ1VSTFlfQlJBQ0tFVCAgPSAweDdEOyAvKiB9ICovXG5cbnZhciBFU0NBUEVfU0VRVUVOQ0VTID0ge307XG5cbkVTQ0FQRV9TRVFVRU5DRVNbMHgwMF0gICA9ICdcXFxcMCc7XG5FU0NBUEVfU0VRVUVOQ0VTWzB4MDddICAgPSAnXFxcXGEnO1xuRVNDQVBFX1NFUVVFTkNFU1sweDA4XSAgID0gJ1xcXFxiJztcbkVTQ0FQRV9TRVFVRU5DRVNbMHgwOV0gICA9ICdcXFxcdCc7XG5FU0NBUEVfU0VRVUVOQ0VTWzB4MEFdICAgPSAnXFxcXG4nO1xuRVNDQVBFX1NFUVVFTkNFU1sweDBCXSAgID0gJ1xcXFx2JztcbkVTQ0FQRV9TRVFVRU5DRVNbMHgwQ10gICA9ICdcXFxcZic7XG5FU0NBUEVfU0VRVUVOQ0VTWzB4MERdICAgPSAnXFxcXHInO1xuRVNDQVBFX1NFUVVFTkNFU1sweDFCXSAgID0gJ1xcXFxlJztcbkVTQ0FQRV9TRVFVRU5DRVNbMHgyMl0gICA9ICdcXFxcXCInO1xuRVNDQVBFX1NFUVVFTkNFU1sweDVDXSAgID0gJ1xcXFxcXFxcJztcbkVTQ0FQRV9TRVFVRU5DRVNbMHg4NV0gICA9ICdcXFxcTic7XG5FU0NBUEVfU0VRVUVOQ0VTWzB4QTBdICAgPSAnXFxcXF8nO1xuRVNDQVBFX1NFUVVFTkNFU1sweDIwMjhdID0gJ1xcXFxMJztcbkVTQ0FQRV9TRVFVRU5DRVNbMHgyMDI5XSA9ICdcXFxcUCc7XG5cbnZhciBERVBSRUNBVEVEX0JPT0xFQU5TX1NZTlRBWCA9IFtcbiAgJ3knLCAnWScsICd5ZXMnLCAnWWVzJywgJ1lFUycsICdvbicsICdPbicsICdPTicsXG4gICduJywgJ04nLCAnbm8nLCAnTm8nLCAnTk8nLCAnb2ZmJywgJ09mZicsICdPRkYnXG5dO1xuXG5mdW5jdGlvbiBjb21waWxlU3R5bGVNYXAoc2NoZW1hLCBtYXApIHtcbiAgdmFyIHJlc3VsdCwga2V5cywgaW5kZXgsIGxlbmd0aCwgdGFnLCBzdHlsZSwgdHlwZTtcblxuICBpZiAobWFwID09PSBudWxsKSByZXR1cm4ge307XG5cbiAgcmVzdWx0ID0ge307XG4gIGtleXMgPSBPYmplY3Qua2V5cyhtYXApO1xuXG4gIGZvciAoaW5kZXggPSAwLCBsZW5ndGggPSBrZXlzLmxlbmd0aDsgaW5kZXggPCBsZW5ndGg7IGluZGV4ICs9IDEpIHtcbiAgICB0YWcgPSBrZXlzW2luZGV4XTtcbiAgICBzdHlsZSA9IFN0cmluZyhtYXBbdGFnXSk7XG5cbiAgICBpZiAodGFnLnNsaWNlKDAsIDIpID09PSAnISEnKSB7XG4gICAgICB0YWcgPSAndGFnOnlhbWwub3JnLDIwMDI6JyArIHRhZy5zbGljZSgyKTtcbiAgICB9XG5cbiAgICB0eXBlID0gc2NoZW1hLmNvbXBpbGVkVHlwZU1hcFt0YWddO1xuXG4gICAgaWYgKHR5cGUgJiYgX2hhc093blByb3BlcnR5LmNhbGwodHlwZS5zdHlsZUFsaWFzZXMsIHN0eWxlKSkge1xuICAgICAgc3R5bGUgPSB0eXBlLnN0eWxlQWxpYXNlc1tzdHlsZV07XG4gICAgfVxuXG4gICAgcmVzdWx0W3RhZ10gPSBzdHlsZTtcbiAgfVxuXG4gIHJldHVybiByZXN1bHQ7XG59XG5cbmZ1bmN0aW9uIGVuY29kZUhleChjaGFyYWN0ZXIpIHtcbiAgdmFyIHN0cmluZywgaGFuZGxlLCBsZW5ndGg7XG5cbiAgc3RyaW5nID0gY2hhcmFjdGVyLnRvU3RyaW5nKDE2KS50b1VwcGVyQ2FzZSgpO1xuXG4gIGlmIChjaGFyYWN0ZXIgPD0gMHhGRikge1xuICAgIGhhbmRsZSA9ICd4JztcbiAgICBsZW5ndGggPSAyO1xuICB9IGVsc2UgaWYgKGNoYXJhY3RlciA8PSAweEZGRkYpIHtcbiAgICBoYW5kbGUgPSAndSc7XG4gICAgbGVuZ3RoID0gNDtcbiAgfSBlbHNlIGlmIChjaGFyYWN0ZXIgPD0gMHhGRkZGRkZGRikge1xuICAgIGhhbmRsZSA9ICdVJztcbiAgICBsZW5ndGggPSA4O1xuICB9IGVsc2Uge1xuICAgIHRocm93IG5ldyBZQU1MRXhjZXB0aW9uKCdjb2RlIHBvaW50IHdpdGhpbiBhIHN0cmluZyBtYXkgbm90IGJlIGdyZWF0ZXIgdGhhbiAweEZGRkZGRkZGJyk7XG4gIH1cblxuICByZXR1cm4gJ1xcXFwnICsgaGFuZGxlICsgY29tbW9uLnJlcGVhdCgnMCcsIGxlbmd0aCAtIHN0cmluZy5sZW5ndGgpICsgc3RyaW5nO1xufVxuXG5mdW5jdGlvbiBTdGF0ZShvcHRpb25zKSB7XG4gIHRoaXMuc2NoZW1hICAgICAgID0gb3B0aW9uc1snc2NoZW1hJ10gfHwgREVGQVVMVF9GVUxMX1NDSEVNQTtcbiAgdGhpcy5pbmRlbnQgICAgICAgPSBNYXRoLm1heCgxLCAob3B0aW9uc1snaW5kZW50J10gfHwgMikpO1xuICB0aGlzLnNraXBJbnZhbGlkICA9IG9wdGlvbnNbJ3NraXBJbnZhbGlkJ10gfHwgZmFsc2U7XG4gIHRoaXMuZmxvd0xldmVsICAgID0gKGNvbW1vbi5pc05vdGhpbmcob3B0aW9uc1snZmxvd0xldmVsJ10pID8gLTEgOiBvcHRpb25zWydmbG93TGV2ZWwnXSk7XG4gIHRoaXMuc3R5bGVNYXAgICAgID0gY29tcGlsZVN0eWxlTWFwKHRoaXMuc2NoZW1hLCBvcHRpb25zWydzdHlsZXMnXSB8fCBudWxsKTtcbiAgdGhpcy5zb3J0S2V5cyAgICAgPSBvcHRpb25zWydzb3J0S2V5cyddIHx8IGZhbHNlO1xuICB0aGlzLmxpbmVXaWR0aCAgICA9IG9wdGlvbnNbJ2xpbmVXaWR0aCddIHx8IDgwO1xuICB0aGlzLm5vUmVmcyAgICAgICA9IG9wdGlvbnNbJ25vUmVmcyddIHx8IGZhbHNlO1xuICB0aGlzLm5vQ29tcGF0TW9kZSA9IG9wdGlvbnNbJ25vQ29tcGF0TW9kZSddIHx8IGZhbHNlO1xuXG4gIHRoaXMuaW1wbGljaXRUeXBlcyA9IHRoaXMuc2NoZW1hLmNvbXBpbGVkSW1wbGljaXQ7XG4gIHRoaXMuZXhwbGljaXRUeXBlcyA9IHRoaXMuc2NoZW1hLmNvbXBpbGVkRXhwbGljaXQ7XG5cbiAgdGhpcy50YWcgPSBudWxsO1xuICB0aGlzLnJlc3VsdCA9ICcnO1xuXG4gIHRoaXMuZHVwbGljYXRlcyA9IFtdO1xuICB0aGlzLnVzZWREdXBsaWNhdGVzID0gbnVsbDtcbn1cblxuLy8gSW5kZW50cyBldmVyeSBsaW5lIGluIGEgc3RyaW5nLiBFbXB0eSBsaW5lcyAoXFxuIG9ubHkpIGFyZSBub3QgaW5kZW50ZWQuXG5mdW5jdGlvbiBpbmRlbnRTdHJpbmcoc3RyaW5nLCBzcGFjZXMpIHtcbiAgdmFyIGluZCA9IGNvbW1vbi5yZXBlYXQoJyAnLCBzcGFjZXMpLFxuICAgICAgcG9zaXRpb24gPSAwLFxuICAgICAgbmV4dCA9IC0xLFxuICAgICAgcmVzdWx0ID0gJycsXG4gICAgICBsaW5lLFxuICAgICAgbGVuZ3RoID0gc3RyaW5nLmxlbmd0aDtcblxuICB3aGlsZSAocG9zaXRpb24gPCBsZW5ndGgpIHtcbiAgICBuZXh0ID0gc3RyaW5nLmluZGV4T2YoJ1xcbicsIHBvc2l0aW9uKTtcbiAgICBpZiAobmV4dCA9PT0gLTEpIHtcbiAgICAgIGxpbmUgPSBzdHJpbmcuc2xpY2UocG9zaXRpb24pO1xuICAgICAgcG9zaXRpb24gPSBsZW5ndGg7XG4gICAgfSBlbHNlIHtcbiAgICAgIGxpbmUgPSBzdHJpbmcuc2xpY2UocG9zaXRpb24sIG5leHQgKyAxKTtcbiAgICAgIHBvc2l0aW9uID0gbmV4dCArIDE7XG4gICAgfVxuXG4gICAgaWYgKGxpbmUubGVuZ3RoICYmIGxpbmUgIT09ICdcXG4nKSByZXN1bHQgKz0gaW5kO1xuXG4gICAgcmVzdWx0ICs9IGxpbmU7XG4gIH1cblxuICByZXR1cm4gcmVzdWx0O1xufVxuXG5mdW5jdGlvbiBnZW5lcmF0ZU5leHRMaW5lKHN0YXRlLCBsZXZlbCkge1xuICByZXR1cm4gJ1xcbicgKyBjb21tb24ucmVwZWF0KCcgJywgc3RhdGUuaW5kZW50ICogbGV2ZWwpO1xufVxuXG5mdW5jdGlvbiB0ZXN0SW1wbGljaXRSZXNvbHZpbmcoc3RhdGUsIHN0cikge1xuICB2YXIgaW5kZXgsIGxlbmd0aCwgdHlwZTtcblxuICBmb3IgKGluZGV4ID0gMCwgbGVuZ3RoID0gc3RhdGUuaW1wbGljaXRUeXBlcy5sZW5ndGg7IGluZGV4IDwgbGVuZ3RoOyBpbmRleCArPSAxKSB7XG4gICAgdHlwZSA9IHN0YXRlLmltcGxpY2l0VHlwZXNbaW5kZXhdO1xuXG4gICAgaWYgKHR5cGUucmVzb2x2ZShzdHIpKSB7XG4gICAgICByZXR1cm4gdHJ1ZTtcbiAgICB9XG4gIH1cblxuICByZXR1cm4gZmFsc2U7XG59XG5cbi8vIFszM10gcy13aGl0ZSA6Oj0gcy1zcGFjZSB8IHMtdGFiXG5mdW5jdGlvbiBpc1doaXRlc3BhY2UoYykge1xuICByZXR1cm4gYyA9PT0gQ0hBUl9TUEFDRSB8fCBjID09PSBDSEFSX1RBQjtcbn1cblxuLy8gUmV0dXJucyB0cnVlIGlmIHRoZSBjaGFyYWN0ZXIgY2FuIGJlIHByaW50ZWQgd2l0aG91dCBlc2NhcGluZy5cbi8vIEZyb20gWUFNTCAxLjI6IFwiYW55IGFsbG93ZWQgY2hhcmFjdGVycyBrbm93biB0byBiZSBub24tcHJpbnRhYmxlXG4vLyBzaG91bGQgYWxzbyBiZSBlc2NhcGVkLiBbSG93ZXZlcixdIFRoaXMgaXNu4oCZdCBtYW5kYXRvcnlcIlxuLy8gRGVyaXZlZCBmcm9tIG5iLWNoYXIgLSBcXHQgLSAjeDg1IC0gI3hBMCAtICN4MjAyOCAtICN4MjAyOS5cbmZ1bmN0aW9uIGlzUHJpbnRhYmxlKGMpIHtcbiAgcmV0dXJuICAoMHgwMDAyMCA8PSBjICYmIGMgPD0gMHgwMDAwN0UpXG4gICAgICB8fCAoKDB4MDAwQTEgPD0gYyAmJiBjIDw9IDB4MDBEN0ZGKSAmJiBjICE9PSAweDIwMjggJiYgYyAhPT0gMHgyMDI5KVxuICAgICAgfHwgKCgweDBFMDAwIDw9IGMgJiYgYyA8PSAweDAwRkZGRCkgJiYgYyAhPT0gMHhGRUZGIC8qIEJPTSAqLylcbiAgICAgIHx8ICAoMHgxMDAwMCA8PSBjICYmIGMgPD0gMHgxMEZGRkYpO1xufVxuXG4vLyBTaW1wbGlmaWVkIHRlc3QgZm9yIHZhbHVlcyBhbGxvd2VkIGFmdGVyIHRoZSBmaXJzdCBjaGFyYWN0ZXIgaW4gcGxhaW4gc3R5bGUuXG5mdW5jdGlvbiBpc1BsYWluU2FmZShjKSB7XG4gIC8vIFVzZXMgYSBzdWJzZXQgb2YgbmItY2hhciAtIGMtZmxvdy1pbmRpY2F0b3IgLSBcIjpcIiAtIFwiI1wiXG4gIC8vIHdoZXJlIG5iLWNoYXIgOjo9IGMtcHJpbnRhYmxlIC0gYi1jaGFyIC0gYy1ieXRlLW9yZGVyLW1hcmsuXG4gIHJldHVybiBpc1ByaW50YWJsZShjKSAmJiBjICE9PSAweEZFRkZcbiAgICAvLyAtIGMtZmxvdy1pbmRpY2F0b3JcbiAgICAmJiBjICE9PSBDSEFSX0NPTU1BXG4gICAgJiYgYyAhPT0gQ0hBUl9MRUZUX1NRVUFSRV9CUkFDS0VUXG4gICAgJiYgYyAhPT0gQ0hBUl9SSUdIVF9TUVVBUkVfQlJBQ0tFVFxuICAgICYmIGMgIT09IENIQVJfTEVGVF9DVVJMWV9CUkFDS0VUXG4gICAgJiYgYyAhPT0gQ0hBUl9SSUdIVF9DVVJMWV9CUkFDS0VUXG4gICAgLy8gLSBcIjpcIiAtIFwiI1wiXG4gICAgJiYgYyAhPT0gQ0hBUl9DT0xPTlxuICAgICYmIGMgIT09IENIQVJfU0hBUlA7XG59XG5cbi8vIFNpbXBsaWZpZWQgdGVzdCBmb3IgdmFsdWVzIGFsbG93ZWQgYXMgdGhlIGZpcnN0IGNoYXJhY3RlciBpbiBwbGFpbiBzdHlsZS5cbmZ1bmN0aW9uIGlzUGxhaW5TYWZlRmlyc3QoYykge1xuICAvLyBVc2VzIGEgc3Vic2V0IG9mIG5zLWNoYXIgLSBjLWluZGljYXRvclxuICAvLyB3aGVyZSBucy1jaGFyID0gbmItY2hhciAtIHMtd2hpdGUuXG4gIHJldHVybiBpc1ByaW50YWJsZShjKSAmJiBjICE9PSAweEZFRkZcbiAgICAmJiAhaXNXaGl0ZXNwYWNlKGMpIC8vIC0gcy13aGl0ZVxuICAgIC8vIC0gKGMtaW5kaWNhdG9yIDo6PVxuICAgIC8vIOKAnC3igJ0gfCDigJw/4oCdIHwg4oCcOuKAnSB8IOKAnCzigJ0gfCDigJxb4oCdIHwg4oCcXeKAnSB8IOKAnHvigJ0gfCDigJx94oCdXG4gICAgJiYgYyAhPT0gQ0hBUl9NSU5VU1xuICAgICYmIGMgIT09IENIQVJfUVVFU1RJT05cbiAgICAmJiBjICE9PSBDSEFSX0NPTE9OXG4gICAgJiYgYyAhPT0gQ0hBUl9DT01NQVxuICAgICYmIGMgIT09IENIQVJfTEVGVF9TUVVBUkVfQlJBQ0tFVFxuICAgICYmIGMgIT09IENIQVJfUklHSFRfU1FVQVJFX0JSQUNLRVRcbiAgICAmJiBjICE9PSBDSEFSX0xFRlRfQ1VSTFlfQlJBQ0tFVFxuICAgICYmIGMgIT09IENIQVJfUklHSFRfQ1VSTFlfQlJBQ0tFVFxuICAgIC8vIHwg4oCcI+KAnSB8IOKAnCbigJ0gfCDigJwq4oCdIHwg4oCcIeKAnSB8IOKAnHzigJ0gfCDigJw+4oCdIHwg4oCcJ+KAnSB8IOKAnFwi4oCdXG4gICAgJiYgYyAhPT0gQ0hBUl9TSEFSUFxuICAgICYmIGMgIT09IENIQVJfQU1QRVJTQU5EXG4gICAgJiYgYyAhPT0gQ0hBUl9BU1RFUklTS1xuICAgICYmIGMgIT09IENIQVJfRVhDTEFNQVRJT05cbiAgICAmJiBjICE9PSBDSEFSX1ZFUlRJQ0FMX0xJTkVcbiAgICAmJiBjICE9PSBDSEFSX0dSRUFURVJfVEhBTlxuICAgICYmIGMgIT09IENIQVJfU0lOR0xFX1FVT1RFXG4gICAgJiYgYyAhPT0gQ0hBUl9ET1VCTEVfUVVPVEVcbiAgICAvLyB8IOKAnCXigJ0gfCDigJxA4oCdIHwg4oCcYOKAnSlcbiAgICAmJiBjICE9PSBDSEFSX1BFUkNFTlRcbiAgICAmJiBjICE9PSBDSEFSX0NPTU1FUkNJQUxfQVRcbiAgICAmJiBjICE9PSBDSEFSX0dSQVZFX0FDQ0VOVDtcbn1cblxudmFyIFNUWUxFX1BMQUlOICAgPSAxLFxuICAgIFNUWUxFX1NJTkdMRSAgPSAyLFxuICAgIFNUWUxFX0xJVEVSQUwgPSAzLFxuICAgIFNUWUxFX0ZPTERFRCAgPSA0LFxuICAgIFNUWUxFX0RPVUJMRSAgPSA1O1xuXG4vLyBEZXRlcm1pbmVzIHdoaWNoIHNjYWxhciBzdHlsZXMgYXJlIHBvc3NpYmxlIGFuZCByZXR1cm5zIHRoZSBwcmVmZXJyZWQgc3R5bGUuXG4vLyBsaW5lV2lkdGggPSAtMSA9PiBubyBsaW1pdC5cbi8vIFByZS1jb25kaXRpb25zOiBzdHIubGVuZ3RoID4gMC5cbi8vIFBvc3QtY29uZGl0aW9uczpcbi8vICAgIFNUWUxFX1BMQUlOIG9yIFNUWUxFX1NJTkdMRSA9PiBubyBcXG4gYXJlIGluIHRoZSBzdHJpbmcuXG4vLyAgICBTVFlMRV9MSVRFUkFMID0+IG5vIGxpbmVzIGFyZSBzdWl0YWJsZSBmb3IgZm9sZGluZyAob3IgbGluZVdpZHRoIGlzIC0xKS5cbi8vICAgIFNUWUxFX0ZPTERFRCA9PiBhIGxpbmUgPiBsaW5lV2lkdGggYW5kIGNhbiBiZSBmb2xkZWQgKGFuZCBsaW5lV2lkdGggIT0gLTEpLlxuZnVuY3Rpb24gY2hvb3NlU2NhbGFyU3R5bGUoc3RyaW5nLCBzaW5nbGVMaW5lT25seSwgaW5kZW50UGVyTGV2ZWwsIGxpbmVXaWR0aCwgdGVzdEFtYmlndW91c1R5cGUpIHtcbiAgdmFyIGk7XG4gIHZhciBjaGFyO1xuICB2YXIgaGFzTGluZUJyZWFrID0gZmFsc2U7XG4gIHZhciBoYXNGb2xkYWJsZUxpbmUgPSBmYWxzZTsgLy8gb25seSBjaGVja2VkIGlmIHNob3VsZFRyYWNrV2lkdGhcbiAgdmFyIHNob3VsZFRyYWNrV2lkdGggPSBsaW5lV2lkdGggIT09IC0xO1xuICB2YXIgcHJldmlvdXNMaW5lQnJlYWsgPSAtMTsgLy8gY291bnQgdGhlIGZpcnN0IGxpbmUgY29ycmVjdGx5XG4gIHZhciBwbGFpbiA9IGlzUGxhaW5TYWZlRmlyc3Qoc3RyaW5nLmNoYXJDb2RlQXQoMCkpXG4gICAgICAgICAgJiYgIWlzV2hpdGVzcGFjZShzdHJpbmcuY2hhckNvZGVBdChzdHJpbmcubGVuZ3RoIC0gMSkpO1xuXG4gIGlmIChzaW5nbGVMaW5lT25seSkge1xuICAgIC8vIENhc2U6IG5vIGJsb2NrIHN0eWxlcy5cbiAgICAvLyBDaGVjayBmb3IgZGlzYWxsb3dlZCBjaGFyYWN0ZXJzIHRvIHJ1bGUgb3V0IHBsYWluIGFuZCBzaW5nbGUuXG4gICAgZm9yIChpID0gMDsgaSA8IHN0cmluZy5sZW5ndGg7IGkrKykge1xuICAgICAgY2hhciA9IHN0cmluZy5jaGFyQ29kZUF0KGkpO1xuICAgICAgaWYgKCFpc1ByaW50YWJsZShjaGFyKSkge1xuICAgICAgICByZXR1cm4gU1RZTEVfRE9VQkxFO1xuICAgICAgfVxuICAgICAgcGxhaW4gPSBwbGFpbiAmJiBpc1BsYWluU2FmZShjaGFyKTtcbiAgICB9XG4gIH0gZWxzZSB7XG4gICAgLy8gQ2FzZTogYmxvY2sgc3R5bGVzIHBlcm1pdHRlZC5cbiAgICBmb3IgKGkgPSAwOyBpIDwgc3RyaW5nLmxlbmd0aDsgaSsrKSB7XG4gICAgICBjaGFyID0gc3RyaW5nLmNoYXJDb2RlQXQoaSk7XG4gICAgICBpZiAoY2hhciA9PT0gQ0hBUl9MSU5FX0ZFRUQpIHtcbiAgICAgICAgaGFzTGluZUJyZWFrID0gdHJ1ZTtcbiAgICAgICAgLy8gQ2hlY2sgaWYgYW55IGxpbmUgY2FuIGJlIGZvbGRlZC5cbiAgICAgICAgaWYgKHNob3VsZFRyYWNrV2lkdGgpIHtcbiAgICAgICAgICBoYXNGb2xkYWJsZUxpbmUgPSBoYXNGb2xkYWJsZUxpbmUgfHxcbiAgICAgICAgICAgIC8vIEZvbGRhYmxlIGxpbmUgPSB0b28gbG9uZywgYW5kIG5vdCBtb3JlLWluZGVudGVkLlxuICAgICAgICAgICAgKGkgLSBwcmV2aW91c0xpbmVCcmVhayAtIDEgPiBsaW5lV2lkdGggJiZcbiAgICAgICAgICAgICBzdHJpbmdbcHJldmlvdXNMaW5lQnJlYWsgKyAxXSAhPT0gJyAnKTtcbiAgICAgICAgICBwcmV2aW91c0xpbmVCcmVhayA9IGk7XG4gICAgICAgIH1cbiAgICAgIH0gZWxzZSBpZiAoIWlzUHJpbnRhYmxlKGNoYXIpKSB7XG4gICAgICAgIHJldHVybiBTVFlMRV9ET1VCTEU7XG4gICAgICB9XG4gICAgICBwbGFpbiA9IHBsYWluICYmIGlzUGxhaW5TYWZlKGNoYXIpO1xuICAgIH1cbiAgICAvLyBpbiBjYXNlIHRoZSBlbmQgaXMgbWlzc2luZyBhIFxcblxuICAgIGhhc0ZvbGRhYmxlTGluZSA9IGhhc0ZvbGRhYmxlTGluZSB8fCAoc2hvdWxkVHJhY2tXaWR0aCAmJlxuICAgICAgKGkgLSBwcmV2aW91c0xpbmVCcmVhayAtIDEgPiBsaW5lV2lkdGggJiZcbiAgICAgICBzdHJpbmdbcHJldmlvdXNMaW5lQnJlYWsgKyAxXSAhPT0gJyAnKSk7XG4gIH1cbiAgLy8gQWx0aG91Z2ggZXZlcnkgc3R5bGUgY2FuIHJlcHJlc2VudCBcXG4gd2l0aG91dCBlc2NhcGluZywgcHJlZmVyIGJsb2NrIHN0eWxlc1xuICAvLyBmb3IgbXVsdGlsaW5lLCBzaW5jZSB0aGV5J3JlIG1vcmUgcmVhZGFibGUgYW5kIHRoZXkgZG9uJ3QgYWRkIGVtcHR5IGxpbmVzLlxuICAvLyBBbHNvIHByZWZlciBmb2xkaW5nIGEgc3VwZXItbG9uZyBsaW5lLlxuICBpZiAoIWhhc0xpbmVCcmVhayAmJiAhaGFzRm9sZGFibGVMaW5lKSB7XG4gICAgLy8gU3RyaW5ncyBpbnRlcnByZXRhYmxlIGFzIGFub3RoZXIgdHlwZSBoYXZlIHRvIGJlIHF1b3RlZDtcbiAgICAvLyBlLmcuIHRoZSBzdHJpbmcgJ3RydWUnIHZzLiB0aGUgYm9vbGVhbiB0cnVlLlxuICAgIHJldHVybiBwbGFpbiAmJiAhdGVzdEFtYmlndW91c1R5cGUoc3RyaW5nKVxuICAgICAgPyBTVFlMRV9QTEFJTiA6IFNUWUxFX1NJTkdMRTtcbiAgfVxuICAvLyBFZGdlIGNhc2U6IGJsb2NrIGluZGVudGF0aW9uIGluZGljYXRvciBjYW4gb25seSBoYXZlIG9uZSBkaWdpdC5cbiAgaWYgKHN0cmluZ1swXSA9PT0gJyAnICYmIGluZGVudFBlckxldmVsID4gOSkge1xuICAgIHJldHVybiBTVFlMRV9ET1VCTEU7XG4gIH1cbiAgLy8gQXQgdGhpcyBwb2ludCB3ZSBrbm93IGJsb2NrIHN0eWxlcyBhcmUgdmFsaWQuXG4gIC8vIFByZWZlciBsaXRlcmFsIHN0eWxlIHVubGVzcyB3ZSB3YW50IHRvIGZvbGQuXG4gIHJldHVybiBoYXNGb2xkYWJsZUxpbmUgPyBTVFlMRV9GT0xERUQgOiBTVFlMRV9MSVRFUkFMO1xufVxuXG4vLyBOb3RlOiBsaW5lIGJyZWFraW5nL2ZvbGRpbmcgaXMgaW1wbGVtZW50ZWQgZm9yIG9ubHkgdGhlIGZvbGRlZCBzdHlsZS5cbi8vIE5CLiBXZSBkcm9wIHRoZSBsYXN0IHRyYWlsaW5nIG5ld2xpbmUgKGlmIGFueSkgb2YgYSByZXR1cm5lZCBibG9jayBzY2FsYXJcbi8vICBzaW5jZSB0aGUgZHVtcGVyIGFkZHMgaXRzIG93biBuZXdsaW5lLiBUaGlzIGFsd2F5cyB3b3Jrczpcbi8vICAgIOKAoiBObyBlbmRpbmcgbmV3bGluZSA9PiB1bmFmZmVjdGVkOyBhbHJlYWR5IHVzaW5nIHN0cmlwIFwiLVwiIGNob21waW5nLlxuLy8gICAg4oCiIEVuZGluZyBuZXdsaW5lICAgID0+IHJlbW92ZWQgdGhlbiByZXN0b3JlZC5cbi8vICBJbXBvcnRhbnRseSwgdGhpcyBrZWVwcyB0aGUgXCIrXCIgY2hvbXAgaW5kaWNhdG9yIGZyb20gZ2FpbmluZyBhbiBleHRyYSBsaW5lLlxuZnVuY3Rpb24gd3JpdGVTY2FsYXIoc3RhdGUsIHN0cmluZywgbGV2ZWwsIGlza2V5KSB7XG4gIHN0YXRlLmR1bXAgPSAoZnVuY3Rpb24gKCkge1xuICAgIGlmIChzdHJpbmcubGVuZ3RoID09PSAwKSB7XG4gICAgICByZXR1cm4gXCInJ1wiO1xuICAgIH1cbiAgICBpZiAoIXN0YXRlLm5vQ29tcGF0TW9kZSAmJlxuICAgICAgICBERVBSRUNBVEVEX0JPT0xFQU5TX1NZTlRBWC5pbmRleE9mKHN0cmluZykgIT09IC0xKSB7XG4gICAgICByZXR1cm4gXCInXCIgKyBzdHJpbmcgKyBcIidcIjtcbiAgICB9XG5cbiAgICB2YXIgaW5kZW50ID0gc3RhdGUuaW5kZW50ICogTWF0aC5tYXgoMSwgbGV2ZWwpOyAvLyBubyAwLWluZGVudCBzY2FsYXJzXG4gICAgLy8gQXMgaW5kZW50YXRpb24gZ2V0cyBkZWVwZXIsIGxldCB0aGUgd2lkdGggZGVjcmVhc2UgbW9ub3RvbmljYWxseVxuICAgIC8vIHRvIHRoZSBsb3dlciBib3VuZCBtaW4oc3RhdGUubGluZVdpZHRoLCA0MCkuXG4gICAgLy8gTm90ZSB0aGF0IHRoaXMgaW1wbGllc1xuICAgIC8vICBzdGF0ZS5saW5lV2lkdGgg4omkIDQwICsgc3RhdGUuaW5kZW50OiB3aWR0aCBpcyBmaXhlZCBhdCB0aGUgbG93ZXIgYm91bmQuXG4gICAgLy8gIHN0YXRlLmxpbmVXaWR0aCA+IDQwICsgc3RhdGUuaW5kZW50OiB3aWR0aCBkZWNyZWFzZXMgdW50aWwgdGhlIGxvd2VyIGJvdW5kLlxuICAgIC8vIFRoaXMgYmVoYXZlcyBiZXR0ZXIgdGhhbiBhIGNvbnN0YW50IG1pbmltdW0gd2lkdGggd2hpY2ggZGlzYWxsb3dzIG5hcnJvd2VyIG9wdGlvbnMsXG4gICAgLy8gb3IgYW4gaW5kZW50IHRocmVzaG9sZCB3aGljaCBjYXVzZXMgdGhlIHdpZHRoIHRvIHN1ZGRlbmx5IGluY3JlYXNlLlxuICAgIHZhciBsaW5lV2lkdGggPSBzdGF0ZS5saW5lV2lkdGggPT09IC0xXG4gICAgICA/IC0xIDogTWF0aC5tYXgoTWF0aC5taW4oc3RhdGUubGluZVdpZHRoLCA0MCksIHN0YXRlLmxpbmVXaWR0aCAtIGluZGVudCk7XG5cbiAgICAvLyBXaXRob3V0IGtub3dpbmcgaWYga2V5cyBhcmUgaW1wbGljaXQvZXhwbGljaXQsIGFzc3VtZSBpbXBsaWNpdCBmb3Igc2FmZXR5LlxuICAgIHZhciBzaW5nbGVMaW5lT25seSA9IGlza2V5XG4gICAgICAvLyBObyBibG9jayBzdHlsZXMgaW4gZmxvdyBtb2RlLlxuICAgICAgfHwgKHN0YXRlLmZsb3dMZXZlbCA+IC0xICYmIGxldmVsID49IHN0YXRlLmZsb3dMZXZlbCk7XG4gICAgZnVuY3Rpb24gdGVzdEFtYmlndWl0eShzdHJpbmcpIHtcbiAgICAgIHJldHVybiB0ZXN0SW1wbGljaXRSZXNvbHZpbmcoc3RhdGUsIHN0cmluZyk7XG4gICAgfVxuXG4gICAgc3dpdGNoIChjaG9vc2VTY2FsYXJTdHlsZShzdHJpbmcsIHNpbmdsZUxpbmVPbmx5LCBzdGF0ZS5pbmRlbnQsIGxpbmVXaWR0aCwgdGVzdEFtYmlndWl0eSkpIHtcbiAgICAgIGNhc2UgU1RZTEVfUExBSU46XG4gICAgICAgIHJldHVybiBzdHJpbmc7XG4gICAgICBjYXNlIFNUWUxFX1NJTkdMRTpcbiAgICAgICAgcmV0dXJuIFwiJ1wiICsgc3RyaW5nLnJlcGxhY2UoLycvZywgXCInJ1wiKSArIFwiJ1wiO1xuICAgICAgY2FzZSBTVFlMRV9MSVRFUkFMOlxuICAgICAgICByZXR1cm4gJ3wnICsgYmxvY2tIZWFkZXIoc3RyaW5nLCBzdGF0ZS5pbmRlbnQpXG4gICAgICAgICAgKyBkcm9wRW5kaW5nTmV3bGluZShpbmRlbnRTdHJpbmcoc3RyaW5nLCBpbmRlbnQpKTtcbiAgICAgIGNhc2UgU1RZTEVfRk9MREVEOlxuICAgICAgICByZXR1cm4gJz4nICsgYmxvY2tIZWFkZXIoc3RyaW5nLCBzdGF0ZS5pbmRlbnQpXG4gICAgICAgICAgKyBkcm9wRW5kaW5nTmV3bGluZShpbmRlbnRTdHJpbmcoZm9sZFN0cmluZyhzdHJpbmcsIGxpbmVXaWR0aCksIGluZGVudCkpO1xuICAgICAgY2FzZSBTVFlMRV9ET1VCTEU6XG4gICAgICAgIHJldHVybiAnXCInICsgZXNjYXBlU3RyaW5nKHN0cmluZywgbGluZVdpZHRoKSArICdcIic7XG4gICAgICBkZWZhdWx0OlxuICAgICAgICB0aHJvdyBuZXcgWUFNTEV4Y2VwdGlvbignaW1wb3NzaWJsZSBlcnJvcjogaW52YWxpZCBzY2FsYXIgc3R5bGUnKTtcbiAgICB9XG4gIH0oKSk7XG59XG5cbi8vIFByZS1jb25kaXRpb25zOiBzdHJpbmcgaXMgdmFsaWQgZm9yIGEgYmxvY2sgc2NhbGFyLCAxIDw9IGluZGVudFBlckxldmVsIDw9IDkuXG5mdW5jdGlvbiBibG9ja0hlYWRlcihzdHJpbmcsIGluZGVudFBlckxldmVsKSB7XG4gIHZhciBpbmRlbnRJbmRpY2F0b3IgPSAoc3RyaW5nWzBdID09PSAnICcpID8gU3RyaW5nKGluZGVudFBlckxldmVsKSA6ICcnO1xuXG4gIC8vIG5vdGUgdGhlIHNwZWNpYWwgY2FzZTogdGhlIHN0cmluZyAnXFxuJyBjb3VudHMgYXMgYSBcInRyYWlsaW5nXCIgZW1wdHkgbGluZS5cbiAgdmFyIGNsaXAgPSAgICAgICAgICBzdHJpbmdbc3RyaW5nLmxlbmd0aCAtIDFdID09PSAnXFxuJztcbiAgdmFyIGtlZXAgPSBjbGlwICYmIChzdHJpbmdbc3RyaW5nLmxlbmd0aCAtIDJdID09PSAnXFxuJyB8fCBzdHJpbmcgPT09ICdcXG4nKTtcbiAgdmFyIGNob21wID0ga2VlcCA/ICcrJyA6IChjbGlwID8gJycgOiAnLScpO1xuXG4gIHJldHVybiBpbmRlbnRJbmRpY2F0b3IgKyBjaG9tcCArICdcXG4nO1xufVxuXG4vLyAoU2VlIHRoZSBub3RlIGZvciB3cml0ZVNjYWxhci4pXG5mdW5jdGlvbiBkcm9wRW5kaW5nTmV3bGluZShzdHJpbmcpIHtcbiAgcmV0dXJuIHN0cmluZ1tzdHJpbmcubGVuZ3RoIC0gMV0gPT09ICdcXG4nID8gc3RyaW5nLnNsaWNlKDAsIC0xKSA6IHN0cmluZztcbn1cblxuLy8gTm90ZTogYSBsb25nIGxpbmUgd2l0aG91dCBhIHN1aXRhYmxlIGJyZWFrIHBvaW50IHdpbGwgZXhjZWVkIHRoZSB3aWR0aCBsaW1pdC5cbi8vIFByZS1jb25kaXRpb25zOiBldmVyeSBjaGFyIGluIHN0ciBpc1ByaW50YWJsZSwgc3RyLmxlbmd0aCA+IDAsIHdpZHRoID4gMC5cbmZ1bmN0aW9uIGZvbGRTdHJpbmcoc3RyaW5nLCB3aWR0aCkge1xuICAvLyBJbiBmb2xkZWQgc3R5bGUsICRrJCBjb25zZWN1dGl2ZSBuZXdsaW5lcyBvdXRwdXQgYXMgJGsrMSQgbmV3bGluZXPigJRcbiAgLy8gdW5sZXNzIHRoZXkncmUgYmVmb3JlIG9yIGFmdGVyIGEgbW9yZS1pbmRlbnRlZCBsaW5lLCBvciBhdCB0aGUgdmVyeVxuICAvLyBiZWdpbm5pbmcgb3IgZW5kLCBpbiB3aGljaCBjYXNlICRrJCBtYXBzIHRvICRrJC5cbiAgLy8gVGhlcmVmb3JlLCBwYXJzZSBlYWNoIGNodW5rIGFzIG5ld2xpbmUocykgZm9sbG93ZWQgYnkgYSBjb250ZW50IGxpbmUuXG4gIHZhciBsaW5lUmUgPSAvKFxcbispKFteXFxuXSopL2c7XG5cbiAgLy8gZmlyc3QgbGluZSAocG9zc2libHkgYW4gZW1wdHkgbGluZSlcbiAgdmFyIHJlc3VsdCA9IChmdW5jdGlvbiAoKSB7XG4gICAgdmFyIG5leHRMRiA9IHN0cmluZy5pbmRleE9mKCdcXG4nKTtcbiAgICBuZXh0TEYgPSBuZXh0TEYgIT09IC0xID8gbmV4dExGIDogc3RyaW5nLmxlbmd0aDtcbiAgICBsaW5lUmUubGFzdEluZGV4ID0gbmV4dExGO1xuICAgIHJldHVybiBmb2xkTGluZShzdHJpbmcuc2xpY2UoMCwgbmV4dExGKSwgd2lkdGgpO1xuICB9KCkpO1xuICAvLyBJZiB3ZSBoYXZlbid0IHJlYWNoZWQgdGhlIGZpcnN0IGNvbnRlbnQgbGluZSB5ZXQsIGRvbid0IGFkZCBhbiBleHRyYSBcXG4uXG4gIHZhciBwcmV2TW9yZUluZGVudGVkID0gc3RyaW5nWzBdID09PSAnXFxuJyB8fCBzdHJpbmdbMF0gPT09ICcgJztcbiAgdmFyIG1vcmVJbmRlbnRlZDtcblxuICAvLyByZXN0IG9mIHRoZSBsaW5lc1xuICB2YXIgbWF0Y2g7XG4gIHdoaWxlICgobWF0Y2ggPSBsaW5lUmUuZXhlYyhzdHJpbmcpKSkge1xuICAgIHZhciBwcmVmaXggPSBtYXRjaFsxXSwgbGluZSA9IG1hdGNoWzJdO1xuICAgIG1vcmVJbmRlbnRlZCA9IChsaW5lWzBdID09PSAnICcpO1xuICAgIHJlc3VsdCArPSBwcmVmaXhcbiAgICAgICsgKCFwcmV2TW9yZUluZGVudGVkICYmICFtb3JlSW5kZW50ZWQgJiYgbGluZSAhPT0gJydcbiAgICAgICAgPyAnXFxuJyA6ICcnKVxuICAgICAgKyBmb2xkTGluZShsaW5lLCB3aWR0aCk7XG4gICAgcHJldk1vcmVJbmRlbnRlZCA9IG1vcmVJbmRlbnRlZDtcbiAgfVxuXG4gIHJldHVybiByZXN1bHQ7XG59XG5cbi8vIEdyZWVkeSBsaW5lIGJyZWFraW5nLlxuLy8gUGlja3MgdGhlIGxvbmdlc3QgbGluZSB1bmRlciB0aGUgbGltaXQgZWFjaCB0aW1lLFxuLy8gb3RoZXJ3aXNlIHNldHRsZXMgZm9yIHRoZSBzaG9ydGVzdCBsaW5lIG92ZXIgdGhlIGxpbWl0LlxuLy8gTkIuIE1vcmUtaW5kZW50ZWQgbGluZXMgKmNhbm5vdCogYmUgZm9sZGVkLCBhcyB0aGF0IHdvdWxkIGFkZCBhbiBleHRyYSBcXG4uXG5mdW5jdGlvbiBmb2xkTGluZShsaW5lLCB3aWR0aCkge1xuICBpZiAobGluZSA9PT0gJycgfHwgbGluZVswXSA9PT0gJyAnKSByZXR1cm4gbGluZTtcblxuICAvLyBTaW5jZSBhIG1vcmUtaW5kZW50ZWQgbGluZSBhZGRzIGEgXFxuLCBicmVha3MgY2FuJ3QgYmUgZm9sbG93ZWQgYnkgYSBzcGFjZS5cbiAgdmFyIGJyZWFrUmUgPSAvIFteIF0vZzsgLy8gbm90ZTogdGhlIG1hdGNoIGluZGV4IHdpbGwgYWx3YXlzIGJlIDw9IGxlbmd0aC0yLlxuICB2YXIgbWF0Y2g7XG4gIC8vIHN0YXJ0IGlzIGFuIGluY2x1c2l2ZSBpbmRleC4gZW5kLCBjdXJyLCBhbmQgbmV4dCBhcmUgZXhjbHVzaXZlLlxuICB2YXIgc3RhcnQgPSAwLCBlbmQsIGN1cnIgPSAwLCBuZXh0ID0gMDtcbiAgdmFyIHJlc3VsdCA9ICcnO1xuXG4gIC8vIEludmFyaWFudHM6IDAgPD0gc3RhcnQgPD0gbGVuZ3RoLTEuXG4gIC8vICAgMCA8PSBjdXJyIDw9IG5leHQgPD0gbWF4KDAsIGxlbmd0aC0yKS4gY3VyciAtIHN0YXJ0IDw9IHdpZHRoLlxuICAvLyBJbnNpZGUgdGhlIGxvb3A6XG4gIC8vICAgQSBtYXRjaCBpbXBsaWVzIGxlbmd0aCA+PSAyLCBzbyBjdXJyIGFuZCBuZXh0IGFyZSA8PSBsZW5ndGgtMi5cbiAgd2hpbGUgKChtYXRjaCA9IGJyZWFrUmUuZXhlYyhsaW5lKSkpIHtcbiAgICBuZXh0ID0gbWF0Y2guaW5kZXg7XG4gICAgLy8gbWFpbnRhaW4gaW52YXJpYW50OiBjdXJyIC0gc3RhcnQgPD0gd2lkdGhcbiAgICBpZiAobmV4dCAtIHN0YXJ0ID4gd2lkdGgpIHtcbiAgICAgIGVuZCA9IChjdXJyID4gc3RhcnQpID8gY3VyciA6IG5leHQ7IC8vIGRlcml2ZSBlbmQgPD0gbGVuZ3RoLTJcbiAgICAgIHJlc3VsdCArPSAnXFxuJyArIGxpbmUuc2xpY2Uoc3RhcnQsIGVuZCk7XG4gICAgICAvLyBza2lwIHRoZSBzcGFjZSB0aGF0IHdhcyBvdXRwdXQgYXMgXFxuXG4gICAgICBzdGFydCA9IGVuZCArIDE7ICAgICAgICAgICAgICAgICAgICAvLyBkZXJpdmUgc3RhcnQgPD0gbGVuZ3RoLTFcbiAgICB9XG4gICAgY3VyciA9IG5leHQ7XG4gIH1cblxuICAvLyBCeSB0aGUgaW52YXJpYW50cywgc3RhcnQgPD0gbGVuZ3RoLTEsIHNvIHRoZXJlIGlzIHNvbWV0aGluZyBsZWZ0IG92ZXIuXG4gIC8vIEl0IGlzIGVpdGhlciB0aGUgd2hvbGUgc3RyaW5nIG9yIGEgcGFydCBzdGFydGluZyBmcm9tIG5vbi13aGl0ZXNwYWNlLlxuICByZXN1bHQgKz0gJ1xcbic7XG4gIC8vIEluc2VydCBhIGJyZWFrIGlmIHRoZSByZW1haW5kZXIgaXMgdG9vIGxvbmcgYW5kIHRoZXJlIGlzIGEgYnJlYWsgYXZhaWxhYmxlLlxuICBpZiAobGluZS5sZW5ndGggLSBzdGFydCA+IHdpZHRoICYmIGN1cnIgPiBzdGFydCkge1xuICAgIHJlc3VsdCArPSBsaW5lLnNsaWNlKHN0YXJ0LCBjdXJyKSArICdcXG4nICsgbGluZS5zbGljZShjdXJyICsgMSk7XG4gIH0gZWxzZSB7XG4gICAgcmVzdWx0ICs9IGxpbmUuc2xpY2Uoc3RhcnQpO1xuICB9XG5cbiAgcmV0dXJuIHJlc3VsdC5zbGljZSgxKTsgLy8gZHJvcCBleHRyYSBcXG4gam9pbmVyXG59XG5cbi8vIEVzY2FwZXMgYSBkb3VibGUtcXVvdGVkIHN0cmluZy5cbmZ1bmN0aW9uIGVzY2FwZVN0cmluZyhzdHJpbmcpIHtcbiAgdmFyIHJlc3VsdCA9ICcnO1xuICB2YXIgY2hhcjtcbiAgdmFyIGVzY2FwZVNlcTtcblxuICBmb3IgKHZhciBpID0gMDsgaSA8IHN0cmluZy5sZW5ndGg7IGkrKykge1xuICAgIGNoYXIgPSBzdHJpbmcuY2hhckNvZGVBdChpKTtcbiAgICBlc2NhcGVTZXEgPSBFU0NBUEVfU0VRVUVOQ0VTW2NoYXJdO1xuICAgIHJlc3VsdCArPSAhZXNjYXBlU2VxICYmIGlzUHJpbnRhYmxlKGNoYXIpXG4gICAgICA/IHN0cmluZ1tpXVxuICAgICAgOiBlc2NhcGVTZXEgfHwgZW5jb2RlSGV4KGNoYXIpO1xuICB9XG5cbiAgcmV0dXJuIHJlc3VsdDtcbn1cblxuZnVuY3Rpb24gd3JpdGVGbG93U2VxdWVuY2Uoc3RhdGUsIGxldmVsLCBvYmplY3QpIHtcbiAgdmFyIF9yZXN1bHQgPSAnJyxcbiAgICAgIF90YWcgICAgPSBzdGF0ZS50YWcsXG4gICAgICBpbmRleCxcbiAgICAgIGxlbmd0aDtcblxuICBmb3IgKGluZGV4ID0gMCwgbGVuZ3RoID0gb2JqZWN0Lmxlbmd0aDsgaW5kZXggPCBsZW5ndGg7IGluZGV4ICs9IDEpIHtcbiAgICAvLyBXcml0ZSBvbmx5IHZhbGlkIGVsZW1lbnRzLlxuICAgIGlmICh3cml0ZU5vZGUoc3RhdGUsIGxldmVsLCBvYmplY3RbaW5kZXhdLCBmYWxzZSwgZmFsc2UpKSB7XG4gICAgICBpZiAoaW5kZXggIT09IDApIF9yZXN1bHQgKz0gJywgJztcbiAgICAgIF9yZXN1bHQgKz0gc3RhdGUuZHVtcDtcbiAgICB9XG4gIH1cblxuICBzdGF0ZS50YWcgPSBfdGFnO1xuICBzdGF0ZS5kdW1wID0gJ1snICsgX3Jlc3VsdCArICddJztcbn1cblxuZnVuY3Rpb24gd3JpdGVCbG9ja1NlcXVlbmNlKHN0YXRlLCBsZXZlbCwgb2JqZWN0LCBjb21wYWN0KSB7XG4gIHZhciBfcmVzdWx0ID0gJycsXG4gICAgICBfdGFnICAgID0gc3RhdGUudGFnLFxuICAgICAgaW5kZXgsXG4gICAgICBsZW5ndGg7XG5cbiAgZm9yIChpbmRleCA9IDAsIGxlbmd0aCA9IG9iamVjdC5sZW5ndGg7IGluZGV4IDwgbGVuZ3RoOyBpbmRleCArPSAxKSB7XG4gICAgLy8gV3JpdGUgb25seSB2YWxpZCBlbGVtZW50cy5cbiAgICBpZiAod3JpdGVOb2RlKHN0YXRlLCBsZXZlbCArIDEsIG9iamVjdFtpbmRleF0sIHRydWUsIHRydWUpKSB7XG4gICAgICBpZiAoIWNvbXBhY3QgfHwgaW5kZXggIT09IDApIHtcbiAgICAgICAgX3Jlc3VsdCArPSBnZW5lcmF0ZU5leHRMaW5lKHN0YXRlLCBsZXZlbCk7XG4gICAgICB9XG4gICAgICBfcmVzdWx0ICs9ICctICcgKyBzdGF0ZS5kdW1wO1xuICAgIH1cbiAgfVxuXG4gIHN0YXRlLnRhZyA9IF90YWc7XG4gIHN0YXRlLmR1bXAgPSBfcmVzdWx0IHx8ICdbXSc7IC8vIEVtcHR5IHNlcXVlbmNlIGlmIG5vIHZhbGlkIHZhbHVlcy5cbn1cblxuZnVuY3Rpb24gd3JpdGVGbG93TWFwcGluZyhzdGF0ZSwgbGV2ZWwsIG9iamVjdCkge1xuICB2YXIgX3Jlc3VsdCAgICAgICA9ICcnLFxuICAgICAgX3RhZyAgICAgICAgICA9IHN0YXRlLnRhZyxcbiAgICAgIG9iamVjdEtleUxpc3QgPSBPYmplY3Qua2V5cyhvYmplY3QpLFxuICAgICAgaW5kZXgsXG4gICAgICBsZW5ndGgsXG4gICAgICBvYmplY3RLZXksXG4gICAgICBvYmplY3RWYWx1ZSxcbiAgICAgIHBhaXJCdWZmZXI7XG5cbiAgZm9yIChpbmRleCA9IDAsIGxlbmd0aCA9IG9iamVjdEtleUxpc3QubGVuZ3RoOyBpbmRleCA8IGxlbmd0aDsgaW5kZXggKz0gMSkge1xuICAgIHBhaXJCdWZmZXIgPSAnJztcblxuICAgIGlmIChpbmRleCAhPT0gMCkgcGFpckJ1ZmZlciArPSAnLCAnO1xuXG4gICAgb2JqZWN0S2V5ID0gb2JqZWN0S2V5TGlzdFtpbmRleF07XG4gICAgb2JqZWN0VmFsdWUgPSBvYmplY3Rbb2JqZWN0S2V5XTtcblxuICAgIGlmICghd3JpdGVOb2RlKHN0YXRlLCBsZXZlbCwgb2JqZWN0S2V5LCBmYWxzZSwgZmFsc2UpKSB7XG4gICAgICBjb250aW51ZTsgLy8gU2tpcCB0aGlzIHBhaXIgYmVjYXVzZSBvZiBpbnZhbGlkIGtleTtcbiAgICB9XG5cbiAgICBpZiAoc3RhdGUuZHVtcC5sZW5ndGggPiAxMDI0KSBwYWlyQnVmZmVyICs9ICc/ICc7XG5cbiAgICBwYWlyQnVmZmVyICs9IHN0YXRlLmR1bXAgKyAnOiAnO1xuXG4gICAgaWYgKCF3cml0ZU5vZGUoc3RhdGUsIGxldmVsLCBvYmplY3RWYWx1ZSwgZmFsc2UsIGZhbHNlKSkge1xuICAgICAgY29udGludWU7IC8vIFNraXAgdGhpcyBwYWlyIGJlY2F1c2Ugb2YgaW52YWxpZCB2YWx1ZS5cbiAgICB9XG5cbiAgICBwYWlyQnVmZmVyICs9IHN0YXRlLmR1bXA7XG5cbiAgICAvLyBCb3RoIGtleSBhbmQgdmFsdWUgYXJlIHZhbGlkLlxuICAgIF9yZXN1bHQgKz0gcGFpckJ1ZmZlcjtcbiAgfVxuXG4gIHN0YXRlLnRhZyA9IF90YWc7XG4gIHN0YXRlLmR1bXAgPSAneycgKyBfcmVzdWx0ICsgJ30nO1xufVxuXG5mdW5jdGlvbiB3cml0ZUJsb2NrTWFwcGluZyhzdGF0ZSwgbGV2ZWwsIG9iamVjdCwgY29tcGFjdCkge1xuICB2YXIgX3Jlc3VsdCAgICAgICA9ICcnLFxuICAgICAgX3RhZyAgICAgICAgICA9IHN0YXRlLnRhZyxcbiAgICAgIG9iamVjdEtleUxpc3QgPSBPYmplY3Qua2V5cyhvYmplY3QpLFxuICAgICAgaW5kZXgsXG4gICAgICBsZW5ndGgsXG4gICAgICBvYmplY3RLZXksXG4gICAgICBvYmplY3RWYWx1ZSxcbiAgICAgIGV4cGxpY2l0UGFpcixcbiAgICAgIHBhaXJCdWZmZXI7XG5cbiAgLy8gQWxsb3cgc29ydGluZyBrZXlzIHNvIHRoYXQgdGhlIG91dHB1dCBmaWxlIGlzIGRldGVybWluaXN0aWNcbiAgaWYgKHN0YXRlLnNvcnRLZXlzID09PSB0cnVlKSB7XG4gICAgLy8gRGVmYXVsdCBzb3J0aW5nXG4gICAgb2JqZWN0S2V5TGlzdC5zb3J0KCk7XG4gIH0gZWxzZSBpZiAodHlwZW9mIHN0YXRlLnNvcnRLZXlzID09PSAnZnVuY3Rpb24nKSB7XG4gICAgLy8gQ3VzdG9tIHNvcnQgZnVuY3Rpb25cbiAgICBvYmplY3RLZXlMaXN0LnNvcnQoc3RhdGUuc29ydEtleXMpO1xuICB9IGVsc2UgaWYgKHN0YXRlLnNvcnRLZXlzKSB7XG4gICAgLy8gU29tZXRoaW5nIGlzIHdyb25nXG4gICAgdGhyb3cgbmV3IFlBTUxFeGNlcHRpb24oJ3NvcnRLZXlzIG11c3QgYmUgYSBib29sZWFuIG9yIGEgZnVuY3Rpb24nKTtcbiAgfVxuXG4gIGZvciAoaW5kZXggPSAwLCBsZW5ndGggPSBvYmplY3RLZXlMaXN0Lmxlbmd0aDsgaW5kZXggPCBsZW5ndGg7IGluZGV4ICs9IDEpIHtcbiAgICBwYWlyQnVmZmVyID0gJyc7XG5cbiAgICBpZiAoIWNvbXBhY3QgfHwgaW5kZXggIT09IDApIHtcbiAgICAgIHBhaXJCdWZmZXIgKz0gZ2VuZXJhdGVOZXh0TGluZShzdGF0ZSwgbGV2ZWwpO1xuICAgIH1cblxuICAgIG9iamVjdEtleSA9IG9iamVjdEtleUxpc3RbaW5kZXhdO1xuICAgIG9iamVjdFZhbHVlID0gb2JqZWN0W29iamVjdEtleV07XG5cbiAgICBpZiAoIXdyaXRlTm9kZShzdGF0ZSwgbGV2ZWwgKyAxLCBvYmplY3RLZXksIHRydWUsIHRydWUsIHRydWUpKSB7XG4gICAgICBjb250aW51ZTsgLy8gU2tpcCB0aGlzIHBhaXIgYmVjYXVzZSBvZiBpbnZhbGlkIGtleS5cbiAgICB9XG5cbiAgICBleHBsaWNpdFBhaXIgPSAoc3RhdGUudGFnICE9PSBudWxsICYmIHN0YXRlLnRhZyAhPT0gJz8nKSB8fFxuICAgICAgICAgICAgICAgICAgIChzdGF0ZS5kdW1wICYmIHN0YXRlLmR1bXAubGVuZ3RoID4gMTAyNCk7XG5cbiAgICBpZiAoZXhwbGljaXRQYWlyKSB7XG4gICAgICBpZiAoc3RhdGUuZHVtcCAmJiBDSEFSX0xJTkVfRkVFRCA9PT0gc3RhdGUuZHVtcC5jaGFyQ29kZUF0KDApKSB7XG4gICAgICAgIHBhaXJCdWZmZXIgKz0gJz8nO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgcGFpckJ1ZmZlciArPSAnPyAnO1xuICAgICAgfVxuICAgIH1cblxuICAgIHBhaXJCdWZmZXIgKz0gc3RhdGUuZHVtcDtcblxuICAgIGlmIChleHBsaWNpdFBhaXIpIHtcbiAgICAgIHBhaXJCdWZmZXIgKz0gZ2VuZXJhdGVOZXh0TGluZShzdGF0ZSwgbGV2ZWwpO1xuICAgIH1cblxuICAgIGlmICghd3JpdGVOb2RlKHN0YXRlLCBsZXZlbCArIDEsIG9iamVjdFZhbHVlLCB0cnVlLCBleHBsaWNpdFBhaXIpKSB7XG4gICAgICBjb250aW51ZTsgLy8gU2tpcCB0aGlzIHBhaXIgYmVjYXVzZSBvZiBpbnZhbGlkIHZhbHVlLlxuICAgIH1cblxuICAgIGlmIChzdGF0ZS5kdW1wICYmIENIQVJfTElORV9GRUVEID09PSBzdGF0ZS5kdW1wLmNoYXJDb2RlQXQoMCkpIHtcbiAgICAgIHBhaXJCdWZmZXIgKz0gJzonO1xuICAgIH0gZWxzZSB7XG4gICAgICBwYWlyQnVmZmVyICs9ICc6ICc7XG4gICAgfVxuXG4gICAgcGFpckJ1ZmZlciArPSBzdGF0ZS5kdW1wO1xuXG4gICAgLy8gQm90aCBrZXkgYW5kIHZhbHVlIGFyZSB2YWxpZC5cbiAgICBfcmVzdWx0ICs9IHBhaXJCdWZmZXI7XG4gIH1cblxuICBzdGF0ZS50YWcgPSBfdGFnO1xuICBzdGF0ZS5kdW1wID0gX3Jlc3VsdCB8fCAne30nOyAvLyBFbXB0eSBtYXBwaW5nIGlmIG5vIHZhbGlkIHBhaXJzLlxufVxuXG5mdW5jdGlvbiBkZXRlY3RUeXBlKHN0YXRlLCBvYmplY3QsIGV4cGxpY2l0KSB7XG4gIHZhciBfcmVzdWx0LCB0eXBlTGlzdCwgaW5kZXgsIGxlbmd0aCwgdHlwZSwgc3R5bGU7XG5cbiAgdHlwZUxpc3QgPSBleHBsaWNpdCA/IHN0YXRlLmV4cGxpY2l0VHlwZXMgOiBzdGF0ZS5pbXBsaWNpdFR5cGVzO1xuXG4gIGZvciAoaW5kZXggPSAwLCBsZW5ndGggPSB0eXBlTGlzdC5sZW5ndGg7IGluZGV4IDwgbGVuZ3RoOyBpbmRleCArPSAxKSB7XG4gICAgdHlwZSA9IHR5cGVMaXN0W2luZGV4XTtcblxuICAgIGlmICgodHlwZS5pbnN0YW5jZU9mICB8fCB0eXBlLnByZWRpY2F0ZSkgJiZcbiAgICAgICAgKCF0eXBlLmluc3RhbmNlT2YgfHwgKCh0eXBlb2Ygb2JqZWN0ID09PSAnb2JqZWN0JykgJiYgKG9iamVjdCBpbnN0YW5jZW9mIHR5cGUuaW5zdGFuY2VPZikpKSAmJlxuICAgICAgICAoIXR5cGUucHJlZGljYXRlICB8fCB0eXBlLnByZWRpY2F0ZShvYmplY3QpKSkge1xuXG4gICAgICBzdGF0ZS50YWcgPSBleHBsaWNpdCA/IHR5cGUudGFnIDogJz8nO1xuXG4gICAgICBpZiAodHlwZS5yZXByZXNlbnQpIHtcbiAgICAgICAgc3R5bGUgPSBzdGF0ZS5zdHlsZU1hcFt0eXBlLnRhZ10gfHwgdHlwZS5kZWZhdWx0U3R5bGU7XG5cbiAgICAgICAgaWYgKF90b1N0cmluZy5jYWxsKHR5cGUucmVwcmVzZW50KSA9PT0gJ1tvYmplY3QgRnVuY3Rpb25dJykge1xuICAgICAgICAgIF9yZXN1bHQgPSB0eXBlLnJlcHJlc2VudChvYmplY3QsIHN0eWxlKTtcbiAgICAgICAgfSBlbHNlIGlmIChfaGFzT3duUHJvcGVydHkuY2FsbCh0eXBlLnJlcHJlc2VudCwgc3R5bGUpKSB7XG4gICAgICAgICAgX3Jlc3VsdCA9IHR5cGUucmVwcmVzZW50W3N0eWxlXShvYmplY3QsIHN0eWxlKTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICB0aHJvdyBuZXcgWUFNTEV4Y2VwdGlvbignITwnICsgdHlwZS50YWcgKyAnPiB0YWcgcmVzb2x2ZXIgYWNjZXB0cyBub3QgXCInICsgc3R5bGUgKyAnXCIgc3R5bGUnKTtcbiAgICAgICAgfVxuXG4gICAgICAgIHN0YXRlLmR1bXAgPSBfcmVzdWx0O1xuICAgICAgfVxuXG4gICAgICByZXR1cm4gdHJ1ZTtcbiAgICB9XG4gIH1cblxuICByZXR1cm4gZmFsc2U7XG59XG5cbi8vIFNlcmlhbGl6ZXMgYG9iamVjdGAgYW5kIHdyaXRlcyBpdCB0byBnbG9iYWwgYHJlc3VsdGAuXG4vLyBSZXR1cm5zIHRydWUgb24gc3VjY2Vzcywgb3IgZmFsc2Ugb24gaW52YWxpZCBvYmplY3QuXG4vL1xuZnVuY3Rpb24gd3JpdGVOb2RlKHN0YXRlLCBsZXZlbCwgb2JqZWN0LCBibG9jaywgY29tcGFjdCwgaXNrZXkpIHtcbiAgc3RhdGUudGFnID0gbnVsbDtcbiAgc3RhdGUuZHVtcCA9IG9iamVjdDtcblxuICBpZiAoIWRldGVjdFR5cGUoc3RhdGUsIG9iamVjdCwgZmFsc2UpKSB7XG4gICAgZGV0ZWN0VHlwZShzdGF0ZSwgb2JqZWN0LCB0cnVlKTtcbiAgfVxuXG4gIHZhciB0eXBlID0gX3RvU3RyaW5nLmNhbGwoc3RhdGUuZHVtcCk7XG5cbiAgaWYgKGJsb2NrKSB7XG4gICAgYmxvY2sgPSAoc3RhdGUuZmxvd0xldmVsIDwgMCB8fCBzdGF0ZS5mbG93TGV2ZWwgPiBsZXZlbCk7XG4gIH1cblxuICB2YXIgb2JqZWN0T3JBcnJheSA9IHR5cGUgPT09ICdbb2JqZWN0IE9iamVjdF0nIHx8IHR5cGUgPT09ICdbb2JqZWN0IEFycmF5XScsXG4gICAgICBkdXBsaWNhdGVJbmRleCxcbiAgICAgIGR1cGxpY2F0ZTtcblxuICBpZiAob2JqZWN0T3JBcnJheSkge1xuICAgIGR1cGxpY2F0ZUluZGV4ID0gc3RhdGUuZHVwbGljYXRlcy5pbmRleE9mKG9iamVjdCk7XG4gICAgZHVwbGljYXRlID0gZHVwbGljYXRlSW5kZXggIT09IC0xO1xuICB9XG5cbiAgaWYgKChzdGF0ZS50YWcgIT09IG51bGwgJiYgc3RhdGUudGFnICE9PSAnPycpIHx8IGR1cGxpY2F0ZSB8fCAoc3RhdGUuaW5kZW50ICE9PSAyICYmIGxldmVsID4gMCkpIHtcbiAgICBjb21wYWN0ID0gZmFsc2U7XG4gIH1cblxuICBpZiAoZHVwbGljYXRlICYmIHN0YXRlLnVzZWREdXBsaWNhdGVzW2R1cGxpY2F0ZUluZGV4XSkge1xuICAgIHN0YXRlLmR1bXAgPSAnKnJlZl8nICsgZHVwbGljYXRlSW5kZXg7XG4gIH0gZWxzZSB7XG4gICAgaWYgKG9iamVjdE9yQXJyYXkgJiYgZHVwbGljYXRlICYmICFzdGF0ZS51c2VkRHVwbGljYXRlc1tkdXBsaWNhdGVJbmRleF0pIHtcbiAgICAgIHN0YXRlLnVzZWREdXBsaWNhdGVzW2R1cGxpY2F0ZUluZGV4XSA9IHRydWU7XG4gICAgfVxuICAgIGlmICh0eXBlID09PSAnW29iamVjdCBPYmplY3RdJykge1xuICAgICAgaWYgKGJsb2NrICYmIChPYmplY3Qua2V5cyhzdGF0ZS5kdW1wKS5sZW5ndGggIT09IDApKSB7XG4gICAgICAgIHdyaXRlQmxvY2tNYXBwaW5nKHN0YXRlLCBsZXZlbCwgc3RhdGUuZHVtcCwgY29tcGFjdCk7XG4gICAgICAgIGlmIChkdXBsaWNhdGUpIHtcbiAgICAgICAgICBzdGF0ZS5kdW1wID0gJyZyZWZfJyArIGR1cGxpY2F0ZUluZGV4ICsgc3RhdGUuZHVtcDtcbiAgICAgICAgfVxuICAgICAgfSBlbHNlIHtcbiAgICAgICAgd3JpdGVGbG93TWFwcGluZyhzdGF0ZSwgbGV2ZWwsIHN0YXRlLmR1bXApO1xuICAgICAgICBpZiAoZHVwbGljYXRlKSB7XG4gICAgICAgICAgc3RhdGUuZHVtcCA9ICcmcmVmXycgKyBkdXBsaWNhdGVJbmRleCArICcgJyArIHN0YXRlLmR1bXA7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9IGVsc2UgaWYgKHR5cGUgPT09ICdbb2JqZWN0IEFycmF5XScpIHtcbiAgICAgIGlmIChibG9jayAmJiAoc3RhdGUuZHVtcC5sZW5ndGggIT09IDApKSB7XG4gICAgICAgIHdyaXRlQmxvY2tTZXF1ZW5jZShzdGF0ZSwgbGV2ZWwsIHN0YXRlLmR1bXAsIGNvbXBhY3QpO1xuICAgICAgICBpZiAoZHVwbGljYXRlKSB7XG4gICAgICAgICAgc3RhdGUuZHVtcCA9ICcmcmVmXycgKyBkdXBsaWNhdGVJbmRleCArIHN0YXRlLmR1bXA7XG4gICAgICAgIH1cbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHdyaXRlRmxvd1NlcXVlbmNlKHN0YXRlLCBsZXZlbCwgc3RhdGUuZHVtcCk7XG4gICAgICAgIGlmIChkdXBsaWNhdGUpIHtcbiAgICAgICAgICBzdGF0ZS5kdW1wID0gJyZyZWZfJyArIGR1cGxpY2F0ZUluZGV4ICsgJyAnICsgc3RhdGUuZHVtcDtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH0gZWxzZSBpZiAodHlwZSA9PT0gJ1tvYmplY3QgU3RyaW5nXScpIHtcbiAgICAgIGlmIChzdGF0ZS50YWcgIT09ICc/Jykge1xuICAgICAgICB3cml0ZVNjYWxhcihzdGF0ZSwgc3RhdGUuZHVtcCwgbGV2ZWwsIGlza2V5KTtcbiAgICAgIH1cbiAgICB9IGVsc2Uge1xuICAgICAgaWYgKHN0YXRlLnNraXBJbnZhbGlkKSByZXR1cm4gZmFsc2U7XG4gICAgICB0aHJvdyBuZXcgWUFNTEV4Y2VwdGlvbigndW5hY2NlcHRhYmxlIGtpbmQgb2YgYW4gb2JqZWN0IHRvIGR1bXAgJyArIHR5cGUpO1xuICAgIH1cblxuICAgIGlmIChzdGF0ZS50YWcgIT09IG51bGwgJiYgc3RhdGUudGFnICE9PSAnPycpIHtcbiAgICAgIHN0YXRlLmR1bXAgPSAnITwnICsgc3RhdGUudGFnICsgJz4gJyArIHN0YXRlLmR1bXA7XG4gICAgfVxuICB9XG5cbiAgcmV0dXJuIHRydWU7XG59XG5cbmZ1bmN0aW9uIGdldER1cGxpY2F0ZVJlZmVyZW5jZXMob2JqZWN0LCBzdGF0ZSkge1xuICB2YXIgb2JqZWN0cyA9IFtdLFxuICAgICAgZHVwbGljYXRlc0luZGV4ZXMgPSBbXSxcbiAgICAgIGluZGV4LFxuICAgICAgbGVuZ3RoO1xuXG4gIGluc3BlY3ROb2RlKG9iamVjdCwgb2JqZWN0cywgZHVwbGljYXRlc0luZGV4ZXMpO1xuXG4gIGZvciAoaW5kZXggPSAwLCBsZW5ndGggPSBkdXBsaWNhdGVzSW5kZXhlcy5sZW5ndGg7IGluZGV4IDwgbGVuZ3RoOyBpbmRleCArPSAxKSB7XG4gICAgc3RhdGUuZHVwbGljYXRlcy5wdXNoKG9iamVjdHNbZHVwbGljYXRlc0luZGV4ZXNbaW5kZXhdXSk7XG4gIH1cbiAgc3RhdGUudXNlZER1cGxpY2F0ZXMgPSBuZXcgQXJyYXkobGVuZ3RoKTtcbn1cblxuZnVuY3Rpb24gaW5zcGVjdE5vZGUob2JqZWN0LCBvYmplY3RzLCBkdXBsaWNhdGVzSW5kZXhlcykge1xuICB2YXIgb2JqZWN0S2V5TGlzdCxcbiAgICAgIGluZGV4LFxuICAgICAgbGVuZ3RoO1xuXG4gIGlmIChvYmplY3QgIT09IG51bGwgJiYgdHlwZW9mIG9iamVjdCA9PT0gJ29iamVjdCcpIHtcbiAgICBpbmRleCA9IG9iamVjdHMuaW5kZXhPZihvYmplY3QpO1xuICAgIGlmIChpbmRleCAhPT0gLTEpIHtcbiAgICAgIGlmIChkdXBsaWNhdGVzSW5kZXhlcy5pbmRleE9mKGluZGV4KSA9PT0gLTEpIHtcbiAgICAgICAgZHVwbGljYXRlc0luZGV4ZXMucHVzaChpbmRleCk7XG4gICAgICB9XG4gICAgfSBlbHNlIHtcbiAgICAgIG9iamVjdHMucHVzaChvYmplY3QpO1xuXG4gICAgICBpZiAoQXJyYXkuaXNBcnJheShvYmplY3QpKSB7XG4gICAgICAgIGZvciAoaW5kZXggPSAwLCBsZW5ndGggPSBvYmplY3QubGVuZ3RoOyBpbmRleCA8IGxlbmd0aDsgaW5kZXggKz0gMSkge1xuICAgICAgICAgIGluc3BlY3ROb2RlKG9iamVjdFtpbmRleF0sIG9iamVjdHMsIGR1cGxpY2F0ZXNJbmRleGVzKTtcbiAgICAgICAgfVxuICAgICAgfSBlbHNlIHtcbiAgICAgICAgb2JqZWN0S2V5TGlzdCA9IE9iamVjdC5rZXlzKG9iamVjdCk7XG5cbiAgICAgICAgZm9yIChpbmRleCA9IDAsIGxlbmd0aCA9IG9iamVjdEtleUxpc3QubGVuZ3RoOyBpbmRleCA8IGxlbmd0aDsgaW5kZXggKz0gMSkge1xuICAgICAgICAgIGluc3BlY3ROb2RlKG9iamVjdFtvYmplY3RLZXlMaXN0W2luZGV4XV0sIG9iamVjdHMsIGR1cGxpY2F0ZXNJbmRleGVzKTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cbiAgfVxufVxuXG5mdW5jdGlvbiBkdW1wKGlucHV0LCBvcHRpb25zKSB7XG4gIG9wdGlvbnMgPSBvcHRpb25zIHx8IHt9O1xuXG4gIHZhciBzdGF0ZSA9IG5ldyBTdGF0ZShvcHRpb25zKTtcblxuICBpZiAoIXN0YXRlLm5vUmVmcykgZ2V0RHVwbGljYXRlUmVmZXJlbmNlcyhpbnB1dCwgc3RhdGUpO1xuXG4gIGlmICh3cml0ZU5vZGUoc3RhdGUsIDAsIGlucHV0LCB0cnVlLCB0cnVlKSkgcmV0dXJuIHN0YXRlLmR1bXAgKyAnXFxuJztcblxuICByZXR1cm4gJyc7XG59XG5cbmZ1bmN0aW9uIHNhZmVEdW1wKGlucHV0LCBvcHRpb25zKSB7XG4gIHJldHVybiBkdW1wKGlucHV0LCBjb21tb24uZXh0ZW5kKHsgc2NoZW1hOiBERUZBVUxUX1NBRkVfU0NIRU1BIH0sIG9wdGlvbnMpKTtcbn1cblxubW9kdWxlLmV4cG9ydHMuZHVtcCAgICAgPSBkdW1wO1xubW9kdWxlLmV4cG9ydHMuc2FmZUR1bXAgPSBzYWZlRHVtcDtcbiIsIi8vIFlBTUwgZXJyb3IgY2xhc3MuIGh0dHA6Ly9zdGFja292ZXJmbG93LmNvbS9xdWVzdGlvbnMvODQ1ODk4NFxuLy9cbid1c2Ugc3RyaWN0JztcblxuZnVuY3Rpb24gWUFNTEV4Y2VwdGlvbihyZWFzb24sIG1hcmspIHtcbiAgLy8gU3VwZXIgY29uc3RydWN0b3JcbiAgRXJyb3IuY2FsbCh0aGlzKTtcblxuICAvLyBJbmNsdWRlIHN0YWNrIHRyYWNlIGluIGVycm9yIG9iamVjdFxuICBpZiAoRXJyb3IuY2FwdHVyZVN0YWNrVHJhY2UpIHtcbiAgICAvLyBDaHJvbWUgYW5kIE5vZGVKU1xuICAgIEVycm9yLmNhcHR1cmVTdGFja1RyYWNlKHRoaXMsIHRoaXMuY29uc3RydWN0b3IpO1xuICB9IGVsc2Uge1xuICAgIC8vIEZGLCBJRSAxMCsgYW5kIFNhZmFyaSA2Ky4gRmFsbGJhY2sgZm9yIG90aGVyc1xuICAgIHRoaXMuc3RhY2sgPSAobmV3IEVycm9yKCkpLnN0YWNrIHx8ICcnO1xuICB9XG5cbiAgdGhpcy5uYW1lID0gJ1lBTUxFeGNlcHRpb24nO1xuICB0aGlzLnJlYXNvbiA9IHJlYXNvbjtcbiAgdGhpcy5tYXJrID0gbWFyaztcbiAgdGhpcy5tZXNzYWdlID0gKHRoaXMucmVhc29uIHx8ICcodW5rbm93biByZWFzb24pJykgKyAodGhpcy5tYXJrID8gJyAnICsgdGhpcy5tYXJrLnRvU3RyaW5nKCkgOiAnJyk7XG59XG5cblxuLy8gSW5oZXJpdCBmcm9tIEVycm9yXG5ZQU1MRXhjZXB0aW9uLnByb3RvdHlwZSA9IE9iamVjdC5jcmVhdGUoRXJyb3IucHJvdG90eXBlKTtcbllBTUxFeGNlcHRpb24ucHJvdG90eXBlLmNvbnN0cnVjdG9yID0gWUFNTEV4Y2VwdGlvbjtcblxuXG5ZQU1MRXhjZXB0aW9uLnByb3RvdHlwZS50b1N0cmluZyA9IGZ1bmN0aW9uIHRvU3RyaW5nKGNvbXBhY3QpIHtcbiAgdmFyIHJlc3VsdCA9IHRoaXMubmFtZSArICc6ICc7XG5cbiAgcmVzdWx0ICs9IHRoaXMucmVhc29uIHx8ICcodW5rbm93biByZWFzb24pJztcblxuICBpZiAoIWNvbXBhY3QgJiYgdGhpcy5tYXJrKSB7XG4gICAgcmVzdWx0ICs9ICcgJyArIHRoaXMubWFyay50b1N0cmluZygpO1xuICB9XG5cbiAgcmV0dXJuIHJlc3VsdDtcbn07XG5cblxubW9kdWxlLmV4cG9ydHMgPSBZQU1MRXhjZXB0aW9uO1xuIiwiJ3VzZSBzdHJpY3QnO1xuXG4vKmVzbGludC1kaXNhYmxlIG1heC1sZW4sbm8tdXNlLWJlZm9yZS1kZWZpbmUqL1xuXG52YXIgY29tbW9uICAgICAgICAgICAgICA9IHJlcXVpcmUoJy4vY29tbW9uJyk7XG52YXIgWUFNTEV4Y2VwdGlvbiAgICAgICA9IHJlcXVpcmUoJy4vZXhjZXB0aW9uJyk7XG52YXIgTWFyayAgICAgICAgICAgICAgICA9IHJlcXVpcmUoJy4vbWFyaycpO1xudmFyIERFRkFVTFRfU0FGRV9TQ0hFTUEgPSByZXF1aXJlKCcuL3NjaGVtYS9kZWZhdWx0X3NhZmUnKTtcbnZhciBERUZBVUxUX0ZVTExfU0NIRU1BID0gcmVxdWlyZSgnLi9zY2hlbWEvZGVmYXVsdF9mdWxsJyk7XG5cblxudmFyIF9oYXNPd25Qcm9wZXJ0eSA9IE9iamVjdC5wcm90b3R5cGUuaGFzT3duUHJvcGVydHk7XG5cblxudmFyIENPTlRFWFRfRkxPV19JTiAgID0gMTtcbnZhciBDT05URVhUX0ZMT1dfT1VUICA9IDI7XG52YXIgQ09OVEVYVF9CTE9DS19JTiAgPSAzO1xudmFyIENPTlRFWFRfQkxPQ0tfT1VUID0gNDtcblxuXG52YXIgQ0hPTVBJTkdfQ0xJUCAgPSAxO1xudmFyIENIT01QSU5HX1NUUklQID0gMjtcbnZhciBDSE9NUElOR19LRUVQICA9IDM7XG5cblxudmFyIFBBVFRFUk5fTk9OX1BSSU5UQUJMRSAgICAgICAgID0gL1tcXHgwMC1cXHgwOFxceDBCXFx4MENcXHgwRS1cXHgxRlxceDdGLVxceDg0XFx4ODYtXFx4OUZcXHVGRkZFXFx1RkZGRl18W1xcdUQ4MDAtXFx1REJGRl0oPyFbXFx1REMwMC1cXHVERkZGXSl8KD86W15cXHVEODAwLVxcdURCRkZdfF4pW1xcdURDMDAtXFx1REZGRl0vO1xudmFyIFBBVFRFUk5fTk9OX0FTQ0lJX0xJTkVfQlJFQUtTID0gL1tcXHg4NVxcdTIwMjhcXHUyMDI5XS87XG52YXIgUEFUVEVSTl9GTE9XX0lORElDQVRPUlMgICAgICAgPSAvWyxcXFtcXF1cXHtcXH1dLztcbnZhciBQQVRURVJOX1RBR19IQU5ETEUgICAgICAgICAgICA9IC9eKD86IXwhIXwhW2EtelxcLV0rISkkL2k7XG52YXIgUEFUVEVSTl9UQUdfVVJJICAgICAgICAgICAgICAgPSAvXig/OiF8W14sXFxbXFxdXFx7XFx9XSkoPzolWzAtOWEtZl17Mn18WzAtOWEtelxcLSM7XFwvXFw/OkAmPVxcK1xcJCxfXFwuIX5cXConXFwoXFwpXFxbXFxdXSkqJC9pO1xuXG5cbmZ1bmN0aW9uIGlzX0VPTChjKSB7XG4gIHJldHVybiAoYyA9PT0gMHgwQS8qIExGICovKSB8fCAoYyA9PT0gMHgwRC8qIENSICovKTtcbn1cblxuZnVuY3Rpb24gaXNfV0hJVEVfU1BBQ0UoYykge1xuICByZXR1cm4gKGMgPT09IDB4MDkvKiBUYWIgKi8pIHx8IChjID09PSAweDIwLyogU3BhY2UgKi8pO1xufVxuXG5mdW5jdGlvbiBpc19XU19PUl9FT0woYykge1xuICByZXR1cm4gKGMgPT09IDB4MDkvKiBUYWIgKi8pIHx8XG4gICAgICAgICAoYyA9PT0gMHgyMC8qIFNwYWNlICovKSB8fFxuICAgICAgICAgKGMgPT09IDB4MEEvKiBMRiAqLykgfHxcbiAgICAgICAgIChjID09PSAweDBELyogQ1IgKi8pO1xufVxuXG5mdW5jdGlvbiBpc19GTE9XX0lORElDQVRPUihjKSB7XG4gIHJldHVybiBjID09PSAweDJDLyogLCAqLyB8fFxuICAgICAgICAgYyA9PT0gMHg1Qi8qIFsgKi8gfHxcbiAgICAgICAgIGMgPT09IDB4NUQvKiBdICovIHx8XG4gICAgICAgICBjID09PSAweDdCLyogeyAqLyB8fFxuICAgICAgICAgYyA9PT0gMHg3RC8qIH0gKi87XG59XG5cbmZ1bmN0aW9uIGZyb21IZXhDb2RlKGMpIHtcbiAgdmFyIGxjO1xuXG4gIGlmICgoMHgzMC8qIDAgKi8gPD0gYykgJiYgKGMgPD0gMHgzOS8qIDkgKi8pKSB7XG4gICAgcmV0dXJuIGMgLSAweDMwO1xuICB9XG5cbiAgLyplc2xpbnQtZGlzYWJsZSBuby1iaXR3aXNlKi9cbiAgbGMgPSBjIHwgMHgyMDtcblxuICBpZiAoKDB4NjEvKiBhICovIDw9IGxjKSAmJiAobGMgPD0gMHg2Ni8qIGYgKi8pKSB7XG4gICAgcmV0dXJuIGxjIC0gMHg2MSArIDEwO1xuICB9XG5cbiAgcmV0dXJuIC0xO1xufVxuXG5mdW5jdGlvbiBlc2NhcGVkSGV4TGVuKGMpIHtcbiAgaWYgKGMgPT09IDB4NzgvKiB4ICovKSB7IHJldHVybiAyOyB9XG4gIGlmIChjID09PSAweDc1LyogdSAqLykgeyByZXR1cm4gNDsgfVxuICBpZiAoYyA9PT0gMHg1NS8qIFUgKi8pIHsgcmV0dXJuIDg7IH1cbiAgcmV0dXJuIDA7XG59XG5cbmZ1bmN0aW9uIGZyb21EZWNpbWFsQ29kZShjKSB7XG4gIGlmICgoMHgzMC8qIDAgKi8gPD0gYykgJiYgKGMgPD0gMHgzOS8qIDkgKi8pKSB7XG4gICAgcmV0dXJuIGMgLSAweDMwO1xuICB9XG5cbiAgcmV0dXJuIC0xO1xufVxuXG5mdW5jdGlvbiBzaW1wbGVFc2NhcGVTZXF1ZW5jZShjKSB7XG4gIHJldHVybiAoYyA9PT0gMHgzMC8qIDAgKi8pID8gJ1xceDAwJyA6XG4gICAgICAgIChjID09PSAweDYxLyogYSAqLykgPyAnXFx4MDcnIDpcbiAgICAgICAgKGMgPT09IDB4NjIvKiBiICovKSA/ICdcXHgwOCcgOlxuICAgICAgICAoYyA9PT0gMHg3NC8qIHQgKi8pID8gJ1xceDA5JyA6XG4gICAgICAgIChjID09PSAweDA5LyogVGFiICovKSA/ICdcXHgwOScgOlxuICAgICAgICAoYyA9PT0gMHg2RS8qIG4gKi8pID8gJ1xceDBBJyA6XG4gICAgICAgIChjID09PSAweDc2LyogdiAqLykgPyAnXFx4MEInIDpcbiAgICAgICAgKGMgPT09IDB4NjYvKiBmICovKSA/ICdcXHgwQycgOlxuICAgICAgICAoYyA9PT0gMHg3Mi8qIHIgKi8pID8gJ1xceDBEJyA6XG4gICAgICAgIChjID09PSAweDY1LyogZSAqLykgPyAnXFx4MUInIDpcbiAgICAgICAgKGMgPT09IDB4MjAvKiBTcGFjZSAqLykgPyAnICcgOlxuICAgICAgICAoYyA9PT0gMHgyMi8qIFwiICovKSA/ICdcXHgyMicgOlxuICAgICAgICAoYyA9PT0gMHgyRi8qIC8gKi8pID8gJy8nIDpcbiAgICAgICAgKGMgPT09IDB4NUMvKiBcXCAqLykgPyAnXFx4NUMnIDpcbiAgICAgICAgKGMgPT09IDB4NEUvKiBOICovKSA/ICdcXHg4NScgOlxuICAgICAgICAoYyA9PT0gMHg1Ri8qIF8gKi8pID8gJ1xceEEwJyA6XG4gICAgICAgIChjID09PSAweDRDLyogTCAqLykgPyAnXFx1MjAyOCcgOlxuICAgICAgICAoYyA9PT0gMHg1MC8qIFAgKi8pID8gJ1xcdTIwMjknIDogJyc7XG59XG5cbmZ1bmN0aW9uIGNoYXJGcm9tQ29kZXBvaW50KGMpIHtcbiAgaWYgKGMgPD0gMHhGRkZGKSB7XG4gICAgcmV0dXJuIFN0cmluZy5mcm9tQ2hhckNvZGUoYyk7XG4gIH1cbiAgLy8gRW5jb2RlIFVURi0xNiBzdXJyb2dhdGUgcGFpclxuICAvLyBodHRwczovL2VuLndpa2lwZWRpYS5vcmcvd2lraS9VVEYtMTYjQ29kZV9wb2ludHNfVS4yQjAxMDAwMF90b19VLjJCMTBGRkZGXG4gIHJldHVybiBTdHJpbmcuZnJvbUNoYXJDb2RlKCgoYyAtIDB4MDEwMDAwKSA+PiAxMCkgKyAweEQ4MDAsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICgoYyAtIDB4MDEwMDAwKSAmIDB4MDNGRikgKyAweERDMDApO1xufVxuXG52YXIgc2ltcGxlRXNjYXBlQ2hlY2sgPSBuZXcgQXJyYXkoMjU2KTsgLy8gaW50ZWdlciwgZm9yIGZhc3QgYWNjZXNzXG52YXIgc2ltcGxlRXNjYXBlTWFwID0gbmV3IEFycmF5KDI1Nik7XG5mb3IgKHZhciBpID0gMDsgaSA8IDI1NjsgaSsrKSB7XG4gIHNpbXBsZUVzY2FwZUNoZWNrW2ldID0gc2ltcGxlRXNjYXBlU2VxdWVuY2UoaSkgPyAxIDogMDtcbiAgc2ltcGxlRXNjYXBlTWFwW2ldID0gc2ltcGxlRXNjYXBlU2VxdWVuY2UoaSk7XG59XG5cblxuZnVuY3Rpb24gU3RhdGUoaW5wdXQsIG9wdGlvbnMpIHtcbiAgdGhpcy5pbnB1dCA9IGlucHV0O1xuXG4gIHRoaXMuZmlsZW5hbWUgID0gb3B0aW9uc1snZmlsZW5hbWUnXSAgfHwgbnVsbDtcbiAgdGhpcy5zY2hlbWEgICAgPSBvcHRpb25zWydzY2hlbWEnXSAgICB8fCBERUZBVUxUX0ZVTExfU0NIRU1BO1xuICB0aGlzLm9uV2FybmluZyA9IG9wdGlvbnNbJ29uV2FybmluZyddIHx8IG51bGw7XG4gIHRoaXMubGVnYWN5ICAgID0gb3B0aW9uc1snbGVnYWN5J10gICAgfHwgZmFsc2U7XG4gIHRoaXMuanNvbiAgICAgID0gb3B0aW9uc1snanNvbiddICAgICAgfHwgZmFsc2U7XG4gIHRoaXMubGlzdGVuZXIgID0gb3B0aW9uc1snbGlzdGVuZXInXSAgfHwgbnVsbDtcblxuICB0aGlzLmltcGxpY2l0VHlwZXMgPSB0aGlzLnNjaGVtYS5jb21waWxlZEltcGxpY2l0O1xuICB0aGlzLnR5cGVNYXAgICAgICAgPSB0aGlzLnNjaGVtYS5jb21waWxlZFR5cGVNYXA7XG5cbiAgdGhpcy5sZW5ndGggICAgID0gaW5wdXQubGVuZ3RoO1xuICB0aGlzLnBvc2l0aW9uICAgPSAwO1xuICB0aGlzLmxpbmUgICAgICAgPSAwO1xuICB0aGlzLmxpbmVTdGFydCAgPSAwO1xuICB0aGlzLmxpbmVJbmRlbnQgPSAwO1xuXG4gIHRoaXMuZG9jdW1lbnRzID0gW107XG5cbiAgLypcbiAgdGhpcy52ZXJzaW9uO1xuICB0aGlzLmNoZWNrTGluZUJyZWFrcztcbiAgdGhpcy50YWdNYXA7XG4gIHRoaXMuYW5jaG9yTWFwO1xuICB0aGlzLnRhZztcbiAgdGhpcy5hbmNob3I7XG4gIHRoaXMua2luZDtcbiAgdGhpcy5yZXN1bHQ7Ki9cblxufVxuXG5cbmZ1bmN0aW9uIGdlbmVyYXRlRXJyb3Ioc3RhdGUsIG1lc3NhZ2UpIHtcbiAgcmV0dXJuIG5ldyBZQU1MRXhjZXB0aW9uKFxuICAgIG1lc3NhZ2UsXG4gICAgbmV3IE1hcmsoc3RhdGUuZmlsZW5hbWUsIHN0YXRlLmlucHV0LCBzdGF0ZS5wb3NpdGlvbiwgc3RhdGUubGluZSwgKHN0YXRlLnBvc2l0aW9uIC0gc3RhdGUubGluZVN0YXJ0KSkpO1xufVxuXG5mdW5jdGlvbiB0aHJvd0Vycm9yKHN0YXRlLCBtZXNzYWdlKSB7XG4gIHRocm93IGdlbmVyYXRlRXJyb3Ioc3RhdGUsIG1lc3NhZ2UpO1xufVxuXG5mdW5jdGlvbiB0aHJvd1dhcm5pbmcoc3RhdGUsIG1lc3NhZ2UpIHtcbiAgaWYgKHN0YXRlLm9uV2FybmluZykge1xuICAgIHN0YXRlLm9uV2FybmluZy5jYWxsKG51bGwsIGdlbmVyYXRlRXJyb3Ioc3RhdGUsIG1lc3NhZ2UpKTtcbiAgfVxufVxuXG5cbnZhciBkaXJlY3RpdmVIYW5kbGVycyA9IHtcblxuICBZQU1MOiBmdW5jdGlvbiBoYW5kbGVZYW1sRGlyZWN0aXZlKHN0YXRlLCBuYW1lLCBhcmdzKSB7XG5cbiAgICB2YXIgbWF0Y2gsIG1ham9yLCBtaW5vcjtcblxuICAgIGlmIChzdGF0ZS52ZXJzaW9uICE9PSBudWxsKSB7XG4gICAgICB0aHJvd0Vycm9yKHN0YXRlLCAnZHVwbGljYXRpb24gb2YgJVlBTUwgZGlyZWN0aXZlJyk7XG4gICAgfVxuXG4gICAgaWYgKGFyZ3MubGVuZ3RoICE9PSAxKSB7XG4gICAgICB0aHJvd0Vycm9yKHN0YXRlLCAnWUFNTCBkaXJlY3RpdmUgYWNjZXB0cyBleGFjdGx5IG9uZSBhcmd1bWVudCcpO1xuICAgIH1cblxuICAgIG1hdGNoID0gL14oWzAtOV0rKVxcLihbMC05XSspJC8uZXhlYyhhcmdzWzBdKTtcblxuICAgIGlmIChtYXRjaCA9PT0gbnVsbCkge1xuICAgICAgdGhyb3dFcnJvcihzdGF0ZSwgJ2lsbC1mb3JtZWQgYXJndW1lbnQgb2YgdGhlIFlBTUwgZGlyZWN0aXZlJyk7XG4gICAgfVxuXG4gICAgbWFqb3IgPSBwYXJzZUludChtYXRjaFsxXSwgMTApO1xuICAgIG1pbm9yID0gcGFyc2VJbnQobWF0Y2hbMl0sIDEwKTtcblxuICAgIGlmIChtYWpvciAhPT0gMSkge1xuICAgICAgdGhyb3dFcnJvcihzdGF0ZSwgJ3VuYWNjZXB0YWJsZSBZQU1MIHZlcnNpb24gb2YgdGhlIGRvY3VtZW50Jyk7XG4gICAgfVxuXG4gICAgc3RhdGUudmVyc2lvbiA9IGFyZ3NbMF07XG4gICAgc3RhdGUuY2hlY2tMaW5lQnJlYWtzID0gKG1pbm9yIDwgMik7XG5cbiAgICBpZiAobWlub3IgIT09IDEgJiYgbWlub3IgIT09IDIpIHtcbiAgICAgIHRocm93V2FybmluZyhzdGF0ZSwgJ3Vuc3VwcG9ydGVkIFlBTUwgdmVyc2lvbiBvZiB0aGUgZG9jdW1lbnQnKTtcbiAgICB9XG4gIH0sXG5cbiAgVEFHOiBmdW5jdGlvbiBoYW5kbGVUYWdEaXJlY3RpdmUoc3RhdGUsIG5hbWUsIGFyZ3MpIHtcblxuICAgIHZhciBoYW5kbGUsIHByZWZpeDtcblxuICAgIGlmIChhcmdzLmxlbmd0aCAhPT0gMikge1xuICAgICAgdGhyb3dFcnJvcihzdGF0ZSwgJ1RBRyBkaXJlY3RpdmUgYWNjZXB0cyBleGFjdGx5IHR3byBhcmd1bWVudHMnKTtcbiAgICB9XG5cbiAgICBoYW5kbGUgPSBhcmdzWzBdO1xuICAgIHByZWZpeCA9IGFyZ3NbMV07XG5cbiAgICBpZiAoIVBBVFRFUk5fVEFHX0hBTkRMRS50ZXN0KGhhbmRsZSkpIHtcbiAgICAgIHRocm93RXJyb3Ioc3RhdGUsICdpbGwtZm9ybWVkIHRhZyBoYW5kbGUgKGZpcnN0IGFyZ3VtZW50KSBvZiB0aGUgVEFHIGRpcmVjdGl2ZScpO1xuICAgIH1cblxuICAgIGlmIChfaGFzT3duUHJvcGVydHkuY2FsbChzdGF0ZS50YWdNYXAsIGhhbmRsZSkpIHtcbiAgICAgIHRocm93RXJyb3Ioc3RhdGUsICd0aGVyZSBpcyBhIHByZXZpb3VzbHkgZGVjbGFyZWQgc3VmZml4IGZvciBcIicgKyBoYW5kbGUgKyAnXCIgdGFnIGhhbmRsZScpO1xuICAgIH1cblxuICAgIGlmICghUEFUVEVSTl9UQUdfVVJJLnRlc3QocHJlZml4KSkge1xuICAgICAgdGhyb3dFcnJvcihzdGF0ZSwgJ2lsbC1mb3JtZWQgdGFnIHByZWZpeCAoc2Vjb25kIGFyZ3VtZW50KSBvZiB0aGUgVEFHIGRpcmVjdGl2ZScpO1xuICAgIH1cblxuICAgIHN0YXRlLnRhZ01hcFtoYW5kbGVdID0gcHJlZml4O1xuICB9XG59O1xuXG5cbmZ1bmN0aW9uIGNhcHR1cmVTZWdtZW50KHN0YXRlLCBzdGFydCwgZW5kLCBjaGVja0pzb24pIHtcbiAgdmFyIF9wb3NpdGlvbiwgX2xlbmd0aCwgX2NoYXJhY3RlciwgX3Jlc3VsdDtcblxuICBpZiAoc3RhcnQgPCBlbmQpIHtcbiAgICBfcmVzdWx0ID0gc3RhdGUuaW5wdXQuc2xpY2Uoc3RhcnQsIGVuZCk7XG5cbiAgICBpZiAoY2hlY2tKc29uKSB7XG4gICAgICBmb3IgKF9wb3NpdGlvbiA9IDAsIF9sZW5ndGggPSBfcmVzdWx0Lmxlbmd0aDtcbiAgICAgICAgICAgX3Bvc2l0aW9uIDwgX2xlbmd0aDtcbiAgICAgICAgICAgX3Bvc2l0aW9uICs9IDEpIHtcbiAgICAgICAgX2NoYXJhY3RlciA9IF9yZXN1bHQuY2hhckNvZGVBdChfcG9zaXRpb24pO1xuICAgICAgICBpZiAoIShfY2hhcmFjdGVyID09PSAweDA5IHx8XG4gICAgICAgICAgICAgICgweDIwIDw9IF9jaGFyYWN0ZXIgJiYgX2NoYXJhY3RlciA8PSAweDEwRkZGRikpKSB7XG4gICAgICAgICAgdGhyb3dFcnJvcihzdGF0ZSwgJ2V4cGVjdGVkIHZhbGlkIEpTT04gY2hhcmFjdGVyJyk7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9IGVsc2UgaWYgKFBBVFRFUk5fTk9OX1BSSU5UQUJMRS50ZXN0KF9yZXN1bHQpKSB7XG4gICAgICB0aHJvd0Vycm9yKHN0YXRlLCAndGhlIHN0cmVhbSBjb250YWlucyBub24tcHJpbnRhYmxlIGNoYXJhY3RlcnMnKTtcbiAgICB9XG5cbiAgICBzdGF0ZS5yZXN1bHQgKz0gX3Jlc3VsdDtcbiAgfVxufVxuXG5mdW5jdGlvbiBtZXJnZU1hcHBpbmdzKHN0YXRlLCBkZXN0aW5hdGlvbiwgc291cmNlLCBvdmVycmlkYWJsZUtleXMpIHtcbiAgdmFyIHNvdXJjZUtleXMsIGtleSwgaW5kZXgsIHF1YW50aXR5O1xuXG4gIGlmICghY29tbW9uLmlzT2JqZWN0KHNvdXJjZSkpIHtcbiAgICB0aHJvd0Vycm9yKHN0YXRlLCAnY2Fubm90IG1lcmdlIG1hcHBpbmdzOyB0aGUgcHJvdmlkZWQgc291cmNlIG9iamVjdCBpcyB1bmFjY2VwdGFibGUnKTtcbiAgfVxuXG4gIHNvdXJjZUtleXMgPSBPYmplY3Qua2V5cyhzb3VyY2UpO1xuXG4gIGZvciAoaW5kZXggPSAwLCBxdWFudGl0eSA9IHNvdXJjZUtleXMubGVuZ3RoOyBpbmRleCA8IHF1YW50aXR5OyBpbmRleCArPSAxKSB7XG4gICAga2V5ID0gc291cmNlS2V5c1tpbmRleF07XG5cbiAgICBpZiAoIV9oYXNPd25Qcm9wZXJ0eS5jYWxsKGRlc3RpbmF0aW9uLCBrZXkpKSB7XG4gICAgICBkZXN0aW5hdGlvbltrZXldID0gc291cmNlW2tleV07XG4gICAgICBvdmVycmlkYWJsZUtleXNba2V5XSA9IHRydWU7XG4gICAgfVxuICB9XG59XG5cbmZ1bmN0aW9uIHN0b3JlTWFwcGluZ1BhaXIoc3RhdGUsIF9yZXN1bHQsIG92ZXJyaWRhYmxlS2V5cywga2V5VGFnLCBrZXlOb2RlLCB2YWx1ZU5vZGUpIHtcbiAgdmFyIGluZGV4LCBxdWFudGl0eTtcblxuICBrZXlOb2RlID0gU3RyaW5nKGtleU5vZGUpO1xuXG4gIGlmIChfcmVzdWx0ID09PSBudWxsKSB7XG4gICAgX3Jlc3VsdCA9IHt9O1xuICB9XG5cbiAgaWYgKGtleVRhZyA9PT0gJ3RhZzp5YW1sLm9yZywyMDAyOm1lcmdlJykge1xuICAgIGlmIChBcnJheS5pc0FycmF5KHZhbHVlTm9kZSkpIHtcbiAgICAgIGZvciAoaW5kZXggPSAwLCBxdWFudGl0eSA9IHZhbHVlTm9kZS5sZW5ndGg7IGluZGV4IDwgcXVhbnRpdHk7IGluZGV4ICs9IDEpIHtcbiAgICAgICAgbWVyZ2VNYXBwaW5ncyhzdGF0ZSwgX3Jlc3VsdCwgdmFsdWVOb2RlW2luZGV4XSwgb3ZlcnJpZGFibGVLZXlzKTtcbiAgICAgIH1cbiAgICB9IGVsc2Uge1xuICAgICAgbWVyZ2VNYXBwaW5ncyhzdGF0ZSwgX3Jlc3VsdCwgdmFsdWVOb2RlLCBvdmVycmlkYWJsZUtleXMpO1xuICAgIH1cbiAgfSBlbHNlIHtcbiAgICBpZiAoIXN0YXRlLmpzb24gJiZcbiAgICAgICAgIV9oYXNPd25Qcm9wZXJ0eS5jYWxsKG92ZXJyaWRhYmxlS2V5cywga2V5Tm9kZSkgJiZcbiAgICAgICAgX2hhc093blByb3BlcnR5LmNhbGwoX3Jlc3VsdCwga2V5Tm9kZSkpIHtcbiAgICAgIHRocm93RXJyb3Ioc3RhdGUsICdkdXBsaWNhdGVkIG1hcHBpbmcga2V5Jyk7XG4gICAgfVxuICAgIF9yZXN1bHRba2V5Tm9kZV0gPSB2YWx1ZU5vZGU7XG4gICAgZGVsZXRlIG92ZXJyaWRhYmxlS2V5c1trZXlOb2RlXTtcbiAgfVxuXG4gIHJldHVybiBfcmVzdWx0O1xufVxuXG5mdW5jdGlvbiByZWFkTGluZUJyZWFrKHN0YXRlKSB7XG4gIHZhciBjaDtcblxuICBjaCA9IHN0YXRlLmlucHV0LmNoYXJDb2RlQXQoc3RhdGUucG9zaXRpb24pO1xuXG4gIGlmIChjaCA9PT0gMHgwQS8qIExGICovKSB7XG4gICAgc3RhdGUucG9zaXRpb24rKztcbiAgfSBlbHNlIGlmIChjaCA9PT0gMHgwRC8qIENSICovKSB7XG4gICAgc3RhdGUucG9zaXRpb24rKztcbiAgICBpZiAoc3RhdGUuaW5wdXQuY2hhckNvZGVBdChzdGF0ZS5wb3NpdGlvbikgPT09IDB4MEEvKiBMRiAqLykge1xuICAgICAgc3RhdGUucG9zaXRpb24rKztcbiAgICB9XG4gIH0gZWxzZSB7XG4gICAgdGhyb3dFcnJvcihzdGF0ZSwgJ2EgbGluZSBicmVhayBpcyBleHBlY3RlZCcpO1xuICB9XG5cbiAgc3RhdGUubGluZSArPSAxO1xuICBzdGF0ZS5saW5lU3RhcnQgPSBzdGF0ZS5wb3NpdGlvbjtcbn1cblxuZnVuY3Rpb24gc2tpcFNlcGFyYXRpb25TcGFjZShzdGF0ZSwgYWxsb3dDb21tZW50cywgY2hlY2tJbmRlbnQpIHtcbiAgdmFyIGxpbmVCcmVha3MgPSAwLFxuICAgICAgY2ggPSBzdGF0ZS5pbnB1dC5jaGFyQ29kZUF0KHN0YXRlLnBvc2l0aW9uKTtcblxuICB3aGlsZSAoY2ggIT09IDApIHtcbiAgICB3aGlsZSAoaXNfV0hJVEVfU1BBQ0UoY2gpKSB7XG4gICAgICBjaCA9IHN0YXRlLmlucHV0LmNoYXJDb2RlQXQoKytzdGF0ZS5wb3NpdGlvbik7XG4gICAgfVxuXG4gICAgaWYgKGFsbG93Q29tbWVudHMgJiYgY2ggPT09IDB4MjMvKiAjICovKSB7XG4gICAgICBkbyB7XG4gICAgICAgIGNoID0gc3RhdGUuaW5wdXQuY2hhckNvZGVBdCgrK3N0YXRlLnBvc2l0aW9uKTtcbiAgICAgIH0gd2hpbGUgKGNoICE9PSAweDBBLyogTEYgKi8gJiYgY2ggIT09IDB4MEQvKiBDUiAqLyAmJiBjaCAhPT0gMCk7XG4gICAgfVxuXG4gICAgaWYgKGlzX0VPTChjaCkpIHtcbiAgICAgIHJlYWRMaW5lQnJlYWsoc3RhdGUpO1xuXG4gICAgICBjaCA9IHN0YXRlLmlucHV0LmNoYXJDb2RlQXQoc3RhdGUucG9zaXRpb24pO1xuICAgICAgbGluZUJyZWFrcysrO1xuICAgICAgc3RhdGUubGluZUluZGVudCA9IDA7XG5cbiAgICAgIHdoaWxlIChjaCA9PT0gMHgyMC8qIFNwYWNlICovKSB7XG4gICAgICAgIHN0YXRlLmxpbmVJbmRlbnQrKztcbiAgICAgICAgY2ggPSBzdGF0ZS5pbnB1dC5jaGFyQ29kZUF0KCsrc3RhdGUucG9zaXRpb24pO1xuICAgICAgfVxuICAgIH0gZWxzZSB7XG4gICAgICBicmVhaztcbiAgICB9XG4gIH1cblxuICBpZiAoY2hlY2tJbmRlbnQgIT09IC0xICYmIGxpbmVCcmVha3MgIT09IDAgJiYgc3RhdGUubGluZUluZGVudCA8IGNoZWNrSW5kZW50KSB7XG4gICAgdGhyb3dXYXJuaW5nKHN0YXRlLCAnZGVmaWNpZW50IGluZGVudGF0aW9uJyk7XG4gIH1cblxuICByZXR1cm4gbGluZUJyZWFrcztcbn1cblxuZnVuY3Rpb24gdGVzdERvY3VtZW50U2VwYXJhdG9yKHN0YXRlKSB7XG4gIHZhciBfcG9zaXRpb24gPSBzdGF0ZS5wb3NpdGlvbixcbiAgICAgIGNoO1xuXG4gIGNoID0gc3RhdGUuaW5wdXQuY2hhckNvZGVBdChfcG9zaXRpb24pO1xuXG4gIC8vIENvbmRpdGlvbiBzdGF0ZS5wb3NpdGlvbiA9PT0gc3RhdGUubGluZVN0YXJ0IGlzIHRlc3RlZFxuICAvLyBpbiBwYXJlbnQgb24gZWFjaCBjYWxsLCBmb3IgZWZmaWNpZW5jeS4gTm8gbmVlZHMgdG8gdGVzdCBoZXJlIGFnYWluLlxuICBpZiAoKGNoID09PSAweDJELyogLSAqLyB8fCBjaCA9PT0gMHgyRS8qIC4gKi8pICYmXG4gICAgICBjaCA9PT0gc3RhdGUuaW5wdXQuY2hhckNvZGVBdChfcG9zaXRpb24gKyAxKSAmJlxuICAgICAgY2ggPT09IHN0YXRlLmlucHV0LmNoYXJDb2RlQXQoX3Bvc2l0aW9uICsgMikpIHtcblxuICAgIF9wb3NpdGlvbiArPSAzO1xuXG4gICAgY2ggPSBzdGF0ZS5pbnB1dC5jaGFyQ29kZUF0KF9wb3NpdGlvbik7XG5cbiAgICBpZiAoY2ggPT09IDAgfHwgaXNfV1NfT1JfRU9MKGNoKSkge1xuICAgICAgcmV0dXJuIHRydWU7XG4gICAgfVxuICB9XG5cbiAgcmV0dXJuIGZhbHNlO1xufVxuXG5mdW5jdGlvbiB3cml0ZUZvbGRlZExpbmVzKHN0YXRlLCBjb3VudCkge1xuICBpZiAoY291bnQgPT09IDEpIHtcbiAgICBzdGF0ZS5yZXN1bHQgKz0gJyAnO1xuICB9IGVsc2UgaWYgKGNvdW50ID4gMSkge1xuICAgIHN0YXRlLnJlc3VsdCArPSBjb21tb24ucmVwZWF0KCdcXG4nLCBjb3VudCAtIDEpO1xuICB9XG59XG5cblxuZnVuY3Rpb24gcmVhZFBsYWluU2NhbGFyKHN0YXRlLCBub2RlSW5kZW50LCB3aXRoaW5GbG93Q29sbGVjdGlvbikge1xuICB2YXIgcHJlY2VkaW5nLFxuICAgICAgZm9sbG93aW5nLFxuICAgICAgY2FwdHVyZVN0YXJ0LFxuICAgICAgY2FwdHVyZUVuZCxcbiAgICAgIGhhc1BlbmRpbmdDb250ZW50LFxuICAgICAgX2xpbmUsXG4gICAgICBfbGluZVN0YXJ0LFxuICAgICAgX2xpbmVJbmRlbnQsXG4gICAgICBfa2luZCA9IHN0YXRlLmtpbmQsXG4gICAgICBfcmVzdWx0ID0gc3RhdGUucmVzdWx0LFxuICAgICAgY2g7XG5cbiAgY2ggPSBzdGF0ZS5pbnB1dC5jaGFyQ29kZUF0KHN0YXRlLnBvc2l0aW9uKTtcblxuICBpZiAoaXNfV1NfT1JfRU9MKGNoKSAgICAgIHx8XG4gICAgICBpc19GTE9XX0lORElDQVRPUihjaCkgfHxcbiAgICAgIGNoID09PSAweDIzLyogIyAqLyAgICB8fFxuICAgICAgY2ggPT09IDB4MjYvKiAmICovICAgIHx8XG4gICAgICBjaCA9PT0gMHgyQS8qICogKi8gICAgfHxcbiAgICAgIGNoID09PSAweDIxLyogISAqLyAgICB8fFxuICAgICAgY2ggPT09IDB4N0MvKiB8ICovICAgIHx8XG4gICAgICBjaCA9PT0gMHgzRS8qID4gKi8gICAgfHxcbiAgICAgIGNoID09PSAweDI3LyogJyAqLyAgICB8fFxuICAgICAgY2ggPT09IDB4MjIvKiBcIiAqLyAgICB8fFxuICAgICAgY2ggPT09IDB4MjUvKiAlICovICAgIHx8XG4gICAgICBjaCA9PT0gMHg0MC8qIEAgKi8gICAgfHxcbiAgICAgIGNoID09PSAweDYwLyogYCAqLykge1xuICAgIHJldHVybiBmYWxzZTtcbiAgfVxuXG4gIGlmIChjaCA9PT0gMHgzRi8qID8gKi8gfHwgY2ggPT09IDB4MkQvKiAtICovKSB7XG4gICAgZm9sbG93aW5nID0gc3RhdGUuaW5wdXQuY2hhckNvZGVBdChzdGF0ZS5wb3NpdGlvbiArIDEpO1xuXG4gICAgaWYgKGlzX1dTX09SX0VPTChmb2xsb3dpbmcpIHx8XG4gICAgICAgIHdpdGhpbkZsb3dDb2xsZWN0aW9uICYmIGlzX0ZMT1dfSU5ESUNBVE9SKGZvbGxvd2luZykpIHtcbiAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9XG4gIH1cblxuICBzdGF0ZS5raW5kID0gJ3NjYWxhcic7XG4gIHN0YXRlLnJlc3VsdCA9ICcnO1xuICBjYXB0dXJlU3RhcnQgPSBjYXB0dXJlRW5kID0gc3RhdGUucG9zaXRpb247XG4gIGhhc1BlbmRpbmdDb250ZW50ID0gZmFsc2U7XG5cbiAgd2hpbGUgKGNoICE9PSAwKSB7XG4gICAgaWYgKGNoID09PSAweDNBLyogOiAqLykge1xuICAgICAgZm9sbG93aW5nID0gc3RhdGUuaW5wdXQuY2hhckNvZGVBdChzdGF0ZS5wb3NpdGlvbiArIDEpO1xuXG4gICAgICBpZiAoaXNfV1NfT1JfRU9MKGZvbGxvd2luZykgfHxcbiAgICAgICAgICB3aXRoaW5GbG93Q29sbGVjdGlvbiAmJiBpc19GTE9XX0lORElDQVRPUihmb2xsb3dpbmcpKSB7XG4gICAgICAgIGJyZWFrO1xuICAgICAgfVxuXG4gICAgfSBlbHNlIGlmIChjaCA9PT0gMHgyMy8qICMgKi8pIHtcbiAgICAgIHByZWNlZGluZyA9IHN0YXRlLmlucHV0LmNoYXJDb2RlQXQoc3RhdGUucG9zaXRpb24gLSAxKTtcblxuICAgICAgaWYgKGlzX1dTX09SX0VPTChwcmVjZWRpbmcpKSB7XG4gICAgICAgIGJyZWFrO1xuICAgICAgfVxuXG4gICAgfSBlbHNlIGlmICgoc3RhdGUucG9zaXRpb24gPT09IHN0YXRlLmxpbmVTdGFydCAmJiB0ZXN0RG9jdW1lbnRTZXBhcmF0b3Ioc3RhdGUpKSB8fFxuICAgICAgICAgICAgICAgd2l0aGluRmxvd0NvbGxlY3Rpb24gJiYgaXNfRkxPV19JTkRJQ0FUT1IoY2gpKSB7XG4gICAgICBicmVhaztcblxuICAgIH0gZWxzZSBpZiAoaXNfRU9MKGNoKSkge1xuICAgICAgX2xpbmUgPSBzdGF0ZS5saW5lO1xuICAgICAgX2xpbmVTdGFydCA9IHN0YXRlLmxpbmVTdGFydDtcbiAgICAgIF9saW5lSW5kZW50ID0gc3RhdGUubGluZUluZGVudDtcbiAgICAgIHNraXBTZXBhcmF0aW9uU3BhY2Uoc3RhdGUsIGZhbHNlLCAtMSk7XG5cbiAgICAgIGlmIChzdGF0ZS5saW5lSW5kZW50ID49IG5vZGVJbmRlbnQpIHtcbiAgICAgICAgaGFzUGVuZGluZ0NvbnRlbnQgPSB0cnVlO1xuICAgICAgICBjaCA9IHN0YXRlLmlucHV0LmNoYXJDb2RlQXQoc3RhdGUucG9zaXRpb24pO1xuICAgICAgICBjb250aW51ZTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHN0YXRlLnBvc2l0aW9uID0gY2FwdHVyZUVuZDtcbiAgICAgICAgc3RhdGUubGluZSA9IF9saW5lO1xuICAgICAgICBzdGF0ZS5saW5lU3RhcnQgPSBfbGluZVN0YXJ0O1xuICAgICAgICBzdGF0ZS5saW5lSW5kZW50ID0gX2xpbmVJbmRlbnQ7XG4gICAgICAgIGJyZWFrO1xuICAgICAgfVxuICAgIH1cblxuICAgIGlmIChoYXNQZW5kaW5nQ29udGVudCkge1xuICAgICAgY2FwdHVyZVNlZ21lbnQoc3RhdGUsIGNhcHR1cmVTdGFydCwgY2FwdHVyZUVuZCwgZmFsc2UpO1xuICAgICAgd3JpdGVGb2xkZWRMaW5lcyhzdGF0ZSwgc3RhdGUubGluZSAtIF9saW5lKTtcbiAgICAgIGNhcHR1cmVTdGFydCA9IGNhcHR1cmVFbmQgPSBzdGF0ZS5wb3NpdGlvbjtcbiAgICAgIGhhc1BlbmRpbmdDb250ZW50ID0gZmFsc2U7XG4gICAgfVxuXG4gICAgaWYgKCFpc19XSElURV9TUEFDRShjaCkpIHtcbiAgICAgIGNhcHR1cmVFbmQgPSBzdGF0ZS5wb3NpdGlvbiArIDE7XG4gICAgfVxuXG4gICAgY2ggPSBzdGF0ZS5pbnB1dC5jaGFyQ29kZUF0KCsrc3RhdGUucG9zaXRpb24pO1xuICB9XG5cbiAgY2FwdHVyZVNlZ21lbnQoc3RhdGUsIGNhcHR1cmVTdGFydCwgY2FwdHVyZUVuZCwgZmFsc2UpO1xuXG4gIGlmIChzdGF0ZS5yZXN1bHQpIHtcbiAgICByZXR1cm4gdHJ1ZTtcbiAgfVxuXG4gIHN0YXRlLmtpbmQgPSBfa2luZDtcbiAgc3RhdGUucmVzdWx0ID0gX3Jlc3VsdDtcbiAgcmV0dXJuIGZhbHNlO1xufVxuXG5mdW5jdGlvbiByZWFkU2luZ2xlUXVvdGVkU2NhbGFyKHN0YXRlLCBub2RlSW5kZW50KSB7XG4gIHZhciBjaCxcbiAgICAgIGNhcHR1cmVTdGFydCwgY2FwdHVyZUVuZDtcblxuICBjaCA9IHN0YXRlLmlucHV0LmNoYXJDb2RlQXQoc3RhdGUucG9zaXRpb24pO1xuXG4gIGlmIChjaCAhPT0gMHgyNy8qICcgKi8pIHtcbiAgICByZXR1cm4gZmFsc2U7XG4gIH1cblxuICBzdGF0ZS5raW5kID0gJ3NjYWxhcic7XG4gIHN0YXRlLnJlc3VsdCA9ICcnO1xuICBzdGF0ZS5wb3NpdGlvbisrO1xuICBjYXB0dXJlU3RhcnQgPSBjYXB0dXJlRW5kID0gc3RhdGUucG9zaXRpb247XG5cbiAgd2hpbGUgKChjaCA9IHN0YXRlLmlucHV0LmNoYXJDb2RlQXQoc3RhdGUucG9zaXRpb24pKSAhPT0gMCkge1xuICAgIGlmIChjaCA9PT0gMHgyNy8qICcgKi8pIHtcbiAgICAgIGNhcHR1cmVTZWdtZW50KHN0YXRlLCBjYXB0dXJlU3RhcnQsIHN0YXRlLnBvc2l0aW9uLCB0cnVlKTtcbiAgICAgIGNoID0gc3RhdGUuaW5wdXQuY2hhckNvZGVBdCgrK3N0YXRlLnBvc2l0aW9uKTtcblxuICAgICAgaWYgKGNoID09PSAweDI3LyogJyAqLykge1xuICAgICAgICBjYXB0dXJlU3RhcnQgPSBjYXB0dXJlRW5kID0gc3RhdGUucG9zaXRpb247XG4gICAgICAgIHN0YXRlLnBvc2l0aW9uKys7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICAgIH1cblxuICAgIH0gZWxzZSBpZiAoaXNfRU9MKGNoKSkge1xuICAgICAgY2FwdHVyZVNlZ21lbnQoc3RhdGUsIGNhcHR1cmVTdGFydCwgY2FwdHVyZUVuZCwgdHJ1ZSk7XG4gICAgICB3cml0ZUZvbGRlZExpbmVzKHN0YXRlLCBza2lwU2VwYXJhdGlvblNwYWNlKHN0YXRlLCBmYWxzZSwgbm9kZUluZGVudCkpO1xuICAgICAgY2FwdHVyZVN0YXJ0ID0gY2FwdHVyZUVuZCA9IHN0YXRlLnBvc2l0aW9uO1xuXG4gICAgfSBlbHNlIGlmIChzdGF0ZS5wb3NpdGlvbiA9PT0gc3RhdGUubGluZVN0YXJ0ICYmIHRlc3REb2N1bWVudFNlcGFyYXRvcihzdGF0ZSkpIHtcbiAgICAgIHRocm93RXJyb3Ioc3RhdGUsICd1bmV4cGVjdGVkIGVuZCBvZiB0aGUgZG9jdW1lbnQgd2l0aGluIGEgc2luZ2xlIHF1b3RlZCBzY2FsYXInKTtcblxuICAgIH0gZWxzZSB7XG4gICAgICBzdGF0ZS5wb3NpdGlvbisrO1xuICAgICAgY2FwdHVyZUVuZCA9IHN0YXRlLnBvc2l0aW9uO1xuICAgIH1cbiAgfVxuXG4gIHRocm93RXJyb3Ioc3RhdGUsICd1bmV4cGVjdGVkIGVuZCBvZiB0aGUgc3RyZWFtIHdpdGhpbiBhIHNpbmdsZSBxdW90ZWQgc2NhbGFyJyk7XG59XG5cbmZ1bmN0aW9uIHJlYWREb3VibGVRdW90ZWRTY2FsYXIoc3RhdGUsIG5vZGVJbmRlbnQpIHtcbiAgdmFyIGNhcHR1cmVTdGFydCxcbiAgICAgIGNhcHR1cmVFbmQsXG4gICAgICBoZXhMZW5ndGgsXG4gICAgICBoZXhSZXN1bHQsXG4gICAgICB0bXAsXG4gICAgICBjaDtcblxuICBjaCA9IHN0YXRlLmlucHV0LmNoYXJDb2RlQXQoc3RhdGUucG9zaXRpb24pO1xuXG4gIGlmIChjaCAhPT0gMHgyMi8qIFwiICovKSB7XG4gICAgcmV0dXJuIGZhbHNlO1xuICB9XG5cbiAgc3RhdGUua2luZCA9ICdzY2FsYXInO1xuICBzdGF0ZS5yZXN1bHQgPSAnJztcbiAgc3RhdGUucG9zaXRpb24rKztcbiAgY2FwdHVyZVN0YXJ0ID0gY2FwdHVyZUVuZCA9IHN0YXRlLnBvc2l0aW9uO1xuXG4gIHdoaWxlICgoY2ggPSBzdGF0ZS5pbnB1dC5jaGFyQ29kZUF0KHN0YXRlLnBvc2l0aW9uKSkgIT09IDApIHtcbiAgICBpZiAoY2ggPT09IDB4MjIvKiBcIiAqLykge1xuICAgICAgY2FwdHVyZVNlZ21lbnQoc3RhdGUsIGNhcHR1cmVTdGFydCwgc3RhdGUucG9zaXRpb24sIHRydWUpO1xuICAgICAgc3RhdGUucG9zaXRpb24rKztcbiAgICAgIHJldHVybiB0cnVlO1xuXG4gICAgfSBlbHNlIGlmIChjaCA9PT0gMHg1Qy8qIFxcICovKSB7XG4gICAgICBjYXB0dXJlU2VnbWVudChzdGF0ZSwgY2FwdHVyZVN0YXJ0LCBzdGF0ZS5wb3NpdGlvbiwgdHJ1ZSk7XG4gICAgICBjaCA9IHN0YXRlLmlucHV0LmNoYXJDb2RlQXQoKytzdGF0ZS5wb3NpdGlvbik7XG5cbiAgICAgIGlmIChpc19FT0woY2gpKSB7XG4gICAgICAgIHNraXBTZXBhcmF0aW9uU3BhY2Uoc3RhdGUsIGZhbHNlLCBub2RlSW5kZW50KTtcblxuICAgICAgICAvLyBUT0RPOiByZXdvcmsgdG8gaW5saW5lIGZuIHdpdGggbm8gdHlwZSBjYXN0P1xuICAgICAgfSBlbHNlIGlmIChjaCA8IDI1NiAmJiBzaW1wbGVFc2NhcGVDaGVja1tjaF0pIHtcbiAgICAgICAgc3RhdGUucmVzdWx0ICs9IHNpbXBsZUVzY2FwZU1hcFtjaF07XG4gICAgICAgIHN0YXRlLnBvc2l0aW9uKys7XG5cbiAgICAgIH0gZWxzZSBpZiAoKHRtcCA9IGVzY2FwZWRIZXhMZW4oY2gpKSA+IDApIHtcbiAgICAgICAgaGV4TGVuZ3RoID0gdG1wO1xuICAgICAgICBoZXhSZXN1bHQgPSAwO1xuXG4gICAgICAgIGZvciAoOyBoZXhMZW5ndGggPiAwOyBoZXhMZW5ndGgtLSkge1xuICAgICAgICAgIGNoID0gc3RhdGUuaW5wdXQuY2hhckNvZGVBdCgrK3N0YXRlLnBvc2l0aW9uKTtcblxuICAgICAgICAgIGlmICgodG1wID0gZnJvbUhleENvZGUoY2gpKSA+PSAwKSB7XG4gICAgICAgICAgICBoZXhSZXN1bHQgPSAoaGV4UmVzdWx0IDw8IDQpICsgdG1wO1xuXG4gICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIHRocm93RXJyb3Ioc3RhdGUsICdleHBlY3RlZCBoZXhhZGVjaW1hbCBjaGFyYWN0ZXInKTtcbiAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgICAgICBzdGF0ZS5yZXN1bHQgKz0gY2hhckZyb21Db2RlcG9pbnQoaGV4UmVzdWx0KTtcblxuICAgICAgICBzdGF0ZS5wb3NpdGlvbisrO1xuXG4gICAgICB9IGVsc2Uge1xuICAgICAgICB0aHJvd0Vycm9yKHN0YXRlLCAndW5rbm93biBlc2NhcGUgc2VxdWVuY2UnKTtcbiAgICAgIH1cblxuICAgICAgY2FwdHVyZVN0YXJ0ID0gY2FwdHVyZUVuZCA9IHN0YXRlLnBvc2l0aW9uO1xuXG4gICAgfSBlbHNlIGlmIChpc19FT0woY2gpKSB7XG4gICAgICBjYXB0dXJlU2VnbWVudChzdGF0ZSwgY2FwdHVyZVN0YXJ0LCBjYXB0dXJlRW5kLCB0cnVlKTtcbiAgICAgIHdyaXRlRm9sZGVkTGluZXMoc3RhdGUsIHNraXBTZXBhcmF0aW9uU3BhY2Uoc3RhdGUsIGZhbHNlLCBub2RlSW5kZW50KSk7XG4gICAgICBjYXB0dXJlU3RhcnQgPSBjYXB0dXJlRW5kID0gc3RhdGUucG9zaXRpb247XG5cbiAgICB9IGVsc2UgaWYgKHN0YXRlLnBvc2l0aW9uID09PSBzdGF0ZS5saW5lU3RhcnQgJiYgdGVzdERvY3VtZW50U2VwYXJhdG9yKHN0YXRlKSkge1xuICAgICAgdGhyb3dFcnJvcihzdGF0ZSwgJ3VuZXhwZWN0ZWQgZW5kIG9mIHRoZSBkb2N1bWVudCB3aXRoaW4gYSBkb3VibGUgcXVvdGVkIHNjYWxhcicpO1xuXG4gICAgfSBlbHNlIHtcbiAgICAgIHN0YXRlLnBvc2l0aW9uKys7XG4gICAgICBjYXB0dXJlRW5kID0gc3RhdGUucG9zaXRpb247XG4gICAgfVxuICB9XG5cbiAgdGhyb3dFcnJvcihzdGF0ZSwgJ3VuZXhwZWN0ZWQgZW5kIG9mIHRoZSBzdHJlYW0gd2l0aGluIGEgZG91YmxlIHF1b3RlZCBzY2FsYXInKTtcbn1cblxuZnVuY3Rpb24gcmVhZEZsb3dDb2xsZWN0aW9uKHN0YXRlLCBub2RlSW5kZW50KSB7XG4gIHZhciByZWFkTmV4dCA9IHRydWUsXG4gICAgICBfbGluZSxcbiAgICAgIF90YWcgICAgID0gc3RhdGUudGFnLFxuICAgICAgX3Jlc3VsdCxcbiAgICAgIF9hbmNob3IgID0gc3RhdGUuYW5jaG9yLFxuICAgICAgZm9sbG93aW5nLFxuICAgICAgdGVybWluYXRvcixcbiAgICAgIGlzUGFpcixcbiAgICAgIGlzRXhwbGljaXRQYWlyLFxuICAgICAgaXNNYXBwaW5nLFxuICAgICAgb3ZlcnJpZGFibGVLZXlzID0ge30sXG4gICAgICBrZXlOb2RlLFxuICAgICAga2V5VGFnLFxuICAgICAgdmFsdWVOb2RlLFxuICAgICAgY2g7XG5cbiAgY2ggPSBzdGF0ZS5pbnB1dC5jaGFyQ29kZUF0KHN0YXRlLnBvc2l0aW9uKTtcblxuICBpZiAoY2ggPT09IDB4NUIvKiBbICovKSB7XG4gICAgdGVybWluYXRvciA9IDB4NUQ7LyogXSAqL1xuICAgIGlzTWFwcGluZyA9IGZhbHNlO1xuICAgIF9yZXN1bHQgPSBbXTtcbiAgfSBlbHNlIGlmIChjaCA9PT0gMHg3Qi8qIHsgKi8pIHtcbiAgICB0ZXJtaW5hdG9yID0gMHg3RDsvKiB9ICovXG4gICAgaXNNYXBwaW5nID0gdHJ1ZTtcbiAgICBfcmVzdWx0ID0ge307XG4gIH0gZWxzZSB7XG4gICAgcmV0dXJuIGZhbHNlO1xuICB9XG5cbiAgaWYgKHN0YXRlLmFuY2hvciAhPT0gbnVsbCkge1xuICAgIHN0YXRlLmFuY2hvck1hcFtzdGF0ZS5hbmNob3JdID0gX3Jlc3VsdDtcbiAgfVxuXG4gIGNoID0gc3RhdGUuaW5wdXQuY2hhckNvZGVBdCgrK3N0YXRlLnBvc2l0aW9uKTtcblxuICB3aGlsZSAoY2ggIT09IDApIHtcbiAgICBza2lwU2VwYXJhdGlvblNwYWNlKHN0YXRlLCB0cnVlLCBub2RlSW5kZW50KTtcblxuICAgIGNoID0gc3RhdGUuaW5wdXQuY2hhckNvZGVBdChzdGF0ZS5wb3NpdGlvbik7XG5cbiAgICBpZiAoY2ggPT09IHRlcm1pbmF0b3IpIHtcbiAgICAgIHN0YXRlLnBvc2l0aW9uKys7XG4gICAgICBzdGF0ZS50YWcgPSBfdGFnO1xuICAgICAgc3RhdGUuYW5jaG9yID0gX2FuY2hvcjtcbiAgICAgIHN0YXRlLmtpbmQgPSBpc01hcHBpbmcgPyAnbWFwcGluZycgOiAnc2VxdWVuY2UnO1xuICAgICAgc3RhdGUucmVzdWx0ID0gX3Jlc3VsdDtcbiAgICAgIHJldHVybiB0cnVlO1xuICAgIH0gZWxzZSBpZiAoIXJlYWROZXh0KSB7XG4gICAgICB0aHJvd0Vycm9yKHN0YXRlLCAnbWlzc2VkIGNvbW1hIGJldHdlZW4gZmxvdyBjb2xsZWN0aW9uIGVudHJpZXMnKTtcbiAgICB9XG5cbiAgICBrZXlUYWcgPSBrZXlOb2RlID0gdmFsdWVOb2RlID0gbnVsbDtcbiAgICBpc1BhaXIgPSBpc0V4cGxpY2l0UGFpciA9IGZhbHNlO1xuXG4gICAgaWYgKGNoID09PSAweDNGLyogPyAqLykge1xuICAgICAgZm9sbG93aW5nID0gc3RhdGUuaW5wdXQuY2hhckNvZGVBdChzdGF0ZS5wb3NpdGlvbiArIDEpO1xuXG4gICAgICBpZiAoaXNfV1NfT1JfRU9MKGZvbGxvd2luZykpIHtcbiAgICAgICAgaXNQYWlyID0gaXNFeHBsaWNpdFBhaXIgPSB0cnVlO1xuICAgICAgICBzdGF0ZS5wb3NpdGlvbisrO1xuICAgICAgICBza2lwU2VwYXJhdGlvblNwYWNlKHN0YXRlLCB0cnVlLCBub2RlSW5kZW50KTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICBfbGluZSA9IHN0YXRlLmxpbmU7XG4gICAgY29tcG9zZU5vZGUoc3RhdGUsIG5vZGVJbmRlbnQsIENPTlRFWFRfRkxPV19JTiwgZmFsc2UsIHRydWUpO1xuICAgIGtleVRhZyA9IHN0YXRlLnRhZztcbiAgICBrZXlOb2RlID0gc3RhdGUucmVzdWx0O1xuICAgIHNraXBTZXBhcmF0aW9uU3BhY2Uoc3RhdGUsIHRydWUsIG5vZGVJbmRlbnQpO1xuXG4gICAgY2ggPSBzdGF0ZS5pbnB1dC5jaGFyQ29kZUF0KHN0YXRlLnBvc2l0aW9uKTtcblxuICAgIGlmICgoaXNFeHBsaWNpdFBhaXIgfHwgc3RhdGUubGluZSA9PT0gX2xpbmUpICYmIGNoID09PSAweDNBLyogOiAqLykge1xuICAgICAgaXNQYWlyID0gdHJ1ZTtcbiAgICAgIGNoID0gc3RhdGUuaW5wdXQuY2hhckNvZGVBdCgrK3N0YXRlLnBvc2l0aW9uKTtcbiAgICAgIHNraXBTZXBhcmF0aW9uU3BhY2Uoc3RhdGUsIHRydWUsIG5vZGVJbmRlbnQpO1xuICAgICAgY29tcG9zZU5vZGUoc3RhdGUsIG5vZGVJbmRlbnQsIENPTlRFWFRfRkxPV19JTiwgZmFsc2UsIHRydWUpO1xuICAgICAgdmFsdWVOb2RlID0gc3RhdGUucmVzdWx0O1xuICAgIH1cblxuICAgIGlmIChpc01hcHBpbmcpIHtcbiAgICAgIHN0b3JlTWFwcGluZ1BhaXIoc3RhdGUsIF9yZXN1bHQsIG92ZXJyaWRhYmxlS2V5cywga2V5VGFnLCBrZXlOb2RlLCB2YWx1ZU5vZGUpO1xuICAgIH0gZWxzZSBpZiAoaXNQYWlyKSB7XG4gICAgICBfcmVzdWx0LnB1c2goc3RvcmVNYXBwaW5nUGFpcihzdGF0ZSwgbnVsbCwgb3ZlcnJpZGFibGVLZXlzLCBrZXlUYWcsIGtleU5vZGUsIHZhbHVlTm9kZSkpO1xuICAgIH0gZWxzZSB7XG4gICAgICBfcmVzdWx0LnB1c2goa2V5Tm9kZSk7XG4gICAgfVxuXG4gICAgc2tpcFNlcGFyYXRpb25TcGFjZShzdGF0ZSwgdHJ1ZSwgbm9kZUluZGVudCk7XG5cbiAgICBjaCA9IHN0YXRlLmlucHV0LmNoYXJDb2RlQXQoc3RhdGUucG9zaXRpb24pO1xuXG4gICAgaWYgKGNoID09PSAweDJDLyogLCAqLykge1xuICAgICAgcmVhZE5leHQgPSB0cnVlO1xuICAgICAgY2ggPSBzdGF0ZS5pbnB1dC5jaGFyQ29kZUF0KCsrc3RhdGUucG9zaXRpb24pO1xuICAgIH0gZWxzZSB7XG4gICAgICByZWFkTmV4dCA9IGZhbHNlO1xuICAgIH1cbiAgfVxuXG4gIHRocm93RXJyb3Ioc3RhdGUsICd1bmV4cGVjdGVkIGVuZCBvZiB0aGUgc3RyZWFtIHdpdGhpbiBhIGZsb3cgY29sbGVjdGlvbicpO1xufVxuXG5mdW5jdGlvbiByZWFkQmxvY2tTY2FsYXIoc3RhdGUsIG5vZGVJbmRlbnQpIHtcbiAgdmFyIGNhcHR1cmVTdGFydCxcbiAgICAgIGZvbGRpbmcsXG4gICAgICBjaG9tcGluZyAgICAgICA9IENIT01QSU5HX0NMSVAsXG4gICAgICBkaWRSZWFkQ29udGVudCA9IGZhbHNlLFxuICAgICAgZGV0ZWN0ZWRJbmRlbnQgPSBmYWxzZSxcbiAgICAgIHRleHRJbmRlbnQgICAgID0gbm9kZUluZGVudCxcbiAgICAgIGVtcHR5TGluZXMgICAgID0gMCxcbiAgICAgIGF0TW9yZUluZGVudGVkID0gZmFsc2UsXG4gICAgICB0bXAsXG4gICAgICBjaDtcblxuICBjaCA9IHN0YXRlLmlucHV0LmNoYXJDb2RlQXQoc3RhdGUucG9zaXRpb24pO1xuXG4gIGlmIChjaCA9PT0gMHg3Qy8qIHwgKi8pIHtcbiAgICBmb2xkaW5nID0gZmFsc2U7XG4gIH0gZWxzZSBpZiAoY2ggPT09IDB4M0UvKiA+ICovKSB7XG4gICAgZm9sZGluZyA9IHRydWU7XG4gIH0gZWxzZSB7XG4gICAgcmV0dXJuIGZhbHNlO1xuICB9XG5cbiAgc3RhdGUua2luZCA9ICdzY2FsYXInO1xuICBzdGF0ZS5yZXN1bHQgPSAnJztcblxuICB3aGlsZSAoY2ggIT09IDApIHtcbiAgICBjaCA9IHN0YXRlLmlucHV0LmNoYXJDb2RlQXQoKytzdGF0ZS5wb3NpdGlvbik7XG5cbiAgICBpZiAoY2ggPT09IDB4MkIvKiArICovIHx8IGNoID09PSAweDJELyogLSAqLykge1xuICAgICAgaWYgKENIT01QSU5HX0NMSVAgPT09IGNob21waW5nKSB7XG4gICAgICAgIGNob21waW5nID0gKGNoID09PSAweDJCLyogKyAqLykgPyBDSE9NUElOR19LRUVQIDogQ0hPTVBJTkdfU1RSSVA7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICB0aHJvd0Vycm9yKHN0YXRlLCAncmVwZWF0IG9mIGEgY2hvbXBpbmcgbW9kZSBpZGVudGlmaWVyJyk7XG4gICAgICB9XG5cbiAgICB9IGVsc2UgaWYgKCh0bXAgPSBmcm9tRGVjaW1hbENvZGUoY2gpKSA+PSAwKSB7XG4gICAgICBpZiAodG1wID09PSAwKSB7XG4gICAgICAgIHRocm93RXJyb3Ioc3RhdGUsICdiYWQgZXhwbGljaXQgaW5kZW50YXRpb24gd2lkdGggb2YgYSBibG9jayBzY2FsYXI7IGl0IGNhbm5vdCBiZSBsZXNzIHRoYW4gb25lJyk7XG4gICAgICB9IGVsc2UgaWYgKCFkZXRlY3RlZEluZGVudCkge1xuICAgICAgICB0ZXh0SW5kZW50ID0gbm9kZUluZGVudCArIHRtcCAtIDE7XG4gICAgICAgIGRldGVjdGVkSW5kZW50ID0gdHJ1ZTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHRocm93RXJyb3Ioc3RhdGUsICdyZXBlYXQgb2YgYW4gaW5kZW50YXRpb24gd2lkdGggaWRlbnRpZmllcicpO1xuICAgICAgfVxuXG4gICAgfSBlbHNlIHtcbiAgICAgIGJyZWFrO1xuICAgIH1cbiAgfVxuXG4gIGlmIChpc19XSElURV9TUEFDRShjaCkpIHtcbiAgICBkbyB7IGNoID0gc3RhdGUuaW5wdXQuY2hhckNvZGVBdCgrK3N0YXRlLnBvc2l0aW9uKTsgfVxuICAgIHdoaWxlIChpc19XSElURV9TUEFDRShjaCkpO1xuXG4gICAgaWYgKGNoID09PSAweDIzLyogIyAqLykge1xuICAgICAgZG8geyBjaCA9IHN0YXRlLmlucHV0LmNoYXJDb2RlQXQoKytzdGF0ZS5wb3NpdGlvbik7IH1cbiAgICAgIHdoaWxlICghaXNfRU9MKGNoKSAmJiAoY2ggIT09IDApKTtcbiAgICB9XG4gIH1cblxuICB3aGlsZSAoY2ggIT09IDApIHtcbiAgICByZWFkTGluZUJyZWFrKHN0YXRlKTtcbiAgICBzdGF0ZS5saW5lSW5kZW50ID0gMDtcblxuICAgIGNoID0gc3RhdGUuaW5wdXQuY2hhckNvZGVBdChzdGF0ZS5wb3NpdGlvbik7XG5cbiAgICB3aGlsZSAoKCFkZXRlY3RlZEluZGVudCB8fCBzdGF0ZS5saW5lSW5kZW50IDwgdGV4dEluZGVudCkgJiZcbiAgICAgICAgICAgKGNoID09PSAweDIwLyogU3BhY2UgKi8pKSB7XG4gICAgICBzdGF0ZS5saW5lSW5kZW50Kys7XG4gICAgICBjaCA9IHN0YXRlLmlucHV0LmNoYXJDb2RlQXQoKytzdGF0ZS5wb3NpdGlvbik7XG4gICAgfVxuXG4gICAgaWYgKCFkZXRlY3RlZEluZGVudCAmJiBzdGF0ZS5saW5lSW5kZW50ID4gdGV4dEluZGVudCkge1xuICAgICAgdGV4dEluZGVudCA9IHN0YXRlLmxpbmVJbmRlbnQ7XG4gICAgfVxuXG4gICAgaWYgKGlzX0VPTChjaCkpIHtcbiAgICAgIGVtcHR5TGluZXMrKztcbiAgICAgIGNvbnRpbnVlO1xuICAgIH1cblxuICAgIC8vIEVuZCBvZiB0aGUgc2NhbGFyLlxuICAgIGlmIChzdGF0ZS5saW5lSW5kZW50IDwgdGV4dEluZGVudCkge1xuXG4gICAgICAvLyBQZXJmb3JtIHRoZSBjaG9tcGluZy5cbiAgICAgIGlmIChjaG9tcGluZyA9PT0gQ0hPTVBJTkdfS0VFUCkge1xuICAgICAgICBzdGF0ZS5yZXN1bHQgKz0gY29tbW9uLnJlcGVhdCgnXFxuJywgZGlkUmVhZENvbnRlbnQgPyAxICsgZW1wdHlMaW5lcyA6IGVtcHR5TGluZXMpO1xuICAgICAgfSBlbHNlIGlmIChjaG9tcGluZyA9PT0gQ0hPTVBJTkdfQ0xJUCkge1xuICAgICAgICBpZiAoZGlkUmVhZENvbnRlbnQpIHsgLy8gaS5lLiBvbmx5IGlmIHRoZSBzY2FsYXIgaXMgbm90IGVtcHR5LlxuICAgICAgICAgIHN0YXRlLnJlc3VsdCArPSAnXFxuJztcbiAgICAgICAgfVxuICAgICAgfVxuXG4gICAgICAvLyBCcmVhayB0aGlzIGB3aGlsZWAgY3ljbGUgYW5kIGdvIHRvIHRoZSBmdW5jaXRvbidzIGVwaWxvZ3VlLlxuICAgICAgYnJlYWs7XG4gICAgfVxuXG4gICAgLy8gRm9sZGVkIHN0eWxlOiB1c2UgZmFuY3kgcnVsZXMgdG8gaGFuZGxlIGxpbmUgYnJlYWtzLlxuICAgIGlmIChmb2xkaW5nKSB7XG5cbiAgICAgIC8vIExpbmVzIHN0YXJ0aW5nIHdpdGggd2hpdGUgc3BhY2UgY2hhcmFjdGVycyAobW9yZS1pbmRlbnRlZCBsaW5lcykgYXJlIG5vdCBmb2xkZWQuXG4gICAgICBpZiAoaXNfV0hJVEVfU1BBQ0UoY2gpKSB7XG4gICAgICAgIGF0TW9yZUluZGVudGVkID0gdHJ1ZTtcbiAgICAgICAgLy8gZXhjZXB0IGZvciB0aGUgZmlyc3QgY29udGVudCBsaW5lIChjZi4gRXhhbXBsZSA4LjEpXG4gICAgICAgIHN0YXRlLnJlc3VsdCArPSBjb21tb24ucmVwZWF0KCdcXG4nLCBkaWRSZWFkQ29udGVudCA/IDEgKyBlbXB0eUxpbmVzIDogZW1wdHlMaW5lcyk7XG5cbiAgICAgIC8vIEVuZCBvZiBtb3JlLWluZGVudGVkIGJsb2NrLlxuICAgICAgfSBlbHNlIGlmIChhdE1vcmVJbmRlbnRlZCkge1xuICAgICAgICBhdE1vcmVJbmRlbnRlZCA9IGZhbHNlO1xuICAgICAgICBzdGF0ZS5yZXN1bHQgKz0gY29tbW9uLnJlcGVhdCgnXFxuJywgZW1wdHlMaW5lcyArIDEpO1xuXG4gICAgICAvLyBKdXN0IG9uZSBsaW5lIGJyZWFrIC0gcGVyY2VpdmUgYXMgdGhlIHNhbWUgbGluZS5cbiAgICAgIH0gZWxzZSBpZiAoZW1wdHlMaW5lcyA9PT0gMCkge1xuICAgICAgICBpZiAoZGlkUmVhZENvbnRlbnQpIHsgLy8gaS5lLiBvbmx5IGlmIHdlIGhhdmUgYWxyZWFkeSByZWFkIHNvbWUgc2NhbGFyIGNvbnRlbnQuXG4gICAgICAgICAgc3RhdGUucmVzdWx0ICs9ICcgJztcbiAgICAgICAgfVxuXG4gICAgICAvLyBTZXZlcmFsIGxpbmUgYnJlYWtzIC0gcGVyY2VpdmUgYXMgZGlmZmVyZW50IGxpbmVzLlxuICAgICAgfSBlbHNlIHtcbiAgICAgICAgc3RhdGUucmVzdWx0ICs9IGNvbW1vbi5yZXBlYXQoJ1xcbicsIGVtcHR5TGluZXMpO1xuICAgICAgfVxuXG4gICAgLy8gTGl0ZXJhbCBzdHlsZToganVzdCBhZGQgZXhhY3QgbnVtYmVyIG9mIGxpbmUgYnJlYWtzIGJldHdlZW4gY29udGVudCBsaW5lcy5cbiAgICB9IGVsc2Uge1xuICAgICAgLy8gS2VlcCBhbGwgbGluZSBicmVha3MgZXhjZXB0IHRoZSBoZWFkZXIgbGluZSBicmVhay5cbiAgICAgIHN0YXRlLnJlc3VsdCArPSBjb21tb24ucmVwZWF0KCdcXG4nLCBkaWRSZWFkQ29udGVudCA/IDEgKyBlbXB0eUxpbmVzIDogZW1wdHlMaW5lcyk7XG4gICAgfVxuXG4gICAgZGlkUmVhZENvbnRlbnQgPSB0cnVlO1xuICAgIGRldGVjdGVkSW5kZW50ID0gdHJ1ZTtcbiAgICBlbXB0eUxpbmVzID0gMDtcbiAgICBjYXB0dXJlU3RhcnQgPSBzdGF0ZS5wb3NpdGlvbjtcblxuICAgIHdoaWxlICghaXNfRU9MKGNoKSAmJiAoY2ggIT09IDApKSB7XG4gICAgICBjaCA9IHN0YXRlLmlucHV0LmNoYXJDb2RlQXQoKytzdGF0ZS5wb3NpdGlvbik7XG4gICAgfVxuXG4gICAgY2FwdHVyZVNlZ21lbnQoc3RhdGUsIGNhcHR1cmVTdGFydCwgc3RhdGUucG9zaXRpb24sIGZhbHNlKTtcbiAgfVxuXG4gIHJldHVybiB0cnVlO1xufVxuXG5mdW5jdGlvbiByZWFkQmxvY2tTZXF1ZW5jZShzdGF0ZSwgbm9kZUluZGVudCkge1xuICB2YXIgX2xpbmUsXG4gICAgICBfdGFnICAgICAgPSBzdGF0ZS50YWcsXG4gICAgICBfYW5jaG9yICAgPSBzdGF0ZS5hbmNob3IsXG4gICAgICBfcmVzdWx0ICAgPSBbXSxcbiAgICAgIGZvbGxvd2luZyxcbiAgICAgIGRldGVjdGVkICA9IGZhbHNlLFxuICAgICAgY2g7XG5cbiAgaWYgKHN0YXRlLmFuY2hvciAhPT0gbnVsbCkge1xuICAgIHN0YXRlLmFuY2hvck1hcFtzdGF0ZS5hbmNob3JdID0gX3Jlc3VsdDtcbiAgfVxuXG4gIGNoID0gc3RhdGUuaW5wdXQuY2hhckNvZGVBdChzdGF0ZS5wb3NpdGlvbik7XG5cbiAgd2hpbGUgKGNoICE9PSAwKSB7XG5cbiAgICBpZiAoY2ggIT09IDB4MkQvKiAtICovKSB7XG4gICAgICBicmVhaztcbiAgICB9XG5cbiAgICBmb2xsb3dpbmcgPSBzdGF0ZS5pbnB1dC5jaGFyQ29kZUF0KHN0YXRlLnBvc2l0aW9uICsgMSk7XG5cbiAgICBpZiAoIWlzX1dTX09SX0VPTChmb2xsb3dpbmcpKSB7XG4gICAgICBicmVhaztcbiAgICB9XG5cbiAgICBkZXRlY3RlZCA9IHRydWU7XG4gICAgc3RhdGUucG9zaXRpb24rKztcblxuICAgIGlmIChza2lwU2VwYXJhdGlvblNwYWNlKHN0YXRlLCB0cnVlLCAtMSkpIHtcbiAgICAgIGlmIChzdGF0ZS5saW5lSW5kZW50IDw9IG5vZGVJbmRlbnQpIHtcbiAgICAgICAgX3Jlc3VsdC5wdXNoKG51bGwpO1xuICAgICAgICBjaCA9IHN0YXRlLmlucHV0LmNoYXJDb2RlQXQoc3RhdGUucG9zaXRpb24pO1xuICAgICAgICBjb250aW51ZTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICBfbGluZSA9IHN0YXRlLmxpbmU7XG4gICAgY29tcG9zZU5vZGUoc3RhdGUsIG5vZGVJbmRlbnQsIENPTlRFWFRfQkxPQ0tfSU4sIGZhbHNlLCB0cnVlKTtcbiAgICBfcmVzdWx0LnB1c2goc3RhdGUucmVzdWx0KTtcbiAgICBza2lwU2VwYXJhdGlvblNwYWNlKHN0YXRlLCB0cnVlLCAtMSk7XG5cbiAgICBjaCA9IHN0YXRlLmlucHV0LmNoYXJDb2RlQXQoc3RhdGUucG9zaXRpb24pO1xuXG4gICAgaWYgKChzdGF0ZS5saW5lID09PSBfbGluZSB8fCBzdGF0ZS5saW5lSW5kZW50ID4gbm9kZUluZGVudCkgJiYgKGNoICE9PSAwKSkge1xuICAgICAgdGhyb3dFcnJvcihzdGF0ZSwgJ2JhZCBpbmRlbnRhdGlvbiBvZiBhIHNlcXVlbmNlIGVudHJ5Jyk7XG4gICAgfSBlbHNlIGlmIChzdGF0ZS5saW5lSW5kZW50IDwgbm9kZUluZGVudCkge1xuICAgICAgYnJlYWs7XG4gICAgfVxuICB9XG5cbiAgaWYgKGRldGVjdGVkKSB7XG4gICAgc3RhdGUudGFnID0gX3RhZztcbiAgICBzdGF0ZS5hbmNob3IgPSBfYW5jaG9yO1xuICAgIHN0YXRlLmtpbmQgPSAnc2VxdWVuY2UnO1xuICAgIHN0YXRlLnJlc3VsdCA9IF9yZXN1bHQ7XG4gICAgcmV0dXJuIHRydWU7XG4gIH1cbiAgcmV0dXJuIGZhbHNlO1xufVxuXG5mdW5jdGlvbiByZWFkQmxvY2tNYXBwaW5nKHN0YXRlLCBub2RlSW5kZW50LCBmbG93SW5kZW50KSB7XG4gIHZhciBmb2xsb3dpbmcsXG4gICAgICBhbGxvd0NvbXBhY3QsXG4gICAgICBfbGluZSxcbiAgICAgIF90YWcgICAgICAgICAgPSBzdGF0ZS50YWcsXG4gICAgICBfYW5jaG9yICAgICAgID0gc3RhdGUuYW5jaG9yLFxuICAgICAgX3Jlc3VsdCAgICAgICA9IHt9LFxuICAgICAgb3ZlcnJpZGFibGVLZXlzID0ge30sXG4gICAgICBrZXlUYWcgICAgICAgID0gbnVsbCxcbiAgICAgIGtleU5vZGUgICAgICAgPSBudWxsLFxuICAgICAgdmFsdWVOb2RlICAgICA9IG51bGwsXG4gICAgICBhdEV4cGxpY2l0S2V5ID0gZmFsc2UsXG4gICAgICBkZXRlY3RlZCAgICAgID0gZmFsc2UsXG4gICAgICBjaDtcblxuICBpZiAoc3RhdGUuYW5jaG9yICE9PSBudWxsKSB7XG4gICAgc3RhdGUuYW5jaG9yTWFwW3N0YXRlLmFuY2hvcl0gPSBfcmVzdWx0O1xuICB9XG5cbiAgY2ggPSBzdGF0ZS5pbnB1dC5jaGFyQ29kZUF0KHN0YXRlLnBvc2l0aW9uKTtcblxuICB3aGlsZSAoY2ggIT09IDApIHtcbiAgICBmb2xsb3dpbmcgPSBzdGF0ZS5pbnB1dC5jaGFyQ29kZUF0KHN0YXRlLnBvc2l0aW9uICsgMSk7XG4gICAgX2xpbmUgPSBzdGF0ZS5saW5lOyAvLyBTYXZlIHRoZSBjdXJyZW50IGxpbmUuXG5cbiAgICAvL1xuICAgIC8vIEV4cGxpY2l0IG5vdGF0aW9uIGNhc2UuIFRoZXJlIGFyZSB0d28gc2VwYXJhdGUgYmxvY2tzOlxuICAgIC8vIGZpcnN0IGZvciB0aGUga2V5IChkZW5vdGVkIGJ5IFwiP1wiKSBhbmQgc2Vjb25kIGZvciB0aGUgdmFsdWUgKGRlbm90ZWQgYnkgXCI6XCIpXG4gICAgLy9cbiAgICBpZiAoKGNoID09PSAweDNGLyogPyAqLyB8fCBjaCA9PT0gMHgzQS8qIDogKi8pICYmIGlzX1dTX09SX0VPTChmb2xsb3dpbmcpKSB7XG5cbiAgICAgIGlmIChjaCA9PT0gMHgzRi8qID8gKi8pIHtcbiAgICAgICAgaWYgKGF0RXhwbGljaXRLZXkpIHtcbiAgICAgICAgICBzdG9yZU1hcHBpbmdQYWlyKHN0YXRlLCBfcmVzdWx0LCBvdmVycmlkYWJsZUtleXMsIGtleVRhZywga2V5Tm9kZSwgbnVsbCk7XG4gICAgICAgICAga2V5VGFnID0ga2V5Tm9kZSA9IHZhbHVlTm9kZSA9IG51bGw7XG4gICAgICAgIH1cblxuICAgICAgICBkZXRlY3RlZCA9IHRydWU7XG4gICAgICAgIGF0RXhwbGljaXRLZXkgPSB0cnVlO1xuICAgICAgICBhbGxvd0NvbXBhY3QgPSB0cnVlO1xuXG4gICAgICB9IGVsc2UgaWYgKGF0RXhwbGljaXRLZXkpIHtcbiAgICAgICAgLy8gaS5lLiAweDNBLyogOiAqLyA9PT0gY2hhcmFjdGVyIGFmdGVyIHRoZSBleHBsaWNpdCBrZXkuXG4gICAgICAgIGF0RXhwbGljaXRLZXkgPSBmYWxzZTtcbiAgICAgICAgYWxsb3dDb21wYWN0ID0gdHJ1ZTtcblxuICAgICAgfSBlbHNlIHtcbiAgICAgICAgdGhyb3dFcnJvcihzdGF0ZSwgJ2luY29tcGxldGUgZXhwbGljaXQgbWFwcGluZyBwYWlyOyBhIGtleSBub2RlIGlzIG1pc3NlZCcpO1xuICAgICAgfVxuXG4gICAgICBzdGF0ZS5wb3NpdGlvbiArPSAxO1xuICAgICAgY2ggPSBmb2xsb3dpbmc7XG5cbiAgICAvL1xuICAgIC8vIEltcGxpY2l0IG5vdGF0aW9uIGNhc2UuIEZsb3ctc3R5bGUgbm9kZSBhcyB0aGUga2V5IGZpcnN0LCB0aGVuIFwiOlwiLCBhbmQgdGhlIHZhbHVlLlxuICAgIC8vXG4gICAgfSBlbHNlIGlmIChjb21wb3NlTm9kZShzdGF0ZSwgZmxvd0luZGVudCwgQ09OVEVYVF9GTE9XX09VVCwgZmFsc2UsIHRydWUpKSB7XG5cbiAgICAgIGlmIChzdGF0ZS5saW5lID09PSBfbGluZSkge1xuICAgICAgICBjaCA9IHN0YXRlLmlucHV0LmNoYXJDb2RlQXQoc3RhdGUucG9zaXRpb24pO1xuXG4gICAgICAgIHdoaWxlIChpc19XSElURV9TUEFDRShjaCkpIHtcbiAgICAgICAgICBjaCA9IHN0YXRlLmlucHV0LmNoYXJDb2RlQXQoKytzdGF0ZS5wb3NpdGlvbik7XG4gICAgICAgIH1cblxuICAgICAgICBpZiAoY2ggPT09IDB4M0EvKiA6ICovKSB7XG4gICAgICAgICAgY2ggPSBzdGF0ZS5pbnB1dC5jaGFyQ29kZUF0KCsrc3RhdGUucG9zaXRpb24pO1xuXG4gICAgICAgICAgaWYgKCFpc19XU19PUl9FT0woY2gpKSB7XG4gICAgICAgICAgICB0aHJvd0Vycm9yKHN0YXRlLCAnYSB3aGl0ZXNwYWNlIGNoYXJhY3RlciBpcyBleHBlY3RlZCBhZnRlciB0aGUga2V5LXZhbHVlIHNlcGFyYXRvciB3aXRoaW4gYSBibG9jayBtYXBwaW5nJyk7XG4gICAgICAgICAgfVxuXG4gICAgICAgICAgaWYgKGF0RXhwbGljaXRLZXkpIHtcbiAgICAgICAgICAgIHN0b3JlTWFwcGluZ1BhaXIoc3RhdGUsIF9yZXN1bHQsIG92ZXJyaWRhYmxlS2V5cywga2V5VGFnLCBrZXlOb2RlLCBudWxsKTtcbiAgICAgICAgICAgIGtleVRhZyA9IGtleU5vZGUgPSB2YWx1ZU5vZGUgPSBudWxsO1xuICAgICAgICAgIH1cblxuICAgICAgICAgIGRldGVjdGVkID0gdHJ1ZTtcbiAgICAgICAgICBhdEV4cGxpY2l0S2V5ID0gZmFsc2U7XG4gICAgICAgICAgYWxsb3dDb21wYWN0ID0gZmFsc2U7XG4gICAgICAgICAga2V5VGFnID0gc3RhdGUudGFnO1xuICAgICAgICAgIGtleU5vZGUgPSBzdGF0ZS5yZXN1bHQ7XG5cbiAgICAgICAgfSBlbHNlIGlmIChkZXRlY3RlZCkge1xuICAgICAgICAgIHRocm93RXJyb3Ioc3RhdGUsICdjYW4gbm90IHJlYWQgYW4gaW1wbGljaXQgbWFwcGluZyBwYWlyOyBhIGNvbG9uIGlzIG1pc3NlZCcpO1xuXG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgc3RhdGUudGFnID0gX3RhZztcbiAgICAgICAgICBzdGF0ZS5hbmNob3IgPSBfYW5jaG9yO1xuICAgICAgICAgIHJldHVybiB0cnVlOyAvLyBLZWVwIHRoZSByZXN1bHQgb2YgYGNvbXBvc2VOb2RlYC5cbiAgICAgICAgfVxuXG4gICAgICB9IGVsc2UgaWYgKGRldGVjdGVkKSB7XG4gICAgICAgIHRocm93RXJyb3Ioc3RhdGUsICdjYW4gbm90IHJlYWQgYSBibG9jayBtYXBwaW5nIGVudHJ5OyBhIG11bHRpbGluZSBrZXkgbWF5IG5vdCBiZSBhbiBpbXBsaWNpdCBrZXknKTtcblxuICAgICAgfSBlbHNlIHtcbiAgICAgICAgc3RhdGUudGFnID0gX3RhZztcbiAgICAgICAgc3RhdGUuYW5jaG9yID0gX2FuY2hvcjtcbiAgICAgICAgcmV0dXJuIHRydWU7IC8vIEtlZXAgdGhlIHJlc3VsdCBvZiBgY29tcG9zZU5vZGVgLlxuICAgICAgfVxuXG4gICAgfSBlbHNlIHtcbiAgICAgIGJyZWFrOyAvLyBSZWFkaW5nIGlzIGRvbmUuIEdvIHRvIHRoZSBlcGlsb2d1ZS5cbiAgICB9XG5cbiAgICAvL1xuICAgIC8vIENvbW1vbiByZWFkaW5nIGNvZGUgZm9yIGJvdGggZXhwbGljaXQgYW5kIGltcGxpY2l0IG5vdGF0aW9ucy5cbiAgICAvL1xuICAgIGlmIChzdGF0ZS5saW5lID09PSBfbGluZSB8fCBzdGF0ZS5saW5lSW5kZW50ID4gbm9kZUluZGVudCkge1xuICAgICAgaWYgKGNvbXBvc2VOb2RlKHN0YXRlLCBub2RlSW5kZW50LCBDT05URVhUX0JMT0NLX09VVCwgdHJ1ZSwgYWxsb3dDb21wYWN0KSkge1xuICAgICAgICBpZiAoYXRFeHBsaWNpdEtleSkge1xuICAgICAgICAgIGtleU5vZGUgPSBzdGF0ZS5yZXN1bHQ7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgdmFsdWVOb2RlID0gc3RhdGUucmVzdWx0O1xuICAgICAgICB9XG4gICAgICB9XG5cbiAgICAgIGlmICghYXRFeHBsaWNpdEtleSkge1xuICAgICAgICBzdG9yZU1hcHBpbmdQYWlyKHN0YXRlLCBfcmVzdWx0LCBvdmVycmlkYWJsZUtleXMsIGtleVRhZywga2V5Tm9kZSwgdmFsdWVOb2RlKTtcbiAgICAgICAga2V5VGFnID0ga2V5Tm9kZSA9IHZhbHVlTm9kZSA9IG51bGw7XG4gICAgICB9XG5cbiAgICAgIHNraXBTZXBhcmF0aW9uU3BhY2Uoc3RhdGUsIHRydWUsIC0xKTtcbiAgICAgIGNoID0gc3RhdGUuaW5wdXQuY2hhckNvZGVBdChzdGF0ZS5wb3NpdGlvbik7XG4gICAgfVxuXG4gICAgaWYgKHN0YXRlLmxpbmVJbmRlbnQgPiBub2RlSW5kZW50ICYmIChjaCAhPT0gMCkpIHtcbiAgICAgIHRocm93RXJyb3Ioc3RhdGUsICdiYWQgaW5kZW50YXRpb24gb2YgYSBtYXBwaW5nIGVudHJ5Jyk7XG4gICAgfSBlbHNlIGlmIChzdGF0ZS5saW5lSW5kZW50IDwgbm9kZUluZGVudCkge1xuICAgICAgYnJlYWs7XG4gICAgfVxuICB9XG5cbiAgLy9cbiAgLy8gRXBpbG9ndWUuXG4gIC8vXG5cbiAgLy8gU3BlY2lhbCBjYXNlOiBsYXN0IG1hcHBpbmcncyBub2RlIGNvbnRhaW5zIG9ubHkgdGhlIGtleSBpbiBleHBsaWNpdCBub3RhdGlvbi5cbiAgaWYgKGF0RXhwbGljaXRLZXkpIHtcbiAgICBzdG9yZU1hcHBpbmdQYWlyKHN0YXRlLCBfcmVzdWx0LCBvdmVycmlkYWJsZUtleXMsIGtleVRhZywga2V5Tm9kZSwgbnVsbCk7XG4gIH1cblxuICAvLyBFeHBvc2UgdGhlIHJlc3VsdGluZyBtYXBwaW5nLlxuICBpZiAoZGV0ZWN0ZWQpIHtcbiAgICBzdGF0ZS50YWcgPSBfdGFnO1xuICAgIHN0YXRlLmFuY2hvciA9IF9hbmNob3I7XG4gICAgc3RhdGUua2luZCA9ICdtYXBwaW5nJztcbiAgICBzdGF0ZS5yZXN1bHQgPSBfcmVzdWx0O1xuICB9XG5cbiAgcmV0dXJuIGRldGVjdGVkO1xufVxuXG5mdW5jdGlvbiByZWFkVGFnUHJvcGVydHkoc3RhdGUpIHtcbiAgdmFyIF9wb3NpdGlvbixcbiAgICAgIGlzVmVyYmF0aW0gPSBmYWxzZSxcbiAgICAgIGlzTmFtZWQgICAgPSBmYWxzZSxcbiAgICAgIHRhZ0hhbmRsZSxcbiAgICAgIHRhZ05hbWUsXG4gICAgICBjaDtcblxuICBjaCA9IHN0YXRlLmlucHV0LmNoYXJDb2RlQXQoc3RhdGUucG9zaXRpb24pO1xuXG4gIGlmIChjaCAhPT0gMHgyMS8qICEgKi8pIHJldHVybiBmYWxzZTtcblxuICBpZiAoc3RhdGUudGFnICE9PSBudWxsKSB7XG4gICAgdGhyb3dFcnJvcihzdGF0ZSwgJ2R1cGxpY2F0aW9uIG9mIGEgdGFnIHByb3BlcnR5Jyk7XG4gIH1cblxuICBjaCA9IHN0YXRlLmlucHV0LmNoYXJDb2RlQXQoKytzdGF0ZS5wb3NpdGlvbik7XG5cbiAgaWYgKGNoID09PSAweDNDLyogPCAqLykge1xuICAgIGlzVmVyYmF0aW0gPSB0cnVlO1xuICAgIGNoID0gc3RhdGUuaW5wdXQuY2hhckNvZGVBdCgrK3N0YXRlLnBvc2l0aW9uKTtcblxuICB9IGVsc2UgaWYgKGNoID09PSAweDIxLyogISAqLykge1xuICAgIGlzTmFtZWQgPSB0cnVlO1xuICAgIHRhZ0hhbmRsZSA9ICchISc7XG4gICAgY2ggPSBzdGF0ZS5pbnB1dC5jaGFyQ29kZUF0KCsrc3RhdGUucG9zaXRpb24pO1xuXG4gIH0gZWxzZSB7XG4gICAgdGFnSGFuZGxlID0gJyEnO1xuICB9XG5cbiAgX3Bvc2l0aW9uID0gc3RhdGUucG9zaXRpb247XG5cbiAgaWYgKGlzVmVyYmF0aW0pIHtcbiAgICBkbyB7IGNoID0gc3RhdGUuaW5wdXQuY2hhckNvZGVBdCgrK3N0YXRlLnBvc2l0aW9uKTsgfVxuICAgIHdoaWxlIChjaCAhPT0gMCAmJiBjaCAhPT0gMHgzRS8qID4gKi8pO1xuXG4gICAgaWYgKHN0YXRlLnBvc2l0aW9uIDwgc3RhdGUubGVuZ3RoKSB7XG4gICAgICB0YWdOYW1lID0gc3RhdGUuaW5wdXQuc2xpY2UoX3Bvc2l0aW9uLCBzdGF0ZS5wb3NpdGlvbik7XG4gICAgICBjaCA9IHN0YXRlLmlucHV0LmNoYXJDb2RlQXQoKytzdGF0ZS5wb3NpdGlvbik7XG4gICAgfSBlbHNlIHtcbiAgICAgIHRocm93RXJyb3Ioc3RhdGUsICd1bmV4cGVjdGVkIGVuZCBvZiB0aGUgc3RyZWFtIHdpdGhpbiBhIHZlcmJhdGltIHRhZycpO1xuICAgIH1cbiAgfSBlbHNlIHtcbiAgICB3aGlsZSAoY2ggIT09IDAgJiYgIWlzX1dTX09SX0VPTChjaCkpIHtcblxuICAgICAgaWYgKGNoID09PSAweDIxLyogISAqLykge1xuICAgICAgICBpZiAoIWlzTmFtZWQpIHtcbiAgICAgICAgICB0YWdIYW5kbGUgPSBzdGF0ZS5pbnB1dC5zbGljZShfcG9zaXRpb24gLSAxLCBzdGF0ZS5wb3NpdGlvbiArIDEpO1xuXG4gICAgICAgICAgaWYgKCFQQVRURVJOX1RBR19IQU5ETEUudGVzdCh0YWdIYW5kbGUpKSB7XG4gICAgICAgICAgICB0aHJvd0Vycm9yKHN0YXRlLCAnbmFtZWQgdGFnIGhhbmRsZSBjYW5ub3QgY29udGFpbiBzdWNoIGNoYXJhY3RlcnMnKTtcbiAgICAgICAgICB9XG5cbiAgICAgICAgICBpc05hbWVkID0gdHJ1ZTtcbiAgICAgICAgICBfcG9zaXRpb24gPSBzdGF0ZS5wb3NpdGlvbiArIDE7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgdGhyb3dFcnJvcihzdGF0ZSwgJ3RhZyBzdWZmaXggY2Fubm90IGNvbnRhaW4gZXhjbGFtYXRpb24gbWFya3MnKTtcbiAgICAgICAgfVxuICAgICAgfVxuXG4gICAgICBjaCA9IHN0YXRlLmlucHV0LmNoYXJDb2RlQXQoKytzdGF0ZS5wb3NpdGlvbik7XG4gICAgfVxuXG4gICAgdGFnTmFtZSA9IHN0YXRlLmlucHV0LnNsaWNlKF9wb3NpdGlvbiwgc3RhdGUucG9zaXRpb24pO1xuXG4gICAgaWYgKFBBVFRFUk5fRkxPV19JTkRJQ0FUT1JTLnRlc3QodGFnTmFtZSkpIHtcbiAgICAgIHRocm93RXJyb3Ioc3RhdGUsICd0YWcgc3VmZml4IGNhbm5vdCBjb250YWluIGZsb3cgaW5kaWNhdG9yIGNoYXJhY3RlcnMnKTtcbiAgICB9XG4gIH1cblxuICBpZiAodGFnTmFtZSAmJiAhUEFUVEVSTl9UQUdfVVJJLnRlc3QodGFnTmFtZSkpIHtcbiAgICB0aHJvd0Vycm9yKHN0YXRlLCAndGFnIG5hbWUgY2Fubm90IGNvbnRhaW4gc3VjaCBjaGFyYWN0ZXJzOiAnICsgdGFnTmFtZSk7XG4gIH1cblxuICBpZiAoaXNWZXJiYXRpbSkge1xuICAgIHN0YXRlLnRhZyA9IHRhZ05hbWU7XG5cbiAgfSBlbHNlIGlmIChfaGFzT3duUHJvcGVydHkuY2FsbChzdGF0ZS50YWdNYXAsIHRhZ0hhbmRsZSkpIHtcbiAgICBzdGF0ZS50YWcgPSBzdGF0ZS50YWdNYXBbdGFnSGFuZGxlXSArIHRhZ05hbWU7XG5cbiAgfSBlbHNlIGlmICh0YWdIYW5kbGUgPT09ICchJykge1xuICAgIHN0YXRlLnRhZyA9ICchJyArIHRhZ05hbWU7XG5cbiAgfSBlbHNlIGlmICh0YWdIYW5kbGUgPT09ICchIScpIHtcbiAgICBzdGF0ZS50YWcgPSAndGFnOnlhbWwub3JnLDIwMDI6JyArIHRhZ05hbWU7XG5cbiAgfSBlbHNlIHtcbiAgICB0aHJvd0Vycm9yKHN0YXRlLCAndW5kZWNsYXJlZCB0YWcgaGFuZGxlIFwiJyArIHRhZ0hhbmRsZSArICdcIicpO1xuICB9XG5cbiAgcmV0dXJuIHRydWU7XG59XG5cbmZ1bmN0aW9uIHJlYWRBbmNob3JQcm9wZXJ0eShzdGF0ZSkge1xuICB2YXIgX3Bvc2l0aW9uLFxuICAgICAgY2g7XG5cbiAgY2ggPSBzdGF0ZS5pbnB1dC5jaGFyQ29kZUF0KHN0YXRlLnBvc2l0aW9uKTtcblxuICBpZiAoY2ggIT09IDB4MjYvKiAmICovKSByZXR1cm4gZmFsc2U7XG5cbiAgaWYgKHN0YXRlLmFuY2hvciAhPT0gbnVsbCkge1xuICAgIHRocm93RXJyb3Ioc3RhdGUsICdkdXBsaWNhdGlvbiBvZiBhbiBhbmNob3IgcHJvcGVydHknKTtcbiAgfVxuXG4gIGNoID0gc3RhdGUuaW5wdXQuY2hhckNvZGVBdCgrK3N0YXRlLnBvc2l0aW9uKTtcbiAgX3Bvc2l0aW9uID0gc3RhdGUucG9zaXRpb247XG5cbiAgd2hpbGUgKGNoICE9PSAwICYmICFpc19XU19PUl9FT0woY2gpICYmICFpc19GTE9XX0lORElDQVRPUihjaCkpIHtcbiAgICBjaCA9IHN0YXRlLmlucHV0LmNoYXJDb2RlQXQoKytzdGF0ZS5wb3NpdGlvbik7XG4gIH1cblxuICBpZiAoc3RhdGUucG9zaXRpb24gPT09IF9wb3NpdGlvbikge1xuICAgIHRocm93RXJyb3Ioc3RhdGUsICduYW1lIG9mIGFuIGFuY2hvciBub2RlIG11c3QgY29udGFpbiBhdCBsZWFzdCBvbmUgY2hhcmFjdGVyJyk7XG4gIH1cblxuICBzdGF0ZS5hbmNob3IgPSBzdGF0ZS5pbnB1dC5zbGljZShfcG9zaXRpb24sIHN0YXRlLnBvc2l0aW9uKTtcbiAgcmV0dXJuIHRydWU7XG59XG5cbmZ1bmN0aW9uIHJlYWRBbGlhcyhzdGF0ZSkge1xuICB2YXIgX3Bvc2l0aW9uLCBhbGlhcyxcbiAgICAgIGNoO1xuXG4gIGNoID0gc3RhdGUuaW5wdXQuY2hhckNvZGVBdChzdGF0ZS5wb3NpdGlvbik7XG5cbiAgaWYgKGNoICE9PSAweDJBLyogKiAqLykgcmV0dXJuIGZhbHNlO1xuXG4gIGNoID0gc3RhdGUuaW5wdXQuY2hhckNvZGVBdCgrK3N0YXRlLnBvc2l0aW9uKTtcbiAgX3Bvc2l0aW9uID0gc3RhdGUucG9zaXRpb247XG5cbiAgd2hpbGUgKGNoICE9PSAwICYmICFpc19XU19PUl9FT0woY2gpICYmICFpc19GTE9XX0lORElDQVRPUihjaCkpIHtcbiAgICBjaCA9IHN0YXRlLmlucHV0LmNoYXJDb2RlQXQoKytzdGF0ZS5wb3NpdGlvbik7XG4gIH1cblxuICBpZiAoc3RhdGUucG9zaXRpb24gPT09IF9wb3NpdGlvbikge1xuICAgIHRocm93RXJyb3Ioc3RhdGUsICduYW1lIG9mIGFuIGFsaWFzIG5vZGUgbXVzdCBjb250YWluIGF0IGxlYXN0IG9uZSBjaGFyYWN0ZXInKTtcbiAgfVxuXG4gIGFsaWFzID0gc3RhdGUuaW5wdXQuc2xpY2UoX3Bvc2l0aW9uLCBzdGF0ZS5wb3NpdGlvbik7XG5cbiAgaWYgKCFzdGF0ZS5hbmNob3JNYXAuaGFzT3duUHJvcGVydHkoYWxpYXMpKSB7XG4gICAgdGhyb3dFcnJvcihzdGF0ZSwgJ3VuaWRlbnRpZmllZCBhbGlhcyBcIicgKyBhbGlhcyArICdcIicpO1xuICB9XG5cbiAgc3RhdGUucmVzdWx0ID0gc3RhdGUuYW5jaG9yTWFwW2FsaWFzXTtcbiAgc2tpcFNlcGFyYXRpb25TcGFjZShzdGF0ZSwgdHJ1ZSwgLTEpO1xuICByZXR1cm4gdHJ1ZTtcbn1cblxuZnVuY3Rpb24gY29tcG9zZU5vZGUoc3RhdGUsIHBhcmVudEluZGVudCwgbm9kZUNvbnRleHQsIGFsbG93VG9TZWVrLCBhbGxvd0NvbXBhY3QpIHtcbiAgdmFyIGFsbG93QmxvY2tTdHlsZXMsXG4gICAgICBhbGxvd0Jsb2NrU2NhbGFycyxcbiAgICAgIGFsbG93QmxvY2tDb2xsZWN0aW9ucyxcbiAgICAgIGluZGVudFN0YXR1cyA9IDEsIC8vIDE6IHRoaXM+cGFyZW50LCAwOiB0aGlzPXBhcmVudCwgLTE6IHRoaXM8cGFyZW50XG4gICAgICBhdE5ld0xpbmUgID0gZmFsc2UsXG4gICAgICBoYXNDb250ZW50ID0gZmFsc2UsXG4gICAgICB0eXBlSW5kZXgsXG4gICAgICB0eXBlUXVhbnRpdHksXG4gICAgICB0eXBlLFxuICAgICAgZmxvd0luZGVudCxcbiAgICAgIGJsb2NrSW5kZW50O1xuXG4gIGlmIChzdGF0ZS5saXN0ZW5lciAhPT0gbnVsbCkge1xuICAgIHN0YXRlLmxpc3RlbmVyKCdvcGVuJywgc3RhdGUpO1xuICB9XG5cbiAgc3RhdGUudGFnICAgID0gbnVsbDtcbiAgc3RhdGUuYW5jaG9yID0gbnVsbDtcbiAgc3RhdGUua2luZCAgID0gbnVsbDtcbiAgc3RhdGUucmVzdWx0ID0gbnVsbDtcblxuICBhbGxvd0Jsb2NrU3R5bGVzID0gYWxsb3dCbG9ja1NjYWxhcnMgPSBhbGxvd0Jsb2NrQ29sbGVjdGlvbnMgPVxuICAgIENPTlRFWFRfQkxPQ0tfT1VUID09PSBub2RlQ29udGV4dCB8fFxuICAgIENPTlRFWFRfQkxPQ0tfSU4gID09PSBub2RlQ29udGV4dDtcblxuICBpZiAoYWxsb3dUb1NlZWspIHtcbiAgICBpZiAoc2tpcFNlcGFyYXRpb25TcGFjZShzdGF0ZSwgdHJ1ZSwgLTEpKSB7XG4gICAgICBhdE5ld0xpbmUgPSB0cnVlO1xuXG4gICAgICBpZiAoc3RhdGUubGluZUluZGVudCA+IHBhcmVudEluZGVudCkge1xuICAgICAgICBpbmRlbnRTdGF0dXMgPSAxO1xuICAgICAgfSBlbHNlIGlmIChzdGF0ZS5saW5lSW5kZW50ID09PSBwYXJlbnRJbmRlbnQpIHtcbiAgICAgICAgaW5kZW50U3RhdHVzID0gMDtcbiAgICAgIH0gZWxzZSBpZiAoc3RhdGUubGluZUluZGVudCA8IHBhcmVudEluZGVudCkge1xuICAgICAgICBpbmRlbnRTdGF0dXMgPSAtMTtcbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICBpZiAoaW5kZW50U3RhdHVzID09PSAxKSB7XG4gICAgd2hpbGUgKHJlYWRUYWdQcm9wZXJ0eShzdGF0ZSkgfHwgcmVhZEFuY2hvclByb3BlcnR5KHN0YXRlKSkge1xuICAgICAgaWYgKHNraXBTZXBhcmF0aW9uU3BhY2Uoc3RhdGUsIHRydWUsIC0xKSkge1xuICAgICAgICBhdE5ld0xpbmUgPSB0cnVlO1xuICAgICAgICBhbGxvd0Jsb2NrQ29sbGVjdGlvbnMgPSBhbGxvd0Jsb2NrU3R5bGVzO1xuXG4gICAgICAgIGlmIChzdGF0ZS5saW5lSW5kZW50ID4gcGFyZW50SW5kZW50KSB7XG4gICAgICAgICAgaW5kZW50U3RhdHVzID0gMTtcbiAgICAgICAgfSBlbHNlIGlmIChzdGF0ZS5saW5lSW5kZW50ID09PSBwYXJlbnRJbmRlbnQpIHtcbiAgICAgICAgICBpbmRlbnRTdGF0dXMgPSAwO1xuICAgICAgICB9IGVsc2UgaWYgKHN0YXRlLmxpbmVJbmRlbnQgPCBwYXJlbnRJbmRlbnQpIHtcbiAgICAgICAgICBpbmRlbnRTdGF0dXMgPSAtMTtcbiAgICAgICAgfVxuICAgICAgfSBlbHNlIHtcbiAgICAgICAgYWxsb3dCbG9ja0NvbGxlY3Rpb25zID0gZmFsc2U7XG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgaWYgKGFsbG93QmxvY2tDb2xsZWN0aW9ucykge1xuICAgIGFsbG93QmxvY2tDb2xsZWN0aW9ucyA9IGF0TmV3TGluZSB8fCBhbGxvd0NvbXBhY3Q7XG4gIH1cblxuICBpZiAoaW5kZW50U3RhdHVzID09PSAxIHx8IENPTlRFWFRfQkxPQ0tfT1VUID09PSBub2RlQ29udGV4dCkge1xuICAgIGlmIChDT05URVhUX0ZMT1dfSU4gPT09IG5vZGVDb250ZXh0IHx8IENPTlRFWFRfRkxPV19PVVQgPT09IG5vZGVDb250ZXh0KSB7XG4gICAgICBmbG93SW5kZW50ID0gcGFyZW50SW5kZW50O1xuICAgIH0gZWxzZSB7XG4gICAgICBmbG93SW5kZW50ID0gcGFyZW50SW5kZW50ICsgMTtcbiAgICB9XG5cbiAgICBibG9ja0luZGVudCA9IHN0YXRlLnBvc2l0aW9uIC0gc3RhdGUubGluZVN0YXJ0O1xuXG4gICAgaWYgKGluZGVudFN0YXR1cyA9PT0gMSkge1xuICAgICAgaWYgKGFsbG93QmxvY2tDb2xsZWN0aW9ucyAmJlxuICAgICAgICAgIChyZWFkQmxvY2tTZXF1ZW5jZShzdGF0ZSwgYmxvY2tJbmRlbnQpIHx8XG4gICAgICAgICAgIHJlYWRCbG9ja01hcHBpbmcoc3RhdGUsIGJsb2NrSW5kZW50LCBmbG93SW5kZW50KSkgfHxcbiAgICAgICAgICByZWFkRmxvd0NvbGxlY3Rpb24oc3RhdGUsIGZsb3dJbmRlbnQpKSB7XG4gICAgICAgIGhhc0NvbnRlbnQgPSB0cnVlO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgaWYgKChhbGxvd0Jsb2NrU2NhbGFycyAmJiByZWFkQmxvY2tTY2FsYXIoc3RhdGUsIGZsb3dJbmRlbnQpKSB8fFxuICAgICAgICAgICAgcmVhZFNpbmdsZVF1b3RlZFNjYWxhcihzdGF0ZSwgZmxvd0luZGVudCkgfHxcbiAgICAgICAgICAgIHJlYWREb3VibGVRdW90ZWRTY2FsYXIoc3RhdGUsIGZsb3dJbmRlbnQpKSB7XG4gICAgICAgICAgaGFzQ29udGVudCA9IHRydWU7XG5cbiAgICAgICAgfSBlbHNlIGlmIChyZWFkQWxpYXMoc3RhdGUpKSB7XG4gICAgICAgICAgaGFzQ29udGVudCA9IHRydWU7XG5cbiAgICAgICAgICBpZiAoc3RhdGUudGFnICE9PSBudWxsIHx8IHN0YXRlLmFuY2hvciAhPT0gbnVsbCkge1xuICAgICAgICAgICAgdGhyb3dFcnJvcihzdGF0ZSwgJ2FsaWFzIG5vZGUgc2hvdWxkIG5vdCBoYXZlIGFueSBwcm9wZXJ0aWVzJyk7XG4gICAgICAgICAgfVxuXG4gICAgICAgIH0gZWxzZSBpZiAocmVhZFBsYWluU2NhbGFyKHN0YXRlLCBmbG93SW5kZW50LCBDT05URVhUX0ZMT1dfSU4gPT09IG5vZGVDb250ZXh0KSkge1xuICAgICAgICAgIGhhc0NvbnRlbnQgPSB0cnVlO1xuXG4gICAgICAgICAgaWYgKHN0YXRlLnRhZyA9PT0gbnVsbCkge1xuICAgICAgICAgICAgc3RhdGUudGFnID0gJz8nO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuXG4gICAgICAgIGlmIChzdGF0ZS5hbmNob3IgIT09IG51bGwpIHtcbiAgICAgICAgICBzdGF0ZS5hbmNob3JNYXBbc3RhdGUuYW5jaG9yXSA9IHN0YXRlLnJlc3VsdDtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH0gZWxzZSBpZiAoaW5kZW50U3RhdHVzID09PSAwKSB7XG4gICAgICAvLyBTcGVjaWFsIGNhc2U6IGJsb2NrIHNlcXVlbmNlcyBhcmUgYWxsb3dlZCB0byBoYXZlIHNhbWUgaW5kZW50YXRpb24gbGV2ZWwgYXMgdGhlIHBhcmVudC5cbiAgICAgIC8vIGh0dHA6Ly93d3cueWFtbC5vcmcvc3BlYy8xLjIvc3BlYy5odG1sI2lkMjc5OTc4NFxuICAgICAgaGFzQ29udGVudCA9IGFsbG93QmxvY2tDb2xsZWN0aW9ucyAmJiByZWFkQmxvY2tTZXF1ZW5jZShzdGF0ZSwgYmxvY2tJbmRlbnQpO1xuICAgIH1cbiAgfVxuXG4gIGlmIChzdGF0ZS50YWcgIT09IG51bGwgJiYgc3RhdGUudGFnICE9PSAnIScpIHtcbiAgICBpZiAoc3RhdGUudGFnID09PSAnPycpIHtcbiAgICAgIGZvciAodHlwZUluZGV4ID0gMCwgdHlwZVF1YW50aXR5ID0gc3RhdGUuaW1wbGljaXRUeXBlcy5sZW5ndGg7XG4gICAgICAgICAgIHR5cGVJbmRleCA8IHR5cGVRdWFudGl0eTtcbiAgICAgICAgICAgdHlwZUluZGV4ICs9IDEpIHtcbiAgICAgICAgdHlwZSA9IHN0YXRlLmltcGxpY2l0VHlwZXNbdHlwZUluZGV4XTtcblxuICAgICAgICAvLyBJbXBsaWNpdCByZXNvbHZpbmcgaXMgbm90IGFsbG93ZWQgZm9yIG5vbi1zY2FsYXIgdHlwZXMsIGFuZCAnPydcbiAgICAgICAgLy8gbm9uLXNwZWNpZmljIHRhZyBpcyBvbmx5IGFzc2lnbmVkIHRvIHBsYWluIHNjYWxhcnMuIFNvLCBpdCBpc24ndFxuICAgICAgICAvLyBuZWVkZWQgdG8gY2hlY2sgZm9yICdraW5kJyBjb25mb3JtaXR5LlxuXG4gICAgICAgIGlmICh0eXBlLnJlc29sdmUoc3RhdGUucmVzdWx0KSkgeyAvLyBgc3RhdGUucmVzdWx0YCB1cGRhdGVkIGluIHJlc29sdmVyIGlmIG1hdGNoZWRcbiAgICAgICAgICBzdGF0ZS5yZXN1bHQgPSB0eXBlLmNvbnN0cnVjdChzdGF0ZS5yZXN1bHQpO1xuICAgICAgICAgIHN0YXRlLnRhZyA9IHR5cGUudGFnO1xuICAgICAgICAgIGlmIChzdGF0ZS5hbmNob3IgIT09IG51bGwpIHtcbiAgICAgICAgICAgIHN0YXRlLmFuY2hvck1hcFtzdGF0ZS5hbmNob3JdID0gc3RhdGUucmVzdWx0O1xuICAgICAgICAgIH1cbiAgICAgICAgICBicmVhaztcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH0gZWxzZSBpZiAoX2hhc093blByb3BlcnR5LmNhbGwoc3RhdGUudHlwZU1hcCwgc3RhdGUudGFnKSkge1xuICAgICAgdHlwZSA9IHN0YXRlLnR5cGVNYXBbc3RhdGUudGFnXTtcblxuICAgICAgaWYgKHN0YXRlLnJlc3VsdCAhPT0gbnVsbCAmJiB0eXBlLmtpbmQgIT09IHN0YXRlLmtpbmQpIHtcbiAgICAgICAgdGhyb3dFcnJvcihzdGF0ZSwgJ3VuYWNjZXB0YWJsZSBub2RlIGtpbmQgZm9yICE8JyArIHN0YXRlLnRhZyArICc+IHRhZzsgaXQgc2hvdWxkIGJlIFwiJyArIHR5cGUua2luZCArICdcIiwgbm90IFwiJyArIHN0YXRlLmtpbmQgKyAnXCInKTtcbiAgICAgIH1cblxuICAgICAgaWYgKCF0eXBlLnJlc29sdmUoc3RhdGUucmVzdWx0KSkgeyAvLyBgc3RhdGUucmVzdWx0YCB1cGRhdGVkIGluIHJlc29sdmVyIGlmIG1hdGNoZWRcbiAgICAgICAgdGhyb3dFcnJvcihzdGF0ZSwgJ2Nhbm5vdCByZXNvbHZlIGEgbm9kZSB3aXRoICE8JyArIHN0YXRlLnRhZyArICc+IGV4cGxpY2l0IHRhZycpO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgc3RhdGUucmVzdWx0ID0gdHlwZS5jb25zdHJ1Y3Qoc3RhdGUucmVzdWx0KTtcbiAgICAgICAgaWYgKHN0YXRlLmFuY2hvciAhPT0gbnVsbCkge1xuICAgICAgICAgIHN0YXRlLmFuY2hvck1hcFtzdGF0ZS5hbmNob3JdID0gc3RhdGUucmVzdWx0O1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfSBlbHNlIHtcbiAgICAgIHRocm93RXJyb3Ioc3RhdGUsICd1bmtub3duIHRhZyAhPCcgKyBzdGF0ZS50YWcgKyAnPicpO1xuICAgIH1cbiAgfVxuXG4gIGlmIChzdGF0ZS5saXN0ZW5lciAhPT0gbnVsbCkge1xuICAgIHN0YXRlLmxpc3RlbmVyKCdjbG9zZScsIHN0YXRlKTtcbiAgfVxuICByZXR1cm4gc3RhdGUudGFnICE9PSBudWxsIHx8ICBzdGF0ZS5hbmNob3IgIT09IG51bGwgfHwgaGFzQ29udGVudDtcbn1cblxuZnVuY3Rpb24gcmVhZERvY3VtZW50KHN0YXRlKSB7XG4gIHZhciBkb2N1bWVudFN0YXJ0ID0gc3RhdGUucG9zaXRpb24sXG4gICAgICBfcG9zaXRpb24sXG4gICAgICBkaXJlY3RpdmVOYW1lLFxuICAgICAgZGlyZWN0aXZlQXJncyxcbiAgICAgIGhhc0RpcmVjdGl2ZXMgPSBmYWxzZSxcbiAgICAgIGNoO1xuXG4gIHN0YXRlLnZlcnNpb24gPSBudWxsO1xuICBzdGF0ZS5jaGVja0xpbmVCcmVha3MgPSBzdGF0ZS5sZWdhY3k7XG4gIHN0YXRlLnRhZ01hcCA9IHt9O1xuICBzdGF0ZS5hbmNob3JNYXAgPSB7fTtcblxuICB3aGlsZSAoKGNoID0gc3RhdGUuaW5wdXQuY2hhckNvZGVBdChzdGF0ZS5wb3NpdGlvbikpICE9PSAwKSB7XG4gICAgc2tpcFNlcGFyYXRpb25TcGFjZShzdGF0ZSwgdHJ1ZSwgLTEpO1xuXG4gICAgY2ggPSBzdGF0ZS5pbnB1dC5jaGFyQ29kZUF0KHN0YXRlLnBvc2l0aW9uKTtcblxuICAgIGlmIChzdGF0ZS5saW5lSW5kZW50ID4gMCB8fCBjaCAhPT0gMHgyNS8qICUgKi8pIHtcbiAgICAgIGJyZWFrO1xuICAgIH1cblxuICAgIGhhc0RpcmVjdGl2ZXMgPSB0cnVlO1xuICAgIGNoID0gc3RhdGUuaW5wdXQuY2hhckNvZGVBdCgrK3N0YXRlLnBvc2l0aW9uKTtcbiAgICBfcG9zaXRpb24gPSBzdGF0ZS5wb3NpdGlvbjtcblxuICAgIHdoaWxlIChjaCAhPT0gMCAmJiAhaXNfV1NfT1JfRU9MKGNoKSkge1xuICAgICAgY2ggPSBzdGF0ZS5pbnB1dC5jaGFyQ29kZUF0KCsrc3RhdGUucG9zaXRpb24pO1xuICAgIH1cblxuICAgIGRpcmVjdGl2ZU5hbWUgPSBzdGF0ZS5pbnB1dC5zbGljZShfcG9zaXRpb24sIHN0YXRlLnBvc2l0aW9uKTtcbiAgICBkaXJlY3RpdmVBcmdzID0gW107XG5cbiAgICBpZiAoZGlyZWN0aXZlTmFtZS5sZW5ndGggPCAxKSB7XG4gICAgICB0aHJvd0Vycm9yKHN0YXRlLCAnZGlyZWN0aXZlIG5hbWUgbXVzdCBub3QgYmUgbGVzcyB0aGFuIG9uZSBjaGFyYWN0ZXIgaW4gbGVuZ3RoJyk7XG4gICAgfVxuXG4gICAgd2hpbGUgKGNoICE9PSAwKSB7XG4gICAgICB3aGlsZSAoaXNfV0hJVEVfU1BBQ0UoY2gpKSB7XG4gICAgICAgIGNoID0gc3RhdGUuaW5wdXQuY2hhckNvZGVBdCgrK3N0YXRlLnBvc2l0aW9uKTtcbiAgICAgIH1cblxuICAgICAgaWYgKGNoID09PSAweDIzLyogIyAqLykge1xuICAgICAgICBkbyB7IGNoID0gc3RhdGUuaW5wdXQuY2hhckNvZGVBdCgrK3N0YXRlLnBvc2l0aW9uKTsgfVxuICAgICAgICB3aGlsZSAoY2ggIT09IDAgJiYgIWlzX0VPTChjaCkpO1xuICAgICAgICBicmVhaztcbiAgICAgIH1cblxuICAgICAgaWYgKGlzX0VPTChjaCkpIGJyZWFrO1xuXG4gICAgICBfcG9zaXRpb24gPSBzdGF0ZS5wb3NpdGlvbjtcblxuICAgICAgd2hpbGUgKGNoICE9PSAwICYmICFpc19XU19PUl9FT0woY2gpKSB7XG4gICAgICAgIGNoID0gc3RhdGUuaW5wdXQuY2hhckNvZGVBdCgrK3N0YXRlLnBvc2l0aW9uKTtcbiAgICAgIH1cblxuICAgICAgZGlyZWN0aXZlQXJncy5wdXNoKHN0YXRlLmlucHV0LnNsaWNlKF9wb3NpdGlvbiwgc3RhdGUucG9zaXRpb24pKTtcbiAgICB9XG5cbiAgICBpZiAoY2ggIT09IDApIHJlYWRMaW5lQnJlYWsoc3RhdGUpO1xuXG4gICAgaWYgKF9oYXNPd25Qcm9wZXJ0eS5jYWxsKGRpcmVjdGl2ZUhhbmRsZXJzLCBkaXJlY3RpdmVOYW1lKSkge1xuICAgICAgZGlyZWN0aXZlSGFuZGxlcnNbZGlyZWN0aXZlTmFtZV0oc3RhdGUsIGRpcmVjdGl2ZU5hbWUsIGRpcmVjdGl2ZUFyZ3MpO1xuICAgIH0gZWxzZSB7XG4gICAgICB0aHJvd1dhcm5pbmcoc3RhdGUsICd1bmtub3duIGRvY3VtZW50IGRpcmVjdGl2ZSBcIicgKyBkaXJlY3RpdmVOYW1lICsgJ1wiJyk7XG4gICAgfVxuICB9XG5cbiAgc2tpcFNlcGFyYXRpb25TcGFjZShzdGF0ZSwgdHJ1ZSwgLTEpO1xuXG4gIGlmIChzdGF0ZS5saW5lSW5kZW50ID09PSAwICYmXG4gICAgICBzdGF0ZS5pbnB1dC5jaGFyQ29kZUF0KHN0YXRlLnBvc2l0aW9uKSAgICAgPT09IDB4MkQvKiAtICovICYmXG4gICAgICBzdGF0ZS5pbnB1dC5jaGFyQ29kZUF0KHN0YXRlLnBvc2l0aW9uICsgMSkgPT09IDB4MkQvKiAtICovICYmXG4gICAgICBzdGF0ZS5pbnB1dC5jaGFyQ29kZUF0KHN0YXRlLnBvc2l0aW9uICsgMikgPT09IDB4MkQvKiAtICovKSB7XG4gICAgc3RhdGUucG9zaXRpb24gKz0gMztcbiAgICBza2lwU2VwYXJhdGlvblNwYWNlKHN0YXRlLCB0cnVlLCAtMSk7XG5cbiAgfSBlbHNlIGlmIChoYXNEaXJlY3RpdmVzKSB7XG4gICAgdGhyb3dFcnJvcihzdGF0ZSwgJ2RpcmVjdGl2ZXMgZW5kIG1hcmsgaXMgZXhwZWN0ZWQnKTtcbiAgfVxuXG4gIGNvbXBvc2VOb2RlKHN0YXRlLCBzdGF0ZS5saW5lSW5kZW50IC0gMSwgQ09OVEVYVF9CTE9DS19PVVQsIGZhbHNlLCB0cnVlKTtcbiAgc2tpcFNlcGFyYXRpb25TcGFjZShzdGF0ZSwgdHJ1ZSwgLTEpO1xuXG4gIGlmIChzdGF0ZS5jaGVja0xpbmVCcmVha3MgJiZcbiAgICAgIFBBVFRFUk5fTk9OX0FTQ0lJX0xJTkVfQlJFQUtTLnRlc3Qoc3RhdGUuaW5wdXQuc2xpY2UoZG9jdW1lbnRTdGFydCwgc3RhdGUucG9zaXRpb24pKSkge1xuICAgIHRocm93V2FybmluZyhzdGF0ZSwgJ25vbi1BU0NJSSBsaW5lIGJyZWFrcyBhcmUgaW50ZXJwcmV0ZWQgYXMgY29udGVudCcpO1xuICB9XG5cbiAgc3RhdGUuZG9jdW1lbnRzLnB1c2goc3RhdGUucmVzdWx0KTtcblxuICBpZiAoc3RhdGUucG9zaXRpb24gPT09IHN0YXRlLmxpbmVTdGFydCAmJiB0ZXN0RG9jdW1lbnRTZXBhcmF0b3Ioc3RhdGUpKSB7XG5cbiAgICBpZiAoc3RhdGUuaW5wdXQuY2hhckNvZGVBdChzdGF0ZS5wb3NpdGlvbikgPT09IDB4MkUvKiAuICovKSB7XG4gICAgICBzdGF0ZS5wb3NpdGlvbiArPSAzO1xuICAgICAgc2tpcFNlcGFyYXRpb25TcGFjZShzdGF0ZSwgdHJ1ZSwgLTEpO1xuICAgIH1cbiAgICByZXR1cm47XG4gIH1cblxuICBpZiAoc3RhdGUucG9zaXRpb24gPCAoc3RhdGUubGVuZ3RoIC0gMSkpIHtcbiAgICB0aHJvd0Vycm9yKHN0YXRlLCAnZW5kIG9mIHRoZSBzdHJlYW0gb3IgYSBkb2N1bWVudCBzZXBhcmF0b3IgaXMgZXhwZWN0ZWQnKTtcbiAgfSBlbHNlIHtcbiAgICByZXR1cm47XG4gIH1cbn1cblxuXG5mdW5jdGlvbiBsb2FkRG9jdW1lbnRzKGlucHV0LCBvcHRpb25zKSB7XG4gIGlucHV0ID0gU3RyaW5nKGlucHV0KTtcbiAgb3B0aW9ucyA9IG9wdGlvbnMgfHwge307XG5cbiAgaWYgKGlucHV0Lmxlbmd0aCAhPT0gMCkge1xuXG4gICAgLy8gQWRkIHRhaWxpbmcgYFxcbmAgaWYgbm90IGV4aXN0c1xuICAgIGlmIChpbnB1dC5jaGFyQ29kZUF0KGlucHV0Lmxlbmd0aCAtIDEpICE9PSAweDBBLyogTEYgKi8gJiZcbiAgICAgICAgaW5wdXQuY2hhckNvZGVBdChpbnB1dC5sZW5ndGggLSAxKSAhPT0gMHgwRC8qIENSICovKSB7XG4gICAgICBpbnB1dCArPSAnXFxuJztcbiAgICB9XG5cbiAgICAvLyBTdHJpcCBCT01cbiAgICBpZiAoaW5wdXQuY2hhckNvZGVBdCgwKSA9PT0gMHhGRUZGKSB7XG4gICAgICBpbnB1dCA9IGlucHV0LnNsaWNlKDEpO1xuICAgIH1cbiAgfVxuXG4gIHZhciBzdGF0ZSA9IG5ldyBTdGF0ZShpbnB1dCwgb3B0aW9ucyk7XG5cbiAgLy8gVXNlIDAgYXMgc3RyaW5nIHRlcm1pbmF0b3IuIFRoYXQgc2lnbmlmaWNhbnRseSBzaW1wbGlmaWVzIGJvdW5kcyBjaGVjay5cbiAgc3RhdGUuaW5wdXQgKz0gJ1xcMCc7XG5cbiAgd2hpbGUgKHN0YXRlLmlucHV0LmNoYXJDb2RlQXQoc3RhdGUucG9zaXRpb24pID09PSAweDIwLyogU3BhY2UgKi8pIHtcbiAgICBzdGF0ZS5saW5lSW5kZW50ICs9IDE7XG4gICAgc3RhdGUucG9zaXRpb24gKz0gMTtcbiAgfVxuXG4gIHdoaWxlIChzdGF0ZS5wb3NpdGlvbiA8IChzdGF0ZS5sZW5ndGggLSAxKSkge1xuICAgIHJlYWREb2N1bWVudChzdGF0ZSk7XG4gIH1cblxuICByZXR1cm4gc3RhdGUuZG9jdW1lbnRzO1xufVxuXG5cbmZ1bmN0aW9uIGxvYWRBbGwoaW5wdXQsIGl0ZXJhdG9yLCBvcHRpb25zKSB7XG4gIHZhciBkb2N1bWVudHMgPSBsb2FkRG9jdW1lbnRzKGlucHV0LCBvcHRpb25zKSwgaW5kZXgsIGxlbmd0aDtcblxuICBmb3IgKGluZGV4ID0gMCwgbGVuZ3RoID0gZG9jdW1lbnRzLmxlbmd0aDsgaW5kZXggPCBsZW5ndGg7IGluZGV4ICs9IDEpIHtcbiAgICBpdGVyYXRvcihkb2N1bWVudHNbaW5kZXhdKTtcbiAgfVxufVxuXG5cbmZ1bmN0aW9uIGxvYWQoaW5wdXQsIG9wdGlvbnMpIHtcbiAgdmFyIGRvY3VtZW50cyA9IGxvYWREb2N1bWVudHMoaW5wdXQsIG9wdGlvbnMpO1xuXG4gIGlmIChkb2N1bWVudHMubGVuZ3RoID09PSAwKSB7XG4gICAgLyplc2xpbnQtZGlzYWJsZSBuby11bmRlZmluZWQqL1xuICAgIHJldHVybiB1bmRlZmluZWQ7XG4gIH0gZWxzZSBpZiAoZG9jdW1lbnRzLmxlbmd0aCA9PT0gMSkge1xuICAgIHJldHVybiBkb2N1bWVudHNbMF07XG4gIH1cbiAgdGhyb3cgbmV3IFlBTUxFeGNlcHRpb24oJ2V4cGVjdGVkIGEgc2luZ2xlIGRvY3VtZW50IGluIHRoZSBzdHJlYW0sIGJ1dCBmb3VuZCBtb3JlJyk7XG59XG5cblxuZnVuY3Rpb24gc2FmZUxvYWRBbGwoaW5wdXQsIG91dHB1dCwgb3B0aW9ucykge1xuICBsb2FkQWxsKGlucHV0LCBvdXRwdXQsIGNvbW1vbi5leHRlbmQoeyBzY2hlbWE6IERFRkFVTFRfU0FGRV9TQ0hFTUEgfSwgb3B0aW9ucykpO1xufVxuXG5cbmZ1bmN0aW9uIHNhZmVMb2FkKGlucHV0LCBvcHRpb25zKSB7XG4gIHJldHVybiBsb2FkKGlucHV0LCBjb21tb24uZXh0ZW5kKHsgc2NoZW1hOiBERUZBVUxUX1NBRkVfU0NIRU1BIH0sIG9wdGlvbnMpKTtcbn1cblxuXG5tb2R1bGUuZXhwb3J0cy5sb2FkQWxsICAgICA9IGxvYWRBbGw7XG5tb2R1bGUuZXhwb3J0cy5sb2FkICAgICAgICA9IGxvYWQ7XG5tb2R1bGUuZXhwb3J0cy5zYWZlTG9hZEFsbCA9IHNhZmVMb2FkQWxsO1xubW9kdWxlLmV4cG9ydHMuc2FmZUxvYWQgICAgPSBzYWZlTG9hZDtcbiIsIid1c2Ugc3RyaWN0JztcblxuXG52YXIgY29tbW9uID0gcmVxdWlyZSgnLi9jb21tb24nKTtcblxuXG5mdW5jdGlvbiBNYXJrKG5hbWUsIGJ1ZmZlciwgcG9zaXRpb24sIGxpbmUsIGNvbHVtbikge1xuICB0aGlzLm5hbWUgICAgID0gbmFtZTtcbiAgdGhpcy5idWZmZXIgICA9IGJ1ZmZlcjtcbiAgdGhpcy5wb3NpdGlvbiA9IHBvc2l0aW9uO1xuICB0aGlzLmxpbmUgICAgID0gbGluZTtcbiAgdGhpcy5jb2x1bW4gICA9IGNvbHVtbjtcbn1cblxuXG5NYXJrLnByb3RvdHlwZS5nZXRTbmlwcGV0ID0gZnVuY3Rpb24gZ2V0U25pcHBldChpbmRlbnQsIG1heExlbmd0aCkge1xuICB2YXIgaGVhZCwgc3RhcnQsIHRhaWwsIGVuZCwgc25pcHBldDtcblxuICBpZiAoIXRoaXMuYnVmZmVyKSByZXR1cm4gbnVsbDtcblxuICBpbmRlbnQgPSBpbmRlbnQgfHwgNDtcbiAgbWF4TGVuZ3RoID0gbWF4TGVuZ3RoIHx8IDc1O1xuXG4gIGhlYWQgPSAnJztcbiAgc3RhcnQgPSB0aGlzLnBvc2l0aW9uO1xuXG4gIHdoaWxlIChzdGFydCA+IDAgJiYgJ1xceDAwXFxyXFxuXFx4ODVcXHUyMDI4XFx1MjAyOScuaW5kZXhPZih0aGlzLmJ1ZmZlci5jaGFyQXQoc3RhcnQgLSAxKSkgPT09IC0xKSB7XG4gICAgc3RhcnQgLT0gMTtcbiAgICBpZiAodGhpcy5wb3NpdGlvbiAtIHN0YXJ0ID4gKG1heExlbmd0aCAvIDIgLSAxKSkge1xuICAgICAgaGVhZCA9ICcgLi4uICc7XG4gICAgICBzdGFydCArPSA1O1xuICAgICAgYnJlYWs7XG4gICAgfVxuICB9XG5cbiAgdGFpbCA9ICcnO1xuICBlbmQgPSB0aGlzLnBvc2l0aW9uO1xuXG4gIHdoaWxlIChlbmQgPCB0aGlzLmJ1ZmZlci5sZW5ndGggJiYgJ1xceDAwXFxyXFxuXFx4ODVcXHUyMDI4XFx1MjAyOScuaW5kZXhPZih0aGlzLmJ1ZmZlci5jaGFyQXQoZW5kKSkgPT09IC0xKSB7XG4gICAgZW5kICs9IDE7XG4gICAgaWYgKGVuZCAtIHRoaXMucG9zaXRpb24gPiAobWF4TGVuZ3RoIC8gMiAtIDEpKSB7XG4gICAgICB0YWlsID0gJyAuLi4gJztcbiAgICAgIGVuZCAtPSA1O1xuICAgICAgYnJlYWs7XG4gICAgfVxuICB9XG5cbiAgc25pcHBldCA9IHRoaXMuYnVmZmVyLnNsaWNlKHN0YXJ0LCBlbmQpO1xuXG4gIHJldHVybiBjb21tb24ucmVwZWF0KCcgJywgaW5kZW50KSArIGhlYWQgKyBzbmlwcGV0ICsgdGFpbCArICdcXG4nICtcbiAgICAgICAgIGNvbW1vbi5yZXBlYXQoJyAnLCBpbmRlbnQgKyB0aGlzLnBvc2l0aW9uIC0gc3RhcnQgKyBoZWFkLmxlbmd0aCkgKyAnXic7XG59O1xuXG5cbk1hcmsucHJvdG90eXBlLnRvU3RyaW5nID0gZnVuY3Rpb24gdG9TdHJpbmcoY29tcGFjdCkge1xuICB2YXIgc25pcHBldCwgd2hlcmUgPSAnJztcblxuICBpZiAodGhpcy5uYW1lKSB7XG4gICAgd2hlcmUgKz0gJ2luIFwiJyArIHRoaXMubmFtZSArICdcIiAnO1xuICB9XG5cbiAgd2hlcmUgKz0gJ2F0IGxpbmUgJyArICh0aGlzLmxpbmUgKyAxKSArICcsIGNvbHVtbiAnICsgKHRoaXMuY29sdW1uICsgMSk7XG5cbiAgaWYgKCFjb21wYWN0KSB7XG4gICAgc25pcHBldCA9IHRoaXMuZ2V0U25pcHBldCgpO1xuXG4gICAgaWYgKHNuaXBwZXQpIHtcbiAgICAgIHdoZXJlICs9ICc6XFxuJyArIHNuaXBwZXQ7XG4gICAgfVxuICB9XG5cbiAgcmV0dXJuIHdoZXJlO1xufTtcblxuXG5tb2R1bGUuZXhwb3J0cyA9IE1hcms7XG4iLCIndXNlIHN0cmljdCc7XG5cbi8qZXNsaW50LWRpc2FibGUgbWF4LWxlbiovXG5cbnZhciBjb21tb24gICAgICAgID0gcmVxdWlyZSgnLi9jb21tb24nKTtcbnZhciBZQU1MRXhjZXB0aW9uID0gcmVxdWlyZSgnLi9leGNlcHRpb24nKTtcbnZhciBUeXBlICAgICAgICAgID0gcmVxdWlyZSgnLi90eXBlJyk7XG5cblxuZnVuY3Rpb24gY29tcGlsZUxpc3Qoc2NoZW1hLCBuYW1lLCByZXN1bHQpIHtcbiAgdmFyIGV4Y2x1ZGUgPSBbXTtcblxuICBzY2hlbWEuaW5jbHVkZS5mb3JFYWNoKGZ1bmN0aW9uIChpbmNsdWRlZFNjaGVtYSkge1xuICAgIHJlc3VsdCA9IGNvbXBpbGVMaXN0KGluY2x1ZGVkU2NoZW1hLCBuYW1lLCByZXN1bHQpO1xuICB9KTtcblxuICBzY2hlbWFbbmFtZV0uZm9yRWFjaChmdW5jdGlvbiAoY3VycmVudFR5cGUpIHtcbiAgICByZXN1bHQuZm9yRWFjaChmdW5jdGlvbiAocHJldmlvdXNUeXBlLCBwcmV2aW91c0luZGV4KSB7XG4gICAgICBpZiAocHJldmlvdXNUeXBlLnRhZyA9PT0gY3VycmVudFR5cGUudGFnKSB7XG4gICAgICAgIGV4Y2x1ZGUucHVzaChwcmV2aW91c0luZGV4KTtcbiAgICAgIH1cbiAgICB9KTtcblxuICAgIHJlc3VsdC5wdXNoKGN1cnJlbnRUeXBlKTtcbiAgfSk7XG5cbiAgcmV0dXJuIHJlc3VsdC5maWx0ZXIoZnVuY3Rpb24gKHR5cGUsIGluZGV4KSB7XG4gICAgcmV0dXJuIGV4Y2x1ZGUuaW5kZXhPZihpbmRleCkgPT09IC0xO1xuICB9KTtcbn1cblxuXG5mdW5jdGlvbiBjb21waWxlTWFwKC8qIGxpc3RzLi4uICovKSB7XG4gIHZhciByZXN1bHQgPSB7fSwgaW5kZXgsIGxlbmd0aDtcblxuICBmdW5jdGlvbiBjb2xsZWN0VHlwZSh0eXBlKSB7XG4gICAgcmVzdWx0W3R5cGUudGFnXSA9IHR5cGU7XG4gIH1cblxuICBmb3IgKGluZGV4ID0gMCwgbGVuZ3RoID0gYXJndW1lbnRzLmxlbmd0aDsgaW5kZXggPCBsZW5ndGg7IGluZGV4ICs9IDEpIHtcbiAgICBhcmd1bWVudHNbaW5kZXhdLmZvckVhY2goY29sbGVjdFR5cGUpO1xuICB9XG5cbiAgcmV0dXJuIHJlc3VsdDtcbn1cblxuXG5mdW5jdGlvbiBTY2hlbWEoZGVmaW5pdGlvbikge1xuICB0aGlzLmluY2x1ZGUgID0gZGVmaW5pdGlvbi5pbmNsdWRlICB8fCBbXTtcbiAgdGhpcy5pbXBsaWNpdCA9IGRlZmluaXRpb24uaW1wbGljaXQgfHwgW107XG4gIHRoaXMuZXhwbGljaXQgPSBkZWZpbml0aW9uLmV4cGxpY2l0IHx8IFtdO1xuXG4gIHRoaXMuaW1wbGljaXQuZm9yRWFjaChmdW5jdGlvbiAodHlwZSkge1xuICAgIGlmICh0eXBlLmxvYWRLaW5kICYmIHR5cGUubG9hZEtpbmQgIT09ICdzY2FsYXInKSB7XG4gICAgICB0aHJvdyBuZXcgWUFNTEV4Y2VwdGlvbignVGhlcmUgaXMgYSBub24tc2NhbGFyIHR5cGUgaW4gdGhlIGltcGxpY2l0IGxpc3Qgb2YgYSBzY2hlbWEuIEltcGxpY2l0IHJlc29sdmluZyBvZiBzdWNoIHR5cGVzIGlzIG5vdCBzdXBwb3J0ZWQuJyk7XG4gICAgfVxuICB9KTtcblxuICB0aGlzLmNvbXBpbGVkSW1wbGljaXQgPSBjb21waWxlTGlzdCh0aGlzLCAnaW1wbGljaXQnLCBbXSk7XG4gIHRoaXMuY29tcGlsZWRFeHBsaWNpdCA9IGNvbXBpbGVMaXN0KHRoaXMsICdleHBsaWNpdCcsIFtdKTtcbiAgdGhpcy5jb21waWxlZFR5cGVNYXAgID0gY29tcGlsZU1hcCh0aGlzLmNvbXBpbGVkSW1wbGljaXQsIHRoaXMuY29tcGlsZWRFeHBsaWNpdCk7XG59XG5cblxuU2NoZW1hLkRFRkFVTFQgPSBudWxsO1xuXG5cblNjaGVtYS5jcmVhdGUgPSBmdW5jdGlvbiBjcmVhdGVTY2hlbWEoKSB7XG4gIHZhciBzY2hlbWFzLCB0eXBlcztcblxuICBzd2l0Y2ggKGFyZ3VtZW50cy5sZW5ndGgpIHtcbiAgICBjYXNlIDE6XG4gICAgICBzY2hlbWFzID0gU2NoZW1hLkRFRkFVTFQ7XG4gICAgICB0eXBlcyA9IGFyZ3VtZW50c1swXTtcbiAgICAgIGJyZWFrO1xuXG4gICAgY2FzZSAyOlxuICAgICAgc2NoZW1hcyA9IGFyZ3VtZW50c1swXTtcbiAgICAgIHR5cGVzID0gYXJndW1lbnRzWzFdO1xuICAgICAgYnJlYWs7XG5cbiAgICBkZWZhdWx0OlxuICAgICAgdGhyb3cgbmV3IFlBTUxFeGNlcHRpb24oJ1dyb25nIG51bWJlciBvZiBhcmd1bWVudHMgZm9yIFNjaGVtYS5jcmVhdGUgZnVuY3Rpb24nKTtcbiAgfVxuXG4gIHNjaGVtYXMgPSBjb21tb24udG9BcnJheShzY2hlbWFzKTtcbiAgdHlwZXMgPSBjb21tb24udG9BcnJheSh0eXBlcyk7XG5cbiAgaWYgKCFzY2hlbWFzLmV2ZXJ5KGZ1bmN0aW9uIChzY2hlbWEpIHsgcmV0dXJuIHNjaGVtYSBpbnN0YW5jZW9mIFNjaGVtYTsgfSkpIHtcbiAgICB0aHJvdyBuZXcgWUFNTEV4Y2VwdGlvbignU3BlY2lmaWVkIGxpc3Qgb2Ygc3VwZXIgc2NoZW1hcyAob3IgYSBzaW5nbGUgU2NoZW1hIG9iamVjdCkgY29udGFpbnMgYSBub24tU2NoZW1hIG9iamVjdC4nKTtcbiAgfVxuXG4gIGlmICghdHlwZXMuZXZlcnkoZnVuY3Rpb24gKHR5cGUpIHsgcmV0dXJuIHR5cGUgaW5zdGFuY2VvZiBUeXBlOyB9KSkge1xuICAgIHRocm93IG5ldyBZQU1MRXhjZXB0aW9uKCdTcGVjaWZpZWQgbGlzdCBvZiBZQU1MIHR5cGVzIChvciBhIHNpbmdsZSBUeXBlIG9iamVjdCkgY29udGFpbnMgYSBub24tVHlwZSBvYmplY3QuJyk7XG4gIH1cblxuICByZXR1cm4gbmV3IFNjaGVtYSh7XG4gICAgaW5jbHVkZTogc2NoZW1hcyxcbiAgICBleHBsaWNpdDogdHlwZXNcbiAgfSk7XG59O1xuXG5cbm1vZHVsZS5leHBvcnRzID0gU2NoZW1hO1xuIiwiLy8gU3RhbmRhcmQgWUFNTCdzIENvcmUgc2NoZW1hLlxuLy8gaHR0cDovL3d3dy55YW1sLm9yZy9zcGVjLzEuMi9zcGVjLmh0bWwjaWQyODA0OTIzXG4vL1xuLy8gTk9URTogSlMtWUFNTCBkb2VzIG5vdCBzdXBwb3J0IHNjaGVtYS1zcGVjaWZpYyB0YWcgcmVzb2x1dGlvbiByZXN0cmljdGlvbnMuXG4vLyBTbywgQ29yZSBzY2hlbWEgaGFzIG5vIGRpc3RpbmN0aW9ucyBmcm9tIEpTT04gc2NoZW1hIGlzIEpTLVlBTUwuXG5cblxuJ3VzZSBzdHJpY3QnO1xuXG5cbnZhciBTY2hlbWEgPSByZXF1aXJlKCcuLi9zY2hlbWEnKTtcblxuXG5tb2R1bGUuZXhwb3J0cyA9IG5ldyBTY2hlbWEoe1xuICBpbmNsdWRlOiBbXG4gICAgcmVxdWlyZSgnLi9qc29uJylcbiAgXVxufSk7XG4iLCIvLyBKUy1ZQU1MJ3MgZGVmYXVsdCBzY2hlbWEgZm9yIGBsb2FkYCBmdW5jdGlvbi5cbi8vIEl0IGlzIG5vdCBkZXNjcmliZWQgaW4gdGhlIFlBTUwgc3BlY2lmaWNhdGlvbi5cbi8vXG4vLyBUaGlzIHNjaGVtYSBpcyBiYXNlZCBvbiBKUy1ZQU1MJ3MgZGVmYXVsdCBzYWZlIHNjaGVtYSBhbmQgaW5jbHVkZXNcbi8vIEphdmFTY3JpcHQtc3BlY2lmaWMgdHlwZXM6ICEhanMvdW5kZWZpbmVkLCAhIWpzL3JlZ2V4cCBhbmQgISFqcy9mdW5jdGlvbi5cbi8vXG4vLyBBbHNvIHRoaXMgc2NoZW1hIGlzIHVzZWQgYXMgZGVmYXVsdCBiYXNlIHNjaGVtYSBhdCBgU2NoZW1hLmNyZWF0ZWAgZnVuY3Rpb24uXG5cblxuJ3VzZSBzdHJpY3QnO1xuXG5cbnZhciBTY2hlbWEgPSByZXF1aXJlKCcuLi9zY2hlbWEnKTtcblxuXG5tb2R1bGUuZXhwb3J0cyA9IFNjaGVtYS5ERUZBVUxUID0gbmV3IFNjaGVtYSh7XG4gIGluY2x1ZGU6IFtcbiAgICByZXF1aXJlKCcuL2RlZmF1bHRfc2FmZScpXG4gIF0sXG4gIGV4cGxpY2l0OiBbXG4gICAgcmVxdWlyZSgnLi4vdHlwZS9qcy91bmRlZmluZWQnKSxcbiAgICByZXF1aXJlKCcuLi90eXBlL2pzL3JlZ2V4cCcpLFxuICAgIHJlcXVpcmUoJy4uL3R5cGUvanMvZnVuY3Rpb24nKVxuICBdXG59KTtcbiIsIi8vIEpTLVlBTUwncyBkZWZhdWx0IHNjaGVtYSBmb3IgYHNhZmVMb2FkYCBmdW5jdGlvbi5cbi8vIEl0IGlzIG5vdCBkZXNjcmliZWQgaW4gdGhlIFlBTUwgc3BlY2lmaWNhdGlvbi5cbi8vXG4vLyBUaGlzIHNjaGVtYSBpcyBiYXNlZCBvbiBzdGFuZGFyZCBZQU1MJ3MgQ29yZSBzY2hlbWEgYW5kIGluY2x1ZGVzIG1vc3Qgb2Zcbi8vIGV4dHJhIHR5cGVzIGRlc2NyaWJlZCBhdCBZQU1MIHRhZyByZXBvc2l0b3J5LiAoaHR0cDovL3lhbWwub3JnL3R5cGUvKVxuXG5cbid1c2Ugc3RyaWN0JztcblxuXG52YXIgU2NoZW1hID0gcmVxdWlyZSgnLi4vc2NoZW1hJyk7XG5cblxubW9kdWxlLmV4cG9ydHMgPSBuZXcgU2NoZW1hKHtcbiAgaW5jbHVkZTogW1xuICAgIHJlcXVpcmUoJy4vY29yZScpXG4gIF0sXG4gIGltcGxpY2l0OiBbXG4gICAgcmVxdWlyZSgnLi4vdHlwZS90aW1lc3RhbXAnKSxcbiAgICByZXF1aXJlKCcuLi90eXBlL21lcmdlJylcbiAgXSxcbiAgZXhwbGljaXQ6IFtcbiAgICByZXF1aXJlKCcuLi90eXBlL2JpbmFyeScpLFxuICAgIHJlcXVpcmUoJy4uL3R5cGUvb21hcCcpLFxuICAgIHJlcXVpcmUoJy4uL3R5cGUvcGFpcnMnKSxcbiAgICByZXF1aXJlKCcuLi90eXBlL3NldCcpXG4gIF1cbn0pO1xuIiwiLy8gU3RhbmRhcmQgWUFNTCdzIEZhaWxzYWZlIHNjaGVtYS5cbi8vIGh0dHA6Ly93d3cueWFtbC5vcmcvc3BlYy8xLjIvc3BlYy5odG1sI2lkMjgwMjM0NlxuXG5cbid1c2Ugc3RyaWN0JztcblxuXG52YXIgU2NoZW1hID0gcmVxdWlyZSgnLi4vc2NoZW1hJyk7XG5cblxubW9kdWxlLmV4cG9ydHMgPSBuZXcgU2NoZW1hKHtcbiAgZXhwbGljaXQ6IFtcbiAgICByZXF1aXJlKCcuLi90eXBlL3N0cicpLFxuICAgIHJlcXVpcmUoJy4uL3R5cGUvc2VxJyksXG4gICAgcmVxdWlyZSgnLi4vdHlwZS9tYXAnKVxuICBdXG59KTtcbiIsIi8vIFN0YW5kYXJkIFlBTUwncyBKU09OIHNjaGVtYS5cbi8vIGh0dHA6Ly93d3cueWFtbC5vcmcvc3BlYy8xLjIvc3BlYy5odG1sI2lkMjgwMzIzMVxuLy9cbi8vIE5PVEU6IEpTLVlBTUwgZG9lcyBub3Qgc3VwcG9ydCBzY2hlbWEtc3BlY2lmaWMgdGFnIHJlc29sdXRpb24gcmVzdHJpY3Rpb25zLlxuLy8gU28sIHRoaXMgc2NoZW1hIGlzIG5vdCBzdWNoIHN0cmljdCBhcyBkZWZpbmVkIGluIHRoZSBZQU1MIHNwZWNpZmljYXRpb24uXG4vLyBJdCBhbGxvd3MgbnVtYmVycyBpbiBiaW5hcnkgbm90YWlvbiwgdXNlIGBOdWxsYCBhbmQgYE5VTExgIGFzIGBudWxsYCwgZXRjLlxuXG5cbid1c2Ugc3RyaWN0JztcblxuXG52YXIgU2NoZW1hID0gcmVxdWlyZSgnLi4vc2NoZW1hJyk7XG5cblxubW9kdWxlLmV4cG9ydHMgPSBuZXcgU2NoZW1hKHtcbiAgaW5jbHVkZTogW1xuICAgIHJlcXVpcmUoJy4vZmFpbHNhZmUnKVxuICBdLFxuICBpbXBsaWNpdDogW1xuICAgIHJlcXVpcmUoJy4uL3R5cGUvbnVsbCcpLFxuICAgIHJlcXVpcmUoJy4uL3R5cGUvYm9vbCcpLFxuICAgIHJlcXVpcmUoJy4uL3R5cGUvaW50JyksXG4gICAgcmVxdWlyZSgnLi4vdHlwZS9mbG9hdCcpXG4gIF1cbn0pO1xuIiwiJ3VzZSBzdHJpY3QnO1xuXG52YXIgWUFNTEV4Y2VwdGlvbiA9IHJlcXVpcmUoJy4vZXhjZXB0aW9uJyk7XG5cbnZhciBUWVBFX0NPTlNUUlVDVE9SX09QVElPTlMgPSBbXG4gICdraW5kJyxcbiAgJ3Jlc29sdmUnLFxuICAnY29uc3RydWN0JyxcbiAgJ2luc3RhbmNlT2YnLFxuICAncHJlZGljYXRlJyxcbiAgJ3JlcHJlc2VudCcsXG4gICdkZWZhdWx0U3R5bGUnLFxuICAnc3R5bGVBbGlhc2VzJ1xuXTtcblxudmFyIFlBTUxfTk9ERV9LSU5EUyA9IFtcbiAgJ3NjYWxhcicsXG4gICdzZXF1ZW5jZScsXG4gICdtYXBwaW5nJ1xuXTtcblxuZnVuY3Rpb24gY29tcGlsZVN0eWxlQWxpYXNlcyhtYXApIHtcbiAgdmFyIHJlc3VsdCA9IHt9O1xuXG4gIGlmIChtYXAgIT09IG51bGwpIHtcbiAgICBPYmplY3Qua2V5cyhtYXApLmZvckVhY2goZnVuY3Rpb24gKHN0eWxlKSB7XG4gICAgICBtYXBbc3R5bGVdLmZvckVhY2goZnVuY3Rpb24gKGFsaWFzKSB7XG4gICAgICAgIHJlc3VsdFtTdHJpbmcoYWxpYXMpXSA9IHN0eWxlO1xuICAgICAgfSk7XG4gICAgfSk7XG4gIH1cblxuICByZXR1cm4gcmVzdWx0O1xufVxuXG5mdW5jdGlvbiBUeXBlKHRhZywgb3B0aW9ucykge1xuICBvcHRpb25zID0gb3B0aW9ucyB8fCB7fTtcblxuICBPYmplY3Qua2V5cyhvcHRpb25zKS5mb3JFYWNoKGZ1bmN0aW9uIChuYW1lKSB7XG4gICAgaWYgKFRZUEVfQ09OU1RSVUNUT1JfT1BUSU9OUy5pbmRleE9mKG5hbWUpID09PSAtMSkge1xuICAgICAgdGhyb3cgbmV3IFlBTUxFeGNlcHRpb24oJ1Vua25vd24gb3B0aW9uIFwiJyArIG5hbWUgKyAnXCIgaXMgbWV0IGluIGRlZmluaXRpb24gb2YgXCInICsgdGFnICsgJ1wiIFlBTUwgdHlwZS4nKTtcbiAgICB9XG4gIH0pO1xuXG4gIC8vIFRPRE86IEFkZCB0YWcgZm9ybWF0IGNoZWNrLlxuICB0aGlzLnRhZyAgICAgICAgICA9IHRhZztcbiAgdGhpcy5raW5kICAgICAgICAgPSBvcHRpb25zWydraW5kJ10gICAgICAgICB8fCBudWxsO1xuICB0aGlzLnJlc29sdmUgICAgICA9IG9wdGlvbnNbJ3Jlc29sdmUnXSAgICAgIHx8IGZ1bmN0aW9uICgpIHsgcmV0dXJuIHRydWU7IH07XG4gIHRoaXMuY29uc3RydWN0ICAgID0gb3B0aW9uc1snY29uc3RydWN0J10gICAgfHwgZnVuY3Rpb24gKGRhdGEpIHsgcmV0dXJuIGRhdGE7IH07XG4gIHRoaXMuaW5zdGFuY2VPZiAgID0gb3B0aW9uc1snaW5zdGFuY2VPZiddICAgfHwgbnVsbDtcbiAgdGhpcy5wcmVkaWNhdGUgICAgPSBvcHRpb25zWydwcmVkaWNhdGUnXSAgICB8fCBudWxsO1xuICB0aGlzLnJlcHJlc2VudCAgICA9IG9wdGlvbnNbJ3JlcHJlc2VudCddICAgIHx8IG51bGw7XG4gIHRoaXMuZGVmYXVsdFN0eWxlID0gb3B0aW9uc1snZGVmYXVsdFN0eWxlJ10gfHwgbnVsbDtcbiAgdGhpcy5zdHlsZUFsaWFzZXMgPSBjb21waWxlU3R5bGVBbGlhc2VzKG9wdGlvbnNbJ3N0eWxlQWxpYXNlcyddIHx8IG51bGwpO1xuXG4gIGlmIChZQU1MX05PREVfS0lORFMuaW5kZXhPZih0aGlzLmtpbmQpID09PSAtMSkge1xuICAgIHRocm93IG5ldyBZQU1MRXhjZXB0aW9uKCdVbmtub3duIGtpbmQgXCInICsgdGhpcy5raW5kICsgJ1wiIGlzIHNwZWNpZmllZCBmb3IgXCInICsgdGFnICsgJ1wiIFlBTUwgdHlwZS4nKTtcbiAgfVxufVxuXG5tb2R1bGUuZXhwb3J0cyA9IFR5cGU7XG4iLCIndXNlIHN0cmljdCc7XG5cbi8qZXNsaW50LWRpc2FibGUgbm8tYml0d2lzZSovXG5cbnZhciBOb2RlQnVmZmVyO1xuXG50cnkge1xuICAvLyBBIHRyaWNrIGZvciBicm93c2VyaWZpZWQgdmVyc2lvbiwgdG8gbm90IGluY2x1ZGUgYEJ1ZmZlcmAgc2hpbVxuICB2YXIgX3JlcXVpcmUgPSByZXF1aXJlO1xuICBOb2RlQnVmZmVyID0gX3JlcXVpcmUoJ2J1ZmZlcicpLkJ1ZmZlcjtcbn0gY2F0Y2ggKF9fKSB7fVxuXG52YXIgVHlwZSAgICAgICA9IHJlcXVpcmUoJy4uL3R5cGUnKTtcblxuXG4vLyBbIDY0LCA2NSwgNjYgXSAtPiBbIHBhZGRpbmcsIENSLCBMRiBdXG52YXIgQkFTRTY0X01BUCA9ICdBQkNERUZHSElKS0xNTk9QUVJTVFVWV1hZWmFiY2RlZmdoaWprbG1ub3BxcnN0dXZ3eHl6MDEyMzQ1Njc4OSsvPVxcblxccic7XG5cblxuZnVuY3Rpb24gcmVzb2x2ZVlhbWxCaW5hcnkoZGF0YSkge1xuICBpZiAoZGF0YSA9PT0gbnVsbCkgcmV0dXJuIGZhbHNlO1xuXG4gIHZhciBjb2RlLCBpZHgsIGJpdGxlbiA9IDAsIG1heCA9IGRhdGEubGVuZ3RoLCBtYXAgPSBCQVNFNjRfTUFQO1xuXG4gIC8vIENvbnZlcnQgb25lIGJ5IG9uZS5cbiAgZm9yIChpZHggPSAwOyBpZHggPCBtYXg7IGlkeCsrKSB7XG4gICAgY29kZSA9IG1hcC5pbmRleE9mKGRhdGEuY2hhckF0KGlkeCkpO1xuXG4gICAgLy8gU2tpcCBDUi9MRlxuICAgIGlmIChjb2RlID4gNjQpIGNvbnRpbnVlO1xuXG4gICAgLy8gRmFpbCBvbiBpbGxlZ2FsIGNoYXJhY3RlcnNcbiAgICBpZiAoY29kZSA8IDApIHJldHVybiBmYWxzZTtcblxuICAgIGJpdGxlbiArPSA2O1xuICB9XG5cbiAgLy8gSWYgdGhlcmUgYXJlIGFueSBiaXRzIGxlZnQsIHNvdXJjZSB3YXMgY29ycnVwdGVkXG4gIHJldHVybiAoYml0bGVuICUgOCkgPT09IDA7XG59XG5cbmZ1bmN0aW9uIGNvbnN0cnVjdFlhbWxCaW5hcnkoZGF0YSkge1xuICB2YXIgaWR4LCB0YWlsYml0cyxcbiAgICAgIGlucHV0ID0gZGF0YS5yZXBsYWNlKC9bXFxyXFxuPV0vZywgJycpLCAvLyByZW1vdmUgQ1IvTEYgJiBwYWRkaW5nIHRvIHNpbXBsaWZ5IHNjYW5cbiAgICAgIG1heCA9IGlucHV0Lmxlbmd0aCxcbiAgICAgIG1hcCA9IEJBU0U2NF9NQVAsXG4gICAgICBiaXRzID0gMCxcbiAgICAgIHJlc3VsdCA9IFtdO1xuXG4gIC8vIENvbGxlY3QgYnkgNio0IGJpdHMgKDMgYnl0ZXMpXG5cbiAgZm9yIChpZHggPSAwOyBpZHggPCBtYXg7IGlkeCsrKSB7XG4gICAgaWYgKChpZHggJSA0ID09PSAwKSAmJiBpZHgpIHtcbiAgICAgIHJlc3VsdC5wdXNoKChiaXRzID4+IDE2KSAmIDB4RkYpO1xuICAgICAgcmVzdWx0LnB1c2goKGJpdHMgPj4gOCkgJiAweEZGKTtcbiAgICAgIHJlc3VsdC5wdXNoKGJpdHMgJiAweEZGKTtcbiAgICB9XG5cbiAgICBiaXRzID0gKGJpdHMgPDwgNikgfCBtYXAuaW5kZXhPZihpbnB1dC5jaGFyQXQoaWR4KSk7XG4gIH1cblxuICAvLyBEdW1wIHRhaWxcblxuICB0YWlsYml0cyA9IChtYXggJSA0KSAqIDY7XG5cbiAgaWYgKHRhaWxiaXRzID09PSAwKSB7XG4gICAgcmVzdWx0LnB1c2goKGJpdHMgPj4gMTYpICYgMHhGRik7XG4gICAgcmVzdWx0LnB1c2goKGJpdHMgPj4gOCkgJiAweEZGKTtcbiAgICByZXN1bHQucHVzaChiaXRzICYgMHhGRik7XG4gIH0gZWxzZSBpZiAodGFpbGJpdHMgPT09IDE4KSB7XG4gICAgcmVzdWx0LnB1c2goKGJpdHMgPj4gMTApICYgMHhGRik7XG4gICAgcmVzdWx0LnB1c2goKGJpdHMgPj4gMikgJiAweEZGKTtcbiAgfSBlbHNlIGlmICh0YWlsYml0cyA9PT0gMTIpIHtcbiAgICByZXN1bHQucHVzaCgoYml0cyA+PiA0KSAmIDB4RkYpO1xuICB9XG5cbiAgLy8gV3JhcCBpbnRvIEJ1ZmZlciBmb3IgTm9kZUpTIGFuZCBsZWF2ZSBBcnJheSBmb3IgYnJvd3NlclxuICBpZiAoTm9kZUJ1ZmZlcikgcmV0dXJuIG5ldyBOb2RlQnVmZmVyKHJlc3VsdCk7XG5cbiAgcmV0dXJuIHJlc3VsdDtcbn1cblxuZnVuY3Rpb24gcmVwcmVzZW50WWFtbEJpbmFyeShvYmplY3QgLyosIHN0eWxlKi8pIHtcbiAgdmFyIHJlc3VsdCA9ICcnLCBiaXRzID0gMCwgaWR4LCB0YWlsLFxuICAgICAgbWF4ID0gb2JqZWN0Lmxlbmd0aCxcbiAgICAgIG1hcCA9IEJBU0U2NF9NQVA7XG5cbiAgLy8gQ29udmVydCBldmVyeSB0aHJlZSBieXRlcyB0byA0IEFTQ0lJIGNoYXJhY3RlcnMuXG5cbiAgZm9yIChpZHggPSAwOyBpZHggPCBtYXg7IGlkeCsrKSB7XG4gICAgaWYgKChpZHggJSAzID09PSAwKSAmJiBpZHgpIHtcbiAgICAgIHJlc3VsdCArPSBtYXBbKGJpdHMgPj4gMTgpICYgMHgzRl07XG4gICAgICByZXN1bHQgKz0gbWFwWyhiaXRzID4+IDEyKSAmIDB4M0ZdO1xuICAgICAgcmVzdWx0ICs9IG1hcFsoYml0cyA+PiA2KSAmIDB4M0ZdO1xuICAgICAgcmVzdWx0ICs9IG1hcFtiaXRzICYgMHgzRl07XG4gICAgfVxuXG4gICAgYml0cyA9IChiaXRzIDw8IDgpICsgb2JqZWN0W2lkeF07XG4gIH1cblxuICAvLyBEdW1wIHRhaWxcblxuICB0YWlsID0gbWF4ICUgMztcblxuICBpZiAodGFpbCA9PT0gMCkge1xuICAgIHJlc3VsdCArPSBtYXBbKGJpdHMgPj4gMTgpICYgMHgzRl07XG4gICAgcmVzdWx0ICs9IG1hcFsoYml0cyA+PiAxMikgJiAweDNGXTtcbiAgICByZXN1bHQgKz0gbWFwWyhiaXRzID4+IDYpICYgMHgzRl07XG4gICAgcmVzdWx0ICs9IG1hcFtiaXRzICYgMHgzRl07XG4gIH0gZWxzZSBpZiAodGFpbCA9PT0gMikge1xuICAgIHJlc3VsdCArPSBtYXBbKGJpdHMgPj4gMTApICYgMHgzRl07XG4gICAgcmVzdWx0ICs9IG1hcFsoYml0cyA+PiA0KSAmIDB4M0ZdO1xuICAgIHJlc3VsdCArPSBtYXBbKGJpdHMgPDwgMikgJiAweDNGXTtcbiAgICByZXN1bHQgKz0gbWFwWzY0XTtcbiAgfSBlbHNlIGlmICh0YWlsID09PSAxKSB7XG4gICAgcmVzdWx0ICs9IG1hcFsoYml0cyA+PiAyKSAmIDB4M0ZdO1xuICAgIHJlc3VsdCArPSBtYXBbKGJpdHMgPDwgNCkgJiAweDNGXTtcbiAgICByZXN1bHQgKz0gbWFwWzY0XTtcbiAgICByZXN1bHQgKz0gbWFwWzY0XTtcbiAgfVxuXG4gIHJldHVybiByZXN1bHQ7XG59XG5cbmZ1bmN0aW9uIGlzQmluYXJ5KG9iamVjdCkge1xuICByZXR1cm4gTm9kZUJ1ZmZlciAmJiBOb2RlQnVmZmVyLmlzQnVmZmVyKG9iamVjdCk7XG59XG5cbm1vZHVsZS5leHBvcnRzID0gbmV3IFR5cGUoJ3RhZzp5YW1sLm9yZywyMDAyOmJpbmFyeScsIHtcbiAga2luZDogJ3NjYWxhcicsXG4gIHJlc29sdmU6IHJlc29sdmVZYW1sQmluYXJ5LFxuICBjb25zdHJ1Y3Q6IGNvbnN0cnVjdFlhbWxCaW5hcnksXG4gIHByZWRpY2F0ZTogaXNCaW5hcnksXG4gIHJlcHJlc2VudDogcmVwcmVzZW50WWFtbEJpbmFyeVxufSk7XG4iLCIndXNlIHN0cmljdCc7XG5cbnZhciBUeXBlID0gcmVxdWlyZSgnLi4vdHlwZScpO1xuXG5mdW5jdGlvbiByZXNvbHZlWWFtbEJvb2xlYW4oZGF0YSkge1xuICBpZiAoZGF0YSA9PT0gbnVsbCkgcmV0dXJuIGZhbHNlO1xuXG4gIHZhciBtYXggPSBkYXRhLmxlbmd0aDtcblxuICByZXR1cm4gKG1heCA9PT0gNCAmJiAoZGF0YSA9PT0gJ3RydWUnIHx8IGRhdGEgPT09ICdUcnVlJyB8fCBkYXRhID09PSAnVFJVRScpKSB8fFxuICAgICAgICAgKG1heCA9PT0gNSAmJiAoZGF0YSA9PT0gJ2ZhbHNlJyB8fCBkYXRhID09PSAnRmFsc2UnIHx8IGRhdGEgPT09ICdGQUxTRScpKTtcbn1cblxuZnVuY3Rpb24gY29uc3RydWN0WWFtbEJvb2xlYW4oZGF0YSkge1xuICByZXR1cm4gZGF0YSA9PT0gJ3RydWUnIHx8XG4gICAgICAgICBkYXRhID09PSAnVHJ1ZScgfHxcbiAgICAgICAgIGRhdGEgPT09ICdUUlVFJztcbn1cblxuZnVuY3Rpb24gaXNCb29sZWFuKG9iamVjdCkge1xuICByZXR1cm4gT2JqZWN0LnByb3RvdHlwZS50b1N0cmluZy5jYWxsKG9iamVjdCkgPT09ICdbb2JqZWN0IEJvb2xlYW5dJztcbn1cblxubW9kdWxlLmV4cG9ydHMgPSBuZXcgVHlwZSgndGFnOnlhbWwub3JnLDIwMDI6Ym9vbCcsIHtcbiAga2luZDogJ3NjYWxhcicsXG4gIHJlc29sdmU6IHJlc29sdmVZYW1sQm9vbGVhbixcbiAgY29uc3RydWN0OiBjb25zdHJ1Y3RZYW1sQm9vbGVhbixcbiAgcHJlZGljYXRlOiBpc0Jvb2xlYW4sXG4gIHJlcHJlc2VudDoge1xuICAgIGxvd2VyY2FzZTogZnVuY3Rpb24gKG9iamVjdCkgeyByZXR1cm4gb2JqZWN0ID8gJ3RydWUnIDogJ2ZhbHNlJzsgfSxcbiAgICB1cHBlcmNhc2U6IGZ1bmN0aW9uIChvYmplY3QpIHsgcmV0dXJuIG9iamVjdCA/ICdUUlVFJyA6ICdGQUxTRSc7IH0sXG4gICAgY2FtZWxjYXNlOiBmdW5jdGlvbiAob2JqZWN0KSB7IHJldHVybiBvYmplY3QgPyAnVHJ1ZScgOiAnRmFsc2UnOyB9XG4gIH0sXG4gIGRlZmF1bHRTdHlsZTogJ2xvd2VyY2FzZSdcbn0pO1xuIiwiJ3VzZSBzdHJpY3QnO1xuXG52YXIgY29tbW9uID0gcmVxdWlyZSgnLi4vY29tbW9uJyk7XG52YXIgVHlwZSAgID0gcmVxdWlyZSgnLi4vdHlwZScpO1xuXG52YXIgWUFNTF9GTE9BVF9QQVRURVJOID0gbmV3IFJlZ0V4cChcbiAgJ14oPzpbLStdPyg/OlswLTldWzAtOV9dKilcXFxcLlswLTlfXSooPzpbZUVdWy0rXVswLTldKyk/JyArXG4gICd8XFxcXC5bMC05X10rKD86W2VFXVstK11bMC05XSspPycgK1xuICAnfFstK10/WzAtOV1bMC05X10qKD86OlswLTVdP1swLTldKStcXFxcLlswLTlfXSonICtcbiAgJ3xbLStdP1xcXFwuKD86aW5mfEluZnxJTkYpJyArXG4gICd8XFxcXC4oPzpuYW58TmFOfE5BTikpJCcpO1xuXG5mdW5jdGlvbiByZXNvbHZlWWFtbEZsb2F0KGRhdGEpIHtcbiAgaWYgKGRhdGEgPT09IG51bGwpIHJldHVybiBmYWxzZTtcblxuICBpZiAoIVlBTUxfRkxPQVRfUEFUVEVSTi50ZXN0KGRhdGEpKSByZXR1cm4gZmFsc2U7XG5cbiAgcmV0dXJuIHRydWU7XG59XG5cbmZ1bmN0aW9uIGNvbnN0cnVjdFlhbWxGbG9hdChkYXRhKSB7XG4gIHZhciB2YWx1ZSwgc2lnbiwgYmFzZSwgZGlnaXRzO1xuXG4gIHZhbHVlICA9IGRhdGEucmVwbGFjZSgvXy9nLCAnJykudG9Mb3dlckNhc2UoKTtcbiAgc2lnbiAgID0gdmFsdWVbMF0gPT09ICctJyA/IC0xIDogMTtcbiAgZGlnaXRzID0gW107XG5cbiAgaWYgKCcrLScuaW5kZXhPZih2YWx1ZVswXSkgPj0gMCkge1xuICAgIHZhbHVlID0gdmFsdWUuc2xpY2UoMSk7XG4gIH1cblxuICBpZiAodmFsdWUgPT09ICcuaW5mJykge1xuICAgIHJldHVybiAoc2lnbiA9PT0gMSkgPyBOdW1iZXIuUE9TSVRJVkVfSU5GSU5JVFkgOiBOdW1iZXIuTkVHQVRJVkVfSU5GSU5JVFk7XG5cbiAgfSBlbHNlIGlmICh2YWx1ZSA9PT0gJy5uYW4nKSB7XG4gICAgcmV0dXJuIE5hTjtcblxuICB9IGVsc2UgaWYgKHZhbHVlLmluZGV4T2YoJzonKSA+PSAwKSB7XG4gICAgdmFsdWUuc3BsaXQoJzonKS5mb3JFYWNoKGZ1bmN0aW9uICh2KSB7XG4gICAgICBkaWdpdHMudW5zaGlmdChwYXJzZUZsb2F0KHYsIDEwKSk7XG4gICAgfSk7XG5cbiAgICB2YWx1ZSA9IDAuMDtcbiAgICBiYXNlID0gMTtcblxuICAgIGRpZ2l0cy5mb3JFYWNoKGZ1bmN0aW9uIChkKSB7XG4gICAgICB2YWx1ZSArPSBkICogYmFzZTtcbiAgICAgIGJhc2UgKj0gNjA7XG4gICAgfSk7XG5cbiAgICByZXR1cm4gc2lnbiAqIHZhbHVlO1xuXG4gIH1cbiAgcmV0dXJuIHNpZ24gKiBwYXJzZUZsb2F0KHZhbHVlLCAxMCk7XG59XG5cblxudmFyIFNDSUVOVElGSUNfV0lUSE9VVF9ET1QgPSAvXlstK10/WzAtOV0rZS87XG5cbmZ1bmN0aW9uIHJlcHJlc2VudFlhbWxGbG9hdChvYmplY3QsIHN0eWxlKSB7XG4gIHZhciByZXM7XG5cbiAgaWYgKGlzTmFOKG9iamVjdCkpIHtcbiAgICBzd2l0Y2ggKHN0eWxlKSB7XG4gICAgICBjYXNlICdsb3dlcmNhc2UnOiByZXR1cm4gJy5uYW4nO1xuICAgICAgY2FzZSAndXBwZXJjYXNlJzogcmV0dXJuICcuTkFOJztcbiAgICAgIGNhc2UgJ2NhbWVsY2FzZSc6IHJldHVybiAnLk5hTic7XG4gICAgfVxuICB9IGVsc2UgaWYgKE51bWJlci5QT1NJVElWRV9JTkZJTklUWSA9PT0gb2JqZWN0KSB7XG4gICAgc3dpdGNoIChzdHlsZSkge1xuICAgICAgY2FzZSAnbG93ZXJjYXNlJzogcmV0dXJuICcuaW5mJztcbiAgICAgIGNhc2UgJ3VwcGVyY2FzZSc6IHJldHVybiAnLklORic7XG4gICAgICBjYXNlICdjYW1lbGNhc2UnOiByZXR1cm4gJy5JbmYnO1xuICAgIH1cbiAgfSBlbHNlIGlmIChOdW1iZXIuTkVHQVRJVkVfSU5GSU5JVFkgPT09IG9iamVjdCkge1xuICAgIHN3aXRjaCAoc3R5bGUpIHtcbiAgICAgIGNhc2UgJ2xvd2VyY2FzZSc6IHJldHVybiAnLS5pbmYnO1xuICAgICAgY2FzZSAndXBwZXJjYXNlJzogcmV0dXJuICctLklORic7XG4gICAgICBjYXNlICdjYW1lbGNhc2UnOiByZXR1cm4gJy0uSW5mJztcbiAgICB9XG4gIH0gZWxzZSBpZiAoY29tbW9uLmlzTmVnYXRpdmVaZXJvKG9iamVjdCkpIHtcbiAgICByZXR1cm4gJy0wLjAnO1xuICB9XG5cbiAgcmVzID0gb2JqZWN0LnRvU3RyaW5nKDEwKTtcblxuICAvLyBKUyBzdHJpbmdpZmllciBjYW4gYnVpbGQgc2NpZW50aWZpYyBmb3JtYXQgd2l0aG91dCBkb3RzOiA1ZS0xMDAsXG4gIC8vIHdoaWxlIFlBTUwgcmVxdXJlcyBkb3Q6IDUuZS0xMDAuIEZpeCBpdCB3aXRoIHNpbXBsZSBoYWNrXG5cbiAgcmV0dXJuIFNDSUVOVElGSUNfV0lUSE9VVF9ET1QudGVzdChyZXMpID8gcmVzLnJlcGxhY2UoJ2UnLCAnLmUnKSA6IHJlcztcbn1cblxuZnVuY3Rpb24gaXNGbG9hdChvYmplY3QpIHtcbiAgcmV0dXJuIChPYmplY3QucHJvdG90eXBlLnRvU3RyaW5nLmNhbGwob2JqZWN0KSA9PT0gJ1tvYmplY3QgTnVtYmVyXScpICYmXG4gICAgICAgICAob2JqZWN0ICUgMSAhPT0gMCB8fCBjb21tb24uaXNOZWdhdGl2ZVplcm8ob2JqZWN0KSk7XG59XG5cbm1vZHVsZS5leHBvcnRzID0gbmV3IFR5cGUoJ3RhZzp5YW1sLm9yZywyMDAyOmZsb2F0Jywge1xuICBraW5kOiAnc2NhbGFyJyxcbiAgcmVzb2x2ZTogcmVzb2x2ZVlhbWxGbG9hdCxcbiAgY29uc3RydWN0OiBjb25zdHJ1Y3RZYW1sRmxvYXQsXG4gIHByZWRpY2F0ZTogaXNGbG9hdCxcbiAgcmVwcmVzZW50OiByZXByZXNlbnRZYW1sRmxvYXQsXG4gIGRlZmF1bHRTdHlsZTogJ2xvd2VyY2FzZSdcbn0pO1xuIiwiJ3VzZSBzdHJpY3QnO1xuXG52YXIgY29tbW9uID0gcmVxdWlyZSgnLi4vY29tbW9uJyk7XG52YXIgVHlwZSAgID0gcmVxdWlyZSgnLi4vdHlwZScpO1xuXG5mdW5jdGlvbiBpc0hleENvZGUoYykge1xuICByZXR1cm4gKCgweDMwLyogMCAqLyA8PSBjKSAmJiAoYyA8PSAweDM5LyogOSAqLykpIHx8XG4gICAgICAgICAoKDB4NDEvKiBBICovIDw9IGMpICYmIChjIDw9IDB4NDYvKiBGICovKSkgfHxcbiAgICAgICAgICgoMHg2MS8qIGEgKi8gPD0gYykgJiYgKGMgPD0gMHg2Ni8qIGYgKi8pKTtcbn1cblxuZnVuY3Rpb24gaXNPY3RDb2RlKGMpIHtcbiAgcmV0dXJuICgoMHgzMC8qIDAgKi8gPD0gYykgJiYgKGMgPD0gMHgzNy8qIDcgKi8pKTtcbn1cblxuZnVuY3Rpb24gaXNEZWNDb2RlKGMpIHtcbiAgcmV0dXJuICgoMHgzMC8qIDAgKi8gPD0gYykgJiYgKGMgPD0gMHgzOS8qIDkgKi8pKTtcbn1cblxuZnVuY3Rpb24gcmVzb2x2ZVlhbWxJbnRlZ2VyKGRhdGEpIHtcbiAgaWYgKGRhdGEgPT09IG51bGwpIHJldHVybiBmYWxzZTtcblxuICB2YXIgbWF4ID0gZGF0YS5sZW5ndGgsXG4gICAgICBpbmRleCA9IDAsXG4gICAgICBoYXNEaWdpdHMgPSBmYWxzZSxcbiAgICAgIGNoO1xuXG4gIGlmICghbWF4KSByZXR1cm4gZmFsc2U7XG5cbiAgY2ggPSBkYXRhW2luZGV4XTtcblxuICAvLyBzaWduXG4gIGlmIChjaCA9PT0gJy0nIHx8IGNoID09PSAnKycpIHtcbiAgICBjaCA9IGRhdGFbKytpbmRleF07XG4gIH1cblxuICBpZiAoY2ggPT09ICcwJykge1xuICAgIC8vIDBcbiAgICBpZiAoaW5kZXggKyAxID09PSBtYXgpIHJldHVybiB0cnVlO1xuICAgIGNoID0gZGF0YVsrK2luZGV4XTtcblxuICAgIC8vIGJhc2UgMiwgYmFzZSA4LCBiYXNlIDE2XG5cbiAgICBpZiAoY2ggPT09ICdiJykge1xuICAgICAgLy8gYmFzZSAyXG4gICAgICBpbmRleCsrO1xuXG4gICAgICBmb3IgKDsgaW5kZXggPCBtYXg7IGluZGV4KyspIHtcbiAgICAgICAgY2ggPSBkYXRhW2luZGV4XTtcbiAgICAgICAgaWYgKGNoID09PSAnXycpIGNvbnRpbnVlO1xuICAgICAgICBpZiAoY2ggIT09ICcwJyAmJiBjaCAhPT0gJzEnKSByZXR1cm4gZmFsc2U7XG4gICAgICAgIGhhc0RpZ2l0cyA9IHRydWU7XG4gICAgICB9XG4gICAgICByZXR1cm4gaGFzRGlnaXRzO1xuICAgIH1cblxuXG4gICAgaWYgKGNoID09PSAneCcpIHtcbiAgICAgIC8vIGJhc2UgMTZcbiAgICAgIGluZGV4Kys7XG5cbiAgICAgIGZvciAoOyBpbmRleCA8IG1heDsgaW5kZXgrKykge1xuICAgICAgICBjaCA9IGRhdGFbaW5kZXhdO1xuICAgICAgICBpZiAoY2ggPT09ICdfJykgY29udGludWU7XG4gICAgICAgIGlmICghaXNIZXhDb2RlKGRhdGEuY2hhckNvZGVBdChpbmRleCkpKSByZXR1cm4gZmFsc2U7XG4gICAgICAgIGhhc0RpZ2l0cyA9IHRydWU7XG4gICAgICB9XG4gICAgICByZXR1cm4gaGFzRGlnaXRzO1xuICAgIH1cblxuICAgIC8vIGJhc2UgOFxuICAgIGZvciAoOyBpbmRleCA8IG1heDsgaW5kZXgrKykge1xuICAgICAgY2ggPSBkYXRhW2luZGV4XTtcbiAgICAgIGlmIChjaCA9PT0gJ18nKSBjb250aW51ZTtcbiAgICAgIGlmICghaXNPY3RDb2RlKGRhdGEuY2hhckNvZGVBdChpbmRleCkpKSByZXR1cm4gZmFsc2U7XG4gICAgICBoYXNEaWdpdHMgPSB0cnVlO1xuICAgIH1cbiAgICByZXR1cm4gaGFzRGlnaXRzO1xuICB9XG5cbiAgLy8gYmFzZSAxMCAoZXhjZXB0IDApIG9yIGJhc2UgNjBcblxuICBmb3IgKDsgaW5kZXggPCBtYXg7IGluZGV4KyspIHtcbiAgICBjaCA9IGRhdGFbaW5kZXhdO1xuICAgIGlmIChjaCA9PT0gJ18nKSBjb250aW51ZTtcbiAgICBpZiAoY2ggPT09ICc6JykgYnJlYWs7XG4gICAgaWYgKCFpc0RlY0NvZGUoZGF0YS5jaGFyQ29kZUF0KGluZGV4KSkpIHtcbiAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9XG4gICAgaGFzRGlnaXRzID0gdHJ1ZTtcbiAgfVxuXG4gIGlmICghaGFzRGlnaXRzKSByZXR1cm4gZmFsc2U7XG5cbiAgLy8gaWYgIWJhc2U2MCAtIGRvbmU7XG4gIGlmIChjaCAhPT0gJzonKSByZXR1cm4gdHJ1ZTtcblxuICAvLyBiYXNlNjAgYWxtb3N0IG5vdCB1c2VkLCBubyBuZWVkcyB0byBvcHRpbWl6ZVxuICByZXR1cm4gL14oOlswLTVdP1swLTldKSskLy50ZXN0KGRhdGEuc2xpY2UoaW5kZXgpKTtcbn1cblxuZnVuY3Rpb24gY29uc3RydWN0WWFtbEludGVnZXIoZGF0YSkge1xuICB2YXIgdmFsdWUgPSBkYXRhLCBzaWduID0gMSwgY2gsIGJhc2UsIGRpZ2l0cyA9IFtdO1xuXG4gIGlmICh2YWx1ZS5pbmRleE9mKCdfJykgIT09IC0xKSB7XG4gICAgdmFsdWUgPSB2YWx1ZS5yZXBsYWNlKC9fL2csICcnKTtcbiAgfVxuXG4gIGNoID0gdmFsdWVbMF07XG5cbiAgaWYgKGNoID09PSAnLScgfHwgY2ggPT09ICcrJykge1xuICAgIGlmIChjaCA9PT0gJy0nKSBzaWduID0gLTE7XG4gICAgdmFsdWUgPSB2YWx1ZS5zbGljZSgxKTtcbiAgICBjaCA9IHZhbHVlWzBdO1xuICB9XG5cbiAgaWYgKHZhbHVlID09PSAnMCcpIHJldHVybiAwO1xuXG4gIGlmIChjaCA9PT0gJzAnKSB7XG4gICAgaWYgKHZhbHVlWzFdID09PSAnYicpIHJldHVybiBzaWduICogcGFyc2VJbnQodmFsdWUuc2xpY2UoMiksIDIpO1xuICAgIGlmICh2YWx1ZVsxXSA9PT0gJ3gnKSByZXR1cm4gc2lnbiAqIHBhcnNlSW50KHZhbHVlLCAxNik7XG4gICAgcmV0dXJuIHNpZ24gKiBwYXJzZUludCh2YWx1ZSwgOCk7XG4gIH1cblxuICBpZiAodmFsdWUuaW5kZXhPZignOicpICE9PSAtMSkge1xuICAgIHZhbHVlLnNwbGl0KCc6JykuZm9yRWFjaChmdW5jdGlvbiAodikge1xuICAgICAgZGlnaXRzLnVuc2hpZnQocGFyc2VJbnQodiwgMTApKTtcbiAgICB9KTtcblxuICAgIHZhbHVlID0gMDtcbiAgICBiYXNlID0gMTtcblxuICAgIGRpZ2l0cy5mb3JFYWNoKGZ1bmN0aW9uIChkKSB7XG4gICAgICB2YWx1ZSArPSAoZCAqIGJhc2UpO1xuICAgICAgYmFzZSAqPSA2MDtcbiAgICB9KTtcblxuICAgIHJldHVybiBzaWduICogdmFsdWU7XG5cbiAgfVxuXG4gIHJldHVybiBzaWduICogcGFyc2VJbnQodmFsdWUsIDEwKTtcbn1cblxuZnVuY3Rpb24gaXNJbnRlZ2VyKG9iamVjdCkge1xuICByZXR1cm4gKE9iamVjdC5wcm90b3R5cGUudG9TdHJpbmcuY2FsbChvYmplY3QpKSA9PT0gJ1tvYmplY3QgTnVtYmVyXScgJiZcbiAgICAgICAgIChvYmplY3QgJSAxID09PSAwICYmICFjb21tb24uaXNOZWdhdGl2ZVplcm8ob2JqZWN0KSk7XG59XG5cbm1vZHVsZS5leHBvcnRzID0gbmV3IFR5cGUoJ3RhZzp5YW1sLm9yZywyMDAyOmludCcsIHtcbiAga2luZDogJ3NjYWxhcicsXG4gIHJlc29sdmU6IHJlc29sdmVZYW1sSW50ZWdlcixcbiAgY29uc3RydWN0OiBjb25zdHJ1Y3RZYW1sSW50ZWdlcixcbiAgcHJlZGljYXRlOiBpc0ludGVnZXIsXG4gIHJlcHJlc2VudDoge1xuICAgIGJpbmFyeTogICAgICBmdW5jdGlvbiAob2JqZWN0KSB7IHJldHVybiAnMGInICsgb2JqZWN0LnRvU3RyaW5nKDIpOyB9LFxuICAgIG9jdGFsOiAgICAgICBmdW5jdGlvbiAob2JqZWN0KSB7IHJldHVybiAnMCcgICsgb2JqZWN0LnRvU3RyaW5nKDgpOyB9LFxuICAgIGRlY2ltYWw6ICAgICBmdW5jdGlvbiAob2JqZWN0KSB7IHJldHVybiAgICAgICAgb2JqZWN0LnRvU3RyaW5nKDEwKTsgfSxcbiAgICBoZXhhZGVjaW1hbDogZnVuY3Rpb24gKG9iamVjdCkgeyByZXR1cm4gJzB4JyArIG9iamVjdC50b1N0cmluZygxNikudG9VcHBlckNhc2UoKTsgfVxuICB9LFxuICBkZWZhdWx0U3R5bGU6ICdkZWNpbWFsJyxcbiAgc3R5bGVBbGlhc2VzOiB7XG4gICAgYmluYXJ5OiAgICAgIFsgMiwgICdiaW4nIF0sXG4gICAgb2N0YWw6ICAgICAgIFsgOCwgICdvY3QnIF0sXG4gICAgZGVjaW1hbDogICAgIFsgMTAsICdkZWMnIF0sXG4gICAgaGV4YWRlY2ltYWw6IFsgMTYsICdoZXgnIF1cbiAgfVxufSk7XG4iLCIndXNlIHN0cmljdCc7XG5cbnZhciBlc3ByaW1hO1xuXG4vLyBCcm93c2VyaWZpZWQgdmVyc2lvbiBkb2VzIG5vdCBoYXZlIGVzcHJpbWFcbi8vXG4vLyAxLiBGb3Igbm9kZS5qcyBqdXN0IHJlcXVpcmUgbW9kdWxlIGFzIGRlcHNcbi8vIDIuIEZvciBicm93c2VyIHRyeSB0byByZXF1aXJlIG11ZHVsZSB2aWEgZXh0ZXJuYWwgQU1EIHN5c3RlbS5cbi8vICAgIElmIG5vdCBmb3VuZCAtIHRyeSB0byBmYWxsYmFjayB0byB3aW5kb3cuZXNwcmltYS4gSWYgbm90XG4vLyAgICBmb3VuZCB0b28gLSB0aGVuIGZhaWwgdG8gcGFyc2UuXG4vL1xudHJ5IHtcbiAgLy8gd29ya2Fyb3VuZCB0byBleGNsdWRlIHBhY2thZ2UgZnJvbSBicm93c2VyaWZ5IGxpc3QuXG4gIHZhciBfcmVxdWlyZSA9IHJlcXVpcmU7XG4gIGVzcHJpbWEgPSBfcmVxdWlyZSgnZXNwcmltYScpO1xufSBjYXRjaCAoXykge1xuICAvKmdsb2JhbCB3aW5kb3cgKi9cbiAgaWYgKHR5cGVvZiB3aW5kb3cgIT09ICd1bmRlZmluZWQnKSBlc3ByaW1hID0gd2luZG93LmVzcHJpbWE7XG59XG5cbnZhciBUeXBlID0gcmVxdWlyZSgnLi4vLi4vdHlwZScpO1xuXG5mdW5jdGlvbiByZXNvbHZlSmF2YXNjcmlwdEZ1bmN0aW9uKGRhdGEpIHtcbiAgaWYgKGRhdGEgPT09IG51bGwpIHJldHVybiBmYWxzZTtcblxuICB0cnkge1xuICAgIHZhciBzb3VyY2UgPSAnKCcgKyBkYXRhICsgJyknLFxuICAgICAgICBhc3QgICAgPSBlc3ByaW1hLnBhcnNlKHNvdXJjZSwgeyByYW5nZTogdHJ1ZSB9KTtcblxuICAgIGlmIChhc3QudHlwZSAgICAgICAgICAgICAgICAgICAgIT09ICdQcm9ncmFtJyAgICAgICAgICAgICB8fFxuICAgICAgICBhc3QuYm9keS5sZW5ndGggICAgICAgICAgICAgIT09IDEgICAgICAgICAgICAgICAgICAgICB8fFxuICAgICAgICBhc3QuYm9keVswXS50eXBlICAgICAgICAgICAgIT09ICdFeHByZXNzaW9uU3RhdGVtZW50JyB8fFxuICAgICAgICBhc3QuYm9keVswXS5leHByZXNzaW9uLnR5cGUgIT09ICdGdW5jdGlvbkV4cHJlc3Npb24nKSB7XG4gICAgICByZXR1cm4gZmFsc2U7XG4gICAgfVxuXG4gICAgcmV0dXJuIHRydWU7XG4gIH0gY2F0Y2ggKGVycikge1xuICAgIHJldHVybiBmYWxzZTtcbiAgfVxufVxuXG5mdW5jdGlvbiBjb25zdHJ1Y3RKYXZhc2NyaXB0RnVuY3Rpb24oZGF0YSkge1xuICAvKmpzbGludCBldmlsOnRydWUqL1xuXG4gIHZhciBzb3VyY2UgPSAnKCcgKyBkYXRhICsgJyknLFxuICAgICAgYXN0ICAgID0gZXNwcmltYS5wYXJzZShzb3VyY2UsIHsgcmFuZ2U6IHRydWUgfSksXG4gICAgICBwYXJhbXMgPSBbXSxcbiAgICAgIGJvZHk7XG5cbiAgaWYgKGFzdC50eXBlICAgICAgICAgICAgICAgICAgICAhPT0gJ1Byb2dyYW0nICAgICAgICAgICAgIHx8XG4gICAgICBhc3QuYm9keS5sZW5ndGggICAgICAgICAgICAgIT09IDEgICAgICAgICAgICAgICAgICAgICB8fFxuICAgICAgYXN0LmJvZHlbMF0udHlwZSAgICAgICAgICAgICE9PSAnRXhwcmVzc2lvblN0YXRlbWVudCcgfHxcbiAgICAgIGFzdC5ib2R5WzBdLmV4cHJlc3Npb24udHlwZSAhPT0gJ0Z1bmN0aW9uRXhwcmVzc2lvbicpIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoJ0ZhaWxlZCB0byByZXNvbHZlIGZ1bmN0aW9uJyk7XG4gIH1cblxuICBhc3QuYm9keVswXS5leHByZXNzaW9uLnBhcmFtcy5mb3JFYWNoKGZ1bmN0aW9uIChwYXJhbSkge1xuICAgIHBhcmFtcy5wdXNoKHBhcmFtLm5hbWUpO1xuICB9KTtcblxuICBib2R5ID0gYXN0LmJvZHlbMF0uZXhwcmVzc2lvbi5ib2R5LnJhbmdlO1xuXG4gIC8vIEVzcHJpbWEncyByYW5nZXMgaW5jbHVkZSB0aGUgZmlyc3QgJ3snIGFuZCB0aGUgbGFzdCAnfScgY2hhcmFjdGVycyBvblxuICAvLyBmdW5jdGlvbiBleHByZXNzaW9ucy4gU28gY3V0IHRoZW0gb3V0LlxuICAvKmVzbGludC1kaXNhYmxlIG5vLW5ldy1mdW5jKi9cbiAgcmV0dXJuIG5ldyBGdW5jdGlvbihwYXJhbXMsIHNvdXJjZS5zbGljZShib2R5WzBdICsgMSwgYm9keVsxXSAtIDEpKTtcbn1cblxuZnVuY3Rpb24gcmVwcmVzZW50SmF2YXNjcmlwdEZ1bmN0aW9uKG9iamVjdCAvKiwgc3R5bGUqLykge1xuICByZXR1cm4gb2JqZWN0LnRvU3RyaW5nKCk7XG59XG5cbmZ1bmN0aW9uIGlzRnVuY3Rpb24ob2JqZWN0KSB7XG4gIHJldHVybiBPYmplY3QucHJvdG90eXBlLnRvU3RyaW5nLmNhbGwob2JqZWN0KSA9PT0gJ1tvYmplY3QgRnVuY3Rpb25dJztcbn1cblxubW9kdWxlLmV4cG9ydHMgPSBuZXcgVHlwZSgndGFnOnlhbWwub3JnLDIwMDI6anMvZnVuY3Rpb24nLCB7XG4gIGtpbmQ6ICdzY2FsYXInLFxuICByZXNvbHZlOiByZXNvbHZlSmF2YXNjcmlwdEZ1bmN0aW9uLFxuICBjb25zdHJ1Y3Q6IGNvbnN0cnVjdEphdmFzY3JpcHRGdW5jdGlvbixcbiAgcHJlZGljYXRlOiBpc0Z1bmN0aW9uLFxuICByZXByZXNlbnQ6IHJlcHJlc2VudEphdmFzY3JpcHRGdW5jdGlvblxufSk7XG4iLCIndXNlIHN0cmljdCc7XG5cbnZhciBUeXBlID0gcmVxdWlyZSgnLi4vLi4vdHlwZScpO1xuXG5mdW5jdGlvbiByZXNvbHZlSmF2YXNjcmlwdFJlZ0V4cChkYXRhKSB7XG4gIGlmIChkYXRhID09PSBudWxsKSByZXR1cm4gZmFsc2U7XG4gIGlmIChkYXRhLmxlbmd0aCA9PT0gMCkgcmV0dXJuIGZhbHNlO1xuXG4gIHZhciByZWdleHAgPSBkYXRhLFxuICAgICAgdGFpbCAgID0gL1xcLyhbZ2ltXSopJC8uZXhlYyhkYXRhKSxcbiAgICAgIG1vZGlmaWVycyA9ICcnO1xuXG4gIC8vIGlmIHJlZ2V4cCBzdGFydHMgd2l0aCAnLycgaXQgY2FuIGhhdmUgbW9kaWZpZXJzIGFuZCBtdXN0IGJlIHByb3Blcmx5IGNsb3NlZFxuICAvLyBgL2Zvby9naW1gIC0gbW9kaWZpZXJzIHRhaWwgY2FuIGJlIG1heGltdW0gMyBjaGFyc1xuICBpZiAocmVnZXhwWzBdID09PSAnLycpIHtcbiAgICBpZiAodGFpbCkgbW9kaWZpZXJzID0gdGFpbFsxXTtcblxuICAgIGlmIChtb2RpZmllcnMubGVuZ3RoID4gMykgcmV0dXJuIGZhbHNlO1xuICAgIC8vIGlmIGV4cHJlc3Npb24gc3RhcnRzIHdpdGggLywgaXMgc2hvdWxkIGJlIHByb3Blcmx5IHRlcm1pbmF0ZWRcbiAgICBpZiAocmVnZXhwW3JlZ2V4cC5sZW5ndGggLSBtb2RpZmllcnMubGVuZ3RoIC0gMV0gIT09ICcvJykgcmV0dXJuIGZhbHNlO1xuICB9XG5cbiAgcmV0dXJuIHRydWU7XG59XG5cbmZ1bmN0aW9uIGNvbnN0cnVjdEphdmFzY3JpcHRSZWdFeHAoZGF0YSkge1xuICB2YXIgcmVnZXhwID0gZGF0YSxcbiAgICAgIHRhaWwgICA9IC9cXC8oW2dpbV0qKSQvLmV4ZWMoZGF0YSksXG4gICAgICBtb2RpZmllcnMgPSAnJztcblxuICAvLyBgL2Zvby9naW1gIC0gdGFpbCBjYW4gYmUgbWF4aW11bSA0IGNoYXJzXG4gIGlmIChyZWdleHBbMF0gPT09ICcvJykge1xuICAgIGlmICh0YWlsKSBtb2RpZmllcnMgPSB0YWlsWzFdO1xuICAgIHJlZ2V4cCA9IHJlZ2V4cC5zbGljZSgxLCByZWdleHAubGVuZ3RoIC0gbW9kaWZpZXJzLmxlbmd0aCAtIDEpO1xuICB9XG5cbiAgcmV0dXJuIG5ldyBSZWdFeHAocmVnZXhwLCBtb2RpZmllcnMpO1xufVxuXG5mdW5jdGlvbiByZXByZXNlbnRKYXZhc2NyaXB0UmVnRXhwKG9iamVjdCAvKiwgc3R5bGUqLykge1xuICB2YXIgcmVzdWx0ID0gJy8nICsgb2JqZWN0LnNvdXJjZSArICcvJztcblxuICBpZiAob2JqZWN0Lmdsb2JhbCkgcmVzdWx0ICs9ICdnJztcbiAgaWYgKG9iamVjdC5tdWx0aWxpbmUpIHJlc3VsdCArPSAnbSc7XG4gIGlmIChvYmplY3QuaWdub3JlQ2FzZSkgcmVzdWx0ICs9ICdpJztcblxuICByZXR1cm4gcmVzdWx0O1xufVxuXG5mdW5jdGlvbiBpc1JlZ0V4cChvYmplY3QpIHtcbiAgcmV0dXJuIE9iamVjdC5wcm90b3R5cGUudG9TdHJpbmcuY2FsbChvYmplY3QpID09PSAnW29iamVjdCBSZWdFeHBdJztcbn1cblxubW9kdWxlLmV4cG9ydHMgPSBuZXcgVHlwZSgndGFnOnlhbWwub3JnLDIwMDI6anMvcmVnZXhwJywge1xuICBraW5kOiAnc2NhbGFyJyxcbiAgcmVzb2x2ZTogcmVzb2x2ZUphdmFzY3JpcHRSZWdFeHAsXG4gIGNvbnN0cnVjdDogY29uc3RydWN0SmF2YXNjcmlwdFJlZ0V4cCxcbiAgcHJlZGljYXRlOiBpc1JlZ0V4cCxcbiAgcmVwcmVzZW50OiByZXByZXNlbnRKYXZhc2NyaXB0UmVnRXhwXG59KTtcbiIsIid1c2Ugc3RyaWN0JztcblxudmFyIFR5cGUgPSByZXF1aXJlKCcuLi8uLi90eXBlJyk7XG5cbmZ1bmN0aW9uIHJlc29sdmVKYXZhc2NyaXB0VW5kZWZpbmVkKCkge1xuICByZXR1cm4gdHJ1ZTtcbn1cblxuZnVuY3Rpb24gY29uc3RydWN0SmF2YXNjcmlwdFVuZGVmaW5lZCgpIHtcbiAgLyplc2xpbnQtZGlzYWJsZSBuby11bmRlZmluZWQqL1xuICByZXR1cm4gdW5kZWZpbmVkO1xufVxuXG5mdW5jdGlvbiByZXByZXNlbnRKYXZhc2NyaXB0VW5kZWZpbmVkKCkge1xuICByZXR1cm4gJyc7XG59XG5cbmZ1bmN0aW9uIGlzVW5kZWZpbmVkKG9iamVjdCkge1xuICByZXR1cm4gdHlwZW9mIG9iamVjdCA9PT0gJ3VuZGVmaW5lZCc7XG59XG5cbm1vZHVsZS5leHBvcnRzID0gbmV3IFR5cGUoJ3RhZzp5YW1sLm9yZywyMDAyOmpzL3VuZGVmaW5lZCcsIHtcbiAga2luZDogJ3NjYWxhcicsXG4gIHJlc29sdmU6IHJlc29sdmVKYXZhc2NyaXB0VW5kZWZpbmVkLFxuICBjb25zdHJ1Y3Q6IGNvbnN0cnVjdEphdmFzY3JpcHRVbmRlZmluZWQsXG4gIHByZWRpY2F0ZTogaXNVbmRlZmluZWQsXG4gIHJlcHJlc2VudDogcmVwcmVzZW50SmF2YXNjcmlwdFVuZGVmaW5lZFxufSk7XG4iLCIndXNlIHN0cmljdCc7XG5cbnZhciBUeXBlID0gcmVxdWlyZSgnLi4vdHlwZScpO1xuXG5tb2R1bGUuZXhwb3J0cyA9IG5ldyBUeXBlKCd0YWc6eWFtbC5vcmcsMjAwMjptYXAnLCB7XG4gIGtpbmQ6ICdtYXBwaW5nJyxcbiAgY29uc3RydWN0OiBmdW5jdGlvbiAoZGF0YSkgeyByZXR1cm4gZGF0YSAhPT0gbnVsbCA/IGRhdGEgOiB7fTsgfVxufSk7XG4iLCIndXNlIHN0cmljdCc7XG5cbnZhciBUeXBlID0gcmVxdWlyZSgnLi4vdHlwZScpO1xuXG5mdW5jdGlvbiByZXNvbHZlWWFtbE1lcmdlKGRhdGEpIHtcbiAgcmV0dXJuIGRhdGEgPT09ICc8PCcgfHwgZGF0YSA9PT0gbnVsbDtcbn1cblxubW9kdWxlLmV4cG9ydHMgPSBuZXcgVHlwZSgndGFnOnlhbWwub3JnLDIwMDI6bWVyZ2UnLCB7XG4gIGtpbmQ6ICdzY2FsYXInLFxuICByZXNvbHZlOiByZXNvbHZlWWFtbE1lcmdlXG59KTtcbiIsIid1c2Ugc3RyaWN0JztcblxudmFyIFR5cGUgPSByZXF1aXJlKCcuLi90eXBlJyk7XG5cbmZ1bmN0aW9uIHJlc29sdmVZYW1sTnVsbChkYXRhKSB7XG4gIGlmIChkYXRhID09PSBudWxsKSByZXR1cm4gdHJ1ZTtcblxuICB2YXIgbWF4ID0gZGF0YS5sZW5ndGg7XG5cbiAgcmV0dXJuIChtYXggPT09IDEgJiYgZGF0YSA9PT0gJ34nKSB8fFxuICAgICAgICAgKG1heCA9PT0gNCAmJiAoZGF0YSA9PT0gJ251bGwnIHx8IGRhdGEgPT09ICdOdWxsJyB8fCBkYXRhID09PSAnTlVMTCcpKTtcbn1cblxuZnVuY3Rpb24gY29uc3RydWN0WWFtbE51bGwoKSB7XG4gIHJldHVybiBudWxsO1xufVxuXG5mdW5jdGlvbiBpc051bGwob2JqZWN0KSB7XG4gIHJldHVybiBvYmplY3QgPT09IG51bGw7XG59XG5cbm1vZHVsZS5leHBvcnRzID0gbmV3IFR5cGUoJ3RhZzp5YW1sLm9yZywyMDAyOm51bGwnLCB7XG4gIGtpbmQ6ICdzY2FsYXInLFxuICByZXNvbHZlOiByZXNvbHZlWWFtbE51bGwsXG4gIGNvbnN0cnVjdDogY29uc3RydWN0WWFtbE51bGwsXG4gIHByZWRpY2F0ZTogaXNOdWxsLFxuICByZXByZXNlbnQ6IHtcbiAgICBjYW5vbmljYWw6IGZ1bmN0aW9uICgpIHsgcmV0dXJuICd+JzsgICAgfSxcbiAgICBsb3dlcmNhc2U6IGZ1bmN0aW9uICgpIHsgcmV0dXJuICdudWxsJzsgfSxcbiAgICB1cHBlcmNhc2U6IGZ1bmN0aW9uICgpIHsgcmV0dXJuICdOVUxMJzsgfSxcbiAgICBjYW1lbGNhc2U6IGZ1bmN0aW9uICgpIHsgcmV0dXJuICdOdWxsJzsgfVxuICB9LFxuICBkZWZhdWx0U3R5bGU6ICdsb3dlcmNhc2UnXG59KTtcbiIsIid1c2Ugc3RyaWN0JztcblxudmFyIFR5cGUgPSByZXF1aXJlKCcuLi90eXBlJyk7XG5cbnZhciBfaGFzT3duUHJvcGVydHkgPSBPYmplY3QucHJvdG90eXBlLmhhc093blByb3BlcnR5O1xudmFyIF90b1N0cmluZyAgICAgICA9IE9iamVjdC5wcm90b3R5cGUudG9TdHJpbmc7XG5cbmZ1bmN0aW9uIHJlc29sdmVZYW1sT21hcChkYXRhKSB7XG4gIGlmIChkYXRhID09PSBudWxsKSByZXR1cm4gdHJ1ZTtcblxuICB2YXIgb2JqZWN0S2V5cyA9IFtdLCBpbmRleCwgbGVuZ3RoLCBwYWlyLCBwYWlyS2V5LCBwYWlySGFzS2V5LFxuICAgICAgb2JqZWN0ID0gZGF0YTtcblxuICBmb3IgKGluZGV4ID0gMCwgbGVuZ3RoID0gb2JqZWN0Lmxlbmd0aDsgaW5kZXggPCBsZW5ndGg7IGluZGV4ICs9IDEpIHtcbiAgICBwYWlyID0gb2JqZWN0W2luZGV4XTtcbiAgICBwYWlySGFzS2V5ID0gZmFsc2U7XG5cbiAgICBpZiAoX3RvU3RyaW5nLmNhbGwocGFpcikgIT09ICdbb2JqZWN0IE9iamVjdF0nKSByZXR1cm4gZmFsc2U7XG5cbiAgICBmb3IgKHBhaXJLZXkgaW4gcGFpcikge1xuICAgICAgaWYgKF9oYXNPd25Qcm9wZXJ0eS5jYWxsKHBhaXIsIHBhaXJLZXkpKSB7XG4gICAgICAgIGlmICghcGFpckhhc0tleSkgcGFpckhhc0tleSA9IHRydWU7XG4gICAgICAgIGVsc2UgcmV0dXJuIGZhbHNlO1xuICAgICAgfVxuICAgIH1cblxuICAgIGlmICghcGFpckhhc0tleSkgcmV0dXJuIGZhbHNlO1xuXG4gICAgaWYgKG9iamVjdEtleXMuaW5kZXhPZihwYWlyS2V5KSA9PT0gLTEpIG9iamVjdEtleXMucHVzaChwYWlyS2V5KTtcbiAgICBlbHNlIHJldHVybiBmYWxzZTtcbiAgfVxuXG4gIHJldHVybiB0cnVlO1xufVxuXG5mdW5jdGlvbiBjb25zdHJ1Y3RZYW1sT21hcChkYXRhKSB7XG4gIHJldHVybiBkYXRhICE9PSBudWxsID8gZGF0YSA6IFtdO1xufVxuXG5tb2R1bGUuZXhwb3J0cyA9IG5ldyBUeXBlKCd0YWc6eWFtbC5vcmcsMjAwMjpvbWFwJywge1xuICBraW5kOiAnc2VxdWVuY2UnLFxuICByZXNvbHZlOiByZXNvbHZlWWFtbE9tYXAsXG4gIGNvbnN0cnVjdDogY29uc3RydWN0WWFtbE9tYXBcbn0pO1xuIiwiJ3VzZSBzdHJpY3QnO1xuXG52YXIgVHlwZSA9IHJlcXVpcmUoJy4uL3R5cGUnKTtcblxudmFyIF90b1N0cmluZyA9IE9iamVjdC5wcm90b3R5cGUudG9TdHJpbmc7XG5cbmZ1bmN0aW9uIHJlc29sdmVZYW1sUGFpcnMoZGF0YSkge1xuICBpZiAoZGF0YSA9PT0gbnVsbCkgcmV0dXJuIHRydWU7XG5cbiAgdmFyIGluZGV4LCBsZW5ndGgsIHBhaXIsIGtleXMsIHJlc3VsdCxcbiAgICAgIG9iamVjdCA9IGRhdGE7XG5cbiAgcmVzdWx0ID0gbmV3IEFycmF5KG9iamVjdC5sZW5ndGgpO1xuXG4gIGZvciAoaW5kZXggPSAwLCBsZW5ndGggPSBvYmplY3QubGVuZ3RoOyBpbmRleCA8IGxlbmd0aDsgaW5kZXggKz0gMSkge1xuICAgIHBhaXIgPSBvYmplY3RbaW5kZXhdO1xuXG4gICAgaWYgKF90b1N0cmluZy5jYWxsKHBhaXIpICE9PSAnW29iamVjdCBPYmplY3RdJykgcmV0dXJuIGZhbHNlO1xuXG4gICAga2V5cyA9IE9iamVjdC5rZXlzKHBhaXIpO1xuXG4gICAgaWYgKGtleXMubGVuZ3RoICE9PSAxKSByZXR1cm4gZmFsc2U7XG5cbiAgICByZXN1bHRbaW5kZXhdID0gWyBrZXlzWzBdLCBwYWlyW2tleXNbMF1dIF07XG4gIH1cblxuICByZXR1cm4gdHJ1ZTtcbn1cblxuZnVuY3Rpb24gY29uc3RydWN0WWFtbFBhaXJzKGRhdGEpIHtcbiAgaWYgKGRhdGEgPT09IG51bGwpIHJldHVybiBbXTtcblxuICB2YXIgaW5kZXgsIGxlbmd0aCwgcGFpciwga2V5cywgcmVzdWx0LFxuICAgICAgb2JqZWN0ID0gZGF0YTtcblxuICByZXN1bHQgPSBuZXcgQXJyYXkob2JqZWN0Lmxlbmd0aCk7XG5cbiAgZm9yIChpbmRleCA9IDAsIGxlbmd0aCA9IG9iamVjdC5sZW5ndGg7IGluZGV4IDwgbGVuZ3RoOyBpbmRleCArPSAxKSB7XG4gICAgcGFpciA9IG9iamVjdFtpbmRleF07XG5cbiAgICBrZXlzID0gT2JqZWN0LmtleXMocGFpcik7XG5cbiAgICByZXN1bHRbaW5kZXhdID0gWyBrZXlzWzBdLCBwYWlyW2tleXNbMF1dIF07XG4gIH1cblxuICByZXR1cm4gcmVzdWx0O1xufVxuXG5tb2R1bGUuZXhwb3J0cyA9IG5ldyBUeXBlKCd0YWc6eWFtbC5vcmcsMjAwMjpwYWlycycsIHtcbiAga2luZDogJ3NlcXVlbmNlJyxcbiAgcmVzb2x2ZTogcmVzb2x2ZVlhbWxQYWlycyxcbiAgY29uc3RydWN0OiBjb25zdHJ1Y3RZYW1sUGFpcnNcbn0pO1xuIiwiJ3VzZSBzdHJpY3QnO1xuXG52YXIgVHlwZSA9IHJlcXVpcmUoJy4uL3R5cGUnKTtcblxubW9kdWxlLmV4cG9ydHMgPSBuZXcgVHlwZSgndGFnOnlhbWwub3JnLDIwMDI6c2VxJywge1xuICBraW5kOiAnc2VxdWVuY2UnLFxuICBjb25zdHJ1Y3Q6IGZ1bmN0aW9uIChkYXRhKSB7IHJldHVybiBkYXRhICE9PSBudWxsID8gZGF0YSA6IFtdOyB9XG59KTtcbiIsIid1c2Ugc3RyaWN0JztcblxudmFyIFR5cGUgPSByZXF1aXJlKCcuLi90eXBlJyk7XG5cbnZhciBfaGFzT3duUHJvcGVydHkgPSBPYmplY3QucHJvdG90eXBlLmhhc093blByb3BlcnR5O1xuXG5mdW5jdGlvbiByZXNvbHZlWWFtbFNldChkYXRhKSB7XG4gIGlmIChkYXRhID09PSBudWxsKSByZXR1cm4gdHJ1ZTtcblxuICB2YXIga2V5LCBvYmplY3QgPSBkYXRhO1xuXG4gIGZvciAoa2V5IGluIG9iamVjdCkge1xuICAgIGlmIChfaGFzT3duUHJvcGVydHkuY2FsbChvYmplY3QsIGtleSkpIHtcbiAgICAgIGlmIChvYmplY3Rba2V5XSAhPT0gbnVsbCkgcmV0dXJuIGZhbHNlO1xuICAgIH1cbiAgfVxuXG4gIHJldHVybiB0cnVlO1xufVxuXG5mdW5jdGlvbiBjb25zdHJ1Y3RZYW1sU2V0KGRhdGEpIHtcbiAgcmV0dXJuIGRhdGEgIT09IG51bGwgPyBkYXRhIDoge307XG59XG5cbm1vZHVsZS5leHBvcnRzID0gbmV3IFR5cGUoJ3RhZzp5YW1sLm9yZywyMDAyOnNldCcsIHtcbiAga2luZDogJ21hcHBpbmcnLFxuICByZXNvbHZlOiByZXNvbHZlWWFtbFNldCxcbiAgY29uc3RydWN0OiBjb25zdHJ1Y3RZYW1sU2V0XG59KTtcbiIsIid1c2Ugc3RyaWN0JztcblxudmFyIFR5cGUgPSByZXF1aXJlKCcuLi90eXBlJyk7XG5cbm1vZHVsZS5leHBvcnRzID0gbmV3IFR5cGUoJ3RhZzp5YW1sLm9yZywyMDAyOnN0cicsIHtcbiAga2luZDogJ3NjYWxhcicsXG4gIGNvbnN0cnVjdDogZnVuY3Rpb24gKGRhdGEpIHsgcmV0dXJuIGRhdGEgIT09IG51bGwgPyBkYXRhIDogJyc7IH1cbn0pO1xuIiwiJ3VzZSBzdHJpY3QnO1xuXG52YXIgVHlwZSA9IHJlcXVpcmUoJy4uL3R5cGUnKTtcblxudmFyIFlBTUxfREFURV9SRUdFWFAgPSBuZXcgUmVnRXhwKFxuICAnXihbMC05XVswLTldWzAtOV1bMC05XSknICAgICAgICAgICsgLy8gWzFdIHllYXJcbiAgJy0oWzAtOV1bMC05XSknICAgICAgICAgICAgICAgICAgICArIC8vIFsyXSBtb250aFxuICAnLShbMC05XVswLTldKSQnKTsgICAgICAgICAgICAgICAgICAgLy8gWzNdIGRheVxuXG52YXIgWUFNTF9USU1FU1RBTVBfUkVHRVhQID0gbmV3IFJlZ0V4cChcbiAgJ14oWzAtOV1bMC05XVswLTldWzAtOV0pJyAgICAgICAgICArIC8vIFsxXSB5ZWFyXG4gICctKFswLTldWzAtOV0/KScgICAgICAgICAgICAgICAgICAgKyAvLyBbMl0gbW9udGhcbiAgJy0oWzAtOV1bMC05XT8pJyAgICAgICAgICAgICAgICAgICArIC8vIFszXSBkYXlcbiAgJyg/OltUdF18WyBcXFxcdF0rKScgICAgICAgICAgICAgICAgICsgLy8gLi4uXG4gICcoWzAtOV1bMC05XT8pJyAgICAgICAgICAgICAgICAgICAgKyAvLyBbNF0gaG91clxuICAnOihbMC05XVswLTldKScgICAgICAgICAgICAgICAgICAgICsgLy8gWzVdIG1pbnV0ZVxuICAnOihbMC05XVswLTldKScgICAgICAgICAgICAgICAgICAgICsgLy8gWzZdIHNlY29uZFxuICAnKD86XFxcXC4oWzAtOV0qKSk/JyAgICAgICAgICAgICAgICAgKyAvLyBbN10gZnJhY3Rpb25cbiAgJyg/OlsgXFxcXHRdKihafChbLStdKShbMC05XVswLTldPyknICsgLy8gWzhdIHR6IFs5XSB0el9zaWduIFsxMF0gdHpfaG91clxuICAnKD86OihbMC05XVswLTldKSk/KSk/JCcpOyAgICAgICAgICAgLy8gWzExXSB0el9taW51dGVcblxuZnVuY3Rpb24gcmVzb2x2ZVlhbWxUaW1lc3RhbXAoZGF0YSkge1xuICBpZiAoZGF0YSA9PT0gbnVsbCkgcmV0dXJuIGZhbHNlO1xuICBpZiAoWUFNTF9EQVRFX1JFR0VYUC5leGVjKGRhdGEpICE9PSBudWxsKSByZXR1cm4gdHJ1ZTtcbiAgaWYgKFlBTUxfVElNRVNUQU1QX1JFR0VYUC5leGVjKGRhdGEpICE9PSBudWxsKSByZXR1cm4gdHJ1ZTtcbiAgcmV0dXJuIGZhbHNlO1xufVxuXG5mdW5jdGlvbiBjb25zdHJ1Y3RZYW1sVGltZXN0YW1wKGRhdGEpIHtcbiAgdmFyIG1hdGNoLCB5ZWFyLCBtb250aCwgZGF5LCBob3VyLCBtaW51dGUsIHNlY29uZCwgZnJhY3Rpb24gPSAwLFxuICAgICAgZGVsdGEgPSBudWxsLCB0el9ob3VyLCB0el9taW51dGUsIGRhdGU7XG5cbiAgbWF0Y2ggPSBZQU1MX0RBVEVfUkVHRVhQLmV4ZWMoZGF0YSk7XG4gIGlmIChtYXRjaCA9PT0gbnVsbCkgbWF0Y2ggPSBZQU1MX1RJTUVTVEFNUF9SRUdFWFAuZXhlYyhkYXRhKTtcblxuICBpZiAobWF0Y2ggPT09IG51bGwpIHRocm93IG5ldyBFcnJvcignRGF0ZSByZXNvbHZlIGVycm9yJyk7XG5cbiAgLy8gbWF0Y2g6IFsxXSB5ZWFyIFsyXSBtb250aCBbM10gZGF5XG5cbiAgeWVhciA9ICsobWF0Y2hbMV0pO1xuICBtb250aCA9ICsobWF0Y2hbMl0pIC0gMTsgLy8gSlMgbW9udGggc3RhcnRzIHdpdGggMFxuICBkYXkgPSArKG1hdGNoWzNdKTtcblxuICBpZiAoIW1hdGNoWzRdKSB7IC8vIG5vIGhvdXJcbiAgICByZXR1cm4gbmV3IERhdGUoRGF0ZS5VVEMoeWVhciwgbW9udGgsIGRheSkpO1xuICB9XG5cbiAgLy8gbWF0Y2g6IFs0XSBob3VyIFs1XSBtaW51dGUgWzZdIHNlY29uZCBbN10gZnJhY3Rpb25cblxuICBob3VyID0gKyhtYXRjaFs0XSk7XG4gIG1pbnV0ZSA9ICsobWF0Y2hbNV0pO1xuICBzZWNvbmQgPSArKG1hdGNoWzZdKTtcblxuICBpZiAobWF0Y2hbN10pIHtcbiAgICBmcmFjdGlvbiA9IG1hdGNoWzddLnNsaWNlKDAsIDMpO1xuICAgIHdoaWxlIChmcmFjdGlvbi5sZW5ndGggPCAzKSB7IC8vIG1pbGxpLXNlY29uZHNcbiAgICAgIGZyYWN0aW9uICs9ICcwJztcbiAgICB9XG4gICAgZnJhY3Rpb24gPSArZnJhY3Rpb247XG4gIH1cblxuICAvLyBtYXRjaDogWzhdIHR6IFs5XSB0el9zaWduIFsxMF0gdHpfaG91ciBbMTFdIHR6X21pbnV0ZVxuXG4gIGlmIChtYXRjaFs5XSkge1xuICAgIHR6X2hvdXIgPSArKG1hdGNoWzEwXSk7XG4gICAgdHpfbWludXRlID0gKyhtYXRjaFsxMV0gfHwgMCk7XG4gICAgZGVsdGEgPSAodHpfaG91ciAqIDYwICsgdHpfbWludXRlKSAqIDYwMDAwOyAvLyBkZWx0YSBpbiBtaWxpLXNlY29uZHNcbiAgICBpZiAobWF0Y2hbOV0gPT09ICctJykgZGVsdGEgPSAtZGVsdGE7XG4gIH1cblxuICBkYXRlID0gbmV3IERhdGUoRGF0ZS5VVEMoeWVhciwgbW9udGgsIGRheSwgaG91ciwgbWludXRlLCBzZWNvbmQsIGZyYWN0aW9uKSk7XG5cbiAgaWYgKGRlbHRhKSBkYXRlLnNldFRpbWUoZGF0ZS5nZXRUaW1lKCkgLSBkZWx0YSk7XG5cbiAgcmV0dXJuIGRhdGU7XG59XG5cbmZ1bmN0aW9uIHJlcHJlc2VudFlhbWxUaW1lc3RhbXAob2JqZWN0IC8qLCBzdHlsZSovKSB7XG4gIHJldHVybiBvYmplY3QudG9JU09TdHJpbmcoKTtcbn1cblxubW9kdWxlLmV4cG9ydHMgPSBuZXcgVHlwZSgndGFnOnlhbWwub3JnLDIwMDI6dGltZXN0YW1wJywge1xuICBraW5kOiAnc2NhbGFyJyxcbiAgcmVzb2x2ZTogcmVzb2x2ZVlhbWxUaW1lc3RhbXAsXG4gIGNvbnN0cnVjdDogY29uc3RydWN0WWFtbFRpbWVzdGFtcCxcbiAgaW5zdGFuY2VPZjogRGF0ZSxcbiAgcmVwcmVzZW50OiByZXByZXNlbnRZYW1sVGltZXN0YW1wXG59KTtcbiIsInZhciBiYXNlSW5kZXhPZiA9IHJlcXVpcmUoJy4uL2ludGVybmFsL2Jhc2VJbmRleE9mJyksXG4gICAgYmluYXJ5SW5kZXggPSByZXF1aXJlKCcuLi9pbnRlcm5hbC9iaW5hcnlJbmRleCcpO1xuXG4vKiBOYXRpdmUgbWV0aG9kIHJlZmVyZW5jZXMgZm9yIHRob3NlIHdpdGggdGhlIHNhbWUgbmFtZSBhcyBvdGhlciBgbG9kYXNoYCBtZXRob2RzLiAqL1xudmFyIG5hdGl2ZU1heCA9IE1hdGgubWF4O1xuXG4vKipcbiAqIEdldHMgdGhlIGluZGV4IGF0IHdoaWNoIHRoZSBmaXJzdCBvY2N1cnJlbmNlIG9mIGB2YWx1ZWAgaXMgZm91bmQgaW4gYGFycmF5YFxuICogdXNpbmcgW2BTYW1lVmFsdWVaZXJvYF0oaHR0cDovL2VjbWEtaW50ZXJuYXRpb25hbC5vcmcvZWNtYS0yNjIvNi4wLyNzZWMtc2FtZXZhbHVlemVybylcbiAqIGZvciBlcXVhbGl0eSBjb21wYXJpc29ucy4gSWYgYGZyb21JbmRleGAgaXMgbmVnYXRpdmUsIGl0J3MgdXNlZCBhcyB0aGUgb2Zmc2V0XG4gKiBmcm9tIHRoZSBlbmQgb2YgYGFycmF5YC4gSWYgYGFycmF5YCBpcyBzb3J0ZWQgcHJvdmlkaW5nIGB0cnVlYCBmb3IgYGZyb21JbmRleGBcbiAqIHBlcmZvcm1zIGEgZmFzdGVyIGJpbmFyeSBzZWFyY2guXG4gKlxuICogQHN0YXRpY1xuICogQG1lbWJlck9mIF9cbiAqIEBjYXRlZ29yeSBBcnJheVxuICogQHBhcmFtIHtBcnJheX0gYXJyYXkgVGhlIGFycmF5IHRvIHNlYXJjaC5cbiAqIEBwYXJhbSB7Kn0gdmFsdWUgVGhlIHZhbHVlIHRvIHNlYXJjaCBmb3IuXG4gKiBAcGFyYW0ge2Jvb2xlYW58bnVtYmVyfSBbZnJvbUluZGV4PTBdIFRoZSBpbmRleCB0byBzZWFyY2ggZnJvbSBvciBgdHJ1ZWBcbiAqICB0byBwZXJmb3JtIGEgYmluYXJ5IHNlYXJjaCBvbiBhIHNvcnRlZCBhcnJheS5cbiAqIEByZXR1cm5zIHtudW1iZXJ9IFJldHVybnMgdGhlIGluZGV4IG9mIHRoZSBtYXRjaGVkIHZhbHVlLCBlbHNlIGAtMWAuXG4gKiBAZXhhbXBsZVxuICpcbiAqIF8uaW5kZXhPZihbMSwgMiwgMSwgMl0sIDIpO1xuICogLy8gPT4gMVxuICpcbiAqIC8vIHVzaW5nIGBmcm9tSW5kZXhgXG4gKiBfLmluZGV4T2YoWzEsIDIsIDEsIDJdLCAyLCAyKTtcbiAqIC8vID0+IDNcbiAqXG4gKiAvLyBwZXJmb3JtaW5nIGEgYmluYXJ5IHNlYXJjaFxuICogXy5pbmRleE9mKFsxLCAxLCAyLCAyXSwgMiwgdHJ1ZSk7XG4gKiAvLyA9PiAyXG4gKi9cbmZ1bmN0aW9uIGluZGV4T2YoYXJyYXksIHZhbHVlLCBmcm9tSW5kZXgpIHtcbiAgdmFyIGxlbmd0aCA9IGFycmF5ID8gYXJyYXkubGVuZ3RoIDogMDtcbiAgaWYgKCFsZW5ndGgpIHtcbiAgICByZXR1cm4gLTE7XG4gIH1cbiAgaWYgKHR5cGVvZiBmcm9tSW5kZXggPT0gJ251bWJlcicpIHtcbiAgICBmcm9tSW5kZXggPSBmcm9tSW5kZXggPCAwID8gbmF0aXZlTWF4KGxlbmd0aCArIGZyb21JbmRleCwgMCkgOiBmcm9tSW5kZXg7XG4gIH0gZWxzZSBpZiAoZnJvbUluZGV4KSB7XG4gICAgdmFyIGluZGV4ID0gYmluYXJ5SW5kZXgoYXJyYXksIHZhbHVlKTtcbiAgICBpZiAoaW5kZXggPCBsZW5ndGggJiZcbiAgICAgICAgKHZhbHVlID09PSB2YWx1ZSA/ICh2YWx1ZSA9PT0gYXJyYXlbaW5kZXhdKSA6IChhcnJheVtpbmRleF0gIT09IGFycmF5W2luZGV4XSkpKSB7XG4gICAgICByZXR1cm4gaW5kZXg7XG4gICAgfVxuICAgIHJldHVybiAtMTtcbiAgfVxuICByZXR1cm4gYmFzZUluZGV4T2YoYXJyYXksIHZhbHVlLCBmcm9tSW5kZXggfHwgMCk7XG59XG5cbm1vZHVsZS5leHBvcnRzID0gaW5kZXhPZjtcbiIsIi8qKlxuICogR2V0cyB0aGUgbGFzdCBlbGVtZW50IG9mIGBhcnJheWAuXG4gKlxuICogQHN0YXRpY1xuICogQG1lbWJlck9mIF9cbiAqIEBjYXRlZ29yeSBBcnJheVxuICogQHBhcmFtIHtBcnJheX0gYXJyYXkgVGhlIGFycmF5IHRvIHF1ZXJ5LlxuICogQHJldHVybnMgeyp9IFJldHVybnMgdGhlIGxhc3QgZWxlbWVudCBvZiBgYXJyYXlgLlxuICogQGV4YW1wbGVcbiAqXG4gKiBfLmxhc3QoWzEsIDIsIDNdKTtcbiAqIC8vID0+IDNcbiAqL1xuZnVuY3Rpb24gbGFzdChhcnJheSkge1xuICB2YXIgbGVuZ3RoID0gYXJyYXkgPyBhcnJheS5sZW5ndGggOiAwO1xuICByZXR1cm4gbGVuZ3RoID8gYXJyYXlbbGVuZ3RoIC0gMV0gOiB1bmRlZmluZWQ7XG59XG5cbm1vZHVsZS5leHBvcnRzID0gbGFzdDtcbiIsInZhciBMYXp5V3JhcHBlciA9IHJlcXVpcmUoJy4uL2ludGVybmFsL0xhenlXcmFwcGVyJyksXG4gICAgTG9kYXNoV3JhcHBlciA9IHJlcXVpcmUoJy4uL2ludGVybmFsL0xvZGFzaFdyYXBwZXInKSxcbiAgICBiYXNlTG9kYXNoID0gcmVxdWlyZSgnLi4vaW50ZXJuYWwvYmFzZUxvZGFzaCcpLFxuICAgIGlzQXJyYXkgPSByZXF1aXJlKCcuLi9sYW5nL2lzQXJyYXknKSxcbiAgICBpc09iamVjdExpa2UgPSByZXF1aXJlKCcuLi9pbnRlcm5hbC9pc09iamVjdExpa2UnKSxcbiAgICB3cmFwcGVyQ2xvbmUgPSByZXF1aXJlKCcuLi9pbnRlcm5hbC93cmFwcGVyQ2xvbmUnKTtcblxuLyoqIFVzZWQgZm9yIG5hdGl2ZSBtZXRob2QgcmVmZXJlbmNlcy4gKi9cbnZhciBvYmplY3RQcm90byA9IE9iamVjdC5wcm90b3R5cGU7XG5cbi8qKiBVc2VkIHRvIGNoZWNrIG9iamVjdHMgZm9yIG93biBwcm9wZXJ0aWVzLiAqL1xudmFyIGhhc093blByb3BlcnR5ID0gb2JqZWN0UHJvdG8uaGFzT3duUHJvcGVydHk7XG5cbi8qKlxuICogQ3JlYXRlcyBhIGBsb2Rhc2hgIG9iamVjdCB3aGljaCB3cmFwcyBgdmFsdWVgIHRvIGVuYWJsZSBpbXBsaWNpdCBjaGFpbmluZy5cbiAqIE1ldGhvZHMgdGhhdCBvcGVyYXRlIG9uIGFuZCByZXR1cm4gYXJyYXlzLCBjb2xsZWN0aW9ucywgYW5kIGZ1bmN0aW9ucyBjYW5cbiAqIGJlIGNoYWluZWQgdG9nZXRoZXIuIE1ldGhvZHMgdGhhdCByZXRyaWV2ZSBhIHNpbmdsZSB2YWx1ZSBvciBtYXkgcmV0dXJuIGFcbiAqIHByaW1pdGl2ZSB2YWx1ZSB3aWxsIGF1dG9tYXRpY2FsbHkgZW5kIHRoZSBjaGFpbiByZXR1cm5pbmcgdGhlIHVud3JhcHBlZFxuICogdmFsdWUuIEV4cGxpY2l0IGNoYWluaW5nIG1heSBiZSBlbmFibGVkIHVzaW5nIGBfLmNoYWluYC4gVGhlIGV4ZWN1dGlvbiBvZlxuICogY2hhaW5lZCBtZXRob2RzIGlzIGxhenksIHRoYXQgaXMsIGV4ZWN1dGlvbiBpcyBkZWZlcnJlZCB1bnRpbCBgXyN2YWx1ZWBcbiAqIGlzIGltcGxpY2l0bHkgb3IgZXhwbGljaXRseSBjYWxsZWQuXG4gKlxuICogTGF6eSBldmFsdWF0aW9uIGFsbG93cyBzZXZlcmFsIG1ldGhvZHMgdG8gc3VwcG9ydCBzaG9ydGN1dCBmdXNpb24uIFNob3J0Y3V0XG4gKiBmdXNpb24gaXMgYW4gb3B0aW1pemF0aW9uIHN0cmF0ZWd5IHdoaWNoIG1lcmdlIGl0ZXJhdGVlIGNhbGxzOyB0aGlzIGNhbiBoZWxwXG4gKiB0byBhdm9pZCB0aGUgY3JlYXRpb24gb2YgaW50ZXJtZWRpYXRlIGRhdGEgc3RydWN0dXJlcyBhbmQgZ3JlYXRseSByZWR1Y2UgdGhlXG4gKiBudW1iZXIgb2YgaXRlcmF0ZWUgZXhlY3V0aW9ucy5cbiAqXG4gKiBDaGFpbmluZyBpcyBzdXBwb3J0ZWQgaW4gY3VzdG9tIGJ1aWxkcyBhcyBsb25nIGFzIHRoZSBgXyN2YWx1ZWAgbWV0aG9kIGlzXG4gKiBkaXJlY3RseSBvciBpbmRpcmVjdGx5IGluY2x1ZGVkIGluIHRoZSBidWlsZC5cbiAqXG4gKiBJbiBhZGRpdGlvbiB0byBsb2Rhc2ggbWV0aG9kcywgd3JhcHBlcnMgaGF2ZSBgQXJyYXlgIGFuZCBgU3RyaW5nYCBtZXRob2RzLlxuICpcbiAqIFRoZSB3cmFwcGVyIGBBcnJheWAgbWV0aG9kcyBhcmU6XG4gKiBgY29uY2F0YCwgYGpvaW5gLCBgcG9wYCwgYHB1c2hgLCBgcmV2ZXJzZWAsIGBzaGlmdGAsIGBzbGljZWAsIGBzb3J0YCxcbiAqIGBzcGxpY2VgLCBhbmQgYHVuc2hpZnRgXG4gKlxuICogVGhlIHdyYXBwZXIgYFN0cmluZ2AgbWV0aG9kcyBhcmU6XG4gKiBgcmVwbGFjZWAgYW5kIGBzcGxpdGBcbiAqXG4gKiBUaGUgd3JhcHBlciBtZXRob2RzIHRoYXQgc3VwcG9ydCBzaG9ydGN1dCBmdXNpb24gYXJlOlxuICogYGNvbXBhY3RgLCBgZHJvcGAsIGBkcm9wUmlnaHRgLCBgZHJvcFJpZ2h0V2hpbGVgLCBgZHJvcFdoaWxlYCwgYGZpbHRlcmAsXG4gKiBgZmlyc3RgLCBgaW5pdGlhbGAsIGBsYXN0YCwgYG1hcGAsIGBwbHVja2AsIGByZWplY3RgLCBgcmVzdGAsIGByZXZlcnNlYCxcbiAqIGBzbGljZWAsIGB0YWtlYCwgYHRha2VSaWdodGAsIGB0YWtlUmlnaHRXaGlsZWAsIGB0YWtlV2hpbGVgLCBgdG9BcnJheWAsXG4gKiBhbmQgYHdoZXJlYFxuICpcbiAqIFRoZSBjaGFpbmFibGUgd3JhcHBlciBtZXRob2RzIGFyZTpcbiAqIGBhZnRlcmAsIGBhcnlgLCBgYXNzaWduYCwgYGF0YCwgYGJlZm9yZWAsIGBiaW5kYCwgYGJpbmRBbGxgLCBgYmluZEtleWAsXG4gKiBgY2FsbGJhY2tgLCBgY2hhaW5gLCBgY2h1bmtgLCBgY29tbWl0YCwgYGNvbXBhY3RgLCBgY29uY2F0YCwgYGNvbnN0YW50YCxcbiAqIGBjb3VudEJ5YCwgYGNyZWF0ZWAsIGBjdXJyeWAsIGBkZWJvdW5jZWAsIGBkZWZhdWx0c2AsIGBkZWZhdWx0c0RlZXBgLFxuICogYGRlZmVyYCwgYGRlbGF5YCwgYGRpZmZlcmVuY2VgLCBgZHJvcGAsIGBkcm9wUmlnaHRgLCBgZHJvcFJpZ2h0V2hpbGVgLFxuICogYGRyb3BXaGlsZWAsIGBmaWxsYCwgYGZpbHRlcmAsIGBmbGF0dGVuYCwgYGZsYXR0ZW5EZWVwYCwgYGZsb3dgLCBgZmxvd1JpZ2h0YCxcbiAqIGBmb3JFYWNoYCwgYGZvckVhY2hSaWdodGAsIGBmb3JJbmAsIGBmb3JJblJpZ2h0YCwgYGZvck93bmAsIGBmb3JPd25SaWdodGAsXG4gKiBgZnVuY3Rpb25zYCwgYGdyb3VwQnlgLCBgaW5kZXhCeWAsIGBpbml0aWFsYCwgYGludGVyc2VjdGlvbmAsIGBpbnZlcnRgLFxuICogYGludm9rZWAsIGBrZXlzYCwgYGtleXNJbmAsIGBtYXBgLCBgbWFwS2V5c2AsIGBtYXBWYWx1ZXNgLCBgbWF0Y2hlc2AsXG4gKiBgbWF0Y2hlc1Byb3BlcnR5YCwgYG1lbW9pemVgLCBgbWVyZ2VgLCBgbWV0aG9kYCwgYG1ldGhvZE9mYCwgYG1peGluYCxcbiAqIGBtb2RBcmdzYCwgYG5lZ2F0ZWAsIGBvbWl0YCwgYG9uY2VgLCBgcGFpcnNgLCBgcGFydGlhbGAsIGBwYXJ0aWFsUmlnaHRgLFxuICogYHBhcnRpdGlvbmAsIGBwaWNrYCwgYHBsYW50YCwgYHBsdWNrYCwgYHByb3BlcnR5YCwgYHByb3BlcnR5T2ZgLCBgcHVsbGAsXG4gKiBgcHVsbEF0YCwgYHB1c2hgLCBgcmFuZ2VgLCBgcmVhcmdgLCBgcmVqZWN0YCwgYHJlbW92ZWAsIGByZXN0YCwgYHJlc3RQYXJhbWAsXG4gKiBgcmV2ZXJzZWAsIGBzZXRgLCBgc2h1ZmZsZWAsIGBzbGljZWAsIGBzb3J0YCwgYHNvcnRCeWAsIGBzb3J0QnlBbGxgLFxuICogYHNvcnRCeU9yZGVyYCwgYHNwbGljZWAsIGBzcHJlYWRgLCBgdGFrZWAsIGB0YWtlUmlnaHRgLCBgdGFrZVJpZ2h0V2hpbGVgLFxuICogYHRha2VXaGlsZWAsIGB0YXBgLCBgdGhyb3R0bGVgLCBgdGhydWAsIGB0aW1lc2AsIGB0b0FycmF5YCwgYHRvUGxhaW5PYmplY3RgLFxuICogYHRyYW5zZm9ybWAsIGB1bmlvbmAsIGB1bmlxYCwgYHVuc2hpZnRgLCBgdW56aXBgLCBgdW56aXBXaXRoYCwgYHZhbHVlc2AsXG4gKiBgdmFsdWVzSW5gLCBgd2hlcmVgLCBgd2l0aG91dGAsIGB3cmFwYCwgYHhvcmAsIGB6aXBgLCBgemlwT2JqZWN0YCwgYHppcFdpdGhgXG4gKlxuICogVGhlIHdyYXBwZXIgbWV0aG9kcyB0aGF0IGFyZSAqKm5vdCoqIGNoYWluYWJsZSBieSBkZWZhdWx0IGFyZTpcbiAqIGBhZGRgLCBgYXR0ZW1wdGAsIGBjYW1lbENhc2VgLCBgY2FwaXRhbGl6ZWAsIGBjZWlsYCwgYGNsb25lYCwgYGNsb25lRGVlcGAsXG4gKiBgZGVidXJyYCwgYGVuZHNXaXRoYCwgYGVzY2FwZWAsIGBlc2NhcGVSZWdFeHBgLCBgZXZlcnlgLCBgZmluZGAsIGBmaW5kSW5kZXhgLFxuICogYGZpbmRLZXlgLCBgZmluZExhc3RgLCBgZmluZExhc3RJbmRleGAsIGBmaW5kTGFzdEtleWAsIGBmaW5kV2hlcmVgLCBgZmlyc3RgLFxuICogYGZsb29yYCwgYGdldGAsIGBndGAsIGBndGVgLCBgaGFzYCwgYGlkZW50aXR5YCwgYGluY2x1ZGVzYCwgYGluZGV4T2ZgLFxuICogYGluUmFuZ2VgLCBgaXNBcmd1bWVudHNgLCBgaXNBcnJheWAsIGBpc0Jvb2xlYW5gLCBgaXNEYXRlYCwgYGlzRWxlbWVudGAsXG4gKiBgaXNFbXB0eWAsIGBpc0VxdWFsYCwgYGlzRXJyb3JgLCBgaXNGaW5pdGVgIGBpc0Z1bmN0aW9uYCwgYGlzTWF0Y2hgLFxuICogYGlzTmF0aXZlYCwgYGlzTmFOYCwgYGlzTnVsbGAsIGBpc051bWJlcmAsIGBpc09iamVjdGAsIGBpc1BsYWluT2JqZWN0YCxcbiAqIGBpc1JlZ0V4cGAsIGBpc1N0cmluZ2AsIGBpc1VuZGVmaW5lZGAsIGBpc1R5cGVkQXJyYXlgLCBgam9pbmAsIGBrZWJhYkNhc2VgLFxuICogYGxhc3RgLCBgbGFzdEluZGV4T2ZgLCBgbHRgLCBgbHRlYCwgYG1heGAsIGBtaW5gLCBgbm9Db25mbGljdGAsIGBub29wYCxcbiAqIGBub3dgLCBgcGFkYCwgYHBhZExlZnRgLCBgcGFkUmlnaHRgLCBgcGFyc2VJbnRgLCBgcG9wYCwgYHJhbmRvbWAsIGByZWR1Y2VgLFxuICogYHJlZHVjZVJpZ2h0YCwgYHJlcGVhdGAsIGByZXN1bHRgLCBgcm91bmRgLCBgcnVuSW5Db250ZXh0YCwgYHNoaWZ0YCwgYHNpemVgLFxuICogYHNuYWtlQ2FzZWAsIGBzb21lYCwgYHNvcnRlZEluZGV4YCwgYHNvcnRlZExhc3RJbmRleGAsIGBzdGFydENhc2VgLFxuICogYHN0YXJ0c1dpdGhgLCBgc3VtYCwgYHRlbXBsYXRlYCwgYHRyaW1gLCBgdHJpbUxlZnRgLCBgdHJpbVJpZ2h0YCwgYHRydW5jYCxcbiAqIGB1bmVzY2FwZWAsIGB1bmlxdWVJZGAsIGB2YWx1ZWAsIGFuZCBgd29yZHNgXG4gKlxuICogVGhlIHdyYXBwZXIgbWV0aG9kIGBzYW1wbGVgIHdpbGwgcmV0dXJuIGEgd3JhcHBlZCB2YWx1ZSB3aGVuIGBuYCBpcyBwcm92aWRlZCxcbiAqIG90aGVyd2lzZSBhbiB1bndyYXBwZWQgdmFsdWUgaXMgcmV0dXJuZWQuXG4gKlxuICogQG5hbWUgX1xuICogQGNvbnN0cnVjdG9yXG4gKiBAY2F0ZWdvcnkgQ2hhaW5cbiAqIEBwYXJhbSB7Kn0gdmFsdWUgVGhlIHZhbHVlIHRvIHdyYXAgaW4gYSBgbG9kYXNoYCBpbnN0YW5jZS5cbiAqIEByZXR1cm5zIHtPYmplY3R9IFJldHVybnMgdGhlIG5ldyBgbG9kYXNoYCB3cmFwcGVyIGluc3RhbmNlLlxuICogQGV4YW1wbGVcbiAqXG4gKiB2YXIgd3JhcHBlZCA9IF8oWzEsIDIsIDNdKTtcbiAqXG4gKiAvLyByZXR1cm5zIGFuIHVud3JhcHBlZCB2YWx1ZVxuICogd3JhcHBlZC5yZWR1Y2UoZnVuY3Rpb24odG90YWwsIG4pIHtcbiAqICAgcmV0dXJuIHRvdGFsICsgbjtcbiAqIH0pO1xuICogLy8gPT4gNlxuICpcbiAqIC8vIHJldHVybnMgYSB3cmFwcGVkIHZhbHVlXG4gKiB2YXIgc3F1YXJlcyA9IHdyYXBwZWQubWFwKGZ1bmN0aW9uKG4pIHtcbiAqICAgcmV0dXJuIG4gKiBuO1xuICogfSk7XG4gKlxuICogXy5pc0FycmF5KHNxdWFyZXMpO1xuICogLy8gPT4gZmFsc2VcbiAqXG4gKiBfLmlzQXJyYXkoc3F1YXJlcy52YWx1ZSgpKTtcbiAqIC8vID0+IHRydWVcbiAqL1xuZnVuY3Rpb24gbG9kYXNoKHZhbHVlKSB7XG4gIGlmIChpc09iamVjdExpa2UodmFsdWUpICYmICFpc0FycmF5KHZhbHVlKSAmJiAhKHZhbHVlIGluc3RhbmNlb2YgTGF6eVdyYXBwZXIpKSB7XG4gICAgaWYgKHZhbHVlIGluc3RhbmNlb2YgTG9kYXNoV3JhcHBlcikge1xuICAgICAgcmV0dXJuIHZhbHVlO1xuICAgIH1cbiAgICBpZiAoaGFzT3duUHJvcGVydHkuY2FsbCh2YWx1ZSwgJ19fY2hhaW5fXycpICYmIGhhc093blByb3BlcnR5LmNhbGwodmFsdWUsICdfX3dyYXBwZWRfXycpKSB7XG4gICAgICByZXR1cm4gd3JhcHBlckNsb25lKHZhbHVlKTtcbiAgICB9XG4gIH1cbiAgcmV0dXJuIG5ldyBMb2Rhc2hXcmFwcGVyKHZhbHVlKTtcbn1cblxuLy8gRW5zdXJlIHdyYXBwZXJzIGFyZSBpbnN0YW5jZXMgb2YgYGJhc2VMb2Rhc2hgLlxubG9kYXNoLnByb3RvdHlwZSA9IGJhc2VMb2Rhc2gucHJvdG90eXBlO1xuXG5tb2R1bGUuZXhwb3J0cyA9IGxvZGFzaDtcbiIsIm1vZHVsZS5leHBvcnRzID0gcmVxdWlyZSgnLi9mb3JFYWNoJyk7XG4iLCJ2YXIgYmFzZUVhY2ggPSByZXF1aXJlKCcuLi9pbnRlcm5hbC9iYXNlRWFjaCcpLFxuICAgIGNyZWF0ZUZpbmQgPSByZXF1aXJlKCcuLi9pbnRlcm5hbC9jcmVhdGVGaW5kJyk7XG5cbi8qKlxuICogSXRlcmF0ZXMgb3ZlciBlbGVtZW50cyBvZiBgY29sbGVjdGlvbmAsIHJldHVybmluZyB0aGUgZmlyc3QgZWxlbWVudFxuICogYHByZWRpY2F0ZWAgcmV0dXJucyB0cnV0aHkgZm9yLiBUaGUgcHJlZGljYXRlIGlzIGJvdW5kIHRvIGB0aGlzQXJnYCBhbmRcbiAqIGludm9rZWQgd2l0aCB0aHJlZSBhcmd1bWVudHM6ICh2YWx1ZSwgaW5kZXh8a2V5LCBjb2xsZWN0aW9uKS5cbiAqXG4gKiBJZiBhIHByb3BlcnR5IG5hbWUgaXMgcHJvdmlkZWQgZm9yIGBwcmVkaWNhdGVgIHRoZSBjcmVhdGVkIGBfLnByb3BlcnR5YFxuICogc3R5bGUgY2FsbGJhY2sgcmV0dXJucyB0aGUgcHJvcGVydHkgdmFsdWUgb2YgdGhlIGdpdmVuIGVsZW1lbnQuXG4gKlxuICogSWYgYSB2YWx1ZSBpcyBhbHNvIHByb3ZpZGVkIGZvciBgdGhpc0FyZ2AgdGhlIGNyZWF0ZWQgYF8ubWF0Y2hlc1Byb3BlcnR5YFxuICogc3R5bGUgY2FsbGJhY2sgcmV0dXJucyBgdHJ1ZWAgZm9yIGVsZW1lbnRzIHRoYXQgaGF2ZSBhIG1hdGNoaW5nIHByb3BlcnR5XG4gKiB2YWx1ZSwgZWxzZSBgZmFsc2VgLlxuICpcbiAqIElmIGFuIG9iamVjdCBpcyBwcm92aWRlZCBmb3IgYHByZWRpY2F0ZWAgdGhlIGNyZWF0ZWQgYF8ubWF0Y2hlc2Agc3R5bGVcbiAqIGNhbGxiYWNrIHJldHVybnMgYHRydWVgIGZvciBlbGVtZW50cyB0aGF0IGhhdmUgdGhlIHByb3BlcnRpZXMgb2YgdGhlIGdpdmVuXG4gKiBvYmplY3QsIGVsc2UgYGZhbHNlYC5cbiAqXG4gKiBAc3RhdGljXG4gKiBAbWVtYmVyT2YgX1xuICogQGFsaWFzIGRldGVjdFxuICogQGNhdGVnb3J5IENvbGxlY3Rpb25cbiAqIEBwYXJhbSB7QXJyYXl8T2JqZWN0fHN0cmluZ30gY29sbGVjdGlvbiBUaGUgY29sbGVjdGlvbiB0byBzZWFyY2guXG4gKiBAcGFyYW0ge0Z1bmN0aW9ufE9iamVjdHxzdHJpbmd9IFtwcmVkaWNhdGU9Xy5pZGVudGl0eV0gVGhlIGZ1bmN0aW9uIGludm9rZWRcbiAqICBwZXIgaXRlcmF0aW9uLlxuICogQHBhcmFtIHsqfSBbdGhpc0FyZ10gVGhlIGB0aGlzYCBiaW5kaW5nIG9mIGBwcmVkaWNhdGVgLlxuICogQHJldHVybnMgeyp9IFJldHVybnMgdGhlIG1hdGNoZWQgZWxlbWVudCwgZWxzZSBgdW5kZWZpbmVkYC5cbiAqIEBleGFtcGxlXG4gKlxuICogdmFyIHVzZXJzID0gW1xuICogICB7ICd1c2VyJzogJ2Jhcm5leScsICAnYWdlJzogMzYsICdhY3RpdmUnOiB0cnVlIH0sXG4gKiAgIHsgJ3VzZXInOiAnZnJlZCcsICAgICdhZ2UnOiA0MCwgJ2FjdGl2ZSc6IGZhbHNlIH0sXG4gKiAgIHsgJ3VzZXInOiAncGViYmxlcycsICdhZ2UnOiAxLCAgJ2FjdGl2ZSc6IHRydWUgfVxuICogXTtcbiAqXG4gKiBfLnJlc3VsdChfLmZpbmQodXNlcnMsIGZ1bmN0aW9uKGNocikge1xuICogICByZXR1cm4gY2hyLmFnZSA8IDQwO1xuICogfSksICd1c2VyJyk7XG4gKiAvLyA9PiAnYmFybmV5J1xuICpcbiAqIC8vIHVzaW5nIHRoZSBgXy5tYXRjaGVzYCBjYWxsYmFjayBzaG9ydGhhbmRcbiAqIF8ucmVzdWx0KF8uZmluZCh1c2VycywgeyAnYWdlJzogMSwgJ2FjdGl2ZSc6IHRydWUgfSksICd1c2VyJyk7XG4gKiAvLyA9PiAncGViYmxlcydcbiAqXG4gKiAvLyB1c2luZyB0aGUgYF8ubWF0Y2hlc1Byb3BlcnR5YCBjYWxsYmFjayBzaG9ydGhhbmRcbiAqIF8ucmVzdWx0KF8uZmluZCh1c2VycywgJ2FjdGl2ZScsIGZhbHNlKSwgJ3VzZXInKTtcbiAqIC8vID0+ICdmcmVkJ1xuICpcbiAqIC8vIHVzaW5nIHRoZSBgXy5wcm9wZXJ0eWAgY2FsbGJhY2sgc2hvcnRoYW5kXG4gKiBfLnJlc3VsdChfLmZpbmQodXNlcnMsICdhY3RpdmUnKSwgJ3VzZXInKTtcbiAqIC8vID0+ICdiYXJuZXknXG4gKi9cbnZhciBmaW5kID0gY3JlYXRlRmluZChiYXNlRWFjaCk7XG5cbm1vZHVsZS5leHBvcnRzID0gZmluZDtcbiIsInZhciBhcnJheUVhY2ggPSByZXF1aXJlKCcuLi9pbnRlcm5hbC9hcnJheUVhY2gnKSxcbiAgICBiYXNlRWFjaCA9IHJlcXVpcmUoJy4uL2ludGVybmFsL2Jhc2VFYWNoJyksXG4gICAgY3JlYXRlRm9yRWFjaCA9IHJlcXVpcmUoJy4uL2ludGVybmFsL2NyZWF0ZUZvckVhY2gnKTtcblxuLyoqXG4gKiBJdGVyYXRlcyBvdmVyIGVsZW1lbnRzIG9mIGBjb2xsZWN0aW9uYCBpbnZva2luZyBgaXRlcmF0ZWVgIGZvciBlYWNoIGVsZW1lbnQuXG4gKiBUaGUgYGl0ZXJhdGVlYCBpcyBib3VuZCB0byBgdGhpc0FyZ2AgYW5kIGludm9rZWQgd2l0aCB0aHJlZSBhcmd1bWVudHM6XG4gKiAodmFsdWUsIGluZGV4fGtleSwgY29sbGVjdGlvbikuIEl0ZXJhdGVlIGZ1bmN0aW9ucyBtYXkgZXhpdCBpdGVyYXRpb24gZWFybHlcbiAqIGJ5IGV4cGxpY2l0bHkgcmV0dXJuaW5nIGBmYWxzZWAuXG4gKlxuICogKipOb3RlOioqIEFzIHdpdGggb3RoZXIgXCJDb2xsZWN0aW9uc1wiIG1ldGhvZHMsIG9iamVjdHMgd2l0aCBhIFwibGVuZ3RoXCIgcHJvcGVydHlcbiAqIGFyZSBpdGVyYXRlZCBsaWtlIGFycmF5cy4gVG8gYXZvaWQgdGhpcyBiZWhhdmlvciBgXy5mb3JJbmAgb3IgYF8uZm9yT3duYFxuICogbWF5IGJlIHVzZWQgZm9yIG9iamVjdCBpdGVyYXRpb24uXG4gKlxuICogQHN0YXRpY1xuICogQG1lbWJlck9mIF9cbiAqIEBhbGlhcyBlYWNoXG4gKiBAY2F0ZWdvcnkgQ29sbGVjdGlvblxuICogQHBhcmFtIHtBcnJheXxPYmplY3R8c3RyaW5nfSBjb2xsZWN0aW9uIFRoZSBjb2xsZWN0aW9uIHRvIGl0ZXJhdGUgb3Zlci5cbiAqIEBwYXJhbSB7RnVuY3Rpb259IFtpdGVyYXRlZT1fLmlkZW50aXR5XSBUaGUgZnVuY3Rpb24gaW52b2tlZCBwZXIgaXRlcmF0aW9uLlxuICogQHBhcmFtIHsqfSBbdGhpc0FyZ10gVGhlIGB0aGlzYCBiaW5kaW5nIG9mIGBpdGVyYXRlZWAuXG4gKiBAcmV0dXJucyB7QXJyYXl8T2JqZWN0fHN0cmluZ30gUmV0dXJucyBgY29sbGVjdGlvbmAuXG4gKiBAZXhhbXBsZVxuICpcbiAqIF8oWzEsIDJdKS5mb3JFYWNoKGZ1bmN0aW9uKG4pIHtcbiAqICAgY29uc29sZS5sb2cobik7XG4gKiB9KS52YWx1ZSgpO1xuICogLy8gPT4gbG9ncyBlYWNoIHZhbHVlIGZyb20gbGVmdCB0byByaWdodCBhbmQgcmV0dXJucyB0aGUgYXJyYXlcbiAqXG4gKiBfLmZvckVhY2goeyAnYSc6IDEsICdiJzogMiB9LCBmdW5jdGlvbihuLCBrZXkpIHtcbiAqICAgY29uc29sZS5sb2cobiwga2V5KTtcbiAqIH0pO1xuICogLy8gPT4gbG9ncyBlYWNoIHZhbHVlLWtleSBwYWlyIGFuZCByZXR1cm5zIHRoZSBvYmplY3QgKGl0ZXJhdGlvbiBvcmRlciBpcyBub3QgZ3VhcmFudGVlZClcbiAqL1xudmFyIGZvckVhY2ggPSBjcmVhdGVGb3JFYWNoKGFycmF5RWFjaCwgYmFzZUVhY2gpO1xuXG5tb2R1bGUuZXhwb3J0cyA9IGZvckVhY2g7XG4iLCJ2YXIgYmFzZUluZGV4T2YgPSByZXF1aXJlKCcuLi9pbnRlcm5hbC9iYXNlSW5kZXhPZicpLFxuICAgIGdldExlbmd0aCA9IHJlcXVpcmUoJy4uL2ludGVybmFsL2dldExlbmd0aCcpLFxuICAgIGlzQXJyYXkgPSByZXF1aXJlKCcuLi9sYW5nL2lzQXJyYXknKSxcbiAgICBpc0l0ZXJhdGVlQ2FsbCA9IHJlcXVpcmUoJy4uL2ludGVybmFsL2lzSXRlcmF0ZWVDYWxsJyksXG4gICAgaXNMZW5ndGggPSByZXF1aXJlKCcuLi9pbnRlcm5hbC9pc0xlbmd0aCcpLFxuICAgIGlzU3RyaW5nID0gcmVxdWlyZSgnLi4vbGFuZy9pc1N0cmluZycpLFxuICAgIHZhbHVlcyA9IHJlcXVpcmUoJy4uL29iamVjdC92YWx1ZXMnKTtcblxuLyogTmF0aXZlIG1ldGhvZCByZWZlcmVuY2VzIGZvciB0aG9zZSB3aXRoIHRoZSBzYW1lIG5hbWUgYXMgb3RoZXIgYGxvZGFzaGAgbWV0aG9kcy4gKi9cbnZhciBuYXRpdmVNYXggPSBNYXRoLm1heDtcblxuLyoqXG4gKiBDaGVja3MgaWYgYHRhcmdldGAgaXMgaW4gYGNvbGxlY3Rpb25gIHVzaW5nXG4gKiBbYFNhbWVWYWx1ZVplcm9gXShodHRwOi8vZWNtYS1pbnRlcm5hdGlvbmFsLm9yZy9lY21hLTI2Mi82LjAvI3NlYy1zYW1ldmFsdWV6ZXJvKVxuICogZm9yIGVxdWFsaXR5IGNvbXBhcmlzb25zLiBJZiBgZnJvbUluZGV4YCBpcyBuZWdhdGl2ZSwgaXQncyB1c2VkIGFzIHRoZSBvZmZzZXRcbiAqIGZyb20gdGhlIGVuZCBvZiBgY29sbGVjdGlvbmAuXG4gKlxuICogQHN0YXRpY1xuICogQG1lbWJlck9mIF9cbiAqIEBhbGlhcyBjb250YWlucywgaW5jbHVkZVxuICogQGNhdGVnb3J5IENvbGxlY3Rpb25cbiAqIEBwYXJhbSB7QXJyYXl8T2JqZWN0fHN0cmluZ30gY29sbGVjdGlvbiBUaGUgY29sbGVjdGlvbiB0byBzZWFyY2guXG4gKiBAcGFyYW0geyp9IHRhcmdldCBUaGUgdmFsdWUgdG8gc2VhcmNoIGZvci5cbiAqIEBwYXJhbSB7bnVtYmVyfSBbZnJvbUluZGV4PTBdIFRoZSBpbmRleCB0byBzZWFyY2ggZnJvbS5cbiAqIEBwYXJhbS0ge09iamVjdH0gW2d1YXJkXSBFbmFibGVzIHVzZSBhcyBhIGNhbGxiYWNrIGZvciBmdW5jdGlvbnMgbGlrZSBgXy5yZWR1Y2VgLlxuICogQHJldHVybnMge2Jvb2xlYW59IFJldHVybnMgYHRydWVgIGlmIGEgbWF0Y2hpbmcgZWxlbWVudCBpcyBmb3VuZCwgZWxzZSBgZmFsc2VgLlxuICogQGV4YW1wbGVcbiAqXG4gKiBfLmluY2x1ZGVzKFsxLCAyLCAzXSwgMSk7XG4gKiAvLyA9PiB0cnVlXG4gKlxuICogXy5pbmNsdWRlcyhbMSwgMiwgM10sIDEsIDIpO1xuICogLy8gPT4gZmFsc2VcbiAqXG4gKiBfLmluY2x1ZGVzKHsgJ3VzZXInOiAnZnJlZCcsICdhZ2UnOiA0MCB9LCAnZnJlZCcpO1xuICogLy8gPT4gdHJ1ZVxuICpcbiAqIF8uaW5jbHVkZXMoJ3BlYmJsZXMnLCAnZWInKTtcbiAqIC8vID0+IHRydWVcbiAqL1xuZnVuY3Rpb24gaW5jbHVkZXMoY29sbGVjdGlvbiwgdGFyZ2V0LCBmcm9tSW5kZXgsIGd1YXJkKSB7XG4gIHZhciBsZW5ndGggPSBjb2xsZWN0aW9uID8gZ2V0TGVuZ3RoKGNvbGxlY3Rpb24pIDogMDtcbiAgaWYgKCFpc0xlbmd0aChsZW5ndGgpKSB7XG4gICAgY29sbGVjdGlvbiA9IHZhbHVlcyhjb2xsZWN0aW9uKTtcbiAgICBsZW5ndGggPSBjb2xsZWN0aW9uLmxlbmd0aDtcbiAgfVxuICBpZiAodHlwZW9mIGZyb21JbmRleCAhPSAnbnVtYmVyJyB8fCAoZ3VhcmQgJiYgaXNJdGVyYXRlZUNhbGwodGFyZ2V0LCBmcm9tSW5kZXgsIGd1YXJkKSkpIHtcbiAgICBmcm9tSW5kZXggPSAwO1xuICB9IGVsc2Uge1xuICAgIGZyb21JbmRleCA9IGZyb21JbmRleCA8IDAgPyBuYXRpdmVNYXgobGVuZ3RoICsgZnJvbUluZGV4LCAwKSA6IChmcm9tSW5kZXggfHwgMCk7XG4gIH1cbiAgcmV0dXJuICh0eXBlb2YgY29sbGVjdGlvbiA9PSAnc3RyaW5nJyB8fCAhaXNBcnJheShjb2xsZWN0aW9uKSAmJiBpc1N0cmluZyhjb2xsZWN0aW9uKSlcbiAgICA/IChmcm9tSW5kZXggPD0gbGVuZ3RoICYmIGNvbGxlY3Rpb24uaW5kZXhPZih0YXJnZXQsIGZyb21JbmRleCkgPiAtMSlcbiAgICA6ICghIWxlbmd0aCAmJiBiYXNlSW5kZXhPZihjb2xsZWN0aW9uLCB0YXJnZXQsIGZyb21JbmRleCkgPiAtMSk7XG59XG5cbm1vZHVsZS5leHBvcnRzID0gaW5jbHVkZXM7XG4iLCJ2YXIgYXJyYXlNYXAgPSByZXF1aXJlKCcuLi9pbnRlcm5hbC9hcnJheU1hcCcpLFxuICAgIGJhc2VDYWxsYmFjayA9IHJlcXVpcmUoJy4uL2ludGVybmFsL2Jhc2VDYWxsYmFjaycpLFxuICAgIGJhc2VNYXAgPSByZXF1aXJlKCcuLi9pbnRlcm5hbC9iYXNlTWFwJyksXG4gICAgaXNBcnJheSA9IHJlcXVpcmUoJy4uL2xhbmcvaXNBcnJheScpO1xuXG4vKipcbiAqIENyZWF0ZXMgYW4gYXJyYXkgb2YgdmFsdWVzIGJ5IHJ1bm5pbmcgZWFjaCBlbGVtZW50IGluIGBjb2xsZWN0aW9uYCB0aHJvdWdoXG4gKiBgaXRlcmF0ZWVgLiBUaGUgYGl0ZXJhdGVlYCBpcyBib3VuZCB0byBgdGhpc0FyZ2AgYW5kIGludm9rZWQgd2l0aCB0aHJlZVxuICogYXJndW1lbnRzOiAodmFsdWUsIGluZGV4fGtleSwgY29sbGVjdGlvbikuXG4gKlxuICogSWYgYSBwcm9wZXJ0eSBuYW1lIGlzIHByb3ZpZGVkIGZvciBgaXRlcmF0ZWVgIHRoZSBjcmVhdGVkIGBfLnByb3BlcnR5YFxuICogc3R5bGUgY2FsbGJhY2sgcmV0dXJucyB0aGUgcHJvcGVydHkgdmFsdWUgb2YgdGhlIGdpdmVuIGVsZW1lbnQuXG4gKlxuICogSWYgYSB2YWx1ZSBpcyBhbHNvIHByb3ZpZGVkIGZvciBgdGhpc0FyZ2AgdGhlIGNyZWF0ZWQgYF8ubWF0Y2hlc1Byb3BlcnR5YFxuICogc3R5bGUgY2FsbGJhY2sgcmV0dXJucyBgdHJ1ZWAgZm9yIGVsZW1lbnRzIHRoYXQgaGF2ZSBhIG1hdGNoaW5nIHByb3BlcnR5XG4gKiB2YWx1ZSwgZWxzZSBgZmFsc2VgLlxuICpcbiAqIElmIGFuIG9iamVjdCBpcyBwcm92aWRlZCBmb3IgYGl0ZXJhdGVlYCB0aGUgY3JlYXRlZCBgXy5tYXRjaGVzYCBzdHlsZVxuICogY2FsbGJhY2sgcmV0dXJucyBgdHJ1ZWAgZm9yIGVsZW1lbnRzIHRoYXQgaGF2ZSB0aGUgcHJvcGVydGllcyBvZiB0aGUgZ2l2ZW5cbiAqIG9iamVjdCwgZWxzZSBgZmFsc2VgLlxuICpcbiAqIE1hbnkgbG9kYXNoIG1ldGhvZHMgYXJlIGd1YXJkZWQgdG8gd29yayBhcyBpdGVyYXRlZXMgZm9yIG1ldGhvZHMgbGlrZVxuICogYF8uZXZlcnlgLCBgXy5maWx0ZXJgLCBgXy5tYXBgLCBgXy5tYXBWYWx1ZXNgLCBgXy5yZWplY3RgLCBhbmQgYF8uc29tZWAuXG4gKlxuICogVGhlIGd1YXJkZWQgbWV0aG9kcyBhcmU6XG4gKiBgYXJ5YCwgYGNhbGxiYWNrYCwgYGNodW5rYCwgYGNsb25lYCwgYGNyZWF0ZWAsIGBjdXJyeWAsIGBjdXJyeVJpZ2h0YCxcbiAqIGBkcm9wYCwgYGRyb3BSaWdodGAsIGBldmVyeWAsIGBmaWxsYCwgYGZsYXR0ZW5gLCBgaW52ZXJ0YCwgYG1heGAsIGBtaW5gLFxuICogYHBhcnNlSW50YCwgYHNsaWNlYCwgYHNvcnRCeWAsIGB0YWtlYCwgYHRha2VSaWdodGAsIGB0ZW1wbGF0ZWAsIGB0cmltYCxcbiAqIGB0cmltTGVmdGAsIGB0cmltUmlnaHRgLCBgdHJ1bmNgLCBgcmFuZG9tYCwgYHJhbmdlYCwgYHNhbXBsZWAsIGBzb21lYCxcbiAqIGBzdW1gLCBgdW5pcWAsIGFuZCBgd29yZHNgXG4gKlxuICogQHN0YXRpY1xuICogQG1lbWJlck9mIF9cbiAqIEBhbGlhcyBjb2xsZWN0XG4gKiBAY2F0ZWdvcnkgQ29sbGVjdGlvblxuICogQHBhcmFtIHtBcnJheXxPYmplY3R8c3RyaW5nfSBjb2xsZWN0aW9uIFRoZSBjb2xsZWN0aW9uIHRvIGl0ZXJhdGUgb3Zlci5cbiAqIEBwYXJhbSB7RnVuY3Rpb258T2JqZWN0fHN0cmluZ30gW2l0ZXJhdGVlPV8uaWRlbnRpdHldIFRoZSBmdW5jdGlvbiBpbnZva2VkXG4gKiAgcGVyIGl0ZXJhdGlvbi5cbiAqIEBwYXJhbSB7Kn0gW3RoaXNBcmddIFRoZSBgdGhpc2AgYmluZGluZyBvZiBgaXRlcmF0ZWVgLlxuICogQHJldHVybnMge0FycmF5fSBSZXR1cm5zIHRoZSBuZXcgbWFwcGVkIGFycmF5LlxuICogQGV4YW1wbGVcbiAqXG4gKiBmdW5jdGlvbiB0aW1lc1RocmVlKG4pIHtcbiAqICAgcmV0dXJuIG4gKiAzO1xuICogfVxuICpcbiAqIF8ubWFwKFsxLCAyXSwgdGltZXNUaHJlZSk7XG4gKiAvLyA9PiBbMywgNl1cbiAqXG4gKiBfLm1hcCh7ICdhJzogMSwgJ2InOiAyIH0sIHRpbWVzVGhyZWUpO1xuICogLy8gPT4gWzMsIDZdIChpdGVyYXRpb24gb3JkZXIgaXMgbm90IGd1YXJhbnRlZWQpXG4gKlxuICogdmFyIHVzZXJzID0gW1xuICogICB7ICd1c2VyJzogJ2Jhcm5leScgfSxcbiAqICAgeyAndXNlcic6ICdmcmVkJyB9XG4gKiBdO1xuICpcbiAqIC8vIHVzaW5nIHRoZSBgXy5wcm9wZXJ0eWAgY2FsbGJhY2sgc2hvcnRoYW5kXG4gKiBfLm1hcCh1c2VycywgJ3VzZXInKTtcbiAqIC8vID0+IFsnYmFybmV5JywgJ2ZyZWQnXVxuICovXG5mdW5jdGlvbiBtYXAoY29sbGVjdGlvbiwgaXRlcmF0ZWUsIHRoaXNBcmcpIHtcbiAgdmFyIGZ1bmMgPSBpc0FycmF5KGNvbGxlY3Rpb24pID8gYXJyYXlNYXAgOiBiYXNlTWFwO1xuICBpdGVyYXRlZSA9IGJhc2VDYWxsYmFjayhpdGVyYXRlZSwgdGhpc0FyZywgMyk7XG4gIHJldHVybiBmdW5jKGNvbGxlY3Rpb24sIGl0ZXJhdGVlKTtcbn1cblxubW9kdWxlLmV4cG9ydHMgPSBtYXA7XG4iLCJ2YXIgZ2V0TmF0aXZlID0gcmVxdWlyZSgnLi4vaW50ZXJuYWwvZ2V0TmF0aXZlJyk7XG5cbi8qIE5hdGl2ZSBtZXRob2QgcmVmZXJlbmNlcyBmb3IgdGhvc2Ugd2l0aCB0aGUgc2FtZSBuYW1lIGFzIG90aGVyIGBsb2Rhc2hgIG1ldGhvZHMuICovXG52YXIgbmF0aXZlTm93ID0gZ2V0TmF0aXZlKERhdGUsICdub3cnKTtcblxuLyoqXG4gKiBHZXRzIHRoZSBudW1iZXIgb2YgbWlsbGlzZWNvbmRzIHRoYXQgaGF2ZSBlbGFwc2VkIHNpbmNlIHRoZSBVbml4IGVwb2NoXG4gKiAoMSBKYW51YXJ5IDE5NzAgMDA6MDA6MDAgVVRDKS5cbiAqXG4gKiBAc3RhdGljXG4gKiBAbWVtYmVyT2YgX1xuICogQGNhdGVnb3J5IERhdGVcbiAqIEBleGFtcGxlXG4gKlxuICogXy5kZWZlcihmdW5jdGlvbihzdGFtcCkge1xuICogICBjb25zb2xlLmxvZyhfLm5vdygpIC0gc3RhbXApO1xuICogfSwgXy5ub3coKSk7XG4gKiAvLyA9PiBsb2dzIHRoZSBudW1iZXIgb2YgbWlsbGlzZWNvbmRzIGl0IHRvb2sgZm9yIHRoZSBkZWZlcnJlZCBmdW5jdGlvbiB0byBiZSBpbnZva2VkXG4gKi9cbnZhciBub3cgPSBuYXRpdmVOb3cgfHwgZnVuY3Rpb24oKSB7XG4gIHJldHVybiBuZXcgRGF0ZSgpLmdldFRpbWUoKTtcbn07XG5cbm1vZHVsZS5leHBvcnRzID0gbm93O1xuIiwidmFyIGNyZWF0ZVdyYXBwZXIgPSByZXF1aXJlKCcuLi9pbnRlcm5hbC9jcmVhdGVXcmFwcGVyJyksXG4gICAgcmVwbGFjZUhvbGRlcnMgPSByZXF1aXJlKCcuLi9pbnRlcm5hbC9yZXBsYWNlSG9sZGVycycpLFxuICAgIHJlc3RQYXJhbSA9IHJlcXVpcmUoJy4vcmVzdFBhcmFtJyk7XG5cbi8qKiBVc2VkIHRvIGNvbXBvc2UgYml0bWFza3MgZm9yIHdyYXBwZXIgbWV0YWRhdGEuICovXG52YXIgQklORF9GTEFHID0gMSxcbiAgICBQQVJUSUFMX0ZMQUcgPSAzMjtcblxuLyoqXG4gKiBDcmVhdGVzIGEgZnVuY3Rpb24gdGhhdCBpbnZva2VzIGBmdW5jYCB3aXRoIHRoZSBgdGhpc2AgYmluZGluZyBvZiBgdGhpc0FyZ2BcbiAqIGFuZCBwcmVwZW5kcyBhbnkgYWRkaXRpb25hbCBgXy5iaW5kYCBhcmd1bWVudHMgdG8gdGhvc2UgcHJvdmlkZWQgdG8gdGhlXG4gKiBib3VuZCBmdW5jdGlvbi5cbiAqXG4gKiBUaGUgYF8uYmluZC5wbGFjZWhvbGRlcmAgdmFsdWUsIHdoaWNoIGRlZmF1bHRzIHRvIGBfYCBpbiBtb25vbGl0aGljIGJ1aWxkcyxcbiAqIG1heSBiZSB1c2VkIGFzIGEgcGxhY2Vob2xkZXIgZm9yIHBhcnRpYWxseSBhcHBsaWVkIGFyZ3VtZW50cy5cbiAqXG4gKiAqKk5vdGU6KiogVW5saWtlIG5hdGl2ZSBgRnVuY3Rpb24jYmluZGAgdGhpcyBtZXRob2QgZG9lcyBub3Qgc2V0IHRoZSBcImxlbmd0aFwiXG4gKiBwcm9wZXJ0eSBvZiBib3VuZCBmdW5jdGlvbnMuXG4gKlxuICogQHN0YXRpY1xuICogQG1lbWJlck9mIF9cbiAqIEBjYXRlZ29yeSBGdW5jdGlvblxuICogQHBhcmFtIHtGdW5jdGlvbn0gZnVuYyBUaGUgZnVuY3Rpb24gdG8gYmluZC5cbiAqIEBwYXJhbSB7Kn0gdGhpc0FyZyBUaGUgYHRoaXNgIGJpbmRpbmcgb2YgYGZ1bmNgLlxuICogQHBhcmFtIHsuLi4qfSBbcGFydGlhbHNdIFRoZSBhcmd1bWVudHMgdG8gYmUgcGFydGlhbGx5IGFwcGxpZWQuXG4gKiBAcmV0dXJucyB7RnVuY3Rpb259IFJldHVybnMgdGhlIG5ldyBib3VuZCBmdW5jdGlvbi5cbiAqIEBleGFtcGxlXG4gKlxuICogdmFyIGdyZWV0ID0gZnVuY3Rpb24oZ3JlZXRpbmcsIHB1bmN0dWF0aW9uKSB7XG4gKiAgIHJldHVybiBncmVldGluZyArICcgJyArIHRoaXMudXNlciArIHB1bmN0dWF0aW9uO1xuICogfTtcbiAqXG4gKiB2YXIgb2JqZWN0ID0geyAndXNlcic6ICdmcmVkJyB9O1xuICpcbiAqIHZhciBib3VuZCA9IF8uYmluZChncmVldCwgb2JqZWN0LCAnaGknKTtcbiAqIGJvdW5kKCchJyk7XG4gKiAvLyA9PiAnaGkgZnJlZCEnXG4gKlxuICogLy8gdXNpbmcgcGxhY2Vob2xkZXJzXG4gKiB2YXIgYm91bmQgPSBfLmJpbmQoZ3JlZXQsIG9iamVjdCwgXywgJyEnKTtcbiAqIGJvdW5kKCdoaScpO1xuICogLy8gPT4gJ2hpIGZyZWQhJ1xuICovXG52YXIgYmluZCA9IHJlc3RQYXJhbShmdW5jdGlvbihmdW5jLCB0aGlzQXJnLCBwYXJ0aWFscykge1xuICB2YXIgYml0bWFzayA9IEJJTkRfRkxBRztcbiAgaWYgKHBhcnRpYWxzLmxlbmd0aCkge1xuICAgIHZhciBob2xkZXJzID0gcmVwbGFjZUhvbGRlcnMocGFydGlhbHMsIGJpbmQucGxhY2Vob2xkZXIpO1xuICAgIGJpdG1hc2sgfD0gUEFSVElBTF9GTEFHO1xuICB9XG4gIHJldHVybiBjcmVhdGVXcmFwcGVyKGZ1bmMsIGJpdG1hc2ssIHRoaXNBcmcsIHBhcnRpYWxzLCBob2xkZXJzKTtcbn0pO1xuXG4vLyBBc3NpZ24gZGVmYXVsdCBwbGFjZWhvbGRlcnMuXG5iaW5kLnBsYWNlaG9sZGVyID0ge307XG5cbm1vZHVsZS5leHBvcnRzID0gYmluZDtcbiIsIi8qKiBVc2VkIGFzIHRoZSBgVHlwZUVycm9yYCBtZXNzYWdlIGZvciBcIkZ1bmN0aW9uc1wiIG1ldGhvZHMuICovXG52YXIgRlVOQ19FUlJPUl9URVhUID0gJ0V4cGVjdGVkIGEgZnVuY3Rpb24nO1xuXG4vKiBOYXRpdmUgbWV0aG9kIHJlZmVyZW5jZXMgZm9yIHRob3NlIHdpdGggdGhlIHNhbWUgbmFtZSBhcyBvdGhlciBgbG9kYXNoYCBtZXRob2RzLiAqL1xudmFyIG5hdGl2ZU1heCA9IE1hdGgubWF4O1xuXG4vKipcbiAqIENyZWF0ZXMgYSBmdW5jdGlvbiB0aGF0IGludm9rZXMgYGZ1bmNgIHdpdGggdGhlIGB0aGlzYCBiaW5kaW5nIG9mIHRoZVxuICogY3JlYXRlZCBmdW5jdGlvbiBhbmQgYXJndW1lbnRzIGZyb20gYHN0YXJ0YCBhbmQgYmV5b25kIHByb3ZpZGVkIGFzIGFuIGFycmF5LlxuICpcbiAqICoqTm90ZToqKiBUaGlzIG1ldGhvZCBpcyBiYXNlZCBvbiB0aGUgW3Jlc3QgcGFyYW1ldGVyXShodHRwczovL2RldmVsb3Blci5tb3ppbGxhLm9yZy9XZWIvSmF2YVNjcmlwdC9SZWZlcmVuY2UvRnVuY3Rpb25zL3Jlc3RfcGFyYW1ldGVycykuXG4gKlxuICogQHN0YXRpY1xuICogQG1lbWJlck9mIF9cbiAqIEBjYXRlZ29yeSBGdW5jdGlvblxuICogQHBhcmFtIHtGdW5jdGlvbn0gZnVuYyBUaGUgZnVuY3Rpb24gdG8gYXBwbHkgYSByZXN0IHBhcmFtZXRlciB0by5cbiAqIEBwYXJhbSB7bnVtYmVyfSBbc3RhcnQ9ZnVuYy5sZW5ndGgtMV0gVGhlIHN0YXJ0IHBvc2l0aW9uIG9mIHRoZSByZXN0IHBhcmFtZXRlci5cbiAqIEByZXR1cm5zIHtGdW5jdGlvbn0gUmV0dXJucyB0aGUgbmV3IGZ1bmN0aW9uLlxuICogQGV4YW1wbGVcbiAqXG4gKiB2YXIgc2F5ID0gXy5yZXN0UGFyYW0oZnVuY3Rpb24od2hhdCwgbmFtZXMpIHtcbiAqICAgcmV0dXJuIHdoYXQgKyAnICcgKyBfLmluaXRpYWwobmFtZXMpLmpvaW4oJywgJykgK1xuICogICAgIChfLnNpemUobmFtZXMpID4gMSA/ICcsICYgJyA6ICcnKSArIF8ubGFzdChuYW1lcyk7XG4gKiB9KTtcbiAqXG4gKiBzYXkoJ2hlbGxvJywgJ2ZyZWQnLCAnYmFybmV5JywgJ3BlYmJsZXMnKTtcbiAqIC8vID0+ICdoZWxsbyBmcmVkLCBiYXJuZXksICYgcGViYmxlcydcbiAqL1xuZnVuY3Rpb24gcmVzdFBhcmFtKGZ1bmMsIHN0YXJ0KSB7XG4gIGlmICh0eXBlb2YgZnVuYyAhPSAnZnVuY3Rpb24nKSB7XG4gICAgdGhyb3cgbmV3IFR5cGVFcnJvcihGVU5DX0VSUk9SX1RFWFQpO1xuICB9XG4gIHN0YXJ0ID0gbmF0aXZlTWF4KHN0YXJ0ID09PSB1bmRlZmluZWQgPyAoZnVuYy5sZW5ndGggLSAxKSA6ICgrc3RhcnQgfHwgMCksIDApO1xuICByZXR1cm4gZnVuY3Rpb24oKSB7XG4gICAgdmFyIGFyZ3MgPSBhcmd1bWVudHMsXG4gICAgICAgIGluZGV4ID0gLTEsXG4gICAgICAgIGxlbmd0aCA9IG5hdGl2ZU1heChhcmdzLmxlbmd0aCAtIHN0YXJ0LCAwKSxcbiAgICAgICAgcmVzdCA9IEFycmF5KGxlbmd0aCk7XG5cbiAgICB3aGlsZSAoKytpbmRleCA8IGxlbmd0aCkge1xuICAgICAgcmVzdFtpbmRleF0gPSBhcmdzW3N0YXJ0ICsgaW5kZXhdO1xuICAgIH1cbiAgICBzd2l0Y2ggKHN0YXJ0KSB7XG4gICAgICBjYXNlIDA6IHJldHVybiBmdW5jLmNhbGwodGhpcywgcmVzdCk7XG4gICAgICBjYXNlIDE6IHJldHVybiBmdW5jLmNhbGwodGhpcywgYXJnc1swXSwgcmVzdCk7XG4gICAgICBjYXNlIDI6IHJldHVybiBmdW5jLmNhbGwodGhpcywgYXJnc1swXSwgYXJnc1sxXSwgcmVzdCk7XG4gICAgfVxuICAgIHZhciBvdGhlckFyZ3MgPSBBcnJheShzdGFydCArIDEpO1xuICAgIGluZGV4ID0gLTE7XG4gICAgd2hpbGUgKCsraW5kZXggPCBzdGFydCkge1xuICAgICAgb3RoZXJBcmdzW2luZGV4XSA9IGFyZ3NbaW5kZXhdO1xuICAgIH1cbiAgICBvdGhlckFyZ3Nbc3RhcnRdID0gcmVzdDtcbiAgICByZXR1cm4gZnVuYy5hcHBseSh0aGlzLCBvdGhlckFyZ3MpO1xuICB9O1xufVxuXG5tb2R1bGUuZXhwb3J0cyA9IHJlc3RQYXJhbTtcbiIsInZhciBiYXNlQ3JlYXRlID0gcmVxdWlyZSgnLi9iYXNlQ3JlYXRlJyksXG4gICAgYmFzZUxvZGFzaCA9IHJlcXVpcmUoJy4vYmFzZUxvZGFzaCcpO1xuXG4vKiogVXNlZCBhcyByZWZlcmVuY2VzIGZvciBgLUluZmluaXR5YCBhbmQgYEluZmluaXR5YC4gKi9cbnZhciBQT1NJVElWRV9JTkZJTklUWSA9IE51bWJlci5QT1NJVElWRV9JTkZJTklUWTtcblxuLyoqXG4gKiBDcmVhdGVzIGEgbGF6eSB3cmFwcGVyIG9iamVjdCB3aGljaCB3cmFwcyBgdmFsdWVgIHRvIGVuYWJsZSBsYXp5IGV2YWx1YXRpb24uXG4gKlxuICogQHByaXZhdGVcbiAqIEBwYXJhbSB7Kn0gdmFsdWUgVGhlIHZhbHVlIHRvIHdyYXAuXG4gKi9cbmZ1bmN0aW9uIExhenlXcmFwcGVyKHZhbHVlKSB7XG4gIHRoaXMuX193cmFwcGVkX18gPSB2YWx1ZTtcbiAgdGhpcy5fX2FjdGlvbnNfXyA9IFtdO1xuICB0aGlzLl9fZGlyX18gPSAxO1xuICB0aGlzLl9fZmlsdGVyZWRfXyA9IGZhbHNlO1xuICB0aGlzLl9faXRlcmF0ZWVzX18gPSBbXTtcbiAgdGhpcy5fX3Rha2VDb3VudF9fID0gUE9TSVRJVkVfSU5GSU5JVFk7XG4gIHRoaXMuX192aWV3c19fID0gW107XG59XG5cbkxhenlXcmFwcGVyLnByb3RvdHlwZSA9IGJhc2VDcmVhdGUoYmFzZUxvZGFzaC5wcm90b3R5cGUpO1xuTGF6eVdyYXBwZXIucHJvdG90eXBlLmNvbnN0cnVjdG9yID0gTGF6eVdyYXBwZXI7XG5cbm1vZHVsZS5leHBvcnRzID0gTGF6eVdyYXBwZXI7XG4iLCJ2YXIgYmFzZUNyZWF0ZSA9IHJlcXVpcmUoJy4vYmFzZUNyZWF0ZScpLFxuICAgIGJhc2VMb2Rhc2ggPSByZXF1aXJlKCcuL2Jhc2VMb2Rhc2gnKTtcblxuLyoqXG4gKiBUaGUgYmFzZSBjb25zdHJ1Y3RvciBmb3IgY3JlYXRpbmcgYGxvZGFzaGAgd3JhcHBlciBvYmplY3RzLlxuICpcbiAqIEBwcml2YXRlXG4gKiBAcGFyYW0geyp9IHZhbHVlIFRoZSB2YWx1ZSB0byB3cmFwLlxuICogQHBhcmFtIHtib29sZWFufSBbY2hhaW5BbGxdIEVuYWJsZSBjaGFpbmluZyBmb3IgYWxsIHdyYXBwZXIgbWV0aG9kcy5cbiAqIEBwYXJhbSB7QXJyYXl9IFthY3Rpb25zPVtdXSBBY3Rpb25zIHRvIHBlZm9ybSB0byByZXNvbHZlIHRoZSB1bndyYXBwZWQgdmFsdWUuXG4gKi9cbmZ1bmN0aW9uIExvZGFzaFdyYXBwZXIodmFsdWUsIGNoYWluQWxsLCBhY3Rpb25zKSB7XG4gIHRoaXMuX193cmFwcGVkX18gPSB2YWx1ZTtcbiAgdGhpcy5fX2FjdGlvbnNfXyA9IGFjdGlvbnMgfHwgW107XG4gIHRoaXMuX19jaGFpbl9fID0gISFjaGFpbkFsbDtcbn1cblxuTG9kYXNoV3JhcHBlci5wcm90b3R5cGUgPSBiYXNlQ3JlYXRlKGJhc2VMb2Rhc2gucHJvdG90eXBlKTtcbkxvZGFzaFdyYXBwZXIucHJvdG90eXBlLmNvbnN0cnVjdG9yID0gTG9kYXNoV3JhcHBlcjtcblxubW9kdWxlLmV4cG9ydHMgPSBMb2Rhc2hXcmFwcGVyO1xuIiwiLyoqXG4gKiBDb3BpZXMgdGhlIHZhbHVlcyBvZiBgc291cmNlYCB0byBgYXJyYXlgLlxuICpcbiAqIEBwcml2YXRlXG4gKiBAcGFyYW0ge0FycmF5fSBzb3VyY2UgVGhlIGFycmF5IHRvIGNvcHkgdmFsdWVzIGZyb20uXG4gKiBAcGFyYW0ge0FycmF5fSBbYXJyYXk9W11dIFRoZSBhcnJheSB0byBjb3B5IHZhbHVlcyB0by5cbiAqIEByZXR1cm5zIHtBcnJheX0gUmV0dXJucyBgYXJyYXlgLlxuICovXG5mdW5jdGlvbiBhcnJheUNvcHkoc291cmNlLCBhcnJheSkge1xuICB2YXIgaW5kZXggPSAtMSxcbiAgICAgIGxlbmd0aCA9IHNvdXJjZS5sZW5ndGg7XG5cbiAgYXJyYXkgfHwgKGFycmF5ID0gQXJyYXkobGVuZ3RoKSk7XG4gIHdoaWxlICgrK2luZGV4IDwgbGVuZ3RoKSB7XG4gICAgYXJyYXlbaW5kZXhdID0gc291cmNlW2luZGV4XTtcbiAgfVxuICByZXR1cm4gYXJyYXk7XG59XG5cbm1vZHVsZS5leHBvcnRzID0gYXJyYXlDb3B5O1xuIiwiLyoqXG4gKiBBIHNwZWNpYWxpemVkIHZlcnNpb24gb2YgYF8uZm9yRWFjaGAgZm9yIGFycmF5cyB3aXRob3V0IHN1cHBvcnQgZm9yIGNhbGxiYWNrXG4gKiBzaG9ydGhhbmRzIGFuZCBgdGhpc2AgYmluZGluZy5cbiAqXG4gKiBAcHJpdmF0ZVxuICogQHBhcmFtIHtBcnJheX0gYXJyYXkgVGhlIGFycmF5IHRvIGl0ZXJhdGUgb3Zlci5cbiAqIEBwYXJhbSB7RnVuY3Rpb259IGl0ZXJhdGVlIFRoZSBmdW5jdGlvbiBpbnZva2VkIHBlciBpdGVyYXRpb24uXG4gKiBAcmV0dXJucyB7QXJyYXl9IFJldHVybnMgYGFycmF5YC5cbiAqL1xuZnVuY3Rpb24gYXJyYXlFYWNoKGFycmF5LCBpdGVyYXRlZSkge1xuICB2YXIgaW5kZXggPSAtMSxcbiAgICAgIGxlbmd0aCA9IGFycmF5Lmxlbmd0aDtcblxuICB3aGlsZSAoKytpbmRleCA8IGxlbmd0aCkge1xuICAgIGlmIChpdGVyYXRlZShhcnJheVtpbmRleF0sIGluZGV4LCBhcnJheSkgPT09IGZhbHNlKSB7XG4gICAgICBicmVhaztcbiAgICB9XG4gIH1cbiAgcmV0dXJuIGFycmF5O1xufVxuXG5tb2R1bGUuZXhwb3J0cyA9IGFycmF5RWFjaDtcbiIsIi8qKlxuICogQSBzcGVjaWFsaXplZCB2ZXJzaW9uIG9mIGBfLm1hcGAgZm9yIGFycmF5cyB3aXRob3V0IHN1cHBvcnQgZm9yIGNhbGxiYWNrXG4gKiBzaG9ydGhhbmRzIGFuZCBgdGhpc2AgYmluZGluZy5cbiAqXG4gKiBAcHJpdmF0ZVxuICogQHBhcmFtIHtBcnJheX0gYXJyYXkgVGhlIGFycmF5IHRvIGl0ZXJhdGUgb3Zlci5cbiAqIEBwYXJhbSB7RnVuY3Rpb259IGl0ZXJhdGVlIFRoZSBmdW5jdGlvbiBpbnZva2VkIHBlciBpdGVyYXRpb24uXG4gKiBAcmV0dXJucyB7QXJyYXl9IFJldHVybnMgdGhlIG5ldyBtYXBwZWQgYXJyYXkuXG4gKi9cbmZ1bmN0aW9uIGFycmF5TWFwKGFycmF5LCBpdGVyYXRlZSkge1xuICB2YXIgaW5kZXggPSAtMSxcbiAgICAgIGxlbmd0aCA9IGFycmF5Lmxlbmd0aCxcbiAgICAgIHJlc3VsdCA9IEFycmF5KGxlbmd0aCk7XG5cbiAgd2hpbGUgKCsraW5kZXggPCBsZW5ndGgpIHtcbiAgICByZXN1bHRbaW5kZXhdID0gaXRlcmF0ZWUoYXJyYXlbaW5kZXhdLCBpbmRleCwgYXJyYXkpO1xuICB9XG4gIHJldHVybiByZXN1bHQ7XG59XG5cbm1vZHVsZS5leHBvcnRzID0gYXJyYXlNYXA7XG4iLCIvKipcbiAqIEEgc3BlY2lhbGl6ZWQgdmVyc2lvbiBvZiBgXy5zb21lYCBmb3IgYXJyYXlzIHdpdGhvdXQgc3VwcG9ydCBmb3IgY2FsbGJhY2tcbiAqIHNob3J0aGFuZHMgYW5kIGB0aGlzYCBiaW5kaW5nLlxuICpcbiAqIEBwcml2YXRlXG4gKiBAcGFyYW0ge0FycmF5fSBhcnJheSBUaGUgYXJyYXkgdG8gaXRlcmF0ZSBvdmVyLlxuICogQHBhcmFtIHtGdW5jdGlvbn0gcHJlZGljYXRlIFRoZSBmdW5jdGlvbiBpbnZva2VkIHBlciBpdGVyYXRpb24uXG4gKiBAcmV0dXJucyB7Ym9vbGVhbn0gUmV0dXJucyBgdHJ1ZWAgaWYgYW55IGVsZW1lbnQgcGFzc2VzIHRoZSBwcmVkaWNhdGUgY2hlY2ssXG4gKiAgZWxzZSBgZmFsc2VgLlxuICovXG5mdW5jdGlvbiBhcnJheVNvbWUoYXJyYXksIHByZWRpY2F0ZSkge1xuICB2YXIgaW5kZXggPSAtMSxcbiAgICAgIGxlbmd0aCA9IGFycmF5Lmxlbmd0aDtcblxuICB3aGlsZSAoKytpbmRleCA8IGxlbmd0aCkge1xuICAgIGlmIChwcmVkaWNhdGUoYXJyYXlbaW5kZXhdLCBpbmRleCwgYXJyYXkpKSB7XG4gICAgICByZXR1cm4gdHJ1ZTtcbiAgICB9XG4gIH1cbiAgcmV0dXJuIGZhbHNlO1xufVxuXG5tb2R1bGUuZXhwb3J0cyA9IGFycmF5U29tZTtcbiIsInZhciBiYXNlQ29weSA9IHJlcXVpcmUoJy4vYmFzZUNvcHknKSxcbiAgICBrZXlzID0gcmVxdWlyZSgnLi4vb2JqZWN0L2tleXMnKTtcblxuLyoqXG4gKiBUaGUgYmFzZSBpbXBsZW1lbnRhdGlvbiBvZiBgXy5hc3NpZ25gIHdpdGhvdXQgc3VwcG9ydCBmb3IgYXJndW1lbnQganVnZ2xpbmcsXG4gKiBtdWx0aXBsZSBzb3VyY2VzLCBhbmQgYGN1c3RvbWl6ZXJgIGZ1bmN0aW9ucy5cbiAqXG4gKiBAcHJpdmF0ZVxuICogQHBhcmFtIHtPYmplY3R9IG9iamVjdCBUaGUgZGVzdGluYXRpb24gb2JqZWN0LlxuICogQHBhcmFtIHtPYmplY3R9IHNvdXJjZSBUaGUgc291cmNlIG9iamVjdC5cbiAqIEByZXR1cm5zIHtPYmplY3R9IFJldHVybnMgYG9iamVjdGAuXG4gKi9cbmZ1bmN0aW9uIGJhc2VBc3NpZ24ob2JqZWN0LCBzb3VyY2UpIHtcbiAgcmV0dXJuIHNvdXJjZSA9PSBudWxsXG4gICAgPyBvYmplY3RcbiAgICA6IGJhc2VDb3B5KHNvdXJjZSwga2V5cyhzb3VyY2UpLCBvYmplY3QpO1xufVxuXG5tb2R1bGUuZXhwb3J0cyA9IGJhc2VBc3NpZ247XG4iLCJ2YXIgYmFzZU1hdGNoZXMgPSByZXF1aXJlKCcuL2Jhc2VNYXRjaGVzJyksXG4gICAgYmFzZU1hdGNoZXNQcm9wZXJ0eSA9IHJlcXVpcmUoJy4vYmFzZU1hdGNoZXNQcm9wZXJ0eScpLFxuICAgIGJpbmRDYWxsYmFjayA9IHJlcXVpcmUoJy4vYmluZENhbGxiYWNrJyksXG4gICAgaWRlbnRpdHkgPSByZXF1aXJlKCcuLi91dGlsaXR5L2lkZW50aXR5JyksXG4gICAgcHJvcGVydHkgPSByZXF1aXJlKCcuLi91dGlsaXR5L3Byb3BlcnR5Jyk7XG5cbi8qKlxuICogVGhlIGJhc2UgaW1wbGVtZW50YXRpb24gb2YgYF8uY2FsbGJhY2tgIHdoaWNoIHN1cHBvcnRzIHNwZWNpZnlpbmcgdGhlXG4gKiBudW1iZXIgb2YgYXJndW1lbnRzIHRvIHByb3ZpZGUgdG8gYGZ1bmNgLlxuICpcbiAqIEBwcml2YXRlXG4gKiBAcGFyYW0geyp9IFtmdW5jPV8uaWRlbnRpdHldIFRoZSB2YWx1ZSB0byBjb252ZXJ0IHRvIGEgY2FsbGJhY2suXG4gKiBAcGFyYW0geyp9IFt0aGlzQXJnXSBUaGUgYHRoaXNgIGJpbmRpbmcgb2YgYGZ1bmNgLlxuICogQHBhcmFtIHtudW1iZXJ9IFthcmdDb3VudF0gVGhlIG51bWJlciBvZiBhcmd1bWVudHMgdG8gcHJvdmlkZSB0byBgZnVuY2AuXG4gKiBAcmV0dXJucyB7RnVuY3Rpb259IFJldHVybnMgdGhlIGNhbGxiYWNrLlxuICovXG5mdW5jdGlvbiBiYXNlQ2FsbGJhY2soZnVuYywgdGhpc0FyZywgYXJnQ291bnQpIHtcbiAgdmFyIHR5cGUgPSB0eXBlb2YgZnVuYztcbiAgaWYgKHR5cGUgPT0gJ2Z1bmN0aW9uJykge1xuICAgIHJldHVybiB0aGlzQXJnID09PSB1bmRlZmluZWRcbiAgICAgID8gZnVuY1xuICAgICAgOiBiaW5kQ2FsbGJhY2soZnVuYywgdGhpc0FyZywgYXJnQ291bnQpO1xuICB9XG4gIGlmIChmdW5jID09IG51bGwpIHtcbiAgICByZXR1cm4gaWRlbnRpdHk7XG4gIH1cbiAgaWYgKHR5cGUgPT0gJ29iamVjdCcpIHtcbiAgICByZXR1cm4gYmFzZU1hdGNoZXMoZnVuYyk7XG4gIH1cbiAgcmV0dXJuIHRoaXNBcmcgPT09IHVuZGVmaW5lZFxuICAgID8gcHJvcGVydHkoZnVuYylcbiAgICA6IGJhc2VNYXRjaGVzUHJvcGVydHkoZnVuYywgdGhpc0FyZyk7XG59XG5cbm1vZHVsZS5leHBvcnRzID0gYmFzZUNhbGxiYWNrO1xuIiwidmFyIGFycmF5Q29weSA9IHJlcXVpcmUoJy4vYXJyYXlDb3B5JyksXG4gICAgYXJyYXlFYWNoID0gcmVxdWlyZSgnLi9hcnJheUVhY2gnKSxcbiAgICBiYXNlQXNzaWduID0gcmVxdWlyZSgnLi9iYXNlQXNzaWduJyksXG4gICAgYmFzZUZvck93biA9IHJlcXVpcmUoJy4vYmFzZUZvck93bicpLFxuICAgIGluaXRDbG9uZUFycmF5ID0gcmVxdWlyZSgnLi9pbml0Q2xvbmVBcnJheScpLFxuICAgIGluaXRDbG9uZUJ5VGFnID0gcmVxdWlyZSgnLi9pbml0Q2xvbmVCeVRhZycpLFxuICAgIGluaXRDbG9uZU9iamVjdCA9IHJlcXVpcmUoJy4vaW5pdENsb25lT2JqZWN0JyksXG4gICAgaXNBcnJheSA9IHJlcXVpcmUoJy4uL2xhbmcvaXNBcnJheScpLFxuICAgIGlzSG9zdE9iamVjdCA9IHJlcXVpcmUoJy4vaXNIb3N0T2JqZWN0JyksXG4gICAgaXNPYmplY3QgPSByZXF1aXJlKCcuLi9sYW5nL2lzT2JqZWN0Jyk7XG5cbi8qKiBgT2JqZWN0I3RvU3RyaW5nYCByZXN1bHQgcmVmZXJlbmNlcy4gKi9cbnZhciBhcmdzVGFnID0gJ1tvYmplY3QgQXJndW1lbnRzXScsXG4gICAgYXJyYXlUYWcgPSAnW29iamVjdCBBcnJheV0nLFxuICAgIGJvb2xUYWcgPSAnW29iamVjdCBCb29sZWFuXScsXG4gICAgZGF0ZVRhZyA9ICdbb2JqZWN0IERhdGVdJyxcbiAgICBlcnJvclRhZyA9ICdbb2JqZWN0IEVycm9yXScsXG4gICAgZnVuY1RhZyA9ICdbb2JqZWN0IEZ1bmN0aW9uXScsXG4gICAgbWFwVGFnID0gJ1tvYmplY3QgTWFwXScsXG4gICAgbnVtYmVyVGFnID0gJ1tvYmplY3QgTnVtYmVyXScsXG4gICAgb2JqZWN0VGFnID0gJ1tvYmplY3QgT2JqZWN0XScsXG4gICAgcmVnZXhwVGFnID0gJ1tvYmplY3QgUmVnRXhwXScsXG4gICAgc2V0VGFnID0gJ1tvYmplY3QgU2V0XScsXG4gICAgc3RyaW5nVGFnID0gJ1tvYmplY3QgU3RyaW5nXScsXG4gICAgd2Vha01hcFRhZyA9ICdbb2JqZWN0IFdlYWtNYXBdJztcblxudmFyIGFycmF5QnVmZmVyVGFnID0gJ1tvYmplY3QgQXJyYXlCdWZmZXJdJyxcbiAgICBmbG9hdDMyVGFnID0gJ1tvYmplY3QgRmxvYXQzMkFycmF5XScsXG4gICAgZmxvYXQ2NFRhZyA9ICdbb2JqZWN0IEZsb2F0NjRBcnJheV0nLFxuICAgIGludDhUYWcgPSAnW29iamVjdCBJbnQ4QXJyYXldJyxcbiAgICBpbnQxNlRhZyA9ICdbb2JqZWN0IEludDE2QXJyYXldJyxcbiAgICBpbnQzMlRhZyA9ICdbb2JqZWN0IEludDMyQXJyYXldJyxcbiAgICB1aW50OFRhZyA9ICdbb2JqZWN0IFVpbnQ4QXJyYXldJyxcbiAgICB1aW50OENsYW1wZWRUYWcgPSAnW29iamVjdCBVaW50OENsYW1wZWRBcnJheV0nLFxuICAgIHVpbnQxNlRhZyA9ICdbb2JqZWN0IFVpbnQxNkFycmF5XScsXG4gICAgdWludDMyVGFnID0gJ1tvYmplY3QgVWludDMyQXJyYXldJztcblxuLyoqIFVzZWQgdG8gaWRlbnRpZnkgYHRvU3RyaW5nVGFnYCB2YWx1ZXMgc3VwcG9ydGVkIGJ5IGBfLmNsb25lYC4gKi9cbnZhciBjbG9uZWFibGVUYWdzID0ge307XG5jbG9uZWFibGVUYWdzW2FyZ3NUYWddID0gY2xvbmVhYmxlVGFnc1thcnJheVRhZ10gPVxuY2xvbmVhYmxlVGFnc1thcnJheUJ1ZmZlclRhZ10gPSBjbG9uZWFibGVUYWdzW2Jvb2xUYWddID1cbmNsb25lYWJsZVRhZ3NbZGF0ZVRhZ10gPSBjbG9uZWFibGVUYWdzW2Zsb2F0MzJUYWddID1cbmNsb25lYWJsZVRhZ3NbZmxvYXQ2NFRhZ10gPSBjbG9uZWFibGVUYWdzW2ludDhUYWddID1cbmNsb25lYWJsZVRhZ3NbaW50MTZUYWddID0gY2xvbmVhYmxlVGFnc1tpbnQzMlRhZ10gPVxuY2xvbmVhYmxlVGFnc1tudW1iZXJUYWddID0gY2xvbmVhYmxlVGFnc1tvYmplY3RUYWddID1cbmNsb25lYWJsZVRhZ3NbcmVnZXhwVGFnXSA9IGNsb25lYWJsZVRhZ3Nbc3RyaW5nVGFnXSA9XG5jbG9uZWFibGVUYWdzW3VpbnQ4VGFnXSA9IGNsb25lYWJsZVRhZ3NbdWludDhDbGFtcGVkVGFnXSA9XG5jbG9uZWFibGVUYWdzW3VpbnQxNlRhZ10gPSBjbG9uZWFibGVUYWdzW3VpbnQzMlRhZ10gPSB0cnVlO1xuY2xvbmVhYmxlVGFnc1tlcnJvclRhZ10gPSBjbG9uZWFibGVUYWdzW2Z1bmNUYWddID1cbmNsb25lYWJsZVRhZ3NbbWFwVGFnXSA9IGNsb25lYWJsZVRhZ3Nbc2V0VGFnXSA9XG5jbG9uZWFibGVUYWdzW3dlYWtNYXBUYWddID0gZmFsc2U7XG5cbi8qKiBVc2VkIGZvciBuYXRpdmUgbWV0aG9kIHJlZmVyZW5jZXMuICovXG52YXIgb2JqZWN0UHJvdG8gPSBPYmplY3QucHJvdG90eXBlO1xuXG4vKipcbiAqIFVzZWQgdG8gcmVzb2x2ZSB0aGUgW2B0b1N0cmluZ1RhZ2BdKGh0dHA6Ly9lY21hLWludGVybmF0aW9uYWwub3JnL2VjbWEtMjYyLzYuMC8jc2VjLW9iamVjdC5wcm90b3R5cGUudG9zdHJpbmcpXG4gKiBvZiB2YWx1ZXMuXG4gKi9cbnZhciBvYmpUb1N0cmluZyA9IG9iamVjdFByb3RvLnRvU3RyaW5nO1xuXG4vKipcbiAqIFRoZSBiYXNlIGltcGxlbWVudGF0aW9uIG9mIGBfLmNsb25lYCB3aXRob3V0IHN1cHBvcnQgZm9yIGFyZ3VtZW50IGp1Z2dsaW5nXG4gKiBhbmQgYHRoaXNgIGJpbmRpbmcgYGN1c3RvbWl6ZXJgIGZ1bmN0aW9ucy5cbiAqXG4gKiBAcHJpdmF0ZVxuICogQHBhcmFtIHsqfSB2YWx1ZSBUaGUgdmFsdWUgdG8gY2xvbmUuXG4gKiBAcGFyYW0ge2Jvb2xlYW59IFtpc0RlZXBdIFNwZWNpZnkgYSBkZWVwIGNsb25lLlxuICogQHBhcmFtIHtGdW5jdGlvbn0gW2N1c3RvbWl6ZXJdIFRoZSBmdW5jdGlvbiB0byBjdXN0b21pemUgY2xvbmluZyB2YWx1ZXMuXG4gKiBAcGFyYW0ge3N0cmluZ30gW2tleV0gVGhlIGtleSBvZiBgdmFsdWVgLlxuICogQHBhcmFtIHtPYmplY3R9IFtvYmplY3RdIFRoZSBvYmplY3QgYHZhbHVlYCBiZWxvbmdzIHRvLlxuICogQHBhcmFtIHtBcnJheX0gW3N0YWNrQT1bXV0gVHJhY2tzIHRyYXZlcnNlZCBzb3VyY2Ugb2JqZWN0cy5cbiAqIEBwYXJhbSB7QXJyYXl9IFtzdGFja0I9W11dIEFzc29jaWF0ZXMgY2xvbmVzIHdpdGggc291cmNlIGNvdW50ZXJwYXJ0cy5cbiAqIEByZXR1cm5zIHsqfSBSZXR1cm5zIHRoZSBjbG9uZWQgdmFsdWUuXG4gKi9cbmZ1bmN0aW9uIGJhc2VDbG9uZSh2YWx1ZSwgaXNEZWVwLCBjdXN0b21pemVyLCBrZXksIG9iamVjdCwgc3RhY2tBLCBzdGFja0IpIHtcbiAgdmFyIHJlc3VsdDtcbiAgaWYgKGN1c3RvbWl6ZXIpIHtcbiAgICByZXN1bHQgPSBvYmplY3QgPyBjdXN0b21pemVyKHZhbHVlLCBrZXksIG9iamVjdCkgOiBjdXN0b21pemVyKHZhbHVlKTtcbiAgfVxuICBpZiAocmVzdWx0ICE9PSB1bmRlZmluZWQpIHtcbiAgICByZXR1cm4gcmVzdWx0O1xuICB9XG4gIGlmICghaXNPYmplY3QodmFsdWUpKSB7XG4gICAgcmV0dXJuIHZhbHVlO1xuICB9XG4gIHZhciBpc0FyciA9IGlzQXJyYXkodmFsdWUpO1xuICBpZiAoaXNBcnIpIHtcbiAgICByZXN1bHQgPSBpbml0Q2xvbmVBcnJheSh2YWx1ZSk7XG4gICAgaWYgKCFpc0RlZXApIHtcbiAgICAgIHJldHVybiBhcnJheUNvcHkodmFsdWUsIHJlc3VsdCk7XG4gICAgfVxuICB9IGVsc2Uge1xuICAgIHZhciB0YWcgPSBvYmpUb1N0cmluZy5jYWxsKHZhbHVlKSxcbiAgICAgICAgaXNGdW5jID0gdGFnID09IGZ1bmNUYWc7XG5cbiAgICBpZiAodGFnID09IG9iamVjdFRhZyB8fCB0YWcgPT0gYXJnc1RhZyB8fCAoaXNGdW5jICYmICFvYmplY3QpKSB7XG4gICAgICBpZiAoaXNIb3N0T2JqZWN0KHZhbHVlKSkge1xuICAgICAgICByZXR1cm4gb2JqZWN0ID8gdmFsdWUgOiB7fTtcbiAgICAgIH1cbiAgICAgIHJlc3VsdCA9IGluaXRDbG9uZU9iamVjdChpc0Z1bmMgPyB7fSA6IHZhbHVlKTtcbiAgICAgIGlmICghaXNEZWVwKSB7XG4gICAgICAgIHJldHVybiBiYXNlQXNzaWduKHJlc3VsdCwgdmFsdWUpO1xuICAgICAgfVxuICAgIH0gZWxzZSB7XG4gICAgICByZXR1cm4gY2xvbmVhYmxlVGFnc1t0YWddXG4gICAgICAgID8gaW5pdENsb25lQnlUYWcodmFsdWUsIHRhZywgaXNEZWVwKVxuICAgICAgICA6IChvYmplY3QgPyB2YWx1ZSA6IHt9KTtcbiAgICB9XG4gIH1cbiAgLy8gQ2hlY2sgZm9yIGNpcmN1bGFyIHJlZmVyZW5jZXMgYW5kIHJldHVybiBpdHMgY29ycmVzcG9uZGluZyBjbG9uZS5cbiAgc3RhY2tBIHx8IChzdGFja0EgPSBbXSk7XG4gIHN0YWNrQiB8fCAoc3RhY2tCID0gW10pO1xuXG4gIHZhciBsZW5ndGggPSBzdGFja0EubGVuZ3RoO1xuICB3aGlsZSAobGVuZ3RoLS0pIHtcbiAgICBpZiAoc3RhY2tBW2xlbmd0aF0gPT0gdmFsdWUpIHtcbiAgICAgIHJldHVybiBzdGFja0JbbGVuZ3RoXTtcbiAgICB9XG4gIH1cbiAgLy8gQWRkIHRoZSBzb3VyY2UgdmFsdWUgdG8gdGhlIHN0YWNrIG9mIHRyYXZlcnNlZCBvYmplY3RzIGFuZCBhc3NvY2lhdGUgaXQgd2l0aCBpdHMgY2xvbmUuXG4gIHN0YWNrQS5wdXNoKHZhbHVlKTtcbiAgc3RhY2tCLnB1c2gocmVzdWx0KTtcblxuICAvLyBSZWN1cnNpdmVseSBwb3B1bGF0ZSBjbG9uZSAoc3VzY2VwdGlibGUgdG8gY2FsbCBzdGFjayBsaW1pdHMpLlxuICAoaXNBcnIgPyBhcnJheUVhY2ggOiBiYXNlRm9yT3duKSh2YWx1ZSwgZnVuY3Rpb24oc3ViVmFsdWUsIGtleSkge1xuICAgIHJlc3VsdFtrZXldID0gYmFzZUNsb25lKHN1YlZhbHVlLCBpc0RlZXAsIGN1c3RvbWl6ZXIsIGtleSwgdmFsdWUsIHN0YWNrQSwgc3RhY2tCKTtcbiAgfSk7XG4gIHJldHVybiByZXN1bHQ7XG59XG5cbm1vZHVsZS5leHBvcnRzID0gYmFzZUNsb25lO1xuIiwiLyoqXG4gKiBDb3BpZXMgcHJvcGVydGllcyBvZiBgc291cmNlYCB0byBgb2JqZWN0YC5cbiAqXG4gKiBAcHJpdmF0ZVxuICogQHBhcmFtIHtPYmplY3R9IHNvdXJjZSBUaGUgb2JqZWN0IHRvIGNvcHkgcHJvcGVydGllcyBmcm9tLlxuICogQHBhcmFtIHtBcnJheX0gcHJvcHMgVGhlIHByb3BlcnR5IG5hbWVzIHRvIGNvcHkuXG4gKiBAcGFyYW0ge09iamVjdH0gW29iamVjdD17fV0gVGhlIG9iamVjdCB0byBjb3B5IHByb3BlcnRpZXMgdG8uXG4gKiBAcmV0dXJucyB7T2JqZWN0fSBSZXR1cm5zIGBvYmplY3RgLlxuICovXG5mdW5jdGlvbiBiYXNlQ29weShzb3VyY2UsIHByb3BzLCBvYmplY3QpIHtcbiAgb2JqZWN0IHx8IChvYmplY3QgPSB7fSk7XG5cbiAgdmFyIGluZGV4ID0gLTEsXG4gICAgICBsZW5ndGggPSBwcm9wcy5sZW5ndGg7XG5cbiAgd2hpbGUgKCsraW5kZXggPCBsZW5ndGgpIHtcbiAgICB2YXIga2V5ID0gcHJvcHNbaW5kZXhdO1xuICAgIG9iamVjdFtrZXldID0gc291cmNlW2tleV07XG4gIH1cbiAgcmV0dXJuIG9iamVjdDtcbn1cblxubW9kdWxlLmV4cG9ydHMgPSBiYXNlQ29weTtcbiIsInZhciBpc09iamVjdCA9IHJlcXVpcmUoJy4uL2xhbmcvaXNPYmplY3QnKTtcblxuLyoqXG4gKiBUaGUgYmFzZSBpbXBsZW1lbnRhdGlvbiBvZiBgXy5jcmVhdGVgIHdpdGhvdXQgc3VwcG9ydCBmb3IgYXNzaWduaW5nXG4gKiBwcm9wZXJ0aWVzIHRvIHRoZSBjcmVhdGVkIG9iamVjdC5cbiAqXG4gKiBAcHJpdmF0ZVxuICogQHBhcmFtIHtPYmplY3R9IHByb3RvdHlwZSBUaGUgb2JqZWN0IHRvIGluaGVyaXQgZnJvbS5cbiAqIEByZXR1cm5zIHtPYmplY3R9IFJldHVybnMgdGhlIG5ldyBvYmplY3QuXG4gKi9cbnZhciBiYXNlQ3JlYXRlID0gKGZ1bmN0aW9uKCkge1xuICBmdW5jdGlvbiBvYmplY3QoKSB7fVxuICByZXR1cm4gZnVuY3Rpb24ocHJvdG90eXBlKSB7XG4gICAgaWYgKGlzT2JqZWN0KHByb3RvdHlwZSkpIHtcbiAgICAgIG9iamVjdC5wcm90b3R5cGUgPSBwcm90b3R5cGU7XG4gICAgICB2YXIgcmVzdWx0ID0gbmV3IG9iamVjdDtcbiAgICAgIG9iamVjdC5wcm90b3R5cGUgPSB1bmRlZmluZWQ7XG4gICAgfVxuICAgIHJldHVybiByZXN1bHQgfHwge307XG4gIH07XG59KCkpO1xuXG5tb2R1bGUuZXhwb3J0cyA9IGJhc2VDcmVhdGU7XG4iLCJ2YXIgYmFzZUZvck93biA9IHJlcXVpcmUoJy4vYmFzZUZvck93bicpLFxuICAgIGNyZWF0ZUJhc2VFYWNoID0gcmVxdWlyZSgnLi9jcmVhdGVCYXNlRWFjaCcpO1xuXG4vKipcbiAqIFRoZSBiYXNlIGltcGxlbWVudGF0aW9uIG9mIGBfLmZvckVhY2hgIHdpdGhvdXQgc3VwcG9ydCBmb3IgY2FsbGJhY2tcbiAqIHNob3J0aGFuZHMgYW5kIGB0aGlzYCBiaW5kaW5nLlxuICpcbiAqIEBwcml2YXRlXG4gKiBAcGFyYW0ge0FycmF5fE9iamVjdHxzdHJpbmd9IGNvbGxlY3Rpb24gVGhlIGNvbGxlY3Rpb24gdG8gaXRlcmF0ZSBvdmVyLlxuICogQHBhcmFtIHtGdW5jdGlvbn0gaXRlcmF0ZWUgVGhlIGZ1bmN0aW9uIGludm9rZWQgcGVyIGl0ZXJhdGlvbi5cbiAqIEByZXR1cm5zIHtBcnJheXxPYmplY3R8c3RyaW5nfSBSZXR1cm5zIGBjb2xsZWN0aW9uYC5cbiAqL1xudmFyIGJhc2VFYWNoID0gY3JlYXRlQmFzZUVhY2goYmFzZUZvck93bik7XG5cbm1vZHVsZS5leHBvcnRzID0gYmFzZUVhY2g7XG4iLCIvKipcbiAqIFRoZSBiYXNlIGltcGxlbWVudGF0aW9uIG9mIGBfLmZpbmRgLCBgXy5maW5kTGFzdGAsIGBfLmZpbmRLZXlgLCBhbmQgYF8uZmluZExhc3RLZXlgLFxuICogd2l0aG91dCBzdXBwb3J0IGZvciBjYWxsYmFjayBzaG9ydGhhbmRzIGFuZCBgdGhpc2AgYmluZGluZywgd2hpY2ggaXRlcmF0ZXNcbiAqIG92ZXIgYGNvbGxlY3Rpb25gIHVzaW5nIHRoZSBwcm92aWRlZCBgZWFjaEZ1bmNgLlxuICpcbiAqIEBwcml2YXRlXG4gKiBAcGFyYW0ge0FycmF5fE9iamVjdHxzdHJpbmd9IGNvbGxlY3Rpb24gVGhlIGNvbGxlY3Rpb24gdG8gc2VhcmNoLlxuICogQHBhcmFtIHtGdW5jdGlvbn0gcHJlZGljYXRlIFRoZSBmdW5jdGlvbiBpbnZva2VkIHBlciBpdGVyYXRpb24uXG4gKiBAcGFyYW0ge0Z1bmN0aW9ufSBlYWNoRnVuYyBUaGUgZnVuY3Rpb24gdG8gaXRlcmF0ZSBvdmVyIGBjb2xsZWN0aW9uYC5cbiAqIEBwYXJhbSB7Ym9vbGVhbn0gW3JldEtleV0gU3BlY2lmeSByZXR1cm5pbmcgdGhlIGtleSBvZiB0aGUgZm91bmQgZWxlbWVudFxuICogIGluc3RlYWQgb2YgdGhlIGVsZW1lbnQgaXRzZWxmLlxuICogQHJldHVybnMgeyp9IFJldHVybnMgdGhlIGZvdW5kIGVsZW1lbnQgb3IgaXRzIGtleSwgZWxzZSBgdW5kZWZpbmVkYC5cbiAqL1xuZnVuY3Rpb24gYmFzZUZpbmQoY29sbGVjdGlvbiwgcHJlZGljYXRlLCBlYWNoRnVuYywgcmV0S2V5KSB7XG4gIHZhciByZXN1bHQ7XG4gIGVhY2hGdW5jKGNvbGxlY3Rpb24sIGZ1bmN0aW9uKHZhbHVlLCBrZXksIGNvbGxlY3Rpb24pIHtcbiAgICBpZiAocHJlZGljYXRlKHZhbHVlLCBrZXksIGNvbGxlY3Rpb24pKSB7XG4gICAgICByZXN1bHQgPSByZXRLZXkgPyBrZXkgOiB2YWx1ZTtcbiAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9XG4gIH0pO1xuICByZXR1cm4gcmVzdWx0O1xufVxuXG5tb2R1bGUuZXhwb3J0cyA9IGJhc2VGaW5kO1xuIiwiLyoqXG4gKiBUaGUgYmFzZSBpbXBsZW1lbnRhdGlvbiBvZiBgXy5maW5kSW5kZXhgIGFuZCBgXy5maW5kTGFzdEluZGV4YCB3aXRob3V0XG4gKiBzdXBwb3J0IGZvciBjYWxsYmFjayBzaG9ydGhhbmRzIGFuZCBgdGhpc2AgYmluZGluZy5cbiAqXG4gKiBAcHJpdmF0ZVxuICogQHBhcmFtIHtBcnJheX0gYXJyYXkgVGhlIGFycmF5IHRvIHNlYXJjaC5cbiAqIEBwYXJhbSB7RnVuY3Rpb259IHByZWRpY2F0ZSBUaGUgZnVuY3Rpb24gaW52b2tlZCBwZXIgaXRlcmF0aW9uLlxuICogQHBhcmFtIHtib29sZWFufSBbZnJvbVJpZ2h0XSBTcGVjaWZ5IGl0ZXJhdGluZyBmcm9tIHJpZ2h0IHRvIGxlZnQuXG4gKiBAcmV0dXJucyB7bnVtYmVyfSBSZXR1cm5zIHRoZSBpbmRleCBvZiB0aGUgbWF0Y2hlZCB2YWx1ZSwgZWxzZSBgLTFgLlxuICovXG5mdW5jdGlvbiBiYXNlRmluZEluZGV4KGFycmF5LCBwcmVkaWNhdGUsIGZyb21SaWdodCkge1xuICB2YXIgbGVuZ3RoID0gYXJyYXkubGVuZ3RoLFxuICAgICAgaW5kZXggPSBmcm9tUmlnaHQgPyBsZW5ndGggOiAtMTtcblxuICB3aGlsZSAoKGZyb21SaWdodCA/IGluZGV4LS0gOiArK2luZGV4IDwgbGVuZ3RoKSkge1xuICAgIGlmIChwcmVkaWNhdGUoYXJyYXlbaW5kZXhdLCBpbmRleCwgYXJyYXkpKSB7XG4gICAgICByZXR1cm4gaW5kZXg7XG4gICAgfVxuICB9XG4gIHJldHVybiAtMTtcbn1cblxubW9kdWxlLmV4cG9ydHMgPSBiYXNlRmluZEluZGV4O1xuIiwidmFyIGNyZWF0ZUJhc2VGb3IgPSByZXF1aXJlKCcuL2NyZWF0ZUJhc2VGb3InKTtcblxuLyoqXG4gKiBUaGUgYmFzZSBpbXBsZW1lbnRhdGlvbiBvZiBgYmFzZUZvckluYCBhbmQgYGJhc2VGb3JPd25gIHdoaWNoIGl0ZXJhdGVzXG4gKiBvdmVyIGBvYmplY3RgIHByb3BlcnRpZXMgcmV0dXJuZWQgYnkgYGtleXNGdW5jYCBpbnZva2luZyBgaXRlcmF0ZWVgIGZvclxuICogZWFjaCBwcm9wZXJ0eS4gSXRlcmF0ZWUgZnVuY3Rpb25zIG1heSBleGl0IGl0ZXJhdGlvbiBlYXJseSBieSBleHBsaWNpdGx5XG4gKiByZXR1cm5pbmcgYGZhbHNlYC5cbiAqXG4gKiBAcHJpdmF0ZVxuICogQHBhcmFtIHtPYmplY3R9IG9iamVjdCBUaGUgb2JqZWN0IHRvIGl0ZXJhdGUgb3Zlci5cbiAqIEBwYXJhbSB7RnVuY3Rpb259IGl0ZXJhdGVlIFRoZSBmdW5jdGlvbiBpbnZva2VkIHBlciBpdGVyYXRpb24uXG4gKiBAcGFyYW0ge0Z1bmN0aW9ufSBrZXlzRnVuYyBUaGUgZnVuY3Rpb24gdG8gZ2V0IHRoZSBrZXlzIG9mIGBvYmplY3RgLlxuICogQHJldHVybnMge09iamVjdH0gUmV0dXJucyBgb2JqZWN0YC5cbiAqL1xudmFyIGJhc2VGb3IgPSBjcmVhdGVCYXNlRm9yKCk7XG5cbm1vZHVsZS5leHBvcnRzID0gYmFzZUZvcjtcbiIsInZhciBiYXNlRm9yID0gcmVxdWlyZSgnLi9iYXNlRm9yJyksXG4gICAga2V5c0luID0gcmVxdWlyZSgnLi4vb2JqZWN0L2tleXNJbicpO1xuXG4vKipcbiAqIFRoZSBiYXNlIGltcGxlbWVudGF0aW9uIG9mIGBfLmZvckluYCB3aXRob3V0IHN1cHBvcnQgZm9yIGNhbGxiYWNrXG4gKiBzaG9ydGhhbmRzIGFuZCBgdGhpc2AgYmluZGluZy5cbiAqXG4gKiBAcHJpdmF0ZVxuICogQHBhcmFtIHtPYmplY3R9IG9iamVjdCBUaGUgb2JqZWN0IHRvIGl0ZXJhdGUgb3Zlci5cbiAqIEBwYXJhbSB7RnVuY3Rpb259IGl0ZXJhdGVlIFRoZSBmdW5jdGlvbiBpbnZva2VkIHBlciBpdGVyYXRpb24uXG4gKiBAcmV0dXJucyB7T2JqZWN0fSBSZXR1cm5zIGBvYmplY3RgLlxuICovXG5mdW5jdGlvbiBiYXNlRm9ySW4ob2JqZWN0LCBpdGVyYXRlZSkge1xuICByZXR1cm4gYmFzZUZvcihvYmplY3QsIGl0ZXJhdGVlLCBrZXlzSW4pO1xufVxuXG5tb2R1bGUuZXhwb3J0cyA9IGJhc2VGb3JJbjtcbiIsInZhciBiYXNlRm9yID0gcmVxdWlyZSgnLi9iYXNlRm9yJyksXG4gICAga2V5cyA9IHJlcXVpcmUoJy4uL29iamVjdC9rZXlzJyk7XG5cbi8qKlxuICogVGhlIGJhc2UgaW1wbGVtZW50YXRpb24gb2YgYF8uZm9yT3duYCB3aXRob3V0IHN1cHBvcnQgZm9yIGNhbGxiYWNrXG4gKiBzaG9ydGhhbmRzIGFuZCBgdGhpc2AgYmluZGluZy5cbiAqXG4gKiBAcHJpdmF0ZVxuICogQHBhcmFtIHtPYmplY3R9IG9iamVjdCBUaGUgb2JqZWN0IHRvIGl0ZXJhdGUgb3Zlci5cbiAqIEBwYXJhbSB7RnVuY3Rpb259IGl0ZXJhdGVlIFRoZSBmdW5jdGlvbiBpbnZva2VkIHBlciBpdGVyYXRpb24uXG4gKiBAcmV0dXJucyB7T2JqZWN0fSBSZXR1cm5zIGBvYmplY3RgLlxuICovXG5mdW5jdGlvbiBiYXNlRm9yT3duKG9iamVjdCwgaXRlcmF0ZWUpIHtcbiAgcmV0dXJuIGJhc2VGb3Iob2JqZWN0LCBpdGVyYXRlZSwga2V5cyk7XG59XG5cbm1vZHVsZS5leHBvcnRzID0gYmFzZUZvck93bjtcbiIsInZhciB0b09iamVjdCA9IHJlcXVpcmUoJy4vdG9PYmplY3QnKTtcblxuLyoqXG4gKiBUaGUgYmFzZSBpbXBsZW1lbnRhdGlvbiBvZiBgZ2V0YCB3aXRob3V0IHN1cHBvcnQgZm9yIHN0cmluZyBwYXRoc1xuICogYW5kIGRlZmF1bHQgdmFsdWVzLlxuICpcbiAqIEBwcml2YXRlXG4gKiBAcGFyYW0ge09iamVjdH0gb2JqZWN0IFRoZSBvYmplY3QgdG8gcXVlcnkuXG4gKiBAcGFyYW0ge0FycmF5fSBwYXRoIFRoZSBwYXRoIG9mIHRoZSBwcm9wZXJ0eSB0byBnZXQuXG4gKiBAcGFyYW0ge3N0cmluZ30gW3BhdGhLZXldIFRoZSBrZXkgcmVwcmVzZW50YXRpb24gb2YgcGF0aC5cbiAqIEByZXR1cm5zIHsqfSBSZXR1cm5zIHRoZSByZXNvbHZlZCB2YWx1ZS5cbiAqL1xuZnVuY3Rpb24gYmFzZUdldChvYmplY3QsIHBhdGgsIHBhdGhLZXkpIHtcbiAgaWYgKG9iamVjdCA9PSBudWxsKSB7XG4gICAgcmV0dXJuO1xuICB9XG4gIG9iamVjdCA9IHRvT2JqZWN0KG9iamVjdCk7XG4gIGlmIChwYXRoS2V5ICE9PSB1bmRlZmluZWQgJiYgcGF0aEtleSBpbiBvYmplY3QpIHtcbiAgICBwYXRoID0gW3BhdGhLZXldO1xuICB9XG4gIHZhciBpbmRleCA9IDAsXG4gICAgICBsZW5ndGggPSBwYXRoLmxlbmd0aDtcblxuICB3aGlsZSAob2JqZWN0ICE9IG51bGwgJiYgaW5kZXggPCBsZW5ndGgpIHtcbiAgICBvYmplY3QgPSB0b09iamVjdChvYmplY3QpW3BhdGhbaW5kZXgrK11dO1xuICB9XG4gIHJldHVybiAoaW5kZXggJiYgaW5kZXggPT0gbGVuZ3RoKSA/IG9iamVjdCA6IHVuZGVmaW5lZDtcbn1cblxubW9kdWxlLmV4cG9ydHMgPSBiYXNlR2V0O1xuIiwidmFyIGluZGV4T2ZOYU4gPSByZXF1aXJlKCcuL2luZGV4T2ZOYU4nKTtcblxuLyoqXG4gKiBUaGUgYmFzZSBpbXBsZW1lbnRhdGlvbiBvZiBgXy5pbmRleE9mYCB3aXRob3V0IHN1cHBvcnQgZm9yIGJpbmFyeSBzZWFyY2hlcy5cbiAqXG4gKiBAcHJpdmF0ZVxuICogQHBhcmFtIHtBcnJheX0gYXJyYXkgVGhlIGFycmF5IHRvIHNlYXJjaC5cbiAqIEBwYXJhbSB7Kn0gdmFsdWUgVGhlIHZhbHVlIHRvIHNlYXJjaCBmb3IuXG4gKiBAcGFyYW0ge251bWJlcn0gZnJvbUluZGV4IFRoZSBpbmRleCB0byBzZWFyY2ggZnJvbS5cbiAqIEByZXR1cm5zIHtudW1iZXJ9IFJldHVybnMgdGhlIGluZGV4IG9mIHRoZSBtYXRjaGVkIHZhbHVlLCBlbHNlIGAtMWAuXG4gKi9cbmZ1bmN0aW9uIGJhc2VJbmRleE9mKGFycmF5LCB2YWx1ZSwgZnJvbUluZGV4KSB7XG4gIGlmICh2YWx1ZSAhPT0gdmFsdWUpIHtcbiAgICByZXR1cm4gaW5kZXhPZk5hTihhcnJheSwgZnJvbUluZGV4KTtcbiAgfVxuICB2YXIgaW5kZXggPSBmcm9tSW5kZXggLSAxLFxuICAgICAgbGVuZ3RoID0gYXJyYXkubGVuZ3RoO1xuXG4gIHdoaWxlICgrK2luZGV4IDwgbGVuZ3RoKSB7XG4gICAgaWYgKGFycmF5W2luZGV4XSA9PT0gdmFsdWUpIHtcbiAgICAgIHJldHVybiBpbmRleDtcbiAgICB9XG4gIH1cbiAgcmV0dXJuIC0xO1xufVxuXG5tb2R1bGUuZXhwb3J0cyA9IGJhc2VJbmRleE9mO1xuIiwidmFyIGJhc2VJc0VxdWFsRGVlcCA9IHJlcXVpcmUoJy4vYmFzZUlzRXF1YWxEZWVwJyksXG4gICAgaXNPYmplY3QgPSByZXF1aXJlKCcuLi9sYW5nL2lzT2JqZWN0JyksXG4gICAgaXNPYmplY3RMaWtlID0gcmVxdWlyZSgnLi9pc09iamVjdExpa2UnKTtcblxuLyoqXG4gKiBUaGUgYmFzZSBpbXBsZW1lbnRhdGlvbiBvZiBgXy5pc0VxdWFsYCB3aXRob3V0IHN1cHBvcnQgZm9yIGB0aGlzYCBiaW5kaW5nXG4gKiBgY3VzdG9taXplcmAgZnVuY3Rpb25zLlxuICpcbiAqIEBwcml2YXRlXG4gKiBAcGFyYW0geyp9IHZhbHVlIFRoZSB2YWx1ZSB0byBjb21wYXJlLlxuICogQHBhcmFtIHsqfSBvdGhlciBUaGUgb3RoZXIgdmFsdWUgdG8gY29tcGFyZS5cbiAqIEBwYXJhbSB7RnVuY3Rpb259IFtjdXN0b21pemVyXSBUaGUgZnVuY3Rpb24gdG8gY3VzdG9taXplIGNvbXBhcmluZyB2YWx1ZXMuXG4gKiBAcGFyYW0ge2Jvb2xlYW59IFtpc0xvb3NlXSBTcGVjaWZ5IHBlcmZvcm1pbmcgcGFydGlhbCBjb21wYXJpc29ucy5cbiAqIEBwYXJhbSB7QXJyYXl9IFtzdGFja0FdIFRyYWNrcyB0cmF2ZXJzZWQgYHZhbHVlYCBvYmplY3RzLlxuICogQHBhcmFtIHtBcnJheX0gW3N0YWNrQl0gVHJhY2tzIHRyYXZlcnNlZCBgb3RoZXJgIG9iamVjdHMuXG4gKiBAcmV0dXJucyB7Ym9vbGVhbn0gUmV0dXJucyBgdHJ1ZWAgaWYgdGhlIHZhbHVlcyBhcmUgZXF1aXZhbGVudCwgZWxzZSBgZmFsc2VgLlxuICovXG5mdW5jdGlvbiBiYXNlSXNFcXVhbCh2YWx1ZSwgb3RoZXIsIGN1c3RvbWl6ZXIsIGlzTG9vc2UsIHN0YWNrQSwgc3RhY2tCKSB7XG4gIGlmICh2YWx1ZSA9PT0gb3RoZXIpIHtcbiAgICByZXR1cm4gdHJ1ZTtcbiAgfVxuICBpZiAodmFsdWUgPT0gbnVsbCB8fCBvdGhlciA9PSBudWxsIHx8ICghaXNPYmplY3QodmFsdWUpICYmICFpc09iamVjdExpa2Uob3RoZXIpKSkge1xuICAgIHJldHVybiB2YWx1ZSAhPT0gdmFsdWUgJiYgb3RoZXIgIT09IG90aGVyO1xuICB9XG4gIHJldHVybiBiYXNlSXNFcXVhbERlZXAodmFsdWUsIG90aGVyLCBiYXNlSXNFcXVhbCwgY3VzdG9taXplciwgaXNMb29zZSwgc3RhY2tBLCBzdGFja0IpO1xufVxuXG5tb2R1bGUuZXhwb3J0cyA9IGJhc2VJc0VxdWFsO1xuIiwidmFyIGVxdWFsQXJyYXlzID0gcmVxdWlyZSgnLi9lcXVhbEFycmF5cycpLFxuICAgIGVxdWFsQnlUYWcgPSByZXF1aXJlKCcuL2VxdWFsQnlUYWcnKSxcbiAgICBlcXVhbE9iamVjdHMgPSByZXF1aXJlKCcuL2VxdWFsT2JqZWN0cycpLFxuICAgIGlzQXJyYXkgPSByZXF1aXJlKCcuLi9sYW5nL2lzQXJyYXknKSxcbiAgICBpc0hvc3RPYmplY3QgPSByZXF1aXJlKCcuL2lzSG9zdE9iamVjdCcpLFxuICAgIGlzVHlwZWRBcnJheSA9IHJlcXVpcmUoJy4uL2xhbmcvaXNUeXBlZEFycmF5Jyk7XG5cbi8qKiBgT2JqZWN0I3RvU3RyaW5nYCByZXN1bHQgcmVmZXJlbmNlcy4gKi9cbnZhciBhcmdzVGFnID0gJ1tvYmplY3QgQXJndW1lbnRzXScsXG4gICAgYXJyYXlUYWcgPSAnW29iamVjdCBBcnJheV0nLFxuICAgIG9iamVjdFRhZyA9ICdbb2JqZWN0IE9iamVjdF0nO1xuXG4vKiogVXNlZCBmb3IgbmF0aXZlIG1ldGhvZCByZWZlcmVuY2VzLiAqL1xudmFyIG9iamVjdFByb3RvID0gT2JqZWN0LnByb3RvdHlwZTtcblxuLyoqIFVzZWQgdG8gY2hlY2sgb2JqZWN0cyBmb3Igb3duIHByb3BlcnRpZXMuICovXG52YXIgaGFzT3duUHJvcGVydHkgPSBvYmplY3RQcm90by5oYXNPd25Qcm9wZXJ0eTtcblxuLyoqXG4gKiBVc2VkIHRvIHJlc29sdmUgdGhlIFtgdG9TdHJpbmdUYWdgXShodHRwOi8vZWNtYS1pbnRlcm5hdGlvbmFsLm9yZy9lY21hLTI2Mi82LjAvI3NlYy1vYmplY3QucHJvdG90eXBlLnRvc3RyaW5nKVxuICogb2YgdmFsdWVzLlxuICovXG52YXIgb2JqVG9TdHJpbmcgPSBvYmplY3RQcm90by50b1N0cmluZztcblxuLyoqXG4gKiBBIHNwZWNpYWxpemVkIHZlcnNpb24gb2YgYGJhc2VJc0VxdWFsYCBmb3IgYXJyYXlzIGFuZCBvYmplY3RzIHdoaWNoIHBlcmZvcm1zXG4gKiBkZWVwIGNvbXBhcmlzb25zIGFuZCB0cmFja3MgdHJhdmVyc2VkIG9iamVjdHMgZW5hYmxpbmcgb2JqZWN0cyB3aXRoIGNpcmN1bGFyXG4gKiByZWZlcmVuY2VzIHRvIGJlIGNvbXBhcmVkLlxuICpcbiAqIEBwcml2YXRlXG4gKiBAcGFyYW0ge09iamVjdH0gb2JqZWN0IFRoZSBvYmplY3QgdG8gY29tcGFyZS5cbiAqIEBwYXJhbSB7T2JqZWN0fSBvdGhlciBUaGUgb3RoZXIgb2JqZWN0IHRvIGNvbXBhcmUuXG4gKiBAcGFyYW0ge0Z1bmN0aW9ufSBlcXVhbEZ1bmMgVGhlIGZ1bmN0aW9uIHRvIGRldGVybWluZSBlcXVpdmFsZW50cyBvZiB2YWx1ZXMuXG4gKiBAcGFyYW0ge0Z1bmN0aW9ufSBbY3VzdG9taXplcl0gVGhlIGZ1bmN0aW9uIHRvIGN1c3RvbWl6ZSBjb21wYXJpbmcgb2JqZWN0cy5cbiAqIEBwYXJhbSB7Ym9vbGVhbn0gW2lzTG9vc2VdIFNwZWNpZnkgcGVyZm9ybWluZyBwYXJ0aWFsIGNvbXBhcmlzb25zLlxuICogQHBhcmFtIHtBcnJheX0gW3N0YWNrQT1bXV0gVHJhY2tzIHRyYXZlcnNlZCBgdmFsdWVgIG9iamVjdHMuXG4gKiBAcGFyYW0ge0FycmF5fSBbc3RhY2tCPVtdXSBUcmFja3MgdHJhdmVyc2VkIGBvdGhlcmAgb2JqZWN0cy5cbiAqIEByZXR1cm5zIHtib29sZWFufSBSZXR1cm5zIGB0cnVlYCBpZiB0aGUgb2JqZWN0cyBhcmUgZXF1aXZhbGVudCwgZWxzZSBgZmFsc2VgLlxuICovXG5mdW5jdGlvbiBiYXNlSXNFcXVhbERlZXAob2JqZWN0LCBvdGhlciwgZXF1YWxGdW5jLCBjdXN0b21pemVyLCBpc0xvb3NlLCBzdGFja0EsIHN0YWNrQikge1xuICB2YXIgb2JqSXNBcnIgPSBpc0FycmF5KG9iamVjdCksXG4gICAgICBvdGhJc0FyciA9IGlzQXJyYXkob3RoZXIpLFxuICAgICAgb2JqVGFnID0gYXJyYXlUYWcsXG4gICAgICBvdGhUYWcgPSBhcnJheVRhZztcblxuICBpZiAoIW9iaklzQXJyKSB7XG4gICAgb2JqVGFnID0gb2JqVG9TdHJpbmcuY2FsbChvYmplY3QpO1xuICAgIGlmIChvYmpUYWcgPT0gYXJnc1RhZykge1xuICAgICAgb2JqVGFnID0gb2JqZWN0VGFnO1xuICAgIH0gZWxzZSBpZiAob2JqVGFnICE9IG9iamVjdFRhZykge1xuICAgICAgb2JqSXNBcnIgPSBpc1R5cGVkQXJyYXkob2JqZWN0KTtcbiAgICB9XG4gIH1cbiAgaWYgKCFvdGhJc0Fycikge1xuICAgIG90aFRhZyA9IG9ialRvU3RyaW5nLmNhbGwob3RoZXIpO1xuICAgIGlmIChvdGhUYWcgPT0gYXJnc1RhZykge1xuICAgICAgb3RoVGFnID0gb2JqZWN0VGFnO1xuICAgIH0gZWxzZSBpZiAob3RoVGFnICE9IG9iamVjdFRhZykge1xuICAgICAgb3RoSXNBcnIgPSBpc1R5cGVkQXJyYXkob3RoZXIpO1xuICAgIH1cbiAgfVxuICB2YXIgb2JqSXNPYmogPSBvYmpUYWcgPT0gb2JqZWN0VGFnICYmICFpc0hvc3RPYmplY3Qob2JqZWN0KSxcbiAgICAgIG90aElzT2JqID0gb3RoVGFnID09IG9iamVjdFRhZyAmJiAhaXNIb3N0T2JqZWN0KG90aGVyKSxcbiAgICAgIGlzU2FtZVRhZyA9IG9ialRhZyA9PSBvdGhUYWc7XG5cbiAgaWYgKGlzU2FtZVRhZyAmJiAhKG9iaklzQXJyIHx8IG9iaklzT2JqKSkge1xuICAgIHJldHVybiBlcXVhbEJ5VGFnKG9iamVjdCwgb3RoZXIsIG9ialRhZyk7XG4gIH1cbiAgaWYgKCFpc0xvb3NlKSB7XG4gICAgdmFyIG9iaklzV3JhcHBlZCA9IG9iaklzT2JqICYmIGhhc093blByb3BlcnR5LmNhbGwob2JqZWN0LCAnX193cmFwcGVkX18nKSxcbiAgICAgICAgb3RoSXNXcmFwcGVkID0gb3RoSXNPYmogJiYgaGFzT3duUHJvcGVydHkuY2FsbChvdGhlciwgJ19fd3JhcHBlZF9fJyk7XG5cbiAgICBpZiAob2JqSXNXcmFwcGVkIHx8IG90aElzV3JhcHBlZCkge1xuICAgICAgcmV0dXJuIGVxdWFsRnVuYyhvYmpJc1dyYXBwZWQgPyBvYmplY3QudmFsdWUoKSA6IG9iamVjdCwgb3RoSXNXcmFwcGVkID8gb3RoZXIudmFsdWUoKSA6IG90aGVyLCBjdXN0b21pemVyLCBpc0xvb3NlLCBzdGFja0EsIHN0YWNrQik7XG4gICAgfVxuICB9XG4gIGlmICghaXNTYW1lVGFnKSB7XG4gICAgcmV0dXJuIGZhbHNlO1xuICB9XG4gIC8vIEFzc3VtZSBjeWNsaWMgdmFsdWVzIGFyZSBlcXVhbC5cbiAgLy8gRm9yIG1vcmUgaW5mb3JtYXRpb24gb24gZGV0ZWN0aW5nIGNpcmN1bGFyIHJlZmVyZW5jZXMgc2VlIGh0dHBzOi8vZXM1LmdpdGh1Yi5pby8jSk8uXG4gIHN0YWNrQSB8fCAoc3RhY2tBID0gW10pO1xuICBzdGFja0IgfHwgKHN0YWNrQiA9IFtdKTtcblxuICB2YXIgbGVuZ3RoID0gc3RhY2tBLmxlbmd0aDtcbiAgd2hpbGUgKGxlbmd0aC0tKSB7XG4gICAgaWYgKHN0YWNrQVtsZW5ndGhdID09IG9iamVjdCkge1xuICAgICAgcmV0dXJuIHN0YWNrQltsZW5ndGhdID09IG90aGVyO1xuICAgIH1cbiAgfVxuICAvLyBBZGQgYG9iamVjdGAgYW5kIGBvdGhlcmAgdG8gdGhlIHN0YWNrIG9mIHRyYXZlcnNlZCBvYmplY3RzLlxuICBzdGFja0EucHVzaChvYmplY3QpO1xuICBzdGFja0IucHVzaChvdGhlcik7XG5cbiAgdmFyIHJlc3VsdCA9IChvYmpJc0FyciA/IGVxdWFsQXJyYXlzIDogZXF1YWxPYmplY3RzKShvYmplY3QsIG90aGVyLCBlcXVhbEZ1bmMsIGN1c3RvbWl6ZXIsIGlzTG9vc2UsIHN0YWNrQSwgc3RhY2tCKTtcblxuICBzdGFja0EucG9wKCk7XG4gIHN0YWNrQi5wb3AoKTtcblxuICByZXR1cm4gcmVzdWx0O1xufVxuXG5tb2R1bGUuZXhwb3J0cyA9IGJhc2VJc0VxdWFsRGVlcDtcbiIsInZhciBiYXNlSXNFcXVhbCA9IHJlcXVpcmUoJy4vYmFzZUlzRXF1YWwnKSxcbiAgICB0b09iamVjdCA9IHJlcXVpcmUoJy4vdG9PYmplY3QnKTtcblxuLyoqXG4gKiBUaGUgYmFzZSBpbXBsZW1lbnRhdGlvbiBvZiBgXy5pc01hdGNoYCB3aXRob3V0IHN1cHBvcnQgZm9yIGNhbGxiYWNrXG4gKiBzaG9ydGhhbmRzIGFuZCBgdGhpc2AgYmluZGluZy5cbiAqXG4gKiBAcHJpdmF0ZVxuICogQHBhcmFtIHtPYmplY3R9IG9iamVjdCBUaGUgb2JqZWN0IHRvIGluc3BlY3QuXG4gKiBAcGFyYW0ge0FycmF5fSBtYXRjaERhdGEgVGhlIHByb3BlcnkgbmFtZXMsIHZhbHVlcywgYW5kIGNvbXBhcmUgZmxhZ3MgdG8gbWF0Y2guXG4gKiBAcGFyYW0ge0Z1bmN0aW9ufSBbY3VzdG9taXplcl0gVGhlIGZ1bmN0aW9uIHRvIGN1c3RvbWl6ZSBjb21wYXJpbmcgb2JqZWN0cy5cbiAqIEByZXR1cm5zIHtib29sZWFufSBSZXR1cm5zIGB0cnVlYCBpZiBgb2JqZWN0YCBpcyBhIG1hdGNoLCBlbHNlIGBmYWxzZWAuXG4gKi9cbmZ1bmN0aW9uIGJhc2VJc01hdGNoKG9iamVjdCwgbWF0Y2hEYXRhLCBjdXN0b21pemVyKSB7XG4gIHZhciBpbmRleCA9IG1hdGNoRGF0YS5sZW5ndGgsXG4gICAgICBsZW5ndGggPSBpbmRleCxcbiAgICAgIG5vQ3VzdG9taXplciA9ICFjdXN0b21pemVyO1xuXG4gIGlmIChvYmplY3QgPT0gbnVsbCkge1xuICAgIHJldHVybiAhbGVuZ3RoO1xuICB9XG4gIG9iamVjdCA9IHRvT2JqZWN0KG9iamVjdCk7XG4gIHdoaWxlIChpbmRleC0tKSB7XG4gICAgdmFyIGRhdGEgPSBtYXRjaERhdGFbaW5kZXhdO1xuICAgIGlmICgobm9DdXN0b21pemVyICYmIGRhdGFbMl0pXG4gICAgICAgICAgPyBkYXRhWzFdICE9PSBvYmplY3RbZGF0YVswXV1cbiAgICAgICAgICA6ICEoZGF0YVswXSBpbiBvYmplY3QpXG4gICAgICAgICkge1xuICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH1cbiAgfVxuICB3aGlsZSAoKytpbmRleCA8IGxlbmd0aCkge1xuICAgIGRhdGEgPSBtYXRjaERhdGFbaW5kZXhdO1xuICAgIHZhciBrZXkgPSBkYXRhWzBdLFxuICAgICAgICBvYmpWYWx1ZSA9IG9iamVjdFtrZXldLFxuICAgICAgICBzcmNWYWx1ZSA9IGRhdGFbMV07XG5cbiAgICBpZiAobm9DdXN0b21pemVyICYmIGRhdGFbMl0pIHtcbiAgICAgIGlmIChvYmpWYWx1ZSA9PT0gdW5kZWZpbmVkICYmICEoa2V5IGluIG9iamVjdCkpIHtcbiAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgfVxuICAgIH0gZWxzZSB7XG4gICAgICB2YXIgcmVzdWx0ID0gY3VzdG9taXplciA/IGN1c3RvbWl6ZXIob2JqVmFsdWUsIHNyY1ZhbHVlLCBrZXkpIDogdW5kZWZpbmVkO1xuICAgICAgaWYgKCEocmVzdWx0ID09PSB1bmRlZmluZWQgPyBiYXNlSXNFcXVhbChzcmNWYWx1ZSwgb2JqVmFsdWUsIGN1c3RvbWl6ZXIsIHRydWUpIDogcmVzdWx0KSkge1xuICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICB9XG4gICAgfVxuICB9XG4gIHJldHVybiB0cnVlO1xufVxuXG5tb2R1bGUuZXhwb3J0cyA9IGJhc2VJc01hdGNoO1xuIiwiLyoqXG4gKiBUaGUgZnVuY3Rpb24gd2hvc2UgcHJvdG90eXBlIGFsbCBjaGFpbmluZyB3cmFwcGVycyBpbmhlcml0IGZyb20uXG4gKlxuICogQHByaXZhdGVcbiAqL1xuZnVuY3Rpb24gYmFzZUxvZGFzaCgpIHtcbiAgLy8gTm8gb3BlcmF0aW9uIHBlcmZvcm1lZC5cbn1cblxubW9kdWxlLmV4cG9ydHMgPSBiYXNlTG9kYXNoO1xuIiwidmFyIGJhc2VFYWNoID0gcmVxdWlyZSgnLi9iYXNlRWFjaCcpLFxuICAgIGlzQXJyYXlMaWtlID0gcmVxdWlyZSgnLi9pc0FycmF5TGlrZScpO1xuXG4vKipcbiAqIFRoZSBiYXNlIGltcGxlbWVudGF0aW9uIG9mIGBfLm1hcGAgd2l0aG91dCBzdXBwb3J0IGZvciBjYWxsYmFjayBzaG9ydGhhbmRzXG4gKiBhbmQgYHRoaXNgIGJpbmRpbmcuXG4gKlxuICogQHByaXZhdGVcbiAqIEBwYXJhbSB7QXJyYXl8T2JqZWN0fHN0cmluZ30gY29sbGVjdGlvbiBUaGUgY29sbGVjdGlvbiB0byBpdGVyYXRlIG92ZXIuXG4gKiBAcGFyYW0ge0Z1bmN0aW9ufSBpdGVyYXRlZSBUaGUgZnVuY3Rpb24gaW52b2tlZCBwZXIgaXRlcmF0aW9uLlxuICogQHJldHVybnMge0FycmF5fSBSZXR1cm5zIHRoZSBuZXcgbWFwcGVkIGFycmF5LlxuICovXG5mdW5jdGlvbiBiYXNlTWFwKGNvbGxlY3Rpb24sIGl0ZXJhdGVlKSB7XG4gIHZhciBpbmRleCA9IC0xLFxuICAgICAgcmVzdWx0ID0gaXNBcnJheUxpa2UoY29sbGVjdGlvbikgPyBBcnJheShjb2xsZWN0aW9uLmxlbmd0aCkgOiBbXTtcblxuICBiYXNlRWFjaChjb2xsZWN0aW9uLCBmdW5jdGlvbih2YWx1ZSwga2V5LCBjb2xsZWN0aW9uKSB7XG4gICAgcmVzdWx0WysraW5kZXhdID0gaXRlcmF0ZWUodmFsdWUsIGtleSwgY29sbGVjdGlvbik7XG4gIH0pO1xuICByZXR1cm4gcmVzdWx0O1xufVxuXG5tb2R1bGUuZXhwb3J0cyA9IGJhc2VNYXA7XG4iLCJ2YXIgYmFzZUlzTWF0Y2ggPSByZXF1aXJlKCcuL2Jhc2VJc01hdGNoJyksXG4gICAgZ2V0TWF0Y2hEYXRhID0gcmVxdWlyZSgnLi9nZXRNYXRjaERhdGEnKSxcbiAgICB0b09iamVjdCA9IHJlcXVpcmUoJy4vdG9PYmplY3QnKTtcblxuLyoqXG4gKiBUaGUgYmFzZSBpbXBsZW1lbnRhdGlvbiBvZiBgXy5tYXRjaGVzYCB3aGljaCBkb2VzIG5vdCBjbG9uZSBgc291cmNlYC5cbiAqXG4gKiBAcHJpdmF0ZVxuICogQHBhcmFtIHtPYmplY3R9IHNvdXJjZSBUaGUgb2JqZWN0IG9mIHByb3BlcnR5IHZhbHVlcyB0byBtYXRjaC5cbiAqIEByZXR1cm5zIHtGdW5jdGlvbn0gUmV0dXJucyB0aGUgbmV3IGZ1bmN0aW9uLlxuICovXG5mdW5jdGlvbiBiYXNlTWF0Y2hlcyhzb3VyY2UpIHtcbiAgdmFyIG1hdGNoRGF0YSA9IGdldE1hdGNoRGF0YShzb3VyY2UpO1xuICBpZiAobWF0Y2hEYXRhLmxlbmd0aCA9PSAxICYmIG1hdGNoRGF0YVswXVsyXSkge1xuICAgIHZhciBrZXkgPSBtYXRjaERhdGFbMF1bMF0sXG4gICAgICAgIHZhbHVlID0gbWF0Y2hEYXRhWzBdWzFdO1xuXG4gICAgcmV0dXJuIGZ1bmN0aW9uKG9iamVjdCkge1xuICAgICAgaWYgKG9iamVjdCA9PSBudWxsKSB7XG4gICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgIH1cbiAgICAgIG9iamVjdCA9IHRvT2JqZWN0KG9iamVjdCk7XG4gICAgICByZXR1cm4gb2JqZWN0W2tleV0gPT09IHZhbHVlICYmICh2YWx1ZSAhPT0gdW5kZWZpbmVkIHx8IChrZXkgaW4gb2JqZWN0KSk7XG4gICAgfTtcbiAgfVxuICByZXR1cm4gZnVuY3Rpb24ob2JqZWN0KSB7XG4gICAgcmV0dXJuIGJhc2VJc01hdGNoKG9iamVjdCwgbWF0Y2hEYXRhKTtcbiAgfTtcbn1cblxubW9kdWxlLmV4cG9ydHMgPSBiYXNlTWF0Y2hlcztcbiIsInZhciBiYXNlR2V0ID0gcmVxdWlyZSgnLi9iYXNlR2V0JyksXG4gICAgYmFzZUlzRXF1YWwgPSByZXF1aXJlKCcuL2Jhc2VJc0VxdWFsJyksXG4gICAgYmFzZVNsaWNlID0gcmVxdWlyZSgnLi9iYXNlU2xpY2UnKSxcbiAgICBpc0FycmF5ID0gcmVxdWlyZSgnLi4vbGFuZy9pc0FycmF5JyksXG4gICAgaXNLZXkgPSByZXF1aXJlKCcuL2lzS2V5JyksXG4gICAgaXNTdHJpY3RDb21wYXJhYmxlID0gcmVxdWlyZSgnLi9pc1N0cmljdENvbXBhcmFibGUnKSxcbiAgICBsYXN0ID0gcmVxdWlyZSgnLi4vYXJyYXkvbGFzdCcpLFxuICAgIHRvT2JqZWN0ID0gcmVxdWlyZSgnLi90b09iamVjdCcpLFxuICAgIHRvUGF0aCA9IHJlcXVpcmUoJy4vdG9QYXRoJyk7XG5cbi8qKlxuICogVGhlIGJhc2UgaW1wbGVtZW50YXRpb24gb2YgYF8ubWF0Y2hlc1Byb3BlcnR5YCB3aGljaCBkb2VzIG5vdCBjbG9uZSBgc3JjVmFsdWVgLlxuICpcbiAqIEBwcml2YXRlXG4gKiBAcGFyYW0ge3N0cmluZ30gcGF0aCBUaGUgcGF0aCBvZiB0aGUgcHJvcGVydHkgdG8gZ2V0LlxuICogQHBhcmFtIHsqfSBzcmNWYWx1ZSBUaGUgdmFsdWUgdG8gY29tcGFyZS5cbiAqIEByZXR1cm5zIHtGdW5jdGlvbn0gUmV0dXJucyB0aGUgbmV3IGZ1bmN0aW9uLlxuICovXG5mdW5jdGlvbiBiYXNlTWF0Y2hlc1Byb3BlcnR5KHBhdGgsIHNyY1ZhbHVlKSB7XG4gIHZhciBpc0FyciA9IGlzQXJyYXkocGF0aCksXG4gICAgICBpc0NvbW1vbiA9IGlzS2V5KHBhdGgpICYmIGlzU3RyaWN0Q29tcGFyYWJsZShzcmNWYWx1ZSksXG4gICAgICBwYXRoS2V5ID0gKHBhdGggKyAnJyk7XG5cbiAgcGF0aCA9IHRvUGF0aChwYXRoKTtcbiAgcmV0dXJuIGZ1bmN0aW9uKG9iamVjdCkge1xuICAgIGlmIChvYmplY3QgPT0gbnVsbCkge1xuICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH1cbiAgICB2YXIga2V5ID0gcGF0aEtleTtcbiAgICBvYmplY3QgPSB0b09iamVjdChvYmplY3QpO1xuICAgIGlmICgoaXNBcnIgfHwgIWlzQ29tbW9uKSAmJiAhKGtleSBpbiBvYmplY3QpKSB7XG4gICAgICBvYmplY3QgPSBwYXRoLmxlbmd0aCA9PSAxID8gb2JqZWN0IDogYmFzZUdldChvYmplY3QsIGJhc2VTbGljZShwYXRoLCAwLCAtMSkpO1xuICAgICAgaWYgKG9iamVjdCA9PSBudWxsKSB7XG4gICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgIH1cbiAgICAgIGtleSA9IGxhc3QocGF0aCk7XG4gICAgICBvYmplY3QgPSB0b09iamVjdChvYmplY3QpO1xuICAgIH1cbiAgICByZXR1cm4gb2JqZWN0W2tleV0gPT09IHNyY1ZhbHVlXG4gICAgICA/IChzcmNWYWx1ZSAhPT0gdW5kZWZpbmVkIHx8IChrZXkgaW4gb2JqZWN0KSlcbiAgICAgIDogYmFzZUlzRXF1YWwoc3JjVmFsdWUsIG9iamVjdFtrZXldLCB1bmRlZmluZWQsIHRydWUpO1xuICB9O1xufVxuXG5tb2R1bGUuZXhwb3J0cyA9IGJhc2VNYXRjaGVzUHJvcGVydHk7XG4iLCJ2YXIgdG9PYmplY3QgPSByZXF1aXJlKCcuL3RvT2JqZWN0Jyk7XG5cbi8qKlxuICogVGhlIGJhc2UgaW1wbGVtZW50YXRpb24gb2YgYF8ucHJvcGVydHlgIHdpdGhvdXQgc3VwcG9ydCBmb3IgZGVlcCBwYXRocy5cbiAqXG4gKiBAcHJpdmF0ZVxuICogQHBhcmFtIHtzdHJpbmd9IGtleSBUaGUga2V5IG9mIHRoZSBwcm9wZXJ0eSB0byBnZXQuXG4gKiBAcmV0dXJucyB7RnVuY3Rpb259IFJldHVybnMgdGhlIG5ldyBmdW5jdGlvbi5cbiAqL1xuZnVuY3Rpb24gYmFzZVByb3BlcnR5KGtleSkge1xuICByZXR1cm4gZnVuY3Rpb24ob2JqZWN0KSB7XG4gICAgcmV0dXJuIG9iamVjdCA9PSBudWxsID8gdW5kZWZpbmVkIDogdG9PYmplY3Qob2JqZWN0KVtrZXldO1xuICB9O1xufVxuXG5tb2R1bGUuZXhwb3J0cyA9IGJhc2VQcm9wZXJ0eTtcbiIsInZhciBiYXNlR2V0ID0gcmVxdWlyZSgnLi9iYXNlR2V0JyksXG4gICAgdG9QYXRoID0gcmVxdWlyZSgnLi90b1BhdGgnKTtcblxuLyoqXG4gKiBBIHNwZWNpYWxpemVkIHZlcnNpb24gb2YgYGJhc2VQcm9wZXJ0eWAgd2hpY2ggc3VwcG9ydHMgZGVlcCBwYXRocy5cbiAqXG4gKiBAcHJpdmF0ZVxuICogQHBhcmFtIHtBcnJheXxzdHJpbmd9IHBhdGggVGhlIHBhdGggb2YgdGhlIHByb3BlcnR5IHRvIGdldC5cbiAqIEByZXR1cm5zIHtGdW5jdGlvbn0gUmV0dXJucyB0aGUgbmV3IGZ1bmN0aW9uLlxuICovXG5mdW5jdGlvbiBiYXNlUHJvcGVydHlEZWVwKHBhdGgpIHtcbiAgdmFyIHBhdGhLZXkgPSAocGF0aCArICcnKTtcbiAgcGF0aCA9IHRvUGF0aChwYXRoKTtcbiAgcmV0dXJuIGZ1bmN0aW9uKG9iamVjdCkge1xuICAgIHJldHVybiBiYXNlR2V0KG9iamVjdCwgcGF0aCwgcGF0aEtleSk7XG4gIH07XG59XG5cbm1vZHVsZS5leHBvcnRzID0gYmFzZVByb3BlcnR5RGVlcDtcbiIsInZhciBpZGVudGl0eSA9IHJlcXVpcmUoJy4uL3V0aWxpdHkvaWRlbnRpdHknKSxcbiAgICBtZXRhTWFwID0gcmVxdWlyZSgnLi9tZXRhTWFwJyk7XG5cbi8qKlxuICogVGhlIGJhc2UgaW1wbGVtZW50YXRpb24gb2YgYHNldERhdGFgIHdpdGhvdXQgc3VwcG9ydCBmb3IgaG90IGxvb3AgZGV0ZWN0aW9uLlxuICpcbiAqIEBwcml2YXRlXG4gKiBAcGFyYW0ge0Z1bmN0aW9ufSBmdW5jIFRoZSBmdW5jdGlvbiB0byBhc3NvY2lhdGUgbWV0YWRhdGEgd2l0aC5cbiAqIEBwYXJhbSB7Kn0gZGF0YSBUaGUgbWV0YWRhdGEuXG4gKiBAcmV0dXJucyB7RnVuY3Rpb259IFJldHVybnMgYGZ1bmNgLlxuICovXG52YXIgYmFzZVNldERhdGEgPSAhbWV0YU1hcCA/IGlkZW50aXR5IDogZnVuY3Rpb24oZnVuYywgZGF0YSkge1xuICBtZXRhTWFwLnNldChmdW5jLCBkYXRhKTtcbiAgcmV0dXJuIGZ1bmM7XG59O1xuXG5tb2R1bGUuZXhwb3J0cyA9IGJhc2VTZXREYXRhO1xuIiwiLyoqXG4gKiBUaGUgYmFzZSBpbXBsZW1lbnRhdGlvbiBvZiBgXy5zbGljZWAgd2l0aG91dCBhbiBpdGVyYXRlZSBjYWxsIGd1YXJkLlxuICpcbiAqIEBwcml2YXRlXG4gKiBAcGFyYW0ge0FycmF5fSBhcnJheSBUaGUgYXJyYXkgdG8gc2xpY2UuXG4gKiBAcGFyYW0ge251bWJlcn0gW3N0YXJ0PTBdIFRoZSBzdGFydCBwb3NpdGlvbi5cbiAqIEBwYXJhbSB7bnVtYmVyfSBbZW5kPWFycmF5Lmxlbmd0aF0gVGhlIGVuZCBwb3NpdGlvbi5cbiAqIEByZXR1cm5zIHtBcnJheX0gUmV0dXJucyB0aGUgc2xpY2Ugb2YgYGFycmF5YC5cbiAqL1xuZnVuY3Rpb24gYmFzZVNsaWNlKGFycmF5LCBzdGFydCwgZW5kKSB7XG4gIHZhciBpbmRleCA9IC0xLFxuICAgICAgbGVuZ3RoID0gYXJyYXkubGVuZ3RoO1xuXG4gIHN0YXJ0ID0gc3RhcnQgPT0gbnVsbCA/IDAgOiAoK3N0YXJ0IHx8IDApO1xuICBpZiAoc3RhcnQgPCAwKSB7XG4gICAgc3RhcnQgPSAtc3RhcnQgPiBsZW5ndGggPyAwIDogKGxlbmd0aCArIHN0YXJ0KTtcbiAgfVxuICBlbmQgPSAoZW5kID09PSB1bmRlZmluZWQgfHwgZW5kID4gbGVuZ3RoKSA/IGxlbmd0aCA6ICgrZW5kIHx8IDApO1xuICBpZiAoZW5kIDwgMCkge1xuICAgIGVuZCArPSBsZW5ndGg7XG4gIH1cbiAgbGVuZ3RoID0gc3RhcnQgPiBlbmQgPyAwIDogKChlbmQgLSBzdGFydCkgPj4+IDApO1xuICBzdGFydCA+Pj49IDA7XG5cbiAgdmFyIHJlc3VsdCA9IEFycmF5KGxlbmd0aCk7XG4gIHdoaWxlICgrK2luZGV4IDwgbGVuZ3RoKSB7XG4gICAgcmVzdWx0W2luZGV4XSA9IGFycmF5W2luZGV4ICsgc3RhcnRdO1xuICB9XG4gIHJldHVybiByZXN1bHQ7XG59XG5cbm1vZHVsZS5leHBvcnRzID0gYmFzZVNsaWNlO1xuIiwiLyoqXG4gKiBDb252ZXJ0cyBgdmFsdWVgIHRvIGEgc3RyaW5nIGlmIGl0J3Mgbm90IG9uZS4gQW4gZW1wdHkgc3RyaW5nIGlzIHJldHVybmVkXG4gKiBmb3IgYG51bGxgIG9yIGB1bmRlZmluZWRgIHZhbHVlcy5cbiAqXG4gKiBAcHJpdmF0ZVxuICogQHBhcmFtIHsqfSB2YWx1ZSBUaGUgdmFsdWUgdG8gcHJvY2Vzcy5cbiAqIEByZXR1cm5zIHtzdHJpbmd9IFJldHVybnMgdGhlIHN0cmluZy5cbiAqL1xuZnVuY3Rpb24gYmFzZVRvU3RyaW5nKHZhbHVlKSB7XG4gIHJldHVybiB2YWx1ZSA9PSBudWxsID8gJycgOiAodmFsdWUgKyAnJyk7XG59XG5cbm1vZHVsZS5leHBvcnRzID0gYmFzZVRvU3RyaW5nO1xuIiwiLyoqXG4gKiBUaGUgYmFzZSBpbXBsZW1lbnRhdGlvbiBvZiBgXy52YWx1ZXNgIGFuZCBgXy52YWx1ZXNJbmAgd2hpY2ggY3JlYXRlcyBhblxuICogYXJyYXkgb2YgYG9iamVjdGAgcHJvcGVydHkgdmFsdWVzIGNvcnJlc3BvbmRpbmcgdG8gdGhlIHByb3BlcnR5IG5hbWVzXG4gKiBvZiBgcHJvcHNgLlxuICpcbiAqIEBwcml2YXRlXG4gKiBAcGFyYW0ge09iamVjdH0gb2JqZWN0IFRoZSBvYmplY3QgdG8gcXVlcnkuXG4gKiBAcGFyYW0ge0FycmF5fSBwcm9wcyBUaGUgcHJvcGVydHkgbmFtZXMgdG8gZ2V0IHZhbHVlcyBmb3IuXG4gKiBAcmV0dXJucyB7T2JqZWN0fSBSZXR1cm5zIHRoZSBhcnJheSBvZiBwcm9wZXJ0eSB2YWx1ZXMuXG4gKi9cbmZ1bmN0aW9uIGJhc2VWYWx1ZXMob2JqZWN0LCBwcm9wcykge1xuICB2YXIgaW5kZXggPSAtMSxcbiAgICAgIGxlbmd0aCA9IHByb3BzLmxlbmd0aCxcbiAgICAgIHJlc3VsdCA9IEFycmF5KGxlbmd0aCk7XG5cbiAgd2hpbGUgKCsraW5kZXggPCBsZW5ndGgpIHtcbiAgICByZXN1bHRbaW5kZXhdID0gb2JqZWN0W3Byb3BzW2luZGV4XV07XG4gIH1cbiAgcmV0dXJuIHJlc3VsdDtcbn1cblxubW9kdWxlLmV4cG9ydHMgPSBiYXNlVmFsdWVzO1xuIiwidmFyIGJpbmFyeUluZGV4QnkgPSByZXF1aXJlKCcuL2JpbmFyeUluZGV4QnknKSxcbiAgICBpZGVudGl0eSA9IHJlcXVpcmUoJy4uL3V0aWxpdHkvaWRlbnRpdHknKTtcblxuLyoqIFVzZWQgYXMgcmVmZXJlbmNlcyBmb3IgdGhlIG1heGltdW0gbGVuZ3RoIGFuZCBpbmRleCBvZiBhbiBhcnJheS4gKi9cbnZhciBNQVhfQVJSQVlfTEVOR1RIID0gNDI5NDk2NzI5NSxcbiAgICBIQUxGX01BWF9BUlJBWV9MRU5HVEggPSBNQVhfQVJSQVlfTEVOR1RIID4+PiAxO1xuXG4vKipcbiAqIFBlcmZvcm1zIGEgYmluYXJ5IHNlYXJjaCBvZiBgYXJyYXlgIHRvIGRldGVybWluZSB0aGUgaW5kZXggYXQgd2hpY2ggYHZhbHVlYFxuICogc2hvdWxkIGJlIGluc2VydGVkIGludG8gYGFycmF5YCBpbiBvcmRlciB0byBtYWludGFpbiBpdHMgc29ydCBvcmRlci5cbiAqXG4gKiBAcHJpdmF0ZVxuICogQHBhcmFtIHtBcnJheX0gYXJyYXkgVGhlIHNvcnRlZCBhcnJheSB0byBpbnNwZWN0LlxuICogQHBhcmFtIHsqfSB2YWx1ZSBUaGUgdmFsdWUgdG8gZXZhbHVhdGUuXG4gKiBAcGFyYW0ge2Jvb2xlYW59IFtyZXRIaWdoZXN0XSBTcGVjaWZ5IHJldHVybmluZyB0aGUgaGlnaGVzdCBxdWFsaWZpZWQgaW5kZXguXG4gKiBAcmV0dXJucyB7bnVtYmVyfSBSZXR1cm5zIHRoZSBpbmRleCBhdCB3aGljaCBgdmFsdWVgIHNob3VsZCBiZSBpbnNlcnRlZFxuICogIGludG8gYGFycmF5YC5cbiAqL1xuZnVuY3Rpb24gYmluYXJ5SW5kZXgoYXJyYXksIHZhbHVlLCByZXRIaWdoZXN0KSB7XG4gIHZhciBsb3cgPSAwLFxuICAgICAgaGlnaCA9IGFycmF5ID8gYXJyYXkubGVuZ3RoIDogbG93O1xuXG4gIGlmICh0eXBlb2YgdmFsdWUgPT0gJ251bWJlcicgJiYgdmFsdWUgPT09IHZhbHVlICYmIGhpZ2ggPD0gSEFMRl9NQVhfQVJSQVlfTEVOR1RIKSB7XG4gICAgd2hpbGUgKGxvdyA8IGhpZ2gpIHtcbiAgICAgIHZhciBtaWQgPSAobG93ICsgaGlnaCkgPj4+IDEsXG4gICAgICAgICAgY29tcHV0ZWQgPSBhcnJheVttaWRdO1xuXG4gICAgICBpZiAoKHJldEhpZ2hlc3QgPyAoY29tcHV0ZWQgPD0gdmFsdWUpIDogKGNvbXB1dGVkIDwgdmFsdWUpKSAmJiBjb21wdXRlZCAhPT0gbnVsbCkge1xuICAgICAgICBsb3cgPSBtaWQgKyAxO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgaGlnaCA9IG1pZDtcbiAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuIGhpZ2g7XG4gIH1cbiAgcmV0dXJuIGJpbmFyeUluZGV4QnkoYXJyYXksIHZhbHVlLCBpZGVudGl0eSwgcmV0SGlnaGVzdCk7XG59XG5cbm1vZHVsZS5leHBvcnRzID0gYmluYXJ5SW5kZXg7XG4iLCIvKiBOYXRpdmUgbWV0aG9kIHJlZmVyZW5jZXMgZm9yIHRob3NlIHdpdGggdGhlIHNhbWUgbmFtZSBhcyBvdGhlciBgbG9kYXNoYCBtZXRob2RzLiAqL1xudmFyIG5hdGl2ZUZsb29yID0gTWF0aC5mbG9vcixcbiAgICBuYXRpdmVNaW4gPSBNYXRoLm1pbjtcblxuLyoqIFVzZWQgYXMgcmVmZXJlbmNlcyBmb3IgdGhlIG1heGltdW0gbGVuZ3RoIGFuZCBpbmRleCBvZiBhbiBhcnJheS4gKi9cbnZhciBNQVhfQVJSQVlfTEVOR1RIID0gNDI5NDk2NzI5NSxcbiAgICBNQVhfQVJSQVlfSU5ERVggPSBNQVhfQVJSQVlfTEVOR1RIIC0gMTtcblxuLyoqXG4gKiBUaGlzIGZ1bmN0aW9uIGlzIGxpa2UgYGJpbmFyeUluZGV4YCBleGNlcHQgdGhhdCBpdCBpbnZva2VzIGBpdGVyYXRlZWAgZm9yXG4gKiBgdmFsdWVgIGFuZCBlYWNoIGVsZW1lbnQgb2YgYGFycmF5YCB0byBjb21wdXRlIHRoZWlyIHNvcnQgcmFua2luZy4gVGhlXG4gKiBpdGVyYXRlZSBpcyBpbnZva2VkIHdpdGggb25lIGFyZ3VtZW50OyAodmFsdWUpLlxuICpcbiAqIEBwcml2YXRlXG4gKiBAcGFyYW0ge0FycmF5fSBhcnJheSBUaGUgc29ydGVkIGFycmF5IHRvIGluc3BlY3QuXG4gKiBAcGFyYW0geyp9IHZhbHVlIFRoZSB2YWx1ZSB0byBldmFsdWF0ZS5cbiAqIEBwYXJhbSB7RnVuY3Rpb259IGl0ZXJhdGVlIFRoZSBmdW5jdGlvbiBpbnZva2VkIHBlciBpdGVyYXRpb24uXG4gKiBAcGFyYW0ge2Jvb2xlYW59IFtyZXRIaWdoZXN0XSBTcGVjaWZ5IHJldHVybmluZyB0aGUgaGlnaGVzdCBxdWFsaWZpZWQgaW5kZXguXG4gKiBAcmV0dXJucyB7bnVtYmVyfSBSZXR1cm5zIHRoZSBpbmRleCBhdCB3aGljaCBgdmFsdWVgIHNob3VsZCBiZSBpbnNlcnRlZFxuICogIGludG8gYGFycmF5YC5cbiAqL1xuZnVuY3Rpb24gYmluYXJ5SW5kZXhCeShhcnJheSwgdmFsdWUsIGl0ZXJhdGVlLCByZXRIaWdoZXN0KSB7XG4gIHZhbHVlID0gaXRlcmF0ZWUodmFsdWUpO1xuXG4gIHZhciBsb3cgPSAwLFxuICAgICAgaGlnaCA9IGFycmF5ID8gYXJyYXkubGVuZ3RoIDogMCxcbiAgICAgIHZhbElzTmFOID0gdmFsdWUgIT09IHZhbHVlLFxuICAgICAgdmFsSXNOdWxsID0gdmFsdWUgPT09IG51bGwsXG4gICAgICB2YWxJc1VuZGVmID0gdmFsdWUgPT09IHVuZGVmaW5lZDtcblxuICB3aGlsZSAobG93IDwgaGlnaCkge1xuICAgIHZhciBtaWQgPSBuYXRpdmVGbG9vcigobG93ICsgaGlnaCkgLyAyKSxcbiAgICAgICAgY29tcHV0ZWQgPSBpdGVyYXRlZShhcnJheVttaWRdKSxcbiAgICAgICAgaXNEZWYgPSBjb21wdXRlZCAhPT0gdW5kZWZpbmVkLFxuICAgICAgICBpc1JlZmxleGl2ZSA9IGNvbXB1dGVkID09PSBjb21wdXRlZDtcblxuICAgIGlmICh2YWxJc05hTikge1xuICAgICAgdmFyIHNldExvdyA9IGlzUmVmbGV4aXZlIHx8IHJldEhpZ2hlc3Q7XG4gICAgfSBlbHNlIGlmICh2YWxJc051bGwpIHtcbiAgICAgIHNldExvdyA9IGlzUmVmbGV4aXZlICYmIGlzRGVmICYmIChyZXRIaWdoZXN0IHx8IGNvbXB1dGVkICE9IG51bGwpO1xuICAgIH0gZWxzZSBpZiAodmFsSXNVbmRlZikge1xuICAgICAgc2V0TG93ID0gaXNSZWZsZXhpdmUgJiYgKHJldEhpZ2hlc3QgfHwgaXNEZWYpO1xuICAgIH0gZWxzZSBpZiAoY29tcHV0ZWQgPT0gbnVsbCkge1xuICAgICAgc2V0TG93ID0gZmFsc2U7XG4gICAgfSBlbHNlIHtcbiAgICAgIHNldExvdyA9IHJldEhpZ2hlc3QgPyAoY29tcHV0ZWQgPD0gdmFsdWUpIDogKGNvbXB1dGVkIDwgdmFsdWUpO1xuICAgIH1cbiAgICBpZiAoc2V0TG93KSB7XG4gICAgICBsb3cgPSBtaWQgKyAxO1xuICAgIH0gZWxzZSB7XG4gICAgICBoaWdoID0gbWlkO1xuICAgIH1cbiAgfVxuICByZXR1cm4gbmF0aXZlTWluKGhpZ2gsIE1BWF9BUlJBWV9JTkRFWCk7XG59XG5cbm1vZHVsZS5leHBvcnRzID0gYmluYXJ5SW5kZXhCeTtcbiIsInZhciBpZGVudGl0eSA9IHJlcXVpcmUoJy4uL3V0aWxpdHkvaWRlbnRpdHknKTtcblxuLyoqXG4gKiBBIHNwZWNpYWxpemVkIHZlcnNpb24gb2YgYGJhc2VDYWxsYmFja2Agd2hpY2ggb25seSBzdXBwb3J0cyBgdGhpc2AgYmluZGluZ1xuICogYW5kIHNwZWNpZnlpbmcgdGhlIG51bWJlciBvZiBhcmd1bWVudHMgdG8gcHJvdmlkZSB0byBgZnVuY2AuXG4gKlxuICogQHByaXZhdGVcbiAqIEBwYXJhbSB7RnVuY3Rpb259IGZ1bmMgVGhlIGZ1bmN0aW9uIHRvIGJpbmQuXG4gKiBAcGFyYW0geyp9IHRoaXNBcmcgVGhlIGB0aGlzYCBiaW5kaW5nIG9mIGBmdW5jYC5cbiAqIEBwYXJhbSB7bnVtYmVyfSBbYXJnQ291bnRdIFRoZSBudW1iZXIgb2YgYXJndW1lbnRzIHRvIHByb3ZpZGUgdG8gYGZ1bmNgLlxuICogQHJldHVybnMge0Z1bmN0aW9ufSBSZXR1cm5zIHRoZSBjYWxsYmFjay5cbiAqL1xuZnVuY3Rpb24gYmluZENhbGxiYWNrKGZ1bmMsIHRoaXNBcmcsIGFyZ0NvdW50KSB7XG4gIGlmICh0eXBlb2YgZnVuYyAhPSAnZnVuY3Rpb24nKSB7XG4gICAgcmV0dXJuIGlkZW50aXR5O1xuICB9XG4gIGlmICh0aGlzQXJnID09PSB1bmRlZmluZWQpIHtcbiAgICByZXR1cm4gZnVuYztcbiAgfVxuICBzd2l0Y2ggKGFyZ0NvdW50KSB7XG4gICAgY2FzZSAxOiByZXR1cm4gZnVuY3Rpb24odmFsdWUpIHtcbiAgICAgIHJldHVybiBmdW5jLmNhbGwodGhpc0FyZywgdmFsdWUpO1xuICAgIH07XG4gICAgY2FzZSAzOiByZXR1cm4gZnVuY3Rpb24odmFsdWUsIGluZGV4LCBjb2xsZWN0aW9uKSB7XG4gICAgICByZXR1cm4gZnVuYy5jYWxsKHRoaXNBcmcsIHZhbHVlLCBpbmRleCwgY29sbGVjdGlvbik7XG4gICAgfTtcbiAgICBjYXNlIDQ6IHJldHVybiBmdW5jdGlvbihhY2N1bXVsYXRvciwgdmFsdWUsIGluZGV4LCBjb2xsZWN0aW9uKSB7XG4gICAgICByZXR1cm4gZnVuYy5jYWxsKHRoaXNBcmcsIGFjY3VtdWxhdG9yLCB2YWx1ZSwgaW5kZXgsIGNvbGxlY3Rpb24pO1xuICAgIH07XG4gICAgY2FzZSA1OiByZXR1cm4gZnVuY3Rpb24odmFsdWUsIG90aGVyLCBrZXksIG9iamVjdCwgc291cmNlKSB7XG4gICAgICByZXR1cm4gZnVuYy5jYWxsKHRoaXNBcmcsIHZhbHVlLCBvdGhlciwga2V5LCBvYmplY3QsIHNvdXJjZSk7XG4gICAgfTtcbiAgfVxuICByZXR1cm4gZnVuY3Rpb24oKSB7XG4gICAgcmV0dXJuIGZ1bmMuYXBwbHkodGhpc0FyZywgYXJndW1lbnRzKTtcbiAgfTtcbn1cblxubW9kdWxlLmV4cG9ydHMgPSBiaW5kQ2FsbGJhY2s7XG4iLCIoZnVuY3Rpb24gKGdsb2JhbCl7XG4vKiogTmF0aXZlIG1ldGhvZCByZWZlcmVuY2VzLiAqL1xudmFyIEFycmF5QnVmZmVyID0gZ2xvYmFsLkFycmF5QnVmZmVyLFxuICAgIFVpbnQ4QXJyYXkgPSBnbG9iYWwuVWludDhBcnJheTtcblxuLyoqXG4gKiBDcmVhdGVzIGEgY2xvbmUgb2YgdGhlIGdpdmVuIGFycmF5IGJ1ZmZlci5cbiAqXG4gKiBAcHJpdmF0ZVxuICogQHBhcmFtIHtBcnJheUJ1ZmZlcn0gYnVmZmVyIFRoZSBhcnJheSBidWZmZXIgdG8gY2xvbmUuXG4gKiBAcmV0dXJucyB7QXJyYXlCdWZmZXJ9IFJldHVybnMgdGhlIGNsb25lZCBhcnJheSBidWZmZXIuXG4gKi9cbmZ1bmN0aW9uIGJ1ZmZlckNsb25lKGJ1ZmZlcikge1xuICB2YXIgcmVzdWx0ID0gbmV3IEFycmF5QnVmZmVyKGJ1ZmZlci5ieXRlTGVuZ3RoKSxcbiAgICAgIHZpZXcgPSBuZXcgVWludDhBcnJheShyZXN1bHQpO1xuXG4gIHZpZXcuc2V0KG5ldyBVaW50OEFycmF5KGJ1ZmZlcikpO1xuICByZXR1cm4gcmVzdWx0O1xufVxuXG5tb2R1bGUuZXhwb3J0cyA9IGJ1ZmZlckNsb25lO1xuXG59KS5jYWxsKHRoaXMsdHlwZW9mIGdsb2JhbCAhPT0gXCJ1bmRlZmluZWRcIiA/IGdsb2JhbCA6IHR5cGVvZiBzZWxmICE9PSBcInVuZGVmaW5lZFwiID8gc2VsZiA6IHR5cGVvZiB3aW5kb3cgIT09IFwidW5kZWZpbmVkXCIgPyB3aW5kb3cgOiB7fSlcbi8vIyBzb3VyY2VNYXBwaW5nVVJMPWRhdGE6YXBwbGljYXRpb24vanNvbjtjaGFyc2V0OnV0Zi04O2Jhc2U2NCxleUoyWlhKemFXOXVJam96TENKemIzVnlZMlZ6SWpwYkltNXZaR1ZmYlc5a2RXeGxjeTlzYjJSaGMyZ3RZMjl0Y0dGMEwybHVkR1Z5Ym1Gc0wySjFabVpsY2tOc2IyNWxMbXB6SWwwc0ltNWhiV1Z6SWpwYlhTd2liV0Z3Y0dsdVozTWlPaUk3UVVGQlFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRWlMQ0ptYVd4bElqb2laMlZ1WlhKaGRHVmtMbXB6SWl3aWMyOTFjbU5sVW05dmRDSTZJaUlzSW5OdmRYSmpaWE5EYjI1MFpXNTBJanBiSWk4cUtpQk9ZWFJwZG1VZ2JXVjBhRzlrSUhKbFptVnlaVzVqWlhNdUlDb3ZYRzUyWVhJZ1FYSnlZWGxDZFdabVpYSWdQU0JuYkc5aVlXd3VRWEp5WVhsQ2RXWm1aWElzWEc0Z0lDQWdWV2x1ZERoQmNuSmhlU0E5SUdkc2IySmhiQzVWYVc1ME9FRnljbUY1TzF4dVhHNHZLaXBjYmlBcUlFTnlaV0YwWlhNZ1lTQmpiRzl1WlNCdlppQjBhR1VnWjJsMlpXNGdZWEp5WVhrZ1luVm1abVZ5TGx4dUlDcGNiaUFxSUVCd2NtbDJZWFJsWEc0Z0tpQkFjR0Z5WVcwZ2UwRnljbUY1UW5WbVptVnlmU0JpZFdabVpYSWdWR2hsSUdGeWNtRjVJR0oxWm1abGNpQjBieUJqYkc5dVpTNWNiaUFxSUVCeVpYUjFjbTV6SUh0QmNuSmhlVUoxWm1abGNuMGdVbVYwZFhKdWN5QjBhR1VnWTJ4dmJtVmtJR0Z5Y21GNUlHSjFabVpsY2k1Y2JpQXFMMXh1Wm5WdVkzUnBiMjRnWW5WbVptVnlRMnh2Ym1Vb1luVm1abVZ5S1NCN1hHNGdJSFpoY2lCeVpYTjFiSFFnUFNCdVpYY2dRWEp5WVhsQ2RXWm1aWElvWW5WbVptVnlMbUo1ZEdWTVpXNW5kR2dwTEZ4dUlDQWdJQ0FnZG1sbGR5QTlJRzVsZHlCVmFXNTBPRUZ5Y21GNUtISmxjM1ZzZENrN1hHNWNiaUFnZG1sbGR5NXpaWFFvYm1WM0lGVnBiblE0UVhKeVlYa29ZblZtWm1WeUtTazdYRzRnSUhKbGRIVnliaUJ5WlhOMWJIUTdYRzU5WEc1Y2JtMXZaSFZzWlM1bGVIQnZjblJ6SUQwZ1luVm1abVZ5UTJ4dmJtVTdYRzRpWFgwPSIsIi8qIE5hdGl2ZSBtZXRob2QgcmVmZXJlbmNlcyBmb3IgdGhvc2Ugd2l0aCB0aGUgc2FtZSBuYW1lIGFzIG90aGVyIGBsb2Rhc2hgIG1ldGhvZHMuICovXG52YXIgbmF0aXZlTWF4ID0gTWF0aC5tYXg7XG5cbi8qKlxuICogQ3JlYXRlcyBhbiBhcnJheSB0aGF0IGlzIHRoZSBjb21wb3NpdGlvbiBvZiBwYXJ0aWFsbHkgYXBwbGllZCBhcmd1bWVudHMsXG4gKiBwbGFjZWhvbGRlcnMsIGFuZCBwcm92aWRlZCBhcmd1bWVudHMgaW50byBhIHNpbmdsZSBhcnJheSBvZiBhcmd1bWVudHMuXG4gKlxuICogQHByaXZhdGVcbiAqIEBwYXJhbSB7QXJyYXl8T2JqZWN0fSBhcmdzIFRoZSBwcm92aWRlZCBhcmd1bWVudHMuXG4gKiBAcGFyYW0ge0FycmF5fSBwYXJ0aWFscyBUaGUgYXJndW1lbnRzIHRvIHByZXBlbmQgdG8gdGhvc2UgcHJvdmlkZWQuXG4gKiBAcGFyYW0ge0FycmF5fSBob2xkZXJzIFRoZSBgcGFydGlhbHNgIHBsYWNlaG9sZGVyIGluZGV4ZXMuXG4gKiBAcmV0dXJucyB7QXJyYXl9IFJldHVybnMgdGhlIG5ldyBhcnJheSBvZiBjb21wb3NlZCBhcmd1bWVudHMuXG4gKi9cbmZ1bmN0aW9uIGNvbXBvc2VBcmdzKGFyZ3MsIHBhcnRpYWxzLCBob2xkZXJzKSB7XG4gIHZhciBob2xkZXJzTGVuZ3RoID0gaG9sZGVycy5sZW5ndGgsXG4gICAgICBhcmdzSW5kZXggPSAtMSxcbiAgICAgIGFyZ3NMZW5ndGggPSBuYXRpdmVNYXgoYXJncy5sZW5ndGggLSBob2xkZXJzTGVuZ3RoLCAwKSxcbiAgICAgIGxlZnRJbmRleCA9IC0xLFxuICAgICAgbGVmdExlbmd0aCA9IHBhcnRpYWxzLmxlbmd0aCxcbiAgICAgIHJlc3VsdCA9IEFycmF5KGxlZnRMZW5ndGggKyBhcmdzTGVuZ3RoKTtcblxuICB3aGlsZSAoKytsZWZ0SW5kZXggPCBsZWZ0TGVuZ3RoKSB7XG4gICAgcmVzdWx0W2xlZnRJbmRleF0gPSBwYXJ0aWFsc1tsZWZ0SW5kZXhdO1xuICB9XG4gIHdoaWxlICgrK2FyZ3NJbmRleCA8IGhvbGRlcnNMZW5ndGgpIHtcbiAgICByZXN1bHRbaG9sZGVyc1thcmdzSW5kZXhdXSA9IGFyZ3NbYXJnc0luZGV4XTtcbiAgfVxuICB3aGlsZSAoYXJnc0xlbmd0aC0tKSB7XG4gICAgcmVzdWx0W2xlZnRJbmRleCsrXSA9IGFyZ3NbYXJnc0luZGV4KytdO1xuICB9XG4gIHJldHVybiByZXN1bHQ7XG59XG5cbm1vZHVsZS5leHBvcnRzID0gY29tcG9zZUFyZ3M7XG4iLCIvKiBOYXRpdmUgbWV0aG9kIHJlZmVyZW5jZXMgZm9yIHRob3NlIHdpdGggdGhlIHNhbWUgbmFtZSBhcyBvdGhlciBgbG9kYXNoYCBtZXRob2RzLiAqL1xudmFyIG5hdGl2ZU1heCA9IE1hdGgubWF4O1xuXG4vKipcbiAqIFRoaXMgZnVuY3Rpb24gaXMgbGlrZSBgY29tcG9zZUFyZ3NgIGV4Y2VwdCB0aGF0IHRoZSBhcmd1bWVudHMgY29tcG9zaXRpb25cbiAqIGlzIHRhaWxvcmVkIGZvciBgXy5wYXJ0aWFsUmlnaHRgLlxuICpcbiAqIEBwcml2YXRlXG4gKiBAcGFyYW0ge0FycmF5fE9iamVjdH0gYXJncyBUaGUgcHJvdmlkZWQgYXJndW1lbnRzLlxuICogQHBhcmFtIHtBcnJheX0gcGFydGlhbHMgVGhlIGFyZ3VtZW50cyB0byBhcHBlbmQgdG8gdGhvc2UgcHJvdmlkZWQuXG4gKiBAcGFyYW0ge0FycmF5fSBob2xkZXJzIFRoZSBgcGFydGlhbHNgIHBsYWNlaG9sZGVyIGluZGV4ZXMuXG4gKiBAcmV0dXJucyB7QXJyYXl9IFJldHVybnMgdGhlIG5ldyBhcnJheSBvZiBjb21wb3NlZCBhcmd1bWVudHMuXG4gKi9cbmZ1bmN0aW9uIGNvbXBvc2VBcmdzUmlnaHQoYXJncywgcGFydGlhbHMsIGhvbGRlcnMpIHtcbiAgdmFyIGhvbGRlcnNJbmRleCA9IC0xLFxuICAgICAgaG9sZGVyc0xlbmd0aCA9IGhvbGRlcnMubGVuZ3RoLFxuICAgICAgYXJnc0luZGV4ID0gLTEsXG4gICAgICBhcmdzTGVuZ3RoID0gbmF0aXZlTWF4KGFyZ3MubGVuZ3RoIC0gaG9sZGVyc0xlbmd0aCwgMCksXG4gICAgICByaWdodEluZGV4ID0gLTEsXG4gICAgICByaWdodExlbmd0aCA9IHBhcnRpYWxzLmxlbmd0aCxcbiAgICAgIHJlc3VsdCA9IEFycmF5KGFyZ3NMZW5ndGggKyByaWdodExlbmd0aCk7XG5cbiAgd2hpbGUgKCsrYXJnc0luZGV4IDwgYXJnc0xlbmd0aCkge1xuICAgIHJlc3VsdFthcmdzSW5kZXhdID0gYXJnc1thcmdzSW5kZXhdO1xuICB9XG4gIHZhciBvZmZzZXQgPSBhcmdzSW5kZXg7XG4gIHdoaWxlICgrK3JpZ2h0SW5kZXggPCByaWdodExlbmd0aCkge1xuICAgIHJlc3VsdFtvZmZzZXQgKyByaWdodEluZGV4XSA9IHBhcnRpYWxzW3JpZ2h0SW5kZXhdO1xuICB9XG4gIHdoaWxlICgrK2hvbGRlcnNJbmRleCA8IGhvbGRlcnNMZW5ndGgpIHtcbiAgICByZXN1bHRbb2Zmc2V0ICsgaG9sZGVyc1tob2xkZXJzSW5kZXhdXSA9IGFyZ3NbYXJnc0luZGV4KytdO1xuICB9XG4gIHJldHVybiByZXN1bHQ7XG59XG5cbm1vZHVsZS5leHBvcnRzID0gY29tcG9zZUFyZ3NSaWdodDtcbiIsInZhciBnZXRMZW5ndGggPSByZXF1aXJlKCcuL2dldExlbmd0aCcpLFxuICAgIGlzTGVuZ3RoID0gcmVxdWlyZSgnLi9pc0xlbmd0aCcpLFxuICAgIHRvT2JqZWN0ID0gcmVxdWlyZSgnLi90b09iamVjdCcpO1xuXG4vKipcbiAqIENyZWF0ZXMgYSBgYmFzZUVhY2hgIG9yIGBiYXNlRWFjaFJpZ2h0YCBmdW5jdGlvbi5cbiAqXG4gKiBAcHJpdmF0ZVxuICogQHBhcmFtIHtGdW5jdGlvbn0gZWFjaEZ1bmMgVGhlIGZ1bmN0aW9uIHRvIGl0ZXJhdGUgb3ZlciBhIGNvbGxlY3Rpb24uXG4gKiBAcGFyYW0ge2Jvb2xlYW59IFtmcm9tUmlnaHRdIFNwZWNpZnkgaXRlcmF0aW5nIGZyb20gcmlnaHQgdG8gbGVmdC5cbiAqIEByZXR1cm5zIHtGdW5jdGlvbn0gUmV0dXJucyB0aGUgbmV3IGJhc2UgZnVuY3Rpb24uXG4gKi9cbmZ1bmN0aW9uIGNyZWF0ZUJhc2VFYWNoKGVhY2hGdW5jLCBmcm9tUmlnaHQpIHtcbiAgcmV0dXJuIGZ1bmN0aW9uKGNvbGxlY3Rpb24sIGl0ZXJhdGVlKSB7XG4gICAgdmFyIGxlbmd0aCA9IGNvbGxlY3Rpb24gPyBnZXRMZW5ndGgoY29sbGVjdGlvbikgOiAwO1xuICAgIGlmICghaXNMZW5ndGgobGVuZ3RoKSkge1xuICAgICAgcmV0dXJuIGVhY2hGdW5jKGNvbGxlY3Rpb24sIGl0ZXJhdGVlKTtcbiAgICB9XG4gICAgdmFyIGluZGV4ID0gZnJvbVJpZ2h0ID8gbGVuZ3RoIDogLTEsXG4gICAgICAgIGl0ZXJhYmxlID0gdG9PYmplY3QoY29sbGVjdGlvbik7XG5cbiAgICB3aGlsZSAoKGZyb21SaWdodCA/IGluZGV4LS0gOiArK2luZGV4IDwgbGVuZ3RoKSkge1xuICAgICAgaWYgKGl0ZXJhdGVlKGl0ZXJhYmxlW2luZGV4XSwgaW5kZXgsIGl0ZXJhYmxlKSA9PT0gZmFsc2UpIHtcbiAgICAgICAgYnJlYWs7XG4gICAgICB9XG4gICAgfVxuICAgIHJldHVybiBjb2xsZWN0aW9uO1xuICB9O1xufVxuXG5tb2R1bGUuZXhwb3J0cyA9IGNyZWF0ZUJhc2VFYWNoO1xuIiwidmFyIHRvT2JqZWN0ID0gcmVxdWlyZSgnLi90b09iamVjdCcpO1xuXG4vKipcbiAqIENyZWF0ZXMgYSBiYXNlIGZ1bmN0aW9uIGZvciBgXy5mb3JJbmAgb3IgYF8uZm9ySW5SaWdodGAuXG4gKlxuICogQHByaXZhdGVcbiAqIEBwYXJhbSB7Ym9vbGVhbn0gW2Zyb21SaWdodF0gU3BlY2lmeSBpdGVyYXRpbmcgZnJvbSByaWdodCB0byBsZWZ0LlxuICogQHJldHVybnMge0Z1bmN0aW9ufSBSZXR1cm5zIHRoZSBuZXcgYmFzZSBmdW5jdGlvbi5cbiAqL1xuZnVuY3Rpb24gY3JlYXRlQmFzZUZvcihmcm9tUmlnaHQpIHtcbiAgcmV0dXJuIGZ1bmN0aW9uKG9iamVjdCwgaXRlcmF0ZWUsIGtleXNGdW5jKSB7XG4gICAgdmFyIGl0ZXJhYmxlID0gdG9PYmplY3Qob2JqZWN0KSxcbiAgICAgICAgcHJvcHMgPSBrZXlzRnVuYyhvYmplY3QpLFxuICAgICAgICBsZW5ndGggPSBwcm9wcy5sZW5ndGgsXG4gICAgICAgIGluZGV4ID0gZnJvbVJpZ2h0ID8gbGVuZ3RoIDogLTE7XG5cbiAgICB3aGlsZSAoKGZyb21SaWdodCA/IGluZGV4LS0gOiArK2luZGV4IDwgbGVuZ3RoKSkge1xuICAgICAgdmFyIGtleSA9IHByb3BzW2luZGV4XTtcbiAgICAgIGlmIChpdGVyYXRlZShpdGVyYWJsZVtrZXldLCBrZXksIGl0ZXJhYmxlKSA9PT0gZmFsc2UpIHtcbiAgICAgICAgYnJlYWs7XG4gICAgICB9XG4gICAgfVxuICAgIHJldHVybiBvYmplY3Q7XG4gIH07XG59XG5cbm1vZHVsZS5leHBvcnRzID0gY3JlYXRlQmFzZUZvcjtcbiIsIihmdW5jdGlvbiAoZ2xvYmFsKXtcbnZhciBjcmVhdGVDdG9yV3JhcHBlciA9IHJlcXVpcmUoJy4vY3JlYXRlQ3RvcldyYXBwZXInKTtcblxuLyoqXG4gKiBDcmVhdGVzIGEgZnVuY3Rpb24gdGhhdCB3cmFwcyBgZnVuY2AgYW5kIGludm9rZXMgaXQgd2l0aCB0aGUgYHRoaXNgXG4gKiBiaW5kaW5nIG9mIGB0aGlzQXJnYC5cbiAqXG4gKiBAcHJpdmF0ZVxuICogQHBhcmFtIHtGdW5jdGlvbn0gZnVuYyBUaGUgZnVuY3Rpb24gdG8gYmluZC5cbiAqIEBwYXJhbSB7Kn0gW3RoaXNBcmddIFRoZSBgdGhpc2AgYmluZGluZyBvZiBgZnVuY2AuXG4gKiBAcmV0dXJucyB7RnVuY3Rpb259IFJldHVybnMgdGhlIG5ldyBib3VuZCBmdW5jdGlvbi5cbiAqL1xuZnVuY3Rpb24gY3JlYXRlQmluZFdyYXBwZXIoZnVuYywgdGhpc0FyZykge1xuICB2YXIgQ3RvciA9IGNyZWF0ZUN0b3JXcmFwcGVyKGZ1bmMpO1xuXG4gIGZ1bmN0aW9uIHdyYXBwZXIoKSB7XG4gICAgdmFyIGZuID0gKHRoaXMgJiYgdGhpcyAhPT0gZ2xvYmFsICYmIHRoaXMgaW5zdGFuY2VvZiB3cmFwcGVyKSA/IEN0b3IgOiBmdW5jO1xuICAgIHJldHVybiBmbi5hcHBseSh0aGlzQXJnLCBhcmd1bWVudHMpO1xuICB9XG4gIHJldHVybiB3cmFwcGVyO1xufVxuXG5tb2R1bGUuZXhwb3J0cyA9IGNyZWF0ZUJpbmRXcmFwcGVyO1xuXG59KS5jYWxsKHRoaXMsdHlwZW9mIGdsb2JhbCAhPT0gXCJ1bmRlZmluZWRcIiA/IGdsb2JhbCA6IHR5cGVvZiBzZWxmICE9PSBcInVuZGVmaW5lZFwiID8gc2VsZiA6IHR5cGVvZiB3aW5kb3cgIT09IFwidW5kZWZpbmVkXCIgPyB3aW5kb3cgOiB7fSlcbi8vIyBzb3VyY2VNYXBwaW5nVVJMPWRhdGE6YXBwbGljYXRpb24vanNvbjtjaGFyc2V0OnV0Zi04O2Jhc2U2NCxleUoyWlhKemFXOXVJam96TENKemIzVnlZMlZ6SWpwYkltNXZaR1ZmYlc5a2RXeGxjeTlzYjJSaGMyZ3RZMjl0Y0dGMEwybHVkR1Z5Ym1Gc0wyTnlaV0YwWlVKcGJtUlhjbUZ3Y0dWeUxtcHpJbDBzSW01aGJXVnpJanBiWFN3aWJXRndjR2x1WjNNaU9pSTdRVUZCUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQklpd2labWxzWlNJNkltZGxibVZ5WVhSbFpDNXFjeUlzSW5OdmRYSmpaVkp2YjNRaU9pSWlMQ0p6YjNWeVkyVnpRMjl1ZEdWdWRDSTZXeUoyWVhJZ1kzSmxZWFJsUTNSdmNsZHlZWEJ3WlhJZ1BTQnlaWEYxYVhKbEtDY3VMMk55WldGMFpVTjBiM0pYY21Gd2NHVnlKeWs3WEc1Y2JpOHFLbHh1SUNvZ1EzSmxZWFJsY3lCaElHWjFibU4wYVc5dUlIUm9ZWFFnZDNKaGNITWdZR1oxYm1OZ0lHRnVaQ0JwYm5admEyVnpJR2wwSUhkcGRHZ2dkR2hsSUdCMGFHbHpZRnh1SUNvZ1ltbHVaR2x1WnlCdlppQmdkR2hwYzBGeVoyQXVYRzRnS2x4dUlDb2dRSEJ5YVhaaGRHVmNiaUFxSUVCd1lYSmhiU0I3Um5WdVkzUnBiMjU5SUdaMWJtTWdWR2hsSUdaMWJtTjBhVzl1SUhSdklHSnBibVF1WEc0Z0tpQkFjR0Z5WVcwZ2V5cDlJRnQwYUdselFYSm5YU0JVYUdVZ1lIUm9hWE5nSUdKcGJtUnBibWNnYjJZZ1lHWjFibU5nTGx4dUlDb2dRSEpsZEhWeWJuTWdlMFoxYm1OMGFXOXVmU0JTWlhSMWNtNXpJSFJvWlNCdVpYY2dZbTkxYm1RZ1puVnVZM1JwYjI0dVhHNGdLaTljYm1aMWJtTjBhVzl1SUdOeVpXRjBaVUpwYm1SWGNtRndjR1Z5S0daMWJtTXNJSFJvYVhOQmNtY3BJSHRjYmlBZ2RtRnlJRU4wYjNJZ1BTQmpjbVZoZEdWRGRHOXlWM0poY0hCbGNpaG1kVzVqS1R0Y2JseHVJQ0JtZFc1amRHbHZiaUIzY21Gd2NHVnlLQ2tnZTF4dUlDQWdJSFpoY2lCbWJpQTlJQ2gwYUdseklDWW1JSFJvYVhNZ0lUMDlJR2RzYjJKaGJDQW1KaUIwYUdseklHbHVjM1JoYm1ObGIyWWdkM0poY0hCbGNpa2dQeUJEZEc5eUlEb2dablZ1WXp0Y2JpQWdJQ0J5WlhSMWNtNGdabTR1WVhCd2JIa29kR2hwYzBGeVp5d2dZWEpuZFcxbGJuUnpLVHRjYmlBZ2ZWeHVJQ0J5WlhSMWNtNGdkM0poY0hCbGNqdGNibjFjYmx4dWJXOWtkV3hsTG1WNGNHOXlkSE1nUFNCamNtVmhkR1ZDYVc1a1YzSmhjSEJsY2p0Y2JpSmRmUT09IiwidmFyIGJhc2VDcmVhdGUgPSByZXF1aXJlKCcuL2Jhc2VDcmVhdGUnKSxcbiAgICBpc09iamVjdCA9IHJlcXVpcmUoJy4uL2xhbmcvaXNPYmplY3QnKTtcblxuLyoqXG4gKiBDcmVhdGVzIGEgZnVuY3Rpb24gdGhhdCBwcm9kdWNlcyBhbiBpbnN0YW5jZSBvZiBgQ3RvcmAgcmVnYXJkbGVzcyBvZlxuICogd2hldGhlciBpdCB3YXMgaW52b2tlZCBhcyBwYXJ0IG9mIGEgYG5ld2AgZXhwcmVzc2lvbiBvciBieSBgY2FsbGAgb3IgYGFwcGx5YC5cbiAqXG4gKiBAcHJpdmF0ZVxuICogQHBhcmFtIHtGdW5jdGlvbn0gQ3RvciBUaGUgY29uc3RydWN0b3IgdG8gd3JhcC5cbiAqIEByZXR1cm5zIHtGdW5jdGlvbn0gUmV0dXJucyB0aGUgbmV3IHdyYXBwZWQgZnVuY3Rpb24uXG4gKi9cbmZ1bmN0aW9uIGNyZWF0ZUN0b3JXcmFwcGVyKEN0b3IpIHtcbiAgcmV0dXJuIGZ1bmN0aW9uKCkge1xuICAgIC8vIFVzZSBhIGBzd2l0Y2hgIHN0YXRlbWVudCB0byB3b3JrIHdpdGggY2xhc3MgY29uc3RydWN0b3JzLlxuICAgIC8vIFNlZSBodHRwOi8vZWNtYS1pbnRlcm5hdGlvbmFsLm9yZy9lY21hLTI2Mi82LjAvI3NlYy1lY21hc2NyaXB0LWZ1bmN0aW9uLW9iamVjdHMtY2FsbC10aGlzYXJndW1lbnQtYXJndW1lbnRzbGlzdFxuICAgIC8vIGZvciBtb3JlIGRldGFpbHMuXG4gICAgdmFyIGFyZ3MgPSBhcmd1bWVudHM7XG4gICAgc3dpdGNoIChhcmdzLmxlbmd0aCkge1xuICAgICAgY2FzZSAwOiByZXR1cm4gbmV3IEN0b3I7XG4gICAgICBjYXNlIDE6IHJldHVybiBuZXcgQ3RvcihhcmdzWzBdKTtcbiAgICAgIGNhc2UgMjogcmV0dXJuIG5ldyBDdG9yKGFyZ3NbMF0sIGFyZ3NbMV0pO1xuICAgICAgY2FzZSAzOiByZXR1cm4gbmV3IEN0b3IoYXJnc1swXSwgYXJnc1sxXSwgYXJnc1syXSk7XG4gICAgICBjYXNlIDQ6IHJldHVybiBuZXcgQ3RvcihhcmdzWzBdLCBhcmdzWzFdLCBhcmdzWzJdLCBhcmdzWzNdKTtcbiAgICAgIGNhc2UgNTogcmV0dXJuIG5ldyBDdG9yKGFyZ3NbMF0sIGFyZ3NbMV0sIGFyZ3NbMl0sIGFyZ3NbM10sIGFyZ3NbNF0pO1xuICAgICAgY2FzZSA2OiByZXR1cm4gbmV3IEN0b3IoYXJnc1swXSwgYXJnc1sxXSwgYXJnc1syXSwgYXJnc1szXSwgYXJnc1s0XSwgYXJnc1s1XSk7XG4gICAgICBjYXNlIDc6IHJldHVybiBuZXcgQ3RvcihhcmdzWzBdLCBhcmdzWzFdLCBhcmdzWzJdLCBhcmdzWzNdLCBhcmdzWzRdLCBhcmdzWzVdLCBhcmdzWzZdKTtcbiAgICB9XG4gICAgdmFyIHRoaXNCaW5kaW5nID0gYmFzZUNyZWF0ZShDdG9yLnByb3RvdHlwZSksXG4gICAgICAgIHJlc3VsdCA9IEN0b3IuYXBwbHkodGhpc0JpbmRpbmcsIGFyZ3MpO1xuXG4gICAgLy8gTWltaWMgdGhlIGNvbnN0cnVjdG9yJ3MgYHJldHVybmAgYmVoYXZpb3IuXG4gICAgLy8gU2VlIGh0dHBzOi8vZXM1LmdpdGh1Yi5pby8jeDEzLjIuMiBmb3IgbW9yZSBkZXRhaWxzLlxuICAgIHJldHVybiBpc09iamVjdChyZXN1bHQpID8gcmVzdWx0IDogdGhpc0JpbmRpbmc7XG4gIH07XG59XG5cbm1vZHVsZS5leHBvcnRzID0gY3JlYXRlQ3RvcldyYXBwZXI7XG4iLCJ2YXIgYmFzZUNhbGxiYWNrID0gcmVxdWlyZSgnLi9iYXNlQ2FsbGJhY2snKSxcbiAgICBiYXNlRmluZCA9IHJlcXVpcmUoJy4vYmFzZUZpbmQnKSxcbiAgICBiYXNlRmluZEluZGV4ID0gcmVxdWlyZSgnLi9iYXNlRmluZEluZGV4JyksXG4gICAgaXNBcnJheSA9IHJlcXVpcmUoJy4uL2xhbmcvaXNBcnJheScpO1xuXG4vKipcbiAqIENyZWF0ZXMgYSBgXy5maW5kYCBvciBgXy5maW5kTGFzdGAgZnVuY3Rpb24uXG4gKlxuICogQHByaXZhdGVcbiAqIEBwYXJhbSB7RnVuY3Rpb259IGVhY2hGdW5jIFRoZSBmdW5jdGlvbiB0byBpdGVyYXRlIG92ZXIgYSBjb2xsZWN0aW9uLlxuICogQHBhcmFtIHtib29sZWFufSBbZnJvbVJpZ2h0XSBTcGVjaWZ5IGl0ZXJhdGluZyBmcm9tIHJpZ2h0IHRvIGxlZnQuXG4gKiBAcmV0dXJucyB7RnVuY3Rpb259IFJldHVybnMgdGhlIG5ldyBmaW5kIGZ1bmN0aW9uLlxuICovXG5mdW5jdGlvbiBjcmVhdGVGaW5kKGVhY2hGdW5jLCBmcm9tUmlnaHQpIHtcbiAgcmV0dXJuIGZ1bmN0aW9uKGNvbGxlY3Rpb24sIHByZWRpY2F0ZSwgdGhpc0FyZykge1xuICAgIHByZWRpY2F0ZSA9IGJhc2VDYWxsYmFjayhwcmVkaWNhdGUsIHRoaXNBcmcsIDMpO1xuICAgIGlmIChpc0FycmF5KGNvbGxlY3Rpb24pKSB7XG4gICAgICB2YXIgaW5kZXggPSBiYXNlRmluZEluZGV4KGNvbGxlY3Rpb24sIHByZWRpY2F0ZSwgZnJvbVJpZ2h0KTtcbiAgICAgIHJldHVybiBpbmRleCA+IC0xID8gY29sbGVjdGlvbltpbmRleF0gOiB1bmRlZmluZWQ7XG4gICAgfVxuICAgIHJldHVybiBiYXNlRmluZChjb2xsZWN0aW9uLCBwcmVkaWNhdGUsIGVhY2hGdW5jKTtcbiAgfTtcbn1cblxubW9kdWxlLmV4cG9ydHMgPSBjcmVhdGVGaW5kO1xuIiwidmFyIGJpbmRDYWxsYmFjayA9IHJlcXVpcmUoJy4vYmluZENhbGxiYWNrJyksXG4gICAgaXNBcnJheSA9IHJlcXVpcmUoJy4uL2xhbmcvaXNBcnJheScpO1xuXG4vKipcbiAqIENyZWF0ZXMgYSBmdW5jdGlvbiBmb3IgYF8uZm9yRWFjaGAgb3IgYF8uZm9yRWFjaFJpZ2h0YC5cbiAqXG4gKiBAcHJpdmF0ZVxuICogQHBhcmFtIHtGdW5jdGlvbn0gYXJyYXlGdW5jIFRoZSBmdW5jdGlvbiB0byBpdGVyYXRlIG92ZXIgYW4gYXJyYXkuXG4gKiBAcGFyYW0ge0Z1bmN0aW9ufSBlYWNoRnVuYyBUaGUgZnVuY3Rpb24gdG8gaXRlcmF0ZSBvdmVyIGEgY29sbGVjdGlvbi5cbiAqIEByZXR1cm5zIHtGdW5jdGlvbn0gUmV0dXJucyB0aGUgbmV3IGVhY2ggZnVuY3Rpb24uXG4gKi9cbmZ1bmN0aW9uIGNyZWF0ZUZvckVhY2goYXJyYXlGdW5jLCBlYWNoRnVuYykge1xuICByZXR1cm4gZnVuY3Rpb24oY29sbGVjdGlvbiwgaXRlcmF0ZWUsIHRoaXNBcmcpIHtcbiAgICByZXR1cm4gKHR5cGVvZiBpdGVyYXRlZSA9PSAnZnVuY3Rpb24nICYmIHRoaXNBcmcgPT09IHVuZGVmaW5lZCAmJiBpc0FycmF5KGNvbGxlY3Rpb24pKVxuICAgICAgPyBhcnJheUZ1bmMoY29sbGVjdGlvbiwgaXRlcmF0ZWUpXG4gICAgICA6IGVhY2hGdW5jKGNvbGxlY3Rpb24sIGJpbmRDYWxsYmFjayhpdGVyYXRlZSwgdGhpc0FyZywgMykpO1xuICB9O1xufVxuXG5tb2R1bGUuZXhwb3J0cyA9IGNyZWF0ZUZvckVhY2g7XG4iLCIoZnVuY3Rpb24gKGdsb2JhbCl7XG52YXIgYXJyYXlDb3B5ID0gcmVxdWlyZSgnLi9hcnJheUNvcHknKSxcbiAgICBjb21wb3NlQXJncyA9IHJlcXVpcmUoJy4vY29tcG9zZUFyZ3MnKSxcbiAgICBjb21wb3NlQXJnc1JpZ2h0ID0gcmVxdWlyZSgnLi9jb21wb3NlQXJnc1JpZ2h0JyksXG4gICAgY3JlYXRlQ3RvcldyYXBwZXIgPSByZXF1aXJlKCcuL2NyZWF0ZUN0b3JXcmFwcGVyJyksXG4gICAgaXNMYXppYWJsZSA9IHJlcXVpcmUoJy4vaXNMYXppYWJsZScpLFxuICAgIHJlb3JkZXIgPSByZXF1aXJlKCcuL3Jlb3JkZXInKSxcbiAgICByZXBsYWNlSG9sZGVycyA9IHJlcXVpcmUoJy4vcmVwbGFjZUhvbGRlcnMnKSxcbiAgICBzZXREYXRhID0gcmVxdWlyZSgnLi9zZXREYXRhJyk7XG5cbi8qKiBVc2VkIHRvIGNvbXBvc2UgYml0bWFza3MgZm9yIHdyYXBwZXIgbWV0YWRhdGEuICovXG52YXIgQklORF9GTEFHID0gMSxcbiAgICBCSU5EX0tFWV9GTEFHID0gMixcbiAgICBDVVJSWV9CT1VORF9GTEFHID0gNCxcbiAgICBDVVJSWV9GTEFHID0gOCxcbiAgICBDVVJSWV9SSUdIVF9GTEFHID0gMTYsXG4gICAgUEFSVElBTF9GTEFHID0gMzIsXG4gICAgUEFSVElBTF9SSUdIVF9GTEFHID0gNjQsXG4gICAgQVJZX0ZMQUcgPSAxMjg7XG5cbi8qIE5hdGl2ZSBtZXRob2QgcmVmZXJlbmNlcyBmb3IgdGhvc2Ugd2l0aCB0aGUgc2FtZSBuYW1lIGFzIG90aGVyIGBsb2Rhc2hgIG1ldGhvZHMuICovXG52YXIgbmF0aXZlTWF4ID0gTWF0aC5tYXg7XG5cbi8qKlxuICogQ3JlYXRlcyBhIGZ1bmN0aW9uIHRoYXQgd3JhcHMgYGZ1bmNgIGFuZCBpbnZva2VzIGl0IHdpdGggb3B0aW9uYWwgYHRoaXNgXG4gKiBiaW5kaW5nIG9mLCBwYXJ0aWFsIGFwcGxpY2F0aW9uLCBhbmQgY3VycnlpbmcuXG4gKlxuICogQHByaXZhdGVcbiAqIEBwYXJhbSB7RnVuY3Rpb258c3RyaW5nfSBmdW5jIFRoZSBmdW5jdGlvbiBvciBtZXRob2QgbmFtZSB0byByZWZlcmVuY2UuXG4gKiBAcGFyYW0ge251bWJlcn0gYml0bWFzayBUaGUgYml0bWFzayBvZiBmbGFncy4gU2VlIGBjcmVhdGVXcmFwcGVyYCBmb3IgbW9yZSBkZXRhaWxzLlxuICogQHBhcmFtIHsqfSBbdGhpc0FyZ10gVGhlIGB0aGlzYCBiaW5kaW5nIG9mIGBmdW5jYC5cbiAqIEBwYXJhbSB7QXJyYXl9IFtwYXJ0aWFsc10gVGhlIGFyZ3VtZW50cyB0byBwcmVwZW5kIHRvIHRob3NlIHByb3ZpZGVkIHRvIHRoZSBuZXcgZnVuY3Rpb24uXG4gKiBAcGFyYW0ge0FycmF5fSBbaG9sZGVyc10gVGhlIGBwYXJ0aWFsc2AgcGxhY2Vob2xkZXIgaW5kZXhlcy5cbiAqIEBwYXJhbSB7QXJyYXl9IFtwYXJ0aWFsc1JpZ2h0XSBUaGUgYXJndW1lbnRzIHRvIGFwcGVuZCB0byB0aG9zZSBwcm92aWRlZCB0byB0aGUgbmV3IGZ1bmN0aW9uLlxuICogQHBhcmFtIHtBcnJheX0gW2hvbGRlcnNSaWdodF0gVGhlIGBwYXJ0aWFsc1JpZ2h0YCBwbGFjZWhvbGRlciBpbmRleGVzLlxuICogQHBhcmFtIHtBcnJheX0gW2FyZ1Bvc10gVGhlIGFyZ3VtZW50IHBvc2l0aW9ucyBvZiB0aGUgbmV3IGZ1bmN0aW9uLlxuICogQHBhcmFtIHtudW1iZXJ9IFthcnldIFRoZSBhcml0eSBjYXAgb2YgYGZ1bmNgLlxuICogQHBhcmFtIHtudW1iZXJ9IFthcml0eV0gVGhlIGFyaXR5IG9mIGBmdW5jYC5cbiAqIEByZXR1cm5zIHtGdW5jdGlvbn0gUmV0dXJucyB0aGUgbmV3IHdyYXBwZWQgZnVuY3Rpb24uXG4gKi9cbmZ1bmN0aW9uIGNyZWF0ZUh5YnJpZFdyYXBwZXIoZnVuYywgYml0bWFzaywgdGhpc0FyZywgcGFydGlhbHMsIGhvbGRlcnMsIHBhcnRpYWxzUmlnaHQsIGhvbGRlcnNSaWdodCwgYXJnUG9zLCBhcnksIGFyaXR5KSB7XG4gIHZhciBpc0FyeSA9IGJpdG1hc2sgJiBBUllfRkxBRyxcbiAgICAgIGlzQmluZCA9IGJpdG1hc2sgJiBCSU5EX0ZMQUcsXG4gICAgICBpc0JpbmRLZXkgPSBiaXRtYXNrICYgQklORF9LRVlfRkxBRyxcbiAgICAgIGlzQ3VycnkgPSBiaXRtYXNrICYgQ1VSUllfRkxBRyxcbiAgICAgIGlzQ3VycnlCb3VuZCA9IGJpdG1hc2sgJiBDVVJSWV9CT1VORF9GTEFHLFxuICAgICAgaXNDdXJyeVJpZ2h0ID0gYml0bWFzayAmIENVUlJZX1JJR0hUX0ZMQUcsXG4gICAgICBDdG9yID0gaXNCaW5kS2V5ID8gdW5kZWZpbmVkIDogY3JlYXRlQ3RvcldyYXBwZXIoZnVuYyk7XG5cbiAgZnVuY3Rpb24gd3JhcHBlcigpIHtcbiAgICAvLyBBdm9pZCBgYXJndW1lbnRzYCBvYmplY3QgdXNlIGRpc3F1YWxpZnlpbmcgb3B0aW1pemF0aW9ucyBieVxuICAgIC8vIGNvbnZlcnRpbmcgaXQgdG8gYW4gYXJyYXkgYmVmb3JlIHByb3ZpZGluZyBpdCB0byBvdGhlciBmdW5jdGlvbnMuXG4gICAgdmFyIGxlbmd0aCA9IGFyZ3VtZW50cy5sZW5ndGgsXG4gICAgICAgIGluZGV4ID0gbGVuZ3RoLFxuICAgICAgICBhcmdzID0gQXJyYXkobGVuZ3RoKTtcblxuICAgIHdoaWxlIChpbmRleC0tKSB7XG4gICAgICBhcmdzW2luZGV4XSA9IGFyZ3VtZW50c1tpbmRleF07XG4gICAgfVxuICAgIGlmIChwYXJ0aWFscykge1xuICAgICAgYXJncyA9IGNvbXBvc2VBcmdzKGFyZ3MsIHBhcnRpYWxzLCBob2xkZXJzKTtcbiAgICB9XG4gICAgaWYgKHBhcnRpYWxzUmlnaHQpIHtcbiAgICAgIGFyZ3MgPSBjb21wb3NlQXJnc1JpZ2h0KGFyZ3MsIHBhcnRpYWxzUmlnaHQsIGhvbGRlcnNSaWdodCk7XG4gICAgfVxuICAgIGlmIChpc0N1cnJ5IHx8IGlzQ3VycnlSaWdodCkge1xuICAgICAgdmFyIHBsYWNlaG9sZGVyID0gd3JhcHBlci5wbGFjZWhvbGRlcixcbiAgICAgICAgICBhcmdzSG9sZGVycyA9IHJlcGxhY2VIb2xkZXJzKGFyZ3MsIHBsYWNlaG9sZGVyKTtcblxuICAgICAgbGVuZ3RoIC09IGFyZ3NIb2xkZXJzLmxlbmd0aDtcbiAgICAgIGlmIChsZW5ndGggPCBhcml0eSkge1xuICAgICAgICB2YXIgbmV3QXJnUG9zID0gYXJnUG9zID8gYXJyYXlDb3B5KGFyZ1BvcykgOiB1bmRlZmluZWQsXG4gICAgICAgICAgICBuZXdBcml0eSA9IG5hdGl2ZU1heChhcml0eSAtIGxlbmd0aCwgMCksXG4gICAgICAgICAgICBuZXdzSG9sZGVycyA9IGlzQ3VycnkgPyBhcmdzSG9sZGVycyA6IHVuZGVmaW5lZCxcbiAgICAgICAgICAgIG5ld0hvbGRlcnNSaWdodCA9IGlzQ3VycnkgPyB1bmRlZmluZWQgOiBhcmdzSG9sZGVycyxcbiAgICAgICAgICAgIG5ld1BhcnRpYWxzID0gaXNDdXJyeSA/IGFyZ3MgOiB1bmRlZmluZWQsXG4gICAgICAgICAgICBuZXdQYXJ0aWFsc1JpZ2h0ID0gaXNDdXJyeSA/IHVuZGVmaW5lZCA6IGFyZ3M7XG5cbiAgICAgICAgYml0bWFzayB8PSAoaXNDdXJyeSA/IFBBUlRJQUxfRkxBRyA6IFBBUlRJQUxfUklHSFRfRkxBRyk7XG4gICAgICAgIGJpdG1hc2sgJj0gfihpc0N1cnJ5ID8gUEFSVElBTF9SSUdIVF9GTEFHIDogUEFSVElBTF9GTEFHKTtcblxuICAgICAgICBpZiAoIWlzQ3VycnlCb3VuZCkge1xuICAgICAgICAgIGJpdG1hc2sgJj0gfihCSU5EX0ZMQUcgfCBCSU5EX0tFWV9GTEFHKTtcbiAgICAgICAgfVxuICAgICAgICB2YXIgbmV3RGF0YSA9IFtmdW5jLCBiaXRtYXNrLCB0aGlzQXJnLCBuZXdQYXJ0aWFscywgbmV3c0hvbGRlcnMsIG5ld1BhcnRpYWxzUmlnaHQsIG5ld0hvbGRlcnNSaWdodCwgbmV3QXJnUG9zLCBhcnksIG5ld0FyaXR5XSxcbiAgICAgICAgICAgIHJlc3VsdCA9IGNyZWF0ZUh5YnJpZFdyYXBwZXIuYXBwbHkodW5kZWZpbmVkLCBuZXdEYXRhKTtcblxuICAgICAgICBpZiAoaXNMYXppYWJsZShmdW5jKSkge1xuICAgICAgICAgIHNldERhdGEocmVzdWx0LCBuZXdEYXRhKTtcbiAgICAgICAgfVxuICAgICAgICByZXN1bHQucGxhY2Vob2xkZXIgPSBwbGFjZWhvbGRlcjtcbiAgICAgICAgcmV0dXJuIHJlc3VsdDtcbiAgICAgIH1cbiAgICB9XG4gICAgdmFyIHRoaXNCaW5kaW5nID0gaXNCaW5kID8gdGhpc0FyZyA6IHRoaXMsXG4gICAgICAgIGZuID0gaXNCaW5kS2V5ID8gdGhpc0JpbmRpbmdbZnVuY10gOiBmdW5jO1xuXG4gICAgaWYgKGFyZ1Bvcykge1xuICAgICAgYXJncyA9IHJlb3JkZXIoYXJncywgYXJnUG9zKTtcbiAgICB9XG4gICAgaWYgKGlzQXJ5ICYmIGFyeSA8IGFyZ3MubGVuZ3RoKSB7XG4gICAgICBhcmdzLmxlbmd0aCA9IGFyeTtcbiAgICB9XG4gICAgaWYgKHRoaXMgJiYgdGhpcyAhPT0gZ2xvYmFsICYmIHRoaXMgaW5zdGFuY2VvZiB3cmFwcGVyKSB7XG4gICAgICBmbiA9IEN0b3IgfHwgY3JlYXRlQ3RvcldyYXBwZXIoZnVuYyk7XG4gICAgfVxuICAgIHJldHVybiBmbi5hcHBseSh0aGlzQmluZGluZywgYXJncyk7XG4gIH1cbiAgcmV0dXJuIHdyYXBwZXI7XG59XG5cbm1vZHVsZS5leHBvcnRzID0gY3JlYXRlSHlicmlkV3JhcHBlcjtcblxufSkuY2FsbCh0aGlzLHR5cGVvZiBnbG9iYWwgIT09IFwidW5kZWZpbmVkXCIgPyBnbG9iYWwgOiB0eXBlb2Ygc2VsZiAhPT0gXCJ1bmRlZmluZWRcIiA/IHNlbGYgOiB0eXBlb2Ygd2luZG93ICE9PSBcInVuZGVmaW5lZFwiID8gd2luZG93IDoge30pXG4vLyMgc291cmNlTWFwcGluZ1VSTD1kYXRhOmFwcGxpY2F0aW9uL2pzb247Y2hhcnNldDp1dGYtODtiYXNlNjQsZXlKMlpYSnphVzl1SWpvekxDSnpiM1Z5WTJWeklqcGJJbTV2WkdWZmJXOWtkV3hsY3k5c2IyUmhjMmd0WTI5dGNHRjBMMmx1ZEdWeWJtRnNMMk55WldGMFpVaDVZbkpwWkZkeVlYQndaWEl1YW5NaVhTd2libUZ0WlhNaU9sdGRMQ0p0WVhCd2FXNW5jeUk2SWp0QlFVRkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQklpd2labWxzWlNJNkltZGxibVZ5WVhSbFpDNXFjeUlzSW5OdmRYSmpaVkp2YjNRaU9pSWlMQ0p6YjNWeVkyVnpRMjl1ZEdWdWRDSTZXeUoyWVhJZ1lYSnlZWGxEYjNCNUlEMGdjbVZ4ZFdseVpTZ25MaTloY25KaGVVTnZjSGtuS1N4Y2JpQWdJQ0JqYjIxd2IzTmxRWEpuY3lBOUlISmxjWFZwY21Vb0p5NHZZMjl0Y0c5elpVRnlaM01uS1N4Y2JpQWdJQ0JqYjIxd2IzTmxRWEpuYzFKcFoyaDBJRDBnY21WeGRXbHlaU2duTGk5amIyMXdiM05sUVhKbmMxSnBaMmgwSnlrc1hHNGdJQ0FnWTNKbFlYUmxRM1J2Y2xkeVlYQndaWElnUFNCeVpYRjFhWEpsS0NjdUwyTnlaV0YwWlVOMGIzSlhjbUZ3Y0dWeUp5a3NYRzRnSUNBZ2FYTk1ZWHBwWVdKc1pTQTlJSEpsY1hWcGNtVW9KeTR2YVhOTVlYcHBZV0pzWlNjcExGeHVJQ0FnSUhKbGIzSmtaWElnUFNCeVpYRjFhWEpsS0NjdUwzSmxiM0prWlhJbktTeGNiaUFnSUNCeVpYQnNZV05sU0c5c1pHVnljeUE5SUhKbGNYVnBjbVVvSnk0dmNtVndiR0ZqWlVodmJHUmxjbk1uS1N4Y2JpQWdJQ0J6WlhSRVlYUmhJRDBnY21WeGRXbHlaU2duTGk5elpYUkVZWFJoSnlrN1hHNWNiaThxS2lCVmMyVmtJSFJ2SUdOdmJYQnZjMlVnWW1sMGJXRnphM01nWm05eUlIZHlZWEJ3WlhJZ2JXVjBZV1JoZEdFdUlDb3ZYRzUyWVhJZ1FrbE9SRjlHVEVGSElEMGdNU3hjYmlBZ0lDQkNTVTVFWDB0RldWOUdURUZISUQwZ01peGNiaUFnSUNCRFZWSlNXVjlDVDFWT1JGOUdURUZISUQwZ05DeGNiaUFnSUNCRFZWSlNXVjlHVEVGSElEMGdPQ3hjYmlBZ0lDQkRWVkpTV1Y5U1NVZElWRjlHVEVGSElEMGdNVFlzWEc0Z0lDQWdVRUZTVkVsQlRGOUdURUZISUQwZ016SXNYRzRnSUNBZ1VFRlNWRWxCVEY5U1NVZElWRjlHVEVGSElEMGdOalFzWEc0Z0lDQWdRVkpaWDBaTVFVY2dQU0F4TWpnN1hHNWNiaThxSUU1aGRHbDJaU0J0WlhSb2IyUWdjbVZtWlhKbGJtTmxjeUJtYjNJZ2RHaHZjMlVnZDJsMGFDQjBhR1VnYzJGdFpTQnVZVzFsSUdGeklHOTBhR1Z5SUdCc2IyUmhjMmhnSUcxbGRHaHZaSE11SUNvdlhHNTJZWElnYm1GMGFYWmxUV0Y0SUQwZ1RXRjBhQzV0WVhnN1hHNWNiaThxS2x4dUlDb2dRM0psWVhSbGN5QmhJR1oxYm1OMGFXOXVJSFJvWVhRZ2QzSmhjSE1nWUdaMWJtTmdJR0Z1WkNCcGJuWnZhMlZ6SUdsMElIZHBkR2dnYjNCMGFXOXVZV3dnWUhSb2FYTmdYRzRnS2lCaWFXNWthVzVuSUc5bUxDQndZWEowYVdGc0lHRndjR3hwWTJGMGFXOXVMQ0JoYm1RZ1kzVnljbmxwYm1jdVhHNGdLbHh1SUNvZ1FIQnlhWFpoZEdWY2JpQXFJRUJ3WVhKaGJTQjdSblZ1WTNScGIyNThjM1J5YVc1bmZTQm1kVzVqSUZSb1pTQm1kVzVqZEdsdmJpQnZjaUJ0WlhSb2IyUWdibUZ0WlNCMGJ5QnlaV1psY21WdVkyVXVYRzRnS2lCQWNHRnlZVzBnZTI1MWJXSmxjbjBnWW1sMGJXRnpheUJVYUdVZ1ltbDBiV0Z6YXlCdlppQm1iR0ZuY3k0Z1UyVmxJR0JqY21WaGRHVlhjbUZ3Y0dWeVlDQm1iM0lnYlc5eVpTQmtaWFJoYVd4ekxseHVJQ29nUUhCaGNtRnRJSHNxZlNCYmRHaHBjMEZ5WjEwZ1ZHaGxJR0IwYUdsellDQmlhVzVrYVc1bklHOW1JR0JtZFc1allDNWNiaUFxSUVCd1lYSmhiU0I3UVhKeVlYbDlJRnR3WVhKMGFXRnNjMTBnVkdobElHRnlaM1Z0Wlc1MGN5QjBieUJ3Y21Wd1pXNWtJSFJ2SUhSb2IzTmxJSEJ5YjNacFpHVmtJSFJ2SUhSb1pTQnVaWGNnWm5WdVkzUnBiMjR1WEc0Z0tpQkFjR0Z5WVcwZ2UwRnljbUY1ZlNCYmFHOXNaR1Z5YzEwZ1ZHaGxJR0J3WVhKMGFXRnNjMkFnY0d4aFkyVm9iMnhrWlhJZ2FXNWtaWGhsY3k1Y2JpQXFJRUJ3WVhKaGJTQjdRWEp5WVhsOUlGdHdZWEowYVdGc2MxSnBaMmgwWFNCVWFHVWdZWEpuZFcxbGJuUnpJSFJ2SUdGd2NHVnVaQ0IwYnlCMGFHOXpaU0J3Y205MmFXUmxaQ0IwYnlCMGFHVWdibVYzSUdaMWJtTjBhVzl1TGx4dUlDb2dRSEJoY21GdElIdEJjbkpoZVgwZ1cyaHZiR1JsY25OU2FXZG9kRjBnVkdobElHQndZWEowYVdGc2MxSnBaMmgwWUNCd2JHRmpaV2h2YkdSbGNpQnBibVJsZUdWekxseHVJQ29nUUhCaGNtRnRJSHRCY25KaGVYMGdXMkZ5WjFCdmMxMGdWR2hsSUdGeVozVnRaVzUwSUhCdmMybDBhVzl1Y3lCdlppQjBhR1VnYm1WM0lHWjFibU4wYVc5dUxseHVJQ29nUUhCaGNtRnRJSHR1ZFcxaVpYSjlJRnRoY25sZElGUm9aU0JoY21sMGVTQmpZWEFnYjJZZ1lHWjFibU5nTGx4dUlDb2dRSEJoY21GdElIdHVkVzFpWlhKOUlGdGhjbWwwZVYwZ1ZHaGxJR0Z5YVhSNUlHOW1JR0JtZFc1allDNWNiaUFxSUVCeVpYUjFjbTV6SUh0R2RXNWpkR2x2Ym4wZ1VtVjBkWEp1Y3lCMGFHVWdibVYzSUhkeVlYQndaV1FnWm5WdVkzUnBiMjR1WEc0Z0tpOWNibVoxYm1OMGFXOXVJR055WldGMFpVaDVZbkpwWkZkeVlYQndaWElvWm5WdVl5d2dZbWwwYldGemF5d2dkR2hwYzBGeVp5d2djR0Z5ZEdsaGJITXNJR2h2YkdSbGNuTXNJSEJoY25ScFlXeHpVbWxuYUhRc0lHaHZiR1JsY25OU2FXZG9kQ3dnWVhKblVHOXpMQ0JoY25rc0lHRnlhWFI1S1NCN1hHNGdJSFpoY2lCcGMwRnllU0E5SUdKcGRHMWhjMnNnSmlCQlVsbGZSa3hCUnl4Y2JpQWdJQ0FnSUdselFtbHVaQ0E5SUdKcGRHMWhjMnNnSmlCQ1NVNUVYMFpNUVVjc1hHNGdJQ0FnSUNCcGMwSnBibVJMWlhrZ1BTQmlhWFJ0WVhOcklDWWdRa2xPUkY5TFJWbGZSa3hCUnl4Y2JpQWdJQ0FnSUdselEzVnljbmtnUFNCaWFYUnRZWE5ySUNZZ1ExVlNVbGxmUmt4QlJ5eGNiaUFnSUNBZ0lHbHpRM1Z5Y25sQ2IzVnVaQ0E5SUdKcGRHMWhjMnNnSmlCRFZWSlNXVjlDVDFWT1JGOUdURUZITEZ4dUlDQWdJQ0FnYVhORGRYSnllVkpwWjJoMElEMGdZbWwwYldGemF5QW1JRU5WVWxKWlgxSkpSMGhVWDBaTVFVY3NYRzRnSUNBZ0lDQkRkRzl5SUQwZ2FYTkNhVzVrUzJWNUlEOGdkVzVrWldacGJtVmtJRG9nWTNKbFlYUmxRM1J2Y2xkeVlYQndaWElvWm5WdVl5azdYRzVjYmlBZ1puVnVZM1JwYjI0Z2QzSmhjSEJsY2lncElIdGNiaUFnSUNBdkx5QkJkbTlwWkNCZ1lYSm5kVzFsYm5SellDQnZZbXBsWTNRZ2RYTmxJR1JwYzNGMVlXeHBabmxwYm1jZ2IzQjBhVzFwZW1GMGFXOXVjeUJpZVZ4dUlDQWdJQzh2SUdOdmJuWmxjblJwYm1jZ2FYUWdkRzhnWVc0Z1lYSnlZWGtnWW1WbWIzSmxJSEJ5YjNacFpHbHVaeUJwZENCMGJ5QnZkR2hsY2lCbWRXNWpkR2x2Ym5NdVhHNGdJQ0FnZG1GeUlHeGxibWQwYUNBOUlHRnlaM1Z0Wlc1MGN5NXNaVzVuZEdnc1hHNGdJQ0FnSUNBZ0lHbHVaR1Y0SUQwZ2JHVnVaM1JvTEZ4dUlDQWdJQ0FnSUNCaGNtZHpJRDBnUVhKeVlYa29iR1Z1WjNSb0tUdGNibHh1SUNBZ0lIZG9hV3hsSUNocGJtUmxlQzB0S1NCN1hHNGdJQ0FnSUNCaGNtZHpXMmx1WkdWNFhTQTlJR0Z5WjNWdFpXNTBjMXRwYm1SbGVGMDdYRzRnSUNBZ2ZWeHVJQ0FnSUdsbUlDaHdZWEowYVdGc2N5a2dlMXh1SUNBZ0lDQWdZWEpuY3lBOUlHTnZiWEJ2YzJWQmNtZHpLR0Z5WjNNc0lIQmhjblJwWVd4ekxDQm9iMnhrWlhKektUdGNiaUFnSUNCOVhHNGdJQ0FnYVdZZ0tIQmhjblJwWVd4elVtbG5hSFFwSUh0Y2JpQWdJQ0FnSUdGeVozTWdQU0JqYjIxd2IzTmxRWEpuYzFKcFoyaDBLR0Z5WjNNc0lIQmhjblJwWVd4elVtbG5hSFFzSUdodmJHUmxjbk5TYVdkb2RDazdYRzRnSUNBZ2ZWeHVJQ0FnSUdsbUlDaHBjME4xY25KNUlIeDhJR2x6UTNWeWNubFNhV2RvZENrZ2UxeHVJQ0FnSUNBZ2RtRnlJSEJzWVdObGFHOXNaR1Z5SUQwZ2QzSmhjSEJsY2k1d2JHRmpaV2h2YkdSbGNpeGNiaUFnSUNBZ0lDQWdJQ0JoY21kelNHOXNaR1Z5Y3lBOUlISmxjR3hoWTJWSWIyeGtaWEp6S0dGeVozTXNJSEJzWVdObGFHOXNaR1Z5S1R0Y2JseHVJQ0FnSUNBZ2JHVnVaM1JvSUMwOUlHRnlaM05JYjJ4a1pYSnpMbXhsYm1kMGFEdGNiaUFnSUNBZ0lHbG1JQ2hzWlc1bmRHZ2dQQ0JoY21sMGVTa2dlMXh1SUNBZ0lDQWdJQ0IyWVhJZ2JtVjNRWEpuVUc5eklEMGdZWEpuVUc5eklEOGdZWEp5WVhsRGIzQjVLR0Z5WjFCdmN5a2dPaUIxYm1SbFptbHVaV1FzWEc0Z0lDQWdJQ0FnSUNBZ0lDQnVaWGRCY21sMGVTQTlJRzVoZEdsMlpVMWhlQ2hoY21sMGVTQXRJR3hsYm1kMGFDd2dNQ2tzWEc0Z0lDQWdJQ0FnSUNBZ0lDQnVaWGR6U0c5c1pHVnljeUE5SUdselEzVnljbmtnUHlCaGNtZHpTRzlzWkdWeWN5QTZJSFZ1WkdWbWFXNWxaQ3hjYmlBZ0lDQWdJQ0FnSUNBZ0lHNWxkMGh2YkdSbGNuTlNhV2RvZENBOUlHbHpRM1Z5Y25rZ1B5QjFibVJsWm1sdVpXUWdPaUJoY21kelNHOXNaR1Z5Y3l4Y2JpQWdJQ0FnSUNBZ0lDQWdJRzVsZDFCaGNuUnBZV3h6SUQwZ2FYTkRkWEp5ZVNBL0lHRnlaM01nT2lCMWJtUmxabWx1WldRc1hHNGdJQ0FnSUNBZ0lDQWdJQ0J1WlhkUVlYSjBhV0ZzYzFKcFoyaDBJRDBnYVhORGRYSnllU0EvSUhWdVpHVm1hVzVsWkNBNklHRnlaM003WEc1Y2JpQWdJQ0FnSUNBZ1ltbDBiV0Z6YXlCOFBTQW9hWE5EZFhKeWVTQS9JRkJCVWxSSlFVeGZSa3hCUnlBNklGQkJVbFJKUVV4ZlVrbEhTRlJmUmt4QlJ5azdYRzRnSUNBZ0lDQWdJR0pwZEcxaGMyc2dKajBnZmlocGMwTjFjbko1SUQ4Z1VFRlNWRWxCVEY5U1NVZElWRjlHVEVGSElEb2dVRUZTVkVsQlRGOUdURUZIS1R0Y2JseHVJQ0FnSUNBZ0lDQnBaaUFvSVdselEzVnljbmxDYjNWdVpDa2dlMXh1SUNBZ0lDQWdJQ0FnSUdKcGRHMWhjMnNnSmowZ2ZpaENTVTVFWDBaTVFVY2dmQ0JDU1U1RVgwdEZXVjlHVEVGSEtUdGNiaUFnSUNBZ0lDQWdmVnh1SUNBZ0lDQWdJQ0IyWVhJZ2JtVjNSR0YwWVNBOUlGdG1kVzVqTENCaWFYUnRZWE5yTENCMGFHbHpRWEpuTENCdVpYZFFZWEowYVdGc2N5d2dibVYzYzBodmJHUmxjbk1zSUc1bGQxQmhjblJwWVd4elVtbG5hSFFzSUc1bGQwaHZiR1JsY25OU2FXZG9kQ3dnYm1WM1FYSm5VRzl6TENCaGNua3NJRzVsZDBGeWFYUjVYU3hjYmlBZ0lDQWdJQ0FnSUNBZ0lISmxjM1ZzZENBOUlHTnlaV0YwWlVoNVluSnBaRmR5WVhCd1pYSXVZWEJ3Ykhrb2RXNWtaV1pwYm1Wa0xDQnVaWGRFWVhSaEtUdGNibHh1SUNBZ0lDQWdJQ0JwWmlBb2FYTk1ZWHBwWVdKc1pTaG1kVzVqS1NrZ2UxeHVJQ0FnSUNBZ0lDQWdJSE5sZEVSaGRHRW9jbVZ6ZFd4MExDQnVaWGRFWVhSaEtUdGNiaUFnSUNBZ0lDQWdmVnh1SUNBZ0lDQWdJQ0J5WlhOMWJIUXVjR3hoWTJWb2IyeGtaWElnUFNCd2JHRmpaV2h2YkdSbGNqdGNiaUFnSUNBZ0lDQWdjbVYwZFhKdUlISmxjM1ZzZER0Y2JpQWdJQ0FnSUgxY2JpQWdJQ0I5WEc0Z0lDQWdkbUZ5SUhSb2FYTkNhVzVrYVc1bklEMGdhWE5DYVc1a0lEOGdkR2hwYzBGeVp5QTZJSFJvYVhNc1hHNGdJQ0FnSUNBZ0lHWnVJRDBnYVhOQ2FXNWtTMlY1SUQ4Z2RHaHBjMEpwYm1ScGJtZGJablZ1WTEwZ09pQm1kVzVqTzF4dVhHNGdJQ0FnYVdZZ0tHRnlaMUJ2Y3lrZ2UxeHVJQ0FnSUNBZ1lYSm5jeUE5SUhKbGIzSmtaWElvWVhKbmN5d2dZWEpuVUc5ektUdGNiaUFnSUNCOVhHNGdJQ0FnYVdZZ0tHbHpRWEo1SUNZbUlHRnllU0E4SUdGeVozTXViR1Z1WjNSb0tTQjdYRzRnSUNBZ0lDQmhjbWR6TG14bGJtZDBhQ0E5SUdGeWVUdGNiaUFnSUNCOVhHNGdJQ0FnYVdZZ0tIUm9hWE1nSmlZZ2RHaHBjeUFoUFQwZ1oyeHZZbUZzSUNZbUlIUm9hWE1nYVc1emRHRnVZMlZ2WmlCM2NtRndjR1Z5S1NCN1hHNGdJQ0FnSUNCbWJpQTlJRU4wYjNJZ2ZId2dZM0psWVhSbFEzUnZjbGR5WVhCd1pYSW9ablZ1WXlrN1hHNGdJQ0FnZlZ4dUlDQWdJSEpsZEhWeWJpQm1iaTVoY0hCc2VTaDBhR2x6UW1sdVpHbHVaeXdnWVhKbmN5azdYRzRnSUgxY2JpQWdjbVYwZFhKdUlIZHlZWEJ3WlhJN1hHNTlYRzVjYm0xdlpIVnNaUzVsZUhCdmNuUnpJRDBnWTNKbFlYUmxTSGxpY21sa1YzSmhjSEJsY2p0Y2JpSmRmUT09IiwiKGZ1bmN0aW9uIChnbG9iYWwpe1xudmFyIGNyZWF0ZUN0b3JXcmFwcGVyID0gcmVxdWlyZSgnLi9jcmVhdGVDdG9yV3JhcHBlcicpO1xuXG4vKiogVXNlZCB0byBjb21wb3NlIGJpdG1hc2tzIGZvciB3cmFwcGVyIG1ldGFkYXRhLiAqL1xudmFyIEJJTkRfRkxBRyA9IDE7XG5cbi8qKlxuICogQ3JlYXRlcyBhIGZ1bmN0aW9uIHRoYXQgd3JhcHMgYGZ1bmNgIGFuZCBpbnZva2VzIGl0IHdpdGggdGhlIG9wdGlvbmFsIGB0aGlzYFxuICogYmluZGluZyBvZiBgdGhpc0FyZ2AgYW5kIHRoZSBgcGFydGlhbHNgIHByZXBlbmRlZCB0byB0aG9zZSBwcm92aWRlZCB0b1xuICogdGhlIHdyYXBwZXIuXG4gKlxuICogQHByaXZhdGVcbiAqIEBwYXJhbSB7RnVuY3Rpb259IGZ1bmMgVGhlIGZ1bmN0aW9uIHRvIHBhcnRpYWxseSBhcHBseSBhcmd1bWVudHMgdG8uXG4gKiBAcGFyYW0ge251bWJlcn0gYml0bWFzayBUaGUgYml0bWFzayBvZiBmbGFncy4gU2VlIGBjcmVhdGVXcmFwcGVyYCBmb3IgbW9yZSBkZXRhaWxzLlxuICogQHBhcmFtIHsqfSB0aGlzQXJnIFRoZSBgdGhpc2AgYmluZGluZyBvZiBgZnVuY2AuXG4gKiBAcGFyYW0ge0FycmF5fSBwYXJ0aWFscyBUaGUgYXJndW1lbnRzIHRvIHByZXBlbmQgdG8gdGhvc2UgcHJvdmlkZWQgdG8gdGhlIG5ldyBmdW5jdGlvbi5cbiAqIEByZXR1cm5zIHtGdW5jdGlvbn0gUmV0dXJucyB0aGUgbmV3IGJvdW5kIGZ1bmN0aW9uLlxuICovXG5mdW5jdGlvbiBjcmVhdGVQYXJ0aWFsV3JhcHBlcihmdW5jLCBiaXRtYXNrLCB0aGlzQXJnLCBwYXJ0aWFscykge1xuICB2YXIgaXNCaW5kID0gYml0bWFzayAmIEJJTkRfRkxBRyxcbiAgICAgIEN0b3IgPSBjcmVhdGVDdG9yV3JhcHBlcihmdW5jKTtcblxuICBmdW5jdGlvbiB3cmFwcGVyKCkge1xuICAgIC8vIEF2b2lkIGBhcmd1bWVudHNgIG9iamVjdCB1c2UgZGlzcXVhbGlmeWluZyBvcHRpbWl6YXRpb25zIGJ5XG4gICAgLy8gY29udmVydGluZyBpdCB0byBhbiBhcnJheSBiZWZvcmUgcHJvdmlkaW5nIGl0IGBmdW5jYC5cbiAgICB2YXIgYXJnc0luZGV4ID0gLTEsXG4gICAgICAgIGFyZ3NMZW5ndGggPSBhcmd1bWVudHMubGVuZ3RoLFxuICAgICAgICBsZWZ0SW5kZXggPSAtMSxcbiAgICAgICAgbGVmdExlbmd0aCA9IHBhcnRpYWxzLmxlbmd0aCxcbiAgICAgICAgYXJncyA9IEFycmF5KGxlZnRMZW5ndGggKyBhcmdzTGVuZ3RoKTtcblxuICAgIHdoaWxlICgrK2xlZnRJbmRleCA8IGxlZnRMZW5ndGgpIHtcbiAgICAgIGFyZ3NbbGVmdEluZGV4XSA9IHBhcnRpYWxzW2xlZnRJbmRleF07XG4gICAgfVxuICAgIHdoaWxlIChhcmdzTGVuZ3RoLS0pIHtcbiAgICAgIGFyZ3NbbGVmdEluZGV4KytdID0gYXJndW1lbnRzWysrYXJnc0luZGV4XTtcbiAgICB9XG4gICAgdmFyIGZuID0gKHRoaXMgJiYgdGhpcyAhPT0gZ2xvYmFsICYmIHRoaXMgaW5zdGFuY2VvZiB3cmFwcGVyKSA/IEN0b3IgOiBmdW5jO1xuICAgIHJldHVybiBmbi5hcHBseShpc0JpbmQgPyB0aGlzQXJnIDogdGhpcywgYXJncyk7XG4gIH1cbiAgcmV0dXJuIHdyYXBwZXI7XG59XG5cbm1vZHVsZS5leHBvcnRzID0gY3JlYXRlUGFydGlhbFdyYXBwZXI7XG5cbn0pLmNhbGwodGhpcyx0eXBlb2YgZ2xvYmFsICE9PSBcInVuZGVmaW5lZFwiID8gZ2xvYmFsIDogdHlwZW9mIHNlbGYgIT09IFwidW5kZWZpbmVkXCIgPyBzZWxmIDogdHlwZW9mIHdpbmRvdyAhPT0gXCJ1bmRlZmluZWRcIiA/IHdpbmRvdyA6IHt9KVxuLy8jIHNvdXJjZU1hcHBpbmdVUkw9ZGF0YTphcHBsaWNhdGlvbi9qc29uO2NoYXJzZXQ6dXRmLTg7YmFzZTY0LGV5SjJaWEp6YVc5dUlqb3pMQ0p6YjNWeVkyVnpJanBiSW01dlpHVmZiVzlrZFd4bGN5OXNiMlJoYzJndFkyOXRjR0YwTDJsdWRHVnlibUZzTDJOeVpXRjBaVkJoY25ScFlXeFhjbUZ3Y0dWeUxtcHpJbDBzSW01aGJXVnpJanBiWFN3aWJXRndjR2x1WjNNaU9pSTdRVUZCUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CSWl3aVptbHNaU0k2SW1kbGJtVnlZWFJsWkM1cWN5SXNJbk52ZFhKalpWSnZiM1FpT2lJaUxDSnpiM1Z5WTJWelEyOXVkR1Z1ZENJNld5SjJZWElnWTNKbFlYUmxRM1J2Y2xkeVlYQndaWElnUFNCeVpYRjFhWEpsS0NjdUwyTnlaV0YwWlVOMGIzSlhjbUZ3Y0dWeUp5azdYRzVjYmk4cUtpQlZjMlZrSUhSdklHTnZiWEJ2YzJVZ1ltbDBiV0Z6YTNNZ1ptOXlJSGR5WVhCd1pYSWdiV1YwWVdSaGRHRXVJQ292WEc1MllYSWdRa2xPUkY5R1RFRkhJRDBnTVR0Y2JseHVMeW9xWEc0Z0tpQkRjbVZoZEdWeklHRWdablZ1WTNScGIyNGdkR2hoZENCM2NtRndjeUJnWm5WdVkyQWdZVzVrSUdsdWRtOXJaWE1nYVhRZ2QybDBhQ0IwYUdVZ2IzQjBhVzl1WVd3Z1lIUm9hWE5nWEc0Z0tpQmlhVzVrYVc1bklHOW1JR0IwYUdselFYSm5ZQ0JoYm1RZ2RHaGxJR0J3WVhKMGFXRnNjMkFnY0hKbGNHVnVaR1ZrSUhSdklIUm9iM05sSUhCeWIzWnBaR1ZrSUhSdlhHNGdLaUIwYUdVZ2QzSmhjSEJsY2k1Y2JpQXFYRzRnS2lCQWNISnBkbUYwWlZ4dUlDb2dRSEJoY21GdElIdEdkVzVqZEdsdmJuMGdablZ1WXlCVWFHVWdablZ1WTNScGIyNGdkRzhnY0dGeWRHbGhiR3g1SUdGd2NHeDVJR0Z5WjNWdFpXNTBjeUIwYnk1Y2JpQXFJRUJ3WVhKaGJTQjdiblZ0WW1WeWZTQmlhWFJ0WVhOcklGUm9aU0JpYVhSdFlYTnJJRzltSUdac1lXZHpMaUJUWldVZ1lHTnlaV0YwWlZkeVlYQndaWEpnSUdadmNpQnRiM0psSUdSbGRHRnBiSE11WEc0Z0tpQkFjR0Z5WVcwZ2V5cDlJSFJvYVhOQmNtY2dWR2hsSUdCMGFHbHpZQ0JpYVc1a2FXNW5JRzltSUdCbWRXNWpZQzVjYmlBcUlFQndZWEpoYlNCN1FYSnlZWGw5SUhCaGNuUnBZV3h6SUZSb1pTQmhjbWQxYldWdWRITWdkRzhnY0hKbGNHVnVaQ0IwYnlCMGFHOXpaU0J3Y205MmFXUmxaQ0IwYnlCMGFHVWdibVYzSUdaMWJtTjBhVzl1TGx4dUlDb2dRSEpsZEhWeWJuTWdlMFoxYm1OMGFXOXVmU0JTWlhSMWNtNXpJSFJvWlNCdVpYY2dZbTkxYm1RZ1puVnVZM1JwYjI0dVhHNGdLaTljYm1aMWJtTjBhVzl1SUdOeVpXRjBaVkJoY25ScFlXeFhjbUZ3Y0dWeUtHWjFibU1zSUdKcGRHMWhjMnNzSUhSb2FYTkJjbWNzSUhCaGNuUnBZV3h6S1NCN1hHNGdJSFpoY2lCcGMwSnBibVFnUFNCaWFYUnRZWE5ySUNZZ1FrbE9SRjlHVEVGSExGeHVJQ0FnSUNBZ1EzUnZjaUE5SUdOeVpXRjBaVU4wYjNKWGNtRndjR1Z5S0daMWJtTXBPMXh1WEc0Z0lHWjFibU4wYVc5dUlIZHlZWEJ3WlhJb0tTQjdYRzRnSUNBZ0x5OGdRWFp2YVdRZ1lHRnlaM1Z0Wlc1MGMyQWdiMkpxWldOMElIVnpaU0JrYVhOeGRXRnNhV1o1YVc1bklHOXdkR2x0YVhwaGRHbHZibk1nWW5sY2JpQWdJQ0F2THlCamIyNTJaWEowYVc1bklHbDBJSFJ2SUdGdUlHRnljbUY1SUdKbFptOXlaU0J3Y205MmFXUnBibWNnYVhRZ1lHWjFibU5nTGx4dUlDQWdJSFpoY2lCaGNtZHpTVzVrWlhnZ1BTQXRNU3hjYmlBZ0lDQWdJQ0FnWVhKbmMweGxibWQwYUNBOUlHRnlaM1Z0Wlc1MGN5NXNaVzVuZEdnc1hHNGdJQ0FnSUNBZ0lHeGxablJKYm1SbGVDQTlJQzB4TEZ4dUlDQWdJQ0FnSUNCc1pXWjBUR1Z1WjNSb0lEMGdjR0Z5ZEdsaGJITXViR1Z1WjNSb0xGeHVJQ0FnSUNBZ0lDQmhjbWR6SUQwZ1FYSnlZWGtvYkdWbWRFeGxibWQwYUNBcklHRnlaM05NWlc1bmRHZ3BPMXh1WEc0Z0lDQWdkMmhwYkdVZ0tDc3JiR1ZtZEVsdVpHVjRJRHdnYkdWbWRFeGxibWQwYUNrZ2UxeHVJQ0FnSUNBZ1lYSm5jMXRzWldaMFNXNWtaWGhkSUQwZ2NHRnlkR2xoYkhOYmJHVm1kRWx1WkdWNFhUdGNiaUFnSUNCOVhHNGdJQ0FnZDJocGJHVWdLR0Z5WjNOTVpXNW5kR2d0TFNrZ2UxeHVJQ0FnSUNBZ1lYSm5jMXRzWldaMFNXNWtaWGdySzEwZ1BTQmhjbWQxYldWdWRITmJLeXRoY21kelNXNWtaWGhkTzF4dUlDQWdJSDFjYmlBZ0lDQjJZWElnWm00Z1BTQW9kR2hwY3lBbUppQjBhR2x6SUNFOVBTQm5iRzlpWVd3Z0ppWWdkR2hwY3lCcGJuTjBZVzVqWlc5bUlIZHlZWEJ3WlhJcElEOGdRM1J2Y2lBNklHWjFibU03WEc0Z0lDQWdjbVYwZFhKdUlHWnVMbUZ3Y0d4NUtHbHpRbWx1WkNBL0lIUm9hWE5CY21jZ09pQjBhR2x6TENCaGNtZHpLVHRjYmlBZ2ZWeHVJQ0J5WlhSMWNtNGdkM0poY0hCbGNqdGNibjFjYmx4dWJXOWtkV3hsTG1WNGNHOXlkSE1nUFNCamNtVmhkR1ZRWVhKMGFXRnNWM0poY0hCbGNqdGNiaUpkZlE9PSIsInZhciBiYXNlU2V0RGF0YSA9IHJlcXVpcmUoJy4vYmFzZVNldERhdGEnKSxcbiAgICBjcmVhdGVCaW5kV3JhcHBlciA9IHJlcXVpcmUoJy4vY3JlYXRlQmluZFdyYXBwZXInKSxcbiAgICBjcmVhdGVIeWJyaWRXcmFwcGVyID0gcmVxdWlyZSgnLi9jcmVhdGVIeWJyaWRXcmFwcGVyJyksXG4gICAgY3JlYXRlUGFydGlhbFdyYXBwZXIgPSByZXF1aXJlKCcuL2NyZWF0ZVBhcnRpYWxXcmFwcGVyJyksXG4gICAgZ2V0RGF0YSA9IHJlcXVpcmUoJy4vZ2V0RGF0YScpLFxuICAgIG1lcmdlRGF0YSA9IHJlcXVpcmUoJy4vbWVyZ2VEYXRhJyksXG4gICAgc2V0RGF0YSA9IHJlcXVpcmUoJy4vc2V0RGF0YScpO1xuXG4vKiogVXNlZCB0byBjb21wb3NlIGJpdG1hc2tzIGZvciB3cmFwcGVyIG1ldGFkYXRhLiAqL1xudmFyIEJJTkRfRkxBRyA9IDEsXG4gICAgQklORF9LRVlfRkxBRyA9IDIsXG4gICAgUEFSVElBTF9GTEFHID0gMzIsXG4gICAgUEFSVElBTF9SSUdIVF9GTEFHID0gNjQ7XG5cbi8qKiBVc2VkIGFzIHRoZSBgVHlwZUVycm9yYCBtZXNzYWdlIGZvciBcIkZ1bmN0aW9uc1wiIG1ldGhvZHMuICovXG52YXIgRlVOQ19FUlJPUl9URVhUID0gJ0V4cGVjdGVkIGEgZnVuY3Rpb24nO1xuXG4vKiBOYXRpdmUgbWV0aG9kIHJlZmVyZW5jZXMgZm9yIHRob3NlIHdpdGggdGhlIHNhbWUgbmFtZSBhcyBvdGhlciBgbG9kYXNoYCBtZXRob2RzLiAqL1xudmFyIG5hdGl2ZU1heCA9IE1hdGgubWF4O1xuXG4vKipcbiAqIENyZWF0ZXMgYSBmdW5jdGlvbiB0aGF0IGVpdGhlciBjdXJyaWVzIG9yIGludm9rZXMgYGZ1bmNgIHdpdGggb3B0aW9uYWxcbiAqIGB0aGlzYCBiaW5kaW5nIGFuZCBwYXJ0aWFsbHkgYXBwbGllZCBhcmd1bWVudHMuXG4gKlxuICogQHByaXZhdGVcbiAqIEBwYXJhbSB7RnVuY3Rpb258c3RyaW5nfSBmdW5jIFRoZSBmdW5jdGlvbiBvciBtZXRob2QgbmFtZSB0byByZWZlcmVuY2UuXG4gKiBAcGFyYW0ge251bWJlcn0gYml0bWFzayBUaGUgYml0bWFzayBvZiBmbGFncy5cbiAqICBUaGUgYml0bWFzayBtYXkgYmUgY29tcG9zZWQgb2YgdGhlIGZvbGxvd2luZyBmbGFnczpcbiAqICAgICAxIC0gYF8uYmluZGBcbiAqICAgICAyIC0gYF8uYmluZEtleWBcbiAqICAgICA0IC0gYF8uY3VycnlgIG9yIGBfLmN1cnJ5UmlnaHRgIG9mIGEgYm91bmQgZnVuY3Rpb25cbiAqICAgICA4IC0gYF8uY3VycnlgXG4gKiAgICAxNiAtIGBfLmN1cnJ5UmlnaHRgXG4gKiAgICAzMiAtIGBfLnBhcnRpYWxgXG4gKiAgICA2NCAtIGBfLnBhcnRpYWxSaWdodGBcbiAqICAgMTI4IC0gYF8ucmVhcmdgXG4gKiAgIDI1NiAtIGBfLmFyeWBcbiAqIEBwYXJhbSB7Kn0gW3RoaXNBcmddIFRoZSBgdGhpc2AgYmluZGluZyBvZiBgZnVuY2AuXG4gKiBAcGFyYW0ge0FycmF5fSBbcGFydGlhbHNdIFRoZSBhcmd1bWVudHMgdG8gYmUgcGFydGlhbGx5IGFwcGxpZWQuXG4gKiBAcGFyYW0ge0FycmF5fSBbaG9sZGVyc10gVGhlIGBwYXJ0aWFsc2AgcGxhY2Vob2xkZXIgaW5kZXhlcy5cbiAqIEBwYXJhbSB7QXJyYXl9IFthcmdQb3NdIFRoZSBhcmd1bWVudCBwb3NpdGlvbnMgb2YgdGhlIG5ldyBmdW5jdGlvbi5cbiAqIEBwYXJhbSB7bnVtYmVyfSBbYXJ5XSBUaGUgYXJpdHkgY2FwIG9mIGBmdW5jYC5cbiAqIEBwYXJhbSB7bnVtYmVyfSBbYXJpdHldIFRoZSBhcml0eSBvZiBgZnVuY2AuXG4gKiBAcmV0dXJucyB7RnVuY3Rpb259IFJldHVybnMgdGhlIG5ldyB3cmFwcGVkIGZ1bmN0aW9uLlxuICovXG5mdW5jdGlvbiBjcmVhdGVXcmFwcGVyKGZ1bmMsIGJpdG1hc2ssIHRoaXNBcmcsIHBhcnRpYWxzLCBob2xkZXJzLCBhcmdQb3MsIGFyeSwgYXJpdHkpIHtcbiAgdmFyIGlzQmluZEtleSA9IGJpdG1hc2sgJiBCSU5EX0tFWV9GTEFHO1xuICBpZiAoIWlzQmluZEtleSAmJiB0eXBlb2YgZnVuYyAhPSAnZnVuY3Rpb24nKSB7XG4gICAgdGhyb3cgbmV3IFR5cGVFcnJvcihGVU5DX0VSUk9SX1RFWFQpO1xuICB9XG4gIHZhciBsZW5ndGggPSBwYXJ0aWFscyA/IHBhcnRpYWxzLmxlbmd0aCA6IDA7XG4gIGlmICghbGVuZ3RoKSB7XG4gICAgYml0bWFzayAmPSB+KFBBUlRJQUxfRkxBRyB8IFBBUlRJQUxfUklHSFRfRkxBRyk7XG4gICAgcGFydGlhbHMgPSBob2xkZXJzID0gdW5kZWZpbmVkO1xuICB9XG4gIGxlbmd0aCAtPSAoaG9sZGVycyA/IGhvbGRlcnMubGVuZ3RoIDogMCk7XG4gIGlmIChiaXRtYXNrICYgUEFSVElBTF9SSUdIVF9GTEFHKSB7XG4gICAgdmFyIHBhcnRpYWxzUmlnaHQgPSBwYXJ0aWFscyxcbiAgICAgICAgaG9sZGVyc1JpZ2h0ID0gaG9sZGVycztcblxuICAgIHBhcnRpYWxzID0gaG9sZGVycyA9IHVuZGVmaW5lZDtcbiAgfVxuICB2YXIgZGF0YSA9IGlzQmluZEtleSA/IHVuZGVmaW5lZCA6IGdldERhdGEoZnVuYyksXG4gICAgICBuZXdEYXRhID0gW2Z1bmMsIGJpdG1hc2ssIHRoaXNBcmcsIHBhcnRpYWxzLCBob2xkZXJzLCBwYXJ0aWFsc1JpZ2h0LCBob2xkZXJzUmlnaHQsIGFyZ1BvcywgYXJ5LCBhcml0eV07XG5cbiAgaWYgKGRhdGEpIHtcbiAgICBtZXJnZURhdGEobmV3RGF0YSwgZGF0YSk7XG4gICAgYml0bWFzayA9IG5ld0RhdGFbMV07XG4gICAgYXJpdHkgPSBuZXdEYXRhWzldO1xuICB9XG4gIG5ld0RhdGFbOV0gPSBhcml0eSA9PSBudWxsXG4gICAgPyAoaXNCaW5kS2V5ID8gMCA6IGZ1bmMubGVuZ3RoKVxuICAgIDogKG5hdGl2ZU1heChhcml0eSAtIGxlbmd0aCwgMCkgfHwgMCk7XG5cbiAgaWYgKGJpdG1hc2sgPT0gQklORF9GTEFHKSB7XG4gICAgdmFyIHJlc3VsdCA9IGNyZWF0ZUJpbmRXcmFwcGVyKG5ld0RhdGFbMF0sIG5ld0RhdGFbMl0pO1xuICB9IGVsc2UgaWYgKChiaXRtYXNrID09IFBBUlRJQUxfRkxBRyB8fCBiaXRtYXNrID09IChCSU5EX0ZMQUcgfCBQQVJUSUFMX0ZMQUcpKSAmJiAhbmV3RGF0YVs0XS5sZW5ndGgpIHtcbiAgICByZXN1bHQgPSBjcmVhdGVQYXJ0aWFsV3JhcHBlci5hcHBseSh1bmRlZmluZWQsIG5ld0RhdGEpO1xuICB9IGVsc2Uge1xuICAgIHJlc3VsdCA9IGNyZWF0ZUh5YnJpZFdyYXBwZXIuYXBwbHkodW5kZWZpbmVkLCBuZXdEYXRhKTtcbiAgfVxuICB2YXIgc2V0dGVyID0gZGF0YSA/IGJhc2VTZXREYXRhIDogc2V0RGF0YTtcbiAgcmV0dXJuIHNldHRlcihyZXN1bHQsIG5ld0RhdGEpO1xufVxuXG5tb2R1bGUuZXhwb3J0cyA9IGNyZWF0ZVdyYXBwZXI7XG4iLCJ2YXIgYXJyYXlTb21lID0gcmVxdWlyZSgnLi9hcnJheVNvbWUnKTtcblxuLyoqXG4gKiBBIHNwZWNpYWxpemVkIHZlcnNpb24gb2YgYGJhc2VJc0VxdWFsRGVlcGAgZm9yIGFycmF5cyB3aXRoIHN1cHBvcnQgZm9yXG4gKiBwYXJ0aWFsIGRlZXAgY29tcGFyaXNvbnMuXG4gKlxuICogQHByaXZhdGVcbiAqIEBwYXJhbSB7QXJyYXl9IGFycmF5IFRoZSBhcnJheSB0byBjb21wYXJlLlxuICogQHBhcmFtIHtBcnJheX0gb3RoZXIgVGhlIG90aGVyIGFycmF5IHRvIGNvbXBhcmUuXG4gKiBAcGFyYW0ge0Z1bmN0aW9ufSBlcXVhbEZ1bmMgVGhlIGZ1bmN0aW9uIHRvIGRldGVybWluZSBlcXVpdmFsZW50cyBvZiB2YWx1ZXMuXG4gKiBAcGFyYW0ge0Z1bmN0aW9ufSBbY3VzdG9taXplcl0gVGhlIGZ1bmN0aW9uIHRvIGN1c3RvbWl6ZSBjb21wYXJpbmcgYXJyYXlzLlxuICogQHBhcmFtIHtib29sZWFufSBbaXNMb29zZV0gU3BlY2lmeSBwZXJmb3JtaW5nIHBhcnRpYWwgY29tcGFyaXNvbnMuXG4gKiBAcGFyYW0ge0FycmF5fSBbc3RhY2tBXSBUcmFja3MgdHJhdmVyc2VkIGB2YWx1ZWAgb2JqZWN0cy5cbiAqIEBwYXJhbSB7QXJyYXl9IFtzdGFja0JdIFRyYWNrcyB0cmF2ZXJzZWQgYG90aGVyYCBvYmplY3RzLlxuICogQHJldHVybnMge2Jvb2xlYW59IFJldHVybnMgYHRydWVgIGlmIHRoZSBhcnJheXMgYXJlIGVxdWl2YWxlbnQsIGVsc2UgYGZhbHNlYC5cbiAqL1xuZnVuY3Rpb24gZXF1YWxBcnJheXMoYXJyYXksIG90aGVyLCBlcXVhbEZ1bmMsIGN1c3RvbWl6ZXIsIGlzTG9vc2UsIHN0YWNrQSwgc3RhY2tCKSB7XG4gIHZhciBpbmRleCA9IC0xLFxuICAgICAgYXJyTGVuZ3RoID0gYXJyYXkubGVuZ3RoLFxuICAgICAgb3RoTGVuZ3RoID0gb3RoZXIubGVuZ3RoO1xuXG4gIGlmIChhcnJMZW5ndGggIT0gb3RoTGVuZ3RoICYmICEoaXNMb29zZSAmJiBvdGhMZW5ndGggPiBhcnJMZW5ndGgpKSB7XG4gICAgcmV0dXJuIGZhbHNlO1xuICB9XG4gIC8vIElnbm9yZSBub24taW5kZXggcHJvcGVydGllcy5cbiAgd2hpbGUgKCsraW5kZXggPCBhcnJMZW5ndGgpIHtcbiAgICB2YXIgYXJyVmFsdWUgPSBhcnJheVtpbmRleF0sXG4gICAgICAgIG90aFZhbHVlID0gb3RoZXJbaW5kZXhdLFxuICAgICAgICByZXN1bHQgPSBjdXN0b21pemVyID8gY3VzdG9taXplcihpc0xvb3NlID8gb3RoVmFsdWUgOiBhcnJWYWx1ZSwgaXNMb29zZSA/IGFyclZhbHVlIDogb3RoVmFsdWUsIGluZGV4KSA6IHVuZGVmaW5lZDtcblxuICAgIGlmIChyZXN1bHQgIT09IHVuZGVmaW5lZCkge1xuICAgICAgaWYgKHJlc3VsdCkge1xuICAgICAgICBjb250aW51ZTtcbiAgICAgIH1cbiAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9XG4gICAgLy8gUmVjdXJzaXZlbHkgY29tcGFyZSBhcnJheXMgKHN1c2NlcHRpYmxlIHRvIGNhbGwgc3RhY2sgbGltaXRzKS5cbiAgICBpZiAoaXNMb29zZSkge1xuICAgICAgaWYgKCFhcnJheVNvbWUob3RoZXIsIGZ1bmN0aW9uKG90aFZhbHVlKSB7XG4gICAgICAgICAgICByZXR1cm4gYXJyVmFsdWUgPT09IG90aFZhbHVlIHx8IGVxdWFsRnVuYyhhcnJWYWx1ZSwgb3RoVmFsdWUsIGN1c3RvbWl6ZXIsIGlzTG9vc2UsIHN0YWNrQSwgc3RhY2tCKTtcbiAgICAgICAgICB9KSkge1xuICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICB9XG4gICAgfSBlbHNlIGlmICghKGFyclZhbHVlID09PSBvdGhWYWx1ZSB8fCBlcXVhbEZ1bmMoYXJyVmFsdWUsIG90aFZhbHVlLCBjdXN0b21pemVyLCBpc0xvb3NlLCBzdGFja0EsIHN0YWNrQikpKSB7XG4gICAgICByZXR1cm4gZmFsc2U7XG4gICAgfVxuICB9XG4gIHJldHVybiB0cnVlO1xufVxuXG5tb2R1bGUuZXhwb3J0cyA9IGVxdWFsQXJyYXlzO1xuIiwiLyoqIGBPYmplY3QjdG9TdHJpbmdgIHJlc3VsdCByZWZlcmVuY2VzLiAqL1xudmFyIGJvb2xUYWcgPSAnW29iamVjdCBCb29sZWFuXScsXG4gICAgZGF0ZVRhZyA9ICdbb2JqZWN0IERhdGVdJyxcbiAgICBlcnJvclRhZyA9ICdbb2JqZWN0IEVycm9yXScsXG4gICAgbnVtYmVyVGFnID0gJ1tvYmplY3QgTnVtYmVyXScsXG4gICAgcmVnZXhwVGFnID0gJ1tvYmplY3QgUmVnRXhwXScsXG4gICAgc3RyaW5nVGFnID0gJ1tvYmplY3QgU3RyaW5nXSc7XG5cbi8qKlxuICogQSBzcGVjaWFsaXplZCB2ZXJzaW9uIG9mIGBiYXNlSXNFcXVhbERlZXBgIGZvciBjb21wYXJpbmcgb2JqZWN0cyBvZlxuICogdGhlIHNhbWUgYHRvU3RyaW5nVGFnYC5cbiAqXG4gKiAqKk5vdGU6KiogVGhpcyBmdW5jdGlvbiBvbmx5IHN1cHBvcnRzIGNvbXBhcmluZyB2YWx1ZXMgd2l0aCB0YWdzIG9mXG4gKiBgQm9vbGVhbmAsIGBEYXRlYCwgYEVycm9yYCwgYE51bWJlcmAsIGBSZWdFeHBgLCBvciBgU3RyaW5nYC5cbiAqXG4gKiBAcHJpdmF0ZVxuICogQHBhcmFtIHtPYmplY3R9IG9iamVjdCBUaGUgb2JqZWN0IHRvIGNvbXBhcmUuXG4gKiBAcGFyYW0ge09iamVjdH0gb3RoZXIgVGhlIG90aGVyIG9iamVjdCB0byBjb21wYXJlLlxuICogQHBhcmFtIHtzdHJpbmd9IHRhZyBUaGUgYHRvU3RyaW5nVGFnYCBvZiB0aGUgb2JqZWN0cyB0byBjb21wYXJlLlxuICogQHJldHVybnMge2Jvb2xlYW59IFJldHVybnMgYHRydWVgIGlmIHRoZSBvYmplY3RzIGFyZSBlcXVpdmFsZW50LCBlbHNlIGBmYWxzZWAuXG4gKi9cbmZ1bmN0aW9uIGVxdWFsQnlUYWcob2JqZWN0LCBvdGhlciwgdGFnKSB7XG4gIHN3aXRjaCAodGFnKSB7XG4gICAgY2FzZSBib29sVGFnOlxuICAgIGNhc2UgZGF0ZVRhZzpcbiAgICAgIC8vIENvZXJjZSBkYXRlcyBhbmQgYm9vbGVhbnMgdG8gbnVtYmVycywgZGF0ZXMgdG8gbWlsbGlzZWNvbmRzIGFuZCBib29sZWFuc1xuICAgICAgLy8gdG8gYDFgIG9yIGAwYCB0cmVhdGluZyBpbnZhbGlkIGRhdGVzIGNvZXJjZWQgdG8gYE5hTmAgYXMgbm90IGVxdWFsLlxuICAgICAgcmV0dXJuICtvYmplY3QgPT0gK290aGVyO1xuXG4gICAgY2FzZSBlcnJvclRhZzpcbiAgICAgIHJldHVybiBvYmplY3QubmFtZSA9PSBvdGhlci5uYW1lICYmIG9iamVjdC5tZXNzYWdlID09IG90aGVyLm1lc3NhZ2U7XG5cbiAgICBjYXNlIG51bWJlclRhZzpcbiAgICAgIC8vIFRyZWF0IGBOYU5gIHZzLiBgTmFOYCBhcyBlcXVhbC5cbiAgICAgIHJldHVybiAob2JqZWN0ICE9ICtvYmplY3QpXG4gICAgICAgID8gb3RoZXIgIT0gK290aGVyXG4gICAgICAgIDogb2JqZWN0ID09ICtvdGhlcjtcblxuICAgIGNhc2UgcmVnZXhwVGFnOlxuICAgIGNhc2Ugc3RyaW5nVGFnOlxuICAgICAgLy8gQ29lcmNlIHJlZ2V4ZXMgdG8gc3RyaW5ncyBhbmQgdHJlYXQgc3RyaW5ncyBwcmltaXRpdmVzIGFuZCBzdHJpbmdcbiAgICAgIC8vIG9iamVjdHMgYXMgZXF1YWwuIFNlZSBodHRwczovL2VzNS5naXRodWIuaW8vI3gxNS4xMC42LjQgZm9yIG1vcmUgZGV0YWlscy5cbiAgICAgIHJldHVybiBvYmplY3QgPT0gKG90aGVyICsgJycpO1xuICB9XG4gIHJldHVybiBmYWxzZTtcbn1cblxubW9kdWxlLmV4cG9ydHMgPSBlcXVhbEJ5VGFnO1xuIiwidmFyIGtleXMgPSByZXF1aXJlKCcuLi9vYmplY3Qva2V5cycpO1xuXG4vKiogVXNlZCBmb3IgbmF0aXZlIG1ldGhvZCByZWZlcmVuY2VzLiAqL1xudmFyIG9iamVjdFByb3RvID0gT2JqZWN0LnByb3RvdHlwZTtcblxuLyoqIFVzZWQgdG8gY2hlY2sgb2JqZWN0cyBmb3Igb3duIHByb3BlcnRpZXMuICovXG52YXIgaGFzT3duUHJvcGVydHkgPSBvYmplY3RQcm90by5oYXNPd25Qcm9wZXJ0eTtcblxuLyoqXG4gKiBBIHNwZWNpYWxpemVkIHZlcnNpb24gb2YgYGJhc2VJc0VxdWFsRGVlcGAgZm9yIG9iamVjdHMgd2l0aCBzdXBwb3J0IGZvclxuICogcGFydGlhbCBkZWVwIGNvbXBhcmlzb25zLlxuICpcbiAqIEBwcml2YXRlXG4gKiBAcGFyYW0ge09iamVjdH0gb2JqZWN0IFRoZSBvYmplY3QgdG8gY29tcGFyZS5cbiAqIEBwYXJhbSB7T2JqZWN0fSBvdGhlciBUaGUgb3RoZXIgb2JqZWN0IHRvIGNvbXBhcmUuXG4gKiBAcGFyYW0ge0Z1bmN0aW9ufSBlcXVhbEZ1bmMgVGhlIGZ1bmN0aW9uIHRvIGRldGVybWluZSBlcXVpdmFsZW50cyBvZiB2YWx1ZXMuXG4gKiBAcGFyYW0ge0Z1bmN0aW9ufSBbY3VzdG9taXplcl0gVGhlIGZ1bmN0aW9uIHRvIGN1c3RvbWl6ZSBjb21wYXJpbmcgdmFsdWVzLlxuICogQHBhcmFtIHtib29sZWFufSBbaXNMb29zZV0gU3BlY2lmeSBwZXJmb3JtaW5nIHBhcnRpYWwgY29tcGFyaXNvbnMuXG4gKiBAcGFyYW0ge0FycmF5fSBbc3RhY2tBXSBUcmFja3MgdHJhdmVyc2VkIGB2YWx1ZWAgb2JqZWN0cy5cbiAqIEBwYXJhbSB7QXJyYXl9IFtzdGFja0JdIFRyYWNrcyB0cmF2ZXJzZWQgYG90aGVyYCBvYmplY3RzLlxuICogQHJldHVybnMge2Jvb2xlYW59IFJldHVybnMgYHRydWVgIGlmIHRoZSBvYmplY3RzIGFyZSBlcXVpdmFsZW50LCBlbHNlIGBmYWxzZWAuXG4gKi9cbmZ1bmN0aW9uIGVxdWFsT2JqZWN0cyhvYmplY3QsIG90aGVyLCBlcXVhbEZ1bmMsIGN1c3RvbWl6ZXIsIGlzTG9vc2UsIHN0YWNrQSwgc3RhY2tCKSB7XG4gIHZhciBvYmpQcm9wcyA9IGtleXMob2JqZWN0KSxcbiAgICAgIG9iakxlbmd0aCA9IG9ialByb3BzLmxlbmd0aCxcbiAgICAgIG90aFByb3BzID0ga2V5cyhvdGhlciksXG4gICAgICBvdGhMZW5ndGggPSBvdGhQcm9wcy5sZW5ndGg7XG5cbiAgaWYgKG9iakxlbmd0aCAhPSBvdGhMZW5ndGggJiYgIWlzTG9vc2UpIHtcbiAgICByZXR1cm4gZmFsc2U7XG4gIH1cbiAgdmFyIGluZGV4ID0gb2JqTGVuZ3RoO1xuICB3aGlsZSAoaW5kZXgtLSkge1xuICAgIHZhciBrZXkgPSBvYmpQcm9wc1tpbmRleF07XG4gICAgaWYgKCEoaXNMb29zZSA/IGtleSBpbiBvdGhlciA6IGhhc093blByb3BlcnR5LmNhbGwob3RoZXIsIGtleSkpKSB7XG4gICAgICByZXR1cm4gZmFsc2U7XG4gICAgfVxuICB9XG4gIHZhciBza2lwQ3RvciA9IGlzTG9vc2U7XG4gIHdoaWxlICgrK2luZGV4IDwgb2JqTGVuZ3RoKSB7XG4gICAga2V5ID0gb2JqUHJvcHNbaW5kZXhdO1xuICAgIHZhciBvYmpWYWx1ZSA9IG9iamVjdFtrZXldLFxuICAgICAgICBvdGhWYWx1ZSA9IG90aGVyW2tleV0sXG4gICAgICAgIHJlc3VsdCA9IGN1c3RvbWl6ZXIgPyBjdXN0b21pemVyKGlzTG9vc2UgPyBvdGhWYWx1ZSA6IG9ialZhbHVlLCBpc0xvb3NlPyBvYmpWYWx1ZSA6IG90aFZhbHVlLCBrZXkpIDogdW5kZWZpbmVkO1xuXG4gICAgLy8gUmVjdXJzaXZlbHkgY29tcGFyZSBvYmplY3RzIChzdXNjZXB0aWJsZSB0byBjYWxsIHN0YWNrIGxpbWl0cykuXG4gICAgaWYgKCEocmVzdWx0ID09PSB1bmRlZmluZWQgPyBlcXVhbEZ1bmMob2JqVmFsdWUsIG90aFZhbHVlLCBjdXN0b21pemVyLCBpc0xvb3NlLCBzdGFja0EsIHN0YWNrQikgOiByZXN1bHQpKSB7XG4gICAgICByZXR1cm4gZmFsc2U7XG4gICAgfVxuICAgIHNraXBDdG9yIHx8IChza2lwQ3RvciA9IGtleSA9PSAnY29uc3RydWN0b3InKTtcbiAgfVxuICBpZiAoIXNraXBDdG9yKSB7XG4gICAgdmFyIG9iakN0b3IgPSBvYmplY3QuY29uc3RydWN0b3IsXG4gICAgICAgIG90aEN0b3IgPSBvdGhlci5jb25zdHJ1Y3RvcjtcblxuICAgIC8vIE5vbiBgT2JqZWN0YCBvYmplY3QgaW5zdGFuY2VzIHdpdGggZGlmZmVyZW50IGNvbnN0cnVjdG9ycyBhcmUgbm90IGVxdWFsLlxuICAgIGlmIChvYmpDdG9yICE9IG90aEN0b3IgJiZcbiAgICAgICAgKCdjb25zdHJ1Y3RvcicgaW4gb2JqZWN0ICYmICdjb25zdHJ1Y3RvcicgaW4gb3RoZXIpICYmXG4gICAgICAgICEodHlwZW9mIG9iakN0b3IgPT0gJ2Z1bmN0aW9uJyAmJiBvYmpDdG9yIGluc3RhbmNlb2Ygb2JqQ3RvciAmJlxuICAgICAgICAgIHR5cGVvZiBvdGhDdG9yID09ICdmdW5jdGlvbicgJiYgb3RoQ3RvciBpbnN0YW5jZW9mIG90aEN0b3IpKSB7XG4gICAgICByZXR1cm4gZmFsc2U7XG4gICAgfVxuICB9XG4gIHJldHVybiB0cnVlO1xufVxuXG5tb2R1bGUuZXhwb3J0cyA9IGVxdWFsT2JqZWN0cztcbiIsInZhciBtZXRhTWFwID0gcmVxdWlyZSgnLi9tZXRhTWFwJyksXG4gICAgbm9vcCA9IHJlcXVpcmUoJy4uL3V0aWxpdHkvbm9vcCcpO1xuXG4vKipcbiAqIEdldHMgbWV0YWRhdGEgZm9yIGBmdW5jYC5cbiAqXG4gKiBAcHJpdmF0ZVxuICogQHBhcmFtIHtGdW5jdGlvbn0gZnVuYyBUaGUgZnVuY3Rpb24gdG8gcXVlcnkuXG4gKiBAcmV0dXJucyB7Kn0gUmV0dXJucyB0aGUgbWV0YWRhdGEgZm9yIGBmdW5jYC5cbiAqL1xudmFyIGdldERhdGEgPSAhbWV0YU1hcCA/IG5vb3AgOiBmdW5jdGlvbihmdW5jKSB7XG4gIHJldHVybiBtZXRhTWFwLmdldChmdW5jKTtcbn07XG5cbm1vZHVsZS5leHBvcnRzID0gZ2V0RGF0YTtcbiIsInZhciByZWFsTmFtZXMgPSByZXF1aXJlKCcuL3JlYWxOYW1lcycpO1xuXG4vKipcbiAqIEdldHMgdGhlIG5hbWUgb2YgYGZ1bmNgLlxuICpcbiAqIEBwcml2YXRlXG4gKiBAcGFyYW0ge0Z1bmN0aW9ufSBmdW5jIFRoZSBmdW5jdGlvbiB0byBxdWVyeS5cbiAqIEByZXR1cm5zIHtzdHJpbmd9IFJldHVybnMgdGhlIGZ1bmN0aW9uIG5hbWUuXG4gKi9cbmZ1bmN0aW9uIGdldEZ1bmNOYW1lKGZ1bmMpIHtcbiAgdmFyIHJlc3VsdCA9IChmdW5jLm5hbWUgKyAnJyksXG4gICAgICBhcnJheSA9IHJlYWxOYW1lc1tyZXN1bHRdLFxuICAgICAgbGVuZ3RoID0gYXJyYXkgPyBhcnJheS5sZW5ndGggOiAwO1xuXG4gIHdoaWxlIChsZW5ndGgtLSkge1xuICAgIHZhciBkYXRhID0gYXJyYXlbbGVuZ3RoXSxcbiAgICAgICAgb3RoZXJGdW5jID0gZGF0YS5mdW5jO1xuICAgIGlmIChvdGhlckZ1bmMgPT0gbnVsbCB8fCBvdGhlckZ1bmMgPT0gZnVuYykge1xuICAgICAgcmV0dXJuIGRhdGEubmFtZTtcbiAgICB9XG4gIH1cbiAgcmV0dXJuIHJlc3VsdDtcbn1cblxubW9kdWxlLmV4cG9ydHMgPSBnZXRGdW5jTmFtZTtcbiIsInZhciBiYXNlUHJvcGVydHkgPSByZXF1aXJlKCcuL2Jhc2VQcm9wZXJ0eScpO1xuXG4vKipcbiAqIEdldHMgdGhlIFwibGVuZ3RoXCIgcHJvcGVydHkgdmFsdWUgb2YgYG9iamVjdGAuXG4gKlxuICogKipOb3RlOioqIFRoaXMgZnVuY3Rpb24gaXMgdXNlZCB0byBhdm9pZCBhIFtKSVQgYnVnXShodHRwczovL2J1Z3Mud2Via2l0Lm9yZy9zaG93X2J1Zy5jZ2k/aWQ9MTQyNzkyKVxuICogdGhhdCBhZmZlY3RzIFNhZmFyaSBvbiBhdCBsZWFzdCBpT1MgOC4xLTguMyBBUk02NC5cbiAqXG4gKiBAcHJpdmF0ZVxuICogQHBhcmFtIHtPYmplY3R9IG9iamVjdCBUaGUgb2JqZWN0IHRvIHF1ZXJ5LlxuICogQHJldHVybnMgeyp9IFJldHVybnMgdGhlIFwibGVuZ3RoXCIgdmFsdWUuXG4gKi9cbnZhciBnZXRMZW5ndGggPSBiYXNlUHJvcGVydHkoJ2xlbmd0aCcpO1xuXG5tb2R1bGUuZXhwb3J0cyA9IGdldExlbmd0aDtcbiIsInZhciBpc1N0cmljdENvbXBhcmFibGUgPSByZXF1aXJlKCcuL2lzU3RyaWN0Q29tcGFyYWJsZScpLFxuICAgIHBhaXJzID0gcmVxdWlyZSgnLi4vb2JqZWN0L3BhaXJzJyk7XG5cbi8qKlxuICogR2V0cyB0aGUgcHJvcGVyeSBuYW1lcywgdmFsdWVzLCBhbmQgY29tcGFyZSBmbGFncyBvZiBgb2JqZWN0YC5cbiAqXG4gKiBAcHJpdmF0ZVxuICogQHBhcmFtIHtPYmplY3R9IG9iamVjdCBUaGUgb2JqZWN0IHRvIHF1ZXJ5LlxuICogQHJldHVybnMge0FycmF5fSBSZXR1cm5zIHRoZSBtYXRjaCBkYXRhIG9mIGBvYmplY3RgLlxuICovXG5mdW5jdGlvbiBnZXRNYXRjaERhdGEob2JqZWN0KSB7XG4gIHZhciByZXN1bHQgPSBwYWlycyhvYmplY3QpLFxuICAgICAgbGVuZ3RoID0gcmVzdWx0Lmxlbmd0aDtcblxuICB3aGlsZSAobGVuZ3RoLS0pIHtcbiAgICByZXN1bHRbbGVuZ3RoXVsyXSA9IGlzU3RyaWN0Q29tcGFyYWJsZShyZXN1bHRbbGVuZ3RoXVsxXSk7XG4gIH1cbiAgcmV0dXJuIHJlc3VsdDtcbn1cblxubW9kdWxlLmV4cG9ydHMgPSBnZXRNYXRjaERhdGE7XG4iLCJ2YXIgaXNOYXRpdmUgPSByZXF1aXJlKCcuLi9sYW5nL2lzTmF0aXZlJyk7XG5cbi8qKlxuICogR2V0cyB0aGUgbmF0aXZlIGZ1bmN0aW9uIGF0IGBrZXlgIG9mIGBvYmplY3RgLlxuICpcbiAqIEBwcml2YXRlXG4gKiBAcGFyYW0ge09iamVjdH0gb2JqZWN0IFRoZSBvYmplY3QgdG8gcXVlcnkuXG4gKiBAcGFyYW0ge3N0cmluZ30ga2V5IFRoZSBrZXkgb2YgdGhlIG1ldGhvZCB0byBnZXQuXG4gKiBAcmV0dXJucyB7Kn0gUmV0dXJucyB0aGUgZnVuY3Rpb24gaWYgaXQncyBuYXRpdmUsIGVsc2UgYHVuZGVmaW5lZGAuXG4gKi9cbmZ1bmN0aW9uIGdldE5hdGl2ZShvYmplY3QsIGtleSkge1xuICB2YXIgdmFsdWUgPSBvYmplY3QgPT0gbnVsbCA/IHVuZGVmaW5lZCA6IG9iamVjdFtrZXldO1xuICByZXR1cm4gaXNOYXRpdmUodmFsdWUpID8gdmFsdWUgOiB1bmRlZmluZWQ7XG59XG5cbm1vZHVsZS5leHBvcnRzID0gZ2V0TmF0aXZlO1xuIiwiLyoqXG4gKiBHZXRzIHRoZSBpbmRleCBhdCB3aGljaCB0aGUgZmlyc3Qgb2NjdXJyZW5jZSBvZiBgTmFOYCBpcyBmb3VuZCBpbiBgYXJyYXlgLlxuICpcbiAqIEBwcml2YXRlXG4gKiBAcGFyYW0ge0FycmF5fSBhcnJheSBUaGUgYXJyYXkgdG8gc2VhcmNoLlxuICogQHBhcmFtIHtudW1iZXJ9IGZyb21JbmRleCBUaGUgaW5kZXggdG8gc2VhcmNoIGZyb20uXG4gKiBAcGFyYW0ge2Jvb2xlYW59IFtmcm9tUmlnaHRdIFNwZWNpZnkgaXRlcmF0aW5nIGZyb20gcmlnaHQgdG8gbGVmdC5cbiAqIEByZXR1cm5zIHtudW1iZXJ9IFJldHVybnMgdGhlIGluZGV4IG9mIHRoZSBtYXRjaGVkIGBOYU5gLCBlbHNlIGAtMWAuXG4gKi9cbmZ1bmN0aW9uIGluZGV4T2ZOYU4oYXJyYXksIGZyb21JbmRleCwgZnJvbVJpZ2h0KSB7XG4gIHZhciBsZW5ndGggPSBhcnJheS5sZW5ndGgsXG4gICAgICBpbmRleCA9IGZyb21JbmRleCArIChmcm9tUmlnaHQgPyAwIDogLTEpO1xuXG4gIHdoaWxlICgoZnJvbVJpZ2h0ID8gaW5kZXgtLSA6ICsraW5kZXggPCBsZW5ndGgpKSB7XG4gICAgdmFyIG90aGVyID0gYXJyYXlbaW5kZXhdO1xuICAgIGlmIChvdGhlciAhPT0gb3RoZXIpIHtcbiAgICAgIHJldHVybiBpbmRleDtcbiAgICB9XG4gIH1cbiAgcmV0dXJuIC0xO1xufVxuXG5tb2R1bGUuZXhwb3J0cyA9IGluZGV4T2ZOYU47XG4iLCIvKiogVXNlZCBmb3IgbmF0aXZlIG1ldGhvZCByZWZlcmVuY2VzLiAqL1xudmFyIG9iamVjdFByb3RvID0gT2JqZWN0LnByb3RvdHlwZTtcblxuLyoqIFVzZWQgdG8gY2hlY2sgb2JqZWN0cyBmb3Igb3duIHByb3BlcnRpZXMuICovXG52YXIgaGFzT3duUHJvcGVydHkgPSBvYmplY3RQcm90by5oYXNPd25Qcm9wZXJ0eTtcblxuLyoqXG4gKiBJbml0aWFsaXplcyBhbiBhcnJheSBjbG9uZS5cbiAqXG4gKiBAcHJpdmF0ZVxuICogQHBhcmFtIHtBcnJheX0gYXJyYXkgVGhlIGFycmF5IHRvIGNsb25lLlxuICogQHJldHVybnMge0FycmF5fSBSZXR1cm5zIHRoZSBpbml0aWFsaXplZCBjbG9uZS5cbiAqL1xuZnVuY3Rpb24gaW5pdENsb25lQXJyYXkoYXJyYXkpIHtcbiAgdmFyIGxlbmd0aCA9IGFycmF5Lmxlbmd0aCxcbiAgICAgIHJlc3VsdCA9IG5ldyBhcnJheS5jb25zdHJ1Y3RvcihsZW5ndGgpO1xuXG4gIC8vIEFkZCBhcnJheSBwcm9wZXJ0aWVzIGFzc2lnbmVkIGJ5IGBSZWdFeHAjZXhlY2AuXG4gIGlmIChsZW5ndGggJiYgdHlwZW9mIGFycmF5WzBdID09ICdzdHJpbmcnICYmIGhhc093blByb3BlcnR5LmNhbGwoYXJyYXksICdpbmRleCcpKSB7XG4gICAgcmVzdWx0LmluZGV4ID0gYXJyYXkuaW5kZXg7XG4gICAgcmVzdWx0LmlucHV0ID0gYXJyYXkuaW5wdXQ7XG4gIH1cbiAgcmV0dXJuIHJlc3VsdDtcbn1cblxubW9kdWxlLmV4cG9ydHMgPSBpbml0Q2xvbmVBcnJheTtcbiIsIihmdW5jdGlvbiAoZ2xvYmFsKXtcbnZhciBidWZmZXJDbG9uZSA9IHJlcXVpcmUoJy4vYnVmZmVyQ2xvbmUnKTtcblxuLyoqIGBPYmplY3QjdG9TdHJpbmdgIHJlc3VsdCByZWZlcmVuY2VzLiAqL1xudmFyIGJvb2xUYWcgPSAnW29iamVjdCBCb29sZWFuXScsXG4gICAgZGF0ZVRhZyA9ICdbb2JqZWN0IERhdGVdJyxcbiAgICBudW1iZXJUYWcgPSAnW29iamVjdCBOdW1iZXJdJyxcbiAgICByZWdleHBUYWcgPSAnW29iamVjdCBSZWdFeHBdJyxcbiAgICBzdHJpbmdUYWcgPSAnW29iamVjdCBTdHJpbmddJztcblxudmFyIGFycmF5QnVmZmVyVGFnID0gJ1tvYmplY3QgQXJyYXlCdWZmZXJdJyxcbiAgICBmbG9hdDMyVGFnID0gJ1tvYmplY3QgRmxvYXQzMkFycmF5XScsXG4gICAgZmxvYXQ2NFRhZyA9ICdbb2JqZWN0IEZsb2F0NjRBcnJheV0nLFxuICAgIGludDhUYWcgPSAnW29iamVjdCBJbnQ4QXJyYXldJyxcbiAgICBpbnQxNlRhZyA9ICdbb2JqZWN0IEludDE2QXJyYXldJyxcbiAgICBpbnQzMlRhZyA9ICdbb2JqZWN0IEludDMyQXJyYXldJyxcbiAgICB1aW50OFRhZyA9ICdbb2JqZWN0IFVpbnQ4QXJyYXldJyxcbiAgICB1aW50OENsYW1wZWRUYWcgPSAnW29iamVjdCBVaW50OENsYW1wZWRBcnJheV0nLFxuICAgIHVpbnQxNlRhZyA9ICdbb2JqZWN0IFVpbnQxNkFycmF5XScsXG4gICAgdWludDMyVGFnID0gJ1tvYmplY3QgVWludDMyQXJyYXldJztcblxuLyoqIFVzZWQgdG8gbWF0Y2ggYFJlZ0V4cGAgZmxhZ3MgZnJvbSB0aGVpciBjb2VyY2VkIHN0cmluZyB2YWx1ZXMuICovXG52YXIgcmVGbGFncyA9IC9cXHcqJC87XG5cbi8qKiBOYXRpdmUgbWV0aG9kIHJlZmVyZW5jZXMuICovXG52YXIgVWludDhBcnJheSA9IGdsb2JhbC5VaW50OEFycmF5O1xuXG4vKiogVXNlZCB0byBsb29rdXAgYSB0eXBlIGFycmF5IGNvbnN0cnVjdG9ycyBieSBgdG9TdHJpbmdUYWdgLiAqL1xudmFyIGN0b3JCeVRhZyA9IHt9O1xuY3RvckJ5VGFnW2Zsb2F0MzJUYWddID0gZ2xvYmFsLkZsb2F0MzJBcnJheTtcbmN0b3JCeVRhZ1tmbG9hdDY0VGFnXSA9IGdsb2JhbC5GbG9hdDY0QXJyYXk7XG5jdG9yQnlUYWdbaW50OFRhZ10gPSBnbG9iYWwuSW50OEFycmF5O1xuY3RvckJ5VGFnW2ludDE2VGFnXSA9IGdsb2JhbC5JbnQxNkFycmF5O1xuY3RvckJ5VGFnW2ludDMyVGFnXSA9IGdsb2JhbC5JbnQzMkFycmF5O1xuY3RvckJ5VGFnW3VpbnQ4VGFnXSA9IFVpbnQ4QXJyYXk7XG5jdG9yQnlUYWdbdWludDhDbGFtcGVkVGFnXSA9IGdsb2JhbC5VaW50OENsYW1wZWRBcnJheTtcbmN0b3JCeVRhZ1t1aW50MTZUYWddID0gZ2xvYmFsLlVpbnQxNkFycmF5O1xuY3RvckJ5VGFnW3VpbnQzMlRhZ10gPSBnbG9iYWwuVWludDMyQXJyYXk7XG5cbi8qKlxuICogSW5pdGlhbGl6ZXMgYW4gb2JqZWN0IGNsb25lIGJhc2VkIG9uIGl0cyBgdG9TdHJpbmdUYWdgLlxuICpcbiAqICoqTm90ZToqKiBUaGlzIGZ1bmN0aW9uIG9ubHkgc3VwcG9ydHMgY2xvbmluZyB2YWx1ZXMgd2l0aCB0YWdzIG9mXG4gKiBgQm9vbGVhbmAsIGBEYXRlYCwgYEVycm9yYCwgYE51bWJlcmAsIGBSZWdFeHBgLCBvciBgU3RyaW5nYC5cbiAqXG4gKiBAcHJpdmF0ZVxuICogQHBhcmFtIHtPYmplY3R9IG9iamVjdCBUaGUgb2JqZWN0IHRvIGNsb25lLlxuICogQHBhcmFtIHtzdHJpbmd9IHRhZyBUaGUgYHRvU3RyaW5nVGFnYCBvZiB0aGUgb2JqZWN0IHRvIGNsb25lLlxuICogQHBhcmFtIHtib29sZWFufSBbaXNEZWVwXSBTcGVjaWZ5IGEgZGVlcCBjbG9uZS5cbiAqIEByZXR1cm5zIHtPYmplY3R9IFJldHVybnMgdGhlIGluaXRpYWxpemVkIGNsb25lLlxuICovXG5mdW5jdGlvbiBpbml0Q2xvbmVCeVRhZyhvYmplY3QsIHRhZywgaXNEZWVwKSB7XG4gIHZhciBDdG9yID0gb2JqZWN0LmNvbnN0cnVjdG9yO1xuICBzd2l0Y2ggKHRhZykge1xuICAgIGNhc2UgYXJyYXlCdWZmZXJUYWc6XG4gICAgICByZXR1cm4gYnVmZmVyQ2xvbmUob2JqZWN0KTtcblxuICAgIGNhc2UgYm9vbFRhZzpcbiAgICBjYXNlIGRhdGVUYWc6XG4gICAgICByZXR1cm4gbmV3IEN0b3IoK29iamVjdCk7XG5cbiAgICBjYXNlIGZsb2F0MzJUYWc6IGNhc2UgZmxvYXQ2NFRhZzpcbiAgICBjYXNlIGludDhUYWc6IGNhc2UgaW50MTZUYWc6IGNhc2UgaW50MzJUYWc6XG4gICAgY2FzZSB1aW50OFRhZzogY2FzZSB1aW50OENsYW1wZWRUYWc6IGNhc2UgdWludDE2VGFnOiBjYXNlIHVpbnQzMlRhZzpcbiAgICAgIC8vIFNhZmFyaSA1IG1vYmlsZSBpbmNvcnJlY3RseSBoYXMgYE9iamVjdGAgYXMgdGhlIGNvbnN0cnVjdG9yIG9mIHR5cGVkIGFycmF5cy5cbiAgICAgIGlmIChDdG9yIGluc3RhbmNlb2YgQ3Rvcikge1xuICAgICAgICBDdG9yID0gY3RvckJ5VGFnW3RhZ107XG4gICAgICB9XG4gICAgICB2YXIgYnVmZmVyID0gb2JqZWN0LmJ1ZmZlcjtcbiAgICAgIHJldHVybiBuZXcgQ3Rvcihpc0RlZXAgPyBidWZmZXJDbG9uZShidWZmZXIpIDogYnVmZmVyLCBvYmplY3QuYnl0ZU9mZnNldCwgb2JqZWN0Lmxlbmd0aCk7XG5cbiAgICBjYXNlIG51bWJlclRhZzpcbiAgICBjYXNlIHN0cmluZ1RhZzpcbiAgICAgIHJldHVybiBuZXcgQ3RvcihvYmplY3QpO1xuXG4gICAgY2FzZSByZWdleHBUYWc6XG4gICAgICB2YXIgcmVzdWx0ID0gbmV3IEN0b3Iob2JqZWN0LnNvdXJjZSwgcmVGbGFncy5leGVjKG9iamVjdCkpO1xuICAgICAgcmVzdWx0Lmxhc3RJbmRleCA9IG9iamVjdC5sYXN0SW5kZXg7XG4gIH1cbiAgcmV0dXJuIHJlc3VsdDtcbn1cblxubW9kdWxlLmV4cG9ydHMgPSBpbml0Q2xvbmVCeVRhZztcblxufSkuY2FsbCh0aGlzLHR5cGVvZiBnbG9iYWwgIT09IFwidW5kZWZpbmVkXCIgPyBnbG9iYWwgOiB0eXBlb2Ygc2VsZiAhPT0gXCJ1bmRlZmluZWRcIiA/IHNlbGYgOiB0eXBlb2Ygd2luZG93ICE9PSBcInVuZGVmaW5lZFwiID8gd2luZG93IDoge30pXG4vLyMgc291cmNlTWFwcGluZ1VSTD1kYXRhOmFwcGxpY2F0aW9uL2pzb247Y2hhcnNldDp1dGYtODtiYXNlNjQsZXlKMlpYSnphVzl1SWpvekxDSnpiM1Z5WTJWeklqcGJJbTV2WkdWZmJXOWtkV3hsY3k5c2IyUmhjMmd0WTI5dGNHRjBMMmx1ZEdWeWJtRnNMMmx1YVhSRGJHOXVaVUo1VkdGbkxtcHpJbDBzSW01aGJXVnpJanBiWFN3aWJXRndjR2x1WjNNaU9pSTdRVUZCUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJJaXdpWm1sc1pTSTZJbWRsYm1WeVlYUmxaQzVxY3lJc0luTnZkWEpqWlZKdmIzUWlPaUlpTENKemIzVnlZMlZ6UTI5dWRHVnVkQ0k2V3lKMllYSWdZblZtWm1WeVEyeHZibVVnUFNCeVpYRjFhWEpsS0NjdUwySjFabVpsY2tOc2IyNWxKeWs3WEc1Y2JpOHFLaUJnVDJKcVpXTjBJM1J2VTNSeWFXNW5ZQ0J5WlhOMWJIUWdjbVZtWlhKbGJtTmxjeTRnS2k5Y2JuWmhjaUJpYjI5c1ZHRm5JRDBnSjF0dlltcGxZM1FnUW05dmJHVmhibDBuTEZ4dUlDQWdJR1JoZEdWVVlXY2dQU0FuVzI5aWFtVmpkQ0JFWVhSbFhTY3NYRzRnSUNBZ2JuVnRZbVZ5VkdGbklEMGdKMXR2WW1wbFkzUWdUblZ0WW1WeVhTY3NYRzRnSUNBZ2NtVm5aWGh3VkdGbklEMGdKMXR2WW1wbFkzUWdVbVZuUlhod1hTY3NYRzRnSUNBZ2MzUnlhVzVuVkdGbklEMGdKMXR2WW1wbFkzUWdVM1J5YVc1blhTYzdYRzVjYm5aaGNpQmhjbkpoZVVKMVptWmxjbFJoWnlBOUlDZGJiMkpxWldOMElFRnljbUY1UW5WbVptVnlYU2NzWEc0Z0lDQWdabXh2WVhRek1sUmhaeUE5SUNkYmIySnFaV04wSUVac2IyRjBNekpCY25KaGVWMG5MRnh1SUNBZ0lHWnNiMkYwTmpSVVlXY2dQU0FuVzI5aWFtVmpkQ0JHYkc5aGREWTBRWEp5WVhsZEp5eGNiaUFnSUNCcGJuUTRWR0ZuSUQwZ0oxdHZZbXBsWTNRZ1NXNTBPRUZ5Y21GNVhTY3NYRzRnSUNBZ2FXNTBNVFpVWVdjZ1BTQW5XMjlpYW1WamRDQkpiblF4TmtGeWNtRjVYU2NzWEc0Z0lDQWdhVzUwTXpKVVlXY2dQU0FuVzI5aWFtVmpkQ0JKYm5Rek1rRnljbUY1WFNjc1hHNGdJQ0FnZFdsdWREaFVZV2NnUFNBblcyOWlhbVZqZENCVmFXNTBPRUZ5Y21GNVhTY3NYRzRnSUNBZ2RXbHVkRGhEYkdGdGNHVmtWR0ZuSUQwZ0oxdHZZbXBsWTNRZ1ZXbHVkRGhEYkdGdGNHVmtRWEp5WVhsZEp5eGNiaUFnSUNCMWFXNTBNVFpVWVdjZ1BTQW5XMjlpYW1WamRDQlZhVzUwTVRaQmNuSmhlVjBuTEZ4dUlDQWdJSFZwYm5Rek1sUmhaeUE5SUNkYmIySnFaV04wSUZWcGJuUXpNa0Z5Y21GNVhTYzdYRzVjYmk4cUtpQlZjMlZrSUhSdklHMWhkR05vSUdCU1pXZEZlSEJnSUdac1lXZHpJR1p5YjIwZ2RHaGxhWElnWTI5bGNtTmxaQ0J6ZEhKcGJtY2dkbUZzZFdWekxpQXFMMXh1ZG1GeUlISmxSbXhoWjNNZ1BTQXZYRngzS2lRdk8xeHVYRzR2S2lvZ1RtRjBhWFpsSUcxbGRHaHZaQ0J5WldabGNtVnVZMlZ6TGlBcUwxeHVkbUZ5SUZWcGJuUTRRWEp5WVhrZ1BTQm5iRzlpWVd3dVZXbHVkRGhCY25KaGVUdGNibHh1THlvcUlGVnpaV1FnZEc4Z2JHOXZhM1Z3SUdFZ2RIbHdaU0JoY25KaGVTQmpiMjV6ZEhKMVkzUnZjbk1nWW5rZ1lIUnZVM1J5YVc1blZHRm5ZQzRnS2k5Y2JuWmhjaUJqZEc5eVFubFVZV2NnUFNCN2ZUdGNibU4wYjNKQ2VWUmhaMXRtYkc5aGRETXlWR0ZuWFNBOUlHZHNiMkpoYkM1R2JHOWhkRE15UVhKeVlYazdYRzVqZEc5eVFubFVZV2RiWm14dllYUTJORlJoWjEwZ1BTQm5iRzlpWVd3dVJteHZZWFEyTkVGeWNtRjVPMXh1WTNSdmNrSjVWR0ZuVzJsdWREaFVZV2RkSUQwZ1oyeHZZbUZzTGtsdWREaEJjbkpoZVR0Y2JtTjBiM0pDZVZSaFoxdHBiblF4TmxSaFoxMGdQU0JuYkc5aVlXd3VTVzUwTVRaQmNuSmhlVHRjYm1OMGIzSkNlVlJoWjF0cGJuUXpNbFJoWjEwZ1BTQm5iRzlpWVd3dVNXNTBNekpCY25KaGVUdGNibU4wYjNKQ2VWUmhaMXQxYVc1ME9GUmhaMTBnUFNCVmFXNTBPRUZ5Y21GNU8xeHVZM1J2Y2tKNVZHRm5XM1ZwYm5RNFEyeGhiWEJsWkZSaFoxMGdQU0JuYkc5aVlXd3VWV2x1ZERoRGJHRnRjR1ZrUVhKeVlYazdYRzVqZEc5eVFubFVZV2RiZFdsdWRERTJWR0ZuWFNBOUlHZHNiMkpoYkM1VmFXNTBNVFpCY25KaGVUdGNibU4wYjNKQ2VWUmhaMXQxYVc1ME16SlVZV2RkSUQwZ1oyeHZZbUZzTGxWcGJuUXpNa0Z5Y21GNU8xeHVYRzR2S2lwY2JpQXFJRWx1YVhScFlXeHBlbVZ6SUdGdUlHOWlhbVZqZENCamJHOXVaU0JpWVhObFpDQnZiaUJwZEhNZ1lIUnZVM1J5YVc1blZHRm5ZQzVjYmlBcVhHNGdLaUFxS2s1dmRHVTZLaW9nVkdocGN5Qm1kVzVqZEdsdmJpQnZibXg1SUhOMWNIQnZjblJ6SUdOc2IyNXBibWNnZG1Gc2RXVnpJSGRwZEdnZ2RHRm5jeUJ2Wmx4dUlDb2dZRUp2YjJ4bFlXNWdMQ0JnUkdGMFpXQXNJR0JGY25KdmNtQXNJR0JPZFcxaVpYSmdMQ0JnVW1WblJYaHdZQ3dnYjNJZ1lGTjBjbWx1WjJBdVhHNGdLbHh1SUNvZ1FIQnlhWFpoZEdWY2JpQXFJRUJ3WVhKaGJTQjdUMkpxWldOMGZTQnZZbXBsWTNRZ1ZHaGxJRzlpYW1WamRDQjBieUJqYkc5dVpTNWNiaUFxSUVCd1lYSmhiU0I3YzNSeWFXNW5mU0IwWVdjZ1ZHaGxJR0IwYjFOMGNtbHVaMVJoWjJBZ2IyWWdkR2hsSUc5aWFtVmpkQ0IwYnlCamJHOXVaUzVjYmlBcUlFQndZWEpoYlNCN1ltOXZiR1ZoYm4wZ1cybHpSR1ZsY0YwZ1UzQmxZMmxtZVNCaElHUmxaWEFnWTJ4dmJtVXVYRzRnS2lCQWNtVjBkWEp1Y3lCN1QySnFaV04wZlNCU1pYUjFjbTV6SUhSb1pTQnBibWwwYVdGc2FYcGxaQ0JqYkc5dVpTNWNiaUFxTDF4dVpuVnVZM1JwYjI0Z2FXNXBkRU5zYjI1bFFubFVZV2NvYjJKcVpXTjBMQ0IwWVdjc0lHbHpSR1ZsY0NrZ2UxeHVJQ0IyWVhJZ1EzUnZjaUE5SUc5aWFtVmpkQzVqYjI1emRISjFZM1J2Y2p0Y2JpQWdjM2RwZEdOb0lDaDBZV2NwSUh0Y2JpQWdJQ0JqWVhObElHRnljbUY1UW5WbVptVnlWR0ZuT2x4dUlDQWdJQ0FnY21WMGRYSnVJR0oxWm1abGNrTnNiMjVsS0c5aWFtVmpkQ2s3WEc1Y2JpQWdJQ0JqWVhObElHSnZiMnhVWVdjNlhHNGdJQ0FnWTJGelpTQmtZWFJsVkdGbk9seHVJQ0FnSUNBZ2NtVjBkWEp1SUc1bGR5QkRkRzl5S0N0dlltcGxZM1FwTzF4dVhHNGdJQ0FnWTJGelpTQm1iRzloZERNeVZHRm5PaUJqWVhObElHWnNiMkYwTmpSVVlXYzZYRzRnSUNBZ1kyRnpaU0JwYm5RNFZHRm5PaUJqWVhObElHbHVkREUyVkdGbk9pQmpZWE5sSUdsdWRETXlWR0ZuT2x4dUlDQWdJR05oYzJVZ2RXbHVkRGhVWVdjNklHTmhjMlVnZFdsdWREaERiR0Z0Y0dWa1ZHRm5PaUJqWVhObElIVnBiblF4TmxSaFp6b2dZMkZ6WlNCMWFXNTBNekpVWVdjNlhHNGdJQ0FnSUNBdkx5QlRZV1poY21rZ05TQnRiMkpwYkdVZ2FXNWpiM0p5WldOMGJIa2dhR0Z6SUdCUFltcGxZM1JnSUdGeklIUm9aU0JqYjI1emRISjFZM1J2Y2lCdlppQjBlWEJsWkNCaGNuSmhlWE11WEc0Z0lDQWdJQ0JwWmlBb1EzUnZjaUJwYm5OMFlXNWpaVzltSUVOMGIzSXBJSHRjYmlBZ0lDQWdJQ0FnUTNSdmNpQTlJR04wYjNKQ2VWUmhaMXQwWVdkZE8xeHVJQ0FnSUNBZ2ZWeHVJQ0FnSUNBZ2RtRnlJR0oxWm1abGNpQTlJRzlpYW1WamRDNWlkV1ptWlhJN1hHNGdJQ0FnSUNCeVpYUjFjbTRnYm1WM0lFTjBiM0lvYVhORVpXVndJRDhnWW5WbVptVnlRMnh2Ym1Vb1luVm1abVZ5S1NBNklHSjFabVpsY2l3Z2IySnFaV04wTG1KNWRHVlBabVp6WlhRc0lHOWlhbVZqZEM1c1pXNW5kR2dwTzF4dVhHNGdJQ0FnWTJGelpTQnVkVzFpWlhKVVlXYzZYRzRnSUNBZ1kyRnpaU0J6ZEhKcGJtZFVZV2M2WEc0Z0lDQWdJQ0J5WlhSMWNtNGdibVYzSUVOMGIzSW9iMkpxWldOMEtUdGNibHh1SUNBZ0lHTmhjMlVnY21WblpYaHdWR0ZuT2x4dUlDQWdJQ0FnZG1GeUlISmxjM1ZzZENBOUlHNWxkeUJEZEc5eUtHOWlhbVZqZEM1emIzVnlZMlVzSUhKbFJteGhaM011WlhobFl5aHZZbXBsWTNRcEtUdGNiaUFnSUNBZ0lISmxjM1ZzZEM1c1lYTjBTVzVrWlhnZ1BTQnZZbXBsWTNRdWJHRnpkRWx1WkdWNE8xeHVJQ0I5WEc0Z0lISmxkSFZ5YmlCeVpYTjFiSFE3WEc1OVhHNWNibTF2WkhWc1pTNWxlSEJ2Y25SeklEMGdhVzVwZEVOc2IyNWxRbmxVWVdjN1hHNGlYWDA9IiwiLyoqXG4gKiBJbml0aWFsaXplcyBhbiBvYmplY3QgY2xvbmUuXG4gKlxuICogQHByaXZhdGVcbiAqIEBwYXJhbSB7T2JqZWN0fSBvYmplY3QgVGhlIG9iamVjdCB0byBjbG9uZS5cbiAqIEByZXR1cm5zIHtPYmplY3R9IFJldHVybnMgdGhlIGluaXRpYWxpemVkIGNsb25lLlxuICovXG5mdW5jdGlvbiBpbml0Q2xvbmVPYmplY3Qob2JqZWN0KSB7XG4gIHZhciBDdG9yID0gb2JqZWN0LmNvbnN0cnVjdG9yO1xuICBpZiAoISh0eXBlb2YgQ3RvciA9PSAnZnVuY3Rpb24nICYmIEN0b3IgaW5zdGFuY2VvZiBDdG9yKSkge1xuICAgIEN0b3IgPSBPYmplY3Q7XG4gIH1cbiAgcmV0dXJuIG5ldyBDdG9yO1xufVxuXG5tb2R1bGUuZXhwb3J0cyA9IGluaXRDbG9uZU9iamVjdDtcbiIsInZhciBnZXRMZW5ndGggPSByZXF1aXJlKCcuL2dldExlbmd0aCcpLFxuICAgIGlzTGVuZ3RoID0gcmVxdWlyZSgnLi9pc0xlbmd0aCcpO1xuXG4vKipcbiAqIENoZWNrcyBpZiBgdmFsdWVgIGlzIGFycmF5LWxpa2UuXG4gKlxuICogQHByaXZhdGVcbiAqIEBwYXJhbSB7Kn0gdmFsdWUgVGhlIHZhbHVlIHRvIGNoZWNrLlxuICogQHJldHVybnMge2Jvb2xlYW59IFJldHVybnMgYHRydWVgIGlmIGB2YWx1ZWAgaXMgYXJyYXktbGlrZSwgZWxzZSBgZmFsc2VgLlxuICovXG5mdW5jdGlvbiBpc0FycmF5TGlrZSh2YWx1ZSkge1xuICByZXR1cm4gdmFsdWUgIT0gbnVsbCAmJiBpc0xlbmd0aChnZXRMZW5ndGgodmFsdWUpKTtcbn1cblxubW9kdWxlLmV4cG9ydHMgPSBpc0FycmF5TGlrZTtcbiIsIi8qKlxuICogQ2hlY2tzIGlmIGB2YWx1ZWAgaXMgYSBob3N0IG9iamVjdCBpbiBJRSA8IDkuXG4gKlxuICogQHByaXZhdGVcbiAqIEBwYXJhbSB7Kn0gdmFsdWUgVGhlIHZhbHVlIHRvIGNoZWNrLlxuICogQHJldHVybnMge2Jvb2xlYW59IFJldHVybnMgYHRydWVgIGlmIGB2YWx1ZWAgaXMgYSBob3N0IG9iamVjdCwgZWxzZSBgZmFsc2VgLlxuICovXG52YXIgaXNIb3N0T2JqZWN0ID0gKGZ1bmN0aW9uKCkge1xuICB0cnkge1xuICAgIE9iamVjdCh7ICd0b1N0cmluZyc6IDAgfSArICcnKTtcbiAgfSBjYXRjaChlKSB7XG4gICAgcmV0dXJuIGZ1bmN0aW9uKCkgeyByZXR1cm4gZmFsc2U7IH07XG4gIH1cbiAgcmV0dXJuIGZ1bmN0aW9uKHZhbHVlKSB7XG4gICAgLy8gSUUgPCA5IHByZXNlbnRzIG1hbnkgaG9zdCBvYmplY3RzIGFzIGBPYmplY3RgIG9iamVjdHMgdGhhdCBjYW4gY29lcmNlXG4gICAgLy8gdG8gc3RyaW5ncyBkZXNwaXRlIGhhdmluZyBpbXByb3Blcmx5IGRlZmluZWQgYHRvU3RyaW5nYCBtZXRob2RzLlxuICAgIHJldHVybiB0eXBlb2YgdmFsdWUudG9TdHJpbmcgIT0gJ2Z1bmN0aW9uJyAmJiB0eXBlb2YgKHZhbHVlICsgJycpID09ICdzdHJpbmcnO1xuICB9O1xufSgpKTtcblxubW9kdWxlLmV4cG9ydHMgPSBpc0hvc3RPYmplY3Q7XG4iLCIvKiogVXNlZCB0byBkZXRlY3QgdW5zaWduZWQgaW50ZWdlciB2YWx1ZXMuICovXG52YXIgcmVJc1VpbnQgPSAvXlxcZCskLztcblxuLyoqXG4gKiBVc2VkIGFzIHRoZSBbbWF4aW11bSBsZW5ndGhdKGh0dHA6Ly9lY21hLWludGVybmF0aW9uYWwub3JnL2VjbWEtMjYyLzYuMC8jc2VjLW51bWJlci5tYXhfc2FmZV9pbnRlZ2VyKVxuICogb2YgYW4gYXJyYXktbGlrZSB2YWx1ZS5cbiAqL1xudmFyIE1BWF9TQUZFX0lOVEVHRVIgPSA5MDA3MTk5MjU0NzQwOTkxO1xuXG4vKipcbiAqIENoZWNrcyBpZiBgdmFsdWVgIGlzIGEgdmFsaWQgYXJyYXktbGlrZSBpbmRleC5cbiAqXG4gKiBAcHJpdmF0ZVxuICogQHBhcmFtIHsqfSB2YWx1ZSBUaGUgdmFsdWUgdG8gY2hlY2suXG4gKiBAcGFyYW0ge251bWJlcn0gW2xlbmd0aD1NQVhfU0FGRV9JTlRFR0VSXSBUaGUgdXBwZXIgYm91bmRzIG9mIGEgdmFsaWQgaW5kZXguXG4gKiBAcmV0dXJucyB7Ym9vbGVhbn0gUmV0dXJucyBgdHJ1ZWAgaWYgYHZhbHVlYCBpcyBhIHZhbGlkIGluZGV4LCBlbHNlIGBmYWxzZWAuXG4gKi9cbmZ1bmN0aW9uIGlzSW5kZXgodmFsdWUsIGxlbmd0aCkge1xuICB2YWx1ZSA9ICh0eXBlb2YgdmFsdWUgPT0gJ251bWJlcicgfHwgcmVJc1VpbnQudGVzdCh2YWx1ZSkpID8gK3ZhbHVlIDogLTE7XG4gIGxlbmd0aCA9IGxlbmd0aCA9PSBudWxsID8gTUFYX1NBRkVfSU5URUdFUiA6IGxlbmd0aDtcbiAgcmV0dXJuIHZhbHVlID4gLTEgJiYgdmFsdWUgJSAxID09IDAgJiYgdmFsdWUgPCBsZW5ndGg7XG59XG5cbm1vZHVsZS5leHBvcnRzID0gaXNJbmRleDtcbiIsInZhciBpc0FycmF5TGlrZSA9IHJlcXVpcmUoJy4vaXNBcnJheUxpa2UnKSxcbiAgICBpc0luZGV4ID0gcmVxdWlyZSgnLi9pc0luZGV4JyksXG4gICAgaXNPYmplY3QgPSByZXF1aXJlKCcuLi9sYW5nL2lzT2JqZWN0Jyk7XG5cbi8qKlxuICogQ2hlY2tzIGlmIHRoZSBwcm92aWRlZCBhcmd1bWVudHMgYXJlIGZyb20gYW4gaXRlcmF0ZWUgY2FsbC5cbiAqXG4gKiBAcHJpdmF0ZVxuICogQHBhcmFtIHsqfSB2YWx1ZSBUaGUgcG90ZW50aWFsIGl0ZXJhdGVlIHZhbHVlIGFyZ3VtZW50LlxuICogQHBhcmFtIHsqfSBpbmRleCBUaGUgcG90ZW50aWFsIGl0ZXJhdGVlIGluZGV4IG9yIGtleSBhcmd1bWVudC5cbiAqIEBwYXJhbSB7Kn0gb2JqZWN0IFRoZSBwb3RlbnRpYWwgaXRlcmF0ZWUgb2JqZWN0IGFyZ3VtZW50LlxuICogQHJldHVybnMge2Jvb2xlYW59IFJldHVybnMgYHRydWVgIGlmIHRoZSBhcmd1bWVudHMgYXJlIGZyb20gYW4gaXRlcmF0ZWUgY2FsbCwgZWxzZSBgZmFsc2VgLlxuICovXG5mdW5jdGlvbiBpc0l0ZXJhdGVlQ2FsbCh2YWx1ZSwgaW5kZXgsIG9iamVjdCkge1xuICBpZiAoIWlzT2JqZWN0KG9iamVjdCkpIHtcbiAgICByZXR1cm4gZmFsc2U7XG4gIH1cbiAgdmFyIHR5cGUgPSB0eXBlb2YgaW5kZXg7XG4gIGlmICh0eXBlID09ICdudW1iZXInXG4gICAgICA/IChpc0FycmF5TGlrZShvYmplY3QpICYmIGlzSW5kZXgoaW5kZXgsIG9iamVjdC5sZW5ndGgpKVxuICAgICAgOiAodHlwZSA9PSAnc3RyaW5nJyAmJiBpbmRleCBpbiBvYmplY3QpKSB7XG4gICAgdmFyIG90aGVyID0gb2JqZWN0W2luZGV4XTtcbiAgICByZXR1cm4gdmFsdWUgPT09IHZhbHVlID8gKHZhbHVlID09PSBvdGhlcikgOiAob3RoZXIgIT09IG90aGVyKTtcbiAgfVxuICByZXR1cm4gZmFsc2U7XG59XG5cbm1vZHVsZS5leHBvcnRzID0gaXNJdGVyYXRlZUNhbGw7XG4iLCJ2YXIgaXNBcnJheSA9IHJlcXVpcmUoJy4uL2xhbmcvaXNBcnJheScpLFxuICAgIHRvT2JqZWN0ID0gcmVxdWlyZSgnLi90b09iamVjdCcpO1xuXG4vKiogVXNlZCB0byBtYXRjaCBwcm9wZXJ0eSBuYW1lcyB3aXRoaW4gcHJvcGVydHkgcGF0aHMuICovXG52YXIgcmVJc0RlZXBQcm9wID0gL1xcLnxcXFsoPzpbXltcXF1dKnwoW1wiJ10pKD86KD8hXFwxKVteXFxuXFxcXF18XFxcXC4pKj9cXDEpXFxdLyxcbiAgICByZUlzUGxhaW5Qcm9wID0gL15cXHcqJC87XG5cbi8qKlxuICogQ2hlY2tzIGlmIGB2YWx1ZWAgaXMgYSBwcm9wZXJ0eSBuYW1lIGFuZCBub3QgYSBwcm9wZXJ0eSBwYXRoLlxuICpcbiAqIEBwcml2YXRlXG4gKiBAcGFyYW0geyp9IHZhbHVlIFRoZSB2YWx1ZSB0byBjaGVjay5cbiAqIEBwYXJhbSB7T2JqZWN0fSBbb2JqZWN0XSBUaGUgb2JqZWN0IHRvIHF1ZXJ5IGtleXMgb24uXG4gKiBAcmV0dXJucyB7Ym9vbGVhbn0gUmV0dXJucyBgdHJ1ZWAgaWYgYHZhbHVlYCBpcyBhIHByb3BlcnR5IG5hbWUsIGVsc2UgYGZhbHNlYC5cbiAqL1xuZnVuY3Rpb24gaXNLZXkodmFsdWUsIG9iamVjdCkge1xuICB2YXIgdHlwZSA9IHR5cGVvZiB2YWx1ZTtcbiAgaWYgKCh0eXBlID09ICdzdHJpbmcnICYmIHJlSXNQbGFpblByb3AudGVzdCh2YWx1ZSkpIHx8IHR5cGUgPT0gJ251bWJlcicpIHtcbiAgICByZXR1cm4gdHJ1ZTtcbiAgfVxuICBpZiAoaXNBcnJheSh2YWx1ZSkpIHtcbiAgICByZXR1cm4gZmFsc2U7XG4gIH1cbiAgdmFyIHJlc3VsdCA9ICFyZUlzRGVlcFByb3AudGVzdCh2YWx1ZSk7XG4gIHJldHVybiByZXN1bHQgfHwgKG9iamVjdCAhPSBudWxsICYmIHZhbHVlIGluIHRvT2JqZWN0KG9iamVjdCkpO1xufVxuXG5tb2R1bGUuZXhwb3J0cyA9IGlzS2V5O1xuIiwidmFyIExhenlXcmFwcGVyID0gcmVxdWlyZSgnLi9MYXp5V3JhcHBlcicpLFxuICAgIGdldERhdGEgPSByZXF1aXJlKCcuL2dldERhdGEnKSxcbiAgICBnZXRGdW5jTmFtZSA9IHJlcXVpcmUoJy4vZ2V0RnVuY05hbWUnKSxcbiAgICBsb2Rhc2ggPSByZXF1aXJlKCcuLi9jaGFpbi9sb2Rhc2gnKTtcblxuLyoqXG4gKiBDaGVja3MgaWYgYGZ1bmNgIGhhcyBhIGxhenkgY291bnRlcnBhcnQuXG4gKlxuICogQHByaXZhdGVcbiAqIEBwYXJhbSB7RnVuY3Rpb259IGZ1bmMgVGhlIGZ1bmN0aW9uIHRvIGNoZWNrLlxuICogQHJldHVybnMge2Jvb2xlYW59IFJldHVybnMgYHRydWVgIGlmIGBmdW5jYCBoYXMgYSBsYXp5IGNvdW50ZXJwYXJ0LCBlbHNlIGBmYWxzZWAuXG4gKi9cbmZ1bmN0aW9uIGlzTGF6aWFibGUoZnVuYykge1xuICB2YXIgZnVuY05hbWUgPSBnZXRGdW5jTmFtZShmdW5jKSxcbiAgICAgIG90aGVyID0gbG9kYXNoW2Z1bmNOYW1lXTtcblxuICBpZiAodHlwZW9mIG90aGVyICE9ICdmdW5jdGlvbicgfHwgIShmdW5jTmFtZSBpbiBMYXp5V3JhcHBlci5wcm90b3R5cGUpKSB7XG4gICAgcmV0dXJuIGZhbHNlO1xuICB9XG4gIGlmIChmdW5jID09PSBvdGhlcikge1xuICAgIHJldHVybiB0cnVlO1xuICB9XG4gIHZhciBkYXRhID0gZ2V0RGF0YShvdGhlcik7XG4gIHJldHVybiAhIWRhdGEgJiYgZnVuYyA9PT0gZGF0YVswXTtcbn1cblxubW9kdWxlLmV4cG9ydHMgPSBpc0xhemlhYmxlO1xuIiwiLyoqXG4gKiBVc2VkIGFzIHRoZSBbbWF4aW11bSBsZW5ndGhdKGh0dHA6Ly9lY21hLWludGVybmF0aW9uYWwub3JnL2VjbWEtMjYyLzYuMC8jc2VjLW51bWJlci5tYXhfc2FmZV9pbnRlZ2VyKVxuICogb2YgYW4gYXJyYXktbGlrZSB2YWx1ZS5cbiAqL1xudmFyIE1BWF9TQUZFX0lOVEVHRVIgPSA5MDA3MTk5MjU0NzQwOTkxO1xuXG4vKipcbiAqIENoZWNrcyBpZiBgdmFsdWVgIGlzIGEgdmFsaWQgYXJyYXktbGlrZSBsZW5ndGguXG4gKlxuICogKipOb3RlOioqIFRoaXMgZnVuY3Rpb24gaXMgYmFzZWQgb24gW2BUb0xlbmd0aGBdKGh0dHA6Ly9lY21hLWludGVybmF0aW9uYWwub3JnL2VjbWEtMjYyLzYuMC8jc2VjLXRvbGVuZ3RoKS5cbiAqXG4gKiBAcHJpdmF0ZVxuICogQHBhcmFtIHsqfSB2YWx1ZSBUaGUgdmFsdWUgdG8gY2hlY2suXG4gKiBAcmV0dXJucyB7Ym9vbGVhbn0gUmV0dXJucyBgdHJ1ZWAgaWYgYHZhbHVlYCBpcyBhIHZhbGlkIGxlbmd0aCwgZWxzZSBgZmFsc2VgLlxuICovXG5mdW5jdGlvbiBpc0xlbmd0aCh2YWx1ZSkge1xuICByZXR1cm4gdHlwZW9mIHZhbHVlID09ICdudW1iZXInICYmIHZhbHVlID4gLTEgJiYgdmFsdWUgJSAxID09IDAgJiYgdmFsdWUgPD0gTUFYX1NBRkVfSU5URUdFUjtcbn1cblxubW9kdWxlLmV4cG9ydHMgPSBpc0xlbmd0aDtcbiIsIi8qKlxuICogQ2hlY2tzIGlmIGB2YWx1ZWAgaXMgb2JqZWN0LWxpa2UuXG4gKlxuICogQHByaXZhdGVcbiAqIEBwYXJhbSB7Kn0gdmFsdWUgVGhlIHZhbHVlIHRvIGNoZWNrLlxuICogQHJldHVybnMge2Jvb2xlYW59IFJldHVybnMgYHRydWVgIGlmIGB2YWx1ZWAgaXMgb2JqZWN0LWxpa2UsIGVsc2UgYGZhbHNlYC5cbiAqL1xuZnVuY3Rpb24gaXNPYmplY3RMaWtlKHZhbHVlKSB7XG4gIHJldHVybiAhIXZhbHVlICYmIHR5cGVvZiB2YWx1ZSA9PSAnb2JqZWN0Jztcbn1cblxubW9kdWxlLmV4cG9ydHMgPSBpc09iamVjdExpa2U7XG4iLCJ2YXIgaXNPYmplY3QgPSByZXF1aXJlKCcuLi9sYW5nL2lzT2JqZWN0Jyk7XG5cbi8qKlxuICogQ2hlY2tzIGlmIGB2YWx1ZWAgaXMgc3VpdGFibGUgZm9yIHN0cmljdCBlcXVhbGl0eSBjb21wYXJpc29ucywgaS5lLiBgPT09YC5cbiAqXG4gKiBAcHJpdmF0ZVxuICogQHBhcmFtIHsqfSB2YWx1ZSBUaGUgdmFsdWUgdG8gY2hlY2suXG4gKiBAcmV0dXJucyB7Ym9vbGVhbn0gUmV0dXJucyBgdHJ1ZWAgaWYgYHZhbHVlYCBpZiBzdWl0YWJsZSBmb3Igc3RyaWN0XG4gKiAgZXF1YWxpdHkgY29tcGFyaXNvbnMsIGVsc2UgYGZhbHNlYC5cbiAqL1xuZnVuY3Rpb24gaXNTdHJpY3RDb21wYXJhYmxlKHZhbHVlKSB7XG4gIHJldHVybiB2YWx1ZSA9PT0gdmFsdWUgJiYgIWlzT2JqZWN0KHZhbHVlKTtcbn1cblxubW9kdWxlLmV4cG9ydHMgPSBpc1N0cmljdENvbXBhcmFibGU7XG4iLCJ2YXIgYXJyYXlDb3B5ID0gcmVxdWlyZSgnLi9hcnJheUNvcHknKSxcbiAgICBjb21wb3NlQXJncyA9IHJlcXVpcmUoJy4vY29tcG9zZUFyZ3MnKSxcbiAgICBjb21wb3NlQXJnc1JpZ2h0ID0gcmVxdWlyZSgnLi9jb21wb3NlQXJnc1JpZ2h0JyksXG4gICAgcmVwbGFjZUhvbGRlcnMgPSByZXF1aXJlKCcuL3JlcGxhY2VIb2xkZXJzJyk7XG5cbi8qKiBVc2VkIHRvIGNvbXBvc2UgYml0bWFza3MgZm9yIHdyYXBwZXIgbWV0YWRhdGEuICovXG52YXIgQklORF9GTEFHID0gMSxcbiAgICBDVVJSWV9CT1VORF9GTEFHID0gNCxcbiAgICBDVVJSWV9GTEFHID0gOCxcbiAgICBBUllfRkxBRyA9IDEyOCxcbiAgICBSRUFSR19GTEFHID0gMjU2O1xuXG4vKiogVXNlZCBhcyB0aGUgaW50ZXJuYWwgYXJndW1lbnQgcGxhY2Vob2xkZXIuICovXG52YXIgUExBQ0VIT0xERVIgPSAnX19sb2Rhc2hfcGxhY2Vob2xkZXJfXyc7XG5cbi8qIE5hdGl2ZSBtZXRob2QgcmVmZXJlbmNlcyBmb3IgdGhvc2Ugd2l0aCB0aGUgc2FtZSBuYW1lIGFzIG90aGVyIGBsb2Rhc2hgIG1ldGhvZHMuICovXG52YXIgbmF0aXZlTWluID0gTWF0aC5taW47XG5cbi8qKlxuICogTWVyZ2VzIHRoZSBmdW5jdGlvbiBtZXRhZGF0YSBvZiBgc291cmNlYCBpbnRvIGBkYXRhYC5cbiAqXG4gKiBNZXJnaW5nIG1ldGFkYXRhIHJlZHVjZXMgdGhlIG51bWJlciBvZiB3cmFwcGVycyByZXF1aXJlZCB0byBpbnZva2UgYSBmdW5jdGlvbi5cbiAqIFRoaXMgaXMgcG9zc2libGUgYmVjYXVzZSBtZXRob2RzIGxpa2UgYF8uYmluZGAsIGBfLmN1cnJ5YCwgYW5kIGBfLnBhcnRpYWxgXG4gKiBtYXkgYmUgYXBwbGllZCByZWdhcmRsZXNzIG9mIGV4ZWN1dGlvbiBvcmRlci4gTWV0aG9kcyBsaWtlIGBfLmFyeWAgYW5kIGBfLnJlYXJnYFxuICogYXVnbWVudCBmdW5jdGlvbiBhcmd1bWVudHMsIG1ha2luZyB0aGUgb3JkZXIgaW4gd2hpY2ggdGhleSBhcmUgZXhlY3V0ZWQgaW1wb3J0YW50LFxuICogcHJldmVudGluZyB0aGUgbWVyZ2luZyBvZiBtZXRhZGF0YS4gSG93ZXZlciwgd2UgbWFrZSBhbiBleGNlcHRpb24gZm9yIGEgc2FmZVxuICogY29tbW9uIGNhc2Ugd2hlcmUgY3VycmllZCBmdW5jdGlvbnMgaGF2ZSBgXy5hcnlgIGFuZCBvciBgXy5yZWFyZ2AgYXBwbGllZC5cbiAqXG4gKiBAcHJpdmF0ZVxuICogQHBhcmFtIHtBcnJheX0gZGF0YSBUaGUgZGVzdGluYXRpb24gbWV0YWRhdGEuXG4gKiBAcGFyYW0ge0FycmF5fSBzb3VyY2UgVGhlIHNvdXJjZSBtZXRhZGF0YS5cbiAqIEByZXR1cm5zIHtBcnJheX0gUmV0dXJucyBgZGF0YWAuXG4gKi9cbmZ1bmN0aW9uIG1lcmdlRGF0YShkYXRhLCBzb3VyY2UpIHtcbiAgdmFyIGJpdG1hc2sgPSBkYXRhWzFdLFxuICAgICAgc3JjQml0bWFzayA9IHNvdXJjZVsxXSxcbiAgICAgIG5ld0JpdG1hc2sgPSBiaXRtYXNrIHwgc3JjQml0bWFzayxcbiAgICAgIGlzQ29tbW9uID0gbmV3Qml0bWFzayA8IEFSWV9GTEFHO1xuXG4gIHZhciBpc0NvbWJvID1cbiAgICAoc3JjQml0bWFzayA9PSBBUllfRkxBRyAmJiBiaXRtYXNrID09IENVUlJZX0ZMQUcpIHx8XG4gICAgKHNyY0JpdG1hc2sgPT0gQVJZX0ZMQUcgJiYgYml0bWFzayA9PSBSRUFSR19GTEFHICYmIGRhdGFbN10ubGVuZ3RoIDw9IHNvdXJjZVs4XSkgfHxcbiAgICAoc3JjQml0bWFzayA9PSAoQVJZX0ZMQUcgfCBSRUFSR19GTEFHKSAmJiBiaXRtYXNrID09IENVUlJZX0ZMQUcpO1xuXG4gIC8vIEV4aXQgZWFybHkgaWYgbWV0YWRhdGEgY2FuJ3QgYmUgbWVyZ2VkLlxuICBpZiAoIShpc0NvbW1vbiB8fCBpc0NvbWJvKSkge1xuICAgIHJldHVybiBkYXRhO1xuICB9XG4gIC8vIFVzZSBzb3VyY2UgYHRoaXNBcmdgIGlmIGF2YWlsYWJsZS5cbiAgaWYgKHNyY0JpdG1hc2sgJiBCSU5EX0ZMQUcpIHtcbiAgICBkYXRhWzJdID0gc291cmNlWzJdO1xuICAgIC8vIFNldCB3aGVuIGN1cnJ5aW5nIGEgYm91bmQgZnVuY3Rpb24uXG4gICAgbmV3Qml0bWFzayB8PSAoYml0bWFzayAmIEJJTkRfRkxBRykgPyAwIDogQ1VSUllfQk9VTkRfRkxBRztcbiAgfVxuICAvLyBDb21wb3NlIHBhcnRpYWwgYXJndW1lbnRzLlxuICB2YXIgdmFsdWUgPSBzb3VyY2VbM107XG4gIGlmICh2YWx1ZSkge1xuICAgIHZhciBwYXJ0aWFscyA9IGRhdGFbM107XG4gICAgZGF0YVszXSA9IHBhcnRpYWxzID8gY29tcG9zZUFyZ3MocGFydGlhbHMsIHZhbHVlLCBzb3VyY2VbNF0pIDogYXJyYXlDb3B5KHZhbHVlKTtcbiAgICBkYXRhWzRdID0gcGFydGlhbHMgPyByZXBsYWNlSG9sZGVycyhkYXRhWzNdLCBQTEFDRUhPTERFUikgOiBhcnJheUNvcHkoc291cmNlWzRdKTtcbiAgfVxuICAvLyBDb21wb3NlIHBhcnRpYWwgcmlnaHQgYXJndW1lbnRzLlxuICB2YWx1ZSA9IHNvdXJjZVs1XTtcbiAgaWYgKHZhbHVlKSB7XG4gICAgcGFydGlhbHMgPSBkYXRhWzVdO1xuICAgIGRhdGFbNV0gPSBwYXJ0aWFscyA/IGNvbXBvc2VBcmdzUmlnaHQocGFydGlhbHMsIHZhbHVlLCBzb3VyY2VbNl0pIDogYXJyYXlDb3B5KHZhbHVlKTtcbiAgICBkYXRhWzZdID0gcGFydGlhbHMgPyByZXBsYWNlSG9sZGVycyhkYXRhWzVdLCBQTEFDRUhPTERFUikgOiBhcnJheUNvcHkoc291cmNlWzZdKTtcbiAgfVxuICAvLyBVc2Ugc291cmNlIGBhcmdQb3NgIGlmIGF2YWlsYWJsZS5cbiAgdmFsdWUgPSBzb3VyY2VbN107XG4gIGlmICh2YWx1ZSkge1xuICAgIGRhdGFbN10gPSBhcnJheUNvcHkodmFsdWUpO1xuICB9XG4gIC8vIFVzZSBzb3VyY2UgYGFyeWAgaWYgaXQncyBzbWFsbGVyLlxuICBpZiAoc3JjQml0bWFzayAmIEFSWV9GTEFHKSB7XG4gICAgZGF0YVs4XSA9IGRhdGFbOF0gPT0gbnVsbCA/IHNvdXJjZVs4XSA6IG5hdGl2ZU1pbihkYXRhWzhdLCBzb3VyY2VbOF0pO1xuICB9XG4gIC8vIFVzZSBzb3VyY2UgYGFyaXR5YCBpZiBvbmUgaXMgbm90IHByb3ZpZGVkLlxuICBpZiAoZGF0YVs5XSA9PSBudWxsKSB7XG4gICAgZGF0YVs5XSA9IHNvdXJjZVs5XTtcbiAgfVxuICAvLyBVc2Ugc291cmNlIGBmdW5jYCBhbmQgbWVyZ2UgYml0bWFza3MuXG4gIGRhdGFbMF0gPSBzb3VyY2VbMF07XG4gIGRhdGFbMV0gPSBuZXdCaXRtYXNrO1xuXG4gIHJldHVybiBkYXRhO1xufVxuXG5tb2R1bGUuZXhwb3J0cyA9IG1lcmdlRGF0YTtcbiIsIihmdW5jdGlvbiAoZ2xvYmFsKXtcbnZhciBnZXROYXRpdmUgPSByZXF1aXJlKCcuL2dldE5hdGl2ZScpO1xuXG4vKiogTmF0aXZlIG1ldGhvZCByZWZlcmVuY2VzLiAqL1xudmFyIFdlYWtNYXAgPSBnZXROYXRpdmUoZ2xvYmFsLCAnV2Vha01hcCcpO1xuXG4vKiogVXNlZCB0byBzdG9yZSBmdW5jdGlvbiBtZXRhZGF0YS4gKi9cbnZhciBtZXRhTWFwID0gV2Vha01hcCAmJiBuZXcgV2Vha01hcDtcblxubW9kdWxlLmV4cG9ydHMgPSBtZXRhTWFwO1xuXG59KS5jYWxsKHRoaXMsdHlwZW9mIGdsb2JhbCAhPT0gXCJ1bmRlZmluZWRcIiA/IGdsb2JhbCA6IHR5cGVvZiBzZWxmICE9PSBcInVuZGVmaW5lZFwiID8gc2VsZiA6IHR5cGVvZiB3aW5kb3cgIT09IFwidW5kZWZpbmVkXCIgPyB3aW5kb3cgOiB7fSlcbi8vIyBzb3VyY2VNYXBwaW5nVVJMPWRhdGE6YXBwbGljYXRpb24vanNvbjtjaGFyc2V0OnV0Zi04O2Jhc2U2NCxleUoyWlhKemFXOXVJam96TENKemIzVnlZMlZ6SWpwYkltNXZaR1ZmYlc5a2RXeGxjeTlzYjJSaGMyZ3RZMjl0Y0dGMEwybHVkR1Z5Ym1Gc0wyMWxkR0ZOWVhBdWFuTWlYU3dpYm1GdFpYTWlPbHRkTENKdFlYQndhVzVuY3lJNklqdEJRVUZCTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CSWl3aVptbHNaU0k2SW1kbGJtVnlZWFJsWkM1cWN5SXNJbk52ZFhKalpWSnZiM1FpT2lJaUxDSnpiM1Z5WTJWelEyOXVkR1Z1ZENJNld5SjJZWElnWjJWMFRtRjBhWFpsSUQwZ2NtVnhkV2x5WlNnbkxpOW5aWFJPWVhScGRtVW5LVHRjYmx4dUx5b3FJRTVoZEdsMlpTQnRaWFJvYjJRZ2NtVm1aWEpsYm1ObGN5NGdLaTljYm5aaGNpQlhaV0ZyVFdGd0lEMGdaMlYwVG1GMGFYWmxLR2RzYjJKaGJDd2dKMWRsWVd0TllYQW5LVHRjYmx4dUx5b3FJRlZ6WldRZ2RHOGdjM1J2Y21VZ1puVnVZM1JwYjI0Z2JXVjBZV1JoZEdFdUlDb3ZYRzUyWVhJZ2JXVjBZVTFoY0NBOUlGZGxZV3ROWVhBZ0ppWWdibVYzSUZkbFlXdE5ZWEE3WEc1Y2JtMXZaSFZzWlM1bGVIQnZjblJ6SUQwZ2JXVjBZVTFoY0R0Y2JpSmRmUT09IiwiLyoqIFVzZWQgdG8gbG9va3VwIHVubWluaWZpZWQgZnVuY3Rpb24gbmFtZXMuICovXG52YXIgcmVhbE5hbWVzID0ge307XG5cbm1vZHVsZS5leHBvcnRzID0gcmVhbE5hbWVzO1xuIiwidmFyIGFycmF5Q29weSA9IHJlcXVpcmUoJy4vYXJyYXlDb3B5JyksXG4gICAgaXNJbmRleCA9IHJlcXVpcmUoJy4vaXNJbmRleCcpO1xuXG4vKiBOYXRpdmUgbWV0aG9kIHJlZmVyZW5jZXMgZm9yIHRob3NlIHdpdGggdGhlIHNhbWUgbmFtZSBhcyBvdGhlciBgbG9kYXNoYCBtZXRob2RzLiAqL1xudmFyIG5hdGl2ZU1pbiA9IE1hdGgubWluO1xuXG4vKipcbiAqIFJlb3JkZXIgYGFycmF5YCBhY2NvcmRpbmcgdG8gdGhlIHNwZWNpZmllZCBpbmRleGVzIHdoZXJlIHRoZSBlbGVtZW50IGF0XG4gKiB0aGUgZmlyc3QgaW5kZXggaXMgYXNzaWduZWQgYXMgdGhlIGZpcnN0IGVsZW1lbnQsIHRoZSBlbGVtZW50IGF0XG4gKiB0aGUgc2Vjb25kIGluZGV4IGlzIGFzc2lnbmVkIGFzIHRoZSBzZWNvbmQgZWxlbWVudCwgYW5kIHNvIG9uLlxuICpcbiAqIEBwcml2YXRlXG4gKiBAcGFyYW0ge0FycmF5fSBhcnJheSBUaGUgYXJyYXkgdG8gcmVvcmRlci5cbiAqIEBwYXJhbSB7QXJyYXl9IGluZGV4ZXMgVGhlIGFycmFuZ2VkIGFycmF5IGluZGV4ZXMuXG4gKiBAcmV0dXJucyB7QXJyYXl9IFJldHVybnMgYGFycmF5YC5cbiAqL1xuZnVuY3Rpb24gcmVvcmRlcihhcnJheSwgaW5kZXhlcykge1xuICB2YXIgYXJyTGVuZ3RoID0gYXJyYXkubGVuZ3RoLFxuICAgICAgbGVuZ3RoID0gbmF0aXZlTWluKGluZGV4ZXMubGVuZ3RoLCBhcnJMZW5ndGgpLFxuICAgICAgb2xkQXJyYXkgPSBhcnJheUNvcHkoYXJyYXkpO1xuXG4gIHdoaWxlIChsZW5ndGgtLSkge1xuICAgIHZhciBpbmRleCA9IGluZGV4ZXNbbGVuZ3RoXTtcbiAgICBhcnJheVtsZW5ndGhdID0gaXNJbmRleChpbmRleCwgYXJyTGVuZ3RoKSA/IG9sZEFycmF5W2luZGV4XSA6IHVuZGVmaW5lZDtcbiAgfVxuICByZXR1cm4gYXJyYXk7XG59XG5cbm1vZHVsZS5leHBvcnRzID0gcmVvcmRlcjtcbiIsIi8qKiBVc2VkIGFzIHRoZSBpbnRlcm5hbCBhcmd1bWVudCBwbGFjZWhvbGRlci4gKi9cbnZhciBQTEFDRUhPTERFUiA9ICdfX2xvZGFzaF9wbGFjZWhvbGRlcl9fJztcblxuLyoqXG4gKiBSZXBsYWNlcyBhbGwgYHBsYWNlaG9sZGVyYCBlbGVtZW50cyBpbiBgYXJyYXlgIHdpdGggYW4gaW50ZXJuYWwgcGxhY2Vob2xkZXJcbiAqIGFuZCByZXR1cm5zIGFuIGFycmF5IG9mIHRoZWlyIGluZGV4ZXMuXG4gKlxuICogQHByaXZhdGVcbiAqIEBwYXJhbSB7QXJyYXl9IGFycmF5IFRoZSBhcnJheSB0byBtb2RpZnkuXG4gKiBAcGFyYW0geyp9IHBsYWNlaG9sZGVyIFRoZSBwbGFjZWhvbGRlciB0byByZXBsYWNlLlxuICogQHJldHVybnMge0FycmF5fSBSZXR1cm5zIHRoZSBuZXcgYXJyYXkgb2YgcGxhY2Vob2xkZXIgaW5kZXhlcy5cbiAqL1xuZnVuY3Rpb24gcmVwbGFjZUhvbGRlcnMoYXJyYXksIHBsYWNlaG9sZGVyKSB7XG4gIHZhciBpbmRleCA9IC0xLFxuICAgICAgbGVuZ3RoID0gYXJyYXkubGVuZ3RoLFxuICAgICAgcmVzSW5kZXggPSAtMSxcbiAgICAgIHJlc3VsdCA9IFtdO1xuXG4gIHdoaWxlICgrK2luZGV4IDwgbGVuZ3RoKSB7XG4gICAgaWYgKGFycmF5W2luZGV4XSA9PT0gcGxhY2Vob2xkZXIpIHtcbiAgICAgIGFycmF5W2luZGV4XSA9IFBMQUNFSE9MREVSO1xuICAgICAgcmVzdWx0WysrcmVzSW5kZXhdID0gaW5kZXg7XG4gICAgfVxuICB9XG4gIHJldHVybiByZXN1bHQ7XG59XG5cbm1vZHVsZS5leHBvcnRzID0gcmVwbGFjZUhvbGRlcnM7XG4iLCJ2YXIgYmFzZVNldERhdGEgPSByZXF1aXJlKCcuL2Jhc2VTZXREYXRhJyksXG4gICAgbm93ID0gcmVxdWlyZSgnLi4vZGF0ZS9ub3cnKTtcblxuLyoqIFVzZWQgdG8gZGV0ZWN0IHdoZW4gYSBmdW5jdGlvbiBiZWNvbWVzIGhvdC4gKi9cbnZhciBIT1RfQ09VTlQgPSAxNTAsXG4gICAgSE9UX1NQQU4gPSAxNjtcblxuLyoqXG4gKiBTZXRzIG1ldGFkYXRhIGZvciBgZnVuY2AuXG4gKlxuICogKipOb3RlOioqIElmIHRoaXMgZnVuY3Rpb24gYmVjb21lcyBob3QsIGkuZS4gaXMgaW52b2tlZCBhIGxvdCBpbiBhIHNob3J0XG4gKiBwZXJpb2Qgb2YgdGltZSwgaXQgd2lsbCB0cmlwIGl0cyBicmVha2VyIGFuZCB0cmFuc2l0aW9uIHRvIGFuIGlkZW50aXR5IGZ1bmN0aW9uXG4gKiB0byBhdm9pZCBnYXJiYWdlIGNvbGxlY3Rpb24gcGF1c2VzIGluIFY4LiBTZWUgW1Y4IGlzc3VlIDIwNzBdKGh0dHBzOi8vY29kZS5nb29nbGUuY29tL3AvdjgvaXNzdWVzL2RldGFpbD9pZD0yMDcwKVxuICogZm9yIG1vcmUgZGV0YWlscy5cbiAqXG4gKiBAcHJpdmF0ZVxuICogQHBhcmFtIHtGdW5jdGlvbn0gZnVuYyBUaGUgZnVuY3Rpb24gdG8gYXNzb2NpYXRlIG1ldGFkYXRhIHdpdGguXG4gKiBAcGFyYW0geyp9IGRhdGEgVGhlIG1ldGFkYXRhLlxuICogQHJldHVybnMge0Z1bmN0aW9ufSBSZXR1cm5zIGBmdW5jYC5cbiAqL1xudmFyIHNldERhdGEgPSAoZnVuY3Rpb24oKSB7XG4gIHZhciBjb3VudCA9IDAsXG4gICAgICBsYXN0Q2FsbGVkID0gMDtcblxuICByZXR1cm4gZnVuY3Rpb24oa2V5LCB2YWx1ZSkge1xuICAgIHZhciBzdGFtcCA9IG5vdygpLFxuICAgICAgICByZW1haW5pbmcgPSBIT1RfU1BBTiAtIChzdGFtcCAtIGxhc3RDYWxsZWQpO1xuXG4gICAgbGFzdENhbGxlZCA9IHN0YW1wO1xuICAgIGlmIChyZW1haW5pbmcgPiAwKSB7XG4gICAgICBpZiAoKytjb3VudCA+PSBIT1RfQ09VTlQpIHtcbiAgICAgICAgcmV0dXJuIGtleTtcbiAgICAgIH1cbiAgICB9IGVsc2Uge1xuICAgICAgY291bnQgPSAwO1xuICAgIH1cbiAgICByZXR1cm4gYmFzZVNldERhdGEoa2V5LCB2YWx1ZSk7XG4gIH07XG59KCkpO1xuXG5tb2R1bGUuZXhwb3J0cyA9IHNldERhdGE7XG4iLCJ2YXIgaXNBcmd1bWVudHMgPSByZXF1aXJlKCcuLi9sYW5nL2lzQXJndW1lbnRzJyksXG4gICAgaXNBcnJheSA9IHJlcXVpcmUoJy4uL2xhbmcvaXNBcnJheScpLFxuICAgIGlzSW5kZXggPSByZXF1aXJlKCcuL2lzSW5kZXgnKSxcbiAgICBpc0xlbmd0aCA9IHJlcXVpcmUoJy4vaXNMZW5ndGgnKSxcbiAgICBpc1N0cmluZyA9IHJlcXVpcmUoJy4uL2xhbmcvaXNTdHJpbmcnKSxcbiAgICBrZXlzSW4gPSByZXF1aXJlKCcuLi9vYmplY3Qva2V5c0luJyk7XG5cbi8qKiBVc2VkIGZvciBuYXRpdmUgbWV0aG9kIHJlZmVyZW5jZXMuICovXG52YXIgb2JqZWN0UHJvdG8gPSBPYmplY3QucHJvdG90eXBlO1xuXG4vKiogVXNlZCB0byBjaGVjayBvYmplY3RzIGZvciBvd24gcHJvcGVydGllcy4gKi9cbnZhciBoYXNPd25Qcm9wZXJ0eSA9IG9iamVjdFByb3RvLmhhc093blByb3BlcnR5O1xuXG4vKipcbiAqIEEgZmFsbGJhY2sgaW1wbGVtZW50YXRpb24gb2YgYE9iamVjdC5rZXlzYCB3aGljaCBjcmVhdGVzIGFuIGFycmF5IG9mIHRoZVxuICogb3duIGVudW1lcmFibGUgcHJvcGVydHkgbmFtZXMgb2YgYG9iamVjdGAuXG4gKlxuICogQHByaXZhdGVcbiAqIEBwYXJhbSB7T2JqZWN0fSBvYmplY3QgVGhlIG9iamVjdCB0byBxdWVyeS5cbiAqIEByZXR1cm5zIHtBcnJheX0gUmV0dXJucyB0aGUgYXJyYXkgb2YgcHJvcGVydHkgbmFtZXMuXG4gKi9cbmZ1bmN0aW9uIHNoaW1LZXlzKG9iamVjdCkge1xuICB2YXIgcHJvcHMgPSBrZXlzSW4ob2JqZWN0KSxcbiAgICAgIHByb3BzTGVuZ3RoID0gcHJvcHMubGVuZ3RoLFxuICAgICAgbGVuZ3RoID0gcHJvcHNMZW5ndGggJiYgb2JqZWN0Lmxlbmd0aDtcblxuICB2YXIgYWxsb3dJbmRleGVzID0gISFsZW5ndGggJiYgaXNMZW5ndGgobGVuZ3RoKSAmJlxuICAgIChpc0FycmF5KG9iamVjdCkgfHwgaXNBcmd1bWVudHMob2JqZWN0KSB8fCBpc1N0cmluZyhvYmplY3QpKTtcblxuICB2YXIgaW5kZXggPSAtMSxcbiAgICAgIHJlc3VsdCA9IFtdO1xuXG4gIHdoaWxlICgrK2luZGV4IDwgcHJvcHNMZW5ndGgpIHtcbiAgICB2YXIga2V5ID0gcHJvcHNbaW5kZXhdO1xuICAgIGlmICgoYWxsb3dJbmRleGVzICYmIGlzSW5kZXgoa2V5LCBsZW5ndGgpKSB8fCBoYXNPd25Qcm9wZXJ0eS5jYWxsKG9iamVjdCwga2V5KSkge1xuICAgICAgcmVzdWx0LnB1c2goa2V5KTtcbiAgICB9XG4gIH1cbiAgcmV0dXJuIHJlc3VsdDtcbn1cblxubW9kdWxlLmV4cG9ydHMgPSBzaGltS2V5cztcbiIsInZhciBpc09iamVjdCA9IHJlcXVpcmUoJy4uL2xhbmcvaXNPYmplY3QnKSxcbiAgICBpc1N0cmluZyA9IHJlcXVpcmUoJy4uL2xhbmcvaXNTdHJpbmcnKSxcbiAgICBzdXBwb3J0ID0gcmVxdWlyZSgnLi4vc3VwcG9ydCcpO1xuXG4vKipcbiAqIENvbnZlcnRzIGB2YWx1ZWAgdG8gYW4gb2JqZWN0IGlmIGl0J3Mgbm90IG9uZS5cbiAqXG4gKiBAcHJpdmF0ZVxuICogQHBhcmFtIHsqfSB2YWx1ZSBUaGUgdmFsdWUgdG8gcHJvY2Vzcy5cbiAqIEByZXR1cm5zIHtPYmplY3R9IFJldHVybnMgdGhlIG9iamVjdC5cbiAqL1xuZnVuY3Rpb24gdG9PYmplY3QodmFsdWUpIHtcbiAgaWYgKHN1cHBvcnQudW5pbmRleGVkQ2hhcnMgJiYgaXNTdHJpbmcodmFsdWUpKSB7XG4gICAgdmFyIGluZGV4ID0gLTEsXG4gICAgICAgIGxlbmd0aCA9IHZhbHVlLmxlbmd0aCxcbiAgICAgICAgcmVzdWx0ID0gT2JqZWN0KHZhbHVlKTtcblxuICAgIHdoaWxlICgrK2luZGV4IDwgbGVuZ3RoKSB7XG4gICAgICByZXN1bHRbaW5kZXhdID0gdmFsdWUuY2hhckF0KGluZGV4KTtcbiAgICB9XG4gICAgcmV0dXJuIHJlc3VsdDtcbiAgfVxuICByZXR1cm4gaXNPYmplY3QodmFsdWUpID8gdmFsdWUgOiBPYmplY3QodmFsdWUpO1xufVxuXG5tb2R1bGUuZXhwb3J0cyA9IHRvT2JqZWN0O1xuIiwidmFyIGJhc2VUb1N0cmluZyA9IHJlcXVpcmUoJy4vYmFzZVRvU3RyaW5nJyksXG4gICAgaXNBcnJheSA9IHJlcXVpcmUoJy4uL2xhbmcvaXNBcnJheScpO1xuXG4vKiogVXNlZCB0byBtYXRjaCBwcm9wZXJ0eSBuYW1lcyB3aXRoaW4gcHJvcGVydHkgcGF0aHMuICovXG52YXIgcmVQcm9wTmFtZSA9IC9bXi5bXFxdXSt8XFxbKD86KC0/XFxkKyg/OlxcLlxcZCspPyl8KFtcIiddKSgoPzooPyFcXDIpW15cXG5cXFxcXXxcXFxcLikqPylcXDIpXFxdL2c7XG5cbi8qKiBVc2VkIHRvIG1hdGNoIGJhY2tzbGFzaGVzIGluIHByb3BlcnR5IHBhdGhzLiAqL1xudmFyIHJlRXNjYXBlQ2hhciA9IC9cXFxcKFxcXFwpPy9nO1xuXG4vKipcbiAqIENvbnZlcnRzIGB2YWx1ZWAgdG8gcHJvcGVydHkgcGF0aCBhcnJheSBpZiBpdCdzIG5vdCBvbmUuXG4gKlxuICogQHByaXZhdGVcbiAqIEBwYXJhbSB7Kn0gdmFsdWUgVGhlIHZhbHVlIHRvIHByb2Nlc3MuXG4gKiBAcmV0dXJucyB7QXJyYXl9IFJldHVybnMgdGhlIHByb3BlcnR5IHBhdGggYXJyYXkuXG4gKi9cbmZ1bmN0aW9uIHRvUGF0aCh2YWx1ZSkge1xuICBpZiAoaXNBcnJheSh2YWx1ZSkpIHtcbiAgICByZXR1cm4gdmFsdWU7XG4gIH1cbiAgdmFyIHJlc3VsdCA9IFtdO1xuICBiYXNlVG9TdHJpbmcodmFsdWUpLnJlcGxhY2UocmVQcm9wTmFtZSwgZnVuY3Rpb24obWF0Y2gsIG51bWJlciwgcXVvdGUsIHN0cmluZykge1xuICAgIHJlc3VsdC5wdXNoKHF1b3RlID8gc3RyaW5nLnJlcGxhY2UocmVFc2NhcGVDaGFyLCAnJDEnKSA6IChudW1iZXIgfHwgbWF0Y2gpKTtcbiAgfSk7XG4gIHJldHVybiByZXN1bHQ7XG59XG5cbm1vZHVsZS5leHBvcnRzID0gdG9QYXRoO1xuIiwidmFyIExhenlXcmFwcGVyID0gcmVxdWlyZSgnLi9MYXp5V3JhcHBlcicpLFxuICAgIExvZGFzaFdyYXBwZXIgPSByZXF1aXJlKCcuL0xvZGFzaFdyYXBwZXInKSxcbiAgICBhcnJheUNvcHkgPSByZXF1aXJlKCcuL2FycmF5Q29weScpO1xuXG4vKipcbiAqIENyZWF0ZXMgYSBjbG9uZSBvZiBgd3JhcHBlcmAuXG4gKlxuICogQHByaXZhdGVcbiAqIEBwYXJhbSB7T2JqZWN0fSB3cmFwcGVyIFRoZSB3cmFwcGVyIHRvIGNsb25lLlxuICogQHJldHVybnMge09iamVjdH0gUmV0dXJucyB0aGUgY2xvbmVkIHdyYXBwZXIuXG4gKi9cbmZ1bmN0aW9uIHdyYXBwZXJDbG9uZSh3cmFwcGVyKSB7XG4gIHJldHVybiB3cmFwcGVyIGluc3RhbmNlb2YgTGF6eVdyYXBwZXJcbiAgICA/IHdyYXBwZXIuY2xvbmUoKVxuICAgIDogbmV3IExvZGFzaFdyYXBwZXIod3JhcHBlci5fX3dyYXBwZWRfXywgd3JhcHBlci5fX2NoYWluX18sIGFycmF5Q29weSh3cmFwcGVyLl9fYWN0aW9uc19fKSk7XG59XG5cbm1vZHVsZS5leHBvcnRzID0gd3JhcHBlckNsb25lO1xuIiwidmFyIGJhc2VDbG9uZSA9IHJlcXVpcmUoJy4uL2ludGVybmFsL2Jhc2VDbG9uZScpLFxuICAgIGJpbmRDYWxsYmFjayA9IHJlcXVpcmUoJy4uL2ludGVybmFsL2JpbmRDYWxsYmFjaycpO1xuXG4vKipcbiAqIENyZWF0ZXMgYSBkZWVwIGNsb25lIG9mIGB2YWx1ZWAuIElmIGBjdXN0b21pemVyYCBpcyBwcm92aWRlZCBpdCdzIGludm9rZWRcbiAqIHRvIHByb2R1Y2UgdGhlIGNsb25lZCB2YWx1ZXMuIElmIGBjdXN0b21pemVyYCByZXR1cm5zIGB1bmRlZmluZWRgIGNsb25pbmdcbiAqIGlzIGhhbmRsZWQgYnkgdGhlIG1ldGhvZCBpbnN0ZWFkLiBUaGUgYGN1c3RvbWl6ZXJgIGlzIGJvdW5kIHRvIGB0aGlzQXJnYFxuICogYW5kIGludm9rZWQgd2l0aCB1cCB0byB0aHJlZSBhcmd1bWVudDsgKHZhbHVlIFssIGluZGV4fGtleSwgb2JqZWN0XSkuXG4gKlxuICogKipOb3RlOioqIFRoaXMgbWV0aG9kIGlzIGxvb3NlbHkgYmFzZWQgb24gdGhlXG4gKiBbc3RydWN0dXJlZCBjbG9uZSBhbGdvcml0aG1dKGh0dHA6Ly93d3cudzMub3JnL1RSL2h0bWw1L2luZnJhc3RydWN0dXJlLmh0bWwjaW50ZXJuYWwtc3RydWN0dXJlZC1jbG9uaW5nLWFsZ29yaXRobSkuXG4gKiBUaGUgZW51bWVyYWJsZSBwcm9wZXJ0aWVzIG9mIGBhcmd1bWVudHNgIG9iamVjdHMgYW5kIG9iamVjdHMgY3JlYXRlZCBieVxuICogY29uc3RydWN0b3JzIG90aGVyIHRoYW4gYE9iamVjdGAgYXJlIGNsb25lZCB0byBwbGFpbiBgT2JqZWN0YCBvYmplY3RzLiBBblxuICogZW1wdHkgb2JqZWN0IGlzIHJldHVybmVkIGZvciB1bmNsb25lYWJsZSB2YWx1ZXMgc3VjaCBhcyBmdW5jdGlvbnMsIERPTSBub2RlcyxcbiAqIE1hcHMsIFNldHMsIGFuZCBXZWFrTWFwcy5cbiAqXG4gKiBAc3RhdGljXG4gKiBAbWVtYmVyT2YgX1xuICogQGNhdGVnb3J5IExhbmdcbiAqIEBwYXJhbSB7Kn0gdmFsdWUgVGhlIHZhbHVlIHRvIGRlZXAgY2xvbmUuXG4gKiBAcGFyYW0ge0Z1bmN0aW9ufSBbY3VzdG9taXplcl0gVGhlIGZ1bmN0aW9uIHRvIGN1c3RvbWl6ZSBjbG9uaW5nIHZhbHVlcy5cbiAqIEBwYXJhbSB7Kn0gW3RoaXNBcmddIFRoZSBgdGhpc2AgYmluZGluZyBvZiBgY3VzdG9taXplcmAuXG4gKiBAcmV0dXJucyB7Kn0gUmV0dXJucyB0aGUgZGVlcCBjbG9uZWQgdmFsdWUuXG4gKiBAZXhhbXBsZVxuICpcbiAqIHZhciB1c2VycyA9IFtcbiAqICAgeyAndXNlcic6ICdiYXJuZXknIH0sXG4gKiAgIHsgJ3VzZXInOiAnZnJlZCcgfVxuICogXTtcbiAqXG4gKiB2YXIgZGVlcCA9IF8uY2xvbmVEZWVwKHVzZXJzKTtcbiAqIGRlZXBbMF0gPT09IHVzZXJzWzBdO1xuICogLy8gPT4gZmFsc2VcbiAqXG4gKiAvLyB1c2luZyBhIGN1c3RvbWl6ZXIgY2FsbGJhY2tcbiAqIHZhciBlbCA9IF8uY2xvbmVEZWVwKGRvY3VtZW50LmJvZHksIGZ1bmN0aW9uKHZhbHVlKSB7XG4gKiAgIGlmIChfLmlzRWxlbWVudCh2YWx1ZSkpIHtcbiAqICAgICByZXR1cm4gdmFsdWUuY2xvbmVOb2RlKHRydWUpO1xuICogICB9XG4gKiB9KTtcbiAqXG4gKiBlbCA9PT0gZG9jdW1lbnQuYm9keVxuICogLy8gPT4gZmFsc2VcbiAqIGVsLm5vZGVOYW1lXG4gKiAvLyA9PiBCT0RZXG4gKiBlbC5jaGlsZE5vZGVzLmxlbmd0aDtcbiAqIC8vID0+IDIwXG4gKi9cbmZ1bmN0aW9uIGNsb25lRGVlcCh2YWx1ZSwgY3VzdG9taXplciwgdGhpc0FyZykge1xuICByZXR1cm4gdHlwZW9mIGN1c3RvbWl6ZXIgPT0gJ2Z1bmN0aW9uJ1xuICAgID8gYmFzZUNsb25lKHZhbHVlLCB0cnVlLCBiaW5kQ2FsbGJhY2soY3VzdG9taXplciwgdGhpc0FyZywgMykpXG4gICAgOiBiYXNlQ2xvbmUodmFsdWUsIHRydWUpO1xufVxuXG5tb2R1bGUuZXhwb3J0cyA9IGNsb25lRGVlcDtcbiIsInZhciBpc0FycmF5TGlrZSA9IHJlcXVpcmUoJy4uL2ludGVybmFsL2lzQXJyYXlMaWtlJyksXG4gICAgaXNPYmplY3RMaWtlID0gcmVxdWlyZSgnLi4vaW50ZXJuYWwvaXNPYmplY3RMaWtlJyk7XG5cbi8qKiBVc2VkIGZvciBuYXRpdmUgbWV0aG9kIHJlZmVyZW5jZXMuICovXG52YXIgb2JqZWN0UHJvdG8gPSBPYmplY3QucHJvdG90eXBlO1xuXG4vKiogVXNlZCB0byBjaGVjayBvYmplY3RzIGZvciBvd24gcHJvcGVydGllcy4gKi9cbnZhciBoYXNPd25Qcm9wZXJ0eSA9IG9iamVjdFByb3RvLmhhc093blByb3BlcnR5O1xuXG4vKiogTmF0aXZlIG1ldGhvZCByZWZlcmVuY2VzLiAqL1xudmFyIHByb3BlcnR5SXNFbnVtZXJhYmxlID0gb2JqZWN0UHJvdG8ucHJvcGVydHlJc0VudW1lcmFibGU7XG5cbi8qKlxuICogQ2hlY2tzIGlmIGB2YWx1ZWAgaXMgY2xhc3NpZmllZCBhcyBhbiBgYXJndW1lbnRzYCBvYmplY3QuXG4gKlxuICogQHN0YXRpY1xuICogQG1lbWJlck9mIF9cbiAqIEBjYXRlZ29yeSBMYW5nXG4gKiBAcGFyYW0geyp9IHZhbHVlIFRoZSB2YWx1ZSB0byBjaGVjay5cbiAqIEByZXR1cm5zIHtib29sZWFufSBSZXR1cm5zIGB0cnVlYCBpZiBgdmFsdWVgIGlzIGNvcnJlY3RseSBjbGFzc2lmaWVkLCBlbHNlIGBmYWxzZWAuXG4gKiBAZXhhbXBsZVxuICpcbiAqIF8uaXNBcmd1bWVudHMoZnVuY3Rpb24oKSB7IHJldHVybiBhcmd1bWVudHM7IH0oKSk7XG4gKiAvLyA9PiB0cnVlXG4gKlxuICogXy5pc0FyZ3VtZW50cyhbMSwgMiwgM10pO1xuICogLy8gPT4gZmFsc2VcbiAqL1xuZnVuY3Rpb24gaXNBcmd1bWVudHModmFsdWUpIHtcbiAgcmV0dXJuIGlzT2JqZWN0TGlrZSh2YWx1ZSkgJiYgaXNBcnJheUxpa2UodmFsdWUpICYmXG4gICAgaGFzT3duUHJvcGVydHkuY2FsbCh2YWx1ZSwgJ2NhbGxlZScpICYmICFwcm9wZXJ0eUlzRW51bWVyYWJsZS5jYWxsKHZhbHVlLCAnY2FsbGVlJyk7XG59XG5cbm1vZHVsZS5leHBvcnRzID0gaXNBcmd1bWVudHM7XG4iLCJ2YXIgZ2V0TmF0aXZlID0gcmVxdWlyZSgnLi4vaW50ZXJuYWwvZ2V0TmF0aXZlJyksXG4gICAgaXNMZW5ndGggPSByZXF1aXJlKCcuLi9pbnRlcm5hbC9pc0xlbmd0aCcpLFxuICAgIGlzT2JqZWN0TGlrZSA9IHJlcXVpcmUoJy4uL2ludGVybmFsL2lzT2JqZWN0TGlrZScpO1xuXG4vKiogYE9iamVjdCN0b1N0cmluZ2AgcmVzdWx0IHJlZmVyZW5jZXMuICovXG52YXIgYXJyYXlUYWcgPSAnW29iamVjdCBBcnJheV0nO1xuXG4vKiogVXNlZCBmb3IgbmF0aXZlIG1ldGhvZCByZWZlcmVuY2VzLiAqL1xudmFyIG9iamVjdFByb3RvID0gT2JqZWN0LnByb3RvdHlwZTtcblxuLyoqXG4gKiBVc2VkIHRvIHJlc29sdmUgdGhlIFtgdG9TdHJpbmdUYWdgXShodHRwOi8vZWNtYS1pbnRlcm5hdGlvbmFsLm9yZy9lY21hLTI2Mi82LjAvI3NlYy1vYmplY3QucHJvdG90eXBlLnRvc3RyaW5nKVxuICogb2YgdmFsdWVzLlxuICovXG52YXIgb2JqVG9TdHJpbmcgPSBvYmplY3RQcm90by50b1N0cmluZztcblxuLyogTmF0aXZlIG1ldGhvZCByZWZlcmVuY2VzIGZvciB0aG9zZSB3aXRoIHRoZSBzYW1lIG5hbWUgYXMgb3RoZXIgYGxvZGFzaGAgbWV0aG9kcy4gKi9cbnZhciBuYXRpdmVJc0FycmF5ID0gZ2V0TmF0aXZlKEFycmF5LCAnaXNBcnJheScpO1xuXG4vKipcbiAqIENoZWNrcyBpZiBgdmFsdWVgIGlzIGNsYXNzaWZpZWQgYXMgYW4gYEFycmF5YCBvYmplY3QuXG4gKlxuICogQHN0YXRpY1xuICogQG1lbWJlck9mIF9cbiAqIEBjYXRlZ29yeSBMYW5nXG4gKiBAcGFyYW0geyp9IHZhbHVlIFRoZSB2YWx1ZSB0byBjaGVjay5cbiAqIEByZXR1cm5zIHtib29sZWFufSBSZXR1cm5zIGB0cnVlYCBpZiBgdmFsdWVgIGlzIGNvcnJlY3RseSBjbGFzc2lmaWVkLCBlbHNlIGBmYWxzZWAuXG4gKiBAZXhhbXBsZVxuICpcbiAqIF8uaXNBcnJheShbMSwgMiwgM10pO1xuICogLy8gPT4gdHJ1ZVxuICpcbiAqIF8uaXNBcnJheShmdW5jdGlvbigpIHsgcmV0dXJuIGFyZ3VtZW50czsgfSgpKTtcbiAqIC8vID0+IGZhbHNlXG4gKi9cbnZhciBpc0FycmF5ID0gbmF0aXZlSXNBcnJheSB8fCBmdW5jdGlvbih2YWx1ZSkge1xuICByZXR1cm4gaXNPYmplY3RMaWtlKHZhbHVlKSAmJiBpc0xlbmd0aCh2YWx1ZS5sZW5ndGgpICYmIG9ialRvU3RyaW5nLmNhbGwodmFsdWUpID09IGFycmF5VGFnO1xufTtcblxubW9kdWxlLmV4cG9ydHMgPSBpc0FycmF5O1xuIiwidmFyIGlzQXJndW1lbnRzID0gcmVxdWlyZSgnLi9pc0FyZ3VtZW50cycpLFxuICAgIGlzQXJyYXkgPSByZXF1aXJlKCcuL2lzQXJyYXknKSxcbiAgICBpc0FycmF5TGlrZSA9IHJlcXVpcmUoJy4uL2ludGVybmFsL2lzQXJyYXlMaWtlJyksXG4gICAgaXNGdW5jdGlvbiA9IHJlcXVpcmUoJy4vaXNGdW5jdGlvbicpLFxuICAgIGlzT2JqZWN0TGlrZSA9IHJlcXVpcmUoJy4uL2ludGVybmFsL2lzT2JqZWN0TGlrZScpLFxuICAgIGlzU3RyaW5nID0gcmVxdWlyZSgnLi9pc1N0cmluZycpLFxuICAgIGtleXMgPSByZXF1aXJlKCcuLi9vYmplY3Qva2V5cycpO1xuXG4vKipcbiAqIENoZWNrcyBpZiBgdmFsdWVgIGlzIGVtcHR5LiBBIHZhbHVlIGlzIGNvbnNpZGVyZWQgZW1wdHkgdW5sZXNzIGl0J3MgYW5cbiAqIGBhcmd1bWVudHNgIG9iamVjdCwgYXJyYXksIHN0cmluZywgb3IgalF1ZXJ5LWxpa2UgY29sbGVjdGlvbiB3aXRoIGEgbGVuZ3RoXG4gKiBncmVhdGVyIHRoYW4gYDBgIG9yIGFuIG9iamVjdCB3aXRoIG93biBlbnVtZXJhYmxlIHByb3BlcnRpZXMuXG4gKlxuICogQHN0YXRpY1xuICogQG1lbWJlck9mIF9cbiAqIEBjYXRlZ29yeSBMYW5nXG4gKiBAcGFyYW0ge0FycmF5fE9iamVjdHxzdHJpbmd9IHZhbHVlIFRoZSB2YWx1ZSB0byBpbnNwZWN0LlxuICogQHJldHVybnMge2Jvb2xlYW59IFJldHVybnMgYHRydWVgIGlmIGB2YWx1ZWAgaXMgZW1wdHksIGVsc2UgYGZhbHNlYC5cbiAqIEBleGFtcGxlXG4gKlxuICogXy5pc0VtcHR5KG51bGwpO1xuICogLy8gPT4gdHJ1ZVxuICpcbiAqIF8uaXNFbXB0eSh0cnVlKTtcbiAqIC8vID0+IHRydWVcbiAqXG4gKiBfLmlzRW1wdHkoMSk7XG4gKiAvLyA9PiB0cnVlXG4gKlxuICogXy5pc0VtcHR5KFsxLCAyLCAzXSk7XG4gKiAvLyA9PiBmYWxzZVxuICpcbiAqIF8uaXNFbXB0eSh7ICdhJzogMSB9KTtcbiAqIC8vID0+IGZhbHNlXG4gKi9cbmZ1bmN0aW9uIGlzRW1wdHkodmFsdWUpIHtcbiAgaWYgKHZhbHVlID09IG51bGwpIHtcbiAgICByZXR1cm4gdHJ1ZTtcbiAgfVxuICBpZiAoaXNBcnJheUxpa2UodmFsdWUpICYmIChpc0FycmF5KHZhbHVlKSB8fCBpc1N0cmluZyh2YWx1ZSkgfHwgaXNBcmd1bWVudHModmFsdWUpIHx8XG4gICAgICAoaXNPYmplY3RMaWtlKHZhbHVlKSAmJiBpc0Z1bmN0aW9uKHZhbHVlLnNwbGljZSkpKSkge1xuICAgIHJldHVybiAhdmFsdWUubGVuZ3RoO1xuICB9XG4gIHJldHVybiAha2V5cyh2YWx1ZSkubGVuZ3RoO1xufVxuXG5tb2R1bGUuZXhwb3J0cyA9IGlzRW1wdHk7XG4iLCJ2YXIgaXNPYmplY3QgPSByZXF1aXJlKCcuL2lzT2JqZWN0Jyk7XG5cbi8qKiBgT2JqZWN0I3RvU3RyaW5nYCByZXN1bHQgcmVmZXJlbmNlcy4gKi9cbnZhciBmdW5jVGFnID0gJ1tvYmplY3QgRnVuY3Rpb25dJztcblxuLyoqIFVzZWQgZm9yIG5hdGl2ZSBtZXRob2QgcmVmZXJlbmNlcy4gKi9cbnZhciBvYmplY3RQcm90byA9IE9iamVjdC5wcm90b3R5cGU7XG5cbi8qKlxuICogVXNlZCB0byByZXNvbHZlIHRoZSBbYHRvU3RyaW5nVGFnYF0oaHR0cDovL2VjbWEtaW50ZXJuYXRpb25hbC5vcmcvZWNtYS0yNjIvNi4wLyNzZWMtb2JqZWN0LnByb3RvdHlwZS50b3N0cmluZylcbiAqIG9mIHZhbHVlcy5cbiAqL1xudmFyIG9ialRvU3RyaW5nID0gb2JqZWN0UHJvdG8udG9TdHJpbmc7XG5cbi8qKlxuICogQ2hlY2tzIGlmIGB2YWx1ZWAgaXMgY2xhc3NpZmllZCBhcyBhIGBGdW5jdGlvbmAgb2JqZWN0LlxuICpcbiAqIEBzdGF0aWNcbiAqIEBtZW1iZXJPZiBfXG4gKiBAY2F0ZWdvcnkgTGFuZ1xuICogQHBhcmFtIHsqfSB2YWx1ZSBUaGUgdmFsdWUgdG8gY2hlY2suXG4gKiBAcmV0dXJucyB7Ym9vbGVhbn0gUmV0dXJucyBgdHJ1ZWAgaWYgYHZhbHVlYCBpcyBjb3JyZWN0bHkgY2xhc3NpZmllZCwgZWxzZSBgZmFsc2VgLlxuICogQGV4YW1wbGVcbiAqXG4gKiBfLmlzRnVuY3Rpb24oXyk7XG4gKiAvLyA9PiB0cnVlXG4gKlxuICogXy5pc0Z1bmN0aW9uKC9hYmMvKTtcbiAqIC8vID0+IGZhbHNlXG4gKi9cbmZ1bmN0aW9uIGlzRnVuY3Rpb24odmFsdWUpIHtcbiAgLy8gVGhlIHVzZSBvZiBgT2JqZWN0I3RvU3RyaW5nYCBhdm9pZHMgaXNzdWVzIHdpdGggdGhlIGB0eXBlb2ZgIG9wZXJhdG9yXG4gIC8vIGluIG9sZGVyIHZlcnNpb25zIG9mIENocm9tZSBhbmQgU2FmYXJpIHdoaWNoIHJldHVybiAnZnVuY3Rpb24nIGZvciByZWdleGVzXG4gIC8vIGFuZCBTYWZhcmkgOCB3aGljaCByZXR1cm5zICdvYmplY3QnIGZvciB0eXBlZCBhcnJheSBjb25zdHJ1Y3RvcnMuXG4gIHJldHVybiBpc09iamVjdCh2YWx1ZSkgJiYgb2JqVG9TdHJpbmcuY2FsbCh2YWx1ZSkgPT0gZnVuY1RhZztcbn1cblxubW9kdWxlLmV4cG9ydHMgPSBpc0Z1bmN0aW9uO1xuIiwidmFyIGlzRnVuY3Rpb24gPSByZXF1aXJlKCcuL2lzRnVuY3Rpb24nKSxcbiAgICBpc0hvc3RPYmplY3QgPSByZXF1aXJlKCcuLi9pbnRlcm5hbC9pc0hvc3RPYmplY3QnKSxcbiAgICBpc09iamVjdExpa2UgPSByZXF1aXJlKCcuLi9pbnRlcm5hbC9pc09iamVjdExpa2UnKTtcblxuLyoqIFVzZWQgdG8gZGV0ZWN0IGhvc3QgY29uc3RydWN0b3JzIChTYWZhcmkgPiA1KS4gKi9cbnZhciByZUlzSG9zdEN0b3IgPSAvXlxcW29iamVjdCAuKz9Db25zdHJ1Y3RvclxcXSQvO1xuXG4vKiogVXNlZCBmb3IgbmF0aXZlIG1ldGhvZCByZWZlcmVuY2VzLiAqL1xudmFyIG9iamVjdFByb3RvID0gT2JqZWN0LnByb3RvdHlwZTtcblxuLyoqIFVzZWQgdG8gcmVzb2x2ZSB0aGUgZGVjb21waWxlZCBzb3VyY2Ugb2YgZnVuY3Rpb25zLiAqL1xudmFyIGZuVG9TdHJpbmcgPSBGdW5jdGlvbi5wcm90b3R5cGUudG9TdHJpbmc7XG5cbi8qKiBVc2VkIHRvIGNoZWNrIG9iamVjdHMgZm9yIG93biBwcm9wZXJ0aWVzLiAqL1xudmFyIGhhc093blByb3BlcnR5ID0gb2JqZWN0UHJvdG8uaGFzT3duUHJvcGVydHk7XG5cbi8qKiBVc2VkIHRvIGRldGVjdCBpZiBhIG1ldGhvZCBpcyBuYXRpdmUuICovXG52YXIgcmVJc05hdGl2ZSA9IFJlZ0V4cCgnXicgK1xuICBmblRvU3RyaW5nLmNhbGwoaGFzT3duUHJvcGVydHkpLnJlcGxhY2UoL1tcXFxcXiQuKis/KClbXFxde318XS9nLCAnXFxcXCQmJylcbiAgLnJlcGxhY2UoL2hhc093blByb3BlcnR5fChmdW5jdGlvbikuKj8oPz1cXFxcXFwoKXwgZm9yIC4rPyg/PVxcXFxcXF0pL2csICckMS4qPycpICsgJyQnXG4pO1xuXG4vKipcbiAqIENoZWNrcyBpZiBgdmFsdWVgIGlzIGEgbmF0aXZlIGZ1bmN0aW9uLlxuICpcbiAqIEBzdGF0aWNcbiAqIEBtZW1iZXJPZiBfXG4gKiBAY2F0ZWdvcnkgTGFuZ1xuICogQHBhcmFtIHsqfSB2YWx1ZSBUaGUgdmFsdWUgdG8gY2hlY2suXG4gKiBAcmV0dXJucyB7Ym9vbGVhbn0gUmV0dXJucyBgdHJ1ZWAgaWYgYHZhbHVlYCBpcyBhIG5hdGl2ZSBmdW5jdGlvbiwgZWxzZSBgZmFsc2VgLlxuICogQGV4YW1wbGVcbiAqXG4gKiBfLmlzTmF0aXZlKEFycmF5LnByb3RvdHlwZS5wdXNoKTtcbiAqIC8vID0+IHRydWVcbiAqXG4gKiBfLmlzTmF0aXZlKF8pO1xuICogLy8gPT4gZmFsc2VcbiAqL1xuZnVuY3Rpb24gaXNOYXRpdmUodmFsdWUpIHtcbiAgaWYgKHZhbHVlID09IG51bGwpIHtcbiAgICByZXR1cm4gZmFsc2U7XG4gIH1cbiAgaWYgKGlzRnVuY3Rpb24odmFsdWUpKSB7XG4gICAgcmV0dXJuIHJlSXNOYXRpdmUudGVzdChmblRvU3RyaW5nLmNhbGwodmFsdWUpKTtcbiAgfVxuICByZXR1cm4gaXNPYmplY3RMaWtlKHZhbHVlKSAmJiAoaXNIb3N0T2JqZWN0KHZhbHVlKSA/IHJlSXNOYXRpdmUgOiByZUlzSG9zdEN0b3IpLnRlc3QodmFsdWUpO1xufVxuXG5tb2R1bGUuZXhwb3J0cyA9IGlzTmF0aXZlO1xuIiwiLyoqXG4gKiBDaGVja3MgaWYgYHZhbHVlYCBpcyB0aGUgW2xhbmd1YWdlIHR5cGVdKGh0dHBzOi8vZXM1LmdpdGh1Yi5pby8jeDgpIG9mIGBPYmplY3RgLlxuICogKGUuZy4gYXJyYXlzLCBmdW5jdGlvbnMsIG9iamVjdHMsIHJlZ2V4ZXMsIGBuZXcgTnVtYmVyKDApYCwgYW5kIGBuZXcgU3RyaW5nKCcnKWApXG4gKlxuICogQHN0YXRpY1xuICogQG1lbWJlck9mIF9cbiAqIEBjYXRlZ29yeSBMYW5nXG4gKiBAcGFyYW0geyp9IHZhbHVlIFRoZSB2YWx1ZSB0byBjaGVjay5cbiAqIEByZXR1cm5zIHtib29sZWFufSBSZXR1cm5zIGB0cnVlYCBpZiBgdmFsdWVgIGlzIGFuIG9iamVjdCwgZWxzZSBgZmFsc2VgLlxuICogQGV4YW1wbGVcbiAqXG4gKiBfLmlzT2JqZWN0KHt9KTtcbiAqIC8vID0+IHRydWVcbiAqXG4gKiBfLmlzT2JqZWN0KFsxLCAyLCAzXSk7XG4gKiAvLyA9PiB0cnVlXG4gKlxuICogXy5pc09iamVjdCgxKTtcbiAqIC8vID0+IGZhbHNlXG4gKi9cbmZ1bmN0aW9uIGlzT2JqZWN0KHZhbHVlKSB7XG4gIC8vIEF2b2lkIGEgVjggSklUIGJ1ZyBpbiBDaHJvbWUgMTktMjAuXG4gIC8vIFNlZSBodHRwczovL2NvZGUuZ29vZ2xlLmNvbS9wL3Y4L2lzc3Vlcy9kZXRhaWw/aWQ9MjI5MSBmb3IgbW9yZSBkZXRhaWxzLlxuICB2YXIgdHlwZSA9IHR5cGVvZiB2YWx1ZTtcbiAgcmV0dXJuICEhdmFsdWUgJiYgKHR5cGUgPT0gJ29iamVjdCcgfHwgdHlwZSA9PSAnZnVuY3Rpb24nKTtcbn1cblxubW9kdWxlLmV4cG9ydHMgPSBpc09iamVjdDtcbiIsInZhciBiYXNlRm9ySW4gPSByZXF1aXJlKCcuLi9pbnRlcm5hbC9iYXNlRm9ySW4nKSxcbiAgICBpc0FyZ3VtZW50cyA9IHJlcXVpcmUoJy4vaXNBcmd1bWVudHMnKSxcbiAgICBpc0hvc3RPYmplY3QgPSByZXF1aXJlKCcuLi9pbnRlcm5hbC9pc0hvc3RPYmplY3QnKSxcbiAgICBpc09iamVjdExpa2UgPSByZXF1aXJlKCcuLi9pbnRlcm5hbC9pc09iamVjdExpa2UnKSxcbiAgICBzdXBwb3J0ID0gcmVxdWlyZSgnLi4vc3VwcG9ydCcpO1xuXG4vKiogYE9iamVjdCN0b1N0cmluZ2AgcmVzdWx0IHJlZmVyZW5jZXMuICovXG52YXIgb2JqZWN0VGFnID0gJ1tvYmplY3QgT2JqZWN0XSc7XG5cbi8qKiBVc2VkIGZvciBuYXRpdmUgbWV0aG9kIHJlZmVyZW5jZXMuICovXG52YXIgb2JqZWN0UHJvdG8gPSBPYmplY3QucHJvdG90eXBlO1xuXG4vKiogVXNlZCB0byBjaGVjayBvYmplY3RzIGZvciBvd24gcHJvcGVydGllcy4gKi9cbnZhciBoYXNPd25Qcm9wZXJ0eSA9IG9iamVjdFByb3RvLmhhc093blByb3BlcnR5O1xuXG4vKipcbiAqIFVzZWQgdG8gcmVzb2x2ZSB0aGUgW2B0b1N0cmluZ1RhZ2BdKGh0dHA6Ly9lY21hLWludGVybmF0aW9uYWwub3JnL2VjbWEtMjYyLzYuMC8jc2VjLW9iamVjdC5wcm90b3R5cGUudG9zdHJpbmcpXG4gKiBvZiB2YWx1ZXMuXG4gKi9cbnZhciBvYmpUb1N0cmluZyA9IG9iamVjdFByb3RvLnRvU3RyaW5nO1xuXG4vKipcbiAqIENoZWNrcyBpZiBgdmFsdWVgIGlzIGEgcGxhaW4gb2JqZWN0LCB0aGF0IGlzLCBhbiBvYmplY3QgY3JlYXRlZCBieSB0aGVcbiAqIGBPYmplY3RgIGNvbnN0cnVjdG9yIG9yIG9uZSB3aXRoIGEgYFtbUHJvdG90eXBlXV1gIG9mIGBudWxsYC5cbiAqXG4gKiAqKk5vdGU6KiogVGhpcyBtZXRob2QgYXNzdW1lcyBvYmplY3RzIGNyZWF0ZWQgYnkgdGhlIGBPYmplY3RgIGNvbnN0cnVjdG9yXG4gKiBoYXZlIG5vIGluaGVyaXRlZCBlbnVtZXJhYmxlIHByb3BlcnRpZXMuXG4gKlxuICogQHN0YXRpY1xuICogQG1lbWJlck9mIF9cbiAqIEBjYXRlZ29yeSBMYW5nXG4gKiBAcGFyYW0geyp9IHZhbHVlIFRoZSB2YWx1ZSB0byBjaGVjay5cbiAqIEByZXR1cm5zIHtib29sZWFufSBSZXR1cm5zIGB0cnVlYCBpZiBgdmFsdWVgIGlzIGEgcGxhaW4gb2JqZWN0LCBlbHNlIGBmYWxzZWAuXG4gKiBAZXhhbXBsZVxuICpcbiAqIGZ1bmN0aW9uIEZvbygpIHtcbiAqICAgdGhpcy5hID0gMTtcbiAqIH1cbiAqXG4gKiBfLmlzUGxhaW5PYmplY3QobmV3IEZvbyk7XG4gKiAvLyA9PiBmYWxzZVxuICpcbiAqIF8uaXNQbGFpbk9iamVjdChbMSwgMiwgM10pO1xuICogLy8gPT4gZmFsc2VcbiAqXG4gKiBfLmlzUGxhaW5PYmplY3QoeyAneCc6IDAsICd5JzogMCB9KTtcbiAqIC8vID0+IHRydWVcbiAqXG4gKiBfLmlzUGxhaW5PYmplY3QoT2JqZWN0LmNyZWF0ZShudWxsKSk7XG4gKiAvLyA9PiB0cnVlXG4gKi9cbmZ1bmN0aW9uIGlzUGxhaW5PYmplY3QodmFsdWUpIHtcbiAgdmFyIEN0b3I7XG5cbiAgLy8gRXhpdCBlYXJseSBmb3Igbm9uIGBPYmplY3RgIG9iamVjdHMuXG4gIGlmICghKGlzT2JqZWN0TGlrZSh2YWx1ZSkgJiYgb2JqVG9TdHJpbmcuY2FsbCh2YWx1ZSkgPT0gb2JqZWN0VGFnICYmICFpc0hvc3RPYmplY3QodmFsdWUpICYmICFpc0FyZ3VtZW50cyh2YWx1ZSkpIHx8XG4gICAgICAoIWhhc093blByb3BlcnR5LmNhbGwodmFsdWUsICdjb25zdHJ1Y3RvcicpICYmIChDdG9yID0gdmFsdWUuY29uc3RydWN0b3IsIHR5cGVvZiBDdG9yID09ICdmdW5jdGlvbicgJiYgIShDdG9yIGluc3RhbmNlb2YgQ3RvcikpKSkge1xuICAgIHJldHVybiBmYWxzZTtcbiAgfVxuICAvLyBJRSA8IDkgaXRlcmF0ZXMgaW5oZXJpdGVkIHByb3BlcnRpZXMgYmVmb3JlIG93biBwcm9wZXJ0aWVzLiBJZiB0aGUgZmlyc3RcbiAgLy8gaXRlcmF0ZWQgcHJvcGVydHkgaXMgYW4gb2JqZWN0J3Mgb3duIHByb3BlcnR5IHRoZW4gdGhlcmUgYXJlIG5vIGluaGVyaXRlZFxuICAvLyBlbnVtZXJhYmxlIHByb3BlcnRpZXMuXG4gIHZhciByZXN1bHQ7XG4gIGlmIChzdXBwb3J0Lm93bkxhc3QpIHtcbiAgICBiYXNlRm9ySW4odmFsdWUsIGZ1bmN0aW9uKHN1YlZhbHVlLCBrZXksIG9iamVjdCkge1xuICAgICAgcmVzdWx0ID0gaGFzT3duUHJvcGVydHkuY2FsbChvYmplY3QsIGtleSk7XG4gICAgICByZXR1cm4gZmFsc2U7XG4gICAgfSk7XG4gICAgcmV0dXJuIHJlc3VsdCAhPT0gZmFsc2U7XG4gIH1cbiAgLy8gSW4gbW9zdCBlbnZpcm9ubWVudHMgYW4gb2JqZWN0J3Mgb3duIHByb3BlcnRpZXMgYXJlIGl0ZXJhdGVkIGJlZm9yZVxuICAvLyBpdHMgaW5oZXJpdGVkIHByb3BlcnRpZXMuIElmIHRoZSBsYXN0IGl0ZXJhdGVkIHByb3BlcnR5IGlzIGFuIG9iamVjdCdzXG4gIC8vIG93biBwcm9wZXJ0eSB0aGVuIHRoZXJlIGFyZSBubyBpbmhlcml0ZWQgZW51bWVyYWJsZSBwcm9wZXJ0aWVzLlxuICBiYXNlRm9ySW4odmFsdWUsIGZ1bmN0aW9uKHN1YlZhbHVlLCBrZXkpIHtcbiAgICByZXN1bHQgPSBrZXk7XG4gIH0pO1xuICByZXR1cm4gcmVzdWx0ID09PSB1bmRlZmluZWQgfHwgaGFzT3duUHJvcGVydHkuY2FsbCh2YWx1ZSwgcmVzdWx0KTtcbn1cblxubW9kdWxlLmV4cG9ydHMgPSBpc1BsYWluT2JqZWN0O1xuIiwidmFyIGlzT2JqZWN0TGlrZSA9IHJlcXVpcmUoJy4uL2ludGVybmFsL2lzT2JqZWN0TGlrZScpO1xuXG4vKiogYE9iamVjdCN0b1N0cmluZ2AgcmVzdWx0IHJlZmVyZW5jZXMuICovXG52YXIgc3RyaW5nVGFnID0gJ1tvYmplY3QgU3RyaW5nXSc7XG5cbi8qKiBVc2VkIGZvciBuYXRpdmUgbWV0aG9kIHJlZmVyZW5jZXMuICovXG52YXIgb2JqZWN0UHJvdG8gPSBPYmplY3QucHJvdG90eXBlO1xuXG4vKipcbiAqIFVzZWQgdG8gcmVzb2x2ZSB0aGUgW2B0b1N0cmluZ1RhZ2BdKGh0dHA6Ly9lY21hLWludGVybmF0aW9uYWwub3JnL2VjbWEtMjYyLzYuMC8jc2VjLW9iamVjdC5wcm90b3R5cGUudG9zdHJpbmcpXG4gKiBvZiB2YWx1ZXMuXG4gKi9cbnZhciBvYmpUb1N0cmluZyA9IG9iamVjdFByb3RvLnRvU3RyaW5nO1xuXG4vKipcbiAqIENoZWNrcyBpZiBgdmFsdWVgIGlzIGNsYXNzaWZpZWQgYXMgYSBgU3RyaW5nYCBwcmltaXRpdmUgb3Igb2JqZWN0LlxuICpcbiAqIEBzdGF0aWNcbiAqIEBtZW1iZXJPZiBfXG4gKiBAY2F0ZWdvcnkgTGFuZ1xuICogQHBhcmFtIHsqfSB2YWx1ZSBUaGUgdmFsdWUgdG8gY2hlY2suXG4gKiBAcmV0dXJucyB7Ym9vbGVhbn0gUmV0dXJucyBgdHJ1ZWAgaWYgYHZhbHVlYCBpcyBjb3JyZWN0bHkgY2xhc3NpZmllZCwgZWxzZSBgZmFsc2VgLlxuICogQGV4YW1wbGVcbiAqXG4gKiBfLmlzU3RyaW5nKCdhYmMnKTtcbiAqIC8vID0+IHRydWVcbiAqXG4gKiBfLmlzU3RyaW5nKDEpO1xuICogLy8gPT4gZmFsc2VcbiAqL1xuZnVuY3Rpb24gaXNTdHJpbmcodmFsdWUpIHtcbiAgcmV0dXJuIHR5cGVvZiB2YWx1ZSA9PSAnc3RyaW5nJyB8fCAoaXNPYmplY3RMaWtlKHZhbHVlKSAmJiBvYmpUb1N0cmluZy5jYWxsKHZhbHVlKSA9PSBzdHJpbmdUYWcpO1xufVxuXG5tb2R1bGUuZXhwb3J0cyA9IGlzU3RyaW5nO1xuIiwidmFyIGlzTGVuZ3RoID0gcmVxdWlyZSgnLi4vaW50ZXJuYWwvaXNMZW5ndGgnKSxcbiAgICBpc09iamVjdExpa2UgPSByZXF1aXJlKCcuLi9pbnRlcm5hbC9pc09iamVjdExpa2UnKTtcblxuLyoqIGBPYmplY3QjdG9TdHJpbmdgIHJlc3VsdCByZWZlcmVuY2VzLiAqL1xudmFyIGFyZ3NUYWcgPSAnW29iamVjdCBBcmd1bWVudHNdJyxcbiAgICBhcnJheVRhZyA9ICdbb2JqZWN0IEFycmF5XScsXG4gICAgYm9vbFRhZyA9ICdbb2JqZWN0IEJvb2xlYW5dJyxcbiAgICBkYXRlVGFnID0gJ1tvYmplY3QgRGF0ZV0nLFxuICAgIGVycm9yVGFnID0gJ1tvYmplY3QgRXJyb3JdJyxcbiAgICBmdW5jVGFnID0gJ1tvYmplY3QgRnVuY3Rpb25dJyxcbiAgICBtYXBUYWcgPSAnW29iamVjdCBNYXBdJyxcbiAgICBudW1iZXJUYWcgPSAnW29iamVjdCBOdW1iZXJdJyxcbiAgICBvYmplY3RUYWcgPSAnW29iamVjdCBPYmplY3RdJyxcbiAgICByZWdleHBUYWcgPSAnW29iamVjdCBSZWdFeHBdJyxcbiAgICBzZXRUYWcgPSAnW29iamVjdCBTZXRdJyxcbiAgICBzdHJpbmdUYWcgPSAnW29iamVjdCBTdHJpbmddJyxcbiAgICB3ZWFrTWFwVGFnID0gJ1tvYmplY3QgV2Vha01hcF0nO1xuXG52YXIgYXJyYXlCdWZmZXJUYWcgPSAnW29iamVjdCBBcnJheUJ1ZmZlcl0nLFxuICAgIGZsb2F0MzJUYWcgPSAnW29iamVjdCBGbG9hdDMyQXJyYXldJyxcbiAgICBmbG9hdDY0VGFnID0gJ1tvYmplY3QgRmxvYXQ2NEFycmF5XScsXG4gICAgaW50OFRhZyA9ICdbb2JqZWN0IEludDhBcnJheV0nLFxuICAgIGludDE2VGFnID0gJ1tvYmplY3QgSW50MTZBcnJheV0nLFxuICAgIGludDMyVGFnID0gJ1tvYmplY3QgSW50MzJBcnJheV0nLFxuICAgIHVpbnQ4VGFnID0gJ1tvYmplY3QgVWludDhBcnJheV0nLFxuICAgIHVpbnQ4Q2xhbXBlZFRhZyA9ICdbb2JqZWN0IFVpbnQ4Q2xhbXBlZEFycmF5XScsXG4gICAgdWludDE2VGFnID0gJ1tvYmplY3QgVWludDE2QXJyYXldJyxcbiAgICB1aW50MzJUYWcgPSAnW29iamVjdCBVaW50MzJBcnJheV0nO1xuXG4vKiogVXNlZCB0byBpZGVudGlmeSBgdG9TdHJpbmdUYWdgIHZhbHVlcyBvZiB0eXBlZCBhcnJheXMuICovXG52YXIgdHlwZWRBcnJheVRhZ3MgPSB7fTtcbnR5cGVkQXJyYXlUYWdzW2Zsb2F0MzJUYWddID0gdHlwZWRBcnJheVRhZ3NbZmxvYXQ2NFRhZ10gPVxudHlwZWRBcnJheVRhZ3NbaW50OFRhZ10gPSB0eXBlZEFycmF5VGFnc1tpbnQxNlRhZ10gPVxudHlwZWRBcnJheVRhZ3NbaW50MzJUYWddID0gdHlwZWRBcnJheVRhZ3NbdWludDhUYWddID1cbnR5cGVkQXJyYXlUYWdzW3VpbnQ4Q2xhbXBlZFRhZ10gPSB0eXBlZEFycmF5VGFnc1t1aW50MTZUYWddID1cbnR5cGVkQXJyYXlUYWdzW3VpbnQzMlRhZ10gPSB0cnVlO1xudHlwZWRBcnJheVRhZ3NbYXJnc1RhZ10gPSB0eXBlZEFycmF5VGFnc1thcnJheVRhZ10gPVxudHlwZWRBcnJheVRhZ3NbYXJyYXlCdWZmZXJUYWddID0gdHlwZWRBcnJheVRhZ3NbYm9vbFRhZ10gPVxudHlwZWRBcnJheVRhZ3NbZGF0ZVRhZ10gPSB0eXBlZEFycmF5VGFnc1tlcnJvclRhZ10gPVxudHlwZWRBcnJheVRhZ3NbZnVuY1RhZ10gPSB0eXBlZEFycmF5VGFnc1ttYXBUYWddID1cbnR5cGVkQXJyYXlUYWdzW251bWJlclRhZ10gPSB0eXBlZEFycmF5VGFnc1tvYmplY3RUYWddID1cbnR5cGVkQXJyYXlUYWdzW3JlZ2V4cFRhZ10gPSB0eXBlZEFycmF5VGFnc1tzZXRUYWddID1cbnR5cGVkQXJyYXlUYWdzW3N0cmluZ1RhZ10gPSB0eXBlZEFycmF5VGFnc1t3ZWFrTWFwVGFnXSA9IGZhbHNlO1xuXG4vKiogVXNlZCBmb3IgbmF0aXZlIG1ldGhvZCByZWZlcmVuY2VzLiAqL1xudmFyIG9iamVjdFByb3RvID0gT2JqZWN0LnByb3RvdHlwZTtcblxuLyoqXG4gKiBVc2VkIHRvIHJlc29sdmUgdGhlIFtgdG9TdHJpbmdUYWdgXShodHRwOi8vZWNtYS1pbnRlcm5hdGlvbmFsLm9yZy9lY21hLTI2Mi82LjAvI3NlYy1vYmplY3QucHJvdG90eXBlLnRvc3RyaW5nKVxuICogb2YgdmFsdWVzLlxuICovXG52YXIgb2JqVG9TdHJpbmcgPSBvYmplY3RQcm90by50b1N0cmluZztcblxuLyoqXG4gKiBDaGVja3MgaWYgYHZhbHVlYCBpcyBjbGFzc2lmaWVkIGFzIGEgdHlwZWQgYXJyYXkuXG4gKlxuICogQHN0YXRpY1xuICogQG1lbWJlck9mIF9cbiAqIEBjYXRlZ29yeSBMYW5nXG4gKiBAcGFyYW0geyp9IHZhbHVlIFRoZSB2YWx1ZSB0byBjaGVjay5cbiAqIEByZXR1cm5zIHtib29sZWFufSBSZXR1cm5zIGB0cnVlYCBpZiBgdmFsdWVgIGlzIGNvcnJlY3RseSBjbGFzc2lmaWVkLCBlbHNlIGBmYWxzZWAuXG4gKiBAZXhhbXBsZVxuICpcbiAqIF8uaXNUeXBlZEFycmF5KG5ldyBVaW50OEFycmF5KTtcbiAqIC8vID0+IHRydWVcbiAqXG4gKiBfLmlzVHlwZWRBcnJheShbXSk7XG4gKiAvLyA9PiBmYWxzZVxuICovXG5mdW5jdGlvbiBpc1R5cGVkQXJyYXkodmFsdWUpIHtcbiAgcmV0dXJuIGlzT2JqZWN0TGlrZSh2YWx1ZSkgJiYgaXNMZW5ndGgodmFsdWUubGVuZ3RoKSAmJiAhIXR5cGVkQXJyYXlUYWdzW29ialRvU3RyaW5nLmNhbGwodmFsdWUpXTtcbn1cblxubW9kdWxlLmV4cG9ydHMgPSBpc1R5cGVkQXJyYXk7XG4iLCIvKipcbiAqIENoZWNrcyBpZiBgdmFsdWVgIGlzIGB1bmRlZmluZWRgLlxuICpcbiAqIEBzdGF0aWNcbiAqIEBtZW1iZXJPZiBfXG4gKiBAY2F0ZWdvcnkgTGFuZ1xuICogQHBhcmFtIHsqfSB2YWx1ZSBUaGUgdmFsdWUgdG8gY2hlY2suXG4gKiBAcmV0dXJucyB7Ym9vbGVhbn0gUmV0dXJucyBgdHJ1ZWAgaWYgYHZhbHVlYCBpcyBgdW5kZWZpbmVkYCwgZWxzZSBgZmFsc2VgLlxuICogQGV4YW1wbGVcbiAqXG4gKiBfLmlzVW5kZWZpbmVkKHZvaWQgMCk7XG4gKiAvLyA9PiB0cnVlXG4gKlxuICogXy5pc1VuZGVmaW5lZChudWxsKTtcbiAqIC8vID0+IGZhbHNlXG4gKi9cbmZ1bmN0aW9uIGlzVW5kZWZpbmVkKHZhbHVlKSB7XG4gIHJldHVybiB2YWx1ZSA9PT0gdW5kZWZpbmVkO1xufVxuXG5tb2R1bGUuZXhwb3J0cyA9IGlzVW5kZWZpbmVkO1xuIiwidmFyIGdldE5hdGl2ZSA9IHJlcXVpcmUoJy4uL2ludGVybmFsL2dldE5hdGl2ZScpLFxuICAgIGlzQXJyYXlMaWtlID0gcmVxdWlyZSgnLi4vaW50ZXJuYWwvaXNBcnJheUxpa2UnKSxcbiAgICBpc09iamVjdCA9IHJlcXVpcmUoJy4uL2xhbmcvaXNPYmplY3QnKSxcbiAgICBzaGltS2V5cyA9IHJlcXVpcmUoJy4uL2ludGVybmFsL3NoaW1LZXlzJyksXG4gICAgc3VwcG9ydCA9IHJlcXVpcmUoJy4uL3N1cHBvcnQnKTtcblxuLyogTmF0aXZlIG1ldGhvZCByZWZlcmVuY2VzIGZvciB0aG9zZSB3aXRoIHRoZSBzYW1lIG5hbWUgYXMgb3RoZXIgYGxvZGFzaGAgbWV0aG9kcy4gKi9cbnZhciBuYXRpdmVLZXlzID0gZ2V0TmF0aXZlKE9iamVjdCwgJ2tleXMnKTtcblxuLyoqXG4gKiBDcmVhdGVzIGFuIGFycmF5IG9mIHRoZSBvd24gZW51bWVyYWJsZSBwcm9wZXJ0eSBuYW1lcyBvZiBgb2JqZWN0YC5cbiAqXG4gKiAqKk5vdGU6KiogTm9uLW9iamVjdCB2YWx1ZXMgYXJlIGNvZXJjZWQgdG8gb2JqZWN0cy4gU2VlIHRoZVxuICogW0VTIHNwZWNdKGh0dHA6Ly9lY21hLWludGVybmF0aW9uYWwub3JnL2VjbWEtMjYyLzYuMC8jc2VjLW9iamVjdC5rZXlzKVxuICogZm9yIG1vcmUgZGV0YWlscy5cbiAqXG4gKiBAc3RhdGljXG4gKiBAbWVtYmVyT2YgX1xuICogQGNhdGVnb3J5IE9iamVjdFxuICogQHBhcmFtIHtPYmplY3R9IG9iamVjdCBUaGUgb2JqZWN0IHRvIHF1ZXJ5LlxuICogQHJldHVybnMge0FycmF5fSBSZXR1cm5zIHRoZSBhcnJheSBvZiBwcm9wZXJ0eSBuYW1lcy5cbiAqIEBleGFtcGxlXG4gKlxuICogZnVuY3Rpb24gRm9vKCkge1xuICogICB0aGlzLmEgPSAxO1xuICogICB0aGlzLmIgPSAyO1xuICogfVxuICpcbiAqIEZvby5wcm90b3R5cGUuYyA9IDM7XG4gKlxuICogXy5rZXlzKG5ldyBGb28pO1xuICogLy8gPT4gWydhJywgJ2InXSAoaXRlcmF0aW9uIG9yZGVyIGlzIG5vdCBndWFyYW50ZWVkKVxuICpcbiAqIF8ua2V5cygnaGknKTtcbiAqIC8vID0+IFsnMCcsICcxJ11cbiAqL1xudmFyIGtleXMgPSAhbmF0aXZlS2V5cyA/IHNoaW1LZXlzIDogZnVuY3Rpb24ob2JqZWN0KSB7XG4gIHZhciBDdG9yID0gb2JqZWN0ID09IG51bGwgPyB1bmRlZmluZWQgOiBvYmplY3QuY29uc3RydWN0b3I7XG4gIGlmICgodHlwZW9mIEN0b3IgPT0gJ2Z1bmN0aW9uJyAmJiBDdG9yLnByb3RvdHlwZSA9PT0gb2JqZWN0KSB8fFxuICAgICAgKHR5cGVvZiBvYmplY3QgPT0gJ2Z1bmN0aW9uJyA/IHN1cHBvcnQuZW51bVByb3RvdHlwZXMgOiBpc0FycmF5TGlrZShvYmplY3QpKSkge1xuICAgIHJldHVybiBzaGltS2V5cyhvYmplY3QpO1xuICB9XG4gIHJldHVybiBpc09iamVjdChvYmplY3QpID8gbmF0aXZlS2V5cyhvYmplY3QpIDogW107XG59O1xuXG5tb2R1bGUuZXhwb3J0cyA9IGtleXM7XG4iLCJ2YXIgYXJyYXlFYWNoID0gcmVxdWlyZSgnLi4vaW50ZXJuYWwvYXJyYXlFYWNoJyksXG4gICAgaXNBcmd1bWVudHMgPSByZXF1aXJlKCcuLi9sYW5nL2lzQXJndW1lbnRzJyksXG4gICAgaXNBcnJheSA9IHJlcXVpcmUoJy4uL2xhbmcvaXNBcnJheScpLFxuICAgIGlzRnVuY3Rpb24gPSByZXF1aXJlKCcuLi9sYW5nL2lzRnVuY3Rpb24nKSxcbiAgICBpc0luZGV4ID0gcmVxdWlyZSgnLi4vaW50ZXJuYWwvaXNJbmRleCcpLFxuICAgIGlzTGVuZ3RoID0gcmVxdWlyZSgnLi4vaW50ZXJuYWwvaXNMZW5ndGgnKSxcbiAgICBpc09iamVjdCA9IHJlcXVpcmUoJy4uL2xhbmcvaXNPYmplY3QnKSxcbiAgICBpc1N0cmluZyA9IHJlcXVpcmUoJy4uL2xhbmcvaXNTdHJpbmcnKSxcbiAgICBzdXBwb3J0ID0gcmVxdWlyZSgnLi4vc3VwcG9ydCcpO1xuXG4vKiogYE9iamVjdCN0b1N0cmluZ2AgcmVzdWx0IHJlZmVyZW5jZXMuICovXG52YXIgYXJyYXlUYWcgPSAnW29iamVjdCBBcnJheV0nLFxuICAgIGJvb2xUYWcgPSAnW29iamVjdCBCb29sZWFuXScsXG4gICAgZGF0ZVRhZyA9ICdbb2JqZWN0IERhdGVdJyxcbiAgICBlcnJvclRhZyA9ICdbb2JqZWN0IEVycm9yXScsXG4gICAgZnVuY1RhZyA9ICdbb2JqZWN0IEZ1bmN0aW9uXScsXG4gICAgbnVtYmVyVGFnID0gJ1tvYmplY3QgTnVtYmVyXScsXG4gICAgb2JqZWN0VGFnID0gJ1tvYmplY3QgT2JqZWN0XScsXG4gICAgcmVnZXhwVGFnID0gJ1tvYmplY3QgUmVnRXhwXScsXG4gICAgc3RyaW5nVGFnID0gJ1tvYmplY3QgU3RyaW5nXSc7XG5cbi8qKiBVc2VkIHRvIGZpeCB0aGUgSlNjcmlwdCBgW1tEb250RW51bV1dYCBidWcuICovXG52YXIgc2hhZG93UHJvcHMgPSBbXG4gICdjb25zdHJ1Y3RvcicsICdoYXNPd25Qcm9wZXJ0eScsICdpc1Byb3RvdHlwZU9mJywgJ3Byb3BlcnR5SXNFbnVtZXJhYmxlJyxcbiAgJ3RvTG9jYWxlU3RyaW5nJywgJ3RvU3RyaW5nJywgJ3ZhbHVlT2YnXG5dO1xuXG4vKiogVXNlZCBmb3IgbmF0aXZlIG1ldGhvZCByZWZlcmVuY2VzLiAqL1xudmFyIGVycm9yUHJvdG8gPSBFcnJvci5wcm90b3R5cGUsXG4gICAgb2JqZWN0UHJvdG8gPSBPYmplY3QucHJvdG90eXBlLFxuICAgIHN0cmluZ1Byb3RvID0gU3RyaW5nLnByb3RvdHlwZTtcblxuLyoqIFVzZWQgdG8gY2hlY2sgb2JqZWN0cyBmb3Igb3duIHByb3BlcnRpZXMuICovXG52YXIgaGFzT3duUHJvcGVydHkgPSBvYmplY3RQcm90by5oYXNPd25Qcm9wZXJ0eTtcblxuLyoqXG4gKiBVc2VkIHRvIHJlc29sdmUgdGhlIFtgdG9TdHJpbmdUYWdgXShodHRwOi8vZWNtYS1pbnRlcm5hdGlvbmFsLm9yZy9lY21hLTI2Mi82LjAvI3NlYy1vYmplY3QucHJvdG90eXBlLnRvc3RyaW5nKVxuICogb2YgdmFsdWVzLlxuICovXG52YXIgb2JqVG9TdHJpbmcgPSBvYmplY3RQcm90by50b1N0cmluZztcblxuLyoqIFVzZWQgdG8gYXZvaWQgaXRlcmF0aW5nIG92ZXIgbm9uLWVudW1lcmFibGUgcHJvcGVydGllcyBpbiBJRSA8IDkuICovXG52YXIgbm9uRW51bVByb3BzID0ge307XG5ub25FbnVtUHJvcHNbYXJyYXlUYWddID0gbm9uRW51bVByb3BzW2RhdGVUYWddID0gbm9uRW51bVByb3BzW251bWJlclRhZ10gPSB7ICdjb25zdHJ1Y3Rvcic6IHRydWUsICd0b0xvY2FsZVN0cmluZyc6IHRydWUsICd0b1N0cmluZyc6IHRydWUsICd2YWx1ZU9mJzogdHJ1ZSB9O1xubm9uRW51bVByb3BzW2Jvb2xUYWddID0gbm9uRW51bVByb3BzW3N0cmluZ1RhZ10gPSB7ICdjb25zdHJ1Y3Rvcic6IHRydWUsICd0b1N0cmluZyc6IHRydWUsICd2YWx1ZU9mJzogdHJ1ZSB9O1xubm9uRW51bVByb3BzW2Vycm9yVGFnXSA9IG5vbkVudW1Qcm9wc1tmdW5jVGFnXSA9IG5vbkVudW1Qcm9wc1tyZWdleHBUYWddID0geyAnY29uc3RydWN0b3InOiB0cnVlLCAndG9TdHJpbmcnOiB0cnVlIH07XG5ub25FbnVtUHJvcHNbb2JqZWN0VGFnXSA9IHsgJ2NvbnN0cnVjdG9yJzogdHJ1ZSB9O1xuXG5hcnJheUVhY2goc2hhZG93UHJvcHMsIGZ1bmN0aW9uKGtleSkge1xuICBmb3IgKHZhciB0YWcgaW4gbm9uRW51bVByb3BzKSB7XG4gICAgaWYgKGhhc093blByb3BlcnR5LmNhbGwobm9uRW51bVByb3BzLCB0YWcpKSB7XG4gICAgICB2YXIgcHJvcHMgPSBub25FbnVtUHJvcHNbdGFnXTtcbiAgICAgIHByb3BzW2tleV0gPSBoYXNPd25Qcm9wZXJ0eS5jYWxsKHByb3BzLCBrZXkpO1xuICAgIH1cbiAgfVxufSk7XG5cbi8qKlxuICogQ3JlYXRlcyBhbiBhcnJheSBvZiB0aGUgb3duIGFuZCBpbmhlcml0ZWQgZW51bWVyYWJsZSBwcm9wZXJ0eSBuYW1lcyBvZiBgb2JqZWN0YC5cbiAqXG4gKiAqKk5vdGU6KiogTm9uLW9iamVjdCB2YWx1ZXMgYXJlIGNvZXJjZWQgdG8gb2JqZWN0cy5cbiAqXG4gKiBAc3RhdGljXG4gKiBAbWVtYmVyT2YgX1xuICogQGNhdGVnb3J5IE9iamVjdFxuICogQHBhcmFtIHtPYmplY3R9IG9iamVjdCBUaGUgb2JqZWN0IHRvIHF1ZXJ5LlxuICogQHJldHVybnMge0FycmF5fSBSZXR1cm5zIHRoZSBhcnJheSBvZiBwcm9wZXJ0eSBuYW1lcy5cbiAqIEBleGFtcGxlXG4gKlxuICogZnVuY3Rpb24gRm9vKCkge1xuICogICB0aGlzLmEgPSAxO1xuICogICB0aGlzLmIgPSAyO1xuICogfVxuICpcbiAqIEZvby5wcm90b3R5cGUuYyA9IDM7XG4gKlxuICogXy5rZXlzSW4obmV3IEZvbyk7XG4gKiAvLyA9PiBbJ2EnLCAnYicsICdjJ10gKGl0ZXJhdGlvbiBvcmRlciBpcyBub3QgZ3VhcmFudGVlZClcbiAqL1xuZnVuY3Rpb24ga2V5c0luKG9iamVjdCkge1xuICBpZiAob2JqZWN0ID09IG51bGwpIHtcbiAgICByZXR1cm4gW107XG4gIH1cbiAgaWYgKCFpc09iamVjdChvYmplY3QpKSB7XG4gICAgb2JqZWN0ID0gT2JqZWN0KG9iamVjdCk7XG4gIH1cbiAgdmFyIGxlbmd0aCA9IG9iamVjdC5sZW5ndGg7XG5cbiAgbGVuZ3RoID0gKGxlbmd0aCAmJiBpc0xlbmd0aChsZW5ndGgpICYmXG4gICAgKGlzQXJyYXkob2JqZWN0KSB8fCBpc0FyZ3VtZW50cyhvYmplY3QpIHx8IGlzU3RyaW5nKG9iamVjdCkpICYmIGxlbmd0aCkgfHwgMDtcblxuICB2YXIgQ3RvciA9IG9iamVjdC5jb25zdHJ1Y3RvcixcbiAgICAgIGluZGV4ID0gLTEsXG4gICAgICBwcm90byA9IChpc0Z1bmN0aW9uKEN0b3IpICYmIEN0b3IucHJvdG90eXBlKSB8fCBvYmplY3RQcm90byxcbiAgICAgIGlzUHJvdG8gPSBwcm90byA9PT0gb2JqZWN0LFxuICAgICAgcmVzdWx0ID0gQXJyYXkobGVuZ3RoKSxcbiAgICAgIHNraXBJbmRleGVzID0gbGVuZ3RoID4gMCxcbiAgICAgIHNraXBFcnJvclByb3BzID0gc3VwcG9ydC5lbnVtRXJyb3JQcm9wcyAmJiAob2JqZWN0ID09PSBlcnJvclByb3RvIHx8IG9iamVjdCBpbnN0YW5jZW9mIEVycm9yKSxcbiAgICAgIHNraXBQcm90byA9IHN1cHBvcnQuZW51bVByb3RvdHlwZXMgJiYgaXNGdW5jdGlvbihvYmplY3QpO1xuXG4gIHdoaWxlICgrK2luZGV4IDwgbGVuZ3RoKSB7XG4gICAgcmVzdWx0W2luZGV4XSA9IChpbmRleCArICcnKTtcbiAgfVxuICAvLyBsb2Rhc2ggc2tpcHMgdGhlIGBjb25zdHJ1Y3RvcmAgcHJvcGVydHkgd2hlbiBpdCBpbmZlcnMgaXQncyBpdGVyYXRpbmdcbiAgLy8gb3ZlciBhIGBwcm90b3R5cGVgIG9iamVjdCBiZWNhdXNlIElFIDwgOSBjYW4ndCBzZXQgdGhlIGBbW0VudW1lcmFibGVdXWBcbiAgLy8gYXR0cmlidXRlIG9mIGFuIGV4aXN0aW5nIHByb3BlcnR5IGFuZCB0aGUgYGNvbnN0cnVjdG9yYCBwcm9wZXJ0eSBvZiBhXG4gIC8vIHByb3RvdHlwZSBkZWZhdWx0cyB0byBub24tZW51bWVyYWJsZS5cbiAgZm9yICh2YXIga2V5IGluIG9iamVjdCkge1xuICAgIGlmICghKHNraXBQcm90byAmJiBrZXkgPT0gJ3Byb3RvdHlwZScpICYmXG4gICAgICAgICEoc2tpcEVycm9yUHJvcHMgJiYgKGtleSA9PSAnbWVzc2FnZScgfHwga2V5ID09ICduYW1lJykpICYmXG4gICAgICAgICEoc2tpcEluZGV4ZXMgJiYgaXNJbmRleChrZXksIGxlbmd0aCkpICYmXG4gICAgICAgICEoa2V5ID09ICdjb25zdHJ1Y3RvcicgJiYgKGlzUHJvdG8gfHwgIWhhc093blByb3BlcnR5LmNhbGwob2JqZWN0LCBrZXkpKSkpIHtcbiAgICAgIHJlc3VsdC5wdXNoKGtleSk7XG4gICAgfVxuICB9XG4gIGlmIChzdXBwb3J0Lm5vbkVudW1TaGFkb3dzICYmIG9iamVjdCAhPT0gb2JqZWN0UHJvdG8pIHtcbiAgICB2YXIgdGFnID0gb2JqZWN0ID09PSBzdHJpbmdQcm90byA/IHN0cmluZ1RhZyA6IChvYmplY3QgPT09IGVycm9yUHJvdG8gPyBlcnJvclRhZyA6IG9ialRvU3RyaW5nLmNhbGwob2JqZWN0KSksXG4gICAgICAgIG5vbkVudW1zID0gbm9uRW51bVByb3BzW3RhZ10gfHwgbm9uRW51bVByb3BzW29iamVjdFRhZ107XG5cbiAgICBpZiAodGFnID09IG9iamVjdFRhZykge1xuICAgICAgcHJvdG8gPSBvYmplY3RQcm90bztcbiAgICB9XG4gICAgbGVuZ3RoID0gc2hhZG93UHJvcHMubGVuZ3RoO1xuICAgIHdoaWxlIChsZW5ndGgtLSkge1xuICAgICAga2V5ID0gc2hhZG93UHJvcHNbbGVuZ3RoXTtcbiAgICAgIHZhciBub25FbnVtID0gbm9uRW51bXNba2V5XTtcbiAgICAgIGlmICghKGlzUHJvdG8gJiYgbm9uRW51bSkgJiZcbiAgICAgICAgICAobm9uRW51bSA/IGhhc093blByb3BlcnR5LmNhbGwob2JqZWN0LCBrZXkpIDogb2JqZWN0W2tleV0gIT09IHByb3RvW2tleV0pKSB7XG4gICAgICAgIHJlc3VsdC5wdXNoKGtleSk7XG4gICAgICB9XG4gICAgfVxuICB9XG4gIHJldHVybiByZXN1bHQ7XG59XG5cbm1vZHVsZS5leHBvcnRzID0ga2V5c0luO1xuIiwidmFyIGtleXMgPSByZXF1aXJlKCcuL2tleXMnKSxcbiAgICB0b09iamVjdCA9IHJlcXVpcmUoJy4uL2ludGVybmFsL3RvT2JqZWN0Jyk7XG5cbi8qKlxuICogQ3JlYXRlcyBhIHR3byBkaW1lbnNpb25hbCBhcnJheSBvZiB0aGUga2V5LXZhbHVlIHBhaXJzIGZvciBgb2JqZWN0YCxcbiAqIGUuZy4gYFtba2V5MSwgdmFsdWUxXSwgW2tleTIsIHZhbHVlMl1dYC5cbiAqXG4gKiBAc3RhdGljXG4gKiBAbWVtYmVyT2YgX1xuICogQGNhdGVnb3J5IE9iamVjdFxuICogQHBhcmFtIHtPYmplY3R9IG9iamVjdCBUaGUgb2JqZWN0IHRvIHF1ZXJ5LlxuICogQHJldHVybnMge0FycmF5fSBSZXR1cm5zIHRoZSBuZXcgYXJyYXkgb2Yga2V5LXZhbHVlIHBhaXJzLlxuICogQGV4YW1wbGVcbiAqXG4gKiBfLnBhaXJzKHsgJ2Jhcm5leSc6IDM2LCAnZnJlZCc6IDQwIH0pO1xuICogLy8gPT4gW1snYmFybmV5JywgMzZdLCBbJ2ZyZWQnLCA0MF1dIChpdGVyYXRpb24gb3JkZXIgaXMgbm90IGd1YXJhbnRlZWQpXG4gKi9cbmZ1bmN0aW9uIHBhaXJzKG9iamVjdCkge1xuICBvYmplY3QgPSB0b09iamVjdChvYmplY3QpO1xuXG4gIHZhciBpbmRleCA9IC0xLFxuICAgICAgcHJvcHMgPSBrZXlzKG9iamVjdCksXG4gICAgICBsZW5ndGggPSBwcm9wcy5sZW5ndGgsXG4gICAgICByZXN1bHQgPSBBcnJheShsZW5ndGgpO1xuXG4gIHdoaWxlICgrK2luZGV4IDwgbGVuZ3RoKSB7XG4gICAgdmFyIGtleSA9IHByb3BzW2luZGV4XTtcbiAgICByZXN1bHRbaW5kZXhdID0gW2tleSwgb2JqZWN0W2tleV1dO1xuICB9XG4gIHJldHVybiByZXN1bHQ7XG59XG5cbm1vZHVsZS5leHBvcnRzID0gcGFpcnM7XG4iLCJ2YXIgYmFzZVZhbHVlcyA9IHJlcXVpcmUoJy4uL2ludGVybmFsL2Jhc2VWYWx1ZXMnKSxcbiAgICBrZXlzID0gcmVxdWlyZSgnLi9rZXlzJyk7XG5cbi8qKlxuICogQ3JlYXRlcyBhbiBhcnJheSBvZiB0aGUgb3duIGVudW1lcmFibGUgcHJvcGVydHkgdmFsdWVzIG9mIGBvYmplY3RgLlxuICpcbiAqICoqTm90ZToqKiBOb24tb2JqZWN0IHZhbHVlcyBhcmUgY29lcmNlZCB0byBvYmplY3RzLlxuICpcbiAqIEBzdGF0aWNcbiAqIEBtZW1iZXJPZiBfXG4gKiBAY2F0ZWdvcnkgT2JqZWN0XG4gKiBAcGFyYW0ge09iamVjdH0gb2JqZWN0IFRoZSBvYmplY3QgdG8gcXVlcnkuXG4gKiBAcmV0dXJucyB7QXJyYXl9IFJldHVybnMgdGhlIGFycmF5IG9mIHByb3BlcnR5IHZhbHVlcy5cbiAqIEBleGFtcGxlXG4gKlxuICogZnVuY3Rpb24gRm9vKCkge1xuICogICB0aGlzLmEgPSAxO1xuICogICB0aGlzLmIgPSAyO1xuICogfVxuICpcbiAqIEZvby5wcm90b3R5cGUuYyA9IDM7XG4gKlxuICogXy52YWx1ZXMobmV3IEZvbyk7XG4gKiAvLyA9PiBbMSwgMl0gKGl0ZXJhdGlvbiBvcmRlciBpcyBub3QgZ3VhcmFudGVlZClcbiAqXG4gKiBfLnZhbHVlcygnaGknKTtcbiAqIC8vID0+IFsnaCcsICdpJ11cbiAqL1xuZnVuY3Rpb24gdmFsdWVzKG9iamVjdCkge1xuICByZXR1cm4gYmFzZVZhbHVlcyhvYmplY3QsIGtleXMob2JqZWN0KSk7XG59XG5cbm1vZHVsZS5leHBvcnRzID0gdmFsdWVzO1xuIiwiLyoqIFVzZWQgZm9yIG5hdGl2ZSBtZXRob2QgcmVmZXJlbmNlcy4gKi9cbnZhciBhcnJheVByb3RvID0gQXJyYXkucHJvdG90eXBlLFxuICAgIGVycm9yUHJvdG8gPSBFcnJvci5wcm90b3R5cGUsXG4gICAgb2JqZWN0UHJvdG8gPSBPYmplY3QucHJvdG90eXBlO1xuXG4vKiogTmF0aXZlIG1ldGhvZCByZWZlcmVuY2VzLiAqL1xudmFyIHByb3BlcnR5SXNFbnVtZXJhYmxlID0gb2JqZWN0UHJvdG8ucHJvcGVydHlJc0VudW1lcmFibGUsXG4gICAgc3BsaWNlID0gYXJyYXlQcm90by5zcGxpY2U7XG5cbi8qKlxuICogQW4gb2JqZWN0IGVudmlyb25tZW50IGZlYXR1cmUgZmxhZ3MuXG4gKlxuICogQHN0YXRpY1xuICogQG1lbWJlck9mIF9cbiAqIEB0eXBlIE9iamVjdFxuICovXG52YXIgc3VwcG9ydCA9IHt9O1xuXG4oZnVuY3Rpb24oeCkge1xuICB2YXIgQ3RvciA9IGZ1bmN0aW9uKCkgeyB0aGlzLnggPSB4OyB9LFxuICAgICAgb2JqZWN0ID0geyAnMCc6IHgsICdsZW5ndGgnOiB4IH0sXG4gICAgICBwcm9wcyA9IFtdO1xuXG4gIEN0b3IucHJvdG90eXBlID0geyAndmFsdWVPZic6IHgsICd5JzogeCB9O1xuICBmb3IgKHZhciBrZXkgaW4gbmV3IEN0b3IpIHsgcHJvcHMucHVzaChrZXkpOyB9XG5cbiAgLyoqXG4gICAqIERldGVjdCBpZiBgbmFtZWAgb3IgYG1lc3NhZ2VgIHByb3BlcnRpZXMgb2YgYEVycm9yLnByb3RvdHlwZWAgYXJlXG4gICAqIGVudW1lcmFibGUgYnkgZGVmYXVsdCAoSUUgPCA5LCBTYWZhcmkgPCA1LjEpLlxuICAgKlxuICAgKiBAbWVtYmVyT2YgXy5zdXBwb3J0XG4gICAqIEB0eXBlIGJvb2xlYW5cbiAgICovXG4gIHN1cHBvcnQuZW51bUVycm9yUHJvcHMgPSBwcm9wZXJ0eUlzRW51bWVyYWJsZS5jYWxsKGVycm9yUHJvdG8sICdtZXNzYWdlJykgfHxcbiAgICBwcm9wZXJ0eUlzRW51bWVyYWJsZS5jYWxsKGVycm9yUHJvdG8sICduYW1lJyk7XG5cbiAgLyoqXG4gICAqIERldGVjdCBpZiBgcHJvdG90eXBlYCBwcm9wZXJ0aWVzIGFyZSBlbnVtZXJhYmxlIGJ5IGRlZmF1bHQuXG4gICAqXG4gICAqIEZpcmVmb3ggPCAzLjYsIE9wZXJhID4gOS41MCAtIE9wZXJhIDwgMTEuNjAsIGFuZCBTYWZhcmkgPCA1LjFcbiAgICogKGlmIHRoZSBwcm90b3R5cGUgb3IgYSBwcm9wZXJ0eSBvbiB0aGUgcHJvdG90eXBlIGhhcyBiZWVuIHNldClcbiAgICogaW5jb3JyZWN0bHkgc2V0IHRoZSBgW1tFbnVtZXJhYmxlXV1gIHZhbHVlIG9mIGEgZnVuY3Rpb24ncyBgcHJvdG90eXBlYFxuICAgKiBwcm9wZXJ0eSB0byBgdHJ1ZWAuXG4gICAqXG4gICAqIEBtZW1iZXJPZiBfLnN1cHBvcnRcbiAgICogQHR5cGUgYm9vbGVhblxuICAgKi9cbiAgc3VwcG9ydC5lbnVtUHJvdG90eXBlcyA9IHByb3BlcnR5SXNFbnVtZXJhYmxlLmNhbGwoQ3RvciwgJ3Byb3RvdHlwZScpO1xuXG4gIC8qKlxuICAgKiBEZXRlY3QgaWYgcHJvcGVydGllcyBzaGFkb3dpbmcgdGhvc2Ugb24gYE9iamVjdC5wcm90b3R5cGVgIGFyZSBub24tZW51bWVyYWJsZS5cbiAgICpcbiAgICogSW4gSUUgPCA5IGFuIG9iamVjdCdzIG93biBwcm9wZXJ0aWVzLCBzaGFkb3dpbmcgbm9uLWVudW1lcmFibGUgb25lcyxcbiAgICogYXJlIG1hZGUgbm9uLWVudW1lcmFibGUgYXMgd2VsbCAoYS5rLmEgdGhlIEpTY3JpcHQgYFtbRG9udEVudW1dXWAgYnVnKS5cbiAgICpcbiAgICogQG1lbWJlck9mIF8uc3VwcG9ydFxuICAgKiBAdHlwZSBib29sZWFuXG4gICAqL1xuICBzdXBwb3J0Lm5vbkVudW1TaGFkb3dzID0gIS92YWx1ZU9mLy50ZXN0KHByb3BzKTtcblxuICAvKipcbiAgICogRGV0ZWN0IGlmIG93biBwcm9wZXJ0aWVzIGFyZSBpdGVyYXRlZCBhZnRlciBpbmhlcml0ZWQgcHJvcGVydGllcyAoSUUgPCA5KS5cbiAgICpcbiAgICogQG1lbWJlck9mIF8uc3VwcG9ydFxuICAgKiBAdHlwZSBib29sZWFuXG4gICAqL1xuICBzdXBwb3J0Lm93bkxhc3QgPSBwcm9wc1swXSAhPSAneCc7XG5cbiAgLyoqXG4gICAqIERldGVjdCBpZiBgQXJyYXkjc2hpZnRgIGFuZCBgQXJyYXkjc3BsaWNlYCBhdWdtZW50IGFycmF5LWxpa2Ugb2JqZWN0c1xuICAgKiBjb3JyZWN0bHkuXG4gICAqXG4gICAqIEZpcmVmb3ggPCAxMCwgY29tcGF0aWJpbGl0eSBtb2RlcyBvZiBJRSA4LCBhbmQgSUUgPCA5IGhhdmUgYnVnZ3kgQXJyYXlcbiAgICogYHNoaWZ0KClgIGFuZCBgc3BsaWNlKClgIGZ1bmN0aW9ucyB0aGF0IGZhaWwgdG8gcmVtb3ZlIHRoZSBsYXN0IGVsZW1lbnQsXG4gICAqIGB2YWx1ZVswXWAsIG9mIGFycmF5LWxpa2Ugb2JqZWN0cyBldmVuIHRob3VnaCB0aGUgXCJsZW5ndGhcIiBwcm9wZXJ0eSBpc1xuICAgKiBzZXQgdG8gYDBgLiBUaGUgYHNoaWZ0KClgIG1ldGhvZCBpcyBidWdneSBpbiBjb21wYXRpYmlsaXR5IG1vZGVzIG9mIElFIDgsXG4gICAqIHdoaWxlIGBzcGxpY2UoKWAgaXMgYnVnZ3kgcmVnYXJkbGVzcyBvZiBtb2RlIGluIElFIDwgOS5cbiAgICpcbiAgICogQG1lbWJlck9mIF8uc3VwcG9ydFxuICAgKiBAdHlwZSBib29sZWFuXG4gICAqL1xuICBzdXBwb3J0LnNwbGljZU9iamVjdHMgPSAoc3BsaWNlLmNhbGwob2JqZWN0LCAwLCAxKSwgIW9iamVjdFswXSk7XG5cbiAgLyoqXG4gICAqIERldGVjdCBsYWNrIG9mIHN1cHBvcnQgZm9yIGFjY2Vzc2luZyBzdHJpbmcgY2hhcmFjdGVycyBieSBpbmRleC5cbiAgICpcbiAgICogSUUgPCA4IGNhbid0IGFjY2VzcyBjaGFyYWN0ZXJzIGJ5IGluZGV4LiBJRSA4IGNhbiBvbmx5IGFjY2VzcyBjaGFyYWN0ZXJzXG4gICAqIGJ5IGluZGV4IG9uIHN0cmluZyBsaXRlcmFscywgbm90IHN0cmluZyBvYmplY3RzLlxuICAgKlxuICAgKiBAbWVtYmVyT2YgXy5zdXBwb3J0XG4gICAqIEB0eXBlIGJvb2xlYW5cbiAgICovXG4gIHN1cHBvcnQudW5pbmRleGVkQ2hhcnMgPSAoJ3gnWzBdICsgT2JqZWN0KCd4JylbMF0pICE9ICd4eCc7XG59KDEsIDApKTtcblxubW9kdWxlLmV4cG9ydHMgPSBzdXBwb3J0O1xuIiwiLyoqXG4gKiBUaGlzIG1ldGhvZCByZXR1cm5zIHRoZSBmaXJzdCBhcmd1bWVudCBwcm92aWRlZCB0byBpdC5cbiAqXG4gKiBAc3RhdGljXG4gKiBAbWVtYmVyT2YgX1xuICogQGNhdGVnb3J5IFV0aWxpdHlcbiAqIEBwYXJhbSB7Kn0gdmFsdWUgQW55IHZhbHVlLlxuICogQHJldHVybnMgeyp9IFJldHVybnMgYHZhbHVlYC5cbiAqIEBleGFtcGxlXG4gKlxuICogdmFyIG9iamVjdCA9IHsgJ3VzZXInOiAnZnJlZCcgfTtcbiAqXG4gKiBfLmlkZW50aXR5KG9iamVjdCkgPT09IG9iamVjdDtcbiAqIC8vID0+IHRydWVcbiAqL1xuZnVuY3Rpb24gaWRlbnRpdHkodmFsdWUpIHtcbiAgcmV0dXJuIHZhbHVlO1xufVxuXG5tb2R1bGUuZXhwb3J0cyA9IGlkZW50aXR5O1xuIiwiLyoqXG4gKiBBIG5vLW9wZXJhdGlvbiBmdW5jdGlvbiB0aGF0IHJldHVybnMgYHVuZGVmaW5lZGAgcmVnYXJkbGVzcyBvZiB0aGVcbiAqIGFyZ3VtZW50cyBpdCByZWNlaXZlcy5cbiAqXG4gKiBAc3RhdGljXG4gKiBAbWVtYmVyT2YgX1xuICogQGNhdGVnb3J5IFV0aWxpdHlcbiAqIEBleGFtcGxlXG4gKlxuICogdmFyIG9iamVjdCA9IHsgJ3VzZXInOiAnZnJlZCcgfTtcbiAqXG4gKiBfLm5vb3Aob2JqZWN0KSA9PT0gdW5kZWZpbmVkO1xuICogLy8gPT4gdHJ1ZVxuICovXG5mdW5jdGlvbiBub29wKCkge1xuICAvLyBObyBvcGVyYXRpb24gcGVyZm9ybWVkLlxufVxuXG5tb2R1bGUuZXhwb3J0cyA9IG5vb3A7XG4iLCJ2YXIgYmFzZVByb3BlcnR5ID0gcmVxdWlyZSgnLi4vaW50ZXJuYWwvYmFzZVByb3BlcnR5JyksXG4gICAgYmFzZVByb3BlcnR5RGVlcCA9IHJlcXVpcmUoJy4uL2ludGVybmFsL2Jhc2VQcm9wZXJ0eURlZXAnKSxcbiAgICBpc0tleSA9IHJlcXVpcmUoJy4uL2ludGVybmFsL2lzS2V5Jyk7XG5cbi8qKlxuICogQ3JlYXRlcyBhIGZ1bmN0aW9uIHRoYXQgcmV0dXJucyB0aGUgcHJvcGVydHkgdmFsdWUgYXQgYHBhdGhgIG9uIGFcbiAqIGdpdmVuIG9iamVjdC5cbiAqXG4gKiBAc3RhdGljXG4gKiBAbWVtYmVyT2YgX1xuICogQGNhdGVnb3J5IFV0aWxpdHlcbiAqIEBwYXJhbSB7QXJyYXl8c3RyaW5nfSBwYXRoIFRoZSBwYXRoIG9mIHRoZSBwcm9wZXJ0eSB0byBnZXQuXG4gKiBAcmV0dXJucyB7RnVuY3Rpb259IFJldHVybnMgdGhlIG5ldyBmdW5jdGlvbi5cbiAqIEBleGFtcGxlXG4gKlxuICogdmFyIG9iamVjdHMgPSBbXG4gKiAgIHsgJ2EnOiB7ICdiJzogeyAnYyc6IDIgfSB9IH0sXG4gKiAgIHsgJ2EnOiB7ICdiJzogeyAnYyc6IDEgfSB9IH1cbiAqIF07XG4gKlxuICogXy5tYXAob2JqZWN0cywgXy5wcm9wZXJ0eSgnYS5iLmMnKSk7XG4gKiAvLyA9PiBbMiwgMV1cbiAqXG4gKiBfLnBsdWNrKF8uc29ydEJ5KG9iamVjdHMsIF8ucHJvcGVydHkoWydhJywgJ2InLCAnYyddKSksICdhLmIuYycpO1xuICogLy8gPT4gWzEsIDJdXG4gKi9cbmZ1bmN0aW9uIHByb3BlcnR5KHBhdGgpIHtcbiAgcmV0dXJuIGlzS2V5KHBhdGgpID8gYmFzZVByb3BlcnR5KHBhdGgpIDogYmFzZVByb3BlcnR5RGVlcChwYXRoKTtcbn1cblxubW9kdWxlLmV4cG9ydHMgPSBwcm9wZXJ0eTtcbiIsIihmdW5jdGlvbiAocHJvY2Vzcyl7XG4vLyB2aW06dHM9NDpzdHM9NDpzdz00OlxuLyohXG4gKlxuICogQ29weXJpZ2h0IDIwMDktMjAxMiBLcmlzIEtvd2FsIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgTUlUXG4gKiBsaWNlbnNlIGZvdW5kIGF0IGh0dHA6Ly9naXRodWIuY29tL2tyaXNrb3dhbC9xL3Jhdy9tYXN0ZXIvTElDRU5TRVxuICpcbiAqIFdpdGggcGFydHMgYnkgVHlsZXIgQ2xvc2VcbiAqIENvcHlyaWdodCAyMDA3LTIwMDkgVHlsZXIgQ2xvc2UgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBNSVQgWCBsaWNlbnNlIGZvdW5kXG4gKiBhdCBodHRwOi8vd3d3Lm9wZW5zb3VyY2Uub3JnL2xpY2Vuc2VzL21pdC1saWNlbnNlLmh0bWxcbiAqIEZvcmtlZCBhdCByZWZfc2VuZC5qcyB2ZXJzaW9uOiAyMDA5LTA1LTExXG4gKlxuICogV2l0aCBwYXJ0cyBieSBNYXJrIE1pbGxlclxuICogQ29weXJpZ2h0IChDKSAyMDExIEdvb2dsZSBJbmMuXG4gKlxuICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlIFwiTGljZW5zZVwiKTtcbiAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS5cbiAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdFxuICpcbiAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMFxuICpcbiAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmVcbiAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuIFwiQVMgSVNcIiBCQVNJUyxcbiAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLlxuICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZFxuICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuXG4gKlxuICovXG5cbihmdW5jdGlvbiAoZGVmaW5pdGlvbikge1xuICAgIFwidXNlIHN0cmljdFwiO1xuXG4gICAgLy8gVGhpcyBmaWxlIHdpbGwgZnVuY3Rpb24gcHJvcGVybHkgYXMgYSA8c2NyaXB0PiB0YWcsIG9yIGEgbW9kdWxlXG4gICAgLy8gdXNpbmcgQ29tbW9uSlMgYW5kIE5vZGVKUyBvciBSZXF1aXJlSlMgbW9kdWxlIGZvcm1hdHMuICBJblxuICAgIC8vIENvbW1vbi9Ob2RlL1JlcXVpcmVKUywgdGhlIG1vZHVsZSBleHBvcnRzIHRoZSBRIEFQSSBhbmQgd2hlblxuICAgIC8vIGV4ZWN1dGVkIGFzIGEgc2ltcGxlIDxzY3JpcHQ+LCBpdCBjcmVhdGVzIGEgUSBnbG9iYWwgaW5zdGVhZC5cblxuICAgIC8vIE1vbnRhZ2UgUmVxdWlyZVxuICAgIGlmICh0eXBlb2YgYm9vdHN0cmFwID09PSBcImZ1bmN0aW9uXCIpIHtcbiAgICAgICAgYm9vdHN0cmFwKFwicHJvbWlzZVwiLCBkZWZpbml0aW9uKTtcblxuICAgIC8vIENvbW1vbkpTXG4gICAgfSBlbHNlIGlmICh0eXBlb2YgZXhwb3J0cyA9PT0gXCJvYmplY3RcIiAmJiB0eXBlb2YgbW9kdWxlID09PSBcIm9iamVjdFwiKSB7XG4gICAgICAgIG1vZHVsZS5leHBvcnRzID0gZGVmaW5pdGlvbigpO1xuXG4gICAgLy8gUmVxdWlyZUpTXG4gICAgfSBlbHNlIGlmICh0eXBlb2YgZGVmaW5lID09PSBcImZ1bmN0aW9uXCIgJiYgZGVmaW5lLmFtZCkge1xuICAgICAgICBkZWZpbmUoZGVmaW5pdGlvbik7XG5cbiAgICAvLyBTRVMgKFNlY3VyZSBFY21hU2NyaXB0KVxuICAgIH0gZWxzZSBpZiAodHlwZW9mIHNlcyAhPT0gXCJ1bmRlZmluZWRcIikge1xuICAgICAgICBpZiAoIXNlcy5vaygpKSB7XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICBzZXMubWFrZVEgPSBkZWZpbml0aW9uO1xuICAgICAgICB9XG5cbiAgICAvLyA8c2NyaXB0PlxuICAgIH0gZWxzZSBpZiAodHlwZW9mIHdpbmRvdyAhPT0gXCJ1bmRlZmluZWRcIiB8fCB0eXBlb2Ygc2VsZiAhPT0gXCJ1bmRlZmluZWRcIikge1xuICAgICAgICAvLyBQcmVmZXIgd2luZG93IG92ZXIgc2VsZiBmb3IgYWRkLW9uIHNjcmlwdHMuIFVzZSBzZWxmIGZvclxuICAgICAgICAvLyBub24td2luZG93ZWQgY29udGV4dHMuXG4gICAgICAgIHZhciBnbG9iYWwgPSB0eXBlb2Ygd2luZG93ICE9PSBcInVuZGVmaW5lZFwiID8gd2luZG93IDogc2VsZjtcblxuICAgICAgICAvLyBHZXQgdGhlIGB3aW5kb3dgIG9iamVjdCwgc2F2ZSB0aGUgcHJldmlvdXMgUSBnbG9iYWxcbiAgICAgICAgLy8gYW5kIGluaXRpYWxpemUgUSBhcyBhIGdsb2JhbC5cbiAgICAgICAgdmFyIHByZXZpb3VzUSA9IGdsb2JhbC5RO1xuICAgICAgICBnbG9iYWwuUSA9IGRlZmluaXRpb24oKTtcblxuICAgICAgICAvLyBBZGQgYSBub0NvbmZsaWN0IGZ1bmN0aW9uIHNvIFEgY2FuIGJlIHJlbW92ZWQgZnJvbSB0aGVcbiAgICAgICAgLy8gZ2xvYmFsIG5hbWVzcGFjZS5cbiAgICAgICAgZ2xvYmFsLlEubm9Db25mbGljdCA9IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICAgIGdsb2JhbC5RID0gcHJldmlvdXNRO1xuICAgICAgICAgICAgcmV0dXJuIHRoaXM7XG4gICAgICAgIH07XG5cbiAgICB9IGVsc2Uge1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoXCJUaGlzIGVudmlyb25tZW50IHdhcyBub3QgYW50aWNpcGF0ZWQgYnkgUS4gUGxlYXNlIGZpbGUgYSBidWcuXCIpO1xuICAgIH1cblxufSkoZnVuY3Rpb24gKCkge1xuXCJ1c2Ugc3RyaWN0XCI7XG5cbnZhciBoYXNTdGFja3MgPSBmYWxzZTtcbnRyeSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKCk7XG59IGNhdGNoIChlKSB7XG4gICAgaGFzU3RhY2tzID0gISFlLnN0YWNrO1xufVxuXG4vLyBBbGwgY29kZSBhZnRlciB0aGlzIHBvaW50IHdpbGwgYmUgZmlsdGVyZWQgZnJvbSBzdGFjayB0cmFjZXMgcmVwb3J0ZWRcbi8vIGJ5IFEuXG52YXIgcVN0YXJ0aW5nTGluZSA9IGNhcHR1cmVMaW5lKCk7XG52YXIgcUZpbGVOYW1lO1xuXG4vLyBzaGltc1xuXG4vLyB1c2VkIGZvciBmYWxsYmFjayBpbiBcImFsbFJlc29sdmVkXCJcbnZhciBub29wID0gZnVuY3Rpb24gKCkge307XG5cbi8vIFVzZSB0aGUgZmFzdGVzdCBwb3NzaWJsZSBtZWFucyB0byBleGVjdXRlIGEgdGFzayBpbiBhIGZ1dHVyZSB0dXJuXG4vLyBvZiB0aGUgZXZlbnQgbG9vcC5cbnZhciBuZXh0VGljayA9KGZ1bmN0aW9uICgpIHtcbiAgICAvLyBsaW5rZWQgbGlzdCBvZiB0YXNrcyAoc2luZ2xlLCB3aXRoIGhlYWQgbm9kZSlcbiAgICB2YXIgaGVhZCA9IHt0YXNrOiB2b2lkIDAsIG5leHQ6IG51bGx9O1xuICAgIHZhciB0YWlsID0gaGVhZDtcbiAgICB2YXIgZmx1c2hpbmcgPSBmYWxzZTtcbiAgICB2YXIgcmVxdWVzdFRpY2sgPSB2b2lkIDA7XG4gICAgdmFyIGlzTm9kZUpTID0gZmFsc2U7XG4gICAgLy8gcXVldWUgZm9yIGxhdGUgdGFza3MsIHVzZWQgYnkgdW5oYW5kbGVkIHJlamVjdGlvbiB0cmFja2luZ1xuICAgIHZhciBsYXRlclF1ZXVlID0gW107XG5cbiAgICBmdW5jdGlvbiBmbHVzaCgpIHtcbiAgICAgICAgLyoganNoaW50IGxvb3BmdW5jOiB0cnVlICovXG4gICAgICAgIHZhciB0YXNrLCBkb21haW47XG5cbiAgICAgICAgd2hpbGUgKGhlYWQubmV4dCkge1xuICAgICAgICAgICAgaGVhZCA9IGhlYWQubmV4dDtcbiAgICAgICAgICAgIHRhc2sgPSBoZWFkLnRhc2s7XG4gICAgICAgICAgICBoZWFkLnRhc2sgPSB2b2lkIDA7XG4gICAgICAgICAgICBkb21haW4gPSBoZWFkLmRvbWFpbjtcblxuICAgICAgICAgICAgaWYgKGRvbWFpbikge1xuICAgICAgICAgICAgICAgIGhlYWQuZG9tYWluID0gdm9pZCAwO1xuICAgICAgICAgICAgICAgIGRvbWFpbi5lbnRlcigpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgcnVuU2luZ2xlKHRhc2ssIGRvbWFpbik7XG5cbiAgICAgICAgfVxuICAgICAgICB3aGlsZSAobGF0ZXJRdWV1ZS5sZW5ndGgpIHtcbiAgICAgICAgICAgIHRhc2sgPSBsYXRlclF1ZXVlLnBvcCgpO1xuICAgICAgICAgICAgcnVuU2luZ2xlKHRhc2spO1xuICAgICAgICB9XG4gICAgICAgIGZsdXNoaW5nID0gZmFsc2U7XG4gICAgfVxuICAgIC8vIHJ1bnMgYSBzaW5nbGUgZnVuY3Rpb24gaW4gdGhlIGFzeW5jIHF1ZXVlXG4gICAgZnVuY3Rpb24gcnVuU2luZ2xlKHRhc2ssIGRvbWFpbikge1xuICAgICAgICB0cnkge1xuICAgICAgICAgICAgdGFzaygpO1xuXG4gICAgICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAgICAgICAgIGlmIChpc05vZGVKUykge1xuICAgICAgICAgICAgICAgIC8vIEluIG5vZGUsIHVuY2F1Z2h0IGV4Y2VwdGlvbnMgYXJlIGNvbnNpZGVyZWQgZmF0YWwgZXJyb3JzLlxuICAgICAgICAgICAgICAgIC8vIFJlLXRocm93IHRoZW0gc3luY2hyb25vdXNseSB0byBpbnRlcnJ1cHQgZmx1c2hpbmchXG5cbiAgICAgICAgICAgICAgICAvLyBFbnN1cmUgY29udGludWF0aW9uIGlmIHRoZSB1bmNhdWdodCBleGNlcHRpb24gaXMgc3VwcHJlc3NlZFxuICAgICAgICAgICAgICAgIC8vIGxpc3RlbmluZyBcInVuY2F1Z2h0RXhjZXB0aW9uXCIgZXZlbnRzIChhcyBkb21haW5zIGRvZXMpLlxuICAgICAgICAgICAgICAgIC8vIENvbnRpbnVlIGluIG5leHQgZXZlbnQgdG8gYXZvaWQgdGljayByZWN1cnNpb24uXG4gICAgICAgICAgICAgICAgaWYgKGRvbWFpbikge1xuICAgICAgICAgICAgICAgICAgICBkb21haW4uZXhpdCgpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBzZXRUaW1lb3V0KGZsdXNoLCAwKTtcbiAgICAgICAgICAgICAgICBpZiAoZG9tYWluKSB7XG4gICAgICAgICAgICAgICAgICAgIGRvbWFpbi5lbnRlcigpO1xuICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAgIHRocm93IGU7XG5cbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgLy8gSW4gYnJvd3NlcnMsIHVuY2F1Z2h0IGV4Y2VwdGlvbnMgYXJlIG5vdCBmYXRhbC5cbiAgICAgICAgICAgICAgICAvLyBSZS10aHJvdyB0aGVtIGFzeW5jaHJvbm91c2x5IHRvIGF2b2lkIHNsb3ctZG93bnMuXG4gICAgICAgICAgICAgICAgc2V0VGltZW91dChmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgICAgICAgICAgIHRocm93IGU7XG4gICAgICAgICAgICAgICAgfSwgMCk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgICAgICBpZiAoZG9tYWluKSB7XG4gICAgICAgICAgICBkb21haW4uZXhpdCgpO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgbmV4dFRpY2sgPSBmdW5jdGlvbiAodGFzaykge1xuICAgICAgICB0YWlsID0gdGFpbC5uZXh0ID0ge1xuICAgICAgICAgICAgdGFzazogdGFzayxcbiAgICAgICAgICAgIGRvbWFpbjogaXNOb2RlSlMgJiYgcHJvY2Vzcy5kb21haW4sXG4gICAgICAgICAgICBuZXh0OiBudWxsXG4gICAgICAgIH07XG5cbiAgICAgICAgaWYgKCFmbHVzaGluZykge1xuICAgICAgICAgICAgZmx1c2hpbmcgPSB0cnVlO1xuICAgICAgICAgICAgcmVxdWVzdFRpY2soKTtcbiAgICAgICAgfVxuICAgIH07XG5cbiAgICBpZiAodHlwZW9mIHByb2Nlc3MgPT09IFwib2JqZWN0XCIgJiZcbiAgICAgICAgcHJvY2Vzcy50b1N0cmluZygpID09PSBcIltvYmplY3QgcHJvY2Vzc11cIiAmJiBwcm9jZXNzLm5leHRUaWNrKSB7XG4gICAgICAgIC8vIEVuc3VyZSBRIGlzIGluIGEgcmVhbCBOb2RlIGVudmlyb25tZW50LCB3aXRoIGEgYHByb2Nlc3MubmV4dFRpY2tgLlxuICAgICAgICAvLyBUbyBzZWUgdGhyb3VnaCBmYWtlIE5vZGUgZW52aXJvbm1lbnRzOlxuICAgICAgICAvLyAqIE1vY2hhIHRlc3QgcnVubmVyIC0gZXhwb3NlcyBhIGBwcm9jZXNzYCBnbG9iYWwgd2l0aG91dCBhIGBuZXh0VGlja2BcbiAgICAgICAgLy8gKiBCcm93c2VyaWZ5IC0gZXhwb3NlcyBhIGBwcm9jZXNzLm5leFRpY2tgIGZ1bmN0aW9uIHRoYXQgdXNlc1xuICAgICAgICAvLyAgIGBzZXRUaW1lb3V0YC4gSW4gdGhpcyBjYXNlIGBzZXRJbW1lZGlhdGVgIGlzIHByZWZlcnJlZCBiZWNhdXNlXG4gICAgICAgIC8vICAgIGl0IGlzIGZhc3Rlci4gQnJvd3NlcmlmeSdzIGBwcm9jZXNzLnRvU3RyaW5nKClgIHlpZWxkc1xuICAgICAgICAvLyAgIFwiW29iamVjdCBPYmplY3RdXCIsIHdoaWxlIGluIGEgcmVhbCBOb2RlIGVudmlyb25tZW50XG4gICAgICAgIC8vICAgYHByb2Nlc3MubmV4dFRpY2soKWAgeWllbGRzIFwiW29iamVjdCBwcm9jZXNzXVwiLlxuICAgICAgICBpc05vZGVKUyA9IHRydWU7XG5cbiAgICAgICAgcmVxdWVzdFRpY2sgPSBmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgICBwcm9jZXNzLm5leHRUaWNrKGZsdXNoKTtcbiAgICAgICAgfTtcblxuICAgIH0gZWxzZSBpZiAodHlwZW9mIHNldEltbWVkaWF0ZSA9PT0gXCJmdW5jdGlvblwiKSB7XG4gICAgICAgIC8vIEluIElFMTAsIE5vZGUuanMgMC45Kywgb3IgaHR0cHM6Ly9naXRodWIuY29tL05vYmxlSlMvc2V0SW1tZWRpYXRlXG4gICAgICAgIGlmICh0eXBlb2Ygd2luZG93ICE9PSBcInVuZGVmaW5lZFwiKSB7XG4gICAgICAgICAgICByZXF1ZXN0VGljayA9IHNldEltbWVkaWF0ZS5iaW5kKHdpbmRvdywgZmx1c2gpO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgcmVxdWVzdFRpY2sgPSBmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgICAgICAgc2V0SW1tZWRpYXRlKGZsdXNoKTtcbiAgICAgICAgICAgIH07XG4gICAgICAgIH1cblxuICAgIH0gZWxzZSBpZiAodHlwZW9mIE1lc3NhZ2VDaGFubmVsICE9PSBcInVuZGVmaW5lZFwiKSB7XG4gICAgICAgIC8vIG1vZGVybiBicm93c2Vyc1xuICAgICAgICAvLyBodHRwOi8vd3d3Lm5vbmJsb2NraW5nLmlvLzIwMTEvMDYvd2luZG93bmV4dHRpY2suaHRtbFxuICAgICAgICB2YXIgY2hhbm5lbCA9IG5ldyBNZXNzYWdlQ2hhbm5lbCgpO1xuICAgICAgICAvLyBBdCBsZWFzdCBTYWZhcmkgVmVyc2lvbiA2LjAuNSAoODUzNi4zMC4xKSBpbnRlcm1pdHRlbnRseSBjYW5ub3QgY3JlYXRlXG4gICAgICAgIC8vIHdvcmtpbmcgbWVzc2FnZSBwb3J0cyB0aGUgZmlyc3QgdGltZSBhIHBhZ2UgbG9hZHMuXG4gICAgICAgIGNoYW5uZWwucG9ydDEub25tZXNzYWdlID0gZnVuY3Rpb24gKCkge1xuICAgICAgICAgICAgcmVxdWVzdFRpY2sgPSByZXF1ZXN0UG9ydFRpY2s7XG4gICAgICAgICAgICBjaGFubmVsLnBvcnQxLm9ubWVzc2FnZSA9IGZsdXNoO1xuICAgICAgICAgICAgZmx1c2goKTtcbiAgICAgICAgfTtcbiAgICAgICAgdmFyIHJlcXVlc3RQb3J0VGljayA9IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICAgIC8vIE9wZXJhIHJlcXVpcmVzIHVzIHRvIHByb3ZpZGUgYSBtZXNzYWdlIHBheWxvYWQsIHJlZ2FyZGxlc3Mgb2ZcbiAgICAgICAgICAgIC8vIHdoZXRoZXIgd2UgdXNlIGl0LlxuICAgICAgICAgICAgY2hhbm5lbC5wb3J0Mi5wb3N0TWVzc2FnZSgwKTtcbiAgICAgICAgfTtcbiAgICAgICAgcmVxdWVzdFRpY2sgPSBmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgICBzZXRUaW1lb3V0KGZsdXNoLCAwKTtcbiAgICAgICAgICAgIHJlcXVlc3RQb3J0VGljaygpO1xuICAgICAgICB9O1xuXG4gICAgfSBlbHNlIHtcbiAgICAgICAgLy8gb2xkIGJyb3dzZXJzXG4gICAgICAgIHJlcXVlc3RUaWNrID0gZnVuY3Rpb24gKCkge1xuICAgICAgICAgICAgc2V0VGltZW91dChmbHVzaCwgMCk7XG4gICAgICAgIH07XG4gICAgfVxuICAgIC8vIHJ1bnMgYSB0YXNrIGFmdGVyIGFsbCBvdGhlciB0YXNrcyBoYXZlIGJlZW4gcnVuXG4gICAgLy8gdGhpcyBpcyB1c2VmdWwgZm9yIHVuaGFuZGxlZCByZWplY3Rpb24gdHJhY2tpbmcgdGhhdCBuZWVkcyB0byBoYXBwZW5cbiAgICAvLyBhZnRlciBhbGwgYHRoZW5gZCB0YXNrcyBoYXZlIGJlZW4gcnVuLlxuICAgIG5leHRUaWNrLnJ1bkFmdGVyID0gZnVuY3Rpb24gKHRhc2spIHtcbiAgICAgICAgbGF0ZXJRdWV1ZS5wdXNoKHRhc2spO1xuICAgICAgICBpZiAoIWZsdXNoaW5nKSB7XG4gICAgICAgICAgICBmbHVzaGluZyA9IHRydWU7XG4gICAgICAgICAgICByZXF1ZXN0VGljaygpO1xuICAgICAgICB9XG4gICAgfTtcbiAgICByZXR1cm4gbmV4dFRpY2s7XG59KSgpO1xuXG4vLyBBdHRlbXB0IHRvIG1ha2UgZ2VuZXJpY3Mgc2FmZSBpbiB0aGUgZmFjZSBvZiBkb3duc3RyZWFtXG4vLyBtb2RpZmljYXRpb25zLlxuLy8gVGhlcmUgaXMgbm8gc2l0dWF0aW9uIHdoZXJlIHRoaXMgaXMgbmVjZXNzYXJ5LlxuLy8gSWYgeW91IG5lZWQgYSBzZWN1cml0eSBndWFyYW50ZWUsIHRoZXNlIHByaW1vcmRpYWxzIG5lZWQgdG8gYmVcbi8vIGRlZXBseSBmcm96ZW4gYW55d2F5LCBhbmQgaWYgeW91IGRvbuKAmXQgbmVlZCBhIHNlY3VyaXR5IGd1YXJhbnRlZSxcbi8vIHRoaXMgaXMganVzdCBwbGFpbiBwYXJhbm9pZC5cbi8vIEhvd2V2ZXIsIHRoaXMgKiptaWdodCoqIGhhdmUgdGhlIG5pY2Ugc2lkZS1lZmZlY3Qgb2YgcmVkdWNpbmcgdGhlIHNpemUgb2Zcbi8vIHRoZSBtaW5pZmllZCBjb2RlIGJ5IHJlZHVjaW5nIHguY2FsbCgpIHRvIG1lcmVseSB4KClcbi8vIFNlZSBNYXJrIE1pbGxlcuKAmXMgZXhwbGFuYXRpb24gb2Ygd2hhdCB0aGlzIGRvZXMuXG4vLyBodHRwOi8vd2lraS5lY21hc2NyaXB0Lm9yZy9kb2t1LnBocD9pZD1jb252ZW50aW9uczpzYWZlX21ldGFfcHJvZ3JhbW1pbmdcbnZhciBjYWxsID0gRnVuY3Rpb24uY2FsbDtcbmZ1bmN0aW9uIHVuY3VycnlUaGlzKGYpIHtcbiAgICByZXR1cm4gZnVuY3Rpb24gKCkge1xuICAgICAgICByZXR1cm4gY2FsbC5hcHBseShmLCBhcmd1bWVudHMpO1xuICAgIH07XG59XG4vLyBUaGlzIGlzIGVxdWl2YWxlbnQsIGJ1dCBzbG93ZXI6XG4vLyB1bmN1cnJ5VGhpcyA9IEZ1bmN0aW9uX2JpbmQuYmluZChGdW5jdGlvbl9iaW5kLmNhbGwpO1xuLy8gaHR0cDovL2pzcGVyZi5jb20vdW5jdXJyeXRoaXNcblxudmFyIGFycmF5X3NsaWNlID0gdW5jdXJyeVRoaXMoQXJyYXkucHJvdG90eXBlLnNsaWNlKTtcblxudmFyIGFycmF5X3JlZHVjZSA9IHVuY3VycnlUaGlzKFxuICAgIEFycmF5LnByb3RvdHlwZS5yZWR1Y2UgfHwgZnVuY3Rpb24gKGNhbGxiYWNrLCBiYXNpcykge1xuICAgICAgICB2YXIgaW5kZXggPSAwLFxuICAgICAgICAgICAgbGVuZ3RoID0gdGhpcy5sZW5ndGg7XG4gICAgICAgIC8vIGNvbmNlcm5pbmcgdGhlIGluaXRpYWwgdmFsdWUsIGlmIG9uZSBpcyBub3QgcHJvdmlkZWRcbiAgICAgICAgaWYgKGFyZ3VtZW50cy5sZW5ndGggPT09IDEpIHtcbiAgICAgICAgICAgIC8vIHNlZWsgdG8gdGhlIGZpcnN0IHZhbHVlIGluIHRoZSBhcnJheSwgYWNjb3VudGluZ1xuICAgICAgICAgICAgLy8gZm9yIHRoZSBwb3NzaWJpbGl0eSB0aGF0IGlzIGlzIGEgc3BhcnNlIGFycmF5XG4gICAgICAgICAgICBkbyB7XG4gICAgICAgICAgICAgICAgaWYgKGluZGV4IGluIHRoaXMpIHtcbiAgICAgICAgICAgICAgICAgICAgYmFzaXMgPSB0aGlzW2luZGV4KytdO1xuICAgICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgaWYgKCsraW5kZXggPj0gbGVuZ3RoKSB7XG4gICAgICAgICAgICAgICAgICAgIHRocm93IG5ldyBUeXBlRXJyb3IoKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9IHdoaWxlICgxKTtcbiAgICAgICAgfVxuICAgICAgICAvLyByZWR1Y2VcbiAgICAgICAgZm9yICg7IGluZGV4IDwgbGVuZ3RoOyBpbmRleCsrKSB7XG4gICAgICAgICAgICAvLyBhY2NvdW50IGZvciB0aGUgcG9zc2liaWxpdHkgdGhhdCB0aGUgYXJyYXkgaXMgc3BhcnNlXG4gICAgICAgICAgICBpZiAoaW5kZXggaW4gdGhpcykge1xuICAgICAgICAgICAgICAgIGJhc2lzID0gY2FsbGJhY2soYmFzaXMsIHRoaXNbaW5kZXhdLCBpbmRleCk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIGJhc2lzO1xuICAgIH1cbik7XG5cbnZhciBhcnJheV9pbmRleE9mID0gdW5jdXJyeVRoaXMoXG4gICAgQXJyYXkucHJvdG90eXBlLmluZGV4T2YgfHwgZnVuY3Rpb24gKHZhbHVlKSB7XG4gICAgICAgIC8vIG5vdCBhIHZlcnkgZ29vZCBzaGltLCBidXQgZ29vZCBlbm91Z2ggZm9yIG91ciBvbmUgdXNlIG9mIGl0XG4gICAgICAgIGZvciAodmFyIGkgPSAwOyBpIDwgdGhpcy5sZW5ndGg7IGkrKykge1xuICAgICAgICAgICAgaWYgKHRoaXNbaV0gPT09IHZhbHVlKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIGk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIC0xO1xuICAgIH1cbik7XG5cbnZhciBhcnJheV9tYXAgPSB1bmN1cnJ5VGhpcyhcbiAgICBBcnJheS5wcm90b3R5cGUubWFwIHx8IGZ1bmN0aW9uIChjYWxsYmFjaywgdGhpc3ApIHtcbiAgICAgICAgdmFyIHNlbGYgPSB0aGlzO1xuICAgICAgICB2YXIgY29sbGVjdCA9IFtdO1xuICAgICAgICBhcnJheV9yZWR1Y2Uoc2VsZiwgZnVuY3Rpb24gKHVuZGVmaW5lZCwgdmFsdWUsIGluZGV4KSB7XG4gICAgICAgICAgICBjb2xsZWN0LnB1c2goY2FsbGJhY2suY2FsbCh0aGlzcCwgdmFsdWUsIGluZGV4LCBzZWxmKSk7XG4gICAgICAgIH0sIHZvaWQgMCk7XG4gICAgICAgIHJldHVybiBjb2xsZWN0O1xuICAgIH1cbik7XG5cbnZhciBvYmplY3RfY3JlYXRlID0gT2JqZWN0LmNyZWF0ZSB8fCBmdW5jdGlvbiAocHJvdG90eXBlKSB7XG4gICAgZnVuY3Rpb24gVHlwZSgpIHsgfVxuICAgIFR5cGUucHJvdG90eXBlID0gcHJvdG90eXBlO1xuICAgIHJldHVybiBuZXcgVHlwZSgpO1xufTtcblxudmFyIG9iamVjdF9oYXNPd25Qcm9wZXJ0eSA9IHVuY3VycnlUaGlzKE9iamVjdC5wcm90b3R5cGUuaGFzT3duUHJvcGVydHkpO1xuXG52YXIgb2JqZWN0X2tleXMgPSBPYmplY3Qua2V5cyB8fCBmdW5jdGlvbiAob2JqZWN0KSB7XG4gICAgdmFyIGtleXMgPSBbXTtcbiAgICBmb3IgKHZhciBrZXkgaW4gb2JqZWN0KSB7XG4gICAgICAgIGlmIChvYmplY3RfaGFzT3duUHJvcGVydHkob2JqZWN0LCBrZXkpKSB7XG4gICAgICAgICAgICBrZXlzLnB1c2goa2V5KTtcbiAgICAgICAgfVxuICAgIH1cbiAgICByZXR1cm4ga2V5cztcbn07XG5cbnZhciBvYmplY3RfdG9TdHJpbmcgPSB1bmN1cnJ5VGhpcyhPYmplY3QucHJvdG90eXBlLnRvU3RyaW5nKTtcblxuZnVuY3Rpb24gaXNPYmplY3QodmFsdWUpIHtcbiAgICByZXR1cm4gdmFsdWUgPT09IE9iamVjdCh2YWx1ZSk7XG59XG5cbi8vIGdlbmVyYXRvciByZWxhdGVkIHNoaW1zXG5cbi8vIEZJWE1FOiBSZW1vdmUgdGhpcyBmdW5jdGlvbiBvbmNlIEVTNiBnZW5lcmF0b3JzIGFyZSBpbiBTcGlkZXJNb25rZXkuXG5mdW5jdGlvbiBpc1N0b3BJdGVyYXRpb24oZXhjZXB0aW9uKSB7XG4gICAgcmV0dXJuIChcbiAgICAgICAgb2JqZWN0X3RvU3RyaW5nKGV4Y2VwdGlvbikgPT09IFwiW29iamVjdCBTdG9wSXRlcmF0aW9uXVwiIHx8XG4gICAgICAgIGV4Y2VwdGlvbiBpbnN0YW5jZW9mIFFSZXR1cm5WYWx1ZVxuICAgICk7XG59XG5cbi8vIEZJWE1FOiBSZW1vdmUgdGhpcyBoZWxwZXIgYW5kIFEucmV0dXJuIG9uY2UgRVM2IGdlbmVyYXRvcnMgYXJlIGluXG4vLyBTcGlkZXJNb25rZXkuXG52YXIgUVJldHVyblZhbHVlO1xuaWYgKHR5cGVvZiBSZXR1cm5WYWx1ZSAhPT0gXCJ1bmRlZmluZWRcIikge1xuICAgIFFSZXR1cm5WYWx1ZSA9IFJldHVyblZhbHVlO1xufSBlbHNlIHtcbiAgICBRUmV0dXJuVmFsdWUgPSBmdW5jdGlvbiAodmFsdWUpIHtcbiAgICAgICAgdGhpcy52YWx1ZSA9IHZhbHVlO1xuICAgIH07XG59XG5cbi8vIGxvbmcgc3RhY2sgdHJhY2VzXG5cbnZhciBTVEFDS19KVU1QX1NFUEFSQVRPUiA9IFwiRnJvbSBwcmV2aW91cyBldmVudDpcIjtcblxuZnVuY3Rpb24gbWFrZVN0YWNrVHJhY2VMb25nKGVycm9yLCBwcm9taXNlKSB7XG4gICAgLy8gSWYgcG9zc2libGUsIHRyYW5zZm9ybSB0aGUgZXJyb3Igc3RhY2sgdHJhY2UgYnkgcmVtb3ZpbmcgTm9kZSBhbmQgUVxuICAgIC8vIGNydWZ0LCB0aGVuIGNvbmNhdGVuYXRpbmcgd2l0aCB0aGUgc3RhY2sgdHJhY2Ugb2YgYHByb21pc2VgLiBTZWUgIzU3LlxuICAgIGlmIChoYXNTdGFja3MgJiZcbiAgICAgICAgcHJvbWlzZS5zdGFjayAmJlxuICAgICAgICB0eXBlb2YgZXJyb3IgPT09IFwib2JqZWN0XCIgJiZcbiAgICAgICAgZXJyb3IgIT09IG51bGwgJiZcbiAgICAgICAgZXJyb3Iuc3RhY2sgJiZcbiAgICAgICAgZXJyb3Iuc3RhY2suaW5kZXhPZihTVEFDS19KVU1QX1NFUEFSQVRPUikgPT09IC0xXG4gICAgKSB7XG4gICAgICAgIHZhciBzdGFja3MgPSBbXTtcbiAgICAgICAgZm9yICh2YXIgcCA9IHByb21pc2U7ICEhcDsgcCA9IHAuc291cmNlKSB7XG4gICAgICAgICAgICBpZiAocC5zdGFjaykge1xuICAgICAgICAgICAgICAgIHN0YWNrcy51bnNoaWZ0KHAuc3RhY2spO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIHN0YWNrcy51bnNoaWZ0KGVycm9yLnN0YWNrKTtcblxuICAgICAgICB2YXIgY29uY2F0ZWRTdGFja3MgPSBzdGFja3Muam9pbihcIlxcblwiICsgU1RBQ0tfSlVNUF9TRVBBUkFUT1IgKyBcIlxcblwiKTtcbiAgICAgICAgZXJyb3Iuc3RhY2sgPSBmaWx0ZXJTdGFja1N0cmluZyhjb25jYXRlZFN0YWNrcyk7XG4gICAgfVxufVxuXG5mdW5jdGlvbiBmaWx0ZXJTdGFja1N0cmluZyhzdGFja1N0cmluZykge1xuICAgIHZhciBsaW5lcyA9IHN0YWNrU3RyaW5nLnNwbGl0KFwiXFxuXCIpO1xuICAgIHZhciBkZXNpcmVkTGluZXMgPSBbXTtcbiAgICBmb3IgKHZhciBpID0gMDsgaSA8IGxpbmVzLmxlbmd0aDsgKytpKSB7XG4gICAgICAgIHZhciBsaW5lID0gbGluZXNbaV07XG5cbiAgICAgICAgaWYgKCFpc0ludGVybmFsRnJhbWUobGluZSkgJiYgIWlzTm9kZUZyYW1lKGxpbmUpICYmIGxpbmUpIHtcbiAgICAgICAgICAgIGRlc2lyZWRMaW5lcy5wdXNoKGxpbmUpO1xuICAgICAgICB9XG4gICAgfVxuICAgIHJldHVybiBkZXNpcmVkTGluZXMuam9pbihcIlxcblwiKTtcbn1cblxuZnVuY3Rpb24gaXNOb2RlRnJhbWUoc3RhY2tMaW5lKSB7XG4gICAgcmV0dXJuIHN0YWNrTGluZS5pbmRleE9mKFwiKG1vZHVsZS5qczpcIikgIT09IC0xIHx8XG4gICAgICAgICAgIHN0YWNrTGluZS5pbmRleE9mKFwiKG5vZGUuanM6XCIpICE9PSAtMTtcbn1cblxuZnVuY3Rpb24gZ2V0RmlsZU5hbWVBbmRMaW5lTnVtYmVyKHN0YWNrTGluZSkge1xuICAgIC8vIE5hbWVkIGZ1bmN0aW9uczogXCJhdCBmdW5jdGlvbk5hbWUgKGZpbGVuYW1lOmxpbmVOdW1iZXI6Y29sdW1uTnVtYmVyKVwiXG4gICAgLy8gSW4gSUUxMCBmdW5jdGlvbiBuYW1lIGNhbiBoYXZlIHNwYWNlcyAoXCJBbm9ueW1vdXMgZnVuY3Rpb25cIikgT19vXG4gICAgdmFyIGF0dGVtcHQxID0gL2F0IC4rIFxcKCguKyk6KFxcZCspOig/OlxcZCspXFwpJC8uZXhlYyhzdGFja0xpbmUpO1xuICAgIGlmIChhdHRlbXB0MSkge1xuICAgICAgICByZXR1cm4gW2F0dGVtcHQxWzFdLCBOdW1iZXIoYXR0ZW1wdDFbMl0pXTtcbiAgICB9XG5cbiAgICAvLyBBbm9ueW1vdXMgZnVuY3Rpb25zOiBcImF0IGZpbGVuYW1lOmxpbmVOdW1iZXI6Y29sdW1uTnVtYmVyXCJcbiAgICB2YXIgYXR0ZW1wdDIgPSAvYXQgKFteIF0rKTooXFxkKyk6KD86XFxkKykkLy5leGVjKHN0YWNrTGluZSk7XG4gICAgaWYgKGF0dGVtcHQyKSB7XG4gICAgICAgIHJldHVybiBbYXR0ZW1wdDJbMV0sIE51bWJlcihhdHRlbXB0MlsyXSldO1xuICAgIH1cblxuICAgIC8vIEZpcmVmb3ggc3R5bGU6IFwiZnVuY3Rpb25AZmlsZW5hbWU6bGluZU51bWJlciBvciBAZmlsZW5hbWU6bGluZU51bWJlclwiXG4gICAgdmFyIGF0dGVtcHQzID0gLy4qQCguKyk6KFxcZCspJC8uZXhlYyhzdGFja0xpbmUpO1xuICAgIGlmIChhdHRlbXB0Mykge1xuICAgICAgICByZXR1cm4gW2F0dGVtcHQzWzFdLCBOdW1iZXIoYXR0ZW1wdDNbMl0pXTtcbiAgICB9XG59XG5cbmZ1bmN0aW9uIGlzSW50ZXJuYWxGcmFtZShzdGFja0xpbmUpIHtcbiAgICB2YXIgZmlsZU5hbWVBbmRMaW5lTnVtYmVyID0gZ2V0RmlsZU5hbWVBbmRMaW5lTnVtYmVyKHN0YWNrTGluZSk7XG5cbiAgICBpZiAoIWZpbGVOYW1lQW5kTGluZU51bWJlcikge1xuICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgfVxuXG4gICAgdmFyIGZpbGVOYW1lID0gZmlsZU5hbWVBbmRMaW5lTnVtYmVyWzBdO1xuICAgIHZhciBsaW5lTnVtYmVyID0gZmlsZU5hbWVBbmRMaW5lTnVtYmVyWzFdO1xuXG4gICAgcmV0dXJuIGZpbGVOYW1lID09PSBxRmlsZU5hbWUgJiZcbiAgICAgICAgbGluZU51bWJlciA+PSBxU3RhcnRpbmdMaW5lICYmXG4gICAgICAgIGxpbmVOdW1iZXIgPD0gcUVuZGluZ0xpbmU7XG59XG5cbi8vIGRpc2NvdmVyIG93biBmaWxlIG5hbWUgYW5kIGxpbmUgbnVtYmVyIHJhbmdlIGZvciBmaWx0ZXJpbmcgc3RhY2tcbi8vIHRyYWNlc1xuZnVuY3Rpb24gY2FwdHVyZUxpbmUoKSB7XG4gICAgaWYgKCFoYXNTdGFja3MpIHtcbiAgICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIHRyeSB7XG4gICAgICAgIHRocm93IG5ldyBFcnJvcigpO1xuICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAgICAgdmFyIGxpbmVzID0gZS5zdGFjay5zcGxpdChcIlxcblwiKTtcbiAgICAgICAgdmFyIGZpcnN0TGluZSA9IGxpbmVzWzBdLmluZGV4T2YoXCJAXCIpID4gMCA/IGxpbmVzWzFdIDogbGluZXNbMl07XG4gICAgICAgIHZhciBmaWxlTmFtZUFuZExpbmVOdW1iZXIgPSBnZXRGaWxlTmFtZUFuZExpbmVOdW1iZXIoZmlyc3RMaW5lKTtcbiAgICAgICAgaWYgKCFmaWxlTmFtZUFuZExpbmVOdW1iZXIpIHtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuXG4gICAgICAgIHFGaWxlTmFtZSA9IGZpbGVOYW1lQW5kTGluZU51bWJlclswXTtcbiAgICAgICAgcmV0dXJuIGZpbGVOYW1lQW5kTGluZU51bWJlclsxXTtcbiAgICB9XG59XG5cbmZ1bmN0aW9uIGRlcHJlY2F0ZShjYWxsYmFjaywgbmFtZSwgYWx0ZXJuYXRpdmUpIHtcbiAgICByZXR1cm4gZnVuY3Rpb24gKCkge1xuICAgICAgICBpZiAodHlwZW9mIGNvbnNvbGUgIT09IFwidW5kZWZpbmVkXCIgJiZcbiAgICAgICAgICAgIHR5cGVvZiBjb25zb2xlLndhcm4gPT09IFwiZnVuY3Rpb25cIikge1xuICAgICAgICAgICAgY29uc29sZS53YXJuKG5hbWUgKyBcIiBpcyBkZXByZWNhdGVkLCB1c2UgXCIgKyBhbHRlcm5hdGl2ZSArXG4gICAgICAgICAgICAgICAgICAgICAgICAgXCIgaW5zdGVhZC5cIiwgbmV3IEVycm9yKFwiXCIpLnN0YWNrKTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gY2FsbGJhY2suYXBwbHkoY2FsbGJhY2ssIGFyZ3VtZW50cyk7XG4gICAgfTtcbn1cblxuLy8gZW5kIG9mIHNoaW1zXG4vLyBiZWdpbm5pbmcgb2YgcmVhbCB3b3JrXG5cbi8qKlxuICogQ29uc3RydWN0cyBhIHByb21pc2UgZm9yIGFuIGltbWVkaWF0ZSByZWZlcmVuY2UsIHBhc3NlcyBwcm9taXNlcyB0aHJvdWdoLCBvclxuICogY29lcmNlcyBwcm9taXNlcyBmcm9tIGRpZmZlcmVudCBzeXN0ZW1zLlxuICogQHBhcmFtIHZhbHVlIGltbWVkaWF0ZSByZWZlcmVuY2Ugb3IgcHJvbWlzZVxuICovXG5mdW5jdGlvbiBRKHZhbHVlKSB7XG4gICAgLy8gSWYgdGhlIG9iamVjdCBpcyBhbHJlYWR5IGEgUHJvbWlzZSwgcmV0dXJuIGl0IGRpcmVjdGx5LiAgVGhpcyBlbmFibGVzXG4gICAgLy8gdGhlIHJlc29sdmUgZnVuY3Rpb24gdG8gYm90aCBiZSB1c2VkIHRvIGNyZWF0ZWQgcmVmZXJlbmNlcyBmcm9tIG9iamVjdHMsXG4gICAgLy8gYnV0IHRvIHRvbGVyYWJseSBjb2VyY2Ugbm9uLXByb21pc2VzIHRvIHByb21pc2VzLlxuICAgIGlmICh2YWx1ZSBpbnN0YW5jZW9mIFByb21pc2UpIHtcbiAgICAgICAgcmV0dXJuIHZhbHVlO1xuICAgIH1cblxuICAgIC8vIGFzc2ltaWxhdGUgdGhlbmFibGVzXG4gICAgaWYgKGlzUHJvbWlzZUFsaWtlKHZhbHVlKSkge1xuICAgICAgICByZXR1cm4gY29lcmNlKHZhbHVlKTtcbiAgICB9IGVsc2Uge1xuICAgICAgICByZXR1cm4gZnVsZmlsbCh2YWx1ZSk7XG4gICAgfVxufVxuUS5yZXNvbHZlID0gUTtcblxuLyoqXG4gKiBQZXJmb3JtcyBhIHRhc2sgaW4gYSBmdXR1cmUgdHVybiBvZiB0aGUgZXZlbnQgbG9vcC5cbiAqIEBwYXJhbSB7RnVuY3Rpb259IHRhc2tcbiAqL1xuUS5uZXh0VGljayA9IG5leHRUaWNrO1xuXG4vKipcbiAqIENvbnRyb2xzIHdoZXRoZXIgb3Igbm90IGxvbmcgc3RhY2sgdHJhY2VzIHdpbGwgYmUgb25cbiAqL1xuUS5sb25nU3RhY2tTdXBwb3J0ID0gZmFsc2U7XG5cbi8vIGVuYWJsZSBsb25nIHN0YWNrcyBpZiBRX0RFQlVHIGlzIHNldFxuaWYgKHR5cGVvZiBwcm9jZXNzID09PSBcIm9iamVjdFwiICYmIHByb2Nlc3MgJiYgcHJvY2Vzcy5lbnYgJiYgcHJvY2Vzcy5lbnYuUV9ERUJVRykge1xuICAgIFEubG9uZ1N0YWNrU3VwcG9ydCA9IHRydWU7XG59XG5cbi8qKlxuICogQ29uc3RydWN0cyBhIHtwcm9taXNlLCByZXNvbHZlLCByZWplY3R9IG9iamVjdC5cbiAqXG4gKiBgcmVzb2x2ZWAgaXMgYSBjYWxsYmFjayB0byBpbnZva2Ugd2l0aCBhIG1vcmUgcmVzb2x2ZWQgdmFsdWUgZm9yIHRoZVxuICogcHJvbWlzZS4gVG8gZnVsZmlsbCB0aGUgcHJvbWlzZSwgaW52b2tlIGByZXNvbHZlYCB3aXRoIGFueSB2YWx1ZSB0aGF0IGlzXG4gKiBub3QgYSB0aGVuYWJsZS4gVG8gcmVqZWN0IHRoZSBwcm9taXNlLCBpbnZva2UgYHJlc29sdmVgIHdpdGggYSByZWplY3RlZFxuICogdGhlbmFibGUsIG9yIGludm9rZSBgcmVqZWN0YCB3aXRoIHRoZSByZWFzb24gZGlyZWN0bHkuIFRvIHJlc29sdmUgdGhlXG4gKiBwcm9taXNlIHRvIGFub3RoZXIgdGhlbmFibGUsIHRodXMgcHV0dGluZyBpdCBpbiB0aGUgc2FtZSBzdGF0ZSwgaW52b2tlXG4gKiBgcmVzb2x2ZWAgd2l0aCB0aGF0IG90aGVyIHRoZW5hYmxlLlxuICovXG5RLmRlZmVyID0gZGVmZXI7XG5mdW5jdGlvbiBkZWZlcigpIHtcbiAgICAvLyBpZiBcIm1lc3NhZ2VzXCIgaXMgYW4gXCJBcnJheVwiLCB0aGF0IGluZGljYXRlcyB0aGF0IHRoZSBwcm9taXNlIGhhcyBub3QgeWV0XG4gICAgLy8gYmVlbiByZXNvbHZlZC4gIElmIGl0IGlzIFwidW5kZWZpbmVkXCIsIGl0IGhhcyBiZWVuIHJlc29sdmVkLiAgRWFjaFxuICAgIC8vIGVsZW1lbnQgb2YgdGhlIG1lc3NhZ2VzIGFycmF5IGlzIGl0c2VsZiBhbiBhcnJheSBvZiBjb21wbGV0ZSBhcmd1bWVudHMgdG9cbiAgICAvLyBmb3J3YXJkIHRvIHRoZSByZXNvbHZlZCBwcm9taXNlLiAgV2UgY29lcmNlIHRoZSByZXNvbHV0aW9uIHZhbHVlIHRvIGFcbiAgICAvLyBwcm9taXNlIHVzaW5nIHRoZSBgcmVzb2x2ZWAgZnVuY3Rpb24gYmVjYXVzZSBpdCBoYW5kbGVzIGJvdGggZnVsbHlcbiAgICAvLyBub24tdGhlbmFibGUgdmFsdWVzIGFuZCBvdGhlciB0aGVuYWJsZXMgZ3JhY2VmdWxseS5cbiAgICB2YXIgbWVzc2FnZXMgPSBbXSwgcHJvZ3Jlc3NMaXN0ZW5lcnMgPSBbXSwgcmVzb2x2ZWRQcm9taXNlO1xuXG4gICAgdmFyIGRlZmVycmVkID0gb2JqZWN0X2NyZWF0ZShkZWZlci5wcm90b3R5cGUpO1xuICAgIHZhciBwcm9taXNlID0gb2JqZWN0X2NyZWF0ZShQcm9taXNlLnByb3RvdHlwZSk7XG5cbiAgICBwcm9taXNlLnByb21pc2VEaXNwYXRjaCA9IGZ1bmN0aW9uIChyZXNvbHZlLCBvcCwgb3BlcmFuZHMpIHtcbiAgICAgICAgdmFyIGFyZ3MgPSBhcnJheV9zbGljZShhcmd1bWVudHMpO1xuICAgICAgICBpZiAobWVzc2FnZXMpIHtcbiAgICAgICAgICAgIG1lc3NhZ2VzLnB1c2goYXJncyk7XG4gICAgICAgICAgICBpZiAob3AgPT09IFwid2hlblwiICYmIG9wZXJhbmRzWzFdKSB7IC8vIHByb2dyZXNzIG9wZXJhbmRcbiAgICAgICAgICAgICAgICBwcm9ncmVzc0xpc3RlbmVycy5wdXNoKG9wZXJhbmRzWzFdKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIFEubmV4dFRpY2soZnVuY3Rpb24gKCkge1xuICAgICAgICAgICAgICAgIHJlc29sdmVkUHJvbWlzZS5wcm9taXNlRGlzcGF0Y2guYXBwbHkocmVzb2x2ZWRQcm9taXNlLCBhcmdzKTtcbiAgICAgICAgICAgIH0pO1xuICAgICAgICB9XG4gICAgfTtcblxuICAgIC8vIFhYWCBkZXByZWNhdGVkXG4gICAgcHJvbWlzZS52YWx1ZU9mID0gZnVuY3Rpb24gKCkge1xuICAgICAgICBpZiAobWVzc2FnZXMpIHtcbiAgICAgICAgICAgIHJldHVybiBwcm9taXNlO1xuICAgICAgICB9XG4gICAgICAgIHZhciBuZWFyZXJWYWx1ZSA9IG5lYXJlcihyZXNvbHZlZFByb21pc2UpO1xuICAgICAgICBpZiAoaXNQcm9taXNlKG5lYXJlclZhbHVlKSkge1xuICAgICAgICAgICAgcmVzb2x2ZWRQcm9taXNlID0gbmVhcmVyVmFsdWU7IC8vIHNob3J0ZW4gY2hhaW5cbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gbmVhcmVyVmFsdWU7XG4gICAgfTtcblxuICAgIHByb21pc2UuaW5zcGVjdCA9IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgaWYgKCFyZXNvbHZlZFByb21pc2UpIHtcbiAgICAgICAgICAgIHJldHVybiB7IHN0YXRlOiBcInBlbmRpbmdcIiB9O1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiByZXNvbHZlZFByb21pc2UuaW5zcGVjdCgpO1xuICAgIH07XG5cbiAgICBpZiAoUS5sb25nU3RhY2tTdXBwb3J0ICYmIGhhc1N0YWNrcykge1xuICAgICAgICB0cnkge1xuICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKCk7XG4gICAgICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAgICAgICAgIC8vIE5PVEU6IGRvbid0IHRyeSB0byB1c2UgYEVycm9yLmNhcHR1cmVTdGFja1RyYWNlYCBvciB0cmFuc2ZlciB0aGVcbiAgICAgICAgICAgIC8vIGFjY2Vzc29yIGFyb3VuZDsgdGhhdCBjYXVzZXMgbWVtb3J5IGxlYWtzIGFzIHBlciBHSC0xMTEuIEp1c3RcbiAgICAgICAgICAgIC8vIHJlaWZ5IHRoZSBzdGFjayB0cmFjZSBhcyBhIHN0cmluZyBBU0FQLlxuICAgICAgICAgICAgLy9cbiAgICAgICAgICAgIC8vIEF0IHRoZSBzYW1lIHRpbWUsIGN1dCBvZmYgdGhlIGZpcnN0IGxpbmU7IGl0J3MgYWx3YXlzIGp1c3RcbiAgICAgICAgICAgIC8vIFwiW29iamVjdCBQcm9taXNlXVxcblwiLCBhcyBwZXIgdGhlIGB0b1N0cmluZ2AuXG4gICAgICAgICAgICBwcm9taXNlLnN0YWNrID0gZS5zdGFjay5zdWJzdHJpbmcoZS5zdGFjay5pbmRleE9mKFwiXFxuXCIpICsgMSk7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICAvLyBOT1RFOiB3ZSBkbyB0aGUgY2hlY2tzIGZvciBgcmVzb2x2ZWRQcm9taXNlYCBpbiBlYWNoIG1ldGhvZCwgaW5zdGVhZCBvZlxuICAgIC8vIGNvbnNvbGlkYXRpbmcgdGhlbSBpbnRvIGBiZWNvbWVgLCBzaW5jZSBvdGhlcndpc2Ugd2UnZCBjcmVhdGUgbmV3XG4gICAgLy8gcHJvbWlzZXMgd2l0aCB0aGUgbGluZXMgYGJlY29tZSh3aGF0ZXZlcih2YWx1ZSkpYC4gU2VlIGUuZy4gR0gtMjUyLlxuXG4gICAgZnVuY3Rpb24gYmVjb21lKG5ld1Byb21pc2UpIHtcbiAgICAgICAgcmVzb2x2ZWRQcm9taXNlID0gbmV3UHJvbWlzZTtcbiAgICAgICAgcHJvbWlzZS5zb3VyY2UgPSBuZXdQcm9taXNlO1xuXG4gICAgICAgIGFycmF5X3JlZHVjZShtZXNzYWdlcywgZnVuY3Rpb24gKHVuZGVmaW5lZCwgbWVzc2FnZSkge1xuICAgICAgICAgICAgUS5uZXh0VGljayhmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgICAgICAgbmV3UHJvbWlzZS5wcm9taXNlRGlzcGF0Y2guYXBwbHkobmV3UHJvbWlzZSwgbWVzc2FnZSk7XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgfSwgdm9pZCAwKTtcblxuICAgICAgICBtZXNzYWdlcyA9IHZvaWQgMDtcbiAgICAgICAgcHJvZ3Jlc3NMaXN0ZW5lcnMgPSB2b2lkIDA7XG4gICAgfVxuXG4gICAgZGVmZXJyZWQucHJvbWlzZSA9IHByb21pc2U7XG4gICAgZGVmZXJyZWQucmVzb2x2ZSA9IGZ1bmN0aW9uICh2YWx1ZSkge1xuICAgICAgICBpZiAocmVzb2x2ZWRQcm9taXNlKSB7XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cblxuICAgICAgICBiZWNvbWUoUSh2YWx1ZSkpO1xuICAgIH07XG5cbiAgICBkZWZlcnJlZC5mdWxmaWxsID0gZnVuY3Rpb24gKHZhbHVlKSB7XG4gICAgICAgIGlmIChyZXNvbHZlZFByb21pc2UpIHtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuXG4gICAgICAgIGJlY29tZShmdWxmaWxsKHZhbHVlKSk7XG4gICAgfTtcbiAgICBkZWZlcnJlZC5yZWplY3QgPSBmdW5jdGlvbiAocmVhc29uKSB7XG4gICAgICAgIGlmIChyZXNvbHZlZFByb21pc2UpIHtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuXG4gICAgICAgIGJlY29tZShyZWplY3QocmVhc29uKSk7XG4gICAgfTtcbiAgICBkZWZlcnJlZC5ub3RpZnkgPSBmdW5jdGlvbiAocHJvZ3Jlc3MpIHtcbiAgICAgICAgaWYgKHJlc29sdmVkUHJvbWlzZSkge1xuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG5cbiAgICAgICAgYXJyYXlfcmVkdWNlKHByb2dyZXNzTGlzdGVuZXJzLCBmdW5jdGlvbiAodW5kZWZpbmVkLCBwcm9ncmVzc0xpc3RlbmVyKSB7XG4gICAgICAgICAgICBRLm5leHRUaWNrKGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICAgICAgICBwcm9ncmVzc0xpc3RlbmVyKHByb2dyZXNzKTtcbiAgICAgICAgICAgIH0pO1xuICAgICAgICB9LCB2b2lkIDApO1xuICAgIH07XG5cbiAgICByZXR1cm4gZGVmZXJyZWQ7XG59XG5cbi8qKlxuICogQ3JlYXRlcyBhIE5vZGUtc3R5bGUgY2FsbGJhY2sgdGhhdCB3aWxsIHJlc29sdmUgb3IgcmVqZWN0IHRoZSBkZWZlcnJlZFxuICogcHJvbWlzZS5cbiAqIEByZXR1cm5zIGEgbm9kZWJhY2tcbiAqL1xuZGVmZXIucHJvdG90eXBlLm1ha2VOb2RlUmVzb2x2ZXIgPSBmdW5jdGlvbiAoKSB7XG4gICAgdmFyIHNlbGYgPSB0aGlzO1xuICAgIHJldHVybiBmdW5jdGlvbiAoZXJyb3IsIHZhbHVlKSB7XG4gICAgICAgIGlmIChlcnJvcikge1xuICAgICAgICAgICAgc2VsZi5yZWplY3QoZXJyb3IpO1xuICAgICAgICB9IGVsc2UgaWYgKGFyZ3VtZW50cy5sZW5ndGggPiAyKSB7XG4gICAgICAgICAgICBzZWxmLnJlc29sdmUoYXJyYXlfc2xpY2UoYXJndW1lbnRzLCAxKSk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICBzZWxmLnJlc29sdmUodmFsdWUpO1xuICAgICAgICB9XG4gICAgfTtcbn07XG5cbi8qKlxuICogQHBhcmFtIHJlc29sdmVyIHtGdW5jdGlvbn0gYSBmdW5jdGlvbiB0aGF0IHJldHVybnMgbm90aGluZyBhbmQgYWNjZXB0c1xuICogdGhlIHJlc29sdmUsIHJlamVjdCwgYW5kIG5vdGlmeSBmdW5jdGlvbnMgZm9yIGEgZGVmZXJyZWQuXG4gKiBAcmV0dXJucyBhIHByb21pc2UgdGhhdCBtYXkgYmUgcmVzb2x2ZWQgd2l0aCB0aGUgZ2l2ZW4gcmVzb2x2ZSBhbmQgcmVqZWN0XG4gKiBmdW5jdGlvbnMsIG9yIHJlamVjdGVkIGJ5IGEgdGhyb3duIGV4Y2VwdGlvbiBpbiByZXNvbHZlclxuICovXG5RLlByb21pc2UgPSBwcm9taXNlOyAvLyBFUzZcblEucHJvbWlzZSA9IHByb21pc2U7XG5mdW5jdGlvbiBwcm9taXNlKHJlc29sdmVyKSB7XG4gICAgaWYgKHR5cGVvZiByZXNvbHZlciAhPT0gXCJmdW5jdGlvblwiKSB7XG4gICAgICAgIHRocm93IG5ldyBUeXBlRXJyb3IoXCJyZXNvbHZlciBtdXN0IGJlIGEgZnVuY3Rpb24uXCIpO1xuICAgIH1cbiAgICB2YXIgZGVmZXJyZWQgPSBkZWZlcigpO1xuICAgIHRyeSB7XG4gICAgICAgIHJlc29sdmVyKGRlZmVycmVkLnJlc29sdmUsIGRlZmVycmVkLnJlamVjdCwgZGVmZXJyZWQubm90aWZ5KTtcbiAgICB9IGNhdGNoIChyZWFzb24pIHtcbiAgICAgICAgZGVmZXJyZWQucmVqZWN0KHJlYXNvbik7XG4gICAgfVxuICAgIHJldHVybiBkZWZlcnJlZC5wcm9taXNlO1xufVxuXG5wcm9taXNlLnJhY2UgPSByYWNlOyAvLyBFUzZcbnByb21pc2UuYWxsID0gYWxsOyAvLyBFUzZcbnByb21pc2UucmVqZWN0ID0gcmVqZWN0OyAvLyBFUzZcbnByb21pc2UucmVzb2x2ZSA9IFE7IC8vIEVTNlxuXG4vLyBYWFggZXhwZXJpbWVudGFsLiAgVGhpcyBtZXRob2QgaXMgYSB3YXkgdG8gZGVub3RlIHRoYXQgYSBsb2NhbCB2YWx1ZSBpc1xuLy8gc2VyaWFsaXphYmxlIGFuZCBzaG91bGQgYmUgaW1tZWRpYXRlbHkgZGlzcGF0Y2hlZCB0byBhIHJlbW90ZSB1cG9uIHJlcXVlc3QsXG4vLyBpbnN0ZWFkIG9mIHBhc3NpbmcgYSByZWZlcmVuY2UuXG5RLnBhc3NCeUNvcHkgPSBmdW5jdGlvbiAob2JqZWN0KSB7XG4gICAgLy9mcmVlemUob2JqZWN0KTtcbiAgICAvL3Bhc3NCeUNvcGllcy5zZXQob2JqZWN0LCB0cnVlKTtcbiAgICByZXR1cm4gb2JqZWN0O1xufTtcblxuUHJvbWlzZS5wcm90b3R5cGUucGFzc0J5Q29weSA9IGZ1bmN0aW9uICgpIHtcbiAgICAvL2ZyZWV6ZShvYmplY3QpO1xuICAgIC8vcGFzc0J5Q29waWVzLnNldChvYmplY3QsIHRydWUpO1xuICAgIHJldHVybiB0aGlzO1xufTtcblxuLyoqXG4gKiBJZiB0d28gcHJvbWlzZXMgZXZlbnR1YWxseSBmdWxmaWxsIHRvIHRoZSBzYW1lIHZhbHVlLCBwcm9taXNlcyB0aGF0IHZhbHVlLFxuICogYnV0IG90aGVyd2lzZSByZWplY3RzLlxuICogQHBhcmFtIHgge0FueSp9XG4gKiBAcGFyYW0geSB7QW55Kn1cbiAqIEByZXR1cm5zIHtBbnkqfSBhIHByb21pc2UgZm9yIHggYW5kIHkgaWYgdGhleSBhcmUgdGhlIHNhbWUsIGJ1dCBhIHJlamVjdGlvblxuICogb3RoZXJ3aXNlLlxuICpcbiAqL1xuUS5qb2luID0gZnVuY3Rpb24gKHgsIHkpIHtcbiAgICByZXR1cm4gUSh4KS5qb2luKHkpO1xufTtcblxuUHJvbWlzZS5wcm90b3R5cGUuam9pbiA9IGZ1bmN0aW9uICh0aGF0KSB7XG4gICAgcmV0dXJuIFEoW3RoaXMsIHRoYXRdKS5zcHJlYWQoZnVuY3Rpb24gKHgsIHkpIHtcbiAgICAgICAgaWYgKHggPT09IHkpIHtcbiAgICAgICAgICAgIC8vIFRPRE86IFwiPT09XCIgc2hvdWxkIGJlIE9iamVjdC5pcyBvciBlcXVpdlxuICAgICAgICAgICAgcmV0dXJuIHg7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoXCJDYW4ndCBqb2luOiBub3QgdGhlIHNhbWU6IFwiICsgeCArIFwiIFwiICsgeSk7XG4gICAgICAgIH1cbiAgICB9KTtcbn07XG5cbi8qKlxuICogUmV0dXJucyBhIHByb21pc2UgZm9yIHRoZSBmaXJzdCBvZiBhbiBhcnJheSBvZiBwcm9taXNlcyB0byBiZWNvbWUgc2V0dGxlZC5cbiAqIEBwYXJhbSBhbnN3ZXJzIHtBcnJheVtBbnkqXX0gcHJvbWlzZXMgdG8gcmFjZVxuICogQHJldHVybnMge0FueSp9IHRoZSBmaXJzdCBwcm9taXNlIHRvIGJlIHNldHRsZWRcbiAqL1xuUS5yYWNlID0gcmFjZTtcbmZ1bmN0aW9uIHJhY2UoYW5zd2VyUHMpIHtcbiAgICByZXR1cm4gcHJvbWlzZShmdW5jdGlvbiAocmVzb2x2ZSwgcmVqZWN0KSB7XG4gICAgICAgIC8vIFN3aXRjaCB0byB0aGlzIG9uY2Ugd2UgY2FuIGFzc3VtZSBhdCBsZWFzdCBFUzVcbiAgICAgICAgLy8gYW5zd2VyUHMuZm9yRWFjaChmdW5jdGlvbiAoYW5zd2VyUCkge1xuICAgICAgICAvLyAgICAgUShhbnN3ZXJQKS50aGVuKHJlc29sdmUsIHJlamVjdCk7XG4gICAgICAgIC8vIH0pO1xuICAgICAgICAvLyBVc2UgdGhpcyBpbiB0aGUgbWVhbnRpbWVcbiAgICAgICAgZm9yICh2YXIgaSA9IDAsIGxlbiA9IGFuc3dlclBzLmxlbmd0aDsgaSA8IGxlbjsgaSsrKSB7XG4gICAgICAgICAgICBRKGFuc3dlclBzW2ldKS50aGVuKHJlc29sdmUsIHJlamVjdCk7XG4gICAgICAgIH1cbiAgICB9KTtcbn1cblxuUHJvbWlzZS5wcm90b3R5cGUucmFjZSA9IGZ1bmN0aW9uICgpIHtcbiAgICByZXR1cm4gdGhpcy50aGVuKFEucmFjZSk7XG59O1xuXG4vKipcbiAqIENvbnN0cnVjdHMgYSBQcm9taXNlIHdpdGggYSBwcm9taXNlIGRlc2NyaXB0b3Igb2JqZWN0IGFuZCBvcHRpb25hbCBmYWxsYmFja1xuICogZnVuY3Rpb24uICBUaGUgZGVzY3JpcHRvciBjb250YWlucyBtZXRob2RzIGxpa2Ugd2hlbihyZWplY3RlZCksIGdldChuYW1lKSxcbiAqIHNldChuYW1lLCB2YWx1ZSksIHBvc3QobmFtZSwgYXJncyksIGFuZCBkZWxldGUobmFtZSksIHdoaWNoIGFsbFxuICogcmV0dXJuIGVpdGhlciBhIHZhbHVlLCBhIHByb21pc2UgZm9yIGEgdmFsdWUsIG9yIGEgcmVqZWN0aW9uLiAgVGhlIGZhbGxiYWNrXG4gKiBhY2NlcHRzIHRoZSBvcGVyYXRpb24gbmFtZSwgYSByZXNvbHZlciwgYW5kIGFueSBmdXJ0aGVyIGFyZ3VtZW50cyB0aGF0IHdvdWxkXG4gKiBoYXZlIGJlZW4gZm9yd2FyZGVkIHRvIHRoZSBhcHByb3ByaWF0ZSBtZXRob2QgYWJvdmUgaGFkIGEgbWV0aG9kIGJlZW5cbiAqIHByb3ZpZGVkIHdpdGggdGhlIHByb3BlciBuYW1lLiAgVGhlIEFQSSBtYWtlcyBubyBndWFyYW50ZWVzIGFib3V0IHRoZSBuYXR1cmVcbiAqIG9mIHRoZSByZXR1cm5lZCBvYmplY3QsIGFwYXJ0IGZyb20gdGhhdCBpdCBpcyB1c2FibGUgd2hlcmVldmVyIHByb21pc2VzIGFyZVxuICogYm91Z2h0IGFuZCBzb2xkLlxuICovXG5RLm1ha2VQcm9taXNlID0gUHJvbWlzZTtcbmZ1bmN0aW9uIFByb21pc2UoZGVzY3JpcHRvciwgZmFsbGJhY2ssIGluc3BlY3QpIHtcbiAgICBpZiAoZmFsbGJhY2sgPT09IHZvaWQgMCkge1xuICAgICAgICBmYWxsYmFjayA9IGZ1bmN0aW9uIChvcCkge1xuICAgICAgICAgICAgcmV0dXJuIHJlamVjdChuZXcgRXJyb3IoXG4gICAgICAgICAgICAgICAgXCJQcm9taXNlIGRvZXMgbm90IHN1cHBvcnQgb3BlcmF0aW9uOiBcIiArIG9wXG4gICAgICAgICAgICApKTtcbiAgICAgICAgfTtcbiAgICB9XG4gICAgaWYgKGluc3BlY3QgPT09IHZvaWQgMCkge1xuICAgICAgICBpbnNwZWN0ID0gZnVuY3Rpb24gKCkge1xuICAgICAgICAgICAgcmV0dXJuIHtzdGF0ZTogXCJ1bmtub3duXCJ9O1xuICAgICAgICB9O1xuICAgIH1cblxuICAgIHZhciBwcm9taXNlID0gb2JqZWN0X2NyZWF0ZShQcm9taXNlLnByb3RvdHlwZSk7XG5cbiAgICBwcm9taXNlLnByb21pc2VEaXNwYXRjaCA9IGZ1bmN0aW9uIChyZXNvbHZlLCBvcCwgYXJncykge1xuICAgICAgICB2YXIgcmVzdWx0O1xuICAgICAgICB0cnkge1xuICAgICAgICAgICAgaWYgKGRlc2NyaXB0b3Jbb3BdKSB7XG4gICAgICAgICAgICAgICAgcmVzdWx0ID0gZGVzY3JpcHRvcltvcF0uYXBwbHkocHJvbWlzZSwgYXJncyk7XG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgIHJlc3VsdCA9IGZhbGxiYWNrLmNhbGwocHJvbWlzZSwgb3AsIGFyZ3MpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9IGNhdGNoIChleGNlcHRpb24pIHtcbiAgICAgICAgICAgIHJlc3VsdCA9IHJlamVjdChleGNlcHRpb24pO1xuICAgICAgICB9XG4gICAgICAgIGlmIChyZXNvbHZlKSB7XG4gICAgICAgICAgICByZXNvbHZlKHJlc3VsdCk7XG4gICAgICAgIH1cbiAgICB9O1xuXG4gICAgcHJvbWlzZS5pbnNwZWN0ID0gaW5zcGVjdDtcblxuICAgIC8vIFhYWCBkZXByZWNhdGVkIGB2YWx1ZU9mYCBhbmQgYGV4Y2VwdGlvbmAgc3VwcG9ydFxuICAgIGlmIChpbnNwZWN0KSB7XG4gICAgICAgIHZhciBpbnNwZWN0ZWQgPSBpbnNwZWN0KCk7XG4gICAgICAgIGlmIChpbnNwZWN0ZWQuc3RhdGUgPT09IFwicmVqZWN0ZWRcIikge1xuICAgICAgICAgICAgcHJvbWlzZS5leGNlcHRpb24gPSBpbnNwZWN0ZWQucmVhc29uO1xuICAgICAgICB9XG5cbiAgICAgICAgcHJvbWlzZS52YWx1ZU9mID0gZnVuY3Rpb24gKCkge1xuICAgICAgICAgICAgdmFyIGluc3BlY3RlZCA9IGluc3BlY3QoKTtcbiAgICAgICAgICAgIGlmIChpbnNwZWN0ZWQuc3RhdGUgPT09IFwicGVuZGluZ1wiIHx8XG4gICAgICAgICAgICAgICAgaW5zcGVjdGVkLnN0YXRlID09PSBcInJlamVjdGVkXCIpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gcHJvbWlzZTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHJldHVybiBpbnNwZWN0ZWQudmFsdWU7XG4gICAgICAgIH07XG4gICAgfVxuXG4gICAgcmV0dXJuIHByb21pc2U7XG59XG5cblByb21pc2UucHJvdG90eXBlLnRvU3RyaW5nID0gZnVuY3Rpb24gKCkge1xuICAgIHJldHVybiBcIltvYmplY3QgUHJvbWlzZV1cIjtcbn07XG5cblByb21pc2UucHJvdG90eXBlLnRoZW4gPSBmdW5jdGlvbiAoZnVsZmlsbGVkLCByZWplY3RlZCwgcHJvZ3Jlc3NlZCkge1xuICAgIHZhciBzZWxmID0gdGhpcztcbiAgICB2YXIgZGVmZXJyZWQgPSBkZWZlcigpO1xuICAgIHZhciBkb25lID0gZmFsc2U7ICAgLy8gZW5zdXJlIHRoZSB1bnRydXN0ZWQgcHJvbWlzZSBtYWtlcyBhdCBtb3N0IGFcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIHNpbmdsZSBjYWxsIHRvIG9uZSBvZiB0aGUgY2FsbGJhY2tzXG5cbiAgICBmdW5jdGlvbiBfZnVsZmlsbGVkKHZhbHVlKSB7XG4gICAgICAgIHRyeSB7XG4gICAgICAgICAgICByZXR1cm4gdHlwZW9mIGZ1bGZpbGxlZCA9PT0gXCJmdW5jdGlvblwiID8gZnVsZmlsbGVkKHZhbHVlKSA6IHZhbHVlO1xuICAgICAgICB9IGNhdGNoIChleGNlcHRpb24pIHtcbiAgICAgICAgICAgIHJldHVybiByZWplY3QoZXhjZXB0aW9uKTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIGZ1bmN0aW9uIF9yZWplY3RlZChleGNlcHRpb24pIHtcbiAgICAgICAgaWYgKHR5cGVvZiByZWplY3RlZCA9PT0gXCJmdW5jdGlvblwiKSB7XG4gICAgICAgICAgICBtYWtlU3RhY2tUcmFjZUxvbmcoZXhjZXB0aW9uLCBzZWxmKTtcbiAgICAgICAgICAgIHRyeSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIHJlamVjdGVkKGV4Y2VwdGlvbik7XG4gICAgICAgICAgICB9IGNhdGNoIChuZXdFeGNlcHRpb24pIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gcmVqZWN0KG5ld0V4Y2VwdGlvbik7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHJlamVjdChleGNlcHRpb24pO1xuICAgIH1cblxuICAgIGZ1bmN0aW9uIF9wcm9ncmVzc2VkKHZhbHVlKSB7XG4gICAgICAgIHJldHVybiB0eXBlb2YgcHJvZ3Jlc3NlZCA9PT0gXCJmdW5jdGlvblwiID8gcHJvZ3Jlc3NlZCh2YWx1ZSkgOiB2YWx1ZTtcbiAgICB9XG5cbiAgICBRLm5leHRUaWNrKGZ1bmN0aW9uICgpIHtcbiAgICAgICAgc2VsZi5wcm9taXNlRGlzcGF0Y2goZnVuY3Rpb24gKHZhbHVlKSB7XG4gICAgICAgICAgICBpZiAoZG9uZSkge1xuICAgICAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGRvbmUgPSB0cnVlO1xuXG4gICAgICAgICAgICBkZWZlcnJlZC5yZXNvbHZlKF9mdWxmaWxsZWQodmFsdWUpKTtcbiAgICAgICAgfSwgXCJ3aGVuXCIsIFtmdW5jdGlvbiAoZXhjZXB0aW9uKSB7XG4gICAgICAgICAgICBpZiAoZG9uZSkge1xuICAgICAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGRvbmUgPSB0cnVlO1xuXG4gICAgICAgICAgICBkZWZlcnJlZC5yZXNvbHZlKF9yZWplY3RlZChleGNlcHRpb24pKTtcbiAgICAgICAgfV0pO1xuICAgIH0pO1xuXG4gICAgLy8gUHJvZ3Jlc3MgcHJvcGFnYXRvciBuZWVkIHRvIGJlIGF0dGFjaGVkIGluIHRoZSBjdXJyZW50IHRpY2suXG4gICAgc2VsZi5wcm9taXNlRGlzcGF0Y2godm9pZCAwLCBcIndoZW5cIiwgW3ZvaWQgMCwgZnVuY3Rpb24gKHZhbHVlKSB7XG4gICAgICAgIHZhciBuZXdWYWx1ZTtcbiAgICAgICAgdmFyIHRocmV3ID0gZmFsc2U7XG4gICAgICAgIHRyeSB7XG4gICAgICAgICAgICBuZXdWYWx1ZSA9IF9wcm9ncmVzc2VkKHZhbHVlKTtcbiAgICAgICAgfSBjYXRjaCAoZSkge1xuICAgICAgICAgICAgdGhyZXcgPSB0cnVlO1xuICAgICAgICAgICAgaWYgKFEub25lcnJvcikge1xuICAgICAgICAgICAgICAgIFEub25lcnJvcihlKTtcbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgdGhyb3cgZTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuXG4gICAgICAgIGlmICghdGhyZXcpIHtcbiAgICAgICAgICAgIGRlZmVycmVkLm5vdGlmeShuZXdWYWx1ZSk7XG4gICAgICAgIH1cbiAgICB9XSk7XG5cbiAgICByZXR1cm4gZGVmZXJyZWQucHJvbWlzZTtcbn07XG5cblEudGFwID0gZnVuY3Rpb24gKHByb21pc2UsIGNhbGxiYWNrKSB7XG4gICAgcmV0dXJuIFEocHJvbWlzZSkudGFwKGNhbGxiYWNrKTtcbn07XG5cbi8qKlxuICogV29ya3MgYWxtb3N0IGxpa2UgXCJmaW5hbGx5XCIsIGJ1dCBub3QgY2FsbGVkIGZvciByZWplY3Rpb25zLlxuICogT3JpZ2luYWwgcmVzb2x1dGlvbiB2YWx1ZSBpcyBwYXNzZWQgdGhyb3VnaCBjYWxsYmFjayB1bmFmZmVjdGVkLlxuICogQ2FsbGJhY2sgbWF5IHJldHVybiBhIHByb21pc2UgdGhhdCB3aWxsIGJlIGF3YWl0ZWQgZm9yLlxuICogQHBhcmFtIHtGdW5jdGlvbn0gY2FsbGJhY2tcbiAqIEByZXR1cm5zIHtRLlByb21pc2V9XG4gKiBAZXhhbXBsZVxuICogZG9Tb21ldGhpbmcoKVxuICogICAudGhlbiguLi4pXG4gKiAgIC50YXAoY29uc29sZS5sb2cpXG4gKiAgIC50aGVuKC4uLik7XG4gKi9cblByb21pc2UucHJvdG90eXBlLnRhcCA9IGZ1bmN0aW9uIChjYWxsYmFjaykge1xuICAgIGNhbGxiYWNrID0gUShjYWxsYmFjayk7XG5cbiAgICByZXR1cm4gdGhpcy50aGVuKGZ1bmN0aW9uICh2YWx1ZSkge1xuICAgICAgICByZXR1cm4gY2FsbGJhY2suZmNhbGwodmFsdWUpLnRoZW5SZXNvbHZlKHZhbHVlKTtcbiAgICB9KTtcbn07XG5cbi8qKlxuICogUmVnaXN0ZXJzIGFuIG9ic2VydmVyIG9uIGEgcHJvbWlzZS5cbiAqXG4gKiBHdWFyYW50ZWVzOlxuICpcbiAqIDEuIHRoYXQgZnVsZmlsbGVkIGFuZCByZWplY3RlZCB3aWxsIGJlIGNhbGxlZCBvbmx5IG9uY2UuXG4gKiAyLiB0aGF0IGVpdGhlciB0aGUgZnVsZmlsbGVkIGNhbGxiYWNrIG9yIHRoZSByZWplY3RlZCBjYWxsYmFjayB3aWxsIGJlXG4gKiAgICBjYWxsZWQsIGJ1dCBub3QgYm90aC5cbiAqIDMuIHRoYXQgZnVsZmlsbGVkIGFuZCByZWplY3RlZCB3aWxsIG5vdCBiZSBjYWxsZWQgaW4gdGhpcyB0dXJuLlxuICpcbiAqIEBwYXJhbSB2YWx1ZSAgICAgIHByb21pc2Ugb3IgaW1tZWRpYXRlIHJlZmVyZW5jZSB0byBvYnNlcnZlXG4gKiBAcGFyYW0gZnVsZmlsbGVkICBmdW5jdGlvbiB0byBiZSBjYWxsZWQgd2l0aCB0aGUgZnVsZmlsbGVkIHZhbHVlXG4gKiBAcGFyYW0gcmVqZWN0ZWQgICBmdW5jdGlvbiB0byBiZSBjYWxsZWQgd2l0aCB0aGUgcmVqZWN0aW9uIGV4Y2VwdGlvblxuICogQHBhcmFtIHByb2dyZXNzZWQgZnVuY3Rpb24gdG8gYmUgY2FsbGVkIG9uIGFueSBwcm9ncmVzcyBub3RpZmljYXRpb25zXG4gKiBAcmV0dXJuIHByb21pc2UgZm9yIHRoZSByZXR1cm4gdmFsdWUgZnJvbSB0aGUgaW52b2tlZCBjYWxsYmFja1xuICovXG5RLndoZW4gPSB3aGVuO1xuZnVuY3Rpb24gd2hlbih2YWx1ZSwgZnVsZmlsbGVkLCByZWplY3RlZCwgcHJvZ3Jlc3NlZCkge1xuICAgIHJldHVybiBRKHZhbHVlKS50aGVuKGZ1bGZpbGxlZCwgcmVqZWN0ZWQsIHByb2dyZXNzZWQpO1xufVxuXG5Qcm9taXNlLnByb3RvdHlwZS50aGVuUmVzb2x2ZSA9IGZ1bmN0aW9uICh2YWx1ZSkge1xuICAgIHJldHVybiB0aGlzLnRoZW4oZnVuY3Rpb24gKCkgeyByZXR1cm4gdmFsdWU7IH0pO1xufTtcblxuUS50aGVuUmVzb2x2ZSA9IGZ1bmN0aW9uIChwcm9taXNlLCB2YWx1ZSkge1xuICAgIHJldHVybiBRKHByb21pc2UpLnRoZW5SZXNvbHZlKHZhbHVlKTtcbn07XG5cblByb21pc2UucHJvdG90eXBlLnRoZW5SZWplY3QgPSBmdW5jdGlvbiAocmVhc29uKSB7XG4gICAgcmV0dXJuIHRoaXMudGhlbihmdW5jdGlvbiAoKSB7IHRocm93IHJlYXNvbjsgfSk7XG59O1xuXG5RLnRoZW5SZWplY3QgPSBmdW5jdGlvbiAocHJvbWlzZSwgcmVhc29uKSB7XG4gICAgcmV0dXJuIFEocHJvbWlzZSkudGhlblJlamVjdChyZWFzb24pO1xufTtcblxuLyoqXG4gKiBJZiBhbiBvYmplY3QgaXMgbm90IGEgcHJvbWlzZSwgaXQgaXMgYXMgXCJuZWFyXCIgYXMgcG9zc2libGUuXG4gKiBJZiBhIHByb21pc2UgaXMgcmVqZWN0ZWQsIGl0IGlzIGFzIFwibmVhclwiIGFzIHBvc3NpYmxlIHRvby5cbiAqIElmIGl04oCZcyBhIGZ1bGZpbGxlZCBwcm9taXNlLCB0aGUgZnVsZmlsbG1lbnQgdmFsdWUgaXMgbmVhcmVyLlxuICogSWYgaXTigJlzIGEgZGVmZXJyZWQgcHJvbWlzZSBhbmQgdGhlIGRlZmVycmVkIGhhcyBiZWVuIHJlc29sdmVkLCB0aGVcbiAqIHJlc29sdXRpb24gaXMgXCJuZWFyZXJcIi5cbiAqIEBwYXJhbSBvYmplY3RcbiAqIEByZXR1cm5zIG1vc3QgcmVzb2x2ZWQgKG5lYXJlc3QpIGZvcm0gb2YgdGhlIG9iamVjdFxuICovXG5cbi8vIFhYWCBzaG91bGQgd2UgcmUtZG8gdGhpcz9cblEubmVhcmVyID0gbmVhcmVyO1xuZnVuY3Rpb24gbmVhcmVyKHZhbHVlKSB7XG4gICAgaWYgKGlzUHJvbWlzZSh2YWx1ZSkpIHtcbiAgICAgICAgdmFyIGluc3BlY3RlZCA9IHZhbHVlLmluc3BlY3QoKTtcbiAgICAgICAgaWYgKGluc3BlY3RlZC5zdGF0ZSA9PT0gXCJmdWxmaWxsZWRcIikge1xuICAgICAgICAgICAgcmV0dXJuIGluc3BlY3RlZC52YWx1ZTtcbiAgICAgICAgfVxuICAgIH1cbiAgICByZXR1cm4gdmFsdWU7XG59XG5cbi8qKlxuICogQHJldHVybnMgd2hldGhlciB0aGUgZ2l2ZW4gb2JqZWN0IGlzIGEgcHJvbWlzZS5cbiAqIE90aGVyd2lzZSBpdCBpcyBhIGZ1bGZpbGxlZCB2YWx1ZS5cbiAqL1xuUS5pc1Byb21pc2UgPSBpc1Byb21pc2U7XG5mdW5jdGlvbiBpc1Byb21pc2Uob2JqZWN0KSB7XG4gICAgcmV0dXJuIG9iamVjdCBpbnN0YW5jZW9mIFByb21pc2U7XG59XG5cblEuaXNQcm9taXNlQWxpa2UgPSBpc1Byb21pc2VBbGlrZTtcbmZ1bmN0aW9uIGlzUHJvbWlzZUFsaWtlKG9iamVjdCkge1xuICAgIHJldHVybiBpc09iamVjdChvYmplY3QpICYmIHR5cGVvZiBvYmplY3QudGhlbiA9PT0gXCJmdW5jdGlvblwiO1xufVxuXG4vKipcbiAqIEByZXR1cm5zIHdoZXRoZXIgdGhlIGdpdmVuIG9iamVjdCBpcyBhIHBlbmRpbmcgcHJvbWlzZSwgbWVhbmluZyBub3RcbiAqIGZ1bGZpbGxlZCBvciByZWplY3RlZC5cbiAqL1xuUS5pc1BlbmRpbmcgPSBpc1BlbmRpbmc7XG5mdW5jdGlvbiBpc1BlbmRpbmcob2JqZWN0KSB7XG4gICAgcmV0dXJuIGlzUHJvbWlzZShvYmplY3QpICYmIG9iamVjdC5pbnNwZWN0KCkuc3RhdGUgPT09IFwicGVuZGluZ1wiO1xufVxuXG5Qcm9taXNlLnByb3RvdHlwZS5pc1BlbmRpbmcgPSBmdW5jdGlvbiAoKSB7XG4gICAgcmV0dXJuIHRoaXMuaW5zcGVjdCgpLnN0YXRlID09PSBcInBlbmRpbmdcIjtcbn07XG5cbi8qKlxuICogQHJldHVybnMgd2hldGhlciB0aGUgZ2l2ZW4gb2JqZWN0IGlzIGEgdmFsdWUgb3IgZnVsZmlsbGVkXG4gKiBwcm9taXNlLlxuICovXG5RLmlzRnVsZmlsbGVkID0gaXNGdWxmaWxsZWQ7XG5mdW5jdGlvbiBpc0Z1bGZpbGxlZChvYmplY3QpIHtcbiAgICByZXR1cm4gIWlzUHJvbWlzZShvYmplY3QpIHx8IG9iamVjdC5pbnNwZWN0KCkuc3RhdGUgPT09IFwiZnVsZmlsbGVkXCI7XG59XG5cblByb21pc2UucHJvdG90eXBlLmlzRnVsZmlsbGVkID0gZnVuY3Rpb24gKCkge1xuICAgIHJldHVybiB0aGlzLmluc3BlY3QoKS5zdGF0ZSA9PT0gXCJmdWxmaWxsZWRcIjtcbn07XG5cbi8qKlxuICogQHJldHVybnMgd2hldGhlciB0aGUgZ2l2ZW4gb2JqZWN0IGlzIGEgcmVqZWN0ZWQgcHJvbWlzZS5cbiAqL1xuUS5pc1JlamVjdGVkID0gaXNSZWplY3RlZDtcbmZ1bmN0aW9uIGlzUmVqZWN0ZWQob2JqZWN0KSB7XG4gICAgcmV0dXJuIGlzUHJvbWlzZShvYmplY3QpICYmIG9iamVjdC5pbnNwZWN0KCkuc3RhdGUgPT09IFwicmVqZWN0ZWRcIjtcbn1cblxuUHJvbWlzZS5wcm90b3R5cGUuaXNSZWplY3RlZCA9IGZ1bmN0aW9uICgpIHtcbiAgICByZXR1cm4gdGhpcy5pbnNwZWN0KCkuc3RhdGUgPT09IFwicmVqZWN0ZWRcIjtcbn07XG5cbi8vLy8gQkVHSU4gVU5IQU5ETEVEIFJFSkVDVElPTiBUUkFDS0lOR1xuXG4vLyBUaGlzIHByb21pc2UgbGlicmFyeSBjb25zdW1lcyBleGNlcHRpb25zIHRocm93biBpbiBoYW5kbGVycyBzbyB0aGV5IGNhbiBiZVxuLy8gaGFuZGxlZCBieSBhIHN1YnNlcXVlbnQgcHJvbWlzZS4gIFRoZSBleGNlcHRpb25zIGdldCBhZGRlZCB0byB0aGlzIGFycmF5IHdoZW5cbi8vIHRoZXkgYXJlIGNyZWF0ZWQsIGFuZCByZW1vdmVkIHdoZW4gdGhleSBhcmUgaGFuZGxlZC4gIE5vdGUgdGhhdCBpbiBFUzYgb3Jcbi8vIHNoaW1tZWQgZW52aXJvbm1lbnRzLCB0aGlzIHdvdWxkIG5hdHVyYWxseSBiZSBhIGBTZXRgLlxudmFyIHVuaGFuZGxlZFJlYXNvbnMgPSBbXTtcbnZhciB1bmhhbmRsZWRSZWplY3Rpb25zID0gW107XG52YXIgcmVwb3J0ZWRVbmhhbmRsZWRSZWplY3Rpb25zID0gW107XG52YXIgdHJhY2tVbmhhbmRsZWRSZWplY3Rpb25zID0gdHJ1ZTtcblxuZnVuY3Rpb24gcmVzZXRVbmhhbmRsZWRSZWplY3Rpb25zKCkge1xuICAgIHVuaGFuZGxlZFJlYXNvbnMubGVuZ3RoID0gMDtcbiAgICB1bmhhbmRsZWRSZWplY3Rpb25zLmxlbmd0aCA9IDA7XG5cbiAgICBpZiAoIXRyYWNrVW5oYW5kbGVkUmVqZWN0aW9ucykge1xuICAgICAgICB0cmFja1VuaGFuZGxlZFJlamVjdGlvbnMgPSB0cnVlO1xuICAgIH1cbn1cblxuZnVuY3Rpb24gdHJhY2tSZWplY3Rpb24ocHJvbWlzZSwgcmVhc29uKSB7XG4gICAgaWYgKCF0cmFja1VuaGFuZGxlZFJlamVjdGlvbnMpIHtcbiAgICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICBpZiAodHlwZW9mIHByb2Nlc3MgPT09IFwib2JqZWN0XCIgJiYgdHlwZW9mIHByb2Nlc3MuZW1pdCA9PT0gXCJmdW5jdGlvblwiKSB7XG4gICAgICAgIFEubmV4dFRpY2sucnVuQWZ0ZXIoZnVuY3Rpb24gKCkge1xuICAgICAgICAgICAgaWYgKGFycmF5X2luZGV4T2YodW5oYW5kbGVkUmVqZWN0aW9ucywgcHJvbWlzZSkgIT09IC0xKSB7XG4gICAgICAgICAgICAgICAgcHJvY2Vzcy5lbWl0KFwidW5oYW5kbGVkUmVqZWN0aW9uXCIsIHJlYXNvbiwgcHJvbWlzZSk7XG4gICAgICAgICAgICAgICAgcmVwb3J0ZWRVbmhhbmRsZWRSZWplY3Rpb25zLnB1c2gocHJvbWlzZSk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH0pO1xuICAgIH1cblxuICAgIHVuaGFuZGxlZFJlamVjdGlvbnMucHVzaChwcm9taXNlKTtcbiAgICBpZiAocmVhc29uICYmIHR5cGVvZiByZWFzb24uc3RhY2sgIT09IFwidW5kZWZpbmVkXCIpIHtcbiAgICAgICAgdW5oYW5kbGVkUmVhc29ucy5wdXNoKHJlYXNvbi5zdGFjayk7XG4gICAgfSBlbHNlIHtcbiAgICAgICAgdW5oYW5kbGVkUmVhc29ucy5wdXNoKFwiKG5vIHN0YWNrKSBcIiArIHJlYXNvbik7XG4gICAgfVxufVxuXG5mdW5jdGlvbiB1bnRyYWNrUmVqZWN0aW9uKHByb21pc2UpIHtcbiAgICBpZiAoIXRyYWNrVW5oYW5kbGVkUmVqZWN0aW9ucykge1xuICAgICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgdmFyIGF0ID0gYXJyYXlfaW5kZXhPZih1bmhhbmRsZWRSZWplY3Rpb25zLCBwcm9taXNlKTtcbiAgICBpZiAoYXQgIT09IC0xKSB7XG4gICAgICAgIGlmICh0eXBlb2YgcHJvY2VzcyA9PT0gXCJvYmplY3RcIiAmJiB0eXBlb2YgcHJvY2Vzcy5lbWl0ID09PSBcImZ1bmN0aW9uXCIpIHtcbiAgICAgICAgICAgIFEubmV4dFRpY2sucnVuQWZ0ZXIoZnVuY3Rpb24gKCkge1xuICAgICAgICAgICAgICAgIHZhciBhdFJlcG9ydCA9IGFycmF5X2luZGV4T2YocmVwb3J0ZWRVbmhhbmRsZWRSZWplY3Rpb25zLCBwcm9taXNlKTtcbiAgICAgICAgICAgICAgICBpZiAoYXRSZXBvcnQgIT09IC0xKSB7XG4gICAgICAgICAgICAgICAgICAgIHByb2Nlc3MuZW1pdChcInJlamVjdGlvbkhhbmRsZWRcIiwgdW5oYW5kbGVkUmVhc29uc1thdF0sIHByb21pc2UpO1xuICAgICAgICAgICAgICAgICAgICByZXBvcnRlZFVuaGFuZGxlZFJlamVjdGlvbnMuc3BsaWNlKGF0UmVwb3J0LCAxKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgfVxuICAgICAgICB1bmhhbmRsZWRSZWplY3Rpb25zLnNwbGljZShhdCwgMSk7XG4gICAgICAgIHVuaGFuZGxlZFJlYXNvbnMuc3BsaWNlKGF0LCAxKTtcbiAgICB9XG59XG5cblEucmVzZXRVbmhhbmRsZWRSZWplY3Rpb25zID0gcmVzZXRVbmhhbmRsZWRSZWplY3Rpb25zO1xuXG5RLmdldFVuaGFuZGxlZFJlYXNvbnMgPSBmdW5jdGlvbiAoKSB7XG4gICAgLy8gTWFrZSBhIGNvcHkgc28gdGhhdCBjb25zdW1lcnMgY2FuJ3QgaW50ZXJmZXJlIHdpdGggb3VyIGludGVybmFsIHN0YXRlLlxuICAgIHJldHVybiB1bmhhbmRsZWRSZWFzb25zLnNsaWNlKCk7XG59O1xuXG5RLnN0b3BVbmhhbmRsZWRSZWplY3Rpb25UcmFja2luZyA9IGZ1bmN0aW9uICgpIHtcbiAgICByZXNldFVuaGFuZGxlZFJlamVjdGlvbnMoKTtcbiAgICB0cmFja1VuaGFuZGxlZFJlamVjdGlvbnMgPSBmYWxzZTtcbn07XG5cbnJlc2V0VW5oYW5kbGVkUmVqZWN0aW9ucygpO1xuXG4vLy8vIEVORCBVTkhBTkRMRUQgUkVKRUNUSU9OIFRSQUNLSU5HXG5cbi8qKlxuICogQ29uc3RydWN0cyBhIHJlamVjdGVkIHByb21pc2UuXG4gKiBAcGFyYW0gcmVhc29uIHZhbHVlIGRlc2NyaWJpbmcgdGhlIGZhaWx1cmVcbiAqL1xuUS5yZWplY3QgPSByZWplY3Q7XG5mdW5jdGlvbiByZWplY3QocmVhc29uKSB7XG4gICAgdmFyIHJlamVjdGlvbiA9IFByb21pc2Uoe1xuICAgICAgICBcIndoZW5cIjogZnVuY3Rpb24gKHJlamVjdGVkKSB7XG4gICAgICAgICAgICAvLyBub3RlIHRoYXQgdGhlIGVycm9yIGhhcyBiZWVuIGhhbmRsZWRcbiAgICAgICAgICAgIGlmIChyZWplY3RlZCkge1xuICAgICAgICAgICAgICAgIHVudHJhY2tSZWplY3Rpb24odGhpcyk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICByZXR1cm4gcmVqZWN0ZWQgPyByZWplY3RlZChyZWFzb24pIDogdGhpcztcbiAgICAgICAgfVxuICAgIH0sIGZ1bmN0aW9uIGZhbGxiYWNrKCkge1xuICAgICAgICByZXR1cm4gdGhpcztcbiAgICB9LCBmdW5jdGlvbiBpbnNwZWN0KCkge1xuICAgICAgICByZXR1cm4geyBzdGF0ZTogXCJyZWplY3RlZFwiLCByZWFzb246IHJlYXNvbiB9O1xuICAgIH0pO1xuXG4gICAgLy8gTm90ZSB0aGF0IHRoZSByZWFzb24gaGFzIG5vdCBiZWVuIGhhbmRsZWQuXG4gICAgdHJhY2tSZWplY3Rpb24ocmVqZWN0aW9uLCByZWFzb24pO1xuXG4gICAgcmV0dXJuIHJlamVjdGlvbjtcbn1cblxuLyoqXG4gKiBDb25zdHJ1Y3RzIGEgZnVsZmlsbGVkIHByb21pc2UgZm9yIGFuIGltbWVkaWF0ZSByZWZlcmVuY2UuXG4gKiBAcGFyYW0gdmFsdWUgaW1tZWRpYXRlIHJlZmVyZW5jZVxuICovXG5RLmZ1bGZpbGwgPSBmdWxmaWxsO1xuZnVuY3Rpb24gZnVsZmlsbCh2YWx1ZSkge1xuICAgIHJldHVybiBQcm9taXNlKHtcbiAgICAgICAgXCJ3aGVuXCI6IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICAgIHJldHVybiB2YWx1ZTtcbiAgICAgICAgfSxcbiAgICAgICAgXCJnZXRcIjogZnVuY3Rpb24gKG5hbWUpIHtcbiAgICAgICAgICAgIHJldHVybiB2YWx1ZVtuYW1lXTtcbiAgICAgICAgfSxcbiAgICAgICAgXCJzZXRcIjogZnVuY3Rpb24gKG5hbWUsIHJocykge1xuICAgICAgICAgICAgdmFsdWVbbmFtZV0gPSByaHM7XG4gICAgICAgIH0sXG4gICAgICAgIFwiZGVsZXRlXCI6IGZ1bmN0aW9uIChuYW1lKSB7XG4gICAgICAgICAgICBkZWxldGUgdmFsdWVbbmFtZV07XG4gICAgICAgIH0sXG4gICAgICAgIFwicG9zdFwiOiBmdW5jdGlvbiAobmFtZSwgYXJncykge1xuICAgICAgICAgICAgLy8gTWFyayBNaWxsZXIgcHJvcG9zZXMgdGhhdCBwb3N0IHdpdGggbm8gbmFtZSBzaG91bGQgYXBwbHkgYVxuICAgICAgICAgICAgLy8gcHJvbWlzZWQgZnVuY3Rpb24uXG4gICAgICAgICAgICBpZiAobmFtZSA9PT0gbnVsbCB8fCBuYW1lID09PSB2b2lkIDApIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gdmFsdWUuYXBwbHkodm9pZCAwLCBhcmdzKTtcbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIHZhbHVlW25hbWVdLmFwcGx5KHZhbHVlLCBhcmdzKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfSxcbiAgICAgICAgXCJhcHBseVwiOiBmdW5jdGlvbiAodGhpc3AsIGFyZ3MpIHtcbiAgICAgICAgICAgIHJldHVybiB2YWx1ZS5hcHBseSh0aGlzcCwgYXJncyk7XG4gICAgICAgIH0sXG4gICAgICAgIFwia2V5c1wiOiBmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgICByZXR1cm4gb2JqZWN0X2tleXModmFsdWUpO1xuICAgICAgICB9XG4gICAgfSwgdm9pZCAwLCBmdW5jdGlvbiBpbnNwZWN0KCkge1xuICAgICAgICByZXR1cm4geyBzdGF0ZTogXCJmdWxmaWxsZWRcIiwgdmFsdWU6IHZhbHVlIH07XG4gICAgfSk7XG59XG5cbi8qKlxuICogQ29udmVydHMgdGhlbmFibGVzIHRvIFEgcHJvbWlzZXMuXG4gKiBAcGFyYW0gcHJvbWlzZSB0aGVuYWJsZSBwcm9taXNlXG4gKiBAcmV0dXJucyBhIFEgcHJvbWlzZVxuICovXG5mdW5jdGlvbiBjb2VyY2UocHJvbWlzZSkge1xuICAgIHZhciBkZWZlcnJlZCA9IGRlZmVyKCk7XG4gICAgUS5uZXh0VGljayhmdW5jdGlvbiAoKSB7XG4gICAgICAgIHRyeSB7XG4gICAgICAgICAgICBwcm9taXNlLnRoZW4oZGVmZXJyZWQucmVzb2x2ZSwgZGVmZXJyZWQucmVqZWN0LCBkZWZlcnJlZC5ub3RpZnkpO1xuICAgICAgICB9IGNhdGNoIChleGNlcHRpb24pIHtcbiAgICAgICAgICAgIGRlZmVycmVkLnJlamVjdChleGNlcHRpb24pO1xuICAgICAgICB9XG4gICAgfSk7XG4gICAgcmV0dXJuIGRlZmVycmVkLnByb21pc2U7XG59XG5cbi8qKlxuICogQW5ub3RhdGVzIGFuIG9iamVjdCBzdWNoIHRoYXQgaXQgd2lsbCBuZXZlciBiZVxuICogdHJhbnNmZXJyZWQgYXdheSBmcm9tIHRoaXMgcHJvY2VzcyBvdmVyIGFueSBwcm9taXNlXG4gKiBjb21tdW5pY2F0aW9uIGNoYW5uZWwuXG4gKiBAcGFyYW0gb2JqZWN0XG4gKiBAcmV0dXJucyBwcm9taXNlIGEgd3JhcHBpbmcgb2YgdGhhdCBvYmplY3QgdGhhdFxuICogYWRkaXRpb25hbGx5IHJlc3BvbmRzIHRvIHRoZSBcImlzRGVmXCIgbWVzc2FnZVxuICogd2l0aG91dCBhIHJlamVjdGlvbi5cbiAqL1xuUS5tYXN0ZXIgPSBtYXN0ZXI7XG5mdW5jdGlvbiBtYXN0ZXIob2JqZWN0KSB7XG4gICAgcmV0dXJuIFByb21pc2Uoe1xuICAgICAgICBcImlzRGVmXCI6IGZ1bmN0aW9uICgpIHt9XG4gICAgfSwgZnVuY3Rpb24gZmFsbGJhY2sob3AsIGFyZ3MpIHtcbiAgICAgICAgcmV0dXJuIGRpc3BhdGNoKG9iamVjdCwgb3AsIGFyZ3MpO1xuICAgIH0sIGZ1bmN0aW9uICgpIHtcbiAgICAgICAgcmV0dXJuIFEob2JqZWN0KS5pbnNwZWN0KCk7XG4gICAgfSk7XG59XG5cbi8qKlxuICogU3ByZWFkcyB0aGUgdmFsdWVzIG9mIGEgcHJvbWlzZWQgYXJyYXkgb2YgYXJndW1lbnRzIGludG8gdGhlXG4gKiBmdWxmaWxsbWVudCBjYWxsYmFjay5cbiAqIEBwYXJhbSBmdWxmaWxsZWQgY2FsbGJhY2sgdGhhdCByZWNlaXZlcyB2YXJpYWRpYyBhcmd1bWVudHMgZnJvbSB0aGVcbiAqIHByb21pc2VkIGFycmF5XG4gKiBAcGFyYW0gcmVqZWN0ZWQgY2FsbGJhY2sgdGhhdCByZWNlaXZlcyB0aGUgZXhjZXB0aW9uIGlmIHRoZSBwcm9taXNlXG4gKiBpcyByZWplY3RlZC5cbiAqIEByZXR1cm5zIGEgcHJvbWlzZSBmb3IgdGhlIHJldHVybiB2YWx1ZSBvciB0aHJvd24gZXhjZXB0aW9uIG9mXG4gKiBlaXRoZXIgY2FsbGJhY2suXG4gKi9cblEuc3ByZWFkID0gc3ByZWFkO1xuZnVuY3Rpb24gc3ByZWFkKHZhbHVlLCBmdWxmaWxsZWQsIHJlamVjdGVkKSB7XG4gICAgcmV0dXJuIFEodmFsdWUpLnNwcmVhZChmdWxmaWxsZWQsIHJlamVjdGVkKTtcbn1cblxuUHJvbWlzZS5wcm90b3R5cGUuc3ByZWFkID0gZnVuY3Rpb24gKGZ1bGZpbGxlZCwgcmVqZWN0ZWQpIHtcbiAgICByZXR1cm4gdGhpcy5hbGwoKS50aGVuKGZ1bmN0aW9uIChhcnJheSkge1xuICAgICAgICByZXR1cm4gZnVsZmlsbGVkLmFwcGx5KHZvaWQgMCwgYXJyYXkpO1xuICAgIH0sIHJlamVjdGVkKTtcbn07XG5cbi8qKlxuICogVGhlIGFzeW5jIGZ1bmN0aW9uIGlzIGEgZGVjb3JhdG9yIGZvciBnZW5lcmF0b3IgZnVuY3Rpb25zLCB0dXJuaW5nXG4gKiB0aGVtIGludG8gYXN5bmNocm9ub3VzIGdlbmVyYXRvcnMuICBBbHRob3VnaCBnZW5lcmF0b3JzIGFyZSBvbmx5IHBhcnRcbiAqIG9mIHRoZSBuZXdlc3QgRUNNQVNjcmlwdCA2IGRyYWZ0cywgdGhpcyBjb2RlIGRvZXMgbm90IGNhdXNlIHN5bnRheFxuICogZXJyb3JzIGluIG9sZGVyIGVuZ2luZXMuICBUaGlzIGNvZGUgc2hvdWxkIGNvbnRpbnVlIHRvIHdvcmsgYW5kIHdpbGxcbiAqIGluIGZhY3QgaW1wcm92ZSBvdmVyIHRpbWUgYXMgdGhlIGxhbmd1YWdlIGltcHJvdmVzLlxuICpcbiAqIEVTNiBnZW5lcmF0b3JzIGFyZSBjdXJyZW50bHkgcGFydCBvZiBWOCB2ZXJzaW9uIDMuMTkgd2l0aCB0aGVcbiAqIC0taGFybW9ueS1nZW5lcmF0b3JzIHJ1bnRpbWUgZmxhZyBlbmFibGVkLiAgU3BpZGVyTW9ua2V5IGhhcyBoYWQgdGhlbVxuICogZm9yIGxvbmdlciwgYnV0IHVuZGVyIGFuIG9sZGVyIFB5dGhvbi1pbnNwaXJlZCBmb3JtLiAgVGhpcyBmdW5jdGlvblxuICogd29ya3Mgb24gYm90aCBraW5kcyBvZiBnZW5lcmF0b3JzLlxuICpcbiAqIERlY29yYXRlcyBhIGdlbmVyYXRvciBmdW5jdGlvbiBzdWNoIHRoYXQ6XG4gKiAgLSBpdCBtYXkgeWllbGQgcHJvbWlzZXNcbiAqICAtIGV4ZWN1dGlvbiB3aWxsIGNvbnRpbnVlIHdoZW4gdGhhdCBwcm9taXNlIGlzIGZ1bGZpbGxlZFxuICogIC0gdGhlIHZhbHVlIG9mIHRoZSB5aWVsZCBleHByZXNzaW9uIHdpbGwgYmUgdGhlIGZ1bGZpbGxlZCB2YWx1ZVxuICogIC0gaXQgcmV0dXJucyBhIHByb21pc2UgZm9yIHRoZSByZXR1cm4gdmFsdWUgKHdoZW4gdGhlIGdlbmVyYXRvclxuICogICAgc3RvcHMgaXRlcmF0aW5nKVxuICogIC0gdGhlIGRlY29yYXRlZCBmdW5jdGlvbiByZXR1cm5zIGEgcHJvbWlzZSBmb3IgdGhlIHJldHVybiB2YWx1ZVxuICogICAgb2YgdGhlIGdlbmVyYXRvciBvciB0aGUgZmlyc3QgcmVqZWN0ZWQgcHJvbWlzZSBhbW9uZyB0aG9zZVxuICogICAgeWllbGRlZC5cbiAqICAtIGlmIGFuIGVycm9yIGlzIHRocm93biBpbiB0aGUgZ2VuZXJhdG9yLCBpdCBwcm9wYWdhdGVzIHRocm91Z2hcbiAqICAgIGV2ZXJ5IGZvbGxvd2luZyB5aWVsZCB1bnRpbCBpdCBpcyBjYXVnaHQsIG9yIHVudGlsIGl0IGVzY2FwZXNcbiAqICAgIHRoZSBnZW5lcmF0b3IgZnVuY3Rpb24gYWx0b2dldGhlciwgYW5kIGlzIHRyYW5zbGF0ZWQgaW50byBhXG4gKiAgICByZWplY3Rpb24gZm9yIHRoZSBwcm9taXNlIHJldHVybmVkIGJ5IHRoZSBkZWNvcmF0ZWQgZ2VuZXJhdG9yLlxuICovXG5RLmFzeW5jID0gYXN5bmM7XG5mdW5jdGlvbiBhc3luYyhtYWtlR2VuZXJhdG9yKSB7XG4gICAgcmV0dXJuIGZ1bmN0aW9uICgpIHtcbiAgICAgICAgLy8gd2hlbiB2ZXJiIGlzIFwic2VuZFwiLCBhcmcgaXMgYSB2YWx1ZVxuICAgICAgICAvLyB3aGVuIHZlcmIgaXMgXCJ0aHJvd1wiLCBhcmcgaXMgYW4gZXhjZXB0aW9uXG4gICAgICAgIGZ1bmN0aW9uIGNvbnRpbnVlcih2ZXJiLCBhcmcpIHtcbiAgICAgICAgICAgIHZhciByZXN1bHQ7XG5cbiAgICAgICAgICAgIC8vIFVudGlsIFY4IDMuMTkgLyBDaHJvbWl1bSAyOSBpcyByZWxlYXNlZCwgU3BpZGVyTW9ua2V5IGlzIHRoZSBvbmx5XG4gICAgICAgICAgICAvLyBlbmdpbmUgdGhhdCBoYXMgYSBkZXBsb3llZCBiYXNlIG9mIGJyb3dzZXJzIHRoYXQgc3VwcG9ydCBnZW5lcmF0b3JzLlxuICAgICAgICAgICAgLy8gSG93ZXZlciwgU00ncyBnZW5lcmF0b3JzIHVzZSB0aGUgUHl0aG9uLWluc3BpcmVkIHNlbWFudGljcyBvZlxuICAgICAgICAgICAgLy8gb3V0ZGF0ZWQgRVM2IGRyYWZ0cy4gIFdlIHdvdWxkIGxpa2UgdG8gc3VwcG9ydCBFUzYsIGJ1dCB3ZSdkIGFsc29cbiAgICAgICAgICAgIC8vIGxpa2UgdG8gbWFrZSBpdCBwb3NzaWJsZSB0byB1c2UgZ2VuZXJhdG9ycyBpbiBkZXBsb3llZCBicm93c2Vycywgc29cbiAgICAgICAgICAgIC8vIHdlIGFsc28gc3VwcG9ydCBQeXRob24tc3R5bGUgZ2VuZXJhdG9ycy4gIEF0IHNvbWUgcG9pbnQgd2UgY2FuIHJlbW92ZVxuICAgICAgICAgICAgLy8gdGhpcyBibG9jay5cblxuICAgICAgICAgICAgaWYgKHR5cGVvZiBTdG9wSXRlcmF0aW9uID09PSBcInVuZGVmaW5lZFwiKSB7XG4gICAgICAgICAgICAgICAgLy8gRVM2IEdlbmVyYXRvcnNcbiAgICAgICAgICAgICAgICB0cnkge1xuICAgICAgICAgICAgICAgICAgICByZXN1bHQgPSBnZW5lcmF0b3JbdmVyYl0oYXJnKTtcbiAgICAgICAgICAgICAgICB9IGNhdGNoIChleGNlcHRpb24pIHtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHJlamVjdChleGNlcHRpb24pO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBpZiAocmVzdWx0LmRvbmUpIHtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIFEocmVzdWx0LnZhbHVlKTtcbiAgICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICByZXR1cm4gd2hlbihyZXN1bHQudmFsdWUsIGNhbGxiYWNrLCBlcnJiYWNrKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgIC8vIFNwaWRlck1vbmtleSBHZW5lcmF0b3JzXG4gICAgICAgICAgICAgICAgLy8gRklYTUU6IFJlbW92ZSB0aGlzIGNhc2Ugd2hlbiBTTSBkb2VzIEVTNiBnZW5lcmF0b3JzLlxuICAgICAgICAgICAgICAgIHRyeSB7XG4gICAgICAgICAgICAgICAgICAgIHJlc3VsdCA9IGdlbmVyYXRvclt2ZXJiXShhcmcpO1xuICAgICAgICAgICAgICAgIH0gY2F0Y2ggKGV4Y2VwdGlvbikge1xuICAgICAgICAgICAgICAgICAgICBpZiAoaXNTdG9wSXRlcmF0aW9uKGV4Y2VwdGlvbikpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBRKGV4Y2VwdGlvbi52YWx1ZSk7XG4gICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gcmVqZWN0KGV4Y2VwdGlvbik7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgcmV0dXJuIHdoZW4ocmVzdWx0LCBjYWxsYmFjaywgZXJyYmFjayk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgdmFyIGdlbmVyYXRvciA9IG1ha2VHZW5lcmF0b3IuYXBwbHkodGhpcywgYXJndW1lbnRzKTtcbiAgICAgICAgdmFyIGNhbGxiYWNrID0gY29udGludWVyLmJpbmQoY29udGludWVyLCBcIm5leHRcIik7XG4gICAgICAgIHZhciBlcnJiYWNrID0gY29udGludWVyLmJpbmQoY29udGludWVyLCBcInRocm93XCIpO1xuICAgICAgICByZXR1cm4gY2FsbGJhY2soKTtcbiAgICB9O1xufVxuXG4vKipcbiAqIFRoZSBzcGF3biBmdW5jdGlvbiBpcyBhIHNtYWxsIHdyYXBwZXIgYXJvdW5kIGFzeW5jIHRoYXQgaW1tZWRpYXRlbHlcbiAqIGNhbGxzIHRoZSBnZW5lcmF0b3IgYW5kIGFsc28gZW5kcyB0aGUgcHJvbWlzZSBjaGFpbiwgc28gdGhhdCBhbnlcbiAqIHVuaGFuZGxlZCBlcnJvcnMgYXJlIHRocm93biBpbnN0ZWFkIG9mIGZvcndhcmRlZCB0byB0aGUgZXJyb3JcbiAqIGhhbmRsZXIuIFRoaXMgaXMgdXNlZnVsIGJlY2F1c2UgaXQncyBleHRyZW1lbHkgY29tbW9uIHRvIHJ1blxuICogZ2VuZXJhdG9ycyBhdCB0aGUgdG9wLWxldmVsIHRvIHdvcmsgd2l0aCBsaWJyYXJpZXMuXG4gKi9cblEuc3Bhd24gPSBzcGF3bjtcbmZ1bmN0aW9uIHNwYXduKG1ha2VHZW5lcmF0b3IpIHtcbiAgICBRLmRvbmUoUS5hc3luYyhtYWtlR2VuZXJhdG9yKSgpKTtcbn1cblxuLy8gRklYTUU6IFJlbW92ZSB0aGlzIGludGVyZmFjZSBvbmNlIEVTNiBnZW5lcmF0b3JzIGFyZSBpbiBTcGlkZXJNb25rZXkuXG4vKipcbiAqIFRocm93cyBhIFJldHVyblZhbHVlIGV4Y2VwdGlvbiB0byBzdG9wIGFuIGFzeW5jaHJvbm91cyBnZW5lcmF0b3IuXG4gKlxuICogVGhpcyBpbnRlcmZhY2UgaXMgYSBzdG9wLWdhcCBtZWFzdXJlIHRvIHN1cHBvcnQgZ2VuZXJhdG9yIHJldHVyblxuICogdmFsdWVzIGluIG9sZGVyIEZpcmVmb3gvU3BpZGVyTW9ua2V5LiAgSW4gYnJvd3NlcnMgdGhhdCBzdXBwb3J0IEVTNlxuICogZ2VuZXJhdG9ycyBsaWtlIENocm9taXVtIDI5LCBqdXN0IHVzZSBcInJldHVyblwiIGluIHlvdXIgZ2VuZXJhdG9yXG4gKiBmdW5jdGlvbnMuXG4gKlxuICogQHBhcmFtIHZhbHVlIHRoZSByZXR1cm4gdmFsdWUgZm9yIHRoZSBzdXJyb3VuZGluZyBnZW5lcmF0b3JcbiAqIEB0aHJvd3MgUmV0dXJuVmFsdWUgZXhjZXB0aW9uIHdpdGggdGhlIHZhbHVlLlxuICogQGV4YW1wbGVcbiAqIC8vIEVTNiBzdHlsZVxuICogUS5hc3luYyhmdW5jdGlvbiogKCkge1xuICogICAgICB2YXIgZm9vID0geWllbGQgZ2V0Rm9vUHJvbWlzZSgpO1xuICogICAgICB2YXIgYmFyID0geWllbGQgZ2V0QmFyUHJvbWlzZSgpO1xuICogICAgICByZXR1cm4gZm9vICsgYmFyO1xuICogfSlcbiAqIC8vIE9sZGVyIFNwaWRlck1vbmtleSBzdHlsZVxuICogUS5hc3luYyhmdW5jdGlvbiAoKSB7XG4gKiAgICAgIHZhciBmb28gPSB5aWVsZCBnZXRGb29Qcm9taXNlKCk7XG4gKiAgICAgIHZhciBiYXIgPSB5aWVsZCBnZXRCYXJQcm9taXNlKCk7XG4gKiAgICAgIFEucmV0dXJuKGZvbyArIGJhcik7XG4gKiB9KVxuICovXG5RW1wicmV0dXJuXCJdID0gX3JldHVybjtcbmZ1bmN0aW9uIF9yZXR1cm4odmFsdWUpIHtcbiAgICB0aHJvdyBuZXcgUVJldHVyblZhbHVlKHZhbHVlKTtcbn1cblxuLyoqXG4gKiBUaGUgcHJvbWlzZWQgZnVuY3Rpb24gZGVjb3JhdG9yIGVuc3VyZXMgdGhhdCBhbnkgcHJvbWlzZSBhcmd1bWVudHNcbiAqIGFyZSBzZXR0bGVkIGFuZCBwYXNzZWQgYXMgdmFsdWVzIChgdGhpc2AgaXMgYWxzbyBzZXR0bGVkIGFuZCBwYXNzZWRcbiAqIGFzIGEgdmFsdWUpLiAgSXQgd2lsbCBhbHNvIGVuc3VyZSB0aGF0IHRoZSByZXN1bHQgb2YgYSBmdW5jdGlvbiBpc1xuICogYWx3YXlzIGEgcHJvbWlzZS5cbiAqXG4gKiBAZXhhbXBsZVxuICogdmFyIGFkZCA9IFEucHJvbWlzZWQoZnVuY3Rpb24gKGEsIGIpIHtcbiAqICAgICByZXR1cm4gYSArIGI7XG4gKiB9KTtcbiAqIGFkZChRKGEpLCBRKEIpKTtcbiAqXG4gKiBAcGFyYW0ge2Z1bmN0aW9ufSBjYWxsYmFjayBUaGUgZnVuY3Rpb24gdG8gZGVjb3JhdGVcbiAqIEByZXR1cm5zIHtmdW5jdGlvbn0gYSBmdW5jdGlvbiB0aGF0IGhhcyBiZWVuIGRlY29yYXRlZC5cbiAqL1xuUS5wcm9taXNlZCA9IHByb21pc2VkO1xuZnVuY3Rpb24gcHJvbWlzZWQoY2FsbGJhY2spIHtcbiAgICByZXR1cm4gZnVuY3Rpb24gKCkge1xuICAgICAgICByZXR1cm4gc3ByZWFkKFt0aGlzLCBhbGwoYXJndW1lbnRzKV0sIGZ1bmN0aW9uIChzZWxmLCBhcmdzKSB7XG4gICAgICAgICAgICByZXR1cm4gY2FsbGJhY2suYXBwbHkoc2VsZiwgYXJncyk7XG4gICAgICAgIH0pO1xuICAgIH07XG59XG5cbi8qKlxuICogc2VuZHMgYSBtZXNzYWdlIHRvIGEgdmFsdWUgaW4gYSBmdXR1cmUgdHVyblxuICogQHBhcmFtIG9iamVjdCogdGhlIHJlY2lwaWVudFxuICogQHBhcmFtIG9wIHRoZSBuYW1lIG9mIHRoZSBtZXNzYWdlIG9wZXJhdGlvbiwgZS5nLiwgXCJ3aGVuXCIsXG4gKiBAcGFyYW0gYXJncyBmdXJ0aGVyIGFyZ3VtZW50cyB0byBiZSBmb3J3YXJkZWQgdG8gdGhlIG9wZXJhdGlvblxuICogQHJldHVybnMgcmVzdWx0IHtQcm9taXNlfSBhIHByb21pc2UgZm9yIHRoZSByZXN1bHQgb2YgdGhlIG9wZXJhdGlvblxuICovXG5RLmRpc3BhdGNoID0gZGlzcGF0Y2g7XG5mdW5jdGlvbiBkaXNwYXRjaChvYmplY3QsIG9wLCBhcmdzKSB7XG4gICAgcmV0dXJuIFEob2JqZWN0KS5kaXNwYXRjaChvcCwgYXJncyk7XG59XG5cblByb21pc2UucHJvdG90eXBlLmRpc3BhdGNoID0gZnVuY3Rpb24gKG9wLCBhcmdzKSB7XG4gICAgdmFyIHNlbGYgPSB0aGlzO1xuICAgIHZhciBkZWZlcnJlZCA9IGRlZmVyKCk7XG4gICAgUS5uZXh0VGljayhmdW5jdGlvbiAoKSB7XG4gICAgICAgIHNlbGYucHJvbWlzZURpc3BhdGNoKGRlZmVycmVkLnJlc29sdmUsIG9wLCBhcmdzKTtcbiAgICB9KTtcbiAgICByZXR1cm4gZGVmZXJyZWQucHJvbWlzZTtcbn07XG5cbi8qKlxuICogR2V0cyB0aGUgdmFsdWUgb2YgYSBwcm9wZXJ0eSBpbiBhIGZ1dHVyZSB0dXJuLlxuICogQHBhcmFtIG9iamVjdCAgICBwcm9taXNlIG9yIGltbWVkaWF0ZSByZWZlcmVuY2UgZm9yIHRhcmdldCBvYmplY3RcbiAqIEBwYXJhbSBuYW1lICAgICAgbmFtZSBvZiBwcm9wZXJ0eSB0byBnZXRcbiAqIEByZXR1cm4gcHJvbWlzZSBmb3IgdGhlIHByb3BlcnR5IHZhbHVlXG4gKi9cblEuZ2V0ID0gZnVuY3Rpb24gKG9iamVjdCwga2V5KSB7XG4gICAgcmV0dXJuIFEob2JqZWN0KS5kaXNwYXRjaChcImdldFwiLCBba2V5XSk7XG59O1xuXG5Qcm9taXNlLnByb3RvdHlwZS5nZXQgPSBmdW5jdGlvbiAoa2V5KSB7XG4gICAgcmV0dXJuIHRoaXMuZGlzcGF0Y2goXCJnZXRcIiwgW2tleV0pO1xufTtcblxuLyoqXG4gKiBTZXRzIHRoZSB2YWx1ZSBvZiBhIHByb3BlcnR5IGluIGEgZnV0dXJlIHR1cm4uXG4gKiBAcGFyYW0gb2JqZWN0ICAgIHByb21pc2Ugb3IgaW1tZWRpYXRlIHJlZmVyZW5jZSBmb3Igb2JqZWN0IG9iamVjdFxuICogQHBhcmFtIG5hbWUgICAgICBuYW1lIG9mIHByb3BlcnR5IHRvIHNldFxuICogQHBhcmFtIHZhbHVlICAgICBuZXcgdmFsdWUgb2YgcHJvcGVydHlcbiAqIEByZXR1cm4gcHJvbWlzZSBmb3IgdGhlIHJldHVybiB2YWx1ZVxuICovXG5RLnNldCA9IGZ1bmN0aW9uIChvYmplY3QsIGtleSwgdmFsdWUpIHtcbiAgICByZXR1cm4gUShvYmplY3QpLmRpc3BhdGNoKFwic2V0XCIsIFtrZXksIHZhbHVlXSk7XG59O1xuXG5Qcm9taXNlLnByb3RvdHlwZS5zZXQgPSBmdW5jdGlvbiAoa2V5LCB2YWx1ZSkge1xuICAgIHJldHVybiB0aGlzLmRpc3BhdGNoKFwic2V0XCIsIFtrZXksIHZhbHVlXSk7XG59O1xuXG4vKipcbiAqIERlbGV0ZXMgYSBwcm9wZXJ0eSBpbiBhIGZ1dHVyZSB0dXJuLlxuICogQHBhcmFtIG9iamVjdCAgICBwcm9taXNlIG9yIGltbWVkaWF0ZSByZWZlcmVuY2UgZm9yIHRhcmdldCBvYmplY3RcbiAqIEBwYXJhbSBuYW1lICAgICAgbmFtZSBvZiBwcm9wZXJ0eSB0byBkZWxldGVcbiAqIEByZXR1cm4gcHJvbWlzZSBmb3IgdGhlIHJldHVybiB2YWx1ZVxuICovXG5RLmRlbCA9IC8vIFhYWCBsZWdhY3lcblFbXCJkZWxldGVcIl0gPSBmdW5jdGlvbiAob2JqZWN0LCBrZXkpIHtcbiAgICByZXR1cm4gUShvYmplY3QpLmRpc3BhdGNoKFwiZGVsZXRlXCIsIFtrZXldKTtcbn07XG5cblByb21pc2UucHJvdG90eXBlLmRlbCA9IC8vIFhYWCBsZWdhY3lcblByb21pc2UucHJvdG90eXBlW1wiZGVsZXRlXCJdID0gZnVuY3Rpb24gKGtleSkge1xuICAgIHJldHVybiB0aGlzLmRpc3BhdGNoKFwiZGVsZXRlXCIsIFtrZXldKTtcbn07XG5cbi8qKlxuICogSW52b2tlcyBhIG1ldGhvZCBpbiBhIGZ1dHVyZSB0dXJuLlxuICogQHBhcmFtIG9iamVjdCAgICBwcm9taXNlIG9yIGltbWVkaWF0ZSByZWZlcmVuY2UgZm9yIHRhcmdldCBvYmplY3RcbiAqIEBwYXJhbSBuYW1lICAgICAgbmFtZSBvZiBtZXRob2QgdG8gaW52b2tlXG4gKiBAcGFyYW0gdmFsdWUgICAgIGEgdmFsdWUgdG8gcG9zdCwgdHlwaWNhbGx5IGFuIGFycmF5IG9mXG4gKiAgICAgICAgICAgICAgICAgIGludm9jYXRpb24gYXJndW1lbnRzIGZvciBwcm9taXNlcyB0aGF0XG4gKiAgICAgICAgICAgICAgICAgIGFyZSB1bHRpbWF0ZWx5IGJhY2tlZCB3aXRoIGByZXNvbHZlYCB2YWx1ZXMsXG4gKiAgICAgICAgICAgICAgICAgIGFzIG9wcG9zZWQgdG8gdGhvc2UgYmFja2VkIHdpdGggVVJMc1xuICogICAgICAgICAgICAgICAgICB3aGVyZWluIHRoZSBwb3N0ZWQgdmFsdWUgY2FuIGJlIGFueVxuICogICAgICAgICAgICAgICAgICBKU09OIHNlcmlhbGl6YWJsZSBvYmplY3QuXG4gKiBAcmV0dXJuIHByb21pc2UgZm9yIHRoZSByZXR1cm4gdmFsdWVcbiAqL1xuLy8gYm91bmQgbG9jYWxseSBiZWNhdXNlIGl0IGlzIHVzZWQgYnkgb3RoZXIgbWV0aG9kc1xuUS5tYXBwbHkgPSAvLyBYWFggQXMgcHJvcG9zZWQgYnkgXCJSZWRzYW5kcm9cIlxuUS5wb3N0ID0gZnVuY3Rpb24gKG9iamVjdCwgbmFtZSwgYXJncykge1xuICAgIHJldHVybiBRKG9iamVjdCkuZGlzcGF0Y2goXCJwb3N0XCIsIFtuYW1lLCBhcmdzXSk7XG59O1xuXG5Qcm9taXNlLnByb3RvdHlwZS5tYXBwbHkgPSAvLyBYWFggQXMgcHJvcG9zZWQgYnkgXCJSZWRzYW5kcm9cIlxuUHJvbWlzZS5wcm90b3R5cGUucG9zdCA9IGZ1bmN0aW9uIChuYW1lLCBhcmdzKSB7XG4gICAgcmV0dXJuIHRoaXMuZGlzcGF0Y2goXCJwb3N0XCIsIFtuYW1lLCBhcmdzXSk7XG59O1xuXG4vKipcbiAqIEludm9rZXMgYSBtZXRob2QgaW4gYSBmdXR1cmUgdHVybi5cbiAqIEBwYXJhbSBvYmplY3QgICAgcHJvbWlzZSBvciBpbW1lZGlhdGUgcmVmZXJlbmNlIGZvciB0YXJnZXQgb2JqZWN0XG4gKiBAcGFyYW0gbmFtZSAgICAgIG5hbWUgb2YgbWV0aG9kIHRvIGludm9rZVxuICogQHBhcmFtIC4uLmFyZ3MgICBhcnJheSBvZiBpbnZvY2F0aW9uIGFyZ3VtZW50c1xuICogQHJldHVybiBwcm9taXNlIGZvciB0aGUgcmV0dXJuIHZhbHVlXG4gKi9cblEuc2VuZCA9IC8vIFhYWCBNYXJrIE1pbGxlcidzIHByb3Bvc2VkIHBhcmxhbmNlXG5RLm1jYWxsID0gLy8gWFhYIEFzIHByb3Bvc2VkIGJ5IFwiUmVkc2FuZHJvXCJcblEuaW52b2tlID0gZnVuY3Rpb24gKG9iamVjdCwgbmFtZSAvKi4uLmFyZ3MqLykge1xuICAgIHJldHVybiBRKG9iamVjdCkuZGlzcGF0Y2goXCJwb3N0XCIsIFtuYW1lLCBhcnJheV9zbGljZShhcmd1bWVudHMsIDIpXSk7XG59O1xuXG5Qcm9taXNlLnByb3RvdHlwZS5zZW5kID0gLy8gWFhYIE1hcmsgTWlsbGVyJ3MgcHJvcG9zZWQgcGFybGFuY2VcblByb21pc2UucHJvdG90eXBlLm1jYWxsID0gLy8gWFhYIEFzIHByb3Bvc2VkIGJ5IFwiUmVkc2FuZHJvXCJcblByb21pc2UucHJvdG90eXBlLmludm9rZSA9IGZ1bmN0aW9uIChuYW1lIC8qLi4uYXJncyovKSB7XG4gICAgcmV0dXJuIHRoaXMuZGlzcGF0Y2goXCJwb3N0XCIsIFtuYW1lLCBhcnJheV9zbGljZShhcmd1bWVudHMsIDEpXSk7XG59O1xuXG4vKipcbiAqIEFwcGxpZXMgdGhlIHByb21pc2VkIGZ1bmN0aW9uIGluIGEgZnV0dXJlIHR1cm4uXG4gKiBAcGFyYW0gb2JqZWN0ICAgIHByb21pc2Ugb3IgaW1tZWRpYXRlIHJlZmVyZW5jZSBmb3IgdGFyZ2V0IGZ1bmN0aW9uXG4gKiBAcGFyYW0gYXJncyAgICAgIGFycmF5IG9mIGFwcGxpY2F0aW9uIGFyZ3VtZW50c1xuICovXG5RLmZhcHBseSA9IGZ1bmN0aW9uIChvYmplY3QsIGFyZ3MpIHtcbiAgICByZXR1cm4gUShvYmplY3QpLmRpc3BhdGNoKFwiYXBwbHlcIiwgW3ZvaWQgMCwgYXJnc10pO1xufTtcblxuUHJvbWlzZS5wcm90b3R5cGUuZmFwcGx5ID0gZnVuY3Rpb24gKGFyZ3MpIHtcbiAgICByZXR1cm4gdGhpcy5kaXNwYXRjaChcImFwcGx5XCIsIFt2b2lkIDAsIGFyZ3NdKTtcbn07XG5cbi8qKlxuICogQ2FsbHMgdGhlIHByb21pc2VkIGZ1bmN0aW9uIGluIGEgZnV0dXJlIHR1cm4uXG4gKiBAcGFyYW0gb2JqZWN0ICAgIHByb21pc2Ugb3IgaW1tZWRpYXRlIHJlZmVyZW5jZSBmb3IgdGFyZ2V0IGZ1bmN0aW9uXG4gKiBAcGFyYW0gLi4uYXJncyAgIGFycmF5IG9mIGFwcGxpY2F0aW9uIGFyZ3VtZW50c1xuICovXG5RW1widHJ5XCJdID1cblEuZmNhbGwgPSBmdW5jdGlvbiAob2JqZWN0IC8qIC4uLmFyZ3MqLykge1xuICAgIHJldHVybiBRKG9iamVjdCkuZGlzcGF0Y2goXCJhcHBseVwiLCBbdm9pZCAwLCBhcnJheV9zbGljZShhcmd1bWVudHMsIDEpXSk7XG59O1xuXG5Qcm9taXNlLnByb3RvdHlwZS5mY2FsbCA9IGZ1bmN0aW9uICgvKi4uLmFyZ3MqLykge1xuICAgIHJldHVybiB0aGlzLmRpc3BhdGNoKFwiYXBwbHlcIiwgW3ZvaWQgMCwgYXJyYXlfc2xpY2UoYXJndW1lbnRzKV0pO1xufTtcblxuLyoqXG4gKiBCaW5kcyB0aGUgcHJvbWlzZWQgZnVuY3Rpb24sIHRyYW5zZm9ybWluZyByZXR1cm4gdmFsdWVzIGludG8gYSBmdWxmaWxsZWRcbiAqIHByb21pc2UgYW5kIHRocm93biBlcnJvcnMgaW50byBhIHJlamVjdGVkIG9uZS5cbiAqIEBwYXJhbSBvYmplY3QgICAgcHJvbWlzZSBvciBpbW1lZGlhdGUgcmVmZXJlbmNlIGZvciB0YXJnZXQgZnVuY3Rpb25cbiAqIEBwYXJhbSAuLi5hcmdzICAgYXJyYXkgb2YgYXBwbGljYXRpb24gYXJndW1lbnRzXG4gKi9cblEuZmJpbmQgPSBmdW5jdGlvbiAob2JqZWN0IC8qLi4uYXJncyovKSB7XG4gICAgdmFyIHByb21pc2UgPSBRKG9iamVjdCk7XG4gICAgdmFyIGFyZ3MgPSBhcnJheV9zbGljZShhcmd1bWVudHMsIDEpO1xuICAgIHJldHVybiBmdW5jdGlvbiBmYm91bmQoKSB7XG4gICAgICAgIHJldHVybiBwcm9taXNlLmRpc3BhdGNoKFwiYXBwbHlcIiwgW1xuICAgICAgICAgICAgdGhpcyxcbiAgICAgICAgICAgIGFyZ3MuY29uY2F0KGFycmF5X3NsaWNlKGFyZ3VtZW50cykpXG4gICAgICAgIF0pO1xuICAgIH07XG59O1xuUHJvbWlzZS5wcm90b3R5cGUuZmJpbmQgPSBmdW5jdGlvbiAoLyouLi5hcmdzKi8pIHtcbiAgICB2YXIgcHJvbWlzZSA9IHRoaXM7XG4gICAgdmFyIGFyZ3MgPSBhcnJheV9zbGljZShhcmd1bWVudHMpO1xuICAgIHJldHVybiBmdW5jdGlvbiBmYm91bmQoKSB7XG4gICAgICAgIHJldHVybiBwcm9taXNlLmRpc3BhdGNoKFwiYXBwbHlcIiwgW1xuICAgICAgICAgICAgdGhpcyxcbiAgICAgICAgICAgIGFyZ3MuY29uY2F0KGFycmF5X3NsaWNlKGFyZ3VtZW50cykpXG4gICAgICAgIF0pO1xuICAgIH07XG59O1xuXG4vKipcbiAqIFJlcXVlc3RzIHRoZSBuYW1lcyBvZiB0aGUgb3duZWQgcHJvcGVydGllcyBvZiBhIHByb21pc2VkXG4gKiBvYmplY3QgaW4gYSBmdXR1cmUgdHVybi5cbiAqIEBwYXJhbSBvYmplY3QgICAgcHJvbWlzZSBvciBpbW1lZGlhdGUgcmVmZXJlbmNlIGZvciB0YXJnZXQgb2JqZWN0XG4gKiBAcmV0dXJuIHByb21pc2UgZm9yIHRoZSBrZXlzIG9mIHRoZSBldmVudHVhbGx5IHNldHRsZWQgb2JqZWN0XG4gKi9cblEua2V5cyA9IGZ1bmN0aW9uIChvYmplY3QpIHtcbiAgICByZXR1cm4gUShvYmplY3QpLmRpc3BhdGNoKFwia2V5c1wiLCBbXSk7XG59O1xuXG5Qcm9taXNlLnByb3RvdHlwZS5rZXlzID0gZnVuY3Rpb24gKCkge1xuICAgIHJldHVybiB0aGlzLmRpc3BhdGNoKFwia2V5c1wiLCBbXSk7XG59O1xuXG4vKipcbiAqIFR1cm5zIGFuIGFycmF5IG9mIHByb21pc2VzIGludG8gYSBwcm9taXNlIGZvciBhbiBhcnJheS4gIElmIGFueSBvZlxuICogdGhlIHByb21pc2VzIGdldHMgcmVqZWN0ZWQsIHRoZSB3aG9sZSBhcnJheSBpcyByZWplY3RlZCBpbW1lZGlhdGVseS5cbiAqIEBwYXJhbSB7QXJyYXkqfSBhbiBhcnJheSAob3IgcHJvbWlzZSBmb3IgYW4gYXJyYXkpIG9mIHZhbHVlcyAob3JcbiAqIHByb21pc2VzIGZvciB2YWx1ZXMpXG4gKiBAcmV0dXJucyBhIHByb21pc2UgZm9yIGFuIGFycmF5IG9mIHRoZSBjb3JyZXNwb25kaW5nIHZhbHVlc1xuICovXG4vLyBCeSBNYXJrIE1pbGxlclxuLy8gaHR0cDovL3dpa2kuZWNtYXNjcmlwdC5vcmcvZG9rdS5waHA/aWQ9c3RyYXdtYW46Y29uY3VycmVuY3kmcmV2PTEzMDg3NzY1MjEjYWxsZnVsZmlsbGVkXG5RLmFsbCA9IGFsbDtcbmZ1bmN0aW9uIGFsbChwcm9taXNlcykge1xuICAgIHJldHVybiB3aGVuKHByb21pc2VzLCBmdW5jdGlvbiAocHJvbWlzZXMpIHtcbiAgICAgICAgdmFyIHBlbmRpbmdDb3VudCA9IDA7XG4gICAgICAgIHZhciBkZWZlcnJlZCA9IGRlZmVyKCk7XG4gICAgICAgIGFycmF5X3JlZHVjZShwcm9taXNlcywgZnVuY3Rpb24gKHVuZGVmaW5lZCwgcHJvbWlzZSwgaW5kZXgpIHtcbiAgICAgICAgICAgIHZhciBzbmFwc2hvdDtcbiAgICAgICAgICAgIGlmIChcbiAgICAgICAgICAgICAgICBpc1Byb21pc2UocHJvbWlzZSkgJiZcbiAgICAgICAgICAgICAgICAoc25hcHNob3QgPSBwcm9taXNlLmluc3BlY3QoKSkuc3RhdGUgPT09IFwiZnVsZmlsbGVkXCJcbiAgICAgICAgICAgICkge1xuICAgICAgICAgICAgICAgIHByb21pc2VzW2luZGV4XSA9IHNuYXBzaG90LnZhbHVlO1xuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICArK3BlbmRpbmdDb3VudDtcbiAgICAgICAgICAgICAgICB3aGVuKFxuICAgICAgICAgICAgICAgICAgICBwcm9taXNlLFxuICAgICAgICAgICAgICAgICAgICBmdW5jdGlvbiAodmFsdWUpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHByb21pc2VzW2luZGV4XSA9IHZhbHVlO1xuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKC0tcGVuZGluZ0NvdW50ID09PSAwKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgZGVmZXJyZWQucmVzb2x2ZShwcm9taXNlcyk7XG4gICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgICAgICAgIGRlZmVycmVkLnJlamVjdCxcbiAgICAgICAgICAgICAgICAgICAgZnVuY3Rpb24gKHByb2dyZXNzKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBkZWZlcnJlZC5ub3RpZnkoeyBpbmRleDogaW5kZXgsIHZhbHVlOiBwcm9ncmVzcyB9KTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH0sIHZvaWQgMCk7XG4gICAgICAgIGlmIChwZW5kaW5nQ291bnQgPT09IDApIHtcbiAgICAgICAgICAgIGRlZmVycmVkLnJlc29sdmUocHJvbWlzZXMpO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBkZWZlcnJlZC5wcm9taXNlO1xuICAgIH0pO1xufVxuXG5Qcm9taXNlLnByb3RvdHlwZS5hbGwgPSBmdW5jdGlvbiAoKSB7XG4gICAgcmV0dXJuIGFsbCh0aGlzKTtcbn07XG5cbi8qKlxuICogUmV0dXJucyB0aGUgZmlyc3QgcmVzb2x2ZWQgcHJvbWlzZSBvZiBhbiBhcnJheS4gUHJpb3IgcmVqZWN0ZWQgcHJvbWlzZXMgYXJlXG4gKiBpZ25vcmVkLiAgUmVqZWN0cyBvbmx5IGlmIGFsbCBwcm9taXNlcyBhcmUgcmVqZWN0ZWQuXG4gKiBAcGFyYW0ge0FycmF5Kn0gYW4gYXJyYXkgY29udGFpbmluZyB2YWx1ZXMgb3IgcHJvbWlzZXMgZm9yIHZhbHVlc1xuICogQHJldHVybnMgYSBwcm9taXNlIGZ1bGZpbGxlZCB3aXRoIHRoZSB2YWx1ZSBvZiB0aGUgZmlyc3QgcmVzb2x2ZWQgcHJvbWlzZSxcbiAqIG9yIGEgcmVqZWN0ZWQgcHJvbWlzZSBpZiBhbGwgcHJvbWlzZXMgYXJlIHJlamVjdGVkLlxuICovXG5RLmFueSA9IGFueTtcblxuZnVuY3Rpb24gYW55KHByb21pc2VzKSB7XG4gICAgaWYgKHByb21pc2VzLmxlbmd0aCA9PT0gMCkge1xuICAgICAgICByZXR1cm4gUS5yZXNvbHZlKCk7XG4gICAgfVxuXG4gICAgdmFyIGRlZmVycmVkID0gUS5kZWZlcigpO1xuICAgIHZhciBwZW5kaW5nQ291bnQgPSAwO1xuICAgIGFycmF5X3JlZHVjZShwcm9taXNlcywgZnVuY3Rpb24gKHByZXYsIGN1cnJlbnQsIGluZGV4KSB7XG4gICAgICAgIHZhciBwcm9taXNlID0gcHJvbWlzZXNbaW5kZXhdO1xuXG4gICAgICAgIHBlbmRpbmdDb3VudCsrO1xuXG4gICAgICAgIHdoZW4ocHJvbWlzZSwgb25GdWxmaWxsZWQsIG9uUmVqZWN0ZWQsIG9uUHJvZ3Jlc3MpO1xuICAgICAgICBmdW5jdGlvbiBvbkZ1bGZpbGxlZChyZXN1bHQpIHtcbiAgICAgICAgICAgIGRlZmVycmVkLnJlc29sdmUocmVzdWx0KTtcbiAgICAgICAgfVxuICAgICAgICBmdW5jdGlvbiBvblJlamVjdGVkKCkge1xuICAgICAgICAgICAgcGVuZGluZ0NvdW50LS07XG4gICAgICAgICAgICBpZiAocGVuZGluZ0NvdW50ID09PSAwKSB7XG4gICAgICAgICAgICAgICAgZGVmZXJyZWQucmVqZWN0KG5ldyBFcnJvcihcbiAgICAgICAgICAgICAgICAgICAgXCJDYW4ndCBnZXQgZnVsZmlsbG1lbnQgdmFsdWUgZnJvbSBhbnkgcHJvbWlzZSwgYWxsIFwiICtcbiAgICAgICAgICAgICAgICAgICAgXCJwcm9taXNlcyB3ZXJlIHJlamVjdGVkLlwiXG4gICAgICAgICAgICAgICAgKSk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgZnVuY3Rpb24gb25Qcm9ncmVzcyhwcm9ncmVzcykge1xuICAgICAgICAgICAgZGVmZXJyZWQubm90aWZ5KHtcbiAgICAgICAgICAgICAgICBpbmRleDogaW5kZXgsXG4gICAgICAgICAgICAgICAgdmFsdWU6IHByb2dyZXNzXG4gICAgICAgICAgICB9KTtcbiAgICAgICAgfVxuICAgIH0sIHVuZGVmaW5lZCk7XG5cbiAgICByZXR1cm4gZGVmZXJyZWQucHJvbWlzZTtcbn1cblxuUHJvbWlzZS5wcm90b3R5cGUuYW55ID0gZnVuY3Rpb24gKCkge1xuICAgIHJldHVybiBhbnkodGhpcyk7XG59O1xuXG4vKipcbiAqIFdhaXRzIGZvciBhbGwgcHJvbWlzZXMgdG8gYmUgc2V0dGxlZCwgZWl0aGVyIGZ1bGZpbGxlZCBvclxuICogcmVqZWN0ZWQuICBUaGlzIGlzIGRpc3RpbmN0IGZyb20gYGFsbGAgc2luY2UgdGhhdCB3b3VsZCBzdG9wXG4gKiB3YWl0aW5nIGF0IHRoZSBmaXJzdCByZWplY3Rpb24uICBUaGUgcHJvbWlzZSByZXR1cm5lZCBieVxuICogYGFsbFJlc29sdmVkYCB3aWxsIG5ldmVyIGJlIHJlamVjdGVkLlxuICogQHBhcmFtIHByb21pc2VzIGEgcHJvbWlzZSBmb3IgYW4gYXJyYXkgKG9yIGFuIGFycmF5KSBvZiBwcm9taXNlc1xuICogKG9yIHZhbHVlcylcbiAqIEByZXR1cm4gYSBwcm9taXNlIGZvciBhbiBhcnJheSBvZiBwcm9taXNlc1xuICovXG5RLmFsbFJlc29sdmVkID0gZGVwcmVjYXRlKGFsbFJlc29sdmVkLCBcImFsbFJlc29sdmVkXCIsIFwiYWxsU2V0dGxlZFwiKTtcbmZ1bmN0aW9uIGFsbFJlc29sdmVkKHByb21pc2VzKSB7XG4gICAgcmV0dXJuIHdoZW4ocHJvbWlzZXMsIGZ1bmN0aW9uIChwcm9taXNlcykge1xuICAgICAgICBwcm9taXNlcyA9IGFycmF5X21hcChwcm9taXNlcywgUSk7XG4gICAgICAgIHJldHVybiB3aGVuKGFsbChhcnJheV9tYXAocHJvbWlzZXMsIGZ1bmN0aW9uIChwcm9taXNlKSB7XG4gICAgICAgICAgICByZXR1cm4gd2hlbihwcm9taXNlLCBub29wLCBub29wKTtcbiAgICAgICAgfSkpLCBmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgICByZXR1cm4gcHJvbWlzZXM7XG4gICAgICAgIH0pO1xuICAgIH0pO1xufVxuXG5Qcm9taXNlLnByb3RvdHlwZS5hbGxSZXNvbHZlZCA9IGZ1bmN0aW9uICgpIHtcbiAgICByZXR1cm4gYWxsUmVzb2x2ZWQodGhpcyk7XG59O1xuXG4vKipcbiAqIEBzZWUgUHJvbWlzZSNhbGxTZXR0bGVkXG4gKi9cblEuYWxsU2V0dGxlZCA9IGFsbFNldHRsZWQ7XG5mdW5jdGlvbiBhbGxTZXR0bGVkKHByb21pc2VzKSB7XG4gICAgcmV0dXJuIFEocHJvbWlzZXMpLmFsbFNldHRsZWQoKTtcbn1cblxuLyoqXG4gKiBUdXJucyBhbiBhcnJheSBvZiBwcm9taXNlcyBpbnRvIGEgcHJvbWlzZSBmb3IgYW4gYXJyYXkgb2YgdGhlaXIgc3RhdGVzIChhc1xuICogcmV0dXJuZWQgYnkgYGluc3BlY3RgKSB3aGVuIHRoZXkgaGF2ZSBhbGwgc2V0dGxlZC5cbiAqIEBwYXJhbSB7QXJyYXlbQW55Kl19IHZhbHVlcyBhbiBhcnJheSAob3IgcHJvbWlzZSBmb3IgYW4gYXJyYXkpIG9mIHZhbHVlcyAob3JcbiAqIHByb21pc2VzIGZvciB2YWx1ZXMpXG4gKiBAcmV0dXJucyB7QXJyYXlbU3RhdGVdfSBhbiBhcnJheSBvZiBzdGF0ZXMgZm9yIHRoZSByZXNwZWN0aXZlIHZhbHVlcy5cbiAqL1xuUHJvbWlzZS5wcm90b3R5cGUuYWxsU2V0dGxlZCA9IGZ1bmN0aW9uICgpIHtcbiAgICByZXR1cm4gdGhpcy50aGVuKGZ1bmN0aW9uIChwcm9taXNlcykge1xuICAgICAgICByZXR1cm4gYWxsKGFycmF5X21hcChwcm9taXNlcywgZnVuY3Rpb24gKHByb21pc2UpIHtcbiAgICAgICAgICAgIHByb21pc2UgPSBRKHByb21pc2UpO1xuICAgICAgICAgICAgZnVuY3Rpb24gcmVnYXJkbGVzcygpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gcHJvbWlzZS5pbnNwZWN0KCk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICByZXR1cm4gcHJvbWlzZS50aGVuKHJlZ2FyZGxlc3MsIHJlZ2FyZGxlc3MpO1xuICAgICAgICB9KSk7XG4gICAgfSk7XG59O1xuXG4vKipcbiAqIENhcHR1cmVzIHRoZSBmYWlsdXJlIG9mIGEgcHJvbWlzZSwgZ2l2aW5nIGFuIG9wb3J0dW5pdHkgdG8gcmVjb3ZlclxuICogd2l0aCBhIGNhbGxiYWNrLiAgSWYgdGhlIGdpdmVuIHByb21pc2UgaXMgZnVsZmlsbGVkLCB0aGUgcmV0dXJuZWRcbiAqIHByb21pc2UgaXMgZnVsZmlsbGVkLlxuICogQHBhcmFtIHtBbnkqfSBwcm9taXNlIGZvciBzb21ldGhpbmdcbiAqIEBwYXJhbSB7RnVuY3Rpb259IGNhbGxiYWNrIHRvIGZ1bGZpbGwgdGhlIHJldHVybmVkIHByb21pc2UgaWYgdGhlXG4gKiBnaXZlbiBwcm9taXNlIGlzIHJlamVjdGVkXG4gKiBAcmV0dXJucyBhIHByb21pc2UgZm9yIHRoZSByZXR1cm4gdmFsdWUgb2YgdGhlIGNhbGxiYWNrXG4gKi9cblEuZmFpbCA9IC8vIFhYWCBsZWdhY3lcblFbXCJjYXRjaFwiXSA9IGZ1bmN0aW9uIChvYmplY3QsIHJlamVjdGVkKSB7XG4gICAgcmV0dXJuIFEob2JqZWN0KS50aGVuKHZvaWQgMCwgcmVqZWN0ZWQpO1xufTtcblxuUHJvbWlzZS5wcm90b3R5cGUuZmFpbCA9IC8vIFhYWCBsZWdhY3lcblByb21pc2UucHJvdG90eXBlW1wiY2F0Y2hcIl0gPSBmdW5jdGlvbiAocmVqZWN0ZWQpIHtcbiAgICByZXR1cm4gdGhpcy50aGVuKHZvaWQgMCwgcmVqZWN0ZWQpO1xufTtcblxuLyoqXG4gKiBBdHRhY2hlcyBhIGxpc3RlbmVyIHRoYXQgY2FuIHJlc3BvbmQgdG8gcHJvZ3Jlc3Mgbm90aWZpY2F0aW9ucyBmcm9tIGFcbiAqIHByb21pc2UncyBvcmlnaW5hdGluZyBkZWZlcnJlZC4gVGhpcyBsaXN0ZW5lciByZWNlaXZlcyB0aGUgZXhhY3QgYXJndW1lbnRzXG4gKiBwYXNzZWQgdG8gYGBkZWZlcnJlZC5ub3RpZnlgYC5cbiAqIEBwYXJhbSB7QW55Kn0gcHJvbWlzZSBmb3Igc29tZXRoaW5nXG4gKiBAcGFyYW0ge0Z1bmN0aW9ufSBjYWxsYmFjayB0byByZWNlaXZlIGFueSBwcm9ncmVzcyBub3RpZmljYXRpb25zXG4gKiBAcmV0dXJucyB0aGUgZ2l2ZW4gcHJvbWlzZSwgdW5jaGFuZ2VkXG4gKi9cblEucHJvZ3Jlc3MgPSBwcm9ncmVzcztcbmZ1bmN0aW9uIHByb2dyZXNzKG9iamVjdCwgcHJvZ3Jlc3NlZCkge1xuICAgIHJldHVybiBRKG9iamVjdCkudGhlbih2b2lkIDAsIHZvaWQgMCwgcHJvZ3Jlc3NlZCk7XG59XG5cblByb21pc2UucHJvdG90eXBlLnByb2dyZXNzID0gZnVuY3Rpb24gKHByb2dyZXNzZWQpIHtcbiAgICByZXR1cm4gdGhpcy50aGVuKHZvaWQgMCwgdm9pZCAwLCBwcm9ncmVzc2VkKTtcbn07XG5cbi8qKlxuICogUHJvdmlkZXMgYW4gb3Bwb3J0dW5pdHkgdG8gb2JzZXJ2ZSB0aGUgc2V0dGxpbmcgb2YgYSBwcm9taXNlLFxuICogcmVnYXJkbGVzcyBvZiB3aGV0aGVyIHRoZSBwcm9taXNlIGlzIGZ1bGZpbGxlZCBvciByZWplY3RlZC4gIEZvcndhcmRzXG4gKiB0aGUgcmVzb2x1dGlvbiB0byB0aGUgcmV0dXJuZWQgcHJvbWlzZSB3aGVuIHRoZSBjYWxsYmFjayBpcyBkb25lLlxuICogVGhlIGNhbGxiYWNrIGNhbiByZXR1cm4gYSBwcm9taXNlIHRvIGRlZmVyIGNvbXBsZXRpb24uXG4gKiBAcGFyYW0ge0FueSp9IHByb21pc2VcbiAqIEBwYXJhbSB7RnVuY3Rpb259IGNhbGxiYWNrIHRvIG9ic2VydmUgdGhlIHJlc29sdXRpb24gb2YgdGhlIGdpdmVuXG4gKiBwcm9taXNlLCB0YWtlcyBubyBhcmd1bWVudHMuXG4gKiBAcmV0dXJucyBhIHByb21pc2UgZm9yIHRoZSByZXNvbHV0aW9uIG9mIHRoZSBnaXZlbiBwcm9taXNlIHdoZW5cbiAqIGBgZmluYGAgaXMgZG9uZS5cbiAqL1xuUS5maW4gPSAvLyBYWFggbGVnYWN5XG5RW1wiZmluYWxseVwiXSA9IGZ1bmN0aW9uIChvYmplY3QsIGNhbGxiYWNrKSB7XG4gICAgcmV0dXJuIFEob2JqZWN0KVtcImZpbmFsbHlcIl0oY2FsbGJhY2spO1xufTtcblxuUHJvbWlzZS5wcm90b3R5cGUuZmluID0gLy8gWFhYIGxlZ2FjeVxuUHJvbWlzZS5wcm90b3R5cGVbXCJmaW5hbGx5XCJdID0gZnVuY3Rpb24gKGNhbGxiYWNrKSB7XG4gICAgY2FsbGJhY2sgPSBRKGNhbGxiYWNrKTtcbiAgICByZXR1cm4gdGhpcy50aGVuKGZ1bmN0aW9uICh2YWx1ZSkge1xuICAgICAgICByZXR1cm4gY2FsbGJhY2suZmNhbGwoKS50aGVuKGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICAgIHJldHVybiB2YWx1ZTtcbiAgICAgICAgfSk7XG4gICAgfSwgZnVuY3Rpb24gKHJlYXNvbikge1xuICAgICAgICAvLyBUT0RPIGF0dGVtcHQgdG8gcmVjeWNsZSB0aGUgcmVqZWN0aW9uIHdpdGggXCJ0aGlzXCIuXG4gICAgICAgIHJldHVybiBjYWxsYmFjay5mY2FsbCgpLnRoZW4oZnVuY3Rpb24gKCkge1xuICAgICAgICAgICAgdGhyb3cgcmVhc29uO1xuICAgICAgICB9KTtcbiAgICB9KTtcbn07XG5cbi8qKlxuICogVGVybWluYXRlcyBhIGNoYWluIG9mIHByb21pc2VzLCBmb3JjaW5nIHJlamVjdGlvbnMgdG8gYmVcbiAqIHRocm93biBhcyBleGNlcHRpb25zLlxuICogQHBhcmFtIHtBbnkqfSBwcm9taXNlIGF0IHRoZSBlbmQgb2YgYSBjaGFpbiBvZiBwcm9taXNlc1xuICogQHJldHVybnMgbm90aGluZ1xuICovXG5RLmRvbmUgPSBmdW5jdGlvbiAob2JqZWN0LCBmdWxmaWxsZWQsIHJlamVjdGVkLCBwcm9ncmVzcykge1xuICAgIHJldHVybiBRKG9iamVjdCkuZG9uZShmdWxmaWxsZWQsIHJlamVjdGVkLCBwcm9ncmVzcyk7XG59O1xuXG5Qcm9taXNlLnByb3RvdHlwZS5kb25lID0gZnVuY3Rpb24gKGZ1bGZpbGxlZCwgcmVqZWN0ZWQsIHByb2dyZXNzKSB7XG4gICAgdmFyIG9uVW5oYW5kbGVkRXJyb3IgPSBmdW5jdGlvbiAoZXJyb3IpIHtcbiAgICAgICAgLy8gZm9yd2FyZCB0byBhIGZ1dHVyZSB0dXJuIHNvIHRoYXQgYGB3aGVuYGBcbiAgICAgICAgLy8gZG9lcyBub3QgY2F0Y2ggaXQgYW5kIHR1cm4gaXQgaW50byBhIHJlamVjdGlvbi5cbiAgICAgICAgUS5uZXh0VGljayhmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgICBtYWtlU3RhY2tUcmFjZUxvbmcoZXJyb3IsIHByb21pc2UpO1xuICAgICAgICAgICAgaWYgKFEub25lcnJvcikge1xuICAgICAgICAgICAgICAgIFEub25lcnJvcihlcnJvcik7XG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgIHRocm93IGVycm9yO1xuICAgICAgICAgICAgfVxuICAgICAgICB9KTtcbiAgICB9O1xuXG4gICAgLy8gQXZvaWQgdW5uZWNlc3NhcnkgYG5leHRUaWNrYGluZyB2aWEgYW4gdW5uZWNlc3NhcnkgYHdoZW5gLlxuICAgIHZhciBwcm9taXNlID0gZnVsZmlsbGVkIHx8IHJlamVjdGVkIHx8IHByb2dyZXNzID9cbiAgICAgICAgdGhpcy50aGVuKGZ1bGZpbGxlZCwgcmVqZWN0ZWQsIHByb2dyZXNzKSA6XG4gICAgICAgIHRoaXM7XG5cbiAgICBpZiAodHlwZW9mIHByb2Nlc3MgPT09IFwib2JqZWN0XCIgJiYgcHJvY2VzcyAmJiBwcm9jZXNzLmRvbWFpbikge1xuICAgICAgICBvblVuaGFuZGxlZEVycm9yID0gcHJvY2Vzcy5kb21haW4uYmluZChvblVuaGFuZGxlZEVycm9yKTtcbiAgICB9XG5cbiAgICBwcm9taXNlLnRoZW4odm9pZCAwLCBvblVuaGFuZGxlZEVycm9yKTtcbn07XG5cbi8qKlxuICogQ2F1c2VzIGEgcHJvbWlzZSB0byBiZSByZWplY3RlZCBpZiBpdCBkb2VzIG5vdCBnZXQgZnVsZmlsbGVkIGJlZm9yZVxuICogc29tZSBtaWxsaXNlY29uZHMgdGltZSBvdXQuXG4gKiBAcGFyYW0ge0FueSp9IHByb21pc2VcbiAqIEBwYXJhbSB7TnVtYmVyfSBtaWxsaXNlY29uZHMgdGltZW91dFxuICogQHBhcmFtIHtBbnkqfSBjdXN0b20gZXJyb3IgbWVzc2FnZSBvciBFcnJvciBvYmplY3QgKG9wdGlvbmFsKVxuICogQHJldHVybnMgYSBwcm9taXNlIGZvciB0aGUgcmVzb2x1dGlvbiBvZiB0aGUgZ2l2ZW4gcHJvbWlzZSBpZiBpdCBpc1xuICogZnVsZmlsbGVkIGJlZm9yZSB0aGUgdGltZW91dCwgb3RoZXJ3aXNlIHJlamVjdGVkLlxuICovXG5RLnRpbWVvdXQgPSBmdW5jdGlvbiAob2JqZWN0LCBtcywgZXJyb3IpIHtcbiAgICByZXR1cm4gUShvYmplY3QpLnRpbWVvdXQobXMsIGVycm9yKTtcbn07XG5cblByb21pc2UucHJvdG90eXBlLnRpbWVvdXQgPSBmdW5jdGlvbiAobXMsIGVycm9yKSB7XG4gICAgdmFyIGRlZmVycmVkID0gZGVmZXIoKTtcbiAgICB2YXIgdGltZW91dElkID0gc2V0VGltZW91dChmdW5jdGlvbiAoKSB7XG4gICAgICAgIGlmICghZXJyb3IgfHwgXCJzdHJpbmdcIiA9PT0gdHlwZW9mIGVycm9yKSB7XG4gICAgICAgICAgICBlcnJvciA9IG5ldyBFcnJvcihlcnJvciB8fCBcIlRpbWVkIG91dCBhZnRlciBcIiArIG1zICsgXCIgbXNcIik7XG4gICAgICAgICAgICBlcnJvci5jb2RlID0gXCJFVElNRURPVVRcIjtcbiAgICAgICAgfVxuICAgICAgICBkZWZlcnJlZC5yZWplY3QoZXJyb3IpO1xuICAgIH0sIG1zKTtcblxuICAgIHRoaXMudGhlbihmdW5jdGlvbiAodmFsdWUpIHtcbiAgICAgICAgY2xlYXJUaW1lb3V0KHRpbWVvdXRJZCk7XG4gICAgICAgIGRlZmVycmVkLnJlc29sdmUodmFsdWUpO1xuICAgIH0sIGZ1bmN0aW9uIChleGNlcHRpb24pIHtcbiAgICAgICAgY2xlYXJUaW1lb3V0KHRpbWVvdXRJZCk7XG4gICAgICAgIGRlZmVycmVkLnJlamVjdChleGNlcHRpb24pO1xuICAgIH0sIGRlZmVycmVkLm5vdGlmeSk7XG5cbiAgICByZXR1cm4gZGVmZXJyZWQucHJvbWlzZTtcbn07XG5cbi8qKlxuICogUmV0dXJucyBhIHByb21pc2UgZm9yIHRoZSBnaXZlbiB2YWx1ZSAob3IgcHJvbWlzZWQgdmFsdWUpLCBzb21lXG4gKiBtaWxsaXNlY29uZHMgYWZ0ZXIgaXQgcmVzb2x2ZWQuIFBhc3NlcyByZWplY3Rpb25zIGltbWVkaWF0ZWx5LlxuICogQHBhcmFtIHtBbnkqfSBwcm9taXNlXG4gKiBAcGFyYW0ge051bWJlcn0gbWlsbGlzZWNvbmRzXG4gKiBAcmV0dXJucyBhIHByb21pc2UgZm9yIHRoZSByZXNvbHV0aW9uIG9mIHRoZSBnaXZlbiBwcm9taXNlIGFmdGVyIG1pbGxpc2Vjb25kc1xuICogdGltZSBoYXMgZWxhcHNlZCBzaW5jZSB0aGUgcmVzb2x1dGlvbiBvZiB0aGUgZ2l2ZW4gcHJvbWlzZS5cbiAqIElmIHRoZSBnaXZlbiBwcm9taXNlIHJlamVjdHMsIHRoYXQgaXMgcGFzc2VkIGltbWVkaWF0ZWx5LlxuICovXG5RLmRlbGF5ID0gZnVuY3Rpb24gKG9iamVjdCwgdGltZW91dCkge1xuICAgIGlmICh0aW1lb3V0ID09PSB2b2lkIDApIHtcbiAgICAgICAgdGltZW91dCA9IG9iamVjdDtcbiAgICAgICAgb2JqZWN0ID0gdm9pZCAwO1xuICAgIH1cbiAgICByZXR1cm4gUShvYmplY3QpLmRlbGF5KHRpbWVvdXQpO1xufTtcblxuUHJvbWlzZS5wcm90b3R5cGUuZGVsYXkgPSBmdW5jdGlvbiAodGltZW91dCkge1xuICAgIHJldHVybiB0aGlzLnRoZW4oZnVuY3Rpb24gKHZhbHVlKSB7XG4gICAgICAgIHZhciBkZWZlcnJlZCA9IGRlZmVyKCk7XG4gICAgICAgIHNldFRpbWVvdXQoZnVuY3Rpb24gKCkge1xuICAgICAgICAgICAgZGVmZXJyZWQucmVzb2x2ZSh2YWx1ZSk7XG4gICAgICAgIH0sIHRpbWVvdXQpO1xuICAgICAgICByZXR1cm4gZGVmZXJyZWQucHJvbWlzZTtcbiAgICB9KTtcbn07XG5cbi8qKlxuICogUGFzc2VzIGEgY29udGludWF0aW9uIHRvIGEgTm9kZSBmdW5jdGlvbiwgd2hpY2ggaXMgY2FsbGVkIHdpdGggdGhlIGdpdmVuXG4gKiBhcmd1bWVudHMgcHJvdmlkZWQgYXMgYW4gYXJyYXksIGFuZCByZXR1cm5zIGEgcHJvbWlzZS5cbiAqXG4gKiAgICAgIFEubmZhcHBseShGUy5yZWFkRmlsZSwgW19fZmlsZW5hbWVdKVxuICogICAgICAudGhlbihmdW5jdGlvbiAoY29udGVudCkge1xuICogICAgICB9KVxuICpcbiAqL1xuUS5uZmFwcGx5ID0gZnVuY3Rpb24gKGNhbGxiYWNrLCBhcmdzKSB7XG4gICAgcmV0dXJuIFEoY2FsbGJhY2spLm5mYXBwbHkoYXJncyk7XG59O1xuXG5Qcm9taXNlLnByb3RvdHlwZS5uZmFwcGx5ID0gZnVuY3Rpb24gKGFyZ3MpIHtcbiAgICB2YXIgZGVmZXJyZWQgPSBkZWZlcigpO1xuICAgIHZhciBub2RlQXJncyA9IGFycmF5X3NsaWNlKGFyZ3MpO1xuICAgIG5vZGVBcmdzLnB1c2goZGVmZXJyZWQubWFrZU5vZGVSZXNvbHZlcigpKTtcbiAgICB0aGlzLmZhcHBseShub2RlQXJncykuZmFpbChkZWZlcnJlZC5yZWplY3QpO1xuICAgIHJldHVybiBkZWZlcnJlZC5wcm9taXNlO1xufTtcblxuLyoqXG4gKiBQYXNzZXMgYSBjb250aW51YXRpb24gdG8gYSBOb2RlIGZ1bmN0aW9uLCB3aGljaCBpcyBjYWxsZWQgd2l0aCB0aGUgZ2l2ZW5cbiAqIGFyZ3VtZW50cyBwcm92aWRlZCBpbmRpdmlkdWFsbHksIGFuZCByZXR1cm5zIGEgcHJvbWlzZS5cbiAqIEBleGFtcGxlXG4gKiBRLm5mY2FsbChGUy5yZWFkRmlsZSwgX19maWxlbmFtZSlcbiAqIC50aGVuKGZ1bmN0aW9uIChjb250ZW50KSB7XG4gKiB9KVxuICpcbiAqL1xuUS5uZmNhbGwgPSBmdW5jdGlvbiAoY2FsbGJhY2sgLyouLi5hcmdzKi8pIHtcbiAgICB2YXIgYXJncyA9IGFycmF5X3NsaWNlKGFyZ3VtZW50cywgMSk7XG4gICAgcmV0dXJuIFEoY2FsbGJhY2spLm5mYXBwbHkoYXJncyk7XG59O1xuXG5Qcm9taXNlLnByb3RvdHlwZS5uZmNhbGwgPSBmdW5jdGlvbiAoLyouLi5hcmdzKi8pIHtcbiAgICB2YXIgbm9kZUFyZ3MgPSBhcnJheV9zbGljZShhcmd1bWVudHMpO1xuICAgIHZhciBkZWZlcnJlZCA9IGRlZmVyKCk7XG4gICAgbm9kZUFyZ3MucHVzaChkZWZlcnJlZC5tYWtlTm9kZVJlc29sdmVyKCkpO1xuICAgIHRoaXMuZmFwcGx5KG5vZGVBcmdzKS5mYWlsKGRlZmVycmVkLnJlamVjdCk7XG4gICAgcmV0dXJuIGRlZmVycmVkLnByb21pc2U7XG59O1xuXG4vKipcbiAqIFdyYXBzIGEgTm9kZUpTIGNvbnRpbnVhdGlvbiBwYXNzaW5nIGZ1bmN0aW9uIGFuZCByZXR1cm5zIGFuIGVxdWl2YWxlbnRcbiAqIHZlcnNpb24gdGhhdCByZXR1cm5zIGEgcHJvbWlzZS5cbiAqIEBleGFtcGxlXG4gKiBRLm5mYmluZChGUy5yZWFkRmlsZSwgX19maWxlbmFtZSkoXCJ1dGYtOFwiKVxuICogLnRoZW4oY29uc29sZS5sb2cpXG4gKiAuZG9uZSgpXG4gKi9cblEubmZiaW5kID1cblEuZGVub2RlaWZ5ID0gZnVuY3Rpb24gKGNhbGxiYWNrIC8qLi4uYXJncyovKSB7XG4gICAgdmFyIGJhc2VBcmdzID0gYXJyYXlfc2xpY2UoYXJndW1lbnRzLCAxKTtcbiAgICByZXR1cm4gZnVuY3Rpb24gKCkge1xuICAgICAgICB2YXIgbm9kZUFyZ3MgPSBiYXNlQXJncy5jb25jYXQoYXJyYXlfc2xpY2UoYXJndW1lbnRzKSk7XG4gICAgICAgIHZhciBkZWZlcnJlZCA9IGRlZmVyKCk7XG4gICAgICAgIG5vZGVBcmdzLnB1c2goZGVmZXJyZWQubWFrZU5vZGVSZXNvbHZlcigpKTtcbiAgICAgICAgUShjYWxsYmFjaykuZmFwcGx5KG5vZGVBcmdzKS5mYWlsKGRlZmVycmVkLnJlamVjdCk7XG4gICAgICAgIHJldHVybiBkZWZlcnJlZC5wcm9taXNlO1xuICAgIH07XG59O1xuXG5Qcm9taXNlLnByb3RvdHlwZS5uZmJpbmQgPVxuUHJvbWlzZS5wcm90b3R5cGUuZGVub2RlaWZ5ID0gZnVuY3Rpb24gKC8qLi4uYXJncyovKSB7XG4gICAgdmFyIGFyZ3MgPSBhcnJheV9zbGljZShhcmd1bWVudHMpO1xuICAgIGFyZ3MudW5zaGlmdCh0aGlzKTtcbiAgICByZXR1cm4gUS5kZW5vZGVpZnkuYXBwbHkodm9pZCAwLCBhcmdzKTtcbn07XG5cblEubmJpbmQgPSBmdW5jdGlvbiAoY2FsbGJhY2ssIHRoaXNwIC8qLi4uYXJncyovKSB7XG4gICAgdmFyIGJhc2VBcmdzID0gYXJyYXlfc2xpY2UoYXJndW1lbnRzLCAyKTtcbiAgICByZXR1cm4gZnVuY3Rpb24gKCkge1xuICAgICAgICB2YXIgbm9kZUFyZ3MgPSBiYXNlQXJncy5jb25jYXQoYXJyYXlfc2xpY2UoYXJndW1lbnRzKSk7XG4gICAgICAgIHZhciBkZWZlcnJlZCA9IGRlZmVyKCk7XG4gICAgICAgIG5vZGVBcmdzLnB1c2goZGVmZXJyZWQubWFrZU5vZGVSZXNvbHZlcigpKTtcbiAgICAgICAgZnVuY3Rpb24gYm91bmQoKSB7XG4gICAgICAgICAgICByZXR1cm4gY2FsbGJhY2suYXBwbHkodGhpc3AsIGFyZ3VtZW50cyk7XG4gICAgICAgIH1cbiAgICAgICAgUShib3VuZCkuZmFwcGx5KG5vZGVBcmdzKS5mYWlsKGRlZmVycmVkLnJlamVjdCk7XG4gICAgICAgIHJldHVybiBkZWZlcnJlZC5wcm9taXNlO1xuICAgIH07XG59O1xuXG5Qcm9taXNlLnByb3RvdHlwZS5uYmluZCA9IGZ1bmN0aW9uICgvKnRoaXNwLCAuLi5hcmdzKi8pIHtcbiAgICB2YXIgYXJncyA9IGFycmF5X3NsaWNlKGFyZ3VtZW50cywgMCk7XG4gICAgYXJncy51bnNoaWZ0KHRoaXMpO1xuICAgIHJldHVybiBRLm5iaW5kLmFwcGx5KHZvaWQgMCwgYXJncyk7XG59O1xuXG4vKipcbiAqIENhbGxzIGEgbWV0aG9kIG9mIGEgTm9kZS1zdHlsZSBvYmplY3QgdGhhdCBhY2NlcHRzIGEgTm9kZS1zdHlsZVxuICogY2FsbGJhY2sgd2l0aCBhIGdpdmVuIGFycmF5IG9mIGFyZ3VtZW50cywgcGx1cyBhIHByb3ZpZGVkIGNhbGxiYWNrLlxuICogQHBhcmFtIG9iamVjdCBhbiBvYmplY3QgdGhhdCBoYXMgdGhlIG5hbWVkIG1ldGhvZFxuICogQHBhcmFtIHtTdHJpbmd9IG5hbWUgbmFtZSBvZiB0aGUgbWV0aG9kIG9mIG9iamVjdFxuICogQHBhcmFtIHtBcnJheX0gYXJncyBhcmd1bWVudHMgdG8gcGFzcyB0byB0aGUgbWV0aG9kOyB0aGUgY2FsbGJhY2tcbiAqIHdpbGwgYmUgcHJvdmlkZWQgYnkgUSBhbmQgYXBwZW5kZWQgdG8gdGhlc2UgYXJndW1lbnRzLlxuICogQHJldHVybnMgYSBwcm9taXNlIGZvciB0aGUgdmFsdWUgb3IgZXJyb3JcbiAqL1xuUS5ubWFwcGx5ID0gLy8gWFhYIEFzIHByb3Bvc2VkIGJ5IFwiUmVkc2FuZHJvXCJcblEubnBvc3QgPSBmdW5jdGlvbiAob2JqZWN0LCBuYW1lLCBhcmdzKSB7XG4gICAgcmV0dXJuIFEob2JqZWN0KS5ucG9zdChuYW1lLCBhcmdzKTtcbn07XG5cblByb21pc2UucHJvdG90eXBlLm5tYXBwbHkgPSAvLyBYWFggQXMgcHJvcG9zZWQgYnkgXCJSZWRzYW5kcm9cIlxuUHJvbWlzZS5wcm90b3R5cGUubnBvc3QgPSBmdW5jdGlvbiAobmFtZSwgYXJncykge1xuICAgIHZhciBub2RlQXJncyA9IGFycmF5X3NsaWNlKGFyZ3MgfHwgW10pO1xuICAgIHZhciBkZWZlcnJlZCA9IGRlZmVyKCk7XG4gICAgbm9kZUFyZ3MucHVzaChkZWZlcnJlZC5tYWtlTm9kZVJlc29sdmVyKCkpO1xuICAgIHRoaXMuZGlzcGF0Y2goXCJwb3N0XCIsIFtuYW1lLCBub2RlQXJnc10pLmZhaWwoZGVmZXJyZWQucmVqZWN0KTtcbiAgICByZXR1cm4gZGVmZXJyZWQucHJvbWlzZTtcbn07XG5cbi8qKlxuICogQ2FsbHMgYSBtZXRob2Qgb2YgYSBOb2RlLXN0eWxlIG9iamVjdCB0aGF0IGFjY2VwdHMgYSBOb2RlLXN0eWxlXG4gKiBjYWxsYmFjaywgZm9yd2FyZGluZyB0aGUgZ2l2ZW4gdmFyaWFkaWMgYXJndW1lbnRzLCBwbHVzIGEgcHJvdmlkZWRcbiAqIGNhbGxiYWNrIGFyZ3VtZW50LlxuICogQHBhcmFtIG9iamVjdCBhbiBvYmplY3QgdGhhdCBoYXMgdGhlIG5hbWVkIG1ldGhvZFxuICogQHBhcmFtIHtTdHJpbmd9IG5hbWUgbmFtZSBvZiB0aGUgbWV0aG9kIG9mIG9iamVjdFxuICogQHBhcmFtIC4uLmFyZ3MgYXJndW1lbnRzIHRvIHBhc3MgdG8gdGhlIG1ldGhvZDsgdGhlIGNhbGxiYWNrIHdpbGxcbiAqIGJlIHByb3ZpZGVkIGJ5IFEgYW5kIGFwcGVuZGVkIHRvIHRoZXNlIGFyZ3VtZW50cy5cbiAqIEByZXR1cm5zIGEgcHJvbWlzZSBmb3IgdGhlIHZhbHVlIG9yIGVycm9yXG4gKi9cblEubnNlbmQgPSAvLyBYWFggQmFzZWQgb24gTWFyayBNaWxsZXIncyBwcm9wb3NlZCBcInNlbmRcIlxuUS5ubWNhbGwgPSAvLyBYWFggQmFzZWQgb24gXCJSZWRzYW5kcm8nc1wiIHByb3Bvc2FsXG5RLm5pbnZva2UgPSBmdW5jdGlvbiAob2JqZWN0LCBuYW1lIC8qLi4uYXJncyovKSB7XG4gICAgdmFyIG5vZGVBcmdzID0gYXJyYXlfc2xpY2UoYXJndW1lbnRzLCAyKTtcbiAgICB2YXIgZGVmZXJyZWQgPSBkZWZlcigpO1xuICAgIG5vZGVBcmdzLnB1c2goZGVmZXJyZWQubWFrZU5vZGVSZXNvbHZlcigpKTtcbiAgICBRKG9iamVjdCkuZGlzcGF0Y2goXCJwb3N0XCIsIFtuYW1lLCBub2RlQXJnc10pLmZhaWwoZGVmZXJyZWQucmVqZWN0KTtcbiAgICByZXR1cm4gZGVmZXJyZWQucHJvbWlzZTtcbn07XG5cblByb21pc2UucHJvdG90eXBlLm5zZW5kID0gLy8gWFhYIEJhc2VkIG9uIE1hcmsgTWlsbGVyJ3MgcHJvcG9zZWQgXCJzZW5kXCJcblByb21pc2UucHJvdG90eXBlLm5tY2FsbCA9IC8vIFhYWCBCYXNlZCBvbiBcIlJlZHNhbmRybydzXCIgcHJvcG9zYWxcblByb21pc2UucHJvdG90eXBlLm5pbnZva2UgPSBmdW5jdGlvbiAobmFtZSAvKi4uLmFyZ3MqLykge1xuICAgIHZhciBub2RlQXJncyA9IGFycmF5X3NsaWNlKGFyZ3VtZW50cywgMSk7XG4gICAgdmFyIGRlZmVycmVkID0gZGVmZXIoKTtcbiAgICBub2RlQXJncy5wdXNoKGRlZmVycmVkLm1ha2VOb2RlUmVzb2x2ZXIoKSk7XG4gICAgdGhpcy5kaXNwYXRjaChcInBvc3RcIiwgW25hbWUsIG5vZGVBcmdzXSkuZmFpbChkZWZlcnJlZC5yZWplY3QpO1xuICAgIHJldHVybiBkZWZlcnJlZC5wcm9taXNlO1xufTtcblxuLyoqXG4gKiBJZiBhIGZ1bmN0aW9uIHdvdWxkIGxpa2UgdG8gc3VwcG9ydCBib3RoIE5vZGUgY29udGludWF0aW9uLXBhc3Npbmctc3R5bGUgYW5kXG4gKiBwcm9taXNlLXJldHVybmluZy1zdHlsZSwgaXQgY2FuIGVuZCBpdHMgaW50ZXJuYWwgcHJvbWlzZSBjaGFpbiB3aXRoXG4gKiBgbm9kZWlmeShub2RlYmFjaylgLCBmb3J3YXJkaW5nIHRoZSBvcHRpb25hbCBub2RlYmFjayBhcmd1bWVudC4gIElmIHRoZSB1c2VyXG4gKiBlbGVjdHMgdG8gdXNlIGEgbm9kZWJhY2ssIHRoZSByZXN1bHQgd2lsbCBiZSBzZW50IHRoZXJlLiAgSWYgdGhleSBkbyBub3RcbiAqIHBhc3MgYSBub2RlYmFjaywgdGhleSB3aWxsIHJlY2VpdmUgdGhlIHJlc3VsdCBwcm9taXNlLlxuICogQHBhcmFtIG9iamVjdCBhIHJlc3VsdCAob3IgYSBwcm9taXNlIGZvciBhIHJlc3VsdClcbiAqIEBwYXJhbSB7RnVuY3Rpb259IG5vZGViYWNrIGEgTm9kZS5qcy1zdHlsZSBjYWxsYmFja1xuICogQHJldHVybnMgZWl0aGVyIHRoZSBwcm9taXNlIG9yIG5vdGhpbmdcbiAqL1xuUS5ub2RlaWZ5ID0gbm9kZWlmeTtcbmZ1bmN0aW9uIG5vZGVpZnkob2JqZWN0LCBub2RlYmFjaykge1xuICAgIHJldHVybiBRKG9iamVjdCkubm9kZWlmeShub2RlYmFjayk7XG59XG5cblByb21pc2UucHJvdG90eXBlLm5vZGVpZnkgPSBmdW5jdGlvbiAobm9kZWJhY2spIHtcbiAgICBpZiAobm9kZWJhY2spIHtcbiAgICAgICAgdGhpcy50aGVuKGZ1bmN0aW9uICh2YWx1ZSkge1xuICAgICAgICAgICAgUS5uZXh0VGljayhmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgICAgICAgbm9kZWJhY2sobnVsbCwgdmFsdWUpO1xuICAgICAgICAgICAgfSk7XG4gICAgICAgIH0sIGZ1bmN0aW9uIChlcnJvcikge1xuICAgICAgICAgICAgUS5uZXh0VGljayhmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgICAgICAgbm9kZWJhY2soZXJyb3IpO1xuICAgICAgICAgICAgfSk7XG4gICAgICAgIH0pO1xuICAgIH0gZWxzZSB7XG4gICAgICAgIHJldHVybiB0aGlzO1xuICAgIH1cbn07XG5cblEubm9Db25mbGljdCA9IGZ1bmN0aW9uKCkge1xuICAgIHRocm93IG5ldyBFcnJvcihcIlEubm9Db25mbGljdCBvbmx5IHdvcmtzIHdoZW4gUSBpcyB1c2VkIGFzIGEgZ2xvYmFsXCIpO1xufTtcblxuLy8gQWxsIGNvZGUgYmVmb3JlIHRoaXMgcG9pbnQgd2lsbCBiZSBmaWx0ZXJlZCBmcm9tIHN0YWNrIHRyYWNlcy5cbnZhciBxRW5kaW5nTGluZSA9IGNhcHR1cmVMaW5lKCk7XG5cbnJldHVybiBRO1xuXG59KTtcblxufSkuY2FsbCh0aGlzLHJlcXVpcmUoJ19wcm9jZXNzJykpXG4vLyMgc291cmNlTWFwcGluZ1VSTD1kYXRhOmFwcGxpY2F0aW9uL2pzb247Y2hhcnNldDp1dGYtODtiYXNlNjQsZXlKMlpYSnphVzl1SWpvekxDSnpiM1Z5WTJWeklqcGJJbTV2WkdWZmJXOWtkV3hsY3k5eEwzRXVhbk1pWFN3aWJtRnRaWE1pT2x0ZExDSnRZWEJ3YVc1bmN5STZJanRCUVVGQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVNJc0ltWnBiR1VpT2lKblpXNWxjbUYwWldRdWFuTWlMQ0p6YjNWeVkyVlNiMjkwSWpvaUlpd2ljMjkxY21ObGMwTnZiblJsYm5RaU9sc2lMeThnZG1sdE9uUnpQVFE2YzNSelBUUTZjM2M5TkRwY2JpOHFJVnh1SUNwY2JpQXFJRU52Y0hseWFXZG9kQ0F5TURBNUxUSXdNVElnUzNKcGN5QkxiM2RoYkNCMWJtUmxjaUIwYUdVZ2RHVnliWE1nYjJZZ2RHaGxJRTFKVkZ4dUlDb2diR2xqWlc1elpTQm1iM1Z1WkNCaGRDQm9kSFJ3T2k4dloybDBhSFZpTG1OdmJTOXJjbWx6YTI5M1lXd3ZjUzl5WVhjdmJXRnpkR1Z5TDB4SlEwVk9VMFZjYmlBcVhHNGdLaUJYYVhSb0lIQmhjblJ6SUdKNUlGUjViR1Z5SUVOc2IzTmxYRzRnS2lCRGIzQjVjbWxuYUhRZ01qQXdOeTB5TURBNUlGUjViR1Z5SUVOc2IzTmxJSFZ1WkdWeUlIUm9aU0IwWlhKdGN5QnZaaUIwYUdVZ1RVbFVJRmdnYkdsalpXNXpaU0JtYjNWdVpGeHVJQ29nWVhRZ2FIUjBjRG92TDNkM2R5NXZjR1Z1YzI5MWNtTmxMbTl5Wnk5c2FXTmxibk5sY3k5dGFYUXRiR2xqWlc1elpTNW9kRzFzWEc0Z0tpQkdiM0pyWldRZ1lYUWdjbVZtWDNObGJtUXVhbk1nZG1WeWMybHZiam9nTWpBd09TMHdOUzB4TVZ4dUlDcGNiaUFxSUZkcGRHZ2djR0Z5ZEhNZ1lua2dUV0Z5YXlCTmFXeHNaWEpjYmlBcUlFTnZjSGx5YVdkb2RDQW9ReWtnTWpBeE1TQkhiMjluYkdVZ1NXNWpMbHh1SUNwY2JpQXFJRXhwWTJWdWMyVmtJSFZ1WkdWeUlIUm9aU0JCY0dGamFHVWdUR2xqWlc1elpTd2dWbVZ5YzJsdmJpQXlMakFnS0hSb1pTQmNJa3hwWTJWdWMyVmNJaWs3WEc0Z0tpQjViM1VnYldGNUlHNXZkQ0IxYzJVZ2RHaHBjeUJtYVd4bElHVjRZMlZ3ZENCcGJpQmpiMjF3YkdsaGJtTmxJSGRwZEdnZ2RHaGxJRXhwWTJWdWMyVXVYRzRnS2lCWmIzVWdiV0Y1SUc5aWRHRnBiaUJoSUdOdmNIa2diMllnZEdobElFeHBZMlZ1YzJVZ1lYUmNiaUFxWEc0Z0tpQm9kSFJ3T2k4dmQzZDNMbUZ3WVdOb1pTNXZjbWN2YkdsalpXNXpaWE12VEVsRFJVNVRSUzB5TGpCY2JpQXFYRzRnS2lCVmJteGxjM01nY21WeGRXbHlaV1FnWW5rZ1lYQndiR2xqWVdKc1pTQnNZWGNnYjNJZ1lXZHlaV1ZrSUhSdklHbHVJSGR5YVhScGJtY3NJSE52Wm5SM1lYSmxYRzRnS2lCa2FYTjBjbWxpZFhSbFpDQjFibVJsY2lCMGFHVWdUR2xqWlc1elpTQnBjeUJrYVhOMGNtbGlkWFJsWkNCdmJpQmhiaUJjSWtGVElFbFRYQ0lnUWtGVFNWTXNYRzRnS2lCWFNWUklUMVZVSUZkQlVsSkJUbFJKUlZNZ1QxSWdRMDlPUkVsVVNVOU9VeUJQUmlCQlRsa2dTMGxPUkN3Z1pXbDBhR1Z5SUdWNGNISmxjM01nYjNJZ2FXMXdiR2xsWkM1Y2JpQXFJRk5sWlNCMGFHVWdUR2xqWlc1elpTQm1iM0lnZEdobElITndaV05wWm1saklHeGhibWQxWVdkbElHZHZkbVZ5Ym1sdVp5QndaWEp0YVhOemFXOXVjeUJoYm1SY2JpQXFJR3hwYldsMFlYUnBiMjV6SUhWdVpHVnlJSFJvWlNCTWFXTmxibk5sTGx4dUlDcGNiaUFxTDF4dVhHNG9ablZ1WTNScGIyNGdLR1JsWm1sdWFYUnBiMjRwSUh0Y2JpQWdJQ0JjSW5WelpTQnpkSEpwWTNSY0lqdGNibHh1SUNBZ0lDOHZJRlJvYVhNZ1ptbHNaU0IzYVd4c0lHWjFibU4wYVc5dUlIQnliM0JsY214NUlHRnpJR0VnUEhOamNtbHdkRDRnZEdGbkxDQnZjaUJoSUcxdlpIVnNaVnh1SUNBZ0lDOHZJSFZ6YVc1bklFTnZiVzF2YmtwVElHRnVaQ0JPYjJSbFNsTWdiM0lnVW1WeGRXbHlaVXBUSUcxdlpIVnNaU0JtYjNKdFlYUnpMaUFnU1c1Y2JpQWdJQ0F2THlCRGIyMXRiMjR2VG05a1pTOVNaWEYxYVhKbFNsTXNJSFJvWlNCdGIyUjFiR1VnWlhod2IzSjBjeUIwYUdVZ1VTQkJVRWtnWVc1a0lIZG9aVzVjYmlBZ0lDQXZMeUJsZUdWamRYUmxaQ0JoY3lCaElITnBiWEJzWlNBOGMyTnlhWEIwUGl3Z2FYUWdZM0psWVhSbGN5QmhJRkVnWjJ4dlltRnNJR2x1YzNSbFlXUXVYRzVjYmlBZ0lDQXZMeUJOYjI1MFlXZGxJRkpsY1hWcGNtVmNiaUFnSUNCcFppQW9kSGx3Wlc5bUlHSnZiM1J6ZEhKaGNDQTlQVDBnWENKbWRXNWpkR2x2Ymx3aUtTQjdYRzRnSUNBZ0lDQWdJR0p2YjNSemRISmhjQ2hjSW5CeWIyMXBjMlZjSWl3Z1pHVm1hVzVwZEdsdmJpazdYRzVjYmlBZ0lDQXZMeUJEYjIxdGIyNUtVMXh1SUNBZ0lIMGdaV3h6WlNCcFppQW9kSGx3Wlc5bUlHVjRjRzl5ZEhNZ1BUMDlJRndpYjJKcVpXTjBYQ0lnSmlZZ2RIbHdaVzltSUcxdlpIVnNaU0E5UFQwZ1hDSnZZbXBsWTNSY0lpa2dlMXh1SUNBZ0lDQWdJQ0J0YjJSMWJHVXVaWGh3YjNKMGN5QTlJR1JsWm1sdWFYUnBiMjRvS1R0Y2JseHVJQ0FnSUM4dklGSmxjWFZwY21WS1UxeHVJQ0FnSUgwZ1pXeHpaU0JwWmlBb2RIbHdaVzltSUdSbFptbHVaU0E5UFQwZ1hDSm1kVzVqZEdsdmJsd2lJQ1ltSUdSbFptbHVaUzVoYldRcElIdGNiaUFnSUNBZ0lDQWdaR1ZtYVc1bEtHUmxabWx1YVhScGIyNHBPMXh1WEc0Z0lDQWdMeThnVTBWVElDaFRaV04xY21VZ1JXTnRZVk5qY21sd2RDbGNiaUFnSUNCOUlHVnNjMlVnYVdZZ0tIUjVjR1Z2WmlCelpYTWdJVDA5SUZ3aWRXNWtaV1pwYm1Wa1hDSXBJSHRjYmlBZ0lDQWdJQ0FnYVdZZ0tDRnpaWE11YjJzb0tTa2dlMXh1SUNBZ0lDQWdJQ0FnSUNBZ2NtVjBkWEp1TzF4dUlDQWdJQ0FnSUNCOUlHVnNjMlVnZTF4dUlDQWdJQ0FnSUNBZ0lDQWdjMlZ6TG0xaGEyVlJJRDBnWkdWbWFXNXBkR2x2Ymp0Y2JpQWdJQ0FnSUNBZ2ZWeHVYRzRnSUNBZ0x5OGdQSE5qY21sd2RENWNiaUFnSUNCOUlHVnNjMlVnYVdZZ0tIUjVjR1Z2WmlCM2FXNWtiM2NnSVQwOUlGd2lkVzVrWldacGJtVmtYQ0lnZkh3Z2RIbHdaVzltSUhObGJHWWdJVDA5SUZ3aWRXNWtaV1pwYm1Wa1hDSXBJSHRjYmlBZ0lDQWdJQ0FnTHk4Z1VISmxabVZ5SUhkcGJtUnZkeUJ2ZG1WeUlITmxiR1lnWm05eUlHRmtaQzF2YmlCelkzSnBjSFJ6TGlCVmMyVWdjMlZzWmlCbWIzSmNiaUFnSUNBZ0lDQWdMeThnYm05dUxYZHBibVJ2ZDJWa0lHTnZiblJsZUhSekxseHVJQ0FnSUNBZ0lDQjJZWElnWjJ4dlltRnNJRDBnZEhsd1pXOW1JSGRwYm1SdmR5QWhQVDBnWENKMWJtUmxabWx1WldSY0lpQS9JSGRwYm1SdmR5QTZJSE5sYkdZN1hHNWNiaUFnSUNBZ0lDQWdMeThnUjJWMElIUm9aU0JnZDJsdVpHOTNZQ0J2WW1wbFkzUXNJSE5oZG1VZ2RHaGxJSEJ5WlhacGIzVnpJRkVnWjJ4dlltRnNYRzRnSUNBZ0lDQWdJQzh2SUdGdVpDQnBibWwwYVdGc2FYcGxJRkVnWVhNZ1lTQm5iRzlpWVd3dVhHNGdJQ0FnSUNBZ0lIWmhjaUJ3Y21WMmFXOTFjMUVnUFNCbmJHOWlZV3d1VVR0Y2JpQWdJQ0FnSUNBZ1oyeHZZbUZzTGxFZ1BTQmtaV1pwYm1sMGFXOXVLQ2s3WEc1Y2JpQWdJQ0FnSUNBZ0x5OGdRV1JrSUdFZ2JtOURiMjVtYkdsamRDQm1kVzVqZEdsdmJpQnpieUJSSUdOaGJpQmlaU0J5WlcxdmRtVmtJR1p5YjIwZ2RHaGxYRzRnSUNBZ0lDQWdJQzh2SUdkc2IySmhiQ0J1WVcxbGMzQmhZMlV1WEc0Z0lDQWdJQ0FnSUdkc2IySmhiQzVSTG01dlEyOXVabXhwWTNRZ1BTQm1kVzVqZEdsdmJpQW9LU0I3WEc0Z0lDQWdJQ0FnSUNBZ0lDQm5iRzlpWVd3dVVTQTlJSEJ5WlhacGIzVnpVVHRjYmlBZ0lDQWdJQ0FnSUNBZ0lISmxkSFZ5YmlCMGFHbHpPMXh1SUNBZ0lDQWdJQ0I5TzF4dVhHNGdJQ0FnZlNCbGJITmxJSHRjYmlBZ0lDQWdJQ0FnZEdoeWIzY2dibVYzSUVWeWNtOXlLRndpVkdocGN5QmxiblpwY205dWJXVnVkQ0IzWVhNZ2JtOTBJR0Z1ZEdsamFYQmhkR1ZrSUdKNUlGRXVJRkJzWldGelpTQm1hV3hsSUdFZ1luVm5MbHdpS1R0Y2JpQWdJQ0I5WEc1Y2JuMHBLR1oxYm1OMGFXOXVJQ2dwSUh0Y2Jsd2lkWE5sSUhOMGNtbGpkRndpTzF4dVhHNTJZWElnYUdGelUzUmhZMnR6SUQwZ1ptRnNjMlU3WEc1MGNua2dlMXh1SUNBZ0lIUm9jbTkzSUc1bGR5QkZjbkp2Y2lncE8xeHVmU0JqWVhSamFDQW9aU2tnZTF4dUlDQWdJR2hoYzFOMFlXTnJjeUE5SUNFaFpTNXpkR0ZqYXp0Y2JuMWNibHh1THk4Z1FXeHNJR052WkdVZ1lXWjBaWElnZEdocGN5QndiMmx1ZENCM2FXeHNJR0psSUdacGJIUmxjbVZrSUdaeWIyMGdjM1JoWTJzZ2RISmhZMlZ6SUhKbGNHOXlkR1ZrWEc0dkx5QmllU0JSTGx4dWRtRnlJSEZUZEdGeWRHbHVaMHhwYm1VZ1BTQmpZWEIwZFhKbFRHbHVaU2dwTzF4dWRtRnlJSEZHYVd4bFRtRnRaVHRjYmx4dUx5OGdjMmhwYlhOY2JseHVMeThnZFhObFpDQm1iM0lnWm1Gc2JHSmhZMnNnYVc0Z1hDSmhiR3hTWlhOdmJIWmxaRndpWEc1MllYSWdibTl2Y0NBOUlHWjFibU4wYVc5dUlDZ3BJSHQ5TzF4dVhHNHZMeUJWYzJVZ2RHaGxJR1poYzNSbGMzUWdjRzl6YzJsaWJHVWdiV1ZoYm5NZ2RHOGdaWGhsWTNWMFpTQmhJSFJoYzJzZ2FXNGdZU0JtZFhSMWNtVWdkSFZ5Ymx4dUx5OGdiMllnZEdobElHVjJaVzUwSUd4dmIzQXVYRzUyWVhJZ2JtVjRkRlJwWTJzZ1BTaG1kVzVqZEdsdmJpQW9LU0I3WEc0Z0lDQWdMeThnYkdsdWEyVmtJR3hwYzNRZ2IyWWdkR0Z6YTNNZ0tITnBibWRzWlN3Z2QybDBhQ0JvWldGa0lHNXZaR1VwWEc0Z0lDQWdkbUZ5SUdobFlXUWdQU0I3ZEdGemF6b2dkbTlwWkNBd0xDQnVaWGgwT2lCdWRXeHNmVHRjYmlBZ0lDQjJZWElnZEdGcGJDQTlJR2hsWVdRN1hHNGdJQ0FnZG1GeUlHWnNkWE5vYVc1bklEMGdabUZzYzJVN1hHNGdJQ0FnZG1GeUlISmxjWFZsYzNSVWFXTnJJRDBnZG05cFpDQXdPMXh1SUNBZ0lIWmhjaUJwYzA1dlpHVktVeUE5SUdaaGJITmxPMXh1SUNBZ0lDOHZJSEYxWlhWbElHWnZjaUJzWVhSbElIUmhjMnR6TENCMWMyVmtJR0o1SUhWdWFHRnVaR3hsWkNCeVpXcGxZM1JwYjI0Z2RISmhZMnRwYm1kY2JpQWdJQ0IyWVhJZ2JHRjBaWEpSZFdWMVpTQTlJRnRkTzF4dVhHNGdJQ0FnWm5WdVkzUnBiMjRnWm14MWMyZ29LU0I3WEc0Z0lDQWdJQ0FnSUM4cUlHcHphR2x1ZENCc2IyOXdablZ1WXpvZ2RISjFaU0FxTDF4dUlDQWdJQ0FnSUNCMllYSWdkR0Z6YXl3Z1pHOXRZV2x1TzF4dVhHNGdJQ0FnSUNBZ0lIZG9hV3hsSUNob1pXRmtMbTVsZUhRcElIdGNiaUFnSUNBZ0lDQWdJQ0FnSUdobFlXUWdQU0JvWldGa0xtNWxlSFE3WEc0Z0lDQWdJQ0FnSUNBZ0lDQjBZWE5ySUQwZ2FHVmhaQzUwWVhOck8xeHVJQ0FnSUNBZ0lDQWdJQ0FnYUdWaFpDNTBZWE5ySUQwZ2RtOXBaQ0F3TzF4dUlDQWdJQ0FnSUNBZ0lDQWdaRzl0WVdsdUlEMGdhR1ZoWkM1a2IyMWhhVzQ3WEc1Y2JpQWdJQ0FnSUNBZ0lDQWdJR2xtSUNoa2IyMWhhVzRwSUh0Y2JpQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNCb1pXRmtMbVJ2YldGcGJpQTlJSFp2YVdRZ01EdGNiaUFnSUNBZ0lDQWdJQ0FnSUNBZ0lDQmtiMjFoYVc0dVpXNTBaWElvS1R0Y2JpQWdJQ0FnSUNBZ0lDQWdJSDFjYmlBZ0lDQWdJQ0FnSUNBZ0lISjFibE5wYm1kc1pTaDBZWE5yTENCa2IyMWhhVzRwTzF4dVhHNGdJQ0FnSUNBZ0lIMWNiaUFnSUNBZ0lDQWdkMmhwYkdVZ0tHeGhkR1Z5VVhWbGRXVXViR1Z1WjNSb0tTQjdYRzRnSUNBZ0lDQWdJQ0FnSUNCMFlYTnJJRDBnYkdGMFpYSlJkV1YxWlM1d2IzQW9LVHRjYmlBZ0lDQWdJQ0FnSUNBZ0lISjFibE5wYm1kc1pTaDBZWE5yS1R0Y2JpQWdJQ0FnSUNBZ2ZWeHVJQ0FnSUNBZ0lDQm1iSFZ6YUdsdVp5QTlJR1poYkhObE8xeHVJQ0FnSUgxY2JpQWdJQ0F2THlCeWRXNXpJR0VnYzJsdVoyeGxJR1oxYm1OMGFXOXVJR2x1SUhSb1pTQmhjM2x1WXlCeGRXVjFaVnh1SUNBZ0lHWjFibU4wYVc5dUlISjFibE5wYm1kc1pTaDBZWE5yTENCa2IyMWhhVzRwSUh0Y2JpQWdJQ0FnSUNBZ2RISjVJSHRjYmlBZ0lDQWdJQ0FnSUNBZ0lIUmhjMnNvS1R0Y2JseHVJQ0FnSUNBZ0lDQjlJR05oZEdOb0lDaGxLU0I3WEc0Z0lDQWdJQ0FnSUNBZ0lDQnBaaUFvYVhOT2IyUmxTbE1wSUh0Y2JpQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBdkx5QkpiaUJ1YjJSbExDQjFibU5oZFdkb2RDQmxlR05sY0hScGIyNXpJR0Z5WlNCamIyNXphV1JsY21Wa0lHWmhkR0ZzSUdWeWNtOXljeTVjYmlBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0F2THlCU1pTMTBhSEp2ZHlCMGFHVnRJSE41Ym1Ob2NtOXViM1Z6YkhrZ2RHOGdhVzUwWlhKeWRYQjBJR1pzZFhOb2FXNW5JVnh1WEc0Z0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnTHk4Z1JXNXpkWEpsSUdOdmJuUnBiblZoZEdsdmJpQnBaaUIwYUdVZ2RXNWpZWFZuYUhRZ1pYaGpaWEIwYVc5dUlHbHpJSE4xY0hCeVpYTnpaV1JjYmlBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0F2THlCc2FYTjBaVzVwYm1jZ1hDSjFibU5oZFdkb2RFVjRZMlZ3ZEdsdmJsd2lJR1YyWlc1MGN5QW9ZWE1nWkc5dFlXbHVjeUJrYjJWektTNWNiaUFnSUNBZ0lDQWdJQ0FnSUNBZ0lDQXZMeUJEYjI1MGFXNTFaU0JwYmlCdVpYaDBJR1YyWlc1MElIUnZJR0YyYjJsa0lIUnBZMnNnY21WamRYSnphVzl1TGx4dUlDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUdsbUlDaGtiMjFoYVc0cElIdGNiaUFnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnWkc5dFlXbHVMbVY0YVhRb0tUdGNiaUFnSUNBZ0lDQWdJQ0FnSUNBZ0lDQjlYRzRnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdjMlYwVkdsdFpXOTFkQ2htYkhWemFDd2dNQ2s3WEc0Z0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnYVdZZ0tHUnZiV0ZwYmlrZ2UxeHVJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0JrYjIxaGFXNHVaVzUwWlhJb0tUdGNiaUFnSUNBZ0lDQWdJQ0FnSUNBZ0lDQjlYRzVjYmlBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0IwYUhKdmR5QmxPMXh1WEc0Z0lDQWdJQ0FnSUNBZ0lDQjlJR1ZzYzJVZ2UxeHVJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDOHZJRWx1SUdKeWIzZHpaWEp6TENCMWJtTmhkV2RvZENCbGVHTmxjSFJwYjI1eklHRnlaU0J1YjNRZ1ptRjBZV3d1WEc0Z0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnTHk4Z1VtVXRkR2h5YjNjZ2RHaGxiU0JoYzNsdVkyaHliMjV2ZFhOc2VTQjBieUJoZG05cFpDQnpiRzkzTFdSdmQyNXpMbHh1SUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJSE5sZEZScGJXVnZkWFFvWm5WdVkzUnBiMjRnS0NrZ2UxeHVJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0IwYUhKdmR5QmxPMXh1SUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJSDBzSURBcE8xeHVJQ0FnSUNBZ0lDQWdJQ0FnZlZ4dUlDQWdJQ0FnSUNCOVhHNWNiaUFnSUNBZ0lDQWdhV1lnS0dSdmJXRnBiaWtnZTF4dUlDQWdJQ0FnSUNBZ0lDQWdaRzl0WVdsdUxtVjRhWFFvS1R0Y2JpQWdJQ0FnSUNBZ2ZWeHVJQ0FnSUgxY2JseHVJQ0FnSUc1bGVIUlVhV05ySUQwZ1puVnVZM1JwYjI0Z0tIUmhjMnNwSUh0Y2JpQWdJQ0FnSUNBZ2RHRnBiQ0E5SUhSaGFXd3VibVY0ZENBOUlIdGNiaUFnSUNBZ0lDQWdJQ0FnSUhSaGMyczZJSFJoYzJzc1hHNGdJQ0FnSUNBZ0lDQWdJQ0JrYjIxaGFXNDZJR2x6VG05a1pVcFRJQ1ltSUhCeWIyTmxjM011Wkc5dFlXbHVMRnh1SUNBZ0lDQWdJQ0FnSUNBZ2JtVjRkRG9nYm5Wc2JGeHVJQ0FnSUNBZ0lDQjlPMXh1WEc0Z0lDQWdJQ0FnSUdsbUlDZ2habXgxYzJocGJtY3BJSHRjYmlBZ0lDQWdJQ0FnSUNBZ0lHWnNkWE5vYVc1bklEMGdkSEoxWlR0Y2JpQWdJQ0FnSUNBZ0lDQWdJSEpsY1hWbGMzUlVhV05yS0NrN1hHNGdJQ0FnSUNBZ0lIMWNiaUFnSUNCOU8xeHVYRzRnSUNBZ2FXWWdLSFI1Y0dWdlppQndjbTlqWlhOeklEMDlQU0JjSW05aWFtVmpkRndpSUNZbVhHNGdJQ0FnSUNBZ0lIQnliMk5sYzNNdWRHOVRkSEpwYm1jb0tTQTlQVDBnWENKYmIySnFaV04wSUhCeWIyTmxjM05kWENJZ0ppWWdjSEp2WTJWemN5NXVaWGgwVkdsamF5a2dlMXh1SUNBZ0lDQWdJQ0F2THlCRmJuTjFjbVVnVVNCcGN5QnBiaUJoSUhKbFlXd2dUbTlrWlNCbGJuWnBjbTl1YldWdWRDd2dkMmwwYUNCaElHQndjbTlqWlhOekxtNWxlSFJVYVdOcllDNWNiaUFnSUNBZ0lDQWdMeThnVkc4Z2MyVmxJSFJvY205MVoyZ2dabUZyWlNCT2IyUmxJR1Z1ZG1seWIyNXRaVzUwY3pwY2JpQWdJQ0FnSUNBZ0x5OGdLaUJOYjJOb1lTQjBaWE4wSUhKMWJtNWxjaUF0SUdWNGNHOXpaWE1nWVNCZ2NISnZZMlZ6YzJBZ1oyeHZZbUZzSUhkcGRHaHZkWFFnWVNCZ2JtVjRkRlJwWTJ0Z1hHNGdJQ0FnSUNBZ0lDOHZJQ29nUW5KdmQzTmxjbWxtZVNBdElHVjRjRzl6WlhNZ1lTQmdjSEp2WTJWemN5NXVaWGhVYVdOcllDQm1kVzVqZEdsdmJpQjBhR0YwSUhWelpYTmNiaUFnSUNBZ0lDQWdMeThnSUNCZ2MyVjBWR2x0Wlc5MWRHQXVJRWx1SUhSb2FYTWdZMkZ6WlNCZ2MyVjBTVzF0WldScFlYUmxZQ0JwY3lCd2NtVm1aWEp5WldRZ1ltVmpZWFZ6WlZ4dUlDQWdJQ0FnSUNBdkx5QWdJQ0JwZENCcGN5Qm1ZWE4wWlhJdUlFSnliM2R6WlhKcFpua25jeUJnY0hKdlkyVnpjeTUwYjFOMGNtbHVaeWdwWUNCNWFXVnNaSE5jYmlBZ0lDQWdJQ0FnTHk4Z0lDQmNJbHR2WW1wbFkzUWdUMkpxWldOMFhWd2lMQ0IzYUdsc1pTQnBiaUJoSUhKbFlXd2dUbTlrWlNCbGJuWnBjbTl1YldWdWRGeHVJQ0FnSUNBZ0lDQXZMeUFnSUdCd2NtOWpaWE56TG01bGVIUlVhV05yS0NsZ0lIbHBaV3hrY3lCY0lsdHZZbXBsWTNRZ2NISnZZMlZ6YzExY0lpNWNiaUFnSUNBZ0lDQWdhWE5PYjJSbFNsTWdQU0IwY25WbE8xeHVYRzRnSUNBZ0lDQWdJSEpsY1hWbGMzUlVhV05ySUQwZ1puVnVZM1JwYjI0Z0tDa2dlMXh1SUNBZ0lDQWdJQ0FnSUNBZ2NISnZZMlZ6Y3k1dVpYaDBWR2xqYXlobWJIVnphQ2s3WEc0Z0lDQWdJQ0FnSUgwN1hHNWNiaUFnSUNCOUlHVnNjMlVnYVdZZ0tIUjVjR1Z2WmlCelpYUkpiVzFsWkdsaGRHVWdQVDA5SUZ3aVpuVnVZM1JwYjI1Y0lpa2dlMXh1SUNBZ0lDQWdJQ0F2THlCSmJpQkpSVEV3TENCT2IyUmxMbXB6SURBdU9Tc3NJRzl5SUdoMGRIQnpPaTh2WjJsMGFIVmlMbU52YlM5T2IySnNaVXBUTDNObGRFbHRiV1ZrYVdGMFpWeHVJQ0FnSUNBZ0lDQnBaaUFvZEhsd1pXOW1JSGRwYm1SdmR5QWhQVDBnWENKMWJtUmxabWx1WldSY0lpa2dlMXh1SUNBZ0lDQWdJQ0FnSUNBZ2NtVnhkV1Z6ZEZScFkyc2dQU0J6WlhSSmJXMWxaR2xoZEdVdVltbHVaQ2gzYVc1a2IzY3NJR1pzZFhOb0tUdGNiaUFnSUNBZ0lDQWdmU0JsYkhObElIdGNiaUFnSUNBZ0lDQWdJQ0FnSUhKbGNYVmxjM1JVYVdOcklEMGdablZ1WTNScGIyNGdLQ2tnZTF4dUlDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUhObGRFbHRiV1ZrYVdGMFpTaG1iSFZ6YUNrN1hHNGdJQ0FnSUNBZ0lDQWdJQ0I5TzF4dUlDQWdJQ0FnSUNCOVhHNWNiaUFnSUNCOUlHVnNjMlVnYVdZZ0tIUjVjR1Z2WmlCTlpYTnpZV2RsUTJoaGJtNWxiQ0FoUFQwZ1hDSjFibVJsWm1sdVpXUmNJaWtnZTF4dUlDQWdJQ0FnSUNBdkx5QnRiMlJsY200Z1luSnZkM05sY25OY2JpQWdJQ0FnSUNBZ0x5OGdhSFIwY0RvdkwzZDNkeTV1YjI1aWJHOWphMmx1Wnk1cGJ5OHlNREV4THpBMkwzZHBibVJ2ZDI1bGVIUjBhV05yTG1oMGJXeGNiaUFnSUNBZ0lDQWdkbUZ5SUdOb1lXNXVaV3dnUFNCdVpYY2dUV1Z6YzJGblpVTm9ZVzV1Wld3b0tUdGNiaUFnSUNBZ0lDQWdMeThnUVhRZ2JHVmhjM1FnVTJGbVlYSnBJRlpsY25OcGIyNGdOaTR3TGpVZ0tEZzFNell1TXpBdU1Ta2dhVzUwWlhKdGFYUjBaVzUwYkhrZ1kyRnVibTkwSUdOeVpXRjBaVnh1SUNBZ0lDQWdJQ0F2THlCM2IzSnJhVzVuSUcxbGMzTmhaMlVnY0c5eWRITWdkR2hsSUdacGNuTjBJSFJwYldVZ1lTQndZV2RsSUd4dllXUnpMbHh1SUNBZ0lDQWdJQ0JqYUdGdWJtVnNMbkJ2Y25ReExtOXViV1Z6YzJGblpTQTlJR1oxYm1OMGFXOXVJQ2dwSUh0Y2JpQWdJQ0FnSUNBZ0lDQWdJSEpsY1hWbGMzUlVhV05ySUQwZ2NtVnhkV1Z6ZEZCdmNuUlVhV05yTzF4dUlDQWdJQ0FnSUNBZ0lDQWdZMmhoYm01bGJDNXdiM0owTVM1dmJtMWxjM05oWjJVZ1BTQm1iSFZ6YUR0Y2JpQWdJQ0FnSUNBZ0lDQWdJR1pzZFhOb0tDazdYRzRnSUNBZ0lDQWdJSDA3WEc0Z0lDQWdJQ0FnSUhaaGNpQnlaWEYxWlhOMFVHOXlkRlJwWTJzZ1BTQm1kVzVqZEdsdmJpQW9LU0I3WEc0Z0lDQWdJQ0FnSUNBZ0lDQXZMeUJQY0dWeVlTQnlaWEYxYVhKbGN5QjFjeUIwYnlCd2NtOTJhV1JsSUdFZ2JXVnpjMkZuWlNCd1lYbHNiMkZrTENCeVpXZGhjbVJzWlhOeklHOW1YRzRnSUNBZ0lDQWdJQ0FnSUNBdkx5QjNhR1YwYUdWeUlIZGxJSFZ6WlNCcGRDNWNiaUFnSUNBZ0lDQWdJQ0FnSUdOb1lXNXVaV3d1Y0c5eWRESXVjRzl6ZEUxbGMzTmhaMlVvTUNrN1hHNGdJQ0FnSUNBZ0lIMDdYRzRnSUNBZ0lDQWdJSEpsY1hWbGMzUlVhV05ySUQwZ1puVnVZM1JwYjI0Z0tDa2dlMXh1SUNBZ0lDQWdJQ0FnSUNBZ2MyVjBWR2x0Wlc5MWRDaG1iSFZ6YUN3Z01DazdYRzRnSUNBZ0lDQWdJQ0FnSUNCeVpYRjFaWE4wVUc5eWRGUnBZMnNvS1R0Y2JpQWdJQ0FnSUNBZ2ZUdGNibHh1SUNBZ0lIMGdaV3h6WlNCN1hHNGdJQ0FnSUNBZ0lDOHZJRzlzWkNCaWNtOTNjMlZ5YzF4dUlDQWdJQ0FnSUNCeVpYRjFaWE4wVkdsamF5QTlJR1oxYm1OMGFXOXVJQ2dwSUh0Y2JpQWdJQ0FnSUNBZ0lDQWdJSE5sZEZScGJXVnZkWFFvWm14MWMyZ3NJREFwTzF4dUlDQWdJQ0FnSUNCOU8xeHVJQ0FnSUgxY2JpQWdJQ0F2THlCeWRXNXpJR0VnZEdGemF5QmhablJsY2lCaGJHd2diM1JvWlhJZ2RHRnphM01nYUdGMlpTQmlaV1Z1SUhKMWJseHVJQ0FnSUM4dklIUm9hWE1nYVhNZ2RYTmxablZzSUdadmNpQjFibWhoYm1Sc1pXUWdjbVZxWldOMGFXOXVJSFJ5WVdOcmFXNW5JSFJvWVhRZ2JtVmxaSE1nZEc4Z2FHRndjR1Z1WEc0Z0lDQWdMeThnWVdaMFpYSWdZV3hzSUdCMGFHVnVZR1FnZEdGemEzTWdhR0YyWlNCaVpXVnVJSEoxYmk1Y2JpQWdJQ0J1WlhoMFZHbGpheTV5ZFc1QlpuUmxjaUE5SUdaMWJtTjBhVzl1SUNoMFlYTnJLU0I3WEc0Z0lDQWdJQ0FnSUd4aGRHVnlVWFZsZFdVdWNIVnphQ2gwWVhOcktUdGNiaUFnSUNBZ0lDQWdhV1lnS0NGbWJIVnphR2x1WnlrZ2UxeHVJQ0FnSUNBZ0lDQWdJQ0FnWm14MWMyaHBibWNnUFNCMGNuVmxPMXh1SUNBZ0lDQWdJQ0FnSUNBZ2NtVnhkV1Z6ZEZScFkyc29LVHRjYmlBZ0lDQWdJQ0FnZlZ4dUlDQWdJSDA3WEc0Z0lDQWdjbVYwZFhKdUlHNWxlSFJVYVdOck8xeHVmU2tvS1R0Y2JseHVMeThnUVhSMFpXMXdkQ0IwYnlCdFlXdGxJR2RsYm1WeWFXTnpJSE5oWm1VZ2FXNGdkR2hsSUdaaFkyVWdiMllnWkc5M2JuTjBjbVZoYlZ4dUx5OGdiVzlrYVdacFkyRjBhVzl1Y3k1Y2JpOHZJRlJvWlhKbElHbHpJRzV2SUhOcGRIVmhkR2x2YmlCM2FHVnlaU0IwYUdseklHbHpJRzVsWTJWemMyRnllUzVjYmk4dklFbG1JSGx2ZFNCdVpXVmtJR0VnYzJWamRYSnBkSGtnWjNWaGNtRnVkR1ZsTENCMGFHVnpaU0J3Y21sdGIzSmthV0ZzY3lCdVpXVmtJSFJ2SUdKbFhHNHZMeUJrWldWd2JIa2dabkp2ZW1WdUlHRnVlWGRoZVN3Z1lXNWtJR2xtSUhsdmRTQmtiMjdpZ0psMElHNWxaV1FnWVNCelpXTjFjbWwwZVNCbmRXRnlZVzUwWldVc1hHNHZMeUIwYUdseklHbHpJR3AxYzNRZ2NHeGhhVzRnY0dGeVlXNXZhV1F1WEc0dkx5QkliM2RsZG1WeUxDQjBhR2x6SUNvcWJXbG5hSFFxS2lCb1lYWmxJSFJvWlNCdWFXTmxJSE5wWkdVdFpXWm1aV04wSUc5bUlISmxaSFZqYVc1bklIUm9aU0J6YVhwbElHOW1YRzR2THlCMGFHVWdiV2x1YVdacFpXUWdZMjlrWlNCaWVTQnlaV1IxWTJsdVp5QjRMbU5oYkd3b0tTQjBieUJ0WlhKbGJIa2dlQ2dwWEc0dkx5QlRaV1VnVFdGeWF5Qk5hV3hzWlhMaWdKbHpJR1Y0Y0d4aGJtRjBhVzl1SUc5bUlIZG9ZWFFnZEdocGN5QmtiMlZ6TGx4dUx5OGdhSFIwY0RvdkwzZHBhMmt1WldOdFlYTmpjbWx3ZEM1dmNtY3ZaRzlyZFM1d2FIQS9hV1E5WTI5dWRtVnVkR2x2Ym5NNmMyRm1aVjl0WlhSaFgzQnliMmR5WVcxdGFXNW5YRzUyWVhJZ1kyRnNiQ0E5SUVaMWJtTjBhVzl1TG1OaGJHdzdYRzVtZFc1amRHbHZiaUIxYm1OMWNuSjVWR2hwY3lobUtTQjdYRzRnSUNBZ2NtVjBkWEp1SUdaMWJtTjBhVzl1SUNncElIdGNiaUFnSUNBZ0lDQWdjbVYwZFhKdUlHTmhiR3d1WVhCd2JIa29aaXdnWVhKbmRXMWxiblJ6S1R0Y2JpQWdJQ0I5TzF4dWZWeHVMeThnVkdocGN5QnBjeUJsY1hWcGRtRnNaVzUwTENCaWRYUWdjMnh2ZDJWeU9seHVMeThnZFc1amRYSnllVlJvYVhNZ1BTQkdkVzVqZEdsdmJsOWlhVzVrTG1KcGJtUW9SblZ1WTNScGIyNWZZbWx1WkM1allXeHNLVHRjYmk4dklHaDBkSEE2THk5cWMzQmxjbVl1WTI5dEwzVnVZM1Z5Y25sMGFHbHpYRzVjYm5aaGNpQmhjbkpoZVY5emJHbGpaU0E5SUhWdVkzVnljbmxVYUdsektFRnljbUY1TG5CeWIzUnZkSGx3WlM1emJHbGpaU2s3WEc1Y2JuWmhjaUJoY25KaGVWOXlaV1IxWTJVZ1BTQjFibU4xY25KNVZHaHBjeWhjYmlBZ0lDQkJjbkpoZVM1d2NtOTBiM1I1Y0dVdWNtVmtkV05sSUh4OElHWjFibU4wYVc5dUlDaGpZV3hzWW1GamF5d2dZbUZ6YVhNcElIdGNiaUFnSUNBZ0lDQWdkbUZ5SUdsdVpHVjRJRDBnTUN4Y2JpQWdJQ0FnSUNBZ0lDQWdJR3hsYm1kMGFDQTlJSFJvYVhNdWJHVnVaM1JvTzF4dUlDQWdJQ0FnSUNBdkx5QmpiMjVqWlhKdWFXNW5JSFJvWlNCcGJtbDBhV0ZzSUhaaGJIVmxMQ0JwWmlCdmJtVWdhWE1nYm05MElIQnliM1pwWkdWa1hHNGdJQ0FnSUNBZ0lHbG1JQ2hoY21kMWJXVnVkSE11YkdWdVozUm9JRDA5UFNBeEtTQjdYRzRnSUNBZ0lDQWdJQ0FnSUNBdkx5QnpaV1ZySUhSdklIUm9aU0JtYVhKemRDQjJZV3gxWlNCcGJpQjBhR1VnWVhKeVlYa3NJR0ZqWTI5MWJuUnBibWRjYmlBZ0lDQWdJQ0FnSUNBZ0lDOHZJR1p2Y2lCMGFHVWdjRzl6YzJsaWFXeHBkSGtnZEdoaGRDQnBjeUJwY3lCaElITndZWEp6WlNCaGNuSmhlVnh1SUNBZ0lDQWdJQ0FnSUNBZ1pHOGdlMXh1SUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJR2xtSUNocGJtUmxlQ0JwYmlCMGFHbHpLU0I3WEc0Z0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lHSmhjMmx6SUQwZ2RHaHBjMXRwYm1SbGVDc3JYVHRjYmlBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ1luSmxZV3M3WEc0Z0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnZlZ4dUlDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUdsbUlDZ3JLMmx1WkdWNElENDlJR3hsYm1kMGFDa2dlMXh1SUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNCMGFISnZkeUJ1WlhjZ1ZIbHdaVVZ5Y205eUtDazdYRzRnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdmVnh1SUNBZ0lDQWdJQ0FnSUNBZ2ZTQjNhR2xzWlNBb01TazdYRzRnSUNBZ0lDQWdJSDFjYmlBZ0lDQWdJQ0FnTHk4Z2NtVmtkV05sWEc0Z0lDQWdJQ0FnSUdadmNpQW9PeUJwYm1SbGVDQThJR3hsYm1kMGFEc2dhVzVrWlhnckt5a2dlMXh1SUNBZ0lDQWdJQ0FnSUNBZ0x5OGdZV05qYjNWdWRDQm1iM0lnZEdobElIQnZjM05wWW1sc2FYUjVJSFJvWVhRZ2RHaGxJR0Z5Y21GNUlHbHpJSE53WVhKelpWeHVJQ0FnSUNBZ0lDQWdJQ0FnYVdZZ0tHbHVaR1Y0SUdsdUlIUm9hWE1wSUh0Y2JpQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNCaVlYTnBjeUE5SUdOaGJHeGlZV05yS0dKaGMybHpMQ0IwYUdselcybHVaR1Y0WFN3Z2FXNWtaWGdwTzF4dUlDQWdJQ0FnSUNBZ0lDQWdmVnh1SUNBZ0lDQWdJQ0I5WEc0Z0lDQWdJQ0FnSUhKbGRIVnliaUJpWVhOcGN6dGNiaUFnSUNCOVhHNHBPMXh1WEc1MllYSWdZWEp5WVhsZmFXNWtaWGhQWmlBOUlIVnVZM1Z5Y25sVWFHbHpLRnh1SUNBZ0lFRnljbUY1TG5CeWIzUnZkSGx3WlM1cGJtUmxlRTltSUh4OElHWjFibU4wYVc5dUlDaDJZV3gxWlNrZ2UxeHVJQ0FnSUNBZ0lDQXZMeUJ1YjNRZ1lTQjJaWEo1SUdkdmIyUWdjMmhwYlN3Z1luVjBJR2R2YjJRZ1pXNXZkV2RvSUdadmNpQnZkWElnYjI1bElIVnpaU0J2WmlCcGRGeHVJQ0FnSUNBZ0lDQm1iM0lnS0haaGNpQnBJRDBnTURzZ2FTQThJSFJvYVhNdWJHVnVaM1JvT3lCcEt5c3BJSHRjYmlBZ0lDQWdJQ0FnSUNBZ0lHbG1JQ2gwYUdselcybGRJRDA5UFNCMllXeDFaU2tnZTF4dUlDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUhKbGRIVnliaUJwTzF4dUlDQWdJQ0FnSUNBZ0lDQWdmVnh1SUNBZ0lDQWdJQ0I5WEc0Z0lDQWdJQ0FnSUhKbGRIVnliaUF0TVR0Y2JpQWdJQ0I5WEc0cE8xeHVYRzUyWVhJZ1lYSnlZWGxmYldGd0lEMGdkVzVqZFhKeWVWUm9hWE1vWEc0Z0lDQWdRWEp5WVhrdWNISnZkRzkwZVhCbExtMWhjQ0I4ZkNCbWRXNWpkR2x2YmlBb1kyRnNiR0poWTJzc0lIUm9hWE53S1NCN1hHNGdJQ0FnSUNBZ0lIWmhjaUJ6Wld4bUlEMGdkR2hwY3p0Y2JpQWdJQ0FnSUNBZ2RtRnlJR052Ykd4bFkzUWdQU0JiWFR0Y2JpQWdJQ0FnSUNBZ1lYSnlZWGxmY21Wa2RXTmxLSE5sYkdZc0lHWjFibU4wYVc5dUlDaDFibVJsWm1sdVpXUXNJSFpoYkhWbExDQnBibVJsZUNrZ2UxeHVJQ0FnSUNBZ0lDQWdJQ0FnWTI5c2JHVmpkQzV3ZFhOb0tHTmhiR3hpWVdOckxtTmhiR3dvZEdocGMzQXNJSFpoYkhWbExDQnBibVJsZUN3Z2MyVnNaaWtwTzF4dUlDQWdJQ0FnSUNCOUxDQjJiMmxrSURBcE8xeHVJQ0FnSUNBZ0lDQnlaWFIxY200Z1kyOXNiR1ZqZER0Y2JpQWdJQ0I5WEc0cE8xeHVYRzUyWVhJZ2IySnFaV04wWDJOeVpXRjBaU0E5SUU5aWFtVmpkQzVqY21WaGRHVWdmSHdnWm5WdVkzUnBiMjRnS0hCeWIzUnZkSGx3WlNrZ2UxeHVJQ0FnSUdaMWJtTjBhVzl1SUZSNWNHVW9LU0I3SUgxY2JpQWdJQ0JVZVhCbExuQnliM1J2ZEhsd1pTQTlJSEJ5YjNSdmRIbHdaVHRjYmlBZ0lDQnlaWFIxY200Z2JtVjNJRlI1Y0dVb0tUdGNibjA3WEc1Y2JuWmhjaUJ2WW1wbFkzUmZhR0Z6VDNkdVVISnZjR1Z5ZEhrZ1BTQjFibU4xY25KNVZHaHBjeWhQWW1wbFkzUXVjSEp2ZEc5MGVYQmxMbWhoYzA5M2JsQnliM0JsY25SNUtUdGNibHh1ZG1GeUlHOWlhbVZqZEY5clpYbHpJRDBnVDJKcVpXTjBMbXRsZVhNZ2ZId2dablZ1WTNScGIyNGdLRzlpYW1WamRDa2dlMXh1SUNBZ0lIWmhjaUJyWlhseklEMGdXMTA3WEc0Z0lDQWdabTl5SUNoMllYSWdhMlY1SUdsdUlHOWlhbVZqZENrZ2UxeHVJQ0FnSUNBZ0lDQnBaaUFvYjJKcVpXTjBYMmhoYzA5M2JsQnliM0JsY25SNUtHOWlhbVZqZEN3Z2EyVjVLU2tnZTF4dUlDQWdJQ0FnSUNBZ0lDQWdhMlY1Y3k1d2RYTm9LR3RsZVNrN1hHNGdJQ0FnSUNBZ0lIMWNiaUFnSUNCOVhHNGdJQ0FnY21WMGRYSnVJR3RsZVhNN1hHNTlPMXh1WEc1MllYSWdiMkpxWldOMFgzUnZVM1J5YVc1bklEMGdkVzVqZFhKeWVWUm9hWE1vVDJKcVpXTjBMbkJ5YjNSdmRIbHdaUzUwYjFOMGNtbHVaeWs3WEc1Y2JtWjFibU4wYVc5dUlHbHpUMkpxWldOMEtIWmhiSFZsS1NCN1hHNGdJQ0FnY21WMGRYSnVJSFpoYkhWbElEMDlQU0JQWW1wbFkzUW9kbUZzZFdVcE8xeHVmVnh1WEc0dkx5Qm5aVzVsY21GMGIzSWdjbVZzWVhSbFpDQnphR2x0YzF4dVhHNHZMeUJHU1ZoTlJUb2dVbVZ0YjNabElIUm9hWE1nWm5WdVkzUnBiMjRnYjI1alpTQkZVellnWjJWdVpYSmhkRzl5Y3lCaGNtVWdhVzRnVTNCcFpHVnlUVzl1YTJWNUxseHVablZ1WTNScGIyNGdhWE5UZEc5d1NYUmxjbUYwYVc5dUtHVjRZMlZ3ZEdsdmJpa2dlMXh1SUNBZ0lISmxkSFZ5YmlBb1hHNGdJQ0FnSUNBZ0lHOWlhbVZqZEY5MGIxTjBjbWx1WnlobGVHTmxjSFJwYjI0cElEMDlQU0JjSWx0dlltcGxZM1FnVTNSdmNFbDBaWEpoZEdsdmJsMWNJaUI4ZkZ4dUlDQWdJQ0FnSUNCbGVHTmxjSFJwYjI0Z2FXNXpkR0Z1WTJWdlppQlJVbVYwZFhKdVZtRnNkV1ZjYmlBZ0lDQXBPMXh1ZlZ4dVhHNHZMeUJHU1ZoTlJUb2dVbVZ0YjNabElIUm9hWE1nYUdWc2NHVnlJR0Z1WkNCUkxuSmxkSFZ5YmlCdmJtTmxJRVZUTmlCblpXNWxjbUYwYjNKeklHRnlaU0JwYmx4dUx5OGdVM0JwWkdWeVRXOXVhMlY1TGx4dWRtRnlJRkZTWlhSMWNtNVdZV3gxWlR0Y2JtbG1JQ2gwZVhCbGIyWWdVbVYwZFhKdVZtRnNkV1VnSVQwOUlGd2lkVzVrWldacGJtVmtYQ0lwSUh0Y2JpQWdJQ0JSVW1WMGRYSnVWbUZzZFdVZ1BTQlNaWFIxY201V1lXeDFaVHRjYm4wZ1pXeHpaU0I3WEc0Z0lDQWdVVkpsZEhWeWJsWmhiSFZsSUQwZ1puVnVZM1JwYjI0Z0tIWmhiSFZsS1NCN1hHNGdJQ0FnSUNBZ0lIUm9hWE11ZG1Gc2RXVWdQU0IyWVd4MVpUdGNiaUFnSUNCOU8xeHVmVnh1WEc0dkx5QnNiMjVuSUhOMFlXTnJJSFJ5WVdObGMxeHVYRzUyWVhJZ1UxUkJRMHRmU2xWTlVGOVRSVkJCVWtGVVQxSWdQU0JjSWtaeWIyMGdjSEpsZG1sdmRYTWdaWFpsYm5RNlhDSTdYRzVjYm1aMWJtTjBhVzl1SUcxaGEyVlRkR0ZqYTFSeVlXTmxURzl1WnlobGNuSnZjaXdnY0hKdmJXbHpaU2tnZTF4dUlDQWdJQzh2SUVsbUlIQnZjM05wWW14bExDQjBjbUZ1YzJadmNtMGdkR2hsSUdWeWNtOXlJSE4wWVdOcklIUnlZV05sSUdKNUlISmxiVzkyYVc1bklFNXZaR1VnWVc1a0lGRmNiaUFnSUNBdkx5QmpjblZtZEN3Z2RHaGxiaUJqYjI1allYUmxibUYwYVc1bklIZHBkR2dnZEdobElITjBZV05ySUhSeVlXTmxJRzltSUdCd2NtOXRhWE5sWUM0Z1UyVmxJQ00xTnk1Y2JpQWdJQ0JwWmlBb2FHRnpVM1JoWTJ0eklDWW1YRzRnSUNBZ0lDQWdJSEJ5YjIxcGMyVXVjM1JoWTJzZ0ppWmNiaUFnSUNBZ0lDQWdkSGx3Wlc5bUlHVnljbTl5SUQwOVBTQmNJbTlpYW1WamRGd2lJQ1ltWEc0Z0lDQWdJQ0FnSUdWeWNtOXlJQ0U5UFNCdWRXeHNJQ1ltWEc0Z0lDQWdJQ0FnSUdWeWNtOXlMbk4wWVdOcklDWW1YRzRnSUNBZ0lDQWdJR1Z5Y205eUxuTjBZV05yTG1sdVpHVjRUMllvVTFSQlEwdGZTbFZOVUY5VFJWQkJVa0ZVVDFJcElEMDlQU0F0TVZ4dUlDQWdJQ2tnZTF4dUlDQWdJQ0FnSUNCMllYSWdjM1JoWTJ0eklEMGdXMTA3WEc0Z0lDQWdJQ0FnSUdadmNpQW9kbUZ5SUhBZ1BTQndjbTl0YVhObE95QWhJWEE3SUhBZ1BTQndMbk52ZFhKalpTa2dlMXh1SUNBZ0lDQWdJQ0FnSUNBZ2FXWWdLSEF1YzNSaFkyc3BJSHRjYmlBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0J6ZEdGamEzTXVkVzV6YUdsbWRDaHdMbk4wWVdOcktUdGNiaUFnSUNBZ0lDQWdJQ0FnSUgxY2JpQWdJQ0FnSUNBZ2ZWeHVJQ0FnSUNBZ0lDQnpkR0ZqYTNNdWRXNXphR2xtZENobGNuSnZjaTV6ZEdGamF5azdYRzVjYmlBZ0lDQWdJQ0FnZG1GeUlHTnZibU5oZEdWa1UzUmhZMnR6SUQwZ2MzUmhZMnR6TG1wdmFXNG9YQ0pjWEc1Y0lpQXJJRk5VUVVOTFgwcFZUVkJmVTBWUVFWSkJWRTlTSUNzZ1hDSmNYRzVjSWlrN1hHNGdJQ0FnSUNBZ0lHVnljbTl5TG5OMFlXTnJJRDBnWm1sc2RHVnlVM1JoWTJ0VGRISnBibWNvWTI5dVkyRjBaV1JUZEdGamEzTXBPMXh1SUNBZ0lIMWNibjFjYmx4dVpuVnVZM1JwYjI0Z1ptbHNkR1Z5VTNSaFkydFRkSEpwYm1jb2MzUmhZMnRUZEhKcGJtY3BJSHRjYmlBZ0lDQjJZWElnYkdsdVpYTWdQU0J6ZEdGamExTjBjbWx1Wnk1emNHeHBkQ2hjSWx4Y2Jsd2lLVHRjYmlBZ0lDQjJZWElnWkdWemFYSmxaRXhwYm1WeklEMGdXMTA3WEc0Z0lDQWdabTl5SUNoMllYSWdhU0E5SURBN0lHa2dQQ0JzYVc1bGN5NXNaVzVuZEdnN0lDc3JhU2tnZTF4dUlDQWdJQ0FnSUNCMllYSWdiR2x1WlNBOUlHeHBibVZ6VzJsZE8xeHVYRzRnSUNBZ0lDQWdJR2xtSUNnaGFYTkpiblJsY201aGJFWnlZVzFsS0d4cGJtVXBJQ1ltSUNGcGMwNXZaR1ZHY21GdFpTaHNhVzVsS1NBbUppQnNhVzVsS1NCN1hHNGdJQ0FnSUNBZ0lDQWdJQ0JrWlhOcGNtVmtUR2x1WlhNdWNIVnphQ2hzYVc1bEtUdGNiaUFnSUNBZ0lDQWdmVnh1SUNBZ0lIMWNiaUFnSUNCeVpYUjFjbTRnWkdWemFYSmxaRXhwYm1WekxtcHZhVzRvWENKY1hHNWNJaWs3WEc1OVhHNWNibVoxYm1OMGFXOXVJR2x6VG05a1pVWnlZVzFsS0hOMFlXTnJUR2x1WlNrZ2UxeHVJQ0FnSUhKbGRIVnliaUJ6ZEdGamEweHBibVV1YVc1a1pYaFBaaWhjSWlodGIyUjFiR1V1YW5NNlhDSXBJQ0U5UFNBdE1TQjhmRnh1SUNBZ0lDQWdJQ0FnSUNCemRHRmphMHhwYm1VdWFXNWtaWGhQWmloY0lpaHViMlJsTG1wek9sd2lLU0FoUFQwZ0xURTdYRzU5WEc1Y2JtWjFibU4wYVc5dUlHZGxkRVpwYkdWT1lXMWxRVzVrVEdsdVpVNTFiV0psY2loemRHRmphMHhwYm1VcElIdGNiaUFnSUNBdkx5Qk9ZVzFsWkNCbWRXNWpkR2x2Ym5NNklGd2lZWFFnWm5WdVkzUnBiMjVPWVcxbElDaG1hV3hsYm1GdFpUcHNhVzVsVG5WdFltVnlPbU52YkhWdGJrNTFiV0psY2lsY0lseHVJQ0FnSUM4dklFbHVJRWxGTVRBZ1puVnVZM1JwYjI0Z2JtRnRaU0JqWVc0Z2FHRjJaU0J6Y0dGalpYTWdLRndpUVc1dmJubHRiM1Z6SUdaMWJtTjBhVzl1WENJcElFOWZiMXh1SUNBZ0lIWmhjaUJoZEhSbGJYQjBNU0E5SUM5aGRDQXVLeUJjWENnb0xpc3BPaWhjWEdRcktUb29QenBjWEdRcktWeGNLU1F2TG1WNFpXTW9jM1JoWTJ0TWFXNWxLVHRjYmlBZ0lDQnBaaUFvWVhSMFpXMXdkREVwSUh0Y2JpQWdJQ0FnSUNBZ2NtVjBkWEp1SUZ0aGRIUmxiWEIwTVZzeFhTd2dUblZ0WW1WeUtHRjBkR1Z0Y0hReFd6SmRLVjA3WEc0Z0lDQWdmVnh1WEc0Z0lDQWdMeThnUVc1dmJubHRiM1Z6SUdaMWJtTjBhVzl1Y3pvZ1hDSmhkQ0JtYVd4bGJtRnRaVHBzYVc1bFRuVnRZbVZ5T21OdmJIVnRiazUxYldKbGNsd2lYRzRnSUNBZ2RtRnlJR0YwZEdWdGNIUXlJRDBnTDJGMElDaGJYaUJkS3lrNktGeGNaQ3NwT2lnL09seGNaQ3NwSkM4dVpYaGxZeWh6ZEdGamEweHBibVVwTzF4dUlDQWdJR2xtSUNoaGRIUmxiWEIwTWlrZ2UxeHVJQ0FnSUNBZ0lDQnlaWFIxY200Z1cyRjBkR1Z0Y0hReVd6RmRMQ0JPZFcxaVpYSW9ZWFIwWlcxd2RESmJNbDBwWFR0Y2JpQWdJQ0I5WEc1Y2JpQWdJQ0F2THlCR2FYSmxabTk0SUhOMGVXeGxPaUJjSW1aMWJtTjBhVzl1UUdacGJHVnVZVzFsT214cGJtVk9kVzFpWlhJZ2IzSWdRR1pwYkdWdVlXMWxPbXhwYm1WT2RXMWlaWEpjSWx4dUlDQWdJSFpoY2lCaGRIUmxiWEIwTXlBOUlDOHVLa0FvTGlzcE9paGNYR1FyS1NRdkxtVjRaV01vYzNSaFkydE1hVzVsS1R0Y2JpQWdJQ0JwWmlBb1lYUjBaVzF3ZERNcElIdGNiaUFnSUNBZ0lDQWdjbVYwZFhKdUlGdGhkSFJsYlhCME0xc3hYU3dnVG5WdFltVnlLR0YwZEdWdGNIUXpXekpkS1YwN1hHNGdJQ0FnZlZ4dWZWeHVYRzVtZFc1amRHbHZiaUJwYzBsdWRHVnlibUZzUm5KaGJXVW9jM1JoWTJ0TWFXNWxLU0I3WEc0Z0lDQWdkbUZ5SUdacGJHVk9ZVzFsUVc1a1RHbHVaVTUxYldKbGNpQTlJR2RsZEVacGJHVk9ZVzFsUVc1a1RHbHVaVTUxYldKbGNpaHpkR0ZqYTB4cGJtVXBPMXh1WEc0Z0lDQWdhV1lnS0NGbWFXeGxUbUZ0WlVGdVpFeHBibVZPZFcxaVpYSXBJSHRjYmlBZ0lDQWdJQ0FnY21WMGRYSnVJR1poYkhObE8xeHVJQ0FnSUgxY2JseHVJQ0FnSUhaaGNpQm1hV3hsVG1GdFpTQTlJR1pwYkdWT1lXMWxRVzVrVEdsdVpVNTFiV0psY2xzd1hUdGNiaUFnSUNCMllYSWdiR2x1WlU1MWJXSmxjaUE5SUdacGJHVk9ZVzFsUVc1a1RHbHVaVTUxYldKbGNsc3hYVHRjYmx4dUlDQWdJSEpsZEhWeWJpQm1hV3hsVG1GdFpTQTlQVDBnY1VacGJHVk9ZVzFsSUNZbVhHNGdJQ0FnSUNBZ0lHeHBibVZPZFcxaVpYSWdQajBnY1ZOMFlYSjBhVzVuVEdsdVpTQW1KbHh1SUNBZ0lDQWdJQ0JzYVc1bFRuVnRZbVZ5SUR3OUlIRkZibVJwYm1kTWFXNWxPMXh1ZlZ4dVhHNHZMeUJrYVhOamIzWmxjaUJ2ZDI0Z1ptbHNaU0J1WVcxbElHRnVaQ0JzYVc1bElHNTFiV0psY2lCeVlXNW5aU0JtYjNJZ1ptbHNkR1Z5YVc1bklITjBZV05yWEc0dkx5QjBjbUZqWlhOY2JtWjFibU4wYVc5dUlHTmhjSFIxY21WTWFXNWxLQ2tnZTF4dUlDQWdJR2xtSUNnaGFHRnpVM1JoWTJ0ektTQjdYRzRnSUNBZ0lDQWdJSEpsZEhWeWJqdGNiaUFnSUNCOVhHNWNiaUFnSUNCMGNua2dlMXh1SUNBZ0lDQWdJQ0IwYUhKdmR5QnVaWGNnUlhKeWIzSW9LVHRjYmlBZ0lDQjlJR05oZEdOb0lDaGxLU0I3WEc0Z0lDQWdJQ0FnSUhaaGNpQnNhVzVsY3lBOUlHVXVjM1JoWTJzdWMzQnNhWFFvWENKY1hHNWNJaWs3WEc0Z0lDQWdJQ0FnSUhaaGNpQm1hWEp6ZEV4cGJtVWdQU0JzYVc1bGMxc3dYUzVwYm1SbGVFOW1LRndpUUZ3aUtTQStJREFnUHlCc2FXNWxjMXN4WFNBNklHeHBibVZ6V3pKZE8xeHVJQ0FnSUNBZ0lDQjJZWElnWm1sc1pVNWhiV1ZCYm1STWFXNWxUblZ0WW1WeUlEMGdaMlYwUm1sc1pVNWhiV1ZCYm1STWFXNWxUblZ0WW1WeUtHWnBjbk4wVEdsdVpTazdYRzRnSUNBZ0lDQWdJR2xtSUNnaFptbHNaVTVoYldWQmJtUk1hVzVsVG5WdFltVnlLU0I3WEc0Z0lDQWdJQ0FnSUNBZ0lDQnlaWFIxY200N1hHNGdJQ0FnSUNBZ0lIMWNibHh1SUNBZ0lDQWdJQ0J4Um1sc1pVNWhiV1VnUFNCbWFXeGxUbUZ0WlVGdVpFeHBibVZPZFcxaVpYSmJNRjA3WEc0Z0lDQWdJQ0FnSUhKbGRIVnliaUJtYVd4bFRtRnRaVUZ1WkV4cGJtVk9kVzFpWlhKYk1WMDdYRzRnSUNBZ2ZWeHVmVnh1WEc1bWRXNWpkR2x2YmlCa1pYQnlaV05oZEdVb1kyRnNiR0poWTJzc0lHNWhiV1VzSUdGc2RHVnlibUYwYVhabEtTQjdYRzRnSUNBZ2NtVjBkWEp1SUdaMWJtTjBhVzl1SUNncElIdGNiaUFnSUNBZ0lDQWdhV1lnS0hSNWNHVnZaaUJqYjI1emIyeGxJQ0U5UFNCY0luVnVaR1ZtYVc1bFpGd2lJQ1ltWEc0Z0lDQWdJQ0FnSUNBZ0lDQjBlWEJsYjJZZ1kyOXVjMjlzWlM1M1lYSnVJRDA5UFNCY0ltWjFibU4wYVc5dVhDSXBJSHRjYmlBZ0lDQWdJQ0FnSUNBZ0lHTnZibk52YkdVdWQyRnliaWh1WVcxbElDc2dYQ0lnYVhNZ1pHVndjbVZqWVhSbFpDd2dkWE5sSUZ3aUlDc2dZV3gwWlhKdVlYUnBkbVVnSzF4dUlDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUZ3aUlHbHVjM1JsWVdRdVhDSXNJRzVsZHlCRmNuSnZjaWhjSWx3aUtTNXpkR0ZqYXlrN1hHNGdJQ0FnSUNBZ0lIMWNiaUFnSUNBZ0lDQWdjbVYwZFhKdUlHTmhiR3hpWVdOckxtRndjR3g1S0dOaGJHeGlZV05yTENCaGNtZDFiV1Z1ZEhNcE8xeHVJQ0FnSUgwN1hHNTlYRzVjYmk4dklHVnVaQ0J2WmlCemFHbHRjMXh1THk4Z1ltVm5hVzV1YVc1bklHOW1JSEpsWVd3Z2QyOXlhMXh1WEc0dktpcGNiaUFxSUVOdmJuTjBjblZqZEhNZ1lTQndjbTl0YVhObElHWnZjaUJoYmlCcGJXMWxaR2xoZEdVZ2NtVm1aWEpsYm1ObExDQndZWE56WlhNZ2NISnZiV2x6WlhNZ2RHaHliM1ZuYUN3Z2IzSmNiaUFxSUdOdlpYSmpaWE1nY0hKdmJXbHpaWE1nWm5KdmJTQmthV1ptWlhKbGJuUWdjM2x6ZEdWdGN5NWNiaUFxSUVCd1lYSmhiU0IyWVd4MVpTQnBiVzFsWkdsaGRHVWdjbVZtWlhKbGJtTmxJRzl5SUhCeWIyMXBjMlZjYmlBcUwxeHVablZ1WTNScGIyNGdVU2gyWVd4MVpTa2dlMXh1SUNBZ0lDOHZJRWxtSUhSb1pTQnZZbXBsWTNRZ2FYTWdZV3h5WldGa2VTQmhJRkJ5YjIxcGMyVXNJSEpsZEhWeWJpQnBkQ0JrYVhKbFkzUnNlUzRnSUZSb2FYTWdaVzVoWW14bGMxeHVJQ0FnSUM4dklIUm9aU0J5WlhOdmJIWmxJR1oxYm1OMGFXOXVJSFJ2SUdKdmRHZ2dZbVVnZFhObFpDQjBieUJqY21WaGRHVmtJSEpsWm1WeVpXNWpaWE1nWm5KdmJTQnZZbXBsWTNSekxGeHVJQ0FnSUM4dklHSjFkQ0IwYnlCMGIyeGxjbUZpYkhrZ1kyOWxjbU5sSUc1dmJpMXdjbTl0YVhObGN5QjBieUJ3Y205dGFYTmxjeTVjYmlBZ0lDQnBaaUFvZG1Gc2RXVWdhVzV6ZEdGdVkyVnZaaUJRY205dGFYTmxLU0I3WEc0Z0lDQWdJQ0FnSUhKbGRIVnliaUIyWVd4MVpUdGNiaUFnSUNCOVhHNWNiaUFnSUNBdkx5QmhjM05wYldsc1lYUmxJSFJvWlc1aFlteGxjMXh1SUNBZ0lHbG1JQ2hwYzFCeWIyMXBjMlZCYkdsclpTaDJZV3gxWlNrcElIdGNiaUFnSUNBZ0lDQWdjbVYwZFhKdUlHTnZaWEpqWlNoMllXeDFaU2s3WEc0Z0lDQWdmU0JsYkhObElIdGNiaUFnSUNBZ0lDQWdjbVYwZFhKdUlHWjFiR1pwYkd3b2RtRnNkV1VwTzF4dUlDQWdJSDFjYm4xY2JsRXVjbVZ6YjJ4MlpTQTlJRkU3WEc1Y2JpOHFLbHh1SUNvZ1VHVnlabTl5YlhNZ1lTQjBZWE5ySUdsdUlHRWdablYwZFhKbElIUjFjbTRnYjJZZ2RHaGxJR1YyWlc1MElHeHZiM0F1WEc0Z0tpQkFjR0Z5WVcwZ2UwWjFibU4wYVc5dWZTQjBZWE5yWEc0Z0tpOWNibEV1Ym1WNGRGUnBZMnNnUFNCdVpYaDBWR2xqYXp0Y2JseHVMeW9xWEc0Z0tpQkRiMjUwY205c2N5QjNhR1YwYUdWeUlHOXlJRzV2ZENCc2IyNW5JSE4wWVdOcklIUnlZV05sY3lCM2FXeHNJR0psSUc5dVhHNGdLaTljYmxFdWJHOXVaMU4wWVdOclUzVndjRzl5ZENBOUlHWmhiSE5sTzF4dVhHNHZMeUJsYm1GaWJHVWdiRzl1WnlCemRHRmphM01nYVdZZ1VWOUVSVUpWUnlCcGN5QnpaWFJjYm1sbUlDaDBlWEJsYjJZZ2NISnZZMlZ6Y3lBOVBUMGdYQ0p2WW1wbFkzUmNJaUFtSmlCd2NtOWpaWE56SUNZbUlIQnliMk5sYzNNdVpXNTJJQ1ltSUhCeWIyTmxjM011Wlc1MkxsRmZSRVZDVlVjcElIdGNiaUFnSUNCUkxteHZibWRUZEdGamExTjFjSEJ2Y25RZ1BTQjBjblZsTzF4dWZWeHVYRzR2S2lwY2JpQXFJRU52Ym5OMGNuVmpkSE1nWVNCN2NISnZiV2x6WlN3Z2NtVnpiMngyWlN3Z2NtVnFaV04wZlNCdlltcGxZM1F1WEc0Z0tseHVJQ29nWUhKbGMyOXNkbVZnSUdseklHRWdZMkZzYkdKaFkyc2dkRzhnYVc1MmIydGxJSGRwZEdnZ1lTQnRiM0psSUhKbGMyOXNkbVZrSUhaaGJIVmxJR1p2Y2lCMGFHVmNiaUFxSUhCeWIyMXBjMlV1SUZSdklHWjFiR1pwYkd3Z2RHaGxJSEJ5YjIxcGMyVXNJR2x1ZG05clpTQmdjbVZ6YjJ4MlpXQWdkMmwwYUNCaGJua2dkbUZzZFdVZ2RHaGhkQ0JwYzF4dUlDb2dibTkwSUdFZ2RHaGxibUZpYkdVdUlGUnZJSEpsYW1WamRDQjBhR1VnY0hKdmJXbHpaU3dnYVc1MmIydGxJR0J5WlhOdmJIWmxZQ0IzYVhSb0lHRWdjbVZxWldOMFpXUmNiaUFxSUhSb1pXNWhZbXhsTENCdmNpQnBiblp2YTJVZ1lISmxhbVZqZEdBZ2QybDBhQ0IwYUdVZ2NtVmhjMjl1SUdScGNtVmpkR3g1TGlCVWJ5QnlaWE52YkhabElIUm9aVnh1SUNvZ2NISnZiV2x6WlNCMGJ5QmhibTkwYUdWeUlIUm9aVzVoWW14bExDQjBhSFZ6SUhCMWRIUnBibWNnYVhRZ2FXNGdkR2hsSUhOaGJXVWdjM1JoZEdVc0lHbHVkbTlyWlZ4dUlDb2dZSEpsYzI5c2RtVmdJSGRwZEdnZ2RHaGhkQ0J2ZEdobGNpQjBhR1Z1WVdKc1pTNWNiaUFxTDF4dVVTNWtaV1psY2lBOUlHUmxabVZ5TzF4dVpuVnVZM1JwYjI0Z1pHVm1aWElvS1NCN1hHNGdJQ0FnTHk4Z2FXWWdYQ0p0WlhOellXZGxjMXdpSUdseklHRnVJRndpUVhKeVlYbGNJaXdnZEdoaGRDQnBibVJwWTJGMFpYTWdkR2hoZENCMGFHVWdjSEp2YldselpTQm9ZWE1nYm05MElIbGxkRnh1SUNBZ0lDOHZJR0psWlc0Z2NtVnpiMngyWldRdUlDQkpaaUJwZENCcGN5QmNJblZ1WkdWbWFXNWxaRndpTENCcGRDQm9ZWE1nWW1WbGJpQnlaWE52YkhabFpDNGdJRVZoWTJoY2JpQWdJQ0F2THlCbGJHVnRaVzUwSUc5bUlIUm9aU0J0WlhOellXZGxjeUJoY25KaGVTQnBjeUJwZEhObGJHWWdZVzRnWVhKeVlYa2diMllnWTI5dGNHeGxkR1VnWVhKbmRXMWxiblJ6SUhSdlhHNGdJQ0FnTHk4Z1ptOXlkMkZ5WkNCMGJ5QjBhR1VnY21WemIyeDJaV1FnY0hKdmJXbHpaUzRnSUZkbElHTnZaWEpqWlNCMGFHVWdjbVZ6YjJ4MWRHbHZiaUIyWVd4MVpTQjBieUJoWEc0Z0lDQWdMeThnY0hKdmJXbHpaU0IxYzJsdVp5QjBhR1VnWUhKbGMyOXNkbVZnSUdaMWJtTjBhVzl1SUdKbFkyRjFjMlVnYVhRZ2FHRnVaR3hsY3lCaWIzUm9JR1oxYkd4NVhHNGdJQ0FnTHk4Z2JtOXVMWFJvWlc1aFlteGxJSFpoYkhWbGN5QmhibVFnYjNSb1pYSWdkR2hsYm1GaWJHVnpJR2R5WVdObFpuVnNiSGt1WEc0Z0lDQWdkbUZ5SUcxbGMzTmhaMlZ6SUQwZ1cxMHNJSEJ5YjJkeVpYTnpUR2x6ZEdWdVpYSnpJRDBnVzEwc0lISmxjMjlzZG1Wa1VISnZiV2x6WlR0Y2JseHVJQ0FnSUhaaGNpQmtaV1psY25KbFpDQTlJRzlpYW1WamRGOWpjbVZoZEdVb1pHVm1aWEl1Y0hKdmRHOTBlWEJsS1R0Y2JpQWdJQ0IyWVhJZ2NISnZiV2x6WlNBOUlHOWlhbVZqZEY5amNtVmhkR1VvVUhKdmJXbHpaUzV3Y205MGIzUjVjR1VwTzF4dVhHNGdJQ0FnY0hKdmJXbHpaUzV3Y205dGFYTmxSR2x6Y0dGMFkyZ2dQU0JtZFc1amRHbHZiaUFvY21WemIyeDJaU3dnYjNBc0lHOXdaWEpoYm1SektTQjdYRzRnSUNBZ0lDQWdJSFpoY2lCaGNtZHpJRDBnWVhKeVlYbGZjMnhwWTJVb1lYSm5kVzFsYm5SektUdGNiaUFnSUNBZ0lDQWdhV1lnS0cxbGMzTmhaMlZ6S1NCN1hHNGdJQ0FnSUNBZ0lDQWdJQ0J0WlhOellXZGxjeTV3ZFhOb0tHRnlaM01wTzF4dUlDQWdJQ0FnSUNBZ0lDQWdhV1lnS0c5d0lEMDlQU0JjSW5kb1pXNWNJaUFtSmlCdmNHVnlZVzVrYzFzeFhTa2dleUF2THlCd2NtOW5jbVZ6Y3lCdmNHVnlZVzVrWEc0Z0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnY0hKdlozSmxjM05NYVhOMFpXNWxjbk11Y0hWemFDaHZjR1Z5WVc1a2Mxc3hYU2s3WEc0Z0lDQWdJQ0FnSUNBZ0lDQjlYRzRnSUNBZ0lDQWdJSDBnWld4elpTQjdYRzRnSUNBZ0lDQWdJQ0FnSUNCUkxtNWxlSFJVYVdOcktHWjFibU4wYVc5dUlDZ3BJSHRjYmlBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0J5WlhOdmJIWmxaRkJ5YjIxcGMyVXVjSEp2YldselpVUnBjM0JoZEdOb0xtRndjR3g1S0hKbGMyOXNkbVZrVUhKdmJXbHpaU3dnWVhKbmN5azdYRzRnSUNBZ0lDQWdJQ0FnSUNCOUtUdGNiaUFnSUNBZ0lDQWdmVnh1SUNBZ0lIMDdYRzVjYmlBZ0lDQXZMeUJZV0ZnZ1pHVndjbVZqWVhSbFpGeHVJQ0FnSUhCeWIyMXBjMlV1ZG1Gc2RXVlBaaUE5SUdaMWJtTjBhVzl1SUNncElIdGNiaUFnSUNBZ0lDQWdhV1lnS0cxbGMzTmhaMlZ6S1NCN1hHNGdJQ0FnSUNBZ0lDQWdJQ0J5WlhSMWNtNGdjSEp2YldselpUdGNiaUFnSUNBZ0lDQWdmVnh1SUNBZ0lDQWdJQ0IyWVhJZ2JtVmhjbVZ5Vm1Gc2RXVWdQU0J1WldGeVpYSW9jbVZ6YjJ4MlpXUlFjbTl0YVhObEtUdGNiaUFnSUNBZ0lDQWdhV1lnS0dselVISnZiV2x6WlNodVpXRnlaWEpXWVd4MVpTa3BJSHRjYmlBZ0lDQWdJQ0FnSUNBZ0lISmxjMjlzZG1Wa1VISnZiV2x6WlNBOUlHNWxZWEpsY2xaaGJIVmxPeUF2THlCemFHOXlkR1Z1SUdOb1lXbHVYRzRnSUNBZ0lDQWdJSDFjYmlBZ0lDQWdJQ0FnY21WMGRYSnVJRzVsWVhKbGNsWmhiSFZsTzF4dUlDQWdJSDA3WEc1Y2JpQWdJQ0J3Y205dGFYTmxMbWx1YzNCbFkzUWdQU0JtZFc1amRHbHZiaUFvS1NCN1hHNGdJQ0FnSUNBZ0lHbG1JQ2doY21WemIyeDJaV1JRY205dGFYTmxLU0I3WEc0Z0lDQWdJQ0FnSUNBZ0lDQnlaWFIxY200Z2V5QnpkR0YwWlRvZ1hDSndaVzVrYVc1blhDSWdmVHRjYmlBZ0lDQWdJQ0FnZlZ4dUlDQWdJQ0FnSUNCeVpYUjFjbTRnY21WemIyeDJaV1JRY205dGFYTmxMbWx1YzNCbFkzUW9LVHRjYmlBZ0lDQjlPMXh1WEc0Z0lDQWdhV1lnS0ZFdWJHOXVaMU4wWVdOclUzVndjRzl5ZENBbUppQm9ZWE5UZEdGamEzTXBJSHRjYmlBZ0lDQWdJQ0FnZEhKNUlIdGNiaUFnSUNBZ0lDQWdJQ0FnSUhSb2NtOTNJRzVsZHlCRmNuSnZjaWdwTzF4dUlDQWdJQ0FnSUNCOUlHTmhkR05vSUNobEtTQjdYRzRnSUNBZ0lDQWdJQ0FnSUNBdkx5Qk9UMVJGT2lCa2IyNG5kQ0IwY25rZ2RHOGdkWE5sSUdCRmNuSnZjaTVqWVhCMGRYSmxVM1JoWTJ0VWNtRmpaV0FnYjNJZ2RISmhibk5tWlhJZ2RHaGxYRzRnSUNBZ0lDQWdJQ0FnSUNBdkx5QmhZMk5sYzNOdmNpQmhjbTkxYm1RN0lIUm9ZWFFnWTJGMWMyVnpJRzFsYlc5eWVTQnNaV0ZyY3lCaGN5QndaWElnUjBndE1URXhMaUJLZFhOMFhHNGdJQ0FnSUNBZ0lDQWdJQ0F2THlCeVpXbG1lU0IwYUdVZ2MzUmhZMnNnZEhKaFkyVWdZWE1nWVNCemRISnBibWNnUVZOQlVDNWNiaUFnSUNBZ0lDQWdJQ0FnSUM4dlhHNGdJQ0FnSUNBZ0lDQWdJQ0F2THlCQmRDQjBhR1VnYzJGdFpTQjBhVzFsTENCamRYUWdiMlptSUhSb1pTQm1hWEp6ZENCc2FXNWxPeUJwZENkeklHRnNkMkY1Y3lCcWRYTjBYRzRnSUNBZ0lDQWdJQ0FnSUNBdkx5QmNJbHR2WW1wbFkzUWdVSEp2YldselpWMWNYRzVjSWl3Z1lYTWdjR1Z5SUhSb1pTQmdkRzlUZEhKcGJtZGdMbHh1SUNBZ0lDQWdJQ0FnSUNBZ2NISnZiV2x6WlM1emRHRmpheUE5SUdVdWMzUmhZMnN1YzNWaWMzUnlhVzVuS0dVdWMzUmhZMnN1YVc1a1pYaFBaaWhjSWx4Y2Jsd2lLU0FySURFcE8xeHVJQ0FnSUNBZ0lDQjlYRzRnSUNBZ2ZWeHVYRzRnSUNBZ0x5OGdUazlVUlRvZ2QyVWdaRzhnZEdobElHTm9aV05yY3lCbWIzSWdZSEpsYzI5c2RtVmtVSEp2YldselpXQWdhVzRnWldGamFDQnRaWFJvYjJRc0lHbHVjM1JsWVdRZ2IyWmNiaUFnSUNBdkx5QmpiMjV6YjJ4cFpHRjBhVzVuSUhSb1pXMGdhVzUwYnlCZ1ltVmpiMjFsWUN3Z2MybHVZMlVnYjNSb1pYSjNhWE5sSUhkbEoyUWdZM0psWVhSbElHNWxkMXh1SUNBZ0lDOHZJSEJ5YjIxcGMyVnpJSGRwZEdnZ2RHaGxJR3hwYm1WeklHQmlaV052YldVb2QyaGhkR1YyWlhJb2RtRnNkV1VwS1dBdUlGTmxaU0JsTG1jdUlFZElMVEkxTWk1Y2JseHVJQ0FnSUdaMWJtTjBhVzl1SUdKbFkyOXRaU2h1WlhkUWNtOXRhWE5sS1NCN1hHNGdJQ0FnSUNBZ0lISmxjMjlzZG1Wa1VISnZiV2x6WlNBOUlHNWxkMUJ5YjIxcGMyVTdYRzRnSUNBZ0lDQWdJSEJ5YjIxcGMyVXVjMjkxY21ObElEMGdibVYzVUhKdmJXbHpaVHRjYmx4dUlDQWdJQ0FnSUNCaGNuSmhlVjl5WldSMVkyVW9iV1Z6YzJGblpYTXNJR1oxYm1OMGFXOXVJQ2gxYm1SbFptbHVaV1FzSUcxbGMzTmhaMlVwSUh0Y2JpQWdJQ0FnSUNBZ0lDQWdJRkV1Ym1WNGRGUnBZMnNvWm5WdVkzUnBiMjRnS0NrZ2UxeHVJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lHNWxkMUJ5YjIxcGMyVXVjSEp2YldselpVUnBjM0JoZEdOb0xtRndjR3g1S0c1bGQxQnliMjFwYzJVc0lHMWxjM05oWjJVcE8xeHVJQ0FnSUNBZ0lDQWdJQ0FnZlNrN1hHNGdJQ0FnSUNBZ0lIMHNJSFp2YVdRZ01DazdYRzVjYmlBZ0lDQWdJQ0FnYldWemMyRm5aWE1nUFNCMmIybGtJREE3WEc0Z0lDQWdJQ0FnSUhCeWIyZHlaWE56VEdsemRHVnVaWEp6SUQwZ2RtOXBaQ0F3TzF4dUlDQWdJSDFjYmx4dUlDQWdJR1JsWm1WeWNtVmtMbkJ5YjIxcGMyVWdQU0J3Y205dGFYTmxPMXh1SUNBZ0lHUmxabVZ5Y21Wa0xuSmxjMjlzZG1VZ1BTQm1kVzVqZEdsdmJpQW9kbUZzZFdVcElIdGNiaUFnSUNBZ0lDQWdhV1lnS0hKbGMyOXNkbVZrVUhKdmJXbHpaU2tnZTF4dUlDQWdJQ0FnSUNBZ0lDQWdjbVYwZFhKdU8xeHVJQ0FnSUNBZ0lDQjlYRzVjYmlBZ0lDQWdJQ0FnWW1WamIyMWxLRkVvZG1Gc2RXVXBLVHRjYmlBZ0lDQjlPMXh1WEc0Z0lDQWdaR1ZtWlhKeVpXUXVablZzWm1sc2JDQTlJR1oxYm1OMGFXOXVJQ2gyWVd4MVpTa2dlMXh1SUNBZ0lDQWdJQ0JwWmlBb2NtVnpiMngyWldSUWNtOXRhWE5sS1NCN1hHNGdJQ0FnSUNBZ0lDQWdJQ0J5WlhSMWNtNDdYRzRnSUNBZ0lDQWdJSDFjYmx4dUlDQWdJQ0FnSUNCaVpXTnZiV1VvWm5Wc1ptbHNiQ2gyWVd4MVpTa3BPMXh1SUNBZ0lIMDdYRzRnSUNBZ1pHVm1aWEp5WldRdWNtVnFaV04wSUQwZ1puVnVZM1JwYjI0Z0tISmxZWE52YmlrZ2UxeHVJQ0FnSUNBZ0lDQnBaaUFvY21WemIyeDJaV1JRY205dGFYTmxLU0I3WEc0Z0lDQWdJQ0FnSUNBZ0lDQnlaWFIxY200N1hHNGdJQ0FnSUNBZ0lIMWNibHh1SUNBZ0lDQWdJQ0JpWldOdmJXVW9jbVZxWldOMEtISmxZWE52YmlrcE8xeHVJQ0FnSUgwN1hHNGdJQ0FnWkdWbVpYSnlaV1F1Ym05MGFXWjVJRDBnWm5WdVkzUnBiMjRnS0hCeWIyZHlaWE56S1NCN1hHNGdJQ0FnSUNBZ0lHbG1JQ2h5WlhOdmJIWmxaRkJ5YjIxcGMyVXBJSHRjYmlBZ0lDQWdJQ0FnSUNBZ0lISmxkSFZ5Ymp0Y2JpQWdJQ0FnSUNBZ2ZWeHVYRzRnSUNBZ0lDQWdJR0Z5Y21GNVgzSmxaSFZqWlNod2NtOW5jbVZ6YzB4cGMzUmxibVZ5Y3l3Z1puVnVZM1JwYjI0Z0tIVnVaR1ZtYVc1bFpDd2djSEp2WjNKbGMzTk1hWE4wWlc1bGNpa2dlMXh1SUNBZ0lDQWdJQ0FnSUNBZ1VTNXVaWGgwVkdsamF5aG1kVzVqZEdsdmJpQW9LU0I3WEc0Z0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnY0hKdlozSmxjM05NYVhOMFpXNWxjaWh3Y205bmNtVnpjeWs3WEc0Z0lDQWdJQ0FnSUNBZ0lDQjlLVHRjYmlBZ0lDQWdJQ0FnZlN3Z2RtOXBaQ0F3S1R0Y2JpQWdJQ0I5TzF4dVhHNGdJQ0FnY21WMGRYSnVJR1JsWm1WeWNtVmtPMXh1ZlZ4dVhHNHZLaXBjYmlBcUlFTnlaV0YwWlhNZ1lTQk9iMlJsTFhOMGVXeGxJR05oYkd4aVlXTnJJSFJvWVhRZ2QybHNiQ0J5WlhOdmJIWmxJRzl5SUhKbGFtVmpkQ0IwYUdVZ1pHVm1aWEp5WldSY2JpQXFJSEJ5YjIxcGMyVXVYRzRnS2lCQWNtVjBkWEp1Y3lCaElHNXZaR1ZpWVdOclhHNGdLaTljYm1SbFptVnlMbkJ5YjNSdmRIbHdaUzV0WVd0bFRtOWtaVkpsYzI5c2RtVnlJRDBnWm5WdVkzUnBiMjRnS0NrZ2UxeHVJQ0FnSUhaaGNpQnpaV3htSUQwZ2RHaHBjenRjYmlBZ0lDQnlaWFIxY200Z1puVnVZM1JwYjI0Z0tHVnljbTl5TENCMllXeDFaU2tnZTF4dUlDQWdJQ0FnSUNCcFppQW9aWEp5YjNJcElIdGNiaUFnSUNBZ0lDQWdJQ0FnSUhObGJHWXVjbVZxWldOMEtHVnljbTl5S1R0Y2JpQWdJQ0FnSUNBZ2ZTQmxiSE5sSUdsbUlDaGhjbWQxYldWdWRITXViR1Z1WjNSb0lENGdNaWtnZTF4dUlDQWdJQ0FnSUNBZ0lDQWdjMlZzWmk1eVpYTnZiSFpsS0dGeWNtRjVYM05zYVdObEtHRnlaM1Z0Wlc1MGN5d2dNU2twTzF4dUlDQWdJQ0FnSUNCOUlHVnNjMlVnZTF4dUlDQWdJQ0FnSUNBZ0lDQWdjMlZzWmk1eVpYTnZiSFpsS0haaGJIVmxLVHRjYmlBZ0lDQWdJQ0FnZlZ4dUlDQWdJSDA3WEc1OU8xeHVYRzR2S2lwY2JpQXFJRUJ3WVhKaGJTQnlaWE52YkhabGNpQjdSblZ1WTNScGIyNTlJR0VnWm5WdVkzUnBiMjRnZEdoaGRDQnlaWFIxY201eklHNXZkR2hwYm1jZ1lXNWtJR0ZqWTJWd2RITmNiaUFxSUhSb1pTQnlaWE52YkhabExDQnlaV3BsWTNRc0lHRnVaQ0J1YjNScFpua2dablZ1WTNScGIyNXpJR1p2Y2lCaElHUmxabVZ5Y21Wa0xseHVJQ29nUUhKbGRIVnlibk1nWVNCd2NtOXRhWE5sSUhSb1lYUWdiV0Y1SUdKbElISmxjMjlzZG1Wa0lIZHBkR2dnZEdobElHZHBkbVZ1SUhKbGMyOXNkbVVnWVc1a0lISmxhbVZqZEZ4dUlDb2dablZ1WTNScGIyNXpMQ0J2Y2lCeVpXcGxZM1JsWkNCaWVTQmhJSFJvY205M2JpQmxlR05sY0hScGIyNGdhVzRnY21WemIyeDJaWEpjYmlBcUwxeHVVUzVRY205dGFYTmxJRDBnY0hKdmJXbHpaVHNnTHk4Z1JWTTJYRzVSTG5CeWIyMXBjMlVnUFNCd2NtOXRhWE5sTzF4dVpuVnVZM1JwYjI0Z2NISnZiV2x6WlNoeVpYTnZiSFpsY2lrZ2UxeHVJQ0FnSUdsbUlDaDBlWEJsYjJZZ2NtVnpiMngyWlhJZ0lUMDlJRndpWm5WdVkzUnBiMjVjSWlrZ2UxeHVJQ0FnSUNBZ0lDQjBhSEp2ZHlCdVpYY2dWSGx3WlVWeWNtOXlLRndpY21WemIyeDJaWElnYlhWemRDQmlaU0JoSUdaMWJtTjBhVzl1TGx3aUtUdGNiaUFnSUNCOVhHNGdJQ0FnZG1GeUlHUmxabVZ5Y21Wa0lEMGdaR1ZtWlhJb0tUdGNiaUFnSUNCMGNua2dlMXh1SUNBZ0lDQWdJQ0J5WlhOdmJIWmxjaWhrWldabGNuSmxaQzV5WlhOdmJIWmxMQ0JrWldabGNuSmxaQzV5WldwbFkzUXNJR1JsWm1WeWNtVmtMbTV2ZEdsbWVTazdYRzRnSUNBZ2ZTQmpZWFJqYUNBb2NtVmhjMjl1S1NCN1hHNGdJQ0FnSUNBZ0lHUmxabVZ5Y21Wa0xuSmxhbVZqZENoeVpXRnpiMjRwTzF4dUlDQWdJSDFjYmlBZ0lDQnlaWFIxY200Z1pHVm1aWEp5WldRdWNISnZiV2x6WlR0Y2JuMWNibHh1Y0hKdmJXbHpaUzV5WVdObElEMGdjbUZqWlRzZ0x5OGdSVk0yWEc1d2NtOXRhWE5sTG1Gc2JDQTlJR0ZzYkRzZ0x5OGdSVk0yWEc1d2NtOXRhWE5sTG5KbGFtVmpkQ0E5SUhKbGFtVmpkRHNnTHk4Z1JWTTJYRzV3Y205dGFYTmxMbkpsYzI5c2RtVWdQU0JST3lBdkx5QkZVelpjYmx4dUx5OGdXRmhZSUdWNGNHVnlhVzFsYm5SaGJDNGdJRlJvYVhNZ2JXVjBhRzlrSUdseklHRWdkMkY1SUhSdklHUmxibTkwWlNCMGFHRjBJR0VnYkc5allXd2dkbUZzZFdVZ2FYTmNiaTh2SUhObGNtbGhiR2w2WVdKc1pTQmhibVFnYzJodmRXeGtJR0psSUdsdGJXVmthV0YwWld4NUlHUnBjM0JoZEdOb1pXUWdkRzhnWVNCeVpXMXZkR1VnZFhCdmJpQnlaWEYxWlhOMExGeHVMeThnYVc1emRHVmhaQ0J2WmlCd1lYTnphVzVuSUdFZ2NtVm1aWEpsYm1ObExseHVVUzV3WVhOelFubERiM0I1SUQwZ1puVnVZM1JwYjI0Z0tHOWlhbVZqZENrZ2UxeHVJQ0FnSUM4dlpuSmxaWHBsS0c5aWFtVmpkQ2s3WEc0Z0lDQWdMeTl3WVhOelFubERiM0JwWlhNdWMyVjBLRzlpYW1WamRDd2dkSEoxWlNrN1hHNGdJQ0FnY21WMGRYSnVJRzlpYW1WamREdGNibjA3WEc1Y2JsQnliMjFwYzJVdWNISnZkRzkwZVhCbExuQmhjM05DZVVOdmNIa2dQU0JtZFc1amRHbHZiaUFvS1NCN1hHNGdJQ0FnTHk5bWNtVmxlbVVvYjJKcVpXTjBLVHRjYmlBZ0lDQXZMM0JoYzNOQ2VVTnZjR2xsY3k1elpYUW9iMkpxWldOMExDQjBjblZsS1R0Y2JpQWdJQ0J5WlhSMWNtNGdkR2hwY3p0Y2JuMDdYRzVjYmk4cUtseHVJQ29nU1dZZ2RIZHZJSEJ5YjIxcGMyVnpJR1YyWlc1MGRXRnNiSGtnWm5Wc1ptbHNiQ0IwYnlCMGFHVWdjMkZ0WlNCMllXeDFaU3dnY0hKdmJXbHpaWE1nZEdoaGRDQjJZV3gxWlN4Y2JpQXFJR0oxZENCdmRHaGxjbmRwYzJVZ2NtVnFaV04wY3k1Y2JpQXFJRUJ3WVhKaGJTQjRJSHRCYm5rcWZWeHVJQ29nUUhCaGNtRnRJSGtnZTBGdWVTcDlYRzRnS2lCQWNtVjBkWEp1Y3lCN1FXNTVLbjBnWVNCd2NtOXRhWE5sSUdadmNpQjRJR0Z1WkNCNUlHbG1JSFJvWlhrZ1lYSmxJSFJvWlNCellXMWxMQ0JpZFhRZ1lTQnlaV3BsWTNScGIyNWNiaUFxSUc5MGFHVnlkMmx6WlM1Y2JpQXFYRzRnS2k5Y2JsRXVhbTlwYmlBOUlHWjFibU4wYVc5dUlDaDRMQ0I1S1NCN1hHNGdJQ0FnY21WMGRYSnVJRkVvZUNrdWFtOXBiaWg1S1R0Y2JuMDdYRzVjYmxCeWIyMXBjMlV1Y0hKdmRHOTBlWEJsTG1wdmFXNGdQU0JtZFc1amRHbHZiaUFvZEdoaGRDa2dlMXh1SUNBZ0lISmxkSFZ5YmlCUktGdDBhR2x6TENCMGFHRjBYU2t1YzNCeVpXRmtLR1oxYm1OMGFXOXVJQ2g0TENCNUtTQjdYRzRnSUNBZ0lDQWdJR2xtSUNoNElEMDlQU0I1S1NCN1hHNGdJQ0FnSUNBZ0lDQWdJQ0F2THlCVVQwUlBPaUJjSWowOVBWd2lJSE5vYjNWc1pDQmlaU0JQWW1wbFkzUXVhWE1nYjNJZ1pYRjFhWFpjYmlBZ0lDQWdJQ0FnSUNBZ0lISmxkSFZ5YmlCNE8xeHVJQ0FnSUNBZ0lDQjlJR1ZzYzJVZ2UxeHVJQ0FnSUNBZ0lDQWdJQ0FnZEdoeWIzY2dibVYzSUVWeWNtOXlLRndpUTJGdUozUWdhbTlwYmpvZ2JtOTBJSFJvWlNCellXMWxPaUJjSWlBcklIZ2dLeUJjSWlCY0lpQXJJSGtwTzF4dUlDQWdJQ0FnSUNCOVhHNGdJQ0FnZlNrN1hHNTlPMXh1WEc0dktpcGNiaUFxSUZKbGRIVnlibk1nWVNCd2NtOXRhWE5sSUdadmNpQjBhR1VnWm1seWMzUWdiMllnWVc0Z1lYSnlZWGtnYjJZZ2NISnZiV2x6WlhNZ2RHOGdZbVZqYjIxbElITmxkSFJzWldRdVhHNGdLaUJBY0dGeVlXMGdZVzV6ZDJWeWN5QjdRWEp5WVhsYlFXNTVLbDE5SUhCeWIyMXBjMlZ6SUhSdklISmhZMlZjYmlBcUlFQnlaWFIxY201eklIdEJibmtxZlNCMGFHVWdabWx5YzNRZ2NISnZiV2x6WlNCMGJ5QmlaU0J6WlhSMGJHVmtYRzRnS2k5Y2JsRXVjbUZqWlNBOUlISmhZMlU3WEc1bWRXNWpkR2x2YmlCeVlXTmxLR0Z1YzNkbGNsQnpLU0I3WEc0Z0lDQWdjbVYwZFhKdUlIQnliMjFwYzJVb1puVnVZM1JwYjI0Z0tISmxjMjlzZG1Vc0lISmxhbVZqZENrZ2UxeHVJQ0FnSUNBZ0lDQXZMeUJUZDJsMFkyZ2dkRzhnZEdocGN5QnZibU5sSUhkbElHTmhiaUJoYzNOMWJXVWdZWFFnYkdWaGMzUWdSVk0xWEc0Z0lDQWdJQ0FnSUM4dklHRnVjM2RsY2xCekxtWnZja1ZoWTJnb1puVnVZM1JwYjI0Z0tHRnVjM2RsY2xBcElIdGNiaUFnSUNBZ0lDQWdMeThnSUNBZ0lGRW9ZVzV6ZDJWeVVDa3VkR2hsYmloeVpYTnZiSFpsTENCeVpXcGxZM1FwTzF4dUlDQWdJQ0FnSUNBdkx5QjlLVHRjYmlBZ0lDQWdJQ0FnTHk4Z1ZYTmxJSFJvYVhNZ2FXNGdkR2hsSUcxbFlXNTBhVzFsWEc0Z0lDQWdJQ0FnSUdadmNpQW9kbUZ5SUdrZ1BTQXdMQ0JzWlc0Z1BTQmhibk4zWlhKUWN5NXNaVzVuZEdnN0lHa2dQQ0JzWlc0N0lHa3JLeWtnZTF4dUlDQWdJQ0FnSUNBZ0lDQWdVU2hoYm5OM1pYSlFjMXRwWFNrdWRHaGxiaWh5WlhOdmJIWmxMQ0J5WldwbFkzUXBPMXh1SUNBZ0lDQWdJQ0I5WEc0Z0lDQWdmU2s3WEc1OVhHNWNibEJ5YjIxcGMyVXVjSEp2ZEc5MGVYQmxMbkpoWTJVZ1BTQm1kVzVqZEdsdmJpQW9LU0I3WEc0Z0lDQWdjbVYwZFhKdUlIUm9hWE11ZEdobGJpaFJMbkpoWTJVcE8xeHVmVHRjYmx4dUx5b3FYRzRnS2lCRGIyNXpkSEoxWTNSeklHRWdVSEp2YldselpTQjNhWFJvSUdFZ2NISnZiV2x6WlNCa1pYTmpjbWx3ZEc5eUlHOWlhbVZqZENCaGJtUWdiM0IwYVc5dVlXd2dabUZzYkdKaFkydGNiaUFxSUdaMWJtTjBhVzl1TGlBZ1ZHaGxJR1JsYzJOeWFYQjBiM0lnWTI5dWRHRnBibk1nYldWMGFHOWtjeUJzYVd0bElIZG9aVzRvY21WcVpXTjBaV1FwTENCblpYUW9ibUZ0WlNrc1hHNGdLaUJ6WlhRb2JtRnRaU3dnZG1Gc2RXVXBMQ0J3YjNOMEtHNWhiV1VzSUdGeVozTXBMQ0JoYm1RZ1pHVnNaWFJsS0c1aGJXVXBMQ0IzYUdsamFDQmhiR3hjYmlBcUlISmxkSFZ5YmlCbGFYUm9aWElnWVNCMllXeDFaU3dnWVNCd2NtOXRhWE5sSUdadmNpQmhJSFpoYkhWbExDQnZjaUJoSUhKbGFtVmpkR2x2Ymk0Z0lGUm9aU0JtWVd4c1ltRmphMXh1SUNvZ1lXTmpaWEIwY3lCMGFHVWdiM0JsY21GMGFXOXVJRzVoYldVc0lHRWdjbVZ6YjJ4MlpYSXNJR0Z1WkNCaGJua2dablZ5ZEdobGNpQmhjbWQxYldWdWRITWdkR2hoZENCM2IzVnNaRnh1SUNvZ2FHRjJaU0JpWldWdUlHWnZjbmRoY21SbFpDQjBieUIwYUdVZ1lYQndjbTl3Y21saGRHVWdiV1YwYUc5a0lHRmliM1psSUdoaFpDQmhJRzFsZEdodlpDQmlaV1Z1WEc0Z0tpQndjbTkyYVdSbFpDQjNhWFJvSUhSb1pTQndjbTl3WlhJZ2JtRnRaUzRnSUZSb1pTQkJVRWtnYldGclpYTWdibThnWjNWaGNtRnVkR1ZsY3lCaFltOTFkQ0IwYUdVZ2JtRjBkWEpsWEc0Z0tpQnZaaUIwYUdVZ2NtVjBkWEp1WldRZ2IySnFaV04wTENCaGNHRnlkQ0JtY205dElIUm9ZWFFnYVhRZ2FYTWdkWE5oWW14bElIZG9aWEpsWlhabGNpQndjbTl0YVhObGN5QmhjbVZjYmlBcUlHSnZkV2RvZENCaGJtUWdjMjlzWkM1Y2JpQXFMMXh1VVM1dFlXdGxVSEp2YldselpTQTlJRkJ5YjIxcGMyVTdYRzVtZFc1amRHbHZiaUJRY205dGFYTmxLR1JsYzJOeWFYQjBiM0lzSUdaaGJHeGlZV05yTENCcGJuTndaV04wS1NCN1hHNGdJQ0FnYVdZZ0tHWmhiR3hpWVdOcklEMDlQU0IyYjJsa0lEQXBJSHRjYmlBZ0lDQWdJQ0FnWm1Gc2JHSmhZMnNnUFNCbWRXNWpkR2x2YmlBb2IzQXBJSHRjYmlBZ0lDQWdJQ0FnSUNBZ0lISmxkSFZ5YmlCeVpXcGxZM1FvYm1WM0lFVnljbTl5S0Z4dUlDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUZ3aVVISnZiV2x6WlNCa2IyVnpJRzV2ZENCemRYQndiM0owSUc5d1pYSmhkR2x2YmpvZ1hDSWdLeUJ2Y0Z4dUlDQWdJQ0FnSUNBZ0lDQWdLU2s3WEc0Z0lDQWdJQ0FnSUgwN1hHNGdJQ0FnZlZ4dUlDQWdJR2xtSUNocGJuTndaV04wSUQwOVBTQjJiMmxrSURBcElIdGNiaUFnSUNBZ0lDQWdhVzV6Y0dWamRDQTlJR1oxYm1OMGFXOXVJQ2dwSUh0Y2JpQWdJQ0FnSUNBZ0lDQWdJSEpsZEhWeWJpQjdjM1JoZEdVNklGd2lkVzVyYm05M2Jsd2lmVHRjYmlBZ0lDQWdJQ0FnZlR0Y2JpQWdJQ0I5WEc1Y2JpQWdJQ0IyWVhJZ2NISnZiV2x6WlNBOUlHOWlhbVZqZEY5amNtVmhkR1VvVUhKdmJXbHpaUzV3Y205MGIzUjVjR1VwTzF4dVhHNGdJQ0FnY0hKdmJXbHpaUzV3Y205dGFYTmxSR2x6Y0dGMFkyZ2dQU0JtZFc1amRHbHZiaUFvY21WemIyeDJaU3dnYjNBc0lHRnlaM01wSUh0Y2JpQWdJQ0FnSUNBZ2RtRnlJSEpsYzNWc2REdGNiaUFnSUNBZ0lDQWdkSEo1SUh0Y2JpQWdJQ0FnSUNBZ0lDQWdJR2xtSUNoa1pYTmpjbWx3ZEc5eVcyOXdYU2tnZTF4dUlDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUhKbGMzVnNkQ0E5SUdSbGMyTnlhWEIwYjNKYmIzQmRMbUZ3Y0d4NUtIQnliMjFwYzJVc0lHRnlaM01wTzF4dUlDQWdJQ0FnSUNBZ0lDQWdmU0JsYkhObElIdGNiaUFnSUNBZ0lDQWdJQ0FnSUNBZ0lDQnlaWE4xYkhRZ1BTQm1ZV3hzWW1GamF5NWpZV3hzS0hCeWIyMXBjMlVzSUc5d0xDQmhjbWR6S1R0Y2JpQWdJQ0FnSUNBZ0lDQWdJSDFjYmlBZ0lDQWdJQ0FnZlNCallYUmphQ0FvWlhoalpYQjBhVzl1S1NCN1hHNGdJQ0FnSUNBZ0lDQWdJQ0J5WlhOMWJIUWdQU0J5WldwbFkzUW9aWGhqWlhCMGFXOXVLVHRjYmlBZ0lDQWdJQ0FnZlZ4dUlDQWdJQ0FnSUNCcFppQW9jbVZ6YjJ4MlpTa2dlMXh1SUNBZ0lDQWdJQ0FnSUNBZ2NtVnpiMngyWlNoeVpYTjFiSFFwTzF4dUlDQWdJQ0FnSUNCOVhHNGdJQ0FnZlR0Y2JseHVJQ0FnSUhCeWIyMXBjMlV1YVc1emNHVmpkQ0E5SUdsdWMzQmxZM1E3WEc1Y2JpQWdJQ0F2THlCWVdGZ2daR1Z3Y21WallYUmxaQ0JnZG1Gc2RXVlBabUFnWVc1a0lHQmxlR05sY0hScGIyNWdJSE4xY0hCdmNuUmNiaUFnSUNCcFppQW9hVzV6Y0dWamRDa2dlMXh1SUNBZ0lDQWdJQ0IyWVhJZ2FXNXpjR1ZqZEdWa0lEMGdhVzV6Y0dWamRDZ3BPMXh1SUNBZ0lDQWdJQ0JwWmlBb2FXNXpjR1ZqZEdWa0xuTjBZWFJsSUQwOVBTQmNJbkpsYW1WamRHVmtYQ0lwSUh0Y2JpQWdJQ0FnSUNBZ0lDQWdJSEJ5YjIxcGMyVXVaWGhqWlhCMGFXOXVJRDBnYVc1emNHVmpkR1ZrTG5KbFlYTnZianRjYmlBZ0lDQWdJQ0FnZlZ4dVhHNGdJQ0FnSUNBZ0lIQnliMjFwYzJVdWRtRnNkV1ZQWmlBOUlHWjFibU4wYVc5dUlDZ3BJSHRjYmlBZ0lDQWdJQ0FnSUNBZ0lIWmhjaUJwYm5Od1pXTjBaV1FnUFNCcGJuTndaV04wS0NrN1hHNGdJQ0FnSUNBZ0lDQWdJQ0JwWmlBb2FXNXpjR1ZqZEdWa0xuTjBZWFJsSUQwOVBTQmNJbkJsYm1ScGJtZGNJaUI4ZkZ4dUlDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUdsdWMzQmxZM1JsWkM1emRHRjBaU0E5UFQwZ1hDSnlaV3BsWTNSbFpGd2lLU0I3WEc0Z0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnY21WMGRYSnVJSEJ5YjIxcGMyVTdYRzRnSUNBZ0lDQWdJQ0FnSUNCOVhHNGdJQ0FnSUNBZ0lDQWdJQ0J5WlhSMWNtNGdhVzV6Y0dWamRHVmtMblpoYkhWbE8xeHVJQ0FnSUNBZ0lDQjlPMXh1SUNBZ0lIMWNibHh1SUNBZ0lISmxkSFZ5YmlCd2NtOXRhWE5sTzF4dWZWeHVYRzVRY205dGFYTmxMbkJ5YjNSdmRIbHdaUzUwYjFOMGNtbHVaeUE5SUdaMWJtTjBhVzl1SUNncElIdGNiaUFnSUNCeVpYUjFjbTRnWENKYmIySnFaV04wSUZCeWIyMXBjMlZkWENJN1hHNTlPMXh1WEc1UWNtOXRhWE5sTG5CeWIzUnZkSGx3WlM1MGFHVnVJRDBnWm5WdVkzUnBiMjRnS0daMWJHWnBiR3hsWkN3Z2NtVnFaV04wWldRc0lIQnliMmR5WlhOelpXUXBJSHRjYmlBZ0lDQjJZWElnYzJWc1ppQTlJSFJvYVhNN1hHNGdJQ0FnZG1GeUlHUmxabVZ5Y21Wa0lEMGdaR1ZtWlhJb0tUdGNiaUFnSUNCMllYSWdaRzl1WlNBOUlHWmhiSE5sT3lBZ0lDOHZJR1Z1YzNWeVpTQjBhR1VnZFc1MGNuVnpkR1ZrSUhCeWIyMXBjMlVnYldGclpYTWdZWFFnYlc5emRDQmhYRzRnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQXZMeUJ6YVc1bmJHVWdZMkZzYkNCMGJ5QnZibVVnYjJZZ2RHaGxJR05oYkd4aVlXTnJjMXh1WEc0Z0lDQWdablZ1WTNScGIyNGdYMloxYkdacGJHeGxaQ2gyWVd4MVpTa2dlMXh1SUNBZ0lDQWdJQ0IwY25rZ2UxeHVJQ0FnSUNBZ0lDQWdJQ0FnY21WMGRYSnVJSFI1Y0dWdlppQm1kV3htYVd4c1pXUWdQVDA5SUZ3aVpuVnVZM1JwYjI1Y0lpQS9JR1oxYkdacGJHeGxaQ2gyWVd4MVpTa2dPaUIyWVd4MVpUdGNiaUFnSUNBZ0lDQWdmU0JqWVhSamFDQW9aWGhqWlhCMGFXOXVLU0I3WEc0Z0lDQWdJQ0FnSUNBZ0lDQnlaWFIxY200Z2NtVnFaV04wS0dWNFkyVndkR2x2YmlrN1hHNGdJQ0FnSUNBZ0lIMWNiaUFnSUNCOVhHNWNiaUFnSUNCbWRXNWpkR2x2YmlCZmNtVnFaV04wWldRb1pYaGpaWEIwYVc5dUtTQjdYRzRnSUNBZ0lDQWdJR2xtSUNoMGVYQmxiMllnY21WcVpXTjBaV1FnUFQwOUlGd2lablZ1WTNScGIyNWNJaWtnZTF4dUlDQWdJQ0FnSUNBZ0lDQWdiV0ZyWlZOMFlXTnJWSEpoWTJWTWIyNW5LR1Y0WTJWd2RHbHZiaXdnYzJWc1ppazdYRzRnSUNBZ0lDQWdJQ0FnSUNCMGNua2dlMXh1SUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJSEpsZEhWeWJpQnlaV3BsWTNSbFpDaGxlR05sY0hScGIyNHBPMXh1SUNBZ0lDQWdJQ0FnSUNBZ2ZTQmpZWFJqYUNBb2JtVjNSWGhqWlhCMGFXOXVLU0I3WEc0Z0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnY21WMGRYSnVJSEpsYW1WamRDaHVaWGRGZUdObGNIUnBiMjRwTzF4dUlDQWdJQ0FnSUNBZ0lDQWdmVnh1SUNBZ0lDQWdJQ0I5WEc0Z0lDQWdJQ0FnSUhKbGRIVnliaUJ5WldwbFkzUW9aWGhqWlhCMGFXOXVLVHRjYmlBZ0lDQjlYRzVjYmlBZ0lDQm1kVzVqZEdsdmJpQmZjSEp2WjNKbGMzTmxaQ2gyWVd4MVpTa2dlMXh1SUNBZ0lDQWdJQ0J5WlhSMWNtNGdkSGx3Wlc5bUlIQnliMmR5WlhOelpXUWdQVDA5SUZ3aVpuVnVZM1JwYjI1Y0lpQS9JSEJ5YjJkeVpYTnpaV1FvZG1Gc2RXVXBJRG9nZG1Gc2RXVTdYRzRnSUNBZ2ZWeHVYRzRnSUNBZ1VTNXVaWGgwVkdsamF5aG1kVzVqZEdsdmJpQW9LU0I3WEc0Z0lDQWdJQ0FnSUhObGJHWXVjSEp2YldselpVUnBjM0JoZEdOb0tHWjFibU4wYVc5dUlDaDJZV3gxWlNrZ2UxeHVJQ0FnSUNBZ0lDQWdJQ0FnYVdZZ0tHUnZibVVwSUh0Y2JpQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNCeVpYUjFjbTQ3WEc0Z0lDQWdJQ0FnSUNBZ0lDQjlYRzRnSUNBZ0lDQWdJQ0FnSUNCa2IyNWxJRDBnZEhKMVpUdGNibHh1SUNBZ0lDQWdJQ0FnSUNBZ1pHVm1aWEp5WldRdWNtVnpiMngyWlNoZlpuVnNabWxzYkdWa0tIWmhiSFZsS1NrN1hHNGdJQ0FnSUNBZ0lIMHNJRndpZDJobGJsd2lMQ0JiWm5WdVkzUnBiMjRnS0dWNFkyVndkR2x2YmlrZ2UxeHVJQ0FnSUNBZ0lDQWdJQ0FnYVdZZ0tHUnZibVVwSUh0Y2JpQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNCeVpYUjFjbTQ3WEc0Z0lDQWdJQ0FnSUNBZ0lDQjlYRzRnSUNBZ0lDQWdJQ0FnSUNCa2IyNWxJRDBnZEhKMVpUdGNibHh1SUNBZ0lDQWdJQ0FnSUNBZ1pHVm1aWEp5WldRdWNtVnpiMngyWlNoZmNtVnFaV04wWldRb1pYaGpaWEIwYVc5dUtTazdYRzRnSUNBZ0lDQWdJSDFkS1R0Y2JpQWdJQ0I5S1R0Y2JseHVJQ0FnSUM4dklGQnliMmR5WlhOeklIQnliM0JoWjJGMGIzSWdibVZsWkNCMGJ5QmlaU0JoZEhSaFkyaGxaQ0JwYmlCMGFHVWdZM1Z5Y21WdWRDQjBhV05yTGx4dUlDQWdJSE5sYkdZdWNISnZiV2x6WlVScGMzQmhkR05vS0hadmFXUWdNQ3dnWENKM2FHVnVYQ0lzSUZ0MmIybGtJREFzSUdaMWJtTjBhVzl1SUNoMllXeDFaU2tnZTF4dUlDQWdJQ0FnSUNCMllYSWdibVYzVm1Gc2RXVTdYRzRnSUNBZ0lDQWdJSFpoY2lCMGFISmxkeUE5SUdaaGJITmxPMXh1SUNBZ0lDQWdJQ0IwY25rZ2UxeHVJQ0FnSUNBZ0lDQWdJQ0FnYm1WM1ZtRnNkV1VnUFNCZmNISnZaM0psYzNObFpDaDJZV3gxWlNrN1hHNGdJQ0FnSUNBZ0lIMGdZMkYwWTJnZ0tHVXBJSHRjYmlBZ0lDQWdJQ0FnSUNBZ0lIUm9jbVYzSUQwZ2RISjFaVHRjYmlBZ0lDQWdJQ0FnSUNBZ0lHbG1JQ2hSTG05dVpYSnliM0lwSUh0Y2JpQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNCUkxtOXVaWEp5YjNJb1pTazdYRzRnSUNBZ0lDQWdJQ0FnSUNCOUlHVnNjMlVnZTF4dUlDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUhSb2NtOTNJR1U3WEc0Z0lDQWdJQ0FnSUNBZ0lDQjlYRzRnSUNBZ0lDQWdJSDFjYmx4dUlDQWdJQ0FnSUNCcFppQW9JWFJvY21WM0tTQjdYRzRnSUNBZ0lDQWdJQ0FnSUNCa1pXWmxjbkpsWkM1dWIzUnBabmtvYm1WM1ZtRnNkV1VwTzF4dUlDQWdJQ0FnSUNCOVhHNGdJQ0FnZlYwcE8xeHVYRzRnSUNBZ2NtVjBkWEp1SUdSbFptVnljbVZrTG5CeWIyMXBjMlU3WEc1OU8xeHVYRzVSTG5SaGNDQTlJR1oxYm1OMGFXOXVJQ2h3Y205dGFYTmxMQ0JqWVd4c1ltRmpheWtnZTF4dUlDQWdJSEpsZEhWeWJpQlJLSEJ5YjIxcGMyVXBMblJoY0NoallXeHNZbUZqYXlrN1hHNTlPMXh1WEc0dktpcGNiaUFxSUZkdmNtdHpJR0ZzYlc5emRDQnNhV3RsSUZ3aVptbHVZV3hzZVZ3aUxDQmlkWFFnYm05MElHTmhiR3hsWkNCbWIzSWdjbVZxWldOMGFXOXVjeTVjYmlBcUlFOXlhV2RwYm1Gc0lISmxjMjlzZFhScGIyNGdkbUZzZFdVZ2FYTWdjR0Z6YzJWa0lIUm9jbTkxWjJnZ1kyRnNiR0poWTJzZ2RXNWhabVpsWTNSbFpDNWNiaUFxSUVOaGJHeGlZV05ySUcxaGVTQnlaWFIxY200Z1lTQndjbTl0YVhObElIUm9ZWFFnZDJsc2JDQmlaU0JoZDJGcGRHVmtJR1p2Y2k1Y2JpQXFJRUJ3WVhKaGJTQjdSblZ1WTNScGIyNTlJR05oYkd4aVlXTnJYRzRnS2lCQWNtVjBkWEp1Y3lCN1VTNVFjbTl0YVhObGZWeHVJQ29nUUdWNFlXMXdiR1ZjYmlBcUlHUnZVMjl0WlhSb2FXNW5LQ2xjYmlBcUlDQWdMblJvWlc0b0xpNHVLVnh1SUNvZ0lDQXVkR0Z3S0dOdmJuTnZiR1V1Ykc5bktWeHVJQ29nSUNBdWRHaGxiaWd1TGk0cE8xeHVJQ292WEc1UWNtOXRhWE5sTG5CeWIzUnZkSGx3WlM1MFlYQWdQU0JtZFc1amRHbHZiaUFvWTJGc2JHSmhZMnNwSUh0Y2JpQWdJQ0JqWVd4c1ltRmpheUE5SUZFb1kyRnNiR0poWTJzcE8xeHVYRzRnSUNBZ2NtVjBkWEp1SUhSb2FYTXVkR2hsYmlobWRXNWpkR2x2YmlBb2RtRnNkV1VwSUh0Y2JpQWdJQ0FnSUNBZ2NtVjBkWEp1SUdOaGJHeGlZV05yTG1aallXeHNLSFpoYkhWbEtTNTBhR1Z1VW1WemIyeDJaU2gyWVd4MVpTazdYRzRnSUNBZ2ZTazdYRzU5TzF4dVhHNHZLaXBjYmlBcUlGSmxaMmx6ZEdWeWN5QmhiaUJ2WW5ObGNuWmxjaUJ2YmlCaElIQnliMjFwYzJVdVhHNGdLbHh1SUNvZ1IzVmhjbUZ1ZEdWbGN6cGNiaUFxWEc0Z0tpQXhMaUIwYUdGMElHWjFiR1pwYkd4bFpDQmhibVFnY21WcVpXTjBaV1FnZDJsc2JDQmlaU0JqWVd4c1pXUWdiMjVzZVNCdmJtTmxMbHh1SUNvZ01pNGdkR2hoZENCbGFYUm9aWElnZEdobElHWjFiR1pwYkd4bFpDQmpZV3hzWW1GamF5QnZjaUIwYUdVZ2NtVnFaV04wWldRZ1kyRnNiR0poWTJzZ2QybHNiQ0JpWlZ4dUlDb2dJQ0FnWTJGc2JHVmtMQ0JpZFhRZ2JtOTBJR0p2ZEdndVhHNGdLaUF6TGlCMGFHRjBJR1oxYkdacGJHeGxaQ0JoYm1RZ2NtVnFaV04wWldRZ2QybHNiQ0J1YjNRZ1ltVWdZMkZzYkdWa0lHbHVJSFJvYVhNZ2RIVnliaTVjYmlBcVhHNGdLaUJBY0dGeVlXMGdkbUZzZFdVZ0lDQWdJQ0J3Y205dGFYTmxJRzl5SUdsdGJXVmthV0YwWlNCeVpXWmxjbVZ1WTJVZ2RHOGdiMkp6WlhKMlpWeHVJQ29nUUhCaGNtRnRJR1oxYkdacGJHeGxaQ0FnWm5WdVkzUnBiMjRnZEc4Z1ltVWdZMkZzYkdWa0lIZHBkR2dnZEdobElHWjFiR1pwYkd4bFpDQjJZV3gxWlZ4dUlDb2dRSEJoY21GdElISmxhbVZqZEdWa0lDQWdablZ1WTNScGIyNGdkRzhnWW1VZ1kyRnNiR1ZrSUhkcGRHZ2dkR2hsSUhKbGFtVmpkR2x2YmlCbGVHTmxjSFJwYjI1Y2JpQXFJRUJ3WVhKaGJTQndjbTluY21WemMyVmtJR1oxYm1OMGFXOXVJSFJ2SUdKbElHTmhiR3hsWkNCdmJpQmhibmtnY0hKdlozSmxjM01nYm05MGFXWnBZMkYwYVc5dWMxeHVJQ29nUUhKbGRIVnliaUJ3Y205dGFYTmxJR1p2Y2lCMGFHVWdjbVYwZFhKdUlIWmhiSFZsSUdaeWIyMGdkR2hsSUdsdWRtOXJaV1FnWTJGc2JHSmhZMnRjYmlBcUwxeHVVUzUzYUdWdUlEMGdkMmhsYmp0Y2JtWjFibU4wYVc5dUlIZG9aVzRvZG1Gc2RXVXNJR1oxYkdacGJHeGxaQ3dnY21WcVpXTjBaV1FzSUhCeWIyZHlaWE56WldRcElIdGNiaUFnSUNCeVpYUjFjbTRnVVNoMllXeDFaU2t1ZEdobGJpaG1kV3htYVd4c1pXUXNJSEpsYW1WamRHVmtMQ0J3Y205bmNtVnpjMlZrS1R0Y2JuMWNibHh1VUhKdmJXbHpaUzV3Y205MGIzUjVjR1V1ZEdobGJsSmxjMjlzZG1VZ1BTQm1kVzVqZEdsdmJpQW9kbUZzZFdVcElIdGNiaUFnSUNCeVpYUjFjbTRnZEdocGN5NTBhR1Z1S0daMWJtTjBhVzl1SUNncElIc2djbVYwZFhKdUlIWmhiSFZsT3lCOUtUdGNibjA3WEc1Y2JsRXVkR2hsYmxKbGMyOXNkbVVnUFNCbWRXNWpkR2x2YmlBb2NISnZiV2x6WlN3Z2RtRnNkV1VwSUh0Y2JpQWdJQ0J5WlhSMWNtNGdVU2h3Y205dGFYTmxLUzUwYUdWdVVtVnpiMngyWlNoMllXeDFaU2s3WEc1OU8xeHVYRzVRY205dGFYTmxMbkJ5YjNSdmRIbHdaUzUwYUdWdVVtVnFaV04wSUQwZ1puVnVZM1JwYjI0Z0tISmxZWE52YmlrZ2UxeHVJQ0FnSUhKbGRIVnliaUIwYUdsekxuUm9aVzRvWm5WdVkzUnBiMjRnS0NrZ2V5QjBhSEp2ZHlCeVpXRnpiMjQ3SUgwcE8xeHVmVHRjYmx4dVVTNTBhR1Z1VW1WcVpXTjBJRDBnWm5WdVkzUnBiMjRnS0hCeWIyMXBjMlVzSUhKbFlYTnZiaWtnZTF4dUlDQWdJSEpsZEhWeWJpQlJLSEJ5YjIxcGMyVXBMblJvWlc1U1pXcGxZM1FvY21WaGMyOXVLVHRjYm4wN1hHNWNiaThxS2x4dUlDb2dTV1lnWVc0Z2IySnFaV04wSUdseklHNXZkQ0JoSUhCeWIyMXBjMlVzSUdsMElHbHpJR0Z6SUZ3aWJtVmhjbHdpSUdGeklIQnZjM05wWW14bExseHVJQ29nU1dZZ1lTQndjbTl0YVhObElHbHpJSEpsYW1WamRHVmtMQ0JwZENCcGN5QmhjeUJjSW01bFlYSmNJaUJoY3lCd2IzTnphV0pzWlNCMGIyOHVYRzRnS2lCSlppQnBkT0tBbVhNZ1lTQm1kV3htYVd4c1pXUWdjSEp2YldselpTd2dkR2hsSUdaMWJHWnBiR3h0Wlc1MElIWmhiSFZsSUdseklHNWxZWEpsY2k1Y2JpQXFJRWxtSUdsMDRvQ1pjeUJoSUdSbFptVnljbVZrSUhCeWIyMXBjMlVnWVc1a0lIUm9aU0JrWldabGNuSmxaQ0JvWVhNZ1ltVmxiaUJ5WlhOdmJIWmxaQ3dnZEdobFhHNGdLaUJ5WlhOdmJIVjBhVzl1SUdseklGd2libVZoY21WeVhDSXVYRzRnS2lCQWNHRnlZVzBnYjJKcVpXTjBYRzRnS2lCQWNtVjBkWEp1Y3lCdGIzTjBJSEpsYzI5c2RtVmtJQ2h1WldGeVpYTjBLU0JtYjNKdElHOW1JSFJvWlNCdlltcGxZM1JjYmlBcUwxeHVYRzR2THlCWVdGZ2djMmh2ZFd4a0lIZGxJSEpsTFdSdklIUm9hWE0vWEc1UkxtNWxZWEpsY2lBOUlHNWxZWEpsY2p0Y2JtWjFibU4wYVc5dUlHNWxZWEpsY2loMllXeDFaU2tnZTF4dUlDQWdJR2xtSUNocGMxQnliMjFwYzJVb2RtRnNkV1VwS1NCN1hHNGdJQ0FnSUNBZ0lIWmhjaUJwYm5Od1pXTjBaV1FnUFNCMllXeDFaUzVwYm5Od1pXTjBLQ2s3WEc0Z0lDQWdJQ0FnSUdsbUlDaHBibk53WldOMFpXUXVjM1JoZEdVZ1BUMDlJRndpWm5Wc1ptbHNiR1ZrWENJcElIdGNiaUFnSUNBZ0lDQWdJQ0FnSUhKbGRIVnliaUJwYm5Od1pXTjBaV1F1ZG1Gc2RXVTdYRzRnSUNBZ0lDQWdJSDFjYmlBZ0lDQjlYRzRnSUNBZ2NtVjBkWEp1SUhaaGJIVmxPMXh1ZlZ4dVhHNHZLaXBjYmlBcUlFQnlaWFIxY201eklIZG9aWFJvWlhJZ2RHaGxJR2RwZG1WdUlHOWlhbVZqZENCcGN5QmhJSEJ5YjIxcGMyVXVYRzRnS2lCUGRHaGxjbmRwYzJVZ2FYUWdhWE1nWVNCbWRXeG1hV3hzWldRZ2RtRnNkV1V1WEc0Z0tpOWNibEV1YVhOUWNtOXRhWE5sSUQwZ2FYTlFjbTl0YVhObE8xeHVablZ1WTNScGIyNGdhWE5RY205dGFYTmxLRzlpYW1WamRDa2dlMXh1SUNBZ0lISmxkSFZ5YmlCdlltcGxZM1FnYVc1emRHRnVZMlZ2WmlCUWNtOXRhWE5sTzF4dWZWeHVYRzVSTG1selVISnZiV2x6WlVGc2FXdGxJRDBnYVhOUWNtOXRhWE5sUVd4cGEyVTdYRzVtZFc1amRHbHZiaUJwYzFCeWIyMXBjMlZCYkdsclpTaHZZbXBsWTNRcElIdGNiaUFnSUNCeVpYUjFjbTRnYVhOUFltcGxZM1FvYjJKcVpXTjBLU0FtSmlCMGVYQmxiMllnYjJKcVpXTjBMblJvWlc0Z1BUMDlJRndpWm5WdVkzUnBiMjVjSWp0Y2JuMWNibHh1THlvcVhHNGdLaUJBY21WMGRYSnVjeUIzYUdWMGFHVnlJSFJvWlNCbmFYWmxiaUJ2WW1wbFkzUWdhWE1nWVNCd1pXNWthVzVuSUhCeWIyMXBjMlVzSUcxbFlXNXBibWNnYm05MFhHNGdLaUJtZFd4bWFXeHNaV1FnYjNJZ2NtVnFaV04wWldRdVhHNGdLaTljYmxFdWFYTlFaVzVrYVc1bklEMGdhWE5RWlc1a2FXNW5PMXh1Wm5WdVkzUnBiMjRnYVhOUVpXNWthVzVuS0c5aWFtVmpkQ2tnZTF4dUlDQWdJSEpsZEhWeWJpQnBjMUJ5YjIxcGMyVW9iMkpxWldOMEtTQW1KaUJ2WW1wbFkzUXVhVzV6Y0dWamRDZ3BMbk4wWVhSbElEMDlQU0JjSW5CbGJtUnBibWRjSWp0Y2JuMWNibHh1VUhKdmJXbHpaUzV3Y205MGIzUjVjR1V1YVhOUVpXNWthVzVuSUQwZ1puVnVZM1JwYjI0Z0tDa2dlMXh1SUNBZ0lISmxkSFZ5YmlCMGFHbHpMbWx1YzNCbFkzUW9LUzV6ZEdGMFpTQTlQVDBnWENKd1pXNWthVzVuWENJN1hHNTlPMXh1WEc0dktpcGNiaUFxSUVCeVpYUjFjbTV6SUhkb1pYUm9aWElnZEdobElHZHBkbVZ1SUc5aWFtVmpkQ0JwY3lCaElIWmhiSFZsSUc5eUlHWjFiR1pwYkd4bFpGeHVJQ29nY0hKdmJXbHpaUzVjYmlBcUwxeHVVUzVwYzBaMWJHWnBiR3hsWkNBOUlHbHpSblZzWm1sc2JHVmtPMXh1Wm5WdVkzUnBiMjRnYVhOR2RXeG1hV3hzWldRb2IySnFaV04wS1NCN1hHNGdJQ0FnY21WMGRYSnVJQ0ZwYzFCeWIyMXBjMlVvYjJKcVpXTjBLU0I4ZkNCdlltcGxZM1F1YVc1emNHVmpkQ2dwTG5OMFlYUmxJRDA5UFNCY0ltWjFiR1pwYkd4bFpGd2lPMXh1ZlZ4dVhHNVFjbTl0YVhObExuQnliM1J2ZEhsd1pTNXBjMFoxYkdacGJHeGxaQ0E5SUdaMWJtTjBhVzl1SUNncElIdGNiaUFnSUNCeVpYUjFjbTRnZEdocGN5NXBibk53WldOMEtDa3VjM1JoZEdVZ1BUMDlJRndpWm5Wc1ptbHNiR1ZrWENJN1hHNTlPMXh1WEc0dktpcGNiaUFxSUVCeVpYUjFjbTV6SUhkb1pYUm9aWElnZEdobElHZHBkbVZ1SUc5aWFtVmpkQ0JwY3lCaElISmxhbVZqZEdWa0lIQnliMjFwYzJVdVhHNGdLaTljYmxFdWFYTlNaV3BsWTNSbFpDQTlJR2x6VW1WcVpXTjBaV1E3WEc1bWRXNWpkR2x2YmlCcGMxSmxhbVZqZEdWa0tHOWlhbVZqZENrZ2UxeHVJQ0FnSUhKbGRIVnliaUJwYzFCeWIyMXBjMlVvYjJKcVpXTjBLU0FtSmlCdlltcGxZM1F1YVc1emNHVmpkQ2dwTG5OMFlYUmxJRDA5UFNCY0luSmxhbVZqZEdWa1hDSTdYRzU5WEc1Y2JsQnliMjFwYzJVdWNISnZkRzkwZVhCbExtbHpVbVZxWldOMFpXUWdQU0JtZFc1amRHbHZiaUFvS1NCN1hHNGdJQ0FnY21WMGRYSnVJSFJvYVhNdWFXNXpjR1ZqZENncExuTjBZWFJsSUQwOVBTQmNJbkpsYW1WamRHVmtYQ0k3WEc1OU8xeHVYRzR2THk4dklFSkZSMGxPSUZWT1NFRk9SRXhGUkNCU1JVcEZRMVJKVDA0Z1ZGSkJRMHRKVGtkY2JseHVMeThnVkdocGN5QndjbTl0YVhObElHeHBZbkpoY25rZ1kyOXVjM1Z0WlhNZ1pYaGpaWEIwYVc5dWN5QjBhSEp2ZDI0Z2FXNGdhR0Z1Wkd4bGNuTWdjMjhnZEdobGVTQmpZVzRnWW1WY2JpOHZJR2hoYm1Sc1pXUWdZbmtnWVNCemRXSnpaWEYxWlc1MElIQnliMjFwYzJVdUlDQlVhR1VnWlhoalpYQjBhVzl1Y3lCblpYUWdZV1JrWldRZ2RHOGdkR2hwY3lCaGNuSmhlU0IzYUdWdVhHNHZMeUIwYUdWNUlHRnlaU0JqY21WaGRHVmtMQ0JoYm1RZ2NtVnRiM1psWkNCM2FHVnVJSFJvWlhrZ1lYSmxJR2hoYm1Sc1pXUXVJQ0JPYjNSbElIUm9ZWFFnYVc0Z1JWTTJJRzl5WEc0dkx5QnphR2x0YldWa0lHVnVkbWx5YjI1dFpXNTBjeXdnZEdocGN5QjNiM1ZzWkNCdVlYUjFjbUZzYkhrZ1ltVWdZU0JnVTJWMFlDNWNiblpoY2lCMWJtaGhibVJzWldSU1pXRnpiMjV6SUQwZ1cxMDdYRzUyWVhJZ2RXNW9ZVzVrYkdWa1VtVnFaV04wYVc5dWN5QTlJRnRkTzF4dWRtRnlJSEpsY0c5eWRHVmtWVzVvWVc1a2JHVmtVbVZxWldOMGFXOXVjeUE5SUZ0ZE8xeHVkbUZ5SUhSeVlXTnJWVzVvWVc1a2JHVmtVbVZxWldOMGFXOXVjeUE5SUhSeWRXVTdYRzVjYm1aMWJtTjBhVzl1SUhKbGMyVjBWVzVvWVc1a2JHVmtVbVZxWldOMGFXOXVjeWdwSUh0Y2JpQWdJQ0IxYm1oaGJtUnNaV1JTWldGemIyNXpMbXhsYm1kMGFDQTlJREE3WEc0Z0lDQWdkVzVvWVc1a2JHVmtVbVZxWldOMGFXOXVjeTVzWlc1bmRHZ2dQU0F3TzF4dVhHNGdJQ0FnYVdZZ0tDRjBjbUZqYTFWdWFHRnVaR3hsWkZKbGFtVmpkR2x2Ym5NcElIdGNiaUFnSUNBZ0lDQWdkSEpoWTJ0VmJtaGhibVJzWldSU1pXcGxZM1JwYjI1eklEMGdkSEoxWlR0Y2JpQWdJQ0I5WEc1OVhHNWNibVoxYm1OMGFXOXVJSFJ5WVdOclVtVnFaV04wYVc5dUtIQnliMjFwYzJVc0lISmxZWE52YmlrZ2UxeHVJQ0FnSUdsbUlDZ2hkSEpoWTJ0VmJtaGhibVJzWldSU1pXcGxZM1JwYjI1ektTQjdYRzRnSUNBZ0lDQWdJSEpsZEhWeWJqdGNiaUFnSUNCOVhHNGdJQ0FnYVdZZ0tIUjVjR1Z2WmlCd2NtOWpaWE56SUQwOVBTQmNJbTlpYW1WamRGd2lJQ1ltSUhSNWNHVnZaaUJ3Y205alpYTnpMbVZ0YVhRZ1BUMDlJRndpWm5WdVkzUnBiMjVjSWlrZ2UxeHVJQ0FnSUNBZ0lDQlJMbTVsZUhSVWFXTnJMbkoxYmtGbWRHVnlLR1oxYm1OMGFXOXVJQ2dwSUh0Y2JpQWdJQ0FnSUNBZ0lDQWdJR2xtSUNoaGNuSmhlVjlwYm1SbGVFOW1LSFZ1YUdGdVpHeGxaRkpsYW1WamRHbHZibk1zSUhCeWIyMXBjMlVwSUNFOVBTQXRNU2tnZTF4dUlDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUhCeWIyTmxjM011WlcxcGRDaGNJblZ1YUdGdVpHeGxaRkpsYW1WamRHbHZibHdpTENCeVpXRnpiMjRzSUhCeWIyMXBjMlVwTzF4dUlDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUhKbGNHOXlkR1ZrVlc1b1lXNWtiR1ZrVW1WcVpXTjBhVzl1Y3k1d2RYTm9LSEJ5YjIxcGMyVXBPMXh1SUNBZ0lDQWdJQ0FnSUNBZ2ZWeHVJQ0FnSUNBZ0lDQjlLVHRjYmlBZ0lDQjlYRzVjYmlBZ0lDQjFibWhoYm1Sc1pXUlNaV3BsWTNScGIyNXpMbkIxYzJnb2NISnZiV2x6WlNrN1hHNGdJQ0FnYVdZZ0tISmxZWE52YmlBbUppQjBlWEJsYjJZZ2NtVmhjMjl1TG5OMFlXTnJJQ0U5UFNCY0luVnVaR1ZtYVc1bFpGd2lLU0I3WEc0Z0lDQWdJQ0FnSUhWdWFHRnVaR3hsWkZKbFlYTnZibk11Y0hWemFDaHlaV0Z6YjI0dWMzUmhZMnNwTzF4dUlDQWdJSDBnWld4elpTQjdYRzRnSUNBZ0lDQWdJSFZ1YUdGdVpHeGxaRkpsWVhOdmJuTXVjSFZ6YUNoY0lpaHVieUJ6ZEdGamF5a2dYQ0lnS3lCeVpXRnpiMjRwTzF4dUlDQWdJSDFjYm4xY2JseHVablZ1WTNScGIyNGdkVzUwY21GamExSmxhbVZqZEdsdmJpaHdjbTl0YVhObEtTQjdYRzRnSUNBZ2FXWWdLQ0YwY21GamExVnVhR0Z1Wkd4bFpGSmxhbVZqZEdsdmJuTXBJSHRjYmlBZ0lDQWdJQ0FnY21WMGRYSnVPMXh1SUNBZ0lIMWNibHh1SUNBZ0lIWmhjaUJoZENBOUlHRnljbUY1WDJsdVpHVjRUMllvZFc1b1lXNWtiR1ZrVW1WcVpXTjBhVzl1Y3l3Z2NISnZiV2x6WlNrN1hHNGdJQ0FnYVdZZ0tHRjBJQ0U5UFNBdE1Ta2dlMXh1SUNBZ0lDQWdJQ0JwWmlBb2RIbHdaVzltSUhCeWIyTmxjM01nUFQwOUlGd2liMkpxWldOMFhDSWdKaVlnZEhsd1pXOW1JSEJ5YjJObGMzTXVaVzFwZENBOVBUMGdYQ0ptZFc1amRHbHZibHdpS1NCN1hHNGdJQ0FnSUNBZ0lDQWdJQ0JSTG01bGVIUlVhV05yTG5KMWJrRm1kR1Z5S0daMWJtTjBhVzl1SUNncElIdGNiaUFnSUNBZ0lDQWdJQ0FnSUNBZ0lDQjJZWElnWVhSU1pYQnZjblFnUFNCaGNuSmhlVjlwYm1SbGVFOW1LSEpsY0c5eWRHVmtWVzVvWVc1a2JHVmtVbVZxWldOMGFXOXVjeXdnY0hKdmJXbHpaU2s3WEc0Z0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnYVdZZ0tHRjBVbVZ3YjNKMElDRTlQU0F0TVNrZ2UxeHVJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0J3Y205alpYTnpMbVZ0YVhRb1hDSnlaV3BsWTNScGIyNUlZVzVrYkdWa1hDSXNJSFZ1YUdGdVpHeGxaRkpsWVhOdmJuTmJZWFJkTENCd2NtOXRhWE5sS1R0Y2JpQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdjbVZ3YjNKMFpXUlZibWhoYm1Sc1pXUlNaV3BsWTNScGIyNXpMbk53YkdsalpTaGhkRkpsY0c5eWRDd2dNU2s3WEc0Z0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnZlZ4dUlDQWdJQ0FnSUNBZ0lDQWdmU2s3WEc0Z0lDQWdJQ0FnSUgxY2JpQWdJQ0FnSUNBZ2RXNW9ZVzVrYkdWa1VtVnFaV04wYVc5dWN5NXpjR3hwWTJVb1lYUXNJREVwTzF4dUlDQWdJQ0FnSUNCMWJtaGhibVJzWldSU1pXRnpiMjV6TG5Od2JHbGpaU2hoZEN3Z01TazdYRzRnSUNBZ2ZWeHVmVnh1WEc1UkxuSmxjMlYwVlc1b1lXNWtiR1ZrVW1WcVpXTjBhVzl1Y3lBOUlISmxjMlYwVlc1b1lXNWtiR1ZrVW1WcVpXTjBhVzl1Y3p0Y2JseHVVUzVuWlhSVmJtaGhibVJzWldSU1pXRnpiMjV6SUQwZ1puVnVZM1JwYjI0Z0tDa2dlMXh1SUNBZ0lDOHZJRTFoYTJVZ1lTQmpiM0I1SUhOdklIUm9ZWFFnWTI5dWMzVnRaWEp6SUdOaGJpZDBJR2x1ZEdWeVptVnlaU0IzYVhSb0lHOTFjaUJwYm5SbGNtNWhiQ0J6ZEdGMFpTNWNiaUFnSUNCeVpYUjFjbTRnZFc1b1lXNWtiR1ZrVW1WaGMyOXVjeTV6YkdsalpTZ3BPMXh1ZlR0Y2JseHVVUzV6ZEc5d1ZXNW9ZVzVrYkdWa1VtVnFaV04wYVc5dVZISmhZMnRwYm1jZ1BTQm1kVzVqZEdsdmJpQW9LU0I3WEc0Z0lDQWdjbVZ6WlhSVmJtaGhibVJzWldSU1pXcGxZM1JwYjI1ektDazdYRzRnSUNBZ2RISmhZMnRWYm1oaGJtUnNaV1JTWldwbFkzUnBiMjV6SUQwZ1ptRnNjMlU3WEc1OU8xeHVYRzV5WlhObGRGVnVhR0Z1Wkd4bFpGSmxhbVZqZEdsdmJuTW9LVHRjYmx4dUx5OHZMeUJGVGtRZ1ZVNUlRVTVFVEVWRUlGSkZTa1ZEVkVsUFRpQlVVa0ZEUzBsT1IxeHVYRzR2S2lwY2JpQXFJRU52Ym5OMGNuVmpkSE1nWVNCeVpXcGxZM1JsWkNCd2NtOXRhWE5sTGx4dUlDb2dRSEJoY21GdElISmxZWE52YmlCMllXeDFaU0JrWlhOamNtbGlhVzVuSUhSb1pTQm1ZV2xzZFhKbFhHNGdLaTljYmxFdWNtVnFaV04wSUQwZ2NtVnFaV04wTzF4dVpuVnVZM1JwYjI0Z2NtVnFaV04wS0hKbFlYTnZiaWtnZTF4dUlDQWdJSFpoY2lCeVpXcGxZM1JwYjI0Z1BTQlFjbTl0YVhObEtIdGNiaUFnSUNBZ0lDQWdYQ0ozYUdWdVhDSTZJR1oxYm1OMGFXOXVJQ2h5WldwbFkzUmxaQ2tnZTF4dUlDQWdJQ0FnSUNBZ0lDQWdMeThnYm05MFpTQjBhR0YwSUhSb1pTQmxjbkp2Y2lCb1lYTWdZbVZsYmlCb1lXNWtiR1ZrWEc0Z0lDQWdJQ0FnSUNBZ0lDQnBaaUFvY21WcVpXTjBaV1FwSUh0Y2JpQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNCMWJuUnlZV05yVW1WcVpXTjBhVzl1S0hSb2FYTXBPMXh1SUNBZ0lDQWdJQ0FnSUNBZ2ZWeHVJQ0FnSUNBZ0lDQWdJQ0FnY21WMGRYSnVJSEpsYW1WamRHVmtJRDhnY21WcVpXTjBaV1FvY21WaGMyOXVLU0E2SUhSb2FYTTdYRzRnSUNBZ0lDQWdJSDFjYmlBZ0lDQjlMQ0JtZFc1amRHbHZiaUJtWVd4c1ltRmpheWdwSUh0Y2JpQWdJQ0FnSUNBZ2NtVjBkWEp1SUhSb2FYTTdYRzRnSUNBZ2ZTd2dablZ1WTNScGIyNGdhVzV6Y0dWamRDZ3BJSHRjYmlBZ0lDQWdJQ0FnY21WMGRYSnVJSHNnYzNSaGRHVTZJRndpY21WcVpXTjBaV1JjSWl3Z2NtVmhjMjl1T2lCeVpXRnpiMjRnZlR0Y2JpQWdJQ0I5S1R0Y2JseHVJQ0FnSUM4dklFNXZkR1VnZEdoaGRDQjBhR1VnY21WaGMyOXVJR2hoY3lCdWIzUWdZbVZsYmlCb1lXNWtiR1ZrTGx4dUlDQWdJSFJ5WVdOclVtVnFaV04wYVc5dUtISmxhbVZqZEdsdmJpd2djbVZoYzI5dUtUdGNibHh1SUNBZ0lISmxkSFZ5YmlCeVpXcGxZM1JwYjI0N1hHNTlYRzVjYmk4cUtseHVJQ29nUTI5dWMzUnlkV04wY3lCaElHWjFiR1pwYkd4bFpDQndjbTl0YVhObElHWnZjaUJoYmlCcGJXMWxaR2xoZEdVZ2NtVm1aWEpsYm1ObExseHVJQ29nUUhCaGNtRnRJSFpoYkhWbElHbHRiV1ZrYVdGMFpTQnlaV1psY21WdVkyVmNiaUFxTDF4dVVTNW1kV3htYVd4c0lEMGdablZzWm1sc2JEdGNibVoxYm1OMGFXOXVJR1oxYkdacGJHd29kbUZzZFdVcElIdGNiaUFnSUNCeVpYUjFjbTRnVUhKdmJXbHpaU2g3WEc0Z0lDQWdJQ0FnSUZ3aWQyaGxibHdpT2lCbWRXNWpkR2x2YmlBb0tTQjdYRzRnSUNBZ0lDQWdJQ0FnSUNCeVpYUjFjbTRnZG1Gc2RXVTdYRzRnSUNBZ0lDQWdJSDBzWEc0Z0lDQWdJQ0FnSUZ3aVoyVjBYQ0k2SUdaMWJtTjBhVzl1SUNodVlXMWxLU0I3WEc0Z0lDQWdJQ0FnSUNBZ0lDQnlaWFIxY200Z2RtRnNkV1ZiYm1GdFpWMDdYRzRnSUNBZ0lDQWdJSDBzWEc0Z0lDQWdJQ0FnSUZ3aWMyVjBYQ0k2SUdaMWJtTjBhVzl1SUNodVlXMWxMQ0J5YUhNcElIdGNiaUFnSUNBZ0lDQWdJQ0FnSUhaaGJIVmxXMjVoYldWZElEMGdjbWh6TzF4dUlDQWdJQ0FnSUNCOUxGeHVJQ0FnSUNBZ0lDQmNJbVJsYkdWMFpWd2lPaUJtZFc1amRHbHZiaUFvYm1GdFpTa2dlMXh1SUNBZ0lDQWdJQ0FnSUNBZ1pHVnNaWFJsSUhaaGJIVmxXMjVoYldWZE8xeHVJQ0FnSUNBZ0lDQjlMRnh1SUNBZ0lDQWdJQ0JjSW5CdmMzUmNJam9nWm5WdVkzUnBiMjRnS0c1aGJXVXNJR0Z5WjNNcElIdGNiaUFnSUNBZ0lDQWdJQ0FnSUM4dklFMWhjbXNnVFdsc2JHVnlJSEJ5YjNCdmMyVnpJSFJvWVhRZ2NHOXpkQ0IzYVhSb0lHNXZJRzVoYldVZ2MyaHZkV3hrSUdGd2NHeDVJR0ZjYmlBZ0lDQWdJQ0FnSUNBZ0lDOHZJSEJ5YjIxcGMyVmtJR1oxYm1OMGFXOXVMbHh1SUNBZ0lDQWdJQ0FnSUNBZ2FXWWdLRzVoYldVZ1BUMDlJRzUxYkd3Z2ZId2dibUZ0WlNBOVBUMGdkbTlwWkNBd0tTQjdYRzRnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdjbVYwZFhKdUlIWmhiSFZsTG1Gd2NHeDVLSFp2YVdRZ01Dd2dZWEpuY3lrN1hHNGdJQ0FnSUNBZ0lDQWdJQ0I5SUdWc2MyVWdlMXh1SUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJSEpsZEhWeWJpQjJZV3gxWlZ0dVlXMWxYUzVoY0hCc2VTaDJZV3gxWlN3Z1lYSm5jeWs3WEc0Z0lDQWdJQ0FnSUNBZ0lDQjlYRzRnSUNBZ0lDQWdJSDBzWEc0Z0lDQWdJQ0FnSUZ3aVlYQndiSGxjSWpvZ1puVnVZM1JwYjI0Z0tIUm9hWE53TENCaGNtZHpLU0I3WEc0Z0lDQWdJQ0FnSUNBZ0lDQnlaWFIxY200Z2RtRnNkV1V1WVhCd2JIa29kR2hwYzNBc0lHRnlaM01wTzF4dUlDQWdJQ0FnSUNCOUxGeHVJQ0FnSUNBZ0lDQmNJbXRsZVhOY0lqb2dablZ1WTNScGIyNGdLQ2tnZTF4dUlDQWdJQ0FnSUNBZ0lDQWdjbVYwZFhKdUlHOWlhbVZqZEY5clpYbHpLSFpoYkhWbEtUdGNiaUFnSUNBZ0lDQWdmVnh1SUNBZ0lIMHNJSFp2YVdRZ01Dd2dablZ1WTNScGIyNGdhVzV6Y0dWamRDZ3BJSHRjYmlBZ0lDQWdJQ0FnY21WMGRYSnVJSHNnYzNSaGRHVTZJRndpWm5Wc1ptbHNiR1ZrWENJc0lIWmhiSFZsT2lCMllXeDFaU0I5TzF4dUlDQWdJSDBwTzF4dWZWeHVYRzR2S2lwY2JpQXFJRU52Ym5abGNuUnpJSFJvWlc1aFlteGxjeUIwYnlCUklIQnliMjFwYzJWekxseHVJQ29nUUhCaGNtRnRJSEJ5YjIxcGMyVWdkR2hsYm1GaWJHVWdjSEp2YldselpWeHVJQ29nUUhKbGRIVnlibk1nWVNCUklIQnliMjFwYzJWY2JpQXFMMXh1Wm5WdVkzUnBiMjRnWTI5bGNtTmxLSEJ5YjIxcGMyVXBJSHRjYmlBZ0lDQjJZWElnWkdWbVpYSnlaV1FnUFNCa1pXWmxjaWdwTzF4dUlDQWdJRkV1Ym1WNGRGUnBZMnNvWm5WdVkzUnBiMjRnS0NrZ2UxeHVJQ0FnSUNBZ0lDQjBjbmtnZTF4dUlDQWdJQ0FnSUNBZ0lDQWdjSEp2YldselpTNTBhR1Z1S0dSbFptVnljbVZrTG5KbGMyOXNkbVVzSUdSbFptVnljbVZrTG5KbGFtVmpkQ3dnWkdWbVpYSnlaV1F1Ym05MGFXWjVLVHRjYmlBZ0lDQWdJQ0FnZlNCallYUmphQ0FvWlhoalpYQjBhVzl1S1NCN1hHNGdJQ0FnSUNBZ0lDQWdJQ0JrWldabGNuSmxaQzV5WldwbFkzUW9aWGhqWlhCMGFXOXVLVHRjYmlBZ0lDQWdJQ0FnZlZ4dUlDQWdJSDBwTzF4dUlDQWdJSEpsZEhWeWJpQmtaV1psY25KbFpDNXdjbTl0YVhObE8xeHVmVnh1WEc0dktpcGNiaUFxSUVGdWJtOTBZWFJsY3lCaGJpQnZZbXBsWTNRZ2MzVmphQ0IwYUdGMElHbDBJSGRwYkd3Z2JtVjJaWElnWW1WY2JpQXFJSFJ5WVc1elptVnljbVZrSUdGM1lYa2dabkp2YlNCMGFHbHpJSEJ5YjJObGMzTWdiM1psY2lCaGJua2djSEp2YldselpWeHVJQ29nWTI5dGJYVnVhV05oZEdsdmJpQmphR0Z1Ym1Wc0xseHVJQ29nUUhCaGNtRnRJRzlpYW1WamRGeHVJQ29nUUhKbGRIVnlibk1nY0hKdmJXbHpaU0JoSUhkeVlYQndhVzVuSUc5bUlIUm9ZWFFnYjJKcVpXTjBJSFJvWVhSY2JpQXFJR0ZrWkdsMGFXOXVZV3hzZVNCeVpYTndiMjVrY3lCMGJ5QjBhR1VnWENKcGMwUmxabHdpSUcxbGMzTmhaMlZjYmlBcUlIZHBkR2h2ZFhRZ1lTQnlaV3BsWTNScGIyNHVYRzRnS2k5Y2JsRXViV0Z6ZEdWeUlEMGdiV0Z6ZEdWeU8xeHVablZ1WTNScGIyNGdiV0Z6ZEdWeUtHOWlhbVZqZENrZ2UxeHVJQ0FnSUhKbGRIVnliaUJRY205dGFYTmxLSHRjYmlBZ0lDQWdJQ0FnWENKcGMwUmxabHdpT2lCbWRXNWpkR2x2YmlBb0tTQjdmVnh1SUNBZ0lIMHNJR1oxYm1OMGFXOXVJR1poYkd4aVlXTnJLRzl3TENCaGNtZHpLU0I3WEc0Z0lDQWdJQ0FnSUhKbGRIVnliaUJrYVhOd1lYUmphQ2h2WW1wbFkzUXNJRzl3TENCaGNtZHpLVHRjYmlBZ0lDQjlMQ0JtZFc1amRHbHZiaUFvS1NCN1hHNGdJQ0FnSUNBZ0lISmxkSFZ5YmlCUktHOWlhbVZqZENrdWFXNXpjR1ZqZENncE8xeHVJQ0FnSUgwcE8xeHVmVnh1WEc0dktpcGNiaUFxSUZOd2NtVmhaSE1nZEdobElIWmhiSFZsY3lCdlppQmhJSEJ5YjIxcGMyVmtJR0Z5Y21GNUlHOW1JR0Z5WjNWdFpXNTBjeUJwYm5SdklIUm9aVnh1SUNvZ1puVnNabWxzYkcxbGJuUWdZMkZzYkdKaFkyc3VYRzRnS2lCQWNHRnlZVzBnWm5Wc1ptbHNiR1ZrSUdOaGJHeGlZV05ySUhSb1lYUWdjbVZqWldsMlpYTWdkbUZ5YVdGa2FXTWdZWEpuZFcxbGJuUnpJR1p5YjIwZ2RHaGxYRzRnS2lCd2NtOXRhWE5sWkNCaGNuSmhlVnh1SUNvZ1FIQmhjbUZ0SUhKbGFtVmpkR1ZrSUdOaGJHeGlZV05ySUhSb1lYUWdjbVZqWldsMlpYTWdkR2hsSUdWNFkyVndkR2x2YmlCcFppQjBhR1VnY0hKdmJXbHpaVnh1SUNvZ2FYTWdjbVZxWldOMFpXUXVYRzRnS2lCQWNtVjBkWEp1Y3lCaElIQnliMjFwYzJVZ1ptOXlJSFJvWlNCeVpYUjFjbTRnZG1Gc2RXVWdiM0lnZEdoeWIzZHVJR1Y0WTJWd2RHbHZiaUJ2Wmx4dUlDb2daV2wwYUdWeUlHTmhiR3hpWVdOckxseHVJQ292WEc1UkxuTndjbVZoWkNBOUlITndjbVZoWkR0Y2JtWjFibU4wYVc5dUlITndjbVZoWkNoMllXeDFaU3dnWm5Wc1ptbHNiR1ZrTENCeVpXcGxZM1JsWkNrZ2UxeHVJQ0FnSUhKbGRIVnliaUJSS0haaGJIVmxLUzV6Y0hKbFlXUW9ablZzWm1sc2JHVmtMQ0J5WldwbFkzUmxaQ2s3WEc1OVhHNWNibEJ5YjIxcGMyVXVjSEp2ZEc5MGVYQmxMbk53Y21WaFpDQTlJR1oxYm1OMGFXOXVJQ2htZFd4bWFXeHNaV1FzSUhKbGFtVmpkR1ZrS1NCN1hHNGdJQ0FnY21WMGRYSnVJSFJvYVhNdVlXeHNLQ2t1ZEdobGJpaG1kVzVqZEdsdmJpQW9ZWEp5WVhrcElIdGNiaUFnSUNBZ0lDQWdjbVYwZFhKdUlHWjFiR1pwYkd4bFpDNWhjSEJzZVNoMmIybGtJREFzSUdGeWNtRjVLVHRjYmlBZ0lDQjlMQ0J5WldwbFkzUmxaQ2s3WEc1OU8xeHVYRzR2S2lwY2JpQXFJRlJvWlNCaGMzbHVZeUJtZFc1amRHbHZiaUJwY3lCaElHUmxZMjl5WVhSdmNpQm1iM0lnWjJWdVpYSmhkRzl5SUdaMWJtTjBhVzl1Y3l3Z2RIVnlibWx1WjF4dUlDb2dkR2hsYlNCcGJuUnZJR0Z6ZVc1amFISnZibTkxY3lCblpXNWxjbUYwYjNKekxpQWdRV3gwYUc5MVoyZ2daMlZ1WlhKaGRHOXljeUJoY21VZ2IyNXNlU0J3WVhKMFhHNGdLaUJ2WmlCMGFHVWdibVYzWlhOMElFVkRUVUZUWTNKcGNIUWdOaUJrY21GbWRITXNJSFJvYVhNZ1kyOWtaU0JrYjJWeklHNXZkQ0JqWVhWelpTQnplVzUwWVhoY2JpQXFJR1Z5Y205eWN5QnBiaUJ2YkdSbGNpQmxibWRwYm1WekxpQWdWR2hwY3lCamIyUmxJSE5vYjNWc1pDQmpiMjUwYVc1MVpTQjBieUIzYjNKcklHRnVaQ0IzYVd4c1hHNGdLaUJwYmlCbVlXTjBJR2x0Y0hKdmRtVWdiM1psY2lCMGFXMWxJR0Z6SUhSb1pTQnNZVzVuZFdGblpTQnBiWEJ5YjNabGN5NWNiaUFxWEc0Z0tpQkZVellnWjJWdVpYSmhkRzl5Y3lCaGNtVWdZM1Z5Y21WdWRHeDVJSEJoY25RZ2IyWWdWamdnZG1WeWMybHZiaUF6TGpFNUlIZHBkR2dnZEdobFhHNGdLaUF0TFdoaGNtMXZibmt0WjJWdVpYSmhkRzl5Y3lCeWRXNTBhVzFsSUdac1lXY2daVzVoWW14bFpDNGdJRk53YVdSbGNrMXZibXRsZVNCb1lYTWdhR0ZrSUhSb1pXMWNiaUFxSUdadmNpQnNiMjVuWlhJc0lHSjFkQ0IxYm1SbGNpQmhiaUJ2YkdSbGNpQlFlWFJvYjI0dGFXNXpjR2x5WldRZ1ptOXliUzRnSUZSb2FYTWdablZ1WTNScGIyNWNiaUFxSUhkdmNtdHpJRzl1SUdKdmRHZ2dhMmx1WkhNZ2IyWWdaMlZ1WlhKaGRHOXljeTVjYmlBcVhHNGdLaUJFWldOdmNtRjBaWE1nWVNCblpXNWxjbUYwYjNJZ1puVnVZM1JwYjI0Z2MzVmphQ0IwYUdGME9seHVJQ29nSUMwZ2FYUWdiV0Y1SUhscFpXeGtJSEJ5YjIxcGMyVnpYRzRnS2lBZ0xTQmxlR1ZqZFhScGIyNGdkMmxzYkNCamIyNTBhVzUxWlNCM2FHVnVJSFJvWVhRZ2NISnZiV2x6WlNCcGN5Qm1kV3htYVd4c1pXUmNiaUFxSUNBdElIUm9aU0IyWVd4MVpTQnZaaUIwYUdVZ2VXbGxiR1FnWlhod2NtVnpjMmx2YmlCM2FXeHNJR0psSUhSb1pTQm1kV3htYVd4c1pXUWdkbUZzZFdWY2JpQXFJQ0F0SUdsMElISmxkSFZ5Ym5NZ1lTQndjbTl0YVhObElHWnZjaUIwYUdVZ2NtVjBkWEp1SUhaaGJIVmxJQ2gzYUdWdUlIUm9aU0JuWlc1bGNtRjBiM0pjYmlBcUlDQWdJSE4wYjNCeklHbDBaWEpoZEdsdVp5bGNiaUFxSUNBdElIUm9aU0JrWldOdmNtRjBaV1FnWm5WdVkzUnBiMjRnY21WMGRYSnVjeUJoSUhCeWIyMXBjMlVnWm05eUlIUm9aU0J5WlhSMWNtNGdkbUZzZFdWY2JpQXFJQ0FnSUc5bUlIUm9aU0JuWlc1bGNtRjBiM0lnYjNJZ2RHaGxJR1pwY25OMElISmxhbVZqZEdWa0lIQnliMjFwYzJVZ1lXMXZibWNnZEdodmMyVmNiaUFxSUNBZ0lIbHBaV3hrWldRdVhHNGdLaUFnTFNCcFppQmhiaUJsY25KdmNpQnBjeUIwYUhKdmQyNGdhVzRnZEdobElHZGxibVZ5WVhSdmNpd2dhWFFnY0hKdmNHRm5ZWFJsY3lCMGFISnZkV2RvWEc0Z0tpQWdJQ0JsZG1WeWVTQm1iMnhzYjNkcGJtY2dlV2xsYkdRZ2RXNTBhV3dnYVhRZ2FYTWdZMkYxWjJoMExDQnZjaUIxYm5ScGJDQnBkQ0JsYzJOaGNHVnpYRzRnS2lBZ0lDQjBhR1VnWjJWdVpYSmhkRzl5SUdaMWJtTjBhVzl1SUdGc2RHOW5aWFJvWlhJc0lHRnVaQ0JwY3lCMGNtRnVjMnhoZEdWa0lHbHVkRzhnWVZ4dUlDb2dJQ0FnY21WcVpXTjBhVzl1SUdadmNpQjBhR1VnY0hKdmJXbHpaU0J5WlhSMWNtNWxaQ0JpZVNCMGFHVWdaR1ZqYjNKaGRHVmtJR2RsYm1WeVlYUnZjaTVjYmlBcUwxeHVVUzVoYzNsdVl5QTlJR0Z6ZVc1ak8xeHVablZ1WTNScGIyNGdZWE41Ym1Nb2JXRnJaVWRsYm1WeVlYUnZjaWtnZTF4dUlDQWdJSEpsZEhWeWJpQm1kVzVqZEdsdmJpQW9LU0I3WEc0Z0lDQWdJQ0FnSUM4dklIZG9aVzRnZG1WeVlpQnBjeUJjSW5ObGJtUmNJaXdnWVhKbklHbHpJR0VnZG1Gc2RXVmNiaUFnSUNBZ0lDQWdMeThnZDJobGJpQjJaWEppSUdseklGd2lkR2h5YjNkY0lpd2dZWEpuSUdseklHRnVJR1Y0WTJWd2RHbHZibHh1SUNBZ0lDQWdJQ0JtZFc1amRHbHZiaUJqYjI1MGFXNTFaWElvZG1WeVlpd2dZWEpuS1NCN1hHNGdJQ0FnSUNBZ0lDQWdJQ0IyWVhJZ2NtVnpkV3gwTzF4dVhHNGdJQ0FnSUNBZ0lDQWdJQ0F2THlCVmJuUnBiQ0JXT0NBekxqRTVJQzhnUTJoeWIyMXBkVzBnTWprZ2FYTWdjbVZzWldGelpXUXNJRk53YVdSbGNrMXZibXRsZVNCcGN5QjBhR1VnYjI1c2VWeHVJQ0FnSUNBZ0lDQWdJQ0FnTHk4Z1pXNW5hVzVsSUhSb1lYUWdhR0Z6SUdFZ1pHVndiRzk1WldRZ1ltRnpaU0J2WmlCaWNtOTNjMlZ5Y3lCMGFHRjBJSE4xY0hCdmNuUWdaMlZ1WlhKaGRHOXljeTVjYmlBZ0lDQWdJQ0FnSUNBZ0lDOHZJRWh2ZDJWMlpYSXNJRk5OSjNNZ1oyVnVaWEpoZEc5eWN5QjFjMlVnZEdobElGQjVkR2h2YmkxcGJuTndhWEpsWkNCelpXMWhiblJwWTNNZ2IyWmNiaUFnSUNBZ0lDQWdJQ0FnSUM4dklHOTFkR1JoZEdWa0lFVlROaUJrY21GbWRITXVJQ0JYWlNCM2IzVnNaQ0JzYVd0bElIUnZJSE4xY0hCdmNuUWdSVk0yTENCaWRYUWdkMlVuWkNCaGJITnZYRzRnSUNBZ0lDQWdJQ0FnSUNBdkx5QnNhV3RsSUhSdklHMWhhMlVnYVhRZ2NHOXpjMmxpYkdVZ2RHOGdkWE5sSUdkbGJtVnlZWFJ2Y25NZ2FXNGdaR1Z3Ykc5NVpXUWdZbkp2ZDNObGNuTXNJSE52WEc0Z0lDQWdJQ0FnSUNBZ0lDQXZMeUIzWlNCaGJITnZJSE4xY0hCdmNuUWdVSGwwYUc5dUxYTjBlV3hsSUdkbGJtVnlZWFJ2Y25NdUlDQkJkQ0J6YjIxbElIQnZhVzUwSUhkbElHTmhiaUJ5WlcxdmRtVmNiaUFnSUNBZ0lDQWdJQ0FnSUM4dklIUm9hWE1nWW14dlkyc3VYRzVjYmlBZ0lDQWdJQ0FnSUNBZ0lHbG1JQ2gwZVhCbGIyWWdVM1J2Y0VsMFpYSmhkR2x2YmlBOVBUMGdYQ0oxYm1SbFptbHVaV1JjSWlrZ2UxeHVJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDOHZJRVZUTmlCSFpXNWxjbUYwYjNKelhHNGdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ2RISjVJSHRjYmlBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ2NtVnpkV3gwSUQwZ1oyVnVaWEpoZEc5eVczWmxjbUpkS0dGeVp5azdYRzRnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdmU0JqWVhSamFDQW9aWGhqWlhCMGFXOXVLU0I3WEc0Z0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lISmxkSFZ5YmlCeVpXcGxZM1FvWlhoalpYQjBhVzl1S1R0Y2JpQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNCOVhHNGdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ2FXWWdLSEpsYzNWc2RDNWtiMjVsS1NCN1hHNGdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJSEpsZEhWeWJpQlJLSEpsYzNWc2RDNTJZV3gxWlNrN1hHNGdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ2ZTQmxiSE5sSUh0Y2JpQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdjbVYwZFhKdUlIZG9aVzRvY21WemRXeDBMblpoYkhWbExDQmpZV3hzWW1GamF5d2daWEp5WW1GamF5azdYRzRnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdmVnh1SUNBZ0lDQWdJQ0FnSUNBZ2ZTQmxiSE5sSUh0Y2JpQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBdkx5QlRjR2xrWlhKTmIyNXJaWGtnUjJWdVpYSmhkRzl5YzF4dUlDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUM4dklFWkpXRTFGT2lCU1pXMXZkbVVnZEdocGN5QmpZWE5sSUhkb1pXNGdVMDBnWkc5bGN5QkZVellnWjJWdVpYSmhkRzl5Y3k1Y2JpQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNCMGNua2dlMXh1SUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNCeVpYTjFiSFFnUFNCblpXNWxjbUYwYjNKYmRtVnlZbDBvWVhKbktUdGNiaUFnSUNBZ0lDQWdJQ0FnSUNBZ0lDQjlJR05oZEdOb0lDaGxlR05sY0hScGIyNHBJSHRjYmlBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ2FXWWdLR2x6VTNSdmNFbDBaWEpoZEdsdmJpaGxlR05sY0hScGIyNHBLU0I3WEc0Z0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0J5WlhSMWNtNGdVU2hsZUdObGNIUnBiMjR1ZG1Gc2RXVXBPMXh1SUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNCOUlHVnNjMlVnZTF4dUlDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnY21WMGRYSnVJSEpsYW1WamRDaGxlR05sY0hScGIyNHBPMXh1SUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNCOVhHNGdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ2ZWeHVJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lISmxkSFZ5YmlCM2FHVnVLSEpsYzNWc2RDd2dZMkZzYkdKaFkyc3NJR1Z5Y21KaFkyc3BPMXh1SUNBZ0lDQWdJQ0FnSUNBZ2ZWeHVJQ0FnSUNBZ0lDQjlYRzRnSUNBZ0lDQWdJSFpoY2lCblpXNWxjbUYwYjNJZ1BTQnRZV3RsUjJWdVpYSmhkRzl5TG1Gd2NHeDVLSFJvYVhNc0lHRnlaM1Z0Wlc1MGN5azdYRzRnSUNBZ0lDQWdJSFpoY2lCallXeHNZbUZqYXlBOUlHTnZiblJwYm5WbGNpNWlhVzVrS0dOdmJuUnBiblZsY2l3Z1hDSnVaWGgwWENJcE8xeHVJQ0FnSUNBZ0lDQjJZWElnWlhKeVltRmpheUE5SUdOdmJuUnBiblZsY2k1aWFXNWtLR052Ym5ScGJuVmxjaXdnWENKMGFISnZkMXdpS1R0Y2JpQWdJQ0FnSUNBZ2NtVjBkWEp1SUdOaGJHeGlZV05yS0NrN1hHNGdJQ0FnZlR0Y2JuMWNibHh1THlvcVhHNGdLaUJVYUdVZ2MzQmhkMjRnWm5WdVkzUnBiMjRnYVhNZ1lTQnpiV0ZzYkNCM2NtRndjR1Z5SUdGeWIzVnVaQ0JoYzNsdVl5QjBhR0YwSUdsdGJXVmthV0YwWld4NVhHNGdLaUJqWVd4c2N5QjBhR1VnWjJWdVpYSmhkRzl5SUdGdVpDQmhiSE52SUdWdVpITWdkR2hsSUhCeWIyMXBjMlVnWTJoaGFXNHNJSE52SUhSb1lYUWdZVzU1WEc0Z0tpQjFibWhoYm1Sc1pXUWdaWEp5YjNKeklHRnlaU0IwYUhKdmQyNGdhVzV6ZEdWaFpDQnZaaUJtYjNKM1lYSmtaV1FnZEc4Z2RHaGxJR1Z5Y205eVhHNGdLaUJvWVc1a2JHVnlMaUJVYUdseklHbHpJSFZ6WldaMWJDQmlaV05oZFhObElHbDBKM01nWlhoMGNtVnRaV3g1SUdOdmJXMXZiaUIwYnlCeWRXNWNiaUFxSUdkbGJtVnlZWFJ2Y25NZ1lYUWdkR2hsSUhSdmNDMXNaWFpsYkNCMGJ5QjNiM0pySUhkcGRHZ2diR2xpY21GeWFXVnpMbHh1SUNvdlhHNVJMbk53WVhkdUlEMGdjM0JoZDI0N1hHNW1kVzVqZEdsdmJpQnpjR0YzYmlodFlXdGxSMlZ1WlhKaGRHOXlLU0I3WEc0Z0lDQWdVUzVrYjI1bEtGRXVZWE41Ym1Nb2JXRnJaVWRsYm1WeVlYUnZjaWtvS1NrN1hHNTlYRzVjYmk4dklFWkpXRTFGT2lCU1pXMXZkbVVnZEdocGN5QnBiblJsY21aaFkyVWdiMjVqWlNCRlV6WWdaMlZ1WlhKaGRHOXljeUJoY21VZ2FXNGdVM0JwWkdWeVRXOXVhMlY1TGx4dUx5b3FYRzRnS2lCVWFISnZkM01nWVNCU1pYUjFjbTVXWVd4MVpTQmxlR05sY0hScGIyNGdkRzhnYzNSdmNDQmhiaUJoYzNsdVkyaHliMjV2ZFhNZ1oyVnVaWEpoZEc5eUxseHVJQ3BjYmlBcUlGUm9hWE1nYVc1MFpYSm1ZV05sSUdseklHRWdjM1J2Y0MxbllYQWdiV1ZoYzNWeVpTQjBieUJ6ZFhCd2IzSjBJR2RsYm1WeVlYUnZjaUJ5WlhSMWNtNWNiaUFxSUhaaGJIVmxjeUJwYmlCdmJHUmxjaUJHYVhKbFptOTRMMU53YVdSbGNrMXZibXRsZVM0Z0lFbHVJR0p5YjNkelpYSnpJSFJvWVhRZ2MzVndjRzl5ZENCRlV6WmNiaUFxSUdkbGJtVnlZWFJ2Y25NZ2JHbHJaU0JEYUhKdmJXbDFiU0F5T1N3Z2FuVnpkQ0IxYzJVZ1hDSnlaWFIxY201Y0lpQnBiaUI1YjNWeUlHZGxibVZ5WVhSdmNseHVJQ29nWm5WdVkzUnBiMjV6TGx4dUlDcGNiaUFxSUVCd1lYSmhiU0IyWVd4MVpTQjBhR1VnY21WMGRYSnVJSFpoYkhWbElHWnZjaUIwYUdVZ2MzVnljbTkxYm1ScGJtY2daMlZ1WlhKaGRHOXlYRzRnS2lCQWRHaHliM2R6SUZKbGRIVnlibFpoYkhWbElHVjRZMlZ3ZEdsdmJpQjNhWFJvSUhSb1pTQjJZV3gxWlM1Y2JpQXFJRUJsZUdGdGNHeGxYRzRnS2lBdkx5QkZVellnYzNSNWJHVmNiaUFxSUZFdVlYTjVibU1vWm5WdVkzUnBiMjRxSUNncElIdGNiaUFxSUNBZ0lDQWdkbUZ5SUdadmJ5QTlJSGxwWld4a0lHZGxkRVp2YjFCeWIyMXBjMlVvS1R0Y2JpQXFJQ0FnSUNBZ2RtRnlJR0poY2lBOUlIbHBaV3hrSUdkbGRFSmhjbEJ5YjIxcGMyVW9LVHRjYmlBcUlDQWdJQ0FnY21WMGRYSnVJR1p2YnlBcklHSmhjanRjYmlBcUlIMHBYRzRnS2lBdkx5QlBiR1JsY2lCVGNHbGtaWEpOYjI1clpYa2djM1I1YkdWY2JpQXFJRkV1WVhONWJtTW9ablZ1WTNScGIyNGdLQ2tnZTF4dUlDb2dJQ0FnSUNCMllYSWdabTl2SUQwZ2VXbGxiR1FnWjJWMFJtOXZVSEp2YldselpTZ3BPMXh1SUNvZ0lDQWdJQ0IyWVhJZ1ltRnlJRDBnZVdsbGJHUWdaMlYwUW1GeVVISnZiV2x6WlNncE8xeHVJQ29nSUNBZ0lDQlJMbkpsZEhWeWJpaG1iMjhnS3lCaVlYSXBPMXh1SUNvZ2ZTbGNiaUFxTDF4dVVWdGNJbkpsZEhWeWJsd2lYU0E5SUY5eVpYUjFjbTQ3WEc1bWRXNWpkR2x2YmlCZmNtVjBkWEp1S0haaGJIVmxLU0I3WEc0Z0lDQWdkR2h5YjNjZ2JtVjNJRkZTWlhSMWNtNVdZV3gxWlNoMllXeDFaU2s3WEc1OVhHNWNiaThxS2x4dUlDb2dWR2hsSUhCeWIyMXBjMlZrSUdaMWJtTjBhVzl1SUdSbFkyOXlZWFJ2Y2lCbGJuTjFjbVZ6SUhSb1lYUWdZVzU1SUhCeWIyMXBjMlVnWVhKbmRXMWxiblJ6WEc0Z0tpQmhjbVVnYzJWMGRHeGxaQ0JoYm1RZ2NHRnpjMlZrSUdGeklIWmhiSFZsY3lBb1lIUm9hWE5nSUdseklHRnNjMjhnYzJWMGRHeGxaQ0JoYm1RZ2NHRnpjMlZrWEc0Z0tpQmhjeUJoSUhaaGJIVmxLUzRnSUVsMElIZHBiR3dnWVd4emJ5Qmxibk4xY21VZ2RHaGhkQ0IwYUdVZ2NtVnpkV3gwSUc5bUlHRWdablZ1WTNScGIyNGdhWE5jYmlBcUlHRnNkMkY1Y3lCaElIQnliMjFwYzJVdVhHNGdLbHh1SUNvZ1FHVjRZVzF3YkdWY2JpQXFJSFpoY2lCaFpHUWdQU0JSTG5CeWIyMXBjMlZrS0daMWJtTjBhVzl1SUNoaExDQmlLU0I3WEc0Z0tpQWdJQ0FnY21WMGRYSnVJR0VnS3lCaU8xeHVJQ29nZlNrN1hHNGdLaUJoWkdRb1VTaGhLU3dnVVNoQ0tTazdYRzRnS2x4dUlDb2dRSEJoY21GdElIdG1kVzVqZEdsdmJuMGdZMkZzYkdKaFkyc2dWR2hsSUdaMWJtTjBhVzl1SUhSdklHUmxZMjl5WVhSbFhHNGdLaUJBY21WMGRYSnVjeUI3Wm5WdVkzUnBiMjU5SUdFZ1puVnVZM1JwYjI0Z2RHaGhkQ0JvWVhNZ1ltVmxiaUJrWldOdmNtRjBaV1F1WEc0Z0tpOWNibEV1Y0hKdmJXbHpaV1FnUFNCd2NtOXRhWE5sWkR0Y2JtWjFibU4wYVc5dUlIQnliMjFwYzJWa0tHTmhiR3hpWVdOcktTQjdYRzRnSUNBZ2NtVjBkWEp1SUdaMWJtTjBhVzl1SUNncElIdGNiaUFnSUNBZ0lDQWdjbVYwZFhKdUlITndjbVZoWkNoYmRHaHBjeXdnWVd4c0tHRnlaM1Z0Wlc1MGN5bGRMQ0JtZFc1amRHbHZiaUFvYzJWc1ppd2dZWEpuY3lrZ2UxeHVJQ0FnSUNBZ0lDQWdJQ0FnY21WMGRYSnVJR05oYkd4aVlXTnJMbUZ3Y0d4NUtITmxiR1lzSUdGeVozTXBPMXh1SUNBZ0lDQWdJQ0I5S1R0Y2JpQWdJQ0I5TzF4dWZWeHVYRzR2S2lwY2JpQXFJSE5sYm1SeklHRWdiV1Z6YzJGblpTQjBieUJoSUhaaGJIVmxJR2x1SUdFZ1puVjBkWEpsSUhSMWNtNWNiaUFxSUVCd1lYSmhiU0J2WW1wbFkzUXFJSFJvWlNCeVpXTnBjR2xsYm5SY2JpQXFJRUJ3WVhKaGJTQnZjQ0IwYUdVZ2JtRnRaU0J2WmlCMGFHVWdiV1Z6YzJGblpTQnZjR1Z5WVhScGIyNHNJR1V1Wnk0c0lGd2lkMmhsYmx3aUxGeHVJQ29nUUhCaGNtRnRJR0Z5WjNNZ1puVnlkR2hsY2lCaGNtZDFiV1Z1ZEhNZ2RHOGdZbVVnWm05eWQyRnlaR1ZrSUhSdklIUm9aU0J2Y0dWeVlYUnBiMjVjYmlBcUlFQnlaWFIxY201eklISmxjM1ZzZENCN1VISnZiV2x6WlgwZ1lTQndjbTl0YVhObElHWnZjaUIwYUdVZ2NtVnpkV3gwSUc5bUlIUm9aU0J2Y0dWeVlYUnBiMjVjYmlBcUwxeHVVUzVrYVhOd1lYUmphQ0E5SUdScGMzQmhkR05vTzF4dVpuVnVZM1JwYjI0Z1pHbHpjR0YwWTJnb2IySnFaV04wTENCdmNDd2dZWEpuY3lrZ2UxeHVJQ0FnSUhKbGRIVnliaUJSS0c5aWFtVmpkQ2t1WkdsemNHRjBZMmdvYjNBc0lHRnlaM01wTzF4dWZWeHVYRzVRY205dGFYTmxMbkJ5YjNSdmRIbHdaUzVrYVhOd1lYUmphQ0E5SUdaMWJtTjBhVzl1SUNodmNDd2dZWEpuY3lrZ2UxeHVJQ0FnSUhaaGNpQnpaV3htSUQwZ2RHaHBjenRjYmlBZ0lDQjJZWElnWkdWbVpYSnlaV1FnUFNCa1pXWmxjaWdwTzF4dUlDQWdJRkV1Ym1WNGRGUnBZMnNvWm5WdVkzUnBiMjRnS0NrZ2UxeHVJQ0FnSUNBZ0lDQnpaV3htTG5CeWIyMXBjMlZFYVhOd1lYUmphQ2hrWldabGNuSmxaQzV5WlhOdmJIWmxMQ0J2Y0N3Z1lYSm5jeWs3WEc0Z0lDQWdmU2s3WEc0Z0lDQWdjbVYwZFhKdUlHUmxabVZ5Y21Wa0xuQnliMjFwYzJVN1hHNTlPMXh1WEc0dktpcGNiaUFxSUVkbGRITWdkR2hsSUhaaGJIVmxJRzltSUdFZ2NISnZjR1Z5ZEhrZ2FXNGdZU0JtZFhSMWNtVWdkSFZ5Ymk1Y2JpQXFJRUJ3WVhKaGJTQnZZbXBsWTNRZ0lDQWdjSEp2YldselpTQnZjaUJwYlcxbFpHbGhkR1VnY21WbVpYSmxibU5sSUdadmNpQjBZWEpuWlhRZ2IySnFaV04wWEc0Z0tpQkFjR0Z5WVcwZ2JtRnRaU0FnSUNBZ0lHNWhiV1VnYjJZZ2NISnZjR1Z5ZEhrZ2RHOGdaMlYwWEc0Z0tpQkFjbVYwZFhKdUlIQnliMjFwYzJVZ1ptOXlJSFJvWlNCd2NtOXdaWEowZVNCMllXeDFaVnh1SUNvdlhHNVJMbWRsZENBOUlHWjFibU4wYVc5dUlDaHZZbXBsWTNRc0lHdGxlU2tnZTF4dUlDQWdJSEpsZEhWeWJpQlJLRzlpYW1WamRDa3VaR2x6Y0dGMFkyZ29YQ0puWlhSY0lpd2dXMnRsZVYwcE8xeHVmVHRjYmx4dVVISnZiV2x6WlM1d2NtOTBiM1I1Y0dVdVoyVjBJRDBnWm5WdVkzUnBiMjRnS0d0bGVTa2dlMXh1SUNBZ0lISmxkSFZ5YmlCMGFHbHpMbVJwYzNCaGRHTm9LRndpWjJWMFhDSXNJRnRyWlhsZEtUdGNibjA3WEc1Y2JpOHFLbHh1SUNvZ1UyVjBjeUIwYUdVZ2RtRnNkV1VnYjJZZ1lTQndjbTl3WlhKMGVTQnBiaUJoSUdaMWRIVnlaU0IwZFhKdUxseHVJQ29nUUhCaGNtRnRJRzlpYW1WamRDQWdJQ0J3Y205dGFYTmxJRzl5SUdsdGJXVmthV0YwWlNCeVpXWmxjbVZ1WTJVZ1ptOXlJRzlpYW1WamRDQnZZbXBsWTNSY2JpQXFJRUJ3WVhKaGJTQnVZVzFsSUNBZ0lDQWdibUZ0WlNCdlppQndjbTl3WlhKMGVTQjBieUJ6WlhSY2JpQXFJRUJ3WVhKaGJTQjJZV3gxWlNBZ0lDQWdibVYzSUhaaGJIVmxJRzltSUhCeWIzQmxjblI1WEc0Z0tpQkFjbVYwZFhKdUlIQnliMjFwYzJVZ1ptOXlJSFJvWlNCeVpYUjFjbTRnZG1Gc2RXVmNiaUFxTDF4dVVTNXpaWFFnUFNCbWRXNWpkR2x2YmlBb2IySnFaV04wTENCclpYa3NJSFpoYkhWbEtTQjdYRzRnSUNBZ2NtVjBkWEp1SUZFb2IySnFaV04wS1M1a2FYTndZWFJqYUNoY0luTmxkRndpTENCYmEyVjVMQ0IyWVd4MVpWMHBPMXh1ZlR0Y2JseHVVSEp2YldselpTNXdjbTkwYjNSNWNHVXVjMlYwSUQwZ1puVnVZM1JwYjI0Z0tHdGxlU3dnZG1Gc2RXVXBJSHRjYmlBZ0lDQnlaWFIxY200Z2RHaHBjeTVrYVhOd1lYUmphQ2hjSW5ObGRGd2lMQ0JiYTJWNUxDQjJZV3gxWlYwcE8xeHVmVHRjYmx4dUx5b3FYRzRnS2lCRVpXeGxkR1Z6SUdFZ2NISnZjR1Z5ZEhrZ2FXNGdZU0JtZFhSMWNtVWdkSFZ5Ymk1Y2JpQXFJRUJ3WVhKaGJTQnZZbXBsWTNRZ0lDQWdjSEp2YldselpTQnZjaUJwYlcxbFpHbGhkR1VnY21WbVpYSmxibU5sSUdadmNpQjBZWEpuWlhRZ2IySnFaV04wWEc0Z0tpQkFjR0Z5WVcwZ2JtRnRaU0FnSUNBZ0lHNWhiV1VnYjJZZ2NISnZjR1Z5ZEhrZ2RHOGdaR1ZzWlhSbFhHNGdLaUJBY21WMGRYSnVJSEJ5YjIxcGMyVWdabTl5SUhSb1pTQnlaWFIxY200Z2RtRnNkV1ZjYmlBcUwxeHVVUzVrWld3Z1BTQXZMeUJZV0ZnZ2JHVm5ZV041WEc1Ulcxd2laR1ZzWlhSbFhDSmRJRDBnWm5WdVkzUnBiMjRnS0c5aWFtVmpkQ3dnYTJWNUtTQjdYRzRnSUNBZ2NtVjBkWEp1SUZFb2IySnFaV04wS1M1a2FYTndZWFJqYUNoY0ltUmxiR1YwWlZ3aUxDQmJhMlY1WFNrN1hHNTlPMXh1WEc1UWNtOXRhWE5sTG5CeWIzUnZkSGx3WlM1a1pXd2dQU0F2THlCWVdGZ2diR1ZuWVdONVhHNVFjbTl0YVhObExuQnliM1J2ZEhsd1pWdGNJbVJsYkdWMFpWd2lYU0E5SUdaMWJtTjBhVzl1SUNoclpYa3BJSHRjYmlBZ0lDQnlaWFIxY200Z2RHaHBjeTVrYVhOd1lYUmphQ2hjSW1SbGJHVjBaVndpTENCYmEyVjVYU2s3WEc1OU8xeHVYRzR2S2lwY2JpQXFJRWx1ZG05clpYTWdZU0J0WlhSb2IyUWdhVzRnWVNCbWRYUjFjbVVnZEhWeWJpNWNiaUFxSUVCd1lYSmhiU0J2WW1wbFkzUWdJQ0FnY0hKdmJXbHpaU0J2Y2lCcGJXMWxaR2xoZEdVZ2NtVm1aWEpsYm1ObElHWnZjaUIwWVhKblpYUWdiMkpxWldOMFhHNGdLaUJBY0dGeVlXMGdibUZ0WlNBZ0lDQWdJRzVoYldVZ2IyWWdiV1YwYUc5a0lIUnZJR2x1ZG05clpWeHVJQ29nUUhCaGNtRnRJSFpoYkhWbElDQWdJQ0JoSUhaaGJIVmxJSFJ2SUhCdmMzUXNJSFI1Y0dsallXeHNlU0JoYmlCaGNuSmhlU0J2Wmx4dUlDb2dJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQnBiblp2WTJGMGFXOXVJR0Z5WjNWdFpXNTBjeUJtYjNJZ2NISnZiV2x6WlhNZ2RHaGhkRnh1SUNvZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNCaGNtVWdkV3gwYVcxaGRHVnNlU0JpWVdOclpXUWdkMmwwYUNCZ2NtVnpiMngyWldBZ2RtRnNkV1Z6TEZ4dUlDb2dJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQmhjeUJ2Y0hCdmMyVmtJSFJ2SUhSb2IzTmxJR0poWTJ0bFpDQjNhWFJvSUZWU1RITmNiaUFxSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnZDJobGNtVnBiaUIwYUdVZ2NHOXpkR1ZrSUhaaGJIVmxJR05oYmlCaVpTQmhibmxjYmlBcUlDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ1NsTlBUaUJ6WlhKcFlXeHBlbUZpYkdVZ2IySnFaV04wTGx4dUlDb2dRSEpsZEhWeWJpQndjbTl0YVhObElHWnZjaUIwYUdVZ2NtVjBkWEp1SUhaaGJIVmxYRzRnS2k5Y2JpOHZJR0p2ZFc1a0lHeHZZMkZzYkhrZ1ltVmpZWFZ6WlNCcGRDQnBjeUIxYzJWa0lHSjVJRzkwYUdWeUlHMWxkR2h2WkhOY2JsRXViV0Z3Y0d4NUlEMGdMeThnV0ZoWUlFRnpJSEJ5YjNCdmMyVmtJR0o1SUZ3aVVtVmtjMkZ1WkhKdlhDSmNibEV1Y0c5emRDQTlJR1oxYm1OMGFXOXVJQ2h2WW1wbFkzUXNJRzVoYldVc0lHRnlaM01wSUh0Y2JpQWdJQ0J5WlhSMWNtNGdVU2h2WW1wbFkzUXBMbVJwYzNCaGRHTm9LRndpY0c5emRGd2lMQ0JiYm1GdFpTd2dZWEpuYzEwcE8xeHVmVHRjYmx4dVVISnZiV2x6WlM1d2NtOTBiM1I1Y0dVdWJXRndjR3g1SUQwZ0x5OGdXRmhZSUVGeklIQnliM0J2YzJWa0lHSjVJRndpVW1Wa2MyRnVaSEp2WENKY2JsQnliMjFwYzJVdWNISnZkRzkwZVhCbExuQnZjM1FnUFNCbWRXNWpkR2x2YmlBb2JtRnRaU3dnWVhKbmN5a2dlMXh1SUNBZ0lISmxkSFZ5YmlCMGFHbHpMbVJwYzNCaGRHTm9LRndpY0c5emRGd2lMQ0JiYm1GdFpTd2dZWEpuYzEwcE8xeHVmVHRjYmx4dUx5b3FYRzRnS2lCSmJuWnZhMlZ6SUdFZ2JXVjBhRzlrSUdsdUlHRWdablYwZFhKbElIUjFjbTR1WEc0Z0tpQkFjR0Z5WVcwZ2IySnFaV04wSUNBZ0lIQnliMjFwYzJVZ2IzSWdhVzF0WldScFlYUmxJSEpsWm1WeVpXNWpaU0JtYjNJZ2RHRnlaMlYwSUc5aWFtVmpkRnh1SUNvZ1FIQmhjbUZ0SUc1aGJXVWdJQ0FnSUNCdVlXMWxJRzltSUcxbGRHaHZaQ0IwYnlCcGJuWnZhMlZjYmlBcUlFQndZWEpoYlNBdUxpNWhjbWR6SUNBZ1lYSnlZWGtnYjJZZ2FXNTJiMk5oZEdsdmJpQmhjbWQxYldWdWRITmNiaUFxSUVCeVpYUjFjbTRnY0hKdmJXbHpaU0JtYjNJZ2RHaGxJSEpsZEhWeWJpQjJZV3gxWlZ4dUlDb3ZYRzVSTG5ObGJtUWdQU0F2THlCWVdGZ2dUV0Z5YXlCTmFXeHNaWEluY3lCd2NtOXdiM05sWkNCd1lYSnNZVzVqWlZ4dVVTNXRZMkZzYkNBOUlDOHZJRmhZV0NCQmN5QndjbTl3YjNObFpDQmllU0JjSWxKbFpITmhibVJ5YjF3aVhHNVJMbWx1ZG05clpTQTlJR1oxYm1OMGFXOXVJQ2h2WW1wbFkzUXNJRzVoYldVZ0x5b3VMaTVoY21kektpOHBJSHRjYmlBZ0lDQnlaWFIxY200Z1VTaHZZbXBsWTNRcExtUnBjM0JoZEdOb0tGd2ljRzl6ZEZ3aUxDQmJibUZ0WlN3Z1lYSnlZWGxmYzJ4cFkyVW9ZWEpuZFcxbGJuUnpMQ0F5S1YwcE8xeHVmVHRjYmx4dVVISnZiV2x6WlM1d2NtOTBiM1I1Y0dVdWMyVnVaQ0E5SUM4dklGaFlXQ0JOWVhKcklFMXBiR3hsY2lkeklIQnliM0J2YzJWa0lIQmhjbXhoYm1ObFhHNVFjbTl0YVhObExuQnliM1J2ZEhsd1pTNXRZMkZzYkNBOUlDOHZJRmhZV0NCQmN5QndjbTl3YjNObFpDQmllU0JjSWxKbFpITmhibVJ5YjF3aVhHNVFjbTl0YVhObExuQnliM1J2ZEhsd1pTNXBiblp2YTJVZ1BTQm1kVzVqZEdsdmJpQW9ibUZ0WlNBdktpNHVMbUZ5WjNNcUx5a2dlMXh1SUNBZ0lISmxkSFZ5YmlCMGFHbHpMbVJwYzNCaGRHTm9LRndpY0c5emRGd2lMQ0JiYm1GdFpTd2dZWEp5WVhsZmMyeHBZMlVvWVhKbmRXMWxiblJ6TENBeEtWMHBPMXh1ZlR0Y2JseHVMeW9xWEc0Z0tpQkJjSEJzYVdWeklIUm9aU0J3Y205dGFYTmxaQ0JtZFc1amRHbHZiaUJwYmlCaElHWjFkSFZ5WlNCMGRYSnVMbHh1SUNvZ1FIQmhjbUZ0SUc5aWFtVmpkQ0FnSUNCd2NtOXRhWE5sSUc5eUlHbHRiV1ZrYVdGMFpTQnlaV1psY21WdVkyVWdabTl5SUhSaGNtZGxkQ0JtZFc1amRHbHZibHh1SUNvZ1FIQmhjbUZ0SUdGeVozTWdJQ0FnSUNCaGNuSmhlU0J2WmlCaGNIQnNhV05oZEdsdmJpQmhjbWQxYldWdWRITmNiaUFxTDF4dVVTNW1ZWEJ3YkhrZ1BTQm1kVzVqZEdsdmJpQW9iMkpxWldOMExDQmhjbWR6S1NCN1hHNGdJQ0FnY21WMGRYSnVJRkVvYjJKcVpXTjBLUzVrYVhOd1lYUmphQ2hjSW1Gd2NHeDVYQ0lzSUZ0MmIybGtJREFzSUdGeVozTmRLVHRjYm4wN1hHNWNibEJ5YjIxcGMyVXVjSEp2ZEc5MGVYQmxMbVpoY0hCc2VTQTlJR1oxYm1OMGFXOXVJQ2hoY21kektTQjdYRzRnSUNBZ2NtVjBkWEp1SUhSb2FYTXVaR2x6Y0dGMFkyZ29YQ0poY0hCc2VWd2lMQ0JiZG05cFpDQXdMQ0JoY21kelhTazdYRzU5TzF4dVhHNHZLaXBjYmlBcUlFTmhiR3h6SUhSb1pTQndjbTl0YVhObFpDQm1kVzVqZEdsdmJpQnBiaUJoSUdaMWRIVnlaU0IwZFhKdUxseHVJQ29nUUhCaGNtRnRJRzlpYW1WamRDQWdJQ0J3Y205dGFYTmxJRzl5SUdsdGJXVmthV0YwWlNCeVpXWmxjbVZ1WTJVZ1ptOXlJSFJoY21kbGRDQm1kVzVqZEdsdmJseHVJQ29nUUhCaGNtRnRJQzR1TG1GeVozTWdJQ0JoY25KaGVTQnZaaUJoY0hCc2FXTmhkR2x2YmlCaGNtZDFiV1Z1ZEhOY2JpQXFMMXh1VVZ0Y0luUnllVndpWFNBOVhHNVJMbVpqWVd4c0lEMGdablZ1WTNScGIyNGdLRzlpYW1WamRDQXZLaUF1TGk1aGNtZHpLaThwSUh0Y2JpQWdJQ0J5WlhSMWNtNGdVU2h2WW1wbFkzUXBMbVJwYzNCaGRHTm9LRndpWVhCd2JIbGNJaXdnVzNadmFXUWdNQ3dnWVhKeVlYbGZjMnhwWTJVb1lYSm5kVzFsYm5SekxDQXhLVjBwTzF4dWZUdGNibHh1VUhKdmJXbHpaUzV3Y205MGIzUjVjR1V1Wm1OaGJHd2dQU0JtZFc1amRHbHZiaUFvTHlvdUxpNWhjbWR6S2k4cElIdGNiaUFnSUNCeVpYUjFjbTRnZEdocGN5NWthWE53WVhSamFDaGNJbUZ3Y0d4NVhDSXNJRnQyYjJsa0lEQXNJR0Z5Y21GNVgzTnNhV05sS0dGeVozVnRaVzUwY3lsZEtUdGNibjA3WEc1Y2JpOHFLbHh1SUNvZ1FtbHVaSE1nZEdobElIQnliMjFwYzJWa0lHWjFibU4wYVc5dUxDQjBjbUZ1YzJadmNtMXBibWNnY21WMGRYSnVJSFpoYkhWbGN5QnBiblJ2SUdFZ1puVnNabWxzYkdWa1hHNGdLaUJ3Y205dGFYTmxJR0Z1WkNCMGFISnZkMjRnWlhKeWIzSnpJR2x1ZEc4Z1lTQnlaV3BsWTNSbFpDQnZibVV1WEc0Z0tpQkFjR0Z5WVcwZ2IySnFaV04wSUNBZ0lIQnliMjFwYzJVZ2IzSWdhVzF0WldScFlYUmxJSEpsWm1WeVpXNWpaU0JtYjNJZ2RHRnlaMlYwSUdaMWJtTjBhVzl1WEc0Z0tpQkFjR0Z5WVcwZ0xpNHVZWEpuY3lBZ0lHRnljbUY1SUc5bUlHRndjR3hwWTJGMGFXOXVJR0Z5WjNWdFpXNTBjMXh1SUNvdlhHNVJMbVppYVc1a0lEMGdablZ1WTNScGIyNGdLRzlpYW1WamRDQXZLaTR1TG1GeVozTXFMeWtnZTF4dUlDQWdJSFpoY2lCd2NtOXRhWE5sSUQwZ1VTaHZZbXBsWTNRcE8xeHVJQ0FnSUhaaGNpQmhjbWR6SUQwZ1lYSnlZWGxmYzJ4cFkyVW9ZWEpuZFcxbGJuUnpMQ0F4S1R0Y2JpQWdJQ0J5WlhSMWNtNGdablZ1WTNScGIyNGdabUp2ZFc1a0tDa2dlMXh1SUNBZ0lDQWdJQ0J5WlhSMWNtNGdjSEp2YldselpTNWthWE53WVhSamFDaGNJbUZ3Y0d4NVhDSXNJRnRjYmlBZ0lDQWdJQ0FnSUNBZ0lIUm9hWE1zWEc0Z0lDQWdJQ0FnSUNBZ0lDQmhjbWR6TG1OdmJtTmhkQ2hoY25KaGVWOXpiR2xqWlNoaGNtZDFiV1Z1ZEhNcEtWeHVJQ0FnSUNBZ0lDQmRLVHRjYmlBZ0lDQjlPMXh1ZlR0Y2JsQnliMjFwYzJVdWNISnZkRzkwZVhCbExtWmlhVzVrSUQwZ1puVnVZM1JwYjI0Z0tDOHFMaTR1WVhKbmN5b3ZLU0I3WEc0Z0lDQWdkbUZ5SUhCeWIyMXBjMlVnUFNCMGFHbHpPMXh1SUNBZ0lIWmhjaUJoY21keklEMGdZWEp5WVhsZmMyeHBZMlVvWVhKbmRXMWxiblJ6S1R0Y2JpQWdJQ0J5WlhSMWNtNGdablZ1WTNScGIyNGdabUp2ZFc1a0tDa2dlMXh1SUNBZ0lDQWdJQ0J5WlhSMWNtNGdjSEp2YldselpTNWthWE53WVhSamFDaGNJbUZ3Y0d4NVhDSXNJRnRjYmlBZ0lDQWdJQ0FnSUNBZ0lIUm9hWE1zWEc0Z0lDQWdJQ0FnSUNBZ0lDQmhjbWR6TG1OdmJtTmhkQ2hoY25KaGVWOXpiR2xqWlNoaGNtZDFiV1Z1ZEhNcEtWeHVJQ0FnSUNBZ0lDQmRLVHRjYmlBZ0lDQjlPMXh1ZlR0Y2JseHVMeW9xWEc0Z0tpQlNaWEYxWlhOMGN5QjBhR1VnYm1GdFpYTWdiMllnZEdobElHOTNibVZrSUhCeWIzQmxjblJwWlhNZ2IyWWdZU0J3Y205dGFYTmxaRnh1SUNvZ2IySnFaV04wSUdsdUlHRWdablYwZFhKbElIUjFjbTR1WEc0Z0tpQkFjR0Z5WVcwZ2IySnFaV04wSUNBZ0lIQnliMjFwYzJVZ2IzSWdhVzF0WldScFlYUmxJSEpsWm1WeVpXNWpaU0JtYjNJZ2RHRnlaMlYwSUc5aWFtVmpkRnh1SUNvZ1FISmxkSFZ5YmlCd2NtOXRhWE5sSUdadmNpQjBhR1VnYTJWNWN5QnZaaUIwYUdVZ1pYWmxiblIxWVd4c2VTQnpaWFIwYkdWa0lHOWlhbVZqZEZ4dUlDb3ZYRzVSTG10bGVYTWdQU0JtZFc1amRHbHZiaUFvYjJKcVpXTjBLU0I3WEc0Z0lDQWdjbVYwZFhKdUlGRW9iMkpxWldOMEtTNWthWE53WVhSamFDaGNJbXRsZVhOY0lpd2dXMTBwTzF4dWZUdGNibHh1VUhKdmJXbHpaUzV3Y205MGIzUjVjR1V1YTJWNWN5QTlJR1oxYm1OMGFXOXVJQ2dwSUh0Y2JpQWdJQ0J5WlhSMWNtNGdkR2hwY3k1a2FYTndZWFJqYUNoY0ltdGxlWE5jSWl3Z1cxMHBPMXh1ZlR0Y2JseHVMeW9xWEc0Z0tpQlVkWEp1Y3lCaGJpQmhjbkpoZVNCdlppQndjbTl0YVhObGN5QnBiblJ2SUdFZ2NISnZiV2x6WlNCbWIzSWdZVzRnWVhKeVlYa3VJQ0JKWmlCaGJua2diMlpjYmlBcUlIUm9aU0J3Y205dGFYTmxjeUJuWlhSeklISmxhbVZqZEdWa0xDQjBhR1VnZDJodmJHVWdZWEp5WVhrZ2FYTWdjbVZxWldOMFpXUWdhVzF0WldScFlYUmxiSGt1WEc0Z0tpQkFjR0Z5WVcwZ2UwRnljbUY1S24wZ1lXNGdZWEp5WVhrZ0tHOXlJSEJ5YjIxcGMyVWdabTl5SUdGdUlHRnljbUY1S1NCdlppQjJZV3gxWlhNZ0tHOXlYRzRnS2lCd2NtOXRhWE5sY3lCbWIzSWdkbUZzZFdWektWeHVJQ29nUUhKbGRIVnlibk1nWVNCd2NtOXRhWE5sSUdadmNpQmhiaUJoY25KaGVTQnZaaUIwYUdVZ1kyOXljbVZ6Y0c5dVpHbHVaeUIyWVd4MVpYTmNiaUFxTDF4dUx5OGdRbmtnVFdGeWF5Qk5hV3hzWlhKY2JpOHZJR2gwZEhBNkx5OTNhV3RwTG1WamJXRnpZM0pwY0hRdWIzSm5MMlJ2YTNVdWNHaHdQMmxrUFhOMGNtRjNiV0Z1T21OdmJtTjFjbkpsYm1ONUpuSmxkajB4TXpBNE56YzJOVEl4STJGc2JHWjFiR1pwYkd4bFpGeHVVUzVoYkd3Z1BTQmhiR3c3WEc1bWRXNWpkR2x2YmlCaGJHd29jSEp2YldselpYTXBJSHRjYmlBZ0lDQnlaWFIxY200Z2QyaGxiaWh3Y205dGFYTmxjeXdnWm5WdVkzUnBiMjRnS0hCeWIyMXBjMlZ6S1NCN1hHNGdJQ0FnSUNBZ0lIWmhjaUJ3Wlc1a2FXNW5RMjkxYm5RZ1BTQXdPMXh1SUNBZ0lDQWdJQ0IyWVhJZ1pHVm1aWEp5WldRZ1BTQmtaV1psY2lncE8xeHVJQ0FnSUNBZ0lDQmhjbkpoZVY5eVpXUjFZMlVvY0hKdmJXbHpaWE1zSUdaMWJtTjBhVzl1SUNoMWJtUmxabWx1WldRc0lIQnliMjFwYzJVc0lHbHVaR1Y0S1NCN1hHNGdJQ0FnSUNBZ0lDQWdJQ0IyWVhJZ2MyNWhjSE5vYjNRN1hHNGdJQ0FnSUNBZ0lDQWdJQ0JwWmlBb1hHNGdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ2FYTlFjbTl0YVhObEtIQnliMjFwYzJVcElDWW1YRzRnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdLSE51WVhCemFHOTBJRDBnY0hKdmJXbHpaUzVwYm5Od1pXTjBLQ2twTG5OMFlYUmxJRDA5UFNCY0ltWjFiR1pwYkd4bFpGd2lYRzRnSUNBZ0lDQWdJQ0FnSUNBcElIdGNiaUFnSUNBZ0lDQWdJQ0FnSUNBZ0lDQndjbTl0YVhObGMxdHBibVJsZUYwZ1BTQnpibUZ3YzJodmRDNTJZV3gxWlR0Y2JpQWdJQ0FnSUNBZ0lDQWdJSDBnWld4elpTQjdYRzRnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdLeXR3Wlc1a2FXNW5RMjkxYm5RN1hHNGdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ2QyaGxiaWhjYmlBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ2NISnZiV2x6WlN4Y2JpQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdablZ1WTNScGIyNGdLSFpoYkhWbEtTQjdYRzRnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQndjbTl0YVhObGMxdHBibVJsZUYwZ1BTQjJZV3gxWlR0Y2JpQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUdsbUlDZ3RMWEJsYm1ScGJtZERiM1Z1ZENBOVBUMGdNQ2tnZTF4dUlDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lHUmxabVZ5Y21Wa0xuSmxjMjlzZG1Vb2NISnZiV2x6WlhNcE8xeHVJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ2ZWeHVJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0I5TEZ4dUlDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQmtaV1psY25KbFpDNXlaV3BsWTNRc1hHNGdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJR1oxYm1OMGFXOXVJQ2h3Y205bmNtVnpjeWtnZTF4dUlDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnWkdWbVpYSnlaV1F1Ym05MGFXWjVLSHNnYVc1a1pYZzZJR2x1WkdWNExDQjJZV3gxWlRvZ2NISnZaM0psYzNNZ2ZTazdYRzRnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUgxY2JpQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBcE8xeHVJQ0FnSUNBZ0lDQWdJQ0FnZlZ4dUlDQWdJQ0FnSUNCOUxDQjJiMmxrSURBcE8xeHVJQ0FnSUNBZ0lDQnBaaUFvY0dWdVpHbHVaME52ZFc1MElEMDlQU0F3S1NCN1hHNGdJQ0FnSUNBZ0lDQWdJQ0JrWldabGNuSmxaQzV5WlhOdmJIWmxLSEJ5YjIxcGMyVnpLVHRjYmlBZ0lDQWdJQ0FnZlZ4dUlDQWdJQ0FnSUNCeVpYUjFjbTRnWkdWbVpYSnlaV1F1Y0hKdmJXbHpaVHRjYmlBZ0lDQjlLVHRjYm4xY2JseHVVSEp2YldselpTNXdjbTkwYjNSNWNHVXVZV3hzSUQwZ1puVnVZM1JwYjI0Z0tDa2dlMXh1SUNBZ0lISmxkSFZ5YmlCaGJHd29kR2hwY3lrN1hHNTlPMXh1WEc0dktpcGNiaUFxSUZKbGRIVnlibk1nZEdobElHWnBjbk4wSUhKbGMyOXNkbVZrSUhCeWIyMXBjMlVnYjJZZ1lXNGdZWEp5WVhrdUlGQnlhVzl5SUhKbGFtVmpkR1ZrSUhCeWIyMXBjMlZ6SUdGeVpWeHVJQ29nYVdkdWIzSmxaQzRnSUZKbGFtVmpkSE1nYjI1c2VTQnBaaUJoYkd3Z2NISnZiV2x6WlhNZ1lYSmxJSEpsYW1WamRHVmtMbHh1SUNvZ1FIQmhjbUZ0SUh0QmNuSmhlU3A5SUdGdUlHRnljbUY1SUdOdmJuUmhhVzVwYm1jZ2RtRnNkV1Z6SUc5eUlIQnliMjFwYzJWeklHWnZjaUIyWVd4MVpYTmNiaUFxSUVCeVpYUjFjbTV6SUdFZ2NISnZiV2x6WlNCbWRXeG1hV3hzWldRZ2QybDBhQ0IwYUdVZ2RtRnNkV1VnYjJZZ2RHaGxJR1pwY25OMElISmxjMjlzZG1Wa0lIQnliMjFwYzJVc1hHNGdLaUJ2Y2lCaElISmxhbVZqZEdWa0lIQnliMjFwYzJVZ2FXWWdZV3hzSUhCeWIyMXBjMlZ6SUdGeVpTQnlaV3BsWTNSbFpDNWNiaUFxTDF4dVVTNWhibmtnUFNCaGJuazdYRzVjYm1aMWJtTjBhVzl1SUdGdWVTaHdjbTl0YVhObGN5a2dlMXh1SUNBZ0lHbG1JQ2h3Y205dGFYTmxjeTVzWlc1bmRHZ2dQVDA5SURBcElIdGNiaUFnSUNBZ0lDQWdjbVYwZFhKdUlGRXVjbVZ6YjJ4MlpTZ3BPMXh1SUNBZ0lIMWNibHh1SUNBZ0lIWmhjaUJrWldabGNuSmxaQ0E5SUZFdVpHVm1aWElvS1R0Y2JpQWdJQ0IyWVhJZ2NHVnVaR2x1WjBOdmRXNTBJRDBnTUR0Y2JpQWdJQ0JoY25KaGVWOXlaV1IxWTJVb2NISnZiV2x6WlhNc0lHWjFibU4wYVc5dUlDaHdjbVYyTENCamRYSnlaVzUwTENCcGJtUmxlQ2tnZTF4dUlDQWdJQ0FnSUNCMllYSWdjSEp2YldselpTQTlJSEJ5YjIxcGMyVnpXMmx1WkdWNFhUdGNibHh1SUNBZ0lDQWdJQ0J3Wlc1a2FXNW5RMjkxYm5Rckt6dGNibHh1SUNBZ0lDQWdJQ0IzYUdWdUtIQnliMjFwYzJVc0lHOXVSblZzWm1sc2JHVmtMQ0J2YmxKbGFtVmpkR1ZrTENCdmJsQnliMmR5WlhOektUdGNiaUFnSUNBZ0lDQWdablZ1WTNScGIyNGdiMjVHZFd4bWFXeHNaV1FvY21WemRXeDBLU0I3WEc0Z0lDQWdJQ0FnSUNBZ0lDQmtaV1psY25KbFpDNXlaWE52YkhabEtISmxjM1ZzZENrN1hHNGdJQ0FnSUNBZ0lIMWNiaUFnSUNBZ0lDQWdablZ1WTNScGIyNGdiMjVTWldwbFkzUmxaQ2dwSUh0Y2JpQWdJQ0FnSUNBZ0lDQWdJSEJsYm1ScGJtZERiM1Z1ZEMwdE8xeHVJQ0FnSUNBZ0lDQWdJQ0FnYVdZZ0tIQmxibVJwYm1kRGIzVnVkQ0E5UFQwZ01Da2dlMXh1SUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJR1JsWm1WeWNtVmtMbkpsYW1WamRDaHVaWGNnUlhKeWIzSW9YRzRnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUZ3aVEyRnVKM1FnWjJWMElHWjFiR1pwYkd4dFpXNTBJSFpoYkhWbElHWnliMjBnWVc1NUlIQnliMjFwYzJVc0lHRnNiQ0JjSWlBclhHNGdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJRndpY0hKdmJXbHpaWE1nZDJWeVpTQnlaV3BsWTNSbFpDNWNJbHh1SUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ2twTzF4dUlDQWdJQ0FnSUNBZ0lDQWdmVnh1SUNBZ0lDQWdJQ0I5WEc0Z0lDQWdJQ0FnSUdaMWJtTjBhVzl1SUc5dVVISnZaM0psYzNNb2NISnZaM0psYzNNcElIdGNiaUFnSUNBZ0lDQWdJQ0FnSUdSbFptVnljbVZrTG01dmRHbG1lU2g3WEc0Z0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnYVc1a1pYZzZJR2x1WkdWNExGeHVJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lIWmhiSFZsT2lCd2NtOW5jbVZ6YzF4dUlDQWdJQ0FnSUNBZ0lDQWdmU2s3WEc0Z0lDQWdJQ0FnSUgxY2JpQWdJQ0I5TENCMWJtUmxabWx1WldRcE8xeHVYRzRnSUNBZ2NtVjBkWEp1SUdSbFptVnljbVZrTG5CeWIyMXBjMlU3WEc1OVhHNWNibEJ5YjIxcGMyVXVjSEp2ZEc5MGVYQmxMbUZ1ZVNBOUlHWjFibU4wYVc5dUlDZ3BJSHRjYmlBZ0lDQnlaWFIxY200Z1lXNTVLSFJvYVhNcE8xeHVmVHRjYmx4dUx5b3FYRzRnS2lCWFlXbDBjeUJtYjNJZ1lXeHNJSEJ5YjIxcGMyVnpJSFJ2SUdKbElITmxkSFJzWldRc0lHVnBkR2hsY2lCbWRXeG1hV3hzWldRZ2IzSmNiaUFxSUhKbGFtVmpkR1ZrTGlBZ1ZHaHBjeUJwY3lCa2FYTjBhVzVqZENCbWNtOXRJR0JoYkd4Z0lITnBibU5sSUhSb1lYUWdkMjkxYkdRZ2MzUnZjRnh1SUNvZ2QyRnBkR2x1WnlCaGRDQjBhR1VnWm1seWMzUWdjbVZxWldOMGFXOXVMaUFnVkdobElIQnliMjFwYzJVZ2NtVjBkWEp1WldRZ1lubGNiaUFxSUdCaGJHeFNaWE52YkhabFpHQWdkMmxzYkNCdVpYWmxjaUJpWlNCeVpXcGxZM1JsWkM1Y2JpQXFJRUJ3WVhKaGJTQndjbTl0YVhObGN5QmhJSEJ5YjIxcGMyVWdabTl5SUdGdUlHRnljbUY1SUNodmNpQmhiaUJoY25KaGVTa2diMllnY0hKdmJXbHpaWE5jYmlBcUlDaHZjaUIyWVd4MVpYTXBYRzRnS2lCQWNtVjBkWEp1SUdFZ2NISnZiV2x6WlNCbWIzSWdZVzRnWVhKeVlYa2diMllnY0hKdmJXbHpaWE5jYmlBcUwxeHVVUzVoYkd4U1pYTnZiSFpsWkNBOUlHUmxjSEpsWTJGMFpTaGhiR3hTWlhOdmJIWmxaQ3dnWENKaGJHeFNaWE52YkhabFpGd2lMQ0JjSW1Gc2JGTmxkSFJzWldSY0lpazdYRzVtZFc1amRHbHZiaUJoYkd4U1pYTnZiSFpsWkNod2NtOXRhWE5sY3lrZ2UxeHVJQ0FnSUhKbGRIVnliaUIzYUdWdUtIQnliMjFwYzJWekxDQm1kVzVqZEdsdmJpQW9jSEp2YldselpYTXBJSHRjYmlBZ0lDQWdJQ0FnY0hKdmJXbHpaWE1nUFNCaGNuSmhlVjl0WVhBb2NISnZiV2x6WlhNc0lGRXBPMXh1SUNBZ0lDQWdJQ0J5WlhSMWNtNGdkMmhsYmloaGJHd29ZWEp5WVhsZmJXRndLSEJ5YjIxcGMyVnpMQ0JtZFc1amRHbHZiaUFvY0hKdmJXbHpaU2tnZTF4dUlDQWdJQ0FnSUNBZ0lDQWdjbVYwZFhKdUlIZG9aVzRvY0hKdmJXbHpaU3dnYm05dmNDd2dibTl2Y0NrN1hHNGdJQ0FnSUNBZ0lIMHBLU3dnWm5WdVkzUnBiMjRnS0NrZ2UxeHVJQ0FnSUNBZ0lDQWdJQ0FnY21WMGRYSnVJSEJ5YjIxcGMyVnpPMXh1SUNBZ0lDQWdJQ0I5S1R0Y2JpQWdJQ0I5S1R0Y2JuMWNibHh1VUhKdmJXbHpaUzV3Y205MGIzUjVjR1V1WVd4c1VtVnpiMngyWldRZ1BTQm1kVzVqZEdsdmJpQW9LU0I3WEc0Z0lDQWdjbVYwZFhKdUlHRnNiRkpsYzI5c2RtVmtLSFJvYVhNcE8xeHVmVHRjYmx4dUx5b3FYRzRnS2lCQWMyVmxJRkJ5YjIxcGMyVWpZV3hzVTJWMGRHeGxaRnh1SUNvdlhHNVJMbUZzYkZObGRIUnNaV1FnUFNCaGJHeFRaWFIwYkdWa08xeHVablZ1WTNScGIyNGdZV3hzVTJWMGRHeGxaQ2h3Y205dGFYTmxjeWtnZTF4dUlDQWdJSEpsZEhWeWJpQlJLSEJ5YjIxcGMyVnpLUzVoYkd4VFpYUjBiR1ZrS0NrN1hHNTlYRzVjYmk4cUtseHVJQ29nVkhWeWJuTWdZVzRnWVhKeVlYa2diMllnY0hKdmJXbHpaWE1nYVc1MGJ5QmhJSEJ5YjIxcGMyVWdabTl5SUdGdUlHRnljbUY1SUc5bUlIUm9aV2x5SUhOMFlYUmxjeUFvWVhOY2JpQXFJSEpsZEhWeWJtVmtJR0o1SUdCcGJuTndaV04wWUNrZ2QyaGxiaUIwYUdWNUlHaGhkbVVnWVd4c0lITmxkSFJzWldRdVhHNGdLaUJBY0dGeVlXMGdlMEZ5Y21GNVcwRnVlU3BkZlNCMllXeDFaWE1nWVc0Z1lYSnlZWGtnS0c5eUlIQnliMjFwYzJVZ1ptOXlJR0Z1SUdGeWNtRjVLU0J2WmlCMllXeDFaWE1nS0c5eVhHNGdLaUJ3Y205dGFYTmxjeUJtYjNJZ2RtRnNkV1Z6S1Z4dUlDb2dRSEpsZEhWeWJuTWdlMEZ5Y21GNVcxTjBZWFJsWFgwZ1lXNGdZWEp5WVhrZ2IyWWdjM1JoZEdWeklHWnZjaUIwYUdVZ2NtVnpjR1ZqZEdsMlpTQjJZV3gxWlhNdVhHNGdLaTljYmxCeWIyMXBjMlV1Y0hKdmRHOTBlWEJsTG1Gc2JGTmxkSFJzWldRZ1BTQm1kVzVqZEdsdmJpQW9LU0I3WEc0Z0lDQWdjbVYwZFhKdUlIUm9hWE11ZEdobGJpaG1kVzVqZEdsdmJpQW9jSEp2YldselpYTXBJSHRjYmlBZ0lDQWdJQ0FnY21WMGRYSnVJR0ZzYkNoaGNuSmhlVjl0WVhBb2NISnZiV2x6WlhNc0lHWjFibU4wYVc5dUlDaHdjbTl0YVhObEtTQjdYRzRnSUNBZ0lDQWdJQ0FnSUNCd2NtOXRhWE5sSUQwZ1VTaHdjbTl0YVhObEtUdGNiaUFnSUNBZ0lDQWdJQ0FnSUdaMWJtTjBhVzl1SUhKbFoyRnlaR3hsYzNNb0tTQjdYRzRnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdjbVYwZFhKdUlIQnliMjFwYzJVdWFXNXpjR1ZqZENncE8xeHVJQ0FnSUNBZ0lDQWdJQ0FnZlZ4dUlDQWdJQ0FnSUNBZ0lDQWdjbVYwZFhKdUlIQnliMjFwYzJVdWRHaGxiaWh5WldkaGNtUnNaWE56TENCeVpXZGhjbVJzWlhOektUdGNiaUFnSUNBZ0lDQWdmU2twTzF4dUlDQWdJSDBwTzF4dWZUdGNibHh1THlvcVhHNGdLaUJEWVhCMGRYSmxjeUIwYUdVZ1ptRnBiSFZ5WlNCdlppQmhJSEJ5YjIxcGMyVXNJR2RwZG1sdVp5QmhiaUJ2Y0c5eWRIVnVhWFI1SUhSdklISmxZMjkyWlhKY2JpQXFJSGRwZEdnZ1lTQmpZV3hzWW1GamF5NGdJRWxtSUhSb1pTQm5hWFpsYmlCd2NtOXRhWE5sSUdseklHWjFiR1pwYkd4bFpDd2dkR2hsSUhKbGRIVnlibVZrWEc0Z0tpQndjbTl0YVhObElHbHpJR1oxYkdacGJHeGxaQzVjYmlBcUlFQndZWEpoYlNCN1FXNTVLbjBnY0hKdmJXbHpaU0JtYjNJZ2MyOXRaWFJvYVc1blhHNGdLaUJBY0dGeVlXMGdlMFoxYm1OMGFXOXVmU0JqWVd4c1ltRmpheUIwYnlCbWRXeG1hV3hzSUhSb1pTQnlaWFIxY201bFpDQndjbTl0YVhObElHbG1JSFJvWlZ4dUlDb2daMmwyWlc0Z2NISnZiV2x6WlNCcGN5QnlaV3BsWTNSbFpGeHVJQ29nUUhKbGRIVnlibk1nWVNCd2NtOXRhWE5sSUdadmNpQjBhR1VnY21WMGRYSnVJSFpoYkhWbElHOW1JSFJvWlNCallXeHNZbUZqYTF4dUlDb3ZYRzVSTG1aaGFXd2dQU0F2THlCWVdGZ2diR1ZuWVdONVhHNVJXMXdpWTJGMFkyaGNJbDBnUFNCbWRXNWpkR2x2YmlBb2IySnFaV04wTENCeVpXcGxZM1JsWkNrZ2UxeHVJQ0FnSUhKbGRIVnliaUJSS0c5aWFtVmpkQ2t1ZEdobGJpaDJiMmxrSURBc0lISmxhbVZqZEdWa0tUdGNibjA3WEc1Y2JsQnliMjFwYzJVdWNISnZkRzkwZVhCbExtWmhhV3dnUFNBdkx5QllXRmdnYkdWbllXTjVYRzVRY205dGFYTmxMbkJ5YjNSdmRIbHdaVnRjSW1OaGRHTm9YQ0pkSUQwZ1puVnVZM1JwYjI0Z0tISmxhbVZqZEdWa0tTQjdYRzRnSUNBZ2NtVjBkWEp1SUhSb2FYTXVkR2hsYmloMmIybGtJREFzSUhKbGFtVmpkR1ZrS1R0Y2JuMDdYRzVjYmk4cUtseHVJQ29nUVhSMFlXTm9aWE1nWVNCc2FYTjBaVzVsY2lCMGFHRjBJR05oYmlCeVpYTndiMjVrSUhSdklIQnliMmR5WlhOeklHNXZkR2xtYVdOaGRHbHZibk1nWm5KdmJTQmhYRzRnS2lCd2NtOXRhWE5sSjNNZ2IzSnBaMmx1WVhScGJtY2daR1ZtWlhKeVpXUXVJRlJvYVhNZ2JHbHpkR1Z1WlhJZ2NtVmpaV2wyWlhNZ2RHaGxJR1Y0WVdOMElHRnlaM1Z0Wlc1MGMxeHVJQ29nY0dGemMyVmtJSFJ2SUdCZ1pHVm1aWEp5WldRdWJtOTBhV1o1WUdBdVhHNGdLaUJBY0dGeVlXMGdlMEZ1ZVNwOUlIQnliMjFwYzJVZ1ptOXlJSE52YldWMGFHbHVaMXh1SUNvZ1FIQmhjbUZ0SUh0R2RXNWpkR2x2Ym4wZ1kyRnNiR0poWTJzZ2RHOGdjbVZqWldsMlpTQmhibmtnY0hKdlozSmxjM01nYm05MGFXWnBZMkYwYVc5dWMxeHVJQ29nUUhKbGRIVnlibk1nZEdobElHZHBkbVZ1SUhCeWIyMXBjMlVzSUhWdVkyaGhibWRsWkZ4dUlDb3ZYRzVSTG5CeWIyZHlaWE56SUQwZ2NISnZaM0psYzNNN1hHNW1kVzVqZEdsdmJpQndjbTluY21WemN5aHZZbXBsWTNRc0lIQnliMmR5WlhOelpXUXBJSHRjYmlBZ0lDQnlaWFIxY200Z1VTaHZZbXBsWTNRcExuUm9aVzRvZG05cFpDQXdMQ0IyYjJsa0lEQXNJSEJ5YjJkeVpYTnpaV1FwTzF4dWZWeHVYRzVRY205dGFYTmxMbkJ5YjNSdmRIbHdaUzV3Y205bmNtVnpjeUE5SUdaMWJtTjBhVzl1SUNod2NtOW5jbVZ6YzJWa0tTQjdYRzRnSUNBZ2NtVjBkWEp1SUhSb2FYTXVkR2hsYmloMmIybGtJREFzSUhadmFXUWdNQ3dnY0hKdlozSmxjM05sWkNrN1hHNTlPMXh1WEc0dktpcGNiaUFxSUZCeWIzWnBaR1Z6SUdGdUlHOXdjRzl5ZEhWdWFYUjVJSFJ2SUc5aWMyVnlkbVVnZEdobElITmxkSFJzYVc1bklHOW1JR0VnY0hKdmJXbHpaU3hjYmlBcUlISmxaMkZ5Wkd4bGMzTWdiMllnZDJobGRHaGxjaUIwYUdVZ2NISnZiV2x6WlNCcGN5Qm1kV3htYVd4c1pXUWdiM0lnY21WcVpXTjBaV1F1SUNCR2IzSjNZWEprYzF4dUlDb2dkR2hsSUhKbGMyOXNkWFJwYjI0Z2RHOGdkR2hsSUhKbGRIVnlibVZrSUhCeWIyMXBjMlVnZDJobGJpQjBhR1VnWTJGc2JHSmhZMnNnYVhNZ1pHOXVaUzVjYmlBcUlGUm9aU0JqWVd4c1ltRmpheUJqWVc0Z2NtVjBkWEp1SUdFZ2NISnZiV2x6WlNCMGJ5QmtaV1psY2lCamIyMXdiR1YwYVc5dUxseHVJQ29nUUhCaGNtRnRJSHRCYm5rcWZTQndjbTl0YVhObFhHNGdLaUJBY0dGeVlXMGdlMFoxYm1OMGFXOXVmU0JqWVd4c1ltRmpheUIwYnlCdlluTmxjblpsSUhSb1pTQnlaWE52YkhWMGFXOXVJRzltSUhSb1pTQm5hWFpsYmx4dUlDb2djSEp2YldselpTd2dkR0ZyWlhNZ2JtOGdZWEpuZFcxbGJuUnpMbHh1SUNvZ1FISmxkSFZ5Ym5NZ1lTQndjbTl0YVhObElHWnZjaUIwYUdVZ2NtVnpiMngxZEdsdmJpQnZaaUIwYUdVZ1oybDJaVzRnY0hKdmJXbHpaU0IzYUdWdVhHNGdLaUJnWUdacGJtQmdJR2x6SUdSdmJtVXVYRzRnS2k5Y2JsRXVabWx1SUQwZ0x5OGdXRmhZSUd4bFoyRmplVnh1VVZ0Y0ltWnBibUZzYkhsY0lsMGdQU0JtZFc1amRHbHZiaUFvYjJKcVpXTjBMQ0JqWVd4c1ltRmpheWtnZTF4dUlDQWdJSEpsZEhWeWJpQlJLRzlpYW1WamRDbGJYQ0ptYVc1aGJHeDVYQ0pkS0dOaGJHeGlZV05yS1R0Y2JuMDdYRzVjYmxCeWIyMXBjMlV1Y0hKdmRHOTBlWEJsTG1acGJpQTlJQzh2SUZoWVdDQnNaV2RoWTNsY2JsQnliMjFwYzJVdWNISnZkRzkwZVhCbFcxd2labWx1WVd4c2VWd2lYU0E5SUdaMWJtTjBhVzl1SUNoallXeHNZbUZqYXlrZ2UxeHVJQ0FnSUdOaGJHeGlZV05ySUQwZ1VTaGpZV3hzWW1GamF5azdYRzRnSUNBZ2NtVjBkWEp1SUhSb2FYTXVkR2hsYmlobWRXNWpkR2x2YmlBb2RtRnNkV1VwSUh0Y2JpQWdJQ0FnSUNBZ2NtVjBkWEp1SUdOaGJHeGlZV05yTG1aallXeHNLQ2t1ZEdobGJpaG1kVzVqZEdsdmJpQW9LU0I3WEc0Z0lDQWdJQ0FnSUNBZ0lDQnlaWFIxY200Z2RtRnNkV1U3WEc0Z0lDQWdJQ0FnSUgwcE8xeHVJQ0FnSUgwc0lHWjFibU4wYVc5dUlDaHlaV0Z6YjI0cElIdGNiaUFnSUNBZ0lDQWdMeThnVkU5RVR5QmhkSFJsYlhCMElIUnZJSEpsWTNsamJHVWdkR2hsSUhKbGFtVmpkR2x2YmlCM2FYUm9JRndpZEdocGMxd2lMbHh1SUNBZ0lDQWdJQ0J5WlhSMWNtNGdZMkZzYkdKaFkyc3VabU5oYkd3b0tTNTBhR1Z1S0daMWJtTjBhVzl1SUNncElIdGNiaUFnSUNBZ0lDQWdJQ0FnSUhSb2NtOTNJSEpsWVhOdmJqdGNiaUFnSUNBZ0lDQWdmU2s3WEc0Z0lDQWdmU2s3WEc1OU8xeHVYRzR2S2lwY2JpQXFJRlJsY20xcGJtRjBaWE1nWVNCamFHRnBiaUJ2WmlCd2NtOXRhWE5sY3l3Z1ptOXlZMmx1WnlCeVpXcGxZM1JwYjI1eklIUnZJR0psWEc0Z0tpQjBhSEp2ZDI0Z1lYTWdaWGhqWlhCMGFXOXVjeTVjYmlBcUlFQndZWEpoYlNCN1FXNTVLbjBnY0hKdmJXbHpaU0JoZENCMGFHVWdaVzVrSUc5bUlHRWdZMmhoYVc0Z2IyWWdjSEp2YldselpYTmNiaUFxSUVCeVpYUjFjbTV6SUc1dmRHaHBibWRjYmlBcUwxeHVVUzVrYjI1bElEMGdablZ1WTNScGIyNGdLRzlpYW1WamRDd2dablZzWm1sc2JHVmtMQ0J5WldwbFkzUmxaQ3dnY0hKdlozSmxjM01wSUh0Y2JpQWdJQ0J5WlhSMWNtNGdVU2h2WW1wbFkzUXBMbVJ2Ym1Vb1puVnNabWxzYkdWa0xDQnlaV3BsWTNSbFpDd2djSEp2WjNKbGMzTXBPMXh1ZlR0Y2JseHVVSEp2YldselpTNXdjbTkwYjNSNWNHVXVaRzl1WlNBOUlHWjFibU4wYVc5dUlDaG1kV3htYVd4c1pXUXNJSEpsYW1WamRHVmtMQ0J3Y205bmNtVnpjeWtnZTF4dUlDQWdJSFpoY2lCdmJsVnVhR0Z1Wkd4bFpFVnljbTl5SUQwZ1puVnVZM1JwYjI0Z0tHVnljbTl5S1NCN1hHNGdJQ0FnSUNBZ0lDOHZJR1p2Y25kaGNtUWdkRzhnWVNCbWRYUjFjbVVnZEhWeWJpQnpieUIwYUdGMElHQmdkMmhsYm1CZ1hHNGdJQ0FnSUNBZ0lDOHZJR1J2WlhNZ2JtOTBJR05oZEdOb0lHbDBJR0Z1WkNCMGRYSnVJR2wwSUdsdWRHOGdZU0J5WldwbFkzUnBiMjR1WEc0Z0lDQWdJQ0FnSUZFdWJtVjRkRlJwWTJzb1puVnVZM1JwYjI0Z0tDa2dlMXh1SUNBZ0lDQWdJQ0FnSUNBZ2JXRnJaVk4wWVdOclZISmhZMlZNYjI1bktHVnljbTl5TENCd2NtOXRhWE5sS1R0Y2JpQWdJQ0FnSUNBZ0lDQWdJR2xtSUNoUkxtOXVaWEp5YjNJcElIdGNiaUFnSUNBZ0lDQWdJQ0FnSUNBZ0lDQlJMbTl1WlhKeWIzSW9aWEp5YjNJcE8xeHVJQ0FnSUNBZ0lDQWdJQ0FnZlNCbGJITmxJSHRjYmlBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0IwYUhKdmR5Qmxjbkp2Y2p0Y2JpQWdJQ0FnSUNBZ0lDQWdJSDFjYmlBZ0lDQWdJQ0FnZlNrN1hHNGdJQ0FnZlR0Y2JseHVJQ0FnSUM4dklFRjJiMmxrSUhWdWJtVmpaWE56WVhKNUlHQnVaWGgwVkdsamEyQnBibWNnZG1saElHRnVJSFZ1Ym1WalpYTnpZWEo1SUdCM2FHVnVZQzVjYmlBZ0lDQjJZWElnY0hKdmJXbHpaU0E5SUdaMWJHWnBiR3hsWkNCOGZDQnlaV3BsWTNSbFpDQjhmQ0J3Y205bmNtVnpjeUEvWEc0Z0lDQWdJQ0FnSUhSb2FYTXVkR2hsYmlobWRXeG1hV3hzWldRc0lISmxhbVZqZEdWa0xDQndjbTluY21WemN5a2dPbHh1SUNBZ0lDQWdJQ0IwYUdsek8xeHVYRzRnSUNBZ2FXWWdLSFI1Y0dWdlppQndjbTlqWlhOeklEMDlQU0JjSW05aWFtVmpkRndpSUNZbUlIQnliMk5sYzNNZ0ppWWdjSEp2WTJWemN5NWtiMjFoYVc0cElIdGNiaUFnSUNBZ0lDQWdiMjVWYm1oaGJtUnNaV1JGY25KdmNpQTlJSEJ5YjJObGMzTXVaRzl0WVdsdUxtSnBibVFvYjI1VmJtaGhibVJzWldSRmNuSnZjaWs3WEc0Z0lDQWdmVnh1WEc0Z0lDQWdjSEp2YldselpTNTBhR1Z1S0hadmFXUWdNQ3dnYjI1VmJtaGhibVJzWldSRmNuSnZjaWs3WEc1OU8xeHVYRzR2S2lwY2JpQXFJRU5oZFhObGN5QmhJSEJ5YjIxcGMyVWdkRzhnWW1VZ2NtVnFaV04wWldRZ2FXWWdhWFFnWkc5bGN5QnViM1FnWjJWMElHWjFiR1pwYkd4bFpDQmlaV1p2Y21WY2JpQXFJSE52YldVZ2JXbHNiR2x6WldOdmJtUnpJSFJwYldVZ2IzVjBMbHh1SUNvZ1FIQmhjbUZ0SUh0QmJua3FmU0J3Y205dGFYTmxYRzRnS2lCQWNHRnlZVzBnZTA1MWJXSmxjbjBnYldsc2JHbHpaV052Ym1SeklIUnBiV1Z2ZFhSY2JpQXFJRUJ3WVhKaGJTQjdRVzU1S24wZ1kzVnpkRzl0SUdWeWNtOXlJRzFsYzNOaFoyVWdiM0lnUlhKeWIzSWdiMkpxWldOMElDaHZjSFJwYjI1aGJDbGNiaUFxSUVCeVpYUjFjbTV6SUdFZ2NISnZiV2x6WlNCbWIzSWdkR2hsSUhKbGMyOXNkWFJwYjI0Z2IyWWdkR2hsSUdkcGRtVnVJSEJ5YjIxcGMyVWdhV1lnYVhRZ2FYTmNiaUFxSUdaMWJHWnBiR3hsWkNCaVpXWnZjbVVnZEdobElIUnBiV1Z2ZFhRc0lHOTBhR1Z5ZDJselpTQnlaV3BsWTNSbFpDNWNiaUFxTDF4dVVTNTBhVzFsYjNWMElEMGdablZ1WTNScGIyNGdLRzlpYW1WamRDd2diWE1zSUdWeWNtOXlLU0I3WEc0Z0lDQWdjbVYwZFhKdUlGRW9iMkpxWldOMEtTNTBhVzFsYjNWMEtHMXpMQ0JsY25KdmNpazdYRzU5TzF4dVhHNVFjbTl0YVhObExuQnliM1J2ZEhsd1pTNTBhVzFsYjNWMElEMGdablZ1WTNScGIyNGdLRzF6TENCbGNuSnZjaWtnZTF4dUlDQWdJSFpoY2lCa1pXWmxjbkpsWkNBOUlHUmxabVZ5S0NrN1hHNGdJQ0FnZG1GeUlIUnBiV1Z2ZFhSSlpDQTlJSE5sZEZScGJXVnZkWFFvWm5WdVkzUnBiMjRnS0NrZ2UxeHVJQ0FnSUNBZ0lDQnBaaUFvSVdWeWNtOXlJSHg4SUZ3aWMzUnlhVzVuWENJZ1BUMDlJSFI1Y0dWdlppQmxjbkp2Y2lrZ2UxeHVJQ0FnSUNBZ0lDQWdJQ0FnWlhKeWIzSWdQU0J1WlhjZ1JYSnliM0lvWlhKeWIzSWdmSHdnWENKVWFXMWxaQ0J2ZFhRZ1lXWjBaWElnWENJZ0t5QnRjeUFySUZ3aUlHMXpYQ0lwTzF4dUlDQWdJQ0FnSUNBZ0lDQWdaWEp5YjNJdVkyOWtaU0E5SUZ3aVJWUkpUVVZFVDFWVVhDSTdYRzRnSUNBZ0lDQWdJSDFjYmlBZ0lDQWdJQ0FnWkdWbVpYSnlaV1F1Y21WcVpXTjBLR1Z5Y205eUtUdGNiaUFnSUNCOUxDQnRjeWs3WEc1Y2JpQWdJQ0IwYUdsekxuUm9aVzRvWm5WdVkzUnBiMjRnS0haaGJIVmxLU0I3WEc0Z0lDQWdJQ0FnSUdOc1pXRnlWR2x0Wlc5MWRDaDBhVzFsYjNWMFNXUXBPMXh1SUNBZ0lDQWdJQ0JrWldabGNuSmxaQzV5WlhOdmJIWmxLSFpoYkhWbEtUdGNiaUFnSUNCOUxDQm1kVzVqZEdsdmJpQW9aWGhqWlhCMGFXOXVLU0I3WEc0Z0lDQWdJQ0FnSUdOc1pXRnlWR2x0Wlc5MWRDaDBhVzFsYjNWMFNXUXBPMXh1SUNBZ0lDQWdJQ0JrWldabGNuSmxaQzV5WldwbFkzUW9aWGhqWlhCMGFXOXVLVHRjYmlBZ0lDQjlMQ0JrWldabGNuSmxaQzV1YjNScFpua3BPMXh1WEc0Z0lDQWdjbVYwZFhKdUlHUmxabVZ5Y21Wa0xuQnliMjFwYzJVN1hHNTlPMXh1WEc0dktpcGNiaUFxSUZKbGRIVnlibk1nWVNCd2NtOXRhWE5sSUdadmNpQjBhR1VnWjJsMlpXNGdkbUZzZFdVZ0tHOXlJSEJ5YjIxcGMyVmtJSFpoYkhWbEtTd2djMjl0WlZ4dUlDb2diV2xzYkdselpXTnZibVJ6SUdGbWRHVnlJR2wwSUhKbGMyOXNkbVZrTGlCUVlYTnpaWE1nY21WcVpXTjBhVzl1Y3lCcGJXMWxaR2xoZEdWc2VTNWNiaUFxSUVCd1lYSmhiU0I3UVc1NUtuMGdjSEp2YldselpWeHVJQ29nUUhCaGNtRnRJSHRPZFcxaVpYSjlJRzFwYkd4cGMyVmpiMjVrYzF4dUlDb2dRSEpsZEhWeWJuTWdZU0J3Y205dGFYTmxJR1p2Y2lCMGFHVWdjbVZ6YjJ4MWRHbHZiaUJ2WmlCMGFHVWdaMmwyWlc0Z2NISnZiV2x6WlNCaFpuUmxjaUJ0YVd4c2FYTmxZMjl1WkhOY2JpQXFJSFJwYldVZ2FHRnpJR1ZzWVhCelpXUWdjMmx1WTJVZ2RHaGxJSEpsYzI5c2RYUnBiMjRnYjJZZ2RHaGxJR2RwZG1WdUlIQnliMjFwYzJVdVhHNGdLaUJKWmlCMGFHVWdaMmwyWlc0Z2NISnZiV2x6WlNCeVpXcGxZM1J6TENCMGFHRjBJR2x6SUhCaGMzTmxaQ0JwYlcxbFpHbGhkR1ZzZVM1Y2JpQXFMMXh1VVM1a1pXeGhlU0E5SUdaMWJtTjBhVzl1SUNodlltcGxZM1FzSUhScGJXVnZkWFFwSUh0Y2JpQWdJQ0JwWmlBb2RHbHRaVzkxZENBOVBUMGdkbTlwWkNBd0tTQjdYRzRnSUNBZ0lDQWdJSFJwYldWdmRYUWdQU0J2WW1wbFkzUTdYRzRnSUNBZ0lDQWdJRzlpYW1WamRDQTlJSFp2YVdRZ01EdGNiaUFnSUNCOVhHNGdJQ0FnY21WMGRYSnVJRkVvYjJKcVpXTjBLUzVrWld4aGVTaDBhVzFsYjNWMEtUdGNibjA3WEc1Y2JsQnliMjFwYzJVdWNISnZkRzkwZVhCbExtUmxiR0Y1SUQwZ1puVnVZM1JwYjI0Z0tIUnBiV1Z2ZFhRcElIdGNiaUFnSUNCeVpYUjFjbTRnZEdocGN5NTBhR1Z1S0daMWJtTjBhVzl1SUNoMllXeDFaU2tnZTF4dUlDQWdJQ0FnSUNCMllYSWdaR1ZtWlhKeVpXUWdQU0JrWldabGNpZ3BPMXh1SUNBZ0lDQWdJQ0J6WlhSVWFXMWxiM1YwS0daMWJtTjBhVzl1SUNncElIdGNiaUFnSUNBZ0lDQWdJQ0FnSUdSbFptVnljbVZrTG5KbGMyOXNkbVVvZG1Gc2RXVXBPMXh1SUNBZ0lDQWdJQ0I5TENCMGFXMWxiM1YwS1R0Y2JpQWdJQ0FnSUNBZ2NtVjBkWEp1SUdSbFptVnljbVZrTG5CeWIyMXBjMlU3WEc0Z0lDQWdmU2s3WEc1OU8xeHVYRzR2S2lwY2JpQXFJRkJoYzNObGN5QmhJR052Ym5ScGJuVmhkR2x2YmlCMGJ5QmhJRTV2WkdVZ1puVnVZM1JwYjI0c0lIZG9hV05vSUdseklHTmhiR3hsWkNCM2FYUm9JSFJvWlNCbmFYWmxibHh1SUNvZ1lYSm5kVzFsYm5SeklIQnliM1pwWkdWa0lHRnpJR0Z1SUdGeWNtRjVMQ0JoYm1RZ2NtVjBkWEp1Y3lCaElIQnliMjFwYzJVdVhHNGdLbHh1SUNvZ0lDQWdJQ0JSTG01bVlYQndiSGtvUmxNdWNtVmhaRVpwYkdVc0lGdGZYMlpwYkdWdVlXMWxYU2xjYmlBcUlDQWdJQ0FnTG5Sb1pXNG9ablZ1WTNScGIyNGdLR052Ym5SbGJuUXBJSHRjYmlBcUlDQWdJQ0FnZlNsY2JpQXFYRzRnS2k5Y2JsRXVibVpoY0hCc2VTQTlJR1oxYm1OMGFXOXVJQ2hqWVd4c1ltRmpheXdnWVhKbmN5a2dlMXh1SUNBZ0lISmxkSFZ5YmlCUktHTmhiR3hpWVdOcktTNXVabUZ3Y0d4NUtHRnlaM01wTzF4dWZUdGNibHh1VUhKdmJXbHpaUzV3Y205MGIzUjVjR1V1Ym1aaGNIQnNlU0E5SUdaMWJtTjBhVzl1SUNoaGNtZHpLU0I3WEc0Z0lDQWdkbUZ5SUdSbFptVnljbVZrSUQwZ1pHVm1aWElvS1R0Y2JpQWdJQ0IyWVhJZ2JtOWtaVUZ5WjNNZ1BTQmhjbkpoZVY5emJHbGpaU2hoY21kektUdGNiaUFnSUNCdWIyUmxRWEpuY3k1d2RYTm9LR1JsWm1WeWNtVmtMbTFoYTJWT2IyUmxVbVZ6YjJ4MlpYSW9LU2s3WEc0Z0lDQWdkR2hwY3k1bVlYQndiSGtvYm05a1pVRnlaM01wTG1aaGFXd29aR1ZtWlhKeVpXUXVjbVZxWldOMEtUdGNiaUFnSUNCeVpYUjFjbTRnWkdWbVpYSnlaV1F1Y0hKdmJXbHpaVHRjYm4wN1hHNWNiaThxS2x4dUlDb2dVR0Z6YzJWeklHRWdZMjl1ZEdsdWRXRjBhVzl1SUhSdklHRWdUbTlrWlNCbWRXNWpkR2x2Yml3Z2QyaHBZMmdnYVhNZ1kyRnNiR1ZrSUhkcGRHZ2dkR2hsSUdkcGRtVnVYRzRnS2lCaGNtZDFiV1Z1ZEhNZ2NISnZkbWxrWldRZ2FXNWthWFpwWkhWaGJHeDVMQ0JoYm1RZ2NtVjBkWEp1Y3lCaElIQnliMjFwYzJVdVhHNGdLaUJBWlhoaGJYQnNaVnh1SUNvZ1VTNXVabU5oYkd3b1JsTXVjbVZoWkVacGJHVXNJRjlmWm1sc1pXNWhiV1VwWEc0Z0tpQXVkR2hsYmlobWRXNWpkR2x2YmlBb1kyOXVkR1Z1ZENrZ2UxeHVJQ29nZlNsY2JpQXFYRzRnS2k5Y2JsRXVibVpqWVd4c0lEMGdablZ1WTNScGIyNGdLR05oYkd4aVlXTnJJQzhxTGk0dVlYSm5jeW92S1NCN1hHNGdJQ0FnZG1GeUlHRnlaM01nUFNCaGNuSmhlVjl6YkdsalpTaGhjbWQxYldWdWRITXNJREVwTzF4dUlDQWdJSEpsZEhWeWJpQlJLR05oYkd4aVlXTnJLUzV1Wm1Gd2NHeDVLR0Z5WjNNcE8xeHVmVHRjYmx4dVVISnZiV2x6WlM1d2NtOTBiM1I1Y0dVdWJtWmpZV3hzSUQwZ1puVnVZM1JwYjI0Z0tDOHFMaTR1WVhKbmN5b3ZLU0I3WEc0Z0lDQWdkbUZ5SUc1dlpHVkJjbWR6SUQwZ1lYSnlZWGxmYzJ4cFkyVW9ZWEpuZFcxbGJuUnpLVHRjYmlBZ0lDQjJZWElnWkdWbVpYSnlaV1FnUFNCa1pXWmxjaWdwTzF4dUlDQWdJRzV2WkdWQmNtZHpMbkIxYzJnb1pHVm1aWEp5WldRdWJXRnJaVTV2WkdWU1pYTnZiSFpsY2lncEtUdGNiaUFnSUNCMGFHbHpMbVpoY0hCc2VTaHViMlJsUVhKbmN5a3VabUZwYkNoa1pXWmxjbkpsWkM1eVpXcGxZM1FwTzF4dUlDQWdJSEpsZEhWeWJpQmtaV1psY25KbFpDNXdjbTl0YVhObE8xeHVmVHRjYmx4dUx5b3FYRzRnS2lCWGNtRndjeUJoSUU1dlpHVktVeUJqYjI1MGFXNTFZWFJwYjI0Z2NHRnpjMmx1WnlCbWRXNWpkR2x2YmlCaGJtUWdjbVYwZFhKdWN5QmhiaUJsY1hWcGRtRnNaVzUwWEc0Z0tpQjJaWEp6YVc5dUlIUm9ZWFFnY21WMGRYSnVjeUJoSUhCeWIyMXBjMlV1WEc0Z0tpQkFaWGhoYlhCc1pWeHVJQ29nVVM1dVptSnBibVFvUmxNdWNtVmhaRVpwYkdVc0lGOWZabWxzWlc1aGJXVXBLRndpZFhSbUxUaGNJaWxjYmlBcUlDNTBhR1Z1S0dOdmJuTnZiR1V1Ykc5bktWeHVJQ29nTG1SdmJtVW9LVnh1SUNvdlhHNVJMbTVtWW1sdVpDQTlYRzVSTG1SbGJtOWtaV2xtZVNBOUlHWjFibU4wYVc5dUlDaGpZV3hzWW1GamF5QXZLaTR1TG1GeVozTXFMeWtnZTF4dUlDQWdJSFpoY2lCaVlYTmxRWEpuY3lBOUlHRnljbUY1WDNOc2FXTmxLR0Z5WjNWdFpXNTBjeXdnTVNrN1hHNGdJQ0FnY21WMGRYSnVJR1oxYm1OMGFXOXVJQ2dwSUh0Y2JpQWdJQ0FnSUNBZ2RtRnlJRzV2WkdWQmNtZHpJRDBnWW1GelpVRnlaM011WTI5dVkyRjBLR0Z5Y21GNVgzTnNhV05sS0dGeVozVnRaVzUwY3lrcE8xeHVJQ0FnSUNBZ0lDQjJZWElnWkdWbVpYSnlaV1FnUFNCa1pXWmxjaWdwTzF4dUlDQWdJQ0FnSUNCdWIyUmxRWEpuY3k1d2RYTm9LR1JsWm1WeWNtVmtMbTFoYTJWT2IyUmxVbVZ6YjJ4MlpYSW9LU2s3WEc0Z0lDQWdJQ0FnSUZFb1kyRnNiR0poWTJzcExtWmhjSEJzZVNodWIyUmxRWEpuY3lrdVptRnBiQ2hrWldabGNuSmxaQzV5WldwbFkzUXBPMXh1SUNBZ0lDQWdJQ0J5WlhSMWNtNGdaR1ZtWlhKeVpXUXVjSEp2YldselpUdGNiaUFnSUNCOU8xeHVmVHRjYmx4dVVISnZiV2x6WlM1d2NtOTBiM1I1Y0dVdWJtWmlhVzVrSUQxY2JsQnliMjFwYzJVdWNISnZkRzkwZVhCbExtUmxibTlrWldsbWVTQTlJR1oxYm1OMGFXOXVJQ2d2S2k0dUxtRnlaM01xTHlrZ2UxeHVJQ0FnSUhaaGNpQmhjbWR6SUQwZ1lYSnlZWGxmYzJ4cFkyVW9ZWEpuZFcxbGJuUnpLVHRjYmlBZ0lDQmhjbWR6TG5WdWMyaHBablFvZEdocGN5azdYRzRnSUNBZ2NtVjBkWEp1SUZFdVpHVnViMlJsYVdaNUxtRndjR3g1S0hadmFXUWdNQ3dnWVhKbmN5azdYRzU5TzF4dVhHNVJMbTVpYVc1a0lEMGdablZ1WTNScGIyNGdLR05oYkd4aVlXTnJMQ0IwYUdsemNDQXZLaTR1TG1GeVozTXFMeWtnZTF4dUlDQWdJSFpoY2lCaVlYTmxRWEpuY3lBOUlHRnljbUY1WDNOc2FXTmxLR0Z5WjNWdFpXNTBjeXdnTWlrN1hHNGdJQ0FnY21WMGRYSnVJR1oxYm1OMGFXOXVJQ2dwSUh0Y2JpQWdJQ0FnSUNBZ2RtRnlJRzV2WkdWQmNtZHpJRDBnWW1GelpVRnlaM011WTI5dVkyRjBLR0Z5Y21GNVgzTnNhV05sS0dGeVozVnRaVzUwY3lrcE8xeHVJQ0FnSUNBZ0lDQjJZWElnWkdWbVpYSnlaV1FnUFNCa1pXWmxjaWdwTzF4dUlDQWdJQ0FnSUNCdWIyUmxRWEpuY3k1d2RYTm9LR1JsWm1WeWNtVmtMbTFoYTJWT2IyUmxVbVZ6YjJ4MlpYSW9LU2s3WEc0Z0lDQWdJQ0FnSUdaMWJtTjBhVzl1SUdKdmRXNWtLQ2tnZTF4dUlDQWdJQ0FnSUNBZ0lDQWdjbVYwZFhKdUlHTmhiR3hpWVdOckxtRndjR3g1S0hSb2FYTndMQ0JoY21kMWJXVnVkSE1wTzF4dUlDQWdJQ0FnSUNCOVhHNGdJQ0FnSUNBZ0lGRW9ZbTkxYm1RcExtWmhjSEJzZVNodWIyUmxRWEpuY3lrdVptRnBiQ2hrWldabGNuSmxaQzV5WldwbFkzUXBPMXh1SUNBZ0lDQWdJQ0J5WlhSMWNtNGdaR1ZtWlhKeVpXUXVjSEp2YldselpUdGNiaUFnSUNCOU8xeHVmVHRjYmx4dVVISnZiV2x6WlM1d2NtOTBiM1I1Y0dVdWJtSnBibVFnUFNCbWRXNWpkR2x2YmlBb0x5cDBhR2x6Y0N3Z0xpNHVZWEpuY3lvdktTQjdYRzRnSUNBZ2RtRnlJR0Z5WjNNZ1BTQmhjbkpoZVY5emJHbGpaU2hoY21kMWJXVnVkSE1zSURBcE8xeHVJQ0FnSUdGeVozTXVkVzV6YUdsbWRDaDBhR2x6S1R0Y2JpQWdJQ0J5WlhSMWNtNGdVUzV1WW1sdVpDNWhjSEJzZVNoMmIybGtJREFzSUdGeVozTXBPMXh1ZlR0Y2JseHVMeW9xWEc0Z0tpQkRZV3hzY3lCaElHMWxkR2h2WkNCdlppQmhJRTV2WkdVdGMzUjViR1VnYjJKcVpXTjBJSFJvWVhRZ1lXTmpaWEIwY3lCaElFNXZaR1V0YzNSNWJHVmNiaUFxSUdOaGJHeGlZV05ySUhkcGRHZ2dZU0JuYVhabGJpQmhjbkpoZVNCdlppQmhjbWQxYldWdWRITXNJSEJzZFhNZ1lTQndjbTkyYVdSbFpDQmpZV3hzWW1GamF5NWNiaUFxSUVCd1lYSmhiU0J2WW1wbFkzUWdZVzRnYjJKcVpXTjBJSFJvWVhRZ2FHRnpJSFJvWlNCdVlXMWxaQ0J0WlhSb2IyUmNiaUFxSUVCd1lYSmhiU0I3VTNSeWFXNW5mU0J1WVcxbElHNWhiV1VnYjJZZ2RHaGxJRzFsZEdodlpDQnZaaUJ2WW1wbFkzUmNiaUFxSUVCd1lYSmhiU0I3UVhKeVlYbDlJR0Z5WjNNZ1lYSm5kVzFsYm5SeklIUnZJSEJoYzNNZ2RHOGdkR2hsSUcxbGRHaHZaRHNnZEdobElHTmhiR3hpWVdOclhHNGdLaUIzYVd4c0lHSmxJSEJ5YjNacFpHVmtJR0o1SUZFZ1lXNWtJR0Z3Y0dWdVpHVmtJSFJ2SUhSb1pYTmxJR0Z5WjNWdFpXNTBjeTVjYmlBcUlFQnlaWFIxY201eklHRWdjSEp2YldselpTQm1iM0lnZEdobElIWmhiSFZsSUc5eUlHVnljbTl5WEc0Z0tpOWNibEV1Ym0xaGNIQnNlU0E5SUM4dklGaFlXQ0JCY3lCd2NtOXdiM05sWkNCaWVTQmNJbEpsWkhOaGJtUnliMXdpWEc1UkxtNXdiM04wSUQwZ1puVnVZM1JwYjI0Z0tHOWlhbVZqZEN3Z2JtRnRaU3dnWVhKbmN5a2dlMXh1SUNBZ0lISmxkSFZ5YmlCUktHOWlhbVZqZENrdWJuQnZjM1FvYm1GdFpTd2dZWEpuY3lrN1hHNTlPMXh1WEc1UWNtOXRhWE5sTG5CeWIzUnZkSGx3WlM1dWJXRndjR3g1SUQwZ0x5OGdXRmhZSUVGeklIQnliM0J2YzJWa0lHSjVJRndpVW1Wa2MyRnVaSEp2WENKY2JsQnliMjFwYzJVdWNISnZkRzkwZVhCbExtNXdiM04wSUQwZ1puVnVZM1JwYjI0Z0tHNWhiV1VzSUdGeVozTXBJSHRjYmlBZ0lDQjJZWElnYm05a1pVRnlaM01nUFNCaGNuSmhlVjl6YkdsalpTaGhjbWR6SUh4OElGdGRLVHRjYmlBZ0lDQjJZWElnWkdWbVpYSnlaV1FnUFNCa1pXWmxjaWdwTzF4dUlDQWdJRzV2WkdWQmNtZHpMbkIxYzJnb1pHVm1aWEp5WldRdWJXRnJaVTV2WkdWU1pYTnZiSFpsY2lncEtUdGNiaUFnSUNCMGFHbHpMbVJwYzNCaGRHTm9LRndpY0c5emRGd2lMQ0JiYm1GdFpTd2dibTlrWlVGeVozTmRLUzVtWVdsc0tHUmxabVZ5Y21Wa0xuSmxhbVZqZENrN1hHNGdJQ0FnY21WMGRYSnVJR1JsWm1WeWNtVmtMbkJ5YjIxcGMyVTdYRzU5TzF4dVhHNHZLaXBjYmlBcUlFTmhiR3h6SUdFZ2JXVjBhRzlrSUc5bUlHRWdUbTlrWlMxemRIbHNaU0J2WW1wbFkzUWdkR2hoZENCaFkyTmxjSFJ6SUdFZ1RtOWtaUzF6ZEhsc1pWeHVJQ29nWTJGc2JHSmhZMnNzSUdadmNuZGhjbVJwYm1jZ2RHaGxJR2RwZG1WdUlIWmhjbWxoWkdsaklHRnlaM1Z0Wlc1MGN5d2djR3gxY3lCaElIQnliM1pwWkdWa1hHNGdLaUJqWVd4c1ltRmpheUJoY21kMWJXVnVkQzVjYmlBcUlFQndZWEpoYlNCdlltcGxZM1FnWVc0Z2IySnFaV04wSUhSb1lYUWdhR0Z6SUhSb1pTQnVZVzFsWkNCdFpYUm9iMlJjYmlBcUlFQndZWEpoYlNCN1UzUnlhVzVuZlNCdVlXMWxJRzVoYldVZ2IyWWdkR2hsSUcxbGRHaHZaQ0J2WmlCdlltcGxZM1JjYmlBcUlFQndZWEpoYlNBdUxpNWhjbWR6SUdGeVozVnRaVzUwY3lCMGJ5QndZWE56SUhSdklIUm9aU0J0WlhSb2IyUTdJSFJvWlNCallXeHNZbUZqYXlCM2FXeHNYRzRnS2lCaVpTQndjbTkyYVdSbFpDQmllU0JSSUdGdVpDQmhjSEJsYm1SbFpDQjBieUIwYUdWelpTQmhjbWQxYldWdWRITXVYRzRnS2lCQWNtVjBkWEp1Y3lCaElIQnliMjFwYzJVZ1ptOXlJSFJvWlNCMllXeDFaU0J2Y2lCbGNuSnZjbHh1SUNvdlhHNVJMbTV6Wlc1a0lEMGdMeThnV0ZoWUlFSmhjMlZrSUc5dUlFMWhjbXNnVFdsc2JHVnlKM01nY0hKdmNHOXpaV1FnWENKelpXNWtYQ0pjYmxFdWJtMWpZV3hzSUQwZ0x5OGdXRmhZSUVKaGMyVmtJRzl1SUZ3aVVtVmtjMkZ1WkhKdkozTmNJaUJ3Y205d2IzTmhiRnh1VVM1dWFXNTJiMnRsSUQwZ1puVnVZM1JwYjI0Z0tHOWlhbVZqZEN3Z2JtRnRaU0F2S2k0dUxtRnlaM01xTHlrZ2UxeHVJQ0FnSUhaaGNpQnViMlJsUVhKbmN5QTlJR0Z5Y21GNVgzTnNhV05sS0dGeVozVnRaVzUwY3l3Z01pazdYRzRnSUNBZ2RtRnlJR1JsWm1WeWNtVmtJRDBnWkdWbVpYSW9LVHRjYmlBZ0lDQnViMlJsUVhKbmN5NXdkWE5vS0dSbFptVnljbVZrTG0xaGEyVk9iMlJsVW1WemIyeDJaWElvS1NrN1hHNGdJQ0FnVVNodlltcGxZM1FwTG1ScGMzQmhkR05vS0Z3aWNHOXpkRndpTENCYmJtRnRaU3dnYm05a1pVRnlaM05kS1M1bVlXbHNLR1JsWm1WeWNtVmtMbkpsYW1WamRDazdYRzRnSUNBZ2NtVjBkWEp1SUdSbFptVnljbVZrTG5CeWIyMXBjMlU3WEc1OU8xeHVYRzVRY205dGFYTmxMbkJ5YjNSdmRIbHdaUzV1YzJWdVpDQTlJQzh2SUZoWVdDQkNZWE5sWkNCdmJpQk5ZWEpySUUxcGJHeGxjaWR6SUhCeWIzQnZjMlZrSUZ3aWMyVnVaRndpWEc1UWNtOXRhWE5sTG5CeWIzUnZkSGx3WlM1dWJXTmhiR3dnUFNBdkx5QllXRmdnUW1GelpXUWdiMjRnWENKU1pXUnpZVzVrY204bmMxd2lJSEJ5YjNCdmMyRnNYRzVRY205dGFYTmxMbkJ5YjNSdmRIbHdaUzV1YVc1MmIydGxJRDBnWm5WdVkzUnBiMjRnS0c1aGJXVWdMeW91TGk1aGNtZHpLaThwSUh0Y2JpQWdJQ0IyWVhJZ2JtOWtaVUZ5WjNNZ1BTQmhjbkpoZVY5emJHbGpaU2hoY21kMWJXVnVkSE1zSURFcE8xeHVJQ0FnSUhaaGNpQmtaV1psY25KbFpDQTlJR1JsWm1WeUtDazdYRzRnSUNBZ2JtOWtaVUZ5WjNNdWNIVnphQ2hrWldabGNuSmxaQzV0WVd0bFRtOWtaVkpsYzI5c2RtVnlLQ2twTzF4dUlDQWdJSFJvYVhNdVpHbHpjR0YwWTJnb1hDSndiM04wWENJc0lGdHVZVzFsTENCdWIyUmxRWEpuYzEwcExtWmhhV3dvWkdWbVpYSnlaV1F1Y21WcVpXTjBLVHRjYmlBZ0lDQnlaWFIxY200Z1pHVm1aWEp5WldRdWNISnZiV2x6WlR0Y2JuMDdYRzVjYmk4cUtseHVJQ29nU1dZZ1lTQm1kVzVqZEdsdmJpQjNiM1ZzWkNCc2FXdGxJSFJ2SUhOMWNIQnZjblFnWW05MGFDQk9iMlJsSUdOdmJuUnBiblZoZEdsdmJpMXdZWE56YVc1bkxYTjBlV3hsSUdGdVpGeHVJQ29nY0hKdmJXbHpaUzF5WlhSMWNtNXBibWN0YzNSNWJHVXNJR2wwSUdOaGJpQmxibVFnYVhSeklHbHVkR1Z5Ym1Gc0lIQnliMjFwYzJVZ1kyaGhhVzRnZDJsMGFGeHVJQ29nWUc1dlpHVnBabmtvYm05a1pXSmhZMnNwWUN3Z1ptOXlkMkZ5WkdsdVp5QjBhR1VnYjNCMGFXOXVZV3dnYm05a1pXSmhZMnNnWVhKbmRXMWxiblF1SUNCSlppQjBhR1VnZFhObGNseHVJQ29nWld4bFkzUnpJSFJ2SUhWelpTQmhJRzV2WkdWaVlXTnJMQ0IwYUdVZ2NtVnpkV3gwSUhkcGJHd2dZbVVnYzJWdWRDQjBhR1Z5WlM0Z0lFbG1JSFJvWlhrZ1pHOGdibTkwWEc0Z0tpQndZWE56SUdFZ2JtOWtaV0poWTJzc0lIUm9aWGtnZDJsc2JDQnlaV05sYVhabElIUm9aU0J5WlhOMWJIUWdjSEp2YldselpTNWNiaUFxSUVCd1lYSmhiU0J2WW1wbFkzUWdZU0J5WlhOMWJIUWdLRzl5SUdFZ2NISnZiV2x6WlNCbWIzSWdZU0J5WlhOMWJIUXBYRzRnS2lCQWNHRnlZVzBnZTBaMWJtTjBhVzl1ZlNCdWIyUmxZbUZqYXlCaElFNXZaR1V1YW5NdGMzUjViR1VnWTJGc2JHSmhZMnRjYmlBcUlFQnlaWFIxY201eklHVnBkR2hsY2lCMGFHVWdjSEp2YldselpTQnZjaUJ1YjNSb2FXNW5YRzRnS2k5Y2JsRXVibTlrWldsbWVTQTlJRzV2WkdWcFpuazdYRzVtZFc1amRHbHZiaUJ1YjJSbGFXWjVLRzlpYW1WamRDd2dibTlrWldKaFkyc3BJSHRjYmlBZ0lDQnlaWFIxY200Z1VTaHZZbXBsWTNRcExtNXZaR1ZwWm5rb2JtOWtaV0poWTJzcE8xeHVmVnh1WEc1UWNtOXRhWE5sTG5CeWIzUnZkSGx3WlM1dWIyUmxhV1o1SUQwZ1puVnVZM1JwYjI0Z0tHNXZaR1ZpWVdOcktTQjdYRzRnSUNBZ2FXWWdLRzV2WkdWaVlXTnJLU0I3WEc0Z0lDQWdJQ0FnSUhSb2FYTXVkR2hsYmlobWRXNWpkR2x2YmlBb2RtRnNkV1VwSUh0Y2JpQWdJQ0FnSUNBZ0lDQWdJRkV1Ym1WNGRGUnBZMnNvWm5WdVkzUnBiMjRnS0NrZ2UxeHVJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lHNXZaR1ZpWVdOcktHNTFiR3dzSUhaaGJIVmxLVHRjYmlBZ0lDQWdJQ0FnSUNBZ0lIMHBPMXh1SUNBZ0lDQWdJQ0I5TENCbWRXNWpkR2x2YmlBb1pYSnliM0lwSUh0Y2JpQWdJQ0FnSUNBZ0lDQWdJRkV1Ym1WNGRGUnBZMnNvWm5WdVkzUnBiMjRnS0NrZ2UxeHVJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lHNXZaR1ZpWVdOcktHVnljbTl5S1R0Y2JpQWdJQ0FnSUNBZ0lDQWdJSDBwTzF4dUlDQWdJQ0FnSUNCOUtUdGNiaUFnSUNCOUlHVnNjMlVnZTF4dUlDQWdJQ0FnSUNCeVpYUjFjbTRnZEdocGN6dGNiaUFnSUNCOVhHNTlPMXh1WEc1UkxtNXZRMjl1Wm14cFkzUWdQU0JtZFc1amRHbHZiaWdwSUh0Y2JpQWdJQ0IwYUhKdmR5QnVaWGNnUlhKeWIzSW9YQ0pSTG01dlEyOXVabXhwWTNRZ2IyNXNlU0IzYjNKcmN5QjNhR1Z1SUZFZ2FYTWdkWE5sWkNCaGN5QmhJR2RzYjJKaGJGd2lLVHRjYm4wN1hHNWNiaTh2SUVGc2JDQmpiMlJsSUdKbFptOXlaU0IwYUdseklIQnZhVzUwSUhkcGJHd2dZbVVnWm1sc2RHVnlaV1FnWm5KdmJTQnpkR0ZqYXlCMGNtRmpaWE11WEc1MllYSWdjVVZ1WkdsdVoweHBibVVnUFNCallYQjBkWEpsVEdsdVpTZ3BPMXh1WEc1eVpYUjFjbTRnVVR0Y2JseHVmU2s3WEc0aVhYMD0iLCIvKipcbiAqIFJvb3QgcmVmZXJlbmNlIGZvciBpZnJhbWVzLlxuICovXG5cbnZhciByb290O1xuaWYgKHR5cGVvZiB3aW5kb3cgIT09ICd1bmRlZmluZWQnKSB7IC8vIEJyb3dzZXIgd2luZG93XG4gIHJvb3QgPSB3aW5kb3c7XG59IGVsc2UgaWYgKHR5cGVvZiBzZWxmICE9PSAndW5kZWZpbmVkJykgeyAvLyBXZWIgV29ya2VyXG4gIHJvb3QgPSBzZWxmO1xufSBlbHNlIHsgLy8gT3RoZXIgZW52aXJvbm1lbnRzXG4gIGNvbnNvbGUud2FybihcIlVzaW5nIGJyb3dzZXItb25seSB2ZXJzaW9uIG9mIHN1cGVyYWdlbnQgaW4gbm9uLWJyb3dzZXIgZW52aXJvbm1lbnRcIik7XG4gIHJvb3QgPSB0aGlzO1xufVxuXG52YXIgRW1pdHRlciA9IHJlcXVpcmUoJ2VtaXR0ZXInKTtcbnZhciByZXF1ZXN0QmFzZSA9IHJlcXVpcmUoJy4vcmVxdWVzdC1iYXNlJyk7XG52YXIgaXNPYmplY3QgPSByZXF1aXJlKCcuL2lzLW9iamVjdCcpO1xuXG4vKipcbiAqIE5vb3AuXG4gKi9cblxuZnVuY3Rpb24gbm9vcCgpe307XG5cbi8qKlxuICogRXhwb3NlIGByZXF1ZXN0YC5cbiAqL1xuXG52YXIgcmVxdWVzdCA9IG1vZHVsZS5leHBvcnRzID0gcmVxdWlyZSgnLi9yZXF1ZXN0JykuYmluZChudWxsLCBSZXF1ZXN0KTtcblxuLyoqXG4gKiBEZXRlcm1pbmUgWEhSLlxuICovXG5cbnJlcXVlc3QuZ2V0WEhSID0gZnVuY3Rpb24gKCkge1xuICBpZiAocm9vdC5YTUxIdHRwUmVxdWVzdFxuICAgICAgJiYgKCFyb290LmxvY2F0aW9uIHx8ICdmaWxlOicgIT0gcm9vdC5sb2NhdGlvbi5wcm90b2NvbFxuICAgICAgICAgIHx8ICFyb290LkFjdGl2ZVhPYmplY3QpKSB7XG4gICAgcmV0dXJuIG5ldyBYTUxIdHRwUmVxdWVzdDtcbiAgfSBlbHNlIHtcbiAgICB0cnkgeyByZXR1cm4gbmV3IEFjdGl2ZVhPYmplY3QoJ01pY3Jvc29mdC5YTUxIVFRQJyk7IH0gY2F0Y2goZSkge31cbiAgICB0cnkgeyByZXR1cm4gbmV3IEFjdGl2ZVhPYmplY3QoJ01zeG1sMi5YTUxIVFRQLjYuMCcpOyB9IGNhdGNoKGUpIHt9XG4gICAgdHJ5IHsgcmV0dXJuIG5ldyBBY3RpdmVYT2JqZWN0KCdNc3htbDIuWE1MSFRUUC4zLjAnKTsgfSBjYXRjaChlKSB7fVxuICAgIHRyeSB7IHJldHVybiBuZXcgQWN0aXZlWE9iamVjdCgnTXN4bWwyLlhNTEhUVFAnKTsgfSBjYXRjaChlKSB7fVxuICB9XG4gIHRocm93IEVycm9yKFwiQnJvd3Nlci1vbmx5IHZlcmlzb24gb2Ygc3VwZXJhZ2VudCBjb3VsZCBub3QgZmluZCBYSFJcIik7XG59O1xuXG4vKipcbiAqIFJlbW92ZXMgbGVhZGluZyBhbmQgdHJhaWxpbmcgd2hpdGVzcGFjZSwgYWRkZWQgdG8gc3VwcG9ydCBJRS5cbiAqXG4gKiBAcGFyYW0ge1N0cmluZ30gc1xuICogQHJldHVybiB7U3RyaW5nfVxuICogQGFwaSBwcml2YXRlXG4gKi9cblxudmFyIHRyaW0gPSAnJy50cmltXG4gID8gZnVuY3Rpb24ocykgeyByZXR1cm4gcy50cmltKCk7IH1cbiAgOiBmdW5jdGlvbihzKSB7IHJldHVybiBzLnJlcGxhY2UoLyheXFxzKnxcXHMqJCkvZywgJycpOyB9O1xuXG4vKipcbiAqIFNlcmlhbGl6ZSB0aGUgZ2l2ZW4gYG9iamAuXG4gKlxuICogQHBhcmFtIHtPYmplY3R9IG9ialxuICogQHJldHVybiB7U3RyaW5nfVxuICogQGFwaSBwcml2YXRlXG4gKi9cblxuZnVuY3Rpb24gc2VyaWFsaXplKG9iaikge1xuICBpZiAoIWlzT2JqZWN0KG9iaikpIHJldHVybiBvYmo7XG4gIHZhciBwYWlycyA9IFtdO1xuICBmb3IgKHZhciBrZXkgaW4gb2JqKSB7XG4gICAgcHVzaEVuY29kZWRLZXlWYWx1ZVBhaXIocGFpcnMsIGtleSwgb2JqW2tleV0pO1xuICB9XG4gIHJldHVybiBwYWlycy5qb2luKCcmJyk7XG59XG5cbi8qKlxuICogSGVscHMgJ3NlcmlhbGl6ZScgd2l0aCBzZXJpYWxpemluZyBhcnJheXMuXG4gKiBNdXRhdGVzIHRoZSBwYWlycyBhcnJheS5cbiAqXG4gKiBAcGFyYW0ge0FycmF5fSBwYWlyc1xuICogQHBhcmFtIHtTdHJpbmd9IGtleVxuICogQHBhcmFtIHtNaXhlZH0gdmFsXG4gKi9cblxuZnVuY3Rpb24gcHVzaEVuY29kZWRLZXlWYWx1ZVBhaXIocGFpcnMsIGtleSwgdmFsKSB7XG4gIGlmICh2YWwgIT0gbnVsbCkge1xuICAgIGlmIChBcnJheS5pc0FycmF5KHZhbCkpIHtcbiAgICAgIHZhbC5mb3JFYWNoKGZ1bmN0aW9uKHYpIHtcbiAgICAgICAgcHVzaEVuY29kZWRLZXlWYWx1ZVBhaXIocGFpcnMsIGtleSwgdik7XG4gICAgICB9KTtcbiAgICB9IGVsc2UgaWYgKGlzT2JqZWN0KHZhbCkpIHtcbiAgICAgIGZvcih2YXIgc3Via2V5IGluIHZhbCkge1xuICAgICAgICBwdXNoRW5jb2RlZEtleVZhbHVlUGFpcihwYWlycywga2V5ICsgJ1snICsgc3Via2V5ICsgJ10nLCB2YWxbc3Via2V5XSk7XG4gICAgICB9XG4gICAgfSBlbHNlIHtcbiAgICAgIHBhaXJzLnB1c2goZW5jb2RlVVJJQ29tcG9uZW50KGtleSlcbiAgICAgICAgKyAnPScgKyBlbmNvZGVVUklDb21wb25lbnQodmFsKSk7XG4gICAgfVxuICB9IGVsc2UgaWYgKHZhbCA9PT0gbnVsbCkge1xuICAgIHBhaXJzLnB1c2goZW5jb2RlVVJJQ29tcG9uZW50KGtleSkpO1xuICB9XG59XG5cbi8qKlxuICogRXhwb3NlIHNlcmlhbGl6YXRpb24gbWV0aG9kLlxuICovXG5cbiByZXF1ZXN0LnNlcmlhbGl6ZU9iamVjdCA9IHNlcmlhbGl6ZTtcblxuIC8qKlxuICAqIFBhcnNlIHRoZSBnaXZlbiB4LXd3dy1mb3JtLXVybGVuY29kZWQgYHN0cmAuXG4gICpcbiAgKiBAcGFyYW0ge1N0cmluZ30gc3RyXG4gICogQHJldHVybiB7T2JqZWN0fVxuICAqIEBhcGkgcHJpdmF0ZVxuICAqL1xuXG5mdW5jdGlvbiBwYXJzZVN0cmluZyhzdHIpIHtcbiAgdmFyIG9iaiA9IHt9O1xuICB2YXIgcGFpcnMgPSBzdHIuc3BsaXQoJyYnKTtcbiAgdmFyIHBhaXI7XG4gIHZhciBwb3M7XG5cbiAgZm9yICh2YXIgaSA9IDAsIGxlbiA9IHBhaXJzLmxlbmd0aDsgaSA8IGxlbjsgKytpKSB7XG4gICAgcGFpciA9IHBhaXJzW2ldO1xuICAgIHBvcyA9IHBhaXIuaW5kZXhPZignPScpO1xuICAgIGlmIChwb3MgPT0gLTEpIHtcbiAgICAgIG9ialtkZWNvZGVVUklDb21wb25lbnQocGFpcildID0gJyc7XG4gICAgfSBlbHNlIHtcbiAgICAgIG9ialtkZWNvZGVVUklDb21wb25lbnQocGFpci5zbGljZSgwLCBwb3MpKV0gPVxuICAgICAgICBkZWNvZGVVUklDb21wb25lbnQocGFpci5zbGljZShwb3MgKyAxKSk7XG4gICAgfVxuICB9XG5cbiAgcmV0dXJuIG9iajtcbn1cblxuLyoqXG4gKiBFeHBvc2UgcGFyc2VyLlxuICovXG5cbnJlcXVlc3QucGFyc2VTdHJpbmcgPSBwYXJzZVN0cmluZztcblxuLyoqXG4gKiBEZWZhdWx0IE1JTUUgdHlwZSBtYXAuXG4gKlxuICogICAgIHN1cGVyYWdlbnQudHlwZXMueG1sID0gJ2FwcGxpY2F0aW9uL3htbCc7XG4gKlxuICovXG5cbnJlcXVlc3QudHlwZXMgPSB7XG4gIGh0bWw6ICd0ZXh0L2h0bWwnLFxuICBqc29uOiAnYXBwbGljYXRpb24vanNvbicsXG4gIHhtbDogJ2FwcGxpY2F0aW9uL3htbCcsXG4gIHVybGVuY29kZWQ6ICdhcHBsaWNhdGlvbi94LXd3dy1mb3JtLXVybGVuY29kZWQnLFxuICAnZm9ybSc6ICdhcHBsaWNhdGlvbi94LXd3dy1mb3JtLXVybGVuY29kZWQnLFxuICAnZm9ybS1kYXRhJzogJ2FwcGxpY2F0aW9uL3gtd3d3LWZvcm0tdXJsZW5jb2RlZCdcbn07XG5cbi8qKlxuICogRGVmYXVsdCBzZXJpYWxpemF0aW9uIG1hcC5cbiAqXG4gKiAgICAgc3VwZXJhZ2VudC5zZXJpYWxpemVbJ2FwcGxpY2F0aW9uL3htbCddID0gZnVuY3Rpb24ob2JqKXtcbiAqICAgICAgIHJldHVybiAnZ2VuZXJhdGVkIHhtbCBoZXJlJztcbiAqICAgICB9O1xuICpcbiAqL1xuXG4gcmVxdWVzdC5zZXJpYWxpemUgPSB7XG4gICAnYXBwbGljYXRpb24veC13d3ctZm9ybS11cmxlbmNvZGVkJzogc2VyaWFsaXplLFxuICAgJ2FwcGxpY2F0aW9uL2pzb24nOiBKU09OLnN0cmluZ2lmeVxuIH07XG5cbiAvKipcbiAgKiBEZWZhdWx0IHBhcnNlcnMuXG4gICpcbiAgKiAgICAgc3VwZXJhZ2VudC5wYXJzZVsnYXBwbGljYXRpb24veG1sJ10gPSBmdW5jdGlvbihzdHIpe1xuICAqICAgICAgIHJldHVybiB7IG9iamVjdCBwYXJzZWQgZnJvbSBzdHIgfTtcbiAgKiAgICAgfTtcbiAgKlxuICAqL1xuXG5yZXF1ZXN0LnBhcnNlID0ge1xuICAnYXBwbGljYXRpb24veC13d3ctZm9ybS11cmxlbmNvZGVkJzogcGFyc2VTdHJpbmcsXG4gICdhcHBsaWNhdGlvbi9qc29uJzogSlNPTi5wYXJzZVxufTtcblxuLyoqXG4gKiBQYXJzZSB0aGUgZ2l2ZW4gaGVhZGVyIGBzdHJgIGludG9cbiAqIGFuIG9iamVjdCBjb250YWluaW5nIHRoZSBtYXBwZWQgZmllbGRzLlxuICpcbiAqIEBwYXJhbSB7U3RyaW5nfSBzdHJcbiAqIEByZXR1cm4ge09iamVjdH1cbiAqIEBhcGkgcHJpdmF0ZVxuICovXG5cbmZ1bmN0aW9uIHBhcnNlSGVhZGVyKHN0cikge1xuICB2YXIgbGluZXMgPSBzdHIuc3BsaXQoL1xccj9cXG4vKTtcbiAgdmFyIGZpZWxkcyA9IHt9O1xuICB2YXIgaW5kZXg7XG4gIHZhciBsaW5lO1xuICB2YXIgZmllbGQ7XG4gIHZhciB2YWw7XG5cbiAgbGluZXMucG9wKCk7IC8vIHRyYWlsaW5nIENSTEZcblxuICBmb3IgKHZhciBpID0gMCwgbGVuID0gbGluZXMubGVuZ3RoOyBpIDwgbGVuOyArK2kpIHtcbiAgICBsaW5lID0gbGluZXNbaV07XG4gICAgaW5kZXggPSBsaW5lLmluZGV4T2YoJzonKTtcbiAgICBmaWVsZCA9IGxpbmUuc2xpY2UoMCwgaW5kZXgpLnRvTG93ZXJDYXNlKCk7XG4gICAgdmFsID0gdHJpbShsaW5lLnNsaWNlKGluZGV4ICsgMSkpO1xuICAgIGZpZWxkc1tmaWVsZF0gPSB2YWw7XG4gIH1cblxuICByZXR1cm4gZmllbGRzO1xufVxuXG4vKipcbiAqIENoZWNrIGlmIGBtaW1lYCBpcyBqc29uIG9yIGhhcyAranNvbiBzdHJ1Y3R1cmVkIHN5bnRheCBzdWZmaXguXG4gKlxuICogQHBhcmFtIHtTdHJpbmd9IG1pbWVcbiAqIEByZXR1cm4ge0Jvb2xlYW59XG4gKiBAYXBpIHByaXZhdGVcbiAqL1xuXG5mdW5jdGlvbiBpc0pTT04obWltZSkge1xuICByZXR1cm4gL1tcXC8rXWpzb25cXGIvLnRlc3QobWltZSk7XG59XG5cbi8qKlxuICogUmV0dXJuIHRoZSBtaW1lIHR5cGUgZm9yIHRoZSBnaXZlbiBgc3RyYC5cbiAqXG4gKiBAcGFyYW0ge1N0cmluZ30gc3RyXG4gKiBAcmV0dXJuIHtTdHJpbmd9XG4gKiBAYXBpIHByaXZhdGVcbiAqL1xuXG5mdW5jdGlvbiB0eXBlKHN0cil7XG4gIHJldHVybiBzdHIuc3BsaXQoLyAqOyAqLykuc2hpZnQoKTtcbn07XG5cbi8qKlxuICogUmV0dXJuIGhlYWRlciBmaWVsZCBwYXJhbWV0ZXJzLlxuICpcbiAqIEBwYXJhbSB7U3RyaW5nfSBzdHJcbiAqIEByZXR1cm4ge09iamVjdH1cbiAqIEBhcGkgcHJpdmF0ZVxuICovXG5cbmZ1bmN0aW9uIHBhcmFtcyhzdHIpe1xuICByZXR1cm4gc3RyLnNwbGl0KC8gKjsgKi8pLnJlZHVjZShmdW5jdGlvbihvYmosIHN0cil7XG4gICAgdmFyIHBhcnRzID0gc3RyLnNwbGl0KC8gKj0gKi8pLFxuICAgICAgICBrZXkgPSBwYXJ0cy5zaGlmdCgpLFxuICAgICAgICB2YWwgPSBwYXJ0cy5zaGlmdCgpO1xuXG4gICAgaWYgKGtleSAmJiB2YWwpIG9ialtrZXldID0gdmFsO1xuICAgIHJldHVybiBvYmo7XG4gIH0sIHt9KTtcbn07XG5cbi8qKlxuICogSW5pdGlhbGl6ZSBhIG5ldyBgUmVzcG9uc2VgIHdpdGggdGhlIGdpdmVuIGB4aHJgLlxuICpcbiAqICAtIHNldCBmbGFncyAoLm9rLCAuZXJyb3IsIGV0YylcbiAqICAtIHBhcnNlIGhlYWRlclxuICpcbiAqIEV4YW1wbGVzOlxuICpcbiAqICBBbGlhc2luZyBgc3VwZXJhZ2VudGAgYXMgYHJlcXVlc3RgIGlzIG5pY2U6XG4gKlxuICogICAgICByZXF1ZXN0ID0gc3VwZXJhZ2VudDtcbiAqXG4gKiAgV2UgY2FuIHVzZSB0aGUgcHJvbWlzZS1saWtlIEFQSSwgb3IgcGFzcyBjYWxsYmFja3M6XG4gKlxuICogICAgICByZXF1ZXN0LmdldCgnLycpLmVuZChmdW5jdGlvbihyZXMpe30pO1xuICogICAgICByZXF1ZXN0LmdldCgnLycsIGZ1bmN0aW9uKHJlcyl7fSk7XG4gKlxuICogIFNlbmRpbmcgZGF0YSBjYW4gYmUgY2hhaW5lZDpcbiAqXG4gKiAgICAgIHJlcXVlc3RcbiAqICAgICAgICAucG9zdCgnL3VzZXInKVxuICogICAgICAgIC5zZW5kKHsgbmFtZTogJ3RqJyB9KVxuICogICAgICAgIC5lbmQoZnVuY3Rpb24ocmVzKXt9KTtcbiAqXG4gKiAgT3IgcGFzc2VkIHRvIGAuc2VuZCgpYDpcbiAqXG4gKiAgICAgIHJlcXVlc3RcbiAqICAgICAgICAucG9zdCgnL3VzZXInKVxuICogICAgICAgIC5zZW5kKHsgbmFtZTogJ3RqJyB9LCBmdW5jdGlvbihyZXMpe30pO1xuICpcbiAqICBPciBwYXNzZWQgdG8gYC5wb3N0KClgOlxuICpcbiAqICAgICAgcmVxdWVzdFxuICogICAgICAgIC5wb3N0KCcvdXNlcicsIHsgbmFtZTogJ3RqJyB9KVxuICogICAgICAgIC5lbmQoZnVuY3Rpb24ocmVzKXt9KTtcbiAqXG4gKiBPciBmdXJ0aGVyIHJlZHVjZWQgdG8gYSBzaW5nbGUgY2FsbCBmb3Igc2ltcGxlIGNhc2VzOlxuICpcbiAqICAgICAgcmVxdWVzdFxuICogICAgICAgIC5wb3N0KCcvdXNlcicsIHsgbmFtZTogJ3RqJyB9LCBmdW5jdGlvbihyZXMpe30pO1xuICpcbiAqIEBwYXJhbSB7WE1MSFRUUFJlcXVlc3R9IHhoclxuICogQHBhcmFtIHtPYmplY3R9IG9wdGlvbnNcbiAqIEBhcGkgcHJpdmF0ZVxuICovXG5cbmZ1bmN0aW9uIFJlc3BvbnNlKHJlcSwgb3B0aW9ucykge1xuICBvcHRpb25zID0gb3B0aW9ucyB8fCB7fTtcbiAgdGhpcy5yZXEgPSByZXE7XG4gIHRoaXMueGhyID0gdGhpcy5yZXEueGhyO1xuICAvLyByZXNwb25zZVRleHQgaXMgYWNjZXNzaWJsZSBvbmx5IGlmIHJlc3BvbnNlVHlwZSBpcyAnJyBvciAndGV4dCcgYW5kIG9uIG9sZGVyIGJyb3dzZXJzXG4gIHRoaXMudGV4dCA9ICgodGhpcy5yZXEubWV0aG9kICE9J0hFQUQnICYmICh0aGlzLnhoci5yZXNwb25zZVR5cGUgPT09ICcnIHx8IHRoaXMueGhyLnJlc3BvbnNlVHlwZSA9PT0gJ3RleHQnKSkgfHwgdHlwZW9mIHRoaXMueGhyLnJlc3BvbnNlVHlwZSA9PT0gJ3VuZGVmaW5lZCcpXG4gICAgID8gdGhpcy54aHIucmVzcG9uc2VUZXh0XG4gICAgIDogbnVsbDtcbiAgdGhpcy5zdGF0dXNUZXh0ID0gdGhpcy5yZXEueGhyLnN0YXR1c1RleHQ7XG4gIHRoaXMuX3NldFN0YXR1c1Byb3BlcnRpZXModGhpcy54aHIuc3RhdHVzKTtcbiAgdGhpcy5oZWFkZXIgPSB0aGlzLmhlYWRlcnMgPSBwYXJzZUhlYWRlcih0aGlzLnhoci5nZXRBbGxSZXNwb25zZUhlYWRlcnMoKSk7XG4gIC8vIGdldEFsbFJlc3BvbnNlSGVhZGVycyBzb21ldGltZXMgZmFsc2VseSByZXR1cm5zIFwiXCIgZm9yIENPUlMgcmVxdWVzdHMsIGJ1dFxuICAvLyBnZXRSZXNwb25zZUhlYWRlciBzdGlsbCB3b3Jrcy4gc28gd2UgZ2V0IGNvbnRlbnQtdHlwZSBldmVuIGlmIGdldHRpbmdcbiAgLy8gb3RoZXIgaGVhZGVycyBmYWlscy5cbiAgdGhpcy5oZWFkZXJbJ2NvbnRlbnQtdHlwZSddID0gdGhpcy54aHIuZ2V0UmVzcG9uc2VIZWFkZXIoJ2NvbnRlbnQtdHlwZScpO1xuICB0aGlzLl9zZXRIZWFkZXJQcm9wZXJ0aWVzKHRoaXMuaGVhZGVyKTtcbiAgdGhpcy5ib2R5ID0gdGhpcy5yZXEubWV0aG9kICE9ICdIRUFEJ1xuICAgID8gdGhpcy5fcGFyc2VCb2R5KHRoaXMudGV4dCA/IHRoaXMudGV4dCA6IHRoaXMueGhyLnJlc3BvbnNlKVxuICAgIDogbnVsbDtcbn1cblxuLyoqXG4gKiBHZXQgY2FzZS1pbnNlbnNpdGl2ZSBgZmllbGRgIHZhbHVlLlxuICpcbiAqIEBwYXJhbSB7U3RyaW5nfSBmaWVsZFxuICogQHJldHVybiB7U3RyaW5nfVxuICogQGFwaSBwdWJsaWNcbiAqL1xuXG5SZXNwb25zZS5wcm90b3R5cGUuZ2V0ID0gZnVuY3Rpb24oZmllbGQpe1xuICByZXR1cm4gdGhpcy5oZWFkZXJbZmllbGQudG9Mb3dlckNhc2UoKV07XG59O1xuXG4vKipcbiAqIFNldCBoZWFkZXIgcmVsYXRlZCBwcm9wZXJ0aWVzOlxuICpcbiAqICAgLSBgLnR5cGVgIHRoZSBjb250ZW50IHR5cGUgd2l0aG91dCBwYXJhbXNcbiAqXG4gKiBBIHJlc3BvbnNlIG9mIFwiQ29udGVudC1UeXBlOiB0ZXh0L3BsYWluOyBjaGFyc2V0PXV0Zi04XCJcbiAqIHdpbGwgcHJvdmlkZSB5b3Ugd2l0aCBhIGAudHlwZWAgb2YgXCJ0ZXh0L3BsYWluXCIuXG4gKlxuICogQHBhcmFtIHtPYmplY3R9IGhlYWRlclxuICogQGFwaSBwcml2YXRlXG4gKi9cblxuUmVzcG9uc2UucHJvdG90eXBlLl9zZXRIZWFkZXJQcm9wZXJ0aWVzID0gZnVuY3Rpb24oaGVhZGVyKXtcbiAgLy8gY29udGVudC10eXBlXG4gIHZhciBjdCA9IHRoaXMuaGVhZGVyWydjb250ZW50LXR5cGUnXSB8fCAnJztcbiAgdGhpcy50eXBlID0gdHlwZShjdCk7XG5cbiAgLy8gcGFyYW1zXG4gIHZhciBvYmogPSBwYXJhbXMoY3QpO1xuICBmb3IgKHZhciBrZXkgaW4gb2JqKSB0aGlzW2tleV0gPSBvYmpba2V5XTtcbn07XG5cbi8qKlxuICogUGFyc2UgdGhlIGdpdmVuIGJvZHkgYHN0cmAuXG4gKlxuICogVXNlZCBmb3IgYXV0by1wYXJzaW5nIG9mIGJvZGllcy4gUGFyc2Vyc1xuICogYXJlIGRlZmluZWQgb24gdGhlIGBzdXBlcmFnZW50LnBhcnNlYCBvYmplY3QuXG4gKlxuICogQHBhcmFtIHtTdHJpbmd9IHN0clxuICogQHJldHVybiB7TWl4ZWR9XG4gKiBAYXBpIHByaXZhdGVcbiAqL1xuXG5SZXNwb25zZS5wcm90b3R5cGUuX3BhcnNlQm9keSA9IGZ1bmN0aW9uKHN0cil7XG4gIHZhciBwYXJzZSA9IHJlcXVlc3QucGFyc2VbdGhpcy50eXBlXTtcbiAgaWYgKCFwYXJzZSAmJiBpc0pTT04odGhpcy50eXBlKSkge1xuICAgIHBhcnNlID0gcmVxdWVzdC5wYXJzZVsnYXBwbGljYXRpb24vanNvbiddO1xuICB9XG4gIHJldHVybiBwYXJzZSAmJiBzdHIgJiYgKHN0ci5sZW5ndGggfHwgc3RyIGluc3RhbmNlb2YgT2JqZWN0KVxuICAgID8gcGFyc2Uoc3RyKVxuICAgIDogbnVsbDtcbn07XG5cbi8qKlxuICogU2V0IGZsYWdzIHN1Y2ggYXMgYC5va2AgYmFzZWQgb24gYHN0YXR1c2AuXG4gKlxuICogRm9yIGV4YW1wbGUgYSAyeHggcmVzcG9uc2Ugd2lsbCBnaXZlIHlvdSBhIGAub2tgIG9mIF9fdHJ1ZV9fXG4gKiB3aGVyZWFzIDV4eCB3aWxsIGJlIF9fZmFsc2VfXyBhbmQgYC5lcnJvcmAgd2lsbCBiZSBfX3RydWVfXy4gVGhlXG4gKiBgLmNsaWVudEVycm9yYCBhbmQgYC5zZXJ2ZXJFcnJvcmAgYXJlIGFsc28gYXZhaWxhYmxlIHRvIGJlIG1vcmVcbiAqIHNwZWNpZmljLCBhbmQgYC5zdGF0dXNUeXBlYCBpcyB0aGUgY2xhc3Mgb2YgZXJyb3IgcmFuZ2luZyBmcm9tIDEuLjVcbiAqIHNvbWV0aW1lcyB1c2VmdWwgZm9yIG1hcHBpbmcgcmVzcG9uZCBjb2xvcnMgZXRjLlxuICpcbiAqIFwic3VnYXJcIiBwcm9wZXJ0aWVzIGFyZSBhbHNvIGRlZmluZWQgZm9yIGNvbW1vbiBjYXNlcy4gQ3VycmVudGx5IHByb3ZpZGluZzpcbiAqXG4gKiAgIC0gLm5vQ29udGVudFxuICogICAtIC5iYWRSZXF1ZXN0XG4gKiAgIC0gLnVuYXV0aG9yaXplZFxuICogICAtIC5ub3RBY2NlcHRhYmxlXG4gKiAgIC0gLm5vdEZvdW5kXG4gKlxuICogQHBhcmFtIHtOdW1iZXJ9IHN0YXR1c1xuICogQGFwaSBwcml2YXRlXG4gKi9cblxuUmVzcG9uc2UucHJvdG90eXBlLl9zZXRTdGF0dXNQcm9wZXJ0aWVzID0gZnVuY3Rpb24oc3RhdHVzKXtcbiAgLy8gaGFuZGxlIElFOSBidWc6IGh0dHA6Ly9zdGFja292ZXJmbG93LmNvbS9xdWVzdGlvbnMvMTAwNDY5NzIvbXNpZS1yZXR1cm5zLXN0YXR1cy1jb2RlLW9mLTEyMjMtZm9yLWFqYXgtcmVxdWVzdFxuICBpZiAoc3RhdHVzID09PSAxMjIzKSB7XG4gICAgc3RhdHVzID0gMjA0O1xuICB9XG5cbiAgdmFyIHR5cGUgPSBzdGF0dXMgLyAxMDAgfCAwO1xuXG4gIC8vIHN0YXR1cyAvIGNsYXNzXG4gIHRoaXMuc3RhdHVzID0gdGhpcy5zdGF0dXNDb2RlID0gc3RhdHVzO1xuICB0aGlzLnN0YXR1c1R5cGUgPSB0eXBlO1xuXG4gIC8vIGJhc2ljc1xuICB0aGlzLmluZm8gPSAxID09IHR5cGU7XG4gIHRoaXMub2sgPSAyID09IHR5cGU7XG4gIHRoaXMuY2xpZW50RXJyb3IgPSA0ID09IHR5cGU7XG4gIHRoaXMuc2VydmVyRXJyb3IgPSA1ID09IHR5cGU7XG4gIHRoaXMuZXJyb3IgPSAoNCA9PSB0eXBlIHx8IDUgPT0gdHlwZSlcbiAgICA/IHRoaXMudG9FcnJvcigpXG4gICAgOiBmYWxzZTtcblxuICAvLyBzdWdhclxuICB0aGlzLmFjY2VwdGVkID0gMjAyID09IHN0YXR1cztcbiAgdGhpcy5ub0NvbnRlbnQgPSAyMDQgPT0gc3RhdHVzO1xuICB0aGlzLmJhZFJlcXVlc3QgPSA0MDAgPT0gc3RhdHVzO1xuICB0aGlzLnVuYXV0aG9yaXplZCA9IDQwMSA9PSBzdGF0dXM7XG4gIHRoaXMubm90QWNjZXB0YWJsZSA9IDQwNiA9PSBzdGF0dXM7XG4gIHRoaXMubm90Rm91bmQgPSA0MDQgPT0gc3RhdHVzO1xuICB0aGlzLmZvcmJpZGRlbiA9IDQwMyA9PSBzdGF0dXM7XG59O1xuXG4vKipcbiAqIFJldHVybiBhbiBgRXJyb3JgIHJlcHJlc2VudGF0aXZlIG9mIHRoaXMgcmVzcG9uc2UuXG4gKlxuICogQHJldHVybiB7RXJyb3J9XG4gKiBAYXBpIHB1YmxpY1xuICovXG5cblJlc3BvbnNlLnByb3RvdHlwZS50b0Vycm9yID0gZnVuY3Rpb24oKXtcbiAgdmFyIHJlcSA9IHRoaXMucmVxO1xuICB2YXIgbWV0aG9kID0gcmVxLm1ldGhvZDtcbiAgdmFyIHVybCA9IHJlcS51cmw7XG5cbiAgdmFyIG1zZyA9ICdjYW5ub3QgJyArIG1ldGhvZCArICcgJyArIHVybCArICcgKCcgKyB0aGlzLnN0YXR1cyArICcpJztcbiAgdmFyIGVyciA9IG5ldyBFcnJvcihtc2cpO1xuICBlcnIuc3RhdHVzID0gdGhpcy5zdGF0dXM7XG4gIGVyci5tZXRob2QgPSBtZXRob2Q7XG4gIGVyci51cmwgPSB1cmw7XG5cbiAgcmV0dXJuIGVycjtcbn07XG5cbi8qKlxuICogRXhwb3NlIGBSZXNwb25zZWAuXG4gKi9cblxucmVxdWVzdC5SZXNwb25zZSA9IFJlc3BvbnNlO1xuXG4vKipcbiAqIEluaXRpYWxpemUgYSBuZXcgYFJlcXVlc3RgIHdpdGggdGhlIGdpdmVuIGBtZXRob2RgIGFuZCBgdXJsYC5cbiAqXG4gKiBAcGFyYW0ge1N0cmluZ30gbWV0aG9kXG4gKiBAcGFyYW0ge1N0cmluZ30gdXJsXG4gKiBAYXBpIHB1YmxpY1xuICovXG5cbmZ1bmN0aW9uIFJlcXVlc3QobWV0aG9kLCB1cmwpIHtcbiAgdmFyIHNlbGYgPSB0aGlzO1xuICB0aGlzLl9xdWVyeSA9IHRoaXMuX3F1ZXJ5IHx8IFtdO1xuICB0aGlzLm1ldGhvZCA9IG1ldGhvZDtcbiAgdGhpcy51cmwgPSB1cmw7XG4gIHRoaXMuaGVhZGVyID0ge307IC8vIHByZXNlcnZlcyBoZWFkZXIgbmFtZSBjYXNlXG4gIHRoaXMuX2hlYWRlciA9IHt9OyAvLyBjb2VyY2VzIGhlYWRlciBuYW1lcyB0byBsb3dlcmNhc2VcbiAgdGhpcy5vbignZW5kJywgZnVuY3Rpb24oKXtcbiAgICB2YXIgZXJyID0gbnVsbDtcbiAgICB2YXIgcmVzID0gbnVsbDtcblxuICAgIHRyeSB7XG4gICAgICByZXMgPSBuZXcgUmVzcG9uc2Uoc2VsZik7XG4gICAgfSBjYXRjaChlKSB7XG4gICAgICBlcnIgPSBuZXcgRXJyb3IoJ1BhcnNlciBpcyB1bmFibGUgdG8gcGFyc2UgdGhlIHJlc3BvbnNlJyk7XG4gICAgICBlcnIucGFyc2UgPSB0cnVlO1xuICAgICAgZXJyLm9yaWdpbmFsID0gZTtcbiAgICAgIC8vIGlzc3VlICM2NzU6IHJldHVybiB0aGUgcmF3IHJlc3BvbnNlIGlmIHRoZSByZXNwb25zZSBwYXJzaW5nIGZhaWxzXG4gICAgICBlcnIucmF3UmVzcG9uc2UgPSBzZWxmLnhociAmJiBzZWxmLnhoci5yZXNwb25zZVRleHQgPyBzZWxmLnhoci5yZXNwb25zZVRleHQgOiBudWxsO1xuICAgICAgLy8gaXNzdWUgIzg3NjogcmV0dXJuIHRoZSBodHRwIHN0YXR1cyBjb2RlIGlmIHRoZSByZXNwb25zZSBwYXJzaW5nIGZhaWxzXG4gICAgICBlcnIuc3RhdHVzQ29kZSA9IHNlbGYueGhyICYmIHNlbGYueGhyLnN0YXR1cyA/IHNlbGYueGhyLnN0YXR1cyA6IG51bGw7XG4gICAgICByZXR1cm4gc2VsZi5jYWxsYmFjayhlcnIpO1xuICAgIH1cblxuICAgIHNlbGYuZW1pdCgncmVzcG9uc2UnLCByZXMpO1xuXG4gICAgdmFyIG5ld19lcnI7XG4gICAgdHJ5IHtcbiAgICAgIGlmIChyZXMuc3RhdHVzIDwgMjAwIHx8IHJlcy5zdGF0dXMgPj0gMzAwKSB7XG4gICAgICAgIG5ld19lcnIgPSBuZXcgRXJyb3IocmVzLnN0YXR1c1RleHQgfHwgJ1Vuc3VjY2Vzc2Z1bCBIVFRQIHJlc3BvbnNlJyk7XG4gICAgICAgIG5ld19lcnIub3JpZ2luYWwgPSBlcnI7XG4gICAgICAgIG5ld19lcnIucmVzcG9uc2UgPSByZXM7XG4gICAgICAgIG5ld19lcnIuc3RhdHVzID0gcmVzLnN0YXR1cztcbiAgICAgIH1cbiAgICB9IGNhdGNoKGUpIHtcbiAgICAgIG5ld19lcnIgPSBlOyAvLyAjOTg1IHRvdWNoaW5nIHJlcyBtYXkgY2F1c2UgSU5WQUxJRF9TVEFURV9FUlIgb24gb2xkIEFuZHJvaWRcbiAgICB9XG5cbiAgICAvLyAjMTAwMCBkb24ndCBjYXRjaCBlcnJvcnMgZnJvbSB0aGUgY2FsbGJhY2sgdG8gYXZvaWQgZG91YmxlIGNhbGxpbmcgaXRcbiAgICBpZiAobmV3X2Vycikge1xuICAgICAgc2VsZi5jYWxsYmFjayhuZXdfZXJyLCByZXMpO1xuICAgIH0gZWxzZSB7XG4gICAgICBzZWxmLmNhbGxiYWNrKG51bGwsIHJlcyk7XG4gICAgfVxuICB9KTtcbn1cblxuLyoqXG4gKiBNaXhpbiBgRW1pdHRlcmAgYW5kIGByZXF1ZXN0QmFzZWAuXG4gKi9cblxuRW1pdHRlcihSZXF1ZXN0LnByb3RvdHlwZSk7XG5mb3IgKHZhciBrZXkgaW4gcmVxdWVzdEJhc2UpIHtcbiAgUmVxdWVzdC5wcm90b3R5cGVba2V5XSA9IHJlcXVlc3RCYXNlW2tleV07XG59XG5cbi8qKlxuICogU2V0IENvbnRlbnQtVHlwZSB0byBgdHlwZWAsIG1hcHBpbmcgdmFsdWVzIGZyb20gYHJlcXVlc3QudHlwZXNgLlxuICpcbiAqIEV4YW1wbGVzOlxuICpcbiAqICAgICAgc3VwZXJhZ2VudC50eXBlcy54bWwgPSAnYXBwbGljYXRpb24veG1sJztcbiAqXG4gKiAgICAgIHJlcXVlc3QucG9zdCgnLycpXG4gKiAgICAgICAgLnR5cGUoJ3htbCcpXG4gKiAgICAgICAgLnNlbmQoeG1sc3RyaW5nKVxuICogICAgICAgIC5lbmQoY2FsbGJhY2spO1xuICpcbiAqICAgICAgcmVxdWVzdC5wb3N0KCcvJylcbiAqICAgICAgICAudHlwZSgnYXBwbGljYXRpb24veG1sJylcbiAqICAgICAgICAuc2VuZCh4bWxzdHJpbmcpXG4gKiAgICAgICAgLmVuZChjYWxsYmFjayk7XG4gKlxuICogQHBhcmFtIHtTdHJpbmd9IHR5cGVcbiAqIEByZXR1cm4ge1JlcXVlc3R9IGZvciBjaGFpbmluZ1xuICogQGFwaSBwdWJsaWNcbiAqL1xuXG5SZXF1ZXN0LnByb3RvdHlwZS50eXBlID0gZnVuY3Rpb24odHlwZSl7XG4gIHRoaXMuc2V0KCdDb250ZW50LVR5cGUnLCByZXF1ZXN0LnR5cGVzW3R5cGVdIHx8IHR5cGUpO1xuICByZXR1cm4gdGhpcztcbn07XG5cbi8qKlxuICogU2V0IHJlc3BvbnNlVHlwZSB0byBgdmFsYC4gUHJlc2VudGx5IHZhbGlkIHJlc3BvbnNlVHlwZXMgYXJlICdibG9iJyBhbmRcbiAqICdhcnJheWJ1ZmZlcicuXG4gKlxuICogRXhhbXBsZXM6XG4gKlxuICogICAgICByZXEuZ2V0KCcvJylcbiAqICAgICAgICAucmVzcG9uc2VUeXBlKCdibG9iJylcbiAqICAgICAgICAuZW5kKGNhbGxiYWNrKTtcbiAqXG4gKiBAcGFyYW0ge1N0cmluZ30gdmFsXG4gKiBAcmV0dXJuIHtSZXF1ZXN0fSBmb3IgY2hhaW5pbmdcbiAqIEBhcGkgcHVibGljXG4gKi9cblxuUmVxdWVzdC5wcm90b3R5cGUucmVzcG9uc2VUeXBlID0gZnVuY3Rpb24odmFsKXtcbiAgdGhpcy5fcmVzcG9uc2VUeXBlID0gdmFsO1xuICByZXR1cm4gdGhpcztcbn07XG5cbi8qKlxuICogU2V0IEFjY2VwdCB0byBgdHlwZWAsIG1hcHBpbmcgdmFsdWVzIGZyb20gYHJlcXVlc3QudHlwZXNgLlxuICpcbiAqIEV4YW1wbGVzOlxuICpcbiAqICAgICAgc3VwZXJhZ2VudC50eXBlcy5qc29uID0gJ2FwcGxpY2F0aW9uL2pzb24nO1xuICpcbiAqICAgICAgcmVxdWVzdC5nZXQoJy9hZ2VudCcpXG4gKiAgICAgICAgLmFjY2VwdCgnanNvbicpXG4gKiAgICAgICAgLmVuZChjYWxsYmFjayk7XG4gKlxuICogICAgICByZXF1ZXN0LmdldCgnL2FnZW50JylcbiAqICAgICAgICAuYWNjZXB0KCdhcHBsaWNhdGlvbi9qc29uJylcbiAqICAgICAgICAuZW5kKGNhbGxiYWNrKTtcbiAqXG4gKiBAcGFyYW0ge1N0cmluZ30gYWNjZXB0XG4gKiBAcmV0dXJuIHtSZXF1ZXN0fSBmb3IgY2hhaW5pbmdcbiAqIEBhcGkgcHVibGljXG4gKi9cblxuUmVxdWVzdC5wcm90b3R5cGUuYWNjZXB0ID0gZnVuY3Rpb24odHlwZSl7XG4gIHRoaXMuc2V0KCdBY2NlcHQnLCByZXF1ZXN0LnR5cGVzW3R5cGVdIHx8IHR5cGUpO1xuICByZXR1cm4gdGhpcztcbn07XG5cbi8qKlxuICogU2V0IEF1dGhvcml6YXRpb24gZmllbGQgdmFsdWUgd2l0aCBgdXNlcmAgYW5kIGBwYXNzYC5cbiAqXG4gKiBAcGFyYW0ge1N0cmluZ30gdXNlclxuICogQHBhcmFtIHtTdHJpbmd9IHBhc3NcbiAqIEBwYXJhbSB7T2JqZWN0fSBvcHRpb25zIHdpdGggJ3R5cGUnIHByb3BlcnR5ICdhdXRvJyBvciAnYmFzaWMnIChkZWZhdWx0ICdiYXNpYycpXG4gKiBAcmV0dXJuIHtSZXF1ZXN0fSBmb3IgY2hhaW5pbmdcbiAqIEBhcGkgcHVibGljXG4gKi9cblxuUmVxdWVzdC5wcm90b3R5cGUuYXV0aCA9IGZ1bmN0aW9uKHVzZXIsIHBhc3MsIG9wdGlvbnMpe1xuICBpZiAoIW9wdGlvbnMpIHtcbiAgICBvcHRpb25zID0ge1xuICAgICAgdHlwZTogJ2Jhc2ljJ1xuICAgIH1cbiAgfVxuXG4gIHN3aXRjaCAob3B0aW9ucy50eXBlKSB7XG4gICAgY2FzZSAnYmFzaWMnOlxuICAgICAgdmFyIHN0ciA9IGJ0b2EodXNlciArICc6JyArIHBhc3MpO1xuICAgICAgdGhpcy5zZXQoJ0F1dGhvcml6YXRpb24nLCAnQmFzaWMgJyArIHN0cik7XG4gICAgYnJlYWs7XG5cbiAgICBjYXNlICdhdXRvJzpcbiAgICAgIHRoaXMudXNlcm5hbWUgPSB1c2VyO1xuICAgICAgdGhpcy5wYXNzd29yZCA9IHBhc3M7XG4gICAgYnJlYWs7XG4gIH1cbiAgcmV0dXJuIHRoaXM7XG59O1xuXG4vKipcbiogQWRkIHF1ZXJ5LXN0cmluZyBgdmFsYC5cbipcbiogRXhhbXBsZXM6XG4qXG4qICAgcmVxdWVzdC5nZXQoJy9zaG9lcycpXG4qICAgICAucXVlcnkoJ3NpemU9MTAnKVxuKiAgICAgLnF1ZXJ5KHsgY29sb3I6ICdibHVlJyB9KVxuKlxuKiBAcGFyYW0ge09iamVjdHxTdHJpbmd9IHZhbFxuKiBAcmV0dXJuIHtSZXF1ZXN0fSBmb3IgY2hhaW5pbmdcbiogQGFwaSBwdWJsaWNcbiovXG5cblJlcXVlc3QucHJvdG90eXBlLnF1ZXJ5ID0gZnVuY3Rpb24odmFsKXtcbiAgaWYgKCdzdHJpbmcnICE9IHR5cGVvZiB2YWwpIHZhbCA9IHNlcmlhbGl6ZSh2YWwpO1xuICBpZiAodmFsKSB0aGlzLl9xdWVyeS5wdXNoKHZhbCk7XG4gIHJldHVybiB0aGlzO1xufTtcblxuLyoqXG4gKiBRdWV1ZSB0aGUgZ2l2ZW4gYGZpbGVgIGFzIGFuIGF0dGFjaG1lbnQgdG8gdGhlIHNwZWNpZmllZCBgZmllbGRgLFxuICogd2l0aCBvcHRpb25hbCBgZmlsZW5hbWVgLlxuICpcbiAqIGBgYCBqc1xuICogcmVxdWVzdC5wb3N0KCcvdXBsb2FkJylcbiAqICAgLmF0dGFjaCgnY29udGVudCcsIG5ldyBCbG9iKFsnPGEgaWQ9XCJhXCI+PGIgaWQ9XCJiXCI+aGV5ITwvYj48L2E+J10sIHsgdHlwZTogXCJ0ZXh0L2h0bWxcIn0pKVxuICogICAuZW5kKGNhbGxiYWNrKTtcbiAqIGBgYFxuICpcbiAqIEBwYXJhbSB7U3RyaW5nfSBmaWVsZFxuICogQHBhcmFtIHtCbG9ifEZpbGV9IGZpbGVcbiAqIEBwYXJhbSB7U3RyaW5nfSBmaWxlbmFtZVxuICogQHJldHVybiB7UmVxdWVzdH0gZm9yIGNoYWluaW5nXG4gKiBAYXBpIHB1YmxpY1xuICovXG5cblJlcXVlc3QucHJvdG90eXBlLmF0dGFjaCA9IGZ1bmN0aW9uKGZpZWxkLCBmaWxlLCBmaWxlbmFtZSl7XG4gIHRoaXMuX2dldEZvcm1EYXRhKCkuYXBwZW5kKGZpZWxkLCBmaWxlLCBmaWxlbmFtZSB8fCBmaWxlLm5hbWUpO1xuICByZXR1cm4gdGhpcztcbn07XG5cblJlcXVlc3QucHJvdG90eXBlLl9nZXRGb3JtRGF0YSA9IGZ1bmN0aW9uKCl7XG4gIGlmICghdGhpcy5fZm9ybURhdGEpIHtcbiAgICB0aGlzLl9mb3JtRGF0YSA9IG5ldyByb290LkZvcm1EYXRhKCk7XG4gIH1cbiAgcmV0dXJuIHRoaXMuX2Zvcm1EYXRhO1xufTtcblxuLyoqXG4gKiBJbnZva2UgdGhlIGNhbGxiYWNrIHdpdGggYGVycmAgYW5kIGByZXNgXG4gKiBhbmQgaGFuZGxlIGFyaXR5IGNoZWNrLlxuICpcbiAqIEBwYXJhbSB7RXJyb3J9IGVyclxuICogQHBhcmFtIHtSZXNwb25zZX0gcmVzXG4gKiBAYXBpIHByaXZhdGVcbiAqL1xuXG5SZXF1ZXN0LnByb3RvdHlwZS5jYWxsYmFjayA9IGZ1bmN0aW9uKGVyciwgcmVzKXtcbiAgdmFyIGZuID0gdGhpcy5fY2FsbGJhY2s7XG4gIHRoaXMuY2xlYXJUaW1lb3V0KCk7XG4gIGZuKGVyciwgcmVzKTtcbn07XG5cbi8qKlxuICogSW52b2tlIGNhbGxiYWNrIHdpdGggeC1kb21haW4gZXJyb3IuXG4gKlxuICogQGFwaSBwcml2YXRlXG4gKi9cblxuUmVxdWVzdC5wcm90b3R5cGUuY3Jvc3NEb21haW5FcnJvciA9IGZ1bmN0aW9uKCl7XG4gIHZhciBlcnIgPSBuZXcgRXJyb3IoJ1JlcXVlc3QgaGFzIGJlZW4gdGVybWluYXRlZFxcblBvc3NpYmxlIGNhdXNlczogdGhlIG5ldHdvcmsgaXMgb2ZmbGluZSwgT3JpZ2luIGlzIG5vdCBhbGxvd2VkIGJ5IEFjY2Vzcy1Db250cm9sLUFsbG93LU9yaWdpbiwgdGhlIHBhZ2UgaXMgYmVpbmcgdW5sb2FkZWQsIGV0Yy4nKTtcbiAgZXJyLmNyb3NzRG9tYWluID0gdHJ1ZTtcblxuICBlcnIuc3RhdHVzID0gdGhpcy5zdGF0dXM7XG4gIGVyci5tZXRob2QgPSB0aGlzLm1ldGhvZDtcbiAgZXJyLnVybCA9IHRoaXMudXJsO1xuXG4gIHRoaXMuY2FsbGJhY2soZXJyKTtcbn07XG5cbi8qKlxuICogSW52b2tlIGNhbGxiYWNrIHdpdGggdGltZW91dCBlcnJvci5cbiAqXG4gKiBAYXBpIHByaXZhdGVcbiAqL1xuXG5SZXF1ZXN0LnByb3RvdHlwZS5fdGltZW91dEVycm9yID0gZnVuY3Rpb24oKXtcbiAgdmFyIHRpbWVvdXQgPSB0aGlzLl90aW1lb3V0O1xuICB2YXIgZXJyID0gbmV3IEVycm9yKCd0aW1lb3V0IG9mICcgKyB0aW1lb3V0ICsgJ21zIGV4Y2VlZGVkJyk7XG4gIGVyci50aW1lb3V0ID0gdGltZW91dDtcbiAgdGhpcy5jYWxsYmFjayhlcnIpO1xufTtcblxuLyoqXG4gKiBDb21wb3NlIHF1ZXJ5c3RyaW5nIHRvIGFwcGVuZCB0byByZXEudXJsXG4gKlxuICogQGFwaSBwcml2YXRlXG4gKi9cblxuUmVxdWVzdC5wcm90b3R5cGUuX2FwcGVuZFF1ZXJ5U3RyaW5nID0gZnVuY3Rpb24oKXtcbiAgdmFyIHF1ZXJ5ID0gdGhpcy5fcXVlcnkuam9pbignJicpO1xuICBpZiAocXVlcnkpIHtcbiAgICB0aGlzLnVybCArPSB+dGhpcy51cmwuaW5kZXhPZignPycpXG4gICAgICA/ICcmJyArIHF1ZXJ5XG4gICAgICA6ICc/JyArIHF1ZXJ5O1xuICB9XG59O1xuXG4vKipcbiAqIEluaXRpYXRlIHJlcXVlc3QsIGludm9raW5nIGNhbGxiYWNrIGBmbihyZXMpYFxuICogd2l0aCBhbiBpbnN0YW5jZW9mIGBSZXNwb25zZWAuXG4gKlxuICogQHBhcmFtIHtGdW5jdGlvbn0gZm5cbiAqIEByZXR1cm4ge1JlcXVlc3R9IGZvciBjaGFpbmluZ1xuICogQGFwaSBwdWJsaWNcbiAqL1xuXG5SZXF1ZXN0LnByb3RvdHlwZS5lbmQgPSBmdW5jdGlvbihmbil7XG4gIHZhciBzZWxmID0gdGhpcztcbiAgdmFyIHhociA9IHRoaXMueGhyID0gcmVxdWVzdC5nZXRYSFIoKTtcbiAgdmFyIHRpbWVvdXQgPSB0aGlzLl90aW1lb3V0O1xuICB2YXIgZGF0YSA9IHRoaXMuX2Zvcm1EYXRhIHx8IHRoaXMuX2RhdGE7XG5cbiAgLy8gc3RvcmUgY2FsbGJhY2tcbiAgdGhpcy5fY2FsbGJhY2sgPSBmbiB8fCBub29wO1xuXG4gIC8vIHN0YXRlIGNoYW5nZVxuICB4aHIub25yZWFkeXN0YXRlY2hhbmdlID0gZnVuY3Rpb24oKXtcbiAgICBpZiAoNCAhPSB4aHIucmVhZHlTdGF0ZSkgcmV0dXJuO1xuXG4gICAgLy8gSW4gSUU5LCByZWFkcyB0byBhbnkgcHJvcGVydHkgKGUuZy4gc3RhdHVzKSBvZmYgb2YgYW4gYWJvcnRlZCBYSFIgd2lsbFxuICAgIC8vIHJlc3VsdCBpbiB0aGUgZXJyb3IgXCJDb3VsZCBub3QgY29tcGxldGUgdGhlIG9wZXJhdGlvbiBkdWUgdG8gZXJyb3IgYzAwYzAyM2ZcIlxuICAgIHZhciBzdGF0dXM7XG4gICAgdHJ5IHsgc3RhdHVzID0geGhyLnN0YXR1cyB9IGNhdGNoKGUpIHsgc3RhdHVzID0gMDsgfVxuXG4gICAgaWYgKDAgPT0gc3RhdHVzKSB7XG4gICAgICBpZiAoc2VsZi50aW1lZG91dCkgcmV0dXJuIHNlbGYuX3RpbWVvdXRFcnJvcigpO1xuICAgICAgaWYgKHNlbGYuX2Fib3J0ZWQpIHJldHVybjtcbiAgICAgIHJldHVybiBzZWxmLmNyb3NzRG9tYWluRXJyb3IoKTtcbiAgICB9XG4gICAgc2VsZi5lbWl0KCdlbmQnKTtcbiAgfTtcblxuICAvLyBwcm9ncmVzc1xuICB2YXIgaGFuZGxlUHJvZ3Jlc3MgPSBmdW5jdGlvbihlKXtcbiAgICBpZiAoZS50b3RhbCA+IDApIHtcbiAgICAgIGUucGVyY2VudCA9IGUubG9hZGVkIC8gZS50b3RhbCAqIDEwMDtcbiAgICB9XG4gICAgZS5kaXJlY3Rpb24gPSAnZG93bmxvYWQnO1xuICAgIHNlbGYuZW1pdCgncHJvZ3Jlc3MnLCBlKTtcbiAgfTtcbiAgaWYgKHRoaXMuaGFzTGlzdGVuZXJzKCdwcm9ncmVzcycpKSB7XG4gICAgeGhyLm9ucHJvZ3Jlc3MgPSBoYW5kbGVQcm9ncmVzcztcbiAgfVxuICB0cnkge1xuICAgIGlmICh4aHIudXBsb2FkICYmIHRoaXMuaGFzTGlzdGVuZXJzKCdwcm9ncmVzcycpKSB7XG4gICAgICB4aHIudXBsb2FkLm9ucHJvZ3Jlc3MgPSBoYW5kbGVQcm9ncmVzcztcbiAgICB9XG4gIH0gY2F0Y2goZSkge1xuICAgIC8vIEFjY2Vzc2luZyB4aHIudXBsb2FkIGZhaWxzIGluIElFIGZyb20gYSB3ZWIgd29ya2VyLCBzbyBqdXN0IHByZXRlbmQgaXQgZG9lc24ndCBleGlzdC5cbiAgICAvLyBSZXBvcnRlZCBoZXJlOlxuICAgIC8vIGh0dHBzOi8vY29ubmVjdC5taWNyb3NvZnQuY29tL0lFL2ZlZWRiYWNrL2RldGFpbHMvODM3MjQ1L3htbGh0dHByZXF1ZXN0LXVwbG9hZC10aHJvd3MtaW52YWxpZC1hcmd1bWVudC13aGVuLXVzZWQtZnJvbS13ZWItd29ya2VyLWNvbnRleHRcbiAgfVxuXG4gIC8vIHRpbWVvdXRcbiAgaWYgKHRpbWVvdXQgJiYgIXRoaXMuX3RpbWVyKSB7XG4gICAgdGhpcy5fdGltZXIgPSBzZXRUaW1lb3V0KGZ1bmN0aW9uKCl7XG4gICAgICBzZWxmLnRpbWVkb3V0ID0gdHJ1ZTtcbiAgICAgIHNlbGYuYWJvcnQoKTtcbiAgICB9LCB0aW1lb3V0KTtcbiAgfVxuXG4gIC8vIHF1ZXJ5c3RyaW5nXG4gIHRoaXMuX2FwcGVuZFF1ZXJ5U3RyaW5nKCk7XG5cbiAgLy8gaW5pdGlhdGUgcmVxdWVzdFxuICBpZiAodGhpcy51c2VybmFtZSAmJiB0aGlzLnBhc3N3b3JkKSB7XG4gICAgeGhyLm9wZW4odGhpcy5tZXRob2QsIHRoaXMudXJsLCB0cnVlLCB0aGlzLnVzZXJuYW1lLCB0aGlzLnBhc3N3b3JkKTtcbiAgfSBlbHNlIHtcbiAgICB4aHIub3Blbih0aGlzLm1ldGhvZCwgdGhpcy51cmwsIHRydWUpO1xuICB9XG5cbiAgLy8gQ09SU1xuICBpZiAodGhpcy5fd2l0aENyZWRlbnRpYWxzKSB4aHIud2l0aENyZWRlbnRpYWxzID0gdHJ1ZTtcblxuICAvLyBib2R5XG4gIGlmICgnR0VUJyAhPSB0aGlzLm1ldGhvZCAmJiAnSEVBRCcgIT0gdGhpcy5tZXRob2QgJiYgJ3N0cmluZycgIT0gdHlwZW9mIGRhdGEgJiYgIXRoaXMuX2lzSG9zdChkYXRhKSkge1xuICAgIC8vIHNlcmlhbGl6ZSBzdHVmZlxuICAgIHZhciBjb250ZW50VHlwZSA9IHRoaXMuX2hlYWRlclsnY29udGVudC10eXBlJ107XG4gICAgdmFyIHNlcmlhbGl6ZSA9IHRoaXMuX3NlcmlhbGl6ZXIgfHwgcmVxdWVzdC5zZXJpYWxpemVbY29udGVudFR5cGUgPyBjb250ZW50VHlwZS5zcGxpdCgnOycpWzBdIDogJyddO1xuICAgIGlmICghc2VyaWFsaXplICYmIGlzSlNPTihjb250ZW50VHlwZSkpIHNlcmlhbGl6ZSA9IHJlcXVlc3Quc2VyaWFsaXplWydhcHBsaWNhdGlvbi9qc29uJ107XG4gICAgaWYgKHNlcmlhbGl6ZSkgZGF0YSA9IHNlcmlhbGl6ZShkYXRhKTtcbiAgfVxuXG4gIC8vIHNldCBoZWFkZXIgZmllbGRzXG4gIGZvciAodmFyIGZpZWxkIGluIHRoaXMuaGVhZGVyKSB7XG4gICAgaWYgKG51bGwgPT0gdGhpcy5oZWFkZXJbZmllbGRdKSBjb250aW51ZTtcbiAgICB4aHIuc2V0UmVxdWVzdEhlYWRlcihmaWVsZCwgdGhpcy5oZWFkZXJbZmllbGRdKTtcbiAgfVxuXG4gIGlmICh0aGlzLl9yZXNwb25zZVR5cGUpIHtcbiAgICB4aHIucmVzcG9uc2VUeXBlID0gdGhpcy5fcmVzcG9uc2VUeXBlO1xuICB9XG5cbiAgLy8gc2VuZCBzdHVmZlxuICB0aGlzLmVtaXQoJ3JlcXVlc3QnLCB0aGlzKTtcblxuICAvLyBJRTExIHhoci5zZW5kKHVuZGVmaW5lZCkgc2VuZHMgJ3VuZGVmaW5lZCcgc3RyaW5nIGFzIFBPU1QgcGF5bG9hZCAoaW5zdGVhZCBvZiBub3RoaW5nKVxuICAvLyBXZSBuZWVkIG51bGwgaGVyZSBpZiBkYXRhIGlzIHVuZGVmaW5lZFxuICB4aHIuc2VuZCh0eXBlb2YgZGF0YSAhPT0gJ3VuZGVmaW5lZCcgPyBkYXRhIDogbnVsbCk7XG4gIHJldHVybiB0aGlzO1xufTtcblxuXG4vKipcbiAqIEV4cG9zZSBgUmVxdWVzdGAuXG4gKi9cblxucmVxdWVzdC5SZXF1ZXN0ID0gUmVxdWVzdDtcblxuLyoqXG4gKiBHRVQgYHVybGAgd2l0aCBvcHRpb25hbCBjYWxsYmFjayBgZm4ocmVzKWAuXG4gKlxuICogQHBhcmFtIHtTdHJpbmd9IHVybFxuICogQHBhcmFtIHtNaXhlZHxGdW5jdGlvbn0gW2RhdGFdIG9yIGZuXG4gKiBAcGFyYW0ge0Z1bmN0aW9ufSBbZm5dXG4gKiBAcmV0dXJuIHtSZXF1ZXN0fVxuICogQGFwaSBwdWJsaWNcbiAqL1xuXG5yZXF1ZXN0LmdldCA9IGZ1bmN0aW9uKHVybCwgZGF0YSwgZm4pe1xuICB2YXIgcmVxID0gcmVxdWVzdCgnR0VUJywgdXJsKTtcbiAgaWYgKCdmdW5jdGlvbicgPT0gdHlwZW9mIGRhdGEpIGZuID0gZGF0YSwgZGF0YSA9IG51bGw7XG4gIGlmIChkYXRhKSByZXEucXVlcnkoZGF0YSk7XG4gIGlmIChmbikgcmVxLmVuZChmbik7XG4gIHJldHVybiByZXE7XG59O1xuXG4vKipcbiAqIEhFQUQgYHVybGAgd2l0aCBvcHRpb25hbCBjYWxsYmFjayBgZm4ocmVzKWAuXG4gKlxuICogQHBhcmFtIHtTdHJpbmd9IHVybFxuICogQHBhcmFtIHtNaXhlZHxGdW5jdGlvbn0gW2RhdGFdIG9yIGZuXG4gKiBAcGFyYW0ge0Z1bmN0aW9ufSBbZm5dXG4gKiBAcmV0dXJuIHtSZXF1ZXN0fVxuICogQGFwaSBwdWJsaWNcbiAqL1xuXG5yZXF1ZXN0LmhlYWQgPSBmdW5jdGlvbih1cmwsIGRhdGEsIGZuKXtcbiAgdmFyIHJlcSA9IHJlcXVlc3QoJ0hFQUQnLCB1cmwpO1xuICBpZiAoJ2Z1bmN0aW9uJyA9PSB0eXBlb2YgZGF0YSkgZm4gPSBkYXRhLCBkYXRhID0gbnVsbDtcbiAgaWYgKGRhdGEpIHJlcS5zZW5kKGRhdGEpO1xuICBpZiAoZm4pIHJlcS5lbmQoZm4pO1xuICByZXR1cm4gcmVxO1xufTtcblxuLyoqXG4gKiBPUFRJT05TIHF1ZXJ5IHRvIGB1cmxgIHdpdGggb3B0aW9uYWwgY2FsbGJhY2sgYGZuKHJlcylgLlxuICpcbiAqIEBwYXJhbSB7U3RyaW5nfSB1cmxcbiAqIEBwYXJhbSB7TWl4ZWR8RnVuY3Rpb259IFtkYXRhXSBvciBmblxuICogQHBhcmFtIHtGdW5jdGlvbn0gW2ZuXVxuICogQHJldHVybiB7UmVxdWVzdH1cbiAqIEBhcGkgcHVibGljXG4gKi9cblxucmVxdWVzdC5vcHRpb25zID0gZnVuY3Rpb24odXJsLCBkYXRhLCBmbil7XG4gIHZhciByZXEgPSByZXF1ZXN0KCdPUFRJT05TJywgdXJsKTtcbiAgaWYgKCdmdW5jdGlvbicgPT0gdHlwZW9mIGRhdGEpIGZuID0gZGF0YSwgZGF0YSA9IG51bGw7XG4gIGlmIChkYXRhKSByZXEuc2VuZChkYXRhKTtcbiAgaWYgKGZuKSByZXEuZW5kKGZuKTtcbiAgcmV0dXJuIHJlcTtcbn07XG5cbi8qKlxuICogREVMRVRFIGB1cmxgIHdpdGggb3B0aW9uYWwgY2FsbGJhY2sgYGZuKHJlcylgLlxuICpcbiAqIEBwYXJhbSB7U3RyaW5nfSB1cmxcbiAqIEBwYXJhbSB7RnVuY3Rpb259IFtmbl1cbiAqIEByZXR1cm4ge1JlcXVlc3R9XG4gKiBAYXBpIHB1YmxpY1xuICovXG5cbmZ1bmN0aW9uIGRlbCh1cmwsIGZuKXtcbiAgdmFyIHJlcSA9IHJlcXVlc3QoJ0RFTEVURScsIHVybCk7XG4gIGlmIChmbikgcmVxLmVuZChmbik7XG4gIHJldHVybiByZXE7XG59O1xuXG5yZXF1ZXN0WydkZWwnXSA9IGRlbDtcbnJlcXVlc3RbJ2RlbGV0ZSddID0gZGVsO1xuXG4vKipcbiAqIFBBVENIIGB1cmxgIHdpdGggb3B0aW9uYWwgYGRhdGFgIGFuZCBjYWxsYmFjayBgZm4ocmVzKWAuXG4gKlxuICogQHBhcmFtIHtTdHJpbmd9IHVybFxuICogQHBhcmFtIHtNaXhlZH0gW2RhdGFdXG4gKiBAcGFyYW0ge0Z1bmN0aW9ufSBbZm5dXG4gKiBAcmV0dXJuIHtSZXF1ZXN0fVxuICogQGFwaSBwdWJsaWNcbiAqL1xuXG5yZXF1ZXN0LnBhdGNoID0gZnVuY3Rpb24odXJsLCBkYXRhLCBmbil7XG4gIHZhciByZXEgPSByZXF1ZXN0KCdQQVRDSCcsIHVybCk7XG4gIGlmICgnZnVuY3Rpb24nID09IHR5cGVvZiBkYXRhKSBmbiA9IGRhdGEsIGRhdGEgPSBudWxsO1xuICBpZiAoZGF0YSkgcmVxLnNlbmQoZGF0YSk7XG4gIGlmIChmbikgcmVxLmVuZChmbik7XG4gIHJldHVybiByZXE7XG59O1xuXG4vKipcbiAqIFBPU1QgYHVybGAgd2l0aCBvcHRpb25hbCBgZGF0YWAgYW5kIGNhbGxiYWNrIGBmbihyZXMpYC5cbiAqXG4gKiBAcGFyYW0ge1N0cmluZ30gdXJsXG4gKiBAcGFyYW0ge01peGVkfSBbZGF0YV1cbiAqIEBwYXJhbSB7RnVuY3Rpb259IFtmbl1cbiAqIEByZXR1cm4ge1JlcXVlc3R9XG4gKiBAYXBpIHB1YmxpY1xuICovXG5cbnJlcXVlc3QucG9zdCA9IGZ1bmN0aW9uKHVybCwgZGF0YSwgZm4pe1xuICB2YXIgcmVxID0gcmVxdWVzdCgnUE9TVCcsIHVybCk7XG4gIGlmICgnZnVuY3Rpb24nID09IHR5cGVvZiBkYXRhKSBmbiA9IGRhdGEsIGRhdGEgPSBudWxsO1xuICBpZiAoZGF0YSkgcmVxLnNlbmQoZGF0YSk7XG4gIGlmIChmbikgcmVxLmVuZChmbik7XG4gIHJldHVybiByZXE7XG59O1xuXG4vKipcbiAqIFBVVCBgdXJsYCB3aXRoIG9wdGlvbmFsIGBkYXRhYCBhbmQgY2FsbGJhY2sgYGZuKHJlcylgLlxuICpcbiAqIEBwYXJhbSB7U3RyaW5nfSB1cmxcbiAqIEBwYXJhbSB7TWl4ZWR8RnVuY3Rpb259IFtkYXRhXSBvciBmblxuICogQHBhcmFtIHtGdW5jdGlvbn0gW2ZuXVxuICogQHJldHVybiB7UmVxdWVzdH1cbiAqIEBhcGkgcHVibGljXG4gKi9cblxucmVxdWVzdC5wdXQgPSBmdW5jdGlvbih1cmwsIGRhdGEsIGZuKXtcbiAgdmFyIHJlcSA9IHJlcXVlc3QoJ1BVVCcsIHVybCk7XG4gIGlmICgnZnVuY3Rpb24nID09IHR5cGVvZiBkYXRhKSBmbiA9IGRhdGEsIGRhdGEgPSBudWxsO1xuICBpZiAoZGF0YSkgcmVxLnNlbmQoZGF0YSk7XG4gIGlmIChmbikgcmVxLmVuZChmbik7XG4gIHJldHVybiByZXE7XG59O1xuIiwiLyoqXG4gKiBDaGVjayBpZiBgb2JqYCBpcyBhbiBvYmplY3QuXG4gKlxuICogQHBhcmFtIHtPYmplY3R9IG9ialxuICogQHJldHVybiB7Qm9vbGVhbn1cbiAqIEBhcGkgcHJpdmF0ZVxuICovXG5cbmZ1bmN0aW9uIGlzT2JqZWN0KG9iaikge1xuICByZXR1cm4gbnVsbCAhPT0gb2JqICYmICdvYmplY3QnID09PSB0eXBlb2Ygb2JqO1xufVxuXG5tb2R1bGUuZXhwb3J0cyA9IGlzT2JqZWN0O1xuIiwiLyoqXG4gKiBNb2R1bGUgb2YgbWl4ZWQtaW4gZnVuY3Rpb25zIHNoYXJlZCBiZXR3ZWVuIG5vZGUgYW5kIGNsaWVudCBjb2RlXG4gKi9cbnZhciBpc09iamVjdCA9IHJlcXVpcmUoJy4vaXMtb2JqZWN0Jyk7XG5cbi8qKlxuICogQ2xlYXIgcHJldmlvdXMgdGltZW91dC5cbiAqXG4gKiBAcmV0dXJuIHtSZXF1ZXN0fSBmb3IgY2hhaW5pbmdcbiAqIEBhcGkgcHVibGljXG4gKi9cblxuZXhwb3J0cy5jbGVhclRpbWVvdXQgPSBmdW5jdGlvbiBfY2xlYXJUaW1lb3V0KCl7XG4gIHRoaXMuX3RpbWVvdXQgPSAwO1xuICBjbGVhclRpbWVvdXQodGhpcy5fdGltZXIpO1xuICByZXR1cm4gdGhpcztcbn07XG5cbi8qKlxuICogT3ZlcnJpZGUgZGVmYXVsdCByZXNwb25zZSBib2R5IHBhcnNlclxuICpcbiAqIFRoaXMgZnVuY3Rpb24gd2lsbCBiZSBjYWxsZWQgdG8gY29udmVydCBpbmNvbWluZyBkYXRhIGludG8gcmVxdWVzdC5ib2R5XG4gKlxuICogQHBhcmFtIHtGdW5jdGlvbn1cbiAqIEBhcGkgcHVibGljXG4gKi9cblxuZXhwb3J0cy5wYXJzZSA9IGZ1bmN0aW9uIHBhcnNlKGZuKXtcbiAgdGhpcy5fcGFyc2VyID0gZm47XG4gIHJldHVybiB0aGlzO1xufTtcblxuLyoqXG4gKiBPdmVycmlkZSBkZWZhdWx0IHJlcXVlc3QgYm9keSBzZXJpYWxpemVyXG4gKlxuICogVGhpcyBmdW5jdGlvbiB3aWxsIGJlIGNhbGxlZCB0byBjb252ZXJ0IGRhdGEgc2V0IHZpYSAuc2VuZCBvciAuYXR0YWNoIGludG8gcGF5bG9hZCB0byBzZW5kXG4gKlxuICogQHBhcmFtIHtGdW5jdGlvbn1cbiAqIEBhcGkgcHVibGljXG4gKi9cblxuZXhwb3J0cy5zZXJpYWxpemUgPSBmdW5jdGlvbiBzZXJpYWxpemUoZm4pe1xuICB0aGlzLl9zZXJpYWxpemVyID0gZm47XG4gIHJldHVybiB0aGlzO1xufTtcblxuLyoqXG4gKiBTZXQgdGltZW91dCB0byBgbXNgLlxuICpcbiAqIEBwYXJhbSB7TnVtYmVyfSBtc1xuICogQHJldHVybiB7UmVxdWVzdH0gZm9yIGNoYWluaW5nXG4gKiBAYXBpIHB1YmxpY1xuICovXG5cbmV4cG9ydHMudGltZW91dCA9IGZ1bmN0aW9uIHRpbWVvdXQobXMpe1xuICB0aGlzLl90aW1lb3V0ID0gbXM7XG4gIHJldHVybiB0aGlzO1xufTtcblxuLyoqXG4gKiBQcm9taXNlIHN1cHBvcnRcbiAqXG4gKiBAcGFyYW0ge0Z1bmN0aW9ufSByZXNvbHZlXG4gKiBAcGFyYW0ge0Z1bmN0aW9ufSByZWplY3RcbiAqIEByZXR1cm4ge1JlcXVlc3R9XG4gKi9cblxuZXhwb3J0cy50aGVuID0gZnVuY3Rpb24gdGhlbihyZXNvbHZlLCByZWplY3QpIHtcbiAgaWYgKCF0aGlzLl9mdWxsZmlsbGVkUHJvbWlzZSkge1xuICAgIHZhciBzZWxmID0gdGhpcztcbiAgICB0aGlzLl9mdWxsZmlsbGVkUHJvbWlzZSA9IG5ldyBQcm9taXNlKGZ1bmN0aW9uKGlubmVyUmVzb2x2ZSwgaW5uZXJSZWplY3Qpe1xuICAgICAgc2VsZi5lbmQoZnVuY3Rpb24oZXJyLCByZXMpe1xuICAgICAgICBpZiAoZXJyKSBpbm5lclJlamVjdChlcnIpOyBlbHNlIGlubmVyUmVzb2x2ZShyZXMpO1xuICAgICAgfSk7XG4gICAgfSk7XG4gIH1cbiAgcmV0dXJuIHRoaXMuX2Z1bGxmaWxsZWRQcm9taXNlLnRoZW4ocmVzb2x2ZSwgcmVqZWN0KTtcbn1cblxuLyoqXG4gKiBBbGxvdyBmb3IgZXh0ZW5zaW9uXG4gKi9cblxuZXhwb3J0cy51c2UgPSBmdW5jdGlvbiB1c2UoZm4pIHtcbiAgZm4odGhpcyk7XG4gIHJldHVybiB0aGlzO1xufVxuXG5cbi8qKlxuICogR2V0IHJlcXVlc3QgaGVhZGVyIGBmaWVsZGAuXG4gKiBDYXNlLWluc2Vuc2l0aXZlLlxuICpcbiAqIEBwYXJhbSB7U3RyaW5nfSBmaWVsZFxuICogQHJldHVybiB7U3RyaW5nfVxuICogQGFwaSBwdWJsaWNcbiAqL1xuXG5leHBvcnRzLmdldCA9IGZ1bmN0aW9uKGZpZWxkKXtcbiAgcmV0dXJuIHRoaXMuX2hlYWRlcltmaWVsZC50b0xvd2VyQ2FzZSgpXTtcbn07XG5cbi8qKlxuICogR2V0IGNhc2UtaW5zZW5zaXRpdmUgaGVhZGVyIGBmaWVsZGAgdmFsdWUuXG4gKiBUaGlzIGlzIGEgZGVwcmVjYXRlZCBpbnRlcm5hbCBBUEkuIFVzZSBgLmdldChmaWVsZClgIGluc3RlYWQuXG4gKlxuICogKGdldEhlYWRlciBpcyBubyBsb25nZXIgdXNlZCBpbnRlcm5hbGx5IGJ5IHRoZSBzdXBlcmFnZW50IGNvZGUgYmFzZSlcbiAqXG4gKiBAcGFyYW0ge1N0cmluZ30gZmllbGRcbiAqIEByZXR1cm4ge1N0cmluZ31cbiAqIEBhcGkgcHJpdmF0ZVxuICogQGRlcHJlY2F0ZWRcbiAqL1xuXG5leHBvcnRzLmdldEhlYWRlciA9IGV4cG9ydHMuZ2V0O1xuXG4vKipcbiAqIFNldCBoZWFkZXIgYGZpZWxkYCB0byBgdmFsYCwgb3IgbXVsdGlwbGUgZmllbGRzIHdpdGggb25lIG9iamVjdC5cbiAqIENhc2UtaW5zZW5zaXRpdmUuXG4gKlxuICogRXhhbXBsZXM6XG4gKlxuICogICAgICByZXEuZ2V0KCcvJylcbiAqICAgICAgICAuc2V0KCdBY2NlcHQnLCAnYXBwbGljYXRpb24vanNvbicpXG4gKiAgICAgICAgLnNldCgnWC1BUEktS2V5JywgJ2Zvb2JhcicpXG4gKiAgICAgICAgLmVuZChjYWxsYmFjayk7XG4gKlxuICogICAgICByZXEuZ2V0KCcvJylcbiAqICAgICAgICAuc2V0KHsgQWNjZXB0OiAnYXBwbGljYXRpb24vanNvbicsICdYLUFQSS1LZXknOiAnZm9vYmFyJyB9KVxuICogICAgICAgIC5lbmQoY2FsbGJhY2spO1xuICpcbiAqIEBwYXJhbSB7U3RyaW5nfE9iamVjdH0gZmllbGRcbiAqIEBwYXJhbSB7U3RyaW5nfSB2YWxcbiAqIEByZXR1cm4ge1JlcXVlc3R9IGZvciBjaGFpbmluZ1xuICogQGFwaSBwdWJsaWNcbiAqL1xuXG5leHBvcnRzLnNldCA9IGZ1bmN0aW9uKGZpZWxkLCB2YWwpe1xuICBpZiAoaXNPYmplY3QoZmllbGQpKSB7XG4gICAgZm9yICh2YXIga2V5IGluIGZpZWxkKSB7XG4gICAgICB0aGlzLnNldChrZXksIGZpZWxkW2tleV0pO1xuICAgIH1cbiAgICByZXR1cm4gdGhpcztcbiAgfVxuICB0aGlzLl9oZWFkZXJbZmllbGQudG9Mb3dlckNhc2UoKV0gPSB2YWw7XG4gIHRoaXMuaGVhZGVyW2ZpZWxkXSA9IHZhbDtcbiAgcmV0dXJuIHRoaXM7XG59O1xuXG4vKipcbiAqIFJlbW92ZSBoZWFkZXIgYGZpZWxkYC5cbiAqIENhc2UtaW5zZW5zaXRpdmUuXG4gKlxuICogRXhhbXBsZTpcbiAqXG4gKiAgICAgIHJlcS5nZXQoJy8nKVxuICogICAgICAgIC51bnNldCgnVXNlci1BZ2VudCcpXG4gKiAgICAgICAgLmVuZChjYWxsYmFjayk7XG4gKlxuICogQHBhcmFtIHtTdHJpbmd9IGZpZWxkXG4gKi9cbmV4cG9ydHMudW5zZXQgPSBmdW5jdGlvbihmaWVsZCl7XG4gIGRlbGV0ZSB0aGlzLl9oZWFkZXJbZmllbGQudG9Mb3dlckNhc2UoKV07XG4gIGRlbGV0ZSB0aGlzLmhlYWRlcltmaWVsZF07XG4gIHJldHVybiB0aGlzO1xufTtcblxuLyoqXG4gKiBXcml0ZSB0aGUgZmllbGQgYG5hbWVgIGFuZCBgdmFsYCBmb3IgXCJtdWx0aXBhcnQvZm9ybS1kYXRhXCJcbiAqIHJlcXVlc3QgYm9kaWVzLlxuICpcbiAqIGBgYCBqc1xuICogcmVxdWVzdC5wb3N0KCcvdXBsb2FkJylcbiAqICAgLmZpZWxkKCdmb28nLCAnYmFyJylcbiAqICAgLmVuZChjYWxsYmFjayk7XG4gKiBgYGBcbiAqXG4gKiBAcGFyYW0ge1N0cmluZ30gbmFtZVxuICogQHBhcmFtIHtTdHJpbmd8QmxvYnxGaWxlfEJ1ZmZlcnxmcy5SZWFkU3RyZWFtfSB2YWxcbiAqIEByZXR1cm4ge1JlcXVlc3R9IGZvciBjaGFpbmluZ1xuICogQGFwaSBwdWJsaWNcbiAqL1xuZXhwb3J0cy5maWVsZCA9IGZ1bmN0aW9uKG5hbWUsIHZhbCkge1xuICB0aGlzLl9nZXRGb3JtRGF0YSgpLmFwcGVuZChuYW1lLCB2YWwpO1xuICByZXR1cm4gdGhpcztcbn07XG5cbi8qKlxuICogQWJvcnQgdGhlIHJlcXVlc3QsIGFuZCBjbGVhciBwb3RlbnRpYWwgdGltZW91dC5cbiAqXG4gKiBAcmV0dXJuIHtSZXF1ZXN0fVxuICogQGFwaSBwdWJsaWNcbiAqL1xuZXhwb3J0cy5hYm9ydCA9IGZ1bmN0aW9uKCl7XG4gIGlmICh0aGlzLl9hYm9ydGVkKSB7XG4gICAgcmV0dXJuIHRoaXM7XG4gIH1cbiAgdGhpcy5fYWJvcnRlZCA9IHRydWU7XG4gIHRoaXMueGhyICYmIHRoaXMueGhyLmFib3J0KCk7IC8vIGJyb3dzZXJcbiAgdGhpcy5yZXEgJiYgdGhpcy5yZXEuYWJvcnQoKTsgLy8gbm9kZVxuICB0aGlzLmNsZWFyVGltZW91dCgpO1xuICB0aGlzLmVtaXQoJ2Fib3J0Jyk7XG4gIHJldHVybiB0aGlzO1xufTtcblxuLyoqXG4gKiBFbmFibGUgdHJhbnNtaXNzaW9uIG9mIGNvb2tpZXMgd2l0aCB4LWRvbWFpbiByZXF1ZXN0cy5cbiAqXG4gKiBOb3RlIHRoYXQgZm9yIHRoaXMgdG8gd29yayB0aGUgb3JpZ2luIG11c3Qgbm90IGJlXG4gKiB1c2luZyBcIkFjY2Vzcy1Db250cm9sLUFsbG93LU9yaWdpblwiIHdpdGggYSB3aWxkY2FyZCxcbiAqIGFuZCBhbHNvIG11c3Qgc2V0IFwiQWNjZXNzLUNvbnRyb2wtQWxsb3ctQ3JlZGVudGlhbHNcIlxuICogdG8gXCJ0cnVlXCIuXG4gKlxuICogQGFwaSBwdWJsaWNcbiAqL1xuXG5leHBvcnRzLndpdGhDcmVkZW50aWFscyA9IGZ1bmN0aW9uKCl7XG4gIC8vIFRoaXMgaXMgYnJvd3Nlci1vbmx5IGZ1bmN0aW9uYWxpdHkuIE5vZGUgc2lkZSBpcyBuby1vcC5cbiAgdGhpcy5fd2l0aENyZWRlbnRpYWxzID0gdHJ1ZTtcbiAgcmV0dXJuIHRoaXM7XG59O1xuXG4vKipcbiAqIFNldCB0aGUgbWF4IHJlZGlyZWN0cyB0byBgbmAuIERvZXMgbm90aW5nIGluIGJyb3dzZXIgWEhSIGltcGxlbWVudGF0aW9uLlxuICpcbiAqIEBwYXJhbSB7TnVtYmVyfSBuXG4gKiBAcmV0dXJuIHtSZXF1ZXN0fSBmb3IgY2hhaW5pbmdcbiAqIEBhcGkgcHVibGljXG4gKi9cblxuZXhwb3J0cy5yZWRpcmVjdHMgPSBmdW5jdGlvbihuKXtcbiAgdGhpcy5fbWF4UmVkaXJlY3RzID0gbjtcbiAgcmV0dXJuIHRoaXM7XG59O1xuXG4vKipcbiAqIENvbnZlcnQgdG8gYSBwbGFpbiBqYXZhc2NyaXB0IG9iamVjdCAobm90IEpTT04gc3RyaW5nKSBvZiBzY2FsYXIgcHJvcGVydGllcy5cbiAqIE5vdGUgYXMgdGhpcyBtZXRob2QgaXMgZGVzaWduZWQgdG8gcmV0dXJuIGEgdXNlZnVsIG5vbi10aGlzIHZhbHVlLFxuICogaXQgY2Fubm90IGJlIGNoYWluZWQuXG4gKlxuICogQHJldHVybiB7T2JqZWN0fSBkZXNjcmliaW5nIG1ldGhvZCwgdXJsLCBhbmQgZGF0YSBvZiB0aGlzIHJlcXVlc3RcbiAqIEBhcGkgcHVibGljXG4gKi9cblxuZXhwb3J0cy50b0pTT04gPSBmdW5jdGlvbigpe1xuICByZXR1cm4ge1xuICAgIG1ldGhvZDogdGhpcy5tZXRob2QsXG4gICAgdXJsOiB0aGlzLnVybCxcbiAgICBkYXRhOiB0aGlzLl9kYXRhLFxuICAgIGhlYWRlcnM6IHRoaXMuX2hlYWRlclxuICB9O1xufTtcblxuLyoqXG4gKiBDaGVjayBpZiBgb2JqYCBpcyBhIGhvc3Qgb2JqZWN0LFxuICogd2UgZG9uJ3Qgd2FudCB0byBzZXJpYWxpemUgdGhlc2UgOilcbiAqXG4gKiBUT0RPOiBmdXR1cmUgcHJvb2YsIG1vdmUgdG8gY29tcG9lbnQgbGFuZFxuICpcbiAqIEBwYXJhbSB7T2JqZWN0fSBvYmpcbiAqIEByZXR1cm4ge0Jvb2xlYW59XG4gKiBAYXBpIHByaXZhdGVcbiAqL1xuXG5leHBvcnRzLl9pc0hvc3QgPSBmdW5jdGlvbiBfaXNIb3N0KG9iaikge1xuICB2YXIgc3RyID0ge30udG9TdHJpbmcuY2FsbChvYmopO1xuXG4gIHN3aXRjaCAoc3RyKSB7XG4gICAgY2FzZSAnW29iamVjdCBGaWxlXSc6XG4gICAgY2FzZSAnW29iamVjdCBCbG9iXSc6XG4gICAgY2FzZSAnW29iamVjdCBGb3JtRGF0YV0nOlxuICAgICAgcmV0dXJuIHRydWU7XG4gICAgZGVmYXVsdDpcbiAgICAgIHJldHVybiBmYWxzZTtcbiAgfVxufVxuXG4vKipcbiAqIFNlbmQgYGRhdGFgIGFzIHRoZSByZXF1ZXN0IGJvZHksIGRlZmF1bHRpbmcgdGhlIGAudHlwZSgpYCB0byBcImpzb25cIiB3aGVuXG4gKiBhbiBvYmplY3QgaXMgZ2l2ZW4uXG4gKlxuICogRXhhbXBsZXM6XG4gKlxuICogICAgICAgLy8gbWFudWFsIGpzb25cbiAqICAgICAgIHJlcXVlc3QucG9zdCgnL3VzZXInKVxuICogICAgICAgICAudHlwZSgnanNvbicpXG4gKiAgICAgICAgIC5zZW5kKCd7XCJuYW1lXCI6XCJ0alwifScpXG4gKiAgICAgICAgIC5lbmQoY2FsbGJhY2spXG4gKlxuICogICAgICAgLy8gYXV0byBqc29uXG4gKiAgICAgICByZXF1ZXN0LnBvc3QoJy91c2VyJylcbiAqICAgICAgICAgLnNlbmQoeyBuYW1lOiAndGonIH0pXG4gKiAgICAgICAgIC5lbmQoY2FsbGJhY2spXG4gKlxuICogICAgICAgLy8gbWFudWFsIHgtd3d3LWZvcm0tdXJsZW5jb2RlZFxuICogICAgICAgcmVxdWVzdC5wb3N0KCcvdXNlcicpXG4gKiAgICAgICAgIC50eXBlKCdmb3JtJylcbiAqICAgICAgICAgLnNlbmQoJ25hbWU9dGonKVxuICogICAgICAgICAuZW5kKGNhbGxiYWNrKVxuICpcbiAqICAgICAgIC8vIGF1dG8geC13d3ctZm9ybS11cmxlbmNvZGVkXG4gKiAgICAgICByZXF1ZXN0LnBvc3QoJy91c2VyJylcbiAqICAgICAgICAgLnR5cGUoJ2Zvcm0nKVxuICogICAgICAgICAuc2VuZCh7IG5hbWU6ICd0aicgfSlcbiAqICAgICAgICAgLmVuZChjYWxsYmFjaylcbiAqXG4gKiAgICAgICAvLyBkZWZhdWx0cyB0byB4LXd3dy1mb3JtLXVybGVuY29kZWRcbiAqICAgICAgcmVxdWVzdC5wb3N0KCcvdXNlcicpXG4gKiAgICAgICAgLnNlbmQoJ25hbWU9dG9iaScpXG4gKiAgICAgICAgLnNlbmQoJ3NwZWNpZXM9ZmVycmV0JylcbiAqICAgICAgICAuZW5kKGNhbGxiYWNrKVxuICpcbiAqIEBwYXJhbSB7U3RyaW5nfE9iamVjdH0gZGF0YVxuICogQHJldHVybiB7UmVxdWVzdH0gZm9yIGNoYWluaW5nXG4gKiBAYXBpIHB1YmxpY1xuICovXG5cbmV4cG9ydHMuc2VuZCA9IGZ1bmN0aW9uKGRhdGEpe1xuICB2YXIgb2JqID0gaXNPYmplY3QoZGF0YSk7XG4gIHZhciB0eXBlID0gdGhpcy5faGVhZGVyWydjb250ZW50LXR5cGUnXTtcblxuICAvLyBtZXJnZVxuICBpZiAob2JqICYmIGlzT2JqZWN0KHRoaXMuX2RhdGEpKSB7XG4gICAgZm9yICh2YXIga2V5IGluIGRhdGEpIHtcbiAgICAgIHRoaXMuX2RhdGFba2V5XSA9IGRhdGFba2V5XTtcbiAgICB9XG4gIH0gZWxzZSBpZiAoJ3N0cmluZycgPT0gdHlwZW9mIGRhdGEpIHtcbiAgICAvLyBkZWZhdWx0IHRvIHgtd3d3LWZvcm0tdXJsZW5jb2RlZFxuICAgIGlmICghdHlwZSkgdGhpcy50eXBlKCdmb3JtJyk7XG4gICAgdHlwZSA9IHRoaXMuX2hlYWRlclsnY29udGVudC10eXBlJ107XG4gICAgaWYgKCdhcHBsaWNhdGlvbi94LXd3dy1mb3JtLXVybGVuY29kZWQnID09IHR5cGUpIHtcbiAgICAgIHRoaXMuX2RhdGEgPSB0aGlzLl9kYXRhXG4gICAgICAgID8gdGhpcy5fZGF0YSArICcmJyArIGRhdGFcbiAgICAgICAgOiBkYXRhO1xuICAgIH0gZWxzZSB7XG4gICAgICB0aGlzLl9kYXRhID0gKHRoaXMuX2RhdGEgfHwgJycpICsgZGF0YTtcbiAgICB9XG4gIH0gZWxzZSB7XG4gICAgdGhpcy5fZGF0YSA9IGRhdGE7XG4gIH1cblxuICBpZiAoIW9iaiB8fCB0aGlzLl9pc0hvc3QoZGF0YSkpIHJldHVybiB0aGlzO1xuXG4gIC8vIGRlZmF1bHQgdG8ganNvblxuICBpZiAoIXR5cGUpIHRoaXMudHlwZSgnanNvbicpO1xuICByZXR1cm4gdGhpcztcbn07XG4iLCIvLyBUaGUgbm9kZSBhbmQgYnJvd3NlciBtb2R1bGVzIGV4cG9zZSB2ZXJzaW9ucyBvZiB0aGlzIHdpdGggdGhlXG4vLyBhcHByb3ByaWF0ZSBjb25zdHJ1Y3RvciBmdW5jdGlvbiBib3VuZCBhcyBmaXJzdCBhcmd1bWVudFxuLyoqXG4gKiBJc3N1ZSBhIHJlcXVlc3Q6XG4gKlxuICogRXhhbXBsZXM6XG4gKlxuICogICAgcmVxdWVzdCgnR0VUJywgJy91c2VycycpLmVuZChjYWxsYmFjaylcbiAqICAgIHJlcXVlc3QoJy91c2VycycpLmVuZChjYWxsYmFjaylcbiAqICAgIHJlcXVlc3QoJy91c2VycycsIGNhbGxiYWNrKVxuICpcbiAqIEBwYXJhbSB7U3RyaW5nfSBtZXRob2RcbiAqIEBwYXJhbSB7U3RyaW5nfEZ1bmN0aW9ufSB1cmwgb3IgY2FsbGJhY2tcbiAqIEByZXR1cm4ge1JlcXVlc3R9XG4gKiBAYXBpIHB1YmxpY1xuICovXG5cbmZ1bmN0aW9uIHJlcXVlc3QoUmVxdWVzdENvbnN0cnVjdG9yLCBtZXRob2QsIHVybCkge1xuICAvLyBjYWxsYmFja1xuICBpZiAoJ2Z1bmN0aW9uJyA9PSB0eXBlb2YgdXJsKSB7XG4gICAgcmV0dXJuIG5ldyBSZXF1ZXN0Q29uc3RydWN0b3IoJ0dFVCcsIG1ldGhvZCkuZW5kKHVybCk7XG4gIH1cblxuICAvLyB1cmwgZmlyc3RcbiAgaWYgKDIgPT0gYXJndW1lbnRzLmxlbmd0aCkge1xuICAgIHJldHVybiBuZXcgUmVxdWVzdENvbnN0cnVjdG9yKCdHRVQnLCBtZXRob2QpO1xuICB9XG5cbiAgcmV0dXJuIG5ldyBSZXF1ZXN0Q29uc3RydWN0b3IobWV0aG9kLCB1cmwpO1xufVxuXG5tb2R1bGUuZXhwb3J0cyA9IHJlcXVlc3Q7XG4iLCJcclxuLyoqXHJcbiAqIEV4cG9zZSBgRW1pdHRlcmAuXHJcbiAqL1xyXG5cclxuaWYgKHR5cGVvZiBtb2R1bGUgIT09ICd1bmRlZmluZWQnKSB7XHJcbiAgbW9kdWxlLmV4cG9ydHMgPSBFbWl0dGVyO1xyXG59XHJcblxyXG4vKipcclxuICogSW5pdGlhbGl6ZSBhIG5ldyBgRW1pdHRlcmAuXHJcbiAqXHJcbiAqIEBhcGkgcHVibGljXHJcbiAqL1xyXG5cclxuZnVuY3Rpb24gRW1pdHRlcihvYmopIHtcclxuICBpZiAob2JqKSByZXR1cm4gbWl4aW4ob2JqKTtcclxufTtcclxuXHJcbi8qKlxyXG4gKiBNaXhpbiB0aGUgZW1pdHRlciBwcm9wZXJ0aWVzLlxyXG4gKlxyXG4gKiBAcGFyYW0ge09iamVjdH0gb2JqXHJcbiAqIEByZXR1cm4ge09iamVjdH1cclxuICogQGFwaSBwcml2YXRlXHJcbiAqL1xyXG5cclxuZnVuY3Rpb24gbWl4aW4ob2JqKSB7XHJcbiAgZm9yICh2YXIga2V5IGluIEVtaXR0ZXIucHJvdG90eXBlKSB7XHJcbiAgICBvYmpba2V5XSA9IEVtaXR0ZXIucHJvdG90eXBlW2tleV07XHJcbiAgfVxyXG4gIHJldHVybiBvYmo7XHJcbn1cclxuXHJcbi8qKlxyXG4gKiBMaXN0ZW4gb24gdGhlIGdpdmVuIGBldmVudGAgd2l0aCBgZm5gLlxyXG4gKlxyXG4gKiBAcGFyYW0ge1N0cmluZ30gZXZlbnRcclxuICogQHBhcmFtIHtGdW5jdGlvbn0gZm5cclxuICogQHJldHVybiB7RW1pdHRlcn1cclxuICogQGFwaSBwdWJsaWNcclxuICovXHJcblxyXG5FbWl0dGVyLnByb3RvdHlwZS5vbiA9XHJcbkVtaXR0ZXIucHJvdG90eXBlLmFkZEV2ZW50TGlzdGVuZXIgPSBmdW5jdGlvbihldmVudCwgZm4pe1xyXG4gIHRoaXMuX2NhbGxiYWNrcyA9IHRoaXMuX2NhbGxiYWNrcyB8fCB7fTtcclxuICAodGhpcy5fY2FsbGJhY2tzWyckJyArIGV2ZW50XSA9IHRoaXMuX2NhbGxiYWNrc1snJCcgKyBldmVudF0gfHwgW10pXHJcbiAgICAucHVzaChmbik7XHJcbiAgcmV0dXJuIHRoaXM7XHJcbn07XHJcblxyXG4vKipcclxuICogQWRkcyBhbiBgZXZlbnRgIGxpc3RlbmVyIHRoYXQgd2lsbCBiZSBpbnZva2VkIGEgc2luZ2xlXHJcbiAqIHRpbWUgdGhlbiBhdXRvbWF0aWNhbGx5IHJlbW92ZWQuXHJcbiAqXHJcbiAqIEBwYXJhbSB7U3RyaW5nfSBldmVudFxyXG4gKiBAcGFyYW0ge0Z1bmN0aW9ufSBmblxyXG4gKiBAcmV0dXJuIHtFbWl0dGVyfVxyXG4gKiBAYXBpIHB1YmxpY1xyXG4gKi9cclxuXHJcbkVtaXR0ZXIucHJvdG90eXBlLm9uY2UgPSBmdW5jdGlvbihldmVudCwgZm4pe1xyXG4gIGZ1bmN0aW9uIG9uKCkge1xyXG4gICAgdGhpcy5vZmYoZXZlbnQsIG9uKTtcclxuICAgIGZuLmFwcGx5KHRoaXMsIGFyZ3VtZW50cyk7XHJcbiAgfVxyXG5cclxuICBvbi5mbiA9IGZuO1xyXG4gIHRoaXMub24oZXZlbnQsIG9uKTtcclxuICByZXR1cm4gdGhpcztcclxufTtcclxuXHJcbi8qKlxyXG4gKiBSZW1vdmUgdGhlIGdpdmVuIGNhbGxiYWNrIGZvciBgZXZlbnRgIG9yIGFsbFxyXG4gKiByZWdpc3RlcmVkIGNhbGxiYWNrcy5cclxuICpcclxuICogQHBhcmFtIHtTdHJpbmd9IGV2ZW50XHJcbiAqIEBwYXJhbSB7RnVuY3Rpb259IGZuXHJcbiAqIEByZXR1cm4ge0VtaXR0ZXJ9XHJcbiAqIEBhcGkgcHVibGljXHJcbiAqL1xyXG5cclxuRW1pdHRlci5wcm90b3R5cGUub2ZmID1cclxuRW1pdHRlci5wcm90b3R5cGUucmVtb3ZlTGlzdGVuZXIgPVxyXG5FbWl0dGVyLnByb3RvdHlwZS5yZW1vdmVBbGxMaXN0ZW5lcnMgPVxyXG5FbWl0dGVyLnByb3RvdHlwZS5yZW1vdmVFdmVudExpc3RlbmVyID0gZnVuY3Rpb24oZXZlbnQsIGZuKXtcclxuICB0aGlzLl9jYWxsYmFja3MgPSB0aGlzLl9jYWxsYmFja3MgfHwge307XHJcblxyXG4gIC8vIGFsbFxyXG4gIGlmICgwID09IGFyZ3VtZW50cy5sZW5ndGgpIHtcclxuICAgIHRoaXMuX2NhbGxiYWNrcyA9IHt9O1xyXG4gICAgcmV0dXJuIHRoaXM7XHJcbiAgfVxyXG5cclxuICAvLyBzcGVjaWZpYyBldmVudFxyXG4gIHZhciBjYWxsYmFja3MgPSB0aGlzLl9jYWxsYmFja3NbJyQnICsgZXZlbnRdO1xyXG4gIGlmICghY2FsbGJhY2tzKSByZXR1cm4gdGhpcztcclxuXHJcbiAgLy8gcmVtb3ZlIGFsbCBoYW5kbGVyc1xyXG4gIGlmICgxID09IGFyZ3VtZW50cy5sZW5ndGgpIHtcclxuICAgIGRlbGV0ZSB0aGlzLl9jYWxsYmFja3NbJyQnICsgZXZlbnRdO1xyXG4gICAgcmV0dXJuIHRoaXM7XHJcbiAgfVxyXG5cclxuICAvLyByZW1vdmUgc3BlY2lmaWMgaGFuZGxlclxyXG4gIHZhciBjYjtcclxuICBmb3IgKHZhciBpID0gMDsgaSA8IGNhbGxiYWNrcy5sZW5ndGg7IGkrKykge1xyXG4gICAgY2IgPSBjYWxsYmFja3NbaV07XHJcbiAgICBpZiAoY2IgPT09IGZuIHx8IGNiLmZuID09PSBmbikge1xyXG4gICAgICBjYWxsYmFja3Muc3BsaWNlKGksIDEpO1xyXG4gICAgICBicmVhaztcclxuICAgIH1cclxuICB9XHJcbiAgcmV0dXJuIHRoaXM7XHJcbn07XHJcblxyXG4vKipcclxuICogRW1pdCBgZXZlbnRgIHdpdGggdGhlIGdpdmVuIGFyZ3MuXHJcbiAqXHJcbiAqIEBwYXJhbSB7U3RyaW5nfSBldmVudFxyXG4gKiBAcGFyYW0ge01peGVkfSAuLi5cclxuICogQHJldHVybiB7RW1pdHRlcn1cclxuICovXHJcblxyXG5FbWl0dGVyLnByb3RvdHlwZS5lbWl0ID0gZnVuY3Rpb24oZXZlbnQpe1xyXG4gIHRoaXMuX2NhbGxiYWNrcyA9IHRoaXMuX2NhbGxiYWNrcyB8fCB7fTtcclxuICB2YXIgYXJncyA9IFtdLnNsaWNlLmNhbGwoYXJndW1lbnRzLCAxKVxyXG4gICAgLCBjYWxsYmFja3MgPSB0aGlzLl9jYWxsYmFja3NbJyQnICsgZXZlbnRdO1xyXG5cclxuICBpZiAoY2FsbGJhY2tzKSB7XHJcbiAgICBjYWxsYmFja3MgPSBjYWxsYmFja3Muc2xpY2UoMCk7XHJcbiAgICBmb3IgKHZhciBpID0gMCwgbGVuID0gY2FsbGJhY2tzLmxlbmd0aDsgaSA8IGxlbjsgKytpKSB7XHJcbiAgICAgIGNhbGxiYWNrc1tpXS5hcHBseSh0aGlzLCBhcmdzKTtcclxuICAgIH1cclxuICB9XHJcblxyXG4gIHJldHVybiB0aGlzO1xyXG59O1xyXG5cclxuLyoqXHJcbiAqIFJldHVybiBhcnJheSBvZiBjYWxsYmFja3MgZm9yIGBldmVudGAuXHJcbiAqXHJcbiAqIEBwYXJhbSB7U3RyaW5nfSBldmVudFxyXG4gKiBAcmV0dXJuIHtBcnJheX1cclxuICogQGFwaSBwdWJsaWNcclxuICovXHJcblxyXG5FbWl0dGVyLnByb3RvdHlwZS5saXN0ZW5lcnMgPSBmdW5jdGlvbihldmVudCl7XHJcbiAgdGhpcy5fY2FsbGJhY2tzID0gdGhpcy5fY2FsbGJhY2tzIHx8IHt9O1xyXG4gIHJldHVybiB0aGlzLl9jYWxsYmFja3NbJyQnICsgZXZlbnRdIHx8IFtdO1xyXG59O1xyXG5cclxuLyoqXHJcbiAqIENoZWNrIGlmIHRoaXMgZW1pdHRlciBoYXMgYGV2ZW50YCBoYW5kbGVycy5cclxuICpcclxuICogQHBhcmFtIHtTdHJpbmd9IGV2ZW50XHJcbiAqIEByZXR1cm4ge0Jvb2xlYW59XHJcbiAqIEBhcGkgcHVibGljXHJcbiAqL1xyXG5cclxuRW1pdHRlci5wcm90b3R5cGUuaGFzTGlzdGVuZXJzID0gZnVuY3Rpb24oZXZlbnQpe1xyXG4gIHJldHVybiAhISB0aGlzLmxpc3RlbmVycyhldmVudCkubGVuZ3RoO1xyXG59O1xyXG4iLCIgLypnbG9iYWwgSlNPTkVkaXRvciovXG4ndXNlIHN0cmljdCc7XG5cbndpbmRvdy5Td2FnZ2VyVWkgPSBCYWNrYm9uZS5Sb3V0ZXIuZXh0ZW5kKHtcblxuICBkb21faWQ6ICdzd2FnZ2VyX3VpJyxcblxuICAvLyBBdHRyaWJ1dGVzXG4gIG9wdGlvbnM6IG51bGwsXG4gIGFwaTogbnVsbCxcbiAgaGVhZGVyVmlldzogbnVsbCxcbiAgbWFpblZpZXc6IG51bGwsXG5cbiAgLy8gU3dhZ2dlclVpIGFjY2VwdHMgYWxsIHRoZSBzYW1lIG9wdGlvbnMgYXMgU3dhZ2dlckFwaVxuICBpbml0aWFsaXplOiBmdW5jdGlvbihvcHRpb25zKSB7XG4gICAgb3B0aW9ucyA9IG9wdGlvbnMgfHwge307XG5cbiAgICBpZiAob3B0aW9ucy5kZWZhdWx0TW9kZWxSZW5kZXJpbmcgIT09ICdtb2RlbCcpIHtcbiAgICAgIG9wdGlvbnMuZGVmYXVsdE1vZGVsUmVuZGVyaW5nID0gJ3NjaGVtYSc7XG4gICAgfVxuXG4gICAgaWYgKCFvcHRpb25zLmhpZ2hsaWdodFNpemVUaHJlc2hvbGQpIHtcbiAgICAgIG9wdGlvbnMuaGlnaGxpZ2h0U2l6ZVRocmVzaG9sZCA9IDEwMDAwMDtcbiAgICB9XG5cbiAgICAvLyBBbGxvdyBkb21faWQgdG8gYmUgb3ZlcnJpZGRlblxuICAgIGlmIChvcHRpb25zLmRvbV9pZCkge1xuICAgICAgdGhpcy5kb21faWQgPSBvcHRpb25zLmRvbV9pZDtcbiAgICAgIGRlbGV0ZSBvcHRpb25zLmRvbV9pZDtcbiAgICB9XG5cbiAgICBpZiAoIW9wdGlvbnMuc3VwcG9ydGVkU3VibWl0TWV0aG9kcyl7XG4gICAgICBvcHRpb25zLnN1cHBvcnRlZFN1Ym1pdE1ldGhvZHMgPSBbXG4gICAgICAgICdnZXQnLFxuICAgICAgICAncHV0JyxcbiAgICAgICAgJ3Bvc3QnLFxuICAgICAgICAnZGVsZXRlJyxcbiAgICAgICAgJ2hlYWQnLFxuICAgICAgICAnb3B0aW9ucycsXG4gICAgICAgICdwYXRjaCdcbiAgICAgIF07XG4gICAgfVxuXG4gICAgaWYgKHR5cGVvZiBvcHRpb25zLm9hdXRoMlJlZGlyZWN0VXJsID09PSAnc3RyaW5nJykge1xuICAgICAgd2luZG93Lm9BdXRoUmVkaXJlY3RVcmwgPSBvcHRpb25zLm9hdXRoMlJlZGlyZWN0VXJsO1xuICAgIH1cblxuICAgIC8vIENyZWF0ZSBhbiBlbXB0eSBkaXYgd2hpY2ggY29udGFpbnMgdGhlIGRvbV9pZFxuICAgIGlmICghICQoJyMnICsgdGhpcy5kb21faWQpLmxlbmd0aCl7XG4gICAgICAkKCdib2R5JykuYXBwZW5kKCc8ZGl2IGlkPVwiJyArIHRoaXMuZG9tX2lkICsgJ1wiPjwvZGl2PicpIDtcbiAgICB9XG5cbiAgICB0aGlzLm9wdGlvbnMgPSBvcHRpb25zO1xuXG4gICAgLy8gc2V0IG1hcmtlZCBvcHRpb25zXG4gICAgbWFya2VkLnNldE9wdGlvbnMoe2dmbTogdHJ1ZX0pO1xuXG4gICAgLy8gU2V0IHRoZSBjYWxsYmFja3NcbiAgICB2YXIgdGhhdCA9IHRoaXM7XG4gICAgdGhpcy5vcHRpb25zLnN1Y2Nlc3MgPSBmdW5jdGlvbigpIHsgcmV0dXJuIHRoYXQucmVuZGVyKCk7IH07XG4gICAgdGhpcy5vcHRpb25zLnByb2dyZXNzID0gZnVuY3Rpb24oZCkgeyByZXR1cm4gdGhhdC5zaG93TWVzc2FnZShkKTsgfTtcbiAgICB0aGlzLm9wdGlvbnMuZmFpbHVyZSA9IGZ1bmN0aW9uKGQpIHsgcmV0dXJuIHRoYXQub25Mb2FkRmFpbHVyZShkKTsgfTtcblxuICAgIC8vIENyZWF0ZSB2aWV3IHRvIGhhbmRsZSB0aGUgaGVhZGVyIGlucHV0c1xuICAgIHRoaXMuaGVhZGVyVmlldyA9IG5ldyBTd2FnZ2VyVWkuVmlld3MuSGVhZGVyVmlldyh7ZWw6ICQoJyNoZWFkZXInKX0pO1xuXG4gICAgLy8gRXZlbnQgaGFuZGxlciBmb3Igd2hlbiB0aGUgYmFzZVVybC9hcGlLZXkgaXMgZW50ZXJlZCBieSB1c2VyXG4gICAgdGhpcy5oZWFkZXJWaWV3Lm9uKCd1cGRhdGUtc3dhZ2dlci11aScsIGZ1bmN0aW9uKGRhdGEpIHtcbiAgICAgIHJldHVybiB0aGF0LnVwZGF0ZVN3YWdnZXJVaShkYXRhKTtcbiAgICB9KTtcblxuICAgIC8vIEpTb24gRWRpdG9yIGN1c3RvbSB0aGVtaW5nXG4gICAgIEpTT05FZGl0b3IuZGVmYXVsdHMuaWNvbmxpYnMuc3dhZ2dlciA9IEpTT05FZGl0b3IuQWJzdHJhY3RJY29uTGliLmV4dGVuZCh7XG4gICAgICBtYXBwaW5nOiB7XG4gICAgICAgIGNvbGxhcHNlOiAnY29sbGFwc2UnLFxuICAgICAgICBleHBhbmQ6ICdleHBhbmQnXG4gICAgICAgIH0sXG4gICAgICBpY29uX3ByZWZpeDogJ3N3YWdnZXItJ1xuICAgICAgfSk7XG5cbiAgfSxcblxuICAvLyBTZXQgYW4gb3B0aW9uIGFmdGVyIGluaXRpYWxpemluZ1xuICBzZXRPcHRpb246IGZ1bmN0aW9uKG9wdGlvbiwgdmFsdWUpIHtcbiAgICB0aGlzLm9wdGlvbnNbb3B0aW9uXSA9IHZhbHVlO1xuICB9LFxuXG4gIC8vIEdldCB0aGUgdmFsdWUgb2YgYSBwcmV2aW91c2x5IHNldCBvcHRpb25cbiAgZ2V0T3B0aW9uOiBmdW5jdGlvbihvcHRpb24pIHtcbiAgICByZXR1cm4gdGhpcy5vcHRpb25zW29wdGlvbl07XG4gIH0sXG5cbiAgLy8gRXZlbnQgaGFuZGxlciBmb3Igd2hlbiB1cmwva2V5IGlzIHJlY2VpdmVkIGZyb20gdXNlclxuICB1cGRhdGVTd2FnZ2VyVWk6IGZ1bmN0aW9uKGRhdGEpe1xuICAgIHRoaXMub3B0aW9ucy51cmwgPSBkYXRhLnVybDtcbiAgICB0aGlzLmxvYWQoKTtcbiAgfSxcblxuICAvLyBDcmVhdGUgYW4gYXBpIGFuZCByZW5kZXJcbiAgbG9hZDogZnVuY3Rpb24oKXtcbiAgICAvLyBJbml0aWFsaXplIHRoZSBBUEkgb2JqZWN0XG4gICAgaWYgKHRoaXMubWFpblZpZXcpIHtcbiAgICAgIHRoaXMubWFpblZpZXcuY2xlYXIoKTtcbiAgICB9XG5cbiAgICBpZiAodGhpcy5hdXRoVmlldykge1xuICAgICAgdGhpcy5hdXRoVmlldy5yZW1vdmUoKTtcbiAgICB9XG4gICAgdmFyIHVybCA9IHRoaXMub3B0aW9ucy51cmw7XG4gICAgaWYgKHVybCAmJiB1cmwuaW5kZXhPZignaHR0cCcpICE9PSAwKSB7XG4gICAgICB1cmwgPSB0aGlzLmJ1aWxkVXJsKHdpbmRvdy5sb2NhdGlvbi5ocmVmLnRvU3RyaW5nKCksIHVybCk7XG4gICAgfVxuICAgIGlmKHRoaXMuYXBpKSB7XG4gICAgICB0aGlzLm9wdGlvbnMuYXV0aG9yaXphdGlvbnMgPSB0aGlzLmFwaS5jbGllbnRBdXRob3JpemF0aW9ucy5hdXRoejtcbiAgICB9XG4gICAgdGhpcy5vcHRpb25zLnVybCA9IHVybDtcbiAgICB0aGlzLmhlYWRlclZpZXcudXBkYXRlKHVybCk7XG5cbiAgICB0aGlzLmFwaSA9IG5ldyBTd2FnZ2VyQ2xpZW50KHRoaXMub3B0aW9ucyk7XG4gIH0sXG5cbiAgLy8gY29sbGFwc2UgYWxsIHNlY3Rpb25zXG4gIGNvbGxhcHNlQWxsOiBmdW5jdGlvbigpe1xuICAgIERvY3MuY29sbGFwc2VFbmRwb2ludExpc3RGb3JSZXNvdXJjZSgnJyk7XG4gIH0sXG5cbiAgLy8gbGlzdCBvcGVyYXRpb25zIGZvciBhbGwgc2VjdGlvbnNcbiAgbGlzdEFsbDogZnVuY3Rpb24oKXtcbiAgICBEb2NzLmNvbGxhcHNlT3BlcmF0aW9uc0ZvclJlc291cmNlKCcnKTtcbiAgfSxcblxuICAvLyBleHBhbmQgb3BlcmF0aW9ucyBmb3IgYWxsIHNlY3Rpb25zXG4gIGV4cGFuZEFsbDogZnVuY3Rpb24oKXtcbiAgICBEb2NzLmV4cGFuZE9wZXJhdGlvbnNGb3JSZXNvdXJjZSgnJyk7XG4gIH0sXG5cbiAgLy8gVGhpcyBpcyBib3VuZCB0byBzdWNjZXNzIGhhbmRsZXIgZm9yIFN3YWdnZXJBcGlcbiAgLy8gIHNvIGl0IGdldHMgY2FsbGVkIHdoZW4gU3dhZ2dlckFwaSBjb21wbGV0ZXMgbG9hZGluZ1xuICByZW5kZXI6IGZ1bmN0aW9uKCl7XG4gICAgdmFyIGF1dGhzTW9kZWw7XG4gICAgdGhpcy5zaG93TWVzc2FnZSgnRmluaXNoZWQgTG9hZGluZyBSZXNvdXJjZSBJbmZvcm1hdGlvbi4gUmVuZGVyaW5nIFN3YWdnZXIgVUkuLi4nKTtcbiAgICB0aGlzLm1haW5WaWV3ID0gbmV3IFN3YWdnZXJVaS5WaWV3cy5NYWluVmlldyh7XG4gICAgICBtb2RlbDogdGhpcy5hcGksXG4gICAgICBlbDogJCgnIycgKyB0aGlzLmRvbV9pZCksXG4gICAgICBzd2FnZ2VyT3B0aW9uczogdGhpcy5vcHRpb25zLFxuICAgICAgcm91dGVyOiB0aGlzXG4gICAgfSkucmVuZGVyKCk7XG4gICAgaWYgKCFfLmlzRW1wdHkodGhpcy5hcGkuc2VjdXJpdHlEZWZpbml0aW9ucykpe1xuICAgICAgYXV0aHNNb2RlbCA9IF8ubWFwKHRoaXMuYXBpLnNlY3VyaXR5RGVmaW5pdGlvbnMsIGZ1bmN0aW9uIChhdXRoLCBuYW1lKSB7XG4gICAgICAgIHZhciByZXN1bHQgPSB7fTtcbiAgICAgICAgcmVzdWx0W25hbWVdID0gYXV0aDtcbiAgICAgICAgcmV0dXJuIHJlc3VsdDtcbiAgICAgIH0pO1xuICAgICAgdGhpcy5hdXRoVmlldyA9IG5ldyBTd2FnZ2VyVWkuVmlld3MuQXV0aEJ1dHRvblZpZXcoe1xuICAgICAgICBkYXRhOiBTd2FnZ2VyVWkudXRpbHMucGFyc2VTZWN1cml0eURlZmluaXRpb25zKGF1dGhzTW9kZWwpLFxuICAgICAgICByb3V0ZXI6IHRoaXNcbiAgICAgIH0pO1xuICAgICAgJCgnI2F1dGhfY29udGFpbmVyJykuYXBwZW5kKHRoaXMuYXV0aFZpZXcucmVuZGVyKCkuZWwpO1xuICAgIH1cbiAgICB0aGlzLnNob3dNZXNzYWdlKCk7XG4gICAgc3dpdGNoICh0aGlzLm9wdGlvbnMuZG9jRXhwYW5zaW9uKSB7XG4gICAgICBjYXNlICdmdWxsJzpcbiAgICAgICAgdGhpcy5leHBhbmRBbGwoKTsgYnJlYWs7XG4gICAgICBjYXNlICdsaXN0JzpcbiAgICAgICAgdGhpcy5saXN0QWxsKCk7IGJyZWFrO1xuICAgICAgZGVmYXVsdDpcbiAgICAgICAgYnJlYWs7XG4gICAgfVxuICAgIHRoaXMucmVuZGVyR0ZNKCk7XG5cbiAgICBpZiAodGhpcy5vcHRpb25zLm9uQ29tcGxldGUpe1xuICAgICAgdGhpcy5vcHRpb25zLm9uQ29tcGxldGUodGhpcy5hcGksIHRoaXMpO1xuICAgIH1cblxuICAgIHNldFRpbWVvdXQoRG9jcy5zaGViYW5nLmJpbmQodGhpcyksIDEwMCk7XG4gIH0sXG5cbiAgYnVpbGRVcmw6IGZ1bmN0aW9uKGJhc2UsIHVybCl7XG4gICAgaWYgKHVybC5pbmRleE9mKCcvJykgPT09IDApIHtcbiAgICAgIHZhciBwYXJ0cyA9IGJhc2Uuc3BsaXQoJy8nKTtcbiAgICAgIGJhc2UgPSBwYXJ0c1swXSArICcvLycgKyBwYXJ0c1syXTtcbiAgICAgIHJldHVybiBiYXNlICsgdXJsO1xuICAgIH0gZWxzZSB7XG4gICAgICB2YXIgZW5kT2ZQYXRoID0gYmFzZS5sZW5ndGg7XG5cbiAgICAgIGlmIChiYXNlLmluZGV4T2YoJz8nKSA+IC0xKXtcbiAgICAgICAgZW5kT2ZQYXRoID0gTWF0aC5taW4oZW5kT2ZQYXRoLCBiYXNlLmluZGV4T2YoJz8nKSk7XG4gICAgICB9XG5cbiAgICAgIGlmIChiYXNlLmluZGV4T2YoJyMnKSA+IC0xKXtcbiAgICAgICAgZW5kT2ZQYXRoID0gTWF0aC5taW4oZW5kT2ZQYXRoLCBiYXNlLmluZGV4T2YoJyMnKSk7XG4gICAgICB9XG5cbiAgICAgIGJhc2UgPSBiYXNlLnN1YnN0cmluZygwLCBlbmRPZlBhdGgpO1xuXG4gICAgICBpZiAoYmFzZS5pbmRleE9mKCcvJywgYmFzZS5sZW5ndGggLSAxICkgIT09IC0xKXtcbiAgICAgICAgcmV0dXJuIGJhc2UgKyB1cmw7XG4gICAgICB9XG5cbiAgICAgIHJldHVybiBiYXNlICsgJy8nICsgdXJsO1xuICAgIH1cbiAgfSxcblxuICAvLyBTaG93cyBtZXNzYWdlIG9uIHRvcGJhciBvZiB0aGUgdWlcbiAgc2hvd01lc3NhZ2U6IGZ1bmN0aW9uKGRhdGEpe1xuICAgIGlmIChkYXRhID09PSB1bmRlZmluZWQpIHtcbiAgICAgIGRhdGEgPSAnJztcbiAgICB9XG4gICAgdmFyICRtc2diYXIgPSAkKCcjbWVzc2FnZS1iYXInKTtcbiAgICAkbXNnYmFyLnJlbW92ZUNsYXNzKCdtZXNzYWdlLWZhaWwnKTtcbiAgICAkbXNnYmFyLmFkZENsYXNzKCdtZXNzYWdlLXN1Y2Nlc3MnKTtcbiAgICAkbXNnYmFyLnRleHQoZGF0YSk7XG4gICAgaWYod2luZG93LlN3YWdnZXJUcmFuc2xhdG9yKSB7XG4gICAgICB3aW5kb3cuU3dhZ2dlclRyYW5zbGF0b3IudHJhbnNsYXRlKCRtc2diYXIpO1xuICAgIH1cbiAgfSxcblxuICAvLyBzaG93cyBtZXNzYWdlIGluIHJlZFxuICBvbkxvYWRGYWlsdXJlOiBmdW5jdGlvbihkYXRhKXtcbiAgICBpZiAoZGF0YSA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICBkYXRhID0gJyc7XG4gICAgfVxuICAgICQoJyNtZXNzYWdlLWJhcicpLnJlbW92ZUNsYXNzKCdtZXNzYWdlLXN1Y2Nlc3MnKTtcbiAgICAkKCcjbWVzc2FnZS1iYXInKS5hZGRDbGFzcygnbWVzc2FnZS1mYWlsJyk7XG5cbiAgICB2YXIgdmFsID0gJCgnI21lc3NhZ2UtYmFyJykudGV4dChkYXRhKTtcblxuICAgIGlmICh0aGlzLm9wdGlvbnMub25GYWlsdXJlKSB7XG4gICAgICB0aGlzLm9wdGlvbnMub25GYWlsdXJlKGRhdGEpO1xuICAgIH1cblxuICAgIHJldHVybiB2YWw7XG4gIH0sXG5cbiAgLy8gUmVuZGVycyBHRk0gZm9yIGVsZW1lbnRzIHdpdGggJ21hcmtkb3duJyBjbGFzc1xuICByZW5kZXJHRk06IGZ1bmN0aW9uKCl7XG4gICAgJCgnLm1hcmtkb3duJykuZWFjaChmdW5jdGlvbigpe1xuICAgICAgJCh0aGlzKS5odG1sKG1hcmtlZCgkKHRoaXMpLmh0bWwoKSkpO1xuICAgIH0pO1xuXG4gICAgJCgnLnByb3BEZXNjJywgJy5tb2RlbC1zaWduYXR1cmUgLmRlc2NyaXB0aW9uJykuZWFjaChmdW5jdGlvbiAoKSB7XG4gICAgICAkKHRoaXMpLmh0bWwobWFya2VkKCQodGhpcykuaHRtbCgpKSkuYWRkQ2xhc3MoJ21hcmtkb3duJyk7XG4gICAgfSk7XG4gIH1cblxufSk7XG5cbndpbmRvdy5Td2FnZ2VyVWkuVmlld3MgPSB7fTtcbndpbmRvdy5Td2FnZ2VyVWkuTW9kZWxzID0ge307XG53aW5kb3cuU3dhZ2dlclVpLkNvbGxlY3Rpb25zID0ge307XG53aW5kb3cuU3dhZ2dlclVpLnBhcnRpYWxzID0ge307XG53aW5kb3cuU3dhZ2dlclVpLnV0aWxzID0ge307XG5cbi8vIGRvbid0IGJyZWFrIGJhY2t3YXJkIGNvbXBhdGliaWxpdHkgd2l0aCBwcmV2aW91cyB2ZXJzaW9ucyBhbmQgd2FybiB1c2VycyB0byB1cGdyYWRlIHRoZWlyIGNvZGVcbihmdW5jdGlvbigpe1xuICB3aW5kb3cuYXV0aG9yaXphdGlvbnMgPSB7XG4gICAgYWRkOiBmdW5jdGlvbigpIHtcbiAgICAgIHdhcm4oJ1VzaW5nIHdpbmRvdy5hdXRob3JpemF0aW9ucyBpcyBkZXByZWNhdGVkLiBQbGVhc2UgdXNlIFN3YWdnZXJVaS5hcGkuY2xpZW50QXV0aG9yaXphdGlvbnMuYWRkKCkuJyk7XG5cbiAgICAgIGlmICh0eXBlb2Ygd2luZG93LnN3YWdnZXJVaSA9PT0gJ3VuZGVmaW5lZCcpIHtcbiAgICAgICAgdGhyb3cgbmV3IFR5cGVFcnJvcignd2luZG93LnN3YWdnZXJVaSBpcyBub3QgZGVmaW5lZCcpO1xuICAgICAgfVxuXG4gICAgICBpZiAod2luZG93LnN3YWdnZXJVaSBpbnN0YW5jZW9mIFN3YWdnZXJVaSkge1xuICAgICAgICB3aW5kb3cuc3dhZ2dlclVpLmFwaS5jbGllbnRBdXRob3JpemF0aW9ucy5hZGQuYXBwbHkod2luZG93LnN3YWdnZXJVaS5hcGkuY2xpZW50QXV0aG9yaXphdGlvbnMsIGFyZ3VtZW50cyk7XG4gICAgICB9XG4gICAgfVxuICB9O1xuXG4gIHdpbmRvdy5BcGlLZXlBdXRob3JpemF0aW9uID0gZnVuY3Rpb24oKSB7XG4gICAgd2Fybignd2luZG93LkFwaUtleUF1dGhvcml6YXRpb24gaXMgZGVwcmVjYXRlZC4gUGxlYXNlIHVzZSBTd2FnZ2VyQ2xpZW50LkFwaUtleUF1dGhvcml6YXRpb24uJyk7XG4gICAgU3dhZ2dlckNsaWVudC5BcGlLZXlBdXRob3JpemF0aW9uLmFwcGx5KHdpbmRvdywgYXJndW1lbnRzKTtcbiAgfTtcblxuICB3aW5kb3cuUGFzc3dvcmRBdXRob3JpemF0aW9uID0gZnVuY3Rpb24oKSB7XG4gICAgd2Fybignd2luZG93LlBhc3N3b3JkQXV0aG9yaXphdGlvbiBpcyBkZXByZWNhdGVkLiBQbGVhc2UgdXNlIFN3YWdnZXJDbGllbnQuUGFzc3dvcmRBdXRob3JpemF0aW9uLicpO1xuICAgIFN3YWdnZXJDbGllbnQuUGFzc3dvcmRBdXRob3JpemF0aW9uLmFwcGx5KHdpbmRvdywgYXJndW1lbnRzKTtcbiAgfTtcblxuICBmdW5jdGlvbiB3YXJuKG1lc3NhZ2UpIHtcbiAgICBpZiAoJ2NvbnNvbGUnIGluIHdpbmRvdyAmJiB0eXBlb2Ygd2luZG93LmNvbnNvbGUud2FybiA9PT0gJ2Z1bmN0aW9uJykge1xuICAgICAgY29uc29sZS53YXJuKG1lc3NhZ2UpO1xuICAgIH1cbiAgfVxufSkoKTtcblxuXG4vLyBVTURcbihmdW5jdGlvbiAocm9vdCwgZmFjdG9yeSkge1xuICAgIGlmICh0eXBlb2YgZGVmaW5lID09PSAnZnVuY3Rpb24nICYmIGRlZmluZS5hbWQpIHtcbiAgICAgICAgLy8gQU1ELiBSZWdpc3RlciBhcyBhbiBhbm9ueW1vdXMgbW9kdWxlLlxuICAgICAgICBkZWZpbmUoWydiJ10sIGZ1bmN0aW9uIChiKSB7XG4gICAgICAgICAgICByZXR1cm4gKHJvb3QuU3dhZ2dlclVpID0gZmFjdG9yeShiKSk7XG4gICAgICAgIH0pO1xuICAgIH0gZWxzZSBpZiAodHlwZW9mIGV4cG9ydHMgPT09ICdvYmplY3QnKSB7XG4gICAgICAgIC8vIE5vZGUuIERvZXMgbm90IHdvcmsgd2l0aCBzdHJpY3QgQ29tbW9uSlMsIGJ1dFxuICAgICAgICAvLyBvbmx5IENvbW1vbkpTLWxpa2UgZW52aXJvbm1lbnRzIHRoYXQgc3VwcG9ydCBtb2R1bGUuZXhwb3J0cyxcbiAgICAgICAgLy8gbGlrZSBOb2RlLlxuICAgICAgICBtb2R1bGUuZXhwb3J0cyA9IGZhY3RvcnkocmVxdWlyZSgnYicpKTtcbiAgICB9IGVsc2Uge1xuICAgICAgICAvLyBCcm93c2VyIGdsb2JhbHNcbiAgICAgICAgcm9vdC5Td2FnZ2VyVWkgPSBmYWN0b3J5KHJvb3QuYik7XG4gICAgfVxufSh0aGlzLCBmdW5jdGlvbiAoKSB7XG4gICAgcmV0dXJuIFN3YWdnZXJVaTtcbn0pKTtcbiIsIid1c2Ugc3RyaWN0Jztcblxud2luZG93LlN3YWdnZXJVaS51dGlscyA9IHtcbiAgICBwYXJzZVNlY3VyaXR5RGVmaW5pdGlvbnM6IGZ1bmN0aW9uIChzZWN1cml0eSwgc2VjdXJpdHlEZWZpbml0aW9ucykge1xuICAgICAgICB2YXIgYXV0aHMgPSBPYmplY3QuYXNzaWduKHt9LCBzZWN1cml0eURlZmluaXRpb25zKTtcbiAgICAgICAgdmFyIG9hdXRoMkFyciA9IFtdO1xuICAgICAgICB2YXIgYXV0aHNBcnIgPSBbXTtcbiAgICAgICAgdmFyIHNjb3BlcyA9IFtdO1xuICAgICAgICB2YXIgdXRpbHMgPSB3aW5kb3cuU3dhZ2dlclVpLnV0aWxzO1xuXG4gICAgICAgIGlmICghQXJyYXkuaXNBcnJheShzZWN1cml0eSkpIHsgcmV0dXJuIG51bGw7IH1cblxuICAgICAgICBzZWN1cml0eS5mb3JFYWNoKGZ1bmN0aW9uIChpdGVtKSB7XG4gICAgICAgICAgICB2YXIgc2luZ2xlU2VjdXJpdHkgPSB7fTtcbiAgICAgICAgICAgIHZhciBzaW5nbGVPYXV0aDJTZWN1cml0eSA9IHt9O1xuXG4gICAgICAgICAgICBmb3IgKHZhciBrZXkgaW4gaXRlbSkge1xuICAgICAgICAgICAgICAgIGlmIChBcnJheS5pc0FycmF5KGl0ZW1ba2V5XSkpIHtcbiAgICAgICAgICAgICAgICAgICAgaWYgKCFhdXRoc1trZXldKSB7IGNvbnRpbnVlOyB9XG4gICAgICAgICAgICAgICAgICAgIGF1dGhzW2tleV0gPSBhdXRoc1trZXldIHx8IHt9O1xuICAgICAgICAgICAgICAgICAgICBpZiAoYXV0aHNba2V5XS50eXBlID09PSAnb2F1dGgyJykge1xuICAgICAgICAgICAgICAgICAgICAgICAgc2luZ2xlT2F1dGgyU2VjdXJpdHlba2V5XSA9IE9iamVjdC5hc3NpZ24oe30sIGF1dGhzW2tleV0pO1xuICAgICAgICAgICAgICAgICAgICAgICAgc2luZ2xlT2F1dGgyU2VjdXJpdHlba2V5XS5zY29wZXMgPSBPYmplY3QuYXNzaWduKHt9LCBhdXRoc1trZXldLnNjb3Blcyk7XG4gICAgICAgICAgICAgICAgICAgICAgICBmb3IgKHZhciBpIGluIHNpbmdsZU9hdXRoMlNlY3VyaXR5W2tleV0uc2NvcGVzKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGl0ZW1ba2V5XS5pbmRleE9mKGkpIDwgMCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZWxldGUgc2luZ2xlT2F1dGgyU2VjdXJpdHlba2V5XS5zY29wZXNbaV07XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgc2luZ2xlT2F1dGgyU2VjdXJpdHlba2V5XS5zY29wZXMgPSB1dGlscy5wYXJzZU9hdXRoMlNjb3BlcyhzaW5nbGVPYXV0aDJTZWN1cml0eVtrZXldLnNjb3Blcyk7XG4gICAgICAgICAgICAgICAgICAgICAgICBzY29wZXMgPSBfLm1lcmdlKHNjb3Blcywgc2luZ2xlT2F1dGgyU2VjdXJpdHlba2V5XS5zY29wZXMpO1xuICAgICAgICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICAgICAgc2luZ2xlU2VjdXJpdHlba2V5XSA9IE9iamVjdC5hc3NpZ24oe30sIGF1dGhzW2tleV0pO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgaWYgKGl0ZW1ba2V5XS50eXBlID09PSAnb2F1dGgyJykge1xuICAgICAgICAgICAgICAgICAgICAgICAgc2luZ2xlT2F1dGgyU2VjdXJpdHlba2V5XSA9IE9iamVjdC5hc3NpZ24oe30sIGl0ZW1ba2V5XSk7XG4gICAgICAgICAgICAgICAgICAgICAgICBzaW5nbGVPYXV0aDJTZWN1cml0eVtrZXldLnNjb3BlcyA9IHV0aWxzLnBhcnNlT2F1dGgyU2NvcGVzKHNpbmdsZU9hdXRoMlNlY3VyaXR5W2tleV0uc2NvcGVzKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIHNjb3BlcyA9IF8ubWVyZ2Uoc2NvcGVzLCBzaW5nbGVPYXV0aDJTZWN1cml0eVtrZXldLnNjb3Blcyk7XG4gICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBzaW5nbGVTZWN1cml0eVtrZXldID0gaXRlbVtrZXldO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBpZiAoIV8uaXNFbXB0eShzaW5nbGVTZWN1cml0eSkpIHtcbiAgICAgICAgICAgICAgICBhdXRoc0Fyci5wdXNoKHNpbmdsZVNlY3VyaXR5KTtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgaWYgKCFfLmlzRW1wdHkoc2luZ2xlT2F1dGgyU2VjdXJpdHkpKXtcbiAgICAgICAgICAgICAgICBvYXV0aDJBcnIucHVzaChzaW5nbGVPYXV0aDJTZWN1cml0eSk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH0pO1xuXG4gICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICBhdXRocyA6IGF1dGhzQXJyLFxuICAgICAgICAgICAgb2F1dGgyOiBvYXV0aDJBcnIsXG4gICAgICAgICAgICBzY29wZXM6IHNjb3Blc1xuICAgICAgICB9O1xuICAgIH0sXG5cbiAgICBwYXJzZU9hdXRoMlNjb3BlczogZnVuY3Rpb24gKGRhdGEpIHtcbiAgICAgICAgdmFyIHNjb3BlcyA9IE9iamVjdC5hc3NpZ24oe30sIGRhdGEpO1xuICAgICAgICB2YXIgcmVzdWx0ID0gW107XG4gICAgICAgIHZhciBrZXk7XG5cbiAgICAgICAgZm9yIChrZXkgaW4gc2NvcGVzKSB7XG4gICAgICAgICAgICByZXN1bHQucHVzaCh7c2NvcGU6IGtleSwgZGVzY3JpcHRpb246IHNjb3Blc1trZXldfSk7XG4gICAgICAgIH1cblxuICAgICAgICByZXR1cm4gcmVzdWx0O1xuICAgIH0sXG5cbiAgICBzYW5pdGl6ZTogZnVuY3Rpb24oaHRtbCkge1xuICAgICAgICAvLyBTdHJpcCB0aGUgc2NyaXB0IHRhZ3MgZnJvbSB0aGUgaHRtbCBhbmQgaW5saW5lIGV2ZW5oYW5kbGVyc1xuICAgICAgICBodG1sID0gaHRtbC5yZXBsYWNlKC88c2NyaXB0XFxiW148XSooPzooPyE8XFwvc2NyaXB0Pik8W148XSopKjxcXC9zY3JpcHQ+L2dpLCAnJyk7XG4gICAgICAgIGh0bWwgPSBodG1sLnJlcGxhY2UoLyhvblxcdys9XCJbXlwiXSpcIikqKG9uXFx3Kz0nW14nXSonKSoob25cXHcrPVxcdypcXChcXHcqXFwpKSovZ2ksICcnKTtcblxuICAgICAgICByZXR1cm4gaHRtbDtcbiAgICB9XG59OyIsIid1c2Ugc3RyaWN0JztcblxuU3dhZ2dlclVpLk1vZGVscy5BcGlLZXlBdXRoTW9kZWwgPSBCYWNrYm9uZS5Nb2RlbC5leHRlbmQoe1xuICAgIGRlZmF1bHRzOiB7XG4gICAgICAgICdpbic6ICcnLFxuICAgICAgICBuYW1lOiAnJyxcbiAgICAgICAgdGl0bGU6ICcnLFxuICAgICAgICB2YWx1ZTogJydcbiAgICB9LFxuXG4gICAgaW5pdGlhbGl6ZTogZnVuY3Rpb24gKCkge1xuICAgICAgICB0aGlzLm9uKCdjaGFuZ2UnLCB0aGlzLnZhbGlkYXRlKTtcbiAgICB9LFxuXG4gICAgdmFsaWRhdGU6IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgdmFyIHZhbGlkID0gISF0aGlzLmdldCgndmFsdWUnKTtcblxuICAgICAgICB0aGlzLnNldCgndmFsaWQnLCB2YWxpZCk7XG5cbiAgICAgICAgcmV0dXJuIHZhbGlkO1xuICAgIH1cbn0pOyIsIid1c2Ugc3RyaWN0JztcblxuU3dhZ2dlclVpLlZpZXdzLkFwaUtleUF1dGhWaWV3ID0gQmFja2JvbmUuVmlldy5leHRlbmQoeyAvLyBUT0RPOiBhcHBlbmQgdGhpcyB0byBnbG9iYWwgU3dhZ2dlclVpXG5cbiAgICBldmVudHM6IHtcbiAgICAgICAgJ2NoYW5nZSAuaW5wdXRfYXBpS2V5X2VudHJ5JzogJ2FwaUtleUNoYW5nZSdcbiAgICB9LFxuXG4gICAgc2VsZWN0b3JzOiB7XG4gICAgICAgIGFwaWtleUlucHV0OiAnLmlucHV0X2FwaUtleV9lbnRyeSdcbiAgICB9LFxuXG4gICAgdGVtcGxhdGU6IEhhbmRsZWJhcnMudGVtcGxhdGVzLmFwaWtleV9hdXRoLFxuXG4gICAgaW5pdGlhbGl6ZTogZnVuY3Rpb24ob3B0cykge1xuICAgICAgICB0aGlzLm9wdGlvbnMgPSBvcHRzIHx8IHt9O1xuICAgICAgICB0aGlzLnJvdXRlciA9IHRoaXMub3B0aW9ucy5yb3V0ZXI7XG4gICAgfSxcblxuICAgIHJlbmRlcjogZnVuY3Rpb24gKCl7XG4gICAgICAgIHRoaXMuJGVsLmh0bWwodGhpcy50ZW1wbGF0ZSh0aGlzLm1vZGVsLnRvSlNPTigpKSk7XG5cbiAgICAgICAgcmV0dXJuIHRoaXM7XG4gICAgfSxcblxuICAgIGFwaUtleUNoYW5nZTogZnVuY3Rpb24gKGUpIHtcbiAgICAgICAgdmFyIHZhbCA9ICQoZS50YXJnZXQpLnZhbCgpO1xuICAgICAgICBpZiAodmFsKSB7XG4gICAgICAgICAgICB0aGlzLiQodGhpcy5zZWxlY3RvcnMuYXBpa2V5SW5wdXQpLnJlbW92ZUNsYXNzKCdlcnJvcicpO1xuICAgICAgICB9XG5cbiAgICAgICAgdGhpcy5tb2RlbC5zZXQoJ3ZhbHVlJywgdmFsKTtcbiAgICB9LFxuXG4gICAgaXNWYWxpZDogZnVuY3Rpb24gKCkge1xuICAgICAgICByZXR1cm4gdGhpcy5tb2RlbC52YWxpZGF0ZSgpO1xuICAgIH0sXG5cbiAgICBoaWdobGlnaHRJbnZhbGlkOiBmdW5jdGlvbiAoKSB7XG4gICAgICAgIGlmICghdGhpcy5pc1ZhbGlkKCkpIHtcbiAgICAgICAgICAgIHRoaXMuJCh0aGlzLnNlbGVjdG9ycy5hcGlrZXlJbnB1dCkuYWRkQ2xhc3MoJ2Vycm9yJyk7XG4gICAgICAgIH1cbiAgICB9XG5cbn0pOyIsIid1c2Ugc3RyaWN0JztcblxuU3dhZ2dlclVpLlZpZXdzLkF1dGhCdXR0b25WaWV3ID0gQmFja2JvbmUuVmlldy5leHRlbmQoe1xuICAgIGV2ZW50czoge1xuICAgICAgICAnY2xpY2sgLmF1dGhvcml6ZV9fYnRuJzogJ2F1dGhvcml6ZUJ0bkNsaWNrJ1xuICAgIH0sXG5cbiAgICB0cGxzOiB7XG4gICAgICAgIHBvcHVwOiBIYW5kbGViYXJzLnRlbXBsYXRlcy5wb3B1cCxcbiAgICAgICAgYXV0aEJ0bjogSGFuZGxlYmFycy50ZW1wbGF0ZXMuYXV0aF9idXR0b24sXG4gICAgICAgIGF1dGhCdG5PcGVyYXRpb246IEhhbmRsZWJhcnMudGVtcGxhdGVzLmF1dGhfYnV0dG9uX29wZXJhdGlvblxuICAgIH0sXG5cbiAgICBpbml0aWFsaXplOiBmdW5jdGlvbihvcHRzKSB7XG4gICAgICAgIHRoaXMub3B0aW9ucyA9IG9wdHMgfHwge307XG4gICAgICAgIHRoaXMub3B0aW9ucy5kYXRhID0gdGhpcy5vcHRpb25zLmRhdGEgfHwge307XG4gICAgICAgIHRoaXMuaXNPcGVyYXRpb24gPSB0aGlzLm9wdGlvbnMuaXNPcGVyYXRpb247XG4gICAgICAgIHRoaXMubW9kZWwgPSB0aGlzLm1vZGVsIHx8IHt9O1xuICAgICAgICB0aGlzLnJvdXRlciA9IHRoaXMub3B0aW9ucy5yb3V0ZXI7XG4gICAgICAgIHRoaXMuYXV0aHMgPSB0aGlzLm9wdGlvbnMuZGF0YS5vYXV0aDIuY29uY2F0KHRoaXMub3B0aW9ucy5kYXRhLmF1dGhzKTtcbiAgICB9LFxuXG4gICAgcmVuZGVyOiBmdW5jdGlvbiAoKSB7XG4gICAgICAgIHZhciB0cGxOYW1lID0gdGhpcy5pc09wZXJhdGlvbiA/ICdhdXRoQnRuT3BlcmF0aW9uJyA6ICdhdXRoQnRuJztcblxuICAgICAgICB0aGlzLiRhdXRoRWwgPSB0aGlzLnJlbmRlckF1dGhzKHRoaXMuYXV0aHMpO1xuICAgICAgICB0aGlzLiRlbC5odG1sKHRoaXMudHBsc1t0cGxOYW1lXSh0aGlzLm1vZGVsKSk7XG5cbiAgICAgICAgcmV0dXJuIHRoaXM7XG4gICAgfSxcblxuICAgIGF1dGhvcml6ZUJ0bkNsaWNrOiBmdW5jdGlvbiAoZSkge1xuICAgICAgICB2YXIgYXV0aHNNb2RlbDtcblxuICAgICAgICBlLnByZXZlbnREZWZhdWx0KCk7XG5cbiAgICAgICAgYXV0aHNNb2RlbCA9IHtcbiAgICAgICAgICAgIHRpdGxlOiAnQXZhaWxhYmxlIGF1dGhvcml6YXRpb25zJyxcbiAgICAgICAgICAgIGNvbnRlbnQ6IHRoaXMuJGF1dGhFbFxuICAgICAgICB9O1xuXG4gICAgICAgIC8vIFRoZSBjb250ZW50IG9mIHRoZSBwb3B1cCBpcyByZW1vdmVkIGFuZCBhbGwgZXZlbnRzIHVuYm91bmQgYWZ0ZXIgY2xpY2tpbmcgdGhlICdDYW5jZWwnIGJ1dHRvbiBvZiB0aGUgcG9wdXAuXG4gICAgICAgIC8vIFdlJ2xsIGhhdmUgdG8gcmUtcmVuZGVyIHRoZSBjb250ZW50cyBiZWZvcmUgY3JlYXRpbmcgYSBuZXcgcG9wdXAgdmlldy5cbiAgICAgICAgdGhpcy5yZW5kZXIoKTtcblxuICAgICAgICB0aGlzLnBvcHVwID0gbmV3IFN3YWdnZXJVaS5WaWV3cy5Qb3B1cFZpZXcoe21vZGVsOiBhdXRoc01vZGVsfSk7XG4gICAgICAgIHRoaXMucG9wdXAucmVuZGVyKCk7XG4gICAgfSxcblxuICAgIHJlbmRlckF1dGhzOiBmdW5jdGlvbiAoYXV0aHMpIHtcbiAgICAgICAgdmFyICRlbCA9ICQoJzxkaXY+Jyk7XG4gICAgICAgIHZhciBpc0xvZ291dCA9IGZhbHNlO1xuXG4gICAgICAgIGF1dGhzLmZvckVhY2goZnVuY3Rpb24gKGF1dGgpIHtcbiAgICAgICAgICAgIHZhciBhdXRoVmlldyA9IG5ldyBTd2FnZ2VyVWkuVmlld3MuQXV0aFZpZXcoe2RhdGE6IGF1dGgsIHJvdXRlcjogdGhpcy5yb3V0ZXJ9KTtcbiAgICAgICAgICAgIHZhciBhdXRoRWwgPSBhdXRoVmlldy5yZW5kZXIoKS5lbDtcbiAgICAgICAgICAgICRlbC5hcHBlbmQoYXV0aEVsKTtcbiAgICAgICAgICAgIGlmIChhdXRoVmlldy5pc0xvZ291dCkge1xuICAgICAgICAgICAgICAgIGlzTG9nb3V0ID0gdHJ1ZTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfSwgdGhpcyk7XG5cbiAgICAgICAgdGhpcy5tb2RlbC5pc0xvZ291dCA9IGlzTG9nb3V0O1xuXG4gICAgICAgIHJldHVybiAkZWw7XG4gICAgfVxuXG59KTtcbiIsIid1c2Ugc3RyaWN0JztcblxuU3dhZ2dlclVpLkNvbGxlY3Rpb25zLkF1dGhzQ29sbGVjdGlvbiA9IEJhY2tib25lLkNvbGxlY3Rpb24uZXh0ZW5kKHtcbiAgICBjb25zdHJ1Y3RvcjogZnVuY3Rpb24oKSB7XG4gICAgICAgIHZhciBhcmdzID0gQXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwoYXJndW1lbnRzKTtcblxuICAgICAgICBhcmdzWzBdID0gdGhpcy5wYXJzZShhcmdzWzBdKTtcblxuICAgICAgICBCYWNrYm9uZS5Db2xsZWN0aW9uLmFwcGx5KHRoaXMsIGFyZ3MpO1xuICAgIH0sXG5cbiAgICBhZGQ6IGZ1bmN0aW9uIChtb2RlbCkge1xuICAgICAgICB2YXIgYXJncyA9IEFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKGFyZ3VtZW50cyk7XG5cbiAgICAgICAgaWYgKEFycmF5LmlzQXJyYXkobW9kZWwpKSB7XG4gICAgICAgICAgICBhcmdzWzBdID0gXy5tYXAobW9kZWwsIGZ1bmN0aW9uKHZhbCkge1xuICAgICAgICAgICAgICAgIHJldHVybiB0aGlzLmhhbmRsZU9uZSh2YWwpO1xuICAgICAgICAgICAgfSwgdGhpcyk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICBhcmdzWzBdID0gdGhpcy5oYW5kbGVPbmUobW9kZWwpO1xuICAgICAgICB9XG5cbiAgICAgICAgQmFja2JvbmUuQ29sbGVjdGlvbi5wcm90b3R5cGUuYWRkLmFwcGx5KHRoaXMsIGFyZ3MpO1xuICAgIH0sXG5cbiAgICBoYW5kbGVPbmU6IGZ1bmN0aW9uIChtb2RlbCkge1xuICAgICAgICB2YXIgcmVzdWx0ID0gbW9kZWw7XG5cbiAgICAgICAgaWYgKCEgKG1vZGVsIGluc3RhbmNlb2YgQmFja2JvbmUuTW9kZWwpICkge1xuICAgICAgICAgICAgc3dpdGNoIChtb2RlbC50eXBlKSB7XG4gICAgICAgICAgICAgICAgY2FzZSAnb2F1dGgyJzpcbiAgICAgICAgICAgICAgICAgICAgcmVzdWx0ID0gbmV3IFN3YWdnZXJVaS5Nb2RlbHMuT2F1dGgyTW9kZWwobW9kZWwpO1xuICAgICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgICBjYXNlICdiYXNpYyc6XG4gICAgICAgICAgICAgICAgICAgIHJlc3VsdCA9IG5ldyBTd2FnZ2VyVWkuTW9kZWxzLkJhc2ljQXV0aE1vZGVsKG1vZGVsKTtcbiAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgICAgY2FzZSAnYXBpS2V5JzpcbiAgICAgICAgICAgICAgICAgICAgcmVzdWx0ID0gbmV3IFN3YWdnZXJVaS5Nb2RlbHMuQXBpS2V5QXV0aE1vZGVsKG1vZGVsKTtcbiAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgICAgZGVmYXVsdDpcbiAgICAgICAgICAgICAgICAgICAgcmVzdWx0ID0gbmV3IEJhY2tib25lLk1vZGVsKG1vZGVsKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybiByZXN1bHQ7XG4gICAgfSxcblxuICAgIGlzVmFsaWQ6IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgdmFyIHZhbGlkID0gdHJ1ZTtcblxuICAgICAgICB0aGlzLm1vZGVscy5mb3JFYWNoKGZ1bmN0aW9uKG1vZGVsKSB7XG4gICAgICAgICAgICBpZiAoIW1vZGVsLnZhbGlkYXRlKCkpIHtcbiAgICAgICAgICAgICAgICB2YWxpZCA9IGZhbHNlO1xuICAgICAgICAgICAgfVxuICAgICAgICB9KTtcblxuICAgICAgICByZXR1cm4gdmFsaWQ7XG4gICAgfSxcblxuICAgIGlzQXV0aG9yaXplZDogZnVuY3Rpb24gKCkge1xuICAgICAgICByZXR1cm4gdGhpcy5sZW5ndGggPT09IHRoaXMud2hlcmUoeyBpc0xvZ291dDogdHJ1ZSB9KS5sZW5ndGg7XG4gICAgfSxcblxuICAgIGlzUGFydGlhbGx5QXV0aG9yaXplZDogZnVuY3Rpb24gKCkge1xuICAgICAgICByZXR1cm4gdGhpcy53aGVyZSh7IGlzTG9nb3V0OiB0cnVlIH0pLmxlbmd0aCA+IDA7XG4gICAgfSxcblxuICAgIHBhcnNlOiBmdW5jdGlvbiAoZGF0YSkge1xuICAgICAgICB2YXIgYXV0aHogPSB7fTtcblxuICAgICAgICBpZih0eXBlb2Ygd2luZG93LnN3YWdnZXJVaSAhPT0gJ3VuZGVmaW5lZCcpIHtcbiAgICAgICAgICAgIGF1dGh6ID0gT2JqZWN0LmFzc2lnbih7fSwgd2luZG93LnN3YWdnZXJVaS5hcGkuY2xpZW50QXV0aG9yaXphdGlvbnMuYXV0aHopO1xuICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuIF8ubWFwKGRhdGEsIGZ1bmN0aW9uIChhdXRoLCBuYW1lKSB7XG4gICAgICAgICAgICB2YXIgaXNCYXNpYyA9IGF1dGh6W25hbWVdICYmIGF1dGgudHlwZSA9PT0gJ2Jhc2ljJyAmJiBhdXRoeltuYW1lXS51c2VybmFtZSAmJiBhdXRoeltuYW1lXS5wYXNzd29yZDtcblxuICAgICAgICAgICAgXy5leHRlbmQoYXV0aCwge1xuICAgICAgICAgICAgICAgIHRpdGxlOiBuYW1lXG4gICAgICAgICAgICB9KTtcblxuICAgICAgICAgICAgaWYgKGF1dGh6W25hbWVdIHx8IGlzQmFzaWMpIHtcbiAgICAgICAgICAgICAgICBfLmV4dGVuZChhdXRoLCB7XG4gICAgICAgICAgICAgICAgICAgIGlzTG9nb3V0OiB0cnVlLFxuICAgICAgICAgICAgICAgICAgICB2YWx1ZTogaXNCYXNpYyA/IHVuZGVmaW5lZCA6IGF1dGh6W25hbWVdLnZhbHVlLFxuICAgICAgICAgICAgICAgICAgICB1c2VybmFtZTogaXNCYXNpYyA/IGF1dGh6W25hbWVdLnVzZXJuYW1lIDogdW5kZWZpbmVkLFxuICAgICAgICAgICAgICAgICAgICBwYXNzd29yZDogaXNCYXNpYyA/IGF1dGh6W25hbWVdLnBhc3N3b3JkIDogdW5kZWZpbmVkLFxuICAgICAgICAgICAgICAgICAgICB2YWxpZDogdHJ1ZVxuICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICByZXR1cm4gYXV0aDtcbiAgICAgICAgfSk7XG4gICAgfVxufSk7IiwiJ3VzZSBzdHJpY3QnO1xuXG5Td2FnZ2VyVWkuVmlld3MuQXV0aHNDb2xsZWN0aW9uVmlldyA9IEJhY2tib25lLlZpZXcuZXh0ZW5kKHtcblxuICAgIGluaXRpYWxpemU6IGZ1bmN0aW9uKG9wdHMpIHtcbiAgICAgICAgdGhpcy5vcHRpb25zID0gb3B0cyB8fCB7fTtcbiAgICAgICAgdGhpcy5vcHRpb25zLmRhdGEgPSB0aGlzLm9wdGlvbnMuZGF0YSB8fCB7fTtcbiAgICAgICAgdGhpcy5yb3V0ZXIgPSB0aGlzLm9wdGlvbnMucm91dGVyO1xuXG4gICAgICAgIHRoaXMuY29sbGVjdGlvbiA9IG5ldyBTd2FnZ2VyVWkuQ29sbGVjdGlvbnMuQXV0aHNDb2xsZWN0aW9uKG9wdHMuZGF0YSk7XG5cbiAgICAgICAgdGhpcy4kaW5uZXJFbCA9ICQoJzxkaXY+Jyk7XG4gICAgICAgIHRoaXMuYXV0aFZpZXdzID0gW107XG4gICAgfSxcblxuICAgIHJlbmRlcjogZnVuY3Rpb24gKCkge1xuICAgICAgICB0aGlzLmNvbGxlY3Rpb24uZWFjaChmdW5jdGlvbiAoYXV0aCkge1xuICAgICAgICAgICAgdGhpcy5yZW5kZXJPbmVBdXRoKGF1dGgpO1xuICAgICAgICB9LCB0aGlzKTtcblxuICAgICAgICB0aGlzLiRlbC5odG1sKHRoaXMuJGlubmVyRWwuaHRtbCgpID8gdGhpcy4kaW5uZXJFbCA6ICcnKTtcblxuICAgICAgICByZXR1cm4gdGhpcztcbiAgICB9LFxuXG4gICAgcmVuZGVyT25lQXV0aDogZnVuY3Rpb24gKGF1dGhNb2RlbCkge1xuICAgICAgICB2YXIgYXV0aFZpZXdFbCwgYXV0aFZpZXcsIGF1dGhWaWV3TmFtZTtcbiAgICAgICAgdmFyIHR5cGUgPSBhdXRoTW9kZWwuZ2V0KCd0eXBlJyk7XG5cbiAgICAgICAgaWYgKHR5cGUgPT09ICdhcGlLZXknKSB7XG4gICAgICAgICAgICBhdXRoVmlld05hbWUgPSAnQXBpS2V5QXV0aFZpZXcnO1xuICAgICAgICB9IGVsc2UgaWYgKHR5cGUgPT09ICdiYXNpYycgJiYgdGhpcy4kaW5uZXJFbC5maW5kKCcuYmFzaWNfYXV0aF9jb250YWluZXInKS5sZW5ndGggPT09IDApIHtcbiAgICAgICAgICAgIGF1dGhWaWV3TmFtZSA9ICdCYXNpY0F1dGhWaWV3JztcbiAgICAgICAgfSBlbHNlIGlmICh0eXBlID09PSAnb2F1dGgyJykge1xuICAgICAgICAgICAgYXV0aFZpZXdOYW1lID0gJ09hdXRoMlZpZXcnO1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKGF1dGhWaWV3TmFtZSkge1xuICAgICAgICAgICAgYXV0aFZpZXcgPSBuZXcgU3dhZ2dlclVpLlZpZXdzW2F1dGhWaWV3TmFtZV0oe21vZGVsOiBhdXRoTW9kZWwsIHJvdXRlcjogdGhpcy5yb3V0ZXJ9KTtcbiAgICAgICAgICAgIGF1dGhWaWV3RWwgPSBhdXRoVmlldy5yZW5kZXIoKS5lbDtcbiAgICAgICAgICAgIHRoaXMuYXV0aFZpZXdzLnB1c2goYXV0aFZpZXcpO1xuICAgICAgICB9XG5cbiAgICAgICAgdGhpcy4kaW5uZXJFbC5hcHBlbmQoYXV0aFZpZXdFbCk7XG4gICAgfSxcblxuICAgIGhpZ2hsaWdodEludmFsaWQ6IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgdGhpcy5hdXRoVmlld3MuZm9yRWFjaChmdW5jdGlvbiAodmlldykge1xuICAgICAgICAgICAgdmlldy5oaWdobGlnaHRJbnZhbGlkKCk7XG4gICAgICAgIH0sIHRoaXMpO1xuICAgIH1cblxufSk7XG4iLCIndXNlIHN0cmljdCc7XG5cbi8qIGdsb2JhbCByZWRpcmVjdF91cmk6dHJ1ZSAqL1xuLyogZ2xvYmFsIGNsaWVudElkICovXG4vKiBnbG9iYWwgc2NvcGVTZXBhcmF0b3IgKi9cbi8qIGdsb2JhbCBhZGRpdGlvbmFsUXVlcnlTdHJpbmdQYXJhbXMgKi9cbi8qIGdsb2JhbCBjbGllbnRTZWNyZXQgKi9cbi8qIGdsb2JhbCBvbk9BdXRoQ29tcGxldGUgKi9cbi8qIGdsb2JhbCByZWFsbSAqL1xuLypqc2hpbnQgdW51c2VkOmZhbHNlKi9cblxuU3dhZ2dlclVpLlZpZXdzLkF1dGhWaWV3ID0gQmFja2JvbmUuVmlldy5leHRlbmQoe1xuICAgIGV2ZW50czoge1xuICAgICAgICAnY2xpY2sgLmF1dGhfc3VibWl0X19idXR0b24nOiAnYXV0aG9yaXplQ2xpY2snLFxuICAgICAgICAnY2xpY2sgLmF1dGhfbG9nb3V0X19idXR0b24nOiAnbG9nb3V0Q2xpY2snXG4gICAgfSxcblxuICAgIHRwbHM6IHtcbiAgICAgICAgbWFpbjogSGFuZGxlYmFycy50ZW1wbGF0ZXMuYXV0aF92aWV3XG4gICAgfSxcblxuICAgIHNlbGVjdG9yczoge1xuICAgICAgICBpbm5lckVsOiAnLmF1dGhfaW5uZXInLFxuICAgICAgICBhdXRoQnRuOiAnLmF1dGhfc3VibWl0X19idXR0b24nXG4gICAgfSxcblxuICAgIGluaXRpYWxpemU6IGZ1bmN0aW9uKG9wdHMpIHtcbiAgICAgICAgdGhpcy5vcHRpb25zID0gb3B0cyB8fCB7fTtcbiAgICAgICAgb3B0cy5kYXRhID0gb3B0cy5kYXRhIHx8IHt9O1xuICAgICAgICB0aGlzLnJvdXRlciA9IHRoaXMub3B0aW9ucy5yb3V0ZXI7XG5cbiAgICAgICAgdGhpcy5hdXRoc0NvbGxlY3Rpb25WaWV3ID0gbmV3IFN3YWdnZXJVaS5WaWV3cy5BdXRoc0NvbGxlY3Rpb25WaWV3KHtkYXRhOiBvcHRzLmRhdGF9KTtcblxuICAgICAgICB0aGlzLiRlbC5odG1sKHRoaXMudHBscy5tYWluKHtcbiAgICAgICAgICAgIGlzTG9nb3V0OiB0aGlzLmF1dGhzQ29sbGVjdGlvblZpZXcuY29sbGVjdGlvbi5pc0F1dGhvcml6ZWQoKSxcbiAgICAgICAgICAgIGlzQXV0aG9yaXplZDogdGhpcy5hdXRoc0NvbGxlY3Rpb25WaWV3LmNvbGxlY3Rpb24uaXNQYXJ0aWFsbHlBdXRob3JpemVkKClcbiAgICAgICAgfSkpO1xuICAgICAgICB0aGlzLiRpbm5lckVsID0gdGhpcy4kKHRoaXMuc2VsZWN0b3JzLmlubmVyRWwpO1xuICAgICAgICB0aGlzLmlzTG9nb3V0ID0gdGhpcy5hdXRoc0NvbGxlY3Rpb25WaWV3LmNvbGxlY3Rpb24uaXNQYXJ0aWFsbHlBdXRob3JpemVkKCk7XG4gICAgfSxcblxuICAgIHJlbmRlcjogZnVuY3Rpb24gKCkge1xuICAgICAgICB0aGlzLiRpbm5lckVsLmh0bWwodGhpcy5hdXRoc0NvbGxlY3Rpb25WaWV3LnJlbmRlcigpLmVsKTtcblxuICAgICAgICByZXR1cm4gdGhpcztcbiAgICB9LFxuXG4gICAgYXV0aG9yaXplQ2xpY2s6IGZ1bmN0aW9uIChlKSB7XG4gICAgICAgIGUucHJldmVudERlZmF1bHQoKTtcbiAgICAgICAgZS5zdG9wUHJvcGFnYXRpb24oKTtcblxuICAgICAgICBpZiAodGhpcy5hdXRoc0NvbGxlY3Rpb25WaWV3LmNvbGxlY3Rpb24uaXNWYWxpZCgpKSB7XG4gICAgICAgICAgICB0aGlzLmF1dGhvcml6ZSgpO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgdGhpcy5hdXRoc0NvbGxlY3Rpb25WaWV3LmhpZ2hsaWdodEludmFsaWQoKTtcbiAgICAgICAgfVxuICAgIH0sXG5cbiAgICBhdXRob3JpemU6IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgdGhpcy5hdXRoc0NvbGxlY3Rpb25WaWV3LmNvbGxlY3Rpb24uZm9yRWFjaChmdW5jdGlvbiAoYXV0aCkge1xuICAgICAgICAgICAgdmFyIGtleUF1dGgsIGJhc2ljQXV0aDtcbiAgICAgICAgICAgIHZhciB0eXBlID0gYXV0aC5nZXQoJ3R5cGUnKTtcblxuICAgICAgICAgICAgaWYgKHR5cGUgPT09ICdhcGlLZXknKSB7XG4gICAgICAgICAgICAgICAga2V5QXV0aCA9IG5ldyBTd2FnZ2VyQ2xpZW50LkFwaUtleUF1dGhvcml6YXRpb24oXG4gICAgICAgICAgICAgICAgICAgIGF1dGguZ2V0KCduYW1lJyksXG4gICAgICAgICAgICAgICAgICAgIGF1dGguZ2V0KCd2YWx1ZScpLFxuICAgICAgICAgICAgICAgICAgICBhdXRoLmdldCgnaW4nKVxuICAgICAgICAgICAgICAgICk7XG5cbiAgICAgICAgICAgICAgICB0aGlzLnJvdXRlci5hcGkuY2xpZW50QXV0aG9yaXphdGlvbnMuYWRkKGF1dGguZ2V0KCd0aXRsZScpLCBrZXlBdXRoKTtcbiAgICAgICAgICAgIH0gZWxzZSBpZiAodHlwZSA9PT0gJ2Jhc2ljJykge1xuICAgICAgICAgICAgICAgIGJhc2ljQXV0aCA9IG5ldyBTd2FnZ2VyQ2xpZW50LlBhc3N3b3JkQXV0aG9yaXphdGlvbihhdXRoLmdldCgndXNlcm5hbWUnKSwgYXV0aC5nZXQoJ3Bhc3N3b3JkJykpO1xuICAgICAgICAgICAgICAgIHRoaXMucm91dGVyLmFwaS5jbGllbnRBdXRob3JpemF0aW9ucy5hZGQoYXV0aC5nZXQoJ3RpdGxlJyksIGJhc2ljQXV0aCk7XG4gICAgICAgICAgICB9IGVsc2UgaWYgKHR5cGUgPT09ICdvYXV0aDInKSB7XG4gICAgICAgICAgICAgICAgdGhpcy5oYW5kbGVPYXV0aDJMb2dpbihhdXRoKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfSwgdGhpcyk7XG5cbiAgICAgICAgdGhpcy5yb3V0ZXIubG9hZCgpO1xuICAgIH0sXG5cbiAgICBsb2dvdXRDbGljazogZnVuY3Rpb24gKGUpIHtcbiAgICAgICAgZS5wcmV2ZW50RGVmYXVsdCgpO1xuXG4gICAgICAgIHRoaXMuYXV0aHNDb2xsZWN0aW9uVmlldy5jb2xsZWN0aW9uLmZvckVhY2goZnVuY3Rpb24gKGF1dGgpIHtcbiAgICAgICAgICAgIHdpbmRvdy5zd2FnZ2VyVWkuYXBpLmNsaWVudEF1dGhvcml6YXRpb25zLnJlbW92ZShhdXRoLmdldCgndGl0bGUnKSk7XG4gICAgICAgIH0pO1xuXG4gICAgICAgIHRoaXMucm91dGVyLmxvYWQoKTtcbiAgICB9LFxuXG4gICAgLy8gdGFrZW4gZnJvbSBsaWIvc3dhZ2dlci1vYXV0aC5qc1xuICAgIGhhbmRsZU9hdXRoMkxvZ2luOiBmdW5jdGlvbiAoYXV0aCkge1xuICAgICAgICB2YXIgaG9zdCA9IHdpbmRvdy5sb2NhdGlvbjtcbiAgICAgICAgdmFyIHBhdGhuYW1lID0gbG9jYXRpb24ucGF0aG5hbWUuc3Vic3RyaW5nKDAsIGxvY2F0aW9uLnBhdGhuYW1lLmxhc3RJbmRleE9mKCcvJykpO1xuICAgICAgICB2YXIgZGVmYXVsdFJlZGlyZWN0VXJsID0gaG9zdC5wcm90b2NvbCArICcvLycgKyBob3N0Lmhvc3QgKyBwYXRobmFtZSArICcvbzJjLmh0bWwnO1xuICAgICAgICB2YXIgcmVkaXJlY3RVcmwgPSB3aW5kb3cub0F1dGhSZWRpcmVjdFVybCB8fCBkZWZhdWx0UmVkaXJlY3RVcmw7XG4gICAgICAgIHZhciB1cmwgPSBudWxsO1xuICAgICAgICB2YXIgc2NvcGVzID0gXy5tYXAoYXV0aC5nZXQoJ3Njb3BlcycpLCBmdW5jdGlvbiAoc2NvcGUpIHtcbiAgICAgICAgICAgIGlmKHNjb3BlLmNoZWNrZWQpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gc2NvcGUuc2NvcGU7XG4gICAgICAgICAgICB9XG4gICAgICAgIH0pO1xuICAgICAgICB2YXIgY29udGFpbmVyID0gd2luZG93LnN3YWdnZXJVaUF1dGggfHwgKHdpbmRvdy5zd2FnZ2VyVWlBdXRoID0ge30pO1xuICAgICAgICB2YXIgc3RhdGUsIGRldHMsIGVwO1xuICAgICAgICBjb250YWluZXIuT0F1dGhTY2hlbWVLZXkgPSBhdXRoLmdldCgndGl0bGUnKTtcblxuICAgICAgICB3aW5kb3cuZW5hYmxlZFNjb3BlcyA9IHNjb3BlcztcbiAgICAgICAgdmFyIGZsb3cgPSBhdXRoLmdldCgnZmxvdycpO1xuXG4gICAgICAgIC8qKlxuICAgICAgICAgKiBSZXR1cm5zIHRoZSBuYW1lIG9mIHRoZSBhY2Nlc3MgdG9rZW4gcGFyYW1ldGVyIHJldHVybmVkIGJ5IHRoZSBzZXJ2ZXIuXG4gICAgICAgICAqXG4gICAgICAgICAqIEBwYXJhbSBkZXRzXG4gICAgICAgICAqICAgICBUaGUgYXV0aG9yaXNhdGlvbiBzY2hlbWUgY29uZmlndXJhdGlvbi5cbiAgICAgICAgICogQHJldHVybiB0aGUgbmFtZSBvZiB0aGUgYWNjZXNzIHRva2VuIHBhcmFtZXRlclxuICAgICAgICAgKi9cbiAgICAgICAgZnVuY3Rpb24gZ2V0VG9rZW5OYW1lKGRldHMpIHtcbiAgICAgICAgICAgIHJldHVybiBkZXRzLnZlbmRvckV4dGVuc2lvbnNbJ3gtdG9rZW5OYW1lJ10gfHwgZGV0cy50b2tlbk5hbWU7XG4gICAgICAgIH1cblxuICAgICAgICBpZihhdXRoLmdldCgndHlwZScpID09PSAnb2F1dGgyJyAmJiBmbG93ICYmIChmbG93ID09PSAnaW1wbGljaXQnIHx8IGZsb3cgPT09ICdhY2Nlc3NDb2RlJykpIHtcbiAgICAgICAgICAgIGRldHMgPSBhdXRoLmF0dHJpYnV0ZXM7XG4gICAgICAgICAgICB1cmwgPSBkZXRzLmF1dGhvcml6YXRpb25VcmwgKyAnP3Jlc3BvbnNlX3R5cGU9JyArIChmbG93ID09PSAnaW1wbGljaXQnID8gJ3Rva2VuJyA6ICdjb2RlJyk7XG4gICAgICAgICAgICBjb250YWluZXIudG9rZW5OYW1lID0gZ2V0VG9rZW5OYW1lKGRldHMpIHx8ICdhY2Nlc3NfdG9rZW4nO1xuICAgICAgICAgICAgY29udGFpbmVyLnRva2VuVXJsID0gKGZsb3cgPT09ICdhY2Nlc3NDb2RlJyA/IGRldHMudG9rZW5VcmwgOiBudWxsKTtcbiAgICAgICAgICAgIHN0YXRlID0gY29udGFpbmVyLk9BdXRoU2NoZW1lS2V5O1xuICAgICAgICB9XG4gICAgICAgIGVsc2UgaWYoYXV0aC5nZXQoJ3R5cGUnKSA9PT0gJ29hdXRoMicgJiYgZmxvdyAmJiAoZmxvdyA9PT0gJ2FwcGxpY2F0aW9uJykpIHtcbiAgICAgICAgICAgIGRldHMgPSBhdXRoLmF0dHJpYnV0ZXM7XG4gICAgICAgICAgICBjb250YWluZXIudG9rZW5OYW1lID0gZ2V0VG9rZW5OYW1lKGRldHMpIHx8ICdhY2Nlc3NfdG9rZW4nO1xuICAgICAgICAgICAgdGhpcy5jbGllbnRDcmVkZW50aWFsc0Zsb3coc2NvcGVzLCBkZXRzLCBjb250YWluZXIuT0F1dGhTY2hlbWVLZXkpO1xuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG4gICAgICAgIGVsc2UgaWYoYXV0aC5nZXQoJ3R5cGUnKSA9PT0gJ29hdXRoMicgJiYgZmxvdyAmJiAoZmxvdyA9PT0gJ3Bhc3N3b3JkJykpIHtcbiAgICAgICAgICAgIGRldHMgPSBhdXRoLmF0dHJpYnV0ZXM7XG4gICAgICAgICAgICBjb250YWluZXIudG9rZW5OYW1lID0gZ2V0VG9rZW5OYW1lKGRldHMpIHx8ICdhY2Nlc3NfdG9rZW4nO1xuICAgICAgICAgICAgdGhpcy5wYXNzd29yZEZsb3coc2NvcGVzLCBkZXRzLCBjb250YWluZXIuT0F1dGhTY2hlbWVLZXkpO1xuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG4gICAgICAgIGVsc2UgaWYoYXV0aC5nZXQoJ2dyYW50VHlwZXMnKSkge1xuICAgICAgICAgICAgLy8gMS4yIHN1cHBvcnRcbiAgICAgICAgICAgIHZhciBvID0gYXV0aC5nZXQoJ2dyYW50VHlwZXMnKTtcbiAgICAgICAgICAgIGZvcih2YXIgdCBpbiBvKSB7XG4gICAgICAgICAgICAgICAgaWYoby5oYXNPd25Qcm9wZXJ0eSh0KSAmJiB0ID09PSAnaW1wbGljaXQnKSB7XG4gICAgICAgICAgICAgICAgICAgIGRldHMgPSBvW3RdO1xuICAgICAgICAgICAgICAgICAgICBlcCA9IGRldHMubG9naW5FbmRwb2ludC51cmw7XG4gICAgICAgICAgICAgICAgICAgIHVybCA9IGRldHMubG9naW5FbmRwb2ludC51cmwgKyAnP3Jlc3BvbnNlX3R5cGU9dG9rZW4nO1xuICAgICAgICAgICAgICAgICAgICBjb250YWluZXIudG9rZW5OYW1lID0gZ2V0VG9rZW5OYW1lKGRldHMpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBlbHNlIGlmIChvLmhhc093blByb3BlcnR5KHQpICYmIHQgPT09ICdhY2Nlc3NDb2RlJykge1xuICAgICAgICAgICAgICAgICAgICBkZXRzID0gb1t0XTtcbiAgICAgICAgICAgICAgICAgICAgZXAgPSBkZXRzLnRva2VuUmVxdWVzdEVuZHBvaW50LnVybDtcbiAgICAgICAgICAgICAgICAgICAgdXJsID0gZGV0cy50b2tlblJlcXVlc3RFbmRwb2ludC51cmwgKyAnP3Jlc3BvbnNlX3R5cGU9Y29kZSc7XG4gICAgICAgICAgICAgICAgICAgIGNvbnRhaW5lci50b2tlbk5hbWUgPSBnZXRUb2tlbk5hbWUoZGV0cyk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICB9XG5cbiAgICAgICAgcmVkaXJlY3RfdXJpID0gcmVkaXJlY3RVcmw7XG5cbiAgICAgICAgdXJsICs9ICcmcmVkaXJlY3RfdXJpPScgKyBlbmNvZGVVUklDb21wb25lbnQocmVkaXJlY3RVcmwpO1xuICAgICAgICB1cmwgKz0gJyZyZWFsbT0nICsgZW5jb2RlVVJJQ29tcG9uZW50KHJlYWxtKTtcbiAgICAgICAgdXJsICs9ICcmY2xpZW50X2lkPScgKyBlbmNvZGVVUklDb21wb25lbnQoY2xpZW50SWQpO1xuICAgICAgICB1cmwgKz0gJyZzY29wZT0nICsgZW5jb2RlVVJJQ29tcG9uZW50KHNjb3Blcy5qb2luKHNjb3BlU2VwYXJhdG9yKSk7XG4gICAgICAgIHVybCArPSAnJnN0YXRlPScgKyBlbmNvZGVVUklDb21wb25lbnQoc3RhdGUpO1xuICAgICAgICBmb3IgKHZhciBrZXkgaW4gYWRkaXRpb25hbFF1ZXJ5U3RyaW5nUGFyYW1zKSB7XG4gICAgICAgICAgICB1cmwgKz0gJyYnICsga2V5ICsgJz0nICsgZW5jb2RlVVJJQ29tcG9uZW50KGFkZGl0aW9uYWxRdWVyeVN0cmluZ1BhcmFtc1trZXldKTtcbiAgICAgICAgfVxuXG4gICAgICAgIHdpbmRvdy5vcGVuKHVybCk7XG4gICAgfSxcblxuICAgIC8vIHRha2VuIGZyb20gbGliL3N3YWdnZXItb2F1dGguanNcbiAgICBjbGllbnRDcmVkZW50aWFsc0Zsb3c6IGZ1bmN0aW9uIChzY29wZXMsIG9hdXRoLCBPQXV0aFNjaGVtZUtleSkge1xuICAgICAgICB0aGlzLmFjY2Vzc1Rva2VuUmVxdWVzdChzY29wZXMsIG9hdXRoLCBPQXV0aFNjaGVtZUtleSwgJ2NsaWVudF9jcmVkZW50aWFscycpO1xuICAgIH0sXG5cbiAgICBwYXNzd29yZEZsb3c6IGZ1bmN0aW9uIChzY29wZXMsIG9hdXRoLCBPQXV0aFNjaGVtZUtleSkge1xuICAgICAgICB0aGlzLmFjY2Vzc1Rva2VuUmVxdWVzdChzY29wZXMsIG9hdXRoLCBPQXV0aFNjaGVtZUtleSwgJ3Bhc3N3b3JkJywge1xuICAgICAgICAgICAgJ3VzZXJuYW1lJzogb2F1dGgudXNlcm5hbWUsXG4gICAgICAgICAgICAncGFzc3dvcmQnOiBvYXV0aC5wYXNzd29yZFxuICAgICAgICB9KTtcbiAgICB9LFxuXG4gICAgYWNjZXNzVG9rZW5SZXF1ZXN0OiBmdW5jdGlvbiAoc2NvcGVzLCBvYXV0aCwgT0F1dGhTY2hlbWVLZXksIGdyYW50VHlwZSwgcGFyYW1zKSB7XG4gICAgICAgIHBhcmFtcyA9ICQuZXh0ZW5kKHt9LCB7XG4gICAgICAgICAgICAnc2NvcGUnOiBzY29wZXMuam9pbignICcpLFxuICAgICAgICAgICAgJ2dyYW50X3R5cGUnOiBncmFudFR5cGVcbiAgICAgICAgfSwgcGFyYW1zKTtcblxuICAgICAgICB2YXIgaGVhZGVycz0ge307XG5cbiAgICAgICAgc3dpdGNoIChvYXV0aC5jbGllbnRBdXRoZW50aWNhdGlvblR5cGUpIHtcbiAgICAgICAgICAgIGNhc2UgJ2Jhc2ljJzpcbiAgICAgICAgICAgICAgICBoZWFkZXJzLkF1dGhvcml6YXRpb24gPSAnQmFzaWMgJyArIGJ0b2Eob2F1dGguY2xpZW50SWQgKyAnOicgKyBvYXV0aC5jbGllbnRTZWNyZXQpO1xuICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgY2FzZSAncmVxdWVzdC1ib2R5JzpcbiAgICAgICAgICAgICAgICBwYXJhbXMuY2xpZW50X2lkID0gb2F1dGguY2xpZW50SWQ7XG4gICAgICAgICAgICAgICAgcGFyYW1zLmNsaWVudF9zZWNyZXQgPSBvYXV0aC5jbGllbnRTZWNyZXQ7XG4gICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgIH1cblxuICAgICAgICAkLmFqYXgoe1xuICAgICAgICAgICAgdXJsIDogb2F1dGgudG9rZW5VcmwsXG4gICAgICAgICAgICB0eXBlOiAnUE9TVCcsXG4gICAgICAgICAgICBkYXRhOiBwYXJhbXMsXG4gICAgICAgICAgICBoZWFkZXJzOiBoZWFkZXJzLFxuICAgICAgICAgICAgc3VjY2VzczogZnVuY3Rpb24gKGRhdGEpXG4gICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgb25PQXV0aENvbXBsZXRlKGRhdGEsIE9BdXRoU2NoZW1lS2V5KTtcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICBlcnJvcjogZnVuY3Rpb24gKClcbiAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICBvbk9BdXRoQ29tcGxldGUoJycpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9KTtcbiAgICB9XG59KTtcbiIsIid1c2Ugc3RyaWN0JztcblxuU3dhZ2dlclVpLk1vZGVscy5CYXNpY0F1dGhNb2RlbCA9IEJhY2tib25lLk1vZGVsLmV4dGVuZCh7XG4gICAgZGVmYXVsdHM6IHtcbiAgICAgICAgdXNlcm5hbWU6ICcnLFxuICAgICAgICBwYXNzd29yZDogJycsXG4gICAgICAgIHRpdGxlOiAnYmFzaWMnXG4gICAgfSxcblxuICAgIGluaXRpYWxpemU6IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgdGhpcy5vbignY2hhbmdlJywgdGhpcy52YWxpZGF0ZSk7XG4gICAgfSxcblxuICAgIHZhbGlkYXRlOiBmdW5jdGlvbiAoKSB7XG4gICAgICAgIHZhciB2YWxpZCA9ICEhdGhpcy5nZXQoJ3Bhc3N3b3JkJykgJiYgISF0aGlzLmdldCgndXNlcm5hbWUnKTtcblxuICAgICAgICB0aGlzLnNldCgndmFsaWQnLCB2YWxpZCk7XG5cbiAgICAgICAgcmV0dXJuIHZhbGlkO1xuICAgIH1cbn0pOyIsIid1c2Ugc3RyaWN0JztcblxuU3dhZ2dlclVpLlZpZXdzLkJhc2ljQXV0aFZpZXcgPSBCYWNrYm9uZS5WaWV3LmV4dGVuZCh7XG5cbiAgICBpbml0aWFsaXplOiBmdW5jdGlvbiAob3B0cykge1xuICAgICAgICB0aGlzLm9wdGlvbnMgPSBvcHRzIHx8IHt9O1xuICAgICAgICB0aGlzLnJvdXRlciA9IHRoaXMub3B0aW9ucy5yb3V0ZXI7XG4gICAgfSxcblxuICAgIGV2ZW50czoge1xuICAgICAgICAnY2hhbmdlIC5hdXRoX2lucHV0JzogJ2lucHV0Q2hhbmdlJ1xuICAgIH0sXG5cbiAgICBzZWxlY3RvcnM6IHtcbiAgICAgICAgdXNlcm5hbWVJbnB1dDogJy5iYXNpY19hdXRoX191c2VybmFtZScsXG4gICAgICAgIHBhc3N3b3JkSW5wdXQ6ICcuYmFzaWNfYXV0aF9fcGFzc3dvcmQnXG4gICAgfSxcblxuICAgIGNsczoge1xuICAgICAgICBlcnJvcjogJ2Vycm9yJ1xuICAgIH0sXG5cbiAgICB0ZW1wbGF0ZTogSGFuZGxlYmFycy50ZW1wbGF0ZXMuYmFzaWNfYXV0aCxcblxuICAgIHJlbmRlcjogZnVuY3Rpb24oKXtcbiAgICAgICAgJCh0aGlzLmVsKS5odG1sKHRoaXMudGVtcGxhdGUodGhpcy5tb2RlbC50b0pTT04oKSkpO1xuXG4gICAgICAgIHJldHVybiB0aGlzO1xuICAgIH0sXG5cbiAgICBpbnB1dENoYW5nZTogZnVuY3Rpb24gKGUpIHtcbiAgICAgICAgdmFyICRlbCA9ICQoZS50YXJnZXQpO1xuICAgICAgICB2YXIgdmFsID0gJGVsLnZhbCgpO1xuICAgICAgICB2YXIgYXR0ciA9ICRlbC5wcm9wKCduYW1lJyk7XG5cbiAgICAgICAgaWYgKHZhbCkge1xuICAgICAgICAgICAgJGVsLnJlbW92ZUNsYXNzKHRoaXMuY2xzLmVycm9yKTtcbiAgICAgICAgfVxuXG4gICAgICAgIHRoaXMubW9kZWwuc2V0KGF0dHIsIHZhbCk7XG4gICAgfSxcblxuICAgIGlzVmFsaWQ6IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMubW9kZWwudmFsaWRhdGUoKTtcbiAgICB9LFxuXG4gICAgaGlnaGxpZ2h0SW52YWxpZDogZnVuY3Rpb24gKCkge1xuICAgICAgICBpZiAoIXRoaXMubW9kZWwuZ2V0KCd1c2VybmFtZScpKSB7XG4gICAgICAgICAgICB0aGlzLiQodGhpcy5zZWxlY3RvcnMudXNlcm5hbWVJbnB1dCkuYWRkQ2xhc3ModGhpcy5jbHMuZXJyb3IpO1xuICAgICAgICB9XG4gICAgfVxufSk7XG4iLCIndXNlIHN0cmljdCc7XG5cblN3YWdnZXJVaS5WaWV3cy5Db250ZW50VHlwZVZpZXcgPSBCYWNrYm9uZS5WaWV3LmV4dGVuZCh7XG4gIGluaXRpYWxpemU6IGZ1bmN0aW9uKCkge30sXG5cbiAgcmVuZGVyOiBmdW5jdGlvbigpe1xuICBcdHRoaXMubW9kZWwuY29udGVudFR5cGVJZCA9ICdjdCcgKyBNYXRoLnJhbmRvbSgpO1xuICAgICQodGhpcy5lbCkuaHRtbChIYW5kbGViYXJzLnRlbXBsYXRlcy5jb250ZW50X3R5cGUodGhpcy5tb2RlbCkpO1xuICAgIHJldHVybiB0aGlzO1xuICB9XG59KTsiLCIndXNlIHN0cmljdCc7XG5cblN3YWdnZXJVaS5WaWV3cy5IZWFkZXJWaWV3ID0gQmFja2JvbmUuVmlldy5leHRlbmQoe1xuICBldmVudHM6IHtcbiAgICAnY2xpY2sgI3Nob3ctcGV0LXN0b3JlLWljb24nICAgIDogJ3Nob3dQZXRTdG9yZScsXG4gICAgJ2NsaWNrICNleHBsb3JlJyAgICAgICAgICAgICAgICA6ICdzaG93Q3VzdG9tJyxcbiAgICAnc3VibWl0ICNhcGlfc2VsZWN0b3InICAgICAgICAgIDogJ3Nob3dDdXN0b20nLFxuICAgICdrZXl1cCAjaW5wdXRfYmFzZVVybCcgICAgICAgICAgOiAnc2hvd0N1c3RvbU9uS2V5dXAnLFxuICAgICdrZXl1cCAjaW5wdXRfYXBpS2V5JyAgICAgICAgICAgOiAnc2hvd0N1c3RvbU9uS2V5dXAnXG4gIH0sXG5cbiAgaW5pdGlhbGl6ZTogZnVuY3Rpb24oKXt9LFxuXG4gIHNob3dQZXRTdG9yZTogZnVuY3Rpb24oKXtcbiAgICB0aGlzLnRyaWdnZXIoJ3VwZGF0ZS1zd2FnZ2VyLXVpJywge1xuICAgICAgdXJsOidodHRwOi8vcGV0c3RvcmUuc3dhZ2dlci5pby92Mi9zd2FnZ2VyLmpzb24nXG4gICAgfSk7XG4gIH0sXG5cbiAgc2hvd0N1c3RvbU9uS2V5dXA6IGZ1bmN0aW9uKGUpe1xuICAgIGlmIChlLmtleUNvZGUgPT09IDEzKSB7XG4gICAgICB0aGlzLnNob3dDdXN0b20oKTtcbiAgICB9XG4gIH0sXG5cbiAgc2hvd0N1c3RvbTogZnVuY3Rpb24oZSl7XG4gICAgaWYgKGUpIHtcbiAgICAgIGUucHJldmVudERlZmF1bHQoKTtcbiAgICB9XG5cbiAgICB0aGlzLnRyaWdnZXIoJ3VwZGF0ZS1zd2FnZ2VyLXVpJywge1xuICAgICAgdXJsOiAkKCcjaW5wdXRfYmFzZVVybCcpLnZhbCgpXG4gICAgfSk7XG4gIH0sXG5cbiAgdXBkYXRlOiBmdW5jdGlvbih1cmwsIGFwaUtleSwgdHJpZ2dlcil7XG4gICAgaWYgKHRyaWdnZXIgPT09IHVuZGVmaW5lZCkge1xuICAgICAgdHJpZ2dlciA9IGZhbHNlO1xuICAgIH1cblxuICAgICQoJyNpbnB1dF9iYXNlVXJsJykudmFsKHVybCk7XG5cbiAgICBpZiAodHJpZ2dlcikge1xuICAgICAgdGhpcy50cmlnZ2VyKCd1cGRhdGUtc3dhZ2dlci11aScsIHt1cmw6dXJsfSk7XG4gICAgfVxuICB9XG59KTtcbiIsIid1c2Ugc3RyaWN0JztcblxuU3dhZ2dlclVpLlZpZXdzLk1haW5WaWV3ID0gQmFja2JvbmUuVmlldy5leHRlbmQoe1xuICBhcGlzU29ydGVyIDoge1xuICAgIGFscGhhICAgOiBmdW5jdGlvbihhLGIpeyByZXR1cm4gYS5uYW1lLmxvY2FsZUNvbXBhcmUoYi5uYW1lKTsgfVxuICB9LFxuICBvcGVyYXRpb25zU29ydGVycyA6IHtcbiAgICBhbHBoYSAgIDogZnVuY3Rpb24oYSxiKXsgcmV0dXJuIGEucGF0aC5sb2NhbGVDb21wYXJlKGIucGF0aCk7IH0sXG4gICAgbWV0aG9kICA6IGZ1bmN0aW9uKGEsYil7IHJldHVybiBhLm1ldGhvZC5sb2NhbGVDb21wYXJlKGIubWV0aG9kKTsgfVxuICB9LFxuICBpbml0aWFsaXplOiBmdW5jdGlvbihvcHRzKXtcbiAgICB2YXIgc29ydGVyT3B0aW9uLCBzb3J0ZXJGbiwga2V5LCB2YWx1ZTtcbiAgICBvcHRzID0gb3B0cyB8fCB7fTtcblxuICAgIHRoaXMucm91dGVyID0gb3B0cy5yb3V0ZXI7XG5cbiAgICAvLyBTb3J0IEFQSXNcbiAgICBpZiAob3B0cy5zd2FnZ2VyT3B0aW9ucy5hcGlzU29ydGVyKSB7XG4gICAgICBzb3J0ZXJPcHRpb24gPSBvcHRzLnN3YWdnZXJPcHRpb25zLmFwaXNTb3J0ZXI7XG4gICAgICBpZiAoXy5pc0Z1bmN0aW9uKHNvcnRlck9wdGlvbikpIHtcbiAgICAgICAgc29ydGVyRm4gPSBzb3J0ZXJPcHRpb247XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBzb3J0ZXJGbiA9IHRoaXMuYXBpc1NvcnRlcltzb3J0ZXJPcHRpb25dO1xuICAgICAgfVxuICAgICAgaWYgKF8uaXNGdW5jdGlvbihzb3J0ZXJGbikpIHtcbiAgICAgICAgdGhpcy5tb2RlbC5hcGlzQXJyYXkuc29ydChzb3J0ZXJGbik7XG4gICAgICB9XG4gICAgfVxuICAgIC8vIFNvcnQgb3BlcmF0aW9ucyBvZiBlYWNoIEFQSVxuICAgIGlmIChvcHRzLnN3YWdnZXJPcHRpb25zLm9wZXJhdGlvbnNTb3J0ZXIpIHtcbiAgICAgIHNvcnRlck9wdGlvbiA9IG9wdHMuc3dhZ2dlck9wdGlvbnMub3BlcmF0aW9uc1NvcnRlcjtcbiAgICAgIGlmIChfLmlzRnVuY3Rpb24oc29ydGVyT3B0aW9uKSkge1xuICAgICAgICBzb3J0ZXJGbiA9IHNvcnRlck9wdGlvbjtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHNvcnRlckZuID0gdGhpcy5vcGVyYXRpb25zU29ydGVyc1tzb3J0ZXJPcHRpb25dO1xuICAgICAgfVxuICAgICAgaWYgKF8uaXNGdW5jdGlvbihzb3J0ZXJGbikpIHtcbiAgICAgICAgZm9yIChrZXkgaW4gdGhpcy5tb2RlbC5hcGlzQXJyYXkpIHtcbiAgICAgICAgICB0aGlzLm1vZGVsLmFwaXNBcnJheVtrZXldLm9wZXJhdGlvbnNBcnJheS5zb3J0KHNvcnRlckZuKTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cblxuICAgIC8vIHNldCB1cCB0aGUgVUkgZm9yIGlucHV0XG4gICAgdGhpcy5tb2RlbC5hdXRocyA9IFtdO1xuXG4gICAgZm9yIChrZXkgaW4gdGhpcy5tb2RlbC5zZWN1cml0eURlZmluaXRpb25zKSB7XG4gICAgICB2YWx1ZSA9IHRoaXMubW9kZWwuc2VjdXJpdHlEZWZpbml0aW9uc1trZXldO1xuXG4gICAgICB0aGlzLm1vZGVsLmF1dGhzLnB1c2goe1xuICAgICAgICBuYW1lOiBrZXksXG4gICAgICAgIHR5cGU6IHZhbHVlLnR5cGUsXG4gICAgICAgIHZhbHVlOiB2YWx1ZVxuICAgICAgfSk7XG4gICAgfVxuXG4gICAgaWYgKCd2YWxpZGF0b3JVcmwnIGluIG9wdHMuc3dhZ2dlck9wdGlvbnMpIHtcbiAgICAgIC8vIFZhbGlkYXRvciBVUkwgc3BlY2lmaWVkIGV4cGxpY2l0bHlcbiAgICAgIHRoaXMubW9kZWwudmFsaWRhdG9yVXJsID0gb3B0cy5zd2FnZ2VyT3B0aW9ucy52YWxpZGF0b3JVcmw7XG4gICAgfSBlbHNlIGlmICh0aGlzLm1vZGVsLnVybC5pbmRleE9mKCdsb2NhbGhvc3QnKSA+IDAgfHwgdGhpcy5tb2RlbC51cmwuaW5kZXhPZignMTI3LjAuMC4xJykgPiAwKSB7XG4gICAgICAvLyBMb2NhbGhvc3Qgb3ZlcnJpZGVcbiAgICAgIHRoaXMubW9kZWwudmFsaWRhdG9yVXJsID0gbnVsbDtcbiAgICB9IGVsc2Uge1xuICAgICAgdGhpcy5tb2RlbC52YWxpZGF0b3JVcmwgPSAnLy9vbmxpbmUuc3dhZ2dlci5pby92YWxpZGF0b3InO1xuICAgIH1cblxuICAgIC8vIEpTb25FZGl0b3IgcmVxdWlyZXMgdHlwZT0nb2JqZWN0JyB0byBiZSBwcmVzZW50IG9uIGRlZmluZWQgdHlwZXMsIHdlIGFkZCBpdCBpZiBpdCdzIG1pc3NpbmdcbiAgICAvLyBpcyB0aGVyZSBhbnkgdmFsaWQgY2FzZSB3ZXJlIGl0IHNob3VsZCBub3QgYmUgYWRkZWQgP1xuICAgIHZhciBkZWY7XG4gICAgZm9yKGRlZiBpbiB0aGlzLm1vZGVsLmRlZmluaXRpb25zKXtcbiAgICAgIGlmICghdGhpcy5tb2RlbC5kZWZpbml0aW9uc1tkZWZdLnR5cGUpe1xuICAgICAgICB0aGlzLm1vZGVsLmRlZmluaXRpb25zW2RlZl0udHlwZSA9ICdvYmplY3QnO1xuICAgICAgfVxuICAgIH1cblxuICB9LFxuXG4gIHJlbmRlcjogZnVuY3Rpb24gKCkge1xuICAgICQodGhpcy5lbCkuaHRtbChIYW5kbGViYXJzLnRlbXBsYXRlcy5tYWluKHRoaXMubW9kZWwpKTtcbiAgICB0aGlzLmluZm8gPSB0aGlzLiQoJy5pbmZvJylbMF07XG5cbiAgICBpZiAodGhpcy5pbmZvKSB7XG4gICAgICB0aGlzLmluZm8uYWRkRXZlbnRMaXN0ZW5lcignY2xpY2snLCB0aGlzLm9uTGlua0NsaWNrLCB0cnVlKTtcbiAgICB9XG5cbiAgICB0aGlzLm1vZGVsLnNlY3VyaXR5RGVmaW5pdGlvbnMgPSB0aGlzLm1vZGVsLnNlY3VyaXR5RGVmaW5pdGlvbnMgfHwge307XG5cbiAgICAvLyBSZW5kZXIgZWFjaCByZXNvdXJjZVxuXG4gICAgdmFyIHJlc291cmNlcyA9IHt9O1xuICAgIHZhciBjb3VudGVyID0gMDtcbiAgICBmb3IgKHZhciBpID0gMDsgaSA8IHRoaXMubW9kZWwuYXBpc0FycmF5Lmxlbmd0aDsgaSsrKSB7XG4gICAgICB2YXIgcmVzb3VyY2UgPSB0aGlzLm1vZGVsLmFwaXNBcnJheVtpXTtcbiAgICAgIHZhciBpZCA9IHJlc291cmNlLm5hbWU7XG4gICAgICB3aGlsZSAodHlwZW9mIHJlc291cmNlc1tpZF0gIT09ICd1bmRlZmluZWQnKSB7XG4gICAgICAgIGlkID0gaWQgKyAnXycgKyBjb3VudGVyO1xuICAgICAgICBjb3VudGVyICs9IDE7XG4gICAgICB9XG4gICAgICByZXNvdXJjZS5pZCA9IHNhbml0aXplSHRtbChpZCk7XG4gICAgICByZXNvdXJjZXNbaWRdID0gcmVzb3VyY2U7XG4gICAgICB0aGlzLmFkZFJlc291cmNlKHJlc291cmNlLCB0aGlzLm1vZGVsLmF1dGhzKTtcbiAgICB9XG5cbiAgICAkKCcucHJvcFdyYXAnKS5ob3ZlcihmdW5jdGlvbiBvbkhvdmVyKCl7XG4gICAgICAkKCcub3B0aW9uc1dyYXBwZXInLCAkKHRoaXMpKS5zaG93KCk7XG4gICAgfSwgZnVuY3Rpb24gb2ZmaG92ZXIoKXtcbiAgICAgICQoJy5vcHRpb25zV3JhcHBlcicsICQodGhpcykpLmhpZGUoKTtcbiAgICB9KTtcbiAgICByZXR1cm4gdGhpcztcbiAgfSxcblxuICBhZGRSZXNvdXJjZTogZnVuY3Rpb24ocmVzb3VyY2UsIGF1dGhzKXtcbiAgICAvLyBSZW5kZXIgYSByZXNvdXJjZSBhbmQgYWRkIGl0IHRvIHJlc291cmNlcyBsaVxuICAgIHJlc291cmNlLmlkID0gcmVzb3VyY2UuaWQucmVwbGFjZSgvW15hLXpBLVpcXGRdL2csIGZ1bmN0aW9uKHN0cikgeyByZXR1cm4gc3RyLmNoYXJDb2RlQXQoMCk7IH0pO1xuXG4gICAgLy8gTWFrZSBhbGwgZGVmaW5pdGlvbnMgYXZhaWxhYmxlIGF0IHRoZSByb290IG9mIHRoZSByZXNvdXJjZSBzbyB0aGF0IHRoZXkgY2FuXG4gICAgLy8gYmUgbG9hZGVkIGJ5IHRoZSBKU29uRWRpdG9yXG4gICAgcmVzb3VyY2UuZGVmaW5pdGlvbnMgPSB0aGlzLm1vZGVsLmRlZmluaXRpb25zO1xuXG4gICAgdmFyIHJlc291cmNlVmlldyA9IG5ldyBTd2FnZ2VyVWkuVmlld3MuUmVzb3VyY2VWaWV3KHtcbiAgICAgIG1vZGVsOiByZXNvdXJjZSxcbiAgICAgIHJvdXRlcjogdGhpcy5yb3V0ZXIsXG4gICAgICB0YWdOYW1lOiAnbGknLFxuICAgICAgaWQ6ICdyZXNvdXJjZV8nICsgcmVzb3VyY2UuaWQsXG4gICAgICBjbGFzc05hbWU6ICdyZXNvdXJjZScsXG4gICAgICBhdXRoczogYXV0aHMsXG4gICAgICBzd2FnZ2VyT3B0aW9uczogdGhpcy5vcHRpb25zLnN3YWdnZXJPcHRpb25zXG4gICAgfSk7XG4gICAgJCgnI3Jlc291cmNlcycsIHRoaXMuZWwpLmFwcGVuZChyZXNvdXJjZVZpZXcucmVuZGVyKCkuZWwpO1xuICB9LFxuXG4gIGNsZWFyOiBmdW5jdGlvbigpe1xuICAgICQodGhpcy5lbCkuaHRtbCgnJyk7XG4gIH0sXG5cbiAgb25MaW5rQ2xpY2s6IGZ1bmN0aW9uIChlKSB7XG4gICAgdmFyIGVsID0gZS50YXJnZXQ7XG5cbiAgICBpZiAoZWwudGFnTmFtZSA9PT0gJ0EnICYmIGVsLmhyZWYgJiYgIWVsLnRhcmdldCkge1xuICAgICAgICBlLnByZXZlbnREZWZhdWx0KCk7XG4gICAgICAgIHdpbmRvdy5vcGVuKGVsLmhyZWYsICdfYmxhbmsnKTtcbiAgICB9XG4gIH1cbn0pO1xuIiwiJ3VzZSBzdHJpY3QnO1xuXG5Td2FnZ2VyVWkuTW9kZWxzLk9hdXRoMk1vZGVsID0gQmFja2JvbmUuTW9kZWwuZXh0ZW5kKHtcbiAgICBkZWZhdWx0czoge1xuICAgICAgICBzY29wZXM6IHt9LFxuICAgICAgICBpc1Bhc3N3b3JkRmxvdzogZmFsc2UsXG4gICAgICAgIGNsaWVudEF1dGhlbnRpY2F0aW9uVHlwZTogJ25vbmUnXG4gICAgfSxcblxuICAgIGluaXRpYWxpemU6IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgaWYodGhpcy5hdHRyaWJ1dGVzICYmIHRoaXMuYXR0cmlidXRlcy5zY29wZXMpIHtcbiAgICAgICAgICAgIHZhciBhdHRyaWJ1dGVzID0gXy5jbG9uZURlZXAodGhpcy5hdHRyaWJ1dGVzKTtcbiAgICAgICAgICAgIHZhciBpLCBzY29wZXMgPSBbXTtcbiAgICAgICAgICAgIGZvcihpIGluIGF0dHJpYnV0ZXMuc2NvcGVzKSB7XG4gICAgICAgICAgICAgICAgdmFyIHNjb3BlID0gYXR0cmlidXRlcy5zY29wZXNbaV07XG4gICAgICAgICAgICAgICAgaWYodHlwZW9mIHNjb3BlLmRlc2NyaXB0aW9uID09PSAnc3RyaW5nJykge1xuICAgICAgICAgICAgICAgICAgICBzY29wZXNbc2NvcGVdID0gYXR0cmlidXRlcy5zY29wZXNbaV07XG4gICAgICAgICAgICAgICAgICAgIHNjb3Blcy5wdXNoKGF0dHJpYnV0ZXMuc2NvcGVzW2ldKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBhdHRyaWJ1dGVzLnNjb3BlcyA9IHNjb3BlcztcbiAgICAgICAgICAgIHRoaXMuYXR0cmlidXRlcyA9IGF0dHJpYnV0ZXM7XG4gICAgICAgIH1cblxuICAgICAgICBpZiAodGhpcy5hdHRyaWJ1dGVzICYmIHRoaXMuYXR0cmlidXRlcy5mbG93KSB7XG4gICAgICAgICAgICB2YXIgZmxvdyA9IHRoaXMuYXR0cmlidXRlcy5mbG93O1xuICAgICAgICAgICAgdGhpcy5zZXQoJ2lzUGFzc3dvcmRGbG93JywgZmxvdyA9PT0gJ3Bhc3N3b3JkJyk7XG4gICAgICAgICAgICB0aGlzLnNldCgncmVxdWlyZUNsaWVudEF1dGhlbnRpY2F0aW9uJywgZmxvdyA9PT0gJ2FwcGxpY2F0aW9uJyk7XG4gICAgICAgICAgICB0aGlzLnNldCgnY2xpZW50QXV0aGVudGljYXRpb24nLCBmbG93ID09PSAncGFzc3dvcmQnIHx8IGZsb3cgPT09ICdhcHBsaWNhdGlvbicpO1xuICAgICAgICB9XG4gICAgICAgIHRoaXMub24oJ2NoYW5nZScsIHRoaXMudmFsaWRhdGUpO1xuICAgIH0sXG5cbiAgICBzZXRTY29wZXM6IGZ1bmN0aW9uIChuYW1lLCB2YWwpIHtcbiAgICAgICAgdmFyIGF1dGggPSBfLmV4dGVuZCh7fSwgdGhpcy5hdHRyaWJ1dGVzKTtcbiAgICAgICAgdmFyIGluZGV4ID0gXy5maW5kSW5kZXgoYXV0aC5zY29wZXMsIGZ1bmN0aW9uKG8pIHtcbiAgICAgICAgICAgIHJldHVybiBvLnNjb3BlID09PSBuYW1lO1xuICAgICAgICB9KTtcbiAgICAgICAgYXV0aC5zY29wZXNbaW5kZXhdLmNoZWNrZWQgPSB2YWw7XG5cbiAgICAgICAgdGhpcy5zZXQoYXV0aCk7XG4gICAgICAgIHRoaXMudmFsaWRhdGUoKTtcbiAgICB9LFxuXG4gICAgdmFsaWRhdGU6IGZ1bmN0aW9uICgpIHtcbiAgICAgIHZhciB2YWxpZCA9IGZhbHNlO1xuICAgICAgaWYgKHRoaXMuZ2V0KCdpc1Bhc3N3b3JkRmxvdycpICYmXG4gICAgICAgICAgKCF0aGlzLmdldCgndXNlcm5hbWUnKSkpIHtcbiAgICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICB9XG5cbiAgICAgIGlmICh0aGlzLmdldCgnY2xpZW50QXV0aGVudGljYXRpb25UeXBlJykgaW4gWydiYXNpYycsICdyZXF1ZXN0LWJvZHknXSAmJlxuICAgICAgICAgICghdGhpcy5nZXQoJ2NsaWVudElkJykpKSB7XG4gICAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgfVxuXG4gICAgICB2YXIgc2NwID0gdGhpcy5nZXQoJ3Njb3BlcycpO1xuICAgICAgdmFyIGlkeCA9ICBfLmZpbmRJbmRleChzY3AsIGZ1bmN0aW9uIChvKSB7XG4gICAgICAgICByZXR1cm4gby5jaGVja2VkID09PSB0cnVlO1xuICAgICAgfSk7XG5cbiAgICAgIGlmKHNjcC5sZW5ndGggPiAwICYmIGlkeCA+PSAwKSB7XG4gICAgICAgICAgdmFsaWQgPSB0cnVlO1xuICAgICAgfVxuXG4gICAgICBpZihzY3AubGVuZ3RoID09PSAwKSB7XG4gICAgICAgICAgdmFsaWQgPSB0cnVlO1xuICAgICAgfVxuXG4gICAgICB0aGlzLnNldCgndmFsaWQnLCB2YWxpZCk7XG5cbiAgICAgIHJldHVybiB2YWxpZDtcbiAgICB9XG59KTtcbiIsIid1c2Ugc3RyaWN0JztcblxuU3dhZ2dlclVpLlZpZXdzLk9hdXRoMlZpZXcgPSBCYWNrYm9uZS5WaWV3LmV4dGVuZCh7XG4gICAgZXZlbnRzOiB7XG4gICAgICAgICdjaGFuZ2UgLm9hdXRoLXNjb3BlJzogJ3Njb3BlQ2hhbmdlJyxcbiAgICAgICAgJ2NoYW5nZSAub2F1dGgtdXNlcm5hbWUnOiAnc2V0VXNlcm5hbWUnLFxuICAgICAgICAnY2hhbmdlIC5vYXV0aC1wYXNzd29yZCc6ICdzZXRQYXNzd29yZCcsXG4gICAgICAgICdjaGFuZ2UgLm9hdXRoLWNsaWVudC1hdXRoZW50aWNhdGlvbi10eXBlJzogJ3NldENsaWVudEF1dGhlbnRpY2F0aW9uVHlwZScsXG4gICAgICAgICdjaGFuZ2UgLm9hdXRoLWNsaWVudC1pZCc6ICdzZXRDbGllbnRJZCcsXG4gICAgICAgICdjaGFuZ2UgLm9hdXRoLWNsaWVudC1zZWNyZXQnOiAnc2V0Q2xpZW50U2VjcmV0J1xuICAgIH0sXG5cbiAgICB0ZW1wbGF0ZTogSGFuZGxlYmFycy50ZW1wbGF0ZXMub2F1dGgyLFxuXG4gICAgY2xzOiB7XG4gICAgICAgIGVycm9yOiAnZXJyb3InXG4gICAgfSxcblxuICAgIHJlbmRlcjogZnVuY3Rpb24gKCkge1xuICAgICAgICB0aGlzLiRlbC5odG1sKHRoaXMudGVtcGxhdGUodGhpcy5tb2RlbC50b0pTT04oKSkpO1xuXG4gICAgICAgIHJldHVybiB0aGlzO1xuICAgIH0sXG5cbiAgICBzY29wZUNoYW5nZTogZnVuY3Rpb24gKGUpIHtcbiAgICAgICAgdmFyIHZhbCA9ICQoZS50YXJnZXQpLnByb3AoJ2NoZWNrZWQnKTtcbiAgICAgICAgdmFyIHNjb3BlID0gJChlLnRhcmdldCkuZGF0YSgnc2NvcGUnKTtcblxuICAgICAgICB0aGlzLm1vZGVsLnNldFNjb3BlcyhzY29wZSwgdmFsKTtcbiAgICB9LFxuXG4gICAgc2V0VXNlcm5hbWU6IGZ1bmN0aW9uIChlKSB7XG4gICAgICAgIHZhciB2YWw9ICQoZS50YXJnZXQpLnZhbCgpO1xuICAgICAgICB0aGlzLm1vZGVsLnNldCgndXNlcm5hbWUnLCB2YWwpO1xuICAgICAgICBpZiAodmFsKSB7XG4gICAgICAgICAgICAkKGUudGFyZ2V0KS5yZW1vdmVDbGFzcyh0aGlzLmNscy5lcnJvcik7XG4gICAgICAgIH1cbiAgICB9LFxuXG4gICAgc2V0UGFzc3dvcmQ6IGZ1bmN0aW9uIChlKSB7XG4gICAgICAgIHRoaXMubW9kZWwuc2V0KCdwYXNzd29yZCcsICQoZS50YXJnZXQpLnZhbCgpKTtcbiAgICB9LFxuXG4gICAgc2V0Q2xpZW50QXV0aGVudGljYXRpb25UeXBlOiBmdW5jdGlvbiAoZSkge1xuICAgICAgICB2YXIgdHlwZSA9ICQoZS50YXJnZXQpLnZhbCgpO1xuICAgICAgICB2YXIgJGVsID0gdGhpcy4kZWw7XG4gICAgICAgIHRoaXMubW9kZWwuc2V0KCdjbGllbnRBdXRoZW50aWNhdGlvblR5cGUnLCB0eXBlKTtcblxuICAgICAgICBzd2l0Y2godHlwZSkge1xuICAgICAgICAgICAgY2FzZSAnbm9uZSc6XG4gICAgICAgICAgICAgICAgJGVsLmZpbmQoJy5vYXV0aC1jbGllbnQtYXV0aGVudGljYXRpb24nKS5oaWRlKCk7XG4gICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICBjYXNlICdiYXNpYyc6XG4gICAgICAgICAgICBjYXNlICdyZXF1ZXN0LWJvZHknOlxuICAgICAgICAgICAgICAgICRlbC5maW5kKCcub2F1dGgtY2xpZW50LWlkJykucmVtb3ZlQ2xhc3ModGhpcy5jbHMuZXJyb3IpO1xuICAgICAgICAgICAgICAgICRlbC5maW5kKCcub2F1dGgtY2xpZW50LWF1dGhlbnRpY2F0aW9uJykuc2hvdygpO1xuICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICB9XG4gICAgfSxcblxuICAgIHNldENsaWVudElkOiBmdW5jdGlvbiAoZSkge1xuICAgICAgICB2YXIgdmFsID0gJChlLnRhcmdldCkudmFsKCk7XG4gICAgICAgIHRoaXMubW9kZWwuc2V0KCdjbGllbnRJZCcsIHZhbCk7XG4gICAgICAgIGlmICh2YWwpIHtcbiAgICAgICAgICAgICQoZS50YXJnZXQpLnJlbW92ZUNsYXNzKHRoaXMuY2xzLmVycm9yKTtcbiAgICAgICAgfVxuICAgIH0sXG5cbiAgICBzZXRDbGllbnRTZWNyZXQ6IGZ1bmN0aW9uIChlKSB7XG4gICAgICAgIHRoaXMubW9kZWwuc2V0KCdjbGllbnRTZWNyZXQnLCAkKGUudGFyZ2V0KS52YWwoKSk7XG4gICAgICAgICQoZS50YXJnZXQpLnJlbW92ZUNsYXNzKCdlcnJvcicpO1xuICAgIH0sXG5cbiAgICBoaWdobGlnaHRJbnZhbGlkOiBmdW5jdGlvbiAoKSB7XG4gICAgICAgIGlmICghdGhpcy5tb2RlbC5nZXQoJ3VzZXJuYW1lJykpIHtcbiAgICAgICAgICAgIHRoaXMuJGVsLmZpbmQoJy5vYXV0aC11c2VybmFtZScpLmFkZENsYXNzKHRoaXMuY2xzLmVycm9yKTtcbiAgICAgICAgfVxuXG4gICAgICAgIGlmICghdGhpcy5tb2RlbC5nZXQoJ2NsaWVudElkJykpIHtcbiAgICAgICAgICAgIHRoaXMuJGVsLmZpbmQoJy5vYXV0aC1jbGllbnQtaWQnKS5hZGRDbGFzcyh0aGlzLmNscy5lcnJvcik7XG4gICAgICAgIH1cbiAgICB9XG59KTsiLCIndXNlIHN0cmljdCc7XG5cblN3YWdnZXJVaS5WaWV3cy5PcGVyYXRpb25WaWV3ID0gQmFja2JvbmUuVmlldy5leHRlbmQoe1xuICBpbnZvY2F0aW9uVXJsOiBudWxsLFxuXG4gIGV2ZW50czoge1xuICAgICdzdWJtaXQgLnNhbmRib3gnICAgICAgICAgOiAnc3VibWl0T3BlcmF0aW9uJyxcbiAgICAnY2xpY2sgLnN1Ym1pdCcgICAgICAgICAgIDogJ3N1Ym1pdE9wZXJhdGlvbicsXG4gICAgJ2NsaWNrIC5yZXNwb25zZV9oaWRlcicgICA6ICdoaWRlUmVzcG9uc2UnLFxuICAgICdjbGljayAudG9nZ2xlT3BlcmF0aW9uJyAgOiAndG9nZ2xlT3BlcmF0aW9uQ29udGVudCcsXG4gICAgJ21vdXNlZW50ZXIgLmFwaS1pYycgICAgICA6ICdtb3VzZUVudGVyJyxcbiAgICAnZGJsY2xpY2sgLmN1cmwnICAgICAgICAgIDogJ3NlbGVjdFRleHQnLFxuICAgICdjaGFuZ2UgW25hbWU9cmVzcG9uc2VDb250ZW50VHlwZV0nIDogJ3Nob3dTbmlwcGV0J1xuICB9LFxuXG4gIGluaXRpYWxpemU6IGZ1bmN0aW9uKG9wdHMpIHtcbiAgICBvcHRzID0gb3B0cyB8fCB7fTtcbiAgICB0aGlzLnJvdXRlciA9IG9wdHMucm91dGVyO1xuICAgIHRoaXMuYXV0aHMgPSBvcHRzLmF1dGhzO1xuICAgIHRoaXMucGFyZW50SWQgPSB0aGlzLm1vZGVsLnBhcmVudElkO1xuICAgIHRoaXMubmlja25hbWUgPSB0aGlzLm1vZGVsLm5pY2tuYW1lO1xuICAgIHRoaXMubW9kZWwuZW5jb2RlZFBhcmVudElkID0gZW5jb2RlVVJJQ29tcG9uZW50KHRoaXMucGFyZW50SWQpO1xuXG4gICAgaWYgKG9wdHMuc3dhZ2dlck9wdGlvbnMpIHtcbiAgICAgIHRoaXMubW9kZWwuZGVmYXVsdFJlbmRlcmluZyA9IG9wdHMuc3dhZ2dlck9wdGlvbnMuZGVmYXVsdE1vZGVsUmVuZGVyaW5nO1xuXG4gICAgICBpZiAob3B0cy5zd2FnZ2VyT3B0aW9ucy5zaG93UmVxdWVzdEhlYWRlcnMpIHtcbiAgICAgICAgdGhpcy5tb2RlbC5zaG93UmVxdWVzdEhlYWRlcnMgPSB0cnVlO1xuICAgICAgfVxuXG4gICAgICBpZiAob3B0cy5zd2FnZ2VyT3B0aW9ucy5zaG93T3BlcmF0aW9uSWRzKSB7XG4gICAgICAgIHRoaXMubW9kZWwuc2hvd09wZXJhdGlvbklkcyA9IHRydWU7XG4gICAgICB9XG4gICAgfVxuICAgIHJldHVybiB0aGlzO1xuICB9LFxuXG4gIHNlbGVjdFRleHQ6IGZ1bmN0aW9uKGV2ZW50KSB7XG4gICAgdmFyIGRvYyA9IGRvY3VtZW50LFxuICAgICAgICB0ZXh0ID0gZXZlbnQudGFyZ2V0LmZpcnN0Q2hpbGQsXG4gICAgICAgIHJhbmdlLFxuICAgICAgICBzZWxlY3Rpb247XG4gICAgaWYgKGRvYy5ib2R5LmNyZWF0ZVRleHRSYW5nZSkge1xuICAgICAgcmFuZ2UgPSBkb2N1bWVudC5ib2R5LmNyZWF0ZVRleHRSYW5nZSgpO1xuICAgICAgcmFuZ2UubW92ZVRvRWxlbWVudFRleHQodGV4dCk7XG4gICAgICByYW5nZS5zZWxlY3QoKTtcbiAgICB9IGVsc2UgaWYgKHdpbmRvdy5nZXRTZWxlY3Rpb24pIHtcbiAgICAgIHNlbGVjdGlvbiA9IHdpbmRvdy5nZXRTZWxlY3Rpb24oKTtcbiAgICAgIHJhbmdlID0gZG9jdW1lbnQuY3JlYXRlUmFuZ2UoKTtcbiAgICAgIHJhbmdlLnNlbGVjdE5vZGVDb250ZW50cyh0ZXh0KTtcbiAgICAgIHNlbGVjdGlvbi5yZW1vdmVBbGxSYW5nZXMoKTtcbiAgICAgIHNlbGVjdGlvbi5hZGRSYW5nZShyYW5nZSk7XG4gICAgfVxuICB9LFxuXG4gIG1vdXNlRW50ZXI6IGZ1bmN0aW9uKGUpIHtcbiAgICB2YXIgZWxlbSA9ICQodGhpcy5lbCkuZmluZCgnLmNvbnRlbnQnKTtcbiAgICB2YXIgeCA9IGUucGFnZVg7XG4gICAgdmFyIHkgPSBlLnBhZ2VZO1xuICAgIHZhciBzY1ggPSAkKHdpbmRvdykuc2Nyb2xsTGVmdCgpO1xuICAgIHZhciBzY1kgPSAkKHdpbmRvdykuc2Nyb2xsVG9wKCk7XG4gICAgdmFyIHNjTWF4WCA9IHNjWCArICQod2luZG93KS53aWR0aCgpO1xuICAgIHZhciBzY01heFkgPSBzY1kgKyAkKHdpbmRvdykuaGVpZ2h0KCk7XG4gICAgdmFyIHdkID0gZWxlbS53aWR0aCgpO1xuICAgIHZhciBoZ2ggPSBlbGVtLmhlaWdodCgpO1xuXG4gICAgaWYgKHggKyB3ZCA+IHNjTWF4WCkge1xuICAgICAgeCA9IHNjTWF4WCAtIHdkO1xuICAgIH1cblxuICAgIGlmICh4IDwgc2NYKSB7XG4gICAgICB4ID0gc2NYO1xuICAgIH1cblxuICAgIGlmICh5ICsgaGdoID4gc2NNYXhZKSB7XG4gICAgICB5ID0gc2NNYXhZIC0gaGdoO1xuICAgIH1cblxuICAgIGlmICh5IDwgc2NZKSB7XG4gICAgICB5ID0gc2NZO1xuICAgIH1cblxuICAgIHZhciBwb3MgPSB7fTtcbiAgICBwb3MudG9wID0geTtcbiAgICBwb3MubGVmdCA9IHg7XG4gICAgZWxlbS5jc3MocG9zKTtcbiAgfSxcblxuICAvLyBOb3RlOiBjb3BpZWQgZnJvbSBDb2ZmZWVTY3JpcHQgY29tcGlsZWQgZmlsZVxuICAvLyBUT0RPOiByZWZhY3RvclxuICByZW5kZXI6IGZ1bmN0aW9uKCkge1xuICAgIHZhciBhLCBhdXRoLCBhdXRocywgY29kZSwgY29udGVudFR5cGVNb2RlbCwgaXNNZXRob2RTdWJtaXNzaW9uU3VwcG9ydGVkLCBrLCBrZXksIGwsIGxlbiwgbGVuMSwgbGVuMiwgbGVuMywgbGVuNCwgbSwgbW9kZWxBdXRocywgbiwgbywgcCwgcGFyYW0sIHEsIHJlZiwgcmVmMSwgcmVmMiwgcmVmMywgcmVmNCwgcmVmNSwgcmVzcG9uc2VDb250ZW50VHlwZVZpZXcsIHJlc3BvbnNlU2lnbmF0dXJlVmlldywgc2NoZW1hLCBzY2hlbWFPYmosIHNjb3BlSW5kZXgsIHNpZ25hdHVyZU1vZGVsLCBzdGF0dXNDb2RlLCBzdWNjZXNzUmVzcG9uc2UsIHR5cGUsIHYsIHZhbHVlLCBwcm9kdWNlcywgaXNYTUwsIGlzSlNPTjtcbiAgICBpc01ldGhvZFN1Ym1pc3Npb25TdXBwb3J0ZWQgPSBqUXVlcnkuaW5BcnJheSh0aGlzLm1vZGVsLm1ldGhvZCwgdGhpcy5tb2RlbC5zdXBwb3J0ZWRTdWJtaXRNZXRob2RzKCkpID49IDA7XG4gICAgaWYgKCFpc01ldGhvZFN1Ym1pc3Npb25TdXBwb3J0ZWQpIHtcbiAgICAgIHRoaXMubW9kZWwuaXNSZWFkT25seSA9IHRydWU7XG4gICAgfVxuICAgIHRoaXMubW9kZWwuZGVzY3JpcHRpb24gPSB0aGlzLm1vZGVsLmRlc2NyaXB0aW9uIHx8IHRoaXMubW9kZWwubm90ZXM7XG4gICAgdGhpcy5tb2RlbC5vYXV0aCA9IG51bGw7XG4gICAgbW9kZWxBdXRocyA9IHRoaXMubW9kZWwuYXV0aG9yaXphdGlvbnMgfHwgdGhpcy5tb2RlbC5zZWN1cml0eTtcbiAgICBpZiAobW9kZWxBdXRocykge1xuICAgICAgaWYgKEFycmF5LmlzQXJyYXkobW9kZWxBdXRocykpIHtcbiAgICAgICAgZm9yIChsID0gMCwgbGVuID0gbW9kZWxBdXRocy5sZW5ndGg7IGwgPCBsZW47IGwrKykge1xuICAgICAgICAgIGF1dGhzID0gbW9kZWxBdXRoc1tsXTtcbiAgICAgICAgICBmb3IgKGtleSBpbiBhdXRocykge1xuICAgICAgICAgICAgZm9yIChhIGluIHRoaXMuYXV0aHMpIHtcbiAgICAgICAgICAgICAgYXV0aCA9IHRoaXMuYXV0aHNbYV07XG4gICAgICAgICAgICAgIGlmIChrZXkgPT09IGF1dGgubmFtZSkge1xuICAgICAgICAgICAgICAgIGlmIChhdXRoLnR5cGUgPT09ICdvYXV0aDInKSB7XG4gICAgICAgICAgICAgICAgICB0aGlzLm1vZGVsLm9hdXRoID0ge307XG4gICAgICAgICAgICAgICAgICB0aGlzLm1vZGVsLm9hdXRoLnNjb3BlcyA9IFtdO1xuICAgICAgICAgICAgICAgICAgcmVmMSA9IGF1dGgudmFsdWUuc2NvcGVzO1xuICAgICAgICAgICAgICAgICAgZm9yIChrIGluIHJlZjEpIHtcbiAgICAgICAgICAgICAgICAgICAgdiA9IHJlZjFba107XG4gICAgICAgICAgICAgICAgICAgIHNjb3BlSW5kZXggPSBhdXRoc1trZXldLmluZGV4T2Yoayk7XG4gICAgICAgICAgICAgICAgICAgIGlmIChzY29wZUluZGV4ID49IDApIHtcbiAgICAgICAgICAgICAgICAgICAgICBvID0ge1xuICAgICAgICAgICAgICAgICAgICAgICAgc2NvcGU6IGssXG4gICAgICAgICAgICAgICAgICAgICAgICBkZXNjcmlwdGlvbjogdlxuICAgICAgICAgICAgICAgICAgICAgIH07XG4gICAgICAgICAgICAgICAgICAgICAgdGhpcy5tb2RlbC5vYXV0aC5zY29wZXMucHVzaChvKTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgfSBlbHNlIHtcbiAgICAgICAgZm9yIChrIGluIG1vZGVsQXV0aHMpIHtcbiAgICAgICAgICB2ID0gbW9kZWxBdXRoc1trXTtcbiAgICAgICAgICBpZiAoayA9PT0gJ29hdXRoMicpIHtcbiAgICAgICAgICAgIGlmICh0aGlzLm1vZGVsLm9hdXRoID09PSBudWxsKSB7XG4gICAgICAgICAgICAgIHRoaXMubW9kZWwub2F1dGggPSB7fTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGlmICh0aGlzLm1vZGVsLm9hdXRoLnNjb3BlcyA9PT0gdm9pZCAwKSB7XG4gICAgICAgICAgICAgIHRoaXMubW9kZWwub2F1dGguc2NvcGVzID0gW107XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBmb3IgKG0gPSAwLCBsZW4xID0gdi5sZW5ndGg7IG0gPCBsZW4xOyBtKyspIHtcbiAgICAgICAgICAgICAgbyA9IHZbbV07XG4gICAgICAgICAgICAgIHRoaXMubW9kZWwub2F1dGguc2NvcGVzLnB1c2gobyk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuICAgIGlmICh0eXBlb2YgdGhpcy5tb2RlbC5yZXNwb25zZXMgIT09ICd1bmRlZmluZWQnKSB7XG4gICAgICB0aGlzLm1vZGVsLnJlc3BvbnNlTWVzc2FnZXMgPSBbXTtcbiAgICAgIHJlZjIgPSB0aGlzLm1vZGVsLnJlc3BvbnNlcztcbiAgICAgIGZvciAoY29kZSBpbiByZWYyKSB7XG4gICAgICAgIHZhbHVlID0gcmVmMltjb2RlXTtcbiAgICAgICAgc2NoZW1hID0gbnVsbDtcbiAgICAgICAgc2NoZW1hT2JqID0gdGhpcy5tb2RlbC5yZXNwb25zZXNbY29kZV0uc2NoZW1hO1xuICAgICAgICBpZiAoc2NoZW1hT2JqICYmIHNjaGVtYU9iai4kcmVmKSB7XG4gICAgICAgICAgc2NoZW1hID0gc2NoZW1hT2JqLiRyZWY7XG4gICAgICAgICAgaWYgKHNjaGVtYS5pbmRleE9mKCcjL2RlZmluaXRpb25zLycpICE9PSAtMSkge1xuICAgICAgICAgICAgc2NoZW1hID0gc2NoZW1hLnJlcGxhY2UoL14uKiNcXC9kZWZpbml0aW9uc1xcLy8sICcnKTtcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgdGhpcy5tb2RlbC5yZXNwb25zZU1lc3NhZ2VzLnB1c2goe1xuICAgICAgICAgIGNvZGU6IGNvZGUsXG4gICAgICAgICAgbWVzc2FnZTogdmFsdWUuZGVzY3JpcHRpb24sXG4gICAgICAgICAgcmVzcG9uc2VNb2RlbDogc2NoZW1hLFxuICAgICAgICAgIGhlYWRlcnM6IHZhbHVlLmhlYWRlcnMsXG4gICAgICAgICAgc2NoZW1hOiBzY2hlbWFPYmpcbiAgICAgICAgfSk7XG4gICAgICB9XG4gICAgfVxuICAgIGlmICh0eXBlb2YgdGhpcy5tb2RlbC5yZXNwb25zZU1lc3NhZ2VzID09PSAndW5kZWZpbmVkJykge1xuICAgICAgdGhpcy5tb2RlbC5yZXNwb25zZU1lc3NhZ2VzID0gW107XG4gICAgfVxuICAgIHNpZ25hdHVyZU1vZGVsID0gbnVsbDtcbiAgICBwcm9kdWNlcyA9IHRoaXMubW9kZWwucHJvZHVjZXM7XG4gICAgaXNYTUwgPSB0aGlzLmNvbnRhaW5zKHByb2R1Y2VzLCAneG1sJyk7XG4gICAgaXNKU09OID0gaXNYTUwgPyB0aGlzLmNvbnRhaW5zKHByb2R1Y2VzLCAnanNvbicpIDogdHJ1ZTtcblxuICAgIGlmICh0aGlzLm1vZGVsLnN1Y2Nlc3NSZXNwb25zZSkge1xuICAgICAgc3VjY2Vzc1Jlc3BvbnNlID0gdGhpcy5tb2RlbC5zdWNjZXNzUmVzcG9uc2U7XG4gICAgICBmb3IgKGtleSBpbiBzdWNjZXNzUmVzcG9uc2UpIHtcbiAgICAgICAgdmFsdWUgPSBzdWNjZXNzUmVzcG9uc2Vba2V5XTtcbiAgICAgICAgdGhpcy5tb2RlbC5zdWNjZXNzQ29kZSA9IGtleTtcbiAgICAgICAgaWYgKHR5cGVvZiB2YWx1ZSA9PT0gJ29iamVjdCcgJiYgdHlwZW9mIHZhbHVlLmNyZWF0ZUpTT05TYW1wbGUgPT09ICdmdW5jdGlvbicpIHtcbiAgICAgICAgICB0aGlzLm1vZGVsLnN1Y2Nlc3NEZXNjcmlwdGlvbiA9IHZhbHVlLmRlc2NyaXB0aW9uO1xuICAgICAgICAgIHRoaXMubW9kZWwuaGVhZGVycyA9IHRoaXMucGFyc2VSZXNwb25zZUhlYWRlcnModmFsdWUuaGVhZGVycyk7XG4gICAgICAgICAgc2lnbmF0dXJlTW9kZWwgPSB7XG4gICAgICAgICAgICBzYW1wbGVKU09OOiBpc0pTT04gPyBKU09OLnN0cmluZ2lmeShTd2FnZ2VyVWkucGFydGlhbHMuc2lnbmF0dXJlLmNyZWF0ZUpTT05TYW1wbGUodmFsdWUpLCB2b2lkIDAsIDIpIDogZmFsc2UsXG4gICAgICAgICAgICBpc1BhcmFtOiBmYWxzZSxcbiAgICAgICAgICAgIHNhbXBsZVhNTDogaXNYTUwgPyBTd2FnZ2VyVWkucGFydGlhbHMuc2lnbmF0dXJlLmNyZWF0ZVhNTFNhbXBsZSh2YWx1ZS5uYW1lLCB2YWx1ZS5kZWZpbml0aW9uLCB2YWx1ZS5tb2RlbHMpIDogZmFsc2UsXG4gICAgICAgICAgICBzaWduYXR1cmU6IFN3YWdnZXJVaS5wYXJ0aWFscy5zaWduYXR1cmUuZ2V0TW9kZWxTaWduYXR1cmUodmFsdWUubmFtZSwgdmFsdWUuZGVmaW5pdGlvbiwgdmFsdWUubW9kZWxzLCB2YWx1ZS5tb2RlbFByb3BlcnR5TWFjcm8pXG4gICAgICAgICAgfTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICBzaWduYXR1cmVNb2RlbCA9IHtcbiAgICAgICAgICAgIHNpZ25hdHVyZTogU3dhZ2dlclVpLnBhcnRpYWxzLnNpZ25hdHVyZS5nZXRQcmltaXRpdmVTaWduYXR1cmUodmFsdWUpXG4gICAgICAgICAgfTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH0gZWxzZSBpZiAodGhpcy5tb2RlbC5yZXNwb25zZUNsYXNzU2lnbmF0dXJlICYmIHRoaXMubW9kZWwucmVzcG9uc2VDbGFzc1NpZ25hdHVyZSAhPT0gJ3N0cmluZycpIHtcbiAgICAgIHNpZ25hdHVyZU1vZGVsID0ge1xuICAgICAgICBzYW1wbGVKU09OOiB0aGlzLm1vZGVsLnJlc3BvbnNlU2FtcGxlSlNPTixcbiAgICAgICAgaXNQYXJhbTogZmFsc2UsXG4gICAgICAgIHNpZ25hdHVyZTogdGhpcy5tb2RlbC5yZXNwb25zZUNsYXNzU2lnbmF0dXJlXG4gICAgICB9O1xuICAgIH1cbiAgICAkKHRoaXMuZWwpLmh0bWwoSGFuZGxlYmFycy50ZW1wbGF0ZXMub3BlcmF0aW9uKHRoaXMubW9kZWwpKTtcbiAgICBpZiAoc2lnbmF0dXJlTW9kZWwpIHtcbiAgICAgIHNpZ25hdHVyZU1vZGVsLmRlZmF1bHRSZW5kZXJpbmcgPSB0aGlzLm1vZGVsLmRlZmF1bHRSZW5kZXJpbmc7XG4gICAgICByZXNwb25zZVNpZ25hdHVyZVZpZXcgPSBuZXcgU3dhZ2dlclVpLlZpZXdzLlNpZ25hdHVyZVZpZXcoe1xuICAgICAgICBtb2RlbDogc2lnbmF0dXJlTW9kZWwsXG4gICAgICAgIHJvdXRlcjogdGhpcy5yb3V0ZXIsXG4gICAgICAgIHRhZ05hbWU6ICdkaXYnXG4gICAgICB9KTtcbiAgICAgICQoJy5tb2RlbC1zaWduYXR1cmUnLCAkKHRoaXMuZWwpKS5hcHBlbmQocmVzcG9uc2VTaWduYXR1cmVWaWV3LnJlbmRlcigpLmVsKTtcbiAgICB9IGVsc2Uge1xuICAgICAgdGhpcy5tb2RlbC5yZXNwb25zZUNsYXNzU2lnbmF0dXJlID0gJ3N0cmluZyc7XG4gICAgICAkKCcubW9kZWwtc2lnbmF0dXJlJywgJCh0aGlzLmVsKSkuaHRtbCh0aGlzLm1vZGVsLnR5cGUpO1xuICAgIH1cbiAgICBjb250ZW50VHlwZU1vZGVsID0ge1xuICAgICAgaXNQYXJhbTogZmFsc2VcbiAgICB9O1xuICAgIGNvbnRlbnRUeXBlTW9kZWwuY29uc3VtZXMgPSB0aGlzLm1vZGVsLmNvbnN1bWVzO1xuICAgIGNvbnRlbnRUeXBlTW9kZWwucHJvZHVjZXMgPSB0aGlzLm1vZGVsLnByb2R1Y2VzO1xuICAgIHJlZjMgPSB0aGlzLm1vZGVsLnBhcmFtZXRlcnM7XG4gICAgZm9yIChuID0gMCwgbGVuMiA9IHJlZjMubGVuZ3RoOyBuIDwgbGVuMjsgbisrKSB7XG4gICAgICBwYXJhbSA9IHJlZjNbbl07XG4gICAgICB0eXBlID0gcGFyYW0udHlwZSB8fCBwYXJhbS5kYXRhVHlwZSB8fCAnJztcbiAgICAgIGlmICh0eXBlb2YgdHlwZSA9PT0gJ3VuZGVmaW5lZCcpIHtcbiAgICAgICAgc2NoZW1hID0gcGFyYW0uc2NoZW1hO1xuICAgICAgICBpZiAoc2NoZW1hICYmIHNjaGVtYS4kcmVmKSB7XG4gICAgICAgICAgcmVmID0gc2NoZW1hLiRyZWY7XG4gICAgICAgICAgaWYgKHJlZi5pbmRleE9mKCcjL2RlZmluaXRpb25zLycpID09PSAwKSB7XG4gICAgICAgICAgICB0eXBlID0gcmVmLnN1YnN0cmluZygnIy9kZWZpbml0aW9ucy8nLmxlbmd0aCk7XG4gICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIHR5cGUgPSByZWY7XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICB9XG4gICAgICBpZiAodHlwZSAmJiB0eXBlLnRvTG93ZXJDYXNlKCkgPT09ICdmaWxlJykge1xuICAgICAgICBpZiAoIWNvbnRlbnRUeXBlTW9kZWwuY29uc3VtZXMpIHtcbiAgICAgICAgICBjb250ZW50VHlwZU1vZGVsLmNvbnN1bWVzID0gJ211bHRpcGFydC9mb3JtLWRhdGEnO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgICBwYXJhbS50eXBlID0gdHlwZTtcbiAgICB9XG4gICAgcmVzcG9uc2VDb250ZW50VHlwZVZpZXcgPSBuZXcgU3dhZ2dlclVpLlZpZXdzLlJlc3BvbnNlQ29udGVudFR5cGVWaWV3KHtcbiAgICAgIG1vZGVsOiBjb250ZW50VHlwZU1vZGVsLFxuICAgICAgcm91dGVyOiB0aGlzLnJvdXRlclxuICAgIH0pO1xuICAgICQoJy5yZXNwb25zZS1jb250ZW50LXR5cGUnLCAkKHRoaXMuZWwpKS5hcHBlbmQocmVzcG9uc2VDb250ZW50VHlwZVZpZXcucmVuZGVyKCkuZWwpO1xuICAgIHJlZjQgPSB0aGlzLm1vZGVsLnBhcmFtZXRlcnM7XG4gICAgZm9yIChwID0gMCwgbGVuMyA9IHJlZjQubGVuZ3RoOyBwIDwgbGVuMzsgcCsrKSB7XG4gICAgICBwYXJhbSA9IHJlZjRbcF07XG4gICAgICB0aGlzLmFkZFBhcmFtZXRlcihwYXJhbSwgY29udGVudFR5cGVNb2RlbC5jb25zdW1lcyk7XG4gICAgfVxuICAgIHJlZjUgPSB0aGlzLm1vZGVsLnJlc3BvbnNlTWVzc2FnZXM7XG4gICAgZm9yIChxID0gMCwgbGVuNCA9IHJlZjUubGVuZ3RoOyBxIDwgbGVuNDsgcSsrKSB7XG4gICAgICBzdGF0dXNDb2RlID0gcmVmNVtxXTtcbiAgICAgIHN0YXR1c0NvZGUuaXNYTUwgPSBpc1hNTDtcbiAgICAgIHN0YXR1c0NvZGUuaXNKU09OID0gaXNKU09OO1xuICAgICAgaWYgKCFfLmlzVW5kZWZpbmVkKHN0YXR1c0NvZGUuaGVhZGVycykpIHtcbiAgICAgICAgc3RhdHVzQ29kZS5oZWFkZXJzID0gdGhpcy5wYXJzZUhlYWRlcnNUeXBlKHN0YXR1c0NvZGUuaGVhZGVycyk7XG4gICAgICB9XG4gICAgICB0aGlzLmFkZFN0YXR1c0NvZGUoc3RhdHVzQ29kZSk7XG4gICAgfVxuXG4gICAgaWYgKEFycmF5LmlzQXJyYXkodGhpcy5tb2RlbC5zZWN1cml0eSkpIHtcbiAgICAgIHZhciBhdXRoc01vZGVsID0gU3dhZ2dlclVpLnV0aWxzLnBhcnNlU2VjdXJpdHlEZWZpbml0aW9ucyh0aGlzLm1vZGVsLnNlY3VyaXR5LCB0aGlzLm1vZGVsLnBhcmVudC5zZWN1cml0eURlZmluaXRpb25zKTtcblxuICAgICAgYXV0aHNNb2RlbC5pc0xvZ291dCA9ICFfLmlzRW1wdHkodGhpcy5tb2RlbC5jbGllbnRBdXRob3JpemF0aW9ucy5hdXRoeik7XG4gICAgICB0aGlzLmF1dGhWaWV3ID0gbmV3IFN3YWdnZXJVaS5WaWV3cy5BdXRoQnV0dG9uVmlldyh7XG4gICAgICAgIGRhdGE6IGF1dGhzTW9kZWwsXG4gICAgICAgIHJvdXRlcjogdGhpcy5yb3V0ZXIsXG4gICAgICAgIGlzT3BlcmF0aW9uOiB0cnVlLFxuICAgICAgICBtb2RlbDoge1xuICAgICAgICAgIHNjb3BlczogYXV0aHNNb2RlbC5zY29wZXNcbiAgICAgICAgfVxuICAgICAgfSk7XG4gICAgICB0aGlzLiQoJy5hdXRob3JpemUtd3JhcHBlcicpLmFwcGVuZCh0aGlzLmF1dGhWaWV3LnJlbmRlcigpLmVsKTtcbiAgICB9XG5cbiAgICB0aGlzLnNob3dTbmlwcGV0KCk7XG4gICAgcmV0dXJuIHRoaXM7XG4gIH0sXG5cbiAgcGFyc2VIZWFkZXJzVHlwZTogZnVuY3Rpb24gKGhlYWRlcnMpIHtcbiAgICB2YXIgbWFwID0ge1xuICAgICAgJ3N0cmluZyc6IHtcbiAgICAgICAgJ2RhdGUtdGltZSc6ICdkYXRlVGltZScsXG4gICAgICAgICdkYXRlJyAgICAgOiAnZGF0ZSdcbiAgICAgIH1cbiAgICB9O1xuXG4gICAgXy5mb3JFYWNoKGhlYWRlcnMsIGZ1bmN0aW9uIChoZWFkZXIpIHtcbiAgICAgIHZhciB2YWx1ZTtcbiAgICAgIGhlYWRlciA9IGhlYWRlciB8fCB7fTtcbiAgICAgIHZhbHVlID0gbWFwW2hlYWRlci50eXBlXSAmJiBtYXBbaGVhZGVyLnR5cGVdW2hlYWRlci5mb3JtYXRdO1xuICAgICAgaWYgKCFfLmlzVW5kZWZpbmVkKHZhbHVlKSkge1xuICAgICAgICBoZWFkZXIudHlwZSA9IHZhbHVlO1xuICAgICAgfVxuICAgIH0pO1xuXG4gICAgcmV0dXJuIGhlYWRlcnM7XG4gIH0sXG5cbiAgY29udGFpbnM6IGZ1bmN0aW9uIChwcm9kdWNlcywgdHlwZSkge1xuICAgIHJldHVybiBwcm9kdWNlcy5maWx0ZXIoZnVuY3Rpb24gKHZhbCkge1xuICAgICAgaWYgKHZhbC5pbmRleE9mKHR5cGUpID4gLTEpIHtcbiAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgICB9XG4gICAgfSkubGVuZ3RoO1xuICB9LFxuXG4gIHBhcnNlUmVzcG9uc2VIZWFkZXJzOiBmdW5jdGlvbiAoZGF0YSkge1xuICAgIHZhciBIRUFERVJTX1NFUEFSQVRPUiA9ICc7ICc7XG4gICAgdmFyIGhlYWRlcnMgPSBfLmNsb25lKGRhdGEpO1xuXG4gICAgXy5mb3JFYWNoKGhlYWRlcnMsIGZ1bmN0aW9uIChoZWFkZXIpIHtcbiAgICAgIHZhciBvdGhlciA9IFtdO1xuICAgICAgXy5mb3JFYWNoKGhlYWRlciwgZnVuY3Rpb24gKHZhbHVlLCBrZXkpIHtcbiAgICAgICAgdmFyIHByb3BlcnRpZXMgPSBbJ3R5cGUnLCAnZGVzY3JpcHRpb24nXTtcbiAgICAgICAgaWYgKHByb3BlcnRpZXMuaW5kZXhPZihrZXkudG9Mb3dlckNhc2UoKSkgPT09IC0xKSB7XG4gICAgICAgICAgb3RoZXIucHVzaChrZXkgKyAnOiAnICsgdmFsdWUpO1xuICAgICAgICB9XG4gICAgICB9KTtcblxuICAgICAgb3RoZXIuam9pbihIRUFERVJTX1NFUEFSQVRPUik7XG4gICAgICBoZWFkZXIub3RoZXIgPSBvdGhlcjtcbiAgICB9KTtcblxuICAgIHJldHVybiBoZWFkZXJzO1xuICB9LFxuXG4gIGFkZFBhcmFtZXRlcjogZnVuY3Rpb24ocGFyYW0sIGNvbnN1bWVzKSB7XG4gICAgLy8gUmVuZGVyIGEgcGFyYW1ldGVyXG4gICAgcGFyYW0uY29uc3VtZXMgPSBjb25zdW1lcztcbiAgICBwYXJhbS5kZWZhdWx0UmVuZGVyaW5nID0gdGhpcy5tb2RlbC5kZWZhdWx0UmVuZGVyaW5nO1xuXG4gICAgLy8gQ29weSB0aGlzIHBhcmFtIEpTT04gc3BlYyBzbyB0aGF0IGl0IHdpbGwgYmUgYXZhaWxhYmxlIGZvciBKc29uRWRpdG9yXG4gICAgaWYocGFyYW0uc2NoZW1hKXtcbiAgICAgICQuZXh0ZW5kKHRydWUsIHBhcmFtLnNjaGVtYSwgdGhpcy5tb2RlbC5kZWZpbml0aW9uc1twYXJhbS50eXBlXSk7XG4gICAgICBwYXJhbS5zY2hlbWEuZGVmaW5pdGlvbnMgPSB0aGlzLm1vZGVsLmRlZmluaXRpb25zO1xuICAgICAgLy8gVGhpcyBpcyByZXF1aXJlZCBmb3IgSnNvbkVkaXRvciB0byBkaXNwbGF5IHRoZSByb290IHByb3Blcmx5XG4gICAgICBpZighcGFyYW0uc2NoZW1hLnR5cGUpe1xuICAgICAgICBwYXJhbS5zY2hlbWEudHlwZSA9ICdvYmplY3QnO1xuICAgICAgfVxuICAgICAgLy8gVGhpcyBpcyB0aGUgdGl0bGUgdGhhdCB3aWxsIGJlIHVzZWQgYnkgSnNvbkVkaXRvciBmb3IgdGhlIHJvb3RcbiAgICAgIC8vIFNpbmNlIHdlIGFscmVhZHkgZGlzcGxheSB0aGUgcGFyYW1ldGVyJ3MgbmFtZSBpbiB0aGUgUGFyYW1ldGVyIGNvbHVtblxuICAgICAgLy8gV2Ugc2V0IHRoaXMgdG8gc3BhY2UsIHdlIGNhbid0IHNldCBpdCB0byBudWxsIG9yIHNwYWNlIG90aGVyd2lzZSBKc29uRWRpdG9yXG4gICAgICAvLyB3aWxsIHJlcGxhY2UgaXQgd2l0aCB0aGUgdGV4dCBcInJvb3RcIiB3aGljaCB3b24ndCBsb29rIGdvb2Qgb24gc2NyZWVuXG4gICAgICBpZighcGFyYW0uc2NoZW1hLnRpdGxlKXtcbiAgICAgICAgcGFyYW0uc2NoZW1hLnRpdGxlID0gJyAnO1xuICAgICAgfVxuICAgIH1cblxuICAgIHZhciBwYXJhbVZpZXcgPSBuZXcgU3dhZ2dlclVpLlZpZXdzLlBhcmFtZXRlclZpZXcoe1xuICAgICAgbW9kZWw6IHBhcmFtLFxuICAgICAgdGFnTmFtZTogJ3RyJyxcbiAgICAgIHJlYWRPbmx5OiB0aGlzLm1vZGVsLmlzUmVhZE9ubHksXG4gICAgICBzd2FnZ2VyT3B0aW9uczogdGhpcy5vcHRpb25zLnN3YWdnZXJPcHRpb25zXG4gICAgfSk7XG4gICAgJCgnLm9wZXJhdGlvbi1wYXJhbXMnLCAkKHRoaXMuZWwpKS5hcHBlbmQocGFyYW1WaWV3LnJlbmRlcigpLmVsKTtcbiAgfSxcblxuICBhZGRTdGF0dXNDb2RlOiBmdW5jdGlvbihzdGF0dXNDb2RlKSB7XG4gICAgLy8gUmVuZGVyIHN0YXR1cyBjb2Rlc1xuICAgIHN0YXR1c0NvZGUuZGVmYXVsdFJlbmRlcmluZyA9IHRoaXMubW9kZWwuZGVmYXVsdFJlbmRlcmluZztcbiAgICB2YXIgc3RhdHVzQ29kZVZpZXcgPSBuZXcgU3dhZ2dlclVpLlZpZXdzLlN0YXR1c0NvZGVWaWV3KHtcbiAgICAgIG1vZGVsOiBzdGF0dXNDb2RlLFxuICAgICAgdGFnTmFtZTogJ3RyJyxcbiAgICAgIHJvdXRlcjogdGhpcy5yb3V0ZXJcbiAgICB9KTtcbiAgICAkKCcub3BlcmF0aW9uLXN0YXR1cycsICQodGhpcy5lbCkpLmFwcGVuZChzdGF0dXNDb2RlVmlldy5yZW5kZXIoKS5lbCk7XG4gIH0sXG5cbiAgLy8gTm90ZTogY29waWVkIGZyb20gQ29mZmVlU2NyaXB0IGNvbXBpbGVkIGZpbGVcbiAgLy8gVE9ETzogcmVkYWN0b3JcbiAgc3VibWl0T3BlcmF0aW9uOiBmdW5jdGlvbihlKSB7XG4gICAgdmFyIGVycm9yX2ZyZWUsIGZvcm0sIGlzRmlsZVVwbG9hZCwgbWFwLCBvcHRzO1xuICAgIGlmIChlICE9PSBudWxsKSB7XG4gICAgICBlLnByZXZlbnREZWZhdWx0KCk7XG4gICAgfVxuICAgIGZvcm0gPSAkKCcuc2FuZGJveCcsICQodGhpcy5lbCkpO1xuICAgIGVycm9yX2ZyZWUgPSB0cnVlO1xuICAgIGZvcm0uZmluZCgnaW5wdXQucmVxdWlyZWQnKS5lYWNoKGZ1bmN0aW9uKCkge1xuICAgICAgJCh0aGlzKS5yZW1vdmVDbGFzcygnZXJyb3InKTtcbiAgICAgIGlmIChqUXVlcnkudHJpbSgkKHRoaXMpLnZhbCgpKSA9PT0gJycpIHtcbiAgICAgICAgJCh0aGlzKS5hZGRDbGFzcygnZXJyb3InKTtcbiAgICAgICAgJCh0aGlzKS53aWdnbGUoe1xuICAgICAgICAgIGNhbGxiYWNrOiAoZnVuY3Rpb24oX3RoaXMpIHtcbiAgICAgICAgICAgIHJldHVybiBmdW5jdGlvbigpIHtcbiAgICAgICAgICAgICAgJChfdGhpcykuZm9jdXMoKTtcbiAgICAgICAgICAgIH07XG4gICAgICAgICAgfSkodGhpcylcbiAgICAgICAgfSk7XG4gICAgICAgIGVycm9yX2ZyZWUgPSBmYWxzZTtcbiAgICAgIH1cbiAgICB9KTtcbiAgICBmb3JtLmZpbmQoJ3RleHRhcmVhLnJlcXVpcmVkOnZpc2libGUnKS5lYWNoKGZ1bmN0aW9uKCkge1xuICAgICAgJCh0aGlzKS5yZW1vdmVDbGFzcygnZXJyb3InKTtcbiAgICAgIGlmIChqUXVlcnkudHJpbSgkKHRoaXMpLnZhbCgpKSA9PT0gJycpIHtcbiAgICAgICAgJCh0aGlzKS5hZGRDbGFzcygnZXJyb3InKTtcbiAgICAgICAgJCh0aGlzKS53aWdnbGUoe1xuICAgICAgICAgIGNhbGxiYWNrOiAoZnVuY3Rpb24oX3RoaXMpIHtcbiAgICAgICAgICAgIHJldHVybiBmdW5jdGlvbigpIHtcbiAgICAgICAgICAgICAgcmV0dXJuICQoX3RoaXMpLmZvY3VzKCk7XG4gICAgICAgICAgICB9O1xuICAgICAgICAgIH0pKHRoaXMpXG4gICAgICAgIH0pO1xuICAgICAgICBlcnJvcl9mcmVlID0gZmFsc2U7XG4gICAgICB9XG4gICAgfSk7XG4gICAgZm9ybS5maW5kKCdzZWxlY3QucmVxdWlyZWQnKS5lYWNoKGZ1bmN0aW9uKCkge1xuICAgICAgJCh0aGlzKS5yZW1vdmVDbGFzcygnZXJyb3InKTtcbiAgICAgIGlmICh0aGlzLnNlbGVjdGVkSW5kZXggPT09IC0xKSB7XG4gICAgICAgICQodGhpcykuYWRkQ2xhc3MoJ2Vycm9yJyk7XG4gICAgICAgICQodGhpcykud2lnZ2xlKHtcbiAgICAgICAgICBjYWxsYmFjazogKGZ1bmN0aW9uKF90aGlzKSB7XG4gICAgICAgICAgICByZXR1cm4gZnVuY3Rpb24oKSB7XG4gICAgICAgICAgICAgICQoX3RoaXMpLmZvY3VzKCk7XG4gICAgICAgICAgICB9O1xuICAgICAgICAgIH0pKHRoaXMpXG4gICAgICAgIH0pO1xuICAgICAgICBlcnJvcl9mcmVlID0gZmFsc2U7XG4gICAgICB9XG4gICAgfSk7XG4gICAgaWYgKGVycm9yX2ZyZWUpIHtcbiAgICAgIG1hcCA9IHRoaXMuZ2V0SW5wdXRNYXAoZm9ybSk7XG4gICAgICBpc0ZpbGVVcGxvYWQgPSB0aGlzLmlzRmlsZVVwbG9hZChmb3JtKTtcbiAgICAgIG9wdHMgPSB7XG4gICAgICAgIHBhcmVudDogdGhpc1xuICAgICAgfTtcbiAgICAgIGlmICh0aGlzLm9wdGlvbnMuc3dhZ2dlck9wdGlvbnMpIHtcbiAgICAgICAgZm9yKHZhciBrZXkgaW4gdGhpcy5vcHRpb25zLnN3YWdnZXJPcHRpb25zKSB7XG4gICAgICAgICAgb3B0c1trZXldID0gdGhpcy5vcHRpb25zLnN3YWdnZXJPcHRpb25zW2tleV07XG4gICAgICAgIH1cbiAgICAgIH1cblxuICAgICAgdmFyIHBpO1xuICAgICAgZm9yKHBpID0gMDsgcGkgPCB0aGlzLm1vZGVsLnBhcmFtZXRlcnMubGVuZ3RoOyBwaSsrKXtcbiAgICAgICAgdmFyIHAgPSB0aGlzLm1vZGVsLnBhcmFtZXRlcnNbcGldO1xuICAgICAgICBpZiggcC5qc29uRWRpdG9yICYmIHAuanNvbkVkaXRvci5pc0VuYWJsZWQoKSl7XG4gICAgICAgICAgdmFyIGpzb24gPSBwLmpzb25FZGl0b3IuZ2V0VmFsdWUoKTtcbiAgICAgICAgICBtYXBbcC5uYW1lXSA9IEpTT04uc3RyaW5naWZ5KGpzb24pO1xuICAgICAgICB9XG4gICAgICB9XG5cbiAgICAgIG9wdHMucmVzcG9uc2VDb250ZW50VHlwZSA9ICQoJ2RpdiBzZWxlY3RbbmFtZT1yZXNwb25zZUNvbnRlbnRUeXBlXScsICQodGhpcy5lbCkpLnZhbCgpO1xuICAgICAgb3B0cy5yZXF1ZXN0Q29udGVudFR5cGUgPSAkKCdkaXYgc2VsZWN0W25hbWU9cGFyYW1ldGVyQ29udGVudFR5cGVdJywgJCh0aGlzLmVsKSkudmFsKCk7XG4gICAgICAkKCcucmVzcG9uc2VfdGhyb2JiZXInLCAkKHRoaXMuZWwpKS5zaG93KCk7XG4gICAgICBpZiAoaXNGaWxlVXBsb2FkKSB7XG4gICAgICAgICQoJy5yZXF1ZXN0X3VybCcsICQodGhpcy5lbCkpLmh0bWwoJzxwcmU+PC9wcmU+Jyk7XG4gICAgICAgICQoJy5yZXF1ZXN0X3VybCBwcmUnLCAkKHRoaXMuZWwpKS50ZXh0KHRoaXMuaW52b2NhdGlvblVybCk7XG5cbiAgICAgICAgb3B0cy51c2VKUXVlcnkgPSB0cnVlO1xuICAgICAgICBtYXAucGFyYW1ldGVyQ29udGVudFR5cGUgPSAnbXVsdGlwYXJ0L2Zvcm0tZGF0YSc7XG4gICAgICAgIHRoaXMubWFwID0gbWFwO1xuICAgICAgICByZXR1cm4gdGhpcy5tb2RlbC5leGVjdXRlKG1hcCwgb3B0cywgdGhpcy5zaG93Q29tcGxldGVTdGF0dXMsIHRoaXMuc2hvd0Vycm9yU3RhdHVzLCB0aGlzKTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHRoaXMubWFwID0gbWFwO1xuICAgICAgICByZXR1cm4gdGhpcy5tb2RlbC5leGVjdXRlKG1hcCwgb3B0cywgdGhpcy5zaG93Q29tcGxldGVTdGF0dXMsIHRoaXMuc2hvd0Vycm9yU3RhdHVzLCB0aGlzKTtcbiAgICAgIH1cbiAgICB9XG4gIH0sXG5cbiAgZ2V0SW5wdXRNYXA6IGZ1bmN0aW9uIChmb3JtKSB7XG4gICAgdmFyIG1hcCwgcmVmMSwgbCwgbGVuLCBvLCByZWYyLCBtLCBsZW4xLCB2YWwsIHJlZjMsIG4sIGxlbjI7XG4gICAgbWFwID0ge307XG4gICAgcmVmMSA9IGZvcm0uZmluZCgnaW5wdXQnKTtcbiAgICBmb3IgKGwgPSAwLCBsZW4gPSByZWYxLmxlbmd0aDsgbCA8IGxlbjsgbCsrKSB7XG4gICAgICBvID0gcmVmMVtsXTtcbiAgICAgIGlmICgoby52YWx1ZSAhPT0gbnVsbCkgJiYgalF1ZXJ5LnRyaW0oby52YWx1ZSkubGVuZ3RoID4gMCkge1xuICAgICAgICBtYXBbby5uYW1lXSA9IG8udmFsdWU7XG4gICAgICB9XG4gICAgICBpZiAoby50eXBlID09PSAnZmlsZScpIHtcbiAgICAgICAgbWFwW28ubmFtZV0gPSBvLmZpbGVzWzBdO1xuICAgICAgfVxuICAgIH1cbiAgICByZWYyID0gZm9ybS5maW5kKCd0ZXh0YXJlYScpO1xuICAgIGZvciAobSA9IDAsIGxlbjEgPSByZWYyLmxlbmd0aDsgbSA8IGxlbjE7IG0rKykge1xuICAgICAgbyA9IHJlZjJbbV07XG4gICAgICB2YWwgPSB0aGlzLmdldFRleHRBcmVhVmFsdWUobyk7XG4gICAgICBpZiAoKHZhbCAhPT0gbnVsbCkgJiYgalF1ZXJ5LnRyaW0odmFsKS5sZW5ndGggPiAwKSB7XG4gICAgICAgIG1hcFtvLm5hbWVdID0gdmFsO1xuICAgICAgfVxuICAgIH1cbiAgICByZWYzID0gZm9ybS5maW5kKCdzZWxlY3QnKTtcbiAgICBmb3IgKG4gPSAwLCBsZW4yID0gcmVmMy5sZW5ndGg7IG4gPCBsZW4yOyBuKyspIHtcbiAgICAgIG8gPSByZWYzW25dO1xuICAgICAgdmFsID0gdGhpcy5nZXRTZWxlY3RlZFZhbHVlKG8pO1xuICAgICAgaWYgKCh2YWwgIT09IG51bGwpICYmIGpRdWVyeS50cmltKHZhbCkubGVuZ3RoID4gMCkge1xuICAgICAgICBtYXBbby5uYW1lXSA9IHZhbDtcbiAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuIG1hcDtcbiAgfSxcblxuICBpc0ZpbGVVcGxvYWQ6IGZ1bmN0aW9uIChmb3JtKSB7XG4gICAgdmFyIHJlZjEsIGwsIGxlbiwgbztcbiAgICB2YXIgaXNGaWxlVXBsb2FkID0gZmFsc2U7XG4gICAgcmVmMSA9IGZvcm0uZmluZCgnaW5wdXQnKTtcbiAgICBmb3IgKGwgPSAwLCBsZW4gPSByZWYxLmxlbmd0aDsgbCA8IGxlbjsgbCsrKSB7XG4gICAgICBvID0gcmVmMVtsXTtcbiAgICAgIGlmIChvLnR5cGUgPT09ICdmaWxlJykge1xuICAgICAgICBpc0ZpbGVVcGxvYWQgPSB0cnVlO1xuICAgICAgfVxuICAgIH1cbiAgICByZXR1cm4gaXNGaWxlVXBsb2FkO1xuICB9LFxuXG4gIHN1Y2Nlc3M6IGZ1bmN0aW9uKHJlc3BvbnNlLCBwYXJlbnQpIHtcbiAgICBwYXJlbnQuc2hvd0NvbXBsZXRlU3RhdHVzKHJlc3BvbnNlKTtcbiAgfSxcblxuICAvLyB3cmFwcyBhIGpxdWVyeSByZXNwb25zZSBhcyBhIHNocmVkIHJlc3BvbnNlXG4gIHdyYXA6IGZ1bmN0aW9uKGRhdGEpIHtcbiAgICB2YXIgaCwgaGVhZGVyQXJyYXksIGhlYWRlcnMsIGksIGwsIGxlbiwgbztcbiAgICBoZWFkZXJzID0ge307XG4gICAgaGVhZGVyQXJyYXkgPSBkYXRhLmdldEFsbFJlc3BvbnNlSGVhZGVycygpLnNwbGl0KCdcXHInKTtcbiAgICBmb3IgKGwgPSAwLCBsZW4gPSBoZWFkZXJBcnJheS5sZW5ndGg7IGwgPCBsZW47IGwrKykge1xuICAgICAgaSA9IGhlYWRlckFycmF5W2xdO1xuICAgICAgaCA9IGkubWF0Y2goL14oW146XSo/KTooLiopJC8pO1xuICAgICAgaWYgKCFoKSB7XG4gICAgICAgIGggPSBbXTtcbiAgICAgIH1cbiAgICAgIGguc2hpZnQoKTtcbiAgICAgIGlmIChoWzBdICE9PSB2b2lkIDAgJiYgaFsxXSAhPT0gdm9pZCAwKSB7XG4gICAgICAgIGhlYWRlcnNbaFswXS50cmltKCldID0gaFsxXS50cmltKCk7XG4gICAgICB9XG4gICAgfVxuICAgIG8gPSB7fTtcbiAgICBvLmNvbnRlbnQgPSB7fTtcbiAgICBvLmNvbnRlbnQuZGF0YSA9IGRhdGEucmVzcG9uc2VUZXh0O1xuICAgIG8uaGVhZGVycyA9IGhlYWRlcnM7XG4gICAgby5yZXF1ZXN0ID0ge307XG4gICAgby5yZXF1ZXN0LnVybCA9IHRoaXMuaW52b2NhdGlvblVybDtcbiAgICBvLnN0YXR1cyA9IGRhdGEuc3RhdHVzO1xuICAgIHJldHVybiBvO1xuICB9LFxuXG4gIGdldFNlbGVjdGVkVmFsdWU6IGZ1bmN0aW9uKHNlbGVjdCkge1xuICAgIGlmICghc2VsZWN0Lm11bHRpcGxlKSB7XG4gICAgICByZXR1cm4gc2VsZWN0LnZhbHVlO1xuICAgIH0gZWxzZSB7XG4gICAgICB2YXIgb3B0aW9ucyA9IFtdO1xuICAgICAgZm9yICh2YXIgbCA9IDAsIGxlbiA9IHNlbGVjdC5vcHRpb25zLmxlbmd0aDsgbCA8IGxlbjsgbCsrKSB7XG4gICAgICAgIHZhciBvcHQgPSBzZWxlY3Qub3B0aW9uc1tsXTtcbiAgICAgICAgaWYgKG9wdC5zZWxlY3RlZCkge1xuICAgICAgICAgIG9wdGlvbnMucHVzaChvcHQudmFsdWUpO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgICBpZiAob3B0aW9ucy5sZW5ndGggPiAwKSB7XG4gICAgICAgIHJldHVybiBvcHRpb25zO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgcmV0dXJuIG51bGw7XG4gICAgICB9XG4gICAgfVxuICB9LFxuXG4gIC8vIGhhbmRsZXIgZm9yIGhpZGUgcmVzcG9uc2UgbGlua1xuICBoaWRlUmVzcG9uc2U6IGZ1bmN0aW9uKGUpIHtcbiAgICBpZiAoZSkgeyBlLnByZXZlbnREZWZhdWx0KCk7IH1cbiAgICAkKCcucmVzcG9uc2UnLCAkKHRoaXMuZWwpKS5zbGlkZVVwKCk7XG4gICAgJCgnLnJlc3BvbnNlX2hpZGVyJywgJCh0aGlzLmVsKSkuZmFkZU91dCgpO1xuICB9LFxuXG4gIC8vIFNob3cgcmVzcG9uc2UgZnJvbSBzZXJ2ZXJcbiAgc2hvd1Jlc3BvbnNlOiBmdW5jdGlvbihyZXNwb25zZSkge1xuICAgIHZhciBwcmV0dHlKc29uID0gSlNPTi5zdHJpbmdpZnkocmVzcG9uc2UsIG51bGwsICdcXHQnKS5yZXBsYWNlKC9cXG4vZywgJzxicj4nKTtcbiAgICAkKCcucmVzcG9uc2VfYm9keScsICQodGhpcy5lbCkpLmh0bWwoXy5lc2NhcGUocHJldHR5SnNvbikpO1xuICB9LFxuXG4gIC8vIFNob3cgZXJyb3IgZnJvbSBzZXJ2ZXJcbiAgc2hvd0Vycm9yU3RhdHVzOiBmdW5jdGlvbihkYXRhLCBwYXJlbnQpIHtcbiAgICBwYXJlbnQuc2hvd1N0YXR1cyhkYXRhKTtcbiAgfSxcblxuICAvLyBzaG93IHRoZSBzdGF0dXMgY29kZXNcbiAgc2hvd0NvbXBsZXRlU3RhdHVzOiBmdW5jdGlvbihkYXRhLCBwYXJlbnQpe1xuICAgIHBhcmVudC5zaG93U3RhdHVzKGRhdGEpO1xuICB9LFxuXG4gIC8vIEFkYXB0ZWQgZnJvbSBodHRwOi8vc3RhY2tvdmVyZmxvdy5jb20vYS8yODkzMjU5LzQ1NDAwNFxuICAvLyBOb3RlOiBkaXJlY3RseSBwb3J0ZWQgZnJvbSBDb2ZmZWVTY3JpcHRcbiAgLy8gVE9ETzogQ2xlYW51cCBDb2ZmZWVTY3JpcHQgYXJ0aWZhY3RzXG4gIGZvcm1hdFhtbDogZnVuY3Rpb24oeG1sKSB7XG4gICAgdmFyIGNvbnRleHAsIGZuLCBmb3JtYXR0ZWQsIGluZGVudCwgbCwgbGFzdFR5cGUsIGxlbiwgbGluZXMsIGxuLCBwYWQsIHJlZywgdHJhbnNpdGlvbnMsIHdzZXhwO1xuICAgIHJlZyA9IC8oPikoPCkoXFwvKikvZztcbiAgICB3c2V4cCA9IC9bIF0qKC4qKVsgXStcXG4vZztcbiAgICBjb250ZXhwID0gLyg8Lis+KSguK1xcbikvZztcbiAgICB4bWwgPSB4bWwucmVwbGFjZSgvXFxyXFxuL2csICdcXG4nKS5yZXBsYWNlKHJlZywgJyQxXFxuJDIkMycpLnJlcGxhY2Uod3NleHAsICckMVxcbicpLnJlcGxhY2UoY29udGV4cCwgJyQxXFxuJDInKTtcbiAgICBwYWQgPSAwO1xuICAgIGZvcm1hdHRlZCA9ICcnO1xuICAgIGxpbmVzID0geG1sLnNwbGl0KCdcXG4nKTtcbiAgICBpbmRlbnQgPSAwO1xuICAgIGxhc3RUeXBlID0gJ290aGVyJztcbiAgICB0cmFuc2l0aW9ucyA9IHtcbiAgICAgICdzaW5nbGUtPnNpbmdsZSc6IDAsXG4gICAgICAnc2luZ2xlLT5jbG9zaW5nJzogLTEsXG4gICAgICAnc2luZ2xlLT5vcGVuaW5nJzogMCxcbiAgICAgICdzaW5nbGUtPm90aGVyJzogMCxcbiAgICAgICdjbG9zaW5nLT5zaW5nbGUnOiAwLFxuICAgICAgJ2Nsb3NpbmctPmNsb3NpbmcnOiAtMSxcbiAgICAgICdjbG9zaW5nLT5vcGVuaW5nJzogMCxcbiAgICAgICdjbG9zaW5nLT5vdGhlcic6IDAsXG4gICAgICAnb3BlbmluZy0+c2luZ2xlJzogMSxcbiAgICAgICdvcGVuaW5nLT5jbG9zaW5nJzogMCxcbiAgICAgICdvcGVuaW5nLT5vcGVuaW5nJzogMSxcbiAgICAgICdvcGVuaW5nLT5vdGhlcic6IDEsXG4gICAgICAnb3RoZXItPnNpbmdsZSc6IDAsXG4gICAgICAnb3RoZXItPmNsb3NpbmcnOiAtMSxcbiAgICAgICdvdGhlci0+b3BlbmluZyc6IDAsXG4gICAgICAnb3RoZXItPm90aGVyJzogMFxuICAgIH07XG4gICAgZm4gPSBmdW5jdGlvbihsbikge1xuICAgICAgdmFyIGZyb21Ubywgaiwga2V5LCBwYWRkaW5nLCB0eXBlLCB0eXBlcywgdmFsdWU7XG4gICAgICB0eXBlcyA9IHtcbiAgICAgICAgc2luZ2xlOiBCb29sZWFuKGxuLm1hdGNoKC88LitcXC8+LykpLFxuICAgICAgICBjbG9zaW5nOiBCb29sZWFuKGxuLm1hdGNoKC88XFwvLis+LykpLFxuICAgICAgICBvcGVuaW5nOiBCb29sZWFuKGxuLm1hdGNoKC88W14hP10uKj4vKSlcbiAgICAgIH07XG4gICAgICB0eXBlID0gKChmdW5jdGlvbigpIHtcbiAgICAgICAgdmFyIHJlc3VsdHM7XG4gICAgICAgIHJlc3VsdHMgPSBbXTtcbiAgICAgICAgZm9yIChrZXkgaW4gdHlwZXMpIHtcbiAgICAgICAgICB2YWx1ZSA9IHR5cGVzW2tleV07XG4gICAgICAgICAgaWYgKHZhbHVlKSB7XG4gICAgICAgICAgICByZXN1bHRzLnB1c2goa2V5KTtcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHJlc3VsdHM7XG4gICAgICB9KSgpKVswXTtcbiAgICAgIHR5cGUgPSB0eXBlID09PSB2b2lkIDAgPyAnb3RoZXInIDogdHlwZTtcbiAgICAgIGZyb21UbyA9IGxhc3RUeXBlICsgJy0+JyArIHR5cGU7XG4gICAgICBsYXN0VHlwZSA9IHR5cGU7XG4gICAgICBwYWRkaW5nID0gJyc7XG4gICAgICBpbmRlbnQgKz0gdHJhbnNpdGlvbnNbZnJvbVRvXTtcbiAgICAgIHBhZGRpbmcgPSAoKGZ1bmN0aW9uKCkge1xuICAgICAgICB2YXIgbSwgcmVmMSwgcmVzdWx0cztcbiAgICAgICAgcmVzdWx0cyA9IFtdO1xuICAgICAgICBmb3IgKGogPSBtID0gMCwgcmVmMSA9IGluZGVudDsgMCA8PSByZWYxID8gbSA8IHJlZjEgOiBtID4gcmVmMTsgaiA9IDAgPD0gcmVmMSA/ICsrbSA6IC0tbSkge1xuICAgICAgICAgIHJlc3VsdHMucHVzaCgnICAnKTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gcmVzdWx0cztcbiAgICAgIH0pKCkpLmpvaW4oJycpO1xuICAgICAgaWYgKGZyb21UbyA9PT0gJ29wZW5pbmctPmNsb3NpbmcnKSB7XG4gICAgICAgIGZvcm1hdHRlZCA9IGZvcm1hdHRlZC5zdWJzdHIoMCwgZm9ybWF0dGVkLmxlbmd0aCAtIDEpICsgbG4gKyAnXFxuJztcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIGZvcm1hdHRlZCArPSBwYWRkaW5nICsgbG4gKyAnXFxuJztcbiAgICAgIH1cbiAgICB9O1xuICAgIGZvciAobCA9IDAsIGxlbiA9IGxpbmVzLmxlbmd0aDsgbCA8IGxlbjsgbCsrKSB7XG4gICAgICBsbiA9IGxpbmVzW2xdO1xuICAgICAgZm4obG4pO1xuICAgIH1cbiAgICByZXR1cm4gZm9ybWF0dGVkO1xuICB9LFxuXG4gIC8vIHB1dHMgdGhlIHJlc3BvbnNlIGRhdGEgaW4gVUlcbiAgc2hvd1N0YXR1czogZnVuY3Rpb24ocmVzcG9uc2UpIHtcbiAgICB2YXIgdXJsLCBjb250ZW50O1xuICAgIGlmIChyZXNwb25zZS5jb250ZW50ID09PSB1bmRlZmluZWQpIHtcbiAgICAgIGNvbnRlbnQgPSByZXNwb25zZS5kYXRhO1xuICAgICAgdXJsID0gcmVzcG9uc2UudXJsO1xuICAgIH0gZWxzZSB7XG4gICAgICBjb250ZW50ID0gcmVzcG9uc2UuY29udGVudC5kYXRhO1xuICAgICAgdXJsID0gcmVzcG9uc2UucmVxdWVzdC51cmw7XG4gICAgfVxuICAgIHZhciBoZWFkZXJzID0gcmVzcG9uc2UuaGVhZGVycztcbiAgICBpZih0eXBlb2YgY29udGVudCA9PT0gJ3N0cmluZycpIHtcbiAgICAgIGNvbnRlbnQgPSBqUXVlcnkudHJpbShjb250ZW50KTtcbiAgICB9XG5cbiAgICAvLyBpZiBzZXJ2ZXIgaXMgbmljZSwgYW5kIHNlbmRzIGNvbnRlbnQtdHlwZSBiYWNrLCB3ZSBjYW4gdXNlIGl0XG4gICAgdmFyIGNvbnRlbnRUeXBlID0gbnVsbDtcbiAgICBpZiAoaGVhZGVycykge1xuICAgICAgY29udGVudFR5cGUgPSBoZWFkZXJzWydDb250ZW50LVR5cGUnXSB8fCBoZWFkZXJzWydjb250ZW50LXR5cGUnXTtcbiAgICAgIGlmIChjb250ZW50VHlwZSkge1xuICAgICAgICBjb250ZW50VHlwZSA9IGNvbnRlbnRUeXBlLnNwbGl0KCc7JylbMF0udHJpbSgpO1xuICAgICAgfVxuICAgIH1cblxuICAgICQoJy5yZXNwb25zZV9ib2R5JywgJCh0aGlzLmVsKSkucmVtb3ZlQ2xhc3MoJ2pzb24nKTtcbiAgICAkKCcucmVzcG9uc2VfYm9keScsICQodGhpcy5lbCkpLnJlbW92ZUNsYXNzKCd4bWwnKTtcblxuICAgIHZhciBzdXBwb3J0c0F1ZGlvUGxheWJhY2sgPSBmdW5jdGlvbihjb250ZW50VHlwZSl7XG4gICAgICB2YXIgYXVkaW9FbGVtZW50ID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnYXVkaW8nKTtcbiAgICAgIHJldHVybiAhIShhdWRpb0VsZW1lbnQuY2FuUGxheVR5cGUgJiYgYXVkaW9FbGVtZW50LmNhblBsYXlUeXBlKGNvbnRlbnRUeXBlKS5yZXBsYWNlKC9uby8sICcnKSk7XG4gICAgfTtcblxuICAgIHZhciBwcmU7XG4gICAgdmFyIGNvZGU7XG4gICAgdmFyIHNraXBIaWdobGlnaHQgPSBmYWxzZTtcbiAgICBpZiAoIWNvbnRlbnQpIHtcbiAgICAgIGNvZGUgPSAkKCc8Y29kZSAvPicpLnRleHQoJ25vIGNvbnRlbnQnKTtcbiAgICAgIHByZSA9ICQoJzxwcmUgY2xhc3M9XCJqc29uXCIgLz4nKS5hcHBlbmQoY29kZSk7XG5cbiAgICAgIC8vIEpTT05cbiAgICB9IGVsc2UgaWYgKFxuICAgICAgICBjb250ZW50VHlwZSA9PT0gJ2FwcGxpY2F0aW9uL29jdGV0LXN0cmVhbScgfHxcbiAgICAgICAgaGVhZGVyc1snQ29udGVudC1EaXNwb3NpdGlvbiddICYmICgvYXR0YWNobWVudC8pLnRlc3QoaGVhZGVyc1snQ29udGVudC1EaXNwb3NpdGlvbiddKSB8fFxuICAgICAgICBoZWFkZXJzWydjb250ZW50LWRpc3Bvc2l0aW9uJ10gJiYgKC9hdHRhY2htZW50LykudGVzdChoZWFkZXJzWydjb250ZW50LWRpc3Bvc2l0aW9uJ10pIHx8XG4gICAgICAgIGhlYWRlcnNbJ0NvbnRlbnQtRGVzY3JpcHRpb24nXSAmJiAoL0ZpbGUgVHJhbnNmZXIvKS50ZXN0KGhlYWRlcnNbJ0NvbnRlbnQtRGVzY3JpcHRpb24nXSkgfHxcbiAgICAgICAgaGVhZGVyc1snY29udGVudC1kZXNjcmlwdGlvbiddICYmICgvRmlsZSBUcmFuc2Zlci8pLnRlc3QoaGVhZGVyc1snY29udGVudC1kZXNjcmlwdGlvbiddKSkge1xuXG4gICAgICBpZiAoJ0Jsb2InIGluIHdpbmRvdykge1xuICAgICAgICB2YXIgdHlwZSA9IGNvbnRlbnRUeXBlIHx8ICd0ZXh0L2h0bWwnO1xuICAgICAgICB2YXIgYSA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ2EnKTtcbiAgICAgICAgdmFyIGhyZWY7XG5cbiAgICAgICAgaWYoe30udG9TdHJpbmcuYXBwbHkoY29udGVudCkgPT09ICdbb2JqZWN0IEJsb2JdJykge1xuICAgICAgICAgIGhyZWYgPSB3aW5kb3cuVVJMLmNyZWF0ZU9iamVjdFVSTChjb250ZW50KTtcbiAgICAgICAgfVxuICAgICAgICBlbHNlIHtcbiAgICAgICAgICB2YXIgYmluYXJ5RGF0YSA9IFtdO1xuICAgICAgICAgIGJpbmFyeURhdGEucHVzaChjb250ZW50KTtcbiAgICAgICAgICBocmVmID0gd2luZG93LlVSTC5jcmVhdGVPYmplY3RVUkwobmV3IEJsb2IoYmluYXJ5RGF0YSwge3R5cGU6IHR5cGV9KSk7XG4gICAgICAgIH1cbiAgICAgICAgdmFyIGZpbGVOYW1lID0gcmVzcG9uc2UudXJsLnN1YnN0cihyZXNwb25zZS51cmwubGFzdEluZGV4T2YoJy8nKSArIDEpO1xuICAgICAgICB2YXIgZG93bmxvYWQgPSBbdHlwZSwgZmlsZU5hbWUsIGhyZWZdLmpvaW4oJzonKTtcblxuICAgICAgICAvLyBVc2UgZmlsZW5hbWUgZnJvbSByZXNwb25zZSBoZWFkZXJcbiAgICAgICAgdmFyIGRpc3Bvc2l0aW9uID0gaGVhZGVyc1snY29udGVudC1kaXNwb3NpdGlvbiddIHx8IGhlYWRlcnNbJ0NvbnRlbnQtRGlzcG9zaXRpb24nXTtcbiAgICAgICAgaWYodHlwZW9mIGRpc3Bvc2l0aW9uICE9PSAndW5kZWZpbmVkJykge1xuICAgICAgICAgIHZhciByZXNwb25zZUZpbGVuYW1lID0gL2ZpbGVuYW1lPShbXjtdKik7Py8uZXhlYyhkaXNwb3NpdGlvbik7XG4gICAgICAgICAgaWYocmVzcG9uc2VGaWxlbmFtZSAhPT0gbnVsbCAmJiByZXNwb25zZUZpbGVuYW1lLmxlbmd0aCA+IDEpIHtcbiAgICAgICAgICAgIGRvd25sb2FkID0gcmVzcG9uc2VGaWxlbmFtZVsxXTtcbiAgICAgICAgICAgIGZpbGVOYW1lID0gZG93bmxvYWQ7XG4gICAgICAgICAgfVxuICAgICAgICB9XG5cbiAgICAgICAgYS5zZXRBdHRyaWJ1dGUoJ2hyZWYnLCBocmVmKTtcbiAgICAgICAgYS5zZXRBdHRyaWJ1dGUoJ2Rvd25sb2FkJywgZG93bmxvYWQpO1xuICAgICAgICBhLmlubmVyVGV4dCA9ICdEb3dubG9hZCAnICsgZmlsZU5hbWU7XG5cbiAgICAgICAgcHJlID0gJCgnPGRpdi8+JykuYXBwZW5kKGEpO1xuICAgICAgICBza2lwSGlnaGxpZ2h0ID0gdHJ1ZTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHByZSA9ICQoJzxwcmUgY2xhc3M9XCJqc29uXCIgLz4nKS5hcHBlbmQoJ0Rvd25sb2FkIGhlYWRlcnMgZGV0ZWN0ZWQgYnV0IHlvdXIgYnJvd3NlciBkb2VzIG5vdCBzdXBwb3J0IGRvd25sb2FkaW5nIGJpbmFyeSB2aWEgWEhSIChCbG9iKS4nKTtcbiAgICAgIH1cbiAgICB9IGVsc2UgaWYgKGNvbnRlbnRUeXBlID09PSAnYXBwbGljYXRpb24vanNvbicgfHwgL1xcK2pzb24kLy50ZXN0KGNvbnRlbnRUeXBlKSkge1xuICAgICAgdmFyIGpzb24gPSBudWxsO1xuICAgICAgdHJ5IHtcbiAgICAgICAganNvbiA9IEpTT04uc3RyaW5naWZ5KEpTT04ucGFyc2UoY29udGVudCksIG51bGwsICcgICcpO1xuICAgICAgfSBjYXRjaCAoX2Vycm9yKSB7XG4gICAgICAgIGpzb24gPSAnY2FuXFwndCBwYXJzZSBKU09OLiAgUmF3IHJlc3VsdDpcXG5cXG4nICsgY29udGVudDtcbiAgICAgIH1cbiAgICAgIGNvZGUgPSAkKCc8Y29kZSAvPicpLnRleHQoanNvbik7XG4gICAgICBwcmUgPSAkKCc8cHJlIGNsYXNzPVwianNvblwiIC8+JykuYXBwZW5kKGNvZGUpO1xuXG4gICAgICAvLyBYTUxcbiAgICB9IGVsc2UgaWYgKGNvbnRlbnRUeXBlID09PSAnYXBwbGljYXRpb24veG1sJyB8fCAvXFwreG1sJC8udGVzdChjb250ZW50VHlwZSkpIHtcbiAgICAgIGNvZGUgPSAkKCc8Y29kZSAvPicpLnRleHQodGhpcy5mb3JtYXRYbWwoY29udGVudCkpO1xuICAgICAgcHJlID0gJCgnPHByZSBjbGFzcz1cInhtbFwiIC8+JykuYXBwZW5kKGNvZGUpO1xuXG4gICAgICAvLyBIVE1MXG4gICAgfSBlbHNlIGlmIChjb250ZW50VHlwZSA9PT0gJ3RleHQvaHRtbCcpIHtcbiAgICAgIGNvZGUgPSAkKCc8Y29kZSAvPicpLmh0bWwoXy5lc2NhcGUoY29udGVudCkpO1xuICAgICAgcHJlID0gJCgnPHByZSBjbGFzcz1cInhtbFwiIC8+JykuYXBwZW5kKGNvZGUpO1xuXG4gICAgICAvLyBQbGFpbiBUZXh0XG4gICAgfSBlbHNlIGlmICgvdGV4dFxcL3BsYWluLy50ZXN0KGNvbnRlbnRUeXBlKSkge1xuICAgICAgY29kZSA9ICQoJzxjb2RlIC8+JykudGV4dChjb250ZW50KTtcbiAgICAgIHByZSA9ICQoJzxwcmUgY2xhc3M9XCJwbGFpblwiIC8+JykuYXBwZW5kKGNvZGUpO1xuXG4gICAgICAvLyBJbWFnZVxuICAgIH0gZWxzZSBpZiAoL15pbWFnZVxcLy8udGVzdChjb250ZW50VHlwZSkpIHtcbiAgICAgIHZhciB1cmxDcmVhdG9yID0gd2luZG93LlVSTCB8fCB3aW5kb3cud2Via2l0VVJMO1xuICAgICAgdmFyIGltYWdlVXJsID0gdXJsQ3JlYXRvci5jcmVhdGVPYmplY3RVUkwoY29udGVudCk7XG5cbiAgICAgIHByZSA9ICQoJzxpbWc+JykuYXR0ciggJ3NyYycsIGltYWdlVXJsKTtcbiAgICAgIC8vIEF1ZGlvXG4gICAgfSBlbHNlIGlmICgvXmF1ZGlvXFwvLy50ZXN0KGNvbnRlbnRUeXBlKSAmJiBzdXBwb3J0c0F1ZGlvUGxheWJhY2soY29udGVudFR5cGUpKSB7XG4gICAgICBwcmUgPSAkKCc8YXVkaW8gY29udHJvbHM+JykuYXBwZW5kKCQoJzxzb3VyY2U+JykuYXR0cignc3JjJywgdXJsKS5hdHRyKCd0eXBlJywgY29udGVudFR5cGUpKTtcbiAgICB9IGVsc2UgaWYoaGVhZGVycy5sb2NhdGlvbiB8fCBoZWFkZXJzLkxvY2F0aW9uKSB7XG4gICAgICAvLyBMb2NhdGlvbiBoZWFkZXIgYmFzZWQgcmVkaXJlY3QgZG93bmxvYWRcbiAgICAgIHdpbmRvdy5sb2NhdGlvbiA9IHJlc3BvbnNlLnVybDtcblxuICAgICAgLy8gQW55dGhpbmcgZWxzZSAoQ09SUylcbiAgICB9IGVsc2Uge1xuICAgICAgY29kZSA9ICQoJzxjb2RlIC8+JykudGV4dChjb250ZW50KTtcbiAgICAgIHByZSA9ICQoJzxwcmUgY2xhc3M9XCJqc29uXCIgLz4nKS5hcHBlbmQoY29kZSk7XG4gICAgfVxuICAgIHZhciByZXNwb25zZV9ib2R5ID0gcHJlO1xuICAgICQoJy5yZXF1ZXN0X3VybCcsICQodGhpcy5lbCkpLmh0bWwoJzxwcmU+PC9wcmU+Jyk7XG4gICAgJCgnLnJlcXVlc3RfdXJsIHByZScsICQodGhpcy5lbCkpLnRleHQodXJsKTtcbiAgICAkKCcucmVzcG9uc2VfY29kZScsICQodGhpcy5lbCkpLmh0bWwoJzxwcmU+JyArIHJlc3BvbnNlLnN0YXR1cyArICc8L3ByZT4nKTtcbiAgICAkKCcucmVzcG9uc2VfYm9keScsICQodGhpcy5lbCkpLmh0bWwocmVzcG9uc2VfYm9keSk7XG4gICAgJCgnLnJlc3BvbnNlX2hlYWRlcnMnLCAkKHRoaXMuZWwpKS5odG1sKCc8cHJlPicgKyBfLmVzY2FwZShKU09OLnN0cmluZ2lmeShyZXNwb25zZS5oZWFkZXJzLCBudWxsLCAnICAnKSkucmVwbGFjZSgvXFxuL2csICc8YnI+JykgKyAnPC9wcmU+Jyk7XG4gICAgJCgnLnJlc3BvbnNlJywgJCh0aGlzLmVsKSkuc2xpZGVEb3duKCk7XG4gICAgJCgnLnJlc3BvbnNlX2hpZGVyJywgJCh0aGlzLmVsKSkuc2hvdygpO1xuICAgICQoJy5yZXNwb25zZV90aHJvYmJlcicsICQodGhpcy5lbCkpLmhpZGUoKTtcblxuXG4gICAgLy8gYWRkcyBjdXJsIG91dHB1dFxuICAgIHZhciBjdXJsQ29tbWFuZCA9IHRoaXMubW9kZWwuYXNDdXJsKHRoaXMubWFwLCB7cmVzcG9uc2VDb250ZW50VHlwZTogY29udGVudFR5cGV9KTtcbiAgICBjdXJsQ29tbWFuZCA9IGN1cmxDb21tYW5kLnJlcGxhY2UoJyEnLCAnJiMzMzsnKTtcbiAgICAkKCAnZGl2LmN1cmwnLCAkKHRoaXMuZWwpKS5odG1sKCc8cHJlPicgKyBfLmVzY2FwZShjdXJsQ29tbWFuZCkgKyAnPC9wcmU+Jyk7XG5cbiAgICAvLyBvbmx5IGhpZ2hsaWdodCB0aGUgcmVzcG9uc2UgaWYgcmVzcG9uc2UgaXMgbGVzcyB0aGFuIHRocmVzaG9sZCwgZGVmYXVsdCBzdGF0ZSBpcyBoaWdobGlnaHQgcmVzcG9uc2VcbiAgICB2YXIgb3B0cyA9IHRoaXMub3B0aW9ucy5zd2FnZ2VyT3B0aW9ucztcblxuICAgIGlmIChvcHRzLnNob3dSZXF1ZXN0SGVhZGVycykge1xuICAgICAgdmFyIGZvcm0gPSAkKCcuc2FuZGJveCcsICQodGhpcy5lbCkpLFxuICAgICAgICAgIG1hcCA9IHRoaXMuZ2V0SW5wdXRNYXAoZm9ybSksXG4gICAgICAgICAgcmVxdWVzdEhlYWRlcnMgPSB0aGlzLm1vZGVsLmdldEhlYWRlclBhcmFtcyhtYXApO1xuICAgICAgZGVsZXRlIHJlcXVlc3RIZWFkZXJzWydDb250ZW50LVR5cGUnXTtcbiAgICAgICQoJy5yZXF1ZXN0X2hlYWRlcnMnLCAkKHRoaXMuZWwpKS5odG1sKCc8cHJlPicgKyBfLmVzY2FwZShKU09OLnN0cmluZ2lmeShyZXF1ZXN0SGVhZGVycywgbnVsbCwgJyAgJykpLnJlcGxhY2UoL1xcbi9nLCAnPGJyPicpICsgJzwvcHJlPicpO1xuICAgIH1cblxuICAgIC8vIENhbGwgdXNlci1kZWZpbmVkIGhvb2tcbiAgICBpZiAob3B0cy5yZXNwb25zZUhvb2tzICYmIG9wdHMucmVzcG9uc2VIb29rc1t0aGlzLm5pY2tuYW1lXSkge1xuICAgICAgb3B0cy5yZXNwb25zZUhvb2tzW3RoaXMubmlja25hbWVdKHJlc3BvbnNlLCB0aGlzKTtcbiAgICB9XG5cbiAgICB2YXIgcmVzcG9uc2VfYm9keV9lbCA9ICQoJy5yZXNwb25zZV9ib2R5JywgJCh0aGlzLmVsKSlbMF07XG4gICAgLy8gb25seSBoaWdobGlnaHQgdGhlIHJlc3BvbnNlIGlmIHJlc3BvbnNlIGlzIGxlc3MgdGhhbiB0aHJlc2hvbGQsIGRlZmF1bHQgc3RhdGUgaXMgaGlnaGxpZ2h0IHJlc3BvbnNlXG4gICAgaWYgKG9wdHMuaGlnaGxpZ2h0U2l6ZVRocmVzaG9sZCAmJiB0eXBlb2YgcmVzcG9uc2UuZGF0YSAhPT0gJ3VuZGVmaW5lZCcgJiYgcmVzcG9uc2UuZGF0YS5sZW5ndGggPiBvcHRzLmhpZ2hsaWdodFNpemVUaHJlc2hvbGQgfHwgc2tpcEhpZ2hsaWdodCkge1xuICAgICAgcmV0dXJuIHJlc3BvbnNlX2JvZHlfZWw7XG4gICAgfSBlbHNlIHtcbiAgICAgIHJldHVybiBobGpzLmhpZ2hsaWdodEJsb2NrKHJlc3BvbnNlX2JvZHlfZWwpO1xuICAgIH1cbiAgfSxcblxuICB0b2dnbGVPcGVyYXRpb25Db250ZW50OiBmdW5jdGlvbiAoZXZlbnQpIHtcbiAgICB2YXIgZWxlbSA9ICQoJyMnICsgRG9jcy5lc2NhcGVSZXNvdXJjZU5hbWUodGhpcy5wYXJlbnRJZCArICdfJyArIHRoaXMubmlja25hbWUgKyAnX2NvbnRlbnQnKSk7XG4gICAgaWYgKGVsZW0uaXMoJzp2aXNpYmxlJykpe1xuICAgICAgJC5iYnEucHVzaFN0YXRlKCcjLycsIDIpO1xuICAgICAgZXZlbnQucHJldmVudERlZmF1bHQoKTtcbiAgICAgIERvY3MuY29sbGFwc2VPcGVyYXRpb24oZWxlbSk7XG4gICAgfSBlbHNlIHtcbiAgICAgIERvY3MuZXhwYW5kT3BlcmF0aW9uKGVsZW0pO1xuICAgIH1cbiAgfSxcblxuICBnZXRUZXh0QXJlYVZhbHVlOiBmdW5jdGlvbih0ZXh0QXJlYSkge1xuICAgIHZhciBwYXJhbSwgcGFyc2VkLCByZXN1bHQsIGk7XG4gICAgaWYgKHRleHRBcmVhLnZhbHVlID09PSBudWxsIHx8IGpRdWVyeS50cmltKHRleHRBcmVhLnZhbHVlKS5sZW5ndGggPT09IDApIHtcbiAgICAgIHJldHVybiBudWxsO1xuICAgIH1cbiAgICBwYXJhbSA9IHRoaXMuZ2V0UGFyYW1CeU5hbWUodGV4dEFyZWEubmFtZSk7XG4gICAgaWYgKHBhcmFtICYmIHBhcmFtLnR5cGUgJiYgcGFyYW0udHlwZS50b0xvd2VyQ2FzZSgpID09PSAnYXJyYXknKSB7XG4gICAgICBwYXJzZWQgPSB0ZXh0QXJlYS52YWx1ZS5zcGxpdCgnXFxuJyk7XG4gICAgICByZXN1bHQgPSBbXTtcbiAgICAgIGZvciAoaSA9IDA7IGkgPCBwYXJzZWQubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgaWYgKHBhcnNlZFtpXSAhPT0gbnVsbCAmJiBqUXVlcnkudHJpbShwYXJzZWRbaV0pLmxlbmd0aCA+IDApIHtcbiAgICAgICAgICByZXN1bHQucHVzaChwYXJzZWRbaV0pO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgICByZXR1cm4gcmVzdWx0Lmxlbmd0aCA+IDAgPyByZXN1bHQgOiBudWxsO1xuICAgIH0gZWxzZSB7XG4gICAgICByZXR1cm4gdGV4dEFyZWEudmFsdWU7XG4gICAgfVxuICB9LFxuXG4gIHNob3dTbmlwcGV0OiBmdW5jdGlvbiAoKSB7XG4gICAgdmFyIGNvbnRlbnRUeXBlRWwgPSB0aGlzLiQoJ1tuYW1lPXJlc3BvbnNlQ29udGVudFR5cGVdJyk7XG4gICAgdmFyIHhtbFNuaXBwZXRFbCA9IHRoaXMuJCgnLm9wZXJhdGlvbi1zdGF0dXMgLnNuaXBwZXRfeG1sLCAucmVzcG9uc2UtY2xhc3MgLnNuaXBwZXRfeG1sJyk7XG4gICAgdmFyIGpzb25TbmlwcGV0RWwgPSB0aGlzLiQoJy5vcGVyYXRpb24tc3RhdHVzIC5zbmlwcGV0X2pzb24sIC5yZXNwb25zZS1jbGFzcyAuc25pcHBldF9qc29uJyk7XG4gICAgdmFyIGNvbnRlbnRUeXBlO1xuXG4gICAgaWYgKCFjb250ZW50VHlwZUVsLmxlbmd0aCkgeyByZXR1cm47IH1cbiAgICBjb250ZW50VHlwZSA9IGNvbnRlbnRUeXBlRWwudmFsKCk7XG5cbiAgICBpZiAoY29udGVudFR5cGUuaW5kZXhPZigneG1sJykgPiAtMSkge1xuICAgICAgeG1sU25pcHBldEVsLnNob3coKTtcbiAgICAgIGpzb25TbmlwcGV0RWwuaGlkZSgpO1xuICAgIH0gZWxzZSB7XG4gICAgICBqc29uU25pcHBldEVsLnNob3coKTtcbiAgICAgIHhtbFNuaXBwZXRFbC5oaWRlKCk7XG4gICAgfVxuICB9LFxuXG4gIGdldFBhcmFtQnlOYW1lOiBmdW5jdGlvbihuYW1lKSB7XG4gICAgdmFyIGk7XG4gICAgaWYgKHRoaXMubW9kZWwucGFyYW1ldGVycykge1xuICAgICAgZm9yKGkgPSAwOyBpIDwgdGhpcy5tb2RlbC5wYXJhbWV0ZXJzLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgIGlmICh0aGlzLm1vZGVsLnBhcmFtZXRlcnNbaV0ubmFtZSA9PT0gbmFtZSkge1xuICAgICAgICAgIHJldHVybiB0aGlzLm1vZGVsLnBhcmFtZXRlcnNbaV07XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuIG51bGw7XG4gIH1cblxufSk7XG4iLCIndXNlIHN0cmljdCc7XG5cblN3YWdnZXJVaS5WaWV3cy5QYXJhbWV0ZXJDb250ZW50VHlwZVZpZXcgPSBCYWNrYm9uZS5WaWV3LmV4dGVuZCh7XG4gIGluaXRpYWxpemU6IGZ1bmN0aW9uICAoKSB7fSxcblxuICByZW5kZXI6IGZ1bmN0aW9uKCl7XG4gICAgdGhpcy5tb2RlbC5wYXJhbWV0ZXJDb250ZW50VHlwZUlkID0gJ3BjdCcgKyBNYXRoLnJhbmRvbSgpO1xuICAgICQodGhpcy5lbCkuaHRtbChIYW5kbGViYXJzLnRlbXBsYXRlcy5wYXJhbWV0ZXJfY29udGVudF90eXBlKHRoaXMubW9kZWwpKTtcbiAgICByZXR1cm4gdGhpcztcbiAgfVxuXG59KTsiLCIndXNlIHN0cmljdCc7XG5cblN3YWdnZXJVaS5WaWV3cy5QYXJhbWV0ZXJWaWV3ID0gQmFja2JvbmUuVmlldy5leHRlbmQoe1xuICBldmVudHM6IHtcbiAgICAnY2hhbmdlIFtuYW1lPXBhcmFtZXRlckNvbnRlbnRUeXBlXScgOiAndG9nZ2xlUGFyYW1ldGVyU25pcHBldCdcbiAgfSxcblxuICBpbml0aWFsaXplOiBmdW5jdGlvbigpe1xuICAgIEhhbmRsZWJhcnMucmVnaXN0ZXJIZWxwZXIoJ2lzQXJyYXknLCBmdW5jdGlvbihwYXJhbSwgb3B0cykge1xuICAgICAgdmFyIHBhcmFtVHlwZSA9IHBhcmFtLnR5cGUgJiYgcGFyYW0udHlwZS50b0xvd2VyQ2FzZSgpO1xuICAgICAgaWYgKHBhcmFtVHlwZSA9PT0gJ2FycmF5JyB8fCBwYXJhbS5hbGxvd011bHRpcGxlKSB7XG4gICAgICAgIHJldHVybiBvcHRzLmZuKHRoaXMpO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgcmV0dXJuIG9wdHMuaW52ZXJzZSh0aGlzKTtcbiAgICAgIH1cbiAgICB9KTtcbiAgfSxcblxuICByZW5kZXI6IGZ1bmN0aW9uKCkge1xuICAgIHZhciB0eXBlID0gdGhpcy5tb2RlbC50eXBlIHx8IHRoaXMubW9kZWwuZGF0YVR5cGU7XG4gICAgdmFyIG1vZGVsVHlwZSA9IHRoaXMubW9kZWwubW9kZWxTaWduYXR1cmUudHlwZTtcbiAgICB2YXIgbW9kZWxEZWZpbml0aW9ucyA9IHRoaXMubW9kZWwubW9kZWxTaWduYXR1cmUuZGVmaW5pdGlvbnM7XG4gICAgdmFyIHNjaGVtYSA9IHRoaXMubW9kZWwuc2NoZW1hIHx8IHt9O1xuICAgIHZhciBjb25zdW1lcyA9IHRoaXMubW9kZWwuY29uc3VtZXMgfHwgW107XG4gICAgdmFyIHNhbXBsZUpTT04sIHNpZ25hdHVyZVZpZXc7XG5cbiAgICBpZiAodHlwZW9mIHR5cGUgPT09ICd1bmRlZmluZWQnKSB7XG4gICAgICBpZiAoc2NoZW1hLiRyZWYpIHtcbiAgICAgICAgdmFyIHJlZiA9IHNjaGVtYS4kcmVmO1xuICAgICAgICBpZiAocmVmLmluZGV4T2YoJyMvZGVmaW5pdGlvbnMvJykgPT09IDApIHtcbiAgICAgICAgICB0eXBlID0gcmVmLnN1YnN0cmluZygnIy9kZWZpbml0aW9ucy8nLmxlbmd0aCk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgdHlwZSA9IHJlZjtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cblxuICAgIHRoaXMubW9kZWwudHlwZSA9IHR5cGU7XG4gICAgdGhpcy5tb2RlbC5wYXJhbVR5cGUgPSB0aGlzLm1vZGVsLmluIHx8IHRoaXMubW9kZWwucGFyYW1UeXBlO1xuICAgIHRoaXMubW9kZWwuaXNCb2R5ID0gdGhpcy5tb2RlbC5wYXJhbVR5cGUgPT09ICdib2R5JyB8fCB0aGlzLm1vZGVsLmluID09PSAnYm9keSc7XG4gICAgdGhpcy5tb2RlbC5pc0ZpbGUgPSB0eXBlICYmIHR5cGUudG9Mb3dlckNhc2UoKSA9PT0gJ2ZpbGUnO1xuXG4gICAgLy8gQWxsb3cgZm9yIGRlZmF1bHQgPT09IGZhbHNlXG4gICAgaWYodHlwZW9mIHRoaXMubW9kZWwuZGVmYXVsdCA9PT0gJ3VuZGVmaW5lZCcpIHtcbiAgICAgIHRoaXMubW9kZWwuZGVmYXVsdCA9IHRoaXMubW9kZWwuZGVmYXVsdFZhbHVlO1xuICAgIH1cblxuICAgIHRoaXMubW9kZWwuaGFzRGVmYXVsdCA9ICh0eXBlb2YgdGhpcy5tb2RlbC5kZWZhdWx0ICE9PSAndW5kZWZpbmVkJyk7XG4gICAgdGhpcy5tb2RlbC52YWx1ZUlkID0gJ20nICsgdGhpcy5tb2RlbC5uYW1lICsgTWF0aC5yYW5kb20oKTtcblxuICAgIGlmICh0aGlzLm1vZGVsLmFsbG93YWJsZVZhbHVlcykge1xuICAgICAgdGhpcy5tb2RlbC5pc0xpc3QgPSB0cnVlO1xuICAgIH1cblxuICAgIHZhciBpc1hNTCA9IHRoaXMuY29udGFpbnMoY29uc3VtZXMsICd4bWwnKTtcbiAgICB2YXIgaXNKU09OID0gaXNYTUwgPyB0aGlzLmNvbnRhaW5zKGNvbnN1bWVzLCAnanNvbicpIDogdHJ1ZTtcbiAgICBzYW1wbGVKU09OID0gU3dhZ2dlclVpLnBhcnRpYWxzLnNpZ25hdHVyZS5jcmVhdGVQYXJhbWV0ZXJKU09OU2FtcGxlKG1vZGVsVHlwZSwgbW9kZWxEZWZpbml0aW9ucyk7XG5cbiAgICB2YXIgdGVtcGxhdGUgPSB0aGlzLnRlbXBsYXRlKCk7XG4gICAgJCh0aGlzLmVsKS5odG1sKHRlbXBsYXRlKHRoaXMubW9kZWwpKTtcblxuICAgIHZhciBzaWduYXR1cmVNb2RlbCA9IHtcbiAgICAgIHNhbXBsZUpTT046IGlzSlNPTiA/IHNhbXBsZUpTT04gOiBmYWxzZSxcbiAgICAgIHNhbXBsZVhNTDogc2FtcGxlSlNPTiAmJiBpc1hNTCA/IFN3YWdnZXJVaS5wYXJ0aWFscy5zaWduYXR1cmUuY3JlYXRlWE1MU2FtcGxlKCcnLCBzY2hlbWEsIG1vZGVsRGVmaW5pdGlvbnMsIHRydWUpIDogZmFsc2UsXG4gICAgICBpc1BhcmFtOiB0cnVlLFxuICAgICAgc2lnbmF0dXJlOiBTd2FnZ2VyVWkucGFydGlhbHMuc2lnbmF0dXJlLmdldFBhcmFtZXRlck1vZGVsU2lnbmF0dXJlKG1vZGVsVHlwZSwgbW9kZWxEZWZpbml0aW9ucyksXG4gICAgICBkZWZhdWx0UmVuZGVyaW5nOiB0aGlzLm1vZGVsLmRlZmF1bHRSZW5kZXJpbmdcbiAgICB9O1xuXG4gICAgaWYgKHNhbXBsZUpTT04pIHtcbiAgICAgIHNpZ25hdHVyZVZpZXcgPSBuZXcgU3dhZ2dlclVpLlZpZXdzLlNpZ25hdHVyZVZpZXcoe21vZGVsOiBzaWduYXR1cmVNb2RlbCwgdGFnTmFtZTogJ2Rpdid9KTtcbiAgICAgICQoJy5tb2RlbC1zaWduYXR1cmUnLCAkKHRoaXMuZWwpKS5hcHBlbmQoc2lnbmF0dXJlVmlldy5yZW5kZXIoKS5lbCk7XG4gICAgfVxuICAgIGVsc2Uge1xuICAgICAgJCgnLm1vZGVsLXNpZ25hdHVyZScsICQodGhpcy5lbCkpLmh0bWwodGhpcy5tb2RlbC5zaWduYXR1cmUpO1xuICAgIH1cblxuICAgIHZhciBpc1BhcmFtID0gZmFsc2U7XG5cbiAgICBpZiggdGhpcy5vcHRpb25zLnN3YWdnZXJPcHRpb25zLmpzb25FZGl0b3IgJiYgdGhpcy5tb2RlbC5pc0JvZHkgJiYgdGhpcy5tb2RlbC5zY2hlbWEpe1xuICAgICAgdmFyICRzZWxmID0gJCh0aGlzLmVsKTtcbiAgICAgIHRoaXMubW9kZWwuanNvbkVkaXRvciA9XG4gICAgICAgIC8qIGdsb2JhbCBKU09ORWRpdG9yICovXG4gICAgICAgIG5ldyBKU09ORWRpdG9yKCQoJy5lZGl0b3JfaG9sZGVyJywgJHNlbGYpWzBdLFxuICAgICAgICAgICAgICAgICAgICAgICB7c2NoZW1hOiB0aGlzLm1vZGVsLnNjaGVtYSwgc3RhcnR2YWwgOiB0aGlzLm1vZGVsLmRlZmF1bHQsXG4gICAgICAgICAgICAgICAgICAgICAgICBhamF4OnRydWUsXG4gICAgICAgICAgICAgICAgICAgICAgICBkaXNhYmxlX3Byb3BlcnRpZXM6dHJ1ZSxcbiAgICAgICAgICAgICAgICAgICAgICAgIGRpc2FibGVfZWRpdF9qc29uOnRydWUsXG4gICAgICAgICAgICAgICAgICAgICAgICBpY29ubGliOiAnc3dhZ2dlcicgfSk7XG4gICAgICAvLyBUaGlzIGlzIHNvIHRoYXQgdGhlIHNpZ25hdHVyZSBjYW4gc2VuZCBiYWNrIHRoZSBzYW1wbGUgdG8gdGhlIGpzb24gZWRpdG9yXG4gICAgICAvLyBUT0RPOiBTaWduYXR1cmVWaWV3IHNob3VsZCBleHBvc2UgYW4gZXZlbnQgXCJvblNhbXBsZUNsaWNrZWRcIiBpbnN0ZWFkXG4gICAgICBzaWduYXR1cmVNb2RlbC5qc29uRWRpdG9yID0gdGhpcy5tb2RlbC5qc29uRWRpdG9yO1xuICAgICAgJCgnLmJvZHktdGV4dGFyZWEnLCAkc2VsZikuaGlkZSgpO1xuICAgICAgJCgnLmVkaXRvcl9ob2xkZXInLCAkc2VsZikuc2hvdygpO1xuICAgICAgJCgnLnBhcmFtZXRlci1jb250ZW50LXR5cGUnLCAkc2VsZilcbiAgICAgICAgLmNoYW5nZShmdW5jdGlvbihlKXtcbiAgICAgICAgICAgIGlmKGUudGFyZ2V0LnZhbHVlID09PSAnYXBwbGljYXRpb24veG1sJyl7XG4gICAgICAgICAgICAgICQoJy5ib2R5LXRleHRhcmVhJywgJHNlbGYpLnNob3coKTtcbiAgICAgICAgICAgICAgJCgnLmVkaXRvcl9ob2xkZXInLCAkc2VsZikuaGlkZSgpO1xuICAgICAgICAgICAgICB0aGlzLm1vZGVsLmpzb25FZGl0b3IuZGlzYWJsZSgpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICAgICQoJy5ib2R5LXRleHRhcmVhJywgJHNlbGYpLmhpZGUoKTtcbiAgICAgICAgICAgICAgJCgnLmVkaXRvcl9ob2xkZXInLCAkc2VsZikuc2hvdygpO1xuICAgICAgICAgICAgICB0aGlzLm1vZGVsLmpzb25FZGl0b3IuZW5hYmxlKCk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH0pO1xuICAgICAgfVxuXG5cbiAgICBpZiAodGhpcy5tb2RlbC5pc0JvZHkpIHtcbiAgICAgIGlzUGFyYW0gPSB0cnVlO1xuICAgIH1cblxuICAgIHZhciBjb250ZW50VHlwZU1vZGVsID0ge1xuICAgICAgaXNQYXJhbTogaXNQYXJhbVxuICAgIH07XG5cbiAgICBjb250ZW50VHlwZU1vZGVsLmNvbnN1bWVzID0gdGhpcy5tb2RlbC5jb25zdW1lcztcblxuICAgIGlmIChpc1BhcmFtKSB7XG4gICAgICB2YXIgcGFyYW1ldGVyQ29udGVudFR5cGVWaWV3ID0gbmV3IFN3YWdnZXJVaS5WaWV3cy5QYXJhbWV0ZXJDb250ZW50VHlwZVZpZXcoe21vZGVsOiBjb250ZW50VHlwZU1vZGVsfSk7XG4gICAgICAkKCcucGFyYW1ldGVyLWNvbnRlbnQtdHlwZScsICQodGhpcy5lbCkpLmFwcGVuZChwYXJhbWV0ZXJDb250ZW50VHlwZVZpZXcucmVuZGVyKCkuZWwpO1xuICAgICAgdGhpcy50b2dnbGVQYXJhbWV0ZXJTbmlwcGV0KCk7XG4gICAgfVxuXG4gICAgZWxzZSB7XG4gICAgICB2YXIgcmVzcG9uc2VDb250ZW50VHlwZVZpZXcgPSBuZXcgU3dhZ2dlclVpLlZpZXdzLlJlc3BvbnNlQ29udGVudFR5cGVWaWV3KHttb2RlbDogY29udGVudFR5cGVNb2RlbH0pO1xuICAgICAgJCgnLnJlc3BvbnNlLWNvbnRlbnQtdHlwZScsICQodGhpcy5lbCkpLmFwcGVuZChyZXNwb25zZUNvbnRlbnRUeXBlVmlldy5yZW5kZXIoKS5lbCk7XG4gICAgICB0aGlzLnRvZ2dsZVJlc3BvbnNlU25pcHBldCgpO1xuICAgIH1cblxuICAgIHJldHVybiB0aGlzO1xuICB9LFxuXG4gIGNvbnRhaW5zOiBmdW5jdGlvbiAoY29uc3VtZXMsIHR5cGUpIHtcbiAgICByZXR1cm4gY29uc3VtZXMuZmlsdGVyKGZ1bmN0aW9uICh2YWwpIHtcbiAgICAgIGlmICh2YWwuaW5kZXhPZih0eXBlKSA+IC0xKSB7XG4gICAgICAgIHJldHVybiB0cnVlO1xuICAgICAgfVxuICAgIH0pLmxlbmd0aDtcbiAgfSxcblxuICB0b2dnbGVQYXJhbWV0ZXJTbmlwcGV0OiBmdW5jdGlvbiAoKSB7XG4gICAgdmFyIGNvbnRlbnRUeXBlID0gdGhpcy4kKCdbbmFtZT1wYXJhbWV0ZXJDb250ZW50VHlwZV0nKS52YWwoKTtcblxuICAgIHRoaXMudG9nZ2xlU25pcHBldChjb250ZW50VHlwZSk7XG4gIH0sXG5cbiAgdG9nZ2xlUmVzcG9uc2VTbmlwcGV0OiBmdW5jdGlvbiAoKSB7XG4gICAgdmFyIGNvbnRlbnRFbCA9IHRoaXMuJCgnW25hbWU9cmVzcG9uc2VDb250ZW50VHlwZV0nKTtcblxuICAgIGlmICghY29udGVudEVsLmxlbmd0aCkgeyByZXR1cm47IH1cblxuICAgIHRoaXMudG9nZ2xlU25pcHBldChjb250ZW50RWwudmFsKCkpO1xuICB9LFxuXG4gIHRvZ2dsZVNuaXBwZXQ6IGZ1bmN0aW9uICh0eXBlKSB7XG4gICAgdHlwZSA9IHR5cGUgfHwgJyc7XG4gICAgaWYgKHR5cGUuaW5kZXhPZigneG1sJykgPiAtMSkge1xuICAgICAgdGhpcy4kKCcuc25pcHBldF94bWwnKS5zaG93KCk7XG4gICAgICB0aGlzLiQoJy5zbmlwcGV0X2pzb24nKS5oaWRlKCk7XG4gICAgfSBlbHNlIHtcbiAgICAgIHRoaXMuJCgnLnNuaXBwZXRfanNvbicpLnNob3coKTtcbiAgICAgIHRoaXMuJCgnLnNuaXBwZXRfeG1sJykuaGlkZSgpO1xuICAgIH1cbiAgfSxcblxuICAvLyBSZXR1cm4gYW4gYXBwcm9wcmlhdGUgdGVtcGxhdGUgYmFzZWQgb24gaWYgdGhlIHBhcmFtZXRlciBpcyBhIGxpc3QsIHJlYWRvbmx5LCByZXF1aXJlZFxuICB0ZW1wbGF0ZTogZnVuY3Rpb24oKXtcbiAgICBpZiAodGhpcy5tb2RlbC5pc0xpc3QpIHtcbiAgICAgIHJldHVybiBIYW5kbGViYXJzLnRlbXBsYXRlcy5wYXJhbV9saXN0O1xuICAgIH0gZWxzZSB7XG4gICAgICBpZiAodGhpcy5vcHRpb25zLnJlYWRPbmx5KSB7XG4gICAgICAgIGlmICh0aGlzLm1vZGVsLnJlcXVpcmVkKSB7XG4gICAgICAgICAgcmV0dXJuIEhhbmRsZWJhcnMudGVtcGxhdGVzLnBhcmFtX3JlYWRvbmx5X3JlcXVpcmVkO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIHJldHVybiBIYW5kbGViYXJzLnRlbXBsYXRlcy5wYXJhbV9yZWFkb25seTtcbiAgICAgICAgfVxuICAgICAgfSBlbHNlIHtcbiAgICAgICAgaWYgKHRoaXMubW9kZWwucmVxdWlyZWQpIHtcbiAgICAgICAgICByZXR1cm4gSGFuZGxlYmFycy50ZW1wbGF0ZXMucGFyYW1fcmVxdWlyZWQ7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgcmV0dXJuIEhhbmRsZWJhcnMudGVtcGxhdGVzLnBhcmFtO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuICB9XG59KTtcbiIsIid1c2Ugc3RyaWN0JztcblxuLyoganNoaW50IC1XMTIyICovXG5Td2FnZ2VyVWkucGFydGlhbHMuc2lnbmF0dXJlID0gKGZ1bmN0aW9uICgpIHtcbiAgLy8gY29weS1wYXN0ZWQgZnJvbSBzd2FnZ2VyLWpzXG4gIHZhciByZXNvbHZlU2NoZW1hID0gZnVuY3Rpb24gKHNjaGVtYSkge1xuICAgIGlmIChfLmlzUGxhaW5PYmplY3Qoc2NoZW1hLnNjaGVtYSkpIHtcbiAgICAgIHNjaGVtYSA9IHJlc29sdmVTY2hlbWEoc2NoZW1hLnNjaGVtYSk7XG4gICAgfVxuXG4gICAgcmV0dXJuIHNjaGVtYTtcbiAgfTtcblxuICAvLyBjb3B5LXBhc3RlZCBmcm9tIHN3YWdnZXItanNcbiAgdmFyIHNpbXBsZVJlZiA9IGZ1bmN0aW9uIChuYW1lKSB7XG4gICAgaWYgKHR5cGVvZiBuYW1lID09PSAndW5kZWZpbmVkJykge1xuICAgICAgcmV0dXJuIG51bGw7XG4gICAgfVxuXG4gICAgaWYgKG5hbWUuaW5kZXhPZignIy9kZWZpbml0aW9ucy8nKSA9PT0gMCkge1xuICAgICAgcmV0dXJuIG5hbWUuc3Vic3RyaW5nKCcjL2RlZmluaXRpb25zLycubGVuZ3RoKTtcbiAgICB9IGVsc2Uge1xuICAgICAgcmV0dXJuIG5hbWU7XG4gICAgfVxuICB9O1xuXG4gIC8vIGNvcHktcGFzdGVkIGZyb20gc3dhZ2dlci1qc1xuICB2YXIgZ2V0SW5saW5lTW9kZWwgPSBmdW5jdGlvbihpbmxpbmVTdHIpIHtcbiAgICBpZigvXklubGluZSBNb2RlbCBcXGQrJC8udGVzdChpbmxpbmVTdHIpICYmIHRoaXMuaW5saW5lTW9kZWxzKSB7XG4gICAgICB2YXIgaWQgPSBwYXJzZUludChpbmxpbmVTdHIuc3Vic3RyKCdJbmxpbmUgTW9kZWwnLmxlbmd0aCkudHJpbSgpLDEwKTsgLy9cbiAgICAgIHZhciBtb2RlbCA9IHRoaXMuaW5saW5lTW9kZWxzW2lkXTtcbiAgICAgIHJldHVybiBtb2RlbDtcbiAgICB9XG4gICAgLy8gSSdtIHJldHVybmluZyBudWxsIGhlcmUsIHNob3VsZCBJIHJhdGhlciB0aHJvdyBhbiBlcnJvcj9cbiAgICByZXR1cm4gbnVsbDtcbiAgfTtcblxuICAvLyBjb3B5LXBhc3RlZCBmcm9tIHN3YWdnZXItanNcbiAgdmFyIGZvcm1hdFhtbCA9IGZ1bmN0aW9uKHhtbCkge1xuICAgIHZhciBjb250ZXhwLCBmbiwgZm9ybWF0dGVkLCBpbmRlbnQsIGwsIGxhc3RUeXBlLCBsZW4sIGxpbmVzLCBsbiwgcGFkLCByZWcsIHRyYW5zaXRpb25zLCB3c2V4cDtcbiAgICByZWcgPSAvKD4pKDwpKFxcLyopL2c7XG4gICAgd3NleHAgPSAvWyBdKiguKilbIF0rXFxuL2c7XG4gICAgY29udGV4cCA9IC8oPC4rPikoLitcXG4pL2c7XG4gICAgeG1sID0geG1sLnJlcGxhY2UocmVnLCAnJDFcXG4kMiQzJykucmVwbGFjZSh3c2V4cCwgJyQxXFxuJykucmVwbGFjZShjb250ZXhwLCAnJDFcXG4kMicpO1xuICAgIHBhZCA9IDA7XG4gICAgZm9ybWF0dGVkID0gJyc7XG4gICAgbGluZXMgPSB4bWwuc3BsaXQoJ1xcbicpO1xuICAgIGluZGVudCA9IDA7XG4gICAgbGFzdFR5cGUgPSAnb3RoZXInO1xuICAgIHRyYW5zaXRpb25zID0ge1xuICAgICAgJ3NpbmdsZS0+c2luZ2xlJzogMCxcbiAgICAgICdzaW5nbGUtPmNsb3NpbmcnOiAtMSxcbiAgICAgICdzaW5nbGUtPm9wZW5pbmcnOiAwLFxuICAgICAgJ3NpbmdsZS0+b3RoZXInOiAwLFxuICAgICAgJ2Nsb3NpbmctPnNpbmdsZSc6IDAsXG4gICAgICAnY2xvc2luZy0+Y2xvc2luZyc6IC0xLFxuICAgICAgJ2Nsb3NpbmctPm9wZW5pbmcnOiAwLFxuICAgICAgJ2Nsb3NpbmctPm90aGVyJzogMCxcbiAgICAgICdvcGVuaW5nLT5zaW5nbGUnOiAxLFxuICAgICAgJ29wZW5pbmctPmNsb3NpbmcnOiAwLFxuICAgICAgJ29wZW5pbmctPm9wZW5pbmcnOiAxLFxuICAgICAgJ29wZW5pbmctPm90aGVyJzogMSxcbiAgICAgICdvdGhlci0+c2luZ2xlJzogMCxcbiAgICAgICdvdGhlci0+Y2xvc2luZyc6IC0xLFxuICAgICAgJ290aGVyLT5vcGVuaW5nJzogMCxcbiAgICAgICdvdGhlci0+b3RoZXInOiAwXG4gICAgfTtcbiAgICBmbiA9IGZ1bmN0aW9uKGxuKSB7XG4gICAgICB2YXIgZnJvbVRvLCBqLCBrZXksIHBhZGRpbmcsIHR5cGUsIHR5cGVzLCB2YWx1ZTtcbiAgICAgIHR5cGVzID0ge1xuICAgICAgICBzaW5nbGU6IEJvb2xlYW4obG4ubWF0Y2goLzwuK1xcLz4vKSksXG4gICAgICAgIGNsb3Npbmc6IEJvb2xlYW4obG4ubWF0Y2goLzxcXC8uKz4vKSksXG4gICAgICAgIG9wZW5pbmc6IEJvb2xlYW4obG4ubWF0Y2goLzxbXiE/XS4qPi8pKVxuICAgICAgfTtcbiAgICAgIHR5cGUgPSAoKGZ1bmN0aW9uKCkge1xuICAgICAgICB2YXIgcmVzdWx0cztcbiAgICAgICAgcmVzdWx0cyA9IFtdO1xuICAgICAgICBmb3IgKGtleSBpbiB0eXBlcykge1xuICAgICAgICAgIHZhbHVlID0gdHlwZXNba2V5XTtcbiAgICAgICAgICBpZiAodmFsdWUpIHtcbiAgICAgICAgICAgIHJlc3VsdHMucHVzaChrZXkpO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gcmVzdWx0cztcbiAgICAgIH0pKCkpWzBdO1xuICAgICAgdHlwZSA9IHR5cGUgPT09IHZvaWQgMCA/ICdvdGhlcicgOiB0eXBlO1xuICAgICAgZnJvbVRvID0gbGFzdFR5cGUgKyAnLT4nICsgdHlwZTtcbiAgICAgIGxhc3RUeXBlID0gdHlwZTtcbiAgICAgIHBhZGRpbmcgPSAnJztcbiAgICAgIGluZGVudCArPSB0cmFuc2l0aW9uc1tmcm9tVG9dO1xuICAgICAgcGFkZGluZyA9ICgoZnVuY3Rpb24oKSB7XG4gICAgICAgIHZhciBtLCByZWYxLCByZXN1bHRzO1xuICAgICAgICByZXN1bHRzID0gW107XG4gICAgICAgIGZvciAoaiA9IG0gPSAwLCByZWYxID0gaW5kZW50OyAwIDw9IHJlZjEgPyBtIDwgcmVmMSA6IG0gPiByZWYxOyBqID0gMCA8PSByZWYxID8gKyttIDogLS1tKSB7XG4gICAgICAgICAgcmVzdWx0cy5wdXNoKCcgICcpO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiByZXN1bHRzO1xuICAgICAgfSkoKSkuam9pbignJyk7XG4gICAgICBpZiAoZnJvbVRvID09PSAnb3BlbmluZy0+Y2xvc2luZycpIHtcbiAgICAgICAgZm9ybWF0dGVkID0gZm9ybWF0dGVkLnN1YnN0cigwLCBmb3JtYXR0ZWQubGVuZ3RoIC0gMSkgKyBsbiArICdcXG4nO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgZm9ybWF0dGVkICs9IHBhZGRpbmcgKyBsbiArICdcXG4nO1xuICAgICAgfVxuICAgIH07XG4gICAgZm9yIChsID0gMCwgbGVuID0gbGluZXMubGVuZ3RoOyBsIDwgbGVuOyBsKyspIHtcbiAgICAgIGxuID0gbGluZXNbbF07XG4gICAgICBmbihsbik7XG4gICAgfVxuICAgIHJldHVybiBmb3JtYXR0ZWQ7XG4gIH07XG5cbiAgLy8gY29weS1wYXN0ZWQgZnJvbSBzd2FnZ2VyLWpzXG4gIHZhciBnZXRNb2RlbFNpZ25hdHVyZSA9IGZ1bmN0aW9uIChuYW1lLCBzY2hlbWEsIG1vZGVscywgbW9kZWxQcm9wZXJ0eU1hY3JvKSB7XG4gICAgdmFyIHN0cm9uZ09wZW4gPSAnPHNwYW4gY2xhc3M9XCJzdHJvbmdcIj4nO1xuICAgIHZhciBzdHJvbmdDbG9zZSA9ICc8L3NwYW4+JztcblxuICAgIHZhciBvcHRpb25IdG1sID0gZnVuY3Rpb24gKGxhYmVsLCB2YWx1ZSkge1xuICAgICAgcmV0dXJuICc8dHI+PHRkIGNsYXNzPVwib3B0aW9uTmFtZVwiPicgKyBsYWJlbCArICc6PC90ZD48dGQ+JyArIHZhbHVlICsgJzwvdGQ+PC90cj4nO1xuICAgIH07XG5cblxuICAgIC8vIEFsbG93IGZvciBpZ25vcmluZyB0aGUgJ25hbWUnIGFyZ3VtZW50Li4uLiBzaGlmdGluZyB0aGUgcmVzdFxuICAgIGlmKF8uaXNPYmplY3QoYXJndW1lbnRzWzBdKSkge1xuICAgICAgbmFtZSA9IHZvaWQgMDtcbiAgICAgIHNjaGVtYSA9IGFyZ3VtZW50c1swXTtcbiAgICAgIG1vZGVscyA9IGFyZ3VtZW50c1sxXTtcbiAgICAgIG1vZGVsUHJvcGVydHlNYWNybyA9IGFyZ3VtZW50c1syXTtcbiAgICB9XG5cbiAgICBtb2RlbHMgPSBtb2RlbHMgfHwge307XG5cbiAgICAvLyBSZXNvbHZlIHRoZSBzY2hlbWEgKEhhbmRsZSBuZXN0ZWQgc2NoZW1hcylcbiAgICBzY2hlbWEgPSByZXNvbHZlU2NoZW1hKHNjaGVtYSk7XG5cbiAgICAvLyBSZXR1cm4gZm9yIGVtcHR5IG9iamVjdFxuICAgIGlmKF8uaXNFbXB0eShzY2hlbWEpKSB7XG4gICAgICByZXR1cm4gc3Ryb25nT3BlbiArICdFbXB0eScgKyBzdHJvbmdDbG9zZTtcbiAgICB9XG5cbiAgICAvLyBEZXJlZmVyZW5jZSAkcmVmIGZyb20gJ21vZGVscydcbiAgICBpZih0eXBlb2Ygc2NoZW1hLiRyZWYgPT09ICdzdHJpbmcnKSB7XG4gICAgICBuYW1lID0gc2ltcGxlUmVmKHNjaGVtYS4kcmVmKTtcbiAgICAgIHNjaGVtYSA9IG1vZGVsc1tuYW1lXTtcbiAgICAgIGlmKHR5cGVvZiBzY2hlbWEgPT09ICd1bmRlZmluZWQnKVxuICAgICAge1xuICAgICAgICByZXR1cm4gc3Ryb25nT3BlbiArIG5hbWUgKyAnIGlzIG5vdCBkZWZpbmVkIScgKyBzdHJvbmdDbG9zZTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICBpZih0eXBlb2YgbmFtZSAhPT0gJ3N0cmluZycpIHtcbiAgICAgIG5hbWUgPSBzY2hlbWEudGl0bGUgfHwgJ0lubGluZSBNb2RlbCc7XG4gICAgfVxuXG4gICAgLy8gSWYgd2UgYXJlIGEgTW9kZWwgb2JqZWN0Li4uIGFkanVzdCBhY2NvcmRpbmdseVxuICAgIGlmKHNjaGVtYS5kZWZpbml0aW9uKSB7XG4gICAgICBzY2hlbWEgPSBzY2hlbWEuZGVmaW5pdGlvbjtcbiAgICB9XG5cbiAgICBpZih0eXBlb2YgbW9kZWxQcm9wZXJ0eU1hY3JvICE9PSAnZnVuY3Rpb24nKSB7XG4gICAgICBtb2RlbFByb3BlcnR5TWFjcm8gPSBmdW5jdGlvbihwcm9wKXtcbiAgICAgICAgcmV0dXJuIChwcm9wIHx8IHt9KS5kZWZhdWx0O1xuICAgICAgfTtcbiAgICB9XG5cbiAgICB2YXIgcmVmZXJlbmNlcyA9IHt9O1xuICAgIHZhciBzZWVuTW9kZWxzID0gW107XG4gICAgdmFyIGlubGluZU1vZGVscyA9IDA7XG5cbiAgICAvLyBHZW5lcmF0ZSBjdXJyZW50IEhUTUxcbiAgICB2YXIgaHRtbCA9IHByb2Nlc3NNb2RlbChzY2hlbWEsIG5hbWUpO1xuXG4gICAgLy8gR2VuZXJhdGUgcmVmZXJlbmNlcyBIVE1MXG4gICAgd2hpbGUgKF8ua2V5cyhyZWZlcmVuY2VzKS5sZW5ndGggPiAwKSB7XG4gICAgICAvKiBqc2hpbnQgaWdub3JlOnN0YXJ0ICovXG4gICAgICBfLmZvckVhY2gocmVmZXJlbmNlcywgZnVuY3Rpb24gKHNjaGVtYSwgbmFtZSkge1xuICAgICAgICB2YXIgc2Vlbk1vZGVsID0gXy5pbmRleE9mKHNlZW5Nb2RlbHMsIG5hbWUpID4gLTE7XG5cbiAgICAgICAgZGVsZXRlIHJlZmVyZW5jZXNbbmFtZV07XG5cbiAgICAgICAgaWYgKCFzZWVuTW9kZWwpIHtcbiAgICAgICAgICBzZWVuTW9kZWxzLnB1c2gobmFtZSk7XG5cbiAgICAgICAgICBodG1sICs9ICc8YnIgLz4nICsgcHJvY2Vzc01vZGVsKHNjaGVtYSwgbmFtZSk7XG4gICAgICAgIH1cbiAgICAgIH0pO1xuICAgICAgLyoganNoaW50IGlnbm9yZTplbmQgKi9cbiAgICB9XG5cbiAgICByZXR1cm4gaHRtbDtcblxuXG4gICAgZnVuY3Rpb24gYWRkUmVmZXJlbmNlKHNjaGVtYSwgbmFtZSwgc2tpcFJlZikge1xuICAgICAgdmFyIG1vZGVsTmFtZSA9IG5hbWU7XG4gICAgICB2YXIgbW9kZWw7XG5cbiAgICAgIGlmIChzY2hlbWEuJHJlZikge1xuICAgICAgICBtb2RlbE5hbWUgPSBzY2hlbWEudGl0bGUgfHwgc2ltcGxlUmVmKHNjaGVtYS4kcmVmKTtcbiAgICAgICAgbW9kZWwgPSBtb2RlbHNbc2ltcGxlUmVmKHNjaGVtYS4kcmVmKV07XG4gICAgICB9IGVsc2UgaWYgKF8uaXNVbmRlZmluZWQobmFtZSkpIHtcbiAgICAgICAgbW9kZWxOYW1lID0gc2NoZW1hLnRpdGxlIHx8ICdJbmxpbmUgTW9kZWwgJyArICgrK2lubGluZU1vZGVscyk7XG4gICAgICAgIG1vZGVsID0ge2RlZmluaXRpb246IHNjaGVtYX07XG4gICAgICB9XG5cbiAgICAgIGlmIChza2lwUmVmICE9PSB0cnVlKSB7XG4gICAgICAgIHJlZmVyZW5jZXNbbW9kZWxOYW1lXSA9IF8uaXNVbmRlZmluZWQobW9kZWwpID8ge30gOiBtb2RlbC5kZWZpbml0aW9uO1xuICAgICAgfVxuXG4gICAgICByZXR1cm4gbW9kZWxOYW1lO1xuICAgIH1cblxuICAgIGZ1bmN0aW9uIHByaW1pdGl2ZVRvSFRNTChzY2hlbWEpIHtcbiAgICAgIHZhciBodG1sID0gJzxzcGFuIGNsYXNzPVwicHJvcFR5cGVcIj4nO1xuICAgICAgdmFyIHR5cGUgPSBzY2hlbWEudHlwZSB8fCAnb2JqZWN0JztcblxuICAgICAgaWYgKHNjaGVtYS4kcmVmKSB7XG4gICAgICAgIGh0bWwgKz0gYWRkUmVmZXJlbmNlKHNjaGVtYSwgc2ltcGxlUmVmKHNjaGVtYS4kcmVmKSk7XG4gICAgICB9IGVsc2UgaWYgKHR5cGUgPT09ICdvYmplY3QnKSB7XG4gICAgICAgIGlmICghXy5pc1VuZGVmaW5lZChzY2hlbWEucHJvcGVydGllcykpIHtcbiAgICAgICAgICBodG1sICs9IGFkZFJlZmVyZW5jZShzY2hlbWEpO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIGh0bWwgKz0gJ29iamVjdCc7XG4gICAgICAgIH1cbiAgICAgIH0gZWxzZSBpZiAodHlwZSA9PT0gJ2FycmF5Jykge1xuICAgICAgICBodG1sICs9ICdBcnJheVsnO1xuXG4gICAgICAgIGlmIChfLmlzQXJyYXkoc2NoZW1hLml0ZW1zKSkge1xuICAgICAgICAgIGh0bWwgKz0gXy5tYXAoc2NoZW1hLml0ZW1zLCBhZGRSZWZlcmVuY2UpLmpvaW4oJywnKTtcbiAgICAgICAgfSBlbHNlIGlmIChfLmlzUGxhaW5PYmplY3Qoc2NoZW1hLml0ZW1zKSkge1xuICAgICAgICAgIGlmIChfLmlzVW5kZWZpbmVkKHNjaGVtYS5pdGVtcy4kcmVmKSkge1xuICAgICAgICAgICAgaWYgKCFfLmlzVW5kZWZpbmVkKHNjaGVtYS5pdGVtcy50eXBlKSAmJiBfLmluZGV4T2YoWydhcnJheScsICdvYmplY3QnXSwgc2NoZW1hLml0ZW1zLnR5cGUpID09PSAtMSkge1xuICAgICAgICAgICAgICBodG1sICs9IHNjaGVtYS5pdGVtcy50eXBlO1xuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgaHRtbCArPSBhZGRSZWZlcmVuY2Uoc2NoZW1hLml0ZW1zKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgaHRtbCArPSBhZGRSZWZlcmVuY2Uoc2NoZW1hLml0ZW1zLCBzaW1wbGVSZWYoc2NoZW1hLml0ZW1zLiRyZWYpKTtcbiAgICAgICAgICB9XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgY29uc29sZS5sb2coJ0FycmF5IHR5cGVcXCdzIFxcJ2l0ZW1zXFwnIHNjaGVtYSBpcyBub3QgYW4gYXJyYXkgb3IgYW4gb2JqZWN0LCBjYW5ub3QgcHJvY2VzcycpO1xuICAgICAgICAgIGh0bWwgKz0gJ29iamVjdCc7XG4gICAgICAgIH1cblxuICAgICAgICBodG1sICs9ICddJztcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIGh0bWwgKz0gc2NoZW1hLnR5cGU7XG4gICAgICB9XG5cbiAgICAgIGh0bWwgKz0gJzwvc3Bhbj4nO1xuXG4gICAgICByZXR1cm4gaHRtbDtcbiAgICB9XG5cbiAgICBmdW5jdGlvbiBwcmltaXRpdmVUb09wdGlvbnNIVE1MKHNjaGVtYSwgaHRtbCkge1xuICAgICAgdmFyIG9wdGlvbnMgPSAnJztcbiAgICAgIHZhciB0eXBlID0gc2NoZW1hLnR5cGUgfHwgJ29iamVjdCc7XG4gICAgICB2YXIgaXNBcnJheSA9IHR5cGUgPT09ICdhcnJheSc7XG5cbiAgICAgIGlmICghXy5pc1VuZGVmaW5lZChzY2hlbWEuZGVzY3JpcHRpb24pKSB7XG4gICAgICAgIGh0bWwgKz0gJzogJyArICc8c3BhbiBjbGFzcz1cInByb3BEZXNjXCI+JyArIHNjaGVtYS5kZXNjcmlwdGlvbiArICc8L3NwYW4+JztcbiAgICAgIH1cblxuICAgICAgaWYgKHNjaGVtYS5lbnVtKSB7XG4gICAgICAgIGh0bWwgKz0gJyA9IDxzcGFuIGNsYXNzPVwicHJvcFZhbHNcIj5bXFwnJyArIHNjaGVtYS5lbnVtLmpvaW4oJ1xcJywgXFwnJykgKyAnXFwnXTwvc3Bhbj4nO1xuICAgICAgfVxuXG4gICAgICBpZiAoaXNBcnJheSkge1xuICAgICAgICBpZiAoXy5pc1BsYWluT2JqZWN0KHNjaGVtYS5pdGVtcykgJiYgIV8uaXNVbmRlZmluZWQoc2NoZW1hLml0ZW1zLnR5cGUpKSB7XG4gICAgICAgICAgdHlwZSA9IHNjaGVtYS5pdGVtcy50eXBlO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIHR5cGUgPSAnb2JqZWN0JztcbiAgICAgICAgfVxuICAgICAgfVxuXG4gICAgICBpZiAoIV8uaXNVbmRlZmluZWQoc2NoZW1hLmRlZmF1bHQpKSB7XG4gICAgICAgIG9wdGlvbnMgKz0gb3B0aW9uSHRtbCgnRGVmYXVsdCcsIHNjaGVtYS5kZWZhdWx0KTtcbiAgICAgIH1cblxuICAgICAgc3dpdGNoICh0eXBlKSB7XG4gICAgICBjYXNlICdzdHJpbmcnOlxuICAgICAgICBpZiAoc2NoZW1hLm1pbkxlbmd0aCkge1xuICAgICAgICAgIG9wdGlvbnMgKz0gb3B0aW9uSHRtbCgnTWluLiBMZW5ndGgnLCBzY2hlbWEubWluTGVuZ3RoKTtcbiAgICAgICAgfVxuXG4gICAgICAgIGlmIChzY2hlbWEubWF4TGVuZ3RoKSB7XG4gICAgICAgICAgb3B0aW9ucyArPSBvcHRpb25IdG1sKCdNYXguIExlbmd0aCcsIHNjaGVtYS5tYXhMZW5ndGgpO1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKHNjaGVtYS5wYXR0ZXJuKSB7XG4gICAgICAgICAgb3B0aW9ucyArPSBvcHRpb25IdG1sKCdSZWcuIEV4cC4nLCBzY2hlbWEucGF0dGVybik7XG4gICAgICAgIH1cbiAgICAgICAgYnJlYWs7XG4gICAgICBjYXNlICdpbnRlZ2VyJzpcbiAgICAgIGNhc2UgJ251bWJlcic6XG4gICAgICAgIGlmIChzY2hlbWEubWluaW11bSkge1xuICAgICAgICAgIG9wdGlvbnMgKz0gb3B0aW9uSHRtbCgnTWluLiBWYWx1ZScsIHNjaGVtYS5taW5pbXVtKTtcbiAgICAgICAgfVxuXG4gICAgICAgIGlmIChzY2hlbWEuZXhjbHVzaXZlTWluaW11bSkge1xuICAgICAgICAgIG9wdGlvbnMgKz0gb3B0aW9uSHRtbCgnRXhjbHVzaXZlIE1pbi4nLCAndHJ1ZScpO1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKHNjaGVtYS5tYXhpbXVtKSB7XG4gICAgICAgICAgb3B0aW9ucyArPSBvcHRpb25IdG1sKCdNYXguIFZhbHVlJywgc2NoZW1hLm1heGltdW0pO1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKHNjaGVtYS5leGNsdXNpdmVNYXhpbXVtKSB7XG4gICAgICAgICAgb3B0aW9ucyArPSBvcHRpb25IdG1sKCdFeGNsdXNpdmUgTWF4LicsICd0cnVlJyk7XG4gICAgICAgIH1cblxuICAgICAgICBpZiAoc2NoZW1hLm11bHRpcGxlT2YpIHtcbiAgICAgICAgICBvcHRpb25zICs9IG9wdGlvbkh0bWwoJ011bHRpcGxlIE9mJywgc2NoZW1hLm11bHRpcGxlT2YpO1xuICAgICAgICB9XG5cbiAgICAgICAgYnJlYWs7XG4gICAgICB9XG5cbiAgICAgIGlmIChpc0FycmF5KSB7XG4gICAgICAgIGlmIChzY2hlbWEubWluSXRlbXMpIHtcbiAgICAgICAgICBvcHRpb25zICs9IG9wdGlvbkh0bWwoJ01pbi4gSXRlbXMnLCBzY2hlbWEubWluSXRlbXMpO1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKHNjaGVtYS5tYXhJdGVtcykge1xuICAgICAgICAgIG9wdGlvbnMgKz0gb3B0aW9uSHRtbCgnTWF4LiBJdGVtcycsIHNjaGVtYS5tYXhJdGVtcyk7XG4gICAgICAgIH1cblxuICAgICAgICBpZiAoc2NoZW1hLnVuaXF1ZUl0ZW1zKSB7XG4gICAgICAgICAgb3B0aW9ucyArPSBvcHRpb25IdG1sKCdVbmlxdWUgSXRlbXMnLCAndHJ1ZScpO1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKHNjaGVtYS5jb2xsZWN0aW9uRm9ybWF0KSB7XG4gICAgICAgICAgb3B0aW9ucyArPSBvcHRpb25IdG1sKCdDb2xsLiBGb3JtYXQnLCBzY2hlbWEuY29sbGVjdGlvbkZvcm1hdCk7XG4gICAgICAgIH1cbiAgICAgIH1cblxuICAgICAgaWYgKF8uaXNVbmRlZmluZWQoc2NoZW1hLml0ZW1zKSkge1xuICAgICAgICBpZiAoXy5pc0FycmF5KHNjaGVtYS5lbnVtKSkge1xuICAgICAgICAgIHZhciBlbnVtU3RyaW5nO1xuXG4gICAgICAgICAgaWYgKHR5cGUgPT09ICdudW1iZXInIHx8IHR5cGUgPT09ICdpbnRlZ2VyJykge1xuICAgICAgICAgICAgZW51bVN0cmluZyA9IHNjaGVtYS5lbnVtLmpvaW4oJywgJyk7XG4gICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIGVudW1TdHJpbmcgPSAnXCInICsgc2NoZW1hLmVudW0uam9pbignXCIsIFwiJykgKyAnXCInO1xuICAgICAgICAgIH1cblxuICAgICAgICAgIG9wdGlvbnMgKz0gb3B0aW9uSHRtbCgnRW51bScsIGVudW1TdHJpbmcpO1xuICAgICAgICB9XG4gICAgICB9XG5cbiAgICAgIGlmIChvcHRpb25zLmxlbmd0aCA+IDApIHtcbiAgICAgICAgaHRtbCA9ICc8c3BhbiBjbGFzcz1cInByb3BXcmFwXCI+JyArIGh0bWwgKyAnPHRhYmxlIGNsYXNzPVwib3B0aW9uc1dyYXBwZXJcIj48dHI+PHRoIGNvbHNwYW49XCIyXCI+JyArIHR5cGUgKyAnPC90aD48L3RyPicgKyBvcHRpb25zICsgJzwvdGFibGU+PC9zcGFuPic7XG4gICAgICB9XG5cbiAgICAgIHJldHVybiBodG1sO1xuICAgIH1cblxuICAgIGZ1bmN0aW9uIHByb2Nlc3NNb2RlbChzY2hlbWEsIG5hbWUpIHtcbiAgICAgIHZhciB0eXBlID0gc2NoZW1hLnR5cGUgfHwgJ29iamVjdCc7XG4gICAgICB2YXIgaXNBcnJheSA9IHNjaGVtYS50eXBlID09PSAnYXJyYXknO1xuICAgICAgdmFyIGh0bWwgPSBzdHJvbmdPcGVuICsgbmFtZSArICcgJyArIChpc0FycmF5ID8gJ1snIDogJ3snKSArIHN0cm9uZ0Nsb3NlO1xuICAgICAgdmFyIGNvbnRlbnRzO1xuXG4gICAgICBpZiAobmFtZSkge1xuICAgICAgICBzZWVuTW9kZWxzLnB1c2gobmFtZSk7XG4gICAgICB9XG5cbiAgICAgIGlmIChpc0FycmF5KSB7XG4gICAgICAgIGlmIChfLmlzQXJyYXkoc2NoZW1hLml0ZW1zKSkge1xuICAgICAgICAgIGh0bWwgKz0gJzxkaXY+JyArIF8ubWFwKHNjaGVtYS5pdGVtcywgZnVuY3Rpb24gKGl0ZW0pIHtcbiAgICAgICAgICAgIHZhciB0eXBlID0gaXRlbS50eXBlIHx8ICdvYmplY3QnO1xuXG4gICAgICAgICAgICBpZiAoXy5pc1VuZGVmaW5lZChpdGVtLiRyZWYpKSB7XG4gICAgICAgICAgICAgIGlmIChfLmluZGV4T2YoWydhcnJheScsICdvYmplY3QnXSwgdHlwZSkgPiAtMSkge1xuICAgICAgICAgICAgICAgIGlmICh0eXBlID09PSAnb2JqZWN0JyAmJiBfLmlzVW5kZWZpbmVkKGl0ZW0ucHJvcGVydGllcykpIHtcbiAgICAgICAgICAgICAgICAgIHJldHVybiAnb2JqZWN0JztcbiAgICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgICAgcmV0dXJuIGFkZFJlZmVyZW5jZShpdGVtKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIHByaW1pdGl2ZVRvT3B0aW9uc0hUTUwoaXRlbSwgdHlwZSk7XG4gICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgIHJldHVybiBhZGRSZWZlcmVuY2UoaXRlbSwgc2ltcGxlUmVmKGl0ZW0uJHJlZikpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgIH0pLmpvaW4oJyw8L2Rpdj48ZGl2PicpO1xuICAgICAgICB9IGVsc2UgaWYgKF8uaXNQbGFpbk9iamVjdChzY2hlbWEuaXRlbXMpKSB7XG4gICAgICAgICAgaWYgKF8uaXNVbmRlZmluZWQoc2NoZW1hLml0ZW1zLiRyZWYpKSB7XG4gICAgICAgICAgICBpZiAoXy5pbmRleE9mKFsnYXJyYXknLCAnb2JqZWN0J10sIHNjaGVtYS5pdGVtcy50eXBlIHx8ICdvYmplY3QnKSA+IC0xKSB7XG4gICAgICAgICAgICAgIGlmICgoXy5pc1VuZGVmaW5lZChzY2hlbWEuaXRlbXMudHlwZSkgfHwgc2NoZW1hLml0ZW1zLnR5cGUgPT09ICdvYmplY3QnKSAmJiBfLmlzVW5kZWZpbmVkKHNjaGVtYS5pdGVtcy5wcm9wZXJ0aWVzKSkge1xuICAgICAgICAgICAgICAgIGh0bWwgKz0gJzxkaXY+b2JqZWN0PC9kaXY+JztcbiAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICBodG1sICs9ICc8ZGl2PicgKyBhZGRSZWZlcmVuY2Uoc2NoZW1hLml0ZW1zKSArICc8L2Rpdj4nO1xuICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICBodG1sICs9ICc8ZGl2PicgKyBwcmltaXRpdmVUb09wdGlvbnNIVE1MKHNjaGVtYS5pdGVtcywgc2NoZW1hLml0ZW1zLnR5cGUpICsgJzwvZGl2Pic7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIGh0bWwgKz0gJzxkaXY+JyArIGFkZFJlZmVyZW5jZShzY2hlbWEuaXRlbXMsIHNpbXBsZVJlZihzY2hlbWEuaXRlbXMuJHJlZikpICsgJzwvZGl2Pic7XG4gICAgICAgICAgfVxuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIGNvbnNvbGUubG9nKCdBcnJheSB0eXBlXFwncyBcXCdpdGVtc1xcJyBwcm9wZXJ0eSBpcyBub3QgYW4gYXJyYXkgb3IgYW4gb2JqZWN0LCBjYW5ub3QgcHJvY2VzcycpO1xuICAgICAgICAgIGh0bWwgKz0gJzxkaXY+b2JqZWN0PC9kaXY+JztcbiAgICAgICAgfVxuICAgICAgfSBlbHNlIHtcbiAgICAgICAgaWYgKHNjaGVtYS4kcmVmKSB7XG4gICAgICAgICAgaHRtbCArPSAnPGRpdj4nICsgYWRkUmVmZXJlbmNlKHNjaGVtYSwgbmFtZSkgKyAnPC9kaXY+JztcbiAgICAgICAgfSBlbHNlIGlmICh0eXBlID09PSAnb2JqZWN0Jykge1xuICAgICAgICAgIGlmIChfLmlzUGxhaW5PYmplY3Qoc2NoZW1hLnByb3BlcnRpZXMpKSB7XG4gICAgICAgICAgICBjb250ZW50cyA9IF8ubWFwKHNjaGVtYS5wcm9wZXJ0aWVzLCBmdW5jdGlvbiAocHJvcGVydHksIG5hbWUpIHtcbiAgICAgICAgICAgICAgdmFyIHByb3BlcnR5SXNSZXF1aXJlZCA9IChfLmluZGV4T2Yoc2NoZW1hLnJlcXVpcmVkLCBuYW1lKSA+PSAwKTtcbiAgICAgICAgICAgICAgdmFyIGNQcm9wZXJ0eSA9IF8uY2xvbmVEZWVwKHByb3BlcnR5KTtcblxuICAgICAgICAgICAgICB2YXIgcmVxdWlyZWRDbGFzcyA9IHByb3BlcnR5SXNSZXF1aXJlZCA/ICdyZXF1aXJlZCcgOiAnJztcbiAgICAgICAgICAgICAgdmFyIGh0bWwgPSAnPHNwYW4gY2xhc3M9XCJwcm9wTmFtZSAnICsgcmVxdWlyZWRDbGFzcyArICdcIj4nICsgbmFtZSArICc8L3NwYW4+ICgnO1xuICAgICAgICAgICAgICB2YXIgbW9kZWw7XG5cbiAgICAgICAgICAgICAgLy8gQWxsb3cgbWFjcm8gdG8gc2V0IHRoZSBkZWZhdWx0IHZhbHVlXG4gICAgICAgICAgICAgIGNQcm9wZXJ0eS5kZWZhdWx0ID0gbW9kZWxQcm9wZXJ0eU1hY3JvKGNQcm9wZXJ0eSk7XG5cbiAgICAgICAgICAgICAgLy8gUmVzb2x2ZSB0aGUgc2NoZW1hIChIYW5kbGUgbmVzdGVkIHNjaGVtYXMpXG4gICAgICAgICAgICAgIGNQcm9wZXJ0eSA9IHJlc29sdmVTY2hlbWEoY1Byb3BlcnR5KTtcblxuICAgICAgICAgICAgICAvLyBXZSBuZWVkIHRvIGhhbmRsZSBwcm9wZXJ0eSByZWZlcmVuY2VzIHRvIHByaW1pdGl2ZXMgKElzc3VlIDMzOSlcbiAgICAgICAgICAgICAgaWYgKCFfLmlzVW5kZWZpbmVkKGNQcm9wZXJ0eS4kcmVmKSkge1xuICAgICAgICAgICAgICAgIG1vZGVsID0gbW9kZWxzW3NpbXBsZVJlZihjUHJvcGVydHkuJHJlZildO1xuXG4gICAgICAgICAgICAgICAgaWYgKCFfLmlzVW5kZWZpbmVkKG1vZGVsKSAmJiBfLmluZGV4T2YoW3VuZGVmaW5lZCwgJ2FycmF5JywgJ29iamVjdCddLCBtb2RlbC5kZWZpbml0aW9uLnR5cGUpID09PSAtMSkge1xuICAgICAgICAgICAgICAgICAgLy8gVXNlIHJlZmVyZW5jZWQgc2NoZW1hXG4gICAgICAgICAgICAgICAgICBjUHJvcGVydHkgPSByZXNvbHZlU2NoZW1hKG1vZGVsLmRlZmluaXRpb24pO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgIGh0bWwgKz0gcHJpbWl0aXZlVG9IVE1MKGNQcm9wZXJ0eSk7XG5cbiAgICAgICAgICAgICAgaWYoIXByb3BlcnR5SXNSZXF1aXJlZCkge1xuICAgICAgICAgICAgICAgIGh0bWwgKz0gJywgPHNwYW4gY2xhc3M9XCJwcm9wT3B0S2V5XCI+b3B0aW9uYWw8L3NwYW4+JztcbiAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgIGlmKHByb3BlcnR5LnJlYWRPbmx5KSB7XG4gICAgICAgICAgICAgICAgICBodG1sICs9ICcsIDxzcGFuIGNsYXNzPVwicHJvcFJlYWRPbmx5XCI+cmVhZCBvbmx5PC9zcGFuPic7XG4gICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICBodG1sICs9ICcpJztcblxuICAgICAgICAgICAgICByZXR1cm4gJzxkaXYnICsgKHByb3BlcnR5LnJlYWRPbmx5ID8gJyBjbGFzcz1cInJlYWRPbmx5XCInIDogJycpICsgJz4nICsgcHJpbWl0aXZlVG9PcHRpb25zSFRNTChjUHJvcGVydHksIGh0bWwpO1xuICAgICAgICAgICAgfSkuam9pbignLDwvZGl2PicpO1xuICAgICAgICAgIH1cblxuICAgICAgICAgIGlmIChjb250ZW50cykge1xuICAgICAgICAgICAgaHRtbCArPSBjb250ZW50cyArICc8L2Rpdj4nO1xuICAgICAgICAgIH1cbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICBodG1sICs9ICc8ZGl2PicgKyBwcmltaXRpdmVUb09wdGlvbnNIVE1MKHNjaGVtYSwgdHlwZSkgKyAnPC9kaXY+JztcbiAgICAgICAgfVxuICAgICAgfVxuXG4gICAgICByZXR1cm4gaHRtbCArIHN0cm9uZ09wZW4gKyAoaXNBcnJheSA/ICddJyA6ICd9JykgKyBzdHJvbmdDbG9zZTtcbiAgICB9XG5cbiAgfTtcblxuICAvLyBjb3B5LXBhc3RlZCBmcm9tIHN3YWdnZXItanNcbiAgdmFyIHNjaGVtYVRvSlNPTiA9IGZ1bmN0aW9uIChzY2hlbWEsIG1vZGVscywgbW9kZWxzVG9JZ25vcmUsIG1vZGVsUHJvcGVydHlNYWNybykge1xuICAgIC8vIFJlc29sdmUgdGhlIHNjaGVtYSAoSGFuZGxlIG5lc3RlZCBzY2hlbWFzKVxuICAgIHNjaGVtYSA9IHJlc29sdmVTY2hlbWEoc2NoZW1hKTtcblxuICAgIGlmKHR5cGVvZiBtb2RlbFByb3BlcnR5TWFjcm8gIT09ICdmdW5jdGlvbicpIHtcbiAgICAgIG1vZGVsUHJvcGVydHlNYWNybyA9IGZ1bmN0aW9uKHByb3Ape1xuICAgICAgICByZXR1cm4gKHByb3AgfHwge30pLmRlZmF1bHQ7XG4gICAgICB9O1xuICAgIH1cblxuICAgIG1vZGVsc1RvSWdub3JlPSBtb2RlbHNUb0lnbm9yZSB8fCB7fTtcblxuICAgIHZhciB0eXBlID0gc2NoZW1hLnR5cGUgfHwgJ29iamVjdCc7XG4gICAgdmFyIGZvcm1hdCA9IHNjaGVtYS5mb3JtYXQ7XG4gICAgdmFyIG1vZGVsO1xuICAgIHZhciBvdXRwdXQ7XG5cbiAgICBpZiAoIV8uaXNVbmRlZmluZWQoc2NoZW1hLmV4YW1wbGUpKSB7XG4gICAgICBvdXRwdXQgPSBzY2hlbWEuZXhhbXBsZTtcbiAgICB9IGVsc2UgaWYgKF8uaXNVbmRlZmluZWQoc2NoZW1hLml0ZW1zKSAmJiBfLmlzQXJyYXkoc2NoZW1hLmVudW0pKSB7XG4gICAgICBvdXRwdXQgPSBzY2hlbWEuZW51bVswXTtcbiAgICB9XG5cbiAgICBpZiAoXy5pc1VuZGVmaW5lZChvdXRwdXQpKSB7XG4gICAgICBpZiAoc2NoZW1hLiRyZWYpIHtcbiAgICAgICAgbW9kZWwgPSBtb2RlbHNbc2ltcGxlUmVmKHNjaGVtYS4kcmVmKV07XG5cbiAgICAgICAgaWYgKCFfLmlzVW5kZWZpbmVkKG1vZGVsKSkge1xuICAgICAgICAgIGlmIChfLmlzVW5kZWZpbmVkKG1vZGVsc1RvSWdub3JlW21vZGVsLm5hbWVdKSkge1xuICAgICAgICAgICAgbW9kZWxzVG9JZ25vcmVbbW9kZWwubmFtZV0gPSBtb2RlbDtcbiAgICAgICAgICAgIG91dHB1dCA9IHNjaGVtYVRvSlNPTihtb2RlbC5kZWZpbml0aW9uLCBtb2RlbHMsIG1vZGVsc1RvSWdub3JlLCBtb2RlbFByb3BlcnR5TWFjcm8pO1xuICAgICAgICAgICAgZGVsZXRlIG1vZGVsc1RvSWdub3JlW21vZGVsLm5hbWVdO1xuICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICBpZiAobW9kZWwudHlwZSA9PT0gJ2FycmF5Jykge1xuICAgICAgICAgICAgICBvdXRwdXQgPSBbXTtcbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgIG91dHB1dCA9IHt9O1xuICAgICAgICAgICAgfVxuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgfSBlbHNlIGlmICghXy5pc1VuZGVmaW5lZChzY2hlbWEuZGVmYXVsdCkpIHtcbiAgICAgICAgb3V0cHV0ID0gc2NoZW1hLmRlZmF1bHQ7XG4gICAgICB9IGVsc2UgaWYgKHR5cGUgPT09ICdzdHJpbmcnKSB7XG4gICAgICAgIGlmIChmb3JtYXQgPT09ICdkYXRlLXRpbWUnKSB7XG4gICAgICAgICAgb3V0cHV0ID0gbmV3IERhdGUoKS50b0lTT1N0cmluZygpO1xuICAgICAgICB9IGVsc2UgaWYgKGZvcm1hdCA9PT0gJ2RhdGUnKSB7XG4gICAgICAgICAgb3V0cHV0ID0gbmV3IERhdGUoKS50b0lTT1N0cmluZygpLnNwbGl0KCdUJylbMF07XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgb3V0cHV0ID0gJ3N0cmluZyc7XG4gICAgICAgIH1cbiAgICAgIH0gZWxzZSBpZiAodHlwZSA9PT0gJ2ludGVnZXInKSB7XG4gICAgICAgIG91dHB1dCA9IDA7XG4gICAgICB9IGVsc2UgaWYgKHR5cGUgPT09ICdudW1iZXInKSB7XG4gICAgICAgIG91dHB1dCA9IDAuMDtcbiAgICAgIH0gZWxzZSBpZiAodHlwZSA9PT0gJ2Jvb2xlYW4nKSB7XG4gICAgICAgIG91dHB1dCA9IHRydWU7XG4gICAgICB9IGVsc2UgaWYgKHR5cGUgPT09ICdvYmplY3QnKSB7XG4gICAgICAgIG91dHB1dCA9IHt9O1xuXG4gICAgICAgIF8uZm9yRWFjaChzY2hlbWEucHJvcGVydGllcywgZnVuY3Rpb24gKHByb3BlcnR5LCBuYW1lKSB7XG4gICAgICAgICAgdmFyIGNQcm9wZXJ0eSA9IF8uY2xvbmVEZWVwKHByb3BlcnR5KTtcblxuICAgICAgICAgIC8vIEFsbG93IG1hY3JvIHRvIHNldCB0aGUgZGVmYXVsdCB2YWx1ZVxuICAgICAgICAgIGNQcm9wZXJ0eS5kZWZhdWx0ID0gbW9kZWxQcm9wZXJ0eU1hY3JvKHByb3BlcnR5KTtcblxuICAgICAgICAgIG91dHB1dFtuYW1lXSA9IHNjaGVtYVRvSlNPTihjUHJvcGVydHksIG1vZGVscywgbW9kZWxzVG9JZ25vcmUsIG1vZGVsUHJvcGVydHlNYWNybyk7XG4gICAgICAgIH0pO1xuICAgICAgfSBlbHNlIGlmICh0eXBlID09PSAnYXJyYXknKSB7XG4gICAgICAgIG91dHB1dCA9IFtdO1xuXG4gICAgICAgIGlmIChfLmlzQXJyYXkoc2NoZW1hLml0ZW1zKSkge1xuICAgICAgICAgIF8uZm9yRWFjaChzY2hlbWEuaXRlbXMsIGZ1bmN0aW9uIChpdGVtKSB7XG4gICAgICAgICAgICBvdXRwdXQucHVzaChzY2hlbWFUb0pTT04oaXRlbSwgbW9kZWxzLCBtb2RlbHNUb0lnbm9yZSwgbW9kZWxQcm9wZXJ0eU1hY3JvKSk7XG4gICAgICAgICAgfSk7XG4gICAgICAgIH0gZWxzZSBpZiAoXy5pc1BsYWluT2JqZWN0KHNjaGVtYS5pdGVtcykpIHtcbiAgICAgICAgICBvdXRwdXQucHVzaChzY2hlbWFUb0pTT04oc2NoZW1hLml0ZW1zLCBtb2RlbHMsIG1vZGVsc1RvSWdub3JlLCBtb2RlbFByb3BlcnR5TWFjcm8pKTtcbiAgICAgICAgfSBlbHNlIGlmIChfLmlzVW5kZWZpbmVkKHNjaGVtYS5pdGVtcykpIHtcbiAgICAgICAgICBvdXRwdXQucHVzaCh7fSk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgY29uc29sZS5sb2coJ0FycmF5IHR5cGVcXCdzIFxcJ2l0ZW1zXFwnIHByb3BlcnR5IGlzIG5vdCBhbiBhcnJheSBvciBhbiBvYmplY3QsIGNhbm5vdCBwcm9jZXNzJyk7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG5cbiAgICByZXR1cm4gb3V0cHV0O1xuICB9O1xuXG4gIC8vIGNvcHktcGFzdGVkIGZyb20gc3dhZ2dlci1qc1xuICB2YXIgY3JlYXRlSlNPTlNhbXBsZSA9IGZ1bmN0aW9uICh2YWx1ZSwgbW9kZWxzVG9JZ25vcmUpIHtcbiAgICBtb2RlbHNUb0lnbm9yZSA9IG1vZGVsc1RvSWdub3JlIHx8IHt9O1xuXG4gICAgbW9kZWxzVG9JZ25vcmVbdmFsdWUubmFtZV0gPSB2YWx1ZTtcblxuICAgIC8vIFJlc3BvbnNlIHN1cHBvcnRcbiAgICBpZiAodmFsdWUuZXhhbXBsZXMgJiYgXy5pc1BsYWluT2JqZWN0KHZhbHVlLmV4YW1wbGVzKSkge1xuICAgICAgdmFsdWUgPSBfLmNsb25lRGVlcCh2YWx1ZSk7XG4gICAgICB2YXIga2V5cyA9IE9iamVjdC5rZXlzKHZhbHVlLmV4YW1wbGVzKTtcblxuICAgICAgXy5mb3JFYWNoKGtleXMsIGZ1bmN0aW9uKGtleSkge1xuICAgICAgICBpZihrZXkuaW5kZXhPZignYXBwbGljYXRpb24vanNvbicpID09PSAwKSB7XG4gICAgICAgICAgdmFyIGV4YW1wbGUgPSB2YWx1ZS5leGFtcGxlc1trZXldO1xuICAgICAgICAgIGlmIChfLmlzU3RyaW5nKGV4YW1wbGUpKSB7XG4gICAgICAgICAgICBleGFtcGxlID0ganN5YW1sLnNhZmVMb2FkKGV4YW1wbGUpO1xuICAgICAgICAgIH1cbiAgICAgICAgICB2YWx1ZS5kZWZpbml0aW9uLmV4YW1wbGUgPSBleGFtcGxlO1xuICAgICAgICAgIHJldHVybiBzY2hlbWFUb0pTT04odmFsdWUuZGVmaW5pdGlvbiwgZXhhbXBsZSwgbW9kZWxzVG9JZ25vcmUsIHZhbHVlLm1vZGVsUHJvcGVydHlNYWNybyk7XG4gICAgICAgIH1cbiAgICAgIH0pO1xuICAgIH1cblxuICAgIGlmICh2YWx1ZS5leGFtcGxlcykge1xuICAgICAgdmFsdWUgPSBfLmNsb25lRGVlcCh2YWx1ZSk7XG4gICAgICB2YXIgZXhhbXBsZSA9IHZhbHVlLmV4YW1wbGVzO1xuICAgICAgaWYgKF8uaXNTdHJpbmcoZXhhbXBsZSkpIHtcbiAgICAgICAgZXhhbXBsZSA9IGpzeWFtbC5zYWZlTG9hZChleGFtcGxlKTtcbiAgICAgIH1cbiAgICAgIHZhbHVlLmRlZmluaXRpb24uZXhhbXBsZSA9IGV4YW1wbGU7XG4gICAgICByZXR1cm4gc2NoZW1hVG9KU09OKHZhbHVlLmRlZmluaXRpb24sIGV4YW1wbGUsIG1vZGVsc1RvSWdub3JlLCB2YWx1ZS5tb2RlbFByb3BlcnR5TWFjcm8pO1xuICAgIH1cblxuICAgIHJldHVybiBzY2hlbWFUb0pTT04odmFsdWUuZGVmaW5pdGlvbiwgdmFsdWUubW9kZWxzLCBtb2RlbHNUb0lnbm9yZSwgdmFsdWUubW9kZWxQcm9wZXJ0eU1hY3JvKTtcbiAgfTtcblxuICAvLyBjb3B5LXBhc3RlZCBmcm9tIHN3YWdnZXItanNcbiAgdmFyIGdldFBhcmFtZXRlck1vZGVsU2lnbmF0dXJlID0gZnVuY3Rpb24gKHR5cGUsIGRlZmluaXRpb25zKSB7XG4gICAgICB2YXIgaXNQcmltaXRpdmUsIGxpc3RUeXBlO1xuXG4gICAgICBpZiAodHlwZSBpbnN0YW5jZW9mIEFycmF5KSB7XG4gICAgICAgIGxpc3RUeXBlID0gdHJ1ZTtcbiAgICAgICAgdHlwZSA9IHR5cGVbMF07XG4gICAgICB9XG5cbiAgICAgIC8vIENvbnZlcnQgdW5kZWZpbmVkIHRvIHN0cmluZyBvZiAndW5kZWZpbmVkJ1xuICAgICAgaWYgKHR5cGVvZiB0eXBlID09PSAndW5kZWZpbmVkJykge1xuICAgICAgICB0eXBlID0gJ3VuZGVmaW5lZCc7XG4gICAgICAgIGlzUHJpbWl0aXZlID0gdHJ1ZTtcblxuICAgICAgfSBlbHNlIGlmIChkZWZpbml0aW9uc1t0eXBlXSl7XG4gICAgICAgIC8vIGEgbW9kZWwgZGVmIGV4aXN0cz9cbiAgICAgICAgdHlwZSA9IGRlZmluaXRpb25zW3R5cGVdOyAvKiBNb2RlbCAqL1xuICAgICAgICBpc1ByaW1pdGl2ZSA9IGZhbHNlO1xuXG4gICAgICB9IGVsc2UgaWYgKGdldElubGluZU1vZGVsKHR5cGUpKSB7XG4gICAgICAgIHR5cGUgPSBnZXRJbmxpbmVNb2RlbCh0eXBlKTsgLyogTW9kZWwgKi9cbiAgICAgICAgaXNQcmltaXRpdmUgPSBmYWxzZTtcblxuICAgICAgfSBlbHNlIHtcbiAgICAgICAgLy8gV2UgZGVmYXVsdCB0byBwcmltaXRpdmVcbiAgICAgICAgaXNQcmltaXRpdmUgPSB0cnVlO1xuICAgICAgfVxuXG4gICAgICBpZiAoaXNQcmltaXRpdmUpIHtcbiAgICAgICAgaWYgKGxpc3RUeXBlKSB7XG4gICAgICAgICAgcmV0dXJuICdBcnJheVsnICsgdHlwZSArICddJztcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICByZXR1cm4gdHlwZS50b1N0cmluZygpO1xuICAgICAgICB9XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBpZiAobGlzdFR5cGUpIHtcbiAgICAgICAgICByZXR1cm4gJ0FycmF5WycgKyBnZXRNb2RlbFNpZ25hdHVyZSh0eXBlLm5hbWUsIHR5cGUuZGVmaW5pdGlvbiwgdHlwZS5tb2RlbHMsIHR5cGUubW9kZWxQcm9wZXJ0eU1hY3JvKSArICddJztcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICByZXR1cm4gZ2V0TW9kZWxTaWduYXR1cmUodHlwZS5uYW1lLCB0eXBlLmRlZmluaXRpb24sIHR5cGUubW9kZWxzLCB0eXBlLm1vZGVsUHJvcGVydHlNYWNybyk7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgfTtcblxuICAvLyBjb3B5LXBhc3RlZCBmcm9tIHN3YWdnZXItanNcbiAgdmFyIGNyZWF0ZVBhcmFtZXRlckpTT05TYW1wbGUgPSBmdW5jdGlvbiAodHlwZSwgbW9kZWxzKSB7XG4gICAgdmFyIGxpc3RUeXBlLCBzYW1wbGVKc29uLCBpbm5lclR5cGU7XG4gICAgbW9kZWxzID0gbW9kZWxzIHx8IHt9O1xuXG4gICAgbGlzdFR5cGUgPSAodHlwZSBpbnN0YW5jZW9mIEFycmF5KTtcbiAgICBpbm5lclR5cGUgPSBsaXN0VHlwZSA/IHR5cGVbMF0gOiB0eXBlO1xuXG4gICAgaWYobW9kZWxzW2lubmVyVHlwZV0pIHtcbiAgICAgIHNhbXBsZUpzb24gPSBjcmVhdGVKU09OU2FtcGxlKG1vZGVsc1tpbm5lclR5cGVdKTtcbiAgICB9IGVsc2UgaWYgKGdldElubGluZU1vZGVsKGlubmVyVHlwZSkpe1xuICAgICAgc2FtcGxlSnNvbiA9IGNyZWF0ZUpTT05TYW1wbGUoZ2V0SW5saW5lTW9kZWwoaW5uZXJUeXBlKSk7IC8vIG1heSByZXR1cm4gbnVsbCwgaWYgdHlwZSBpc24ndCBjb3JyZWN0XG4gICAgfVxuXG5cbiAgICBpZiAoc2FtcGxlSnNvbikge1xuICAgICAgc2FtcGxlSnNvbiA9IGxpc3RUeXBlID8gW3NhbXBsZUpzb25dIDogc2FtcGxlSnNvbjtcblxuICAgICAgaWYgKHR5cGVvZiBzYW1wbGVKc29uID09PSAnc3RyaW5nJykge1xuICAgICAgICByZXR1cm4gc2FtcGxlSnNvbjtcbiAgICAgIH0gZWxzZSBpZiAoXy5pc09iamVjdChzYW1wbGVKc29uKSkge1xuICAgICAgICB2YXIgdCA9IHNhbXBsZUpzb247XG5cbiAgICAgICAgaWYgKHNhbXBsZUpzb24gaW5zdGFuY2VvZiBBcnJheSAmJiBzYW1wbGVKc29uLmxlbmd0aCA+IDApIHtcbiAgICAgICAgICB0ID0gc2FtcGxlSnNvblswXTtcbiAgICAgICAgfVxuXG4gICAgICAgIGlmICh0Lm5vZGVOYW1lICYmIHR5cGVvZiB0ID09PSAnTm9kZScpIHtcbiAgICAgICAgICB2YXIgeG1sU3RyaW5nID0gbmV3IFhNTFNlcmlhbGl6ZXIoKS5zZXJpYWxpemVUb1N0cmluZyh0KTtcblxuICAgICAgICAgIHJldHVybiBmb3JtYXRYbWwoeG1sU3RyaW5nKTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICByZXR1cm4gSlNPTi5zdHJpbmdpZnkoc2FtcGxlSnNvbiwgbnVsbCwgMik7XG4gICAgICAgIH1cbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHJldHVybiBzYW1wbGVKc29uO1xuICAgICAgfVxuICAgIH1cbiAgfTtcblxuICB2YXIgd3JhcFRhZyA9IGZ1bmN0aW9uIChuYW1lLCB2YWx1ZSwgYXR0cnMpIHtcbiAgICB2YXIgc3RyLCBhdHRyaWJ1dGVzO1xuXG4gICAgYXR0cnMgPSBhdHRycyB8fCBbXTtcblxuICAgIGF0dHJpYnV0ZXMgPSBhdHRycy5tYXAoZnVuY3Rpb24gKGF0dHIpIHtcbiAgICAgIHJldHVybiAnICcgKyBhdHRyLm5hbWUgKyAnPVwiJyArIGF0dHIudmFsdWUgKyAnXCInO1xuICAgIH0pLmpvaW4oJycpO1xuXG4gICAgaWYgKCFuYW1lKSB7XG4gICAgICByZXR1cm4gZ2V0RXJyb3JNZXNzYWdlKCdOb2RlIG5hbWUgaXMgbm90IHByb3ZpZGVkJyk7XG4gICAgfVxuXG4gICAgc3RyID0gW1xuICAgICAgJzwnLCBuYW1lLFxuICAgICAgYXR0cmlidXRlcyxcbiAgICAgICc+JyxcbiAgICAgIHZhbHVlLFxuICAgICAgJzwvJywgbmFtZSwgJz4nXG4gICAgXTtcblxuICAgIHJldHVybiBzdHIuam9pbignJyk7XG4gIH07XG5cbiAgLy8gQ29tbWVudGluZyB0aGlzIGZ1bnRpb24gYXMgdGhlIG5hbWVzIGFyZSBub3cgZGV0ZXJtaW5lZCBiZWZvcmVoYW5kIGFuZCB0aGUgcHJlZml4IHBhcnQgaXMgZXhwb3NlZCBhcyBhIHNlcGFyYXRlIGZ1bmN0aW9uIHwgaHR0cHM6Ly9naXRodWIuY29tL3N3YWdnZXItYXBpL3N3YWdnZXItdWkvaXNzdWVzLzI1NzdcbiAvKiogdmFyIGdldE5hbWUgPSBmdW5jdGlvbiAobmFtZSwgeG1sKSB7XG4gICAgdmFyIHJlc3VsdCA9IG5hbWUgfHwgJyc7XG5cbiAgICB4bWwgPSB4bWwgfHwge307XG5cbiAgICBpZiAoeG1sLm5hbWUpIHtcbiAgICAgIHJlc3VsdCA9IHhtbC5uYW1lO1xuICAgIH1cblxuICAgIGlmICh4bWwucHJlZml4KSB7XG4gICAgICByZXN1bHQgPSB4bWwucHJlZml4ICsgJzonICsgcmVzdWx0O1xuICAgIH1cblxuICAgIHJldHVybiByZXN1bHQ7XG4gIH07XG4gICovXG4gIFxuICB2YXIgZ2V0UHJlZml4ID0gZnVuY3Rpb24gKG5hbWUsIHhtbCkge1xuICAgIHZhciByZXN1bHQgPSBuYW1lIHx8ICcnO1xuXG4gICAgeG1sID0geG1sIHx8IHt9O1xuXG4gICAgaWYgKHhtbC5wcmVmaXgpIHtcbiAgICAgIHJlc3VsdCA9IHhtbC5wcmVmaXggKyAnOicgKyByZXN1bHQ7XG4gICAgfVxuXG4gICAgcmV0dXJuIHJlc3VsdDtcbiAgfTtcblxuICB2YXIgZ2V0TmFtZXNwYWNlID0gZnVuY3Rpb24gKHhtbCkge1xuICAgIHZhciBuYW1lc3BhY2UgPSAnJztcbiAgICB2YXIgbmFtZSA9ICd4bWxucyc7XG5cbiAgICB4bWwgPSB4bWwgfHwge307XG5cbiAgICBpZiAoeG1sLm5hbWVzcGFjZSkge1xuICAgICAgbmFtZXNwYWNlID0geG1sLm5hbWVzcGFjZTtcbiAgICB9IGVsc2Uge1xuICAgICAgcmV0dXJuIG5hbWVzcGFjZTtcbiAgICB9XG5cbiAgICBpZiAoeG1sLnByZWZpeCkge1xuICAgICAgbmFtZSArPSAnOicgKyB4bWwucHJlZml4O1xuICAgIH1cblxuICAgIHJldHVybiB7XG4gICAgICBuYW1lOiBuYW1lLFxuICAgICAgdmFsdWU6IG5hbWVzcGFjZVxuICAgIH07XG4gIH07XG5cbiAgdmFyIGNyZWF0ZUFycmF5WE1MID0gZnVuY3Rpb24gKGRlc2NyaXB0b3IpIHtcbiAgICB2YXIgbmFtZSA9IGRlc2NyaXB0b3IubmFtZTtcbiAgICB2YXIgY29uZmlnID0gZGVzY3JpcHRvci5jb25maWc7XG4gICAgdmFyIGRlZmluaXRpb24gPSBkZXNjcmlwdG9yLmRlZmluaXRpb247XG4gICAgdmFyIG1vZGVscyA9IGRlc2NyaXB0b3IubW9kZWxzO1xuICAgIHZhciB2YWx1ZTtcbiAgICB2YXIgaXRlbXMgPSBkZWZpbml0aW9uLml0ZW1zO1xuICAgIHZhciB4bWwgPSBkZWZpbml0aW9uLnhtbCB8fCB7fTtcbiAgICB2YXIgbmFtZXNwYWNlID0gZ2V0TmFtZXNwYWNlKHhtbCk7XG4gICAgdmFyIGF0dHJpYnV0ZXMgPSBbXTtcblxuICAgIGlmICghaXRlbXMpIHsgcmV0dXJuIGdldEVycm9yTWVzc2FnZSgpOyB9XG4gICAgdmFyIGtleSA9IG5hbWU7XG4gICAgLy8gSWYgdGhlcmUgaXMgYSBuYW1lIHNwZWNpZmllZCBmb3IgdGhlIGFycmF5IGVsZW1lbnRzLCB1c2UgdGhhdCBmb3IgdGhlIGFycmF5IGVsZW1lbnRzIG5hbWUgfCBodHRwczovL2dpdGh1Yi5jb20vc3dhZ2dlci1hcGkvc3dhZ2dlci11aS9pc3N1ZXMvMjU3N1xuICAgIGlmKGl0ZW1zLnhtbCAmJiBpdGVtcy54bWwubmFtZSkge1xuICAgICAgICBrZXkgPSBpdGVtcy54bWwubmFtZTtcbiAgICB9XG4gICAgdmFsdWUgPSBjcmVhdGVTY2hlbWFYTUwoa2V5LCBpdGVtcywgbW9kZWxzLCBjb25maWcpO1xuICAgIGlmIChuYW1lc3BhY2UpIHtcbiAgICAgIGF0dHJpYnV0ZXMucHVzaChuYW1lc3BhY2UpO1xuICAgIH1cblxuICAgIGlmICh4bWwud3JhcHBlZCkge1xuICAgICAgdmFsdWUgPSB3cmFwVGFnKG5hbWUsIHZhbHVlLCBhdHRyaWJ1dGVzKTtcbiAgICB9XG5cbiAgICByZXR1cm4gdmFsdWU7XG4gIH07XG5cbiAgdmFyIGdldFByaW1pdGl2ZVNpZ25hdHVyZSA9IGZ1bmN0aW9uIChzY2hlbWEpIHtcbiAgICB2YXIgdHlwZSwgaXRlbXM7XG5cbiAgICBzY2hlbWEgPSBzY2hlbWEgfHwge307XG4gICAgaXRlbXMgPSBzY2hlbWEuaXRlbXMgfHwge307XG4gICAgdHlwZSA9IHNjaGVtYS50eXBlIHx8ICcnO1xuXG4gICAgc3dpdGNoICh0eXBlKSB7XG4gICAgICBjYXNlICdvYmplY3QnOiByZXR1cm4gJ09iamVjdCBpcyBub3QgYSBwcmltaXRpdmUnO1xuICAgICAgY2FzZSAnYXJyYXknIDogcmV0dXJuICdBcnJheVsnICsgKGl0ZW1zLmZvcm1hdCB8fCBpdGVtcy50eXBlKSArICddJztcbiAgICAgIGRlZmF1bHQ6IHJldHVybiBzY2hlbWEuZm9ybWF0IHx8IHR5cGU7XG4gICAgfVxuICB9O1xuXG4gIHZhciBjcmVhdGVQcmltaXRpdmVYTUwgPSBmdW5jdGlvbiAoZGVzY3JpcHRvcikge1xuICAgIHZhciBuYW1lID0gZGVzY3JpcHRvci5uYW1lO1xuICAgIHZhciBkZWZpbml0aW9uID0gZGVzY3JpcHRvci5kZWZpbml0aW9uO1xuICAgIHZhciBwcmltaXRpdmVzTWFwID0ge1xuICAgICAgJ3N0cmluZyc6IHtcbiAgICAgICAgJ2RhdGUnOiBuZXcgRGF0ZSgxKS50b0lTT1N0cmluZygpLnNwbGl0KCdUJylbMF0sXG4gICAgICAgICdkYXRlLXRpbWUnIDogbmV3IERhdGUoMSkudG9JU09TdHJpbmcoKSxcbiAgICAgICAgJ2RlZmF1bHQnOiAnc3RyaW5nJ1xuICAgICAgfSxcbiAgICAgICdpbnRlZ2VyJzoge1xuICAgICAgICAnZGVmYXVsdCc6IDFcbiAgICAgIH0sXG4gICAgICAnbnVtYmVyJzoge1xuICAgICAgICAnZGVmYXVsdCc6IDEuMVxuICAgICAgfSxcbiAgICAgICdib29sZWFuJzoge1xuICAgICAgICAnZGVmYXVsdCc6IHRydWVcbiAgICAgIH1cbiAgICB9O1xuICAgIHZhciB0eXBlID0gZGVmaW5pdGlvbi50eXBlO1xuICAgIHZhciBmb3JtYXQgPSBkZWZpbml0aW9uLmZvcm1hdDtcbiAgICB2YXIgeG1sID0gZGVmaW5pdGlvbi54bWwgfHwge307XG4gICAgdmFyIG5hbWVzcGFjZSA9IGdldE5hbWVzcGFjZSh4bWwpO1xuICAgIHZhciBhdHRyaWJ1dGVzID0gW107XG4gICAgdmFyIHZhbHVlO1xuXG4gICAgaWYgKF8ua2V5cyhwcmltaXRpdmVzTWFwKS5pbmRleE9mKHR5cGUpIDwgMCkgeyByZXR1cm4gZ2V0RXJyb3JNZXNzYWdlKCk7IH1cblxuICAgIGlmIChfLmlzQXJyYXkoZGVmaW5pdGlvbi5lbnVtKSl7XG4gICAgICB2YWx1ZSA9IGRlZmluaXRpb24uZW51bVswXTtcbiAgICB9IGVsc2Uge1xuICAgICAgdmFsdWUgPSBkZWZpbml0aW9uLmV4YW1wbGUgfHwgcHJpbWl0aXZlc01hcFt0eXBlXVtmb3JtYXRdIHx8IHByaW1pdGl2ZXNNYXBbdHlwZV0uZGVmYXVsdDtcbiAgICB9XG5cbiAgICBpZiAoeG1sLmF0dHJpYnV0ZSkge1xuICAgICAgcmV0dXJuIHtuYW1lOiBuYW1lLCB2YWx1ZTogdmFsdWV9O1xuICAgIH1cblxuICAgIGlmIChuYW1lc3BhY2UpIHtcbiAgICAgIGF0dHJpYnV0ZXMucHVzaChuYW1lc3BhY2UpO1xuICAgIH1cblxuICAgIHJldHVybiB3cmFwVGFnKG5hbWUsIHZhbHVlLCBhdHRyaWJ1dGVzKTtcbiAgfTtcblxuICBmdW5jdGlvbiBjcmVhdGVPYmplY3RYTUwgKGRlc2NyaXB0b3IpIHtcbiAgICB2YXIgbmFtZSA9IGRlc2NyaXB0b3IubmFtZTtcbiAgICB2YXIgZGVmaW5pdGlvbiA9IGRlc2NyaXB0b3IuZGVmaW5pdGlvbjtcbiAgICB2YXIgY29uZmlnID0gZGVzY3JpcHRvci5jb25maWc7XG4gICAgdmFyIG1vZGVscyA9IGRlc2NyaXB0b3IubW9kZWxzO1xuICAgIHZhciBpc1BhcmFtID0gZGVzY3JpcHRvci5jb25maWcuaXNQYXJhbTtcbiAgICB2YXIgc2VyaWFsaXplZFByb3BlcnRpZXM7XG4gICAgdmFyIGF0dHJzID0gW107XG4gICAgdmFyIHByb3BlcnRpZXMgPSBkZWZpbml0aW9uLnByb3BlcnRpZXM7XG4gICAgdmFyIGFkZGl0aW9uYWxQcm9wZXJ0aWVzID0gZGVmaW5pdGlvbi5hZGRpdGlvbmFsUHJvcGVydGllcztcbiAgICB2YXIgeG1sID0gZGVmaW5pdGlvbi54bWw7XG4gICAgdmFyIG5hbWVzcGFjZSA9IGdldE5hbWVzcGFjZSh4bWwpO1xuXG4gICAgaWYgKG5hbWVzcGFjZSkge1xuICAgICAgYXR0cnMucHVzaChuYW1lc3BhY2UpO1xuICAgIH0gICBcblxuICAgIGlmICghcHJvcGVydGllcyAmJiAhYWRkaXRpb25hbFByb3BlcnRpZXMpIHsgcmV0dXJuIGdldEVycm9yTWVzc2FnZSgpOyB9XG5cbiAgICBwcm9wZXJ0aWVzID0gcHJvcGVydGllcyB8fCB7fTtcblxuICAgIHNlcmlhbGl6ZWRQcm9wZXJ0aWVzID0gXy5tYXAocHJvcGVydGllcywgZnVuY3Rpb24gKHByb3AsIGtleSkge1xuICAgICAgdmFyIHhtbCwgcmVzdWx0O1xuXG4gICAgICBpZiAoaXNQYXJhbSAmJiBwcm9wLnJlYWRPbmx5KSB7XG4gICAgICAgIHJldHVybiAnJztcbiAgICAgIH1cblxuICAgICAgeG1sID0gcHJvcC54bWwgfHwge307XG4gICAgICByZXN1bHQgPSBjcmVhdGVTY2hlbWFYTUwoa2V5LCBwcm9wLCBtb2RlbHMsIGNvbmZpZyk7XG5cbiAgICAgIGlmICh4bWwuYXR0cmlidXRlKSB7XG4gICAgICAgIGF0dHJzLnB1c2gocmVzdWx0KTtcbiAgICAgICAgcmV0dXJuICcnO1xuICAgICAgfVxuXG4gICAgICByZXR1cm4gcmVzdWx0O1xuICAgIH0pLmpvaW4oJycpO1xuXG4gICAgaWYgKGFkZGl0aW9uYWxQcm9wZXJ0aWVzKSB7XG4gICAgICBzZXJpYWxpemVkUHJvcGVydGllcyArPSAnPCEtLSBhZGRpdGlvbmFsIGVsZW1lbnRzIGFsbG93ZWQgLS0+JztcbiAgICB9XG5cbiAgICByZXR1cm4gd3JhcFRhZyhuYW1lLCBzZXJpYWxpemVkUHJvcGVydGllcywgYXR0cnMpO1xuICB9XG5cbiAgZnVuY3Rpb24gZ2V0SW5maW5pdGVMb29wTWVzc2FnZSAobmFtZSwgbG9vcFRvKSB7XG4gICAgcmV0dXJuIHdyYXBUYWcobmFtZSwgJzwhLS0gSW5maW5pdGUgbG9vcCAkcmVmOicgKyBsb29wVG8gKyAnIC0tPicpO1xuICB9XG5cbiAgZnVuY3Rpb24gZ2V0RXJyb3JNZXNzYWdlIChkZXRhaWxzKSB7XG4gICAgZGV0YWlscyA9IGRldGFpbHMgPyAnOiAnICsgZGV0YWlscyA6ICcnO1xuICAgIHJldHVybiAnPCEtLSBpbnZhbGlkIFhNTCcgKyBkZXRhaWxzICsgJyAtLT4nO1xuICB9XG5cbiAgZnVuY3Rpb24gY3JlYXRlU2NoZW1hWE1MIChuYW1lLCBkZWZpbml0aW9uLCBtb2RlbHMsIGNvbmZpZykge1xuICAgIHZhciAkcmVmID0gXy5pc09iamVjdChkZWZpbml0aW9uKSA/IGRlZmluaXRpb24uJHJlZiA6IG51bGw7XG4gICAgdmFyIG91dHB1dCwgaW5kZXg7XG4gICAgY29uZmlnID0gY29uZmlnIHx8IHt9O1xuICAgIGNvbmZpZy5tb2RlbHNUb0lnbm9yZSA9IGNvbmZpZy5tb2RlbHNUb0lnbm9yZSB8fCBbXTtcbiAgIFxuICAgIHZhciBkZXNjcmlwdG9yID0gXy5pc1N0cmluZygkcmVmKSA/IGdldERlc2NyaXB0b3JCeVJlZigkcmVmLCBuYW1lLCBtb2RlbHMsIGNvbmZpZylcbiAgICAgICAgOiBnZXREZXNjcmlwdG9yKG5hbWUsIGRlZmluaXRpb24sIG1vZGVscywgY29uZmlnKTtcbiAgICBcbiAgICBpZiAoIWRlc2NyaXB0b3IpIHtcbiAgICAgIHJldHVybiBnZXRFcnJvck1lc3NhZ2UoKTtcbiAgICB9XG5cbiAgICBzd2l0Y2ggKGRlc2NyaXB0b3IudHlwZSkge1xuICAgICAgY2FzZSAnYXJyYXknOlxuICAgICAgICBvdXRwdXQgPSBjcmVhdGVBcnJheVhNTChkZXNjcmlwdG9yKTsgYnJlYWs7XG4gICAgICBjYXNlICdvYmplY3QnOlxuICAgICAgICBvdXRwdXQgPSBjcmVhdGVPYmplY3RYTUwoZGVzY3JpcHRvcik7IGJyZWFrO1xuICAgICAgY2FzZSAnbG9vcCc6XG4gICAgICAgIG91dHB1dCA9IGdldEluZmluaXRlTG9vcE1lc3NhZ2UoZGVzY3JpcHRvci5uYW1lLCBkZXNjcmlwdG9yLmNvbmZpZy5sb29wVG8pOyBicmVhaztcbiAgICAgIGRlZmF1bHQ6XG4gICAgICAgIG91dHB1dCA9IGNyZWF0ZVByaW1pdGl2ZVhNTChkZXNjcmlwdG9yKTtcbiAgICB9XG5cbiAgICBpZiAoJHJlZiAmJiBkZXNjcmlwdG9yLnR5cGUgIT09ICdsb29wJykge1xuICAgICAgaW5kZXggPSBjb25maWcubW9kZWxzVG9JZ25vcmUuaW5kZXhPZigkcmVmKTtcbiAgICAgIGlmIChpbmRleCA+IC0xKSB7XG4gICAgICAgIGNvbmZpZy5tb2RlbHNUb0lnbm9yZS5zcGxpY2UoaW5kZXgsIDEpO1xuICAgICAgfVxuICAgIH1cblxuICAgIHJldHVybiBvdXRwdXQ7XG4gIH1cblxuICBmdW5jdGlvbiBEZXNjcmlwdG9yIChuYW1lLCB0eXBlLCBkZWZpbml0aW9uLCBtb2RlbHMsIGNvbmZpZykge1xuICAgIGlmIChhcmd1bWVudHMubGVuZ3RoIDwgNCkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKCk7XG4gICAgfVxuICAgIHRoaXMuY29uZmlnID0gY29uZmlnIHx8IHt9O1xuICAgIHRoaXMuY29uZmlnLm1vZGVsc1RvSWdub3JlID0gdGhpcy5jb25maWcubW9kZWxzVG9JZ25vcmUgfHwgW107XG4gICAgLy8gbmFtZSBpcyBhbHJlYWR5IHNldCBieSBnZXREZXNjcmlwdG9yQnlSZWYgb3IgZ2V0RGVzY3JpcHRvciBmdW5jdGlvbiBkZXBlbmRpbmcgb24gdGhlIHR5cGUuIE9ubHkgcHJlZml4LCBpZiBwcmVzZW50IGlzIG5lZWRlZCB0byBiZSBzZXQgaGVyZSB8IGh0dHBzOi8vZ2l0aHViLmNvbS9zd2FnZ2VyLWFwaS9zd2FnZ2VyLXVpL2lzc3Vlcy8yNTc3XG4gICAgdGhpcy5uYW1lID0gZ2V0UHJlZml4KG5hbWUsIGRlZmluaXRpb24ueG1sKTtcbiAgICB0aGlzLmRlZmluaXRpb24gPSBkZWZpbml0aW9uO1xuICAgIHRoaXMubW9kZWxzID0gbW9kZWxzO1xuICAgIHRoaXMudHlwZSA9IHR5cGU7XG4gIH1cblxuICBmdW5jdGlvbiBnZXREZXNjcmlwdG9yQnlSZWYoJHJlZiwgbmFtZSwgbW9kZWxzLCBjb25maWcpIHtcbiAgICB2YXIgbW9kZWxUeXBlID0gc2ltcGxlUmVmKCRyZWYpO1xuICAgIHZhciBtb2RlbCA9IG1vZGVsc1ttb2RlbFR5cGVdIHx8IHt9O1xuICAgIHZhciB0eXBlID0gbW9kZWwuZGVmaW5pdGlvbiAmJiBtb2RlbC5kZWZpbml0aW9uLnR5cGUgPyBtb2RlbC5kZWZpbml0aW9uLnR5cGUgOiAnb2JqZWN0JztcbiAgICAvLyBJZiBtb2RlbCBkZWZpbml0aW9uIHhtbCBuYW1lIGlzIHByZXNlbnQsIHRoZW4gdGhhdCB3aWxsIGJlIHByZWZlcnJlZCBvdmVyIG1vZGVsIG5hbWUuIFRoaXMgaXMgdGhlIGNhc2Ugb2YgcHJlZmVycmluZyBYbWxFbGVtZW50IG5hbWUgb3ZlciBYbWxSb290RWxlbWVudCBuYW1lIGlmIFhtbEVsZW1lbnQgbmFtZSBpcyBwcm92aWRlZCB8IGh0dHBzOi8vZ2l0aHViLmNvbS9zd2FnZ2VyLWFwaS9zd2FnZ2VyLXVpL2lzc3Vlcy8yNTc3XG4gICAgaWYobW9kZWwuZGVmaW5pdGlvbiAmJiBtb2RlbC5kZWZpbml0aW9uLnhtbCAmJiBtb2RlbC5kZWZpbml0aW9uLnhtbC5uYW1lKSB7XG4gICAgICAgIG5hbWUgPSBuYW1lIHx8IG1vZGVsLmRlZmluaXRpb24ueG1sLm5hbWUgfHwgbW9kZWwubmFtZTtcbiAgICB9XG4gICAgLy8gZWxzZSBvbmx5IG1vZGVsIG5hbWUgd2lsbCBiZSBjb25zaWRlcmVkIGZvciBkZXRlcm1pbmF0aW9uIHwgaHR0cHM6Ly9naXRodWIuY29tL3N3YWdnZXItYXBpL3N3YWdnZXItdWkvaXNzdWVzLzI1NzdcbiAgICBlbHNlIHtcbiAgICAgICAgbmFtZSA9IG5hbWUgfHwgbW9kZWwubmFtZTtcbiAgICB9XG4gICAgXG4gICAgaWYgKGNvbmZpZy5tb2RlbHNUb0lnbm9yZS5pbmRleE9mKCRyZWYpID4gLTEpIHtcbiAgICAgIHR5cGUgPSAnbG9vcCc7XG4gICAgICBjb25maWcubG9vcFRvID0gbW9kZWxUeXBlO1xuICAgIH0gZWxzZSB7XG4gICAgICBjb25maWcubW9kZWxzVG9JZ25vcmUucHVzaCgkcmVmKTtcbiAgICB9XG5cbiAgICBpZiAoIW1vZGVsLmRlZmluaXRpb24pIHtcbiAgICAgIHJldHVybiBudWxsO1xuICAgIH1cbiAgICByZXR1cm4gbmV3IERlc2NyaXB0b3IobmFtZSwgdHlwZSwgbW9kZWwuZGVmaW5pdGlvbiwgbW9kZWxzLCBjb25maWcpOyAgICBcbiAgfVxuXG4gIGZ1bmN0aW9uIGdldERlc2NyaXB0b3IgKG5hbWUsIGRlZmluaXRpb24sIG1vZGVscywgY29uZmlnKXtcbiAgICB2YXIgdHlwZSA9IGRlZmluaXRpb24udHlwZSB8fCAnb2JqZWN0JztcbiAgICAvLyBJZiBkZWZpbml0aW9uIHhtbCBuYW1lIGlzIHByZXNlbnQsIHRoZW4gdGhhdCB3aWxsIGJlIHByZWZlcnJlZCBvdmVyIG5hbWUgfCBodHRwczovL2dpdGh1Yi5jb20vc3dhZ2dlci1hcGkvc3dhZ2dlci11aS9pc3N1ZXMvMjU3N1xuICAgIGlmKGRlZmluaXRpb24ueG1sICYmIGRlZmluaXRpb24ueG1sLm5hbWUpIHtcbiAgICAgICAgbmFtZSA9IGRlZmluaXRpb24ueG1sLm5hbWUgfHwgbmFtZTtcbiAgICB9XG4gICAgaWYgKCFkZWZpbml0aW9uKSB7XG4gICAgICByZXR1cm4gbnVsbDtcbiAgICB9XG5cbiAgICByZXR1cm4gbmV3IERlc2NyaXB0b3IobmFtZSwgdHlwZSwgZGVmaW5pdGlvbiwgbW9kZWxzLCBjb25maWcpO1xuICB9XG5cbiAgZnVuY3Rpb24gY3JlYXRlWE1MU2FtcGxlIChuYW1lLCBkZWZpbml0aW9uLCBtb2RlbHMsIGlzUGFyYW0pIHtcbiAgICB2YXIgcHJvbG9nID0gJzw/eG1sIHZlcnNpb249XCIxLjBcIj8+JztcblxuICAgIHJldHVybiBmb3JtYXRYbWwocHJvbG9nICsgY3JlYXRlU2NoZW1hWE1MKG5hbWUsIGRlZmluaXRpb24sIG1vZGVscywgeyBpc1BhcmFtOiBpc1BhcmFtIH0gKSk7XG4gIH1cblxuICByZXR1cm4ge1xuICAgICAgZ2V0TW9kZWxTaWduYXR1cmU6IGdldE1vZGVsU2lnbmF0dXJlLFxuICAgICAgY3JlYXRlSlNPTlNhbXBsZTogY3JlYXRlSlNPTlNhbXBsZSxcbiAgICAgIGdldFBhcmFtZXRlck1vZGVsU2lnbmF0dXJlOiBnZXRQYXJhbWV0ZXJNb2RlbFNpZ25hdHVyZSxcbiAgICAgIGNyZWF0ZVBhcmFtZXRlckpTT05TYW1wbGU6IGNyZWF0ZVBhcmFtZXRlckpTT05TYW1wbGUsXG4gICAgICBjcmVhdGVTY2hlbWFYTUw6IGNyZWF0ZVNjaGVtYVhNTCxcbiAgICAgIGNyZWF0ZVhNTFNhbXBsZTogY3JlYXRlWE1MU2FtcGxlLFxuICAgICAgZ2V0UHJpbWl0aXZlU2lnbmF0dXJlOiBnZXRQcmltaXRpdmVTaWduYXR1cmVcbiAgfTtcblxufSkoKTtcbiIsIid1c2Ugc3RyaWN0JztcblxuU3dhZ2dlclVpLlZpZXdzLlBvcHVwVmlldyA9IEJhY2tib25lLlZpZXcuZXh0ZW5kKHtcbiAgICBldmVudHM6IHtcbiAgICAgICAgJ2NsaWNrIC5hcGktcG9wdXAtY2FuY2VsJzogJ2NhbmNlbENsaWNrJ1xuICAgIH0sXG5cbiAgICB0ZW1wbGF0ZTogSGFuZGxlYmFycy50ZW1wbGF0ZXMucG9wdXAsXG4gICAgY2xhc3NOYW1lOiAnYXBpLXBvcHVwLWRpYWxvZycsXG5cbiAgICBzZWxlY3RvcnM6IHtcbiAgICAgICAgY29udGVudDogJy5hcGktcG9wdXAtY29udGVudCcsXG4gICAgICAgIG1haW4gICA6ICcjc3dhZ2dlci11aS1jb250YWluZXInXG4gICAgfSxcblxuICAgIGluaXRpYWxpemU6IGZ1bmN0aW9uKCl7XG4gICAgICAgIHRoaXMuJGVsLmh0bWwodGhpcy50ZW1wbGF0ZSh0aGlzLm1vZGVsKSk7XG4gICAgfSxcblxuICAgIHJlbmRlcjogZnVuY3Rpb24gKCkge1xuICAgICAgICB0aGlzLiQodGhpcy5zZWxlY3RvcnMuY29udGVudCkuYXBwZW5kKHRoaXMubW9kZWwuY29udGVudCk7XG4gICAgICAgICQodGhpcy5zZWxlY3RvcnMubWFpbikuZmlyc3QoKS5hcHBlbmQodGhpcy5lbCk7XG4gICAgICAgIHRoaXMuc2hvd1BvcHVwKCk7XG5cbiAgICAgICAgcmV0dXJuIHRoaXM7XG4gICAgfSxcblxuICAgIHNob3dQb3B1cDogZnVuY3Rpb24gKCkge1xuICAgICAgICB0aGlzLiRlbC5zaG93KCk7XG4gICAgfSxcblxuICAgIGNhbmNlbENsaWNrOiBmdW5jdGlvbiAoKSB7XG4gICAgICAgIHRoaXMucmVtb3ZlKCk7XG4gICAgfVxuXG59KTtcbiIsIid1c2Ugc3RyaWN0JztcblxuU3dhZ2dlclVpLlZpZXdzLlJlc291cmNlVmlldyA9IEJhY2tib25lLlZpZXcuZXh0ZW5kKHtcbiAgaW5pdGlhbGl6ZTogZnVuY3Rpb24ob3B0cykge1xuICAgIG9wdHMgPSBvcHRzIHx8IHt9O1xuICAgIHRoaXMucm91dGVyID0gb3B0cy5yb3V0ZXI7XG4gICAgdGhpcy5hdXRocyA9IG9wdHMuYXV0aHM7XG4gICAgaWYgKCcnID09PSB0aGlzLm1vZGVsLmRlc2NyaXB0aW9uKSB7XG4gICAgICB0aGlzLm1vZGVsLmRlc2NyaXB0aW9uID0gbnVsbDtcbiAgICB9XG4gICAgaWYgKHRoaXMubW9kZWwuZGVzY3JpcHRpb24pIHtcbiAgICAgIHRoaXMubW9kZWwuc3VtbWFyeSA9IHRoaXMubW9kZWwuZGVzY3JpcHRpb247XG4gICAgfVxuICAgIHRoaXMubnVtYmVyID0gMDtcbiAgfSxcblxuICByZW5kZXI6IGZ1bmN0aW9uKCl7XG4gICAgdmFyIG1ldGhvZHMgPSB7fTtcblxuXG4gICAgJCh0aGlzLmVsKS5odG1sKEhhbmRsZWJhcnMudGVtcGxhdGVzLnJlc291cmNlKHRoaXMubW9kZWwpKTtcblxuICAgIC8vIFJlbmRlciBlYWNoIG9wZXJhdGlvblxuICAgIGZvciAodmFyIGkgPSAwOyBpIDwgdGhpcy5tb2RlbC5vcGVyYXRpb25zQXJyYXkubGVuZ3RoOyBpKyspIHtcbiAgICAgIHZhciBvcGVyYXRpb24gPSB0aGlzLm1vZGVsLm9wZXJhdGlvbnNBcnJheVtpXTtcbiAgICAgIHZhciBjb3VudGVyID0gMDtcbiAgICAgIHZhciBpZCA9IG9wZXJhdGlvbi5uaWNrbmFtZTtcblxuICAgICAgd2hpbGUgKHR5cGVvZiBtZXRob2RzW2lkXSAhPT0gJ3VuZGVmaW5lZCcpIHtcbiAgICAgICAgaWQgPSBpZCArICdfJyArIGNvdW50ZXI7XG4gICAgICAgIGNvdW50ZXIgKz0gMTtcbiAgICAgIH1cblxuICAgICAgbWV0aG9kc1tpZF0gPSBvcGVyYXRpb247XG5cbiAgICAgIG9wZXJhdGlvbi5uaWNrbmFtZSA9IGlkO1xuICAgICAgb3BlcmF0aW9uLnBhcmVudElkID0gdGhpcy5tb2RlbC5pZDtcbiAgICAgIG9wZXJhdGlvbi5kZWZpbml0aW9ucyA9IHRoaXMubW9kZWwuZGVmaW5pdGlvbnM7IC8vIG1ha2UgSnNvbiBTY2hlbWEgYXZhaWxhYmxlIGZvciBKU29uRWRpdG9yIGluIHRoaXMgb3BlcmF0aW9uXG4gICAgICB0aGlzLmFkZE9wZXJhdGlvbihvcGVyYXRpb24pO1xuICAgIH1cblxuICAgICQoJy50b2dnbGVFbmRwb2ludExpc3QnLCB0aGlzLmVsKS5jbGljayh0aGlzLmNhbGxEb2NzLmJpbmQodGhpcywgJ3RvZ2dsZUVuZHBvaW50TGlzdEZvclJlc291cmNlJykpO1xuICAgICQoJy5jb2xsYXBzZVJlc291cmNlJywgdGhpcy5lbCkuY2xpY2sodGhpcy5jYWxsRG9jcy5iaW5kKHRoaXMsICdjb2xsYXBzZU9wZXJhdGlvbnNGb3JSZXNvdXJjZScpKTtcbiAgICAkKCcuZXhwYW5kUmVzb3VyY2UnLCB0aGlzLmVsKS5jbGljayh0aGlzLmNhbGxEb2NzLmJpbmQodGhpcywgJ2V4cGFuZE9wZXJhdGlvbnNGb3JSZXNvdXJjZScpKTtcblxuICAgIHJldHVybiB0aGlzO1xuICB9LFxuXG4gIGFkZE9wZXJhdGlvbjogZnVuY3Rpb24ob3BlcmF0aW9uKSB7XG5cbiAgICBvcGVyYXRpb24ubnVtYmVyID0gdGhpcy5udW1iZXI7XG5cbiAgICAvLyBSZW5kZXIgYW4gb3BlcmF0aW9uIGFuZCBhZGQgaXQgdG8gb3BlcmF0aW9ucyBsaVxuICAgIHZhciBvcGVyYXRpb25WaWV3ID0gbmV3IFN3YWdnZXJVaS5WaWV3cy5PcGVyYXRpb25WaWV3KHtcbiAgICAgIG1vZGVsOiBvcGVyYXRpb24sXG4gICAgICByb3V0ZXI6IHRoaXMucm91dGVyLFxuICAgICAgdGFnTmFtZTogJ2xpJyxcbiAgICAgIGNsYXNzTmFtZTogJ2VuZHBvaW50JyxcbiAgICAgIHN3YWdnZXJPcHRpb25zOiB0aGlzLm9wdGlvbnMuc3dhZ2dlck9wdGlvbnMsXG4gICAgICBhdXRoczogdGhpcy5hdXRoc1xuICAgIH0pO1xuXG4gICAgJCgnLmVuZHBvaW50cycsICQodGhpcy5lbCkpLmFwcGVuZChvcGVyYXRpb25WaWV3LnJlbmRlcigpLmVsKTtcblxuICAgIHRoaXMubnVtYmVyKys7XG5cbiAgfSxcbiAgLy8gR2VuZXJpYyBFdmVudCBoYW5kbGVyIChgRG9jc2AgaXMgZ2xvYmFsKVxuXG5cbiAgY2FsbERvY3M6IGZ1bmN0aW9uKGZuTmFtZSwgZSkge1xuICAgIGUucHJldmVudERlZmF1bHQoKTtcbiAgICBEb2NzW2ZuTmFtZV0oZS5jdXJyZW50VGFyZ2V0LmdldEF0dHJpYnV0ZSgnZGF0YS1pZCcpKTtcbiAgfVxufSk7XG4iLCIndXNlIHN0cmljdCc7XG5cblN3YWdnZXJVaS5WaWV3cy5SZXNwb25zZUNvbnRlbnRUeXBlVmlldyA9IEJhY2tib25lLlZpZXcuZXh0ZW5kKHtcbiAgaW5pdGlhbGl6ZTogZnVuY3Rpb24oKXt9LFxuXG4gIHJlbmRlcjogZnVuY3Rpb24oKXtcbiAgICB0aGlzLm1vZGVsLnJlc3BvbnNlQ29udGVudFR5cGVJZCA9ICdyY3QnICsgTWF0aC5yYW5kb20oKTtcbiAgICAkKHRoaXMuZWwpLmh0bWwoSGFuZGxlYmFycy50ZW1wbGF0ZXMucmVzcG9uc2VfY29udGVudF90eXBlKHRoaXMubW9kZWwpKTtcbiAgICByZXR1cm4gdGhpcztcbiAgfVxufSk7IiwiJ3VzZSBzdHJpY3QnO1xuXG5Td2FnZ2VyVWkuVmlld3MuU2lnbmF0dXJlVmlldyA9IEJhY2tib25lLlZpZXcuZXh0ZW5kKHtcbiAgZXZlbnRzOiB7XG4gICAgJ2NsaWNrIGEuZGVzY3JpcHRpb24tbGluaycgICAgICAgOiAnc3dpdGNoVG9EZXNjcmlwdGlvbicsXG4gICAgJ2NsaWNrIGEuc25pcHBldC1saW5rJyAgICAgICAgICAgOiAnc3dpdGNoVG9TbmlwcGV0JyxcbiAgICAnbW91c2Vkb3duIC5zbmlwcGV0X2pzb24nICAgICAgICAgIDogJ2pzb25TbmlwcGV0TW91c2VEb3duJyxcbiAgICAnbW91c2Vkb3duIC5zbmlwcGV0X3htbCcgICAgICAgICAgOiAneG1sU25pcHBldE1vdXNlRG93bidcbiAgfSxcblxuICBpbml0aWFsaXplOiBmdW5jdGlvbiAoKSB7XG4gIH0sXG5cbiAgcmVuZGVyOiBmdW5jdGlvbigpe1xuXG4gICAgJCh0aGlzLmVsKS5odG1sKEhhbmRsZWJhcnMudGVtcGxhdGVzLnNpZ25hdHVyZSh0aGlzLm1vZGVsKSk7XG5cbiAgICBpZiAodGhpcy5tb2RlbC5kZWZhdWx0UmVuZGVyaW5nID09PSAnbW9kZWwnKSB7XG4gICAgICB0aGlzLnN3aXRjaFRvRGVzY3JpcHRpb24oKTtcbiAgICB9IGVsc2Uge1xuICAgICAgdGhpcy5zd2l0Y2hUb1NuaXBwZXQoKTtcbiAgICB9XG5cbiAgICByZXR1cm4gdGhpcztcbiAgfSxcblxuICAvLyBoYW5kbGVyIGZvciBzaG93IHNpZ25hdHVyZVxuICBzd2l0Y2hUb0Rlc2NyaXB0aW9uOiBmdW5jdGlvbihlKXtcbiAgICBpZiAoZSkgeyBlLnByZXZlbnREZWZhdWx0KCk7IH1cblxuICAgICQoJy5zbmlwcGV0JywgJCh0aGlzLmVsKSkuaGlkZSgpO1xuICAgICQoJy5kZXNjcmlwdGlvbicsICQodGhpcy5lbCkpLnNob3coKTtcbiAgICAkKCcuZGVzY3JpcHRpb24tbGluaycsICQodGhpcy5lbCkpLmFkZENsYXNzKCdzZWxlY3RlZCcpO1xuICAgICQoJy5zbmlwcGV0LWxpbmsnLCAkKHRoaXMuZWwpKS5yZW1vdmVDbGFzcygnc2VsZWN0ZWQnKTtcbiAgfSxcblxuICAvLyBoYW5kbGVyIGZvciBzaG93IHNhbXBsZVxuICBzd2l0Y2hUb1NuaXBwZXQ6IGZ1bmN0aW9uKGUpe1xuICAgIGlmIChlKSB7IGUucHJldmVudERlZmF1bHQoKTsgfVxuXG4gICAgJCgnLnNuaXBwZXQnLCAkKHRoaXMuZWwpKS5zaG93KCk7XG4gICAgJCgnLmRlc2NyaXB0aW9uJywgJCh0aGlzLmVsKSkuaGlkZSgpO1xuICAgICQoJy5zbmlwcGV0LWxpbmsnLCAkKHRoaXMuZWwpKS5hZGRDbGFzcygnc2VsZWN0ZWQnKTtcbiAgICAkKCcuZGVzY3JpcHRpb24tbGluaycsICQodGhpcy5lbCkpLnJlbW92ZUNsYXNzKCdzZWxlY3RlZCcpO1xuICB9LFxuXG4gIC8vIGhhbmRsZXIgZm9yIHNuaXBwZXQgdG8gdGV4dCBhcmVhXG4gIHNuaXBwZXRUb1RleHRBcmVhOiBmdW5jdGlvbih2YWwpIHtcbiAgICB2YXIgdGV4dEFyZWEgPSAkKCd0ZXh0YXJlYScsICQodGhpcy5lbC5wYXJlbnROb2RlLnBhcmVudE5vZGUucGFyZW50Tm9kZSkpO1xuXG4gICAgLy8gRml4IGZvciBidWcgaW4gSUUgMTAvMTEgd2hpY2ggY2F1c2VzIHBsYWNlaG9sZGVyIHRleHQgdG8gYmUgY29waWVkIHRvIFwidmFsdWVcIlxuICAgIGlmICgkLnRyaW0odGV4dEFyZWEudmFsKCkpID09PSAnJyB8fCB0ZXh0QXJlYS5wcm9wKCdwbGFjZWhvbGRlcicpID09PSB0ZXh0QXJlYS52YWwoKSkge1xuICAgICAgdGV4dEFyZWEudmFsKHZhbCk7XG4gICAgICAvLyBUT0RPIG1vdmUgdGhpcyBjb2RlIG91dHNpZGUgb2YgdGhlIHZpZXcgYW5kIGV4cG9zZSBhbiBldmVudCBpbnN0ZWFkXG4gICAgICBpZiggdGhpcy5tb2RlbC5qc29uRWRpdG9yICYmIHRoaXMubW9kZWwuanNvbkVkaXRvci5pc0VuYWJsZWQoKSl7XG4gICAgICAgIHRoaXMubW9kZWwuanNvbkVkaXRvci5zZXRWYWx1ZShKU09OLnBhcnNlKHRoaXMubW9kZWwuc2FtcGxlSlNPTikpO1xuICAgICAgfVxuICAgIH1cbiAgfSxcblxuICBqc29uU25pcHBldE1vdXNlRG93bjogZnVuY3Rpb24gKGUpIHtcbiAgICBpZiAodGhpcy5tb2RlbC5pc1BhcmFtKSB7XG4gICAgICBpZiAoZSkgeyBlLnByZXZlbnREZWZhdWx0KCk7IH1cblxuICAgICAgdGhpcy5zbmlwcGV0VG9UZXh0QXJlYSh0aGlzLm1vZGVsLnNhbXBsZUpTT04pO1xuICAgIH1cbiAgfSxcblxuICB4bWxTbmlwcGV0TW91c2VEb3duOiBmdW5jdGlvbiAoZSkge1xuICAgIGlmICh0aGlzLm1vZGVsLmlzUGFyYW0pIHtcbiAgICAgIGlmIChlKSB7IGUucHJldmVudERlZmF1bHQoKTsgfVxuXG4gICAgICB0aGlzLnNuaXBwZXRUb1RleHRBcmVhKHRoaXMubW9kZWwuc2FtcGxlWE1MKTtcbiAgICB9XG4gIH1cbn0pOyIsIid1c2Ugc3RyaWN0JztcblxuU3dhZ2dlclVpLlZpZXdzLlN0YXR1c0NvZGVWaWV3ID0gQmFja2JvbmUuVmlldy5leHRlbmQoe1xuICBpbml0aWFsaXplOiBmdW5jdGlvbiAob3B0cykge1xuICAgIHRoaXMub3B0aW9ucyA9IG9wdHMgfHwge307XG4gICAgdGhpcy5yb3V0ZXIgPSB0aGlzLm9wdGlvbnMucm91dGVyO1xuICB9LFxuXG4gIHJlbmRlcjogZnVuY3Rpb24oKXtcbiAgICB2YXIgcmVzcG9uc2VNb2RlbCwgcmVzcG9uc2VNb2RlbFZpZXc7XG4gICAgdmFyIHZhbHVlID0gdGhpcy5yb3V0ZXIuYXBpLm1vZGVsc1t0aGlzLm1vZGVsLnJlc3BvbnNlTW9kZWxdO1xuICAgICQodGhpcy5lbCkuaHRtbChIYW5kbGViYXJzLnRlbXBsYXRlcy5zdGF0dXNfY29kZSh0aGlzLm1vZGVsKSk7XG5cbiAgICBpZiAodGhpcy5yb3V0ZXIuYXBpLm1vZGVscy5oYXNPd25Qcm9wZXJ0eSh0aGlzLm1vZGVsLnJlc3BvbnNlTW9kZWwpKSB7XG4gICAgICByZXNwb25zZU1vZGVsID0ge1xuICAgICAgICBzYW1wbGVKU09OOiBKU09OLnN0cmluZ2lmeShTd2FnZ2VyVWkucGFydGlhbHMuc2lnbmF0dXJlLmNyZWF0ZUpTT05TYW1wbGUodmFsdWUpLCB2b2lkIDAsIDIpLFxuICAgICAgICBzYW1wbGVYTUw6IHRoaXMubW9kZWwuaXNYTUwgPyBTd2FnZ2VyVWkucGFydGlhbHMuc2lnbmF0dXJlLmNyZWF0ZVhNTFNhbXBsZSgnJywgdGhpcy5tb2RlbC5zY2hlbWEsIHRoaXMucm91dGVyLmFwaS5tb2RlbHMpIDogZmFsc2UsXG4gICAgICAgIGlzUGFyYW06IGZhbHNlLFxuICAgICAgICBzaWduYXR1cmU6IFN3YWdnZXJVaS5wYXJ0aWFscy5zaWduYXR1cmUuZ2V0TW9kZWxTaWduYXR1cmUodGhpcy5tb2RlbC5yZXNwb25zZU1vZGVsLCB2YWx1ZSwgdGhpcy5yb3V0ZXIuYXBpLm1vZGVscyksXG4gICAgICAgIGRlZmF1bHRSZW5kZXJpbmc6IHRoaXMubW9kZWwuZGVmYXVsdFJlbmRlcmluZ1xuICAgICAgfTtcbiAgICB9IGVsc2Uge1xuICAgICAgcmVzcG9uc2VNb2RlbCA9IHtcbiAgICAgICAgc2lnbmF0dXJlOiBTd2FnZ2VyVWkucGFydGlhbHMuc2lnbmF0dXJlLmdldFByaW1pdGl2ZVNpZ25hdHVyZSh0aGlzLm1vZGVsLnNjaGVtYSlcbiAgICAgIH07XG4gICAgfVxuXG4gICAgcmVzcG9uc2VNb2RlbFZpZXcgPSBuZXcgU3dhZ2dlclVpLlZpZXdzLlNpZ25hdHVyZVZpZXcoe21vZGVsOiByZXNwb25zZU1vZGVsLCB0YWdOYW1lOiAnZGl2J30pO1xuICAgICQoJy5tb2RlbC1zaWduYXR1cmUnLCB0aGlzLiRlbCkuYXBwZW5kKHJlc3BvbnNlTW9kZWxWaWV3LnJlbmRlcigpLmVsKTtcbiAgICByZXR1cm4gdGhpcztcbiAgfVxufSk7Il19\n"
  },
  {
    "path": "src/main/resources/templates/hello.html",
    "content": "<html>\n<head>\n    <meta http-equiv=Content-Type content=\"text/html; charset=UTF-8\">\n</head>\n<body topmargin=0 leftmargin=0 >\n<table border='1' cellspacing=\"0\" cellpadding=\"0\" >\n    <thead>\n    <tr>\n        <th>序号</th>\n        <th>学生</th>\n        <th>班级</th>\n        <th>课程</th>\n        <th>教师</th>\n        <th>教室</th>\n        <th>预约时间</th>\n        <th>状态</th>\n        <th>请假备注</th>\n        <th>签到情况</th>\n        <th>签到时间</th>\n    </tr>\n    <thead>\n    <tbody>\n    #for(i=0;i<10;i++)\n    <tr>\n        <td>#(i)</td>\n        <td>aaa</td>\n        <td>bbb</td>\n        <td>ccc</td>\n        <td>ddd</td>\n        <td>eee</td>\n        <td>0</td>\n        <td>fff</td>\n        <td>iii</td>\n        <td>jjj</td>\n        <td>hhh</td>\n    </tr>\n    #end\n</table>\n</body>\n</html>"
  },
  {
    "path": "src/main/resources/templates/success.html",
    "content": "<xml>\n    <return_code><![CDATA[SUCCESS]]></return_code>\n    <return_msg><![CDATA[OK]]></return_msg>\n</xml>"
  },
  {
    "path": "src/test/java/io/sdb/dao/SysUserDaoTest.java",
    "content": "package io.sdb.dao;\n\nimport com.jfinal.kit.Kv;\nimport com.jfinal.plugin.activerecord.Db;\nimport com.jfinal.plugin.activerecord.Record;\nimport com.jfinal.plugin.activerecord.SqlPara;\nimport io.sdb.common.entity.Filter;\nimport lombok.extern.slf4j.Slf4j;\nimport org.junit.Test;\nimport org.junit.runner.RunWith;\nimport org.springframework.beans.factory.annotation.Autowired;\nimport org.springframework.boot.test.context.SpringBootTest;\nimport org.springframework.test.context.junit4.SpringRunner;\n\nimport java.util.ArrayList;\nimport java.util.List;\n\n@RunWith(SpringRunner.class)\n@SpringBootTest\n@Slf4j\npublic class SysUserDaoTest {\n\n    @Autowired\n    SysUserDao sysUserDao;\n\n    @Test\n    public void queryAllPerms() {\n        List<String> perms = sysUserDao.queryAllPerms(2L);\n        log.info(\"{}\", perms);\n    }\n\n    @Test\n    public void test() {\n        List<Filter> filterList = new ArrayList<>();\n        Filter filter = new Filter();\n        filter.setProperty(\"aaa\");\n        filter.setOperator(Filter.Operator.eq);\n        filter.setValue(\"123\");\n        filterList.add(filter);\n\n        filter = new Filter();\n        filter.setProperty(null);\n        filter.setOperator(Filter.Operator.eq);\n        filter.setValue(\"111\");\n        filterList.add(filter);\n\n        filter = new Filter();\n        filter.setProperty(\"bbb\");\n        filter.setOperator(Filter.Operator.eq);\n        filter.setValue(\"321\");\n        filterList.add(filter);\n\n        filter = new Filter();\n        filter.setProperty(\"intest\");\n        filter.setOperator(Filter.Operator.in);\n        filter.setValue(new ArrayList<String>() {\n            {add(\"aaa\");add(\"bbb\");}\n        });\n        filterList.add(filter);\n        SqlPara sqlPara = Db.getSqlPara(\"common.findList\", Kv.by(\"tableName\", \"aaa\").set(\"filters\", filterList));\n        List<Record> record = Db.find(sqlPara);\n        log.info(\"{}\", record);\n    }\n}"
  },
  {
    "path": "src/test/java/io/sdb/modules/app/utils/RecordUtilsTest.java",
    "content": "package io.sdb.modules.app.utils;\n\nimport com.alibaba.fastjson.JSON;\nimport com.jfinal.plugin.activerecord.Db;\nimport com.jfinal.plugin.activerecord.Record;\nimport io.sdb.model.Product;\nimport io.sdb.service.ProductService;\nimport lombok.extern.slf4j.Slf4j;\nimport org.junit.Test;\nimport org.junit.runner.RunWith;\nimport org.springframework.beans.factory.annotation.Autowired;\nimport org.springframework.boot.test.context.SpringBootTest;\nimport org.springframework.test.context.junit4.SpringRunner;\n\nimport static org.junit.Assert.*;\n\n@RunWith(SpringRunner.class)\n@SpringBootTest\n@Slf4j\npublic class RecordUtilsTest {\n\n    @Autowired\n    ProductService productService;\n\n    @Test\n    public void converModel() {\n        Record record = Db.findFirst(\"select * from product p where p.sn ='20180715210707'\");\n        String str = JSON.toJSONString(record.getColumns());\n        Product product = JSON.parseObject(str, Product.class);\n//        Product product = RecordUtils.converModel(Product.class, record);\n        log.info(\"{}\", product);\n    }\n}"
  },
  {
    "path": "src/test/java/io/sdb/service/impl/CartServiceImplTest.java",
    "content": "package io.sdb.service.impl;\n\nimport io.sdb.service.CartService;\nimport lombok.extern.slf4j.Slf4j;\nimport org.junit.Test;\nimport org.junit.runner.RunWith;\nimport org.springframework.beans.factory.annotation.Autowired;\nimport org.springframework.boot.test.context.SpringBootTest;\nimport org.springframework.test.context.junit4.SpringRunner;\n\nimport static org.junit.Assert.*;\n\n@RunWith(SpringRunner.class)\n@SpringBootTest\n@Slf4j\npublic class CartServiceImplTest {\n\n    @Autowired\n    CartService cartService;\n\n    @Test\n    public void saveOrUpdate() {\n        cartService.saveOrUpdate(\"1\", \"2\", 1);\n    }\n}"
  },
  {
    "path": "src/test/java/io/sdb/service/impl/GoodsServiceImplTest.java",
    "content": "package io.sdb.service.impl;\n\nimport io.sdb.common.utils.PageUtils;\nimport io.sdb.service.GoodsService;\nimport lombok.extern.slf4j.Slf4j;\nimport org.junit.Test;\nimport org.junit.runner.RunWith;\nimport org.springframework.beans.factory.annotation.Autowired;\nimport org.springframework.boot.test.context.SpringBootTest;\nimport org.springframework.test.context.junit4.SpringRunner;\nimport sun.nio.cs.ext.MacArabic;\n\nimport java.util.HashMap;\nimport java.util.Map;\n\nimport static org.junit.Assert.*;\n\n@RunWith(SpringRunner.class)\n@SpringBootTest\n@Slf4j\npublic class GoodsServiceImplTest {\n\n    @Autowired\n    GoodsService goodsService;\n\n    @Test\n    public void queryPage() {\n        Map<String, Object> map = new HashMap<>();\n        map.put(\"page\", 1);\n        map.put(\"limit\", 10);\n        PageUtils page = goodsService.queryPage(map);\n    }\n}"
  },
  {
    "path": "src/test/java/io/sdb/service/impl/MailServiceTest.java",
    "content": "package io.sdb.service.impl;\n\nimport cn.hutool.extra.mail.Mail;\nimport lombok.extern.slf4j.Slf4j;\nimport org.junit.Test;\nimport org.junit.runner.RunWith;\nimport org.springframework.beans.factory.annotation.Autowired;\nimport org.springframework.boot.test.context.SpringBootTest;\nimport org.springframework.test.context.junit4.SpringRunner;\n\nimport static org.junit.Assert.*;\n\n@RunWith(SpringRunner.class)\n@SpringBootTest\n@Slf4j\npublic class MailServiceTest {\n\n    @Autowired\n    MailService mailService;\n\n    @Test\n    public void sendMail() {\n        mailService.sendMail(\"我的邮件\", \"你好\", \"406123228@qq.com\");\n    }\n}"
  },
  {
    "path": "src/test/java/io/sdb/service/impl/PayServiceImplTest.java",
    "content": "package io.sdb.service.impl;\n\nimport lombok.extern.slf4j.Slf4j;\nimport org.junit.Test;\nimport org.junit.runner.RunWith;\nimport org.springframework.beans.factory.annotation.Autowired;\nimport org.springframework.boot.test.context.SpringBootTest;\nimport org.springframework.test.context.junit4.SpringRunner;\n\nimport static org.junit.Assert.*;\n\n@RunWith(SpringRunner.class)\n@SpringBootTest\n@Slf4j\npublic class PayServiceImplTest {\n\n    @Autowired\n    PayServiceImpl payService;\n\n    @Test\n    public void create() {\n        payService.create(null);\n    }\n\n    @Test\n    public void refund() {\n//        payService.refund(null);\n    }\n}"
  },
  {
    "path": "src/test/java/io/sdb/service/impl/ProductServiceImplTest.java",
    "content": "package io.sdb.service.impl;\n\nimport io.sdb.dto.ProductDTO;\nimport io.sdb.service.ProductService;\nimport lombok.extern.slf4j.Slf4j;\nimport org.junit.Test;\nimport org.junit.runner.RunWith;\nimport org.springframework.beans.factory.annotation.Autowired;\nimport org.springframework.boot.test.context.SpringBootTest;\nimport org.springframework.test.context.junit4.SpringRunner;\n\nimport java.util.List;\n\nimport static org.junit.Assert.*;\n\n@RunWith(SpringRunner.class)\n@SpringBootTest\n@Slf4j\npublic class ProductServiceImplTest {\n\n    @Autowired\n    ProductService productService;\n\n    @Test\n    public void listDetailByProductIds() {\n        List<ProductDTO> productDTOList = productService.listDetailByProductIds(\"20180715210707,20180715210708\");\n        log.info(\"{}\", productDTOList);\n    }\n}"
  },
  {
    "path": "src/test/java/io/sdb/service/impl/SysLogisticsServiceImplTest.java",
    "content": "package io.sdb.service.impl;\n\nimport lombok.extern.slf4j.Slf4j;\nimport org.junit.Test;\nimport org.junit.runner.RunWith;\nimport org.springframework.beans.factory.annotation.Autowired;\nimport org.springframework.boot.test.context.SpringBootTest;\nimport org.springframework.test.context.junit4.SpringRunner;\n\n@RunWith(SpringRunner.class)\n@SpringBootTest\n@Slf4j\npublic class SysLogisticsServiceImplTest {\n\n    @Autowired\n    LogisticsServiceImpl sysLogisticsService;\n\n    @Test\n    public void subscribe() {\n        sysLogisticsService.subscribe(\"800325920738721358\", \"yuantong\");\n    }\n}"
  }
]